内容
<p align="center">
<a href="https://notepatra.org"><img src="resources/notepatra-256.png" alt="Notepatra — click for notepatra.org" width="128" height="128"></a>
<h1 align="center"><a href="https://notepatra.org" style="text-decoration:none;color:inherit;">Notepatra</a></h1>
<p align="center"><em>为 AI 时代而生的首款代码编辑器。</em></p>
<p align="center">
<strong>C++ + Rust</strong> · <strong>~12 MB 纯原生可执行文件</strong> · <strong>零 Electron</strong> · <strong>238 种文件类型</strong> · <strong>82 种语言词法分析</strong> · <strong>本地 AI 格式化工具</strong> · <strong>MCP 服务器</strong>
</p>
<p align="center">
<strong>v0.1.119 新增:</strong> <a href="https://notepatra.org/mcp.html"><code>notepatra-mcp</code></a> — 连接 Claude Desktop, Claude Code, OpenAI Codex 及任何 MCP 客户端到正在运行的编辑器。 35 种工具(Git, 只读 SQL, Noter 笔记);每次写入都需要人类批准;所有操作都在窗口内完成,不会离开您的机器。
</p>
<p align="center">
<a href="https://notepatra.org">官网</a> ·
<a href="https://github.com/singhpratech/notepatra/releases/latest">下载</a> ·
<a href="#ai-assistants-mcp--new-in-v01118">MCP</a> ·
<a href="#features">功能</a> ·
<a href="#the-story">故事</a> ·
<a href="#install">安装</a> ·
<a href="#plugins">插件</a> ·
<a href="#ai-powered">AI</a> ·
<a href="CONTRIBUTING.md">贡献</a> ·
<a href="SECURITY.md">安全</a> ·
<a href="CHANGELOG.md">更新日志</a>
</p>
<p align="center">
<a href="https://github.com/singhpratech/notepatra/actions/workflows/build.yml"><img src="https://github.com/singhpratech/notepatra/actions/workflows/build.yml/badge.svg" alt="构建"></a>
<a href="https://github.com/singhpratech/notepatra/actions/workflows/codeql.yml"><img src="https://github.com/singhpratech/notepatra/actions/workflows/codeql.yml/badge.svg" alt="CodeQL"></a>
<a href="https://github.com/singhpratech/notepatra/releases/latest"><img src="https://img.shields.io/github/v/release/singhpratech/notepatra?color=39FF14&label=release" alt="发布版本"></a>
<a href="https://github.com/singhpratech/notepatra/blob/main/LICENSE"><img src="https://img.shields.io/badge/license-GPL--3.0-blue" alt="许可证"></a>
<a href="SECURITY.md"><img src="https://img.shields.io/badge/security-disclosure%20policy-39FF14" alt="安全"></a>
</p>
<p align="center">
<a href="https://github.com/singhpratech/notepatra/releases"><img src="https://img.shields.io/github/downloads/singhpratech/notepatra/total?color=39FF14&label=total%20downloads" alt="总下载量"></a>
<a href="https://github.com/singhpratech/notepatra/stargazers"><img src="https://img.shields.io/github/stars/singhpratech/notepatra?style=flat&color=39FF14" alt="GitHub 星标"></a>
<a href="https://github.com/singhpratech/notepatra/network/members"><img src="https://img.shields.io/github/forks/singhpratech/notepatra?style=flat" alt="分支"></a>
<a href="https://github.com/singhpratech/notepatra/issues"><img src="https://img.shields.io/github/issues/singhpratech/notepatra?color=blue" alt="开放问题"></a>
<a href="https://github.com/singhpratech/notepatra/commits/main"><img src="https://img.shields.io/github/last-commit/singhpratech/notepatra" alt="最后一次提交"></a>
</p>
</p>
---
## 故事
我叫普拉特克·辛格。我是一名开发者,多年来一直使用 Linux,我希望有一个小巧、快速、免费的原生代码编辑器,可以在几秒钟内修复问题——比如损坏的 JSON、凌乱的 SQL、乱七八糟的 HTML——但我只找到 Wine 黑客或占用 500 MB 内存的臃肿 Electron 编辑器来显示一个文本文件。
每个文本编辑器都让我在以下三项中选择两项:**快速**、**强大**、**原生**。Vim 很快也很原生,但它很神秘。现代 Electron 编辑器功能强大但很臃肿。真正小巧的原生编辑器要么没有 AI,要么不支持跨平台。
所以我创建了 Notepatra。
不是移植。不是包装。一些新的东西——**适用于所有人**。
我问自己:**如果今天,从头开始,在 2026 年,当 AI 是每个开发者工作流程的一部分时,一个小型的原生代码编辑器会是什么样子,并且可以在 Linux + macOS + Windows 上原生运行,使用同一个代码库?**
答案:一个小型的原生可执行文件——每个平台上大约 12 MB(裸编译后 ~12.4 MB)——具有 Rust 驱动的核心、Scintilla 编辑引擎和本地优先的 AI 集成(可选云后端)。v0.1.119 下载:4.4 MB Linux x64(tarball,Qt from the system),27.7 MB macOS(DMG with bundled Qt),32.8–42.7 MB Windows(MSI/zip/setup.exe with bundled Qt DLLs)。一个可以毫秒级修复损坏的 JSON 的编辑器——当正则表达式不够用时,它会请求 AI 来解决——本地优先,默认情况下六个云后端一键可用。不收集用户数据。没有订阅。没有强制的 API 密钥。
Notepatra 起源于 Linux——因为那里有空白。 但伟大的工具不应有边界。 **Notepatra 运行于 Linux、Windows 和 macOS。** 相同的代码库。相同的功能。不会有人被落下。
**Notepatra 是我希望存在的东西——在每个平台上。**
---
## 功能
### 编辑器 — 基础功能做得很好
- **238 种文件扩展名** 映射到 **82 种语言词法分析** — Python, C/C++, C#, Java, Kotlin, JavaScript, TypeScript, Rust, Go, Swift, Dart, Solidity, Zig, Vala, Hack, Julia, R, Protobuf, F#, HCL/Terraform, Thrift, GraphQL, GDScript, Nim, Cython, Mojo, Crystal, Elixir, Scala, Groovy, Apex, SQL (6 种方言预设), HTML, CSS, JSON, JSON5, YAML, TOML, Markdown, Bash, Fish, Nushell, Fortran, VHDL, Verilog, MATLAB, LaTeX, BibTeX, Jinja, Liquid, Twig, Dockerfile, DotEnv, Gitignore 等。Rust / Go / Swift / Kotlin / TypeScript / PowerShell 作为 Notepatra 本地词法分析器(不仅仅是 C 家族的 fallback)
- **标签式编辑** — 拖拽,重排,鼠标中键关闭,空白区域双击新建标签
- **标签右键菜单** — 关闭,关闭除此之外所有标签,关闭左侧/右侧所有标签,关闭所有标签,保存,另存为,重命名,复制完整路径,复制文件名,复制目录路径,打开包含文件夹,打开终端,切换只读,**颜色标签** (7 种命名颜色 + 自定义 + 移除)
- **3 种主题** — 浅色,暗色,Monokai(设置 > 主题)
- **会话持久化** — 关闭 Notepatra,明天重新打开,相同的文档,相同的光标位置,相同的窗口大小
- **崩溃恢复** — 如果 Notepatra 崩溃(不应该,但生活总是会有意外),您的未保存工作将在下次启动时恢复
- **文件变更检测** — 别人编辑了您的文件?Notepatra 会询问:重新加载还是保留您的更改?
- **支持 2 GB 文件** — 通过 Rust 实现内存映射 I/O;最多 ~1.86 GB 加载完整文件,更大文件打开截断 + 只读
- **双击高亮单词** — 双击任意单词,所有出现位置用橙色高亮
- **Ctrl+B 括号匹配** — 跳转到匹配的 `{}` `[]` `()`,高亮两个括号 + 选择两者之间的内容
- **宏录制** — 开始录制(Ctrl+Shift+M),停止,播放(Ctrl+Shift+P),运行多次,保存/加载宏
- **代码折叠**,**书签**,**自动补全**,**缩进引导**,**行号**
- **自定义滚动条** — 清洁,现代,圆角
### 搜索 — 查找任意内容,任意位置
- **项目搜索(`Ctrl+Shift+G`)** — 递归搜索 **文件名和文件内容**,适用于任意文本文件。任意大小,任意语言(Python, SQL, C/C++, JS/TS, Rust, Go, HTML, JSON, YAML, Markdown, 日志,配置文件)。每行流式传输,因此 2 GB 日志搜索与 2 KB 脚本相同。每个匹配结果显示确切的 `行:列` 坐标 — 双击跳转到字符。
- **5 标签查找/替换对话框** — 查找,替换,查找文件,标记,前往
- **3 种搜索模式** — 普通,扩展(`\n`, `\r`, `\t`, `\xNN`),正则表达式
- **查找当前文档所有匹配项** — 结果出现在底部面板,双击任意结果跳转到指定行
- **查找所有打开文档中的匹配项** — 同时搜索所有打开的标签
- **替换所有打开文档中的匹配项** — 一键更新所有文件
- **查找文件** — 递归搜索整个目录,支持文件过滤
- **标记所有匹配项** — 使用视觉指示器高亮所有匹配项
- **Aho-Corasick 搜索引擎** (Rust)— 比正则表达式更快的字面模式搜索
### 插件 — 真正强大的功能
每个插件都打开在自己的标签页中。真正的 UI,而不仅仅是菜单点击。
#### JSON 工具(内置)
| 按钮 | 功能 |
|---|---|
| **格式化** | 保留键顺序的漂亮打印 |
| **压缩** | 压缩到一行 |
| **修复 + 格式化** | Rust 驱动的自动修复:修复缺失的括号,尾随逗号,单引号,未引用键,缺失的 `{` 后 `[` — 显示每次修复的详细报告 |
| **AI 修复(Ollama)** | 将真正损坏的 JSON 发送到您的本地 AI — 修复正则表达式无法修复的内容 |
#### HTML 工具(内置)
| 按钮 | 功能 |
|---|---|
| **格式化(2/4 空格)** | 正确的 HTML 缩进 |
| **压缩** | 删除所有空白字符 |
| **修复 + 格式化** | 自动关闭未关闭的标签,检测缺失的关闭标签,报告问题 |
| **AI 修复(Ollama)** | AI 修复嵌套问题,错误标签,缺失的属性 |
#### 括号工具(内置)
| 按钮 | 功能 |
|---|---|
| **检查** | 详细报告:每个 `()` `[]` `{}` 的行号,关键字不匹配(`begin`/`end`,`if`/`fi`) |
| **自动修复** | 按正确嵌套顺序添加缺失的关闭括号 |
| **AI 修复(Ollama)** | AI 了解您的代码结构并修复所有括号问题 |
#### SQL 格式化工具(内置)
- 以 **大写** 或 **小写** 关键字格式化
- 可配置的缩进宽度
- 支持 T-SQL, PL/SQL, MySQL, PostgreSQL, SQLite
#### 比较 / 差异(内置)
- 选择 **任意两个标签** 或 **任意标签 vs 磁盘上的文件**
- 侧边 **Scintilla 编辑器**,具有 ComparePlus 样式的 **概览/导航条**
- `+` 绿色表示添加,`-` 红色表示删除,`#` 琥珀色表示更改
- **单词级 LCS 行内差异** — 在更改的行中,左侧面板中删除的特定 **令牌** 用红色高亮显示,右侧面板中添加的令牌用绿色高亮显示。基于实际单词边界,而不仅仅是通用前缀/后缀。
- **暗黑模式感知** — 颜色跟踪 Notepatra 主题(浅色 / 暗色 / Monokai),因此差异在黑色和白色背景上都可读。
- **上一页/下一页差异** 导航,内联概览条跳转
- **忽略空白**,**忽略大小写**,**忽略空行** 复选框
- **解锁编辑** 模式 — 编辑任一面板并在原位重新差异
- 由 Rust Myers 差异(行级)+ C++ LCS(单词级)提供支持
- **视觉 UX 灵感来自 [ComparePlus](https://github.com/pnedev/comparePlus) by Pavel Nedev** — 应有的荣誉。
#### Git 集成(内置)
- **已暂存/未暂存树** — v2 寄木 v2 解析器,内联 `+` / `−` 按钮每行暂存/取消暂存
- **分支芯片 + 前/后** — 显示 `main ↑3 ↓1` 当分叉
- **提交框(Ctrl+Enter)** — 行数指示器,阻止提交时无内容暂存
- **同步行** — 一键拉取 / 推送 / 获取 + 实时前后刷新
- **可折叠的历史记录 + 储物柜菜单** — 最近的提交可展开;储物柜 / 弹出 / 列表 / 丢弃
- **Git 标记** — 编辑器边距中更改行的绿色/黄色/红色标记
### AI 驱动 — 本地优先,可选云端
下拉菜单提供 **6 个选项** — **Ollama** (本地默认 · `localhost:11434`),**llama.cpp (GGUF)** (本地 · `localhost:8080`),**OpenRouter** (云端 · 100+ 模型),**Ollama Cloud** (云端 · gpt-oss:120b / qwen3-coder:480b / deepseek-v3.1:671b),**OpenAI** (云端 · GPT-4o / GPT-5 / o-series),**Azure OpenAI** (企业)。每个提供商的密钥槽 — 不会跨提供商混淆。`llama.cpp` 条目还接受用户配置的基 URL,通过设置 > 首选项 > AI,因此您可以将其路由到您单独安装的任何 OpenAI 兼容的 HTTP 服务器。 本地后端保留机器上的代码;云后端是可选的。 无需遥测。 无需订阅。没有订阅。无需强制的 API 密钥。
#### AI 助手 — 侧边栏(`Ctrl+Shift+A`)
AI 聊天窗口位于 **固定右侧边栏**,不是编辑器标签页。一次会话,在切换标签页时保留。勾选 **编码模式** 以打开 3 列编码布局(文件树 · 编辑器 · AI 聊天)3 窗格布局。
**工作区感知**。每个提示都携带:
- 选中内容(或如果未激活则为整个文件)
- 当前文件完整文本
- 其他打开的编辑器标签页摘要
- 工作区根目录下所有文件的扁平列表(过滤掉 `.git`、`node_modules`、`target`、`dist` 等)
因此模型可以推理您尚未打开的文件 — “从 utils.py 导入” 即使 utils.py 未在标签页中。预算有限,因此小型本地模型(3B,4K–8K 上下文)不会溢出。
**一键操作**(默认隐藏,点击“▸ 快速操作”显示):
解释 · 查找 Bug · 重构 · 编写测试 · 添加注释 · 生成文档 · 优化 · 翻译。或输入自定义提示。响应流式传输,每个响应都有 **复制** 链接,最后一个响应可以通过单击在光标处插入或替换选择。
**语音转文本** — 可选麦克风按钮,使用本地 `arecord` + `whisper` CLI(安装后)。音频不会离开机器。
#### AI 设置
```bash
# 最简单的方法:Ollama
curl -fsSL https://ollama.com/install.sh | sh
ollama pull qwen2.5-coder:3b # 2 GB,CPU 优先 / 16 GB RAM
ollama serve
```
Notepatra 自动检测正在运行的 Ollama 并选择安装的 CPU 友好的模型。对于 **llama.cpp / OpenRouter / Ollama Cloud / OpenAI / Azure OpenAI**,从 AI 面板顶部的下拉菜单中选择后端;base URL 和 API 密钥可内联编辑。`llama.cpp` 条目还接受用户配置的 base URL,通过设置 > 首选项 > AI,因此您可以将其路由到您单独安装的任何 OpenAI 兼容的 HTTP 服务器。
#### 👁 AI 交互日志 — 查看 AI 操作日志(`功能 > AI 操作日志…`)
**默认开启,全透明**。 每次请求 **和** 响应发送到 **任何** AI 后端 — 本地(Ollama / llama.cpp)或云端(OpenRouter / OpenAI / Azure / Ollama Cloud),包括 Noter 的 Extract — 被写入 **本地 SQLite 日志**,您可以打开并阅读:时间戳、后端、模型、模式、完整提示 + 完整响应、令牌计数、延迟。**它永远不会离开您的机器**(零网络外流),条目在 7 天后自动清理,并且内置的 **凭证清理器** 在存储任何内容之前都会屏蔽 API 密钥 / 令牌 / PEM 私钥。 查看器具有后端/模型/模式过滤器、**导出 JSON**、**立即清理** 和一键退出切换。 您永远不会猜测发送到模型的内容 — 您可以审计每个字节。 * 隐私即透明度,而不是承诺。*
#### 📝 Noter — 会议记录转化为提醒(`Ctrl+Alt+N`)
本地优先的双面板会议工作区(笔记列表 · 编辑器)— 无需账户,无需机器人;笔记存储在 `~/Documents/Notepatra/Noter/`。
- **快速输入** — 顶部工具栏下拉 *Action Items / What I plan / To-dos* 标题和复选框项目;选中一行并将其划掉。
- **提取** (`Ctrl+Alt+E`) 在您的 AI 后端运行您的笔记并返回 **摘要** 加 **操作项 / 决定 / 问题 / 风险**。提及时间(“明天 10 点发布构建”)的任务会返回带有预填充日期/时间。
- **提醒事项** — 在笔记上设置一个(右键)或直接从 Extract 中安排操作项;它们全部收集在中央 **提醒事项** 列表中,按 *过期 / 今天 / 本周 / 稍后* 分组,并支持桌面通知(当 Notepatra 运行时)。点击打开笔记,铅笔重新安排,✕ 删除。重新运行 Extract 会标记已经安排的内容,因此您不会重复添加。
#### 📐 绘图工具 — 根据文本生成流程/ER/系统图表(`.npd`)
一个一级的绘图界面,在 **每个平台的二进制文件中原生渲染**(包括 macOS Apple Silicon 和 Windows 安装程序 — 原生 Qt 渲染器,无需 WebEngine),从工具栏打开,位于 Noter 旁边。微小的 `.npd` 文本 DSL 是 **源代码**;画布是其 **实时投影**(因此撤销/重做和版本控制直接起作用)。
- **三种创建方式** — **AI 生成** 用纯英文描述,本地模型编写 `.npd`,在 **审查面板** 显示,然后触摸画布(撤销/重做之后);或从流程图/ER/系统 **模板** 开始;或直接编写 `.npd`。**导入 Mermaid** 转换现有的流程图。
- **丰富的视觉效果** — 5 种形状(药丸/方框/决策菱形/数据库圆柱体/图标),~55 种手绘图标(~150 个别名)用于系统/ER/流程图,定向 + 标签 + 双向箭头,标签溢出 -> 悬停,4 种调色板(+ 默认备用),无限缩放/平移画布。
- **导出** — **PNG / JPEG / PDF** 在每个构建版本上,另外 **SVG / HTML** 在 Qt Svg 模块存在时,以及 **WebP** 在 Qt WebP 图片插件存在时(菜单显示您的构建支持的确切内容)。**帮助** 按钮包含完整的备忘录;`samples/diagram_showcase.npd` 显示每个元素;`npd_render` CLI 将任何 `.npd` 渲染为图像,无头。
### 更多功能
| 功能 | 快捷键 |
|---|---|
| **内置终端** | `Ctrl+`` — 作为标签页打开,运行真正的命令 |
| **REST 客户端** | `Ctrl+Shift+R` — 发送 HTTP 请求,查看响应,附带 JSON 美化 |
| **十六进制编辑器** | 视图 > 十六进制编辑器 — 任意二进制文件的颜色编码十六进制转储 |
| **Markdown 转换器** | 功能 > Markdown — 将选定内容转换为表格,列表,代码块,加粗,链接,标题,或从 HTML 剥离为 Markdown |
| **文件资源管理器** | `Ctrl+Shift+E` — 树形视图侧边栏 |
| **函数列表** | 视图 > 函数列表 — 列出所有函数/类,双击导航 |
| **首选项** | 设置 > 首选项 — 6 个配置选项卡 |
### 快捷键
| 分类 | 快捷键 | 操作 |
|---|---|---|
| **文件** | `Ctrl+N` | 新建 |
| | `Ctrl+O` | 打开 |
| | `Ctrl+S` | 保存 |
| | `Ctrl+W` | 关闭标签页 |
| **编辑** | `Ctrl+D` | 复制行 |
| | `Ctrl+Shift+K` | 删除行 |
| | `Ctrl+/` | 切换注释 |
| | `Ctrl+Shift+U` | 大写 |
| | `Ctrl+U` | 小写 |
| **搜索** | `Ctrl+F` | 查找 |
| | `Ctrl+H` | 替换 |
| | `Ctrl+Shift+G` | 项目搜索(文件夹范围内的名称和内容) |
| | `F3` / `Shift+F3` | 查找下一个/上一个 |
| | `Ctrl+G` | 跳转到行 |
| | `Ctrl+B` | 跳转到匹配的括号 |
| | `Ctrl+F2` / `F2` | 切换/下一个书签 |
| **视图** | `F11` | 全屏 |
| | `Ctrl+=` / `Ctrl+-` | 放大/缩小 |
| | `Alt+0` | 折叠所有 |
| **宏** | `Ctrl+Shift+M` | 开始录制 |
| | `Ctrl+Shift+T` | 停止录制 |
| | `Ctrl+Shift+P` | 播放 |
| **功能** | `Ctrl+`` | 终端 |
| | `Ctrl+Shift+A` | AI 助手 |
| | `Ctrl+Shift+E` | 文件资源管理器 |
| **标签页** | `Ctrl+Tab` | 下一个标签页 |
| | 中键单击 | 关闭标签页 |
| | 空白区域双击 | 新建标签页 |
### AI 助手(MCP)—— 新增于 v0.1.118
从 v0.1.118 开始,Notepatra 配备了 **`notepatra-mcp`** —— 一个遵循标准输入/输出 JSON-RPC 2.0 的 [模型上下文协议](https://modelcontextprotocol.io) 服务器,通过本地套接字将外部 AI 助手(如 Claude Desktop、Claude Code、OpenAI Codex、OpenAI 代理 SDK 以及任何符合规范的 MCP 客户端)连接到正在运行的编辑器。所有数据都停留在您的机器上:客户端使用标准输入/输出,编辑器使用本地套接字,无需网络连接。
**三个层级的 35 种工具**(截至 v0.1.119):
| 层级 | 工具 | 网关 |
|---|---|---|
| **读取**(18) | 标签页、选择、状态、最近文件、标签页内和项目搜索、Noter 笔记、提醒、只读 Git(状态/差异/日志/显示/分支)、`.npd` 验证、只读 SQL(`run_sql`) | 无 — 仅观察 |
| **操作**(9) | 打开文件、新建标签页、跳转到行、设置语言、比较标签页、格式化 JSON/SQL/HTML、打开笔记 | 无 — 可见,非破坏性 |
| **写入**(8) | 插入文本、替换选择、查找和替换、保存、创建笔记、追加笔记、设置提醒、导出图表 | **在编辑器内批准/拒绝卡片** — 120 秒自动拒绝,FIFO 每次一个卡片,无无头绕过 |
`find_in_tab` 和 `search_project` 也接受一个可选的 `regex` 标志。`run_sql` **仅限 SELECT**(否则被 SQL 分类器拒绝),在完整/ DuckDB 版本中,在内存表中物化目标文件,然后在运行不受信任的查询之前禁用 DuckDB 的外部文件系统访问(`enable_external_access=false`),因此它无法读取主机文件。从 v0.1.119 开始,侧边栏还支持通过命名管道在 Windows 上运行。
通过一行命令连接(从 v0.1.118 开始):
```sh
# Claude Code (Anthropic)
claude mcp add notepatra -- notepatra-mcp --socket
```
```toml
# Codex CLI (OpenAI) — ~/.codex/config.toml
[mcp_servers.notepatra]
command = "notepatra-mcp"
args = ["--socket"]
```
完整的工具参考、Claude Desktop / 代理 SDK 代码段、安全模型和诚实的限制(编辑器必须运行;Windows 命名管道传输将在后续版本中发布;基于云的连接器界面无法访问桌面编辑器):[docs/mcp.html](docs/mcp.html) / [notepatra.org/mcp.html](https://notepatra.org/mcp.html).
---
## 架构
```
┌──────────────────────────────────────────────┐
│ C++ 层 (Qt5 + QScintilla) │
│ UI · 菜单 · 标签页 · 对话框 · 编辑器 │
│ 终端 · AI 面板 · 比较 · 插件 │
├──────────────────────────────────────────────┤
│ C FFI 边界 │
├──────────────────────────────────────────────┤
│ Rust 核心库 │
│ 文件 I/O (mmap) · 搜索 (Aho-Corasick) │
│ 差异 (Myers) · JSON/HTML/SQL 格式化 │
│ 括号修复 · 哈希 · Base64 · 编码 │
└──────────────────────────────────────────────┘
```
**为什么选择这种混合架构?**
- **C++** 因为 Qt 和 QScintilla 是 C++ — UI 无缝集成
- **Rust** 因为文件 I/O、文本处理和解析必须永远不会崩溃 — Rust 的所有权系统保证内存安全
- **结果**:C++ 的速度,Rust 的安全性。可执行文件在所有平台上仅 **~12 MB**(~12.4 MB Linux x64,macOS / Windows 类似)。最新 v0.1.119 下载大小:**4.4 MB** Linux x64 tar.gz · **4.1 MB** Linux ARM64 tar.gz · **27.7 MB** macOS DMG(包含捆绑的 Qt)· **42.7 MB** Windows MSI · **32.8 MB** Windows NSIS · **37.4 MB** Windows 便携式 zip。_安装后,Windows 占用空间约为 ~75-85 MB,因为 MSI 提取了捆绑的 Qt + QScintilla DLL — 对于任何基于 Qt 的安装程序来说,这是正常的。_
---
## 安装
### 一键安装
**Linux / macOS:**
```bash
curl -fsSL https://notepatra.org/install.sh | sh
```
**Windows (PowerShell):**
```powershell
irm https://notepatra.org/install.ps1 | iex
```
就是这样。自动检测您的操作系统,下载正确的二进制文件,安装它,添加到 PATH,创建快捷方式。
### 或者手动下载 — [最新版本:v0.1.119](https://github.com/singhpratech/notepatra/releases/latest)
| 平台 | 下载 | 大小 | 包含内容 |
|---|---|---|---|
| 🐧 **Linux x64** | [`.tar.gz`](https://github.com/singhpratech/notepatra/releases/latest) | **4.4 MB** | 裸 `notepatra` 二进制文件。您的发行版中的 Qt5。 |
| 🐧 **Linux ARM64** | [`.tar.gz`](https://github.com/singhpratech/notepatra/releases/latest) | **4.1 MB** | ARM64 Linux 上的裸 `notepatra` 二进制文件。 |
| 🍎 **macOS Apple Silicon** (M1–M4) | [`.dmg`](https://github.com/singhpratech/notepatra/releases/latest) | **27.7 MB** | 包含捆绑的 Qt 框架的 `Notepatra.app`。拖到应用程序文件夹。 |
| 🪟 **Windows x64 (MSI)** | [`.msi`](https://github.com/singhpratech/notepatra/releases/latest) | **42.7 MB** | WiX 构建的 MSI。每个机器安装,升级代码处理,文件类型关联为 `.txt`、`.log`、`.md`、`.json`、`.py`、`.cpp` 等,添加到 PATH。适合企业 / SCCM 部署。 |
| 🪟 **Windows x64 (安装程序)** | [`.exe`](https://github.com/singhpratech/notepatra/releases/latest) | **32.8 MB** | NSIS 安装程序。在“设置”→“应用程序”→“已安装的应用程序”中注册。可以通过控制面板卸载。 |
| 🪟 **Windows x64 (便携式)** | [`.zip`](https://github.com/singhpratech/notepatra/releases/latest) | **37.4 MB** | `notepatra.exe` + Qt DLL + QScintilla DLL。解压并运行。无需安装程序,无注册表。 可选:双击 `register-associations.bat` 以将 Notepatra 添加到“打开方式”菜单,适用于 `.txt`/`.md`/`.py`/`.json`/等。 — 仅 HKCU,无需管理员权限。撤销操作使用 `unregister-associations.bat`。 |
> ⚠ **下载大小与安装大小不同。** 上面的数字是 **下载大小** — 您从 GitHub Releases 抓取的 `.msi` / `.dmg` / `.tar.gz` 文件。安装后,磁盘占用空间较大,因为安装程序提取了捆绑的 Qt DLL、QScintilla DLL 和 Rust 核心库。**典型的 Windows 安装大小:~75-85 MB.** Linux 安装仍然很小(~12 MB 磁盘空间),因为 Qt5 来自您的发行版存储库,而不是 tarball。macOS Notepatra.app 磁盘空间约为 ~50-60 MB,删除 `xattr` 后。
> **精简版 vs 完整版。** 上面的下载是默认的 **精简版**。每个版本还提供一个可选的 **完整版**(`-full`),在所有平台上捆绑 **DuckDB** 查询引擎 — 此外,在 **Linux 和 Windows** 上,还提供 QtWebEngine 内联 Vega-Lite 图表渲染器(`generate_chart` 工具)。**macOS 完整版仅限 DuckDB**:Homebrew `qt@5` 不再提供 QtWebEngine,因此内联 Vega 图表是 Linux/Windows 完整版功能。本地围栏 `` ```chart `` (QtCharts)渲染器和 `.npd` 图表工具在 **所有平台**的 **两种**版本中均可用。
**为什么下载大小不同?** 裸 `notepatra` 可执行文件在每个平台上均为 **~12 MB**(~12.4 MB Linux x64 — 比 Linux 上的 gcc 编译的二进制文件略小,Windows/macOS 上使用 clang + MSVC 编译)。在 Linux 上,Qt5 是一个标准的系统包 (`apt install qtbase5-dev libqscintilla2-qt5-dev`),因此下载内容仅为二进制文件(~4.4 MB 压缩)。在 macOS 和 Windows 上,Qt 不预先安装,因此我们将 Qt 框架/ DLL 与可执行文件捆绑在一起以实现可移植性 — 与 Krita、Kdenlive 和每个跨平台 Qt 应用程序使用的相同方法。即使捆绑了 Qt,Notepatra 在 ~12–85 MB 的情况下安装,而 VS Code 则为 300+ MB。
> macOS Intel:预构建版本不提供。Apple 停止销售 Intel Mac,于 2023 年,GitHub Actions `macos-13` 运行器不可靠。Intel Mac 用户 — `git clone` 并运行 `./build.sh`。构建时间约为 3 分钟。
### 管理员 / 团队安装 — 适用于 IT、DevOps 和受监管的团队
对于一次安装后所有用户可见的共享机器,或者通过 SCCM / Jamf / Ansible / Salt 静默推送到团队,支持的每个平台都有一个每机器的工件:
| 操作系统 | 工件 | 静默管理员安装 |
|---|---|---|
| 🪟 **Windows** | [`notepatra-x.x.x.msi`](https://github.com/singhpratech/notepatra/releases/latest) | `msiexec /i notepatra-0.1.119.msi /quiet` — 安装到 `C:\Program Files\Notepatra\`,添加系统 PATH,注册 HKCR 文件关联,所有用户开始菜单。WiX 构建,支持 MajorUpgrade,兼容 SCCM。 |
| 🍎 **macOS** | [`Notepatra.dmg`](https://github.com/singhpratech/notepatra/releases/latest) | 挂载 + `sudo cp -R "/Volumes/Notepatra/Notepatra.app" /Applications/` 来自部署脚本。或者手动打开 DMG 并拖到 `/Applications`(管理员密码)。已签名 + 钉住。 |
| 🐧 **Debian / Ubuntu / Mint / Pop!_OS** (x64 + ARM64) | [`notepatra_0.1.119_amd64.deb`](https://github.com/singhpratech/notepatra/releases/latest) | `sudo apt install ./notepatra_0.1.119_amd64.deb` — 安装到 `/opt/notepatra/` + `/usr/bin/notepatra` 符号链接,hicolor 图标,`.desktop` 注册。ARM64:替换 `amd64` → `arm64`。 |
| 🐧 **Fedora / RHEL / CentOS Stream / Rocky / Alma** (x64 + ARM64) | [`notepatra-0.1.119-1.x86_64.rpm`](https://github.com/singhpratech/notepatra/releases/latest) | `sudo dnf install ./notepatra-0.1.119-1.x86_64.rpm` — 与 `.deb` 布局相同。ARM64:替换 `x86_64` → `aarch64`。捆绑 QScintilla 2.14.1 与二进制文件,因为 Fedora 提供不兼容的打包。 |
| 🐧 **Arch / openSUSE Tumbleweed / Manjaro / EndeavourOS / 其他 glibc 2.38+** | [`Notepatra-0.1.118-x86_64.AppImage`](https://github.com/singhpratech/notepatra/releases/latest) | `chmod +x Notepatra-0.1.118-x86_64.AppImage && sudo cp Notepatra-0.1.118-x86_64.AppImage /opt/notepatra.AppImage && sudo ln -s /opt/notepatra.AppImage /usr/local/bin/notepatra`。需要 glibc 2.38+(Ubuntu 24.04+,Fedora 40+,Arch,Tumbleweed)。旧发行版:使用 `.deb` / `.rpm`。 |
> 所有工件都附带 cosign `.sig` + `.pem`,用于无密钥 Sigstore 验证和 SLSA 构建出处。查看 **[验证下载](#verify-your-download)**。
#### 🔒 `notepatra-local-ai` — 面向受监管环境的云免费构建
对于 **无法或不愿将代码发送到公共 LLM 端点** 的团队 — 受监管行业(金融、医疗、法律、政府)、数据主权地区(欧盟 GDPR、印度 RBI、中国)、空气隔离网络,或任何希望通过构建实现隐私的团队 — 有一个专用的云免费构建,可用于 **Linux 和 Windows**:
| 操作系统 | 工件 | 静默管理员安装 |
|---|---|---|
| 🪟 **Windows** | [`notepatra-local-ai-0.1.119.msi`](https://github.com/singhpratech/notepatra/releases/latest) | `msiexec /i notepatra-local-ai-0.1.119.msi /quiet` — 安装到 `C:\Program Files\Notepatra Local AI\`,不同的 UpgradeCode,因此 SCCM 将其视为独立产品。添加/删除程序显示“Notepatra Local AI”。 |
| 🐧 **Debian/Ubuntu x64** | [`notepatra-local-ai_0.1.119_amd64.deb`](https://github.com/singhpratech/notepatra/releases/latest) | `sudo apt install ./notepatra-local-ai_0.1.119_amd64.deb` |
| 🐧 **Debian/Ubuntu ARM64** | [`notepatra-local-ai_0.1.119_arm64.deb`](https://github.com/singhpratech/notepatra/releases/latest) | `sudo apt install ./notepatra-local-ai_0.1.119_arm64.deb` |
**二进制文件在物理上无法访问 `api.openai.com`、`api.anthropic.com`、`openrouter.ai`、`api.mistral.ai`、`generativelanguage.googleapis.com` 或任何其他公共 LLM 端点。** 每个 `QNetworkAccessManager` 请求都经过一个仅允许以下内容的允许列表:
- `localhost` / `127.0.0.1` / `[::1]`
- RFC1918 (`10.x`、`172.16-31.x`、`192.168.x`)
- CGNAT 范围 (`100.64.0.0/10` — 涵盖 Tailscale、公司 VPN)
- IPv6 唯一本地 (`fc00::/7`)
- DNS 后缀 `.local`、`.lan`、`.internal`、`.intranet`、`.corp`、`.home`
本地 Ollama、本地 llama.cpp、LAN 上的自托管 Ollama 以及任何其他您已在本地或私有网络上安装的 OpenAI 兼容服务器 — **所有这些在云免费构建中继续有效**。只有公共云 LLM 端点被阻止。云 URL 粘贴框也被从 UI 中删除,因此用户甚至无法输入公共主机。审计人员可以通过运行 `strings notepatra | grep -c openai.com` 来确认 — 零命中。
在 Linux 上,两种版本共享相同的 `notepatra` 二进制文件名,磁盘上;`apt` 确保一次只安装一个 `notepatra` / `notepatra-local-ai`,通过 `sudo apt install ./notepatra-local-ai_0.1.119_amd64.deb` 事务交换。 在 Windows 上,两个 MSI 是独立产品(不同的 UpgradeCode + ProductName + 安装目录),因此如果需要,它们可以共存;管理员通常根据策略推送其中一个。`notepatra --version` 自识别构建名称 — 仅裸精简构建带有版本后缀:`Notepatra Lite v0.1.119`,精简构建为 `Notepatra v0.1.119`(捆绑 DuckDB),以及 `Notepatra Local AI Lite v0.1.119` / `Notepatra Local AI v0.1.119`,适用于云免费(本地 AI)构建;相同名称显示在窗口标题栏和“关于”对话框中。
### 验证下载
每个版本都附带 **SHA-256 校验和**、**Sigstore(cosign)签名** 和 **SLSA 构建出处**。上面的 `install.sh` 和 `install.ps1` 脚本已经自动验证 SHA-256 并在不匹配时拒绝安装 — 但如果您手动下载,您应该自己验证。
```bash
# Linux / macOS — 校验和
curl -sL -O https://github.com/singhpratech/notepatra/releases/latest/download/SHA256SUMS
sha256sum -c SHA256SUMS --ignore-missing
# 任意平台 — cosign 验证(Sigstore)
# 将 `linux-x64` 替换为 `linux-arm64`,如果您下载了 ARM64 版本。
cosign verify-blob \
--certificate-identity-regexp '^https://github.com/singhpratech/notepatra/' \
--certificate-oidc-issuer 'https://token.actions.githubusercontent.com' \
--certificate notepatra-linux-x64.tar.gz.pem \
--signature notepatra-linux-x64.tar.gz.sig \
notepatra-linux-x64.tar.gz
# 任意平台 — SLSA 构建出处
# 将 `linux-x64` 替换为 `linux-arm64`,如果需要。
gh attestation verify notepatra-linux-x64.tar.gz --owner singhpratech
```
[SECURITY.md](SECURITY.md) 中有完整的说明、威胁模型和披露政策。
### 保持更新 — 安全的应用内更新
Notepatra 会在启动时检查 `github.com/singhpratech/notepatra/releases/latest`(无匹配时静默),并在有更新时弹出“有新版本可用”的对话框。点击 **下载**,更新程序将:
1. **为您选择正确的操作系统 + 架构的工件** — Linux x64 / ARM64 tar.gz,macOS DMG,Windows MSI(带有 NSIS `.exe` 和便携式 `.zip` 作为备用)。
2. **以可取消的进度对话框** 流式下载到 `~/Downloads/*.part`。
3. **获取版本的 `SHA256SUMS`** 并验证下载的哈希值。**如果哈希值不匹配,`.part` 文件将被删除,您将看到错误 — 系统上不会修改任何内容。**
4. **验证后,原子重命名 `.part` → 最终名称**。
5. **将操作系统的安装程序** — Windows 上的 `msiexec /i`,macOS 上的 `open <dmg>`(Finder 拖到应用程序),Linux 上的 `xdg-open` 到下载文件夹,以便您自己替换二进制文件。
**安全合约 — 更新程序永远不会让您面临损坏的安装:**
| 失败 | 会发生什么 |
|---|---|
| 无互联网 | 错误对话框,零磁盘写入 |
| 下载取消 | `.part` 删除,其他内容不变 |
| 电源/崩溃中途下载 | `.part` 孤儿在 `~/Downloads`,当前二进制文件未触及 |
| SHA-256 不匹配 | `.part` 删除,显示关键对话框,当前二进制文件未触及 |
| 无法获取发布版的 `SHA256SUMS` | 拒绝自动安装,打开发布页面进行手动验证 |
| 没有匹配的平台资产 | 拒绝自动安装,打开发布页面 |
| 操作系统安装程序取消或失败 | 安装程序自己的回滚 — 当前二进制文件未触及 |
Notepatra 进程 **永远不会重写或替换正在运行的二进制文件**。只有您明确点击的操作系统安装程序才能执行此操作,并且所有这些安装程序都具有自己的事务回滚(MSI `MajorUpgrade`,DMG 复制时复制,Linux 上的用户驱动的文件管理器交换)。
**手动检查:** `帮助 → 检查更新` 或 `?` 菜单。首次启动时也会显示检查(如果已更新则静默)。
### Windows:在从 v0.1.23 升级到 v0.1.24 后刷新“打开方式”条目
如果您从 v0.1.23 或更早版本升级,并且右键单击 **打开方式** 菜单仍然显示 `Notepatra â€" native code editor`(乱码文本)和/或红色 ❌ 图标,这是 **Windows shell-cache 滞后**,不是 Notepatra 错误。Windows 的 MuiCache 永久缓存可执行文件的 `FileDescription` 字符串,第一次读取时,并永远不会在升级时重新读取。新的 v0.1.24 二进制文件嵌入干净的 ASCII;Windows 只是显示缓存的旧字符串。
**一次性修复** — 打开 PowerShell(不需要管理员权限,所有更改仅限 HKCU 范围)并粘贴此整个块。在 Windows 11 上测试并确认有效:
```powershell
# 在此处粘贴代码块
```
# 1. 清除 Notepatra 在 MuiCache 中的过时条目(缓存中带有 â€" 文本)
$mui = "HKCU:\Software\Classes\Local Settings\Software\Microsoft\Windows\Shell\MuiCache"
Get-Item $mui | Select-Object -ExpandProperty Property | Where-Object { $_ -match "notepatra" } | ForEach-Object {
Remove-ItemProperty -Path $mui -Name $_ -Force
Write-Host "已清除 MuiCache: $_" -ForegroundColor Green
}
# 2. 清除指向旧 notepatra.exe 路径的过时 "Open with" 关联
Remove-Item "HKCU:\Software\Classes\Applications\notepatra.exe" -Recurse -Force -ErrorAction SilentlyContinue
$exts = @(".txt",".log",".md",".json",".py",".cpp",".js",".html",".css",".xml",".sql",".sh",".yml",".yaml",".ini",".conf",".csv",".rs",".go",".java",".rb",".php",".c",".h",".hpp",".tsx",".ts",".jsx")
foreach ($ext in $exts) {
Remove-Item "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\$ext\OpenWithList" -Recurse -Force -ErrorAction SilentlyContinue
Remove-Item "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\$ext\OpenWithProgids" -Recurse -Force -ErrorAction SilentlyContinue
}
Write-Host "已清除 $($exts.Count) 个扩展的 OpenWithList" -ForegroundColor Green
# 3. 强制 shell 重建关联缓存
ie4uinit.exe -show
ie4uinit.exe -ClearIconCache
Write-Host "已重建 shell 缓存" -ForegroundColor Green
# 4. 重启 Explorer(丢弃内存缓存)
Stop-Process -Name explorer -Force
Start-Process explorer
Write-Host "已重启 Explorer — 右键任意文件现在以验证" -ForegroundColor Cyan
---
## 它做了什么 — 逐行解释
| 步骤 | 操作及原因 |
|---|---|
| 1. MuiCache 清除 | 清除每用户缓存,Windows 存储在 "Open with" / 文件属性 → 详细信息中的 `FileDescription` 字符串。此缓存保存 `â€"` 乱码。 |
| 2. 按扩展名清除缓存 | 删除 28 种常见文件类型的 `OpenWithList` + `OpenWithProgids`。强制 Windows 在下次打开菜单时重新查询 .exe 的实际 `VERSIONINFO`。 |
| 3. `ie4uinit.exe -show` + `-ClearIconCache` | 内置 Windows 工具,重建 shell 关联 + 图标缓存。红色 ❌ 叠加层在此消失。 |
| 4. 重启 Explorer | 丢弃缓存的内存副本(第四层和最后一层)。如果不这样做,菜单可以保持陈旧,直到您注销 / 重启。 |
**验证它是否有效**:右键单击任意 `.txt` 或 `.json` 文件 → *打开方式* → Notepatra 条目现在应显示为 `Notepatra native code editor for the AI era`,并带有干净的图标。如果您在此之后仍然看到旧文本,请注销并重新登录(强制每个内核侧缓存层刷新)。
**新的 v0.1.24 安装程序在干净的机器上从未看到过此问题** — 它只影响从 v0.1.23 或更早版本升级的版本,其中首先缓存了 mojibaked 字符串。
---
### 从源代码构建
<details>
<summary>Linux(Ubuntu/Mint/Debian)</summary>
```bash
sudo apt install cmake qtbase5-dev libqscintilla2-qt5-dev
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source ~/.cargo/env
git clone https://github.com/singhpratech/notepatra.git
cd notepatra
cd rust-core && cargo build --release && cd ..
mkdir build && cd build && cmake .. && make -j$(nproc)
./notepatra
```
</details>
<details>
<summary>macOS</summary>
```bash
brew install qt@5 cmake
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source ~/.cargo/env
git clone https://github.com/singhpratech/notepatra.git
cd notepatra
# 从源代码构建 QScintilla(brew 版本链接到 Qt6)
./build.sh
```
</details>
<details>
<summary>Windows(MSVC)</summary>
**前提条件**
1. **Visual Studio 2022**,带有 *"C++ 桌面开发"* 工作负载
2. **Qt 5.15.2**,适用于 `msvc2019_64` — 通过 [Qt Online Installer](https://www.qt.io/download-qt-installer) 或 [aqtinstall](https://github.com/miurahr/aqtinstall) 安装
3. **CMake** ≥ 3.16 — `winget install Kitware.CMake` 或 [cmake.org/download](https://cmake.org/download)
4. **Rust** 稳定版 — [rustup.rs](https://rustup.rs)
**通过 CMake 包装器构建 QScintilla(一次)**
```powershell
git clone --depth 1 https://github.com/farleyrunkel/QScintilla.git $env:TEMP\qsci-src
cmake -S $env:TEMP\qsci-src -B $env:TEMP\qsci-src\build -G "Visual Studio 17 2022" -A x64 `
-DCMAKE_BUILD_TYPE=Release `
"-DCMAKE_PREFIX_PATH=C:\Qt\5.15.2\msvc2019_64" `
"-DCMAKE_INSTALL_PREFIX=$env:TEMP\qsci-install"
cmake --build $env:TEMP\qsci-src\build --config Release
cmake --install $env:TEMP\qsci-src\build --config Release
```
**构建 Notepatra**
```powershell
git clone https://github.com/singhpratech/notepatra.git
cd notepatra
cd rust-core; cargo build --release; cd ..
mkdir build; cd build
cmake .. -G "Visual Studio 17 2022" -A x64 `
"-DCMAKE_PREFIX_PATH=C:\Qt\5.15.2\msvc2019_64" `
"-DQSCINTILLA_INCLUDE=$env:TEMP\qsci-install\include" `
"-DQSCINTILLA_LIB=$env:TEMP\qsci-install\lib\qscintilla2_qt5.lib"
cmake --build . --config Release
```
**将 Qt + QScintilla DLL 捆绑在 exe 旁边**
```powershell
mkdir notepatra-win
copy build\Release\notepatra.exe notepatra-win\
windeployqt notepatra-win\notepatra.exe
copy $env:TEMP\qsci-install\bin\qscintilla2_qt5.dll notepatra-win\
.\notepatra-win\notepatra.exe
```
> 如果您遇到 `LNK2019 unresolved external symbol QsciScintilla::staticMetaObject`,请验证 `CMakeLists.txt` 为 Windows 目标定义了 `QSCINTILLA_DLL`。如果没有它,MSVC 将不会发出 `__declspec(dllimport)`,链接器将无法解析导入库中的符号。这是找到需要 12 次 CI 迭代的 gotcha。
</details>
---
## 插件系统
将共享库放入 `~/.config/notepatra/plugins/`,然后重启。
- Linux:`.so` 文件
- macOS:`.dylib` 文件
- Windows:`.dll` 文件
### 在 30 秒内编写您自己的插件:
```cpp
// myplugin.cpp
extern "C" {
const char* notepatra_plugin_name() { return "我的插件"; }
const char* notepatra_plugin_version() { return "1.0"; }
const char* notepatra_plugin_author() { return "您的名字"; }
char* notepatra_plugin_run(const char* text, int len) {
// 您的魔术在这里 — 转换文本,返回 malloc'd 结果
// 返回 NULL 以保持文本不变
}
}
```
```bash
# Linux
g++ -shared -fPIC -o myplugin.so myplugin.cpp
# macOS
clang++ -shared -o myplugin.dylib myplugin.cpp
# Windows
cl /LD myplugin.cpp /Fe:myplugin.dll
```
---
## 为什么不使用...?
| 编辑器 | 下载大小 | 原生 | 本地 AI | 内置 JSON 修复程序 | 2 GB 文件 | Linux | Win | Mac | 免费 |
|---|---|---|---|---|---|---|---|---|---|
| **Notepad++** | ~4 MB | ✓ | ✗ | 插件 | ✗ | ✗ | ✓ | ✗ | ✓ |
| **VS Code** | ~300 MB | ✗ Electron | 扩展 | 扩展 | ✗ | ✓ | ✓ | ✓ | ✓ |
| **Vim / Neovim** | ~3 MB | ✓ | ✗ | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ |
| **Sublime Text** | ~30 MB | ✓ | ✗ | ✗ | ✓ | ✓ | ✓ | ✓ | $99 |
| **Kate / Gedit** | ~30 MB | ✓ | ✗ | ✗ | ✓ | ✓ | ✗ | ✗ | ✓ |
| **Notepatra** | **4.1 / 27.5 / 42.7 MB** | ✓ C++/Rust | ✓ Ollama | ✓ 正则表达式 + AI | ✓ Rust mmap | ✓ | ✓ | ✓ | ✓ GPL-3 |
> *Notepatra 下载大小为 Linux x64 tar.gz / macOS DMG / Windows MSI(v0.1.119)。Linux 只是二进制文件(Qt 系统安装)。macOS 和 Windows 包含捆绑的 Qt。内部 `notepatra` 可执行文件在每个平台上约为 ~12 MB(Linux 12.4 MB,macOS / Windows 类似)。压缩下载更小,因为 tar.gz / DMG / MSI 都压缩二进制文件和共享库。*
---
## 测试
通过 CMake + CTest 集中进行自动化回归测试,并在 CI 中运行 — **70 个测试套件**(完整构建为 67 个,精简版省略了两个 DuckDB 套件和 WebEngine-gated Noter-export 套件);全部通过,每个套件都有许多断言。代表性样本:
- `test_lexers` — 验证每个已发布的 QScintilla lexer 都会产生实际样式
- `test_palette` — 验证规范的 9 色调调色板颜色和粗体/斜体样式
- `test_fmtpanel_diff` — 验证格式化面板保持差异状态并发出信号
- `test_compare_widget` — 验证内置的 Compare 面板差异/编辑/关闭路径
- `test_sqlfmt` — 33 个断言,涵盖 11 种 SQL 方言,通过 AST 打印机
- `test_updater` — 验证 `pickAssetForPlatform`,SHA256 解析和资产评分(18 个断言)
- `test_projectsearch` — 验证 Rust 支持的项目搜索流路径
- `test_projectsearch_ui` — 验证项目搜索 UI 绑定
- `test_ollama` — 验证实时 Ollama 模型检测(如果离线则干净地跳过)
- `test_aifix` — 在真正的 Ollama 守护进程上运行 AI-fix 清理路径(如果离线则干净地跳过)
- `test_llamacpp` — 运行 llama.cpp 后端路径
- `test_ai_context` — 验证 AI 工作区上下文总结器
在本地运行它们:
```bash
./build.sh --tests
```
Ollama / llama.cpp / AI-fix 测试在没有推理后端运行时会干净地跳过,因此本地和 CI 运行保持确定性。
## 版本发布记录
Notepatra 遵循 [Keep a Changelog](https://keepachangelog.com/) 和 [Semantic Versioning](https://semver.org/) 的规范。每个版本都经过标记、签名,并发布到 GitHub Releases,包含适用于 Linux x64、Linux ARM64、macOS Apple Silicon 和 Windows x64 的二进制文件。
| 版本号 | 日期 | 主要更新 |
| --- | --- | --- |
| [**v0.1.119**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.119) | 2026-07-18 | **MCP 深度 - 35 个工具。** `notepatra-mcp` 侧车从 22 个工具增长到 **35 个工具,分为三个层级** - **读取 18 个 / 操作 9 个 / 写入 8 个**。新增读取工具:`list_reminders`、只读 Git(`git_status` / `git_diff` / `git_log` / `git_show` / `git_branch`)、`validate_npd` 和 **`run_sql`**(仅限 SELECT)。新增操作工具:`open_note`。新增 **人工审批** 的写入动词:`create_note`、`append_note`、`set_reminder`、`export_diagram`。`find_in_tab` / `search_project` 新增可选 `regex` 标志。**支持 Windows 命名管道传输**(Linux/macOS/Windows 均通过 `--socket` 连接;预编译的 Windows 二进制文件尚未包含在签名捆绑包中 - 需要从源代码构建 / `cargo install`)。 **`run_sql` 安全:** 通过 SQL 分类器仅限 SELECT,以及在 Full/DuckDB 版本中,使用引擎沙盒 - 文件在内存中物化,然后在运行不受信任的查询之前设置 `enable_external_access=false`,因此它无法读取主机文件;对抗性安全检查确保其安全性后才发布。裸 Lite 二进制文件大小保持不变(12.4 MB)(新工具位于侧车)。完整离屏测试 71/71,Lite 68/68,60 个侧车 cargo 测试,跨所有 35 个工具进行实时端到端测试。 |
| [**v0.1.118**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.118) | 2026-07-17 | **MCP 支持 - 您的编辑器,可被 AI 读取。** 新增独立的 **`notepatra-mcp`** 侧车:一个符合规范的 stdio JSON-RPC 2.0 [模型上下文协议](https://modelcontextprotocol.io) 服务器,暴露 **22 个工具,分为三个层级** - 读取(10 个)、操作(8 个)和写入(4 个)- 以及开放的标签 / Noter 笔记作为 MCP 资源和 3 个预制提示。与 **Claude Desktop、Claude Code、OpenAI Codex CLI、OpenAI Agents SDK** 以及任何符合规范的 stdio MCP 客户端配合使用。 **每次写入都需要人工审批:** 在编辑器窗口中显示一个 Approve/Deny 卡片,120 秒自动拒绝,FIFO 每次一个, 无头部绕过 - 网关位于编辑器进程中,因此没有 MCP 客户端可以在没有人工点击的情况下写入。仅限本地套接字 + stdio,无网络连接;Linux/macOS 首先(Windows 命名管道传输在未来版本中)。预编译的 `notepatra-mcp` 二进制文件作为 cosign 签名发布工件提供;新的文档页面 [notepatra.org/mcp.html](https://notepatra.org/mcp.html)。裸二进制文件大小声明已纠正为 12.4 → 12.4 MB。完整测试 68/68 + 47 个侧车 cargo 测试 + 实时 E2E 17/17。 |
| [**v0.1.117**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.117) | 2026-07-17 | **诚实版本 - 对每个组件进行 32 个代理的对抗性审计,每个确认的缺陷都已修复,删除了约 4,100 行无效代码。** 没有新依赖,相同的裸二进制文件(略小)。 **查找和替换说真话:** 文件查找现在显示其结果(它们曾经被写入一个从未显示的小部件),整个单词由计数 / 替换全部 / 文件查找尊重,行号在非 ASCII 文件中正确,不再显示无效控件直到它们工作。 **Noter 导出解锁:** 笔记现在可以从右键菜单导出为 PDF / Markdown(导出程序已完全构建和测试 - 它只是没有 UI 入口点);可调整大小的弹出窗口,带有可见的固定状态;黑暗 / Monokai 正确的对话框。 **UTF-32 文件带有表情符号,不再在保存时损坏** (字节级往返测试)。终端获得了真正的停止按钮;选项卡颜色在重新排序时保持不变;图像附件不再由硬编码的模型列表控制。 **约 150 个 Rust 核心单元测试提升到 CI + 发布网关**;git 面板测试复活;完整测试 **70/70**。为 AI 助手新增: [llms.txt](https://notepatra.org/llms.txt) + 爬虫友好型 robots.txt + CITATION.cff。 |
| [**v0.1.116**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.116) | 2026-07-06 | **两个专注的、对抗性验证的修复 - 没有新功能,相同的裸二进制文件,没有新依赖。** **比较视图现在可读:** 更改的 **单词** 内联差异高亮使用深红色 / 绿色填充,埋没了文本;现在它是一个柔和的洗涤效果,具有清晰的红色 / 绿色轮廓, **WCAG AA 在浅色 / 深色 / Monokai 下**。 **更新程序选择正确的版本:** 版本资产选择器以前平等地为每个安装程序变体评分,因此 GitHub 资产顺序可能会为您提供错误的版本;现在它 **确定性地选择与此构建版本匹配的安装程序**(Lite/Full × cloud/local-AI)跨 Windows / macOS / Linux。完整测试 **70/70**,每个修复都经过红色状态验证。 |
| [**v0.1.115**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.115) | 2026-07-05 | **安全性、稳健性和质量强化 - AI 编码助手从 B → A-,数据分析师从 C+ → A-。** 没有新功能,相同的裸二进制文件,没有新依赖。 读取数据库访问现在在 **三个实际层级中强制执行** - 引擎级 DuckDB `READ_ONLY`,结构化 SQL 分类器 **替换旧的可绕过的前缀门控**,以及 PostgreSQL/MySQL 会话只读 - 并且任何数据变异现在都会引发 **人工审批卡片**(模型不能通过 `confirm:true` 自行审批)。查询 **取消/超时真正中断正在运行的 DuckDB 查询** (`duckdb_interrupt`),并且行上限防止 OOM。 AI 工具注册表现在 **感知模式**(只读 *Ask* 段和 *Data* 模式不能写入文件),Compose 运行 **主机强制的干燥运行**,编辑 **通过 `QSaveFile` 原子化**(失败的写入不能破坏您的原始文件),并且 *approve all* 按操作类型限定。截断的模型输出现在是一个不同的 **"响应被截断 - 重试"** 状态。测试:以前 **看不见** 的只读门控测试(被 git 排除,从未编译)现在真实且 CI 运行(143 个断言),加上新的写入门控(44)和异步数据库(30)套件;完整测试 **70/70**(高于 67),每个修复都经过红色状态验证,并且 5 个代理的对抗性舰队捕获并关闭了一个修复引入的回归。 |
| [**v0.1.114**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.114) | 2026-06-11 | **打开文件现在是防弹的 - Windows 的“双击无响应”鬼魂打开类已死。** 单实例交接现在是问候门控的(运行实例在发送有效载体之前证明它是活动的,每个字节确认排空;挂起的实例产生一个 **可见的临时窗口** 而不是沉默 - 阻止双重打开)。 **非 ASCII 路径现在在 Windows 上打开**(真正的 UTF-16 argv,以前是 ANSI 代码页混淆)。 **会话不会被无声丢失:** 每个会话被动窗口( `--new` 、回退、恢复跳过)在关闭时提示保存 / 丢弃 / 取消; session.json 在 Windows 上是原子的;登录竞争不能产生两个会话写入器。 **文件 → 关闭所有文件不再冻结应用程序** (预先存在的无限循环 vs 保留一个选项卡的后台填充);监视器提示严格每次一个(在提示期间的文件删除可以通过释放的编辑器崩溃);字数缓存/去抖动适用于多 MB 文件;崩溃留下异步信号安全标志。 13 个深入的发现 + 30 个舰队确认的后续 - 每个严重的都被修复,7 个低优先级项目被记录为延迟。 13 个新测试套件(共 67 个)。 |
| [**v0.1.113**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.113) | 2026-06-06 | **Noter 成长 - 从 C- 评为 A。** v0.1.112 系统记录波在此标签下发布,并进行了强化检查,以关闭 12 个对抗性重新验证发现(3 个关键 + 9 个高,其中几个由 v0.1.112 修复本身引入):提醒在应用程序范围内触发并跟随重命名,保存失败不能被检查列表导航静默丢弃,冲突在导航过程中保持可见并保留实际标题,提取单次飞行并应用到启动笔记,检查列表主题切换保持撤销/重做完整,主体搜索是线性的(2 MB 笔记:~125 秒卡顿 → ~1.4 秒)。 `apply_diff` 以字节为单位写入插入的行;写入门控审批重置重试保护并始终记录。完整测试 54/54,每个发现由专用合约测试固定; 7 维度重新评级: **A**。 |
| [**v0.1.112**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.112) | 2026-06-06 | **Noter - 系统记录波(审计评级 C- → 目标 A)。** 19 个代理的用户体验审计发现 Noter 在实时捕获方面非常出色,但在其周围不可靠;此版本修复了每个关键/高发现的问题。 **提醒现在实际触发** - 引擎在应用程序生命周期内而不是随 Noter 标签死亡,并且在应用程序关闭时错过的提醒会作为一个消化摘要到达。 **保存失败是响亮的** (红色 NOT-SAVED + 横幅 + 保存副本逃脱),外部编辑被转移到 **冲突副本** 而不是被覆盖,保存是 fsync 持久的,具有 ≤2 秒的崩溃丢失侧车。 **搜索读取笔记正文** (以前仅限标题)并显示摘要和匹配计数;每个显示标题;头部在重新加载后生存。 **AI 提取不会使应用程序挂起** (飞行前 + 看门狗 + 取消)并且其结果一致地保留到笔记中。 **Noter 跟随黑暗 / Monokai 主题** (以前是硬编码的浅色)。另外,对编码代理进行了 3 层 `apply_diff` 强化(工具端逃脱检查 + 退化块拒绝,模型无关的恢复梯度,坚持突破)。无新依赖,相同的裸二进制文件。完整测试绿色(54 个套件)。 |
| [**v0.1.111**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.111) | 2026-05-31 | **可爱的 AI 代理浪潮 - 四个使代理编辑值得信赖的 UX 功能(评级 B- → B+/A-)。** 代理模式现在在 `write_file` / `apply_diff` 实际接触磁盘之前显示一个 **批准 / 拒绝** 确认门控,因此自主编辑永远不会在未经确认的情况下进行。 **上下文透明度** 芯片和弹出窗口准确显示发送给模型的代码库上下文,具有每个源的排除切换按钮,以便在模型离开您的机器之前丢弃文件或文件夹。每个 **Composer Apply** 现在都是防漂移的,并且字节准确 - 一个“撤销应用”精确恢复文件,并且如果它在您不知情的情况下更改,则拒绝。并且 **Ctrl+I 内联编辑** 呈现一个真实的、主题感知的 Myers 差异,以便您在接受之前看到实际更改的差异。 UX/行为仅限 - 无新依赖,相同的裸二进制文件,下载大小不变。 52/52 测试通过。 |
| [**v0.1.110**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.110) | 2026-05-31 | **AI 编码助手 - 信任和清晰度传递(由深入的用户体验审计驱动,评级 C+ → B-)。** 助手标题现在一目了然地显示您的完整姿态 - `AI · CODING · COMPOSE`(审阅后写入,青绿色)vs `AI · CODING · AGENT`(写入实时写入,红色)- 因此您永远不会猜测 AI 是否会编辑您的文件。 编码现在默认为安全的 **Compose** 通道(提议后审查),而不是自主 Agent,因此重新打开永远不会在不经确认的情况下将您拉入实时写入。应用提议的编辑现在会标记每个文件 **✓ 应用**,显示确认,并禁用再次应用(不再“它是否落地?”或意外重复写入)。内联编辑(Ctrl+I)现在使用 **您选择的模型**(不是固定的小默认 - 修复了没有硬编码模型规则),并将其更改分组为 **一个撤销**,因此单个 Ctrl+Z 恢复整个 AI 编辑。 UX/状态仅限 - 无新依赖,相同的裸二进制文件,下载大小不变。 51/51 测试通过。 |
| [**v0.1.109**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.109) | 2026-05-31 | **完整构建不再带有“完整”名称标签 - 默认构建现在自称为“Notepatra”。** `notepatra --version`、标题栏和关于对话框显示 **Notepatra** 用于完整(DuckDB 捆绑)构建,而不是“Notepatra Full” - 完整版本是默认的,因此它不带有限定符。裸构建仍然显示 **Notepatra Lite**,而云免费构建是 **Notepatra Local AI** / **Notepatra Local AI Lite**。仅限于命名 - Lite 与 Full *下载* 不变(Full 仍然捆绑 DuckDB 引擎),以及二进制文件的功能和下载大小不变。 51/51 测试通过。 |
| [**v0.1.108**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.108) | 2026-05-31 | **数据分析师模式编写更清晰的 SQL - 为内置分析师提示添加了三个过滤器正确性成语。** 不区分大小写的文本搜索:“description contains X”现在将两个边小写(`LOWER(col) LIKE '%x%'`)而不是区分大小写的匹配,它会默默跳过大写行并计数不足。精确代码匹配:当问题命名编码值(“LOINC 8480-6”,“CVX 140”)时,分析师匹配裸存储代码并停止,而不是添加猜测的 `SYSTEM=`/`CATEGORY=`/冗余 `LIKE`谓词可能会丢弃每个匹配的行。 **仅限提示** - 相同的裸 Lite 二进制文件,无新依赖,下载大小不变;三个成语针对多域文本到 SQL 评估进行验证(生产模型的剩余综合 EHR 缺陷已修复,无回归)。 51/51 测试通过。 |
| [**v0.1.107**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.107) | 2026-05-30 | **所有三个平台的 Lite + Full 下载,Full 中捆绑了 DuckDB v1.1.3。** 以前只有 Linux 发布 `-full` 构建;macOS DMG / Windows MSI 发货时没有 WebEngine,尽管文档说明(v0.1.106 Windows zip 缺少 WebEngine DLL)。现在每个平台都提供精简(裸) 和完整下载 - 完整版捆绑 **DuckDB v1.1.3** (在进程内 Parquet / JSON / S3 / SQLite 联邦),以及 Linux/Windows 上的 QtWebEngine 内联 Vega-Lite 图表渲染器(macOS 完整版仅为 DuckDB;原生围栏 ```图表 QtCharts 渲染器适用于所有平台)。应用程序现在在其 `--version` / 栏 / 关于(Notepatra Lite / Full,以及 Notepatra Local AI Lite / Full)。** 修复:** 13 个双映射的文件扩展名仅由哈希顺序解析 - 通过测试进行去重和锁定;`Ctrl+Shift+K` 绑定到删除行和取消注释行(取消注释移动到 `Ctrl+Alt+U`)。 51/51 测试通过。 |
| [**v0.1.106**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.106) | 2026-05-29 | **可靠性和安全性强化版本 - 每个更改都强化了已经发布的代码路径,没有新功能。** 会话恢复可能会在恢复的选项卡指向不可读/已打开的文件时,将未保存的内容写入错误的文件(现在将孤立的内容放在新的未标题选项卡中)。CredScrub 现在运行在 AI 工具结果通道上(`read_file`/`git_diff` 正文被转发到后端);读取文件拒绝列表添加 dotenv 家族,包括 `app.env`/`database.env`,`secrets.json` 和 `*.tfvars`/`*.tfstate`;图表 HTML 导出是 XSS 转义的(两个构建路径);干燥编辑现在排队一个绝对路径,因此它们不能覆盖 `$HOME`;Rust 核心中的内部 NUL 堆栈溢出读取(Base64 解码)被修复。 另外还有大文件内存软门控。 |
| [**v0.1.105**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.105) | 2026-05-29 | **v0.1.104 的每个符号颜色现在默认出现在 ER 和 System 启动器模板中,而不仅仅是流程图。** 颜色从未被图表类型门控 - 它一直适用于数据库气缸和图标节点 - 因此这是一个纯粹的可发现性修复:ER 启动器现在对实体进行颜色分组(绿色主节点 / 蓝色事务节点),而 System 启动器对层进行分组(青色边缘 / 蓝色应用程序 / 紫色数据),并且帮助状态适用于每个节点类型和图表。颜色仍然是可选的。 |
| [**v0.1.104**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.104) | 2026-05-29 | **图表获得可选的每个符号颜色和链接的箭头 - 两个都是原生和可选的,两个都保持单色默认。** 在节点的形状后添加 `#hex` 或命名颜色(`node proc [Process] #1565c0`,`node start (Start) green`)以获得具有自动对比度的彩色符号,适用于任何调色板/主题;在一行上连接一系列节点(`a -> b -> c`,标签位于最后一个跳跃)。另外,`.npd` 解析器强化通过对抗性解析审计 - 节点 ID 可以包含冒号/URL(`http://x -> y`),节点标签可以包含 `->`,而受信任的图表标题不能再将活动标签注入导出的 HTML/SVG。 |
| [**v0.1.103**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.103) | 2026-05-27 | **图表现在在默认二进制文件中原生渲染 - 在所有平台上,包括 macOS Apple Silicon 和 Windows 安装程序 - 无需 WebEngine,无需 Chromium,也无需单独的“完整”下载。** v0.1.102 在嵌入式 Chromium(QtWebEngine + dagre.js)中绘制图表,因此图片从未出现在默认精简二进制文件、macOS Apple Silicon 或任何没有捆绑 WebEngine 的地方。 v0.1.103 用原生 `QPainter` 渲染器替换整个管道(`src/diagram/diagram_render.{h,cpp}`):最短路径分层 + 巴里中心交叉减少,边界锚定贝塞尔连接器,~55 个手绘图标(~150 个别名)用于系统/ER/流程图,5 个调色板,可滚动缩放/拖动平移。 在每个构建上导出到 PNG/JPEG/PDF,以及 Qt Svg 模块存在时导出 SVG/HTML,WebP 存在时导出 WebP - 导出菜单显示您的构建实际支持的功能。 不再有完整与精简的图表拆分。 |
| [**v0.1.102**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.102) | 2026-05-25 | **图表工具:支持流程图、ER图、系统图,AI生成,实时画布,PNG/SVG/PDF/HTML导出**。新增全功能图表工具(完整版):基于文本DSL的`.npd`文件是数据源,画布是实时投影。创建图表有三种方式:**AI生成**(描述图表 → 预览生成的`.npd` → 插入)、模板、直接编写`.npd`(支持**导入Mermaid**)。提供5种形状、12种图标、有向/标签/双向箭头、标签溢出提示、5种调色板、无限缩放。工具栏按钮位于Noter旁边 + 工具内帮助速查表 + `samples/diagram_showcase.npd` + `npd_render` CLI。 **同时修复**:`CMAKE_AUTORCC`曾未启用,导致`.qrc`资源(`vega.qrc`内联图表、`icons.qrc`、图表渲染层)未正确打包在完整构建中,现已修正。所有53个ctest测试均通过。 |
| [**v0.1.101**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.101) | 2026-05-25 | **应用内更新程序现已修复**。在macOS上,更新下载并验证后,但未能完成,提示“无法完成下载文件”。这是由于`Updater::runUpdate()`在移动已验证的`~/Downloads/<name>.part`到`<name>`时,如果文件存在则删除,但如果文件正在被macOS占用(例如.dmg文件在Finder中显示为已挂载),则`QFile::rename`会失败。解决方法是新增`uniqueDestPath()`函数,确保文件被复制到一个浏览器风格的临时路径(例如`<name> (1).dmg>`)并支持复制后删除的回退机制。这项修复在所有平台上都有改进。新增`test_updater`测试用例,覆盖`.dmg`/`.tar.gz`/`.msi`/`.deb`/`.AppImage`等不同格式的重复检查。所有47个ctest测试均通过。 |
| [**v0.1.100**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.100) | 2026-05-25 | **第100个版本发布 - 窗口现在在Windows上居中打开**。在冷启动或双击文件时,窗口可能会出现在屏幕顶部以外,隐藏了最小化/最大化/关闭按钮。原因是窗口位置使用`QWidget::x()`/`y()`(Qt框架坐标,包括标题栏)保存,但使用`setGeometry()`(客户端坐标)恢复,导致在Windows上标题栏会向上移动直到控件离开屏幕。解决方法是新增`centeredWindowRect()`辅助函数,确保窗口以保存的尺寸为中心,并在标题栏高度范围内调整。最大化状态和窗口大小得以保留,仅屏幕位置被重置(始终居中)。同时确认AI交互日志在`%APPDATA%\Notepatra\ai-logs\`路径下可以跨升级保存,并在卸载时不会被删除(安装程序不会修改`%APPDATA%`路径)。所有47个ctest测试均通过。 |
| [**v0.1.99**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.99) | 2026-05-25 | **Noter侧边栏在macOS上现显示浅色主题**。笔记/提醒/回收站树形结构在Noter面板的其余部分显示为深色背景,而侧边栏却显示为深色 - 这是由于样式表选择器在列表迁移到树形结构后仍保留了旧样式。解决方法是显式为`QTreeWidget#noterSidebarTree`指定浅色背景规则,并在`buildSidebar()`中添加`QPalette::Base`/`Text`固定,以确保样式生效。仅为外观调整 - Noter功能正常。所有47个ctest测试均通过。 |
| [**v0.1.98**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.98) | 2026-05-25 | **Windows应用内更新程序现已修复**。v0.1.96版本中,由于对OpenSSL 1.0.x/1.1.x的错误诊断,导致“检查更新”功能被禁用,并弹出“应用内更新检查已禁用”的对话框。实际上,捆绑的**OpenSSL 1.1.1w**支持所需的TLS `api.github.com`协议,真正的v0.1.96版本启动卡顿问题是由会话恢复循环引起的(已在v0.1.96版本中单独修复)。现已移除禁用更新检查的限制,并保留现有的安全保护措施,包括异步`QNetworkAccessManager`、**8秒超时计时器**、`QSslSocket::supportsSsl()`检查和TLS感知的“打开发布页面”备用方案。 **一次性操作**:v0.1.96/v0.1.97版本的Windows构建仍然带有此限制,因此请手动下载v0.1.98版本,一旦安装,应用内更新功能即可正常工作。所有47个ctest测试均通过。 |
| [**v0.1.97**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.97) | 2026-05-25 | **Noter提醒功能升级 + 云AI修复**。新增**中央提醒**侧边栏根节点(在笔记和回收站之间),列出所有按计划的提醒,分为逾期/今日/本周/稍后 - 点击打开笔记,铅笔重新安排,✕删除;逾期行显示红色;绘制琥珀色时钟图标。 **提取现在安排实际提醒**(此前“提醒”复选框仅为装饰),通过`NotesTodos::addReminder()`实现;解析自然语言时间(如“10点明天”)为具体本地时钟(此前为UTC,导致时间偏移);返回纯英文**摘要**,在对话框中显示,并在操作项目上方保存; **标记已安排**的操作在重新运行时(模糊匹配),以避免重复。提醒默认仅在具体时间被提取时启用。 **三个云AI修复**:通过`openAiV1Base()`规范化双`/v1` URL(…/api/v1/v1/models → 404“不可达”);流式401错误不再静默旋转~60秒 - 显示身份验证错误提示;取消提取结果不再崩溃(对话框在网络信号上延迟,因此尾随`downloadProgress`不会访问释放的内存)。 **AI交互日志**作为首要的隐私功能出现在“帮助” → “AI交互日志…”中,并在应用内帮助、README和网站上介绍。所有47个ctest测试均通过(新增`test_stream_error`、`test_notes_todos`第13节、`test_notes_panel_widget`第21-23节,本地时间+摘要的扫描提示)。 |
| [**v0.1.96**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.96) | 2026-05-24 | **当天Windows修复补丁**。解决了三个导致启动卡顿的根本原因。 (1)**平台惯例配置目录** - Notepatra此前在所有操作系统上写入`~/.config/notepatra/`目录;Windows用户的`%APPDATA%\Notepatra\`目录显示为空,而会话状态位于`C:\Users\<u>\.config\notepatra\`,对IT工具/备份工具/组策略不可见。新增`Config::appConfigDir()`函数,在Windows上返回`%APPDATA%\Notepatra`,在macOS上返回`~/Library/Application Support/Notepatra`,在Linux上返回 `$XDG_CONFIG_HOME/notepatra`(不变)。首次启动时从旧路径迁移配置文件;计划在v0.1.97版本中清理旧路径。所有约6个硬编码调用站点已迁移(config.json、session.json、recovery/、ai-logs/interactions.db、db-connections.json、plugins/)。 (2)**崩溃安全的会话恢复** - `MainWindow::restoreSession()`现在在打开文件之前写入`session.json.restoring`标记,并在成功后删除。如果下次启动时存在该标记,则之前的恢复被中断(kill / hang)- 会话.json被移动到`session.json.failed-<timestamp>`(保留标签列表),并显示对话框告知用户文件位置。 (3)**EOL-OpenSSL更新检查门控** - 在运行时检查`QSslSocket::sslLibraryVersionString()`,如果捆绑的OpenSSL是1.0.x或1.1.x(自2023年9月起已停止支持),则跳过GitHub更新检查。 与现代端点的TLS握手可能会阻塞UI线程;跳过此路径可避免此问题。 计划在v0.1.97版本中为Windows MSI捆绑OpenSSL 3.x(CI工作流更改)。 所有v0.1.95版本的测试均顺利通过(~1325个,总共0个失败),新增`appConfigDir()`的按平台环境变量覆盖单元测试。 |
| [**v0.1.95**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.95) | 2026-05-24 | **Windows崩溃强化 + Noter全面重新设计**。修复了三个Windows崩溃/卡顿问题:保存/另存为/右键保存可靠崩溃(根本原因:`QFileDialog::setProxyModel` + `QIdentityProxyModel`综合列崩溃`QFileSystemModel`的异步`QFileInfoGatherer`;删除了代理,移除了“创建时间”列);双击启动的多PID问题(根本原因:监听后主窗口构造 + 300毫秒探测 + 无条件`removeServer()`导致正在运行的实例孤立;现在绑定管道,然后进行两阶段500 + 1500毫秒探测,有条件地移除服务器);不可见的主窗口在监视器更改后(根本原因:从断开的辅助监视器保存坐标;新增`clampWindowToScreens`交叉测试与连接的监视器,确保在主要监视器上重新居中)。 另外,在文件→保存/右键保存/关闭标签页保存处,新增了三个静默保存失败对话框,确保`bool`返回值不会被忽略。 **Noter全面重新设计**(会议笔记选项卡):从头重写`src/notes.cpp`,形成新的两窗格侧边栏+编辑器形状,以Apple Notes / Bear / Granola为灵感;删除了6按钮插入栏,斜杠菜单(`src/notes_slashmenu.{cpp,h}`),5按钮标题行,边缘条图标和WebEngine路径(`src/notes_bridge.{cpp,h}`,`src/notes_editor.{cpp,h}`);新增Markdown快捷方式(- [ ] + Space → ☐;F4切换),每行内✕删除按钮,每个会议+每个待办事项行,回收站+恢复会议(`Noter/Trash/.trashed-<ts>-<name>.html`)和待办事项(`status='trashed'`),内联编辑待办事项标题,通过QStackedWidget [QLabel, QLineEdit],添加待办事项对话框中的日历选择器(Due + Remind,每个都有今天/明天/ 1小时前到期/清除快速选择),右键单击待办事项行的上下文菜单,具备设置到期时间/设置提醒/标记完成/软删除/恢复/永久删除,编辑器页脚中的AI模型选择器自动从`OllamaClient::listModels()`填充,单个✨提取按钮在右下角运行`NoterSweepPrompt`,针对Ollama插入操作项目章节。 **工具品牌颜色调色板统一** - 新增`src/tool_colors.{h,cpp}`是选项卡条+功能工具栏图标+欢迎卡片的单一真实源(`notepatraToolAccent(toolKey)`)。 调色板修改为12种视觉明显不同的色调,间隔约30°,解决了5种冲突(AI / JSON均为蓝色 → 皇家蓝 / 青色;HTML / 项目搜索均为橙色 → HTML粉色;Noter / Git均为红色 → Git青柠色;Brackets / 项目搜索相同色调)。 **强制每个实例的浅色QMenu样式** - Qt的QSS不会通过设置样式表的部件进行级联,因此每个菜单必须有自己的规则。修复了用户报告的右键单击暗色背景问题。 新增**~303个Noter测试**(此前为257),`test_notes_panel_widget.cpp`(新增24个集成测试)+ 14个可编辑行测试 + 22个回收站生命周期测试。 **~1325个总测试通过**,涵盖更广泛的Notepatra套件。 所有v0.1.93版本修复均保持不变。 |
| [**v0.1.93**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.93) | 2026-05-19 | **项目搜索:智能防洪保护,实时短语相关性排名,`match=N%`徽章,跨平台完成通知**。取代了v0.1.92版本的无限发射模型,该模型在导入`import os`超过 `$HOME`时导致应用内存耗尽。 **在10k个匹配项时显示软警告**(琥珀色进度条+状态说明,无中断)。 **在50k个匹配项时弹出硬性检查弹窗**,并提供继续/显示这些/取消选项 - 点击*显示这些*会立即将UI阶段切换为空闲,因此计时器不会一直滴答,而线程结束时不会一直等待;点击*取消*会立即重新启用搜索按钮,而不是等待工作线程完成。 **默认关闭匹配所有单词** - `import os`默认进行精确短语搜索;高级用户可以勾选复选框以实现任意顺序任意行AND语义。 **`match=N%`自描述徽章**显示在每个结果行上(100%=此行上的完整短语,99%=所有令牌散布,越低=部分匹配;列宽固定,在每种模式下视觉一致)。 **在两个轴上实时短语相关性排序** - 文件内`std::stable_sort`按行内百分比降序排序,文件间*实时重新定位*树(获取+插入到正确的位置)文件最佳行百分比提高时,文件立即显示在顶部。 **跨平台桌面通知**,当搜索≥3秒完成且窗口未聚焦时 - 一个代码路径(`QSystemTrayIcon::showMessage`)路由到Linux上的libnotify/D-Bus,Windows上的Toast,macOS上的NSUserNotificationCenter,不添加可见的托盘图标。 **错误修复**:模态对话框双`%%`(“扫描X of Y(4%%)”),“⏳卡顿:”文字替换为中性“…当前:”当扫描在一个大文件上缓慢进行,Linux上的标题🔍emoji字体回退,以便头部外观与Win/Mac相同,“显示这些”不再让状态显示“搜索…”47秒。 **39/39 ctest通过**(不变)。 所有v0.1.92版本修复均保持不变。 |
| [**v0.1.92**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.92) | 2026-05-19 | **SQL格式化深入研究:修复9个方言错误**。用户报告的回归 - `[onelook-db-1]`被破坏为 `[ onelook - db - 1 ]` - 通过T-SQL括号标识符保留修复;审计发现的9个其他潜在错误也一并修复。 **将`sqlparser-rs`从0.52升级到0.55**(13个不同的AST形状变化迁移:`Statement::Update.from`现在`UpdateTableFromKind`枚举,`Insert.table`现在`TableObject`,`OrderBy`重构为`OrderByKind`,`OrderByExpr.options.{asc,nulls_first}`,`ObjectNamePart::Identifier`,`Case.conditions`现在`Vec<CaseWhen>`,`SelectItem::QualifiedWildcard`现在`SelectItemQualifiedWildcardKind`枚举,`JoinOperator`新增5种无资格表单的变体,`JoinConstraint::Using`现在`Vec<ObjectName>`)。 **新增`Statement::Merge`编写器分支**:MERGE INTO ... USING ... ON ... WHEN MATCHED/NOT MATCHED THEN ... - 曾因Display回退而折叠为一行。 **`DISTINCT ON(cols)`渲染**:以前发出裸`DISTINCT`,无声丢弃列列表。 **`FETCH FIRST N ROWS [PERCENT] [WITH TIES \| ONLY]`** - `q.fetch`字段在v0.1.92版本之前从未被Writer读取。 **T-SQL `GO`批分隔符预拆分**:新的`split_tsql_go_batches()`函数遍历输入并跟踪字符串/注释状态,格式化每个批次并重新连接为`GO`。 **T-SQL `PRINT`预掩码**:sqlparser不识别PRINT;我们将其作为可解析的占位符进行掩码,并原样恢复。 **`apply_keyword_case()`令牌感知辅助函数**替换`.to_lowercase()`整个字符串的Display发出ON CONFLICT / MERGE INSERT正文 - 保留标识符(如`Email`,`Name`,MySQL函数`VALUES(a)`)以避免将其转换为小写。 **新增10个回归测试+强化括号标识符测试**:34 → 44在`sql_fmt`模块中;39/39 ctest仍然绿色。 零C++更改;相同的FFI表面(`npc_format_sql`在`src/rustbridge.cpp:213/222`二进制兼容新`librust_core.a`)。 所有v0.1.91版本修复均保持不变。 |
| [**v0.1.91**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.91) | 2026-05-19 | **类似 Notepad++ 的逐行更改历史记录条带 + 整体路径分隔符扫描 + 状态栏更改计数器 + 查找/替换用户体验升级。** 边距 3 现在绘制一个 4 像素的逐行条带:**橙色**表示已编辑,**绿色**表示保存后(Notepad++ 行为)。通过 `SCN_MODIFIED` / `SCN_SAVEPOINTREACHED` / `SCN_SAVEPOINTLEFT` 手动实现,因为 Ubuntu 24.04 的 QScintilla 2.14.1 附带 Scintilla 编译时没有 `SCI_SETCHANGEHISTORY`(消息作为 no-op 回路;通过 PyQt5 确认)。`FullRectangle` 标记形状 - 永远不会使用 `Background`(整个行绘制错误,来自 pre-v0.1.91 git-diff 护栏,填充了 markdown 草稿为绿色)。安全网:`m_loadingFile` 标志阻止了大量的 `setText()` 在打开时将每行标记为橙色;`SCN_MODIFIED.line` 从 `position` 通过 `SCI_LINEFROMPOSITION` 重新计算(QScintilla 2.14.1 仅在折叠事件中填充 `line`);`onSavePointReached()` 执行 `markerDeleteAll(23)` + 完整的 `update()`,因为某些 X11 合成器不能仅凭标记状态合成边距重绘。**状态栏获得 `N 已修改 · M 已保存` 计数器**,在光标位置和 EOL 字段之间 - 隐藏时两者均为零。通过并行的 `QSet<int>` 成员 + `changeHistoryUpdated()` 信号模式;无需缓冲遍历。**整体 `QDir::toNativeSeparators` 扫描** - 6 个文件中 16 个新站点(findreplace / fileexplorer / mainwindow / tabmanager / gitpanel / welcome)包装,以便在 Windows 上显示路径时显示 `\`;在 Linux/macOS 上为 no-op。**查找/替换对话框升级**:Notepad++ 风格的斜体底部状态栏(每个选项卡的单一真实来源;pre-v0.1.91 替换选项卡结果无声丢弃,因为 `m_resultsOutput` 为 nullptr);查找 ↔ 替换字符串转发(带有非覆盖保护,以便在目标选项卡上重新输入在重新切换后存活);循环结束时两步包装(查找下一个在最后一个匹配项停止,并带有“到达结尾 - 按下再次包装”的通知;第二个连续按下实际上包装)。对话框最小尺寸 660×400 → 720×440 + `setWordWrap(true)`,以便最长的状态消息适合。**6 个新测试可执行文件,78 个断言**:`test_change_history` (16)· `test_change_history_mainwindow` (12)· `test_change_history_watcher` (6)· `test_change_history_stress` (20)· `test_changehistory_statusbar` (14)· `test_findreplace_carry_forward` (20)。**39/39 ctest 通过**(之前为 33/33)。所有 v0.1.90 修复保持不变。 |
| [**v0.1.90**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.90) | 2026-05-16 | **“保存为” 详细视图现在显示 “创建时间” 列。** v0.1.88 发布了对话框 UX 基线(960×640 几何形状,详细视图默认,按修改日期降序排列),但用户请求的“创建时间” 列被推迟 - 第一次尝试使用手工滚动的 `QSortFilterProxyModel`,其 `index(row, extraCol)` 返回一个 `createIndex()`,没有源映射,导致 Qt 的树视图在 Ctrl+S 时崩溃。v0.1.90 通过支持的 `QIdentityProxyModel` 模式发布该列。新的 `src/savedialogfsmodel.h/cpp` 包装 QFileDialog 的内部 QFileSystemModel,添加一列额外的列,其 `data()` 为 ext4(内核 ≥ 4.11)返回 `QFileInfo::birthTime()`,在不支持存储创建时间的文件系统上回落到 `metadataChangeTime()`(ctime),并在两者都无效时渲染一个短划线 - 因此单元格永远不会崩溃行布局。`mapToSource()` 将额外列映射到源列 0,以便 Qt 的模型 API 可以解析回文件系统。在 `configureSaveDialogUx()` 中连接到 `saveFileAs()` 和关闭选项卡的“在保存前关闭?”提示中。**为什么使用代理而不是 `QFileSystemModel` 子类**:QFileDialog 内部构建自己的 QFileSystemModel;支持的扩展点是 `setProxyModel()`。子类化模型并 `tv->setModel()` 将会破坏路径栏 / 名称编辑 / 选择硬编码到 d-pointer 模型的 wiring。32/32 ctest 通过。 |
| [**v0.1.88**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.88) | 2026-05-15 | **“保存为” 文件类型下拉菜单现在实际驱动保存的扩展名。** v0.1.88 用户当天报告:下拉菜单填充了 72 个条目,但选择“Python”并输入 `foo` 仍然保存为 `foo`(无扩展名)。根本原因:`QFileDialog::setDefaultSuffix` 从未连接,因此所选过滤器不会驱动扩展名。在 `src/mainwindow.cpp` 中修复(在保存文件和关闭选项卡的未保存提示中):在初始化时从预选的过滤器连接 `setDefaultSuffix`,并在对话框中从 `filterSelected` 信号连接,以便在对话框中切换保持同步。后验收安全网通过新的 `applySaveAsFilterSuffix(path, filter)` 助手,用于平台对话框静默忽略 `setDefaultSuffix`(某些 Linux GTK 构建,某些 macOS 对话框状态)。新的 `firstExtensionFromFilter("Python (*.py *.pyw *.pyx)") → "py"` 提取器处理裸文件名过滤器(Dockerfile / CMakeLists.txt / .gitignore)和“所有文件(*)”正确。**新的 `test_save_as_filters` 回归 - 16 个契约断言**,驱动用户可见的端到端流程:裸 'foo' + Python → foo.py · foo.py + Python → 不变 · foo.txt + Python → foo.txt.py(过滤器赢得)· 所有文件 → 不变 · 裸 Dockerfile 名称匹配 → 不变 · 等等。编纂 v0.1.88 船只失误:代理断言(“函数调用”,“列表填充”)而不是契约断言(“磁盘上的字节与所选过滤器匹配”)。新内存规则:**测试用户可见的契约,而不是代理属性**。32/32 ctest 通过(在 v0.1.88 中为 31)。 |
| [**v0.1.88**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.88) | 2026-05-15 | **“保存为” 文件类型下拉菜单 + 大文件加载速度提升。** 两个用户报告的痛点得到修复:死“保存为” 下拉菜单与 Notepad++(`src/mainwindow.cpp:1655` 仅传递 `"所有文件(*)"`,因此对话框底部有 1 个条目),以及 100+ MB 文件比承诺的“最多 2 GB”更慢。新 `buildSaveAsFilters()` 助手在 `src/lexerutils.{h,cpp}` 中返回约 72 个语言条目,与 Notepad++ 行为匹配(纯文本 · Markdown · Python · JS/TS · C/C++ · Rust · Go · SQL · JSON · YAML · TOML · CSV · HTML · CSS · …);预选与当前选项卡语言匹配的过滤器。相同的修复在“保存之前关闭?”提示中,该提示没有任何过滤器。**大文件加载 - 3 个修复使加载速度加快:** (1)`rust-core/src/file_io.rs` 中的 UTF-8 快速路径 - 跳过 `UTF_8.decode()`,当 mmap 字节已经是有效 UTF-8 时(即使不需要,也会分配一个新的 118 MB 字符串;节省 118 MB 堆 + 118 MB 文件上的 250 毫秒)。(2)EOL 检测限定在前 64 KB - 曾两次扫描 118 MB 以花费约 300 毫秒。(3)在 Rust→C FFI 中删除 `CString` 往返 - `FileLoadResult.text` 现在分配一个 `Box<[u8]>` 而不是 `CString`(跳过 O(N)空扫描 + 额外的 118 MB 分配 + 追加的空字节)。新的 `npc_free_file_text(ptr, len)` 声明 boxed 切片按长度回收。**大文件 UX 门控**:> 50 MB 文件也禁用换行 + 缩进指南 + 边缘列。**注意**:随 v0.1.88 中修复的“保存为”过滤器扩展错误一同发布。31/31 ctest + 130/130 cargo 测试通过。 |
| [**v0.1.86**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.86) | 2026-05-15 | **事实审计门控,BGR 错误扫描,下载大小真相更新 - 无新功能。** v0.1.85 审计后发现了两类不准确性,这些不准确性在发布中一直在蔓延。**另外两个 Scintilla BGR 字节序错误**:`src/findreplace.cpp:770` 查找 → 标记所有指示器传递原始 `0x0000FF`(预期蓝色,字节交换为红色);`src/merge_helper_widget.cpp:185` 合并冲突注释文本传递原始 `0x00204050`(预期深蓝色,字节交换为橄榄棕色)。两者现在正确打包 BGR - 标记所有渲染 Tailwind 蓝色-500 `#3B82F6`,冲突文本渲染 `#204050`。与 v0.1.85 的 `editor.cpp` 修复相同的根本原因。**六个下载大小声明** 在 `docs/index.html` / `docs/docs.html` / README 叙述中被高估了约 1.5 MB,跨每个平台(3.6 / 28.7 / 42.5 / 33.7 / 38.4 MB),而实际工件字节为 3.45 / 26.86 / 40.56 / 32.18 / 36.68 MB。所有调整到 ±0.05 MB 的 `gh release view` 输出内。 README 安装表格在第 262-267 行已经正确并用作交叉检查参考。**过时的二进制营销声明既过时又错误**:裸二进制文件为 9.71 MB(不是 9),并且 CI 没有 `strip` 步骤,因此发布的二进制文件未剥离(带有 2.65 MB 的 DWARF 调试信息;剥离后为 7.06 MB)。实时营销现在读取“小于 10 MB(在 Linux x64 上约为 9.7 MB)”而没有误导性的“剥离”一词;法医发布说明行保持不变。**遗漏**:`feedback_release_factual_audit.md` 自 v0.1.80 以来一直在内存中,表示“每发布一次运行一次事实检查,因为 `stale-text-check.sh` 无法捕获下载大小” - 而操作员(克劳德)在发布压力下跳过了它。相同的模式与 v0.1.83 的内存→门控提升。**新门控** `scripts/verify-download-sizes.sh` 调用 `gh release view "v$VERSION" --json assets`,查找三个文档中每个工件的最接近的“X.Y MB”声明,并断言漂移 ≤ ±0.15 MB。同时下载 Linux tarball 并运行 `file ... \| grep ", stripped$"` 以验证“剥离”声明是诚实的。在 `scripts/release-check.sh` 中连接到第 2 阶段。新的事后内存 `feedback_factual_audit_must_be_a_gate.md`。CI 剥离步骤(将二进制文件降至 7.06 MB)已排队在未来的发布中 `project_next_release_ci_strip_step.md` - 单独的范围以便可以验证 CI 更改的端到端。31/31 ctest 通过。 |
| [**v0.1.85**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.85) | 2026-05-15 | **Markdown Light 调色板大修,Claude-Code-Blue 选择,霓虹橙色匹配高亮,和真正的 Scintilla 字节序错误修复。** v0.1.84 Solarized MD 调色板昨天上线,感觉太彩虹色,带有经典的黄色-H2-on-pale-paper 易读性问题。在迭代 Solarized → 宝石色紫色/洋红色/蓝色 → 最终 SSMS 后,MD Light 现在重用与 `.sql` 文件相同的六色调色板:H1 洋红色 `#FF00FF`,H2 蓝色 `#0000FF`,H3 栗色 `#7F0000`,H4 海军蓝 `#000080`,H5 橙色 `#FF8000`,H6 绿色 `#008000`。带有 slate-800( `#1E293B`)文本的内联代码芯片 + slate-300( `#CBD5E1`)纸张,呈现更密集、更具“代码药丸”感觉的样式。Light 主题文本选择从 VS Code 的淡 `#ADD6FF` 洗涤提升到 `#5BC8FA` - Claude Code 在其提示聚焦环上使用的明亮青天蓝色。** `src/editor.cpp:664-679` 中的真正错误修复**:Scintilla 的 `SCI_INDICSETFORE` 预期 Win32 COLORREF(BGR 字节顺序),但指示器设置传递 `QColor::rgb() & 0xFFFFFF`(Qt RGB)- 因此双击词匹配指示器自添加功能以来一直呈现错误的颜色( `#E8A848` 陶土橙色绘制为淡蓝紫色)。现在正确打包 BGR;指示器 9 也提升到霓虹橙色 `#FF5500`(alpha 160 填充 / 255 轮廓),以便匹配突出显示。暗色 + Monokai MD 调色板验证不变。 |
| [**v0.1.84**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.84) | 2026-05-15 | **自 v0.1.31 以来最大的语法高亮刷新。** 每个支持的语言都更新了保留字覆盖,从主要供应商来源(postgresql.org,learn.microsoft.com,tc39.es,cppreference,dart.dev,...)。两个全新的词法分析器 - **纯文本** 和 **CSV / TSV** - 替换以前的单色回退。Markdown / YAML / CSS 调色板在 Light + Dark + Monokai(Markdown H1–H6 对比度梯度,内联代码芯片纸张色调,YAML 无引号值色调,Markdown 散文软化,CSS 伪类分支)中刷新。新 `src/sql_keywords.h` 携带 **六种方言的综合 SQL 关键字联盟**,包括 DuckDB(T-SQL / PG / MySQL / DuckDB / SQLite / Oracle)- MERGE,RETURNING,LATERAL,JSONB,OVER PARTITION BY,WITHIN GROUP,OPENROWSET,ASOF JOIN 现已在每个 `.sql` 选项卡中作为关键字绘制。新 `src/lang_keywords.h` 携带主要源关键字常量,适用于通过 `populateExtraKeywords()` 在 `lexerutils.cpp` 中连接的 ~50 个语言。**修复 11 个具体关键字错误**,涵盖 R(`repeat`+`return`),Groovy(`yields`→`yield`+`volatile`+`this`),Crystal(`next`+`until`),Dart(`Record`+`augment`),GDScript(`@rpc`+`@tool`+`@warning_ignore`+`namespace`+`Rect2i`+`Vector4i`),Solidity(`blockhash`+`blobhash`),Mojo(`ref`),Julia(`outer`+`public`+`Float16`),F#(`ValueOption`+`ValueTuple`),Protobuf(WKT 兄弟),HCL(模板指令)。**`samples/` 目录中的 **74 个示例文件**(每个支持的词法分析器一个丰富的示例 - 没有 PII)。**测试基础设施硬化**:三个以前未运行的测试(`test_network_policy`,`test_chart_types`,`test_fontpack`)连接到 `notepatra_all_tests` 元目标。**31/31 ctest 通过**(之前为 28/31)。硬上限 `paint()` 闭包模式被编码为所有未来自定义 Scintilla 词法分析器的内存规则。 |
| [**v0.1.83**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.83) | 2026-05-14 | **过时版本引用扫描 + 发布检查门控。** v0.1.82 发布了一个安全强化扫描的干净结果,但网站有 11 个用户可见的字符串仍然指向 v0.1.81(英雄徽章,粘性下载 CTA aria-label + 可见文本,主下载部分标签,两次“获取 Notepatra v...”按钮,JSON-LD 常见问题“最新 v0.1.81 下载大小” +“截至 v0.1.81”,页面正文“截至 v0.1.81:226 文件类型”线索,词法分析器段落)。 本次发布:扫描所有 11 个,交换最新的发布卡从 v0.1.82 → v0.1.83,并将过时的版本引用扫描器连接到 `scripts/stale-text-check.sh` 以便 `release-check.sh` 在用户可见的字符串漂移时失败。检查使用 `__V__` 占位符两次替换(一次带有当前版本文字,一次带有 `0\.1\.[0-9]+` 正则表达式),并比较每个枚举短语的匹配计数。旧版本在 CHANGELOG / 发布说明 / 过去的发布卡描述中不受影响。无 C++ / Rust 更改 - 相同二进制文件与 v0.1.82 相同,所有安全强化(安装脚本失败 SHA,cosign 验证,38/38 动作 SHA 固定,AI 基 URL 验证,凭据擦除模式)继续不变。 31/31 ctest 通过。 内存规则从“记住扫描”→“门控强制扫描”(规范示例从内存→门控提升)。 |
| [**v0.1.82**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.82) | 2026-05-14 | **安全强化扫描 + 选项卡编号修复。** 6 个攻击表面的深入审计结果。 **安装脚本失败 SHA**:`docs/install.sh` + `docs/install.ps1` 以前如果 `SHA256SUMS` 获取返回网络错误则静默失败 - 一个 MITM 阻止了总和文件将绕过验证。两者现在如果总和不可达或工件在其中缺失,则拒绝安装。 **cosign 验证** 由安装脚本和应用内自动更新器在 `cosign` 位于 `PATH` 时自动运行,带有与发布工作流 + 标签的字面证书身份。 **所有 38 个 GitHub Actions SHA 固定**(之前为 0/38 - 包括 `dtolnay/rust-toolchain@stable`,它曾经位于分支引用,操作所有者可以随时快速前进)。 **新的 `install-canary.yml`** 工作流将提供的 `notepatra.org/install.{sh,ps1}` 与仓库进行每日差异;如果有漂移,则打开一个问题。 **AI 基 URL 验证** 在 `src/preferences.cpp` 中拒绝格式错误的 URL,纯 http 公共主机(API 密钥将在纯文本中传输),并警告确认非供应商主机(关闭已知“使用此更快镜像”钓鱼模式)。 **凭据清除器** 添加 Cloudflare,DigitalOcean,npm,Twilio,Azure `AccountKey=`,GCP 服务帐户,HTTP 身份验证标头模式。 **标签保护规则集** 在 `refs/tags/v*`;**Dependabot 安全更新启用**。 **`release-check.sh`** 获得 `cargo clippy -D warnings` + `cargo fmt --check` + `cargo audit --deny warnings` 作为必需门控。 **选项卡编号修复** 在 `src/mainwindow.cpp` 中:`updateTabTitle()` 以前使用 `index + 1` 在每个修改事件上重新派生名称(关闭“新建 1”使下一个按键在剩余的“新建 **2”中重命名为“新建 1”);`m_newCount` 在每次启动时重置,以便会话恢复返回“新建 5”,但下一个 `Ctrl+N` 创建“新建 2”。通过 `newFile()` 中的动态最大扫描 + `updateTabTitle()` 中的现有名称保留进行修复。 **`SECURITY.md`** 与实时规则集现实相协调。 31/31 ctest 通过。 所有 v0.1.81 修复保持不变。 |
| [**v0.1.81**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.81) | 2026-05-14 | **Polish + 维护。Linux 应用内更新对话框现已匹配下载文件类型;深度依赖刷新。** `src/updater.cpp::installReleaseInteractive()` Linux 分支曾硬编码为 *"move the new AppImage into place"*,无论下载了什么。而我们仅为 Linux x86_64 提供 `.AppImage` — 在 **Linux ARM64** 上,选择器会回落到优先级为 30 的 `.tar.gz`,因此 ARM64 用户被告知移动他们没有的 AppImage。(原始症状在问题 #12 中针对 v0.1.17 报告,当时没有提供 AppImage — 相同的备用路径。)现在 `.appimage` 获取原始措辞和 `chmod +x` 提醒;`.tar.gz` / `.tgz` / `.tar.xz` 获取可复制粘贴的 `tar xzf … && mv notepatra ~/.local/bin/` 示例;其他则获取通用备用方案。关闭问题 #12 查找 2。(附:对话框由**当前运行**的二进制文件渲染,因此 ARM64 用户在 v0.1.80 → v0.1.81 上仍看到旧的 "AppImage" 文本;修复从 v0.1.81 → v0.1.82 开始。Linux x86_64 用户在 v0.1.80 之前和之后都获得 AppImage 路径 — 正确文本。) **GitHub Actions 矩阵提升到 Node 20 之上**:`actions/checkout` v4 → v6(#5),`actions/download-artifact` v4 → v8(#4),`github/codeql-action` v3 → v4(#8)。相同的 51 个签名工件,相同的 cosign + SLSA 保证。 **RustCrypto 家族升级到 0.11**:`md-5`、`sha1`、`sha2` 均从 0.10 升级到 0.11(#6 / #7 / #11)。0.10 → 0.11 版本将摘要输出从 `GenericArray` 移至 `Array`(不再实现 `LowerHex`);`compute_hash()` 更新为使用小型 `hex_encode()` 助手。 **MD5/SHA-1/SHA-256/SHA-512 十六进制输出与 v0.1.80 字节相同。** **`sqlformat` 从 0.3.5 升级到 0.5.0`(#9),并使用 `..FormatOptions::default()` 进行未来保护。 **`libc` 从 0.2.183 升级到 0.2.184`(#10)。此外,还有 `cargo fmt` 扫描(191 LoC,5 个文件,纯空白)和四个预先存在的 `cargo clippy -- -D warnings` 修复(`explicit_auto_deref`、`if_same_then_else`、`redundant_closure`,两个 `collapsible_match`)。130/130 个 cargo 测试 + 31/31 个 ctest 仍然通过。所有 v0.1.80 修复均不变。 |
| [**v0.1.80**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.80) | 2026-05-14 | **两个小问题修复:Windows `.txt` 文件图标 + 搜索清除按钮不再隐藏 ✕.** `installers/windows.wxs` — `<ProgId>` 现设置 `Icon="NotepatraExe" IconIndex="0"`,生成缺失的 `HKCR\Notepatra.Document\DefaultIcon\(Default) = "...\notepatra.exe,0"` 注册表值。在 v0.1.80 之前,MSI 注册了 ProgId 树但没有 `DefaultIcon`;对于 `.txt` 尤其如此,Windows 有一个特殊情况的备用方案,缓存的 `txtfile`/Notepad 图标,因此 `.txt` 文件在 Notepatra 被设置为默认程序后仍保留旧的 Notepad 图标(其他扩展名都正确翻转)。现在与已经写入的 sideloaded `installers/register-associations.bat` 匹配。 `src/searchresults.cpp::clear()` — 点击项目搜索结果标题中的 **清除** 不再隐藏 ✕ 关闭按钮。在 v0.1.80 之前,它隐藏了两者,将两个不同的用户操作(清除 = 清空内容 · ✕ = 关闭面板)合并为一个没有恢复路径的状态 — 空面板被固定打开,无法关闭。只有清除按钮现在隐藏自己(不再需要清除);✕ 保持可见。所有 v0.1.79 焦点传递修复均保持不变。 |
| [**v0.1.79**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.79) | 2026-05-14 | **双击文件管理器中的文件 焦点传递修复 — Linux X11 和 Windows.** 在 v0.1.78 的基础上进行有针对性的补丁 — 没有编辑器、AI 或核心更改。Notepatra 是单实例的:当您已经运行它时双击一个文件,第二个进程会通过本地 IPC 套接字转发路径并退出。在 v0.1.79 之前,新的选项卡在后台打开,而文件管理器保持焦点,在 Linux 上,忙碌的光标旋转器会一直转动,直到 WM 的 15 秒超时。 **Linux X11 修复**:`src/mainwindow.cpp::handleRemoteOpen` 现在移植了 wmctrl 的三部分 `activate_window` 序列 — `_NET_ACTIVE_WINDOW`(source=2 / pager)+ `xcb_map_window` + `xcb_configure_window(STACK_MODE_ABOVE)` + 回路围栏(`xcb_get_input_focus_reply`)在断开连接之前。`xcb_configure_window` ConfigureRequest 路径绕过了 Cinnamon/Muffin 的焦点窃取预防,该预防措施会将普通的激活 ClientMessages 降级为 `_NET_WM_STATE_DEMANDS_ATTENTION`。在生成的 `.desktop` 中设置 `StartupNotify=false` 可以停止无限旋转器。规范兼容的 `remove: ID="<id>"` 启动通知消息序列也在 `src/main.cpp::sendStartupNotifyComplete` 中为其他支持该协议的 DE 启用。 **Windows 修复**:第二个实例进程在退出前调用 `AllowSetForegroundWindow(ASFW_ANY)`,以便运行实例的 `SetForegroundWindow()` 成功,而不是简单地闪烁任务栏 — 资源管理器将前景权限授予新生成的进程,而不是正在运行的进程,因此我们在退出前放弃这些权限。带状和大括号顶部模型翻转保证了 z 顺序。`handleRemoteOpen` 签名扩展为转发 `DESKTOP_STARTUP_ID`(在 `QApplication` 构造函数剥离它之前从环境中捕获)用于 `_NET_STARTUP_ID` 属性传递。Linux 上显式链接 `libxcb`。所有 v0.1.78 编码修复均保持不变。31/31 个测试通过。 |
| [**v0.1.78**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.78) | 2026-05-13 | **编码和文件打开修复 — UTF-16 / UTF-32 BOM 与 Notepad++ 相同。** 在 `rust-core/src/file_io.rs` 中重新排序 BOM 检测,以便 UTF-16 LE 文本(50% 空字节 — SQL Server `Generate Scripts`,`sqlcmd -o`,PowerShell `Out-File`,Java `-Dfile.encoding=UTF-16`)不会被错误地标记为二进制文件。UTF-32 LE/BE 在检测 UTF-16 LE 之前检测到共享前缀 `FF FE` 以避免冲突。无 BOM UTF-16 通过偶数/奇数空列比率检测(与 Notepad++/uchardet 匹配)。添加了手动 UTF-32 解码器(encoding_rs 故意不提供)。`src/editor.cpp` 保存路径现在在往返中保留 UTF-16 / UTF-32 BOM — 在 v0.1.78 之前,BOM 被无声地剥离,因为 `QTextCodec("UTF-16LE")` 不发出 BOM。编码菜单列出了 4 个新的 BOM 变体:`UTF-16 LE BOM`、`UTF-16 BE BOM`、`UTF-32 LE BOM`、`UTF-32 BE BOM`。11 个新的 rust-core 单元测试 + 新的 `rust_core_tests` ctest 目标将 `cargo test` 绑定到 `release-check.sh`。31/31 个测试通过。 |
| [**v0.1.77**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.77) | 2026-05-11 | **扩展图表目录(4 → 12),悬停提示,模态查看器 + PNG 导出,AI 选择数据图表。** `src/chartrender.cpp` 中的 8 种新图表类型 — `area`、`horizontal-bar`、`stacked-bar`、`stacked-horizontal-bar`、`grouped-bar`、`donut`、`histogram`、`boxplot` — 均通过 QtCharts 工作,因此它们在精简版(~9 MB)和完整构建中均适用。直方图自动将数字列分成多个区间;箱线图为每个组计算 5 个分位数。多系列规格(`grouped-bar`、`stacked-bar`、`stacked-horizontal-bar`)采用 `y` 作为列名的数组。重写了数据分析系统提示,显式数据形状 → 图表类型映射,以便 AI 选择正确的图表,而不是默认设置为条形图。新 `src/chart_modal.{h,cpp}` — 每个内联图表现在都有一个 ⛶ 展开按钮;点击 → 960×640 模态,图表全尺寸 + 保存为 PNG(HiDPI 正确,默认为 `~/Pictures/`)+ 复制图像(剪贴板)+ 关闭。每个系列的悬停提示均已连接 — 条形显示类别/值,线/散点/区域显示 x/y,饼图/甜甜圈显示标签/值/百分比,箱线图显示完整的 5 个分位数摘要。新 `test_chart_types.cpp`(26 个子检查);更新的 `test_ai_dataanalyst.cpp` 以适应新的 12 类型目录。 **30/30 ctest 通过。** 所有 v0.1.75 功能(字体包下载器,MSI 组件 GUID 修复,AI 停靠修复,网络策略允许列表)均保持不变。 |
| [**v0.1.75**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.75) | 2026-05-11 | **运行时字体包下载器 — 按需提供 27 种高级开源字体。** 新的 `设置 → 管理字体…` 对话框列出了精选的 JetBrains Mono、Fira Code、Cascadia Code、Source Code Pro、IBM Plex Mono、Hack、Geist Mono、Inconsolata、Roboto Mono、Fira Mono、Noto Sans Mono、Space Mono、Anonymous Pro、Victor Mono、Comic Mono、Inter(可变)、Roboto、Manrope、Source Serif 4(可变)、Merriweather — 每个条目均为 SIL OFL 1.1 / Apache 2.0 / MIT,分为类别(代码 · 等宽 / UI · 无衬线 / 衬线 · 散文 / 显示 · 独特)。选择行,单击 *安装*,对话框从其固定的上游 HTTPS URL 下载每个 TTF / OTF 到 `~/.local/share/notepatra/fonts/` 并立即在 `QFontDatabase` 中注册 — 无需重启。 **裸二进制文件大小约为 ~9 MB**,因为没有捆绑任何内容;与图表包 / DuckDB 扩展程序相同的按需模式。**仅 HTTPS 清单** 由 `test_fontpack.cpp` 强制执行,以便网络攻击者无法交换字节。**支持无空气隙环境**:将 TTF 放入字体包目录手动;启动钩子(`NotepatraFontPack::loadInstalledFonts()`)在每次启动时扫描。新增文件:`src/fontpack.{h,cpp}`(~300 LoC 清单 + 安装程序队列),`src/fontpack_dialog.{h,cpp}`(Qt5 对话框),`test_fontpack.cpp`(23 个子检查)。29/29 ctest 通过。所有 v0.1.74 修复均保持不变。 |
| [**v0.1.74**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.74) | 2026-05-11 | **`notepatra-local-ai` MSI 升级修复 + 网站清理。** 在 v0.1.73 的基础上进行有针对性的补丁 — 没有编辑器、AI 或核心更改。修复了 `notepatra-local-ai`(云免费)版本的 Windows MSI 升级流程:当用户同时安装了常规和 local-ai 版本时,从 v0.1.72/v0.1.73 升级会进入修复/删除维护界面,而不是运行 MajorUpgrade。根本原因是,三个硬编码的组件 GUID(`MainExecutable` / `ApplicationShortcut` / `DesktopShortcut`)在两个版本的 MSI 中共享 — Windows Installer 将它们作为同一个组件引用计数,因此升级无法在常规安装的引用持有它们时释放 v0.1.72/v0.1.73 组件。通过将所有三个切换到 `Guid="*"`(WiX 从每个组件的 KeyPath 自动生成确定性 GUID,不同的 `INSTALLFOLDER` 之间存在差异)进行修复。还为 `<MajorUpgrade>` 添加了 `AllowSameVersionUpgrades="yes"`,以便重新运行相同版本的 MSI 运行安装流程,而不是维护界面。 **网站清理**:`docs/index.html` 不再为较旧版本显示细 "水平线" 行 — 仅显示最新的详细卡片,以及单个 "在 GitHub 上查看所有版本" 链接。v0.1.0–v0.1.73 仅在 GitHub Releases 上可见。82 行删除。 **延迟到 v0.1.75**:运行时字体包下载器(设置 → 管理字体… 具有 ~25 种高级开源字体,按需获取)。所有其他功能均从 v0.1.73 继承。 |
| [**v0.1.73**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.73) | 2026-05-11 | **AI 停靠空白重新打开修复(v0.1.72 补丁)。** 针对关闭 → 重新打开流程的两个协调修复。面板标题栏中的红色 ✕ 关闭按钮现在通过 `MainWindow::setAiDockVisible(false)`(通过新的 `closeDockRequested` 信号)路由,而不是直接操作 `parentWidget()->setVisible(false)` — 在修复之前,✕ 绕过了 `Config::aiDockVisible` 持久性,工具栏按钮的选中状态和拆分器重新平衡记账,因此在随后通过工具栏重新打开时,有时会出现 0-px 宽的空白停靠。此外,`rebalanceAiDockSplit()` 现在检测到 "collapsed slot"(宽度 ≤ 40 像素),并在 `m_aiDockSizedOnce` 为真时重新应用 60/40 分割 — 在修复之前,退出阻止了中间会话用户拖动,但也阻止了在完全隐藏 → 显示循环之后的救援路径。新增两个回归测试场景(`test_ai_fullscreen_exit.cpp` S16 + S17):隐藏-显示往返宽度断言 + ✕ 关闭 → 工具栏重新打开往返。28/28 ctest 在精简版构建上通过,`test_ai_fullscreen_exit` 中 53 个子检查(高于 v0.1.72 中的 47 个)。来自 v0.1.72 的安装程序矩阵保持不变。 |
| [**v0.1.72**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.72) | 2026-05-11 | **企业级 Linux 安装程序 + 无云 `notepatra-local-ai` 构建。** Notepatra 现已提供 `.deb`(适用于 Debian/Ubuntu,x64 + ARM64),`.rpm`(适用于 Fedora/RHEL/CentOS/Rocky/Alma,x64 + ARM64),以及适用于 Arch / openSUSE Tumbleweed / Manjaro / 任意 glibc 2.38+ 发行版的通用 `Notepatra-0.1.72-x86_64.AppImage`。所有这些格式都安装到 `/opt/notepatra/`,并在 `/usr/bin/notepatra` 处提供符号链接,包含所有尺寸的 hicolor 图标,完整的 `.desktop` 注册,并捆绑了 QScintilla 2.14.1,以便在发行版打包差异下运行相同的上游二进制文件。管理员可以通过 `apt install ./*.deb` / `dnf install ./*.rpm` / Ansible 友好的方式进行静默推送。 **`notepatra-local-ai` 无云版本**(通过 `-DNOTEPATRA_NO_CLOUD=ON` CMake 标志构建,附带 `notepatra-local-ai_0.1.72_*.deb` 构建)。二进制文件在物理上无法访问 `api.openai.com` / `api.anthropic.com` / `api.mistral.ai` / `generativelanguage.googleapis.com` / `openrouter.ai` / `api.groq.com` / `api.together.xyz` / `api.deepseek.com` / `api.cohere.com` / `api.x.ai` / 任何其他公共 LLM 端点。每个 `QNetworkAccessManager` 请求都通过 `NotepatraNetworkPolicy::isPrivateNetworkHost()`(测试了 49 种情况的允许列表,涵盖环回/RFC1918/CGNAT-100.64/10/IPv6 ULA fc00::/7 / `.local`/`.lan`/`.internal`/`.intranet`/`.corp`/`.home` 后缀)。AI 面板中删除了云 URL 粘贴框;Backend 下拉列表仅显示 Ollama + llama.cpp。`apt` 冲突确保 `notepatra` 和 `notepatra-local-ai` 无法共存。`notepatra --version` 自识别为 `Notepatra v0.1.72 (cloud-free / local-ai)`,以便用户可以验证。Ollama、llama.cpp、LM Studio、Jan、vLLM、自我托管的 Ollama 在 LAN 上 — 所有这些在受监管的行业(金融/医疗保健/法律/政府)、数据主权地区(欧盟/印度/中国)和有空气隙的舰队中继续有效。新增文件:`src/network_policy.{h,cpp}`(~95 LoC,49 种情况的单元测试),`installers/debian/build-deb.sh`,`installers/rpm/{notepatra.spec.in, build-rpm.sh}`,`installers/appimage/build-appimage.sh`。两种构建方式均通过 28/28 个测试。 |
| [**v0.1.71**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.71) | 2026-05-11 | **AI 交互日志 — 审计每笔云 + 本地 LLM 交换。** `工具 → AI 交互日志…` 打开一个查看器,指向 `~/.config/notepatra/ai-logs/interactions.db`(SQLite,WAL 模式),记录每次云(OpenRouter,OpenAI,Azure OpenAI,Ollama Cloud)+ 本地(Ollama,llama.cpp,LM Studio / Jan / vLLM 通过 OpenAI-compat)调用:时间戳,会话 ID,后端标签,模型,模式(聊天/编码/数据),角色(用户/系统/助手/工具调用/工具结果),完整内容,工具名称 + 参数 + 结果,提示 + 评估令牌,毫秒数,错误字符串。7 天后删除旧行;DB 文件上限为 50 MB。查看器对话框具有后端/模式/模型过滤器,行点击 → 完整内容面板,**导出 JSON**(最多 10,000 个事件),**立即修剪** 按钮和 **切换 "日志 AI 交互"** 以进行就地退出。 **`Config::aiInteractionLogging` 默认开启** — 默认情况下提供透明度,翻转关闭后,记录器变成无操作(甚至不打开 DB 文件)。**凭证清理器** 在每次写入之前会遮蔽 `Bearer …`,OpenAI `sk-…`,Anthropic `sk-ant-…`,GitHub PATs(`ghp_/ghs_/gho_/ghu_/ghr_…`),AWS `AKIA…`,Google `AIza…` 和 `-----BEGIN ... PRIVATE KEY-----` PEM 块。无网络外联 — 纯粹的本地 SQLite。新增 `OllamaClient::setMode("chat"\|"coding"\|"data")` 允许面板为过滤目的标记每个回合。每个 `responseStats` 发出站点(Ollama `/api/generate` + `/api/chat` 完成帧,OpenAI-compat `[DONE]` 帧,OpenAI-compat `finish_reason` 帧)记录;每个从 `m_baseUrl` 解析后端标签(`openai.azure.com` → `azure-openai`,`api.openai.com` → `openai`,`ollama.com` → `ollama-cloud`,`openrouter.ai` → `openrouter`,否则 `openai-compat`)。新增文件:`src/ai_interaction_log.{h,cpp}`(~280 LoC),`src/ai_log_dialog.{h,cpp}`(~250 LoC)。27/27 个测试通过。 |
| [**v0.1.70**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.70) | 2026-05-11 | **AI 清理 + Notepad++ 风格的会话持久性 + 数据模式实际显示附加内容**。关闭应用程序时,不再提示 — 每个打开的缓冲区(文件支持,无标题,已修改,原始)序列化到 `~/.config/notepatra/session/session.json`,包含完整的未保存内容 + 光标 + 修改标志,并在重新启动时静默恢复。单个标签关闭仍然显示保存 / 丢弃 / 取消。旧的 `recovery_*.txt` 文件现在仅在 `session.json` 丢失时运行。**删除硬编码模型能力门控** — “不够强大,无法进入数据模式” / “不支持工具调用” 错误气泡 + 琥珀色下拉着色已消失。子字符串允许列表已损坏,每个版本都会腐烂(Gemma 4 26B 因“太小”而被拒绝,尽管支持本地工具调用)。上下文门控(无文件夹 / 无数据库连接)保留。**数据模式现在显示附加内容** — 管理连接下面的绿色芯片读取 `✓ 已附加:<连接名称>(N 个表)— 通过查询_sql对模型可见;多个连接渲染为 `·` 连接;断开的连接变为红色。**架构注入到数据系统** — 保存的连接 + 前 30 个表嵌入到每个数据模式发送中,带有严格的“这些是唯一的 数据源;不要推测工作区” 前缀。新 `DbConnections::listTables()` 每个驱动程序的辅助函数(sqlite_master / INFORMATION_SCHEMA / sys.tables)驱动这两个功能。**聊天气泡获得呼吸空间** — 内边距 14/16 → 22/24,间隙 14 → 26 像素,行高 1.55 → 1.7。`QTextDocument::setDocumentMargin(0)` + 删除 `+8 像素` 松弛度消除了短回复下的尾部空白。视口调整大小事件过滤器在面板调整大小时重新调整气泡高度。**QODBC 连接字符串合成修复** — SQL Server 现在通过 `setDatabaseName()` 构建 `DRIVER=…;SERVER=host,port;DATABASE=…;UID=…;PWD=…;`,而不是使用字段设置器。 `ollama.cpp` 中的会话历史记录线程修复 — 使用 `/api/chat` 和拼接历史记录,当存在先前消息时。SVG 图标替换表情符号代码点(机器人,git 分支,数据库,图像,文件,锁定,解锁,灯泡,扳手,x,检查,文件夹,警报三角形)。网站 / 关于声明更新为“本地优先,云可选” — Notepatra 支持 6 个云后端,“零云”声明具有误导性。 |
| [**v0.1.69**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.69) | 2026-05-10 | **关键修复 — AI 编码 / 数据模式不再锁定工具按钮**。编码模式和数据模式通过直接发出 `fullscreenToggled(true)`(展开按钮隐藏在这些模式下)使 AI 停靠栏全屏。v0.1.69 之前,单击任何工具按钮(项目搜索,终端,REST 客户端,JSON / HTML / 括号工具,SQL 格式化,比较,欢迎)时,这些模式下似乎无反应 — 添加了选项卡,但 `m_tabs` 隐藏在 100% AI 停靠栏后面。根本原因:`AIPanel::forceExitFullscreen()` 仅取消选中展开按钮;在编码 / 数据模式下,按钮从未被选中,因此该函数是一个空操作。**修复:** 当按钮未被选中时,直接发出 `fullscreenToggled(false)`。主窗口的恢复处理程序是幂等的。 **`test_ai_fullscreen_exit.cpp` 从 14 个子检查扩展到 23 个,涵盖 6 种场景** — 两个新场景(S5:编码 + 项目搜索,S6:数据 + 终端)驱动编码 / 数据路径下的离屏 Qt,并断言 `m_tabs->isVisible()` 在工具操作触发后。它们在 v0.1.69 之前的代码上失败,在修复后通过。每次提交在 CI 上运行 — v0.1.67 / v0.1.68 的静默失败类现在已连线。lite 构建上的 27/27 ctest 通过。 |
| [**v0.1.68**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.68) | 2026-05-10 | **AI 停靠栏在编辑器选项卡切换时自动退出全屏 — 关闭 v0.1.67 的空白**。v0.1.67 将 `exitAiFullscreenIfActive()` 引入 14 个工具选项卡打开站点(项目搜索,终端,Git,REST 客户端,SQL 格式化器,JSON/HTML/括号工具,比较,欢迎),但**编辑器选项卡切换**(Ctrl+Tab,单击选项卡栏中的选项卡,双击项目搜索结果,`文件 > 打开`)仍将新聚焦的选项卡隐藏在全屏 AI 停靠栏后面 — 焦点转移是真实的但不可见的,因此编辑器感觉冻结。v0.1.68 直接检测 `QTabWidget::currentChanged` 信号,因此**每个**选项卡焦点更改都会折叠停靠栏。由一次性 `m_skipAiAutoExitOnNextTabChange` 标志控制,该标志由 `newFile()`(Ctrl+N)在 `setCurrentIndex(idx)` 之前设置 — 保留 **v0.1.61 背景选项卡 UX 规则**(当 AI 全屏时,Ctrl+N 在后台创建新编辑器,因此您不会失去 AI 流畅度)。`openFile()` 故意不设置标志,因此用户发起的文件打开正确折叠停靠栏。来自 v0.1.67 的 14 个显式调用仍然作为安全措施保留。lite 构建上的 26/26 个确定性测试通过。 |
| [**v0.1.67**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.67) | 2026-05-10 | **AI 助手:每种模式下独立的对话**。聊天 / 编码 / 数据切换现在各自保留自己的对话历史。v0.1.67 之前,单个 `m_messages` 向量在所有三种模式下共享 — 从编码模式切换到数据模式会将前面的气泡留在屏幕上,但会运行数据分析师系统提示,产生不稳定的第一条回复,引用错误模式的工具。v0.1.67 用三个向量替换 `m_messages`(`m_chatMessages`,`m_codingMessages`,`m_dataMessages`),并通过新的 `activeMessages()` 助手路由。对磁盘 JSON 格式进行增量更新,从 `version: 1` → `version: 2` 以承载所有三个向量;旧文件迁移到聊天向量,编码/数据为空(`{version: 1, messages: [...]}` 和裸顶级数组均受支持)。`clearChat()` 现在仅清除活动向量,而非全部三个。新 `saveChatHistoryNow()` 在每个键转换时强制保存(用户提交,流结束,模式切换,重置) — 2 秒的防抖动仍然作为流式聊天片段的后备。 新的 `test_ai_chat_history.cpp` 回归套件(61 个子检查)涵盖跨模式分区,迁移路径,保存/加载往返和 `clearChat()` 语义。lite 构建上的 26/26 个确定性测试通过。 |
| [**v0.1.66**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.66) | 2026-05-10 | **连接管理 UX + 本地 SQL Server 套件 + 网站清理**。数据库连接管理器获得一个**预设下拉菜单**,包含七个预配置的模板:SQL Server(localhost ODBC),SQL Server Express(命名实例 + Windows 身份验证),Azure SQL 数据库(需要 TLS),PostgreSQL(localhost),MySQL/MariaDB(localhost),SQLite(文件),DuckDB(文件或 `:memory:`)。**每个驱动程序的智能默认值**:`onDriverChanged()` 自动填充默认端口(1433 / 5432 / 3306)当仍为 0 时,设置每个驱动程序的占位符,并在每个字段上渲染一个新的**驱动程序提示标签** — 琥珀色 + 每 OS 安装命令(当 Qt SQL 插件丢失时,涵盖 Microsoft `msodbcsql18` 在 Linux / macOS / Windows 上的设置),当存在时为绿色使用提示。**本地 SQL Server Docker 套件**:新的 `docker/sql-server-local.yml` 在 127.0.0.1:1433 上运行 `mcr.microsoft.com/mssql/server:2022-latest`,而 `bash scripts/sql-server-local-setup.sh` 启动它 + 植入 NotepatraTest 样本表 + 自动注册连接。`--teardown` / `--wipe` 标志。**全面的“如何连接”文档**:每个数据库的逐步指南(SQL Server 本地 + 远程 + Windows 身份验证 + Azure SQL TLS;PostgreSQL 带有 sslmode + Unix 套接字;MySQL/MariaDB 带有 SSL_CA;SQLite 文件选择器;DuckDB 多模式数据库字段),每个 OS 的驱动程序可用性矩阵,五个最常见的连接失败的故障排除。**网站清理**:删除过时的 v0.1.23 → v0.1.24 Windows MuiCache 常见问题;将 ~60 个历史版本卡(~2500 行)折叠成一个“在 GitHub 上查看所有版本 →”链接。`docs/index.html` 从 4787 减少到 2201 行(缩小 54%)。**版本历史记录**:v0.1.63 + v0.1.64 GitHub 版本记录仅填充备注条目(“合并到 v0.1.65”),因此版本记录页面显示 v0.1.62 → v0.1.66 的连续更新。25/25 个测试通过。 |
| [**v0.1.65**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.65) | 2026-05-10 | **热修复:`QJsonDocument(QJsonValue)` 在 WebEngine 代码路径中的崩溃**。`vega_chart_renderer.cpp` WebEngine 路径使用一个不存在的 `QJsonDocument` 构造函数(仅 `QJsonObject` / `QJsonArray` 构造函数在 Qt5 中有效)。该错误在没有安装 `libqt5webengine5-dev` 的开发机器上是不可见的(损坏的行位于 `#ifdef NOTEPATRA_WITH_WEBENGINE` 后),但在每个 CI 运行器上崩溃,该运行器具有 WebEngine — Ubuntu 24.04 + Windows 安装-qt-action。结果:v0.1.63 GitHub 版本记录静默从未发布(仅 macOS-arm64 工件编译成功,使用 brew qt@5 的补丁集);v0.1.64 继承它,将产生一个 `-full` 口味的构建失败。**修复:** 将规范字符串包装在一个 1 元素的 `QJsonArray` 中,序列化,然后切掉周围的 `[` `]` 以获得有效的 JS 字符串文字。另外,在顶部添加 `#include <QJsonArray>`。所有 v0.1.64 行为(lite 默认,图表包需要卡,插件加载器脚手架,安装程序)均保持不变。 |
| [**v0.1.64**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.64) | 2026-05-10 | **默认 lite 模式 — 裸二进制文件保持小,图表移动到按需包**。v0.1.63 将 QtWebEngine 捆绑到每个版本中(在 macOS/Windows 上额外 ~95 MB)。v0.1.64 将 `NOTEPATRA_WITH_WEBENGINE` 从 `ON` 切换到 `OFF`,默认 Linux x64 二进制文件降至 **9.2 MB**,没有任何 WebEngine 依赖(通过 `ldd` 验证)。速度相同,功能相同,但没有内联 Vega-Lite 渲染器。**“图表包需要”卡片替换旧的重建提示占位符**。当 `generate_chart` 在 lite 二进制文件上触发时,用户现在看到一个适当的主题感知卡片,标题为“📊 图表渲染需要图表包”,描述来自 `plugin_loader::packDescription()`,大小 + 下载元数据,两个按钮:**[安装图表包]**(打开当前标签的 GitHub 版本记录页面,带有平台特定的下载说明)+ **[查看 JSON 代替]**(将 Vega-Lite 规范附加为带围栏的代码块)。新信号:`installRequested()`,`viewJsonRequested(QJsonObject)`。新访问器:`isLiteStub()`。 **`src/plugin_loader.{h,cpp}` 脚手架** 带有 `NotepatraPlugins::isInstalled(name)`,`installPath(name)`,`pluginDir()`,`packDescription`,`approximateDownloadSize`,`manualInstallDocUrl`。使用 `QStandardPaths::AppDataLocation`(Linux → `~/.local/share/notepatra/plugins/`;macOS → `~/Library/Application Support/notepatra/plugins/`;Windows → `%APPDATA%/notepatra/plugins/`)。注册包:`charts`(95 MB),`pdf`(12 MB,v0.1.66 候选版本)。**Linux 全功能 CI 工件**:Linux x64 + ARM 作业各自运行第二个构建阶段,启用 WebEngine,生成 `notepatra-linux-x64-full.tar.gz` + `notepatra-linux-arm64-full.tar.gz`,与 lite 默认值并存。SHA-256,cosign 签名(无密钥 OIDC)和 SLSA 构建出处扩展。**macOS + Windows 全功能工件在 v0.1.66 中发货**(需要仔细的 `macdeployqt` / `windeployqt` 第二次传递工作 + 跨现有 OpenSSL / QScintilla / 签名管道测试)。**测试**:`test_vega_chart.cpp` 扩展两个新的子用例 — lite 模式按钮 → 信号连线(查找两个 `QPushButton`,单击每个,断言信号恰好触发一次,并带有循环回的规范)和 `plugin_loader` 健全性。所有 25 个测试在 lite 构建上通过。 |
| [**v0.1.63**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.63) | 2026-05-10 | **数据分析师图表 — Vega-Lite 渲染器脚手架**。新的 `generate_chart` AI 工具发出 Vega-Lite 规范;Notepatra 通过 `QWebEngineView` 支持的 `VegaChartRenderer` 在聊天中内联渲染它。选择 Vega-Lite(而 Plotly / Chart.js / Qt Charts / QCustomPlot)是因为图形语法规范格式是 LLM 正确发出第一尝试的最容易的 — `mark` + `encoding` + `data` 约 220 个字符带有一个公共 `$schema` 进行验证。覆盖范围:条形图(V/H/堆叠),线形图,面积图,饼图/甜圈图,散点图,直方图(通过 `bin`),热图(通过 `mark: "rect"`),箱线图。**可选的 QtWebEngine** — 新的 `NOTEPATRA_WITH_WEBENGINE=ON` CMake 选项默认为 `Qt5::WebEngineWidgets` 找到时打开;否则自动降级为 OFF 并发出警告。当关闭时,`VegaChartRenderer` 成为一个 stub `QLabel`,显示重建提示,因此精简的 ~9 MB 构建仍然编译 + 运行。**AI 工具注册**:`generate_chart(spec, title?, id?)` — `spec` 是 Vega-Lite JSON 对象,验证 `mark` + `encoding` 键(放松使用 `layer` / `hconcat` / `vconcat` / `repeat` / `facet` 的复合规范)。100 KB 规范大小上限。**内联渲染**:工具结果触发一个样式化的 `QFrame#chartCard`(1 像素边框,8 像素填充)托管渲染器 + 可选标题 + 连接到 `renderError` 的隐藏错误标签。插入聊天内容布局中,位于拉伸之上。**CI 在每个运行器上安装 WebEngine**:`.github/workflows/build.yml` 更新 — Linux x64 + ARM 添加 `qtwebengine5-dev` + `libqt5webenginewidgets5` 到 apt;Windows `install-qt-action` 模块 `'qtcharts'` → `'qtcharts qtwebengine'`;macOS brew qt@5 已包含它。**测试**:新的 `test_vega_chart` 带有 5 个子用例(构造,设置规范,注册表包含 `generate_chart`,有效/拒绝的规范,复合规范);现有的 `test_ai_tools` 硬编码 `tools.size() == 12` 放松为 `>= 12`。pptx 导出,“解释此图表”模态框,以及 Poppler-Qt5 PDF→PNG 渲染视觉模型在 v0.1.66+ 中延期。 |
| [**v0.1.62**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.62) | 2026-05-10 | **VS Code 类似 Git 编码模式**。真正的源代码控制模式的“真实”源代码工作由两个独立的工作树中的两个并行实现代理协调。**每个编辑器行块的阶段/恢复 — 单击编辑器护栏中的绿色/红色/蓝色行标记 → 新的 `GutterHunkPopup` 停靠在该行,显示块的前后内容(嵌入的 `DiffView`)+ **阶段块** / **恢复块** / **复制差异** 按钮。**补丁合成器,带有安全防护栏**:新的 `src/git_hunk_apply.{h,cpp}` 发出一个统一的差异 + 管道到 `git apply --cached --whitespace=nowarn` 通过 `QProcess`。内联安全镜像 `ai_tools.cpp::resolveSafePath`(工作区锚点 + 规范路径 + 凭证拒绝列表 `*.pem`/`*.key`/`~/.ssh/`/`/etc/passwd` 等 + 5000 行块上限)。成功应用后,`GitGutter::updateGitGutter()` 原子性地重新读取文件并刷新行标记。**比较小部件每个块的阶段/恢复按钮** — `setGitContext(repoRoot, filePath)` 启用一个可滚动的块条,停靠在工具栏和文件标题上方;每行一个连续的差异块,格式化为 `Hunk N/M · rows a–b · [阶段块] [恢复块] [跳转 →]`。**基于标记的合并解决助手** — 新的 `src/merge_helper.{h,cpp}` 扫描列 0 中的 `<<<<<<<` / `=======` / `>>>>>>>` 标记(嵌套在内容中的文本被视为文本);`src/merge_helper_widget.{h,cpp}` 渲染 **取我们自己的** / **取他们的** / **取两个** / **跳转 →** 每个区域 + QScintilla 注释标签。`GitPanel` — 具有 `UU` 状态的文件现在显示一个 **解决** 按钮而不是 +/-。完整的 3 路 LOCAL/BASE/REMOTE 合并编辑器仍为 v0.2 范围。**编辑器连线**:`src/editor.{h,cpp}` 启用边距 3 敏感性,并将 `marginClicked` 路由到 `GitGutter::hunksForFile()` / `hunkIndexForLine()` → 屏幕位置的弹出窗口,通过 `SCI_POINTXFROMPOSITION` / `SCI_POINTYFROMPOSITION` 计算。23 个确定性回归测试通过;过时文本审计返回 21/21 个表面匹配规范。|
| [**v0.1.61**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.61) | 2026-05-10 | **用户体验大改造:更智能的权限控制,视觉优化,编码设计重构。** 十三个独立的改进 + 三个额外的浏览器整合优化,由五个并行代理(四个研究,两个实施,在隔离的工作树中)协调。**编码区域重新设计**:顶部 QTabWidget 分割聊天和作曲家已被删除 - 取而代之的是一个单一的统一对话界面,在面板底部具有 3 分段切换(`聊天 / 编写 / 代理`),匹配 iOS/Slack 键盘辅助模型,Continue.dev、Copilot Chat 和 Cursor 3.0 都趋同于此。`ChatModeSegment` 枚举替换 `m_chatTabs->currentWidget()` 检查;`EditPlanList` 重新父级到聊天内容布局,并在代理发出 dry_run write_file / apply_diff 时内联显示。**视觉拖放**:将图像(PNG/JPG/WEBP/GIF/BMP)或文档(PDF/DOCX/PPTX)拖放到 AI 停靠区;如果活动模型不具备视觉能力,则样式错误气泡列出替代方案 - 本地 `qwen2.5vl:7b` / `gemma3:4b`,云 `claude-sonnet-4-6` / `gpt-5` / `gemini-2.5-flash`。检测:Ollama 通过 `/api/show` 能力缓存(保守假阳性在空缓存时避免沉默陷阱);云通过 2026 年 5 月前缀允许列表。**智能输入权限控制**:`updateInputAvailability()` 现在在 `QEvent::EnabledChange` 上触发,通过事件过滤器,消除 v0.1.59 竞争条件,即下拉列表在 `currentTextChanged` 后静默启用,输入在手动摆动之前保持禁用。占位符重写为每个状态的具体下一步命令(`ollama serve`,`ollama pull qwen2.5-coder:7b`,点击 ⚙)。**上下文保护**:编码模式无工作区 → 指针到文件 → 打开文件夹;数据模式无保存的 DB 连接 → 指针到管理连接。**运行时能力响应**:编码模式 + 非工具能力模型 → 拒绝卡列出替代方案;数据模式 + 模型不足 → 推荐 `qwen2.5-coder:14b` 本地或云 Claude / GPT / Gemini / DeepSeek。**文件浏览器仅编码**:文件浏览器侧边栏仅在编码模式活动时可见;新的 `HiddenPathProxy : QSortFilterProxyModel` 添加右键单击 "隐藏 \"X\"" 并具有 `Config::explorerHiddenPaths` 持久性和 "显示隐藏(N)" 撤销。**用户气泡上的复制按钮**:两个小部件流路径和 HTML 转录路径都在每个用户消息下显示 ⧉ 复制。**奖励浏览器整合**:编码和数据自动全屏(v0.1.57 仅编码);在这些模式下隐藏 ⛶ 展开按钮(仅 ✕ 保留);🔒 共享文件复选框仅在编码模式下可见。**独立 Git 工具栏快捷方式已删除** - 插件 → Git 集成菜单仍然有效;完整的 VS Code 对等源控制在 v0.1.62 中与代理路线图(基础设施已存在 90%)一起登陆。 23/23 确定性回归测试通过;陈旧文本审计返回 21/21 表面匹配规范。 |
| [**v0.1.60**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.60) | 2026-05-10 | **消除陈旧文本漂移 - 关于对话框匹配现实 + 硬线审计。** v0.1.59 的 24 小时后续。在应用程序中,关于对话框仍然声称 *"100+ 文件类型 · 48 种语言词法 · 通过 Ollama / llama.cpp / OpenAI-compatible 本地 AI"* - 自 v0.1.31 以来一直冻结;版本号 *自动* 通过编译时的 `NOTEPATRA_VERSION` 流程,但正文字符串中的功能计数并未更新。GitHub 仓库描述(在 github.com 上渲染并在搜索片段中显示)甚至进一步不同步到“~4 MB 裸二进制,100+ 文件类型”。 v0.1.60 修复了两者:应用程序关于正文现在读取 `226 个文件扩展名 · 92 种语言词法` 和 `6 种 AI 后端 - Ollama / llama.cpp / OpenRouter / Ollama Cloud / OpenAI / Azure OpenAI`;GitHub 仓库描述(通过 `gh repo edit` 设置)带有相同的数字。**硬线审计以防止再次漂移**:新的 `scripts/stale-text-check.sh` 具有顶部的规范计数(`LEXER_COUNT=92 / FILE_EXT_COUNT=226 / BACKEND_COUNT=6`)和 21 个 grep-assert 跨越每个表面 - 应用程序关于正文,README 简介 + 发布表格行,`docs/index.html` 统计卡 + 元描述 + 版本卡,`docs/docs.html` 属性行,CHANGELOG,`release_notes/` 和通过 `gh repo view` 查询的 **实时 GitHub 仓库描述**。连接到 `scripts/release-check.sh` 作为 `── 陈旧文本审计(功能计数) ──` 下的子步骤 - 现在每个发布前检查都会自动运行它。**杂项清理**:`.github/ISSUE_TEMPLATE/bug_report.yml` 版本占位符从 `v0.1.8` 提升到 `v0.1.60`;`SECURITY.md` 验证示例从 `v0.1.0` 提升到 `v0.1.60`,因此复制粘贴命令在注意到 URL 是第一个版本时生效。`AGENTS.md` 测试构建目标替换了过时的五个测试列表和 `notepatra_all_tests` 元目标;`src/mainwindow.cpp` 中的语言菜单代码注释从“78 种语言”修复为“92 个词法 / 226 个文件扩展名”。 21/21 个确定性回归测试通过;陈旧文本审计返回 21/21 个表面匹配规范。裸二进制文件未更改 - 纯复制 + 脚本更改,无需新依赖项。 |
| [**v0.1.59**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.59) | 2026-05-10 | **输入权限控制 + 作者链接刷新。** 两个小的用户体验修复。聊天输入 + 发送按钮现在在所有三种模式下(聊天 / 编码 / 数据)禁用,当模型下拉列表处于占位符/错误状态时(`(detecting…)`, `(Ollama offline)`, `(no models installed)`, `(API key required)`)- 直到现在,字段保持可编辑,而发送时间是第一个信号,表明没有可用的模型。特定状态的占位符解释 *为什么* (例如 `Ollama is offline — start it ('ollama serve') and click ↻ Refresh.`)。实现是一个 `currentTextChanged` 连接 + 一个括号约定助手,因此所有 9 个禁用调用站点都被覆盖,而无需触摸它们。发送按钮获得 `:disabled` 规则(45% 标签不透明度),因此停靠区可见地告诉用户操作不可用。现有的 `sendPrompt()` 防守仍然作为备份。并且:“Prateek Singh” 在应用程序关于对话框和两个网站页脚(`docs/index.html`,`docs/docs.html`)上的信用现在链接到作者的博客,网址为 <https://theaivibe.org/about>。裸二进制文件大小 **7.73 MB stripped**。 21/21 个确定性测试通过。 |
| [**v0.1.58**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.58) | 2026-05-09 | **作曲家线路完整 - 切片 B/C/D 端到端。** v0.1.57 发布了作曲家界面,但作曲家选项卡正文是一个字面占位符,读取 *"coming in Slice B/C/D"*。 v0.1.58 完成了循环:`EditPlanList` 现在是作曲家正文,`dry_run` write_file/apply_diff 结果路由到编辑计划行,`Apply All` / `Apply Selected` 以原子方式写入文件(`.tmp + rename`)并触发 `fileWrittenByAgent`,以便编辑器重新加载。工作区根目录同步,因此每行路径以相对方式渲染(`src/foo.cpp`)而不是绝对方式。`composerMode=true` 现在在编码严格意图的作曲家选项卡中传递给 `AiSystemPrompt::build` - 现有的 `composerModeLayer` 指示模型始终传递 `dry_run: true`,因此文件写入永远不会绕过编辑计划审查步骤。裸二进制文件大小 **8.93 MB stripped**。 21/21 个确定性测试通过。 |
| [**v0.1.57**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.57) | 2026-05-09 | **编码模式改造(作曲家 + 编辑计划 + 每块应用),`@file` 提及选择器,Ctrl+I 内联编辑,代理 git 工具,多光标编辑,全屏 AI 停靠,模式感知模型着色,Windows mojibake 修复,崩溃强化。** AI 停靠的主要用户体验版本。**编码模式改造(切片 A→F)**:在 AI 停靠中分离 **作曲家选项卡** 与聊天,带有多个文件 **编辑计划** 列表 - 每个条目显示路径 + 差异预览,每块接受/拒绝复选框和底部操作栏(`Apply All` / `Apply Selected` / `Reject All`)。编码模式现在 **自动将 AI 停靠扩展到全屏**,用户切换到编码模式(并在切换回聊天/数据时恢复到以前的宽度)。 **`@file` 提及选择器** - 在聊天输入中键入 `@`,弹出一个工作区文件弹出窗口;选择的文件作为上下文添加到提示中。 **Ctrl+I 内联编辑**:在编辑器中选择代码 → 模态询问“应该变成什么?”→ AI 返回带有边侧边栏差异的替换 → 应用替换选择就地。 **代理 git 工具(只读)**:`git_status`,`git_diff`,`git_log`,`git_branch_list`,`git_show`,以便模型可以自主调用这些工具,而无需 shell-out。 **模式感知模型着色**:模型下拉列表在 **编码模式下为非工具能力模型显示琥珀色**,在 **数据模式下为非数据能力模型显示琥珀色**,并带有解释为什么的悬停提示;工具能力模型在绿色中保持不变。 **多光标编辑**:Alt+拖动进行列选择,Ctrl+单击添加光标,一次键入相同的编辑,并在每个选择中应用。 **Windows mojibake 编译修复**:添加 `/utf-8` MSVC 标志,以便在 Windows MSVC 编译中正确呈现表情符号和非 ASCII 字符(破折号,省略号)- 之前它们在聊天/横幅中显示为 `ðŸ"`,`…`,`·` 垃圾。 **横幅包装修复**:数据模式功能横幅移动到其自己的行 + `heightForWidth(true)`,以便面板在狭窄的停靠宽度下调整大小而不会被剪裁。 **llama.cpp 安装检测**:区分“已安装但未运行”和“未安装”,以便状态提示是可操作的。 **崩溃强化**:空指针保护,网络超时和 `aipanel.cpp` / `ollama.cpp` / `ai_tools.cpp` 中的结构化错误显示 - 即使后端在中途消失,AI 也不会崩溃。 **二进制大小**:仍然 ~9 MB Linux x64 stripped(附加项是纯 UI / 线路,没有新的重依赖项)。 |
| [**v0.1.55**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.55) | 2026-05-09 | **DuckDB 引擎,Azure OpenAI,Ollama Cloud,78 种语言词法,隐私切换,凭证清除器。** 主要版本。**云 AI**:4 个云后端(OpenRouter,OpenAI,Ollama Cloud,Azure OpenAI),每个提供商都有自己的每提供商密钥槽(无跨提供商泄漏)。新的 AI 设置对话框,每个提供商都有测试/保存/忘记功能。模型下拉列表可搜索 - 输入 `xai`/`grok`,`claude`,`gpt`,`kimi`,`gemini` 以显示正确的组。 Ollama `/api/show` 能力探测 - 新的工具训练模型无需 Notepatra 版本即可使用。 OpenRouter `reasoning` 参数路由 - 想一下复选框现在实际上适用于 Claude / o 系列 / Gemini。 **DuckDB 本地引擎**:数据模式下的 `libduckdb-1.1.3` 动态链接(RAII C 包装器,结构上无泄漏,流式行回调,模式内省,httpfs/S3/Parquet/CSV/JSON 视图注册)。 DB 连接面板中的新 `DUCKDB` 驱动程序。 **数据库树对话框**(浏览架构...):连接 → 架构 → 表 → 列,延迟加载,右键单击“将架构发送到 AI” / “采样 10 行” / “复制 SELECT \*”。 **78 种语言**(47 → 78):32 个新专用词法 - Dart,Solidity,Zig,Vala,Hack,Julia,R,Protobuf,F#,HCL,Thrift,GraphQL,GDScript,Nim,Cython,Mojo,Crystal,Elixir,Scala,Groovy,Apex,Jinja,Liquid,Twig,Dockerfile,Fish,Nushell,TOML,DotEnv,Gitignore,JSON5,BibTeX。每个关键字表都经过官方规范验证,以并行研究代理验证。每个新语言都启用注释切换(Ctrl+Q / Ctrl+Shift+Q)。 **隐私**:凭证清除器捕获 14 个供应商模式(OpenRouter / Anthropic / OpenAI / GitHub / GitLab / AWS / Slack / Stripe / SendGrid / Google / JWT / PEM / 通用密钥=值)在任何文本离开机器之前。新的 🔒 共享文件与 AI 切换(默认为关闭,仅编码模式)- 聊天/数据模式从不查看文件内容。欢迎页面表情符号备用链 - Linux tofu 框(□)图标替换为实际字形。 **多文件分析师上下文**:`.notepatra/data-analyst/` 目录加载器(说明 / 数据字典 / 业务规则 / KPI / 示例查询)。 **测试**:21/21 通过 - 新增 test_credscrub(14 个供应商模式)+ test_duckdb(流式 + RAII + 模式)。 **二进制大小**:~9 MB Linux x64 stripped(基本上与 v0.1.54 相同 - DuckDB 是一个单独的 `.so` 用户安装一次)。 |
| [**v0.1.54**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.54) | 2026-05-08 | **AI 后端下拉列表修剪为 4 + 线路修复 + 搜索图标润色。** 删除 `自定义`(面板顶部没有 URL 字段 - 曾经是一个 no-op),`LM Studio` 和 `Jan`(两者只是 llama.cpp 周围的 GUI 包装;Ollama 涵盖简单的本地和 llama.cpp 涵盖高级用户;已编目 12-GGUF 目录已在模型下拉列表中)。下拉列表现在恰好是 **Ollama / llama.cpp(GGUF)/ OpenRouter(云)/ OpenAI**。 **Ollama 重新检测错误修复**:从云切换回 Ollama 现在正确重置基 URL(之前,`m_ollama` 指向 openrouter.ai 而 `/api/tags` 探针失败静默 → "(Ollama offline)")。`modelsError` 处理程序由**发送,以便 llama.cpp / OpenRouter / OpenAI 目录在实时探测失败时保持可见。 **数据分析师横幅使用族名称**(Claude / GPT / Gemini / Qwen-Coder / Llama)而不是版本号(Claude Sonnet 4.5,GPT-5,...),版本号会每几个月过时。 **横幅颜色主题感知** - 在 Light,Dark,Monokai 上可读。 **项目搜索工具栏图标** 镜头位置调整(中心 0.40 → 0.44,半径 0.28 → 0.25),以便顶部左侧的放大镜笔画不会与圆形方块的角落进行抗锯齿融合 → 150% DPI。 **OllamaClient::modelsListedRich(QJsonArray)** 信号用于即将到来的 v0.1.55 实时模型选择器。 **Rust 119 / 119,C++ 19 / 19,构建干净。** |
| [**v0.1.53**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.53) | 2026-05-08 | **精选模型列表 + 数据分析师欢迎卡。** 模型下拉列表现在显示每个后端的有序目录,而不是 `/v1/models` 返回的内容:`llama.cpp` 的 12 个 GGUF 选择(Qwen2.5-Coder 1.5B/7B/14B,Llama 3.2 3B / 3.1 8B,Phi-4,Gemma 2,Mistral 7B,DeepSeek-Coder-V2-Lite,StarCoder2 - 每个都有 HuggingFace 下载网址在提示中),OpenRouter 的 13 个跨提供商选择(Claude Sonnet/Opus/Haiku 4.5,GPT-5 / 5-mini / 4o / o1-mini,Gemini 2.5 Pro / Flash,DeepSeek R1,Llama 3.3 70B,Qwen2.5-Coder 32B,Mistral Large),OpenAI 的 6 个选择。 当用户在新聊天中切换到数据分析师模式时,会出现一个橙色欢迎卡,顶部有标题,单段解释,三个可点击的示例提示芯片,连接计数 + 管理连接按钮,模型能力指示器(✓/⚠),和隐藏按钮(通过 `Config::aiHideDataWelcome` 持久)。 能力横幅重新设计,以提及本地修复(`ollama pull qwen2.5-coder:14b`)而不是仅限云端 - 之前,用户认为付费云是唯一出路。 **Rust 119 / 119,C++ 19 / 19,构建干净。** |
| [**v0.1.52**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.52) | 2026-05-08 | **工具栏图标 HiDPI 渲染 + 项目搜索按钮可见性。** v0.1.50 的 `AA_UseHighDpiPixmaps` 是正确的,但 `makeFeatureIcon()` 仍然将 `QPixmap` 栅格化为固定的 32×32 - 在 150% Qt 缩放时,栅格化为 ~48 设备像素 → 像素化。 现在绘制到 `32 × dpr` 后备存储,使用 `setDevicePixelRatio(dpr)` + `painter.scale(dpr, dpr)`,以便每个 `drawXxxFeatureGlyph()` 都产生亚像素精确输出。 Windows 125%/150%/175% 和 Retina 上保持清晰。 **按钮不受影响** - v0.1.49 的每个按钮最小宽度和 v0.1.50 的 HighDpiScaleFactorRoundingPolicy::PassThrough 得到保留。 另外,项目搜索取消 + 清除历史按钮标签从 `textPrimary`/`#AAA`(在浅色主题下几乎不可见)更改为粗体橙色 (`#E67E22`) 在每个主题上都可见。 **Rust 119 / 119,C++ 19 / 19,构建干净。** |
| [**v0.1.50**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.50) | 2026-05-08 | **HiDPI/分数缩放修复 - Windows 125%/150%/175% 现在正确渲染。** 用户报告,即使在 v0.1.49 的每个按钮最小宽度修复之后,括号/HTML/SQL 工具按钮标签在 Windows 上仍然被截断。 根本原因:应用程序 **零 Qt HiDPI 属性集** - Qt 5.15 的默认 `Round` 策略将 150% 缩放至 200%,使每个按钮宽度比布局宽 33%。 在 `QApplication` 构造 **之前** 设置了三个 Qt 属性:`AA_EnableHighDpiScaling`(选择逻辑像素坐标),`HighDpiScaleFactorRoundingPolicy::PassThrough`(使用 OS 缩放因子),`AA_UseHighDpiPixmaps`(@2x 位图变体)。 修复了 Windows 和具有分数字体配置 DPI 的 Linux 发行版上的按钮截断。 macOS 已经处理。 **Rust 119 / 119,C++ 19 / 19 - 构建干净。** |
| [**v0.1.49**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.49) | 2026-05-08 | **Windows 按钮截断问题修复 + SQL Compact 格式化工具。** 多个单词的按钮标签(例如 `格式(2 个空格)`、`生成文档`、`添加注释`、`编写测试`、`插入到光标处`、`替换选中内容` 等)在 Windows 上被截断为 `…`,因为 Segoe UI 字体比 Linux DejaVu Sans Mono 宽约 20%,而按钮只有固定高度,没有最小宽度。现在,所有受影响的按钮在 `FormatterPanel::addButton`、`AI 快速操作行`和 `SQL 面板`中均设置了 `minimumWidth = fontMetrics.horizontalAdvance(label) + 22..28`,确保标签不会被截断。此外,新增 **紧凑** 按钮在 SQL 工具中 - 以单行方式尽可能呈现相同的解析 AST:短查询保持在一行,长查询仅在主要子句边界处换行(`SELECT` / `FROM` / `WHERE` / `GROUP BY` / `ORDER BY` / `RETURNING`)。支持与格式(T-SQL、PostgreSQL、MySQL、SQLite、Oracle、ANSI)相同的方言。新增 Rust `format_sql_compact` + FFI `npc_format_sql_compact` + C++ 包装器。**Rust 119 / 119(新增 4 个紧凑模式测试),C++ 19 / 19。**
| [**v0.1.48**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.48) | 2026-05-08 | **AI 面板 UX 改造 + JSON / HTML / 括号 / SQL 强化 + git 内联差异。** AI 面板:3 路分段选择器 `[聊天 | 编码 | 数据]` 替换了杂乱的单行复选框;默认 50% 停靠宽度;修复了两个死代码 `connect()` 调用(数据切换 + 管理连接为空指针连接)。HTML / 括号工具与 JSON 的严格编号规则 AI 提示框架对齐("保留所有内容 / 不添加新字段");完整的输出清理管道对齐(`<think>` 条带、` ``` 围栏条带、`前缀条带、`空响应回退、`recordFix + 显示差异 + 日志操作)。Rust 核心强化:JSON / HTML / SQL / 括号的 50 MB 硬上限;JSON 正则表达式通过 `OnceLock`;括号 `O(n²) insert(0)` → 线性;括号单独跟踪单引号和双引号(修复 `"don't"` 错误切换);括号连续反斜杠转义计数(修复 `"a\\"`)。**SQL 格式化工具(发现的真实错误):** T-SQL `TOP N` 和 PostgreSQL `ON CONFLICT` 被无声丢弃 - 已修复;UPDATE / DELETE / INSERT 现在正确格式化而不是回退到紧凑显示;CASE / WHEN 扩展时;长 IN 列表换行;GROUP BY 每行一个列。REST 客户端:30 秒传输超时;`errorOccurred` 处理器具有语义消息(DNS / 拒绝 / SSL / 超时);HTML 转义非 JSON 正文。**Git 面板:VS Code 样式的内联差异视图** - 点击更改中的文件,面板拆分,+/- 行渲染带颜色。SQL 格式化工具不再冻结 UI 3 秒(缓存探测代替阻塞 `OllamaClient::isAvailable()`)。删除了孤立的 "搜索结果将出现在此处…" 小工具。Linux 表情符号备用字体,因此 🔎 / 🔍 不再呈现为豆腐。**测试:Rust 115 / 115(之前为 33;新增 82 个),C++ 19 / 19** - 包括 12 个真实的 PostgreSQL 模式(UPSERT、递归 CTE、窗口函数、JSON 操作、ARRAY_AGG、多条件 JOIN ON、美元引用字符串、LATERAL)。 |
| [**v0.1.47**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.47) | 2026-05-08 | **图标刷新。** 用户报告 Notepatra 任务栏图标明显比其他应用程序小。艺术作品是正确的,但叶子 + 电路图形仅填充了大约 60% 的画布,周围留有大量黑色填充。重新渲染了所有图标,将叶子放大约 22%,使其现在填充约 85% 的画布 - 在每个任务栏 / 停靠 / 文件管理器大小下读取都更大。所有标准 PNG 大小均从新的 1024px 主图重新生成(16/24/32/48/64/128/256/512/1024);Windows `.ico` 使用 7 个标准嵌入式大小重建;macOS `.icns` 重新生成。 |
| [**v0.1.46**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.46) | 2026-05-08 | **v0.1.45 上的热修复。** 两个回归: (1)v0.1.45 在 `doFindAllCurrent` (查找选项卡 → 当前文件中查找按钮)中添加了 `beginSession()`,但在其上方保留了一条陈旧的 `sr->clear()` 行,因此每次搜索都清除面板的历史记录,然后再添加新会话 - 在最常见的查找路径中,有效地阻止了堆栈。删除了陈旧的 `clear()`。(2)停靠在底部的搜索结果面板上的新 ✕ 关闭按钮即使在空面板上也是可见的(在运行任何搜索之前),看起来像一个孤立的浮动 UI 元素。修复:面板以 ✕ 隐藏启动;第一次 `beginSession` 调用显示它;显式 `clear()` 再次隐藏它。在 v0.1.46 之后,所有三种查找路径的行为保持一致 - 每个搜索都在顶部创建一个新会话,之前的会话会折叠,限制为 10 个。 |
| [**v0.1.45**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.45) | 2026-05-08 | **v0.1.44 上的热修复。** v0.1.44 在 `ProjectSearch` (Ctrl + Shift + G 选项卡)中添加了关闭按钮 + 堆叠历史记录,但 **查找文件** (Ctrl + Shift + F)填充了不同的小工具 - 停靠在底部的 `SearchResultsPanel` - 它仍然没有关闭按钮,并且每次搜索都清除历史记录。v0.1.45 将这两个功能移植到该面板:红色 ✕ 关闭按钮( `#E81123`,主题无关),每个“查找全部”成为一个顶级会话行(`🔎 搜索 "needle" - N 个命中 M 文件 · HH:MM:SS`),之前的会话自动折叠,限制为 10。此外,**显式注释 / 取消注释菜单项**,类似 Notepad++ 风格 - v0.1.44 菜单只有切换行/块注释;v0.1.45 添加了专用的 `注释行` (Ctrl + K),`取消注释行` (Ctrl + Shift + K),`注释块`,`取消注释块` 操作,位于右键上下文菜单和编辑 → 注释/取消注释子菜单中。新 `uncommentLine` 仅在标记是行上的第一个非空白令牌时剥离,因此 SQL 或字符串中的内联 `--` 保持完整。 |
| [**v0.1.44**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.44) | 2026-05-07 | **项目搜索 UX + 语言感知注释切换。** 三个 Notepad++ 风格的升级: (1)**红色 ✕ 关闭按钮** 在项目搜索面板标题上(主题无关 `#E81123`,白色悬停红色)- 在 v0.1.44 之前,没有办法关闭面板,只能右键单击选项卡。(2)**可堆叠、可折叠的搜索历史记录** - 按下搜索不再清除以前的结果;每个搜索成为一个顶级会话行(`🔎 "pwd" Aa W - 5 个命中 1 个文件 · 12:34:07 · /path`),文件作为子级 + 匹配作为孙级。早期会话自动折叠;限制为 10 个;清除历史记录按钮清除所有内容。(3)**右键单击 `切换行注释` + `切换块注释`**,通过新的公共静态 `Editor::commentSyntaxFor(lang) → {line, blockOpen, blockClose}` 进行语言感知 - Python `#`,C 系列 `//` 行 + `/* */` 块,SQL `--` 行 + `/* */` 块,HTML/Markdown `<!-- -->`,PowerShell `#` + `<# #>`,Lua `--` + `--[[ ]]` 等。v0.1.44 之前,编辑器在所有文件类型上都添加了 `#`,静默地将 Markdown 行变成标题。新快捷键 `Ctrl+Q`(行)和 `Ctrl+Shift+Q`(块)匹配 Notepad++。新的 `toggleBlockComment()` 执行原子包装或剥离。纯文本 / 未识别的扩展名禁用菜单项,并显示 `(X 没有 X 的语法)`,因此用户看到为什么没有任何反应。新增 `test_options_actually_work` 中的 25 个断言,涵盖 12 种语言。 |
| [**v0.1.43**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.43) | 2026-04-30 | **AI 助手的数据分析模式。** AI 面板标题中的新 `数据` 切换按钮(与编码模式互斥)。启用时:附加的 CSV 文件获得结构化的、感知模式的预览,而不是原始文本转储(分隔符嗅探、整数 / 实数 / 布尔值 / 日期类型推断、头部 + 尾部行,限制 4 KB);**管理连接...** 对话框允许您保存 SQLite / PostgreSQL / MySQL / SQL Server 连接;两个新的代理工具 `csv_query` 和 `query_sql` 允许模型运行真正的 SQL(默认为仅限 SELECT;需要显式确认才能进行突变);` ```chart ``` 块中的图表规范渲染为 **交互式 QChartView** 小工具(线形 / 条形 / 饼形 / 散点图);`.notepatra/data-analyst.md` 自动作为项目上下文添加;当活动模型低于推荐水平时,显示能力横幅。新模块:`csvanalyst.{h,cpp}` · `dbconnections.{h,cpp}` · `chartrender.{h,cpp}`。构建添加 Qt5 Sql + 图表。新 `test_ai_dataanalyst`(~50 个断言)。18/18 ctest 套件绿色。连接密码在静止时被遮蔽(XOR + base64),**不加密** - 诚实地记录了这一点。 |
| [**v0.1.42**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.42) | 2026-04-30 | **“使每个选项实际工作”的版本。** 审计显示首选项对话框的常规 / 编辑 / 边距 / 制表符设置 / 自动完成 / 新文档选项卡都是完全 **stub UI** - 复选框 / 单选按钮 / 旋转框构造时具有硬编码值,从未读取 `Config`,从未写回。甚至没有确定按钮。v0.1.42 修复了整个应用程序中所有无效控件。**首选项对话框重写** - 25+ 个控件现在通过 `Config` 连接到 OK/Apply/Cancel;新的字体选择器;新的隐藏工具栏 / 可关闭的标签页 / 显示书签 / 默认 EOL 选项。**编码菜单实际重新解码/转换** - 新的“以... 重新解读字节”和“转换为”子菜单(UTF-8 / UTF-8 BOM / UTF-16 LE / UTF-16 BE / Windows-1252 / ISO-8859-1),通过 `QTextCodec` 重新读取字节并写入正确的字节。**视图菜单选中标记同步** - 显示所有字符 / 显示空格 / 显示行尾 / 显示缩进指南 / 换行反映实际编辑器状态并传播到所有打开的标签页。**编辑 → EOL 转换 + 设置 → 制表符设置 + 缩放** - 现在全部持久保存。新 `Editor::applyConfig()` 是单一的真实来源。新 `test_options_actually_work`(49 个断言)- 以编程方式切换每个首选项控件并验证编辑器 + Config 实际更改。**18/18 ctest 套件绿色**(之前为 17)。此外,比较 Polish:Diff 仅默认显示 + 显眼,黑暗主题标签修复,按钮文本不再截断,AI 停靠窗口可手动调整大小,Windows / macOS 现代字体默认值扩大。 |
| [**v0.1.41**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.41) | 2026-04-30 | **“差异仅”切换版本。** 比较工具栏中的新复选框 - 选中 **差异仅**,匹配的行从两个窗格中消失,只留下添加 / 删除 / 更改的行。原始行号在沟槽中保留,因此每个差异仍然锚定到其实际文件位置。默认为关闭 - 完整的全文件视图与 v0.1.40 不变。`src/compare.cpp` 中的单个文件更改(在渲染之前过滤行向量 - 没有代码路径重复)。测试 7(新的 4 个断言)`test_compare_widget`。17/17 回归套件绿色;更改纯粹是附加的。 |
| [**v0.1.40**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.40) | 2026-04-29 | **“停止搞乱我的 JSON”版本。** 用户报告 v0.1.39 的 AI 停靠聊天时,当要求修复损坏的 JSON 时,会 **添加字段并重新构造** - 工具 → JSON 工具 → AI 修复有严格的最小更改规则,但聊天模式的“修复我的 JSON”路径没有。六个修复:(1)**AI 聊天修复意图检测** - `修复我的 json` / `修复此 html` / `sql 已损坏` 等交换系统提示为严格的最小更改修补程序;不会触发 `解释我的 json` / `什么是 json`。新模块 `src/ai_intent.{h,cpp}`。(2)**三个快速操作按钮** - 修复 JSON / 修复 HTML / 修复 SQL 路径直接进入严格修补程序提示。(3)**apply_diff 三级匹配** - 严格 → 读取 `read_file` 的 ` N\t` 行号前缀 → `.trimmed()` 比较;发出 `result.warnings` 在宽松层级上,以便代理自我纠正。真正的冲突仍然被拒绝。(4)**read_file with_line_numbers` 参数** - 默认 `true`(兼容);传递 `false` 获取原始内容而没有前缀,建议在将行馈入 `apply_diff old_lines` 时使用。(5)**工具调用 JSON 解析错误显示** - 两个 Ollama 和 OpenAI 兼容路径现在使用 `QJsonParseError` 并发出结构化 `error_kind: malformed_args` 工具结果返回给模型,并带有 240 2 字节预览的工具结果反馈。(6)**工具模式系统提示**更新为教授模型新参数并禁止复制行号前缀到 `apply_diff`。**17/17回归套件绿色**(之前为 16 个);新 `test_ai_intent`(49 个断言),`test_ai_tools` 中 +20。(40) |
| [**v0.1.39**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.39) | 2026-04-27 | **编码工具 + 持久聊天记录 + 可见关闭按钮。** 三个新的代理工具弥补了用户报告的差距(`“创建 Python 文件”应该实际创建.py文件`):**`write_file`**(模式:覆盖/创建/追加;自动创建路径;拒绝遍历和拒绝列表路径;自动打开或静默重载文件到编辑器),**`search`**(文字或正则表达式;通配符过滤;大小写敏感性;限制 200 个匹配;与文件资源管理器重型目录过滤器相同),**`apply_diff`**(原子两阶段应用:首先验证所有 hunks 对活动文件 → 如果有任何漂移返回 `error_kind:conflict` 并且 **不** 触摸文件;否则按逆序应用 → `.tmp + std::rename` 以防 kill-9 中途写入失败)。另外,**持久聊天记录** - 每工作空间 `~/.config/notepatra/chat-history/<sha1>.json`,2 秒内延迟保存,1 MB 限制,旧消息滚动,**原子写入**,在重置时删除。还有一个 UI 修复:AI 停靠按钮在每个主题上都与顶部饰边颜色相同 → 现在使用 U+00D7 × Windows 规范关闭按钮红色 `#E81123`(透明静止,红色背景 + 白色 X 悬停),主题无关。新 `resolveSafeWritePath` 助手,用于写入路径安全性:目标可能尚未存在,但最低现有祖先必须在工作空间内规范化;拒绝列表应用于候选目标。**134 个工具测试**(之前为 80 个;+54 个涵盖每个模式/边缘情况/拒绝)。16/16 回归测试通过。总套件中的断言 ≈ 2050。 |
| [**v0.1.38**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.38) | 2026-04-26 | **AI 助手崩溃修复 + 自定义聊天文件泄漏修复。** **错误 1**:当模型流式传输时,点击编码模式导致使用后释放崩溃。`renderTranscript()` 调用 `aiClearChat()`,后者 `deleteLater()` 销毁流式传输卡片及其子 `m_streamingStats` QLabel - 但 250 毫秒计时器继续在悬空指针上触发。修复:停止计时器并在清除布局前使其为空。 **错误 2**:在 AI 聊天中输入“hi”(编码模式关闭,无选择)会将整个打开的文件附加到提示中,因为 `m_context` 默认为整个文件,并且“自定义”操作无条件内联 `m_context`。修复:新的 `m_contextIsSelection` 标志 - “自定义”操作仅在上下文是实际用户选择时内联上下文;快速操作(解释/重构等)仍然内联整个文件,因为它们需要代码;工作区上下文块仍然通过 `shouldAttachWorkspace` 附加到项目级别的问题。 16/16 回归测试通过。 |
| [**v0.1.37**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.37) | 2026-04-26 | **全面的词法器调色板覆盖 - 1650 种样式 × 3 种主题,0 个空白。** 新的 `test_lexer_coverage` 审计遍历了所有 28 个词法器(22 个 QScintilla + 6 个 Notepatra-local)。在 v0.1.37 之前:**359 个样式空白** 降级为默认文本。 在 v0.1.37 之后:**0 个空白**。在 `npp_palette.cpp` 中添加了约 30 个新的样式种类匹配器:转义序列(`\n`/`\xNN`),任务标记(TODO/FIXME),此处文档,标量,POD,标签,章节,键,引用/锚,文档分隔符,列表项,块引用,删除线,水平规则,SGML/CDATA,HTML 片段,CSS `@-rules` + `!important` + ID 选择器 + 哈希颜色,差异 +/-/已更改行 + 位置标记,参数扩展(`${var}`),模块名称,IDL UUID,代码块等。**Monokai 运算符修复** - 曾是 `#F8F8F2`(与默认文本相同 → 不可见)。现在为 `#FD971F`(Monokai 琥珀色)。**YAML 品牌** - 键(样式 2“标识符” - YAML 中的键),引用/锚,文档分隔符全部有主题(以前未样式化)。**属性/TOML/INI/.env 品牌** - 章节,键,值不同(以前 TOML 特定种类未样式化)。**差异品牌** - `+`/`-`/`@@` 行红色/绿色/青色。`test_lexer_coverage` 在每个 CI 构建中运行 - 任何引入未主题样式的未来重构都会失败 CI。 16/16 回归测试通过。总套件中的断言 ≈ 1900(以前 ≈ 280)。 |
| [**v0.1.36**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.36) | 2026-04-26 | **多词短语搜索 + 比较时默认忽略空格。** **项目搜索**:诸如 `import os`(带空格)的多词文字已经通过子字符串 (`QString::indexOf`) 和 Rust Aho-Corasick 快速路径起作用 - 但占位文本听起来像是单令牌,因此用户认为他们必须使用正则表达式 `\s` 或 wholeWord 模式。新占位符: *"搜索任何文本 - 词语,诸如“import os”的短语,或正则表达式模式..."*。另外,查询自动修剪,以便 `" import os "` 等效地工作。两个新测试用例锁定多词行为:短语缩小与单词基线,不包含非连续匹配(`from os import path` 不匹配 `"import os"`),修剪不变。**比较**:`忽略空格` 复选框现在默认为开启 - 大多数比较选项卡用例是“此代码是否更改?”其中重新缩进不应显示为差异。用户可以取消选中那些希望进行字节确切比较的用户(YAML / Python 缩进)。`test_projectsearch`:26 → 31 个断言,`test_compare_widget` 测试 1 反转以匹配新默认值。15/15 回归测试通过。 |
| [**v0.1.35**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.35) | 2026-04-26 | **编码模式现已启用AGENTIC — AI可以自主读取文件和列出目录。** 切换编码模式 + 询问代码相关问题 → AI 将调用 `read_file(path, offset?, limit?)` 和 `list_dir(path)` 以遍历工作空间后作出回应。每次读取都会显示为内联的 `🔧 read_file (...) → 247 lines` 卡片。多轮对话。**适用于所有后端**:通过 `/api/chat` 与 Ollama(本地)以及 `tools` 数组 · llama.cpp `llama-server`(带有 `--jinja`)· OpenAI 兼容(OpenRouter、OpenAI 直接、LM Studio、vLLM、Anthropic 通过 OpenRouter、Gemini 通过 OpenRouter、Jan 等)。**三层路径安全**:工作空间锚点规范化(拒绝 `../../etc/passwd`)、硬编码拒绝列表(拒绝 `~/.ssh/`、`*.pem`、`*.key`、`id_rsa*`、`/etc/passwd|shadow`、`~/.gnupg/`、`~/.aws/`、`~/.netrc`、`~/.npmrc`、`~/.docker/config.json` 等 — 捕获指向机密的符号链接)、结构化错误。**每用户对话限制 25 次调用**(防止失控循环)。工具请求的温度固定为 0.1。**条件反工具调用层** — 带有工具时切换为工具模式序言,以便模型不会看到矛盾的指导。新 `test_ai_tools` 包含 **68 个断言**,涵盖拒绝列表、工作空间锚点、遍历阻止、分页、 二进制检测、垃圾过滤、注册表形状、模型允许列表。实现由 3 个并行研究代理驱动:Ollama/llama.cpp/OpenAI 兼容线格式 + 已建立的 AI 编程助手安全工具模式 + Notepatra 集成映射。15/15 回归测试通过。v0.1.36+ 延期:`search`(ripgrep)、`write_file`/`apply_diff`。 |
| [**v0.1.34**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.34) | 2026-04-26 | **在所有格式化面板中修复白色折叠边距黑暗主题。** **修复**:SQL 格式化工具、JSON 工具、HTML 工具和括号工具在黑暗主题下在行号和编辑器内容之间都显示出一条刺眼的白色垂直条纹(用户通过 Windows SQL 格式化工具截图报告)。根本原因:`setFolding(BoxedTreeFoldStyle, 2)` 创建了一个折叠标记边距,但 **未设置主题** — `setFoldMarginColors()` 是一个单独的调用,所有四个面板都缺少这个调用。QScintilla 默认将折叠边距设为白色。在 `src/sqlfmtpanel.cpp`(也完全缺少 `setMarginsBackgroundColor` / `setMarginsForegroundColor`)和 `src/fmtpanel.cpp`(在构造函数和 `onThemeChanged` 中重新应用路径)中修复。**新增结构化折叠边距配对测试** 到 `test_palette.cpp` — 在测试时读取相关的 `.cpp` 文件,并验证任何调用 `setFolding()` 且具有真实折叠样式的文件也调用 `setFoldMarginColors()`。未来忘记主题折叠边距的编辑器面板将在用户看到错误之前在 CI 中失败。test_palette:60/60 检查(之前为 56;+4 折叠边距配对)。14/14 回归测试通过。 |
| [**v0.1.33**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.33) | 2026-04-26 | **Linux 表情符号渲染修复 + 全面的调色板测试覆盖。** **修复**:Linux 上的 AI 助手响应在渲染表情符号时显示为 `□` tofu(`Hello! 👋` → `Hello! □`)。Linux 文本字体(Inter、Noto Sans、DejaVu 等)不包含表情符号字形,而 Notepatra 在 `src/fonts.h` 中的 CSS 字体链中 **未列出任何表情符号字体作为备用字体**。修复方法:在 UI 和代码 CSS 链中追加 `Apple Color Emoji` → `Segoe UI Emoji` → `Noto Color Emoji` → `Twemoji Mozilla` → `Twitter Color Emoji` → `Symbola`。Windows 已经可以正常工作,因为 Segoe UI 在操作系统级别上与 Segoe UI Emoji 自动配对。**扩展测试覆盖范围** 从 38 → 56 种颜色检查。新断言涵盖 PowerShell ISE 签名(`$variable` `#FF4500`,cmdlet `#0000FF`,别名 `#0080FF`)、Python 品牌(类/函数 `#795E26` 琥珀色,内置 `#267F99` 蓝绿色)、SQL SSMS 紫红色 `#FF00FF`、JS 蓝绿色类型 `#267F99`,以及 6 个表情符号备用链断言。**新测试捕获的两个错误** 已修复:(1) Python 内置函数未落实为默认文本,因为 `QsciLexerPython` 样式 14 描述为“高亮标识符”,优先匹配标识符;(2) SQL 用户定义关键字槽 19 未落实为默认文本,因为“用户定义 1”不包含“关键字”。两者都通过在 `npp_palette.cpp` 中的标识符匹配器之前添加 `d.contains("highlighted") || d.contains("user defined")` 分支来修复。在 CI 中,调色板/字体的回归测试现在会失败,而不是通过用户截图。14/14 回归测试通过。 |
| [**v0.1.32**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.32) | 2026-04-26 | **PowerShell 高亮修复 + 每个语言的品牌调色板(Python、SQL、JSON、JS/TS、C/C++、Bash)。** **修复**:PowerShell 中的 `New-Object`、`Get-Item`、`Where-Object` 等在 Windows 上渲染为默认白色文本。根本原因:`LexerPowerShell::keywords()` 将其关键字集与 Scintilla 的 `SCI_SETKEYWORDS` 插槽顺序混淆 — 完整的动词-名词 cmdlet 名称落在索引 4(User1)而不是索引 1(Cmdlets),而 User1 描述则落实为默认文本。重新排序集合:集合 1 → 关键字,集合 2 → Cmdlets(完整动词-名词 + 动词),集合 3 → 别名,集合 5 → User1(.NET 类型名称)。**PowerShell ISE 规范调色板**:`$variable` 绘制为橙红色 `#FF4500`(ISE 签名,也用于 Microsoft 官方的“PowerShell ISE”主题,与 VS Code PowerShell 扩展捆绑);cmdlet 纯蓝色 `#0000FF` 浅色 / `#9CDCFE` 暗色;别名较浅的青色 `#0080FF`。**每个语言的品牌调色板** 在 v0.1.31 版本后恢复:Python 使用 VS Code Dark+ 规范(蓝色关键字 + 蓝绿色内置 + 琥珀色函数名);SQL 使用 SSMS 签名(蓝色关键字 + 紫红色 `#FF00FF` 系统函数/类型 — SSMS 即时识别的外观);JSON 使用 VS Code Light+/Dark+(属性键 `#0451A5` JSON 蓝色浅色 / `#9CDCFE` 暗色,true/false/null 亮关键字蓝色);JS/TS/CoffeeScript + C/C++/C# 使用 VS Code Dark+ 蓝绿色类型 `#4EC9B0`/`#267F99`。多编辑器研究驱动了所有颜色选择:Notepad++ 主版 + VS Code Dark+/Light+ 默认设置 + PowerShell ISE + SSMS 文档 + PyCharm Darcula + Sublime Mariana,跨 11 种语言验证十六进制。新增 `d.contains("property")` 调色板匹配器,以便 JSON/CSS/YAML 键自动拾取每个语言的品牌颜色。14/14 回归测试通过。 |
| [**v0.1.31**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.31) | 2026-04-26 | **Notepad++ 规范 9 色调色板大修 + 持久流媒体统计 + 隐私修复。** v0.1.30 用户抱怨“**关键字 + 实际语法都是蓝色阴影**”通过三个更改修复:标识符绘制为默认文本(之前为 `#001080`/`#9CDCFE` 蓝色),运算符绘制为海军蓝/橄榄绿 **粗体**(之前为普通文本),次要关键字(类型)绘制为鲜活的紫色 `#8000FF`(之前为 `#267F99` 蓝绿色)。浅色调色板:关键字 `#0000FF` 粗体 · 类型 `#8000FF` 紫色 · 注释 `#008000` 斜体 · 数字 `#FF8000` · 字符串 `#808080` · 运算符 `#000080` 粗体 · 预处理器 `#804000` · 类 `#7F0000` 栗色 · 标识符 默认文本。暗色主题使用来自 N++ `DarkModeDefault.xml` 的 Zenburn 衍生色调:温暖的沙色关键字 · 岁绿色类型 · 玫瑰色字符串 · 橄榄色运算符 · 桃色预处理器 · 青色数字 · 浅黄色类。十六进制代码直接根据 `notepad-plus-plus/notepad-plus-plus` 主版 `stylers.model.xml` + `DarkModeDefault.xml` 验证。修剪了 14 个冗余的每个语言覆盖;保留了品牌口音(Rust 琥珀色、Go 青色、Swift Xcode 粉色、Kotlin Darcula 橙色、Java IntelliJ 海军蓝、Ruby 红色等)。**流媒体统计数据在响应完成后持续存在** — `endAssistantBubble` 将最终计数种子到 `ChatMessage` 上,以便 `aiAddAssistantCard` 在每个气泡上永久保留 `⏱ N tok · X tok/s · Y s`,而 `responseStats` 会用 Ollama 的规范数字重写。**隐私修复**:删除了三个网站截图(`tour.gif`、`editor-dark.png`、`ai-assistant.png`),这些截图在项目搜索文件夹字段 + 最近文件面板中泄露了文件系统路径;用两个干净的重新截图替换。关于对话框“100+ 语言”→“100+ 文件类型 · 48 种语言词法分析器”(审计实际计数)。14/14 回归测试通过。 |
| [**v0.1.30**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.30) | 2026-04-26 | **AI 助手气泡在生成期间的实时令牌速率。** v0.1.26 添加了每次响应的统计数据(`1234 tok · 123.4 tok/s · 2.3 s`),但仅在响应完成后才显示。v0.1.30 使这些统计数据实时流式传输 — 一个小的 `⏱ 145 tok · 23.4 tok/s · 6.3 s` 标签位于卡片标题和流媒体正文之间,每 250 毫秒刷新一次,同时模型生成输出。三种显示模式(预热中/无令牌速率/完整三项)平稳过渡。当流媒体结束时,实时标签消失,气泡重新渲染,规范的 `eval_count` / `prompt_eval_count` 从 Ollama 的完成帧中烘焙到标题中(因此聊天历史记录永久保留最终统计数据)。修复现有错误:点击 **停止** 生成期间现在也干净地结束助手气泡(`OllamaClient::cancel()` 静默断开而无信号 — 曾将卡片冻结,计时器仍在滴答)。适用于每个模型 + 每个后端(Ollama / llama.cpp / OpenAI 兼容)。14/14 回归测试通过。 |
| [**v0.1.29**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.29) | 2026-04-26 | **CI 热修复,解锁 v0.1.27 + v0.1.28 发布管道。** v0.1.27 和 v0.1.28 都编译通过,但在 `test_palette` 的回归套件中失败,因为两个断言硬编码为 v0.1.26 的调色板颜色:C++ 次要关键字(样式 16,`SCE_C_WORD2`)断言 `#800080` 紫色,但 v0.1.27 更改为 `#267F99` 蓝绿色(VS Code 类型名称的默认设置);JSON 关键字(样式 11)断言通用 `#0000FF` 但 v0.1.27 更改为 `#0451A5` JSON 关键字蓝色(VS Code 默认 JSON 主题)。两种都是有意的每个语言调整 — 测试断言跟不上。更新的 `test_palette.cpp` 期望新值。**v0.1.29 捆绑所有 v0.1.27 + v0.1.28 更改** — 全面的词法分析器大修(PowerShell / Rust / Go / Swift / TypeScript / Kotlin 具有来自官方文档的综合关键字集)+ 23 个每个语言的调色板口音 + 5 个新的样式种类匹配器(变量 / cmdlet / 别名 / here-string / 标识符)+ 针对 Lua / Perl / D / Ruby 的暗主题可读性修复。v0.1.20+ 用户直接从 v0.1.26 跳转到 v0.1.29,通过应用内更新器(跳过从未发布的 v0.1.27 和 v0.1.28)。14/14 回归测试通过。 |
| [**v0.1.28**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.28) | 2026-04-26 | **黑暗主题调色板可读性热修复。** 四种语言在 `#1E1E1E` 背景下具有黑暗主题关键字颜色,但不明显:Lua 海军 `#000080` → Lua 亮 `#4FC1FF` 在黑暗中;Perl 骆驼蓝 `#39457E` → VS Code 蓝色 `#569CD6`;D 砖红色 `#B03A2E` → 橙色 `#FF6E6E`;Ruby 品牌红色 `#CC342D` → 较柔和的鲑鱼色 `#FF7B72`。浅色主题保持每种语言的官方品牌颜色。审计和验证了 `src/npp_palette.cpp` 中的所有 23 个每个语言的调色板分支,以使用正确的 3 向 `monokai/dark/light` 区分。100% 的语言现在具有正确的黑暗 + 浅色兼容性。 |
| [**v0.1.27**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.27) | 2026-04-26 | **全面革新词法分析器 + 调色板,涵盖所有 44+ 种语言。** 23 种语言的每个语言的品牌调色板 — Rust(琥珀色 `#DEA584`)、Go(Go 青色 `#00ADD8`)、Swift(Xcode 粉色 + Swift 属性的橙色)、Kotlin(Darcula 橙色 `#CC7832` + 类型金色 `#FFC66D`)、Java(IntelliJ 海军蓝 / Darcula)、TypeScript / JavaScript / C / C++ / C# / SQL(VS Code 默认设置)、HTML / PHP / CSS / XML(标签橙色 / 属性蓝色)、JSON / YAML(键蓝色)、Python(蓝色 + 蓝绿色)、Ruby(`#CC342D` 红色)、Perl(骆驼蓝色)、Lua(海军蓝)、Bash / Batch / CoffeeScript / D / Markdown / Pascal / CMake / Makefile(每个语言调谐)。新增 5 种样式种类匹配器(`variable`、`cmdlet`、`alias`、`here-string`、`identifier`)— 修复 v0.1.26 PowerShell 投诉,其中 `$variables`、cmdlet 和别名都渲染为普通文本。重新验证官方语言文档的综合关键字集:PowerShell 获取 5 个集(~470 个关键字来自 Microsoft 批准的动词 / about_Reserved_Words),Rust 获取所有严格 + 保留 + 2024 版关键字 + 65 个标准库类型来自 rust-lang.org,Go 恰好获取 25 个保留 + Go 1.21 预声明来自 go.dev/ref/spec,Swift 获取所有类别的 75 个关键字 + 80 个标准库类型 + SwiftUI 包装器来自 docs.swift.org,TypeScript 获取 ES+TS 关键字 + 70 个实用类型来自 microsoft/TypeScript 扫描器。 |
| [**v0.1.26**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.26) | 2026-04-25 | **六种新词法分析器 + 终端 256 色 / 真彩色 + AI 令牌和计时。** 六个自定义词法分析器子类(PowerShell 包装 `SCLEX_POWERSHELL`,Rust/Go/Swift 在 `QsciLexerCPP` 上,TypeScript 在 `QsciLexerJavaScript` 上,Kotlin 在 `QsciLexerJava` 上)— `.ps1` / `.rs` / `.go` / `.swift` / `.ts` / `.kt` 文件现在获得适当的语法高亮(之前错误地渲染为批处理 / C++ / JS / Java)。添加 16 种语言扩展(Dart、Zig、Nim、Elixir、Erlang、Crystal、Haskell、OCaml、F#、Clojure、Julia、Elm、Scala、Groovy 等)。终端 `ansiToHtml()` 完全支持 SGR:256 色调色板 (`38;5;N`),真彩色 (`38;2;R;G;B`),斜体 (`3`),淡入 (`2`),删除线 (`9`),取消代码(22/23/24/29)— `bat` / `eza` / `fzf` / `delta` / `gh` 现在正确渲染。AI 气泡显示每次响应的统计数据:`1234 tok · 123.4 tok/s · 2.3 s`。Windows:选中时保持 Think 复选框可见(灰色),输入栏中的神秘圆圈被抑制。 `test_lexers_v0125` + `test_terminal_ansi` 中的 113 个新测试断言。 |
| [**v0.1.25**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.25) | 2026-04-25 | **AI 助手提示工程大修。** 工具调用模型(Qwen3 / Qwen3.5 / Hermes-3 / Llama 3.1+ / Mistral Large / Command R / GLM-4 / GPT-OSS)曾以非对话聊天输入(如 `hi`)回应 `{"command":...,"output":...}` JSON。新的 `src/ai_systemprompt.{h,cpp}` 分层构建器:身份 + 反工具调用 + 模式特定(聊天 / 解释 / 转换 / CodingStrict)+ 语言提示。工作区上下文块现在由意图 + 启发式控制 — 跳过非对话聊天 / 选择焦点工作 / 编码模式,附加到项目级问题。头部从 `# 工作区上下文` 改写为 `[项目信息]`(较少代理框架形状)。编码模式用户在字节上看到相同行为。 |
| [**v0.1.24**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.24) | 2026-04-25 | **Windows 消除乱码。** `resources/notepatra.rc` em-dash + `©` 重写为 ASCII 以便 `rc.exe`(默认使用 cp1252,没有 BOM)将 `Notepatra â€" native code editor` 运送到“打开方式”菜单。`docs/install.ps1` 现在使用 `[Console]::OutputEncoding = UTF8` 开头 + 恢复到 ASCII 盒式图标,因此在 PowerShell 5.1 上 `irm | iex` 不会渲染为 `â` / `âˆ` 垃圾。 |
| [**v0.1.23**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.23) | 2026-04-25 | **关键的黑暗主题修复。** 编辑器正文在 `theme = "System"` + 暗色操作系统上绘制为白色 — `Config::theme` 保持为字面偏好,但词法分析器比较直接与 `"Dark"`。新的 `npResolvedThemeName()` 帮助程序解析 “系统” → 操作系统偏好;每个词法分析器站点现在都使用它。`Editor::applyLexer()` 中删除了硬编码的 `setPaper("#FFFFFF")`。 |
| [**v0.1.22**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.22) | 2026-04-25 | **Windows 截断通过。** AI 关闭按钮消除乱码(`✕`)→ `QStyle::SP_TitleBarCloseButton`(原生 OS X 标志)。所有工具面板标题 `fixedHeight(20-24)` → `minimumHeight(26-28)` 以便 Windows 字体有空间。查找/替换按钮变宽。JSON / HTML / 括号 / SQL 格式化工具“复制输出”右边缘 8→16。AI 面板错误标签 `setWordWrap(true)`。SQL 模型下拉菜单 150→200 + `AdjustToContents`。 |
| [**v0.1.21**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.21) | 2026-04-25 | **Windows 界面润色。** 在 SQL 格式化工具、查找/替换、比较工具栏、JSON/HTML/括号面板上,每个选项行显式 `setSpacing(8-12)` — Windows Vista/11 样式默认为 0 px(Linux Fusion 大约 6 px),因此小部件靠在一起。AI 关闭按钮加宽,填充归零。 |
| [**v0.1.20**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.20) | 2026-04-25 | **Windows 单实例 + 更新器在安装前关闭应用程序。** 双击一个文件并在 Notepatra 打开时,通过 `QLocalServer` IPC 打开一个选项卡而不是生成一个克隆。在应用程序更新器关闭 Notepatra 之前,将其关闭,以便干净地替换 `.exe`。 |
| [**v0.1.19**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.19) | 2026-04-24 | **项目搜索 Windows 挂起修复 + 干净的 Notepatra 字标。** 通过 `GetFileAttributesW()` 跳过 OneDrive/云占位符,每个文件 30 秒监视器,实时诊断“卡住于:<path>”。从 MSI / NSIS / 许可标签中删除 em-dash / 破折号。SQL/C 家族注释颜色校准。 |
| [**v0.1.18**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.18) | 2026-04-24 | **SQL 类似 Claude 的 AST 漂亮打印机 + Git 面板重写 + 整体主题传播。** `format_sql` 现为 `sqlparser` v0.52 上的 AST 遍历器,具有 11 种方言。Git 面板变成真正的 工作流工具(暂存/未暂存树、分支芯片、提交框、同步行、历史记录+stash 菜单)。每个面板都有 `onThemeChanged()` 插槽 — 运行时主题切换不再留下暗色主题。 |
## 版本历史
| [**v0.1.17**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.17) | 2026-04-21 | **安全的内置更新器。** 选择适合您操作系统的资产,流式传输到 `.part`,可取消进度,下载并验证 SHA256SUMS,原子重命名,交给操作系统安装程序。绝不触及正在运行的二进制文件。 |
| [**v0.1.16**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.16) | 2026-04-19 | AI 的工作区上下文(“我的整个项目是什么样的?”),主页上的 JSON-LD SoftwareApplication,扩展的语言检测。 |
| [**v0.1.15**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.15) | 2026-04-18 | 新面板:**REST 客户端** - Notepatra 中的 Postman 风格的请求运行器。 多后端 AI:Ollama / llama.cpp / OpenAI 兼容。 |
| [**v0.1.14**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.14) | 2026-04-15 | 编码模式 3 列布局(文件树 • 编辑器 • AI 码头)。 AI 助手附件(PDF/DOCX/PPTX/XLSX/图像)。 |
| [**v0.1.13**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.13) | 2026-04-13 | 语音输入改进,AI 流媒体用户体验,面板主题审计通过。 |
| [**v0.1.12**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.12) | 2026-04-12 | macOS dylib `install_name` 重写 + `QtPrintSupport` 强制复制 + 临时重新签名 — 捆绑 v0.1.11 的热修复在一个干净的版本中。 |
| [**v0.1.11**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.11) | 2026-04-11 | **v0.1.10 macOS DMG 的热修复程序。** 重写 libqscintilla2 `/opt/homebrew/*` dyld 引用到 `@rpath`,捆绑 QtPrintSupport.framework,重新签名 — 修复启动时“库未加载”的崩溃。 |
| [**v0.1.10**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.10) | 2026-04-11 | 修复 macOS 安装程序(DMG + Tahoe Gatekeeper),添加 `curl \| sh` 卸载程序,带有全面卸载文档的 Claude.ai 主题网站。 |
| [**v0.1.9**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.9) | 2026-04-11 | 约 3200 行重构,统一的 FormatterPanel 基础,完整的 Anthropic 风格文档站点,Linux ARM64 构建,AI 助手中的语音输入。 |
| [**v0.1.8**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.8) | 2026-04-09 | **AI 修复实际上有效**,适用于 Qwen3 / DeepSeek-R1 / 任何思考模型 — 将 `think:false` 传递给 `/api/generate` + 防御性地剥离 `<think>` 标签 + 修剪序言。 JSON 工具显示“显示差异”按钮,以在 AI 修复后打开原始和修复的并排比较。 AI 助手重写为**适当的聊天气泡 UI**(右对齐的蓝色用户气泡,左对齐的灰色助手气泡,清晰的聊天按钮,显示思考切换)。 在 Linux GUI 上使用 xdotool 在真实的本地 Ollama 上进行了端到端测试。 |
| [**v0.1.7**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.7) | 2026-04-09 | 插件面板大修:JSON / HTML / Bracket 工具格式按钮现在实际上执行可见操作(大状态横幅)。 修复 JSON 工具的白色文本错误。 AI 修复(Ollama)清楚地报告进度和完成情况。 默认字体 11pt → 10pt,更轻的粗体 = 更轻的感觉。 SQL 格式化器方言下拉菜单(T-SQL / PL/SQL / MySQL / PostgreSQL / SQLite)。 比较选择器列出未保存的标签页。 Windows MSVC C2666 修复,在 `SCI_SETKEYWORDS` 调用中。 |
| [**v0.1.5**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.5) | 2026-04-09 | NSIS Windows 安装程序(`notepatra-setup-0.1.5.exe`)- 在设置 → 应用程序 → 已安装的应用程序中注册,生成 uninstall.exe,开始菜单快捷方式,可选的 PATH 集成。 网站页脚上的实时 3 平台下载计数器。 `notepatra --version` 不再硬编码为 v0.1.0(现在由 CMake `project()` 驱动)。 `scripts/bump_version.sh` 用于单命令版本提升。 |
| [**v0.1.3**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.3) | 2026-04-09 | 预处理器颜色润色(`#include`/`#define` 现在为棕色粗体)。 新的 `test_palette` 和 `test_ollama` 测试套件。 |
| [**v0.1.2**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.2) | 2026-04-09 | 跨所有词法器的 Notepad++ 默认调色板(Windows 关键字高亮有效)。 动态 Ollama 模型检测(`/api/tags`)。 Ctrl+B 支点。 |
| [**v0.1.1**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.1) | 2026-04-06 | 所有 3 个平台上的首个发布版本。 Windows 词法器修复(Riverbank QScintilla 源代码)。 嵌入式 Windows + macOS 图标。 RFC 9116 security.txt。 SLSA + cosign。 |
| [**v0.1.0**](https://github.com/singhpratech/notepatra/releases/tag/v0.1.0) | 2026-04-06 | 首个公开版本。 Linux x64,macOS Apple Silicon,Windows x64。 100+ 文件类型,44 个词法器。 |
<sub>v0.1.4 和 v0.1.6 已标记但从未发布 GitHub 版本 — 两个版本都存在 CI 失败(NSIS 宏错误 + Windows MSVC C2666)。它们的内容分别在 v0.1.5 和 v0.1.7 中发布。</sub>
请参阅完整的 [CHANGELOG](CHANGELOG.md) 以获取每个版本中的每个更改,或浏览 [notepatra.org 上的版本历史](https://notepatra.org#versions)。
---
## 致谢
Notepatra 是一个原创产品。本节列出了它所依赖的开源库和运行时 — 维护这些库和运行时的人员值得赞誉。
- **[Qt](https://www.qt.io/)** — 跨平台 C++ GUI 框架。
- **[Scintilla](https://www.scintilla.org/) / [QScintilla](https://riverbankcomputing.com/software/qscintilla/)** (Neil Hodgson,Riverbank Computing)— 文本编辑控件。
- **[Rust](https://www.rust-lang.org/) + [Cargo](https://doc.rust-lang.org/cargo/)** — Rust 核心(搜索,差异,格式化程序,哈希,编码)的语言和工具链。
- **[aho-corasick](https://crates.io/crates/aho-corasick)** (BurntSushi)— Project Search 背后的字面搜索引擎。
- **[regex](https://crates.io/crates/regex)** , **[sqlformat](https://crates.io/crates/sqlformat)** , **[sqlparser](https://crates.io/crates/sqlparser)** — 正则表达式和 SQL 方言处理。
- **[Ollama](https://ollama.com/)** , [llama.cpp](https://github.com/ggerganov/llama.cpp) , [OpenRouter](https://openrouter.ai/) , [OpenAI](https://openai.com) , [Azure OpenAI](https://azure.microsoft.com/en-us/products/ai-services/openai-service) — Notepatra 通过标准 HTTP API 与之交互的 AI 推理后端。
- **[Sigstore](https://www.sigstore.dev/) / [Cosign](https://www.sigstore.dev/) / [SLSA](https://slsa.dev/)** — 每个版本的密钥签名和构建出处。
- **[Claude](https://claude.ai/)** (Anthropic)— 共同编写了 Claude Code 中的实现。
感谢 `rust-core/Cargo.lock` 中的约 200 个传递 crates 和更广泛的 Qt / QScintilla 生态系统维护人员。
---
<p align="center">
<strong>由 Prateek Singh 构想。 与 Claude 一起构建。</strong>
</p>
<p align="center">
<em>"我不是因为世界需要另一个文本编辑器而构建 Notepatra。<br>我构建它是因为每个开发人员 — 在 Linux、Windows 或 Mac 上 — 都应该拥有一个快速、免费且智能的编辑器。"</em>
</p>
<p align="center">
2026 Prateek Singh。保留所有权利。<br>
源代码根据 <a href="LICENSE">GNU General Public License v3.0</a> 许可。
</p>
---
## 许可证、保修和责任
Notepatra 根据 **[GNU General Public License v3.0](LICENSE)** 许可。完整的法律文本位于此存储库根目录的 [`LICENSE`](LICENSE) 文件中。用通俗易懂的语言来说:
**您可以:**
- 出于任何目的(商业或个人)运行 Notepatra,在任意数量的机器上运行。
- 阅读、研究和修改源代码。
- 重新分发源代码或您的修改版本,但前提是您也必须按照 GPL-3.0 分发它们并提供源代码。
**您必须:**
- 在重新分发时保持版权声明完整。
- 将任何派生作品许可为 GPL-3.0(“著作权”要求)。
- 使源代码可供任何您分发的二进制文件访问。
**您不得:**
- 将 Notepatra(或基于它的任何内容)分发在专有许可下。
- 删除或起诉不提供保修/免责声明的条款。
### 免责声明(GPL §15,通俗易懂)
> **Notepatra 按“原样”提供,不提供任何类型的保修,明示或暗示,包括但不限于适销性、特定用途适用性和非侵权性保证。程序的质量和性能风险完全由您承担。如果程序被证明有缺陷,您应承担所有必要的维修、修复或纠正的费用。**
换句话说:我本着善意构建了这个,但我是一个人在互联网上免费提供一个免费编辑器。 **验证您的下载**,**备份您的工作**,如果出现问题 **不要怪我**。
### 责任限制(GPL §16,通俗易懂)
> **在任何情况下,Prateek Singh、贡献者或任何其他修改或传输 Notepatra 的人都不对您因使用或无法使用该程序而产生的任何损害(一般、特殊、偶然或后果性损害)承担责任,包括但不限于数据丢失、数据变得不准确、您或第三方遭受的损失,或程序无法与其他程序一起运行 — 即使我已被告知可能造成损害的可能性。**
换句话说:如果 Notepatra 损坏了您的文件,在截止日期时崩溃,或无法高亮显示您的 YAML — 那是您的责任。 GPL 的全部意义在于您可以阅读源代码,修复它,并将修复后的版本返回给所有人。 没有 SLA,没有支持合同,没有资金转移。
### 实际意义
| 场景 | 谁负责 |
|---|---|
| 您因为输入错误下载了错误的文件并损坏了您的 shell | 您 — 请先验证 SHA-256 ([SECURITY.md](SECURITY.md)) |
| 您安装的第三方插件窃取了您的代码 | 您 — 在加载前请阅读插件源代码 |
| Notepatra 崩溃,您的未保存文件丢失 | 您 — 但崩溃恢复每 10 秒保存一次,请检查 `~/.config/notepatra/recovery/` |
| Notepatra 存在实际安全漏洞 | 通过 [私有漏洞披露](https://github.com/singhpratech/notepatra/security/advisories/new) 报告,我会修复 |
| 您修改了 Notepatra,它破坏了您的客户的生产环境 | 您 — 那就是为什么 GPL 附带 §15 |
### 第三方组件及其许可证
Notepatra 链接到多个开源库。它们都不需要付费。它们的许可证位于它们提供的源代码树中:
| 组件 | 许可证 | 用途 |
|---|---|---|
| **Qt 5.15** (LGPL-3) | LGPL-3.0 | UI 框架 |
| **QScintilla 2.14** (GPL-3) | GPL-3.0 | 编辑器小部件 + 词法器(Notepatra 从此继承 GPL-3) |
| **Scintilla / Lexilla** (HPND) | HPND | 编辑引擎与 QScintilla 捆绑 |
| **Rust crates** (大多为 MIT/Apache-2.0) | MIT/Apache-2.0 双重 | 内存安全核心:文件 I/O、搜索、JSON/HTML/SQL 修复、差异 |
| **Ollama** (当用于 AI 时) | MIT | 可选的本地 AI 运行时 — 单独运行,您自己安装 |
MCP 配置
以下是此 MCP Server 的配置信息,可直接复制到 Cursor 或其他 MCP 客户端中使用。
mcp.json
连接信息
猜你喜欢
暂无推荐服务器