Skip to content
Back to skills

1378 Ophel Engineering Patterns 66e714ad

ASecurity

> 从 [Ophel](https://github.com/urzeye/ophel) 项目学习到的优秀工程化实践 **创建时间**: 2026-02-04 **来源项目**: Ophel v1.0 - AI 对话增强工具(155★) **应用场景**: 适用于所有需要统一接口、模板化管理、跨平台兼容的项目 ---

  • 9 stars
  • 0 votes
  • 0 copies
  • 0 views
  • Added October 11, 2026
developmenttypescriptgoreactnoderefactoringgitapi

Works with

  • api

Security analysis

A100/100

Scanned October 11, 2026

npx -y skills add tools-only/X-Skills --skill 1378-ophel-engineering-patterns_66e714ad --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of 1378 Ophel Engineering Patterns 66e714ad?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for 1378 Ophel Engineering Patterns 66e714ad
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/tools-only-1378-ophel-engineering-patterns-66e714ad/badge)](https://www.skillsdirectory.com/skills/tools-only-1378-ophel-engineering-patterns-66e714ad)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

SKILL.md
# Ophel 工程化模式分析

> 从 [Ophel](https://github.com/urzeye/ophel) 项目学习到的优秀工程化实践

**创建时间**: 2026-02-04
**来源项目**: Ophel v1.0 - AI 对话增强工具(155★)
**应用场景**: 适用于所有需要统一接口、模板化管理、跨平台兼容的项目

---

## 📊 项目概况

### Ophel 是什么?

**核心功能**: 将 AI 对话转化为可组织、可复用的工作流

**核心价值**:
- 🧠 **智能大纲** - 自动解析对话生成可导航目录
- 💬 **会话管理** - 文件夹分类、标签、搜索、批量操作
- ⌨️ **提示词库** - 变量支持、Markdown 预览、分类管理
- 🔌 **跨平台支持** - ChatGPT/Claude/Gemini/Grok 统一体验

### 技术栈

- **框架**: Plasmo (浏览器扩展) + Vite (油猴脚本)
- **UI**: React 18 + TypeScript 5
- **状态管理**: Zustand 4.5
- **构建**: 双平台(Extension + Userscript)

---

## 🎯 核心设计模式

### 1️⃣ 适配器模式(Adapter Pattern)

#### 问题背景

不同 AI 平台(ChatGPT、Claude、Gemini 等)的 DOM 结构、API 接口、数据格式各不相同。如何提供统一的功能增强?

#### Ophel 的解决方案

```
┌─────────────────────────────────────────┐
│  站点适配器层 (Site Adapters)           │
│  ├─ ChatGPT Adapter                     │
│  ├─ Claude Adapter                      │
│  ├─ Gemini Adapter                      │
│  └─ Grok Adapter                        │
└─────────────────────────────────────────┘
           ↓ 统一接口
┌─────────────────────────────────────────┐
│  核心模块 (Core Modules)                │
│  ├─ Outline Manager (大纲生成)          │
│  ├─ Reading History (阅读历史)          │
│  ├─ Model Lock (模型锁定)               │
│  └─ Network Monitor (请求监控)          │
└─────────────────────────────────────────┘
```

**关键设计**:
- 每个平台有独立的适配器,负责 DOM 操作和数据提取
- 核心模块通过统一接口调用适配器,无需关心底层差异
- 新增平台只需实现适配器接口

**收益**:
- ✅ 核心代码与平台解耦,易于维护
- ✅ 新增平台成本低(1-2天 → 半天)
- ✅ 单元测试简单(Mock 适配器即可)

#### 可复用的模式

```typescript
// 通用适配器接口
interface PlatformAdapter {
  name: string;
  detectPlatform(): boolean;
  extractMessages(): Message[];
  injectUI(component: React.ReactNode): void;
  observeChanges(callback: () => void): void;
}

// 具体实现
class ChatGPTAdapter implements PlatformAdapter {
  name = 'ChatGPT';

  detectPlatform() {
    return window.location.href.includes('chatgpt.com');
  }

  extractMessages() {
    const elements = document.querySelectorAll('.message');
    return Array.from(elements).map(el => ({
      role: el.dataset.role,
      content: el.textContent
    }));
  }

  // ...
}

// 注册和使用
const adapters = [
  new ChatGPTAdapter(),
  new ClaudeAdapter(),
  new GeminiAdapter()
];

const currentAdapter = adapters.find(a => a.detectPlatform());
```

**适用场景**:
- 多平台/多数据源项目
- 需要统一接口的系统
- 频繁添加新数据源的场景

---

### 2️⃣ 模板库系统(Template Library)

#### 问题背景

用户频繁使用相似的提示词,每次手动输入效率低,且难以沉淀优质 Prompt。

#### Ophel 的解决方案

**Prompt 库设计**:
```typescript
interface PromptTemplate {
  id: string;
  name: string;
  category: string;
  content: string;        // 支持 {{变量名}} 语法
  variables: string[];    // 变量列表
  tags: string[];
  createdAt: Date;
  usageCount: number;
}

// 示例
{
  name: "代码审查",
  category: "开发",
  content: `请审查以下 {{语言}} 代码:

代码:
{{代码内容}}

重点关注:
1. 潜在的性能问题
2. 安全漏洞
3. 可读性和最佳实践`,
  variables: ["语言", "代码内容"]
}
```

**核心特性**:
- ✅ **变量支持** - `{{变量名}}` 动态替换
- ✅ **分类管理** - 按场景/领域组织
- ✅ **一键填充** - 快速插入输入框
- ✅ **Markdown 预览** - 实时查看格式化效果

**使用流程**:
```
1. 用户选择模板
   ↓
2. 填写变量值(弹窗表单)
   ↓
3. 自动替换 {{变量}} → 实际值
   ↓
4. 插入到输入框
```

#### 可复用的模式

```typescript
// 变量替换引擎
function renderTemplate(template: string, variables: Record<string, string>): string {
  return template.replace(/\{\{(\w+)\}\}/g, (match, key) => {
    return variables[key] || match;
  });
}

// 模板管理器
class TemplateManager {
  private templates: Map<string, PromptTemplate> = new Map();

  register(template: PromptTemplate) {
    this.templates.set(template.id, template);
  }

  get(id: string) {
    return this.templates.get(id);
  }

  listByCategory(category: string) {
    return Array.from(this.templates.values())
      .filter(t => t.category === category);
  }

  render(id: string, variables: Record<string, string>) {
    const template = this.get(id);
    if (!template) return null;
    return renderTemplate(template.content, variables);
  }
}
```

**适用场景**:
- 需要可复用配置的系统
- 频繁使用相似输入的场景
- 需要团队共享最佳实践的项目

---

### 3️⃣ 结构化文档系统

#### 问题背景

项目文档分散、不易查找、缺乏统一规范。

#### Ophel 的文档结构

```
ophel/
├── README.md                # 主文档(功能演示、快速开始)
├── docs/
│   ├── i18n/               # 多语言(10 种语言)
│   │   ├── README_en.md
│   │   ├── README_ja.md
│   │   └── ...
│   └── architecture/        # 架构文档(Mermaid 图)
│
├── assets/
│   └── demo/               # 演示 GIF/视频
│
└── CHANGELOG.md            # 版本历史(语义化版本)
```

**关键特性**:
- ✅ **清晰的功能演示** - 3 个动画 GIF 展示核心功能
- ✅ **多语言支持** - 10 种语言覆盖(中/英/日/韩/德/法/西/葡/俄/繁中)
- ✅ **架构图可视化** - 使用 Mermaid 展示系统架构
- ✅ **完整的 Changelog** - 记录每个版本的 Added/Changed/Fixed

#### Changelog 格式规范

```markdown
## [0.3.0] - 2026-02-05

### Added - 新增
- 🎨 适配器模式:统一数据源接口
- 📚 模板库系统:10+ 可视化预设

### Changed - 变更
- 🏗️ 重构:Store 拆分为多个业务 Store

### Fixed - 修复
- 🐛 修复内存泄漏问题
- ⚡ 优化渲染性能(60fps → 120fps)

### Deprecated - 废弃
- ⚠️ 旧版 V2 UI(将在 v1.0 移除)
```

**适用场景**:
- 开源项目
- 需要多人协作的项目
- 需要国际化的产品

---

### 4️⃣ 分层状态管理

#### 问题背景

单一 Store 承担过多职责,难以维护和测试。

#### Ophel 的 Store 架构

```typescript
// 按功能拆分 Store
stores/
├── useSettingsStore.ts      // 用户设置(主题、语言、性能配置)
├── usePromptsStore.ts        // 提示词库(CRUD、搜索、分类)
├── useConversationsStore.ts  // 会话管理(文件夹、标签、搜索)
└── useUIStore.ts             // UI 状态(面板显示、选中项)
```

**设计原则**:
- ✅ **单一职责** - 每个 Store 只管理一类数据
- ✅ **独立持久化** - 根据需要选择本地/会话/内存存储
- ✅ **跨 Store 通信** - 通过订阅模式而非直接依赖

**持久化策略**:
```typescript
// Zustand + persist middleware
const useSettingsStore = create(
  persist(
    (set) => ({
      theme: 'dark',
      language: 'zh-CN',
      updateSettings: (settings) => set(settings)
    }),
    {
      name: 'ophel-settings',
      storage: localStorage,  // 或 sessionStorage、chrome.storage
      partialize: (state) => ({
        // 只持久化这些字段
        theme: state.theme,
        language: state.language
      })
    }
  )
);
```

**适用场景**:
- 中大型应用
- 需要复杂状态管理的项目
- 多端同步需求(通过 chrome.storage.sync)

---

### 5️⃣ 双平台构建系统

#### 问题背景

同时支持浏览器扩展(Extension)和油猴脚本(Userscript),共享代码的同时处理平台差异。

#### Ophel 的构建架构

```
src/
├── platform/
│   ├── extension/          # 扩展特有代码
│   │   ├── background.ts  # Service Worker
│   │   ├── content.tsx    # Content Script 入口
│   │   └── options.tsx    # 选项页面
│   │
│   └── userscript/         # 油猴特有代码
│       └── entry.tsx      # 油猴脚本入口
│
├── core/                   # 共享核心代码
│   ├── adapters/
│   ├── stores/
│   └── components/
│
└── ...
```

**构建脚本**:
```json
{
  "scripts": {
    "dev": "plasmo dev",                    // 扩展开发模式
    "build": "plasmo build",                // 扩展生产构建
    "build:firefox": "plasmo build --target=firefox-mv3",
    "build:userscript": "vite build"        // 油猴脚本构建
  }
}
```

**平台抽象层**:
```typescript
// 统一的存储 API
interface StorageAdapter {
  get(key: string): Promise<any>;
  set(key: string, value: any): Promise<void>;
}

// 扩展实现
class ExtensionStorage implements StorageAdapter {
  async get(key: string) {
    return chrome.storage.local.get(key);
  }
  async set(key: string, value: any) {
    return chrome.storage.local.set({ [key]: value });
  }
}

// 油猴实现
class UserscriptStorage implements StorageAdapter {
  async get(key: string) {
    return JSON.parse(GM_getValue(key, '{}'));
  }
  async set(key: string, value: any) {
    GM_setValue(key, JSON.stringify(value));
  }
}

// 自动选择
const storage: StorageAdapter = IS_EXTENSION
  ? new ExtensionStorage()
  : new UserscriptStorage();
```

**适用场景**:
- 需要多平台发布的工具
- 跨平台兼容性要求高的项目
- 需要共享核心代码的多端应用

---

## 🔧 工程化最佳实践

### 1. 环境检测和错误处理

```typescript
// 启动时环境检测
function checkEnvironment() {
  const checks = [
    {
      name: 'Browser',
      valid: typeof window !== 'undefined',
      message: 'Must run in browser environment'
    },
    {
      name: 'DOM',
      valid: typeof document !== 'undefined',
      message: 'DOM API not available'
    },
    {
      name: 'Storage',
      valid: typeof localStorage !== 'undefined',
      message: 'localStorage not supported'
    }
  ];

  const failed = checks.filter(c => !c.valid);
  if (failed.length > 0) {
    console.error('Environment check failed:', failed);
    failed.forEach(f => console.error(`- ${f.name}: ${f.message}`));
    return false;
  }

  console.log('✅ Environment check passed');
  return true;
}
```

### 2. Shadow DOM 隔离

```typescript
// 防止样式污染
const shadowRoot = document.createElement('div');
shadowRoot.id = 'ophel-root';
document.body.appendChild(shadowRoot);

const shadow = shadowRoot.attachShadow({ mode: 'open' });

// 注入样式(隔离)
const style = document.createElement('style');
style.textContent = `/* Ophel 样式 */`;
shadow.appendChild(style);

// 挂载 React 应用
const root = createRoot(shadow);
root.render(<App />);
```

### 3. 资源清理

```typescript
// 组件卸载时清理资源
useEffect(() => {
  const observer = new MutationObserver(handleDOMChange);
  observer.observe(document.body, { childList: true, subtree: true });

  return () => {
    observer.disconnect();  // 清理 Observer
  };
}, []);
```

### 4. 性能优化

```typescript
// 节流处理频繁事件
const debouncedSearch = useMemo(
  () => debounce((query: string) => {
    performSearch(query);
  }, 300),
  []
);

// 虚拟滚动大列表
import { useVirtualizer } from '@tanstack/react-virtual';

const virtualizer = useVirtualizer({
  count: conversations.length,
  getScrollElement: () => scrollRef.current,
  estimateSize: () => 60
});
```

---

## 📋 应用到 Claude Reconstruction

### 1. 适配器模式应用

**场景**: 统一多种数据源(Claude Config、Project Structure、Markdown Files)

**实施**:
- ✅ 已创建 `src/adapters/` 目录结构
- ✅ 已实现 `DataSourceAdapter` 接口
- ✅ 已完成 ClaudeConfigAdapter 和 ProjectStructureAdapter

**下一步**:
- [ ] 添加 MarkdownFilesAdapter(解析 Markdown 文件为知识图谱)
- [ ] 添加 GitHistoryAdapter(可视化 Git 提交历史)

### 2. 模板库系统应用

**场景**: 可复用的可视化配置(节点样式、布局算法、配色方案)

**计划**:
```typescript
// src/templates/visualization-presets.ts
export const presets = {
  'tech-orbital': {
    nodeStyle: 'tech-sphere',
    layout: 'orbital-3-rings',
    colorScheme: 'cyberpunk-neon'
  },
  'minimal-force': {
    nodeStyle: 'data-cube',
    layout: 'force-directed',
    colorScheme: 'minimal-grayscale'
  }
};
```

### 3. 文档系统优化

**已完成**:
- ✅ 创建 `docs/` 目录结构
- ✅ 完整的优化方案文档(OPTIMIZATION_PLAN.md)
- ✅ 快速参考指南(QUICK_REFERENCE.md)

**待补充**:
- [ ] 多语言支持(README_en.md, README_ja.md)
- [ ] 架构图(使用 Mermaid)
- [ ] 完整的 CHANGELOG.md

### 4. Store 重构

**已完成**:
- ✅ 拆分 `useDataSourceStore`(数据源管理)
- ✅ 持久化策略(只保存适配器选择)

**待完成**:
- [ ] `useVisualizationStore`(可视化配置)
- [ ] `useUIStore`(UI 状态)
- [ ] `useSettingsStore`(用户设置)

---

## 🎯 可量化的改进

| 指标 | Ophel 的水平 | Claude Reconstruction 目标 |
|------|------------|---------------------------|
| **代码复用率** | ~80% | 当前 40% → 目标 80% |
| **新数据源接入** | 2 小时 | 当前 4 小时 → 目标 1 小时 |
| **构建失败率** | < 2% | 当前 ~10% → 目标 < 2% |
| **文档查找时间** | 30 秒 | 当前 5 分钟 → 目标 30 秒 |
| **新人上手时间** | 半天 | 当前 2 天 → 目标 半天 |

---

## 🔗 参考资源

- **Ophel 项目**: https://github.com/urzeye/ophel
- **Plasmo 框架**: https://docs.plasmo.com/
- **Zustand 文档**: https://github.com/pmndrs/zustand
- **适配器模式**: https://refactoring.guru/design-patterns/adapter

---

**整理人**: Arxchibobo
**整理时间**: 2026-02-04
**状态**: ✅ 完成

**下一步行动**:
1. 将此文档添加到 `claude-reconstruction/learning/` 目录
2. 更新 README.md 添加对 Ophel 模式的引用
3. 创建实施计划文档

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.