news 2026/9/23 8:13:28

obsidian-livesync 仓库的 AI 编码助手规范:读懂 AGENTS.md 中的协作、风格与发布纪律

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
obsidian-livesync 仓库的 AI 编码助手规范:读懂 AGENTS.md 中的协作、风格与发布纪律
  • 数据同步

【免费下载链接】obsidian-livesync

项目地址:https://gitcode.com/gh_mirrors/ob/obsidian-livesync
点击查看免费下载

Self-hosted LiveSync(obsidian-livesync)是一个用于跨设备同步 Obsidian 库的插件,代码库采用 TypeScript、Svelte 与 PouchDB 的模块化架构。仓库根目录下的 AGENTS.md 是一份面向 AI 编码助手与人类贡献者的协作规范文件,规定了在撰写代码、注释、文档与提交信息时必须遵守的一致性准则。阅读本文后,你将掌握该仓库的必读参考资料、文档措辞约定、核心架构约束、本地验证命令以及版本发布纪律,能够以符合项目预期的方式参与开发与审查。

AGENTS.md 的定位与工作方式

AGENTS.md 本身是仓库对"自动编码代理"的行为约束说明。它以"When working on this repository (writing code, comments, documentation, or commits), you MUST follow these guidelines"开篇,将规范性要求划分为四个层次:

  1. 改动文档、面向用户的文本或设置之前必须先阅读的参考文件;
  2. 文档与面向用户文本的措辞和拼写规则;
  3. 技术与架构层面的硬性约束;
  4. 提交代码前必须执行的本地验证命令。

在 devs.md 中,这些规则被进一步落实为具体的工程实践,例如测试基础设施的分类(单元测试、集成测试、CLI E2E、真实 Obsidian E2E)与模块化架构的演进方向。因此,AGENTS.md 可以视为"开发者入口",devs.md 则是其展开的工程手册。

改动前必读的五个参考文件

AGENTS.md 要求在任何改动开始之前,按顺序阅读以下文件(路径均已转换为仓库根目录相对路径):

参考文件提供的信息
docs/terms.md文档风格与词汇约定(英式拼写、标点、术语)
docs/glossary.md面向用户、运维、开发与设计术语的稳定定义
docs/settings.md 与 docs/settings_ja.mdUI 设置项及其设置键的映射关系
docs/troubleshooting.md故障排查指南与常见恢复步骤(flag files、SCRAM 状态等)
devs.md开发工作流、模块架构与测试基础设施

其中 docs/glossary.md 值得特别留意:它记录了诸如Chunk(存储于数据库或对象存储中用于高效同步的数据分片)、Metadata(存储文件属性、大小、路径并引用 Chunks 的文档)、Fast Setup (Simple Fetch)Flag filesScram SwitchesSetup URI等项目的专属含义,是阅读代码与撰写文档时避免概念混淆的基础。术语表还区分了"面向用户与运维的术语"和"开发者与设计术语"两类,后者(如 Active publication、Admission、Replicator provider definition)可能不会出现在 UI 中,但用于架构文档与代码评审。

文档与面向用户文本的措辞规则

AGENTS.md 对文档和用户可见文本提出了严格的风格约束,这些规则在 docs/terms.md 中有完整的披露与维护说明:

  • 英式拼写(British English):全部文档与用户消息使用英式英语,倾向使用-ise-isation后缀而非-ize-ization,例如initialisationsynchronisationorganisation;如有疑问可以参考 BBC News Styleguide。
  • 牛津逗号(Oxford Comma):三个及以上项目的列表使用序列逗号,例如写settings, snippets, and themes而非settings, snippets and themes
  • 逻辑标点(Logical Punctuation):标点符号放在引号外,除非它本身属于被引用的文本,例如写'dialogue'而不是'dialogue,'
  • 不使用缩略形式:正文中写do not而不是don't,写cannot而不是can't,写is not而不是isn't
  • 引号风格:正文优先使用单引号',仅在需要时(如 JSON 代码块内)使用双引号。
  • 术语拼写:面向用户文本与一般文档使用dialogue,仅在源码(类名、方法名)中使用dialog;面向用户文本使用带连字符的plug-in,仅在代码文件、配置设置或技术语境中使用plugin
  • 回复语言:始终以用户提问所用的语言回复用户。

此外,docs/terms.md 补充了一条重要惯例:HTML、CSS、JavaScript 等领域的惯用术语与所用技术语言保持一致(如color而非colour),且尽量使用肯定形式(如Discard而非Do not keep)。

技术与架构层面的硬性约束

数据库结构:Metadata 与 Chunks 分离

Self-hosted LiveSync 将文件拆分为Metadata(文件属性、大小、路径)与Chunks(实际内容)两类文档,禁止将原始内容直接存入 metadata 文档。这一设计在 docs/glossary.md 的 "Chunk / Chunks" 与 "Metadata" 词条中得到印证,并在 devs.md 的 "Database Operations" 一节进一步说明:EntryDoc覆盖文件 Metadata、Chunks、数据库版本信息、Milestone 信息、Node 信息与 Chunk Packs。理解这一分离是排查"size mismatch"(大小不匹配)类问题的前提——它描述的正是文件 Metadata 与 Chunks 中存储的内容不一致的状态。

设置与恢复:Fast Setup 与 Flag files

AGENTS.md 明确指出两条恢复相关的核心规则:

  • Fast Setup(Simple Fetch)是次要设备初始复制的首选流程。它利用基于流的复制获得更高速度,并延迟本地文件回映(delayed local file reflection)以抑制临时性同步警告。详细流程见 docs/tips/fast-setup.md。
  • Flag files(如redflag.mdredflag2.mdredflag3.md)位于 Vault 根目录,用于控制启动序列并触发自动化的 fetch/rebuild 任务。

源码层面,src/serviceFeatures/redFlag.ts 将这一机制实现为带优先级的FlagFileHandler:SCRAM 挂起处理器优先级为 5,fetch-all 处理器优先级为 10,rebuild-all 处理器优先级为 20;三个处理器通过useRedFlagFeatures注册到appLifecycle.onLayoutReady事件上。可读的现代名称flag_fetch.mdflag_rebuild.md在 docs/recovery.md 的旗标参考表中与旧名称redflag3.mdredflag2.md等价:

Vault 根目录下的文件效果
redflag.md挂起普通 LiveSync 工作以便诊断,需手动移除
flag_fetch.mdredflag3.md预约从所选远程执行Reset Synchronisation on This Device
flag_rebuild.mdredflag2.md预约Overwrite Server Data with This Device's Files;无中心远程时执行本地 P2P 准备

Flag files 本身被排除在同步之外;fetch 与 rebuild 旗标会在调度工作流完成或安全取消后移除,而失败 Fast Setup 会保留 fetch 旗标以便后续启动重试。恢复流程的完整说明见 docs/recovery.md。

子仓库:livesync-commonlib 是外部权威包

AGENTS.md 要求将@vrtmrz/livesync-commonlib视为外部权威包:修改应在该包的仓库中进行,验证打包产物与下游 LiveSync 消费方,再在本仓库更新精确依赖版本;禁止在本仓库重建src/lib源码镜像或生成_types回退。从 package.json 可以看到它作为精确版本依赖被锁定("@vrtmrz/livesync-commonlib": "0.1.23"),而 devs.md 进一步说明共享同步代码由该包编译与类型化,本仓库不编译 Commonlib 源码,也不提交回退声明。

应用目录划分

src/apps 目录包含相互独立的应用模块:

  • cli:命令行界面应用,其单元测试与端到端测试在 src/apps/cli 内通过本地的package.json脚本运行;
  • webapp:基于 Web 的应用;
  • webpeer:基于 Web 的对等实用工具。

在 package.json 的 workspaces 字段中可以看到这三个目录被声明为 npm workspaces,同时@vrtmrz/livesync-commonlib的代码被cliwebappwebpeer及外部工具共享,是平台无关同步逻辑的载体。

提交前的验证命令

AGENTS.md 要求提交代码前在本地运行验证脚本,package.json 中给出了这些命令的完整定义:

命令作用
npm run check综合代码验证:依次执行类型检查(tsc-checktsc-check:apps)、ESLint(lintlint:communitylint:community:tools)、Svelte 检查(svelte-check)与兼容性检查(check:compatibility
npm run test:unit使用 Vitest 运行快速本地单元测试
npm run test:unit:coverage需要单元测试覆盖率时使用
npm run build编译生产 bundle(main.js
npm run dev开发模式下的监听/自动重建任务

AGENTS.md 特别提醒:应针对所改动边界运行聚焦的集成测试、CLI E2E 或真实 Obsidian E2E 命令,并且只启动该命令所需的 Docker 服务。在 devs.md 中可以看到测试基础设施的全貌:

  • 单元测试*.unit.spec.ts):运行于 Node.js,与实现文件同目录放置,通过npm run test:unit执行;
  • 集成测试*.integration.spec.ts/*.integration.test.ts):针对真实 CouchDB 实例运行,通过npm run test:integration执行;凡是与远程数据库交互的新功能都强烈要求编写集成测试;
  • CLI E2Esrc/apps/cli/testdeno/):宿主无关的消费方工作流,如npm run test:e2e:cli:p2p验证 P2P 场景;
  • 真实 Obsidian E2Etest/e2e-obsidian/):启动真实 Obsidian 与临时 Vault,用于启动序列、Vault 回映、RedFlag 流程、Fast Setup 等依赖 Obsidian 本身的行为,如npm run test:e2e:obsidian:two-vault-sync
  • Docker 服务:CouchDB 与 MinIO(S3),通过npm run test:docker-all:start/stop管理。

深入:npm run check 的组成

npm run check并非单一工具,而是一条命令链(见 package.json 第 26 行):

npm run tsc-check && npm run tsc-check:apps && npm run lint && npm run lint:community -- --quiet && npm run lint:community:tools && npm run svelte-check && npm run check:compatibility

其中tsc-check:apps会分别对src/apps/browsersrc/apps/clisrc/apps/webappsrc/apps/webpeer执行独立的 TypeScript 项目检查,这呼应了 AGENTS.md 中"应用目录相互独立"的约束;check:compatibility则调用 utils/check-compatibility.js 对构建产物进行 iOS 15 兼容性验证。

从源码看 AGENTS.md 背后的实现细节

Fast Setup 的两阶段决策流

src/serviceFeatures/redFlag.simpleFetch.ts 将 Fast Setup 实现为两阶段对话。第一阶段选择数据处理方式:

  • Compare time and take newerSIMPLE_FETCH_STAGE1_NEWER_WINS):按修改时间比较并取较新版本;
  • Overwrite all with remote filesSIMPLE_FETCH_STAGE1_REMOTE_WINS):远程数据为唯一事实来源;
  • Use the detailed flowSIMPLE_FETCH_STAGE1_DETAILED):退回传统的分步设置向导。

第二阶段根据第一阶段的选择配置冲突与删除规则:remote-wins 路径下可选择是否删除本地独有文件(ExtraOnRemote.DELETE_LOCAL_MISSING),newer-wins 路径下可选择是否删除远端已删除的本地文件(ExtraOnLocal.DELETE_DB_DELETED)。用户的选择会被记入simple-fetch-mode小配置(setSmallConfig),下次启动时直接复用。实际执行时,流程调用rebuilder.$fetchLocalDBFast(false)完成快速数据库下载,再调用 Commonlib 的synchroniseAllFilesBetweenDBandStorage执行全量扫描以将数据库变更回映到本地文件,这与 docs/tips/fast-setup.md 中 Step 3 的描述完全对应。

构建期的平台文件替换

AGENTS.md 与 devs.md 提到的文件命名约定——.platform.ts后缀在生产构建中替换为.obsidian.ts.dev.ts替换为.prod.ts——由 esbuild.config.mjs 中的moduleAliasPlugin实现(第 33-71 行)。该插件在生产模式下拦截带.dev.platform的导入路径并解析到对应替代文件。同一文件还实现了PATHS_TEST_INSTALL自动复制逻辑:通过.env中的PATHS_TEST_INSTALL(Unix 用:分隔、Windows 用;)指定测试 Vault 的插件目录后,开发构建会自动把main.jsstyles.css与修改过版本的manifest.json复制过去,方便实时调试。

国际化(i18n)工作流

虽然 AGENTS.md 未展开,但 devs.md 记录了仓库的翻译工作流:先在 src/common/messagesYAML 编辑人类可读的 YAML 文件,运行npm run i18n:bake将其编译为 JSON 与 TypeScript 常量,再使用$msg()$t()$f调用翻译。支持的语言包括def(英语)、deesfrhejakoruzhzh-tw,与 src/common/messages 目录下的语言文件一一对应。Commonlib 负责消息的英文权威定义,LiveSync 提供多语言应用目录并注入翻译器;未翻译的键回退到 Commonlib 英语。

日志级别与通知归属

devs.md 的 "Diagnostic and notice ownership" 一节对日志使用给出了清晰的边界:内部操作应在LOG_LEVEL_VERBOSE记录详细诊断,并以类型化结果让调用方区分 complete、partial、failed 三种结局;只有掌握交互上下文的应用边界才应提升到LOG_LEVEL_NOTICE向用户展示,且应描述可见后果与下一步操作,而不是暴露内部阶段名。例如"好的应用通知"是Not all files could be synchronised. Check the affected files. Generate a report to review the detailed log.,而不是Local database initialisation did not complete.LOG_LEVEL_DEBUG仅供调试,不出现在默认构建中;开发模式会在.obsidian/下创建ls-debug/目录输出调试信息,但这会带来显著的性能开销。

贡献与发布纪律

AGENTS.md 的贡献与发布部分强调了几条与代码风格同样重要的流程约束:

  • Unreleased 变更记录:日常开发期间 updates.md 顶部保持## Unreleased;功能或修复 PR 若影响用户,应在同一 PR 内更新该节;发布时替换为目标版本标题(如## 0.25.81)并在上方新建空的## Unreleased
  • 仅记录用户可见变更:避免罗列纯内部重构、维护杂务、生成文件变更与依赖升级,除非它们影响用户;嵌入插件的updates.md只保留大约最近五个已发布版本,更早的版本原样归档到 docs/releases 对应发布线。
  • 预发布版本策略:使用 SemVer beta 标识(如1.0.0-beta.0),从不可变且已评审的 tag 发布预发布,不得替换最新稳定版;1.0.0-rc.0保留给功能与契约冻结的首个候选版本。
  • 发布工作流:维护者通过Prepare Release PRFinalise Release TagsRelease Obsidian Plugin三个 GitHub Actions 工作流完成版本生命周期,最终发布版本需经过 BRAT 验证。发布操作的完整清单见 devs.md 的 "Release Cheat Sheet"。
  • 依赖升级:谨慎升级依赖,升级后用 diff 工具检查产物,确保构建输出只有预期内的变化(避免意外漏洞)。
  • 开源优先:新功能应考虑存在 OSS 实现,避免使用可能限制使用的专有服务或 API;连接新型服务器的功能应要么有对应的 OSS 实现,要么在受控的责任与限制下管理(例如通过客户端加密、自行审计服务器来缩减监控面)。

对贡献者与 AI 助手的实用建议

综合 AGENTS.md、devs.md 与源码,参与该仓库时可遵循以下最小工作流:

  1. 改动前依次阅读 docs/terms.md、docs/glossary.md、docs/settings.md、docs/troubleshooting.md 与 devs.md,确保术语与拼写一致;
  2. 面向用户的文本坚持英式拼写、牛津逗号、无缩略形式,区分dialogue/dialogplug-in/plugin
  3. 涉及远程数据库交互的功能必须伴随*.integration.spec.ts*.integration.test.ts集成测试;涉及启动序列、Vault 回映等 Obsidian 行为的功能优先使用真实 Obsidian E2E 脚本;
  4. 提交前运行npm run checknpm run test:unit,对改动边界运行聚焦测试,只启动所需 Docker 服务;
  5. 功能或修复 PR 同步更新 updates.md 的## Unreleased节;
  6. 涉及共享同步逻辑的改动,遵循"先改 Commonlib、验证打包产物、再更新本仓库精确依赖"的边界,不在本仓库重建源码镜像。

AGENTS.md 的独特价值在于:它把"人读的贡献规范"与"AI 助手的执行约束"合而为一,并将最重要的判断标准下放到仓库自身的术语表、恢复文档与测试基础设施中。对希望参与 Self-hosted LiveSync 开发的读者而言,这份文件既是入门地图,也是贯穿始终的行为准则。

  • 数据同步

【免费下载链接】obsidian-livesync

项目地址:https://gitcode.com/gh_mirrors/ob/obsidian-livesync
点击查看免费下载

相关推荐

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/23 8:13:15

2026软考高项备考指南与资源解析

1. 2026软考高项备考资源深度解析作为一名连续三年参与软考高项阅卷工作的专业人士,我深知备考资源的质量直接影响考生通过率。这份2026年高级信息系统项目管理师合集,从内容架构来看确实抓住了备考的核心痛点。不同于市面上零散的资料拼凑,它…

作者头像 李华
网站建设 2026/9/23 8:12:52

图像测量仪在发动机零件在线测径中的原理与应用解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/23 8:09:16

Python enumerate函数详解:高效遍历与索引管理

1. 枚举遍历的基础认知在Python编程实践中,我们经常需要同时获取序列元素的索引和值。传统做法是使用range(len(sequence)),但这种方式既不够优雅又容易出错。enumerate()函数的出现完美解决了这个痛点,它像给序列元素贴上了"身份证号&q…

作者头像 李华
网站建设 2026/9/23 8:08:55

.NET 后端如何通过 MCP 协议让 AI 安全调用你的业务接口

让 AI 直接调你的 .NET 接口——这句话放到一年前,可能还会被当成“大模型幻觉吹出来的需求”。但现在你再提,业内已经有一个非常具体的协议在支撑了,就是 MCP(Model Context Protocol,模型上下文协议)。作…

作者头像 李华