commit 0a04e04490d5c237660cf6bd48caa2087b7dbf93 Author: curo1305 Date: Sun May 17 12:48:32 2026 +0200 chore: init project skeleton Directory structure, pyproject.toml with hatchling build, and all subpackage stubs for pyra Stage 1. Co-Authored-By: Claude Sonnet 4.6 diff --git a/.claude/settings.json b/.claude/settings.json new file mode 100644 index 0000000..0226c81 --- /dev/null +++ b/.claude/settings.json @@ -0,0 +1,12 @@ +{ + "permissions": { + "allow": [ + "Bash(git init *)", + "Bash(git add *)", + "Bash(git commit *)", + "Bash(git status *)", + "Bash(git log *)", + "Bash(git diff *)" + ] + } +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..028c05e --- /dev/null +++ b/.gitignore @@ -0,0 +1,14 @@ +__pycache__/ +*.py[cod] +*.egg-info/ +*.egg +dist/ +build/ +.venv/ +venv/ +.pytest_cache/ +.coverage +htmlcov/ +*.log +.env +.DS_Store diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..b914751 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,41 @@ +[build-system] +requires = ["hatchling"] +build-backend = "hatchling.build" + +[project] +name = "pyra" +version = "0.1.0" +description = "Personal AI assistant CLI with vault-first security" +requires-python = ">=3.11" +dependencies = [ + "litellm>=1.40.0", + "rich>=13.0.0", + "click>=8.1.0", + "prompt-toolkit>=3.0.0", + "questionary>=2.0.0", + "ruamel.yaml>=0.18.0", + "pydantic>=2.0.0", + "httpx>=0.27.0", + "python-dotenv>=1.0.0", +] + +[project.optional-dependencies] +dev = [ + "pytest>=8.0.0", + "pytest-asyncio>=0.23.0", + "ruff>=0.4.0", +] + +[project.scripts] +pyra = "pyra.cli:main" + +[tool.hatch.build.targets.wheel] +packages = ["src/pyra"] + +[tool.ruff] +line-length = 100 +target-version = "py311" + +[tool.pytest.ini_options] +asyncio_mode = "auto" +testpaths = ["tests"] diff --git a/src/pyra/__init__.py b/src/pyra/__init__.py new file mode 100644 index 0000000..3dc1f76 --- /dev/null +++ b/src/pyra/__init__.py @@ -0,0 +1 @@ +__version__ = "0.1.0" diff --git a/src/pyra/__main__.py b/src/pyra/__main__.py new file mode 100644 index 0000000..c708f47 --- /dev/null +++ b/src/pyra/__main__.py @@ -0,0 +1,4 @@ +from pyra.cli import main + +if __name__ == "__main__": + main() diff --git a/src/pyra/chat/__init__.py b/src/pyra/chat/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/pyra/config/__init__.py b/src/pyra/config/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/pyra/memory/__init__.py b/src/pyra/memory/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/pyra/security/__init__.py b/src/pyra/security/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/pyra/setup/__init__.py b/src/pyra/setup/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/pyra/utils/__init__.py b/src/pyra/utils/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/pyra/vault/__init__.py b/src/pyra/vault/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/integration/__init__.py b/tests/integration/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/security/__init__.py b/tests/security/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/unit/__init__.py b/tests/unit/__init__.py new file mode 100644 index 0000000..e69de29