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.
- praisonai_code/__init__.py +17 -0
- praisonai_code/cli/__init__.py +12 -0
- praisonai_code/cli/_forward_shim.py +10 -0
- praisonai_code/cli/_paths.py +88 -0
- praisonai_code/cli/_warnings.py +58 -0
- praisonai_code/cli/app.py +757 -0
- praisonai_code/cli/approval_backend.py +272 -0
- praisonai_code/cli/branding.py +94 -0
- praisonai_code/cli/commands/__init__.py +114 -0
- praisonai_code/cli/commands/acp.py +80 -0
- praisonai_code/cli/commands/agent.py +116 -0
- praisonai_code/cli/commands/agents.py +80 -0
- praisonai_code/cli/commands/app.py +139 -0
- praisonai_code/cli/commands/attach.py +95 -0
- praisonai_code/cli/commands/audit.py +102 -0
- praisonai_code/cli/commands/auth.py +508 -0
- praisonai_code/cli/commands/batch.py +848 -0
- praisonai_code/cli/commands/benchmark.py +286 -0
- praisonai_code/cli/commands/browser.py +299 -0
- praisonai_code/cli/commands/call.py +45 -0
- praisonai_code/cli/commands/chat.py +332 -0
- praisonai_code/cli/commands/checkpoint.py +170 -0
- praisonai_code/cli/commands/code.py +276 -0
- praisonai_code/cli/commands/command.py +114 -0
- praisonai_code/cli/commands/commit.py +47 -0
- praisonai_code/cli/commands/completion.py +333 -0
- praisonai_code/cli/commands/config.py +681 -0
- praisonai_code/cli/commands/context.py +414 -0
- praisonai_code/cli/commands/daemon.py +203 -0
- praisonai_code/cli/commands/debug.py +142 -0
- praisonai_code/cli/commands/deploy.py +71 -0
- praisonai_code/cli/commands/diag.py +55 -0
- praisonai_code/cli/commands/docs.py +1575 -0
- praisonai_code/cli/commands/doctor.py +332 -0
- praisonai_code/cli/commands/endpoints.py +51 -0
- praisonai_code/cli/commands/environment.py +179 -0
- praisonai_code/cli/commands/eval.py +131 -0
- praisonai_code/cli/commands/examples.py +953 -0
- praisonai_code/cli/commands/flow.py +436 -0
- praisonai_code/cli/commands/github.py +752 -0
- praisonai_code/cli/commands/hooks.py +74 -0
- praisonai_code/cli/commands/init.py +174 -0
- praisonai_code/cli/commands/knowledge.py +440 -0
- praisonai_code/cli/commands/langextract.py +120 -0
- praisonai_code/cli/commands/langfuse.py +984 -0
- praisonai_code/cli/commands/loop.py +211 -0
- praisonai_code/cli/commands/lsp.py +112 -0
- praisonai_code/cli/commands/managed.py +659 -0
- praisonai_code/cli/commands/mcp.py +763 -0
- praisonai_code/cli/commands/memory.py +298 -0
- praisonai_code/cli/commands/models.py +264 -0
- praisonai_code/cli/commands/n8n.py +326 -0
- praisonai_code/cli/commands/obs.py +19 -0
- praisonai_code/cli/commands/package.py +76 -0
- praisonai_code/cli/commands/paths.py +106 -0
- praisonai_code/cli/commands/permissions.py +272 -0
- praisonai_code/cli/commands/plugins.py +609 -0
- praisonai_code/cli/commands/port.py +530 -0
- praisonai_code/cli/commands/profile.py +466 -0
- praisonai_code/cli/commands/publish.py +193 -0
- praisonai_code/cli/commands/rag.py +913 -0
- praisonai_code/cli/commands/realtime.py +52 -0
- praisonai_code/cli/commands/recipe.py +684 -0
- praisonai_code/cli/commands/registry.py +59 -0
- praisonai_code/cli/commands/replay.py +830 -0
- praisonai_code/cli/commands/research.py +49 -0
- praisonai_code/cli/commands/retrieval.py +377 -0
- praisonai_code/cli/commands/rules.py +71 -0
- praisonai_code/cli/commands/run.py +1573 -0
- praisonai_code/cli/commands/sandbox.py +371 -0
- praisonai_code/cli/commands/schedule.py +529 -0
- praisonai_code/cli/commands/serve.py +690 -0
- praisonai_code/cli/commands/session.py +450 -0
- praisonai_code/cli/commands/setup.py +174 -0
- praisonai_code/cli/commands/skills.py +545 -0
- praisonai_code/cli/commands/standardise.py +711 -0
- praisonai_code/cli/commands/templates.py +54 -0
- praisonai_code/cli/commands/test.py +558 -0
- praisonai_code/cli/commands/todo.py +74 -0
- praisonai_code/cli/commands/tools.py +205 -0
- praisonai_code/cli/commands/traces.py +145 -0
- praisonai_code/cli/commands/tracker.py +852 -0
- praisonai_code/cli/commands/train.py +613 -0
- praisonai_code/cli/commands/ui.py +172 -0
- praisonai_code/cli/commands/up.py +354 -0
- praisonai_code/cli/commands/validate.py +291 -0
- praisonai_code/cli/commands/version.py +101 -0
- praisonai_code/cli/commands/workflow.py +97 -0
- praisonai_code/cli/config_loader.py +437 -0
- praisonai_code/cli/configuration/__init__.py +27 -0
- praisonai_code/cli/configuration/config.schema.json +57 -0
- praisonai_code/cli/configuration/credentials.py +446 -0
- praisonai_code/cli/configuration/loader.py +364 -0
- praisonai_code/cli/configuration/model_resolver.py +161 -0
- praisonai_code/cli/configuration/oauth.py +389 -0
- praisonai_code/cli/configuration/paths.py +224 -0
- praisonai_code/cli/configuration/resolver.py +687 -0
- praisonai_code/cli/configuration/schema.py +317 -0
- praisonai_code/cli/execution/__init__.py +99 -0
- praisonai_code/cli/execution/core.py +208 -0
- praisonai_code/cli/execution/profiler.py +898 -0
- praisonai_code/cli/execution/request.py +85 -0
- praisonai_code/cli/execution/result.py +74 -0
- praisonai_code/cli/fallback_schema.py +416 -0
- praisonai_code/cli/features/__init__.py +278 -0
- praisonai_code/cli/features/_endpoint_registry.py +64 -0
- praisonai_code/cli/features/_search_registry.py +43 -0
- praisonai_code/cli/features/acp.py +236 -0
- praisonai_code/cli/features/action_orchestrator.py +576 -0
- praisonai_code/cli/features/agent_scheduler.py +773 -0
- praisonai_code/cli/features/agent_tools.py +603 -0
- praisonai_code/cli/features/agents.py +397 -0
- praisonai_code/cli/features/at_mentions.py +471 -0
- praisonai_code/cli/features/audit_cli.py +270 -0
- praisonai_code/cli/features/auto_memory.py +182 -0
- praisonai_code/cli/features/auto_mode.py +552 -0
- praisonai_code/cli/features/autonomy_mode.py +546 -0
- praisonai_code/cli/features/background.py +356 -0
- praisonai_code/cli/features/base.py +168 -0
- praisonai_code/cli/features/benchmark.py +1462 -0
- praisonai_code/cli/features/capabilities.py +1326 -0
- praisonai_code/cli/features/checkpoints.py +345 -0
- praisonai_code/cli/features/cli_profiler.py +335 -0
- praisonai_code/cli/features/code_intelligence.py +666 -0
- praisonai_code/cli/features/compaction.py +294 -0
- praisonai_code/cli/features/compare.py +534 -0
- praisonai_code/cli/features/config_hierarchy.py +366 -0
- praisonai_code/cli/features/context_manager.py +597 -0
- praisonai_code/cli/features/cost_tracker.py +514 -0
- praisonai_code/cli/features/csv_test_runner.py +736 -0
- praisonai_code/cli/features/custom_definitions.py +790 -0
- praisonai_code/cli/features/debug.py +810 -0
- praisonai_code/cli/features/deploy.py +605 -0
- praisonai_code/cli/features/diag.py +289 -0
- praisonai_code/cli/features/display_jsonl.py +173 -0
- praisonai_code/cli/features/doctor/__init__.py +63 -0
- praisonai_code/cli/features/doctor/checks/__init__.py +29 -0
- praisonai_code/cli/features/doctor/checks/acp_checks.py +220 -0
- praisonai_code/cli/features/doctor/checks/bot_checks.py +340 -0
- praisonai_code/cli/features/doctor/checks/config_checks.py +373 -0
- praisonai_code/cli/features/doctor/checks/db_checks.py +366 -0
- praisonai_code/cli/features/doctor/checks/env_checks.py +637 -0
- praisonai_code/cli/features/doctor/checks/gateway_checks.py +387 -0
- praisonai_code/cli/features/doctor/checks/lsp_checks.py +231 -0
- praisonai_code/cli/features/doctor/checks/mcp_checks.py +367 -0
- praisonai_code/cli/features/doctor/checks/memory_checks.py +268 -0
- praisonai_code/cli/features/doctor/checks/network_checks.py +251 -0
- praisonai_code/cli/features/doctor/checks/obs_checks.py +328 -0
- praisonai_code/cli/features/doctor/checks/packaging_checks.py +422 -0
- praisonai_code/cli/features/doctor/checks/performance_checks.py +235 -0
- praisonai_code/cli/features/doctor/checks/permissions_checks.py +259 -0
- praisonai_code/cli/features/doctor/checks/runtime_checks.py +650 -0
- praisonai_code/cli/features/doctor/checks/runtime_migration_checks.py +220 -0
- praisonai_code/cli/features/doctor/checks/selftest_checks.py +322 -0
- praisonai_code/cli/features/doctor/checks/serve_checks.py +426 -0
- praisonai_code/cli/features/doctor/checks/skills_checks.py +327 -0
- praisonai_code/cli/features/doctor/checks/tools_checks.py +371 -0
- praisonai_code/cli/features/doctor/engine.py +266 -0
- praisonai_code/cli/features/doctor/formatters.py +377 -0
- praisonai_code/cli/features/doctor/handler.py +564 -0
- praisonai_code/cli/features/doctor/models.py +276 -0
- praisonai_code/cli/features/doctor/registry.py +239 -0
- praisonai_code/cli/features/endpoints.py +1016 -0
- praisonai_code/cli/features/eval.py +559 -0
- praisonai_code/cli/features/examples.py +707 -0
- praisonai_code/cli/features/external_agents.py +231 -0
- praisonai_code/cli/features/fast_context.py +410 -0
- praisonai_code/cli/features/file_history.py +320 -0
- praisonai_code/cli/features/flow_display.py +566 -0
- praisonai_code/cli/features/git_attribution.py +159 -0
- praisonai_code/cli/features/git_integration.py +651 -0
- praisonai_code/cli/features/guardrail.py +171 -0
- praisonai_code/cli/features/handoff.py +252 -0
- praisonai_code/cli/features/hooks.py +583 -0
- praisonai_code/cli/features/hybrid_workflow.py +391 -0
- praisonai_code/cli/features/image.py +384 -0
- praisonai_code/cli/features/interactive_core_headless.py +450 -0
- praisonai_code/cli/features/interactive_runtime.py +600 -0
- praisonai_code/cli/features/interactive_test_harness.py +537 -0
- praisonai_code/cli/features/interactive_tools.py +428 -0
- praisonai_code/cli/features/interactive_tui.py +603 -0
- praisonai_code/cli/features/job_workflow.py +906 -0
- praisonai_code/cli/features/jobs.py +632 -0
- praisonai_code/cli/features/knowledge.py +531 -0
- praisonai_code/cli/features/knowledge_cli.py +438 -0
- praisonai_code/cli/features/lite.py +244 -0
- praisonai_code/cli/features/logs.py +200 -0
- praisonai_code/cli/features/lsp_cli.py +225 -0
- praisonai_code/cli/features/lsp_diagnostics.py +185 -0
- praisonai_code/cli/features/mcp.py +344 -0
- praisonai_code/cli/features/message_queue.py +587 -0
- praisonai_code/cli/features/metrics.py +210 -0
- praisonai_code/cli/features/migrate.py +1329 -0
- praisonai_code/cli/features/migration_flow.py +463 -0
- praisonai_code/cli/features/migration_spec.py +276 -0
- praisonai_code/cli/features/n8n.py +703 -0
- praisonai_code/cli/features/observability.py +293 -0
- praisonai_code/cli/features/ollama.py +361 -0
- praisonai_code/cli/features/output_modes.py +155 -0
- praisonai_code/cli/features/output_style.py +273 -0
- praisonai_code/cli/features/package.py +631 -0
- praisonai_code/cli/features/performance.py +308 -0
- praisonai_code/cli/features/persistence.py +636 -0
- praisonai_code/cli/features/profiler/__init__.py +81 -0
- praisonai_code/cli/features/profiler/core.py +558 -0
- praisonai_code/cli/features/profiler/optimizations.py +652 -0
- praisonai_code/cli/features/profiler/suite.py +386 -0
- praisonai_code/cli/features/queue/__init__.py +73 -0
- praisonai_code/cli/features/queue/manager.py +435 -0
- praisonai_code/cli/features/queue/models.py +289 -0
- praisonai_code/cli/features/queue/persistence.py +564 -0
- praisonai_code/cli/features/queue/scheduler.py +529 -0
- praisonai_code/cli/features/queue/worker.py +400 -0
- praisonai_code/cli/features/recipe.py +2187 -0
- praisonai_code/cli/features/recipe_creator.py +996 -0
- praisonai_code/cli/features/recipe_optimizer.py +1364 -0
- praisonai_code/cli/features/recipe_prompts.py +226 -0
- praisonai_code/cli/features/registry.py +229 -0
- praisonai_code/cli/features/repo_map.py +860 -0
- praisonai_code/cli/features/router.py +466 -0
- praisonai_code/cli/features/safe_shell.py +427 -0
- praisonai_code/cli/features/sandbox_cli.py +283 -0
- praisonai_code/cli/features/sandbox_executor.py +536 -0
- praisonai_code/cli/features/sdk_knowledge.py +500 -0
- praisonai_code/cli/features/session.py +222 -0
- praisonai_code/cli/features/session_checkpoints.py +208 -0
- praisonai_code/cli/features/setup/__init__.py +9 -0
- praisonai_code/cli/features/setup/handler.py +355 -0
- praisonai_code/cli/features/setup/templates.py +62 -0
- praisonai_code/cli/features/skills.py +940 -0
- praisonai_code/cli/features/slash_commands.py +692 -0
- praisonai_code/cli/features/telemetry.py +179 -0
- praisonai_code/cli/features/templates.py +1390 -0
- praisonai_code/cli/features/thinking.py +343 -0
- praisonai_code/cli/features/todo.py +334 -0
- praisonai_code/cli/features/tools.py +680 -0
- praisonai_code/cli/features/tui/__init__.py +83 -0
- praisonai_code/cli/features/tui/app.py +871 -0
- praisonai_code/cli/features/tui/cli.py +580 -0
- praisonai_code/cli/features/tui/config.py +150 -0
- praisonai_code/cli/features/tui/debug.py +526 -0
- praisonai_code/cli/features/tui/events.py +99 -0
- praisonai_code/cli/features/tui/mock_provider.py +328 -0
- praisonai_code/cli/features/tui/orchestrator.py +652 -0
- praisonai_code/cli/features/tui/screens/__init__.py +50 -0
- praisonai_code/cli/features/tui/screens/help.py +157 -0
- praisonai_code/cli/features/tui/screens/main.py +568 -0
- praisonai_code/cli/features/tui/screens/queue.py +174 -0
- praisonai_code/cli/features/tui/screens/session.py +124 -0
- praisonai_code/cli/features/tui/screens/settings.py +148 -0
- praisonai_code/cli/features/tui/session_store.py +198 -0
- praisonai_code/cli/features/tui/widgets/__init__.py +56 -0
- praisonai_code/cli/features/tui/widgets/chat.py +263 -0
- praisonai_code/cli/features/tui/widgets/command_popup.py +258 -0
- praisonai_code/cli/features/tui/widgets/composer.py +292 -0
- praisonai_code/cli/features/tui/widgets/file_popup.py +207 -0
- praisonai_code/cli/features/tui/widgets/queue_panel.py +223 -0
- praisonai_code/cli/features/tui/widgets/status.py +181 -0
- praisonai_code/cli/features/tui/widgets/tool_panel.py +307 -0
- praisonai_code/cli/features/wizard.py +289 -0
- praisonai_code/cli/features/workflow.py +802 -0
- praisonai_code/cli/features/yaml_utils.py +321 -0
- praisonai_code/cli/interactive/__init__.py +48 -0
- praisonai_code/cli/interactive/async_tui.py +1218 -0
- praisonai_code/cli/interactive/config.py +139 -0
- praisonai_code/cli/interactive/core.py +618 -0
- praisonai_code/cli/interactive/events.py +131 -0
- praisonai_code/cli/interactive/frontends/__init__.py +31 -0
- praisonai_code/cli/interactive/frontends/rich_frontend.py +462 -0
- praisonai_code/cli/interactive/frontends/textual_frontend.py +157 -0
- praisonai_code/cli/interactive/praison_io.py +502 -0
- praisonai_code/cli/interactive/repl.py +297 -0
- praisonai_code/cli/interactive/split_tui.py +456 -0
- praisonai_code/cli/interactive/tui_app.py +457 -0
- praisonai_code/cli/langfuse_client.py +360 -0
- praisonai_code/cli/main.py +7421 -0
- praisonai_code/cli/output/__init__.py +25 -0
- praisonai_code/cli/output/console.py +456 -0
- praisonai_code/cli/output/event_bridge.py +191 -0
- praisonai_code/cli/schedule_cli.py +54 -0
- praisonai_code/cli/schema_provider.py +23 -0
- praisonai_code/cli/session/__init__.py +16 -0
- praisonai_code/cli/session/resume.py +148 -0
- praisonai_code/cli/session/unified.py +548 -0
- praisonai_code/cli/state/__init__.py +31 -0
- praisonai_code/cli/state/identifiers.py +161 -0
- praisonai_code/cli/state/project_sessions.py +383 -0
- praisonai_code/cli/state/sessions.py +390 -0
- praisonai_code/cli/ui/__init__.py +160 -0
- praisonai_code/cli/ui/config.py +46 -0
- praisonai_code/cli/ui/events.py +61 -0
- praisonai_code/cli/ui/mg_backend.py +342 -0
- praisonai_code/cli/ui/plain.py +133 -0
- praisonai_code/cli/ui/rich_backend.py +162 -0
- praisonai_code/cli/unified_schema.py +655 -0
- praisonai_code/cli/utils/env_utils.py +126 -0
- praisonai_code/cli/utils/project.py +131 -0
- praisonai_code/cli_backends/__init__.py +73 -0
- praisonai_code/cli_backends/claude.py +373 -0
- praisonai_code/cli_backends/registry.py +113 -0
- praisonai_code/runtime/__init__.py +36 -0
- praisonai_code/runtime/__main__.py +81 -0
- praisonai_code/runtime/client.py +131 -0
- praisonai_code/runtime/descriptor.py +209 -0
- praisonai_code/runtime/server.py +356 -0
- praisonai_code-0.0.1.dist-info/METADATA +80 -0
- praisonai_code-0.0.1.dist-info/RECORD +309 -0
- praisonai_code-0.0.1.dist-info/WHEEL +5 -0
- 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
|