From 2b722e0930234df834f90dcd265a7c7a7ba1e8be Mon Sep 17 00:00:00 2001 From: Aurelio <19254254+Aureliolo@users.noreply.github.com> Date: Fri, 27 Feb 2026 17:02:06 +0100 Subject: [PATCH 1/2] feat: initialize project with uv, hatchling, and src layout Set up foundation for ai-company: - uv as package manager with uv.lock - Hatchling as build backend - src layout (src/ai_company/) with all domain modules - Test directory structure (unit/integration/e2e) - PEP 561 py.typed marker - Python >=3.14 - Comprehensive .gitignore for Python projects Closes #19, closes #20 --- .gitignore | 47 ++++++++++++++++++++++++ README.md | 17 +++++---- config/.gitkeep | 0 docs/.gitkeep | 0 pyproject.toml | 22 +++++++++++ src/ai_company/__init__.py | 3 ++ src/ai_company/api/__init__.py | 0 src/ai_company/api/routes/__init__.py | 0 src/ai_company/budget/__init__.py | 0 src/ai_company/cli/__init__.py | 0 src/ai_company/cli/commands/__init__.py | 0 src/ai_company/communication/__init__.py | 0 src/ai_company/config/__init__.py | 0 src/ai_company/core/__init__.py | 0 src/ai_company/engine/__init__.py | 0 src/ai_company/memory/__init__.py | 0 src/ai_company/providers/__init__.py | 0 src/ai_company/py.typed | 0 src/ai_company/security/__init__.py | 0 src/ai_company/templates/__init__.py | 0 src/ai_company/tools/__init__.py | 0 tests/__init__.py | 0 tests/e2e/__init__.py | 0 tests/integration/__init__.py | 0 tests/unit/__init__.py | 0 uv.lock | 8 ++++ 26 files changed, 89 insertions(+), 8 deletions(-) create mode 100644 .gitignore create mode 100644 config/.gitkeep create mode 100644 docs/.gitkeep create mode 100644 pyproject.toml create mode 100644 src/ai_company/__init__.py create mode 100644 src/ai_company/api/__init__.py create mode 100644 src/ai_company/api/routes/__init__.py create mode 100644 src/ai_company/budget/__init__.py create mode 100644 src/ai_company/cli/__init__.py create mode 100644 src/ai_company/cli/commands/__init__.py create mode 100644 src/ai_company/communication/__init__.py create mode 100644 src/ai_company/config/__init__.py create mode 100644 src/ai_company/core/__init__.py create mode 100644 src/ai_company/engine/__init__.py create mode 100644 src/ai_company/memory/__init__.py create mode 100644 src/ai_company/providers/__init__.py create mode 100644 src/ai_company/py.typed create mode 100644 src/ai_company/security/__init__.py create mode 100644 src/ai_company/templates/__init__.py create mode 100644 src/ai_company/tools/__init__.py create mode 100644 tests/__init__.py create mode 100644 tests/e2e/__init__.py create mode 100644 tests/integration/__init__.py create mode 100644 tests/unit/__init__.py create mode 100644 uv.lock diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000..b94b077ba6 --- /dev/null +++ b/.gitignore @@ -0,0 +1,47 @@ +# Python +__pycache__/ +*.py[cod] +*$py.class +*.so + +# Distribution / packaging +dist/ +build/ +*.egg-info/ +*.egg + +# Virtual environments +.venv/ +venv/ +env/ + +# Type checking / linting / testing caches +.mypy_cache/ +.ruff_cache/ +.pytest_cache/ + +# Coverage +htmlcov/ +coverage.xml +.coverage +.coverage.* + +# Environment variables +.env +.env.local +.env.*.local + +# Databases +*.db +*.sqlite3 + +# IDE +.idea/ +.vscode/ + +# OS +Thumbs.db +.DS_Store + +# uv +.python-version diff --git a/README.md b/README.md index 5a71fa962f..7ec905857e 100644 --- a/README.md +++ b/README.md @@ -21,16 +21,17 @@ AI Company lets you spin up a virtual organization staffed entirely by AI agents ## Status -**Design phase.** See [DESIGN_SPEC.md](DESIGN_SPEC.md) for the full high-level specification. +**M0: Tooling & Infrastructure** in progress. See [DESIGN_SPEC.md](DESIGN_SPEC.md) for the full high-level specification. -## Tech Stack (Planned) +## Tech Stack -- **Python 3.12+** with FastAPI, Pydantic, Typer -- **LiteLLM** for multi-provider LLM abstraction -- **Mem0** for agent memory -- **MCP** for tool integration -- **Vue 3** for web dashboard -- **SQLite** → PostgreSQL for data persistence +- **Python 3.14+** with FastAPI, Pydantic, Typer +- **uv** as package manager, **Hatchling** as build backend +- **LiteLLM** for multi-provider LLM abstraction (planned) +- **Mem0** for agent memory (planned) +- **MCP** for tool integration (planned) +- **Vue 3** for web dashboard (planned) +- **SQLite** → PostgreSQL for data persistence (planned) ## Documentation diff --git a/config/.gitkeep b/config/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/docs/.gitkeep b/docs/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000000..be9cb811a2 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,22 @@ +[project] +name = "ai-company" +version = "0.1.0" +description = "Framework for orchestrating autonomous AI agents within a virtual company structure" +readme = "README.md" +license = "BUSL-1.1" +requires-python = ">=3.14" +authors = [{ name = "Aurelio" }] +keywords = ["ai", "agents", "llm", "orchestration", "company"] +classifiers = [ + "Development Status :: 2 - Pre-Alpha", + "Programming Language :: Python :: 3.14", + "Typing :: Typed", +] +dependencies = [] + +[build-system] +requires = ["hatchling"] +build-backend = "hatchling.build" + +[tool.hatch.build.targets.wheel] +packages = ["src/ai_company"] diff --git a/src/ai_company/__init__.py b/src/ai_company/__init__.py new file mode 100644 index 0000000000..8b849aab68 --- /dev/null +++ b/src/ai_company/__init__.py @@ -0,0 +1,3 @@ +"""AI Company - Framework for orchestrating autonomous AI agents.""" + +__version__ = "0.1.0" diff --git a/src/ai_company/api/__init__.py b/src/ai_company/api/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/ai_company/api/routes/__init__.py b/src/ai_company/api/routes/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/ai_company/budget/__init__.py b/src/ai_company/budget/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/ai_company/cli/__init__.py b/src/ai_company/cli/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/ai_company/cli/commands/__init__.py b/src/ai_company/cli/commands/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/ai_company/communication/__init__.py b/src/ai_company/communication/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/ai_company/config/__init__.py b/src/ai_company/config/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/ai_company/core/__init__.py b/src/ai_company/core/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/ai_company/engine/__init__.py b/src/ai_company/engine/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/ai_company/memory/__init__.py b/src/ai_company/memory/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/ai_company/providers/__init__.py b/src/ai_company/providers/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/ai_company/py.typed b/src/ai_company/py.typed new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/ai_company/security/__init__.py b/src/ai_company/security/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/ai_company/templates/__init__.py b/src/ai_company/templates/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/ai_company/tools/__init__.py b/src/ai_company/tools/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/e2e/__init__.py b/tests/e2e/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/integration/__init__.py b/tests/integration/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/unit/__init__.py b/tests/unit/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/uv.lock b/uv.lock new file mode 100644 index 0000000000..235adf2dcc --- /dev/null +++ b/uv.lock @@ -0,0 +1,8 @@ +version = 1 +revision = 3 +requires-python = ">=3.14" + +[[package]] +name = "ai-company" +version = "0.1.0" +source = { editable = "." } From 75b6f05682c0caabd9b58b820222117871ce976b Mon Sep 17 00:00:00 2001 From: Aurelio <19254254+Aureliolo@users.noreply.github.com> Date: Fri, 27 Feb 2026 17:22:42 +0100 Subject: [PATCH 2/2] =?UTF-8?q?fix:=20address=20PR=20review=20items=20?= =?UTF-8?q?=E2=80=94=20dynamic=20versioning=20+=20README=20planned=20marke?= =?UTF-8?q?rs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Use Hatchling dynamic versioning (single source of truth in __init__.py) - Mark FastAPI, Pydantic, Typer as "(planned)" in README tech stack --- README.md | 2 +- pyproject.toml | 5 ++++- uv.lock | 1 - 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 7ec905857e..d421e86038 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ AI Company lets you spin up a virtual organization staffed entirely by AI agents ## Tech Stack -- **Python 3.14+** with FastAPI, Pydantic, Typer +- **Python 3.14+** with FastAPI, Pydantic, Typer (planned) - **uv** as package manager, **Hatchling** as build backend - **LiteLLM** for multi-provider LLM abstraction (planned) - **Mem0** for agent memory (planned) diff --git a/pyproject.toml b/pyproject.toml index be9cb811a2..f6b62e25f5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "ai-company" -version = "0.1.0" +dynamic = ["version"] description = "Framework for orchestrating autonomous AI agents within a virtual company structure" readme = "README.md" license = "BUSL-1.1" @@ -18,5 +18,8 @@ dependencies = [] requires = ["hatchling"] build-backend = "hatchling.build" +[tool.hatch.version] +path = "src/ai_company/__init__.py" + [tool.hatch.build.targets.wheel] packages = ["src/ai_company"] diff --git a/uv.lock b/uv.lock index 235adf2dcc..1673c08925 100644 --- a/uv.lock +++ b/uv.lock @@ -4,5 +4,4 @@ requires-python = ">=3.14" [[package]] name = "ai-company" -version = "0.1.0" source = { editable = "." }