Skip to content

Releases: xtenlab/obsidian-writing-buddy

0.1.10

Choose a tag to compare

@onezeroooo onezeroooo released this 23 Sep 20:31

Writing Buddy 0.1.10

Fewer timeouts on phones, and a cleaner review in the Community directory.

Fixes

  • One failed request no longer switches a connection off streaming for the rest of the session. A gateway's error page could look like "streaming refused", after which every long request went out without streaming — and on a phone those are cut off at about a minute. Streaming is now turned off only when a request without it actually succeeds.

Improvements

  • The stylesheet no longer uses the five CSS features the directory flags as partially supported. The activity details, citation links and deleted text in a diff look the same.
  • The vendored memory engine no longer carries the #private lines TypeScript writes into declaration files, which the directory read as unused code. The plugin itself is unchanged.
  • Every release now has a signed provenance attestation, so gh attestation verify main.js --repo onezeroooo/obsidian-writing-buddy can confirm a download came from this repository.

墨伴 · Writing Buddy 0.1.10

手机上更少超时,社区目录里的审查也更干净。

修复

  • 一次请求失败,不会再让这个连接在之后一直不用流式。网关返回的错误页可能被误判为“不支持流式”,之后每个长请求都改走非流式——而在手机上,非流式请求大约一分钟就会被切断。现在只有在非流式请求确实成功之后,才会关掉流式。

改进

  • 样式表不再使用社区目录标为“部分支持”的五个 CSS 特性。活动详情、引用链接和对比里被删除的文字看起来和以前一样。
  • 内置的记忆引擎不再带 TypeScript 写进声明文件的 #private 行,目录曾把它们当成未使用的代码。插件本身没有变化。
  • 每个版本现在都附带签名的来源证明,可以用 gh attestation verify main.js --repo onezeroooo/obsidian-writing-buddy 确认下载的文件来自这个仓库。

0.1.9

Choose a tag to compare

@onezeroooo onezeroooo released this 23 Sep 19:55

Writing Buddy 0.1.9

Whole-manuscript analysis no longer gives up on the first rate limit.

Fixes

  • A whole-manuscript analysis now waits out a rate limit or a dropped connection on every connection type. The waiting was already there, but it only recognised the errors of the retired runtime, so on a direct or gateway connection a single "429" or a single timeout ended the run — even after the whole book had been read. When the server says how long to wait, that wait is used; when it does not, the waits grow from half a minute to five minutes.
  • The final summary waits the same way. If it still cannot be written, you get the notes that were already made instead of nothing.
  • When a run does stop, the message says how many batches are saved. With the same manuscript and model, Continue only runs what is left; nothing already read is paid for again.
  • An endpoint that answers with a page instead of JSON (a proxy's "Bad Gateway", for example) is now reported with its HTTP status, not as "JSON Parse error".

墨伴 · Writing Buddy 0.1.9

全文分析不再因为一次限流就放弃。

修复

  • 全文分析遇到限流或断线时,现在对所有连接类型都会等待后重试。等待机制原本就有,但只认已经退役的旧运行时的错误,所以直连或经网关的连接上,一次 “429” 或一次超时就会让整次分析结束——哪怕全书已经读完。服务器说明了要等多久就按它说的等;没说的话,等待时间从半分钟逐步加长到五分钟。
  • 最后的汇总也会同样等待。实在写不出来时,会把已经做好的分批备忘交给你,而不是什么都没有。
  • 分析中途停下时,提示里会说明已保存了多少批。正文和模型不变时,点「继续」只补跑剩下的部分,已经读过的不会再花一次钱。
  • 接口返回的不是 JSON 而是一个页面时(例如代理的 “Bad Gateway”),现在会报出 HTTP 状态码,而不是 “JSON Parse error”。

0.1.8

Choose a tag to compare

@onezeroooo onezeroooo released this 23 Sep 02:12

Writing Buddy 0.1.8

A lockfile the Community directory can install.

What was wrong, and what this fixes

The directory installs each release with npm ci --ignore-scripts on npm 10
before it reviews the code. Since 0.1.5 that install failed, and when it fails
the review sees a plugin with no type information and reports thousands of
findings against sources that are clean.

The cause was the lockfile. The build pins one version of esbuild, and the
test runner's vite wants a newer one as an optional peer; npm 10 requires the
lockfile to carry a nested copy for that, and npm 11 silently removes exactly
that entry whenever it writes the file. The lockfile was regenerated with npm
10, which put the entry back and changed nothing else. A test now checks the
lockfile for this, and every release is installed with npm 10 before it is
published.

The type definitions 0.1.7 carried under vendor/types/ were a workaround
for the same symptom; with the install working they only added findings of
their own, and they are gone. The released bundle is byte for byte the one
0.1.6 and 0.1.7 shipped.


墨伴 · Writing Buddy 0.1.8

一份社区目录能安装的 lockfile。

问题是什么,这次修了什么

社区目录在审查代码之前,会用 npm 10 对每个版本执行 npm ci --ignore-scripts。
从 0.1.5 起这一步一直失败,而一旦失败,审查看到的就是一个没有任何类型信息的
插件,于是对本来干净的源码报出几千条问题。

原因在 lockfile。构建固定了一个 esbuild 版本,而测试框架的 vite 以可选 peer
的形式要求更新的版本;npm 10 要求 lockfile 里为此保留一份嵌套副本,npm 11 却在
每次写文件时悄悄把这一条删掉。这次用 npm 10 重新生成了 lockfile,那一条回来了,
其他一个字没变。现在有测试专门检查这件事,并且每次发布前都会用 npm 10 安装一遍。

0.1.7 放在 vendor/types/ 下的类型声明是对同一症状的绕路;安装恢复之后它们只会
额外带来自己的问题,已经移除。发布产物与 0.1.6、0.1.7 逐字节相同。

0.1.7

Choose a tag to compare

@onezeroooo onezeroooo released this 23 Sep 01:24

Writing Buddy 0.1.7

A repository that reads correctly without being installed.

Type definitions travel with the source

Automated review of this repository type-checks the sources without
installing their dependencies. Until now that meant nothing resolved:
every value that came from Obsidian or CodeMirror was untyped, and the
review reported over two thousand findings that do not exist when the
dependencies are present.

The declaration files those APIs publish are now carried under
vendor/types/, copied verbatim from the exactly pinned versions in
package.json and listed with their versions and licences in
vendor/types/VENDORED.md. Obsidian supplies these APIs at run time, so
none of this code reaches main.js, and the released bundle is byte for
byte the one 0.1.6 shipped.

Also

  • The LICENSE file is the MIT text again, so licence detection
    recognises it. The exception for the bundled memory kernel is stated in
    the README and in THIRD_PARTY_NOTICES.md, where it belongs.

墨伴 · Writing Buddy 0.1.7

一个不需要安装也能被正确读懂的仓库。

类型声明随源码一起走

对本仓库的自动审查在做类型检查时不会安装依赖。此前这意味着什么都解析
不到:所有来自 Obsidian 和 CodeMirror 的值都没有类型,审查因此报出两千
多条在依赖齐全时根本不存在的问题。

这些 API 自己发布的声明文件现在放在 vendor/types/ 下,逐字节复制自
package.json 里精确锁定的版本,版本号和许可列在
vendor/types/VENDORED.md 里。Obsidian 在运行时提供这些 API,因此这些
代码不会进入 main.js,发布产物与 0.1.6 逐字节相同。

另外

  • LICENSE 恢复为 MIT 原文,许可证识别可以正常工作。打包的记忆引擎那条
    例外说明改放在 README 和 THIRD_PARTY_NOTICES.md 里,那才是它该在的
    地方。

0.1.6

Choose a tag to compare

@onezeroooo onezeroooo released this 23 Sep 00:58

Writing Buddy 0.1.6

A repository anyone can install, type-check and build.

The memory engine ships as readable source

0.1.5 named the memory engine as a dependency on a repository nobody else can
read. Cloning this repository and running npm ci therefore failed before it
installed anything, so the plugin could not be type-checked or built by anyone
but its author, and automated review saw a codebase with no type information
at all.

The engine's built files now live in the repository, under vendor/recanta/,
and the build resolves them from there. npm ci works, npm run build
reproduces the released main.js byte for byte, and recanta-manifest.json
records the commit those files came from together with a hash over them.

Nothing changed in what the plugin does or in what it ships: the same engine
was already inside main.js. It is simply readable now.

Also

  • The novel-knowledge guide ships in Chinese as well as English, and both
    README files link their own edition.

墨伴 · Writing Buddy 0.1.6

一个任何人都能安装、类型检查并构建的仓库。

记忆引擎以可读源码的形式随仓库发布

0.1.5 把记忆引擎写成了一个指向私有仓库的依赖。于是克隆本仓库后运行 npm ci
会在安装任何东西之前就失败,插件除了作者之外没有人能做类型检查或构建,自动
审核看到的是一份完全没有类型信息的代码。

现在引擎的构建产物就放在仓库里的 vendor/recanta/,构建直接从那里解析。
npm ci 可以跑通,npm run build 能逐字节复现发布的 main.js,
recanta-manifest.json 同时记录这些文件来自哪个提交以及它们的哈希。

插件的行为和分发内容都没有变:同一个引擎本来就已经在 main.js 里,只是现在
它是可读的。

另外

  • 作品知识的使用说明增加了中文版,两份 README 各自指向对应语言的版本。

0.1.5

Choose a tag to compare

@onezeroooo onezeroooo released this 23 Sep 00:01

Writing Buddy 0.1.5

The book's own knowledge, and a data folder you can put where you want it.

Manuscript knowledge (experimental)

Writing Buddy can read your manuscript once and remember what it says. After
that every conversation carries the facts that hold up to the point you are
writing at: where something is kept, what a character has learned or
believes, how characters regard each other, who has arrived or left. Nothing
from a later chapter leaks into an earlier scene.

  • Open a chapter and press Build in Settings, under Project data. That
    chapter's top-level folder becomes the manuscript; sibling folders named
    like 设定 / 人物 / canon become your canon. Folders and files marked as
    old drafts are left out.
  • Building is the expensive part. Every passage of about 3,000 characters is
    one request to the connection you write with, so a long novel means
    hundreds of requests, a long wait and a large number of tokens. Writing
    Buddy counts the passages first and asks before it starts.
  • You can pause at any time: in Settings, on the line under the conversation
    title, or with a command. A paused build keeps everything it has already
    read, and it does not continue by itself, not even after Obsidian reopens.
  • Knowledge files travel with the Vault, so a second device never pays to
    read the same chapter twice.
  • Afterwards, saving a chapter updates only what changed, and that runs on
    its own.

It is marked experimental because what it extracts has not been measured
across many manuscripts yet, and a reply that arrives incomplete costs that
passage a retry.

The data folder is yours to place

Writing Buddy's data no longer has to sit at the top of the Vault. Settings →
Project data shows where it is and moves it, with a picker in the shape of
Obsidian's own "Move folder to". Dragging or renaming the folder in the file
tree works too, and Writing Buddy follows it. If the folder goes missing, the
same row is where you find it again or create a new one.

Thanks to @lanbinleo for asking (#2).


墨伴 · Writing Buddy 0.1.5

让作品自己记住写过的事,以及数据文件夹放哪由你决定。

作品知识(实验性)

墨伴可以把正文通读一遍并记住其中的事实。之后每次对话都会自动带上写到当前
位置为止成立的内容:东西放在哪、谁知道了什么、谁相信什么、人物之间如何看待
彼此、谁到了哪里又离开了。后文的内容不会漏进前面的场景。

  • 打开正文中的一章,在设置 → 项目数据里点「建立」。该章所在的顶层文件夹成为
    正文范围,名字形如 设定 / 人物 / canon 的同级文件夹成为你的设定。标记为
    旧稿的文件夹和文件不会被读取。
  • 建立是花钱的那一步。每约 3000 字向你写作所用的连接发一次请求,长篇就意味着
    几百次请求、较长的时间和大量 token。墨伴会先数清段数,征得同意后才开始。
  • 建立过程中随时可以暂停:设置里、对话标题下那一行、或者命令面板。暂停会保留
    已经读过的部分,并且不会自己继续,重新打开 Obsidian 也不会。
  • 知识文件随仓库同步,第二台设备不会为同一章再付一次费用。
  • 建立完成之后,保存章节只会更新改动的部分,这一步是自动的。

标为实验性,是因为抽取质量尚未在足够多的作品上验证,而且回复中途中断时,这一段
需要重试。

数据文件夹放哪由你决定

墨伴的数据不必再放在仓库根目录。设置 → 项目数据会显示当前位置并可以移动,选择器
的样式与 Obsidian 自带的「移动文件夹到」一致。直接在文件树里拖动或重命名也可以,
墨伴会跟着走。万一文件夹不见了,也是在这一行重新找回或新建。

感谢 @lanbinleo 提出这个需求(#2)。

0.1.4

Choose a tag to compare

@onezeroooo onezeroooo released this 20 Sep 07:32

Writing Buddy 0.1.4

One Effort ladder on every connection, answers that arrive as they are written, and a simpler Composer.

Effort

  • Every connection offers the same six levels: minimal, low, medium, high, xhigh, max. What the row says is what the request carries.
  • Anthropic and Google connections now actually think according to the level: Claude receives an extended-thinking budget and Gemini a thinking budget. Until now neither received any thinking parameter, and Claude answers were capped at 4096 tokens.
  • On a custom OpenAI-compatible endpoint every model offers the ladder, since Writing Buddy cannot tell what sits behind a gateway. An endpoint that describes its own models — OpenAI's supported_reasoning_levels and default_reasoning_level — sets exactly what each model offers and which level is pre-selected.
  • Choosing a model pre-selects medium, or the endpoint's named default. The "Default (provider decides)" row is gone: it meant no thinking on Claude, medium on OpenAI and something else behind a gateway.
  • Ollama offers the ladder for thinking-capable gpt-oss models, where think takes a level.

Answers

  • Auto turns that need no research now stream: the text appears as the model writes it instead of all at once at the end.
  • The model is told that replies are shown as plain text, so answers stop arriving with Markdown headings, bold markers and stray code fences.
  • A slow model is no longer cut off at 90 seconds before it has said anything. The research time limit starts at the first search or read, and the answer itself is not bounded by it.

Connections

  • A connection stays "connected" when its endpoint answers an error — a 503 for one model, a 400 for one parameter. Only silence marks it offline. Until now any error turned the connection red until you pressed Test.
  • The Provider row is gone from Settings and the Composer. Every connection carries exactly one provider, so the row only ever repeated the connection's name. Composer choices are now Connection, Model, Effort and Context.

Existing conversations keep their choices. A stored effort a model no longer offers becomes that model's default.


墨伴 · Writing Buddy 0.1.4

所有连接统一的推理强度梯子、边写边出的回答,以及更简洁的输入区。

推理强度

  • 每个连接都提供同样的六档:minimal、low、medium、high、xhigh、max。选项里写的是什么,请求里发的就是什么。
  • Anthropic 和 Google 连接现在会真正按所选强度思考:Claude 收到 extended thinking 预算,Gemini 收到 thinking 预算。此前两者都没有收到任何思考参数,而且 Claude 的回答被限制在 4096 个 token 以内。
  • 自定义 OpenAI 兼容端点上的每个模型都提供这个梯子,因为墨伴无法知道网关后面是什么。如果端点自己描述了模型——OpenAI 的 supported_reasoning_levels 和 default_reasoning_level——就以它为准,决定每个模型提供哪些档位、预选哪一档。
  • 选定模型后预选 medium,或端点声明的默认值。「默认(由服务商决定)」这一项去掉了:它在 Claude 上意味着不思考,在 OpenAI 上意味着 medium,在网关后面则不一定。
  • Ollama 对支持思考的 gpt-oss 模型提供这个梯子,那里的 think 接受档位。

回答

  • 不需要检索的自动模式回合现在是流式的:文字随模型书写逐步出现,而不是最后一次性出来。
  • 模型会被告知回复按纯文本显示,因此回答不再夹带 Markdown 标题、加粗符号和多余的代码围栏。
  • 慢模型不会再在开口之前就被 90 秒截断。研究时限从第一次检索或阅读开始计算,回答本身不受它限制。

连接

  • 端点返回错误时——某个模型的 503、某个参数的 400——连接仍显示为「已连接」,只有完全没有回应才标记为离线。此前任何错误都会让连接变红,直到手动点「测试」为止。
  • 设置和输入区里的「服务商」一行去掉了。每个连接恰好只有一个服务商,这一行只是把连接名再写一遍。输入区现在的选项是:连接、模型、推理强度、上下文。

已有对话保留原来的选择。模型不再提供的强度会自动落到该模型的默认值。

0.1.3

Choose a tag to compare

@onezeroooo onezeroooo released this 15 Sep 17:06

Writing Buddy 0.1.3

Settings you can search, and a cleaner bill of health in the Obsidian Community directory.

Settings

  • On Obsidian 1.13 and later, every Writing Buddy setting now appears in the Settings search box: type "instruction language", "effort" or "concurrency" and jump straight to it.
  • The page follows Obsidian 1.13's layout: AI connections are a list with an add button in its header, the built-in skills and the Advanced limits open as their own pages, and the rest of the page is unchanged.
  • Installs older than 1.13 keep the same settings page as before.

Under the hood

  • Clears the automated-review warnings the Community directory reported for 0.1.2. Timers, network and storage access now go through the window Obsidian gives the plugin, so popout windows behave the same as the main one.
  • Reads Obsidian's configuration folder from Obsidian instead of assuming .obsidian, and the interface language from Obsidian's own API.
  • Delete buttons use Obsidian 1.13's destructive style where available.

No writing workflow, model, or project-data behavior changed in this release.


墨伴 · Writing Buddy 0.1.3

设置项可以搜索了,Obsidian Community 目录里的自动审查也干净了。

设置

  • 在 Obsidian 1.13 及以上版本,Writing Buddy 的每一个设置项都能在设置搜索框里找到:输入「指令语言」「推理强度」「并发」就能直接跳过去。
  • 设置页遵循 Obsidian 1.13 的布局:AI 连接是一个列表,添加按钮在标题栏;内置技能和高级限制各自是一个子页面;其余部分和原来一样。
  • 低于 1.13 的版本保持原来的设置页不变。

内部改动

  • 清理了 Community 目录对 0.1.2 报告的自动审查警告。定时器、网络和存储访问都改为经由 Obsidian 交给插件的窗口,弹出窗口和主窗口的行为一致。
  • 配置目录从 Obsidian 读取,不再假定是 .obsidian;界面语言改用 Obsidian 自己的 API 读取。
  • 删除类按钮在支持的版本上使用 Obsidian 1.13 的破坏性操作样式。

本版本没有改变写作流程、模型行为或项目数据。

0.1.2

Choose a tag to compare

@onezeroooo onezeroooo released this 15 Sep 13:00

Writing Buddy 0.1.2

A small compatibility release for the Obsidian Community review.

Fixes

  • Corrects the declared minimum Obsidian version to 1.8.7, matching the APIs Writing Buddy actually uses.
  • Updates the manifest description to follow Community Directory wording rules.
  • Replaces direct inline style assignments with Obsidian DOM style helpers.
  • Removes the remaining !important from the reduced-motion rule while keeping the same behavior.
  • Makes production bundles reproducible from the release source so Community build verification can match the published main.js.

No writing workflow, model, or project-data behavior changed in this release.


墨伴 · Writing Buddy 0.1.2

这是一个针对 Obsidian Community 审核的小型兼容性版本。

修复

  • 将最低 Obsidian 版本更正为 1.8.7,与 Writing Buddy 实际使用的 API 保持一致。
  • 更新 manifest 描述,使其符合 Community Directory 的文案规则。
  • 将直接写入 inline style 的代码改为 Obsidian 提供的 DOM 样式辅助方法。
  • 移除 reduced-motion 规则里最后一个 !important,同时保持原有行为不变。
  • 让 production bundle 可以从发布源码稳定复现,使 Community 的构建校验能够与公开的 main.js 一致。

本版本没有改变写作流程、模型行为或项目数据。

0.1.1

Choose a tag to compare

@onezeroooo onezeroooo released this 15 Sep 11:59

Writing Buddy 0.1.1

Writing Buddy is now open source under the MIT license. The public repository carries the
reviewed product source of each release alongside the plugin files, so what you install is what
you can read.

Highlights

  • Direct connections stream. OpenAI, Anthropic, Google and OpenAI-compatible endpoints show
    the reply as it arrives. Where the platform cannot stream — some mobile and browser setups —
    the whole reply is fetched instead, without you doing anything.
  • One language, all the way down. The interface follows Obsidian's language, and everything
    the model is told — instructions, Skills, attached material, the research protocol and the
    full-manuscript analysis — now follows the instruction language too. Conversation titles and
    citation labels also respect the language settings. Interface and instruction languages can
    be set independently; the model is instructed to use your chosen language.
  • Add a connection from the list. The provider picker is one search box; the full catalogue
    opens under it and narrows as you type.

Improvements

  • Settings is one short page: connections, new-conversation defaults, project instructions and
    Skills, project data, and a folded Advanced section.
  • An unnamed conversation is called Untitled conversation in the interface language.
  • Settings labels and error messages read the way a writer would say them.
  • English and Chinese READMEs now show real rewrite reviews, writing Skills, and language/context
    examples. Optional Ko-fi support is available from the README and plugin funding link;
    all plugin features remain free.

Fixes

  • A reply that was too large is discarded and reported instead of hanging the turn.
  • A stream that breaks partway ends the turn with a clear, retryable message; the text before the
    break is never accepted as a completed answer.
  • Oversized server error messages received mid-stream are bounded before they reach the error
    display, matching the protection for HTTP error bodies.
  • The provider list is no longer clipped to a single row inside the Add connection dialog.
  • The built-in Skills group in Settings folds and unfolds as one panel.

Removed

  • The self-hosted Runtime connection and token pairing are gone. Every connection is now direct:
    a provider with your own key, Ollama, or any OpenAI-compatible endpoint.

Data and migration

  • WritingBuddy/ project data is preserved across the update; nothing is moved or recreated.
  • A vault that still has a Runtime connection configured will need a direct connection added in
    Settings → Writing Buddy → AI connections. Conversations from that connection keep what they
    recorded.

墨伴 · Writing Buddy 0.1.1

墨伴现在以 MIT 许可开源。公开仓库里每个版本都同时放着经过审阅的产品源码和插件文件,你装的就是你
能读到的。

亮点

  • 直连也能流式输出。 OpenAI、Anthropic、Google 和 OpenAI 兼容端点会边生成边显示。平台不允许
    流式的情况下——部分移动端和浏览器环境——会自动改为整段获取,不用你做任何事。
  • 一种语言,贯穿到底。 界面跟随 Obsidian 的语言;告诉模型的所有内容——指令、技能、附带资料、
    研究协议和整稿分析——现在也都跟随指令语言。对话标题和引用标签也遵循语言设置。界面语言与
    指令语言可以分别设置,模型会收到按所选语言回答的要求。
  • 从列表里添加连接。 服务商选择器就是一个搜索框,完整目录在下面展开,边打字边收窄。

改进

  • 设置集中在同一页:连接、新会话预设、项目指令与技能、项目数据,以及折叠起来的高级项。
  • 尚未命名的对话按界面语言显示为"未命名对话"或 Untitled conversation。
  • 设置里的标签和错误提示改成写作者会说的话。
  • 中英文 README 加入真实的改写审阅、写作技能和语言/上下文示例。README 与插件支持入口加入
    自愿的 Ko-fi 支持链接,插件所有功能继续免费使用。

修复

  • 回复过大时会被放弃并明确提示,而不是让这一轮卡住。
  • 回复中途断流时,这一轮会以清楚、可重试的提示结束;断流前的文字不会被当作已完成的答案。
  • 流式响应中途收到的超长服务端错误信息会先限制长度,再进入错误提示,与 HTTP 错误正文采用
    一致的保护。
  • 添加连接对话框里的服务商列表不再只露出一行。
  • 设置里的内置技能分组可以整组折叠和展开。

移除

  • 自托管 Runtime 连接和令牌配对已移除。现在所有连接都是直连:带自己密钥的服务商、Ollama,或任意
    OpenAI 兼容端点。

数据与迁移

  • WritingBuddy/ 项目数据在更新后原样保留,不会移动或重建。
  • 仍配置着 Runtime 连接的库需要到设置 → 墨伴 → AI 连接添加一个直连连接。那个连接下的对话记录
    会保留。