Commit graph

134 commits

Author SHA1 Message Date
Research Assistant
798e048a8d feat(sync): auto-detect orphan papers after sync, show modal in Obsidian
- prune.py: _enrich_orphan_preview() reads note frontmatter for metadata
- sync_service.py: always run dry-run prune, include in result
- sync.py: write sync-orphan-state.json for plugin consumption
- main.js: add checkOrphanState() + PaperForgeOrphanModal with select/toggle
- styles.css: orphan modal styles (list, tags, dimmed rows)
- cli.py: add --keys to prune command for targeted deletion
2026-05-19 00:31:19 +08:00
Research Assistant
a407520961 feat(prune): add interactive selection before --force delete 2026-05-18 23:28:04 +08:00
Research Assistant
528a8255bf chore: commit session work before hotfix switch 2026-05-18 22:47:30 +08:00
Research Assistant
e74f9139f3 perf(index): add export hash check to skip rebuild when BBT unchanged; remove redundant refresh_paper 2026-05-18 22:38:27 +08:00
Research Assistant
48b564594c fix: remove undefined resolved_pdf ref, use pdf_attachments instead 2026-05-18 22:27:33 +08:00
Research Assistant
ad445a52d9 fix(sync): silent vector resume; nopdf resets to pending when PDF reappears 2026-05-18 22:26:48 +08:00
Research Assistant
fad6eff83e fix(sync): memory/vector rebuilds are best-effort, not sync result; fix has_deep_reading_content import in asset_index.py 2026-05-18 22:09:42 +08:00
Research Assistant
d24f2e822d feat(prune): standalone CLI command
Also fix pre-existing import: has_deep_reading_content moved to obsidian_frontmatter
2026-05-18 21:55:01 +08:00
Research Assistant
20ff03ed8e fix(prune): protect dir iteration, add OSError handling, improve test coverage 2026-05-18 21:53:14 +08:00
Research Assistant
f10d36d205 feat(prune): core orphan paper cleanup module 2026-05-18 21:48:18 +08:00
Research Assistant
5ba9ac92c3 feat(discussion): remove JSON output and markdown escaping 2026-05-18 21:09:54 +08:00
Research Assistant
18aa0073c1 Merge branch 'paperforge-stabilization'
# Conflicts:
#	paperforge/memory/vector_db.py
2026-05-18 18:47:07 +08:00
Research Assistant
e8bd3c4131 refactor: update worker/asset_index.py and memory/runtime_health.py imports to embedding package 2026-05-18 17:21:43 +08:00
Research Assistant
56c1871eba refactor(worker): convert vector_db.py to deprecated forwarding shim 2026-05-18 17:19:23 +08:00
Research Assistant
ed95e0f565 feat: runtime contract hardening + skill/command truth alignment (Package A+B)
Atomic snapshots, canonical index mutation serialization, sync post-clean truth,
plugin path config-awareness, embed stop signal honesty, full snapshot bootstrap,
pf_ prefix unification, workflow command/lifecycle/path corrections,
mechanical/cognitive route separation with unknown-command guard.
2026-05-16 22:38:43 +08:00
Research Assistant
3581bbfba0 feat: Python writes canonical runtime snapshot files for JS reads 2026-05-15 23:06:13 +08:00
Research Assistant
62cbb6110b feat: retrieve empty index guard, embed status check, HF download hint 2026-05-14 21:59:25 +08:00
Research Assistant
2c71643e41 fix: remove ghost settings code, add vector deps, add embed preflight 2026-05-14 21:56:28 +08:00
Research Assistant
5f07a8f729 fix: reset nopdf OCR status to pending when paper re-enters queue 2026-05-14 18:43:48 +08:00
Research Assistant
df135bff68 refactor: unify skills into paperforge compound skill (6 workflows) 2026-05-14 17:56:25 +08:00
Research Assistant
886049dde3 feat: vector auto-embed on OCR complete + Uninstall button cache detection 2026-05-13 18:58:00 +08:00
Research Assistant
b8d3daf66f perf: executemany batching in builder + file read consolidation 2026-05-13 17:17:08 +08:00
Research Assistant
8babd361f2 perf: single frontmatter parse in _build_entry 2026-05-13 17:03:55 +08:00
Research Assistant
e91dfd8c45 perf: refresh_paper accepts entry dict, skip full index read 2026-05-13 16:58:39 +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
2bb0c428d7 feat(frontmatter): collection_path as YAML list, add collection_tags; runtime skill deploy; OCR progress notices 2026-05-12 02:03:31 +08:00
Research Assistant
696cd6f15f fix(ocr): return real exit code, add real-time progress output to stdout, show Obsidian Notices 2026-05-12 00:55:30 +08:00
Research Assistant
49ee42f3f6 fix: use item['title'] instead of undefined entry in self-healing migration 2026-05-11 21:22:11 +08:00
Research Assistant
a9117a0f8b fix: update ocr auto_analyze and ld_deep search for {key}.md filenames with fallback 2026-05-11 21:13:27 +08:00
Research Assistant
5aecdf93dd feat: change sync to {key}.md, add aliases frontmatter, self-healing rename in migrate 2026-05-11 21:12:29 +08:00
Research Assistant
0c91bded54 feat: change formal note filename to {key}.md, add self-healing migration + alias injection 2026-05-11 21:11:12 +08:00
Research Assistant
c28de1bce5 fix: force UTF-8 encoding for all subprocess and stdout on Windows, fix pre-existing logger bug 2026-05-11 19:16:18 +08:00
Research Assistant
f031fd26ef fix(skill): split vault-browse from paper-search, add browsing flow to vault-knowledge 2026-05-11 19:03:38 +08:00
Research Assistant
7bb32f2571 feat: PyPI publish support — install paperforge from PyPI with git fallback 2026-05-11 18:04:17 +08:00
Research Assistant
4aeb7e18e6 fix(base): use !zotero_key.isEmpty() filter syntax 2026-05-11 17:47:05 +08:00
Research Assistant
acd1d21334 fix(base): filter by zotero_key != "" instead of filename exclusion 2026-05-11 17:11:51 +08:00
Research Assistant
4b13d8e8d1 fix(base): exclude fulltext.md from Base views to prevent workspace clutter 2026-05-11 17:10:34 +08:00
Research Assistant
5f8396c483 feat(update): add zip fallback when pip/git update fails (e.g. missing git) 2026-05-11 17:04:30 +08:00
Research Assistant
560c6b5121 hotfix: fix Base filter syntax error, = to == 2026-05-11 16:43:58 +08:00
Research Assistant
08c74fd8da fix: deep_reading_status read from frontmatter, key extraction walkup, remove body status fields
- _build_entry: read deep_reading_status from frontmatter first, body detection fallback

- _extractZoteroKeyFromPath: walk up directory tree for 8-char key (handles ai/discussion.md etc.)

- frontmatter_note: remove duplicate PDF/OCR/deep_reading status from body (frontmatter is source of truth)
2026-05-11 00:52:07 +08:00
Research Assistant
5138a70645 merge: integrate dashboard-refine (deep-finalize + slug-freeze) into skill-refine
Resolved conflicts:
- styles.css: take dashboard-refine (more refined CSS)
- SKILL.md, deep-reading.md, paper-resolution.md: take skill-refine (modular skill redesign)
2026-05-10 23:28:13 +08:00
Research Assistant
c44c16bf80 refactor(skills): simplify skill deployment — single copytree for all platforms
- Remove format dispatch (flat_command/skill_directory/rules_file) — all platforms unified
- skill_deploy.py: 257→81 lines, only AGENT_SKILL_DIRS + copytree + AGENTS.md
- AgentInstaller switches to vault-local paths, removes deploy_commands step
- Remove _deploy_skills dead code in update.py
2026-05-10 23:22:42 +08:00
Research Assistant
c17972a17a fix(sync): freeze workspace slug + frontmatter-only update to prevent deep-reading data loss
- Slug freeze: reuse existing workspace dir when title slug changes in Zotero
- Frontmatter-only: for existing notes, replace only YAML block, never touch body
- extract_preserved_deep_reading: match both ##精读 and ##🔍精读 + skip placeholder-only sections
2026-05-10 22:31:16 +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
5ed7a0c55b fix: remove agent_platform from DEFAULT_CONFIG, use paperforge.json in update 2026-05-10 12:35:24 +08:00
Research Assistant
a12890f8e4 feat: skill auto-deploy in update + Copy Context as pure JS + shared skill_deploy service
- New services/skill_deploy.py: single source of truth for agent skill deployment
  - AGENT_CONFIGS with 9 platforms, all vault-local
  - deploy_skills() with install/update mode (overwrite flag)
  - Used by both setup wizard and update worker
- update.py: _deploy_all_skills() after pip/git/zip update
- setup_wizard.py: delegates skill deploy to shared service
- config.py: add agent_platform default
- main.js: Copy Context + Copy Collection Context now pure JS
  - Uses in-memory _cachedItems / _currentPaperEntry
  - No subprocess spawn, no timeout, no JSON parse errors
- testable.js: remove needsKey/needsFilter from context actions
- commands.test.mjs: update assertions for removed flags
2026-05-10 12:33:23 +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
e9a31705d3 style: ruff format pass across paperforge/ 2026-05-09 22:31:08 +08:00
Research Assistant
9a3cdaa3b8 refactor: eliminate frontmatter regex duplication — route everything through adapter
- adapters/obsidian_frontmatter: +read_frontmatter_bool(note_path, key) public API
- asset_index: delete private _read_frontmatter_bool/_optional copies, import from adapter
- sync_service cleanup methods: raw regex → read_frontmatter_dict()
- ld_deep: fix private worker import → adapter
- config.py paperforge_paths: +config and index keys (domain-collections, formal-library)
- sync_service.run(): pipeline_paths → self.resolve_paths()
2026-05-09 22:30:59 +08:00