praisonai-code 0.0.1__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 (309) hide show
  1. praisonai_code/__init__.py +17 -0
  2. praisonai_code/cli/__init__.py +12 -0
  3. praisonai_code/cli/_forward_shim.py +10 -0
  4. praisonai_code/cli/_paths.py +88 -0
  5. praisonai_code/cli/_warnings.py +58 -0
  6. praisonai_code/cli/app.py +757 -0
  7. praisonai_code/cli/approval_backend.py +272 -0
  8. praisonai_code/cli/branding.py +94 -0
  9. praisonai_code/cli/commands/__init__.py +114 -0
  10. praisonai_code/cli/commands/acp.py +80 -0
  11. praisonai_code/cli/commands/agent.py +116 -0
  12. praisonai_code/cli/commands/agents.py +80 -0
  13. praisonai_code/cli/commands/app.py +139 -0
  14. praisonai_code/cli/commands/attach.py +95 -0
  15. praisonai_code/cli/commands/audit.py +102 -0
  16. praisonai_code/cli/commands/auth.py +508 -0
  17. praisonai_code/cli/commands/batch.py +848 -0
  18. praisonai_code/cli/commands/benchmark.py +286 -0
  19. praisonai_code/cli/commands/browser.py +299 -0
  20. praisonai_code/cli/commands/call.py +45 -0
  21. praisonai_code/cli/commands/chat.py +332 -0
  22. praisonai_code/cli/commands/checkpoint.py +170 -0
  23. praisonai_code/cli/commands/code.py +276 -0
  24. praisonai_code/cli/commands/command.py +114 -0
  25. praisonai_code/cli/commands/commit.py +47 -0
  26. praisonai_code/cli/commands/completion.py +333 -0
  27. praisonai_code/cli/commands/config.py +681 -0
  28. praisonai_code/cli/commands/context.py +414 -0
  29. praisonai_code/cli/commands/daemon.py +203 -0
  30. praisonai_code/cli/commands/debug.py +142 -0
  31. praisonai_code/cli/commands/deploy.py +71 -0
  32. praisonai_code/cli/commands/diag.py +55 -0
  33. praisonai_code/cli/commands/docs.py +1575 -0
  34. praisonai_code/cli/commands/doctor.py +332 -0
  35. praisonai_code/cli/commands/endpoints.py +51 -0
  36. praisonai_code/cli/commands/environment.py +179 -0
  37. praisonai_code/cli/commands/eval.py +131 -0
  38. praisonai_code/cli/commands/examples.py +953 -0
  39. praisonai_code/cli/commands/flow.py +436 -0
  40. praisonai_code/cli/commands/github.py +752 -0
  41. praisonai_code/cli/commands/hooks.py +74 -0
  42. praisonai_code/cli/commands/init.py +174 -0
  43. praisonai_code/cli/commands/knowledge.py +440 -0
  44. praisonai_code/cli/commands/langextract.py +120 -0
  45. praisonai_code/cli/commands/langfuse.py +984 -0
  46. praisonai_code/cli/commands/loop.py +211 -0
  47. praisonai_code/cli/commands/lsp.py +112 -0
  48. praisonai_code/cli/commands/managed.py +659 -0
  49. praisonai_code/cli/commands/mcp.py +763 -0
  50. praisonai_code/cli/commands/memory.py +298 -0
  51. praisonai_code/cli/commands/models.py +264 -0
  52. praisonai_code/cli/commands/n8n.py +326 -0
  53. praisonai_code/cli/commands/obs.py +19 -0
  54. praisonai_code/cli/commands/package.py +76 -0
  55. praisonai_code/cli/commands/paths.py +106 -0
  56. praisonai_code/cli/commands/permissions.py +272 -0
  57. praisonai_code/cli/commands/plugins.py +609 -0
  58. praisonai_code/cli/commands/port.py +530 -0
  59. praisonai_code/cli/commands/profile.py +466 -0
  60. praisonai_code/cli/commands/publish.py +193 -0
  61. praisonai_code/cli/commands/rag.py +913 -0
  62. praisonai_code/cli/commands/realtime.py +52 -0
  63. praisonai_code/cli/commands/recipe.py +684 -0
  64. praisonai_code/cli/commands/registry.py +59 -0
  65. praisonai_code/cli/commands/replay.py +830 -0
  66. praisonai_code/cli/commands/research.py +49 -0
  67. praisonai_code/cli/commands/retrieval.py +377 -0
  68. praisonai_code/cli/commands/rules.py +71 -0
  69. praisonai_code/cli/commands/run.py +1573 -0
  70. praisonai_code/cli/commands/sandbox.py +371 -0
  71. praisonai_code/cli/commands/schedule.py +529 -0
  72. praisonai_code/cli/commands/serve.py +690 -0
  73. praisonai_code/cli/commands/session.py +450 -0
  74. praisonai_code/cli/commands/setup.py +174 -0
  75. praisonai_code/cli/commands/skills.py +545 -0
  76. praisonai_code/cli/commands/standardise.py +711 -0
  77. praisonai_code/cli/commands/templates.py +54 -0
  78. praisonai_code/cli/commands/test.py +558 -0
  79. praisonai_code/cli/commands/todo.py +74 -0
  80. praisonai_code/cli/commands/tools.py +205 -0
  81. praisonai_code/cli/commands/traces.py +145 -0
  82. praisonai_code/cli/commands/tracker.py +852 -0
  83. praisonai_code/cli/commands/train.py +613 -0
  84. praisonai_code/cli/commands/ui.py +172 -0
  85. praisonai_code/cli/commands/up.py +354 -0
  86. praisonai_code/cli/commands/validate.py +291 -0
  87. praisonai_code/cli/commands/version.py +101 -0
  88. praisonai_code/cli/commands/workflow.py +97 -0
  89. praisonai_code/cli/config_loader.py +437 -0
  90. praisonai_code/cli/configuration/__init__.py +27 -0
  91. praisonai_code/cli/configuration/config.schema.json +57 -0
  92. praisonai_code/cli/configuration/credentials.py +446 -0
  93. praisonai_code/cli/configuration/loader.py +364 -0
  94. praisonai_code/cli/configuration/model_resolver.py +161 -0
  95. praisonai_code/cli/configuration/oauth.py +389 -0
  96. praisonai_code/cli/configuration/paths.py +224 -0
  97. praisonai_code/cli/configuration/resolver.py +687 -0
  98. praisonai_code/cli/configuration/schema.py +317 -0
  99. praisonai_code/cli/execution/__init__.py +99 -0
  100. praisonai_code/cli/execution/core.py +208 -0
  101. praisonai_code/cli/execution/profiler.py +898 -0
  102. praisonai_code/cli/execution/request.py +85 -0
  103. praisonai_code/cli/execution/result.py +74 -0
  104. praisonai_code/cli/fallback_schema.py +416 -0
  105. praisonai_code/cli/features/__init__.py +278 -0
  106. praisonai_code/cli/features/_endpoint_registry.py +64 -0
  107. praisonai_code/cli/features/_search_registry.py +43 -0
  108. praisonai_code/cli/features/acp.py +236 -0
  109. praisonai_code/cli/features/action_orchestrator.py +576 -0
  110. praisonai_code/cli/features/agent_scheduler.py +773 -0
  111. praisonai_code/cli/features/agent_tools.py +603 -0
  112. praisonai_code/cli/features/agents.py +397 -0
  113. praisonai_code/cli/features/at_mentions.py +471 -0
  114. praisonai_code/cli/features/audit_cli.py +270 -0
  115. praisonai_code/cli/features/auto_memory.py +182 -0
  116. praisonai_code/cli/features/auto_mode.py +552 -0
  117. praisonai_code/cli/features/autonomy_mode.py +546 -0
  118. praisonai_code/cli/features/background.py +356 -0
  119. praisonai_code/cli/features/base.py +168 -0
  120. praisonai_code/cli/features/benchmark.py +1462 -0
  121. praisonai_code/cli/features/capabilities.py +1326 -0
  122. praisonai_code/cli/features/checkpoints.py +345 -0
  123. praisonai_code/cli/features/cli_profiler.py +335 -0
  124. praisonai_code/cli/features/code_intelligence.py +666 -0
  125. praisonai_code/cli/features/compaction.py +294 -0
  126. praisonai_code/cli/features/compare.py +534 -0
  127. praisonai_code/cli/features/config_hierarchy.py +366 -0
  128. praisonai_code/cli/features/context_manager.py +597 -0
  129. praisonai_code/cli/features/cost_tracker.py +514 -0
  130. praisonai_code/cli/features/csv_test_runner.py +736 -0
  131. praisonai_code/cli/features/custom_definitions.py +790 -0
  132. praisonai_code/cli/features/debug.py +810 -0
  133. praisonai_code/cli/features/deploy.py +605 -0
  134. praisonai_code/cli/features/diag.py +289 -0
  135. praisonai_code/cli/features/display_jsonl.py +173 -0
  136. praisonai_code/cli/features/doctor/__init__.py +63 -0
  137. praisonai_code/cli/features/doctor/checks/__init__.py +29 -0
  138. praisonai_code/cli/features/doctor/checks/acp_checks.py +220 -0
  139. praisonai_code/cli/features/doctor/checks/bot_checks.py +340 -0
  140. praisonai_code/cli/features/doctor/checks/config_checks.py +373 -0
  141. praisonai_code/cli/features/doctor/checks/db_checks.py +366 -0
  142. praisonai_code/cli/features/doctor/checks/env_checks.py +637 -0
  143. praisonai_code/cli/features/doctor/checks/gateway_checks.py +387 -0
  144. praisonai_code/cli/features/doctor/checks/lsp_checks.py +231 -0
  145. praisonai_code/cli/features/doctor/checks/mcp_checks.py +367 -0
  146. praisonai_code/cli/features/doctor/checks/memory_checks.py +268 -0
  147. praisonai_code/cli/features/doctor/checks/network_checks.py +251 -0
  148. praisonai_code/cli/features/doctor/checks/obs_checks.py +328 -0
  149. praisonai_code/cli/features/doctor/checks/packaging_checks.py +422 -0
  150. praisonai_code/cli/features/doctor/checks/performance_checks.py +235 -0
  151. praisonai_code/cli/features/doctor/checks/permissions_checks.py +259 -0
  152. praisonai_code/cli/features/doctor/checks/runtime_checks.py +650 -0
  153. praisonai_code/cli/features/doctor/checks/runtime_migration_checks.py +220 -0
  154. praisonai_code/cli/features/doctor/checks/selftest_checks.py +322 -0
  155. praisonai_code/cli/features/doctor/checks/serve_checks.py +426 -0
  156. praisonai_code/cli/features/doctor/checks/skills_checks.py +327 -0
  157. praisonai_code/cli/features/doctor/checks/tools_checks.py +371 -0
  158. praisonai_code/cli/features/doctor/engine.py +266 -0
  159. praisonai_code/cli/features/doctor/formatters.py +377 -0
  160. praisonai_code/cli/features/doctor/handler.py +564 -0
  161. praisonai_code/cli/features/doctor/models.py +276 -0
  162. praisonai_code/cli/features/doctor/registry.py +239 -0
  163. praisonai_code/cli/features/endpoints.py +1016 -0
  164. praisonai_code/cli/features/eval.py +559 -0
  165. praisonai_code/cli/features/examples.py +707 -0
  166. praisonai_code/cli/features/external_agents.py +231 -0
  167. praisonai_code/cli/features/fast_context.py +410 -0
  168. praisonai_code/cli/features/file_history.py +320 -0
  169. praisonai_code/cli/features/flow_display.py +566 -0
  170. praisonai_code/cli/features/git_attribution.py +159 -0
  171. praisonai_code/cli/features/git_integration.py +651 -0
  172. praisonai_code/cli/features/guardrail.py +171 -0
  173. praisonai_code/cli/features/handoff.py +252 -0
  174. praisonai_code/cli/features/hooks.py +583 -0
  175. praisonai_code/cli/features/hybrid_workflow.py +391 -0
  176. praisonai_code/cli/features/image.py +384 -0
  177. praisonai_code/cli/features/interactive_core_headless.py +450 -0
  178. praisonai_code/cli/features/interactive_runtime.py +600 -0
  179. praisonai_code/cli/features/interactive_test_harness.py +537 -0
  180. praisonai_code/cli/features/interactive_tools.py +428 -0
  181. praisonai_code/cli/features/interactive_tui.py +603 -0
  182. praisonai_code/cli/features/job_workflow.py +906 -0
  183. praisonai_code/cli/features/jobs.py +632 -0
  184. praisonai_code/cli/features/knowledge.py +531 -0
  185. praisonai_code/cli/features/knowledge_cli.py +438 -0
  186. praisonai_code/cli/features/lite.py +244 -0
  187. praisonai_code/cli/features/logs.py +200 -0
  188. praisonai_code/cli/features/lsp_cli.py +225 -0
  189. praisonai_code/cli/features/lsp_diagnostics.py +185 -0
  190. praisonai_code/cli/features/mcp.py +344 -0
  191. praisonai_code/cli/features/message_queue.py +587 -0
  192. praisonai_code/cli/features/metrics.py +210 -0
  193. praisonai_code/cli/features/migrate.py +1329 -0
  194. praisonai_code/cli/features/migration_flow.py +463 -0
  195. praisonai_code/cli/features/migration_spec.py +276 -0
  196. praisonai_code/cli/features/n8n.py +703 -0
  197. praisonai_code/cli/features/observability.py +293 -0
  198. praisonai_code/cli/features/ollama.py +361 -0
  199. praisonai_code/cli/features/output_modes.py +155 -0
  200. praisonai_code/cli/features/output_style.py +273 -0
  201. praisonai_code/cli/features/package.py +631 -0
  202. praisonai_code/cli/features/performance.py +308 -0
  203. praisonai_code/cli/features/persistence.py +636 -0
  204. praisonai_code/cli/features/profiler/__init__.py +81 -0
  205. praisonai_code/cli/features/profiler/core.py +558 -0
  206. praisonai_code/cli/features/profiler/optimizations.py +652 -0
  207. praisonai_code/cli/features/profiler/suite.py +386 -0
  208. praisonai_code/cli/features/queue/__init__.py +73 -0
  209. praisonai_code/cli/features/queue/manager.py +435 -0
  210. praisonai_code/cli/features/queue/models.py +289 -0
  211. praisonai_code/cli/features/queue/persistence.py +564 -0
  212. praisonai_code/cli/features/queue/scheduler.py +529 -0
  213. praisonai_code/cli/features/queue/worker.py +400 -0
  214. praisonai_code/cli/features/recipe.py +2187 -0
  215. praisonai_code/cli/features/recipe_creator.py +996 -0
  216. praisonai_code/cli/features/recipe_optimizer.py +1364 -0
  217. praisonai_code/cli/features/recipe_prompts.py +226 -0
  218. praisonai_code/cli/features/registry.py +229 -0
  219. praisonai_code/cli/features/repo_map.py +860 -0
  220. praisonai_code/cli/features/router.py +466 -0
  221. praisonai_code/cli/features/safe_shell.py +427 -0
  222. praisonai_code/cli/features/sandbox_cli.py +283 -0
  223. praisonai_code/cli/features/sandbox_executor.py +536 -0
  224. praisonai_code/cli/features/sdk_knowledge.py +500 -0
  225. praisonai_code/cli/features/session.py +222 -0
  226. praisonai_code/cli/features/session_checkpoints.py +208 -0
  227. praisonai_code/cli/features/setup/__init__.py +9 -0
  228. praisonai_code/cli/features/setup/handler.py +355 -0
  229. praisonai_code/cli/features/setup/templates.py +62 -0
  230. praisonai_code/cli/features/skills.py +940 -0
  231. praisonai_code/cli/features/slash_commands.py +692 -0
  232. praisonai_code/cli/features/telemetry.py +179 -0
  233. praisonai_code/cli/features/templates.py +1390 -0
  234. praisonai_code/cli/features/thinking.py +343 -0
  235. praisonai_code/cli/features/todo.py +334 -0
  236. praisonai_code/cli/features/tools.py +680 -0
  237. praisonai_code/cli/features/tui/__init__.py +83 -0
  238. praisonai_code/cli/features/tui/app.py +871 -0
  239. praisonai_code/cli/features/tui/cli.py +580 -0
  240. praisonai_code/cli/features/tui/config.py +150 -0
  241. praisonai_code/cli/features/tui/debug.py +526 -0
  242. praisonai_code/cli/features/tui/events.py +99 -0
  243. praisonai_code/cli/features/tui/mock_provider.py +328 -0
  244. praisonai_code/cli/features/tui/orchestrator.py +652 -0
  245. praisonai_code/cli/features/tui/screens/__init__.py +50 -0
  246. praisonai_code/cli/features/tui/screens/help.py +157 -0
  247. praisonai_code/cli/features/tui/screens/main.py +568 -0
  248. praisonai_code/cli/features/tui/screens/queue.py +174 -0
  249. praisonai_code/cli/features/tui/screens/session.py +124 -0
  250. praisonai_code/cli/features/tui/screens/settings.py +148 -0
  251. praisonai_code/cli/features/tui/session_store.py +198 -0
  252. praisonai_code/cli/features/tui/widgets/__init__.py +56 -0
  253. praisonai_code/cli/features/tui/widgets/chat.py +263 -0
  254. praisonai_code/cli/features/tui/widgets/command_popup.py +258 -0
  255. praisonai_code/cli/features/tui/widgets/composer.py +292 -0
  256. praisonai_code/cli/features/tui/widgets/file_popup.py +207 -0
  257. praisonai_code/cli/features/tui/widgets/queue_panel.py +223 -0
  258. praisonai_code/cli/features/tui/widgets/status.py +181 -0
  259. praisonai_code/cli/features/tui/widgets/tool_panel.py +307 -0
  260. praisonai_code/cli/features/wizard.py +289 -0
  261. praisonai_code/cli/features/workflow.py +802 -0
  262. praisonai_code/cli/features/yaml_utils.py +321 -0
  263. praisonai_code/cli/interactive/__init__.py +48 -0
  264. praisonai_code/cli/interactive/async_tui.py +1218 -0
  265. praisonai_code/cli/interactive/config.py +139 -0
  266. praisonai_code/cli/interactive/core.py +618 -0
  267. praisonai_code/cli/interactive/events.py +131 -0
  268. praisonai_code/cli/interactive/frontends/__init__.py +31 -0
  269. praisonai_code/cli/interactive/frontends/rich_frontend.py +462 -0
  270. praisonai_code/cli/interactive/frontends/textual_frontend.py +157 -0
  271. praisonai_code/cli/interactive/praison_io.py +502 -0
  272. praisonai_code/cli/interactive/repl.py +297 -0
  273. praisonai_code/cli/interactive/split_tui.py +456 -0
  274. praisonai_code/cli/interactive/tui_app.py +457 -0
  275. praisonai_code/cli/langfuse_client.py +360 -0
  276. praisonai_code/cli/main.py +7421 -0
  277. praisonai_code/cli/output/__init__.py +25 -0
  278. praisonai_code/cli/output/console.py +456 -0
  279. praisonai_code/cli/output/event_bridge.py +191 -0
  280. praisonai_code/cli/schedule_cli.py +54 -0
  281. praisonai_code/cli/schema_provider.py +23 -0
  282. praisonai_code/cli/session/__init__.py +16 -0
  283. praisonai_code/cli/session/resume.py +148 -0
  284. praisonai_code/cli/session/unified.py +548 -0
  285. praisonai_code/cli/state/__init__.py +31 -0
  286. praisonai_code/cli/state/identifiers.py +161 -0
  287. praisonai_code/cli/state/project_sessions.py +383 -0
  288. praisonai_code/cli/state/sessions.py +390 -0
  289. praisonai_code/cli/ui/__init__.py +160 -0
  290. praisonai_code/cli/ui/config.py +46 -0
  291. praisonai_code/cli/ui/events.py +61 -0
  292. praisonai_code/cli/ui/mg_backend.py +342 -0
  293. praisonai_code/cli/ui/plain.py +133 -0
  294. praisonai_code/cli/ui/rich_backend.py +162 -0
  295. praisonai_code/cli/unified_schema.py +655 -0
  296. praisonai_code/cli/utils/env_utils.py +126 -0
  297. praisonai_code/cli/utils/project.py +131 -0
  298. praisonai_code/cli_backends/__init__.py +73 -0
  299. praisonai_code/cli_backends/claude.py +373 -0
  300. praisonai_code/cli_backends/registry.py +113 -0
  301. praisonai_code/runtime/__init__.py +36 -0
  302. praisonai_code/runtime/__main__.py +81 -0
  303. praisonai_code/runtime/client.py +131 -0
  304. praisonai_code/runtime/descriptor.py +209 -0
  305. praisonai_code/runtime/server.py +356 -0
  306. praisonai_code-0.0.1.dist-info/METADATA +80 -0
  307. praisonai_code-0.0.1.dist-info/RECORD +309 -0
  308. praisonai_code-0.0.1.dist-info/WHEEL +5 -0
  309. praisonai_code-0.0.1.dist-info/top_level.txt +1 -0
@@ -0,0 +1,291 @@
1
+ """
2
+ YAML configuration validation command.
3
+
4
+ Validates agents/tasks/workflow YAML configurations with comprehensive error checking.
5
+ """
6
+
7
+ import sys
8
+ from pathlib import Path
9
+ from typing import Optional
10
+
11
+ import typer
12
+ from rich.console import Console
13
+ from rich.table import Table
14
+
15
+ app = typer.Typer(
16
+ help="Validate YAML configuration files",
17
+ no_args_is_help=True
18
+ )
19
+
20
+ console = Console()
21
+
22
+
23
+ @app.command()
24
+ def validate(
25
+ file: str = typer.Argument(
26
+ ...,
27
+ help="Path to YAML configuration file to validate"
28
+ ),
29
+ strict: bool = typer.Option(
30
+ False,
31
+ "--strict",
32
+ help="Treat warnings as errors (strict validation mode)"
33
+ ),
34
+ quiet: bool = typer.Option(
35
+ False,
36
+ "--quiet", "-q",
37
+ help="Only show errors, suppress success messages"
38
+ ),
39
+ json_output: bool = typer.Option(
40
+ False,
41
+ "--json",
42
+ help="Output validation results as JSON"
43
+ ),
44
+ ):
45
+ """
46
+ Validate a YAML configuration file for agents, tasks, and workflows.
47
+
48
+ This command performs comprehensive validation including:
49
+ - Schema validation for required and optional fields
50
+ - Type checking for all configuration values
51
+ - Cross-reference validation (tasks -> agents, tools -> definitions)
52
+ - Detection of unknown fields with suggestions
53
+
54
+ Examples:
55
+ praisonai validate agents.yaml
56
+ praisonai validate agents.yaml --strict
57
+ praisonai validate my-config.yaml --json
58
+ """
59
+ from praisonai.config.validator import ConfigValidator
60
+ import json as json_module
61
+
62
+ file_path = Path(file)
63
+
64
+ # Handle JSON output for missing file
65
+ if not file_path.exists():
66
+ if json_output:
67
+ output = {
68
+ "file": str(file_path),
69
+ "valid": False,
70
+ "errors": [f"File not found: {file}"],
71
+ "warnings": [],
72
+ "strict_mode": strict
73
+ }
74
+ sys.stdout.write(json_module.dumps(output, indent=2) + "\n")
75
+ else:
76
+ console.print(f"[red]✗ File not found:[/red] {file}", style="bold")
77
+ sys.exit(1)
78
+
79
+ # Initialize validator
80
+ validator = ConfigValidator()
81
+
82
+ # Validate the file
83
+ result = validator.validate_yaml_file(str(file_path), strict=strict)
84
+
85
+ # Output JSON if requested
86
+ if json_output:
87
+ output = {
88
+ "file": str(file_path),
89
+ "valid": result.valid,
90
+ "errors": result.errors,
91
+ "warnings": result.warnings,
92
+ "strict_mode": strict
93
+ }
94
+ sys.stdout.write(json_module.dumps(output, indent=2) + "\n")
95
+ sys.exit(0 if result.valid else 1)
96
+
97
+ # Display results
98
+ if result.valid:
99
+ if not quiet:
100
+ console.print(f"[green]✓ Configuration is valid[/green]: {file_path}", style="bold")
101
+
102
+ if result.warnings:
103
+ console.print(f"\n[yellow]Warnings ({len(result.warnings)}):[/yellow]")
104
+ for i, warning in enumerate(result.warnings, 1):
105
+ console.print(f" {i}. {warning}")
106
+ sys.exit(0)
107
+ else:
108
+ console.print(f"[red]✗ Configuration validation failed[/red]: {file_path}", style="bold")
109
+
110
+ if result.errors:
111
+ console.print(f"\n[red]Errors ({len(result.errors)}):[/red]")
112
+ for i, error in enumerate(result.errors, 1):
113
+ console.print(f" {i}. {error}")
114
+
115
+ if result.warnings and not strict:
116
+ console.print(f"\n[yellow]Warnings ({len(result.warnings)}):[/yellow]")
117
+ for i, warning in enumerate(result.warnings, 1):
118
+ console.print(f" {i}. {warning}")
119
+
120
+ if not quiet:
121
+ console.print(f"\n[dim]Fix the errors above and run validation again.[/dim]")
122
+ if result.warnings and not strict:
123
+ console.print("[dim]Use --strict to treat warnings as errors.[/dim]")
124
+
125
+ sys.exit(1)
126
+
127
+
128
+ @app.command()
129
+ def check(
130
+ directory: str = typer.Argument(
131
+ ".",
132
+ help="Directory to search for YAML files"
133
+ ),
134
+ pattern: str = typer.Option(
135
+ "*.yaml",
136
+ "--pattern", "-p",
137
+ help="Glob pattern for YAML files"
138
+ ),
139
+ strict: bool = typer.Option(
140
+ False,
141
+ "--strict",
142
+ help="Treat warnings as errors"
143
+ ),
144
+ stop_on_error: bool = typer.Option(
145
+ False,
146
+ "--stop-on-error",
147
+ help="Stop checking files after first error"
148
+ ),
149
+ ):
150
+ """
151
+ Check all YAML configuration files in a directory.
152
+
153
+ Examples:
154
+ praisonai validate check .
155
+ praisonai validate check ./configs --pattern "*.yml"
156
+ praisonai validate check . --strict --stop-on-error
157
+ """
158
+ from praisonai.config.validator import ConfigValidator
159
+ import glob
160
+
161
+ # Find all matching files
162
+ dir_path = Path(directory)
163
+ if not dir_path.exists():
164
+ console.print(f"[red]✗ Directory not found:[/red] {directory}", style="bold")
165
+ sys.exit(1)
166
+
167
+ # Find files matching pattern
168
+ yaml_files = list(dir_path.glob(pattern))
169
+ if pattern == "*.yaml":
170
+ yaml_files.extend(dir_path.glob("*.yml"))
171
+
172
+ if not yaml_files:
173
+ console.print(f"[yellow]No YAML files found matching pattern:[/yellow] {pattern}")
174
+ sys.exit(0)
175
+
176
+ # Initialize validator
177
+ validator = ConfigValidator()
178
+
179
+ # Create results table
180
+ table = Table(title=f"Validation Results for {len(yaml_files)} file(s)")
181
+ table.add_column("File", style="cyan")
182
+ table.add_column("Status", style="bold")
183
+ table.add_column("Errors", justify="center")
184
+ table.add_column("Warnings", justify="center")
185
+
186
+ total_valid = 0
187
+ total_invalid = 0
188
+ total_errors = 0
189
+ total_warnings = 0
190
+
191
+ for yaml_file in sorted(yaml_files):
192
+ result = validator.validate_yaml_file(str(yaml_file), strict=strict)
193
+
194
+ if result.valid:
195
+ status = "[green]✓ Valid[/green]"
196
+ total_valid += 1
197
+ else:
198
+ status = "[red]✗ Invalid[/red]"
199
+ total_invalid += 1
200
+
201
+ if stop_on_error:
202
+ console.print(f"\n[red]Validation failed for:[/red] {yaml_file}")
203
+ console.print(result.format_message())
204
+ sys.exit(1)
205
+
206
+ total_errors += len(result.errors)
207
+ total_warnings += len(result.warnings)
208
+
209
+ table.add_row(
210
+ str(yaml_file.relative_to(dir_path)),
211
+ status,
212
+ str(len(result.errors)) if result.errors else "-",
213
+ str(len(result.warnings)) if result.warnings else "-"
214
+ )
215
+
216
+ # Display results
217
+ console.print(table)
218
+
219
+ # Summary
220
+ console.print(f"\nSummary:")
221
+ console.print(f" Valid files: [green]{total_valid}[/green]")
222
+ console.print(f" Invalid files: [red]{total_invalid}[/red]")
223
+ console.print(f" Total errors: {total_errors}")
224
+ console.print(f" Total warnings: {total_warnings}")
225
+
226
+ sys.exit(0 if total_invalid == 0 else 1)
227
+
228
+
229
+ @app.command()
230
+ def schema():
231
+ """
232
+ Display the YAML configuration schema documentation.
233
+
234
+ Shows all available fields, their types, and descriptions for:
235
+ - Agent/Role configuration
236
+ - Task configuration
237
+ - Workflow configuration
238
+ - Global settings
239
+ """
240
+ from praisonai.config.schema import YAMLConfig, AgentConfig, TaskConfig
241
+ import json
242
+
243
+ console.print("[bold cyan]PraisonAI YAML Configuration Schema[/bold cyan]\n")
244
+
245
+ # Display main sections
246
+ console.print("[bold]Main Configuration Sections:[/bold]")
247
+ console.print(" • roles/agents - Define agent roles and capabilities")
248
+ console.print(" • tasks - Define tasks and their assignments")
249
+ console.print(" • workflow - Configure workflow execution")
250
+ console.print(" • tools/toolsets - Global tool configuration")
251
+ console.print(" • config - Global settings (acp, lsp)")
252
+ console.print()
253
+
254
+ # Display agent fields
255
+ console.print("[bold]Agent/Role Fields:[/bold]")
256
+ agent_schema = AgentConfig.model_json_schema()
257
+ required_fields = agent_schema.get('required', [])
258
+
259
+ for field_name, field_info in agent_schema.get('properties', {}).items():
260
+ required = " [red](required)[/red]" if field_name in required_fields else ""
261
+ description = field_info.get('description', 'No description')
262
+ field_type = field_info.get('type', 'any')
263
+
264
+ # Handle complex types
265
+ if 'anyOf' in field_info:
266
+ types = [t.get('type', 'object') for t in field_info['anyOf'] if 'type' in t]
267
+ field_type = ' | '.join(types) if types else 'mixed'
268
+ elif '$ref' in field_info:
269
+ field_type = field_info['$ref'].split('/')[-1]
270
+
271
+ console.print(f" • {field_name}{required} ({field_type}): {description}")
272
+
273
+ console.print()
274
+
275
+ # Display task fields
276
+ console.print("[bold]Task Fields:[/bold]")
277
+ task_schema = TaskConfig.model_json_schema()
278
+ required_fields = task_schema.get('required', [])
279
+
280
+ for field_name, field_info in task_schema.get('properties', {}).items():
281
+ required = " [red](required)[/red]" if field_name in required_fields else ""
282
+ description = field_info.get('description', 'No description')
283
+ field_type = field_info.get('type', 'any')
284
+ console.print(f" • {field_name}{required} ({field_type}): {description}")
285
+
286
+ console.print()
287
+ console.print("[dim]Use 'praisonai validate <file>' to validate your configuration.[/dim]")
288
+
289
+
290
+ if __name__ == "__main__":
291
+ app()
@@ -0,0 +1,101 @@
1
+ """
2
+ Version command group for PraisonAI CLI.
3
+
4
+ Provides version information:
5
+ - version show: Show version
6
+ - version check: Check for updates
7
+ """
8
+
9
+ import typer
10
+
11
+ from ..output.console import get_output_controller
12
+
13
+ app = typer.Typer(help="Version information")
14
+
15
+
16
+ @app.command("show")
17
+ def version_show():
18
+ """Show version information."""
19
+ output = get_output_controller()
20
+
21
+ from praisonai.version import __version__
22
+
23
+ # Try to get additional version info
24
+ versions = {
25
+ "praisonai": __version__,
26
+ }
27
+
28
+ # Check praisonaiagents version
29
+ try:
30
+ import praisonaiagents
31
+ versions["praisonaiagents"] = getattr(praisonaiagents, "__version__", "unknown")
32
+ except ImportError:
33
+ versions["praisonaiagents"] = "not installed"
34
+
35
+ # Check Python version
36
+ import sys
37
+ versions["python"] = f"{sys.version_info.major}.{sys.version_info.minor}.{sys.version_info.micro}"
38
+
39
+ if output.is_json_mode:
40
+ output.print_json(versions)
41
+ return
42
+
43
+ output.print_panel(
44
+ f"PraisonAI: {versions['praisonai']}\n"
45
+ f"PraisonAI Agents: {versions['praisonaiagents']}\n"
46
+ f"Python: {versions['python']}",
47
+ title="Version Information"
48
+ )
49
+
50
+
51
+ @app.command("check")
52
+ def version_check():
53
+ """Check for updates."""
54
+ output = get_output_controller()
55
+
56
+ from praisonai.version import __version__
57
+
58
+ output.print_info("Checking for updates...")
59
+
60
+ try:
61
+ import urllib.request
62
+ import json
63
+
64
+ url = "https://pypi.org/pypi/praisonai/json"
65
+ with urllib.request.urlopen(url, timeout=5) as response:
66
+ data = json.loads(response.read().decode())
67
+ latest = data["info"]["version"]
68
+
69
+ if output.is_json_mode:
70
+ output.print_json({
71
+ "current": __version__,
72
+ "latest": latest,
73
+ "update_available": latest != __version__,
74
+ })
75
+ return
76
+
77
+ if latest != __version__:
78
+ output.print_warning(
79
+ f"Update available: {__version__} → {latest}\n"
80
+ f"Run: pip install --upgrade praisonai"
81
+ )
82
+ else:
83
+ output.print_success(f"You are using the latest version ({__version__})")
84
+
85
+ except Exception as e:
86
+ if output.is_json_mode:
87
+ output.print_json({
88
+ "current": __version__,
89
+ "latest": None,
90
+ "error": str(e),
91
+ })
92
+ else:
93
+ output.print_error(f"Failed to check for updates: {e}")
94
+ output.print(f"Current version: {__version__}")
95
+
96
+
97
+ @app.callback(invoke_without_command=True)
98
+ def version_callback(ctx: typer.Context):
99
+ """Show version (default behavior)."""
100
+ if ctx.invoked_subcommand is None:
101
+ version_show()
@@ -0,0 +1,97 @@
1
+ """
2
+ Workflow command group for PraisonAI CLI.
3
+
4
+ Provides workflow management commands.
5
+ """
6
+
7
+ import typer
8
+
9
+ app = typer.Typer(help="Workflow management")
10
+
11
+
12
+ @app.command("run", context_settings={"allow_extra_args": True, "allow_interspersed_args": True, "ignore_unknown_options": True})
13
+ def workflow_run(
14
+ ctx: typer.Context,
15
+ file: str = typer.Argument(..., help="Workflow file path"),
16
+ model: str = typer.Option(None, "--model", "-m", help="LLM model to use"),
17
+ verbose: bool = typer.Option(False, "--verbose", "-v", help="Verbose output"),
18
+ dry_run: bool = typer.Option(False, "--dry-run", help="Preview steps without executing (job workflows only)"),
19
+ ):
20
+ """Run a workflow.
21
+
22
+ Use --var key=value to pass variables to YAML workflows.
23
+ Use --dry-run to preview job workflows without executing.
24
+ Can be specified multiple times.
25
+
26
+ Example:
27
+ praisonai workflow run my_workflow.yaml --var topic="AI Tools"
28
+ praisonai workflow run publish-pypi.yaml --dry-run
29
+ """
30
+ from praisonai.cli.main import PraisonAI
31
+ import sys
32
+
33
+ argv = ['workflow', 'run', file]
34
+ # Pass through extra args (includes --var arguments and custom flags)
35
+ argv.extend(ctx.args)
36
+ if model:
37
+ argv.extend(['--model', model])
38
+ if verbose:
39
+ argv.append('--verbose')
40
+ if dry_run:
41
+ argv.append('--dry-run')
42
+
43
+ original_argv = sys.argv
44
+ sys.argv = ['praisonai'] + argv
45
+
46
+ try:
47
+ praison = PraisonAI()
48
+ praison.main()
49
+ except SystemExit:
50
+ pass
51
+ finally:
52
+ sys.argv = original_argv
53
+
54
+
55
+ @app.command("list")
56
+ def workflow_list():
57
+ """List available workflows."""
58
+ from praisonai.cli.main import PraisonAI
59
+ import sys
60
+
61
+ argv = ['workflow', 'list']
62
+
63
+ original_argv = sys.argv
64
+ sys.argv = ['praisonai'] + argv
65
+
66
+ try:
67
+ praison = PraisonAI()
68
+ praison.main()
69
+ except SystemExit:
70
+ pass
71
+ finally:
72
+ sys.argv = original_argv
73
+
74
+
75
+ @app.command("create")
76
+ def workflow_create(
77
+ name: str = typer.Argument(..., help="Workflow name"),
78
+ template: str = typer.Option(None, "--template", "-t", help="Template to use"),
79
+ ):
80
+ """Create a new workflow."""
81
+ from praisonai.cli.main import PraisonAI
82
+ import sys
83
+
84
+ argv = ['workflow', 'create', name]
85
+ if template:
86
+ argv.extend(['--template', template])
87
+
88
+ original_argv = sys.argv
89
+ sys.argv = ['praisonai'] + argv
90
+
91
+ try:
92
+ praison = PraisonAI()
93
+ praison.main()
94
+ except SystemExit:
95
+ pass
96
+ finally:
97
+ sys.argv = original_argv