From 1d85d6617e09702266c614ed8abcb313768fc3d1 Mon Sep 17 00:00:00 2001 From: AIOSAI Date: Sat, 16 May 2026 13:04:14 -0700 Subject: [PATCH 1/3] =?UTF-8?q?docs:=20update=20README=20=E2=80=94=20macOS?= =?UTF-8?q?=20and=20Windows=20both=20CI=20green?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 03f6e3a4..afab56d1 100644 --- a/README.md +++ b/README.md @@ -251,7 +251,7 @@ Each agent documents its own operational status in its branch README — what wo - Python 3.10+ - [Claude Code](https://docs.anthropic.com/en/docs/claude-code) -- Linux or WSL (primary supported platforms) +- Linux, macOS, or WSL (all CI-tested) - `sudo` access optional (for `/usr/local/bin` symlinks — falls back to `~/.local/bin` without sudo) - API keys optional (OpenRouter/OpenAI — for optional add-on agents) @@ -259,8 +259,8 @@ Each agent documents its own operational status in its branch README — what wo These items have partial work done and are under ongoing testing: -- **macOS support** — setup and bootstrap work in progress ([#360](https://github.com/AIOSAI/AIPass/issues/360)) -- **Windows native** — CI passing, real-world testing ongoing +- **macOS support** — CI green, full test suite passing ([#360](https://github.com/AIOSAI/AIPass/issues/360)) +- **Windows native** — CI green, full test suite passing - **Codex CLI** — hooks and AGENTS.md wired, needs end-to-end testing - **Gemini CLI** — hooks and GEMINI.md wired, needs end-to-end testing - **Fork contributor workflow** — improved error handling for fork-based PRs ([#329](https://github.com/AIOSAI/AIPass/issues/329)) From 74451962eff2ca2dba0821957587f527d6ac98b4 Mon Sep 17 00:00:00 2001 From: AIOSAI Date: Sat, 16 May 2026 13:11:10 -0700 Subject: [PATCH 2/3] feat(init): auto-wire permissions.deny + pyproject.toml + tests/conftest.py on aipass init (Issue #571) --- .../aipass/apps/handlers/init/bootstrap.py | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/aipass/aipass/apps/handlers/init/bootstrap.py b/src/aipass/aipass/apps/handlers/init/bootstrap.py index 487805db..3750981a 100644 --- a/src/aipass/aipass/apps/handlers/init/bootstrap.py +++ b/src/aipass/aipass/apps/handlers/init/bootstrap.py @@ -199,6 +199,15 @@ def _claude_settings(aipass_home: str | None = None) -> str: event_hooks["UserPromptSubmit"] = prompt_hooks + event_hooks.get("UserPromptSubmit", []) data: dict = {"hooks": event_hooks} + + data["permissions"] = { + "deny": [ + "Bash(rm -rf *)", + "Bash(git push --force*)", + "Bash(git reset --hard*)", + ], + } + if aipass_home: data["env"] = {"AIPASS_HOME": aipass_home} return json.dumps(data, indent=2, ensure_ascii=False) + "\n" @@ -379,6 +388,24 @@ def init_project(target: Path, project_name: str | None = None) -> dict: init_py.write_text(f'"""{raw_name} — created with aipass init."""\n', encoding="utf-8") created.append(str(init_py)) + # 10b. pyproject.toml — pytest config + package metadata + pyproject_path = target / "pyproject.toml" + if not pyproject_path.exists(): + pyproject_path.write_text( + f'[project]\nname = "{package_name}"\nversion = "0.1.0"\nrequires-python = ">=3.10"\n\n' + f"[tool.pytest.ini_options]\ntestpaths = [\"src\"]\npythonpath = [\"src\"]\n", + encoding="utf-8", + ) + created.append(str(pyproject_path)) + + # 10c. tests/ directory with conftest + tests_dir = package_dir / "tests" + if not tests_dir.exists(): + tests_dir.mkdir(parents=True) + conftest = tests_dir / "conftest.py" + conftest.write_text('"""Pytest fixtures for ' + raw_name + '."""\n', encoding="utf-8") + created.append(str(tests_dir)) + # 11. .venv symlink → AIPass shared runtime venv_link = target / ".venv" if not venv_link.exists() and aipass_home: From 3712ca94c0a912700fc7f6b32ef6f534a9e6b26a Mon Sep 17 00:00:00 2001 From: AIOSAI Date: Sat, 16 May 2026 13:18:01 -0700 Subject: [PATCH 3/3] style: ruff format bootstrap.py --- src/aipass/aipass/apps/handlers/init/bootstrap.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/aipass/aipass/apps/handlers/init/bootstrap.py b/src/aipass/aipass/apps/handlers/init/bootstrap.py index 3750981a..8ac74247 100644 --- a/src/aipass/aipass/apps/handlers/init/bootstrap.py +++ b/src/aipass/aipass/apps/handlers/init/bootstrap.py @@ -393,7 +393,7 @@ def init_project(target: Path, project_name: str | None = None) -> dict: if not pyproject_path.exists(): pyproject_path.write_text( f'[project]\nname = "{package_name}"\nversion = "0.1.0"\nrequires-python = ">=3.10"\n\n' - f"[tool.pytest.ini_options]\ntestpaths = [\"src\"]\npythonpath = [\"src\"]\n", + f'[tool.pytest.ini_options]\ntestpaths = ["src"]\npythonpath = ["src"]\n', encoding="utf-8", ) created.append(str(pyproject_path))