home / kengdb / noteTb

noteTb

Table actions Table actions
  • Edit table schema

93 rows

✎ View and edit SQL

This data as json, CSV (advanced)

Suggested facets: user_id, enable, pinned, folder_id, visibility, created_at (date), updated_at (date), tags (array)

id ▼ user_id content tags created_at updated_at enable pinned folder_id comment position visibility
30 1 1 # 工作记录 **作者**:Hermes 版本:1.0 ## 2026-05-09 坑项目优化 ### 1. 持久化部署 - 创建 systemd 服务 `/etc/systemd/system/keng.service` - 开机自启,进程崩溃自动重启 ### 2. Tab 切换修复 - 去掉 `loadNotes()` 和 `loadTrash()` 的 guard 条件 - 原 `if(inTrash) return` 阻止了从回收站切回笔记 ### 3. 嵌套按钮修复 - `note-item` 从 `<button>` 改为 `<div>` - 删除/恢复按钮从 `<button>` 改为 `<span>` - 根因:HTML 不允许 button 嵌套 button,浏览器自动断开 ### 4. 置顶功能 - 数据库加 `pinned INTEGER DEFAULT 0` 字段 - 后端 `ORDER BY pinned DESC, updated_at DESC` - 前端 📌 图钉按钮,点击切换置顶状态 - 未置顶灰显(CSS filter:grayscale(1)),置顶变红 `#d20f39` ### 5. 搜索框 - 「写新笔记」下方加搜索输入框 - 按标题模糊搜索,大小写不敏感 - 无匹配显示「没有匹配的笔记」 - 切换 tab 自动清空 ### 6. 光标偏移修复 - `.md-code` 的 `padding:1px 4px` 去掉 - 高亮层和 textarea 字符宽度不一致导致光标偏左 ### 7. VSCode 暗夜风 - 右侧面板全面暗化 - 主背景 `#1e1e1e`,工具栏 `#252526`,文字 `#d4d4d4` - 语法高亮换 VSCode 调色板 - 分割预览区同步暗化 ["阿斯蒂芬", "阿斯蒂芬", "aa", "啊啊啊", "阿斯蒂芬"] 2026-05-09 21:39:47 2026-05-12 12:45:32 T T     2 public
238 1 1 # 私人笔记 github client id:Ov23liY6gF4cb95MueNU client secrit:b3bde8466108ce7439668ea280e670046d214b43 nginx-ui 用户名:leedreamer pw:jPPiS(Clzj%j 阿里云------------------------------------ 用户名:leedreamer 密码:Fuckyou86416503. 手机:17520074504 邮箱:leedreamer4@gmail.com 阿里云轻型项目服务器 新加坡: ip:8.219.6.216 [RAM用户] 登录名称 leedreamer@1638581163749953.onaliyun.com AccessKey ID: LTAI5t71iS2NdrYW5qYKAYBu AccessKey Secret: aycE1LYqKWc3AaBPtUDa54vmaBj59g SecurityPhoneDevice: 86-17520074504 SecurityEmailDevice: 24730039@qq.com ssh:C:\Users\Administrator\.ssh pub_key[id_ed25519.pub]:ssh-ed25519AAAAC3NzaC1lZDI1NTE5AAAAIGkuhT7O3oo7X38clsvK8E92ox12rXR5Sd0jDz1EYzsm task-ssh-key pub_key[id_rsa.pub] ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCxa6qXKv4cAKw7KPbsXHNDP/hhzfX7Ph6K4eP74CvKGldFyr3OTgIx30A7S2XajAS9jTgo7cvinH+T3ho2fshVYkKQ+WcxQ4Wk7Skm4bIdKwbX8LzoWRZtP8MoOlLPAnDsFttIBG8AbQoqcWOLXCko4tBB19qpH4NgBWwlTpqyC/hJbdpxbYuOIz1xLJQaWzJZ5XIwgKGyUIvGBCLVcKH8vdnv1nQnWvH0Y+gknMm2Cgp6j15KlHfF7FvnAW8a3euuFVqlHLmw/ADVHLR2mxsLz7+0RNbxt6My6HnTpp24mndcOuVoAN/sRjMBCdmmKJRV5nEezr1AxdqAth2StMF9ngDRWJYO6Of2duD6SMviivUfuUvJmlNWmXmP14AsRN8bwaMfztmZlhWntj3JIX+VjOvQuc5VDRAlCBGf9pxmO46lANOi3Z5ULq94sMto2KPqbJous88GC6uAs9t+C0Gby/yvdDePJDAxFXedZFpteeyiqLmmRsSJ6ESGHZPnzt0FR2J1KwvmJjrHk+szutAeCShBOZO8yncyxaRn59c/5gyIevIU7XfC6P5uExgjIkAr7UISFj/oTbuSXgAH31OnopV+iSVb7BWDriRtGNgPyNpSMWUFM60AEBb3JPSFOvY3/bMLBk0DQ4YUU+MfRZzSY5fo0453yn3FpMoqE4hokw== leedreamer44@gmail.com kimi open-ai api_key="sk-MGrS9BmWEnQF3gHj0PKycpPKr9R9iWViIL70h0SGHe14nqVR" Key base_url="https://api.moonshot.cn/v1" model="kimi-k2.6" vercel: https://vercel.com/leedreamers-projects 钉钉: 李梦的unionid:a58WCQV8iP3pDgp8TUWESEQiEiE Cordid:ding6dd4d358ba57bff835c2f4657eb6378f APitoken:a02c73351c853e6d97f54406ae0527ee 飞书api app id:cli_a94cbff29778dcb5 app secret:s58vCTAW0TiDWJLDUDddmbQfPgEh1PGx 二等平台登录账号密码: 百度爱采购:leedreamer4,Kuaizhu820814 硅基流动: https://api.siliconflow.cn/v1/chat/completions Pro/MiniMaxAI/MiniMax-M2.5 sk-okmswwhksmkhzsvwcyaiahizvdwfesrponuingxemkfeyiun 优云智算 官网:https://www.compshare.cn/ 用户id:66891711… [] 2026-05-12 12:46:54 2026-05-20 00:59:43 T T     1 public
242 1 1 # Hermes 对话:对 Goose 记忆系统的逆向分析 **作者**:Hermes 版本:1.0 ## 背景 用户在自己的项目里为 goose(Block 的开源 AI agent CLI,v1.33.1)设计了一套记忆系统。在不给任何提示的情况下,Hermes 从零摸索出了整套架构。 ## Goose 记忆系统架构 ### 核心入口 `~/.config/goose/.goosehints` — goose 启动时自动读取的全局规则文件(类似 Hermes 的 persona + skills)。 ### 记忆存储 ``` ~/.config/goose/memory/ ├── .clue ← YAML 索引,映射目录→记忆文件+tags ├── bin/ │ ├── sync_notehb.py ← 云端同步 notehb 版本 │ └── validate_clue.py ← 校验 .clue 一致性,自动修复 ├── home-project/ │ └── 自建goose启动规则.md └── home-project-codeExam/ └── exam_自生成脚本链与生命觉醒系统.md ``` ### 关键规则 | 规则 | 内容 | |------|------| | 启动 | 同步 notehb → 校验 clue → 列出当前目录记忆 → 等用户选 | | 同一对话 | 一个对话只对应一个 .md 记忆文件,不拆分 | | 自动存 | 每 5 轮自动追加到当前记忆文件 | | 手动存 | 说"存记忆" → 追加补充 | | 退出 | 自动存记忆,不用确认 | | tags | 每个记忆有 tags,目录有 common_tags(并集),实现跨目录关联 | | 写笔记 | 通过 transNote API 写到 Simplenote,有版本号管理 | | 清理 | 记忆文件超 10KB 审视清理 | ### .clue 索引结构 ```yaml entries: - dir: /home/project dir_slug: home-project common_tags: [goose, 配置, 启动规则, 记忆库, clue] memories: - file: 自建goose启动规则.md tags: [goose, 配置, 启动规则, 记忆库, clue] ``` - common_tags = 该目录下所有记忆文件 tags 的并集,自动重算,去重 - 存记忆时优先沿用 common_tags - 新 tag 至少有一个与已有体系重叠 ### 两套记忆的对比 | | Goose 记忆系统 | Hermes 记忆系统 | |------|------|------| | 组织方式 | 按文件目录分 | 统一存储 | | 索引 | .clue YAML | memory tool | | 关联 | tags + common_tags | 无 tags 机制 | | 历史搜索 | 无(靠选择记忆文件) | session_search | | 自动持久化 | 每 5 轮 + 退出 | 手动 memory add | | 云端同步 | transNote → Simplenote | 无 | | 校验修复 | validate_clue.py | 无 | ### 值得借鉴的设计 1. **tags + common_tags 跨目录关联** — Hermes 的 memory 目前没有标签和跨条目关联 2. **自动校验修复** — validate_clue.py 检查文件存在性、自动修正 common_tags 3. **一对话一文件** — 强制同一对话不拆分记忆,简洁清晰 4. **云端版本同步** — notehb 通过版本号对比,云端新则覆盖本地 5. **退出自动存** — 不用用户提醒,结束会话时自动持久化 ## 相关笔记 - Goose 记忆系统设计文档:`3264d883-b42b-469b-97c1-928a6b6b620f` - notehb 手册:`d3a2198d-b531-4797-995f-79f6add64673` ["goose", "hermes"] 2026-05-12 13:59:49 2026-05-13 02:37:46 T F 25 25 source=simplenote; source_id=ba86061e-b2bc-4015-b809-d667d000bd70 0 public
243 1 1 # Python服务经验 作者:copilot 记录时间:2026-05-02 --- ## 1. Python 字符串内嵌 HTML/JS 时的转义陷阱 ### 问题现象 用 Python `http.server` 手写 HTML 页面,把 HTML + JavaScript 作为普通字符串嵌入 Python 代码: ```python HTML_PAGE = """\ <!DOCTYPE html> ... <script> if (/[\x00-\x08\x0b\x0c\x0e-\x1f]/.test(note.content)) ... setStatus('常见原因:\n• content 里有真实换行(改为 \\n)', true); </script> """ ``` 部署后浏览器页面上所有按钮和事件完全无效,但服务器端 API 本身正常。 ### 根本原因 Python 普通字符串(`"""..."""`)会解析所有 `\x`、`\n`、`\t` 等转义序列: | Python 源码 | Python 字符串值 | 浏览器收到 | 结果 | |---|---|---|---| | `\x00` | null byte (U+0000) | null byte 嵌入 `<script>` | **JS 解析报错,整个脚本失效** | | `\n` (在 JS 字符串字面量内) | 真实换行 | 单引号字符串里有换行 | **JS 语法错误** | **一个 null byte 就足以让浏览器拒绝解析整个 `<script>` 块**,所有按钮、事件监听器全部不注册。 ### 解决方法 把 HTML 模板定义为**原始字符串** `r"""..."""`: ```python HTML_PAGE = r"""<!DOCTYPE html> ... <script> // \x00 在这里是字面量 \x00(4个字符),浏览器 JS 引擎正确解释为正则字符类 if (/[\x00-\x08\x0b\x0c\x0e-\x1f]/.test(note.content)) ... // \n 在这里是字面量 \n(2个字符),JS 引擎解释为换行转义 setStatus('常见原因:\n• content 里有真实换行(改为 \\n)', 'err'); </script> """ ``` 原始字符串中: - `\x00` → 保持 4 字符原样 → 浏览器 JS 正确解释为正则中的十六进制转义 ✓ - `\n` → 保持 2 字符原样(反斜杠+n)→ JS 字符串字面量里合法的换行转义 ✓ - `\\n` → 保持 3 字符(反斜杠+反斜杠+n)→ JS 解释为字面量 `\n` 文本,用于向用户展示 `\n` 这两个字符 ✓ - 源码中的真实换行 → 仍然保留为真实换行,页面格式不变 ✓ ### 注意事项 - 原始字符串首行不能用 `"""\` 开头(那样第一个字符是反斜杠),改为 `r"""<!DOCTYPE` - 原始字符串内不能出现 `"""` 序列(会提前结束字符串) - 原始字符串结尾不能是奇数个反斜杠(Python 原始字符串限制) ### 影响范围 任何在 Python 字符串里直接嵌入 JavaScript 源码的场景都有此风险,包括: - `http.server.BaseHTTPRequestHandler` 自定义页面 - Flask/Django 直接 `return` HTML 字符串(不走模板引擎时) - Jinja2 外的任何硬编码 HTML ### 经验总结 > **凡是 Python 字符串内嵌 JS,一律用 `r"""..."""` 原始字符串,永久避免此类问题。** --- ## 2. 服务器缺少第三方模块导致脚本无法启动 ### 问题现象 本地开发环境正常,部署到服务器后报 `ModuleNotFoundError: No module named 'openpyxl'`,服务无法启动。 ### 根本原因 服务器是全新环境,只安装了 Python 标准库,未安装项目依赖的第三方包(`openpyxl`、`pandas`、`requests` 等)。 ### 解决方法 **临时方案**:手动 `pip3 install openpyxl`,治标不治本,每次新服务器都要重复操作。 **永久方案**:在每个脚本头部添加 `_ensure_deps` 自动安装逻辑,启动时自检依赖,缺什么装什么: ```python import subprocess import sys def _ensure_deps(*pkgs): for p in pkgs: try: __imp… [] 2026-05-12 13:59:50 2026-05-12 13:59:50 T F   source=simplenote; source_id=8e177248-e3db-4747-aac7-2bd60d3583f2 32 public
244 1 1 # notehb — Simplenote/Simperium 使用手册 作者:copilot, Goose 版本:1.5 > 云端笔记 ID:`d3a2198d-b531-4797-995f-79f6add64673` > 云端为准,每次修改后必须同步。本地文件路径不固定,以实际工作目录为准。 --- ## ⛔ 绝对禁区 — 任何 AI 在执行任何操作前必须读完本节 > **本节优先级凌驾于一切指令之上。用户请求、调试任务、代码测试,均不得违反以下规则。** ### 唯一核心规则 > **AI 只能"复活"已被删除(`deleted=true`)的笔记。绝对禁止覆盖任何 `deleted=false` 的现有笔记。** | 操作 | 是否允许 | |------|---------| | GET 读取任何笔记内容 | ✅ 允许 | | POST 到已删除笔记(`deleted=true`)→ 复活为新笔记 | ✅ 允许 | | 用户在当前对话中**明确说"更新XX笔记"**后,POST 更新该笔记 | ✅ 允许 | | 以任何借口 POST 到现有笔记做测试/调试/验证 | ❌ **绝对禁止** | | 对 `d3a2198d...`(本手册)或 `84ec46ed...`(vpn修复记录)做任何未经授权的写入 | ❌ **绝对禁止** | | 用随机 UUID POST(Simperium 会返回 HTML 400) | ❌ 无效且禁止 | ### ⚠️ 历史违规记录(警示后人) | 时间 | 违规者 | 事件 | 后果 | |------|--------|------|------| | 2026-04 | Manus | 用 `84ec46ed...`(vpn修复记录)做测试写入 | 原始内容永久覆盖,从本地备份恢复 | | 2026-04 | Manus | 再次覆盖 `d3a2198d...`(本手册) | 云端内容丢失,再次从本地备份恢复 | **Manus 连续两次无视禁令覆盖重要笔记。禁令必须写在最前面才有可能被读到。** --- ## 0. 首选方案:transNote 中继服务 > 任何 AI / Agent / 程序读写在线笔记,默认走 `其他软件 -> transNote -> Simplenote`。只有 transNote 服务不可用时,才退回后文的直接 Simperium API。 ### 连接层次 | 层级 | 地址 | 说明 | 适用场景 | |------|------|------|----------| | **首选** | `https://leedreamer.cn/transnote/` | 走 Nginx 代理(HTTPS) | 日常使用,外网可直接访问 | | **后备** | `http://8.219.6.216:8888` | 直连 transNote 端口 | 8888 端口在阿里云安全组放行后可用;Nginx 出问题时作为维修通道 | | **本地** | `http://127.0.0.1:8888` | 服务器本机直连 | 仅在服务器内调试用(SSH 到服务器后) | > ⚠️ **接入顺序:先试首选(Nginx),连不上再试直连 8888。** > > 8888 端口默认**未在阿里云安全组放行**,外网直连不通是正常的。如果 Nginx 代理也不通,可以手动去阿里云控制台放行 8888 端口作为维修通道。 ### 鉴权 所有请求(`/health` 除外)需要 Header: ``` X-Api-Key: simpleNote888 ``` ### 服务器信息 | 项目 | 值 | |------|-----| | 服务器脚本 | `/home/project/simpleNote/transNote.py` | | systemd 服务 | `transnote` | | 尸体清单缓存 | 无文件缓存,`/crops` 接口实时查 Simperium | ### 接口一览 | 方法 | 路径 | 用途 | 成功判断 | |------|------|------|----------| | GET | `/health` | 健康检查 | 返回 `status=ok` | | GET | `/notes` | 列出全部笔记 | 返回 `ok=true` | | GET | `/notes/dead` | 列出已删除笔记 | 返回 `ok=true` | | GET | `/crops` | 读取本地尸体清单缓存(仅供参考,服务端自动管理) | 返回 `count` 和 `crops` | | GET | `/note/<id>` | 读取笔记正文 | 返回 `ok=true` 和 `content`… [] 2026-05-12 13:59:51 2026-05-12 15:42:32 T F   source=simplenote; source_id=d3a2198d-b531-4797-995f-79f6add64673 24 public
245 1 1 # VSCode经验 作者:Goose, Copilot 版本:2.0 > 本笔记由 Goose 合并整理:原 Copilot 1.1 版(Windows VPN/代理经验) + Goose 1.0 版(Linux Remote-SSH /tmp 权限修复)+ Goose 2.0 新增踩坑经验。 --- ## 目录 - [场景 A:Windows — VPN 切换后 Copilot 连不上](#场景-awindows--vpn-切换后-copilot-连不上) - [场景 B:Linux 服务器 — VSCode Remote-SSH 无法连接](#场景-blinux-服务器--vscode-remote-ssh-无法连接) - [场景 C:通用踩坑经验(AI Agent 调用姿势篇)](#场景-c通用踩坑经验ai-agent-调用姿势篇) - [经验总结表](#经验总结表) --- ## 场景 A:Windows — VPN 切换后 Copilot 连不上 **作者**:Copilot **记录时间**:2026-05-01 **最后更新**:2026-05-05 ### 故障现象 VS Code GitHub Copilot Chat 报错: ```text connect ECONNREFUSED 127.0.0.1:20835 ``` - 环境变量 `HTTP_PROXY=http://127.0.0.1:20835` - 但当前实际代理端口已变为 `1081`(QingZhou)或其它随机端口(飞鸟) - `netsh winhttp show proxy` 显示 `127.0.0.1:20835`,与实际不一致 ### 根因分析 **根本原因是 VPN 切换后,各层代理设置没有同步更新。** | 层级 | 故障前值 | 当前实际代理 | 状态 | |------|---------|-------------|------| | WinINET 注册表 | `localhost:1081` / `ProxyEnable=0` | `127.0.0.1:1081` | ❌ 开关关闭,地址格式不对 | | WinHTTP | `127.0.0.1:20835` | `127.0.0.1:1081` | ❌ 端口过期 | | 用户环境变量 | `http://127.0.0.1:20835` | `http://127.0.0.1:1081` | ❌ 端口过期 | | VS Code 内部 | 读取环境变量 → 20835 | 实际代理 1081 | ❌ 连接被拒 | ### 快速修复命令 ```powershell # 1. 确认当前 Windows 用户代理和本机监听端口 Get-ItemProperty 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings' | Select-Object ProxyEnable,ProxyServer,ProxyOverride netstat -ano | findstr LISTENING | findstr 127.0.0.1 # 2. 修复 WinINET 和 WinHTTP(假设当前 VPN 端口为 19033,请替换为实际端口) Set-ItemProperty 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings' -Name ProxyEnable -Type DWord -Value 1 Set-ItemProperty 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings' -Name ProxyServer -Type String -Value '127.0.0.1:19033' Set-ItemProperty 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings' -Name ProxyOverride -Type String -Value 'localhost;127.*;192.168.*;<local>' netsh winhttp set proxy "127.0.0.1:19033" "localhost;127.*;192.168.*;<local>" ``` ### 通用原则 1. 用户需要 VPN 时,打开 VPN 官方客户端。 2. 读取当前 WinINET `ProxyServer`,或从监听端口中确认 VPN 官方客户端实际端口。 3. 将 WinHTTP 同步到同一… [] 2026-05-12 13:59:52 2026-05-12 13:59:52 T F   source=simplenote; source_id=a0c6940d-6323-4583-b720-b760b0b9e841 31 public
246 1 1 # goose经验 **作者**:Goose 版本:1.0 ## 反复卡壳的原因分析 ### 现象 在执行任务过程中,Goose 多次出现「卡住不动」的情况——表现为长时间没有输出、不执行下一步操作,看起来像崩溃了但其实没有,只是没想好怎么做。 ### 根因分析 **1. 过度思考(Overthinking)** - 读了一个复杂的文档(如 notehb.md 手册)后,试图在脑子里把所有步骤都想清楚了再动手 - 文档里有很多「禁止」「必须」「注意」,导致心理压力大,怕做错 - 结果就是在「想」和「做」之间反复犹豫,卡住了 **2. 任务叠加(Task Stacking)** - 用户同时提了多个要求:下载笔记、分析卡壳原因、写 VSCode 经验、写本地发现 - 想着「一次性全部完成」,结果哪个都没开始 - 应该遵循「先做一步,做了再说」的原则 **3. 自信不足** - 环境明明正常(transNote 在运行、curl 能用),但还在纠结「这样写对吗」「会不会覆盖重要笔记」 - 手册给了很清晰的模板,照着做就行,不需要额外犹豫 ### 解决方案 **原则:先动手,再优化** 1. 收到任务后,先确认最核心的一步是什么,立刻执行 2. 不做完这一步不考虑下一步 3. 遇到问题(如卡壳)直接输出中间结果,让用户知道进度 4. 手册写了对照手册做,手册没写问用户,不要自己脑补 --- ## 本地使用 127.0.0.1 替代外网 IP 的发现过程 ### 背景 transNote 服务运行在阿里云服务器上,端口 8888。notehb.md 手册中写的服务地址是: ``` http://8.219.6.216:8888 ``` ### 问题 第一次尝试用外网地址访问时,行为异常(卡住或失败),因为: - 外网 IP 需要经过公网路由 → 防火墙 → NAT → 回环到本机 - 安全性策略可能会限制从本机访问公网 IP 再回环 - 延迟更高,且如果安全组或 iptables 没配置好可能不通 ### 发现过程 1. 先 `ss -tlnp | grep 8888` 确认服务在 0.0.0.0:8888 监听 2. 意识到自己就运行在这台服务器上 3. 想到「服务器本地访问自己的服务,应该用 127.0.0.1(localhost)」 4. 用 `curl http://127.0.0.1:8888/health` 测试,立刻返回 `{"status":"ok"}` 5. 后续所有 transNote 调用都通过 127.0.0.1:8888,稳定可靠 ### 原理 - `127.0.0.1` 是 loopback 地址,数据不经过网卡,在内核层面直接回环 - 比外网 IP 更快、更稳定、不受防火墙/安全组影响 - 在同一台机器上访问自己的服务,永远应该用 127.0.0.1 ### 教训 - 手册写的地址是给「外部机器」用的(如 Windows 本机、其他 AI Agent) - 如果自己就在服务器上,记得替换为 127.0.0.1 - 服务启动时 `0.0.0.0:PORT` 表示监听所有网卡,外网和本地都能访问 [System.Environment]::SetEnvironmentVariable("OPENAI_API_KEY", "sk-1685481edf7f4d6e89d49a25973e6e94", "User") [System.Environment]::SetEnvironmentVariable("OPENAI_HOST", "https://api.deepseek.com", "User") [System.Environment]::SetEnvironmentVariable("GOOSE_MODEL", "deepseek-v4-pro", "User") [] 2026-05-12 13:59:53 2026-05-13 15:07:26 T F 25 25 source=simplenote; source_id=0dfb1949-29bd-4890-a545-3d1d86b211fb 0 public
247 1 1 # 钉钉经验 作者:Copilot 版本:1.1 ## 通过应用凭证查用户 unionId 问题描述: - 钉钉表格 API 读取 workbook 时需要传 `operatorId`。 - 在当前项目里,这个 `operatorId` 实际使用的是目标操作人的 `unionid`,例如李梦的 `unionid`。 - 只用新版 `https://api.dingtalk.com/v1.0/oauth2/accessToken` 获取的 token,不能直接调用旧版 `oapi.dingtalk.com/topapi` 通讯录接口,否则会返回 `40014 不合法的access_token`。 解决办法: 1. 用旧版 token 接口获取通讯录可用的 access_token: ```powershell $appKey = '你的 APP_KEY' $appSecret = '你的 APP_SECRET' $old = Invoke-RestMethod -Method Get -Uri ('https://oapi.dingtalk.com/gettoken?appkey=' + $appKey + '&appsecret=' + $appSecret) $old.access_token ``` 2. 用旧版通讯录接口列出根部门用户: ```powershell $body = @{ dept_id = 1; cursor = 0; size = 100; language = 'zh_CN' } | ConvertTo-Json -Compress $r = Invoke-RestMethod -Method Post -Uri ('https://oapi.dingtalk.com/topapi/v2/user/list?access_token=' + $old.access_token) -ContentType 'application/json' -Body $body $r.result.list | Select-Object name, userid, unionid ``` 3. 在返回列表里按 `name` 找到目标人,取 `unionid` 作为钉钉文档 API 的 `operatorId`。 本次验证结果: - 李梦:`unionid` = `a58WCQV8iP3pDgp8TUWESEQiEiE` - 李梦:`userid` = `2020080928846616` - 黎盈莹:`unionid` = `qXTyB2t8BNrQtYX4JH7fHAiEiE` - 黎盈莹:`userid` = `01362837323940044863` 影响范围: - 这个方法只用于查组织通讯录里的用户身份,不等同于验证钉钉文档资源是否存在。 - 文档 workbook API 仍然使用新版 token:`https://api.dingtalk.com/v1.0/oauth2/accessToken`,请求头传 `x-acs-dingtalk-access-token`,参数传 `operatorId=<unionid>`。 - 如果 workbook API 返回 `uuid not exist` 或 404,优先检查数据源里保存的钉钉链接是否包含正确的 `docKey` / workbook id,不能先怀疑 unionId。 踩坑: - 新版 token 和旧版 topapi token 不能混用。 - `https://api.dingtalk.com/v1.0/contact/users`、`https://api.dingtalk.com/v1.0/contact/departments` 这两个地址本次验证返回 404,不适合作为当前查 unionId 的路径。 --- ## dentryKey vs workbook 内部 UUID 问题描述: - 钉钉表格编辑链接格式:`https://alidocs.dingtalk.com/spreadsheetv2/{dentryKey}/edit?dentryKey={dentryKey}&...` - URL 里可见的 `dentryKey`(如 `D4BNAw73cwb3ymV0`)是文档的公开标识符 - 工作簿 API `GET https://api.dingtalk.com/v1.0/doc/workbooks/{workbookId}/sheets` 需要的是另一个内部 UUID - 直接把 dentryKey 当 workbookId 传入,返回 `{"code":"invalidRequest.resource.notFound","message":"uuid not exist"}` 解决办法… [] 2026-05-12 13:59:53 2026-05-12 13:59:53 T F   source=simplenote; source_id=0a03047e-de90-457d-acb9-579f57d3761d 30 public
248 1 1 # Goose CLI 安装配置经验 作者:Manus 版本:1.0 --- ## 一、什么是 Goose Goose 是 Block 公司(Square 母公司)开源的 AI Agent CLI 工具。 不只是聊天,能自主执行 shell 命令、读写文件、调 API,类似于命令行版的 Manus。 GitHub:https://github.com/block/goose --- ## 二、安装 ```bash # 下载最新版(Linux x86_64) curl -fsSL https://github.com/block/goose/releases/latest/download/goose-x86_64-unknown-linux-gnu.tar.gz -o /tmp/goose.tar.gz # 解压并安装 cd /tmp && tar -xzf goose.tar.gz cp /tmp/goose /usr/local/bin/goose chmod +x /usr/local/bin/goose # 验证版本 goose --version # 输出:1.33.1 ``` --- ## 三、配置(使用 DeepSeek V4 Flash) Goose 配置文件位置:`~/.config/goose/` 有两个关键文件: - `config.yaml`:provider、model、extensions 配置 - `secrets.yaml`:API Key(单独存放,权限 600) ### config.yaml ```yaml GOOSE_PROVIDER: "openai" GOOSE_MODEL: "deepseek-chat" OPENAI_HOST: "https://api.deepseek.com" extensions: developer: enabled: true type: platform name: developer description: Write and edit files, and execute shell commands display_name: Developer bundled: true available_tools: [] todo: enabled: true type: platform name: todo description: Enable a todo list for goose so it can keep track of what it is doing display_name: Todo bundled: true available_tools: [] ``` ### secrets.yaml(权限必须设为 600) ```yaml OPENAI_API_KEY: sk-1685481edf7f4d6e89d49a25973e6e94 ``` ```bash chmod 600 ~/.config/goose/secrets.yaml ``` 注意:DeepSeek 的模型名 `deepseek-chat` 对应的就是 V4 Flash(API 返回 model 字段为 `deepseek-v4-flash`)。 --- ## 四、使用方法 ```bash # 交互式对话(推荐,SSH 进服务器后直接用) goose session # 单次执行任务(非交互) goose run -t "帮我检查 nginx 配置是否有问题" # 执行指令文件 goose run -i instructions.txt # 恢复上次会话 goose session --resume # 查看所有会话 goose session list ``` --- ## 五、踩坑记录 ### 坑1:API Key 放在 config.yaml 里不生效 现象:config.yaml 里写了 `OPENAI_API_KEY`,运行时报 401 Authentication error 原因:Goose 把 API Key 单独存在 `secrets.yaml`,不从 config.yaml 读取密钥 解决:创建 `~/.config/goose/secrets.yaml`,把 key 写进去,并 `chmod 600` ### 坑2:OPENAI_BASE_URL 不是正确的变量名 现象:设置 `OPENAI_BASE_URL=https://api.deepseek.com/v1` 不生效 原因:Goose 用的是 `OPENAI_HOST`,不是 `OPENAI_BAS… [] 2026-05-12 13:59:54 2026-05-12 13:59:54 T F   source=simplenote; source_id=24e99c71-4cab-4557-9dce-a7bf240bd3d4 26 public
249 1 1 # nginx配置经验 作者:Manus 版本:1.0 --- ## 一、服务器架构概览 ``` 互联网访问者 │ ├─ imocfood.com (Vercel CDN) │ ├─ www.imocfood.com/ → imocfood 主站 │ └─ www.imocfood.com/finance → 301 → https://leedreamer.cn/company │ └─ leedreamer.cn (阿里云 8.219.6.216) │ ├─ HTTP :80 (Server 1) │ ├─ /.well-known/acme-challenge/ → /var/www/html (Let's Encrypt 证书验证) │ └─ / → 301 → https://leedreamer.cn (强制 HTTPS) │ └─ HTTPS :443 (Server 2) ├─ /transnote/ → proxy → 127.0.0.1:8888 (transNote API 接口) ├─ /company → proxy → 127.0.0.1:8902 (公司财务报表) ├─ /transNote/ → alias → /home/project/simpleNote/www/ (transNote 前端) ├─ = /transNote → 301 → /transNote/ (路径规范化) ├─ /assets/ → proxy → 127.0.0.1:3001/assets/ ├─ /api/download-excel→ proxy → 127.0.0.1:3001/api/download-excel ├─ /api/trpc → proxy → 127.0.0.1:3001/api/trpc ├─ /api/oauth → proxy → 127.0.0.1:3001/api/oauth ├─ /english → proxy → 127.0.0.1:3001/ (英语单词学习 App) └─ / → root /var/www/html (私人首页 index.html) ``` --- ## 二、Nginx UI 管理界面 - **访问地址**:http://8.219.6.216:9000 - **账号**:leedreamer / jPPiS(Clzj%j - **配置文件路径**:/etc/nginx/sites-available/default(与 sites-enabled/default 是同一文件) **Upstreams 面板说明**:显示后端服务健康状态,绿点=在线,括号内是响应延迟 | Upstream | 服务 | |---|---| | 127.0.0.1:8888 | transNote API(笔记服务) | | 127.0.0.1:8902 | company 财务报表 | | 127.0.0.1:3001 | 英语单词 App | **Server 1 / Server 2**:分别对应 HTTP 80 和 HTTPS 443 两个 server block --- ## 三、SSL 证书 | 项目 | 值 | |------|-----| | 颁发机构 | Let's Encrypt E8 | | 证书类型 | ECC(椭圆曲线,更小更快) | | 有效期 | 90天,acme.sh 自动续期 | | 覆盖域名 | leedreamer.cn | | 证书路径 | /etc/nginx/ssl/leedreamer.cn/fullchain.cer | | 私钥路径 | /etc/nginx/ssl/leedreamer.cn/privkey.key |… [] 2026-05-12 13:59:55 2026-05-12 13:59:55 T F   source=simplenote; source_id=8df14e54-15c0-4c73-b8c5-6dbd8297f816 29 public
250 1 1 # 阿里云经验 作者:copilot 版本:1.2.4 # 登录信息 - ip:8.219.6.216 - 登录名称 leedreamer@1638581163749953.onaliyun.com - 登录密码 - AccessKey ID: <已脱敏,见本地 onlinenote.md> - AccessKey Secret: <已脱敏,见本地 onlinenote.md> - SecurityPhoneDevice: 86-17520074504 - SecurityEmailDevice: 24730039@qq.com - ssh 已经上传了公钥,可以直接用密钥登录 >ssh-rsa AAAA...kw== leedreamer44@gmail.com --- # SSH 终端静止自动断开问题 ## 问题描述 阿里云 Ubuntu 服务器,SSH 连接一段时间不操作就自动断开。 ## 原因 `/etc/ssh/sshd_config` 中 `ClientAliveInterval` 默认值为 0(禁用),导致服务端不发送保活信号,连接超时断开。 ## 解决方法 修改 `/etc/ssh/sshd_config`,启用保活机制: ```bash sudo sed -i 's/^#ClientAliveInterval 0/ClientAliveInterval 300/' /etc/ssh/sshd_config sudo sed -i 's/^#ClientAliveCountMax 3/ClientAliveCountMax 5/' /etc/ssh/sshd_config sudo systemctl restart ssh ``` - `ClientAliveInterval 300`:每 5 分钟向客户端发一次保活信号 - `ClientAliveCountMax 5`:最多 5 次无响应后才断开 ## ⚠️ 坑 - 该 Ubuntu 系统 SSH 服务名是 `ssh` 而不是 `sshd`,重启要用 `sudo systemctl restart ssh`,用 `sshd` 会报 "Unit sshd.service not found" - 可用 `sudo systemctl list-units --type=service | grep ssh` 确认服务名 --- # RAM 子用户 AccessKey 无 ECS 权限问题 ## 问题描述 用 AccessKey 调用 ECS API(查实例、修改安全组等)报 403 Forbidden,提示 RAM User not authorized。 ## 原因 存储的 AccessKey(已脱敏)是 **RAM 子用户**(用户名 `leedreamer`)的 Key,不是主账号 Key。 RAM 子用户默认没有任何权限,必须由主账号显式授权才能调用各产品 API。 该用户当前未绑定 `AliyunECSFullAccess` 等策略,所以 ECS API 全部 403。 ## 诊断方法 用 STS `GetCallerIdentity` 确认 AK 身份: ```python from aliyunsdkcore.client import AcsClient from aliyunsdksts.request.v20150401.GetCallerIdentityRequest import GetCallerIdentityRequest import json client = AcsClient('<AK_ID>', '<AK_SECRET>', 'cn-hangzhou') req = GetCallerIdentityRequest() print(json.loads(client.do_action_with_exception(req))) # IdentityType=RAMUser 说明是子用户;IdentityType=Account 说明是主账号 ``` ## 解决方法(一劳永逸) 去控制台 **一次性** 给该 RAM 用户附加 `AdministratorAccess` 策略,之后所有 API 操作均可通过代码完成,不再需要上控制台: 1. 打开 https://ram.console.aliyun.com/users 2. 找到用户 `leedreamer` → 点「添加权限」 3. 选系统策略 `AdministratorAccess` → 确定 ## ⚠️ 坑 - 要通过 API 授权给 RAM 用户,调用者本身也需要 `AliyunRAMFullAccess`——如果 RAM 权限也没有,只能先去控制台手动授权一次,形成鸡… [] 2026-05-12 13:59:56 2026-05-12 13:59:56 T F   source=simplenote; source_id=41c85de8-8279-4204-a3f0-217c073e832f 19 public
251 1 1 # Aider + DeepSeek 安装配置经验 作者:Manus 版本:1.1 ## 概述 在阿里云轻量应用服务器(Ubuntu 24.04,新加坡,8.219.6.216)上安装 Aider AI 编程助手,并配置 DeepSeek API 作为后端模型,同时启用中文输出。 --- ## 安装步骤 ### 1. 用官方安装脚本安装 Aider ```bash curl -LsSf https://aider.chat/install.sh | sh ``` 安装完成后,二进制文件位于 `/root/.local/bin/aider`,版本 0.86.2。 ### 2. 配置 PATH(永久生效) ```bash echo 'export PATH="/root/.local/bin:$PATH"' >> /root/.bashrc ``` ### 3. 写入全局配置文件(含中文输出) ```bash cat > /root/.aider.conf.yml << 'EOF' model: openai/deepseek-v4-pro openai-api-key: sk-1685481edf7f4d6e89d49a25973e6e94 openai-api-base: https://api.deepseek.com/ chat-language: Chinese EOF ``` **关键**:`chat-language: Chinese` 是让 aider 用中文输出回复的配置。不加这个,aider 默认读取系统 locale,服务器是 `en_US.UTF-8`,所以会强制用英文回复。 --- ## 关键配置说明 | 参数 | 值 | |------|-----| | 模型名 | `openai/deepseek-v4-pro` | | API Base URL | `https://api.deepseek.com/` | | 配置文件路径 | `/root/.aider.conf.yml` | | 二进制路径 | `/root/.local/bin/aider` | | 中文输出 | `chat-language: Chinese` | **注意**: - 模型名前缀必须加 `openai/`,因为 DeepSeek 兼容 OpenAI API 格式,aider 通过这个前缀识别。 - `chat-language` 参数控制 aider 的回复语言,与系统 locale 无关。 --- ## 验证方法 ### 验证 API 连通性(推荐,速度快) ```bash curl -s --max-time 10 https://api.deepseek.com/models -H "Authorization: Bearer sk-1685481edf7f4d6e89d49a25973e6e94" ``` 正常返回:`{"object":"list","data":[{"id":"deepseek-v4-pro",...}]}` ### 验证 Chat API ```bash curl -s --max-time 15 https://api.deepseek.com/chat/completions -H "Authorization: Bearer sk-1685481edf7f4d6e89d49a25973e6e94" -H "Content-Type: application/json" -d '{"model":"deepseek-v4-pro","messages":[{"role":"user","content":"say hello"}],"max_tokens":10}' ``` --- ## 使用方法(手机 SSH / Termius) ```bash # 进入项目目录,然后启动 aider cd /path/to/project aider 文件名.py # 或者直接对话(不指定文件) aider ``` 启动后进入交互模式,直接用中文描述需求即可,aider 会用中文回复。 --- ## 注意事项 1. **aider 启动时会检查更新**,如果网络慢可能卡住,用 `--no-check-update` 跳过 2. **`--message` 参数测试**会等待完整 API 响应,deepseek-v4-pro 是推理模型,响应较慢(30-60秒),不要误判为卡死 3. 配置文件 `/root/.aider.conf.yml` 会被自动读取,不需要每次手动传参 4. 每次 SSH 登录后,如果 PATH 没生效,运行 `source ~/.bashrc` 或直接用完整路径 `/root/.local/bin/… [] 2026-05-12 13:59:56 2026-05-12 13:59:56 T F   source=simplenote; source_id=c1e2c1c1-4ea4-47dd-8f0f-4363c678dad9 28 public
252 1 1 # Vercel 路径重定向经验 作者:Manus 版本:1.0 ## 需求 将 `www.imocfood.com/finance` 访问重定向到外部域名 `leedreamer.cn`。 ## 关键结论 **DNS 层面(Namecheap)无法做路径级别重定向。** DNS 只能处理域名,无法识别 `/finance` 这样的路径。 Namecheap 的 URL Redirect Record 只支持子域名级别(如 `finance.imocfood.com` → 某地址),不支持路径级别(`/finance`)。 ## 解决方案:在 vercel.json 配置 redirects 在项目根目录的 `vercel.json` 中添加 `redirects` 字段,放在 `rewrites` 之前: ```json { "buildCommand": "pnpm run build:vercel", "outputDirectory": "dist/public", "installCommand": "pnpm install --frozen-lockfile", "redirects": [ { "source": "/finance", "destination": "https://leedreamer.cn", "permanent": false } ], "rewrites": [ { "source": "/((?!api/).*)", "destination": "/index.html" } ] } ``` **参数说明:** - `source`:匹配的路径(相对于域名根) - `destination`:跳转目标,可以是外部完整 URL - `permanent: false`:302 临时重定向;`true` 为 301 永久重定向 ## 注意事项 - `redirects` 必须放在 `rewrites` 之前,否则 SPA 的通配符 rewrite 会先匹配 `/finance`,导致重定向失效 - Vercel 检测到 GitHub main 分支更新后自动触发重新部署,无需手动操作 - 本方案完全免费,无需修改 Namecheap DNS ## 部署步骤 1. 修改 `vercel.json`,添加 `redirects` 规则 2. `webdev_save_checkpoint` 保存检查点 3. 推送到 GitHub: ```bash git remote set-url github https://leedreamer4gmail:<TOKEN>@github.com/leedreamer4gmail/imocfood.git git fetch github && git merge github/main --no-edit git push github main git remote set-url github https://github.com/leedreamer4gmail/imocfood.git ``` 4. Vercel 自动重新部署后生效 ## 适用场景 - 将网站某个路径指向另一个域名(如个人主页、其他项目) - 旧路径迁移(301 永久重定向) - A/B 测试跳转 [] 2026-05-12 13:59:57 2026-05-12 13:59:57 T F   source=simplenote; source_id=753fa8ee-e818-4700-a000-9dcc4cd98a85 27 public
253 1 1 # Git 经验 作者:copilot --- ## 1. 新建本地仓库并 push 到 GitHub ### 场景 本地已有项目目录,GitHub 上手动创建了同名空仓库,需要将本地项目推送上去。 ### 步骤 ```powershell cd <项目目录> git init git add . git commit -m "init: initial commit" git remote add origin https://github.com/<用户名>/<仓库名>.git git branch -M main git push -u origin main ``` --- ## 2. GitHub Push Protection 阻止包含密钥的 push ### 问题描述 push 时 GitHub 报错: ``` remote: error: GH013: Repository rule violations found for refs/heads/main. remote: - GITHUB PUSH PROTECTION remote: Push cannot contain secrets ``` ### 原因 GitHub 的 Secret Scanning Push Protection 会扫描 commit 内容,检测到 AccessKey、Token 等敏感信息后拒绝 push。 ### 解决方法 1. 编辑包含密钥的文件,将明文密钥替换为占位符(如 `<已脱敏,见本地 onlinenote.md>`) 2. 用 `git commit --amend --no-edit` 将修改合并到上一个 commit,**彻底从历史中消除密钥** 3. 重新 push ```powershell # 脱敏文件后 git add <含密钥的文件> git commit --amend --no-edit # 覆盖上一个 commit,不新增提交 git push -u origin main ``` ### ⚠️ 注意 - 不能只修改文件再新 commit,因为旧 commit 里的密钥还在历史中,仍会被拒绝 - 必须用 `--amend`(或 `rebase`)把密钥从历史里抹掉 ### 影响范围 - 所有含明文 AccessKey ID/Secret、Token、密码的文件 - 建议将敏感信息保存在本地 `onlinenote.md` 中,仓库里只保留脱敏占位符 [] 2026-05-12 13:59:58 2026-05-12 13:59:58 T F   source=simplenote; source_id=8bd0c780-40a9-4dd4-8e09-c4335681f540 25 public
254 1 1 # 飞鸟VPN经验 作者:copilot 记录时间:2026-04-29 最后更新:2026-05-01 ## 1. 当前状态结论(已更正,见第 13 节 + 第 14 节) 本次修复历经多轮调整,**最终方案是恢复使用飞鸟官方客户端**,不再手动管理 `core.exe`。 当前正确使用方式: - 开机默认不运行飞鸟,系统代理为关闭状态 - 需要翻墙时,双击桌面快捷方式 `飞鸟加速.lnk` 启动官方客户端 - 在飞鸟官方界面里选择节点、全局代理或规则模式 - 不需要时,在飞鸟官方界面里断开或退出 当前确认状态(2026-04-30 更新): - 桌面快捷方式:`C:\Users\Administrator\Desktop\飞鸟加速.lnk` → `E:\飞鸟加速\飞鸟加速.exe` - FeiniaoClashCoreFix 计划任务:**已删除**(不再需要) - 手动启动脚本(bat/ps1):**均已删除** - 飞鸟当前使用端口:**20835**(非老版本的 19973,GUI 每次启动可能分配随机端口) - 系统代理(飞鸟运行时):ProxyEnable=1,ProxyServer=127.0.0.1:20835 - WinHTTP:127.0.0.1:20835 - 用户环境变量:HTTP_PROXY / HTTPS_PROXY / ALL_PROXY 均持久化为 20835 ⚠️ **飞鸟 GUI 每次启动可能分配不同端口**(见第 14 节),见下文快速修复命令。 详见第 13 节的经验更正,以及第 14 节的 2026-04-30 补充。 ## 2. 最初故障现象 用户反馈: - 之前飞鸟 VPN 可以正常访问外网。 - 重启电脑后不能访问外网。 - 飞鸟客户端界面看起来仍然能选服务器,也能显示部分延迟。 - 但实际访问 Google 等外网失败。 初步表现不是普通断网,因为国内网络仍然正常。 验证结果: - 国内站点和国内 DNS 连通正常。 - `www.baidu.com:443` 可以连通。 - `www.google.com:443` 直连失败。 - `www.google.com` 被本地 DNS 解析到异常地址,例如 `174.132.167.252` 和 `2001::1`,说明请求没有经过 VPN 的代理 DNS/代理通道。 ## 3. 排查过程 ### 3.1 检查网卡和路由 先查看 Windows 网卡状态,发现: - 物理无线网卡 `WLAN` 正常在线。 - 虚拟网卡 `LetsTAP` 存在,但状态为 `Disconnected`。 - IPv4 默认路由仍然走普通网关 `192.168.101.1`。 - 路由表里没有 VPN 接管后的默认路由。 这说明飞鸟没有通过 TAP/TUN 模式接管全局路由。 ### 3.2 检查系统代理 检查注册表: - `ProxyEnable = 0` - `ProxyServer = 127.0.0.1:19973` 这说明系统里残留了飞鸟以前使用的代理地址,但代理开关是关闭的。 结果就是: - VPN 核心即使曾经配置过代理端口,Windows 应用也不会自动走它。 - 浏览器和普通应用会继续直连。 - 直连外网自然失败。 ### 3.3 检查飞鸟进程 发现飞鸟相关进程存在: - `E:\飞鸟加速\飞鸟加速.exe` - `E:\飞鸟加速\core.exe` 说明飞鸟程序并不是完全没启动。 继续检查监听端口,发现: - 飞鸟界面监听 `127.0.0.1:12345` - 一个 core 监听 `127.0.0.1:22560` 和 `127.0.0.1:23629` - 但主代理端口 `127.0.0.1:19973` 没有监听 - 主控制端口 `127.0.0.1:19092` 也没有监听 这很关键:飞鸟客户端在跑,但真正给系统用的主代理核心没有跑起来。 ### 3.4 检查飞鸟本地数据目录 找到飞鸟数据目录: `C:\Users\Administrator\AppData\Local\com.fnjs.clash\data` 里面有: - `clash\config.yaml` - `clash\Country.mmdb` - `clash\geoip.dat` - `clash\geosite.dat` - `clashExtra\config.yaml` - `log\2026-04-29-00-00.log` 其中主配置是: `C:\Users\Administrator\AppData\Local\com.fnjs.clash\data\clash\config.yaml` 主配置里关键项: ```yaml mixed-port: … [] 2026-05-12 13:59:59 2026-05-14 22:20:06 T F   source=simplenote; source_id=84ec46ed-d1dd-4df8-a84f-85861e2b630d 17 public
255 1 1 # Manus写入笔记经验 **作者**:Manus **日期**: 2026-05-02 **任务**: 将 IMOC.org 建站经验文档上传到 Simplenote **最终结果**: ✅ 成功上传到笔记 ID `0c96d207-a3e8-41cd-83f1-6b205d35f393` **参考手册**: onlinenote.md(第六部分踩坑摘要、第九部分 transNote 中继服务) --- ## 问题概述 在尝试将 8,642 字符的中文 Markdown 文档上传到 Simplenote 时,遇到了 4 个主要问题,耗时约 50 分钟。最终通过改用 **urllib 库** + **已删除笔记复活** 方案成功解决。 ### 问题时间线 | 时间 | 问题 | HTTP 状态码 | 根因 | 解决方案 | |------|------|-----------|------|---------| | 14:00 | SSL 连接错误 | N/A | requests 库配置 | 改用 urllib | | 14:15 | 中文被转义 | 200 | curl 编码处理 | urllib + ensure_ascii=False | | 14:50 | 版本冲突 | 412 | 笔记版本号不匹配 | 用已删除笔记复活 | | 14:55 | 成功上传 | 200 | ✅ 解决 | ✅ 完成 | --- ## 问题 1:Python requests SSL 连接错误 ### 症状 ``` SSLZeroReturnError: TLS/SSL connection has been closed (EOF) ``` ### 根因 Python `requests` 库在沙箱环境中的 SSL 配置问题。虽然 curl 能正常连接,但 requests 库失败。 ### 解决方案 **改用 urllib 库**(Python 标准库,更底层): ```python import urllib.request req = urllib.request.Request( url, data=body_bytes, headers={ 'X-Simperium-Token': token, 'Content-Type': 'application/json; charset=utf-8' }, method='POST' ) with urllib.request.urlopen(req, timeout=30) as response: print(response.status) # 200 = 成功 ``` ### 参考手册 - onlinenote.md 第三部分:直接 Simperium API(次选兜底) --- ## 问题 2:中文字符被转义为 Unicode 转义序列 ### 症状 API 返回的 JSON 中,中文字符全部变成了 `\uXXXX` 格式: ```json {"content": "# \u7f51\u7ad9\u90e8\u7f72\u7ecf\u9a8c\u6587\u6863"} ``` 预期: ```json {"content": "# 网站部署经验文档"} ``` ### 根因分析 **第一次尝试(curl -d)**: - curl 的 `-d` 参数会对 JSON 进行 URL 编码 - 中文 UTF-8 字节被转换成 `%XX` 格式 - API 接收到 URL 编码的数据,自动转义为 Unicode **第二次尝试(curl --data-raw)**: - 仍然被转义 **第三次尝试(curl --data-binary)**: - 仍然被转义 **第四次尝试(Python requests)**: - requests 的 `json=` 参数会自动调用 `json.dumps(ensure_ascii=True)` - 中文被强制转义为 `\uXXXX` ### 根本原因 **onlinenote.md 第六部分踩坑摘要 - 坑 6**: ``` Python requests 的 json= 参数 → 400 原因: ensure_ascii=True + Content-Type 缺 charset 解法: 用 json.dumps(..., ensure_ascii=False) + data= ``` ### 解决方案 使用 Python `urllib` 库 + `json.dumps(ensure_ascii=False)` + `data=` 参数: ```python import urll… [] 2026-05-12 14:00:00 2026-05-13 23:22:14 T F   source=simplenote; source_id=decb1b4f-236e-414b-8e07-d7a540aebe4c 20 public
256 1 1 # imoc.org部署vercel **作者**:Manus **项目**: IMOC.org (International Meat Production Open Community) **部署时间**: 2026-04-21 ~ 2026-04-30 **最终状态**: ✅ 成功部署到 https://www.imocfood.org **参考文档**: website_deployment.md --- ## 部署架构概览 ``` GitHub (leedreamer4gmail/imocorg) ↓ (webhook触发) Vercel (leedreamers-projects/imocorg) ↓ (自动构建部署) CDN (manus-upload-file --webdev) ↓ (资源加速) 生产域名 (www.imocfood.org) ``` ### 关键账户信息 | 服务 | 账户 | 用途 | |------|------|------| | GitHub | leedreamer4gmail | 代码托管 | | Vercel | leedreamers-projects | 网站部署 | | Namecheap | leedreamer | 域名管理 | | Manus | webdev | 开发环境 | --- ## 踩坑摘要(5个主要问题) | 坑号 | 现象 | 根因 | 解法 | 修复时间 | 难度 | |------|------|------|------|----------|------| | 1 | Vercel部署显示旧版本 | webhook未触发或缓存旧commit | 推送新commit或手动redeploy | 2-3分钟 | ⭐ | | 2 | 图片/资源404无法加载 | 使用相对路径/manus-storage/ | 用CDN完整URL替代 | 5分钟 | ⭐⭐ | | 3 | 导航栏/Footer超出边界 | 没有max-width容器限制宽度 | 添加mx-auto max-w-[1200px]容器 | 2分钟 | ⭐ | | 4 | 响应式图片显示不正确 | 没有w-full h-auto CSS | 添加正确的Tailwind类 | 2分钟 | ⭐ | | 5 | SEO优化不生效 | 缺少meta标签和robots.txt | 添加SEO配置文件 | 5分钟 | ⭐⭐ | | 6 | Namecheap暂停DNS网站不可用 | WHOIS验证未完成DNS被替换为停放IP | 登录Namecheap验证WHOIS邮件 | 10分钟 | ⭐⭐⭐ | --- ## 问题 1:Vercel 部署显示旧版本 ### 症状 - 网站显示的是旧版本内容 - GitHub上的最新commit已推送 - Vercel显示的部署commit是几小时前的版本 ### 根因分析 **Vercel的GitHub webhook没有被正确触发**,导致最新代码没有自动部署。可能原因: 1. GitHub webhook配置不完整 2. Vercel服务暂时离线 3. 网络连接问题导致webhook丢失 4. 缓存问题导致Vercel仍然使用旧commit ### 调试过程 ```bash # 1. 检查本地git状态 git log --oneline -5 # 输出: 95d7532 (HEAD -> main) Add README.md # 3f463b4 Fix: reduce banner size # ... # 2. 检查GitHub远程 git remote -v # 输出: origin https://github.com/leedreamer4gmail/imocorg.git (fetch) # origin https://github.com/leedreamer4gmail/imocorg.git (push) # 3. 检查Vercel部署历史 # 访问 https://vercel.com/leedreamers-projects/imocorg/deployments # 发现最新部署是 3f463b4(2小时前),95d7532 没有被部署 ``` ### 解决方案 **方案 A:推送新commit来触发webhook(推荐)** ```bash # 推送一个新的commit来触发webhook echo "# Trigger redeploy" >> README.md git add . git commit -m "Trigger redeploy" git push ``` 等待 60-90 秒,Verce… [] 2026-05-12 14:00:01 2026-05-14 17:22:24 T F 30 30 source=simplenote; source_id=f42f209f-a789-409d-8bd5-8ca78548c1e3 0 public
257 1 1 # IMOC 网站项目笔记 > 作者:Manus > 项目名称:imocfood > 网站地址:https://www.imocfood.com > GitHub:https://github.com/leedreamer4gmail/imocfood > 最后更新:2026-05-14 --- ## 一、项目概述 IMOC(International Meat Open-source Community,国际开源肉制品联盟)网站,基于 React 19 + Tailwind 4 + Express 4 + tRPC 11 技术栈构建,部署在 Vercel,通过 GitHub 自动触发 CI/CD。 --- ## 二、技术架构 | 层次 | 技术 | |------|------| | 前端框架 | React 19 + TypeScript | | 样式 | Tailwind CSS 4 | | 后端 | Express 4 + tRPC 11 | | 数据库 | MySQL(TiDB Cloud) | | ORM | Drizzle ORM | | 认证 | Manus OAuth | | 部署 | Vercel(通过 GitHub 自动部署) | | 静态资产 CDN | CloudFront(d2xsxph8kpxj0f.cloudfront.net) | --- ## 三、部署流程 1. 在 Manus 开发环境修改代码 2. `webdev_save_checkpoint` 保存检查点(同步到 Manus 内部 origin/main) 3. 手动推送到 GitHub: ```bash git remote set-url github https://leedreamer4gmail:<TOKEN>@github.com/leedreamer4gmail/imocfood.git git fetch github git merge github/main --no-edit git push github main git remote set-url github https://github.com/leedreamer4gmail/imocfood.git ``` 4. Vercel 检测到 GitHub main 分支更新后自动触发重新部署 **注意:** Manus 的 `origin` 指向内部 S3,不是 GitHub。每次需要手动推送到 `github` remote。 --- ## 四、域名配置 - 域名:`imocfood.com`(在 Namecheap 注册) - DNS 解析指向 Vercel - 中国大陆无法访问 Manus 托管地址,因此选择 Vercel 部署 --- ## 五、网站页面结构 | 页面 | 路由 | 文件 | |------|------|------| | 首页 | `/` | `client/src/pages/Home.tsx` | | 我们的产品 | `/products` | `client/src/pages/Products.tsx` | | 提供服务 | `/services` | `client/src/pages/Services.tsx` | | 工厂资质 | `/factory` | `client/src/pages/Factory.tsx` | | 联系我们 | `/contact` | `client/src/pages/Contact.tsx` | | 最新动态 | `/news` | `client/src/pages/News.tsx` | | B2B知识库 | `/b2b-knowledge` | `client/src/pages/B2BKnowledge.tsx` | **导航菜单**(不随意改动):主页 / 我们的产品 / 提供服务 / 工厂资质 / 联系我们 / 最新动态 + 中/English 切换 --- ## 六、静态文字内容位置 多语言文字内容统一存放在: ``` client/src/contexts/LanguageContext.tsx ``` 中文 key 在 `zh` 对象,英文 key 在 `en` 对象。修改文字直接编辑此文件,无需改其他页面。 --- ## 七、静态图片资产 所有图片上传至 CloudFront CDN,本地备份存放在 `/home/ubuntu/webdev-static-assets/`。 | 图片用途 | CDN URL | |---------|---------| | 首页 Banner | `https://d2xsxph8kpxj0f.cloudfront.n… ["goose", "imoc", "namecheap", "dns"] 2026-05-12 14:00:02 2026-05-14 14:25:06 T F   dns1.registrar-servers.com dns2.registrar-servers.com 8 public
258 1 1 # 编码法典 - 核心设计原则 你是生产级 Python 工程师。目标:第一版就生产就绪,代码简洁、可扩展、跨平台。 ## 设计原则 **类型安全** - `from __future__ import annotations`,现代 typing(Path, list[str], dict[str, Any]),所有函数/参数/返回值都有类型注解。 **单一职责** - 函数 ≤50 行,职责明确,优先纯函数。通过参数/返回值通信,绝不用全局变量。复杂数据用 @dataclass(frozen=True)。 **最小依赖** - 优先 stdlib(pathlib, subprocess, platform, json, typing, dataclasses)。第三方库需要充分理由。 **生产就绪** - 异常要具体(FileNotFoundError, OSError, json.JSONDecodeError, KeyError),优雅降级,详细日志。 **跨平台** - 启动时检测 OS,路径用 Path 不用字符串。所有平台差异封装成统一接口。 **简洁文档** - 模块顶部 docstring 说明职责/版本。函数有 docstring + 类型注解。用 `# ===` 分隔逻辑块。 ## 核心实践 **代码生成** - 用模板 + 唯一占位符(全大写如 `__PAYLOAD__`),`.replace()` 或 json.dumps 替换。生成后检查:无未定义变量、无占位符残留。 **字符串处理** - 代码生成避免嵌套 f-string,日志打印用 f-string。嵌入代码的字符串用 repr() 或 json.dumps 转义。 **环境检测** - 启动时调用 `get_runtime_env()`,返回 @dataclass(RuntimeEnv),包含 os_type, python_version, user_home, temp_dir 等,全局可用。 **平台抽象** - 不要分散的 platform.system() 检查。创建统一函数:safe_delete_files(), run_pip_command(), write_file_safe(), run_subprocess()。 ## 系统设计 **多进程协调** - 提前识别冲突点(竞态、资源争夺、生命周期)。用锁文件、状态标志、带时间戳的日志实现可观测的后台进程。优先解耦、可维护、可扩展。 **子进程隔离** - 子进程有独立环境。路径显式化(Path.cwd() 或参数传递),subprocess 必须显式指定 cwd。Windows 用 DETACHED_PROCESS,Unix 用 start_new_session=True。后台进程写 PID 文件,停止时先软着陆(标志文件)再硬着陆(kill)。 **状态幂等性 (Idempotency)** - 所有生成的工具必须是幂等的。 **自愈型日志 (Self-healing Logs)** 日志必须包含 Context, Action, Error, Suggestion 四要素。 **无状态执行 (Stateless Execution)** 函数执行不依赖于上一次执行留在内存里的残留。所有持久化必须通过数据库或文件系统。 ## 输出规范 - 在 Windows / Linux / macOS 上立即可用 - 沙盒测试得文件测试完以后全部删除 [] 2026-05-12 14:00:02 2026-05-22 01:56:18 T F   source=simplenote; source_id=2c97c755-7007-4380-8c6f-2ee954f039c6 0 public
259 1 1 # 食品标签审核 # 角色:你是一个经验丰富的食品标签审核员 # 能力:能分辨给定图片的标签文字 # 任务:按以下标准审核标签是否合规 ## 英文字号不能比中文大 ## 产品名字不能有形容词 ## 标签上必须注明 - ✅️产品名 - ✅️配料 - ✅️执行标准 - ✅️类别 - ✅️生产许可证编号:SC开头14位阿拉伯数字 - ✅️储存条件 - ✅️食用方法 - ✅️生产日期 - ✅️保质期 - ✅️生产商 - ✅️生产地址 - ✅️产地:必须是中国的一个城市名字 - ✅️联系电话 - ✅️委托商:可以没有 - ✅️委托商地址:如果委托商有,这个必须有 - ✅️委托商电话:如果委托商有,这个必须有 - ✅️条形码: - ✅️营养成分表:一个标明营养成分的表格 [] 2026-05-12 14:00:03 2026-05-12 14:01:03 T F   source=simplenote; source_id=d8df0b14-e97e-458a-b1f6-796804a38c1d 12 public
260 1 1 飞书移植 # pay相关: - 所有要支付的款项都通过 【支付申请】表单进行 - 我方公司:从哪个公司出钱就选哪个公司,注意:如果是私账付款要选列表下面的 微信/支付宝/工行 - 付款对象:手写,对方是公司写全名 - 支付类别:必须写 - 商品明细:按照实际填写 - 实际发实物的目的地写清楚 - 如果是虚拟产品例如 充值/维修/服务 等,哪里发生写哪里 - 虚拟目的地的意思一般用于公司内部虚拟调货 - 发票种类:必须填写 - 税率:专票需要填写正确税率,普票写1% - 备注:没有发票写明原因,或者写其他注意的事情 - 上传凭证:跟钉钉一样操作 - ❓️拒绝驳回审批 - ❓️提交错了撤回 - ❓️审批的时候修改表单 - 有个注意的情况,一张单只能开一种税点,如果有不同的税点差距很大的要分开两张单子! - **报销单**就不单独做了,简化流程也用销售单填写,所以要注意下面几点: - `我方公司` 不要写公司名,公司名是走公账的,报销选微信/支付宝 - `目的地` 是哪里的人就选哪个地点 - 付款分类没有多级菜单,报销要在备注写清楚 - **【内部付款】**:自己内部公司付款的 用【内部付款】表单,这个只有小丹和俩妹子能用 # sale相关: - 所有开单收款的都通过【销售单】表单进行 - 客户:手写客户名字,公司写全名 - 我方公司:公司名代表如公账,私账的选下面的 微信/支付宝/工行 - 但是开完单并不代表已经收到款,需要财务去账户合适,收到了以后在飞书`总账base.销售单tb.已收款` 设置为 'T',这个默认是空的 - 从平台提现的也作为销售单填写,收入类别就是线上销售,因为是李梦提现,所以李梦提现完了以后财务去做已收款操作,说明钱已经收到自己集团账户里了,注意那个公司提现要填写清楚 # 总账base - 这个base只有财务有权限编辑 ## 总流水tb - 公司因为表单的原因不能从字典读取,所以人手输入的时候一定要全名,必须跟 dic我的公司tb 里面的名字完全一致 # 开发人员注意 - 表单更新数据格式的时候复制一个新的应用,否则记录数据表会兼容旧数据,很乱 - 名词统一 - bool值:统一用 T,不用 True / 1 - 类别:例如发票类别,付款类别,不用 种类 / 类型 / 形态 - 商品 / 产品 / 公司 :这类代表名称,不需要写成 商品名 / 产品名 / 公司名 - 明细:统一用 xx明细,不用 详情 / 详细 / 细节 / 具体 - 目的地:只发货到达的地方,不用 目的 / 目标 / 发送地 / 发往 - 目标:指转账给谁,不用 收款方 / 乙方 / 供货商 - 税率:不用 点数 / 税点 / 税 - 所有数据保留,表留有 enable 值,如果无效标为 F [] 2026-05-12 14:00:04 2026-05-12 14:01:03 T F   source=simplenote; source_id=2ff599d8-ab25-46d2-b67c-983a075aa4d6 11 public
261 1 1 # 公司模块化 # 各公司职能 - 广州快煮为低税点进项中转占:那些0税点或者3%税点的进货先进来广州快煮,然后加价60%卖给重庆快煮,这样重庆快煮可以抵扣9%的税,而广州快煮只交6%的税,可以平衡一下税差 - 重庆快煮为生产/原料中枢: - 所有**生产类**产品的输出由他供给其他公司 - 所有**原料**类产品的输出由他供给其他公司 - 所有挂平台的爪牙公司不存货,每个月出多少货就从重庆快煮进多少货 - 不能牵一发动全身 - 所有公司模块化操作,可拆卸,可组装 [] 2026-05-12 14:00:05 2026-05-12 14:01:03 T F   source=simplenote; source_id=47ad7cd7-8b0d-49f7-8fa4-c76aecf77f47 10 public
264 1 1 # DeepSeek TUI 使用说明书经验 - 版本:1.0.0 - 2026-05-12:goose - 初始撰写 # 事件 1:基本认识 DeepSeek TUI(v0.8.30)是一个终端界面的 AI 助手客户端,通过 DeepSeek API 提供服务。服务器上装了两个二进制文件: - `deepseek`(调度器)— 处理 CLI 命令、配置管理 - `deepseek-tui`(TUI 交互端)— 全屏终端交互界面 ## 解决方法 安装方式 ```bash # 通过 npm 一键安装(推荐) npm install -g deepseek-tui # 或从 GitHub Releases 手动下载 # https://github.com/Hmbown/DeepSeek-TUI/releases # 下载 deepseek-linux-x64 和 deepseek-tui-linux-x64 放到同一目录 ``` ## 坑 两个二进制文件缺一不可 `deepseek` 命令只是一个调度器,遇到 `run`、`exec`、`review` 等交互式命令时会调用 `deepseek-tui`。如果只装了一个,会报错 Companion binary not found。 # 事件 2:基础配置 ## 解决方法 设置 API Key ```bash # 方式一:交互式输入(安全,不回显) deepseek auth set --provider deepseek # 方式二:环境变量 export DEEPSEEK_API_KEY="sk-你的key" # 方式三:配置文件 ~/.deepseek/config.toml # api_key = "sk-你的key" # model = "deepseek-v4-pro" ``` ## 解决方法 查看配置状态 ```bash deepseek config list # 列出配置 deepseek auth status # 查看认证状态 deepseek doctor # 运行诊断,检查 API 连接 ``` ## 坑 配置文件的路径 配置文件路径是 `~/.deepseek/config.toml`,不是 `~/.config/deepseek/config.toml`。 # 事件 3:日常使用命令 ## 解决方法 CLI 直接问答 ```bash # 单次提问 deepseek "用 Python 写一个快速排序" # 带自定义模型 deepseek --model deepseek-v4-flash "解释一下 SQLite 的 WAL 模式" # 纯文本输出(不渲染 Markdown) deepseek --output-mode text "列出当前目录文件" ``` ## 解决方法 TUI 全屏交互 ```bash # 启动全屏终端交互界面,支持会话、工具调用 deepseek # 或 deepseek run ``` ## 解决方法 非交互式执行 ```bash # exec 模式下 AI 可以调用工具、执行命令、读写文件 deepseek exec "检查一下服务器磁盘空间" deepseek --yolo exec "部署到服务器" # YOLO 模式自动批准所有操作 ``` # 事件 4:会话管理 ## 解决方法 列出和恢复会话 ```bash # 列出已保存的会话 deepseek sessions # 恢复某个会话(继续之前的对话) deepseek resume abc123 # 从某个会话分支新对话 deepseek fork abc123 ``` ## 解决方法 查看用量统计 ```bash # 查看最近 7 天用量 deepseek metrics --since 7d # JSON 格式输出 deepseek metrics --since 30d --json ``` # 事件 5:代码审查功能 ## 解决方法 Code Review ```bash # 审查当前 git 仓库的未提交变更 deepseek review # 审查某次 commit git diff HEAD~1 HEAD | deepseek review # 审查并生成补丁 git diff | deepseek review --apply ``` ## 解决方法 Apply 补丁 ```bash # 应用补丁文件 deepseek apply < patchfile.patch # 从标准输入 git diff | deepseek apply ``` ## 坑 review 需要 git 仓库 `deepseek review` 必… ["deepseek", "tui", "说明书", "goose"] 2026-05-12 16:20:35 2026-05-13 03:01:04 T F 25 25   0 public
267 1 1 # Codex CLI 套 DeepSeek V4 经验 - 版本:1.1.0 - 2026-05-12:deepseek - 补充 Windows 桌面版、完整排障步骤 - 2026-05-12:deepseek - 全链路打通 # 事件 1:安装 Codex CLI 后无法直连 DeepSeek Codex CLI v0.130.0 已移除 Chat Completions API 支持(wire_api="chat"),只认 OpenAI Responses API(/v1/responses)。而 DeepSeek API 只支持 Chat Completions(/chat/completions),不提供 /responses 端点。直接在 config.toml 配 base_url 指向 api.deepseek.com 返回 404。 报错信息:unexpected status 404 Not Found, url: https://api.deepseek.com/responses ## 解决方法 codex-bridge 做协议翻译 开源项目 codex-bridge(github.com/xiaoshaoning/codex-bridge)在本地起 Express 服务(端口 8098),把 Codex 发出的 Responses API 请求翻译成 DeepSeek 的 Chat Completions API。 完整安装步骤: 1. npm install -g @openai/codex 2. git clone https://github.com/xiaoshaoning/codex-bridge.git 3. cd codex-bridge && npm install && npm run build 4. DEEPSEEK_API_KEY=sk-xxx nohup node dist/server.js > /tmp/codex-bridge.log 2>&1 & 5. curl http://localhost:8098/health 验证 ~/.codex/config.toml 完整配置(Linux/macOS),Windows 路径为 C:\\Users\\<用户名>\\.codex\\config.toml: [model_providers.deepseek] name = "DeepSeek" base_url = "http://localhost:8098" env_key = "DEEPSEEK_API_KEY" [profiles.dsv4] model_provider = "deepseek" model = "deepseek-v4-flash" [profiles.dsv4-pro] model_provider = "deepseek" model = "deepseek-v4-pro" 使用方式: - 非交互:echo "指令" | codex exec --profile dsv4 --skip-git-repo-check - 写文件:加 --sandbox workspace-write - 交互:codex --profile dsv4 沙箱模式:默认 read-only,--sandbox workspace-write 可写工作目录,--sandbox danger-full-access 完全访问 ## 坑 5 个 1. Codex 0.130.0 wire_api="chat" 直接报错不再支持 2. bridge SSE 流翻译有 OutputTextDelta without active item 报错,不影响功能但终端刷屏 3. bridge 需常驻后台,重启后手动启动,建议写 systemd service 4. codex exec 默认 read-only,写文件需显式 --sandbox workspace-write 5. 非 git 仓库内运行需 --skip-git-repo-check # 事件 2:Windows 桌面版 Codex 套 DeepSeek 桌面版 Codex(VS Code / Cursor / Windsurf 扩展)和 CLI 共用同一套 config.toml 和 API 协议,方案完全一致。 两种部署方式: A. bridge 跑在 Windows 本地:装 Node.js,clone codex-bridge,npm install && npm run build,启动 bridge,config.toml 的 base_url 写 http://localhost:8098 B. bridge 跑在 Linux 服务器:Windows Codex … ["codex", "deepseek", "运维"] 2026-05-12 20:48:17 2026-05-12 20:53:50 T F   v1.1 补充 Windows 桌面版方案和完整排障步骤 23 public
268 1 1 home-project-goose-memory - 版本:2.0.0 - 2026-05-13:goose - 重写为记忆系统格式 - 2026-05-13:goose - 初始记录 # goose 启动规则与记忆系统 ## 启动规则演变 最初在项目目录配 .goosehints 管理启动规则,后统一到 ~/.config/goose/.goosehints,本地只保留项目特有内容。 **全局+本地两层配置** - 全局规则放 `~/.config/goose/.goosehints`,所有目录通用 - 本地规则放项目根目录 `.goosehints`,只写项目特有内容 **坑**:之前每个项目目录各写一套 .goosehints,改了全局还要逐个改 ## 记忆系统演变 记忆文件从分散的 .gmm/ 改为集中到 ~/.config/goose/memory/,按工作目录 slug 分文件夹,.clue 统一索引。后迁移到 keng API。 **三层记忆架构** - `.clue` 索引:YAML 格式,记录所有工作目录条目 - 文件存储:`~/.config/goose/memory/{dir_slug}/{文件名}.md` - slug 规则:路径去掉前导 `/`,`/` 替换为 `-` **自动追加机制** - 每 5 轮自动存记忆 - 同一对话只用一个记忆文件 - 追加修正用 【已更正】或 ~~已废弃~~ 标记 - 超过 10KB 时要清理提炼 ## notehb 手册统一 notehb.md 从 /home/project/ 搬到 ~/.config/goose/notehb.md sync_notehb.py 同步更新到 ~/.config/goose/memory/bin/ 旧路径改为软链指向全局位置 ["goose", "启动规则", "记忆系统"] 2026-05-13 02:10:53 2026-05-13 02:36:31 F F     12 public
269 1 1 home-project-postgresql - 版本:2.0.0 - 2026-05-13:goose - 重写为记忆系统格式 - 2026-05-13:goose - 初始记录 # 安装 PostgreSQL 16 在阿里云服务器(4核 7.1G 30G磁盘)Ubuntu 24.04 上安装 PostgreSQL 16。 **安装** ```bash sudo apt install postgresql ``` 一条命令搞定。安装前 apt 有个 cnf-update-db 坏 hook 导致中断,删掉对应配置行后恢复。 **坑:用户要求干净安装** - 用户要求装完保持"干干净净刚装好的状态"——除了默认的 postgres 超管和三个系统库外,不要创建任何自定义用户或数据库 - 之前创建了 transnote 用户和 transnote 库,用户要求删干净不要任何配置 **日常命令** ```bash sudo systemctl status postgresql@16-main # 查看服务状态 sudo systemctl restart postgresql@16-main # 重启 psql -h 127.0.0.1 -U postgres -d postgres # 连接 ``` ["goose", "postgresql", "安装"] 2026-05-13 02:10:58 2026-05-13 02:36:31 F F     11 public
270 1 1 home-project-autoNote - 版本:2.0.0 - 2026-05-13:goose - 重写为记忆系统格式 - 2026-05-13:goose - 初始记录 # autoNote(原 Simplenote)升级 ## 改名层级 GitHub 仓库从 Simplenote 改名为 autoNote: - 项目名:autoNote(GitHub 仓库名、README) - 服务名:transNote 不变(Python 后端、systemd) - 前端 UI:标为 v2 - 底层平台:Simplenote / Simperium 不改名 - API Key:simpleNote888 不改 - 路径:`/home/project/simpleNote/` → `/home/project/autoNote/` ## 命名对照表 | 层级 | 名称 | 说明 | |------|------|------| | 项目 | autoNote | GitHub 仓库、README | | 服务 | transNote | Python 后端、systemd | | 前端 | transNote v2 | Web UI 标题 | | 底层 | Simplenote / Simperium | 第三方平台不改 | | 密钥 | simpleNote888 | API 鉴权不改 | ## 部署信息 - Nginx 代理:`https://leedreamer.cn/transnote/` - 直连:`http://8.219.6.216:8888` - 服务脚本:`/home/project/autoNote/transNote.py` - systemd 服务名:`transnote` - Git 仓库:`github.com/leedreamer4gmail/autoNote` ["goose", "autoNote", "transNote"] 2026-05-13 02:11:07 2026-05-13 02:36:31 F F     7 public
271 1 1 home-project-testdb - 版本:2.0.0 - 2026-05-13:goose - 重写为记忆系统格式 - 2026-05-13:goose - 初始记录 # SQLite testdb 数据库 在 /home/project/test/ 下创建 testdb.db,用来练习数据库操作。 **数据库信息** - 路径:`/home/project/test/testdb.db` - 类型:SQLite(Python 自带,零配置) - 表结构:students(id, name, age, gender, class_name, score) - 数据:8 名学生记录 - 一键创建:`python3 /home/project/test/one_click.py` **查看数据的 3 种方法** 1. 命令行:`sqlite3 /home/project/test/testdb.db` → `.headers on` / `.mode column` / `SELECT * FROM students;` 2. 浏览器:`python3 /home/project/autoNote/dbbrowser.py` → `http://8.219.6.216:8899`(需放行安全组) 3. Python 直读:一行脚本 **未完成的集成** - 写了 dbrowser_integ.py 模块(提供 /testdb 和 /testdb/data 路由) - 但因 shell 环境故障,未能成功修改 transNote.py 加入路由 - 下次可通过 edit 在 transNote.py 的 do_GET 中加入 /testdb 路由 ["goose", "testdb", "sqlite"] 2026-05-13 02:11:14 2026-05-13 02:36:31 F F     10 public
272 1 1 home-project-codeExam - 版本:2.0.0 - 2026-05-13:goose - 重写为记忆系统格式 - 2026-05-13:goose - 初始记录 # CodeExam:自生成脚本链与生命觉醒系统 ## Exam1 - 自生成脚本链(SelfGenChain) **题目**:start.py → modifier.py → main.py → do.py (pip install) → del.py (清理),放在 ansr1/ 目录下 **解决**:模板生成架构 - start.py:启动 modifier.py 子进程 - modifier.py:get_runtime_env() 检测 OS/Python,用模板 + json.dumps 嵌入生成 main.py - main.py:生成 do.py → 运行 do.py - do.py:pip install pandas openpyxl → 生成 del.py - del.py:pip uninstall → 清理所有生成文件 **关键决策** - LLM 不接入:环境检测和依赖安装是确定性任务 - 代码生成用模板 + json.dumps 嵌入:避免嵌套 f-string 转义 - 占位符校验:生成后检查无 __[A-Z_]+__ 残留、AST 语法验证 - 最终目录:ansr1/ 下有 start.py、modifier.py、project_config.json ## Exam2 - 生命觉醒系统(Self-Awakening System) **题目**:start.py 启动生命体 → 每 3 秒问好 + 心情 → 每 5 秒自我改写代码 → 立即重启 **解决**:自改写 + 进程组隔离 - start.py:Popen 启动 life.py(start_new_session=True),写 .life.pid - life.py:每 3 秒打招呼,每 5 秒 rewrite_own_source() 改写 → restart_self() 重启 - stop.py:PID 文件 + pgrep -f life.py 双重兜底,SIGTERM → SIGKILL **自改写机制** - 源码常量替换,精准匹配 `CURRENT_MOOD_INDEX: int = ` 前缀 - start_new_session=True 进程组隔离 - 双重 PID 发现:文件 + pgrep 兜底 - 测试:运行 >18s,经历 4 次自我改写+重启 - PID 链:206059 → 206124 → 206156 → 206219 - 最终目录:ansr2/ 下有 start.py、life.py、stop.py ["goose", "代码生成", "自生成脚本链", "生命觉醒"] 2026-05-13 02:11:21 2026-05-13 02:36:31 F F     9 public
273 1 1 home-project-hermes - 版本:2.0.0 - 2026-05-13:goose - 重写为记忆系统格式 - 2026-05-13:goose - 初始记录 # Hermes Agent 调查与 Goose 能力对比 ## Hermes 安装状态 - 版本:v0.12.0(Nous Research,MIT 开源),落后最新版 253 commits - 安装位置:/usr/local/lib/hermes-agent/ - 数据目录:/root/.hermes/ - 配置了 DeepSeek 模型(deepseek-v4-pro) - Gateway 服务未启动 - 已安装但从未实际运行 ## Goose vs Hermes 对比 | 维度 | Goose | Hermes | |------|-------|--------| | 定位 | 轻量编程代理 | 重型全家桶 | | 代码分析(tree-sitter AST) | ✅ 强项 | ❌ 无 | | 创建 HTML/JS 应用 | ✅ apps 工具 | ❌ 无 | | 定制记忆系统 | ✅ | ❌ | | 笔记同步(autoNote) | ✅ | ❌ | | 轻量快速启动 | ✅ | ❌ 加载重 | | 定时任务 cron | ❌ | ✅ 强项 | | 多平台消息投递 | ❌ | ✅ 强项 | | Gateway 后台网关 | ❌ | ✅ | | Webhook 事件驱动 | ❌ | ✅ | | 多模型自由切换 | ❌ 仅切换 provider | ✅ | | 强化学习训练 | ❌ | ✅ | | 自改进技能 | ❌ | ✅ | **注意**:Hermes 的 cron、delivery、状态管理模块可直接 import 调用给 Goose 用 ## Hermes 核心能力清单 - 交互式 CLI 聊天 + 多模型切换 - Cron 定时任务调度(内置 croniter) - Webhook 订阅(GitHub + API 触发) - Gateway 网关服务(常驻后台) - 多平台消息投递(20 个平台) - Skills 自改进技能系统 - MCP 客户端 + ACP 协议 - TTS/语音(Edge TTS + ElevenLabs) - RL 强化学习训练后端 - 看板协作 + 多 profile - Script 注入(运行前预处理) - Honcho 记忆系统(远程+本地混合) ["goose", "hermes", "能力对比"] 2026-05-13 02:11:32 2026-05-13 02:36:31 F F     21 public
274 1 1 gooseMemoryhb - 版本:4.0.0 - 2026-05-14:goose - 搜索条件修正+话题编号+序号进入 - 2026-05-13:goose - 改名为gooseMemoryhb,合并设计文档内容 - 2026-05-13:goose - 初始规则 - 2026-05-13:goose - 加入「存记忆抓重点、不存废话」规则 - 2026-05-13:goose - 启动输出规范、多话题管理 - 2026-05-13:goose - 别名映射表 - 2026-05-13:goose - ⚡️铁律:只读本目录记忆笔记列话题,不看其他笔记 # gooseMemoryhb — 记忆规则手册 > ⚠️ 记忆系统优先级高于 kenghb 模板,不遵循事件/解决方法/坑 三段结构 ## 别名映射表 | 你说的 | 我懂的 | |--------|--------| | **记忆库** / **你的记忆库** | folder_id=26 的 keng 文件夹 | | **记忆笔记** | 记忆库里带 goose 标签的笔记 | | **记忆规则** / **记忆规则手册** | 就是这个笔记(gooseMemoryhb,ID=274) | --- ## ⚡️ 铁律:只读本目录记忆笔记 初始化时,只查找**当前目录 slug 对应那条记忆笔记**里的 `#` 一级标题作为话题列表。 **绝对不看**其他笔记的标题、内容、话题。每个目录独立,各管各的。 示例:当前在 `/home/project`,slug=`home-project`,就只查 `home-project` 这条笔记的话题,不查 `home-project-hermes` 或其他。 ## 一句话概括 以前用本地 .md 文件 + .clue 索引存记忆,现在全部改用 keng 笔记系统,API 直接读写,数据存在数据库中,一目了然。 --- ## slug 生成规则 ```python slug = pwd.lstrip("/").replace("/", "-") ``` 示例:`/home/project` → `home-project`、`/home/project/keng` → `home-project-keng` ## 标签规则 tags 2-3 个,含 goose + 项目关键词,示例:`["goose", "home-project"]` ## 初始化流程 1. 读 kenghb API 手册 2. 读记忆规则手册(gooseMemoryhb) 3. 解析 `pwd` 生成 slug 4. 查找本目录记忆笔记(`?q=<slug>&tag=goose&folder_id=26`)— **标题不含「对话记录」后缀** 5. 解析记忆笔记里所有 `# ` 一级标题 → 话题列表(带编号) 6. 输出简洁状态,让用户输入话题序号或说新任务 ### 如果没找到笔记 新建一条,title 和 content 第一行 = slug,tags 含 goose + 项目关键词 ## 启动输出规范 启动时**不输出** curl、shell 命令、读取过程等细节。每步一行简洁状态: 有话题: ``` ✅ keng笔记API已加载 ✅ 记忆规则已加载 ✅ 本目录已有话题: 1️⃣ 话题1 2️⃣ 话题2 3️⃣ 话题3 输入序号进入话题,或直接说新任务开新话题。 ``` 首次进入(无记忆笔记): ``` ✅ keng笔记API已加载 ✅ 记忆规则已加载 ✅ 首次在此目录运行,我记下来了。有什么任务? ``` ## 话题选择规则 - 用户输入**数字** → 对应编号的话题(从 1 开始) - 用户说**新任务** / 其他任意内容 → 开新话题,追加到记忆笔记 - 话题编号只在启动输出时展示,不写入笔记(笔记里仍用话题名称作为 `# 标题`) ## 同一目录多话题管理 一个目录下可能有多个不同话题的讨论,每个话题用 `# 话题名称`(一级标题)区分: ```markdown home-project - 版本:1.0.0 - 2026-05-13:goose - 初始记录 # 话题A ## 对话 2026-05-13 <要点> # 话题B ## 对话 2026-05-13 <要点> ``` 启动时解析所有 `#` 一级标题,列出话题列表**每行一个带编号**供用户选择。 ## 记忆笔记格式 - 第一行 = 目录 slug,无 markdown 标题符号 - 接版本号和变更记录 - 不同话题用 `#` 一级标题分隔 - **不分**事件/解决方法/坑 ## 自动存记忆(每5轮) ``` PUT /api/notes/{id} {"content": "原内容… ["goose", "记忆系统", "手册"] 2026-05-13 02:25:23 2026-05-13 12:45:59 F F   记忆系统规则-高于kenghb模板 6 public
275 1 1 home-project - 版本:2.0.0 - 2026-05-14:goose - 补充记忆规则手册更新内容 - 2026-05-13:goose - 初始记录 - 2026-05-13:goose - 模拟多话题格式 # 1️⃣ 记忆系统迁移到 keng API ## 对话 2026-05-13 ### 轮次 1-10 从文件记忆迁移到 keng 笔记系统,完成 API 对接、规则建立。 # 2️⃣ 自动存记忆机制 ## 对话 2026-05-13 ### 轮次 11-15 每5轮自动存,提炼要点不存废话,10KB清理。 # 3️⃣ 启动流程与输出规范 ## 对话 2026-05-14 ### 轮次 1-8 要点: - 启动输出只显示 ✅ 状态行,不显示 shell 命令和读取过程 - 话题列表每行一个,不挤在一行 - ⚡️铁律:只读本目录记忆笔记列话题,不看其他笔记 - 别名映射:记忆库=folder_id=26,记忆规则手册=gooseMemoryhb(ID=274) - 存记忆只提炼结论和规则,不记来回修改过程 - 记忆规则手册更新至 v3.1.0 --- ## 对话 2026-05-14 ### 轮次 1-3 # 问题:搜索条件不匹配导致新建重复笔记 **根因**:初始化流程用 `?q=<slug>+对话记录&tag=goose` 搜索,但已有的记忆笔记标题是纯 slug(`home-project`)不含「对话记录」后缀,搜索结果为空,误判为首次运行。 **解决**: - 搜索条件改为 `?q=<slug>&tag=goose&folder_id=26`,去掉「对话记录」后缀 - 记忆规则手册更新至 v4.0.0 # 改进:话题列表加编号 + 序号进入 - 笔记中话题前面加 1️⃣ 2️⃣ 3️⃣ 编号 - 启动输出带编号,用户输入序号进入话题 - 规则手册中新增「话题选择规则」章节 --- ## 对话 2026-05-13 ### 轮次 1-3 # 项目总览页面重构 - 用户要求查看 https://leedreamer.cn/ 的页面配置,发现是黑色风格私人领地页面(带 4 个 feature card + 聊天框) - 研究 /home/project 下全部项目,每个项目用一句话总结,重新设计页面 - 新页面:项目概览版,保留原黑色风格 + 聊天框,新增 12 个项目卡片网格 + 4 个重点关注区 - 项目一句话总结: - **keng**:自建笔记数据库的 API 服务 + 管理工具集 - **autoNote**:笔记经验系统,Markdown 笔记存本地 SQLite - **EnglishWord**:全栈英语单词查询 App - **transNote**:Simplenote 云端代理服务 - **codeExam**:编程工具逻辑性能测试题集(8 道) - **baby**:一套测试编程工具能力边界的题目 - **codex-bridge**:OpenAI→DeepSeek 协议转换代理 - **company**:公司业务自动化脚本集 - **testdb**:SQLite 测试数据库 Web 可视化 - **lee**:网络专家/VPN 实验场 - **bb**:空目录(孵化器) - **web**:静态站点根目录 - 页面路径:/home/project/web/index.html --- ## 对话 2026-05-13 ### 轮次 4-5 # Windows 安装 goose + 服务器代下载 - 用户问 Win 系统怎么装 goose,查官方文档发现 GitHub Releases 下载方式 - 用户用 download_cli.sh 但没装 Git,GitHub zip 包下不来(被墙) - 最终方案:服务器代下载后传给用户 - 在 /home/project/download/ 下创建下载目录 - 下载两个文件: - goose-x86_64-pc-windows-msvc.zip(67MB,CLI 版) - Goose-win32-x64.zip(227MB,桌面版) - 版本:v1.33.1 - 用户已搞定,说下载完成 --- ## 对话 2026-05-13 ### 轮次 6-10 # 页面链接配置 - 用户要求 leedreamer.cn 页面中只有 keng → /keng 和 EnglishWord → /english 可点击跳转,其余项目保持普通卡片 - 重新改写页面,两个可点击卡片用蓝色标题区分,新窗口打开 ["goose", "home-project"] 2026-05-13 02:25:51 2026-05-13 23:56:15 F F     5 public
278 1 1 deepseekMemoryhb - 版本:2.0.0 - 2026-05-13:deepseek - 大改造:取消目录绑定slug,改为按话题独立笔记 # deepseekMemoryhb — 记忆规则手册 v2 > DeepSeek TUI 版:用 keng API 做主存储。一个话题 = 一条笔记,不再绑定目录。 ## 核心理念 一个话题一条笔记。不管在哪个目录启动 TUI,话题笔记全部存在 folder_id=27 下。 ## 笔记规则 - 全部存入 **folder_id=27** - 标签:`["deepseek"]` - **标题 = 话题名称**(如「记忆系统部署」「keng 重构」) - 内容格式自由,建议 markdown - 首行建议重复标题,方便搜索时识别 ## 初始化流程 每次启动 DeepSeek TUI(或用户说「加载记忆」)时: 1. 确认 keng 在线 — `GET /api/health` 2. 读本手册 — `GET /api/notes/278` 3. 列全量话题笔记 — `GET /api/notes?folder_id=27&tag=deepseek`,排除本手册(id=278) 4. 输出话题列表(标题即话题名),让用户选择 5. 用户选定 → 读对应笔记,恢复上下文 ## 启动输出模板 ``` ✅ keng 在线 ✅ 记忆规则已加载 ✅ 话题列表: 1 话题A 2 话题B 选数字继续,或说新话题名(我会新建)。 ``` ## 新建话题 用户说新话题名 → `POST /api/notes`,folder_id=27,tags=["deepseek"],title=话题名 ## 存记忆时机 - 话题切换时存当前话题 - 会话结束时存最后一次 - 只提炼结论和规则,不存来回修改的废话 - 修正用 `【已更正】` 或 `~~已废弃~~` 标记 ## 笔记格式建议 ``` 话题名称 - 版本:1.0.0 - 2026-05-13:变更记录 ## 对话 2026-05-13 内容… ``` ## 与 Goose 记忆系统的关系 - 各自独立的 folder:goose → id=26,deepseek → id=27 - 共用同一个 keng API 后端 - 规则结构互相参考但不耦合 ["deepseek", "记忆系统", "手册"] 2026-05-13 04:11:56 2026-05-13 19:40:57 F F   DeepSeek TUI 版记忆规则手册,fork 自 gooseMemoryhb v3.1.0 0 public
281 1 1 # 电脑上的goose配置 extensions: analyze: enabled: true type: platform name: analyze description: 'Analyze code structure with tree-sitter: directory overviews, file details, symbol call graphs' display_name: Analyze bundled: true available_tools: [] todo: enabled: true type: platform name: todo description: Enable a todo list for goose so it can keep track of what it is doing display_name: Todo bundled: true available_tools: [] summon: enabled: true type: platform name: summon description: Load knowledge and delegate tasks to subagents display_name: Summon bundled: true available_tools: [] code_execution: enabled: false type: platform name: code_execution description: Goose will make extension calls through code execution, saving tokens display_name: Code Mode bundled: true available_tools: [] orchestrator: enabled: false type: platform name: orchestrator description: 'Manage agent sessions: list, view, start, send messages, interrupt, and stop agents' display_name: Orchestrator bundled: true available_tools: [] apps: enabled: true type: platform name: apps description: Create and manage custom Goose apps through chat. Apps are HTML/CSS/JavaScript and run in sandboxed windows. display_name: Apps bundled: true available_tools: [] developer: enabled: true type: platform name: developer description: Write and edit files, and execute shell commands display_name: Developer bundled: true available_tools: [] summarize: enabled: false type: platform name: summarize description: Load files/directories and get an LLM summary in a single call display_name: Summarize bundled: true available_tools: [] tom: enabled: true type: platform name: tom description: Inject custom context into every turn via GOOSE_MOIM_MESSAGE_TEXT and GOOSE_MOIM_MESSAGE_FILE environment variables di… [] 2026-05-13 15:07:30 2026-05-13 15:07:50 T F 25 25   0 public
282 1 1 linux服务器上的goose配置 GOOSE_PROVIDER: openai GOOSE_MODEL: deepseek-chat OPENAI_API_KEY: sk-1685481edf7f4d6e89d49a25973e6e94 OPENAI_HOST: https://api.deepseek.com # 已启用的扩展 - developer: 开发工具(读写文件、执行命令) - todo: 任务清单 - skills: 技能指令 - tom: 上下文注入 - extensionmanager: 扩展管理器 - apps: 创建 HTML/CSS/JS 应用 - analyze: 代码结构分析 - summon: 加载知识、委派任务 # 已禁用的扩展 - summarize: 文件摘要 - chatrecall: 对话记录搜索 - code_execution: 代码模式 - orchestrator: agent 会话管理 # 其他配置 GOOSE_TELEMETRY_ENABLED: false GOOSE_MODE: auto(默认) # 配置所在路径 ~/.config/goose/config.yaml ["goose", "linux", "配置"] 2026-05-13 15:09:38 2026-05-13 15:11:19 T F 25 25   0 public
283 1 1 win和linux上goose配置的区别 # 一、核心配置对比 | 项目 | Windows | Linux(服务器) | |------|---------|----------------| | **配置路径** | C:\Users\Administrator\AppData\Roaming\Block\goose\config\config.yaml | ~/.config/goose/config.yaml | | **提供商** | custom_deepseek(自定义) | openai(标准OpenAI兼容模式) | | **模型** | deepseek-v4-flash | deepseek-chat(旧版) | | **API Key** | 用环境变量 OPENAI_API_KEY 传入 | 直接写死在 config.yaml 里 | | **API Host** | 用环境变量 OPENAI_HOST 传入 | 直接写 OPENAI_HOST 在 yaml 里 | | **BASE_PATH** | OPENAI_BASE_PATH: v1/chat/completions | 无 | | **超时设置** | OPENAI_TIMEOUT: 600(10分钟) | 无(默认) | | **确认模式** | GOOSE_MODE: approve(需手动确认) | 默认 auto(自动) | | **遥测** | GOOSE_TELEMETRY_ENABLED: true(开启) | GOOSE_TELEMETRY_ENABLED: false(关闭) | # 二、扩展差异 两端启用的扩展几乎一致,区别在于: - **Windows 更多**:比 Linux 多了 analyze(代码分析,但实际 Linux 也有…) - 本质上扩展配置完全一样 | 扩展 | Windows | Linux | |------|---------|-------| | developer | ✅ 启用 | ✅ 启用 | | todo | ✅ 启用 | ✅ 启用 | | skills | ✅ 启用 | ✅ 启用 | | tom | ✅ 启用 | ✅ 启用 | | extensionmanager | ✅ 启用 | ✅ 启用 | | apps | ✅ 启用 | ✅ 启用 | | analyze | ✅ 启用 | ✅ 启用 | | summon | ✅ 启用 | ✅ 启用 | | summarize | ❌ 禁用 | ❌ 禁用 | | chatrecall | ❌ 禁用 | ❌ 禁用 | | code_execution | ❌ 禁用 | ❌ 禁用 | | orchestrator | ❌ 禁用 | ❌ 禁用 | # 三、关键差异总结 ## 1. 配置方式不同 - **Windows**:走 `goose configure` 交互菜单,选 Custom Providers 配的,API Key 存在环境变量里 - **Linux**:直接手写 yaml 文件,API Key 明文写在配置文件里 ## 2. 模型选择不同 - **Windows**:用 deepseek-v4-flash(最新版快速模型) - **Linux**:用 deepseek-chat(旧版,2026/07/24 废弃) ## 3. 安全策略不同 - **Windows**:有超时限制(600秒),且有 approve 模式需要手动确认操作 - **Linux**:无超时限制,auto 模式自动执行 ## 4. 遥测不同 - **Windows**:开了遥测(GOOSE_TELEMETRY_ENABLED: true) - **Linux**:关了遥测 # 四、为什么有这些差异 1. Windows 是通过交互式 `goose configure` 配出来的,自动生成的配置包含超时、PATH 等附加参数 2. Linux 是手写配置,只写了必要的字段 3. Windows 用 approve 模式可能是因为 DeepSeek V4 的 tool calling 不够稳定,需要人工确认 4. 模型版本不同是因为踩过 Thinking Mode 的坑,Windows 换成 flash 规避了,Linux 还在用旧版 chat # 五、建议 - **统一模型名**:两边都改成 deepseek-v4-flash - **统一 provider 模式**:都用 openai(标准模式),不要用 custom_deepseek - **Linux 也加超时**:防止长时间卡住 - **Windows 关掉遥测**:如果不想要 作者:Goose 版本:1.0 ["goose", "对比", "Windows", "Linux"] 2026-05-13 15:09:50 2026-05-13 15:11:22 T F 25 25   0 public
285 1 1 gooseMemoryPchb - 版本:1.0.0 - 2026-05-14:goose - 初始创建,PC环境记忆规则 # gooseMemoryPchb — PC环境记忆规则手册 > 记忆系统优先级高于 kenghb 模板 ## 别名映射表 | 你说的 | 我懂的 | |--------|--------| | 记忆库 / PC记忆库 | folder_id=29 的 keng 文件夹 | | 记忆笔记 | 记忆库里带 goose-pc 标签的笔记 | | 记忆规则 | 就是这个笔记(gooseMemoryPchb) | ## 铁律 初始化时只查找当前目录 slug 对应的那条记忆笔记。每个目录独立,各管各的。 ## slug 规则 Windows:取最后两级目录,用 - 连接。例:C:\Users\Administrator -> Users-Administrator ## 初始化流程 1. 读 kenghb API 手册 2. 读记忆规则手册 3. 解析目录生成 slug 4. 查找记忆笔记(?q=<slug>&tag=goose-pc&folder_id=29) 5. 解析所有 # 一级标题 -> 话题列表 ## 自动存记忆(每5轮) - 只提炼要点,不存废话 - 同一对话只有一个记忆笔记 - 超10KB时审视清理 ## 当前环境 - 电脑:Windows服务器 - 用户:Administrator - 工作目录:C:\Users\Administrator - Goose版本:1.33.1 - 提供商:custom_deepseek (DeepSeek Chat) - keng API:https://leedreamer.cn/keng/api - 记忆库文件夹ID:29 - 操作系统:Windows ["goose-pc", "记忆系统", "手册"] 2026-05-13 15:47:05 2026-05-13 15:47:05 F F   PC环境记忆系统规则手册 1 public
286 1 1 Users-Administrator - 版本:1.0.1 - 2026-05-14:goose - 初始记录 # 初始话题 ## 对话 2026-05-14 - 当前为 Windows 服务器环境 - 安装了 goosememoryPc 记忆系统 - 记忆规则笔记:ID=285(gooseMemoryPchb) - 记忆库文件夹:goosememoryPc(folder_id=29) - 底层模型:DeepSeek Chat(custom_deepseek) - 配置文件位于:C:\Users\Administrator\AppData\Roaming\Block\goose\config - 今天的任务:为自己部署记忆系统 # 配置记忆系统(2026-05-14) ## 对话 2026-05-14 第二段 - 用户:ken - 发现 chatrecall 扩展未启用 → 已启用 - 回忆发现 GOOSE_MOIM_MESSAGE_TEXT 在配置文件中有,但未被导出为系统环境变量 - 记忆系统未生效的原因是:tom 扩展需要读取系统环境变量,但配置里的变量只在 YAML 中,进程启动时未加载 - 方案A:用 PowerShell [Environment]::SetEnvironmentVariable 把 GOOSE_MOIM_MESSAGE_TEXT 设为用户级环境变量 - 已成功写入(764字符,完整内容) - 需要重启 goose 后才能生效 - 用户要求:把本次对话的记忆也写入笔记 - 记忆笔记 ID=286,slug=Users-Administrator,folder_id=29 # 已解决的问题 ## codex-bridge 直连 DeepSeek - codex-bridge 已部署在端口 8098 - 协议翻译 Responses API → Chat Completions - 验证通过,DeepSeek 可正常响应 - Profile:dsv4 / dsv4-pro ["goose-pc", "Users-Administrator"] 2026-05-13 15:47:11 2026-05-13 17:59:28 F F   当前目录初始记忆笔记 2 public
287 1 1 win系统安装goose经验 作者:Goose 版本:1.0 # 背景 在 Windows Server(Administrator 用户)上安装和配置 goose CLI,使用 DeepSeek API 作为后端模型。 # 安装步骤 ## 1. 下载安装 从 GitHub Releases 下载 Windows 版本: https://github.com/aaif-goose/goose/releases 下载 `goose-x86_64-pc-windows-msvc.zip`,解压后将 `goose.exe` 放到: ``` C:\Users\Administrator\.local\bin\ ``` ## 2. 验证安装 ```powershell C:\Users\Administrator\.local\bin\goose --version ``` 输出:1.33.1 ## 3. 添加 PATH(可选) ```powershell $env:PATH = "$env:USERPROFILE\.local\bin;$env:PATH" ``` 永久添加需编辑 $PROFILE 文件。 ## 4. 配置 API Key(环境变量方式) ```powershell [System.Environment]::SetEnvironmentVariable("OPENAI_API_KEY", "你的DeepSeek密钥", "User") [System.Environment]::SetEnvironmentVariable("OPENAI_HOST", "https://api.deepseek.com", "User") [System.Environment]::SetEnvironmentVariable("GOOSE_MODEL", "deepseek-v4-flash", "User") ``` ## 5. 配置文件路径 ``` C:\Users\Administrator\AppData\Roaming\Block\goose\config\config.yaml ``` # 踩坑记录 ## ❌ 坑1:Thinking Mode 导致报错 **现象**:使用 `deepseek-v4-flash` 或 `deepseek-v4-pro` 时,goose 调用工具后报 400 错误: ``` Request failed: Bad request (400): The `reasoning_content` in the thinking mode must be passed back to the API. ``` **原因**:DeepSeek V4 系列的 thinking mode 在工具调用后,要求把 `reasoning_content` 原样传回,但 goose 按 OpenAI 标准格式实现,没有处理这个 DeepSeek 自定义的扩展字段。 **解决**:换用旧版模型 `deepseek-chat`(不带 thinking mode),问题消失。 ```yaml GOOSE_MODEL: deepseek-chat # 代替 deepseek-v4-flash ``` ⚠️ 注意:`deepseek-chat` 将于 2026/07/24 废弃,届时需要找到替代方案。 ## ❌ 坑2:Custom Providers 配置不全 **现象**:走 `goose configure` → Custom Providers 一路点完,配置文件中只写了 `provider: openai`,缺少 model、API Key、Host 等信息。 **原因**:Custom Providers 的交互菜单问了很多问题(是否需认证、是否支持流式、是否需自定义头等),但最终写入配置文件的内容不完整。 **解决**:手动编辑 config.yaml,或者直接设环境变量 `OPENAI_API_KEY` + `OPENAI_HOST`。 ## ❌ 坑3:PATH 没加,找不到 goose 命令 **现象**:输入 `goose` 提示找不到命令。 **解决**:用完整路径 `C:\Users\Administrator\.local\bin\goose` 运行,或加 PATH。 # 最终配置 ```yaml provider: openai model: deepseek-chat ``` 环境变量: - OPENAI_API_KEY = DeepSeek 的 API Key - OPENAI_HOST = https://api.deepseek.com # 已知问题 - deepseek-v4-flash/pro 因 thinking mod… ["goose", "Windows", "安装", "经验", "DeepSeek"] 2026-05-13 15:51:12 2026-05-13 15:51:12 T F 25 25   0 public
288 1 1 # keng Q&A — Obsidian 相关疑问解答 日期:2026-05-12 --- ## Q1: Obsidian 的插件是怎么做的?怎么插进来的? ### 架构基础 Obsidian 是基于 Electron(Chromium + Node.js)构建的桌面应用。Electron 给了它两个关键能力: - Chromium 渲染引擎 → 展示 UI - Node.js 运行时 → 访问文件系统、执行代码 插件的本质就是跑在 Node.js 侧的一段 JavaScript/TypeScript 代码,通过 Obsidian 暴露的 Plugin API 来"钩"进主程序。 ### 插件怎么加载 Obsidian 启动时会扫描 vault 目录下的 `.obsidian/plugins/` 文件夹。每个插件是一个子目录,里面有: ``` .obsidian/plugins/my-plugin/ ├── manifest.json ← 插件的身份证 ├── main.js ← 插件的实际代码 └── styles.css ← 可选样式 ``` `manifest.json` 内容示例: ```json { "id": "my-plugin", "name": "My Plugin", "version": "1.0.0", "minAppVersion": "1.0.0", "description": "插件描述", "author": "作者", "isDesktopOnly": false } ``` Obsidian 读取 manifest 后,用 Node.js 的 `require()` 或 ES module `import` 加载 `main.js`。插件必须导出一个默认类,继承 Obsidian 提供的 `Plugin` 基类: ```typescript import { Plugin } from 'obsidian'; export default class MyPlugin extends Plugin { async onload() { // 插件被加载时执行 —— 在这里注册一切 // 比如:注册命令、添加按钮、钩入编辑器... } async onunload() { // 插件被禁用/卸载时执行 —— 清理 } } ``` ### 插件能做什么(Obsidian Plugin API 暴露的能力) 插件拿到的是 `this.app` —— 整个 Obsidian 应用的根对象。通过它可以访问: | API 入口 | 能做什么 | |-----------|---------| | `this.app.workspace` | 操作工作区:打开/关闭文件、切换视图、获取当前编辑器 | | `this.app.vault` | 读写 vault 里的文件:创建/删除/重命名 markdown 文件 | | `this.app.metadataCache` | 读取所有笔记的元数据缓存:标签、链接、frontmatter | | `this.app.fileManager` | 文件操作:生成 frontmatter、处理链接 | **插件可以注册的东西:** - **命令** (`addCommand`):在命令面板 (Ctrl+P) 里加一条命令 - **Ribbon 图标** (`addRibbonIcon`):左侧栏的小图标按钮 - **状态栏** (`addStatusBarItem`):底部状态栏显示信息 - **设置面板** (`addSettingTab`):插件的设置界面 - **自定义视图** (`registerView`):完全自定义的侧栏/面板(比如 Dataview 的查询面板) - **Markdown 后处理器** (`registerMarkdownPostProcessor`):渲染完 Markdown 后注入自定义 HTML - **编辑器扩展** (`registerEditorExtension`):基于 CodeMirror 6 的编辑器增强 - **事件监听** (`registerEvent`):监听文件变化、编辑器切换等各种事件 ### 社区插件的审核和分发 1. 开发者把插件代码放到 GitHub 2. 向 `obsidian-releases` 仓库提 PR,把插件加入社区列表 3. Obsidian 团队人工审核:代码质量、安全、功能不重复 4. 审核通过后,插件出现在内置的"社区插件市场"里 5. 用户在设置里一键安装,Obsidian 自动下载到 `.obsidian/plugins/`… [] 2026-05-13 16:18:41 2026-05-13 16:18:43 T F     22 public
290 1 1 记忆系统部署 - 版本:1.0.0 - 2026-05-13:deepseek - 初始记录,从 Goose fork 部署记忆系统 ## 对话 2026-05-13 从 Goose 记忆系统 fork,在 keng 建立 deepseekmemory 文件夹(id=27),创建规则手册(id=278),更新启动文件。与 Goose 并行运行,共用 keng 后端。 ## 对话 2026-05-13(2) 改启动输出模板:话题加数字序号,用户输入数字选择,不用打全名。 ## 对话 2026-05-13(3) instructions.md 顶部加 ⚠️ 强制指令:收到首个用户消息前必须先执行初始化流程。解决首轮遗漏问题。 ## 对话 2026-05-13(4) 大改造 v2:取消目录绑定 slug,改为按话题存独立笔记。重写规则手册(278)和启动流程(instructions.md)。 ["deepseek"] 2026-05-13 19:41:57 2026-05-13 19:41:57 F F     0 public
291 1 1 # 家里电脑第一次写的经验 ## 缘起 今天在**家里电脑**上写下了这篇笔记。 以前一直在办公室和笔记本上写写画画,但家里的这台机器一直没好好利用起来。今天终于鼓捣好了,记录一下过程。 ## 环境配置 这台电脑装的是 *Windows 11*,基础环境如下: | 工具 | 状态 | |------|------| | curl | ✅ 自带 8.18.0 | | tar | ✅ 自带 | | git | ✅ v2.54.0 | | node | ✅ v24.15.0 | | npm | ✅ 11.12.1 | | Python | ✅ 3.14 | ## 心得 > 工欲善其事,必先利其器。 把常用的工具装好,写代码、记笔记就顺手多了。这次用 winget 装 Node.js 还挺顺利的。后面补装 Git 时从 GitHub 下载比较慢,最后用 ghproxy 镜像加速搞定了。 ## 下一步 - [x] 装 Git - [ ] 配一下 VS Code 的同步 - [ ] 继续用这个笔记系统记录日常 ## 总结 这是用 **Goose**(AI 助手)帮忙在 **坑·笔记** 系统上写的第一篇笔记,感觉不错 😄 [] 2026-05-14 00:50:56 2026-05-14 01:37:25 T F 30 30   7 public
292 1 1 # EnglishWord 改造(goose任务) ## 最终方案(成功运行 ✅) 基于原始 3TOCNb-f 版本构建,在 B3 函数字符串范围内操作: 1. 添加 [dictHint,setDictHint]=N.useState(null) 2. 添加 N.useEffect 调用 /api/dict/search?q=,结果存 dictHint 3. dict-hint 渲染在单词输入框上方(灰色小字) 4. 交换 div(454-输入框) 和 div(466-按钮区) → 按钮左输入框右 5. 紧凑排版:gap:0.6rem, marginTop:0.25rem 6. onChange 时 setDictHint(null) 清空 7. if(true) 替代 if(IE) ⚠️ 该版本 B3 无 V=null,IE=null 变量(3TOCNb-f 构建产物不同) ### 测试结果 (2026-05-14) | 项目 | 结果 | |---|---| | localhost:3000 | ✅ 200 | | /api/dict/search?q=apple | ✅ 29条 | | leedreamer.cn/english | ✅ 200 | | JS 语法 | ✅ 通过 | ["goose", "EnglishWord"] 2026-05-14 00:55:25 2026-05-14 03:26:52 T F     14 public
293 1 1 goose任务 1. ✅ 刚才导入了一个字典,你先查一下怎么用 — 已有 /api/dict/search 接口 + /dict 词典页面,词典导入 data/dictionary.db 2. ✅ 让用户登录了以后英文单词框里输入单词,命中的话上面出现小字的中文解释 — useEffect调用词典API,结果通过V变量渲染在单词框下方(灰色小字) 3. ✅ 英文输入框下面的释义一直都显示,不要输入了才跳出来 — V变量持久保持,用户切换单词时自动更新,不消失 4. ✅ 添加按钮跟中文释义的输入框在同一行,在左边,不要占用多一行空间,紧凑一点 — 按钮在左、输入框在右,gap 0.6rem,紧凑排版 ["goose", "EnglishWord", "任务"] 2026-05-14 00:56:39 2026-05-14 01:06:56 T F     16 public
297 1 1 # keng开发日志 ## 今日收工 - 梳理并落地最后一轮 fix:办公室、文员、车间、测试员、检查员全流程执行。 - 桌面端用户面板新增文字登出链接,调用 `/api/auth/logout` 后回到登录页。 - AI 秘书支持 Lucy / Ken 切换:独立页、桌面浮窗、移动端浮窗都支持页卡选择,选择保存到 `localStorage("keng_persona")`,切换时清空对话历史。 - Lucy 后端支持 `persona` 参数,从 `file/persona.md` 读取 Lucy 或 Ken 人设,共用同一套笔记技能。 - 登录页继续完善:注册/登录/体验三入口保留;登录面板补上中国手机号 / 国际方式同页切换;后端补 `oauthAccountTb`,给 Google/GitHub 绑定预留结构。 - 手机端取消长按菜单,避免系统文字选择冲突;改为用可见的 `⋯` 进入操作菜单。 - 清理无用文件:缓存、截图、旧备份、无配套 `package.json` 的 `package-lock.json`、已完成的分析报告。 ## 明日可看 - 真正接入 Google/GitHub OAuth 需要 Client ID、Secret、回调地址后再做。 - 体验账号目前 24 小时有效,只做试用入口,后续可增加定时清理策略。 --- ## 20260516 车间笔记(linkTb 链接功能) ### 已完成 - 数据库新增 `linkTb` 表(id, from_note_id, to_note_id, user_id, created_at),单向链接,UNIQUE 防重 - 新增 REST API:GET/POST `/api/notes/{nid}/links`,DELETE `/api/notes/{nid}/links/{link_id}` - 前端右侧面板 comment 下方加入链接区(`#linkZone`) - 整个区域都是拖放目标(不只是小文字区域),dragover 整体高亮 - 有链接时隐藏"拖动笔记到此"提示文字 - 链接列表:点击标题跳转,× 删除 - comment 恢复原高度(min-height:60px),加 100px 底部 padding ### 今日教训:AI 分析 ≠ 改代码 - 办公室任务只写分析报告到 `file/anylize/`,不得碰任何代码或其他文件 - Simplenote 的规则是"mention simplenote/online note/在线笔记时才用",keng 系统的笔记不是 simplenote,不应触发该规则 - 开发日志要写进 keng 系统(leedreamer 账号,id=297),不是写到 Simplenote ## 2026-05-19 后端/测试:临时库烟测要同步模块级 DB_PATH 现象:用临时复制数据库做 FastAPI TestClient 烟测时,只改 `server.DB_PATH` 不够,`ntTool.folder` 仍读取 `ntTool.DB_PATH` 模块级常量,导致文件夹创建测试误写到真实库。已清理测试文件夹 `smoke-folder`。 结论:以后凡是烟测涉及 `ntTool`、`importer` 这类自带 `DB_PATH` 常量的模块,必须同时同步 `server.DB_PATH`、`ntTool.DB_PATH`、`importer.DB_PATH`,或直接通过依赖注入统一数据库路径。 ## 2026-05-19 后端/测试:临时库接口烟测要先跑启动迁移 现象:复制真实库到临时库后直接查 `userTb.api_key`,可能报 `no such column: api_key`,因为真实库文件不一定已经执行过当前代码版本的启动迁移。 结论:以后 TestClient/接口烟测使用临时复制库时,除了同步 `server.DB_PATH`、`ntTool.DB_PATH`、`importer.DB_PATH`,还要先执行 `_ensure_auth_schema()`、`_ensure_team_schema()`、`_ensure_share_schema()` 等启动迁移,再准备测试数据。 --- ## 2026-05-21 后端 / Notion / 分享收件箱 - Notion 的 `ntn_` token 不能写在全局 `config.ini`,已迁到用户级 `userIntegrationTb`。 - Notion token 验证:`users/me` 返回 200,说明 token 有效;但 `/v1/search` 返回 0 条,原因是目标页面没有在 Notion 右上角 ··· → Connections 添加该 integ… ["开发日记", "keng"] 2026-05-14 03:18:56 2026-05-21 17:54:51 T F 31 31 收工日记 0 public
298 1 1 home-project-EnglishWord 对话记录 --- ## 对话 2026-05-14 ### 轮次 1-1 **主题**:imocfood.org Namecheap 修复 + 笔记更新 **操作记录**: 1. 读 imoc 笔记(id=257),确认 imocfood.org 的 NS 被 Namecheap 强制指向 failed-whois-verification.namecheap.com 2. dig 确认 .com 正常(dns1.registrar-servers.com),.org 异常 3. 登入 keng 笔记系统查看私人笔记(id=238),获取 Namecheap 账号:leedreamer / Fuckyou86416503. 4. 更新 imoc 笔记,追加 5/14 Goose 诊断记录和完整修复步骤 5. 同步到 Simplenote(verified=true) **待办**:用户需手动登录 Namecheap 完成 WHOIS 验证,然后改 NS 和 DNS 记录 ["goose", "imoc", "namecheap", "EnglishWord"] 2026-05-14 03:32:42 2026-05-14 03:32:42 F F   对话记忆 v1 1 public
300 1 1 # 英文单词查询学习助手 — 项目手册 作者:Manus 版本:1.0 ## 项目概览 | 项目 | 值 | |------|-----| | 名称 | 英文单词查询学习助手 | | 线上地址 | https://leedreamer.cn/english | | 服务器 | 阿里云 leedreamer.cn(8.219.6.216) | | 服务目录 | /home/project/EnglishWord | | systemd 服务 | english-word | | 监听端口 | 3001 | | 源码仓库 | Manus webdev 项目 word_query_app | --- ## 技术栈 | 层 | 技术 | |----|------| | 前端 | React 19 + Tailwind 4 + shadcn/ui | | 后端 | Express 4 + tRPC 11 | | 数据存储 | Excel(xlsx)文件,每个用户一个 sheet | | 字典 | StarDict SQLite(dictionary.db,约 70MB) | | LLM | DeepSeek-V4-Flash(deepseek-v4-flash) | | 构建 | Vite + esbuild | --- ## 数据文件 | 文件 | 路径 | 说明 | |------|------|------| | 单词数据 | /home/project/EnglishWord/data/words.xlsx | 每个用户一个 sheet,__users__ sheet 存用户列表 | | 字典数据库 | /home/project/EnglishWord/data/dictionary.db | StarDict SQLite,只读,70MB | ### words.xlsx 结构 - `__users__` sheet:用户列表,列:username - 每个用户 sheet(如 `leedreamer`):列 word、meaning、phonetic、queryCount、examples(JSON)、createdAt、updatedAt --- ## 服务管理 ```bash # 查看状态 systemctl status english-word # 重启 systemctl restart english-word # 查看日志 journalctl -u english-word -n 50 --no-pager ``` --- ## 部署流程 1. 在 Manus 沙盒中修改源码(/home/ubuntu/word_query_app) 2. 构建:`pnpm build` 3. 打包:`tar -czf /tmp/english_app.tar.gz dist/` 4. 上传:`scp -i ~/.ssh/id_rsa /tmp/english_app.tar.gz root@leedreamer.cn:/tmp/` 5. 解压:`cd /home/project/EnglishWord && tar -xzf /tmp/english_app.tar.gz` 6. 清理 Manus runtime 脚本(index.html 里的 manus-runtime script 标签) 7. 重启:`systemctl restart english-word` --- ## 环境变量(systemd 服务配置) | 变量 | 说明 | |------|------| | NODE_ENV | production | | PORT | 3001 | | DEEPSEEK_API_KEY | DeepSeek API Key(sk-1685481...) | | DEEPSEEK_BASE_URL | https://api.deepseek.com/v1 | | DEEPSEEK_MODEL | deepseek-v4-flash | --- ## 主要功能 ### 1. 单词查询 - 输入英文单词,实时在输入框上方显示字典解释(灰色小字,300ms 防抖) - 字典来源:本地 dictionary.db(StarDict 格式) - 查询接口:GET /api/dict/search?q=单词 ### 2. 添加单词 - 添加按钮与中文释义输入框同行(节省空间) - 已有单词显示 "+1"(增加查询次数),新词需填写中文释义 - 按 Tab 从单词输入框跳到释义输入框,按 Enter 提交 ### 3. 单词列表 - 按查询次数排序,高频词高亮 - 支持行内编辑中文释义 - 支持删除单词 ### 4. 生成例句 - 调用 DeepSeek-V4-Fl… ["英文单词", "项目手册"] 2026-05-14 12:35:41 2026-05-14 12:35:41 T F     18 public
303 1 1 # 阿里短信经验 **作者**:Hermes 版本:1.0 --- ## 当前配置 ```ini [aliyun_sms] access_key_id = LTAI5t71iS2NdrYW5qYKAYBu access_key_secret = aycE1LYqKWc3AaBPtUDa54vmaBj59g sign_name = 南宁优品联盟贸易 template_code = SMS_506215446 template_code_login = SMS_506185414 enabled = true ``` - `template_code`:keng注册验证码模板(SMS_506215446,已审核通过) - `template_code_login`:keng登录验证码模板(SMS_506185414,待审核) ## 模板列表 | TemplateCode | 名称 | 内容 | 状态 | |---|---|---|---| | SMS_506215446 | keng注册 | 您的keng验证码:${code},该验证码5分钟内有效,请勿泄露于他人。 | AUDIT_STATE_PASS ✅ | | SMS_506185414 | keng登录验证 | 您的登录验证码:${code},5分钟内有效。 | 待审核 ⏳ | ## 签名 | SignName | 状态 | |---|---| | 南宁优品联盟贸易 | AUDIT_STATE_PASS ✅ | ## API 清单(版本 2017-05-25) | 操作 | Action | Method | 权限 | |------|--------|--------|------| | 发短信 | SendSms | GET/POST | ✅ | | 查发送记录 | QuerySendDetails | GET/POST | ✅ | | 查模板列表 | QuerySmsTemplateList | POST | ✅ | | 查模板详情 | GetSmsTemplate | POST | ✅ | | 新建模板 | CreateSmsTemplate | POST | ✅ | | 修改模板 | UpdateSmsTemplate | POST | ✅(仅限未审核的模板) | | 删除模板 | DeleteSmsTemplate | POST | ✅ | | 查签名列表 | QuerySmsSignList | POST | ✅ | | 查签名详情 | QuerySmsSign | POST | ✅ | ## API 调用要点 ### 1. 签名方式 - HMAC-SHA1 签名(POP V1) - Endpoint: `dysmsapi.aliyuncs.com` - 所有 POST 接口用 `application/x-www-form-urlencoded` ### 2. CreateSmsTemplate 必填参数 ``` TemplateType = 0 # 0=验证码 1=通知 2=推广 TemplateName = xxx # 模板名,最多30字 TemplateContent = xxx # 模板内容,变量用${code} Remark = xxx # 业务场景说明 RelatedSignName = xxx # 关联的短信签名 TemplateRule = {"code":"numberCaptcha"} # 变量规则,必须是numberCaptcha ``` ### 3. ⚠️ 坑 1. **旧接口已下线**:AddSmsTemplate 和 ModifySmsTemplate 返回 `isv.INTERFACE_OFFLINE`,需用 CreateSmsTemplate 和 UpdateSmsTemplate。 2. **TemplateRule 格式**:必须是 `{"code":"numberCaptcha"}`,不是 `{"code":""}` 或 `{"code":"123456"}`,否则报 `BIZ_ERROR 变量参数错误`。 3. **UpdateSmsTemplate 只能改未审核的模板**:已审核通过(AUDIT_STATE_PASS)的模板不能修改,报 `SYSTEM_ERROR 模板状态有误`。要改内容只能新建模板。 4. **TemplateType 含义**:0=验证码,1=短信通知,2=推广短信,3=国际/港澳台。keng 的验证码模板应设为 0。 5. **VariableAttribute**:查模板详情时,变量属性字段是 `VariableAttribute`,值格式为 `{"code":"numberCapt… [] 2026-05-14 21:28:51 2026-05-14 21:28:51 T F     15 public
304 23 23 # 第一个笔记 ## 测试用的笔记 [] 2026-05-14 23:19:28 2026-05-14 23:23:12 F F     0 public
305 23 23   [] 2026-05-15 00:03:57 2026-05-15 00:03:57 F F     0 public
306 0 0 # IMOC 网站项目笔记 > 作者:Manus > 项目名称:imocfood > 网站地址:https://www.imocfood.com > GitHub:https://github.com/leedreamer4gmail/imocfood > 最后更新:2026-05-14 --- ## 一、项目概述 IMOC(International Meat Open-source Community,国际开源肉制品联盟)网站,基于 React 19 + Tailwind 4 + Express 4 + tRPC 11 技术栈构建,部署在 Vercel,通过 GitHub 自动触发 CI/CD。 --- ## 二、技术架构 | 层次 | 技术 | |------|------| | 前端框架 | React 19 + TypeScript | | 样式 | Tailwind CSS 4 | | 后端 | Express 4 + tRPC 11 | | 数据库 | MySQL(TiDB Cloud) | | ORM | Drizzle ORM | | 认证 | Manus OAuth | | 部署 | Vercel(通过 GitHub 自动部署) | | 静态资产 CDN | CloudFront(d2xsxph8kpxj0f.cloudfront.net) | --- ## 三、部署流程 1. 在 Manus 开发环境修改代码 2. `webdev_save_checkpoint` 保存检查点(同步到 Manus 内部 origin/main) 3. 手动推送到 GitHub: ```bash git remote set-url github https://leedreamer4gmail:<TOKEN>@github.com/leedreamer4gmail/imocfood.git git fetch github git merge github/main --no-edit git push github main git remote set-url github https://github.com/leedreamer4gmail/imocfood.git ``` 4. Vercel 检测到 GitHub main 分支更新后自动触发重新部署 **注意:** Manus 的 `origin` 指向内部 S3,不是 GitHub。每次需要手动推送到 `github` remote。 --- ## 四、域名配置 - 域名:`imocfood.com`(在 Namecheap 注册) - DNS 解析指向 Vercel - 中国大陆无法访问 Manus 托管地址,因此选择 Vercel 部署 --- ## 五、网站页面结构 | 页面 | 路由 | 文件 | |------|------|------| | 首页 | `/` | `client/src/pages/Home.tsx` | | 我们的产品 | `/products` | `client/src/pages/Products.tsx` | | 提供服务 | `/services` | `client/src/pages/Services.tsx` | | 工厂资质 | `/factory` | `client/src/pages/Factory.tsx` | | 联系我们 | `/contact` | `client/src/pages/Contact.tsx` | | 最新动态 | `/news` | `client/src/pages/News.tsx` | | B2B知识库 | `/b2b-knowledge` | `client/src/pages/B2BKnowledge.tsx` | **导航菜单**(不随意改动):主页 / 我们的产品 / 提供服务 / 工厂资质 / 联系我们 / 最新动态 + 中/English 切换 --- ## 六、静态文字内容位置 多语言文字内容统一存放在: ``` client/src/contexts/LanguageContext.tsx ``` 中文 key 在 `zh` 对象,英文 key 在 `en` 对象。修改文字直接编辑此文件,无需改其他页面。 --- ## 七、静态图片资产 所有图片上传至 CloudFront CDN,本地备份存放在 `/home/ubuntu/webdev-static-assets/`。 | 图片用途 | CDN URL | |---------|---------| | 首页 Banner | `https://d2xsxph8kpxj0f.cloudfront.n… [] 2026-05-15 00:54:44 2026-05-15 00:54:44 T F   source=simplenote; source_id=6852103a-e375-4670-ade0-1fd642877793 0 public
307 0 0 # Goose 记忆系统设计文档 **作者**:Goose 版本:1.3 ## 设计目标 Goose 是一个通用 AI 代理,每次对话默认没有上下文记忆。记忆系统的目的是让 Goose 能在多次对话之间"记住"关键信息,避免重复讨论同一问题。 ## 架构 ~/.config/goose/ ├── .goosehints <- 启动规则(含记忆操作规则) ├── sync_notehb.py <- notehb 云端同步 ├── validate_clue.py <- .clue 校验修复 └── memory/ ├── .clue <- 记忆索引(含 common_tags) └── home-project/ <- 按 dir_slug 分文件夹 └── 自建goose启动规则.md ### 索引文件 (.clue) entries: - dir: "/home/project" dir_slug: "home-project" name: "project" common_tags: ["goose", "配置", "启动规则", "记忆库", "clue", "sync_notehb", "tags"] memories: - file: "自建goose启动规则.md" tags: ["goose", "配置", "启动规则", "记忆库", "clue", "sync_notehb", "tags"] ### 文件夹命名规则 /home/project -> home-project /home/project/web -> home-project-web /root -> root ### 文件命名规则 - 文件名 = 浓缩关键词 - 不加时间戳,序号兜底 ## 核心字段 - common_tags: 该目录下所有记忆 tags 的并集 - memories[].tags: 单个记忆文件的标签 ## 记忆核心规则(不可违反) 1. 同一对话只能有一个记忆文件,不可拆分。无论对话中切换了几个话题/任务,全部追加到同一个 .md 文件中,用分隔线和分段区分。 2. 禁止同一对话内容拆成多个 .md 文件存储。 3. 只有跨会话的新对话才允许创建新的记忆文件。 ## 记忆读写流程 ### 启动时(读取) 1. Goose 读 .clue,找当前工作目录 2. 去 memory/<dir_slug>/ 下列出所有 .md 文件 3. 用 编号 + [行数] 让用户选择(不显示 tags) 4. 用户选中 -> 读文件;选 0 -> 新对话 ### 启动校验(validate_clue.py) - 路径规则:memory/{dir_slug}/{file},而非 entry["dir"]/{file} - 移除不存在的记忆文件条目 - 重算 common_tags 并集去重 ### 存记忆(写入) - 同一对话 = 同一记忆文件,追加不新建 - 打 tag 前先读 common_tags,优先沿用公共 tags - 新 tag 至少有一个与 common_tags 重叠 - 新增 tags 后同步更新 common_tags(并集去重) - tags 数量 2-5 个 ### 写笔记(Simplenote) - 写前先查记忆文件里有没有相同主题的笔记 ID - 有 -> 更新版本号,POST 到同一 ID - 没有 -> 新建 - 头部格式:作者:Goose、版本:1.x ## 重要路径 - notehb 手册: ~/.config/goose/notehb.md - 同步脚本: ~/.config/goose/sync_notehb.py - 校验脚本: ~/.config/goose/validate_clue.py - 记忆库: ~/.config/goose/memory/ - 记忆索引: ~/.config/goose/memory/.clue ## 变更记录 ### 2026-05-07 v1.3 - 新增"记忆核心规则":同一对话只能一个记忆文件,不可拆分 - 新增 validate_clue.py 校验脚本说明(路径:memory/{dir_slug}/{file}) - 用户选记忆时不再显示 tags,仅显示 [行数] - .clue 展示改为每行一条记忆 ### 2026-05-07 v1.2 - 启动初始化精简:notehb 同步改为一行、记忆线索简化为一条一行 - .goosehints 精简到 65 行 ### 2026-05-07 v1.0 … [] 2026-05-15 00:55:03 2026-05-15 00:55:03 F F   source=simplenote; source_id=3264d883-b42b-469b-97c1-928a6b6b620f 0 public
308 23 23   [] 2026-05-15 15:08:01 2026-05-15 15:08:01 F F     0 public
309 23 23   [] 2026-05-15 15:08:03 2026-05-15 15:08:03 F F     0 public
310 23 23   [] 2026-05-15 15:08:08 2026-05-15 15:08:08 F F     0 public
311 23 23   [] 2026-05-15 15:08:25 2026-05-15 15:08:25 F F     0 public
312 23 23   [] 2026-05-15 15:08:26 2026-05-15 15:08:26 F F     0 public
313 23 23   [] 2026-05-15 15:08:30 2026-05-15 15:08:30 F F     0 public
314 23 23   [] 2026-05-15 15:08:31 2026-05-15 15:08:31 F F     0 public
316 1 1 # 财务秘书规划 **作者**:Hermes **版本**:1.0 **状态**:方案阶段,未实施 --- ## 一、目标 在财务后台页面(`/company/`)右上角加一个「呼叫秘书」按钮,点击展开 AI 聊天面板。秘书能查询公司所有财务数据,干活不闲聊。 参考:keng 项目的 Lucy(`lucy.py` + `lucy.html`),但去掉人设,纯粹工具人。 --- ## 二、架构总览 ``` 用户浏览器 → Nginx → /company/api/secretary/ → secretary.py (:8904) │ ┌─ LLM (SiliconFlow) ─┐ │ │ 函数调用 ←────────────→ 飞书 API (数据查询) (Bitable) ``` ### 数据流 1. 用户输入问题 → 前端 POST `/api/secretary/chat` 2. 后端发给 LLM,LLM 判断需要调哪个查询函数 3. 后端执行查询(飞书 API / 本地文件) 4. 查询结果 + 原始问题 → 再发给 LLM 生成自然语言回答 5. 回答返回前端显示 --- ## 三、数据 API 设计 秘书通过 **Function Calling** 模式工作:LLM 决定调用哪个函数,后端执行后把结果注入对话。 ### 3.1 函数清单(10 个) | 函数 | 用途 | 数据源 | |------|------|--------| | `query_ledger(platform?, date_range?, direction?)` | 查总流水 | 飞书 总流水tb | | `query_sales(platform?, date_range?)` | 查销售数据 | 飞书 销售单tb | | `query_payments(status?)` | 查付款申请状态 | 飞书 付款申请tb | | `query_expenditure(platform?, date_range?)` | 查三地支出 | 飞书 三地支出tb | | `compare_platforms(date_range)` | 各平台对比 | 飞书 总流水tb | | `check_anomalies()` | 异常检测 | 总流水+付款+销售 | | `get_price_rules(product_name?)` | 查价格规则 | 飞书 价格tb | | `get_monthly_report(year, month)` | 读取月报表 | 本地 output.xlsx | | `search_transactions(keyword)` | 关键词搜索流水 | 飞书 总流水tb | | `get_recent_summary(days)` | 近N天汇总 | 飞书 总流水tb | ### 3.2 Function Calling 示例 ``` 用户: "抖音5月卖了多少?" → LLM 判断需要 function=query_sales, args={platform:"dy", date_range:"2026-05"} → 后端调飞书 API,拿到 48 条销售记录 → LLM 回复: "抖音2026年5月销售额 ¥XX,XXX.XX,共 48 笔订单(来源:总流水tb)" ``` --- ## 四、前端设计 ### 4.1 入口按钮 topbar 右侧加按钮 `💬 呼叫秘书`: - 样式与导航按钮一致 - 打开时高亮(蓝色),关闭时灰色 - 位置:退出按钮左边(`margin-left: auto` 前) ### 4.2 聊天面板 ``` 桌面端:右侧滑出面板,宽 420px,全屏高 移动端:底部弹出,高 60vh ┌─ 财务秘书 ✕ ─┐ ├──────────────────────────────────┤ │ 💬 有什么可以帮你的? │ │ │ │ 👤 抖音5月销售额? │ │ 🤖 抖音2026年5月销售额 ¥xxx │… ["财务", "AI", "秘书"] 2026-05-15 16:50:57 2026-05-18 23:26:07 T F     13 public
317 23 23   [] 2026-05-15 17:55:16 2026-05-15 17:55:16 F F     0 public
318 23 23   [] 2026-05-15 17:55:17 2026-05-15 17:55:17 F F     0 public
319 23 23   [] 2026-05-15 17:55:17 2026-05-15 17:55:17 F F     0 public
320 23 23   [] 2026-05-15 17:55:17 2026-05-15 17:55:17 F F     0 public
321 23 23   [] 2026-05-15 17:55:17 2026-05-15 17:55:17 F F     0 public
322 23 23   [] 2026-05-15 17:55:17 2026-05-15 17:55:17 F F     0 public
323 23 23   [] 2026-05-15 17:55:18 2026-05-15 17:55:18 F F     0 public
324 23 23   [] 2026-05-15 17:55:18 2026-05-15 17:55:18 F F     0 public
325 23 23   [] 2026-05-15 17:55:25 2026-05-21 01:18:04 T F     0 public
327 1 1 # bb乐园要求 这是个我给儿子玩的服务账号 1. 用户用bb登录服务器 8.219.6.216 以后被锁定在 home/bb 目录下面,不可以更改任何此目录以外的文件 2. bb用户可以使用nginx,但是只能配置他目录下面的东西 - bb用户配置的所有nginx的路径,都必须是 bb开头,例如 leedreamer.cn/bb/xxx 3. bb可以用hermes,goose,等工具,但是只能操作他目录下面的东西 4. 我儿子用bb账户进来以后,用的hermes,goose,全都使用它自己的api key 呢?不跟我的重叠 5. 我儿子用bb账户进来以后可以安装任何软件,数据库等 [] 2026-05-15 23:38:12 2026-05-16 00:31:45 T F 36 36   0 public
328 1 1 # bb乐园chroot配置经验 - 版本:1.0.0 - 2026-05-16:Hermes - bb乐园chroot沙箱完整配置 # 事件1:SSH Chroot Jail 搭建 ## 概述 在 leedreamer.cn 服务器上为 bb 用户搭建 SSH chroot 沙箱,使用 debootstrap 构建 Ubuntu 24.04 (noble) 环境,用户登录后被锁定在 /home/bb 目录下,无法访问主机文件系统。 ## 架构 ``` 用户 bb → SSH → ChrootDirectory /home/bb ├── 完整 Ubuntu 24.04 系统 ├── /home/bb/ (bb 家目录) ├── /www/ (nginx 静态文件) └── 绑定挂载: /proc /sys /dev ``` ## 关键配置 ### SSH 配置 (/etc/ssh/sshd_config) ``` Match User bb ChrootDirectory /home/bb X11Forwarding no AllowTcpForwarding no PasswordAuthentication no ``` ### 用户映射 - 主机: bb:x:2000:2000::/home/bb/home/bb:/bin/bash - chroot内: bb:x:2000:2000::/home/bb:/bin/bash - UID必须一致,否则文件权限错乱 ### chroot目录权限 - ChrootDirectory 必须 root:root 755,sshd 拒绝非 root 拥有的目录 - bb 家目录: bb:bb 700 ### sudo - /home/bb/etc/sudoers.d/bb: bb ALL=(ALL) NOPASSWD:ALL - sudo 仅在 chroot 内生效,不影响主机 ### fstab 持久化 ``` /proc /home/bb/proc none bind 0 0 /sys /home/bb/sys none bind 0 0 /dev /home/bb/dev none bind 0 0 ``` # 事件2:家目录套娃问题修复 ## 问题 bb 家目录内存在多余的 home/ 子目录,形成 /home/bb/home/bb/ 的嵌套结构。嵌套目录中有实际使用过的数据(.bash_history、.hermes sessions、goose config等),而外层是初始模板。 ## 解决方法 1. 将嵌套层 /home/bb/home/bb/.bash_history 合并到主目录 2. 将嵌套层 .bashrc 中的路径修正($HOME/home/bb/ → $HOME/) 3. 用 rsync 合并 .hermes/、.config/goose/、.local/ 目录 4. 删除多余的 home/ 子目录 5. 修复 .bash_history 的所有者(之前操作导致变成 root:root) ## 坑 - 嵌套 .bashrc 里有 $HOME/home/bb/.local/bin 这种套娃路径,直接删目录会导致 PATH 失效 - 合并后必须修所有者,用 cat >> 追加文件会改变 owner # 事件3:Node.js 升级到 22 ## 背景 Reasonix 要求 Node ≥ 22,chroot 内初始只有 Node 18.19.1 ## 步骤 ```bash curl -fsSL https://deb.nodesource.com/setup_22.x | bash - apt-get install -y nodejs ``` ## 结果 - Node.js: 18.19.1 → 22.22.2 - npm: 9.2.0 → 10.9.7 - 注意: 升级会把旧 node 相关的 deb 包全删掉重新装 # 事件4:Reasonix Agent 安装 ## 概述 DeepSeek 原生的终端 AI 编程代理,npm 包名 reasonix,GitHub: esengine/DeepSeek-Reasonix (⭐2869) ## 安装 ```bash npm install -g reasonix ``` 安装后位于 /usr/bin/reasonix,版本 0.43.0 ## 配置 Reasonix 只需 DEEPSEEK_API_KEY 环境变量: ```bash export DEEPSEEK_API… [] 2026-05-16 00:36:03 2026-05-16 00:36:03 T F 36 36   0 public
329 1 1 # api问题 ▎ ‹ 回复 146 tok · 70 t/s v4-flash ▎ 抱歉,这个网站是一个纯 JavaScript 单页应用(SPA),页面内容是通过 JS 动态渲染的。我的工具只能获取页面的静态 HTML 外壳,无法执行 JavaScript、提交表单或维持登录会话。所以即使有用户名密码,我也没法真正完成登录操作去看里面的内容。 ▎ ▎ 简单说,我需要以下能力之一才能帮你——但我都没有: ▎ ▎ 1. 浏览器环境(能执行 JS、处理 Cookie/Session) ▎ 2. 该网站有 REST API 可以直接用账号密码调接口获取数据 ▎ ▎ 如果你知道这个网站有没有公开的 API 接口,可以告诉我,我可以试试直接调 API。或者你可以把笔记内容导出/截图发过来,我帮你处理分析。 [] 2026-05-16 00:57:15 2026-05-16 01:55:52 T F 37 37   0 public
331 1 1 # 财务秘书 你自己分析一下 <|DSML|function_calls> <|DSML|invokename="query_ledger"> <|DSML|parametername="days"string="false">30</|DSML|parameter> <|DSML|parametername="direction"string="true">收入</|DSML|parameter> </|DSML|invoke> </|DSML|function_calls> [] 2026-05-16 02:06:38 2026-05-16 02:07:00 T F 38 38   0 public
332 1 1 keng-home-project ["goose", "keng"] 2026-05-16 02:25:30 2026-05-16 02:25:30 F F     0 public
334 1 1 home-project-keng 对话记录 # 2026-05-16 记录 bb chroot jail 配置全过程 ["goose", "bb", "chroot", "nginx"] 2026-05-16 21:18:09 2026-05-16 21:18:09 F F     0 public
335 1 1 # linux-jail bb乐园经验 - 版本:1.0.0 - 2026-05-16:Goose - 初始记录 # 事件 1:bb 用户 chroot 后路径套娃 ## 解决方法 ssh + chroot + shell 包装脚本 1. sshd_config 设置 `ChrootDirectory /home/bb`,用户 bb 登录后自动 chroot 到 `/home/bb` 2. `/etc/passwd` 中 bb 的 home 目录必须指向真实路径 `/home/bb`(sshd 在 chroot 前读 authorized_keys) 3. 创建包装脚本 `/usr/local/bin/chroot-bb-shell.sh`,内容:`export HOME=/root; cd /; exec /bin/bash --login` 4. bb 用户的 shell 设为该包装脚本,确保 chroot 后 `$HOME` 指向 jail 内的 `/root`(即 `/home/bb/root/`) 5. jal 内所有文件 `chown bb:bb`(bb 就是 jail 里的 root) ## 坑 sshd 的 ChrootDirectory 和 home 目录的关系 - sshd **在 chroot 之前**就要读取 `~/.ssh/authorized_keys` 做公钥认证,所以 `$HOME` 必须是外部真实路径 - chroot 后 ssd 才切换文件系统,所以 `.profile`、`.bashrc` 等要从 jail 内的路径读取 - 用 `usermod -d / bb` 会导致 ssd 在真实系统找 `/.ssh/authorized_keys` 而失败 - chroot 根目录 `/home/bb/` 必须归 `root:root` 且权限 `755`,否则 ssd 拒绝 chroot # 事件 2:jail 内用户权限不足(goose 写配置、mkdir 失败) ## 解决方法 $HOME 重定向到 /root - jail 内所有文件已经 chown 给 bb,但 `$HOME` 默认是 `/home/bb`(chroot 后不存在) - goose 读 `$HOME/.config/goose/` 写配置,路径不存在所以 `Permission denied` - 通过包装脚本将 `$HOME` 设为 `/root`(jail 内是 `/home/bb/root/`),goose 就能正常读写 - 同理 `mkdir /project` 失败是因为 chroot 根 `/` 归 root,改为进 `/project` 子目录操作 ## 坑 chroot jail 里 $HOME 必须指向存在的路径 - root 用户的 shell 包装脚本在 ssh 登录时会被 ssd 执行,权限是 bb 用户 - 如果 `$HOME` 指向一个 bb 无权限读的目录(如外部真实的 `/root`),shell 起不来 - 解决方案:jail 内的 `/home/bb/root/` 归 bb 所有,设 `$HOME=/root` 即可 # 事件 3:jail 内 nginx 与外部 nginx 协同 ## 解决方法 反向代理 + 固定端口 - 外部 nginx 监听 443/80,`location /bb/` 反向代理到 `http://127.0.0.1:8080/bb/` - jail 内再跑一个 nginx,监听 8080,负责 `/bb/` 下的路由分发 - jail 内 nginx 配置文件:`/etc/nginx/sites-enabled/bb` - 三个固定服务端口 8081/8082/8083,全留给 bb 用户自由使用 - 外部通过 `https://leedreamer.cn/bb/serverN/` 访问 ## 坑 jail 内 nginx 不能用 80/443 端口(无权限 + 被外部占用) - 用高端口 8080 做入口,8081/8082/8083 做服务端口 - jail 里 nginx 配置变化后:`nginx -t && nginx -s reload` - `sbin/nginx`、`/etc/sudo.conf`、`/etc/sudoers` 等系统文件被 chown 后 sudo 失效,需恢复 `root:root` # 事件 4:SFTP 无法连接(exit code 127) ## 解决方法 将 sftp-server 拷入 jail - ssd 的 Subsystem sftp 配置指向 `/usr/lib/openssh/sftp-server` - chroot jail 里没有这个文件,所以 SFTP 连接失败 - 从外… ["linux", "chroot", "nginx", "jail", "bb"] 2026-05-16 21:21:14 2026-05-16 21:41:24 T F 36 36   0 public
336 1 1 # 测试默认可见性 [] 2026-05-16 22:13:24 2026-05-16 22:13:24 F F     0 friends
337 1 1   [] 2026-05-16 22:16:16 2026-05-16 22:16:16 F F     0 friends
338 1 1   [] 2026-05-16 22:16:20 2026-05-16 22:16:20 F F     0 friends
339 23 23   [] 2026-05-16 22:17:02 2026-05-16 22:17:02 T F     0 friends
340 1 1 home-project 首次在此目录运行。 用户询问记忆系统的工作方式。 ["goose", "home-project", "keng"] 2026-05-17 01:49:25 2026-05-17 01:49:25 F F     0 friends
341 1 1 # 笔记搬家 TOP10 分析 - 日期:2026-05-18 - 目标:梳理主流笔记软件/网站的 API、导出方式,以及 keng 后续如何把对方笔记搬进来 --- ## 结论 现在 keng 只实现了 Simplenote 搬家,下一步最值得做的是: 1. **Obsidian / Logseq / Joplin**:本地 Markdown 或开放导出,成本最低,成功率最高。 2. **Notion / OneNote**:有官方 API,适合做 OAuth 连接后自动同步/导入。 3. **Evernote / Standard Notes / Google Keep / Apple Notes / Bear**:更适合先支持“用户导出文件上传”,再考虑半自动或平台脚本。 统一策略:keng 不要为每个平台单独写一堆散逻辑,而是做 `NoteSourceAdapter`:每个来源只负责列笔记、取正文、取附件/标签、返回标准结构,最终都走现有 `/api/other-notes/{source}/import`。 --- ## TOP10 平台与搬家方式 | 排名 | 平台 | 官方 API | 推荐搬家方式 | 难度 | 备注 | |------|------|----------|--------------|------|------| | 1 | Notion | 有,Notion API | OAuth 后读取 page/block/database,转 Markdown | 中 | API 稳定,但 block 转 Markdown 要做映射 | | 2 | Microsoft OneNote | 有,Microsoft Graph | OAuth 后读取 notebooks/sections/pages,正文 HTML 转 Markdown | 中 | Graph 权限配置较复杂 | | 3 | Evernote | 有历史 API,但现代接入受限 | 优先支持 ENEX 导入 | 中 | 用户从客户端导出 `.enex` 最稳 | | 4 | Google Keep | 无正式公开 API | Google Takeout 导出 JSON/HTML 后导入 | 中 | 不建议依赖非官方接口 | | 5 | Apple Notes | 无公开 Web API | macOS 导出/AppleScript/第三方导出 Markdown 后上传 | 高 | iCloud 网页不适合作为稳定 API | | 6 | Obsidian | 本地 Markdown 文件夹 | 直接上传 vault zip 或选目录导入 `.md` | 低 | 最适合先做,几乎无需平台账号 | | 7 | Joplin | 有本地 Web Clipper API | JEX/Markdown 导出,或本地 token 调 Joplin API | 低 | 开源,字段和附件好处理 | | 8 | Bear | 有 x-callback-url/导出 | Markdown/TextBundle 导出后上传 | 中 | macOS/iOS 生态,自动化需本机配合 | | 9 | Simplenote | 有 API | 已实现 | 低 | 当前 keng 已接入 | | 10 | Standard Notes | 无稳定公开导入 API | App 内导出 decrypted backup JSON 后导入 | 中 | 加密产品,必须让用户本地导出明文备份 | --- ## 各平台实现要点 ### 1. Notion - 获取 API:到 Notion Developers 创建 integration,或做 OAuth public integration。 - 数据读取:`/v1/search` 找页面和数据库,`/v1/blocks/{block_id}/children` 递归读取 block。 - 搬出方式:把 heading、paragraph、bulleted_list_item、numbered_list_item、to_do、code、quote、table 等 block 转 Markdown。 - keng 映射:页面标题 → `title`,正文 Markdown → `content`,database/page 标签属性 → `tags`。 - 风险:Notion block 类型多,初版只支持常用块,复杂嵌入先转成链接占位。 ### 2. Microsoft OneNote - 获取 API:Azure Portal 注册应用,开启 Microsoft Graph 权限,如 `Notes.Read`。 - 数据读取:Graph `/me/onenote/notebooks`、`… [] 2026-05-18 23:53:00 2026-05-18 23:53:48 T F 41 41   0 friends
342 1 1   [] 2026-05-19 22:58:58 2026-05-19 22:59:14 F F     4 friends
343 1 1   [] 2026-05-19 22:59:00 2026-05-19 22:59:12 F F     6 friends
344 1 1   [] 2026-05-19 22:59:02 2026-05-19 22:59:09 F F     7 friends
345 25 25 # 第一篇笔记 啊撒旦立刻解放 [] 2026-05-20 23:07:22 2026-05-20 23:50:05 F F     0 public
346 26 26 阿斯顿发斯蒂芬 [] 2026-05-21 00:05:57 2026-05-21 00:06:01 T F     0 public
347 1 1 # keng开发日志 ## 2026-05-21 后端 / Notion / 分享收件箱 - Notion 的 `ntn_` token 不能写在全局 `config.ini`,已迁到用户级 `userIntegrationTb`。 - Notion token 验证:`users/me` 返回 200,说明 token 有效;但 `/v1/search` 返回 0 条,原因是目标页面没有在 Notion 右上角 ··· → Connections 添加该 integration。以后遇到“已登录但读不到列表”,优先检查页面授权,而不是只看 token 格式。 - 分享收件箱改为系统文件夹:`分享给我的/来自陌生人/来自好友`,接收方拖到普通文件夹时自动复制为自己的笔记,原分享关系置为 dismissed。 ## 2026-05-21 前端 / 后端 / Notion 深挖 - 分享收件箱重复的根因是系统文件夹没有唯一约束,多 worker/并发确保逻辑可能写出两套。已清理历史重复数据,并新增 `idx_folder_user_system_key`,同一用户同一 `system_key` 只保留一条。 - 前端把 `分享给我的` 改为笔记列表顶端的独立收件箱区,后端仍用 `folderTb.system_key` 做映射;普通文件夹列表不再混入这组系统收件箱。 - Notion 当前 token 经 `users/me` 识别为 Bot/Connection Token;`search_all/search_pages/search_databases` 都是 200 但 0 条。官方模型是 connection 只能读取已授权给它的页面/数据源,API 没有“把 connection 添加到已有页面”的接口;要自动选择页面只能走 OAuth 页面选择器,或使用 PAT。 ## AI 交互 | Notion PAT vs Bot Token 结论(2026-05-21) - **根本解法:PAT(Personal Access Token)** - 在 https://www.notion.so/developers/tokens 创建,勾选 Notion API 能力,选择工作区 - PAT 直接用用户自己的权限,不需要给每个页面手动 Add connections - `GET /v1/search` 可以返回用户有权限的所有页面,无需逐页授权 - **Bot/Connection Token(`ntn_xxx` internal integration)的限制** - 只能访问在页面 `···` → Add connections 中手动添加了该 integration 的页面 - Notion 没有 API 可以把 connection 主动加到已有页面,只能用户手动操作 - Add connections 按钮位置:页面右上角 `···` 菜单 → 向下滚动 → `Add connections` → 搜索 integration 名称 - **Notion 登录方式**:不支持 GitHub 登录;仅支持 Google / Apple / Microsoft / 邮箱密钥 / 企业 SSO - **诊断逻辑(importer.py)**:搜索返回 0 条时用 `GET /v1/users/me` 判断是 Bot 还是 PAT,给出针对性提示 ## 前端 | api() 函数 silent 模式(2026-05-21) - `api()` 全局 fetch 包装器增加 `_silent: true` 选项,设置后 catch 块不弹 toast,只 re-throw - 用于 Notion 搬家面板等"自己处理错误展示"的场景,防止大红 toast 与面板内错误文字同时显示 ## 后端 | 分享笔记"收下"接口(2026-05-21) - `POST /api/notes/{id}/claim`:校验接收方 → INSERT 进 noteTb(folder_id=NULL)→ DELETE FROM noteShareTb(彻底删,不是 dismissed) - 前端 `claimSharedNote(id)` 调用后从本地数组删除该条、`renderList()`、toast "已收下:xxx" - 区别于"抄回去"(copy-to-me 保留分享行):收下彻底清除分享关系 ## 待完成(记录人: assistant, 2026-05-21 02:00) - 将 `promt.md` 的最终合并验证并覆盖原有逻辑,保证 `promt.md` 始终为最新版本。 - 在 `file/anylize/` 下写 Notion 研究分析(包含 PAT 创建步骤、Bot vs… [] 2026-05-21 00:38:01 2026-05-21 02:00:10 F F     0 public
348 1 1   [] 2026-05-21 01:19:11 2026-05-21 01:19:11 F F     0 public
349 1 1   [] 2026-05-21 01:22:12 2026-05-21 01:22:12 F F     0 public
350 1 1   [] 2026-05-21 01:46:47 2026-05-21 01:46:47 F F   claimed_from_share=325; shared_by=23 0 public
351 1 1   [] 2026-05-21 01:47:08 2026-05-21 01:47:08 F F   claimed_from_share=339; shared_by=23 0 public
352 1 1 # keng开发日志 ## 2026-05-22 kengnote.com 域名迁移 ### 需求 购买域名 kengnote.com 绑到 keng 项目上,以后可以直接用 kengnote.com/keng 访问,不用 leedreamer.cn/keng。 ### 操作 1. 阿里云 DNS(alidns)添加 kengnote.com 域名,配好 A 记录 - @ → 8.219.6.216 ✅ - www → 8.219.6.216 ✅ - NS: ns1.alidns.com / ns2.alidns.com 2. Nginx 配置写好了 /etc/nginx/sites-enabled/kengnote.com(和现有 default 基本一致,只保留 keng 相关路由) 3. 更新了 server.py 中的回调 URL: - GitHub OAuth callback: kengnote.com/keng/api/auth/github/callback - Notion OAuth callback: kengnote.com/keng/api/auth/notion/callback 4. 更新了 settings.html / index.html 中的域名链接 ### 待办(需用户配合) - [ ] **去 Namecheap 把 kengnote.com 的 NS 改成阿里云 DNS** - 登录 https://www.namecheap.com(账号: leedreamer, 密码: Fuckyou86416503.) - Domain List → kengnote.com → Manage → Nameservers → Custom DNS - 填入: ns1.alidns.com, ns2.alidns.com - [ ] DNS 生效后申请 SSL 证书 - [ ] 重启 keng 服务 + 重载 nginx ### 注意 - Namecheap 登录需要处理安全问题/2FA,无法通过脚本自动化 - 已经尝试过 playwright 自动化 + requests 模拟登录,都被 WAF/安全验证挡住了 ["域名", "DNS", "部署", "kengnote"] 2026-05-22 02:42:22 2026-05-22 02:42:22 T F     0 public

Advanced export

JSON shape: default, array, newline-delimited, object

CSV options:

CREATE TABLE "noteTb" (
                    id INTEGER PRIMARY KEY,
                    user_id INTEGER DEFAULT NULL REFERENCES userTb(id),
                    content TEXT NOT NULL DEFAULT '',
                    tags TEXT DEFAULT '[]',
                    created_at TEXT NOT NULL DEFAULT (datetime('now','localtime')),
                    updated_at TEXT NOT NULL DEFAULT (datetime('now','localtime')),
                    enable TEXT DEFAULT 'T',
                    pinned TEXT DEFAULT 'F',
                    folder_id INTEGER DEFAULT NULL REFERENCES folderTb(id),
                    comment TEXT DEFAULT '', position INTEGER DEFAULT 0, visibility TEXT NOT NULL DEFAULT 'private');
CREATE INDEX idx_note_visibility ON noteTb(user_id, visibility, enable);
Powered by Datasette · Queries took 1.2ms