Commit graph

114 commits

Author SHA1 Message Date
Research Assistant
e91dfd8c45 perf: refresh_paper accepts entry dict, skip full index read 2026-05-13 16:58:39 +08:00
Research Assistant
d4df673088 feat(memory): dashboard reads from SQLite + incremental refresh_paper() 2026-05-12 20:08:46 +08:00
Research Assistant
2b91e09996 feat(memory): add agent context query module 2026-05-12 19:55:58 +08:00
Research Assistant
6c6b8ce7a1 feat(frontmatter): add citation_key field and alias from BBT citationKey 2026-05-12 18:28:53 +08:00
Research Assistant
65cbf867e6 test(memory): add integration test for memory build/status workflow 2026-05-12 17:59:37 +08:00
Research Assistant
afcbd3ce27 feat(memory): add query module for paper lookup and status check 2026-05-12 17:47:30 +08:00
Research Assistant
f6bc234aa7 feat(memory): add builder module that populates SQLite from formal-library.json 2026-05-12 17:44:03 +08:00
Research Assistant
fb17c58020 feat(memory): add schema module with table definitions and tests 2026-05-12 17:40:10 +08:00
Research Assistant
ed0da99207 test: update fixtures to {key}.md filename format (red phase) 2026-05-11 21:09:36 +08:00
Research Assistant
7933ad8c68 test: update headless_setup tests for refactored literature-qa skill directory
Refactored deploy_skills service creates a single literature-qa skill dir

instead of individual pf-deep/pf-paper/etc. Update all 4 agent

platform tests to check for literature-qa instead of old names.
2026-05-11 00:18:24 +08:00
Research Assistant
2f0f417b7c fix(setup,test): replace orphaned imported_skills variable and update bootstrap test
headless_setup Phase 7 used imported_skills which was removed during

skill_deploy refactor. Use skill_result['skill_deployed'] instead.

Also update bootstrap test that asserted old command_files string.
2026-05-11 00:11:00 +08:00
Research Assistant
232dd1f453 test: update AGENT_CONFIGS tests for refactored AGENT_SKILL_DIRS flat dict
Setup wizard no longer defines AGENT_CONFIGS; the refactored

skill_deploy.py exports AGENT_SKILL_DIRS instead. Update

test imports and assertions accordingly.
2026-05-11 00:05:59 +08:00
Research Assistant
cfe00a9a64 test: update bootstrap test to match fixed agents_src code 2026-05-10 21:05:05 +08:00
Research Assistant
59a024abba refactor(skills): modular literature-qa skill with router-first architecture
- Replace 6 scattered pf-*.md files with single SKILL.md router + 4 reference files
- Add paper_resolver.py: deterministic key/DOI/field search (4 subcommands)
- Remove pf-sync/ocr/status (CLI-only commands, no skill wrapper needed)
- Move chart-reading/ into references/ for flat structure
- Make ld_deep.py --vault optional (auto-detect from cwd)
- Add 26 unit tests for paper_resolver
- All paths dynamically resolved from paperforge.json, zero hardcoding
2026-05-10 20:56:28 +08:00
Research Assistant
06ef31271e hotfix(base): stop regenerating Base views on every sync — prevents duplicate views and preserves user column widths
- ensure_base_views now only creates files on first run; subsequent calls
  only update folder filter, leaving views untouched
- merge_base_views gains width preservation for PF views (backup safety)
- Removed deprecated control_dir from test_setup_wizard (5 cases)
- Fixed NoneType stdout in test_doctor_runs
- Added paperforge status reference to README

Obsidian handles view data from frontmatter changes automatically;
PaperForge should not regenerate views on every sync.
2026-05-10 02:59:41 +08:00
Research Assistant
4f3eb7ebe5 fix: remove deprecated control_dir from doctor/setup/repair; enable repair button; fix UTF-8 encoding in doctor output 2026-05-10 01:50:24 +08:00
Research Assistant
90bab3795a fix: test_migration expects run_index_refresh dict return (v2.1) 2026-05-09 22:57:57 +08:00
Research Assistant
42c7078eff fix: e2e test_index_refresh expects dict return (v2.1) 2026-05-09 22:54:10 +08:00
Research Assistant
c62da3f7ef fix: e2e test expects run_selection_sync dict return (v2.1) 2026-05-09 22:49:54 +08:00
Research Assistant
a990aa6205 fix: update test_paperforge_paths_returns_exact_keys for new config/index keys 2026-05-09 22:46:56 +08:00
Research Assistant
2b3adf7c2c fix: CI dispatch tests — mock at SyncService level, restore --selection/--index flags 2026-05-09 22:42:53 +08:00
Research Assistant
73cce185b4 refactor: v2.1 contract hardening — PFResult unification, ErrorCode expansion, adapter cleanup, SyncService orchestration
Core contract:
- ErrorCode: 8→26 with _missing_() graceful degradation for unknown codes
- PFResult: +warnings/next_actions, PFError: +suggestions
- OcrStatus: 4→9 granular states (NONE/QUEUED/BLOCKED/NO_PDF/DONE_INCOMPLETE restored 1:1)
- field_registry.yaml: +owner/deprecated/replacement/enum values/default

Adapter cleanup:
- new core/io.py (read_json/write_json), core/date_utils.py (extract_year)
- new adapters/collections.py (build_collection_lookup)
- adapters/bbt.py: cut worker dependency, _private→public+alias
- worker/_utils.py + _domain.py: re-export from core instead of duplicate defs

Command unification:
- All 6 commands (sync/status/ocr/deep/repair/dashboard) → PFResult
- cli.py --json dest unified to 'json' (was json_output on status/doctor)
- commands/sync.py → SyncService (no more int/dict/PFResult mixing)

Service hardening:
- SyncService.run() orchestrates full sync lifecycle (select→index→clean)
- cleanup loops (orphaned records, flat notes) migrated from worker
- worker/sync.py: freeze line + services→worker one-way dependency
- plugin/main.js: formal-library.json fallback deprecation warning

Verification: 181/181 tests, 0 new lint errors
2026-05-09 22:20:07 +08:00
Research Assistant
e1fe3e126c fix: skip backslash path test on non-Windows (\\ is valid filename char on Linux) 2026-05-09 18:33:42 +08:00
Research Assistant
cc61564768 fix: cross-platform issues in bbt path normalization + e2e doctor test
bbt.py _normalize_attachment_path: check Windows drive letter (D:) pattern on Linux
  - Path('D:/...').is_absolute() returns False on Linux — treat paths with UPPER: as absolute
  - Fixes test_absolute_windows_path failing on Ubuntu CI

test_e2e_cli: guard against None doctor stdout in test_full_pipeline_consistency
  - Same CI environment issue as test_doctor_outputs_verdict — skip on empty output
2026-05-09 18:23:10 +08:00
Research Assistant
7f633ffe70 fix: mock PADDLEOCR_API_TOKEN in ocr_preflight + skip doctor verdict on empty output
test_ocr_preflight: patch os.environ to provide PADDLEOCR_API_TOKEN
  - run_ocr() checks token before fitz.open() — CI has no token → never reaches mock
  - Now patches os.environ in both test_valid_pdf_proceeds + test_junction_path_resolved

test_e2e_cli: skip test_doctor_outputs_verdict when doctor produces no stdout
  - On Windows CI, sandbox subprocess produces empty output — environment issue, not code bug
2026-05-09 18:16:36 +08:00
Research Assistant
3dce810676 fix: pre-existing test issues blocking CI on non-Windows platforms
test_ocr_preflight: mock fitz.open (not builtins.open) + set needs_sanitize=True
  - Code uses fitz.open(), not builtins.open() — mock was targeting wrong function
  - fitz.open() only called when meta.needs_sanitize is true — mock returned {} which skipped it
  - These tests were always broken but CI never ran before v2.1

test_e2e_cli: guard against None stdout in doctor_verdict test on Windows CI

L3 runtime.test.mjs: use platform-agnostic path matching
  - path.join produces / on Linux but \\\\ on Windows — test used \\\\ only
2026-05-09 18:06:37 +08:00
Research Assistant
255249945d fix: add audit test conftest (golden_vault fixture was missing from git tracking) 2026-05-09 17:41:17 +08:00
Research Assistant
407900c174 fix: tests validate PFResult envelope for status --json contract change
Updates all tests that assert on status --json output to read from PFResult envelope.

Code was intentionally changed in Phase 57 to wrap JSON output in PFResult {ok, command, version, data, error}. Tests must validate the new contract shape, not the old flat dict format.
2026-05-09 17:37:14 +08:00
Research Assistant
cd56bd401e fix: CI failures — stub params, ld_deep syntax, PFResult tests, setup_wizard plugin copy
Fixes 4 CI issues:
- test_cli_worker_dispatch: add json_output param to stubs
- ld_deep.py: replace Python 3.12+ generic syntax with TypeVar
- test_e2e_cli, test_status: update assertions for PFResult envelope
- setup_wizard: skip node_modules/src dirs in plugin copy
- ci.yml: shell=bash for Windows, pin alls-green@v1.2.2
2026-05-09 17:22:11 +08:00
Research Assistant
7148077153 v1.4.17rc4
Milestone v2.1: Contract-Driven Architecture & Engineering Hardening

- Stop the Bleeding: version sync checker, PyYAML hardening, install docs unification
- Contract Layer: PFResult/PFError dataclasses, ErrorCode enum, --json wrapping
- Service Extraction: sync.py decomposed into 3 adapters + SyncService
- State Machine: PdfStatus/OcrStatus/Lifecycle enums, transitions, field registry
- Setup Modularization: setup_wizard.py decomposed into 6 classes

173 tests passing, 0 regressions.
2026-05-09 17:05:07 +08:00
Research Assistant
8a4fdc6bcb feat(54-002): add CHAOS_MATRIX.md and chaos tests for corrupted inputs, network failures, filesystem errors
- tests/chaos/scenarios/CHAOS_MATRIX.md: 15+ destructive scenarios documented with IDs, triggers, expected behavior, safety contracts
- tests/chaos/conftest.py: chaos_vault, chaos_vault_standard fixtures with isolation guards + file corruption helpers
- tests/chaos/test_corrupted_inputs.py: CHAOS-01 (6 tests: malformed JSON, empty, missing key, corrupt PDF, broken meta, missing frontmatter)
- tests/chaos/test_network_failures.py: CHAOS-02 (4 tests: 401, 500, timeout, DNS unreachable via env var manipulation)
- tests/chaos/test_filesystem_errors.py: CHAOS-03 (4 tests: deleted dirs, missing note, permission denied)
2026-05-09 00:53:03 +08:00
Research Assistant
91cf548dd6 feat(54-001): add UX contract and user journey tests
- docs/ux-contract.md: verifiable step sequences for install, sync, OCR, dashboard
- tests/journey/conftest.py: journey_fresh_vault, journey_established_vault, journey_cli_invoker fixtures with isolation guards
- tests/journey/test_onboarding.py: JNY-02 new user onboarding (sync -> OCR -> analyze -> deep-read)
- tests/journey/test_daily_workflow.py: JNY-03 existing user adds paper workflow
2026-05-09 00:52:55 +08:00
Research Assistant
a34b17ce3b feat(53-001): extract src/ modules from main.js and add Vitest test infrastructure
- runtime.js: resolvePythonExecutable, getPluginVersion, checkRuntimeVersion
- errors.js: classifyError, buildRuntimeInstallCommand, parseRuntimeStatus
- commands.js: ACTIONS, buildCommandArgs, runSubprocess
- package.json with vitest + obsidian-test-mocks + jsdom
- vitest.config.ts with jsdom environment
- 42 Vitest tests across 3 test files
- Refactored main.js to import from src/ modules
2026-05-09 00:05:19 +08:00
Research Assistant
6840d324fe feat(52-golden-datasets-cli-contracts): add CLI contract tests with snapshot integration
- tests/cli/ with conftest.py (cli_invoker, vault_builder, mock_ocr_backend fixtures)
- test_contract_helpers.py with normalize_snapshot, assert_valid_json, assert_json_shape
- 3 test files covering all 8 CLI commands (paths, status, sync, ocr, doctor,
  repair, context, setup) with exit code, output shape, and error contracts
- fixtures/ocr/mock_ocr_backend.py with 4 mock modes (success, pending, error, timeout)
- pyproject.toml: added pytest-snapshot, responses, pytest-timeout, pytest-mock,
  coverage; added testpaths and layer markers
- All 27 tests pass (CLI-01, CLI-02, CLI-03 satisfied)
2026-05-08 23:32:03 +08:00
Research Assistant
62026a7d12 test: align deep-reading expectations with main-note workflow 2026-05-08 17:47:46 +08:00
Research Assistant
6ef903d802 test: prefer repo source for OCR doctor fixtures 2026-05-08 17:47:45 +08:00
Research Assistant
d2205e957c fix: v1.4.17rc2 — OCR quote fix, 4-stage lifecycle, .env fallback, Codex support, deep-reading anchors, auto-update pip 2026-05-08 01:26:04 +08:00
Research Assistant
a10bf1fdbd test(merge-gate): add upgrade migration and index path integrity tests
- test OCR state machine: isolate runtime (no ambient tokens), fix retry exhaustion and full cycle tests
- test migration: verify no-index flat note migration, legacy flag promotion including false overrides
- test migration: verify non-canonical filename migration via frontmatter title
- test migration: verify already-migrated workspace reconciliation from legacy records
- test asset_index: verify fulltext/deep-reading paths only advertised when files exist
2026-05-07 21:52:16 +08:00
Research Assistant
989f994919 fix(50-repair-blind-spots): replace bare except:pass + add --fix else clause (REPAIR-02/03)
- Replaced 5 bare except Exception: pass blocks with logger.warning() calls
  (4 per plan at lines 223, 306, 347, 355 + 1 auto-detected at line 315 via Rule 2)
- Added else clause printing [WARNING] for unhandled --fix divergence types
- Added 6 new tests: 4 caplog tests for logger.warning, 1 capsys test for [WARNING],
  1 index load failure test
- All 37 repair tests pass
2026-05-07 20:20:25 +08:00
Research Assistant
8c75871af0 fix(50-repair-blind-spots): repair condition 4 detection + dead code removal (REPAIR-01/04)
- Removed dead import of load_domain_config and orphaned dict comprehension
- Replaced note_ocr_status != pending guard with combined logic catching note=pending vs meta=done/failed
- Added 5 new tests (3 for condition 4 detection, 2 for dead code verification)
2026-05-07 20:16:38 +08:00
Research Assistant
4e816f9ea3 feat(49-module-hardening): asset_state.py + status.py hardening — reorder checks, empty dicts
- HARDEN-06: Reorder next_step checks so workspace integrity (note_path, workspace_paths) comes before /pf-deep recommendation
- HARDEN-07: Initialize lifecycle_level_counts, health_aggregate, maturity_distribution as {} (not None) in status.py
- Update tests: 2 new test methods, 1 updated existing test, 1 updated assertion
2026-05-07 20:06:24 +08:00
Research Assistant
5a69874ab5 feat(49-module-hardening): discussion.py hardening — UTC timestamps, MD escaping, file locking
- Replace CST (UTC+8) with UTC timezone using timezone.utc
- Add _escape_md() helper to escape markdown special chars in QA fields
- Wrap JSON+MD read-modify-write in filelock.FileLock with 10s timeout
- Add 5 new tests: UTC timestamp, MD escaping, CJK escaping, lock release, lock timeout
2026-05-07 20:06:16 +08:00
Research Assistant
6402ca5aa2 test(47-library-records): update ld_deep tests for removed records key
- Removed 'records' from expected keys in test_paperforge_paths_returns_expected_keys
- Removed 'records' assertion in test_paperforge_paths_values_match_shared_resolver
- Updated docstrings to reflect that _paperforge_paths no longer returns records key
2026-05-07 19:22:51 +08:00
Research Assistant
4e30c512ca fix(46-index-path-resolution): update tests for removed LIBRARY_RECORDS and config-resolved paths
- test_base_views.py: Replace LIBRARY_RECORDS placeholder tests with LITERATURE/CONTROL_DIR
- test_migration.py: Use config-resolved lit_rel instead of hardcoded 'Literature/' prefix
2026-05-07 19:03:04 +08:00
Research Assistant
5b037efb40 fix(46-index-path-resolution): fix config env var typo, library_records path, and CONFIG_PATH_KEYS (PATH-02, PATH-03, PATH-04)
- PATH-03: Fix env var name from paperforgeRATURE_DIR to PAPERFORGE_LITERATURE_DIR
- PATH-02: library_records now returns control / 'library-records' matching its docstring
- PATH-04: Add skill_dir and command_dir to CONFIG_PATH_KEYS for migration coverage
- Update test_config.py assertion to use corrected env var name
2026-05-07 19:00:04 +08:00
Research Assistant
aee2f33678 chore: complete v1.8 milestone + fix discussion tests
v1.8 (Phases 31-36): deep-reading mode detection + rendering,
AI discussion recorder, bug fixes, integration verification, jump button
v1.9 (Phases 37-41): frontmatter rationalization, workspace stabilization,
Base view fix, library-record deprecation, plugin dashboard sync

Test fixes: discussion.py _find_paper_metadata uses paperforge_paths
index resolution; test fixtures create canonical index
2026-05-07 10:20:16 +08:00
Research Assistant
7cee483607 chore: complete v1.9 Frontmatter Rationalization & Library-Record Deprecation
Milestone v1.9 — 5 phases, 28 requirements, 188 tests passing.

Key changes:
- Frontmatter rationalization: slimmed formal note frontmatter (28→16 fields), created per-workspace paper-meta.json
- Library-record deprecation: removed library_record_markdown(), sync no longer creates library-records
- Workspace stabilization: unconditional workspace creation, fulltext bridge, discussion.py reads canonical index
- Base view fix: removed ghost lifecycle fields, restored workflow flags, Literature/ folder filter
- Plugin sync: version badge reads paperforge_version from index envelope

Archived: .planning/milestones/v1.9-ROADMAP.md, .planning/milestones/v1.9-REQUIREMENTS.md
2026-05-07 10:11:42 +08:00
Research Assistant
c2c0e53e5a test(35-01): add failing tests for discussion recorder
- 7 tests covering record_session() creation, append, error handling, CJK encoding, atomic writes, and CLI invocation
2026-05-06 23:26:20 +08:00
Research Assistant
f01f07633d fix: honor user-provided zotero path in setup informational checks 2026-05-06 22:45:23 +08:00
Research Assistant
2211b9561b chore: merge pyproject.toml packaging fix and upstream setup_wizard tests from release/v1.6-core-slice 2026-05-06 22:23:06 +08:00