ワンクリックで
record-bug-fix-memory
当用户要求在 bug 已经定位并修复后,记录排错经验、事故结论、AI 记忆更新、复盘摘要或本地 MCP 记忆时使用。这个技能只负责沉淀"发生了什么、为什么会发生、如何修好、以后要记住什么",不要把它用于实际修复 bug。
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
メニュー
当用户要求在 bug 已经定位并修复后,记录排错经验、事故结论、AI 记忆更新、复盘摘要或本地 MCP 记忆时使用。这个技能只负责沉淀"发生了什么、为什么会发生、如何修好、以后要记住什么",不要把它用于实际修复 bug。
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
SOC 職業分類に基づく
使用 Nitro v3 框架和 H3 编写服务端 API 的技能。适用于后端接口开发、Mock 数据迁移到 Neon 数据库、以及编写符合 Drizzle ORM 标准的查询逻辑。当需要开发新的 CRUD 接口或修复现有后端逻辑时使用此技能。
规范类型项目(apps/type)的代码组织方式、导出语法和文件结构。用于解决类型导出冲突、创建统一导出入口、处理重复导出等问题。适用于类型项目开发、类型错误修复、代码规范实施场景。在处理类型项目的代码写法时,请使用本技能。
当你修改数据库结构或种子生成脚本时,请务必阅读并遵循此指南,以防止性能问题、数据一致性崩溃和部署失败。新 Schema 应在 apps/type 中创建。
数据库 Schema 变更时的全项目同步检查清单。当修改 apps/type 中 schema.ts 的表字段、新增数据库表、或删除表时,使用此技能确保类型项目、数据库迁移、后端接口、前端页面、种子数据和技能文档全部同步更新,避免遗漏。
当用户要求在 bug 已经定位并修复后,记录排错经验、事故结论、AI 记忆更新、复盘摘要或本地 MCP 记忆时使用。这个技能只负责沉淀"发生了什么、为什么会发生、如何修好、以后要记住什么",不要把它用于实际修复 bug。
新建公共组件规范专家 - 指导在 src/components/common 目录下创建符合项目规范的公共组件,包括文件结构、TypeScript 类型、Vue 组件、文档和测试页面。 触发条件(满足任意一项即触发): - 任务包含"新建组件"、"公共组件"、"common 组件"、"创建组件"等关键词 - 需要在 src/components/common 目录下创建新组件 - 需要创建可复用的业务组件(如表单分区标题、操作按钮组、信息展示卡片) - 需要编写组件的 TypeScript 类型定义 - 需要编写组件使用文档(index.md) - 需要创建组件测试页面(src/pages/test-use/) - 用户提及"组件规范"、"组件文档"、"组件测试"等关键词 必须协同的技能: - beautiful-component-design(组件美化时)- 图标、响应式设计、表单分区标题 - component-migration(从旧组件迁移时)- ColorUI → wot-design-uni - use-wd-form(组件内包含表单时)- 表单结构、wd-picker、校验规则 禁止事项: - 禁止在 components 目录外创建公共组件 - 禁止不编写组件文档(index.md) - 禁止不提供使用示例和测试页面 - 禁止组件命名不规范(必须使用短横线命名法) - 禁止不定义 TypeScript 类型(types.ts) - 禁止在组件文件顶部不添加说明注释 - 禁止不使用 withDefaults 设置 props 默认值 覆盖场景:所有需要跨页面复用的业务组件,包括表单分区标题(FormSectionTitle)、操作按钮组(ActivityActions)、信息展示卡片(ActivityInfo)、加载状态组件(ZPagingLoading)等。
| name | record-bug-fix-memory |
| description | 当用户要求在 bug 已经定位并修复后,记录排错经验、事故结论、AI 记忆更新、复盘摘要或本地 MCP 记忆时使用。这个技能只负责沉淀"发生了什么、为什么会发生、如何修好、以后要记住什么",不要把它用于实际修复 bug。 |
使用这个技能,把已经完成的排错结果沉淀成可复用的长期记忆。
目标是保存根因、有效修复路径、错误假设和验证证据,让后续 agent 不再重复同样的弯路。
核心原则:记录决策链,不记录流水账。
在以下场景使用这个技能:
以下情况不要使用这个技能:
开始写记忆前,必须能回答下面六个问题:
如果有任何一个问题答不上来,先完成排错,不要提前写记忆。
CLAUDE.md、AGENTS.md、GEMINI.mdgotcha、decision 或 problem-solution默认规则:只要这条经验会影响整个仓库里的未来 agent,就优先写入三个根级 AI 记忆文档,不要埋进包级备注里。
每条记忆至少要覆盖这六件事:
使用简洁、面向未来复用的结构:
问题现象:...根因:...关键误导点:...有效修复:...验证方式:...后续约束:...这些句子应该帮助未来 agent 快速做对事,而不是复述完整排错过程。
当用户要求"补充 AI 记忆"时,不要只写当次 bug 的表面结论。先检查这次问题是否落在仓库已有事故模式里,再把对应经验合并写入记忆。
notice/index.vue 原本有 onMounted(() => reload()),被 agent 两次错误修改:第一次改为 onShow(() => reload())(无文档依据),第二次在用户质疑后将其完全删除(过度纠正)。.claude/skills/z-paging-integration/SKILL.md 的情况下,基于自身对框架的理解擅自修改了生命周期调用方式。用户质疑后,agent 查阅了 z-paging 官方文档,得出"onMounted 是冗余的"结论,又将正确代码删除。auto: true 时组件自动加载,但本项目技能文档明确要求保留 onMounted(() => reload()) 作为统一规范。Agent 将"技术上冗余"误读为"必须删除"。onMounted(() => { pagingRef.value?.reload() }),同时在技能文档 Section 13 添加说明:"略微冗余但为项目统一规范,所有页面必须包含"。onMounted 或 onShow 中的 reload() 调用。complaint/order.vue 和 repair/appraise-reply.vue 使用了 <view class="section-title"> 而非 <FormSectionTitle>,但实际读取文件后发现这两个文件已经正确使用了 <FormSectionTitle>。.section-title 类名(样式定义),误认为模板中使用了旧写法。.section-title { ... } 在 <style> 段中的类定义,与模板中 <view class="section-title"> 的使用是两件不同的事,子代理混淆了两者。FormSectionTitle 和 <view class="section-title 关键词,快速确认了实际使用情况,绕过了子代理的误报。Grep "<view class=\"section-title" 在目标文件中结果为空,Grep "FormSectionTitle" 有结果。pnpm dlx @dcloudio/uvm@latest --manager pnpm 升级 @dcloudio/* 后,uvm 会把 vite 从仓库当前稳定基线 6.4.1 改回 5.2.8,随后 pnpm build:mp-weixin 直接失败,报 The requested module 'vite' does not provide an export named 'DevEnvironment'。uvm 的版本决策只跟随 uni-app 主插件链和模板假设,不考虑本仓库已经接入的 Nitro 接口运行时;它给出的 vite 5.2.8 只是官方插件链声明的兼容下限,不是这个仓库的真实可用基线。vite 手动恢复到 6.4.1、重新 pnpm install 后,同一条 pnpm build:mp-weixin 能恢复通过。@dcloudio/vite-plugin-uni、@uni-helper/vite-plugin-uni-pages 仍声明偏向 vite ^5,很容易让 agent 误以为“必须降回 5 才安全”;但这个仓库已经由用户长期试错确认 vite 6.4.1 + Nitro 是稳定组合,不能让 uvm 的默认假设覆盖仓库实情。uvm 升上去的 @dcloudio/* 版本,但把 vite 明确改回 6.4.1;如果 uvm 顺手改动了与升级目标无关的包版本,也要一并回滚到仓库原本约定值。pnpm install 统一锁文件,再执行 pnpm ls vite @dcloudio/vite-plugin-uni --depth 0 确认当前为 vite 6.4.1,最后执行 pnpm build:mp-weixin;构建通过即可证明“升级 uni-app + 保留 vite 6”这条仓库基线成立。uvm,都必须人工复查 package.json 中的 vite 是否被回退;本仓库默认信任“用户已验证的 vite 6.4.1 + Nitro 基线”,不直接信任 uvm 对 vite 的自动改写。如果这次 bug 与仓库已有事故模式相似,写记忆时不要遗漏下面这些额外信息:
未来写事故记录时,优先记录可重复验证的证据,而不是模糊措辞。
pnpm exec tsc --noEmit 输出中相关错误为 0fresh dev.stderr 为空修复文件均无类型错误输出pnpm install 后依赖版本一致,peer dependency 无冲突应该没问题了看起来像是好了把根级 AI 记忆经验吸收到技能里,不等于把技能写成修复手册。下面这些内容不应该成为这个技能的主体:
CLAUDE.md / AGENTS.md 写着“可用”就假定真的已经拿到工具。这个技能只负责记忆沉淀和总结。
2026-03-28-unocss-config-driven-color-safelist.mdmenu-config.ts、配置数组、动态 class 字符串、Uno safelist、iconify / carbon 图标恢复但颜色仍丢失text-colorui-* / bg-colorui-*/10,并核对主题色 token 是否存在2026-03-29-nitro-dual-runtime-migration-gotchas.mdpnpm.patchedDependencies、Windows 下删除 worktree、旧路径文档收尾Cannot find package "h3" 直接当成 Nitro 代码错误,先确认当前活动工作区已经重新 pnpm install,并核对补丁目标版本与真实安装版本完全一致dev:h5:nitro、H5 在 127.0.0.1:3000、Nitro 在 127.0.0.1:3101、浏览器报 CORS、日志里出现 OPTIONS /app/** 404baseURL、代理或 CORS 头;先同时检查浏览器 Network 和本机端口监听,区分是“预检被业务 dispatcher 误拦截”还是“3101 服务根本没启动”。Endpoint not found: OPTIONS /app/...,优先检查共享 Nitro dispatcher 是否把 OPTIONS 当成业务接口匹配;这类预检请求应该直接返回空成功响应,不应该走 endpoint registry。OPTIONS 预检分支;另一层是 fresh 浏览器请求或 fresh OPTIONS 探针确认 3000 -> 3101 真实跨端口请求返回 200 且带 access-control-allow-* 响应头。2026-03-30-h5-dev-mock-nitro-runtime-verification-gotchas.mdpnpm run dev:h5:mock、pnpm run dev:h5:nitro、浏览器出现 404、请求路径含 /dev-api/dev-api/、Node 22 下 Nitro standalone 启动失败server/** 里只要是可能被 standalone Nitro / 原生 Node 直接执行的运行时代码,就不要使用 @/ alias,也不要写无扩展名的相对导入。server/modules/** 与 Nitro 内置 modules 扫描机制会冲突,相关 ignore 配置不能被后续迁移随手删除。/dev-api/dev-api/...,优先检查 URL 前缀补全链路,不要先去改后端 endpoint registry 或 mock 数据。pages/address/list,2026-03-30)src/pages/address/list(H5 / 模拟器)出现双滚动条;搜索栏像一条细线、被裁切或与列表重叠;稍一滚动搜索区就不见;右侧字母索引区行为异常或与搜索栏抢层。uni-page-body 与内部 scroll-view 同时可滚时,搜索区在页面流里会跟着被卷走,仅从布局上做 sticky 无法稳定(且见下条)。min-h-screen + scroll-view + calc(100vh - …) 与 自定义 tabBar 下 --window-bottom 常为 0 叠加,可视高度与真实可用区不一致,易出现外层滚动与内层滚动并存。position: sticky + top-0 在有 overflow: hidden 的父级上,相对错误的滚动参考系会吸附错位/裁切,表现为「像被盖住」。fixed + top: var(--window-top) + 手写像素 时,与真实搜索栏高度、--window-top 解析差一点点就会 压住搜索区域。:scroll-into-view="\indexes-${listCurID}`"** 在 **listCurID为空** 时变成 **indexes-`,H5 上可能触发 异常整页滚动,整页内容上推,导航下出现大块留白、搜索「像丢了」。<input class="flex-1"> 未配合 min-w-0(及父级 flex-1 未 min-w-0)时,移动端常见 宽度/高度被挤成一条线。scroll-view 外面」就一定不会跟着滚——若 页面级仍可滚,整块仍会上移;以为 单一技巧(只改 sticky、只改 vh、只改 z-index)就能收尾,而忽视 整页滚动源 + 无效 scroll-into-view + flex 最小尺寸。definePage({ style: { disableScroll: true, ... } }):关闭页面容器纵向滚动,仅 scroll-view 内滚动(与各端推荐一致;若与下拉刷新冲突可再评估改为 scroll-view 的 refresher)。position: fixed:top: var(--window-top)、bottom: calc(50px + var(--window-bottom, 0px))(与自定义 tab h-50px + 窗口安全区对齐),整块钉在导航与底栏之间;overscroll-behavior: contain 减轻 H5 外层误拖动。.address-body(列表区域) absolute inset-y-0 right-0,不要再用 fixed + 手写 window-top + 80px 去「猜」列表顶边。scroll-into-view:仅当存在有效字母 id 时再绑定(例如 computed 返回 indexes-${listCurID} 或 undefined),禁止出现 indexes-。min-w-0、min-height: 88rpx(或等价);input 设 min-w-0、明确 height/line-height、文本色,避免塌缩。pnpm run dev:h5:mock 或等价)+ 移动视口下:列表任意滚动,搜索栏始终在固定层顶部完整可见;索引操作不遮盖搜索;控制台无异常滚动相关报错;可用浏览器 MCP 辅助看 document 与内层 uni-scroll-view 的滚动归属。scroll-view:优先 disableScroll: true,并保证 只有一处纵向滚动主战场。--window-bottom;底留白与 position: fixed 的 bottom 要与 tabbar/index.vue 实际高度 + 窗口安全区 一致(当前约定约 50px + var(--window-bottom, 0px))。scroll-into-view 动态 id:空状态必须 不传或 undefined,避免 indexes-。flex-1 链补上 min-w-0,必要时给 明确最小高度/行高。absolute,避免 fixed + 全局窗口度量 与搜索栏叠层纠缠。build:h5:prod + preview:h5、从首页/工作台进入功能页后点击左上角返回无效、浏览器 console 出现 process is not defined、堆栈落在打包后的 index-*.js 或 @dcloudio/uni-shareddev:h5:nitro 本地开发态返回正常,但线上或本地生产预览才失效,先判定为“生产构建/runtime 差异”,不要第一时间去重写 src/router/**、页面里的 navigateBack,也不要把它误判成路由表损坏。ReferenceError: process is not defined,并且堆栈落在 uni-app 产物内部,就要优先排查 H5 runtime 兼容问题,而不是业务页面跳转逻辑。src/main.ts 应用创建前兜底 globalThis.process.env.UNI_APP_X;这属于构建/运行时兼容兜底,不是“修返回按钮文案”或“重写页面切换”。build:h5:prod + preview:h5 或真实线上页面,至少覆盖“首页 -> 功能页 -> 返回”和“工作台 -> 功能页 -> 返回”两条链路,并确认 console 不再出现 process is not defined。pages-sub/property/owner-list,搜索区与「搜索 / 添加」按钮叠在列表中间、像样式全丢;或线上与 localhost 对比觉得「环境不一致」。同一时期 开发/生产均看不到底部自定义 TabBar。<z-paging> 外部与分页组件并列时,z-paging 仍按全高弹性布局接管可视区域,列表层会盖住或挤乱顶部区块,表现为「组件没样式」;不是 wot-design-uni 或 Uno 在生产未加载。#top 调整的旧 assets/pages-sub-property-owner-list*.js,本地已改源码时会出现「只有线上坏」的错觉;根因是部署包龄/缓存,不是运行环境魔法差异。App.ku.vue 原先用 isPageTabbar 控制 FgTabbar,只有 Tab 四页路径为真;所有分包业务页默认不显示底栏,故 dev/prod 一致地没有底栏,除非在配置中显式登记扩展可见路径。#top 插槽。top 插槽编译结果,就下结论「框架 H5 有问题」。<z-paging> 的 <template #top>(与 repair/order-list 等页面一致)。build:h5:prod,部署 dist/build/h5 全量静态资源,必要时刷新 CDN;对比本地 grep/阅读新 chunk 中渲染函数是否含 top: 插槽。tabbar/config.ts 维护 customTabbarExtraVisiblePaths,在 tabbar/store.ts 用 shouldShowCustomTabbar 驱动 App.ku.vue;业务页根容器为 固定底栏预留 padding-bottom(与 tabbar/index.vue 的 约 50px + var(--window-bottom, 0px) 一致),必要时 flex + min-height: 0 让 z-paging 占满剩余高度。pnpm run build:h5:prod 后检查 dist/build/h5/assets/pages-sub-property-owner-list*.js:应先出现 z-paging,内含 top 回调包裹 search-wrap,而不是 search-wrap 与 z-paging 兄弟并列。index-*.js、*.css 200;直接打开线上同名 chunk(若可)确认内容与本地新构建一致。#top 插槽,禁止把整块筛选放在 z-paging 外与分页平级;参考 .claude/skills/z-paging-integration 与已有 repair/order-list。customTabbarExtraVisiblePaths(或等价机制),并处理 底部 safe-area + 列表可滚区域,不要改 pages.json 伪造成 Tab 根页。createLegacyMockDefinitionsFromEndpoints 里 params: {} 为 truthy 时不可再用 params || { ...query/body } 短路合并,否则 H5 mock GET 查询进不了 handler;以 src/tests/nitro-runtime/mock-definition-adapter.test.ts 为回归锚点。2026-04-03-wechat-mini-program-iconify-mask-fallback.mdsrc/pages/index/index.vue、mp-weixin、UnoCSS presetIcons、Iconify 单色图标、H5 正常但微信小程序里图标变纯色方块/纯色底块/空白。i-carbon-warning、i-carbon-location、i-carbon-task-complete、i-carbon-taskdist/dev/mp-weixin/app.wxss 是否已经生成 -webkit-mask、mask、background-color:currentColor。这类问题首先是渲染兼容性,不是 safelist 漏配。wd-icon 改成原生 <view> / <text>,或把 Carbon 换成别的单色 Iconify 集合,都不能保证跳出同一条 mask 兼容链,不应被当成最终修复。src/pages/index/home-menu-config.ts 用 iconImage 指向 /static/image/index_*.png,在 src/pages/index/index.vue 用原生 <image> 渲染。bgClass 有色底块;兼容性修好后还要同步做视觉收尾,否则 H5 和小程序里都会显得很难看。git commit 被 pre-commit 拦截、pnpm run lint:fix 在 oxlint 阶段直接失败、.oxlintrc.json 含 import/consistent-type-specifier-stylepnpm exec oxlint --config .oxlintrc.json 的配置解析结果;如果这里已经报 unknown variant "top-level",就先修规则枚举值,不要先怀疑本次提交内容。oxlint 对 import/consistent-type-specifier-style 只接受 prefer-top-level 或 prefer-inline;仓库里写成 "top-level" 会让整个 hook 在解析阶段就短路。lint-staged 场景只校验当前 staged 文件;如果全量 pnpm run lint:fix 仍被仓库里其他旧文件拖住,至少要额外验证一次“只针对本次 staged 文件”的 eslint / pre-commit 路径是否已恢复。lint:fix 自动改写了本次提交边界之外的文件,要先把无关自动修复回退,只保留计划内文件,再提交;不要把排障副作用混进当前 commit。CLAUDE.md / AGENTS.md / GEMINI.md 声明“有 Memorix 工具”,但当前 Codex 会话未实际暴露对应 MCP 工具pages.json->pages/index/index duplication 时,先检查脏的 src/pages.json,不要先怀疑 Nitro 编排(2026-03-29)pnpm run dev:mp-weixin:nitro、pnpm exec uni -p mp-weixin --mode development-nitro-api、终端直接报 pages.json->pages/index/index duplicationscripts/dev-mp-weixin-nitro.mjs 剥离出来,直接运行目标平台编译命令;如果裸 uni -p mp-weixin 也同样报 duplication,就说明根因在 uni-pages 路由生成链,而不是 Nitro 端口、健康检查或双进程 orchestration。src/pages.json 是否混入旧的 #ifdef MP-WEIXIN 条目和新的 GENERATED BY UNI-PAGES 条目;同一路由同时出现“旧条件块 + 新生成块”时,优先判定为脏的生成文件,不要先去改 pages.config.ts、VITE_SERVER_BASEURL 或 Nitro 启动脚本。path 的 src/pages.json,再把这份干净生成物保留下来。pnpm exec uni -p mp-weixin --mode development-nitro-api 能到 Build complete. Watching for changes...,以及 pnpm run dev:mp-weixin:nitro 也能正常 ready。若怀疑平台切换会复发,再补一轮 H5 -> mp-weixin 切换回归。build:nitro 不等于 build:nitro:vercel,必须显式注入 NITRO_PRESET=vercel(2026-03-29)package.json 构建脚本、nitro.config.ts、NITRO_PRESETbuild:nitro 默认理解成 Vercel 构建;如果它对应的是 node 产物,就必须额外派生 build:nitro:vercel,让 Vercel 项目显式调用这个命令。nitro.config.ts 里不要写死 preset: "node";应把平台选择权交给命令行环境变量,否则 NITRO_PRESET=vercel 会被仓库配置抵消。pnpm run build:nitro;必须实际执行 pnpm run build:nitro:vercel,并确认产物落在 .vercel/output,而不是只生成 .output/server。env/.env.production、env/.env.production-nitro-api、VITE_SERVER_BASEURL、VITE_APP_PROXY_ENABLEVITE_SERVER_BASEURL、VITE_UPLOAD_BASEURL、VITE_API_SECONDARY_URL 必须直接指向 Nitro 生产域名 https://01s-11-app-server.ruan-cat.com,不要误写成 H5 自身域名,也不要改成相对路径赌平台代理。vite dev server 的代理只解决本地开发,不解决线上双域名部署;生产环境必须明确关闭 VITE_APP_PROXY_ENABLE,并把跨域问题交给 Nitro 的真实 CORS / 预检处理。build:h5:prod 打印出的生产环境变量是否已切到 Nitro 生产域名。.github/workflows/ci.yml、turbo.json、pnpm run ci、build:nitro:vercelpnpm run ci 的职责只是用 GitHub Actions 帮忙提前发现 build:h5:prod 与 build:nitro:vercel 的构建断裂,属于健壮性自检,不会替代 Vercel 的项目配置、域名绑定或发布流程。turbo do-build 增加 build:nitro:vercel 时,文档与报告里必须明确标注“这是 CI 自检增强”,不要把这条改动描述成“已接通 Vercel 部署”。dev 生产分支依赖 GitHub 导入授权(2026-03-29)ruan-cat/11comm-app、要求生产分支固定到 devREADY,也不能据此声称“Git 集成已完成”;这最多说明平台项目与部署参数正确。productionBranch=dev 这类 Git 绑定配置,前提是 Vercel 侧已经真正导入并接通 GitHub 仓库;如果 vercel git connect 或仓库导入失败,就不能继续假设分支策略已经生效。.vercel/output 与 .output 后,要第一时间加入 Git 忽略(2026-03-29)build:nitro:vercel、本地执行 Nitro node / vercel 构建、仓库出现 .vercel/ 与 .output/.vercel/output 或 .output/server,就同步把 .vercel/ 与 .output/ 写进 .gitignore,不要等构建产物已经污染工作区后再补救。.vercel/ 很容易在引入 Vercel CLI 或 Nitro preset 后被误提交。git status,确认工作区里不再把这两个目录报成未跟踪文件。.claude/skills/fix-bug/record-bug-fix-memory/*.mdCLAUDE.md、AGENTS.md、GEMINI.md 只在用户明确要求同步 AI 记忆文档时才更新