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.
Files changed (457) hide show
  1. attune/__init__.py +358 -0
  2. attune/adaptive/__init__.py +13 -0
  3. attune/adaptive/task_complexity.py +127 -0
  4. attune/agent_monitoring.py +414 -0
  5. attune/cache/__init__.py +117 -0
  6. attune/cache/base.py +166 -0
  7. attune/cache/dependency_manager.py +256 -0
  8. attune/cache/hash_only.py +251 -0
  9. attune/cache/hybrid.py +457 -0
  10. attune/cache/storage.py +285 -0
  11. attune/cache_monitor.py +356 -0
  12. attune/cache_stats.py +298 -0
  13. attune/cli/__init__.py +152 -0
  14. attune/cli/__main__.py +12 -0
  15. attune/cli/commands/__init__.py +1 -0
  16. attune/cli/commands/batch.py +264 -0
  17. attune/cli/commands/cache.py +248 -0
  18. attune/cli/commands/help.py +331 -0
  19. attune/cli/commands/info.py +140 -0
  20. attune/cli/commands/inspect.py +436 -0
  21. attune/cli/commands/inspection.py +57 -0
  22. attune/cli/commands/memory.py +48 -0
  23. attune/cli/commands/metrics.py +92 -0
  24. attune/cli/commands/orchestrate.py +184 -0
  25. attune/cli/commands/patterns.py +207 -0
  26. attune/cli/commands/profiling.py +202 -0
  27. attune/cli/commands/provider.py +98 -0
  28. attune/cli/commands/routing.py +285 -0
  29. attune/cli/commands/setup.py +96 -0
  30. attune/cli/commands/status.py +235 -0
  31. attune/cli/commands/sync.py +166 -0
  32. attune/cli/commands/tier.py +121 -0
  33. attune/cli/commands/utilities.py +114 -0
  34. attune/cli/commands/workflow.py +579 -0
  35. attune/cli/core.py +32 -0
  36. attune/cli/parsers/__init__.py +68 -0
  37. attune/cli/parsers/batch.py +118 -0
  38. attune/cli/parsers/cache.py +65 -0
  39. attune/cli/parsers/help.py +41 -0
  40. attune/cli/parsers/info.py +26 -0
  41. attune/cli/parsers/inspect.py +66 -0
  42. attune/cli/parsers/metrics.py +42 -0
  43. attune/cli/parsers/orchestrate.py +61 -0
  44. attune/cli/parsers/patterns.py +54 -0
  45. attune/cli/parsers/provider.py +40 -0
  46. attune/cli/parsers/routing.py +110 -0
  47. attune/cli/parsers/setup.py +42 -0
  48. attune/cli/parsers/status.py +47 -0
  49. attune/cli/parsers/sync.py +31 -0
  50. attune/cli/parsers/tier.py +33 -0
  51. attune/cli/parsers/workflow.py +77 -0
  52. attune/cli/utils/__init__.py +1 -0
  53. attune/cli/utils/data.py +242 -0
  54. attune/cli/utils/helpers.py +68 -0
  55. attune/cli_legacy.py +3957 -0
  56. attune/cli_minimal.py +1159 -0
  57. attune/cli_router.py +437 -0
  58. attune/cli_unified.py +814 -0
  59. attune/config/__init__.py +66 -0
  60. attune/config/xml_config.py +286 -0
  61. attune/config.py +545 -0
  62. attune/coordination.py +870 -0
  63. attune/core.py +1511 -0
  64. attune/core_modules/__init__.py +15 -0
  65. attune/cost_tracker.py +626 -0
  66. attune/dashboard/__init__.py +41 -0
  67. attune/dashboard/app.py +512 -0
  68. attune/dashboard/simple_server.py +435 -0
  69. attune/dashboard/standalone_server.py +547 -0
  70. attune/discovery.py +306 -0
  71. attune/emergence.py +306 -0
  72. attune/exceptions.py +123 -0
  73. attune/feedback_loops.py +373 -0
  74. attune/hot_reload/README.md +473 -0
  75. attune/hot_reload/__init__.py +62 -0
  76. attune/hot_reload/config.py +83 -0
  77. attune/hot_reload/integration.py +229 -0
  78. attune/hot_reload/reloader.py +298 -0
  79. attune/hot_reload/watcher.py +183 -0
  80. attune/hot_reload/websocket.py +177 -0
  81. attune/levels.py +577 -0
  82. attune/leverage_points.py +441 -0
  83. attune/logging_config.py +261 -0
  84. attune/mcp/__init__.py +10 -0
  85. attune/mcp/server.py +506 -0
  86. attune/memory/__init__.py +237 -0
  87. attune/memory/claude_memory.py +469 -0
  88. attune/memory/config.py +224 -0
  89. attune/memory/control_panel.py +1290 -0
  90. attune/memory/control_panel_support.py +145 -0
  91. attune/memory/cross_session.py +845 -0
  92. attune/memory/edges.py +179 -0
  93. attune/memory/encryption.py +159 -0
  94. attune/memory/file_session.py +770 -0
  95. attune/memory/graph.py +570 -0
  96. attune/memory/long_term.py +913 -0
  97. attune/memory/long_term_types.py +99 -0
  98. attune/memory/mixins/__init__.py +25 -0
  99. attune/memory/mixins/backend_init_mixin.py +249 -0
  100. attune/memory/mixins/capabilities_mixin.py +208 -0
  101. attune/memory/mixins/handoff_mixin.py +208 -0
  102. attune/memory/mixins/lifecycle_mixin.py +49 -0
  103. attune/memory/mixins/long_term_mixin.py +352 -0
  104. attune/memory/mixins/promotion_mixin.py +109 -0
  105. attune/memory/mixins/short_term_mixin.py +182 -0
  106. attune/memory/nodes.py +179 -0
  107. attune/memory/redis_bootstrap.py +540 -0
  108. attune/memory/security/__init__.py +31 -0
  109. attune/memory/security/audit_logger.py +932 -0
  110. attune/memory/security/pii_scrubber.py +640 -0
  111. attune/memory/security/secrets_detector.py +678 -0
  112. attune/memory/short_term.py +2192 -0
  113. attune/memory/simple_storage.py +302 -0
  114. attune/memory/storage/__init__.py +15 -0
  115. attune/memory/storage_backend.py +167 -0
  116. attune/memory/summary_index.py +583 -0
  117. attune/memory/types.py +446 -0
  118. attune/memory/unified.py +182 -0
  119. attune/meta_workflows/__init__.py +74 -0
  120. attune/meta_workflows/agent_creator.py +248 -0
  121. attune/meta_workflows/builtin_templates.py +567 -0
  122. attune/meta_workflows/cli_commands/__init__.py +56 -0
  123. attune/meta_workflows/cli_commands/agent_commands.py +321 -0
  124. attune/meta_workflows/cli_commands/analytics_commands.py +442 -0
  125. attune/meta_workflows/cli_commands/config_commands.py +232 -0
  126. attune/meta_workflows/cli_commands/memory_commands.py +182 -0
  127. attune/meta_workflows/cli_commands/template_commands.py +354 -0
  128. attune/meta_workflows/cli_commands/workflow_commands.py +382 -0
  129. attune/meta_workflows/cli_meta_workflows.py +59 -0
  130. attune/meta_workflows/form_engine.py +292 -0
  131. attune/meta_workflows/intent_detector.py +409 -0
  132. attune/meta_workflows/models.py +569 -0
  133. attune/meta_workflows/pattern_learner.py +738 -0
  134. attune/meta_workflows/plan_generator.py +384 -0
  135. attune/meta_workflows/session_context.py +397 -0
  136. attune/meta_workflows/template_registry.py +229 -0
  137. attune/meta_workflows/workflow.py +984 -0
  138. attune/metrics/__init__.py +12 -0
  139. attune/metrics/collector.py +31 -0
  140. attune/metrics/prompt_metrics.py +194 -0
  141. attune/models/__init__.py +172 -0
  142. attune/models/__main__.py +13 -0
  143. attune/models/adaptive_routing.py +437 -0
  144. attune/models/auth_cli.py +444 -0
  145. attune/models/auth_strategy.py +450 -0
  146. attune/models/cli.py +655 -0
  147. attune/models/empathy_executor.py +354 -0
  148. attune/models/executor.py +257 -0
  149. attune/models/fallback.py +762 -0
  150. attune/models/provider_config.py +282 -0
  151. attune/models/registry.py +472 -0
  152. attune/models/tasks.py +359 -0
  153. attune/models/telemetry/__init__.py +71 -0
  154. attune/models/telemetry/analytics.py +594 -0
  155. attune/models/telemetry/backend.py +196 -0
  156. attune/models/telemetry/data_models.py +431 -0
  157. attune/models/telemetry/storage.py +489 -0
  158. attune/models/token_estimator.py +420 -0
  159. attune/models/validation.py +280 -0
  160. attune/monitoring/__init__.py +52 -0
  161. attune/monitoring/alerts.py +946 -0
  162. attune/monitoring/alerts_cli.py +448 -0
  163. attune/monitoring/multi_backend.py +271 -0
  164. attune/monitoring/otel_backend.py +362 -0
  165. attune/optimization/__init__.py +19 -0
  166. attune/optimization/context_optimizer.py +272 -0
  167. attune/orchestration/__init__.py +67 -0
  168. attune/orchestration/agent_templates.py +707 -0
  169. attune/orchestration/config_store.py +499 -0
  170. attune/orchestration/execution_strategies.py +2111 -0
  171. attune/orchestration/meta_orchestrator.py +1168 -0
  172. attune/orchestration/pattern_learner.py +696 -0
  173. attune/orchestration/real_tools.py +931 -0
  174. attune/pattern_cache.py +187 -0
  175. attune/pattern_library.py +542 -0
  176. attune/patterns/debugging/all_patterns.json +81 -0
  177. attune/patterns/debugging/workflow_20260107_1770825e.json +77 -0
  178. attune/patterns/refactoring_memory.json +89 -0
  179. attune/persistence.py +564 -0
  180. attune/platform_utils.py +265 -0
  181. attune/plugins/__init__.py +28 -0
  182. attune/plugins/base.py +361 -0
  183. attune/plugins/registry.py +268 -0
  184. attune/project_index/__init__.py +32 -0
  185. attune/project_index/cli.py +335 -0
  186. attune/project_index/index.py +667 -0
  187. attune/project_index/models.py +504 -0
  188. attune/project_index/reports.py +474 -0
  189. attune/project_index/scanner.py +777 -0
  190. attune/project_index/scanner_parallel.py +291 -0
  191. attune/prompts/__init__.py +61 -0
  192. attune/prompts/config.py +77 -0
  193. attune/prompts/context.py +177 -0
  194. attune/prompts/parser.py +285 -0
  195. attune/prompts/registry.py +313 -0
  196. attune/prompts/templates.py +208 -0
  197. attune/redis_config.py +302 -0
  198. attune/redis_memory.py +799 -0
  199. attune/resilience/__init__.py +56 -0
  200. attune/resilience/circuit_breaker.py +256 -0
  201. attune/resilience/fallback.py +179 -0
  202. attune/resilience/health.py +300 -0
  203. attune/resilience/retry.py +209 -0
  204. attune/resilience/timeout.py +135 -0
  205. attune/routing/__init__.py +43 -0
  206. attune/routing/chain_executor.py +433 -0
  207. attune/routing/classifier.py +217 -0
  208. attune/routing/smart_router.py +234 -0
  209. attune/routing/workflow_registry.py +343 -0
  210. attune/scaffolding/README.md +589 -0
  211. attune/scaffolding/__init__.py +35 -0
  212. attune/scaffolding/__main__.py +14 -0
  213. attune/scaffolding/cli.py +240 -0
  214. attune/scaffolding/templates/base_wizard.py.jinja2 +121 -0
  215. attune/scaffolding/templates/coach_wizard.py.jinja2 +321 -0
  216. attune/scaffolding/templates/domain_wizard.py.jinja2 +408 -0
  217. attune/scaffolding/templates/linear_flow_wizard.py.jinja2 +203 -0
  218. attune/socratic/__init__.py +256 -0
  219. attune/socratic/ab_testing.py +958 -0
  220. attune/socratic/blueprint.py +533 -0
  221. attune/socratic/cli.py +703 -0
  222. attune/socratic/collaboration.py +1114 -0
  223. attune/socratic/domain_templates.py +924 -0
  224. attune/socratic/embeddings.py +738 -0
  225. attune/socratic/engine.py +794 -0
  226. attune/socratic/explainer.py +682 -0
  227. attune/socratic/feedback.py +772 -0
  228. attune/socratic/forms.py +629 -0
  229. attune/socratic/generator.py +732 -0
  230. attune/socratic/llm_analyzer.py +637 -0
  231. attune/socratic/mcp_server.py +702 -0
  232. attune/socratic/session.py +312 -0
  233. attune/socratic/storage.py +667 -0
  234. attune/socratic/success.py +730 -0
  235. attune/socratic/visual_editor.py +860 -0
  236. attune/socratic/web_ui.py +958 -0
  237. attune/telemetry/__init__.py +39 -0
  238. attune/telemetry/agent_coordination.py +475 -0
  239. attune/telemetry/agent_tracking.py +367 -0
  240. attune/telemetry/approval_gates.py +545 -0
  241. attune/telemetry/cli.py +1231 -0
  242. attune/telemetry/commands/__init__.py +14 -0
  243. attune/telemetry/commands/dashboard_commands.py +696 -0
  244. attune/telemetry/event_streaming.py +409 -0
  245. attune/telemetry/feedback_loop.py +567 -0
  246. attune/telemetry/usage_tracker.py +591 -0
  247. attune/templates.py +754 -0
  248. attune/test_generator/__init__.py +38 -0
  249. attune/test_generator/__main__.py +14 -0
  250. attune/test_generator/cli.py +234 -0
  251. attune/test_generator/generator.py +355 -0
  252. attune/test_generator/risk_analyzer.py +216 -0
  253. attune/test_generator/templates/unit_test.py.jinja2 +272 -0
  254. attune/tier_recommender.py +384 -0
  255. attune/tools.py +183 -0
  256. attune/trust/__init__.py +28 -0
  257. attune/trust/circuit_breaker.py +579 -0
  258. attune/trust_building.py +527 -0
  259. attune/validation/__init__.py +19 -0
  260. attune/validation/xml_validator.py +281 -0
  261. attune/vscode_bridge.py +173 -0
  262. attune/workflow_commands.py +780 -0
  263. attune/workflow_patterns/__init__.py +33 -0
  264. attune/workflow_patterns/behavior.py +249 -0
  265. attune/workflow_patterns/core.py +76 -0
  266. attune/workflow_patterns/output.py +99 -0
  267. attune/workflow_patterns/registry.py +255 -0
  268. attune/workflow_patterns/structural.py +288 -0
  269. attune/workflows/__init__.py +539 -0
  270. attune/workflows/autonomous_test_gen.py +1268 -0
  271. attune/workflows/base.py +2667 -0
  272. attune/workflows/batch_processing.py +342 -0
  273. attune/workflows/bug_predict.py +1084 -0
  274. attune/workflows/builder.py +273 -0
  275. attune/workflows/caching.py +253 -0
  276. attune/workflows/code_review.py +1048 -0
  277. attune/workflows/code_review_adapters.py +312 -0
  278. attune/workflows/code_review_pipeline.py +722 -0
  279. attune/workflows/config.py +645 -0
  280. attune/workflows/dependency_check.py +644 -0
  281. attune/workflows/document_gen/__init__.py +25 -0
  282. attune/workflows/document_gen/config.py +30 -0
  283. attune/workflows/document_gen/report_formatter.py +162 -0
  284. attune/workflows/document_gen/workflow.py +1426 -0
  285. attune/workflows/document_manager.py +216 -0
  286. attune/workflows/document_manager_README.md +134 -0
  287. attune/workflows/documentation_orchestrator.py +1205 -0
  288. attune/workflows/history.py +510 -0
  289. attune/workflows/keyboard_shortcuts/__init__.py +39 -0
  290. attune/workflows/keyboard_shortcuts/generators.py +391 -0
  291. attune/workflows/keyboard_shortcuts/parsers.py +416 -0
  292. attune/workflows/keyboard_shortcuts/prompts.py +295 -0
  293. attune/workflows/keyboard_shortcuts/schema.py +193 -0
  294. attune/workflows/keyboard_shortcuts/workflow.py +509 -0
  295. attune/workflows/llm_base.py +363 -0
  296. attune/workflows/manage_docs.py +87 -0
  297. attune/workflows/manage_docs_README.md +134 -0
  298. attune/workflows/manage_documentation.py +821 -0
  299. attune/workflows/new_sample_workflow1.py +149 -0
  300. attune/workflows/new_sample_workflow1_README.md +150 -0
  301. attune/workflows/orchestrated_health_check.py +849 -0
  302. attune/workflows/orchestrated_release_prep.py +600 -0
  303. attune/workflows/output.py +413 -0
  304. attune/workflows/perf_audit.py +863 -0
  305. attune/workflows/pr_review.py +762 -0
  306. attune/workflows/progress.py +785 -0
  307. attune/workflows/progress_server.py +322 -0
  308. attune/workflows/progressive/README 2.md +454 -0
  309. attune/workflows/progressive/README.md +454 -0
  310. attune/workflows/progressive/__init__.py +82 -0
  311. attune/workflows/progressive/cli.py +219 -0
  312. attune/workflows/progressive/core.py +488 -0
  313. attune/workflows/progressive/orchestrator.py +723 -0
  314. attune/workflows/progressive/reports.py +520 -0
  315. attune/workflows/progressive/telemetry.py +274 -0
  316. attune/workflows/progressive/test_gen.py +495 -0
  317. attune/workflows/progressive/workflow.py +589 -0
  318. attune/workflows/refactor_plan.py +694 -0
  319. attune/workflows/release_prep.py +895 -0
  320. attune/workflows/release_prep_crew.py +969 -0
  321. attune/workflows/research_synthesis.py +404 -0
  322. attune/workflows/routing.py +168 -0
  323. attune/workflows/secure_release.py +593 -0
  324. attune/workflows/security_adapters.py +297 -0
  325. attune/workflows/security_audit.py +1329 -0
  326. attune/workflows/security_audit_phase3.py +355 -0
  327. attune/workflows/seo_optimization.py +633 -0
  328. attune/workflows/step_config.py +234 -0
  329. attune/workflows/telemetry_mixin.py +269 -0
  330. attune/workflows/test5.py +125 -0
  331. attune/workflows/test5_README.md +158 -0
  332. attune/workflows/test_coverage_boost_crew.py +849 -0
  333. attune/workflows/test_gen/__init__.py +52 -0
  334. attune/workflows/test_gen/ast_analyzer.py +249 -0
  335. attune/workflows/test_gen/config.py +88 -0
  336. attune/workflows/test_gen/data_models.py +38 -0
  337. attune/workflows/test_gen/report_formatter.py +289 -0
  338. attune/workflows/test_gen/test_templates.py +381 -0
  339. attune/workflows/test_gen/workflow.py +655 -0
  340. attune/workflows/test_gen.py +54 -0
  341. attune/workflows/test_gen_behavioral.py +477 -0
  342. attune/workflows/test_gen_parallel.py +341 -0
  343. attune/workflows/test_lifecycle.py +526 -0
  344. attune/workflows/test_maintenance.py +627 -0
  345. attune/workflows/test_maintenance_cli.py +590 -0
  346. attune/workflows/test_maintenance_crew.py +840 -0
  347. attune/workflows/test_runner.py +622 -0
  348. attune/workflows/tier_tracking.py +531 -0
  349. attune/workflows/xml_enhanced_crew.py +285 -0
  350. attune_ai-2.0.0.dist-info/METADATA +1026 -0
  351. attune_ai-2.0.0.dist-info/RECORD +457 -0
  352. attune_ai-2.0.0.dist-info/WHEEL +5 -0
  353. attune_ai-2.0.0.dist-info/entry_points.txt +26 -0
  354. attune_ai-2.0.0.dist-info/licenses/LICENSE +201 -0
  355. attune_ai-2.0.0.dist-info/licenses/LICENSE_CHANGE_ANNOUNCEMENT.md +101 -0
  356. attune_ai-2.0.0.dist-info/top_level.txt +5 -0
  357. attune_healthcare/__init__.py +13 -0
  358. attune_healthcare/monitors/__init__.py +9 -0
  359. attune_healthcare/monitors/clinical_protocol_monitor.py +315 -0
  360. attune_healthcare/monitors/monitoring/__init__.py +44 -0
  361. attune_healthcare/monitors/monitoring/protocol_checker.py +300 -0
  362. attune_healthcare/monitors/monitoring/protocol_loader.py +214 -0
  363. attune_healthcare/monitors/monitoring/sensor_parsers.py +306 -0
  364. attune_healthcare/monitors/monitoring/trajectory_analyzer.py +389 -0
  365. attune_llm/README.md +553 -0
  366. attune_llm/__init__.py +28 -0
  367. attune_llm/agent_factory/__init__.py +53 -0
  368. attune_llm/agent_factory/adapters/__init__.py +85 -0
  369. attune_llm/agent_factory/adapters/autogen_adapter.py +312 -0
  370. attune_llm/agent_factory/adapters/crewai_adapter.py +483 -0
  371. attune_llm/agent_factory/adapters/haystack_adapter.py +298 -0
  372. attune_llm/agent_factory/adapters/langchain_adapter.py +362 -0
  373. attune_llm/agent_factory/adapters/langgraph_adapter.py +333 -0
  374. attune_llm/agent_factory/adapters/native.py +228 -0
  375. attune_llm/agent_factory/adapters/wizard_adapter.py +423 -0
  376. attune_llm/agent_factory/base.py +305 -0
  377. attune_llm/agent_factory/crews/__init__.py +67 -0
  378. attune_llm/agent_factory/crews/code_review.py +1113 -0
  379. attune_llm/agent_factory/crews/health_check.py +1262 -0
  380. attune_llm/agent_factory/crews/refactoring.py +1128 -0
  381. attune_llm/agent_factory/crews/security_audit.py +1018 -0
  382. attune_llm/agent_factory/decorators.py +287 -0
  383. attune_llm/agent_factory/factory.py +558 -0
  384. attune_llm/agent_factory/framework.py +193 -0
  385. attune_llm/agent_factory/memory_integration.py +328 -0
  386. attune_llm/agent_factory/resilient.py +320 -0
  387. attune_llm/agents_md/__init__.py +22 -0
  388. attune_llm/agents_md/loader.py +218 -0
  389. attune_llm/agents_md/parser.py +271 -0
  390. attune_llm/agents_md/registry.py +307 -0
  391. attune_llm/claude_memory.py +466 -0
  392. attune_llm/cli/__init__.py +8 -0
  393. attune_llm/cli/sync_claude.py +487 -0
  394. attune_llm/code_health.py +1313 -0
  395. attune_llm/commands/__init__.py +51 -0
  396. attune_llm/commands/context.py +375 -0
  397. attune_llm/commands/loader.py +301 -0
  398. attune_llm/commands/models.py +231 -0
  399. attune_llm/commands/parser.py +371 -0
  400. attune_llm/commands/registry.py +429 -0
  401. attune_llm/config/__init__.py +29 -0
  402. attune_llm/config/unified.py +291 -0
  403. attune_llm/context/__init__.py +22 -0
  404. attune_llm/context/compaction.py +455 -0
  405. attune_llm/context/manager.py +434 -0
  406. attune_llm/contextual_patterns.py +361 -0
  407. attune_llm/core.py +907 -0
  408. attune_llm/git_pattern_extractor.py +435 -0
  409. attune_llm/hooks/__init__.py +24 -0
  410. attune_llm/hooks/config.py +306 -0
  411. attune_llm/hooks/executor.py +289 -0
  412. attune_llm/hooks/registry.py +302 -0
  413. attune_llm/hooks/scripts/__init__.py +39 -0
  414. attune_llm/hooks/scripts/evaluate_session.py +201 -0
  415. attune_llm/hooks/scripts/first_time_init.py +285 -0
  416. attune_llm/hooks/scripts/pre_compact.py +207 -0
  417. attune_llm/hooks/scripts/session_end.py +183 -0
  418. attune_llm/hooks/scripts/session_start.py +163 -0
  419. attune_llm/hooks/scripts/suggest_compact.py +225 -0
  420. attune_llm/learning/__init__.py +30 -0
  421. attune_llm/learning/evaluator.py +438 -0
  422. attune_llm/learning/extractor.py +514 -0
  423. attune_llm/learning/storage.py +560 -0
  424. attune_llm/levels.py +227 -0
  425. attune_llm/pattern_confidence.py +414 -0
  426. attune_llm/pattern_resolver.py +272 -0
  427. attune_llm/pattern_summary.py +350 -0
  428. attune_llm/providers.py +967 -0
  429. attune_llm/routing/__init__.py +32 -0
  430. attune_llm/routing/model_router.py +362 -0
  431. attune_llm/security/IMPLEMENTATION_SUMMARY.md +413 -0
  432. attune_llm/security/PHASE2_COMPLETE.md +384 -0
  433. attune_llm/security/PHASE2_SECRETS_DETECTOR_COMPLETE.md +271 -0
  434. attune_llm/security/QUICK_REFERENCE.md +316 -0
  435. attune_llm/security/README.md +262 -0
  436. attune_llm/security/__init__.py +62 -0
  437. attune_llm/security/audit_logger.py +929 -0
  438. attune_llm/security/audit_logger_example.py +152 -0
  439. attune_llm/security/pii_scrubber.py +640 -0
  440. attune_llm/security/secrets_detector.py +678 -0
  441. attune_llm/security/secrets_detector_example.py +304 -0
  442. attune_llm/security/secure_memdocs.py +1192 -0
  443. attune_llm/security/secure_memdocs_example.py +278 -0
  444. attune_llm/session_status.py +745 -0
  445. attune_llm/state.py +246 -0
  446. attune_llm/utils/__init__.py +5 -0
  447. attune_llm/utils/tokens.py +349 -0
  448. attune_software/SOFTWARE_PLUGIN_README.md +57 -0
  449. attune_software/__init__.py +13 -0
  450. attune_software/cli/__init__.py +120 -0
  451. attune_software/cli/inspect.py +362 -0
  452. attune_software/cli.py +574 -0
  453. attune_software/plugin.py +188 -0
  454. workflow_scaffolding/__init__.py +11 -0
  455. workflow_scaffolding/__main__.py +12 -0
  456. workflow_scaffolding/cli.py +206 -0
  457. workflow_scaffolding/generator.py +265 -0
@@ -0,0 +1,118 @@
1
+ """Argument parser for batch processing commands.
2
+
3
+ Copyright 2025 Smart-AI-Memory
4
+ Licensed under Fair Source License 0.9
5
+ """
6
+
7
+
8
+ def register_parsers(subparsers):
9
+ """Register batch command parsers.
10
+
11
+ Args:
12
+ subparsers: Subparser object from main argument parser
13
+
14
+ Returns:
15
+ None: Adds batch subparser with submit, status, results, wait subcommands
16
+ """
17
+ from ..commands.batch import (
18
+ cmd_batch_results,
19
+ cmd_batch_status,
20
+ cmd_batch_submit,
21
+ cmd_batch_wait,
22
+ )
23
+
24
+ # Main batch command
25
+ batch_parser = subparsers.add_parser(
26
+ "batch",
27
+ help="Batch processing via Anthropic Batch API (50% cost savings)",
28
+ description="Submit and manage batch processing jobs for non-urgent tasks",
29
+ )
30
+
31
+ # Batch subcommands
32
+ batch_subparsers = batch_parser.add_subparsers(dest="batch_command", required=True)
33
+
34
+ # batch submit command
35
+ submit_parser = batch_subparsers.add_parser(
36
+ "submit",
37
+ help="Submit a batch processing job from JSON file",
38
+ description="Submit batch requests for asynchronous processing (50% cost savings)",
39
+ )
40
+
41
+ submit_parser.add_argument(
42
+ "input_file",
43
+ help='JSON file with batch requests. Format: [{"task_id": "...", "task_type": "...", "input_data": {...}}]',
44
+ )
45
+
46
+ submit_parser.set_defaults(func=cmd_batch_submit)
47
+
48
+ # batch status command
49
+ status_parser = batch_subparsers.add_parser(
50
+ "status",
51
+ help="Check status of a batch processing job",
52
+ description="Display current status and request counts for a batch",
53
+ )
54
+
55
+ status_parser.add_argument(
56
+ "batch_id",
57
+ help="Batch ID (e.g., msgbatch_abc123)",
58
+ )
59
+
60
+ status_parser.add_argument(
61
+ "--json",
62
+ action="store_true",
63
+ help="Output raw JSON status",
64
+ )
65
+
66
+ status_parser.set_defaults(func=cmd_batch_status)
67
+
68
+ # batch results command
69
+ results_parser = batch_subparsers.add_parser(
70
+ "results",
71
+ help="Retrieve results from completed batch",
72
+ description="Download and save batch results to JSON file",
73
+ )
74
+
75
+ results_parser.add_argument(
76
+ "batch_id",
77
+ help="Batch ID (e.g., msgbatch_abc123)",
78
+ )
79
+
80
+ results_parser.add_argument(
81
+ "output_file",
82
+ help="Path to output JSON file",
83
+ )
84
+
85
+ results_parser.set_defaults(func=cmd_batch_results)
86
+
87
+ # batch wait command
88
+ wait_parser = batch_subparsers.add_parser(
89
+ "wait",
90
+ help="Wait for batch to complete and retrieve results",
91
+ description="Poll batch status until completion, then download results",
92
+ )
93
+
94
+ wait_parser.add_argument(
95
+ "batch_id",
96
+ help="Batch ID (e.g., msgbatch_abc123)",
97
+ )
98
+
99
+ wait_parser.add_argument(
100
+ "output_file",
101
+ help="Path to output JSON file",
102
+ )
103
+
104
+ wait_parser.add_argument(
105
+ "--poll-interval",
106
+ type=int,
107
+ default=300,
108
+ help="Seconds between status checks (default: 300 = 5 minutes)",
109
+ )
110
+
111
+ wait_parser.add_argument(
112
+ "--timeout",
113
+ type=int,
114
+ default=86400,
115
+ help="Maximum wait time in seconds (default: 86400 = 24 hours)",
116
+ )
117
+
118
+ wait_parser.set_defaults(func=cmd_batch_wait)
@@ -0,0 +1,65 @@
1
+ """Argument parser for cache commands.
2
+
3
+ Copyright 2025 Smart-AI-Memory
4
+ Licensed under Fair Source License 0.9
5
+ """
6
+
7
+
8
+ def register_parsers(subparsers):
9
+ """Register cache command parsers.
10
+
11
+ Args:
12
+ subparsers: Subparser object from main argument parser
13
+
14
+ Returns:
15
+ None: Adds cache subparser with stats and clear subcommands
16
+ """
17
+ from ..commands.cache import cmd_cache_clear, cmd_cache_stats
18
+ # Main cache command
19
+ cache_parser = subparsers.add_parser(
20
+ "cache",
21
+ help="Cache monitoring and management",
22
+ description="Monitor prompt caching performance and cost savings",
23
+ )
24
+
25
+ # Cache subcommands
26
+ cache_subparsers = cache_parser.add_subparsers(dest="cache_command", required=True)
27
+
28
+ # cache stats command
29
+ stats_parser = cache_subparsers.add_parser(
30
+ "stats",
31
+ help="Show cache performance statistics",
32
+ description="Display prompt caching metrics including hit rate and cost savings",
33
+ )
34
+
35
+ stats_parser.add_argument(
36
+ "--days",
37
+ type=int,
38
+ default=7,
39
+ help="Number of days to analyze (default: 7)",
40
+ )
41
+
42
+ stats_parser.add_argument(
43
+ "--format",
44
+ choices=["table", "json"],
45
+ default="table",
46
+ help="Output format (default: table)",
47
+ )
48
+
49
+ stats_parser.add_argument(
50
+ "--verbose",
51
+ "-v",
52
+ action="store_true",
53
+ help="Show detailed token metrics",
54
+ )
55
+
56
+ stats_parser.set_defaults(func=cmd_cache_stats)
57
+
58
+ # cache clear command (placeholder)
59
+ clear_parser = cache_subparsers.add_parser(
60
+ "clear",
61
+ help="Clear cache (note: Anthropic cache is server-side with 5min TTL)",
62
+ description="Information about cache clearing",
63
+ )
64
+
65
+ clear_parser.set_defaults(func=cmd_cache_clear)
@@ -0,0 +1,41 @@
1
+ """Parser definitions for help commands.
2
+
3
+ Copyright 2025 Smart-AI-Memory
4
+ Licensed under Fair Source License 0.9
5
+ """
6
+
7
+ from ..commands import help as help_commands
8
+
9
+
10
+ def register_parsers(subparsers):
11
+ """Register help command parsers.
12
+
13
+ Args:
14
+ subparsers: ArgumentParser subparsers object
15
+ """
16
+ # version command
17
+ parser_version = subparsers.add_parser("version", help="Display version information")
18
+ parser_version.set_defaults(func=help_commands.cmd_version)
19
+
20
+ # cheatsheet command
21
+ parser_cheatsheet = subparsers.add_parser("cheatsheet", help="Quick reference guide")
22
+ parser_cheatsheet.add_argument("--category", help="Specific category to show")
23
+ parser_cheatsheet.add_argument(
24
+ "--compact", action="store_true", help="Show commands only"
25
+ )
26
+ parser_cheatsheet.set_defaults(func=help_commands.cmd_cheatsheet)
27
+
28
+ # onboard command
29
+ parser_onboard = subparsers.add_parser("onboard", help="Interactive tutorial")
30
+ parser_onboard.add_argument("--step", type=int, help="Jump to specific step")
31
+ parser_onboard.add_argument("--reset", action="store_true", help="Reset progress")
32
+ parser_onboard.set_defaults(func=help_commands.cmd_onboard)
33
+
34
+ # explain command
35
+ parser_explain = subparsers.add_parser("explain", help="Explain a command in detail")
36
+ parser_explain.add_argument("command", help="Command to explain")
37
+ parser_explain.set_defaults(func=help_commands.cmd_explain)
38
+
39
+ # achievements command
40
+ parser_achievements = subparsers.add_parser("achievements", help="Show user progress")
41
+ parser_achievements.set_defaults(func=help_commands.cmd_achievements)
@@ -0,0 +1,26 @@
1
+ """Parser definitions for info commands.
2
+
3
+ Copyright 2025 Smart-AI-Memory
4
+ Licensed under Fair Source License 0.9
5
+ """
6
+
7
+ from ..commands import info as info_commands
8
+
9
+
10
+ def register_parsers(subparsers):
11
+ """Register info command parsers.
12
+
13
+ Args:
14
+ subparsers: ArgumentParser subparsers object
15
+ """
16
+ # info command
17
+ parser_info = subparsers.add_parser("info", help="Display framework information")
18
+ parser_info.add_argument("--config", help="Path to config file")
19
+ parser_info.set_defaults(func=info_commands.cmd_info)
20
+
21
+ # frameworks command
22
+ parser_frameworks = subparsers.add_parser("frameworks", help="List agent frameworks")
23
+ parser_frameworks.add_argument("--all", action="store_true", help="Show all frameworks")
24
+ parser_frameworks.add_argument("--recommend", help="Recommend for use case")
25
+ parser_frameworks.add_argument("--json", action="store_true", help="Output as JSON")
26
+ parser_frameworks.set_defaults(func=info_commands.cmd_frameworks)
@@ -0,0 +1,66 @@
1
+ """Parser definitions for inspect commands.
2
+
3
+ Copyright 2025 Smart-AI-Memory
4
+ Licensed under Fair Source License 0.9
5
+ """
6
+
7
+ from ..commands import inspect
8
+
9
+
10
+ def register_parsers(subparsers):
11
+ """Register inspect command parsers.
12
+
13
+ Args:
14
+ subparsers: ArgumentParser subparsers object from main parser
15
+ """
16
+ # Run command - Interactive REPL
17
+ parser_run = subparsers.add_parser("run", help="Interactive REPL mode")
18
+ parser_run.add_argument("--config", "-c", help="Configuration file path")
19
+ parser_run.add_argument("--user-id", help="User ID (default: cli_user)")
20
+ parser_run.add_argument(
21
+ "--level",
22
+ type=int,
23
+ default=4,
24
+ help="Target empathy level (1-5, default: 4)",
25
+ )
26
+ parser_run.set_defaults(func=inspect.cmd_run)
27
+
28
+ # Inspect command - Unified inspection
29
+ parser_inspect = subparsers.add_parser("inspect", help="Inspect patterns, metrics, or state")
30
+ parser_inspect.add_argument(
31
+ "type",
32
+ choices=["patterns", "metrics", "state"],
33
+ help="Type of inspection (patterns, metrics, or state)",
34
+ )
35
+ parser_inspect.add_argument("--user-id", help="User ID to filter by (optional)")
36
+ parser_inspect.add_argument("--db", help="Database path (default: .attune/patterns.db)")
37
+ parser_inspect.add_argument(
38
+ "--state-dir",
39
+ help="State directory path (default: .attune/state)",
40
+ )
41
+ parser_inspect.set_defaults(func=inspect.cmd_inspect)
42
+
43
+ # Export command
44
+ parser_export = subparsers.add_parser(
45
+ "export",
46
+ help="Export patterns to file for sharing/backup",
47
+ )
48
+ parser_export.add_argument("output", help="Output file path")
49
+ parser_export.add_argument(
50
+ "--user-id",
51
+ help="User ID to export (optional, exports all if not specified)",
52
+ )
53
+ parser_export.add_argument("--db", help="Database path (default: .attune/patterns.db)")
54
+ parser_export.add_argument(
55
+ "--format",
56
+ default="json",
57
+ choices=["json"],
58
+ help="Export format (default: json)",
59
+ )
60
+ parser_export.set_defaults(func=inspect.cmd_export)
61
+
62
+ # Import command
63
+ parser_import = subparsers.add_parser("import", help="Import patterns from file")
64
+ parser_import.add_argument("input", help="Input file path")
65
+ parser_import.add_argument("--db", help="Database path (default: .attune/patterns.db)")
66
+ parser_import.set_defaults(func=inspect.cmd_import)
@@ -0,0 +1,42 @@
1
+ """Parser definitions for metrics commands.
2
+
3
+ Copyright 2025 Smart-AI-Memory
4
+ Licensed under Fair Source License 0.9
5
+ """
6
+
7
+ from ..commands import metrics
8
+
9
+
10
+ def register_parsers(subparsers):
11
+ """Register metrics command parsers.
12
+
13
+ Args:
14
+ subparsers: ArgumentParser subparsers object from main parser
15
+ """
16
+ # Metrics command
17
+ parser_metrics = subparsers.add_parser(
18
+ "metrics",
19
+ help="Display user metrics",
20
+ )
21
+ parser_metrics.add_argument(
22
+ "user",
23
+ help="User ID to retrieve metrics for",
24
+ )
25
+ parser_metrics.add_argument(
26
+ "--db",
27
+ default="./metrics.db",
28
+ help="Path to metrics database (default: ./metrics.db)",
29
+ )
30
+ parser_metrics.set_defaults(func=metrics.cmd_metrics_show)
31
+
32
+ # State command
33
+ parser_state = subparsers.add_parser(
34
+ "state",
35
+ help="List saved user states",
36
+ )
37
+ parser_state.add_argument(
38
+ "--state-dir",
39
+ default=".attune/state",
40
+ help="State directory path (default: .attune/state)",
41
+ )
42
+ parser_state.set_defaults(func=metrics.cmd_state_list)
@@ -0,0 +1,61 @@
1
+ """Parser definitions for orchestrate commands.
2
+
3
+ Copyright 2025 Smart-AI-Memory
4
+ Licensed under Fair Source License 0.9
5
+ """
6
+
7
+ from ..commands import orchestrate
8
+
9
+
10
+ def register_parsers(subparsers):
11
+ """Register orchestrate command parsers.
12
+
13
+ Args:
14
+ subparsers: ArgumentParser subparsers object from main parser
15
+ """
16
+ # Orchestrate command
17
+ parser_orchestrate = subparsers.add_parser(
18
+ "orchestrate",
19
+ help="Run meta-orchestration workflows (release-prep, health-check)",
20
+ )
21
+ parser_orchestrate.add_argument(
22
+ "workflow",
23
+ choices=["release-prep", "health-check", "test-coverage"],
24
+ help="Orchestration workflow to run",
25
+ )
26
+ parser_orchestrate.add_argument(
27
+ "--path",
28
+ default=".",
29
+ help="Project path (for release-prep)",
30
+ )
31
+ parser_orchestrate.add_argument(
32
+ "--mode",
33
+ choices=["daily", "weekly", "release"],
34
+ help="Health check mode (for health-check)",
35
+ )
36
+ parser_orchestrate.add_argument(
37
+ "--project-root",
38
+ default=".",
39
+ help="Project root directory (for health-check)",
40
+ )
41
+ parser_orchestrate.add_argument(
42
+ "--json",
43
+ action="store_true",
44
+ help="Output as JSON",
45
+ )
46
+ parser_orchestrate.add_argument(
47
+ "--min-coverage",
48
+ type=int,
49
+ help="Minimum test coverage percentage (for release-prep)",
50
+ )
51
+ parser_orchestrate.add_argument(
52
+ "--min-quality",
53
+ type=int,
54
+ help="Minimum quality score (for release-prep)",
55
+ )
56
+ parser_orchestrate.add_argument(
57
+ "--max-critical",
58
+ type=int,
59
+ help="Maximum critical issues allowed (for release-prep)",
60
+ )
61
+ parser_orchestrate.set_defaults(func=orchestrate.cmd_orchestrate)
@@ -0,0 +1,54 @@
1
+ """Parser definitions for pattern commands.
2
+
3
+ Copyright 2025 Smart-AI-Memory
4
+ Licensed under Fair Source License 0.9
5
+ """
6
+
7
+ from ..commands import patterns as patterns_commands
8
+
9
+
10
+ def register_parsers(subparsers):
11
+ """Register pattern command parsers.
12
+
13
+ Args:
14
+ subparsers: ArgumentParser subparsers object
15
+ """
16
+ # Create patterns subcommand group
17
+ patterns_parser = subparsers.add_parser("patterns", help="Pattern management commands")
18
+ patterns_subparsers = patterns_parser.add_subparsers(dest="patterns_command")
19
+
20
+ # patterns list
21
+ parser_list = patterns_subparsers.add_parser("list", help="List patterns in library")
22
+ parser_list.add_argument("library", help="Path to pattern library")
23
+ parser_list.add_argument(
24
+ "--format", choices=["json", "sqlite"], default="json", help="Library format"
25
+ )
26
+ parser_list.set_defaults(func=patterns_commands.cmd_patterns_list)
27
+
28
+ # patterns export
29
+ parser_export = patterns_subparsers.add_parser("export", help="Export patterns")
30
+ parser_export.add_argument("input", help="Input file path")
31
+ parser_export.add_argument("output", help="Output file path")
32
+ parser_export.add_argument(
33
+ "--input-format", choices=["json", "sqlite"], default="json", help="Input format"
34
+ )
35
+ parser_export.add_argument(
36
+ "--output-format", choices=["json", "sqlite"], default="json", help="Output format"
37
+ )
38
+ parser_export.set_defaults(func=patterns_commands.cmd_patterns_export)
39
+
40
+ # patterns resolve
41
+ parser_resolve = patterns_subparsers.add_parser("resolve", help="Resolve a bug pattern")
42
+ parser_resolve.add_argument("bug_id", nargs="?", help="Bug ID to resolve")
43
+ parser_resolve.add_argument("--root-cause", help="Root cause description")
44
+ parser_resolve.add_argument("--fix", help="Fix description")
45
+ parser_resolve.add_argument("--fix-code", help="Code snippet of the fix")
46
+ parser_resolve.add_argument("--time", type=int, help="Resolution time in minutes")
47
+ parser_resolve.add_argument(
48
+ "--patterns-dir", default="./patterns", help="Patterns directory path"
49
+ )
50
+ parser_resolve.add_argument("--resolved-by", help="Who resolved it")
51
+ parser_resolve.add_argument(
52
+ "--no-regenerate", action="store_true", help="Don't regenerate summary"
53
+ )
54
+ parser_resolve.set_defaults(func=patterns_commands.cmd_patterns_resolve)
@@ -0,0 +1,40 @@
1
+ """Parser definitions for provider commands.
2
+
3
+ Copyright 2025 Smart-AI-Memory
4
+ Licensed under Fair Source License 0.9
5
+ """
6
+
7
+ from ..commands import provider
8
+
9
+
10
+ def register_parsers(subparsers):
11
+ """Register provider command parsers (Anthropic-only as of v5.0.0).
12
+
13
+ Args:
14
+ subparsers: ArgumentParser subparsers object from main parser
15
+ """
16
+ # Provider parent command
17
+ parser_provider = subparsers.add_parser(
18
+ "provider",
19
+ help="Configure Claude/Anthropic provider",
20
+ )
21
+ provider_sub = parser_provider.add_subparsers(dest="provider_command", required=True)
22
+
23
+ # Provider show command
24
+ p_show = provider_sub.add_parser(
25
+ "show",
26
+ help="Show current provider configuration",
27
+ )
28
+ p_show.set_defaults(func=provider.cmd_provider_show)
29
+
30
+ # Provider set command
31
+ p_set = provider_sub.add_parser(
32
+ "set",
33
+ help="Set default provider (must be 'anthropic')",
34
+ )
35
+ p_set.add_argument(
36
+ "name",
37
+ choices=["anthropic"],
38
+ help="Provider name (anthropic only)",
39
+ )
40
+ p_set.set_defaults(func=provider.cmd_provider_set)
@@ -0,0 +1,110 @@
1
+ """Argument parser for adaptive routing commands.
2
+
3
+ Copyright 2025 Smart-AI-Memory
4
+ Licensed under Fair Source License 0.9
5
+ """
6
+
7
+
8
+ def register_parsers(subparsers):
9
+ """Register routing command parsers.
10
+
11
+ Args:
12
+ subparsers: Subparser object from main argument parser
13
+
14
+ Returns:
15
+ None: Adds routing subparser with stats, check, models subcommands
16
+ """
17
+ from ..commands.routing import (
18
+ cmd_routing_check,
19
+ cmd_routing_models,
20
+ cmd_routing_stats,
21
+ )
22
+
23
+ # Main routing command
24
+ routing_parser = subparsers.add_parser(
25
+ "routing",
26
+ help="Adaptive model routing statistics and recommendations",
27
+ description="Analyze model routing performance based on historical telemetry",
28
+ )
29
+
30
+ # Routing subcommands
31
+ routing_subparsers = routing_parser.add_subparsers(
32
+ dest="routing_command", required=True
33
+ )
34
+
35
+ # routing stats command
36
+ stats_parser = routing_subparsers.add_parser(
37
+ "stats",
38
+ help="Show routing statistics for a workflow",
39
+ description="Display model performance metrics and recommendations",
40
+ )
41
+
42
+ stats_parser.add_argument("workflow", help="Workflow name (e.g., 'code-review')")
43
+
44
+ stats_parser.add_argument(
45
+ "--stage",
46
+ help="Stage name (optional, shows all stages if not specified)",
47
+ )
48
+
49
+ stats_parser.add_argument(
50
+ "--days",
51
+ type=int,
52
+ default=7,
53
+ help="Number of days to analyze (default: 7)",
54
+ )
55
+
56
+ stats_parser.set_defaults(func=cmd_routing_stats)
57
+
58
+ # routing check command
59
+ check_parser = routing_subparsers.add_parser(
60
+ "check",
61
+ help="Check for tier upgrade recommendations",
62
+ description="Analyze failure rates and recommend tier upgrades",
63
+ )
64
+
65
+ check_parser.add_argument(
66
+ "--workflow",
67
+ help="Workflow name (required unless --all is used)",
68
+ )
69
+
70
+ check_parser.add_argument(
71
+ "--stage",
72
+ help="Stage name (optional)",
73
+ )
74
+
75
+ check_parser.add_argument(
76
+ "--all",
77
+ action="store_true",
78
+ help="Check all workflows",
79
+ )
80
+
81
+ check_parser.add_argument(
82
+ "--days",
83
+ type=int,
84
+ default=7,
85
+ help="Number of days to analyze (default: 7)",
86
+ )
87
+
88
+ check_parser.set_defaults(func=cmd_routing_check)
89
+
90
+ # routing models command
91
+ models_parser = routing_subparsers.add_parser(
92
+ "models",
93
+ help="Compare model performance",
94
+ description="Show performance metrics for all models from a provider",
95
+ )
96
+
97
+ models_parser.add_argument(
98
+ "--provider",
99
+ default="anthropic",
100
+ help="Provider name (default: anthropic)",
101
+ )
102
+
103
+ models_parser.add_argument(
104
+ "--days",
105
+ type=int,
106
+ default=7,
107
+ help="Number of days to analyze (default: 7)",
108
+ )
109
+
110
+ models_parser.set_defaults(func=cmd_routing_models)
@@ -0,0 +1,42 @@
1
+ """Parser definitions for setup commands.
2
+
3
+ Copyright 2025 Smart-AI-Memory
4
+ Licensed under Fair Source License 0.9
5
+ """
6
+
7
+ from ..commands import setup
8
+
9
+
10
+ def register_parsers(subparsers):
11
+ """Register setup command parsers.
12
+
13
+ Args:
14
+ subparsers: ArgumentParser subparsers object from main parser
15
+ """
16
+ # Init command
17
+ parser_init = subparsers.add_parser(
18
+ "init",
19
+ help="Initialize a new Empathy Framework project",
20
+ )
21
+ parser_init.add_argument(
22
+ "--format",
23
+ choices=["yaml", "json"],
24
+ default="yaml",
25
+ help="Configuration format (default: yaml)",
26
+ )
27
+ parser_init.add_argument(
28
+ "--output",
29
+ help="Output file path (default: attune.config.{format})",
30
+ )
31
+ parser_init.set_defaults(func=setup.cmd_init)
32
+
33
+ # Validate command
34
+ parser_validate = subparsers.add_parser(
35
+ "validate",
36
+ help="Validate a configuration file",
37
+ )
38
+ parser_validate.add_argument(
39
+ "config",
40
+ help="Path to configuration file to validate",
41
+ )
42
+ parser_validate.set_defaults(func=setup.cmd_validate)