| name | feature-dev |
| description | 开发新功能时确保逻辑一致、配色统一。Use when: adding new features, creating new components, adding new pages, implementing new IPC channels, extending the UI. 确保新代码遵循现有架构模式和视觉风格。 |
| argument-hint | 描述要开发的新功能 |
新功能开发 — 一致性保障流程
开发新功能时,必须参考现有功能的实现模式,确保逻辑通顺、页面配色与风格一致。
When to Use
- 新增 React 组件或页面
- 新增 IPC 通道和主进程处理逻辑
- 扩展已有功能模块
- 添加新的 CSS 样式
Procedure
第一步:探索现有功能
在动手写代码之前,先理解相关的现有实现:
- 找到最相似的现有功能:在
src/renderer/src/components/ 中找到与新功能最接近的组件,通读其完整实现
- 理解数据流:从 renderer → preload → main 跟踪完整的调用链路
- 检查类型定义:阅读
src/renderer/src/types/conversation.ts 和 src/preload/index.ts 中的类型
- 查看样式模式:阅读相似组件的
.module.css 文件,记录它使用的颜色和布局模式
第二步:遵循组件结构模板
新 React 组件必须遵循以下结构:
import React, { useState, useCallback, useRef, useEffect } from "react";
import styles from "./ComponentName.module.css";
import type { SomeType } from "../types/conversation";
interface Props {
}
const ComponentName: React.FC<Props> = (
{
/* 解构 props */
},
) => {
const [value, setValue] = useState("");
const scrollRef = useRef<HTMLDivElement>(null);
const isBusy = isLoading || isProcessing;
const handleAction = useCallback(() => {
}, [dependencies]);
useEffect(() => {
return () => {
};
}, [dependencies]);
return <div className={styles.container}>{/* 组件内容 */}</div>;
};
export default ComponentName;
第三步:遵循配色规范
严格使用以下颜色体系,不要引入新颜色:
详见 配色规范。
核心原则:
- 背景:
#f0f4ff(主背景)、#ffffff(卡片/面板)、#e8f0ff / #eef3ff(浅蓝高亮)
- 文字:
#1a2650(主文本)、#4a5a88(次要)、#6a7890(辅助)、#8a9ab8(弱化)
- 主色调:
#3b82f6(主蓝)、#1f42d1(深蓝)、#7c3aed(紫色)
- 边框:
#d0deff(标准)、#dce8ff(浅)、#b0c8f5(输入框/卡片)
- 状态色:
#7dff99 / #27ae60(成功)、#ff7070 / #e74c3c(错误)、#f0a500(警告)
- 渐变:
linear-gradient(135deg, #7c3aed, #2563eb)(紫→蓝)、linear-gradient(135deg, #4a7cf0, #00c8ff)(蓝→青)
- 阴影:
rgba(45, 78, 170, 0.1~0.12) 蓝色调阴影
第四步:遵循样式模式
新增 CSS Module 文件时:
- 文件命名:
ComponentName.module.css
- 类名 camelCase:
.container、.scrollArea、.toolbarInner
- 布局统一用 Flexbox,间距使用标准尺度:
4/6/8/10/12/14/16/20/24px
- 圆角标准:
4px(小按钮)→ 8px(按钮)→ 12px(气泡)→ 14px(卡片/弹窗)
- 焦点态:
:focus-within 配合 box-shadow: 0 0 0 3px rgba(74, 124, 240, 0.12)
- 渐变边框技巧:
.card {
background:
linear-gradient(#ffffff, #ffffff) padding-box,
linear-gradient(135deg, #4a7cf0, #7c3aed, #00c8ff) border-box;
border: 1px solid transparent;
border-radius: 14px;
}
- 过渡动画:统一
transition: all 0.2s 或 0.25s
第五步:遵循 IPC 通信模式
新增后端交互时:
- 频道命名:
"namespace:action" 格式,如 "chat:send"、"kb:list"
- 主进程注册(
src/main/index.ts):
ipcMain.handle("namespace:action", async (event, params) => {
});
- Preload 暴露(
src/preload/index.ts):
namespace: {
action: (params) => ipcRenderer.invoke("namespace:action", params),
onEvent: (callback) => {
const handler = (_, data) => callback(data)
ipcRenderer.on("namespace:event", handler)
return () => ipcRenderer.removeListener("namespace:event", handler)
}
}
- 流式输出模式:
invoke 发起 → on 接收 token → on 接收 done/error
第六步:命名规范
| 类别 | 约定 | 示例 |
|---|
| 组件文件 | PascalCase.tsx | KnowledgeBase.tsx |
| 样式文件 | PascalCase.module.css | KnowledgeBase.module.css |
| 类型文件 | camelCase.ts | conversation.ts |
| 工具文件 | camelCase.ts | fileTools.ts |
| CSS 类名 | camelCase | .scrollArea |
| 事件处理 | handle + 动作 | handleSend |
| 回调 Props | on + 动作 | onCopyMessage |
| 布尔状态 | is + 形容词 | isLoading |
| Ref 变量 | 名词 + Ref | scrollRef |
| 工厂函数 | create + 实体 | createConversation |
| IPC 频道 | 命名空间:动作 | "storage:save" |
第七步:验证清单
功能开发完成后,逐项检查: