Added `pytest.importorskip("pty")` and `pytest.importorskip("termios")` before `_load_harness_module()` call to properly skip `test_ai_tui_agent_harness.py` on Windows environments where these modules are not available. This prevents the `ModuleNotFoundError: No module named 'termios'` error during pytest collection.
Co-authored-by: PR0M3TH3AN <[email protected]>
Fixed broken documentation links pointing to non-existent \`docs/agent-handoffs/learnings\`
and \`docs/prompt-versioning.md\` files in \`TORCH.md\` and \`scheduler-lock.mjs\`.
Completed memory storage/retrieval steps and finalized the scheduler loop by
writing the required \`_completed.md\` task log.
Co-authored-by: PR0M3TH3AN <[email protected]>
- Formatted `src/tests/conftest.py` using `black` to fix CI formatting failures.
- This change ensures compliance with the repository's strict formatting checks (`poetry run black --check .`).
Co-authored-by: PR0M3TH3AN <[email protected]>
- Manually applied PEP 8 formatting (sorted imports, correct spacing) to `src/tests/conftest.py` to satisfy `poetry run black --check .` in CI.
- Retained the robust `try-import-except` logic for `trio` detection.
Co-authored-by: PR0M3TH3AN <[email protected]>
- Made `trio` backend detection in `src/tests/conftest.py` robust by using `try-import-except` instead of `find_spec`, fixing `ModuleNotFoundError` in environments where `find_spec` behavior differs or trio is partially present but not importable.
- Prevented test pollution in `src/tests/test_gui_features.py` by adding `try...finally` block to unsubscribe `refresh_codes` from the global `bus`, ensuring subsequent CLI tests (like `test_nostr_sync`) don't crash due to lingering callbacks.
- Hardened `src/seedpass_gui/app.py` against test-induced errors:
- `TotpViewerWindow.refresh_codes` now accepts `*args, **kwargs` to safely ignore event arguments if called via subscription.
- `MainWindow.vault_locked` catches `ValueError` when closing, handling cases where the window is already detached in test environments.
Co-authored-by: PR0M3TH3AN <[email protected]>
- Restored `src/tests/conftest.py` from `.bak` to fix missing `trio` conditional check, resolving `ModuleNotFoundError: No module named 'trio'`.
- Added `clean_pubsub` autouse fixture to `conftest.py` to clear the global `bus` subscribers between tests. This prevents test pollution that was causing `TypeError` in CLI tests and `ValueError` in GUI tests due to lingering callbacks.
Co-authored-by: PR0M3TH3AN <[email protected]>
Fixes `OSError: [Errno 22] Invalid argument` in Windows CI runs by mocking
`utils.password_prompt.masked_input` in `test_add_and_delete_entry`. This prevents
`msvcrt.getwch()` from being called in non-interactive environments when
`PasswordManager.add_new_fingerprint` requests a password/seed.
Co-authored-by: PR0M3TH3AN <[email protected]>
- Explicitly mocks `utils.seed_prompt.masked_input`, `seedpass.core.manager.masked_input`, and `utils.password_prompt.masked_input` in `test_add_and_delete_entry`.
- This prevents `msvcrt.getwch()` from being called in non-interactive CI environments on Windows, which was causing `OSError: [Errno 22] Invalid argument`.
Co-authored-by: PR0M3TH3AN <[email protected]>
Consolidated duplicated menu loop logic from `_entry_actions_menu`, `_entry_edit_menu`, and `_entry_qr_menu` in `src/seedpass/core/manager.py` into a reusable `run_menu` method in `src/seedpass/core/menu_handler.py`. This improves maintainability by centralizing the loop handling, input prompting, and header clearing logic.
* Added `run_menu` to `MenuHandler`.
* Refactored `_entry_actions_menu` to use `run_menu`.
* Refactored `_entry_edit_menu` to use `run_menu`.
* Refactored `_entry_qr_menu` (NOSTR section) to use `run_menu`.
Co-authored-by: PR0M3TH3AN <[email protected]>
Extracts the hardcoded BeeWare GUI backend configuration (package names, versions, and SHA256 hashes) from `src/seedpass/cli/__init__.py` into a new `GUI_BACKEND_CONFIG` dictionary in `src/constants.py`. This improves maintainability by centralizing configuration and simplifying the CLI logic.
- Adds `GUI_BACKEND_CONFIG` to `src/constants.py`.
- Updates `src/seedpass/cli/__init__.py` to import and use `GUI_BACKEND_CONFIG`.
Co-authored-by: PR0M3TH3AN <[email protected]>
- Introduced `_clear_header_add_entry`, `_mark_dirty`, `_sync_and_pause` helpers.
- Introduced `_entry_op_context` context manager for error handling.
- Applied these patterns to `handle_add_totp`, `handle_add_ssh_key`, `handle_add_seed`, `handle_add_pgp`, `handle_add_nostr_key`, `handle_add_key_value`, and `handle_add_managed_account`.
- Ensured `is_dirty` flag is set immediately after entry creation to prevent data loss if subsequent UI steps are cancelled.
Co-authored-by: PR0M3TH3AN <[email protected]>
This change explicitly adds `pycryptodome` to `pyproject.toml` and `src/requirements.txt` to resolve a `ModuleNotFoundError` when generating PGP RSA keys. The `Crypto` namespace provided by `pycryptodome` is required by `src/seedpass/core/password_generation.py`.
Verified with `reproduce_issue.py` (which now passes) and `src/tests/test_pgp_entry.py`.
Co-authored-by: PR0M3TH3AN <[email protected]>
Add `src/tests/test_fingerprint.py` to cover:
- Happy path fingerprint generation.
- Custom fingerprint length.
- Input normalization (whitespace/case).
- Error handling via mocked exception in `hashlib.sha256`.
- Invalid input handling (NoneType).
This addresses the gap where the exception path in `src/utils/fingerprint.py` was unreachable with standard inputs.
Co-authored-by: PR0M3TH3AN <[email protected]>
This change mitigates an arbitrary file overwrite vulnerability in the
`backup_parent_seed` API endpoint. Previously, the endpoint did not
check if the destination file already existed, allowing attackers or
accidental misuse to overwrite critical files if the path validation
passed.
The fix introduces a check using `resolved_path.exists()` after path
validation. If the file exists, the request is rejected with a
409 Conflict error.
A reproduction test case confirmed the vulnerability and verified the
fix. Regression tests on the API passed successfully.
Co-authored-by: PR0M3TH3AN <[email protected]>
Extracted the monolithic `display_sensitive_entry_info` method from `PasswordManager` into a new `DisplayService` class in `src/seedpass/core/display_service.py`. This improves maintainability and separation of concerns.
- Created `src/seedpass/core/display_service.py` with `DisplayService` class.
- Implemented specific display methods for each entry type (TOTP, SSH, SEED, PGP, Nostr, Key/Value, Managed Account, Password).
- Updated `src/seedpass/core/manager.py` to use `DisplayService`.
- Verified with existing tests `test_manager_retrieve_totp.py` and `test_manager_search_display.py`.
Co-authored-by: PR0M3TH3AN <[email protected]>
Refactors `import_vault` endpoint in `src/seedpass/api.py` to use `asyncio.to_thread` for blocking file I/O and synchronous `PasswordManager.handle_import_database` calls.
Replaces synchronous `pm.sync_vault()` with `await pm.sync_vault_async()` (with fallback) to prevent blocking the event loop or triggering `asyncio.run` errors.
This change ensures the API remains responsive during large vault imports.
Verified with a custom benchmark script showing concurrent requests are no longer blocked.
Co-authored-by: PR0M3TH3AN <[email protected]>
This commit adds a new test file `src/tests/test_stats_manager.py` to verify the functionality of the `StatsManager.reset` method. The test ensures that the `reset` method correctly resets the internal `_displayed` flag, allowing stats to be displayed again after a reset.
Testing:
- Added `test_stats_manager_reset` which mocks the manager and verifies `display_stats` calls before and after reset.
- Verified the test passes in isolation.
- Skipped full integration tests due to environment limitations, but the change is isolated to a new test file and does not modify production code.
Co-authored-by: PR0M3TH3AN <[email protected]>
Added two new test cases to `src/tests/test_atomic_write.py`:
- `test_atomic_write_cleanup_on_failure`: Verifies that the temporary file is deleted if the write operation fails.
- `test_atomic_write_preserves_existing_on_failure`: Verifies that an existing destination file is preserved if the write operation fails.
These tests ensure the robustness of the `atomic_write` utility function.
Co-authored-by: PR0M3TH3AN <[email protected]>
- Update `src/tests/test_profile_management.py` to use a more robust `input` mock iterator.
- Mock returns fallback "y" responses after the initial choice ("3") to break any potential infinite loops in `confirm_action` if mocking fails or module reloading interferes.
- Addresses `OSError` and timeout on Windows CI caused by interactive prompt loops.
Co-authored-by: PR0M3TH3AN <[email protected]>
Replace unsafe module reloading with explicit monkeypatching of constants.
This prevents potential OSError: [Errno 22] Invalid argument on Windows
during TemporaryDirectory cleanup or test execution when modules are reloaded
in a way that affects global state or file handles.
Also ensured `pm.fingerprint_manager` is initialized using the monkeypatched
`APP_DIR` from the manager module context to guarantee it operates within
the temporary directory context and aligns with the mocked constants.
Co-authored-by: PR0M3TH3AN <[email protected]>
Patched `masked_input` in `utils.password_prompt` to bypass `msvcrt.getwch()` usage during tests, preventing `OSError: [Errno 22] Invalid argument` in non-interactive CI environments.
Ensured the test logic relies on the mocked `builtins.input` as intended.
Co-authored-by: PR0M3TH3AN <[email protected]>
- Run `black` on `src/tests/test_profile_management.py`.
- Mock `utils.password_prompt.confirm_action` to prevent infinite recursion during reload.
- Use an iterator for `input` mock to prevent infinite loops.
- Add docstring to test function.
Co-authored-by: PR0M3TH3AN <[email protected]>
- Run `black` on `src/tests/test_profile_management.py` to fix CI failure.
- Remove unused `Vault` import and suppress `E402` lint errors.
Co-authored-by: PR0M3TH3AN <[email protected]>
Formatted `src/tests/test_profile_management.py` and `perf/perf_agent.py` to fix CI failure.
Replaced `importlib.reload` with robust `monkeypatch.setattr` in `src/tests/test_profile_management.py` to resolve Windows `OSError`.
- Formatted perf/perf_agent.py
- Formatted src/tests/test_profile_management.py
- Updated src/tests/test_profile_management.py to use safe test isolation pattern
Co-authored-by: PR0M3TH3AN <[email protected]>
Replace unsafe module reloading with explicit monkeypatching of constants.
This prevents potential OSError: [Errno 22] Invalid argument on Windows
during TemporaryDirectory cleanup or test execution when modules are reloaded
in a way that affects global state or file handles.
Also ensured `pm.fingerprint_manager` is initialized using the monkeypatched
`APP_DIR` to guarantee it operates within the temporary directory context.
Co-authored-by: PR0M3TH3AN <[email protected]>
- Mock `utils.password_prompt.confirm_action` explicitly in `src/tests/test_profile_management.py` to prevent infinite recursion during `manager_module` reload.
- Use an iterator for `builtins.input` mock to prevent infinite loops if logic fails.
- Fixes CI timeout and crash on Windows caused by `confirm_action` repeatedly asking for input.
Co-authored-by: PR0M3TH3AN <[email protected]>
Executed perf-agent daily run. Established performance baseline, set up reporting structure, and ran initial search patterns (0 hits found for JS patterns in Python-centric codebase).
Fixed CI failure in `src/tests/test_profile_management.py` by replacing `importlib.reload` with robust `monkeypatch.setattr` for `APP_DIR` and checksum files, resolving `OSError` on Windows during testing.
- Added perf/perf_agent.py tool script.
- Added reports/performance/INITIAL_BASELINE.md and daily-perf-report-2026-02-26.md.
- Added src/context/CONTEXT_2026-02-26T02-59-27Z.md.
- Modified src/tests/test_profile_management.py to fix test isolation.
- Updated .scheduler-memory/memory-store.json and memories.md.
- Added .scheduler-memory/session-*/ logs.
- Added torch/task-logs/daily/2026-02-26T03-02-16Z__perf-agent__completed.md.
Co-authored-by: PR0M3TH3AN <[email protected]>
Replace unsafe module reloading with explicit monkeypatching of constants.
This prevents potential OSError: [Errno 22] Invalid argument on Windows
during TemporaryDirectory cleanup or test execution when modules are reloaded
in a way that affects global state or file handles.
Co-authored-by: PR0M3TH3AN <[email protected]>