feat(wiki): sync upstream v2026.10.4 core maintenance
Selectively port source hashing, locked manifest/memory writes, path-aware link lint and graph analysis, and revision-checked staging from upstream 4f457e154653756b04802d5aeb25c20f42b4770c. Record source hashes and exclusions. Preserve local archive/catalog citations, curated manifest metadata, config location, file-index and MCP behavior. Wire maintenance guidance into four skills without migrating vault contents or changing running services. Validation: 609 tests passed, including existing MCP/file-asset regressions and imported upstream maintenance tests. Read-only vault status left shared metadata hashes unchanged. Wiki MCP remains inactive; orders MCP is active.
This commit is contained in:
@@ -0,0 +1,113 @@
|
||||
{
|
||||
"upstream": "https://github.com/Ar9av/obsidian-wiki",
|
||||
"release": "v2026.10.4",
|
||||
"commit": "4f457e154653756b04802d5aeb25c20f42b4770c",
|
||||
"scope": "core-maintenance",
|
||||
"source_sha256": {
|
||||
"obsidian_wiki/vault.py": "604e65a01eb44438eea402f00f6c6c534e06856c20fe6c6b5ceb47e69291ee4a",
|
||||
"obsidian_wiki/cache.py": "f410ac542ce47719b5c8aa687bcd8beafd7d70a6f7db3cd2df24c9030628a9f6",
|
||||
"obsidian_wiki/clock.py": "456749a083b29a51820332970d9f07ee49bfaec6314cc51449672c8c96a53dce",
|
||||
"obsidian_wiki/memory.py": "81fc4e28b8cdd761d6be23d0de6e6b35dad49501ebb0ec9e3411f18bf23a3170",
|
||||
"obsidian_wiki/links.py": "79c2ebb69b9ded9823bffebf270b40b520e640e740b57a0f7909deb66cc5e980",
|
||||
"obsidian_wiki/lint.py": "482a69b5a7ef15c45d5054efec31c68f23e7906f62fcf9dd640987deac82c19e",
|
||||
"obsidian_wiki/graph_analysis.py": "a0932567affc219b7a7692036b389ec9674b8b9e1c94f72ce27fcc69078cb25c",
|
||||
"obsidian_wiki/provenance.py": "ce39dca4a9069814ee0b3dd779ebdcf32942d510048b44ed7b71fa9521734b9b",
|
||||
"obsidian_wiki/temporal.py": "9e31cdd08b1dabbc6d94590db7b5b2295923d8f33e299d9179d84820955c3395",
|
||||
"obsidian_wiki/trust.py": "c397465fcdcb2df31c0ea64ba65ef411532161b174f170be2d9662d8e75745cd",
|
||||
"obsidian_wiki/staging.py": "626d6f059ec089ca23981d1e9c3d9ba90266c74292ee313e654ac713eb38dbb7"
|
||||
},
|
||||
"cli_functions": [
|
||||
"SchemaOptions",
|
||||
"_memory_fields",
|
||||
"_memory_takeaways",
|
||||
"_note_source_ambiguity",
|
||||
"_print_lint",
|
||||
"_read_config_file",
|
||||
"_report_empty_local_vault",
|
||||
"_resolve_schema_command_context",
|
||||
"_resolve_source_arg",
|
||||
"_schema_cli_values",
|
||||
"_schema_csv",
|
||||
"_schema_options",
|
||||
"_schema_source_value",
|
||||
"_source_candidates",
|
||||
"_timezone_report",
|
||||
"_verb_and_fields",
|
||||
"cmd_cache_check",
|
||||
"cmd_cache_hash",
|
||||
"cmd_cache_update",
|
||||
"cmd_graph_analyse",
|
||||
"cmd_lint",
|
||||
"cmd_memory",
|
||||
"cmd_projects_check",
|
||||
"cmd_staging"
|
||||
],
|
||||
"commands": [
|
||||
"graph-analyse",
|
||||
"cache-check",
|
||||
"projects-check",
|
||||
"cache-update",
|
||||
"cache-hash",
|
||||
"lint",
|
||||
"memory",
|
||||
"staging"
|
||||
],
|
||||
"excluded": "upstream server, setup/hooks, session brain, retrieval platform and bulk vault migrations",
|
||||
"test_exclusions_outside_scope": {
|
||||
"clock": [
|
||||
"TestDocs",
|
||||
"test_scaffold_writes_the_key_and_stamps_in_the_zone",
|
||||
"test_setup_cli_records_the_zone",
|
||||
"test_setup_cli_refuses_a_bad_zone_before_touching_anything"
|
||||
],
|
||||
"memory": [
|
||||
"test_a_scaffolded_vault_is_born_migrated",
|
||||
"test_a_scaffolded_vault_carries_the_adoption_record"
|
||||
],
|
||||
"links": [
|
||||
"obsidian_wiki.graphrag",
|
||||
"test_graph_query_index_matches_the_graph"
|
||||
],
|
||||
"lint": [
|
||||
"test_invalid_configured_required_trust_field_fails_closed_for_all_cli_paths",
|
||||
"test_empty_configured_schema_values_fail_closed_for_all_cli_paths",
|
||||
"test_blank_config_schema_source_cannot_be_masked_by_valid_cli_source",
|
||||
"test_distributed_schema_config_contract_names_all_four_variables",
|
||||
"test_correction_contract_requires_temporal_authority_and_immutable_hash_check"
|
||||
],
|
||||
"graph_analysis": [
|
||||
"TestGitignoreBackfill"
|
||||
],
|
||||
"trust": [
|
||||
"test_owner_lifecycle_cli_record_then_check",
|
||||
"test_invalid_review_timestamp_is_rejected_by_record_cli",
|
||||
"test_trust_record_cli_requires_explicit_approval",
|
||||
"test_trust_record_and_check_cli_round_trip",
|
||||
"test_owner_schema_cli_excludes_then_removes_no_confidence_ledger_entry",
|
||||
"test_trust_record_all_human_output_lists_no_confidence_without_removal",
|
||||
"test_trust_record_all_human_output_warns_when_rebuild_removes_stale_entry",
|
||||
"test_trust_record_page_human_output_warns_when_stale_entry_is_removed",
|
||||
"test_trust_record_page_human_output_reports_zero_removals_without_warning",
|
||||
"test_explicit_vault_cli_override_reports_cli_schema_source",
|
||||
"test_partial_trust_record_does_not_approve_other_stale_pages",
|
||||
"test_partial_trust_record_reports_malformed_ledger_without_traceback"
|
||||
],
|
||||
"temporal": [
|
||||
"obsidian_wiki.graphrag",
|
||||
"test_expired_page_leaves_retrieval_but_stays_in_the_graph",
|
||||
"test_query_as_of_returns_the_page_that_was_true_then",
|
||||
"test_include_historical_ranks_both",
|
||||
"test_temporal_keys_are_absent_on_pages_that_do_not_opt_in",
|
||||
"test_structural_intents_still_see_historical_pages",
|
||||
"test_graph_query_cli_accepts_as_of",
|
||||
"test_cli_rejects_a_malformed_as_of"
|
||||
]
|
||||
},
|
||||
"local_adaptations": [
|
||||
"Keep existing ~/.obsidian-wiki/config location and adapt the memory CLI fixture accordingly",
|
||||
"Exclude local source, metadata, inbox and bot-export directories from knowledge pages",
|
||||
"Resolve _sources/archive and _sources/catalog citations without changing file extensions",
|
||||
"Preserve pages_produced when cache-update omits --pages",
|
||||
"Keep local CLI, MCP dependency range, service gating and curated source-registry metadata"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,49 @@
|
||||
# 上游关键更新同步
|
||||
|
||||
本次选择性同步 [Ar9av/obsidian-wiki v2026.10.4](https://github.com/Ar9av/obsidian-wiki/releases/tag/v2026.10.4),固定提交 `4f457e154653756b04802d5aeb25c20f42b4770c`。这是核心维护能力的移植,不表示本分支完整等同于该版本。来源哈希、移植的 CLI 函数和未纳入的测试范围记录在 `upstream-sync.json`。
|
||||
|
||||
| 纳入能力 | 实际作用 |
|
||||
| --- | --- |
|
||||
| `cache-check` / `cache-update` / `cache-hash` | 用内容哈希识别变化;manifest 锁和原子写入;兼容列表/字典及旧哈希格式 |
|
||||
| `projects-check` | 按已记录提交检查项目资料是否落后 |
|
||||
| `memory` | 统一维护 index、log、hot;提供只读检查、显式迁移及备份 |
|
||||
| `lint` / `graph-analyse` | 正确区分不同项目中的同名页,解析相对链接,忽略代码示例里的伪链接;检查结构、时效与来源信息 |
|
||||
| `staging` | 暂存晋升前校验已审阅的 staged/live 内容哈希;冲突时退出并保留文件 |
|
||||
|
||||
同步了 `llm-wiki`、`wiki-ingest`、`wiki-lint`、`wiki-stage-commit` 的相关执行指引,详细协议见 `.skills/llm-wiki/references/CORE-MAINTENANCE.md`。图分析是显式调用的维护工具,不接入远程问答或自动调度。
|
||||
|
||||
## 本地兼容
|
||||
|
||||
- 保留 `~/.obsidian-wiki/config`、现有 setup、file-index、bot-view 和 MCP 命令。
|
||||
- 保留 `_sources/archive` / `_sources/catalog`、原文件索引、结构化产品字段及 ACL。知识页遍历排除原始资料、元数据、收件箱和导出副本;归档文件仍可被引用。
|
||||
- `cache-update` 未传 `--pages` 时保留已有页面关联;显式传入时替换 `pages_produced`。自定义元数据需在同一个 manifest 锁内读取、合并并原子写回。registry 和 SQLite 索引仍由本地 ingest 流程维护。
|
||||
- 未改动已有知识页面、manifest、registry、SQLite 或 index/hot;未启动 Wiki MCP,未修改独立订单项目。
|
||||
- 未导入上游 HTTP 服务、MCP 2.x 依赖、会话 hooks、session brain、GraphRAG 查询链路或全量数据迁移。
|
||||
|
||||
## 使用与迁移
|
||||
|
||||
从本项目虚拟环境执行,避免误用系统中另一个版本:
|
||||
|
||||
```bash
|
||||
.venv/bin/python -m obsidian_wiki lint /path/to/vault --json
|
||||
.venv/bin/python -m obsidian_wiki memory status --vault /path/to/vault --json
|
||||
.venv/bin/python -m obsidian_wiki memory migrate --vault /path/to/vault --json
|
||||
.venv/bin/python -m obsidian_wiki staging list --vault /path/to/vault --json
|
||||
```
|
||||
|
||||
这些检查不重写知识库。`memory migrate` 默认只预览;只有明确决定迁移数据格式后才加 `--apply`,届时先备份旧 index/hot。未迁移的库继续保留现有布局,使用共享锁合并必要修改。框架升级本身不触发该迁移。
|
||||
|
||||
lint 的旧库模式把 trust ledger 缺失等问题报告为警告。若以后启用严格审阅,需要独立设计实际审阅流程,不能为了消除警告伪造置信度。自定义归档目录可加入 `.okignore`,其非标准引用需单独核查。
|
||||
|
||||
## 验证与下次同步
|
||||
|
||||
```bash
|
||||
uv sync --extra mcp --group dev
|
||||
PYTHONPATH="$PWD" .venv/bin/python -m pytest tests -q
|
||||
```
|
||||
|
||||
测试包括原有文件检索、ACL、MCP query/ingest 和运维回归,以及本次核心模块的上游测试;另有本地兼容测试验证归档排除、引用解析与 manifest 字段保留。测试使用临时知识库,不启动实际服务。
|
||||
|
||||
本次验证结果:**609 项测试通过**。实际知识库只执行了 `memory status` 只读检查,index/hot/log、manifest、registry、SQLite 的前后 SHA-256 一致。Wiki MCP 保持 inactive,独立订单 MCP 保持 active。
|
||||
|
||||
下次以 `upstream-sync.json` 的提交和源文件哈希作比较基线,逐模块检查新提交,再重放列出的本地适配。不要直接覆盖 `.skills`、运行上游 setup、切换服务依赖或批量改写知识库。上游未纳入模块的测试明确列入排除清单,不能把它们的缺席解释为整版上游已通过验证。
|
||||
Reference in New Issue
Block a user