diff --git a/src/aipass/cli/tests/test_bootstrap.py b/src/aipass/cli/tests/test_bootstrap.py index 157a846d..be798163 100644 --- a/src/aipass/cli/tests/test_bootstrap.py +++ b/src/aipass/cli/tests/test_bootstrap.py @@ -377,6 +377,24 @@ def test_init_project_skips_existing_optional_files(tmp_path): assert md_content == "# Custom CLAUDE\n" +def test_init_project_no_overwrite(tmp_path): + """Init does not overwrite existing files — re-runnable safety.""" + target = tmp_path / "proj" + target.mkdir() + + # First run creates files + result1 = init_project(target, project_name="safe") + assert len(result1["created_files"]) > 0 + + # Second run creates nothing — all files skipped + result2 = init_project(target, project_name="safe") + assert len(result2["created_files"]) == 0 + + # Content from first run is preserved + claude_md = (target / "CLAUDE.md").read_text(encoding="utf-8") + assert "SAFE" in claude_md + + def test_init_project_returns_dict(tmp_path): """init_project return value is a dict.""" target = tmp_path / "proj" diff --git a/src/aipass/drone/.seedgo/bypass.json b/src/aipass/drone/.seedgo/bypass.json index 82099784..dfae2bbc 100644 --- a/src/aipass/drone/.seedgo/bypass.json +++ b/src/aipass/drone/.seedgo/bypass.json @@ -107,6 +107,21 @@ "file": "apps/plugins/devpulse_ops/fix_plugin.py", "standard": "encapsulation", "reason": "Plugin imports lock_handler.find_repo_root() — drone-internal plugin, same branch." + }, + { + "file": "apps/plugins/hook_sounds/hook_sounds_plugin.py", + "standard": "architecture", + "reason": "Plugin lives in apps/plugins/ — deliberately outside 3-layer structure (same pattern as devpulse_ops)." + }, + { + "file": "apps/plugins/hook_sounds/hook_sounds_plugin.py", + "standard": "naming", + "reason": "Plugin filename convention: {plugin_name}_plugin.py inside {plugin_name}/ directory." + }, + { + "file": "apps/plugins/hook_sounds/hook_sounds_plugin.py", + "standard": "trigger", + "reason": "Simple toggle plugin — creates/removes a flag file. No state changes that warrant trigger events." } ], "notes": {