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,259 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Permissions checks for the Doctor CLI module.
|
|
3
|
+
|
|
4
|
+
Validates filesystem permissions for PraisonAI directories.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import os
|
|
8
|
+
import tempfile
|
|
9
|
+
from pathlib import Path
|
|
10
|
+
|
|
11
|
+
from ..models import (
|
|
12
|
+
CheckCategory,
|
|
13
|
+
CheckResult,
|
|
14
|
+
CheckStatus,
|
|
15
|
+
CheckSeverity,
|
|
16
|
+
DoctorConfig,
|
|
17
|
+
)
|
|
18
|
+
from ..registry import register_check
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def _check_dir_writable(path: Path) -> tuple:
|
|
22
|
+
"""Check if a directory is writable."""
|
|
23
|
+
try:
|
|
24
|
+
if not path.exists():
|
|
25
|
+
return False, "does not exist"
|
|
26
|
+
|
|
27
|
+
if not path.is_dir():
|
|
28
|
+
return False, "not a directory"
|
|
29
|
+
|
|
30
|
+
# Try to create a temp file
|
|
31
|
+
test_file = path / ".praison_write_test"
|
|
32
|
+
try:
|
|
33
|
+
test_file.write_text("test")
|
|
34
|
+
test_file.unlink()
|
|
35
|
+
return True, "writable"
|
|
36
|
+
except PermissionError:
|
|
37
|
+
return False, "permission denied"
|
|
38
|
+
except Exception as e:
|
|
39
|
+
return False, str(e)
|
|
40
|
+
except Exception as e:
|
|
41
|
+
return False, str(e)
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
@register_check(
|
|
45
|
+
id="permissions_home_praison",
|
|
46
|
+
title="~/.praison Directory",
|
|
47
|
+
description="Check ~/.praison directory permissions",
|
|
48
|
+
category=CheckCategory.PERMISSIONS,
|
|
49
|
+
severity=CheckSeverity.MEDIUM,
|
|
50
|
+
)
|
|
51
|
+
def check_permissions_home_praison(config: DoctorConfig) -> CheckResult:
|
|
52
|
+
"""Check ~/.praison directory permissions."""
|
|
53
|
+
praison_dir = Path.home() / ".praison"
|
|
54
|
+
|
|
55
|
+
if not praison_dir.exists():
|
|
56
|
+
# Try to create it
|
|
57
|
+
try:
|
|
58
|
+
praison_dir.mkdir(parents=True, exist_ok=True)
|
|
59
|
+
return CheckResult(
|
|
60
|
+
id="permissions_home_praison",
|
|
61
|
+
title="~/.praison Directory",
|
|
62
|
+
category=CheckCategory.PERMISSIONS,
|
|
63
|
+
status=CheckStatus.PASS,
|
|
64
|
+
message="~/.praison created successfully",
|
|
65
|
+
metadata={"path": str(praison_dir)},
|
|
66
|
+
)
|
|
67
|
+
except PermissionError:
|
|
68
|
+
return CheckResult(
|
|
69
|
+
id="permissions_home_praison",
|
|
70
|
+
title="~/.praison Directory",
|
|
71
|
+
category=CheckCategory.PERMISSIONS,
|
|
72
|
+
status=CheckStatus.FAIL,
|
|
73
|
+
message="Cannot create ~/.praison directory",
|
|
74
|
+
remediation="Check home directory permissions",
|
|
75
|
+
severity=CheckSeverity.HIGH,
|
|
76
|
+
)
|
|
77
|
+
|
|
78
|
+
writable, reason = _check_dir_writable(praison_dir)
|
|
79
|
+
|
|
80
|
+
if writable:
|
|
81
|
+
return CheckResult(
|
|
82
|
+
id="permissions_home_praison",
|
|
83
|
+
title="~/.praison Directory",
|
|
84
|
+
category=CheckCategory.PERMISSIONS,
|
|
85
|
+
status=CheckStatus.PASS,
|
|
86
|
+
message=f"~/.praison is writable",
|
|
87
|
+
metadata={"path": str(praison_dir)},
|
|
88
|
+
)
|
|
89
|
+
else:
|
|
90
|
+
return CheckResult(
|
|
91
|
+
id="permissions_home_praison",
|
|
92
|
+
title="~/.praison Directory",
|
|
93
|
+
category=CheckCategory.PERMISSIONS,
|
|
94
|
+
status=CheckStatus.FAIL,
|
|
95
|
+
message=f"~/.praison is not writable: {reason}",
|
|
96
|
+
remediation="Fix permissions: chmod 755 ~/.praison",
|
|
97
|
+
severity=CheckSeverity.HIGH,
|
|
98
|
+
)
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
@register_check(
|
|
102
|
+
id="permissions_project_praison",
|
|
103
|
+
title=".praison Directory (Project)",
|
|
104
|
+
description="Check project .praison directory permissions",
|
|
105
|
+
category=CheckCategory.PERMISSIONS,
|
|
106
|
+
severity=CheckSeverity.LOW,
|
|
107
|
+
)
|
|
108
|
+
def check_permissions_project_praison(config: DoctorConfig) -> CheckResult:
|
|
109
|
+
"""Check project .praison directory permissions."""
|
|
110
|
+
praison_dir = Path.cwd() / ".praison"
|
|
111
|
+
|
|
112
|
+
if not praison_dir.exists():
|
|
113
|
+
return CheckResult(
|
|
114
|
+
id="permissions_project_praison",
|
|
115
|
+
title=".praison Directory (Project)",
|
|
116
|
+
category=CheckCategory.PERMISSIONS,
|
|
117
|
+
status=CheckStatus.SKIP,
|
|
118
|
+
message="No .praison directory in current project",
|
|
119
|
+
)
|
|
120
|
+
|
|
121
|
+
writable, reason = _check_dir_writable(praison_dir)
|
|
122
|
+
|
|
123
|
+
if writable:
|
|
124
|
+
return CheckResult(
|
|
125
|
+
id="permissions_project_praison",
|
|
126
|
+
title=".praison Directory (Project)",
|
|
127
|
+
category=CheckCategory.PERMISSIONS,
|
|
128
|
+
status=CheckStatus.PASS,
|
|
129
|
+
message=".praison is writable",
|
|
130
|
+
metadata={"path": str(praison_dir)},
|
|
131
|
+
)
|
|
132
|
+
else:
|
|
133
|
+
return CheckResult(
|
|
134
|
+
id="permissions_project_praison",
|
|
135
|
+
title=".praison Directory (Project)",
|
|
136
|
+
category=CheckCategory.PERMISSIONS,
|
|
137
|
+
status=CheckStatus.WARN,
|
|
138
|
+
message=f".praison is not writable: {reason}",
|
|
139
|
+
remediation="Fix permissions or use ~/.praison instead",
|
|
140
|
+
)
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
@register_check(
|
|
144
|
+
id="permissions_temp_dir",
|
|
145
|
+
title="Temp Directory",
|
|
146
|
+
description="Check temp directory permissions",
|
|
147
|
+
category=CheckCategory.PERMISSIONS,
|
|
148
|
+
severity=CheckSeverity.MEDIUM,
|
|
149
|
+
)
|
|
150
|
+
def check_permissions_temp_dir(config: DoctorConfig) -> CheckResult:
|
|
151
|
+
"""Check temp directory permissions."""
|
|
152
|
+
temp_dir = Path(tempfile.gettempdir())
|
|
153
|
+
|
|
154
|
+
try:
|
|
155
|
+
# Try to create a temp file
|
|
156
|
+
with tempfile.NamedTemporaryFile(delete=True) as f:
|
|
157
|
+
f.write(b"test")
|
|
158
|
+
|
|
159
|
+
return CheckResult(
|
|
160
|
+
id="permissions_temp_dir",
|
|
161
|
+
title="Temp Directory",
|
|
162
|
+
category=CheckCategory.PERMISSIONS,
|
|
163
|
+
status=CheckStatus.PASS,
|
|
164
|
+
message=f"Temp directory writable: {temp_dir}",
|
|
165
|
+
metadata={"path": str(temp_dir)},
|
|
166
|
+
)
|
|
167
|
+
except Exception as e:
|
|
168
|
+
return CheckResult(
|
|
169
|
+
id="permissions_temp_dir",
|
|
170
|
+
title="Temp Directory",
|
|
171
|
+
category=CheckCategory.PERMISSIONS,
|
|
172
|
+
status=CheckStatus.FAIL,
|
|
173
|
+
message=f"Temp directory not writable: {e}",
|
|
174
|
+
remediation="Check TMPDIR environment variable and permissions",
|
|
175
|
+
severity=CheckSeverity.HIGH,
|
|
176
|
+
)
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
@register_check(
|
|
180
|
+
id="permissions_cwd",
|
|
181
|
+
title="Current Working Directory",
|
|
182
|
+
description="Check current directory permissions",
|
|
183
|
+
category=CheckCategory.PERMISSIONS,
|
|
184
|
+
severity=CheckSeverity.INFO,
|
|
185
|
+
)
|
|
186
|
+
def check_permissions_cwd(config: DoctorConfig) -> CheckResult:
|
|
187
|
+
"""Check current directory permissions."""
|
|
188
|
+
cwd = Path.cwd()
|
|
189
|
+
|
|
190
|
+
writable, reason = _check_dir_writable(cwd)
|
|
191
|
+
|
|
192
|
+
if writable:
|
|
193
|
+
return CheckResult(
|
|
194
|
+
id="permissions_cwd",
|
|
195
|
+
title="Current Working Directory",
|
|
196
|
+
category=CheckCategory.PERMISSIONS,
|
|
197
|
+
status=CheckStatus.PASS,
|
|
198
|
+
message=f"Current directory writable: {cwd}",
|
|
199
|
+
)
|
|
200
|
+
else:
|
|
201
|
+
return CheckResult(
|
|
202
|
+
id="permissions_cwd",
|
|
203
|
+
title="Current Working Directory",
|
|
204
|
+
category=CheckCategory.PERMISSIONS,
|
|
205
|
+
status=CheckStatus.WARN,
|
|
206
|
+
message=f"Current directory not writable: {reason}",
|
|
207
|
+
details="Some features may not work without write access",
|
|
208
|
+
)
|
|
209
|
+
|
|
210
|
+
|
|
211
|
+
@register_check(
|
|
212
|
+
id="permissions_config_dir",
|
|
213
|
+
title="Config Directory",
|
|
214
|
+
description="Check ~/.config/praison directory",
|
|
215
|
+
category=CheckCategory.PERMISSIONS,
|
|
216
|
+
severity=CheckSeverity.LOW,
|
|
217
|
+
)
|
|
218
|
+
def check_permissions_config_dir(config: DoctorConfig) -> CheckResult:
|
|
219
|
+
"""Check ~/.config/praison directory."""
|
|
220
|
+
config_dir = Path.home() / ".config" / "praison"
|
|
221
|
+
|
|
222
|
+
if not config_dir.exists():
|
|
223
|
+
# Check if we can create it
|
|
224
|
+
try:
|
|
225
|
+
config_dir.mkdir(parents=True, exist_ok=True)
|
|
226
|
+
return CheckResult(
|
|
227
|
+
id="permissions_config_dir",
|
|
228
|
+
title="Config Directory",
|
|
229
|
+
category=CheckCategory.PERMISSIONS,
|
|
230
|
+
status=CheckStatus.PASS,
|
|
231
|
+
message="~/.config/praison created successfully",
|
|
232
|
+
)
|
|
233
|
+
except Exception:
|
|
234
|
+
return CheckResult(
|
|
235
|
+
id="permissions_config_dir",
|
|
236
|
+
title="Config Directory",
|
|
237
|
+
category=CheckCategory.PERMISSIONS,
|
|
238
|
+
status=CheckStatus.SKIP,
|
|
239
|
+
message="~/.config/praison does not exist (will use ~/.praison)",
|
|
240
|
+
)
|
|
241
|
+
|
|
242
|
+
writable, reason = _check_dir_writable(config_dir)
|
|
243
|
+
|
|
244
|
+
if writable:
|
|
245
|
+
return CheckResult(
|
|
246
|
+
id="permissions_config_dir",
|
|
247
|
+
title="Config Directory",
|
|
248
|
+
category=CheckCategory.PERMISSIONS,
|
|
249
|
+
status=CheckStatus.PASS,
|
|
250
|
+
message="~/.config/praison is writable",
|
|
251
|
+
)
|
|
252
|
+
else:
|
|
253
|
+
return CheckResult(
|
|
254
|
+
id="permissions_config_dir",
|
|
255
|
+
title="Config Directory",
|
|
256
|
+
category=CheckCategory.PERMISSIONS,
|
|
257
|
+
status=CheckStatus.WARN,
|
|
258
|
+
message=f"~/.config/praison not writable: {reason}",
|
|
259
|
+
)
|