[{"data":1,"prerenderedAt":1065},["ShallowReactive",2],{"lab-/labs/promptmanager":3},{"id":4,"title":5,"author":6,"body":7,"category":1051,"date":1052,"description":1053,"extension":1054,"featured":1055,"home_position":1056,"image":1056,"meta":1057,"navigation":438,"order":430,"path":1058,"seo":1059,"status":1060,"stem":1061,"tags":1062,"__hash__":1064},"content/labs/PromptManager.md","PromptManager","sibuchen",{"type":8,"value":9,"toc":1021},"minimark",[10,14,18,30,36,39,42,164,166,169,173,183,186,192,194,197,201,210,237,251,255,262,269,274,338,342,356,363,447,453,482,493,507,511,518,570,574,581,584,629,633,640,678,682,689,710,714,724,758,762,769,794,798,805,812,886,888,891,895,898,902,905,909,917,921,930,934,947,949,952,1006,1017],[11,12,5],"h1",{"id":13},"promptmanager",[15,16,17],"h2",{"id":17},"项目概览",[19,20,21,24,25,29],"p",{},[22,23,5],"strong",{}," 是一款面向 AI Prompt 工程师的本地化 Prompt 管理工具，采用纯前端无后端架构，通过浏览器原生 File System Access API 直接读写用户本地文件系统，实现 Prompt 的创建、编辑、检索、分类与导入导出。项目以 ",[26,27,28],"code",{},".md","（Markdown + YAML Frontmatter）作为统一存储格式，兼顾可读性与结构化元数据管理。",[19,31,32,35],{},[22,33,34],{},"核心定位","：解决 AI 使用过程中 Prompt 模板散落在各处、缺乏统一管理和快速检索的问题。",[37,38],"hr",{},[15,40,41],{"id":41},"技术栈",[43,44,45,61],"table",{},[46,47,48],"thead",{},[49,50,51,55,58],"tr",{},[52,53,54],"th",{},"层级",[52,56,57],{},"技术选型",[52,59,60],{},"版本",[62,63,64,76,87,98,109,120,131,142,153],"tbody",{},[49,65,66,70,73],{},[67,68,69],"td",{},"框架",[67,71,72],{},"React 19 + React Router 7",[67,74,75],{},"19.2.4 / 7.14.0",[49,77,78,81,84],{},[67,79,80],{},"构建工具",[67,82,83],{},"Vite 8",[67,85,86],{},"8.0.4",[49,88,89,92,95],{},[67,90,91],{},"样式方案",[67,93,94],{},"Tailwind CSS 4 + 自定义 CSS 变量主题系统",[67,96,97],{},"4.2.2",[49,99,100,103,106],{},[67,101,102],{},"代码编辑器",[67,104,105],{},"Monaco Editor（@monaco-editor/react）",[67,107,108],{},"4.7.0",[49,110,111,114,117],{},[67,112,113],{},"Markdown 渲染",[67,115,116],{},"react-markdown + remark-gfm",[67,118,119],{},"10.1.0",[49,121,122,125,128],{},[67,123,124],{},"元数据解析",[67,126,127],{},"gray-matter（YAML Frontmatter 标准）",[67,129,130],{},"4.0.3",[49,132,133,136,139],{},[67,134,135],{},"持久化",[67,137,138],{},"IndexedDB（idb-keyval） + File System Access API",[67,140,141],{},"6.2.2",[49,143,144,147,150],{},[67,145,146],{},"数据导出",[67,148,149],{},"JSZip",[67,151,152],{},"3.10.1",[49,154,155,158,161],{},[67,156,157],{},"包管理",[67,159,160],{},"pnpm",[67,162,163],{},"—",[37,165],{},[15,167,168],{"id":168},"架构设计",[170,171,172],"h3",{"id":172},"整体分层",[174,175,180],"pre",{"className":176,"code":178,"language":179},[177],"language-text","src/\n├── main.jsx                    # 应用入口\n├── App.jsx                     # 路由定义 + 全局 Provider 挂载\n├── contexts/\n│   └── SettingsContext.jsx     # 全局状态管理（主题/语言/工作区句柄）\n├── components/                 # 布局 & 复用 UI 组件\n│   ├── Layout.jsx              # Sidebar + Outlet 的根布局壳\n│   ├── Sidebar.jsx             # 导航侧边栏（含 WorkspaceTree 嵌套）\n│   ├── TopToolbar.jsx          # 通用顶部工具栏\n│   ├── WorkspaceTree.jsx       # 递归文件树（惰性展开）\n│   └── SavePromptDialog.jsx    # 保存对话框（含目录浏览器）\n├── pages/                      # 页面级组件\n│   ├── Editor.jsx              # 核心：Prompt 编辑器（Monaco + 实时预览）\n│   ├── Library.jsx             # Prompt 库（搜索/标签/排序）\n│   └── Settings.jsx            # 设置页（主题/语言/工作区/导入导出）\n└── utils/\n    ├── fileSystem.js           # File System Access API 全套封装\n    └── i18n.js                 # 轻量级中英双语字典\n","text",[26,181,178],{"__ignoreMap":182},"",[170,184,185],{"id":185},"数据流架构",[174,187,190],{"className":188,"code":189,"language":179},[177],"┌─────────────────────────────────────────────────────────────────┐\n│                        SettingsContext                           │\n│  (theme, language, workspaceHandle)  ← 全局单一数据源            │\n└──────────┬──────────────────────────────┬───────────────────────┘\n           │                              │\n     ┌─────▼─────┐                 ┌──────▼──────┐\n     │  Editor    │                 │   Library    │\n     │  页面      │                 │   页面       │\n     └─────┬─────┘                 └──────┬──────┘\n           │                              │\n           ▼                              ▼\n   ┌───────────────────────────────────────────────┐\n   │            fileSystem.js 封装层                 │\n   │                                               │\n   │  readFile / writeFile    ← 读写 .md 文件       │\n   │  readMetadata / writeMetadata  ← 读写索引     │\n   │  parseMarkdown / stringifyMarkdown  ← 格式转换 │\n   │  syncMetadataIndex  ← 增量同步                │\n   └───────────────────┬───────────────────────────┘\n                       │\n                       ▼\n   ┌───────────────────────────────────────────────┐\n   │         File System Access API (浏览器原生)      │\n   │                                               │\n   │  FileSystemDirectoryHandle  ← 用户选定的目录    │\n   │  IndexedDB (idb-keyval)     ← 句柄持久化       │\n   └───────────────────────────────────────────────┘\n",[26,191,189],{"__ignoreMap":182},[37,193],{},[15,195,196],{"id":196},"核心功能模块",[170,198,200],{"id":199},"_1-monaco-editor-编辑器","1. Monaco Editor 编辑器",[19,202,203,206,207],{},[22,204,205],{},"文件","：",[26,208,209],{},"src/pages/Editor.jsx",[211,212,213,217,220,223,230],"ul",{},[214,215,216],"li",{},"集成 Monaco Editor，支持 Markdown 语法高亮、代码折叠、自动换行",[214,218,219],{},"左右分屏布局：左侧为编辑区，右侧为 react-markdown 实时预览",[214,221,222],{},"顶部内联编辑器：支持文件名直接修改、Tag 标签的增删操作",[214,224,225,226,229],{},"PreviewBar 组件通过 ",[26,227,228],{},"React.memo"," 隔离，避免编辑区每次击键触发预览组件重渲染",[214,231,232,233,236],{},"自定义 Monaco 主题 ",[26,234,235],{},"logicCanvasDark","，与应用深色模式无缝融合",[19,238,239,242,243,246,247,250],{},[22,240,241],{},"性能优化","：PreviewBar 使用 ",[26,244,245],{},"memo"," + ",[26,248,249],{},"useCallback"," 稳定引用，确保击键不会导致 Monaco 实例重新协调。",[170,252,254],{"id":253},"_2-文件存储引擎","2. 文件存储引擎",[19,256,257,206,259],{},[22,258,205],{},[26,260,261],{},"src/utils/fileSystem.js",[19,263,264,265,268],{},"核心设计决策：",[22,266,267],{},"无后端","，通过浏览器 File System Access API 直接操作本地文件系统。",[19,270,271,206],{},[22,272,273],{},"关键实现",[211,275,276,293,302,315,328],{},[214,277,278,206,281,284,285,288,289,292],{},[22,279,280],{},"工作区持久化",[26,282,283],{},"pickWorkspace()"," 将 ",[26,286,287],{},"FileSystemDirectoryHandle"," 写入 IndexedDB，",[26,290,291],{},"restoreWorkspace()"," 在应用启动时静默恢复，用户无需重复授权",[214,294,295,206,298,301],{},[22,296,297],{},"目录递归扫描",[26,299,300],{},"scanDirectory()"," 递归遍历目录树，统计文件数量与磁盘占用",[214,303,304,307,308,311,312,314],{},[22,305,306],{},"元数据索引","（",[26,309,310],{},".metadata.json","）：维护所有 ",[26,313,28],{}," 文件的结构化索引（tags、preview、lastModified），避免每次加载都全量解析文件",[214,316,317,307,320,323,324,327],{},[22,318,319],{},"增量同步机制",[26,321,322],{},"syncMetadataIndex()","）：通过 ",[26,325,326],{},"file.lastModified"," 时间戳比对，仅重新解析被外部修改过的文件，并自动清理已删除文件的索引条目",[214,329,330,333,334,337],{},[22,331,332],{},"兼容性设计","：元数据 schema 从 v1（纯 tag 数组）到 v2（带 preview 和 lastModified 的对象），",[26,335,336],{},"normaliseMetaEntry()"," 保证新旧格式无缝兼容",[170,339,341],{"id":340},"_3-markdown-序列化引擎","3. Markdown 序列化引擎",[19,343,344,206,346,348,349,352,353],{},[22,345,205],{},[26,347,261],{}," 中的 ",[26,350,351],{},"parseMarkdown()"," / ",[26,354,355],{},"stringifyMarkdown()",[19,357,358,359,362],{},"采用 ",[22,360,361],{},"YAML Frontmatter"," 作为标准格式：",[174,364,368],{"className":365,"code":366,"language":367,"meta":182,"style":182},"language-yaml shiki shiki-themes github-light github-dark","---\ntags:\n  - backend\n  - java\n  - spring-boot\npreview: 这是一个用于后端开发架构的标准化 Prompt 模板\n---\n\n# Prompt 正文内容...\n","yaml",[26,369,370,379,390,400,408,416,428,433,440],{"__ignoreMap":182},[371,372,375],"span",{"class":373,"line":374},"line",1,[371,376,378],{"class":377},"sScJk","---\n",[371,380,382,386],{"class":373,"line":381},2,[371,383,385],{"class":384},"s9eBZ","tags",[371,387,389],{"class":388},"sVt8B",":\n",[371,391,393,396],{"class":373,"line":392},3,[371,394,395],{"class":388},"  - ",[371,397,399],{"class":398},"sZZnC","backend\n",[371,401,403,405],{"class":373,"line":402},4,[371,404,395],{"class":388},[371,406,407],{"class":398},"java\n",[371,409,411,413],{"class":373,"line":410},5,[371,412,395],{"class":388},[371,414,415],{"class":398},"spring-boot\n",[371,417,419,422,425],{"class":373,"line":418},6,[371,420,421],{"class":384},"preview",[371,423,424],{"class":388},": ",[371,426,427],{"class":398},"这是一个用于后端开发架构的标准化 Prompt 模板\n",[371,429,431],{"class":373,"line":430},7,[371,432,378],{"class":377},[371,434,436],{"class":373,"line":435},8,[371,437,439],{"emptyLinePlaceholder":438},true,"\n",[371,441,443],{"class":373,"line":442},9,[371,444,446],{"class":445},"sJ8bj","# Prompt 正文内容...\n",[19,448,449,452],{},[22,450,451],{},"解析策略","（三层容错）：",[454,455,456,462,472],"ol",{},[214,457,458,461],{},[22,459,460],{},"首选 gray-matter 库解析"," — 标准 YAML Frontmatter",[214,463,464,467,468,471],{},[22,465,466],{},"手动正则回退"," — 当 gray-matter 解析失败时，用正则提取 ",[26,469,470],{},"---"," 块中的 tags 和 preview",[214,473,474,477,478,481],{},[22,475,476],{},"旧版 HTML 注释兼容"," — 支持 ",[26,479,480],{},"\u003C!-- tags: ... -->"," 格式的遗留文件，实现无感迁移",[19,483,484,206,487,489,490,492],{},[22,485,486],{},"自愈机制",[26,488,351],{}," 包含循环剥离逻辑，自动清理因多次保存产生的\"千层饼\"（多个 YAML 头部叠加）问题。",[26,491,355],{}," 则通过 YAML 敏感字符检测，对 preview 值自动加引号，防止特殊字符破坏 YAML 结构。",[19,494,495,498,499,502,503,506],{},[22,496,497],{},"跨平台处理","：所有输入先经过 ",[26,500,501],{},"\\r\\n"," → ",[26,504,505],{},"\\n"," 归一化，确保 Windows 换行符不会导致正则失效。",[170,508,510],{"id":509},"_4-prompt-库与检索系统","4. Prompt 库与检索系统",[19,512,513,206,515],{},[22,514,205],{},[26,516,517],{},"src/pages/Library.jsx",[211,519,520,530,544,558],{},[214,521,522,525,526,529],{},[22,523,524],{},"级联计算架构","：三个 ",[26,527,528],{},"useMemo"," 链式派生 — 热门标签 → 搜索词解析 → 过滤排序结果，任一上游变化自动级联更新",[214,531,532,535,536,539,540,543],{},[22,533,534],{},"搜索算法","：标签精确匹配（",[26,537,538],{},"===","） + 摘要模糊匹配（",[26,541,542],{},"includes","），多关键词取并集并按命中数打分排序",[214,545,546,549,550,553,554,557],{},[22,547,548],{},"两种排序模式","：相关度排序（",[26,551,552],{},"score"," 降序）和最近修改排序（",[26,555,556],{},"lastModified"," 降序），一键切换",[214,559,560,563,564,566,567,569],{},[22,561,562],{},"快速加载 + 静默同步","：先从 ",[26,565,310],{}," 缓存快速渲染，后台异步执行 ",[26,568,322],{}," 增量更新",[170,571,573],{"id":572},"_5-保存流程与冲突处理","5. 保存流程与冲突处理",[19,575,576,206,578],{},[22,577,205],{},[26,579,580],{},"src/components/SavePromptDialog.jsx",[19,582,583],{},"保存对话框实现了完整的目录浏览器，支持：",[211,585,586,592,598,619],{},[214,587,588,591],{},[22,589,590],{},"路径面包屑导航","：可逐级深入子目录",[214,593,594,597],{},[22,595,596],{},"原地新建文件夹","：保存时可在任意位置创建新目录",[214,599,600,603,604],{},[22,601,602],{},"三种保存模式","：\n",[211,605,606,613,616],{},[214,607,608,609,612],{},"新建文件：检测同名冲突，",[22,610,611],{},"直接阻止覆盖","（非静默覆盖）",[214,614,615],{},"编辑已有文件（路径+文件名未变）：静默覆盖",[214,617,618],{},"移动/重命名文件：删除旧路径的物理文件 + 清理旧元数据索引，写入新位置",[214,620,621,624,625,628],{},[22,622,623],{},"写入原子性","：写入失败时调用 ",[26,626,627],{},"writable.abort()"," 确保文件句柄不泄漏",[170,630,632],{"id":631},"_6-递归文件树","6. 递归文件树",[19,634,635,206,637],{},[22,636,205],{},[26,638,639],{},"src/components/WorkspaceTree.jsx",[211,641,642,648,660],{},[214,643,644,647],{},[22,645,646],{},"惰性加载","：目录节点仅在用户点击展开时才异步加载子条目，避免启动时全量扫描",[214,649,650,206,653,656,657,659],{},[22,651,652],{},"React.memo 优化",[26,654,655],{},"WorkspaceNode"," 组件使用 ",[26,658,245],{}," 包裹，展开/折叠操作不会导致兄弟节点重渲染",[214,661,662,665,666,669,670,673,674,677],{},[22,663,664],{},"路径状态管理","：通过 ",[26,667,668],{},"Set"," 维护 ",[26,671,672],{},"expandedPaths","，",[26,675,676],{},"activeFilePath"," 高亮当前编辑的文件",[170,679,681],{"id":680},"_7-工作区导入导出","7. 工作区导入导出",[19,683,684,206,686],{},[22,685,205],{},[26,687,688],{},"src/pages/Settings.jsx",[211,690,691,701],{},[214,692,693,696,697,700],{},[22,694,695],{},"导出","：使用 JSZip 递归打包整个工作区目录为 ",[26,698,699],{},".zip"," 压缩包，通过 Blob URL 触发浏览器下载",[214,702,703,665,706,709],{},[22,704,705],{},"导入",[26,707,708],{},"\u003Cinput type=\"file\" accept=\".md\">"," 导入单个 Markdown 文件，自动携带内容跳转至编辑器页面",[170,711,713],{"id":712},"_8-vite-自定义插件git-状态监控","8. Vite 自定义插件：Git 状态监控",[19,715,716,206,718,348,721],{},[22,717,205],{},[26,719,720],{},"vite.config.js",[26,722,723],{},"gitStatusPlugin()",[211,725,726,733,748],{},[214,727,728,729,732],{},"仅在开发模式下生效，提供 ",[26,730,731],{},"/api/git-status"," 中间件",[214,734,735,736,739,740,743,744,747],{},"通过 ",[26,737,738],{},"spawnSync"," 调用 ",[26,741,742],{},"git log"," 和 ",[26,745,746],{},"git status","，返回最近提交时间和工作区干净状态",[214,749,750,753,754,757],{},[22,751,752],{},"安全加固","：硬编码 git 命令参数数组（无字符串拼接），CORS 仅允许 ",[26,755,756],{},"127.0.0.1:5173","，锁死 dev server 到 loopback 地址",[170,759,761],{"id":760},"_9-国际化i18n","9. 国际化（i18n）",[19,763,764,206,766],{},[22,765,205],{},[26,767,768],{},"src/utils/i18n.js",[211,770,771,774,785],{},[214,772,773],{},"轻量级字典方案，覆盖侧边栏、编辑器、设置页等全部 UI 文案",[214,775,776,777,780,781,784],{},"支持 ",[26,778,779],{},"en","（英文）和 ",[26,782,783],{},"zh","（简体中文），跟随系统偏好自动初始化",[214,786,787,790,791],{},[26,788,789],{},"t()"," 函数支持 dot-notation 键名，缺失键自动降级到英文并打印 ",[26,792,793],{},"console.warn",[170,795,797],{"id":796},"_10-全局状态管理","10. 全局状态管理",[19,799,800,206,802],{},[22,801,205],{},[26,803,804],{},"src/contexts/SettingsContext.jsx",[19,806,807,808,811],{},"基于 React Context + ",[26,809,810],{},"useState"," 的轻量方案，管理三项全局状态：",[43,813,814,827],{},[46,815,816],{},[49,817,818,821,824],{},[52,819,820],{},"状态",[52,822,823],{},"持久化方式",[52,825,826],{},"初始化逻辑",[62,828,829,849,867],{},[49,830,831,836,843],{},[67,832,833],{},[26,834,835],{},"theme",[67,837,838,839,842],{},"localStorage (",[26,840,841],{},"pm:theme",")",[67,844,845,846],{},"优先读取存储值，否则跟随 ",[26,847,848],{},"prefers-color-scheme",[49,850,851,856,861],{},[67,852,853],{},[26,854,855],{},"language",[67,857,838,858,842],{},[26,859,860],{},"pm:language",[67,862,863,864],{},"默认 ",[26,865,866],{},"'en'",[49,868,869,874,880],{},[67,870,871],{},[26,872,873],{},"workspaceHandle",[67,875,876,877,842],{},"IndexedDB (",[26,878,879],{},"idb-keyval",[67,881,882,883,885],{},"启动时 ",[26,884,291],{}," 静默恢复",[37,887],{},[15,889,890],{"id":890},"关键技术亮点",[170,892,894],{"id":893},"_1-无后端本地优先架构","1. 无后端本地优先架构",[19,896,897],{},"完全依赖浏览器原生能力（File System Access API + IndexedDB），零服务器成本，数据完全在用户本地，隐私性极高。",[170,899,901],{"id":900},"_2-yaml-frontmatter-三层容错解析","2. YAML Frontmatter 三层容错解析",[19,903,904],{},"从标准库解析到手动正则到旧格式兼容，确保任何历史版本的文件都能正确读取，并在下次保存时自动迁移到标准格式。",[170,906,908],{"id":907},"_3-元数据索引与增量同步","3. 元数据索引与增量同步",[19,910,911,913,914,916],{},[26,912,310],{}," 作为 Sidecar 索引文件，避免每次都全量解析所有 ",[26,915,28],{}," 文件。通过文件修改时间戳实现增量同步，外部编辑器修改的文件也能被自动感知。",[170,918,920],{"id":919},"_4-monaco-editor-性能隔离","4. Monaco Editor 性能隔离",[19,922,923,924,926,927,929],{},"将 PreviewBar 用 ",[26,925,228],{}," 隔离，配合 ",[26,928,249],{}," 稳定回调引用，避免编辑区每秒数十次的击键事件触发 Monaco 实例的完整重渲染。",[170,931,933],{"id":932},"_5-保存流程的状态机设计","5. 保存流程的状态机设计",[19,935,735,936,307,939,942,943,946],{},[26,937,938],{},"originalFile",[26,940,941],{},"null"," vs ",[26,944,945],{},"object","）精确区分新建/编辑两种模式，配合路径比对实现\"同路径静默覆盖 + 不同路径冲突阻止 + 跨路径物理文件清理\"的三段式保存逻辑。",[37,948],{},[15,950,951],{"id":951},"项目统计",[43,953,954,964],{},[46,955,956],{},[49,957,958,961],{},[52,959,960],{},"指标",[52,962,963],{},"数据",[62,965,966,974,982,990,998],{},[49,967,968,971],{},[67,969,970],{},"源文件数",[67,972,973],{},"12 个（.jsx / .js）",[49,975,976,979],{},[67,977,978],{},"代码符号数",[67,980,981],{},"125 个",[49,983,984,987],{},[67,985,986],{},"依赖关系边",[67,988,989],{},"245 条",[49,991,992,995],{},[67,993,994],{},"核心 npm 依赖",[67,996,997],{},"10 个（均为主流库）",[49,999,1000,1003],{},[67,1001,1002],{},"当前版本",[67,1004,1005],{},"v0.1.1-alpha",[15,1007,1009,1010],{"id":1008},"源码位置github","源码位置：",[1011,1012,1016],"a",{"href":1013,"rel":1014},"https://github.com/sibuchen/PromptManager",[1015],"nofollow","Github",[1018,1019,1020],"style",{},"html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s9eBZ, html code.shiki .s9eBZ{--shiki-default:#22863A;--shiki-dark:#85E89D}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":182,"searchDepth":381,"depth":381,"links":1022},[1023,1024,1025,1029,1041,1048,1049],{"id":17,"depth":381,"text":17},{"id":41,"depth":381,"text":41},{"id":168,"depth":381,"text":168,"children":1026},[1027,1028],{"id":172,"depth":392,"text":172},{"id":185,"depth":392,"text":185},{"id":196,"depth":381,"text":196,"children":1030},[1031,1032,1033,1034,1035,1036,1037,1038,1039,1040],{"id":199,"depth":392,"text":200},{"id":253,"depth":392,"text":254},{"id":340,"depth":392,"text":341},{"id":509,"depth":392,"text":510},{"id":572,"depth":392,"text":573},{"id":631,"depth":392,"text":632},{"id":680,"depth":392,"text":681},{"id":712,"depth":392,"text":713},{"id":760,"depth":392,"text":761},{"id":796,"depth":392,"text":797},{"id":890,"depth":381,"text":890,"children":1042},[1043,1044,1045,1046,1047],{"id":893,"depth":392,"text":894},{"id":900,"depth":392,"text":901},{"id":907,"depth":392,"text":908},{"id":919,"depth":392,"text":920},{"id":932,"depth":392,"text":933},{"id":951,"depth":381,"text":951},{"id":1008,"depth":381,"text":1050},"源码位置：Github","web","2026-04-13","PromptManager 是一款面向 AI Prompt 工程师的本地化 Prompt 管理工具，采用纯前端无后端架构，通过浏览器原生 File System Access API 直接读写用户本地文件系统，实现 Prompt 的创建、编辑、检索、分类与导入导出。项目以 `.md`（Markdown + YAML Frontmatter）作为统一存储格式，兼顾可读性与结构化元数据管理。","md",false,null,{},"/labs/promptmanager",{"title":5,"description":1053},"ACTIVE","labs/PromptManager",[1051,1063,6],"promt","ekavrKCDjX9yYpqBaYtT2X_-YTzabDDqMjLjo90lXXE",1781104361531]