diff --git a/docs/OPENSPEC.md b/docs/OPENSPEC.md
index 0cf90ed..6c11136 100644
--- a/docs/OPENSPEC.md
+++ b/docs/OPENSPEC.md
@@ -1,7 +1,7 @@
# OpenSpec Global Standards | 全局开发规范
-**Version**: 1.1.0
-**Date**: 2025-11-21
+**Version**: 1.2.0
+**Date**: 2025-11-22
**Project**: Open Wisdom Lab Website
**Status**: Living Document (活文档)
@@ -9,6 +9,7 @@
## 📋 Table of Contents
+- [0. Documentation Architecture](#0-documentation-architecture)
- [1. Introduction](#1-introduction)
- [2. Architecture Standards](#2-architecture-standards)
- [3. Code Organization](#3-code-organization)
@@ -26,6 +27,49 @@
---
+## 0. Documentation Architecture
+
+### 0.1 文档职责划分
+
+本项目有两个核心规范文档,各有侧重:
+
+| 文档 | 位置 | 目标读者 | 主要内容 |
+|------|------|---------|----------|
+| **CLAUDE.md** | `/CLAUDE.md` | AI 助手 (Claude Code) | 项目快速参考、开发命令、i18n 规范、代码审查清单 |
+| **OPENSPEC.md** | `/docs/OPENSPEC.md` | 人类开发者 | 完整架构标准、代码规范、测试规范、部署流程 |
+
+### 0.2 避免重复维护
+
+为避免信息不一致:
+
+1. **技术栈版本** - 以 `package.json` 为准,两文档引用时说明"详见 package.json"
+2. **项目结构** - OPENSPEC.md 为权威源,CLAUDE.md 仅保留精简版本
+3. **i18n 规范** - 两文档均需保留(AI 助手高频使用),保持同步
+4. **组件开发规范** - OPENSPEC.md 为完整版,CLAUDE.md 保留快速参考
+
+### 0.3 更新原则
+
+- **新增规范** → 先更新 OPENSPEC.md,再同步简化版到 CLAUDE.md
+- **版本变更** → 更新 package.json,两文档均添加"详见 package.json"引用
+- **审查变更** → 每次更新时检查两文档的一致性
+
+### 0.4 相关文档索引
+
+```
+docs/
+├── OPENSPEC.md # 本文档 - 全局开发规范 (权威源)
+├── ROADMAP.md # 产品路线图与开发计划
+├── DESIGN_SYSTEM.md # 设计系统规范
+├── ARCHITECTURE.md # 系统架构说明
+├── DEPLOYMENT.md # 部署流程指南
+├── CONSISTENCY_AUDIT.md # 代码一致性审核
+├── CONTENT_GAPS.md # 内容缺口分析
+├── DEVELOPMENT.md # 开发环境搭建
+└── component-props-guide.md # 组件 Props 类型化指南
+```
+
+---
+
## 1. Introduction
### 1.1 Purpose | 目的
@@ -1479,6 +1523,7 @@ import logo from '~/assets/images/logo.svg';
| Version | Date | Author | Changes |
|---------|------|--------|---------|
+| 1.2.0 | 2025-11-22 | Claude | 添加文档架构章节(Section 0),明确 CLAUDE.md 与 OPENSPEC.md 职责划分 |
| 1.1.0 | 2025-11-21 | Claude | 更新技术栈版本,同步 package.json |
| 1.0.0 | 2025-11-19 | Claude | Initial OpenSpec creation |
diff --git a/docs/ROADMAP.md b/docs/ROADMAP.md
index 53bc9a6..894c21e 100644
--- a/docs/ROADMAP.md
+++ b/docs/ROADMAP.md
@@ -1,6 +1,6 @@
# Product Roadmap 2025-2026 | 产品路线图
-**Version**: 1.3.0
+**Version**: 1.4.0
**Last Updated**: 2025-11-22
**Project**: Open Wisdom Lab Website
**Related Documents**: [docs/](./docs/) 目录下的所有文档
@@ -70,6 +70,7 @@
- [x] 移除 6 个未使用组件 (HighlightedPosts, LatestPosts, Button, Card, Pricing, Announcement)
- [x] 优化 PageLayout 移除重复的背景动画组件
- [x] 补充 Note.astro 组件双语翻译
+ - [x] 移除 9 个 cyber 组件的 'use client' 指令 (消除 sourcemap 警告)
#### Week 3-4: TypeScript 迁移
- [x] 添加类型定义
@@ -77,15 +78,16 @@
- [x] 定义 `SiteConfig.ts`
- [x] 定义 `BlogPost.ts`
- [x] 定义 `Navigation.ts`
-- [ ] 组件 Props 类型化
- - [ ] 为所有组件添加 `export interface Props`
+- [x] 组件 Props 类型化 (部分完成)
+ - [x] 为核心 widgets 组件添加 Props (Hero, Vision, CallToAction)
+ - [ ] 为剩余 ~19 个组件添加 `export interface Props`
- [ ] 配置重构
- [ ] 创建 `src/config/` 模块化配置
**Deliverables:**
- [x] 完整的开发规范文档
-- [ ] 100% TypeScript 覆盖
-- [ ] 0 ESLint/TypeScript 错误
+- [ ] 100% TypeScript 覆盖 (~80% 已完成)
+- [x] 0 ESLint/TypeScript 错误 (构建通过)
- [x] 统一的代码风格
**Metrics:**
@@ -758,6 +760,15 @@ Week 2:
## 📝 Changelog | 更新日志
+### Version 1.4.0 (2025-11-22)
+- **文档架构优化**
+ - 更新 OPENSPEC.md v1.2.0: 添加文档架构章节(Section 0)
+ - 明确 CLAUDE.md 与 OPENSPEC.md 的职责划分和更新原则
+- **构建质量提升**
+ - 移除 9 个 cyber 组件的 'use client' 指令,消除 sourcemap 警告
+ - 为核心组件添加 Props 类型定义 (Hero, Vision, CallToAction)
+- **构建状态**: 0 errors, 0 warnings, 1 hint
+
### Version 1.3.0 (2025-11-22)
- **代码质量优化**
- 修复 deprecated API (substr -> substring)
diff --git a/src/components/ui/cyber/CyberButton.tsx b/src/components/ui/cyber/CyberButton.tsx
index 7ee8116..40713de 100644
--- a/src/components/ui/cyber/CyberButton.tsx
+++ b/src/components/ui/cyber/CyberButton.tsx
@@ -1,5 +1,3 @@
-'use client';
-
import React, { useRef, useState } from 'react';
import { motion, useMotionValue, useSpring } from 'framer-motion';
diff --git a/src/components/ui/cyber/CyberCard.tsx b/src/components/ui/cyber/CyberCard.tsx
index 30b2598..d5a8249 100644
--- a/src/components/ui/cyber/CyberCard.tsx
+++ b/src/components/ui/cyber/CyberCard.tsx
@@ -1,5 +1,3 @@
-'use client';
-
import React, { useRef, useState } from 'react';
import { motion, useMotionValue, useSpring, useTransform } from 'framer-motion';
diff --git a/src/components/ui/cyber/FloatingElements.tsx b/src/components/ui/cyber/FloatingElements.tsx
index d07bcd7..5ca4405 100644
--- a/src/components/ui/cyber/FloatingElements.tsx
+++ b/src/components/ui/cyber/FloatingElements.tsx
@@ -1,5 +1,3 @@
-'use client';
-
import React from 'react';
import { motion } from 'framer-motion';
diff --git a/src/components/ui/cyber/GlitchText.tsx b/src/components/ui/cyber/GlitchText.tsx
index 34b4c42..8b5aec8 100644
--- a/src/components/ui/cyber/GlitchText.tsx
+++ b/src/components/ui/cyber/GlitchText.tsx
@@ -1,5 +1,3 @@
-'use client';
-
import React, { useEffect, useState } from 'react';
import { motion } from 'framer-motion';
diff --git a/src/components/ui/cyber/GridBackground.tsx b/src/components/ui/cyber/GridBackground.tsx
index 0a320ba..cf3f465 100644
--- a/src/components/ui/cyber/GridBackground.tsx
+++ b/src/components/ui/cyber/GridBackground.tsx
@@ -1,5 +1,3 @@
-'use client';
-
import React from 'react';
import { motion } from 'framer-motion';
diff --git a/src/components/ui/cyber/HolographicBorder.tsx b/src/components/ui/cyber/HolographicBorder.tsx
index 74e1b9d..5042b8a 100644
--- a/src/components/ui/cyber/HolographicBorder.tsx
+++ b/src/components/ui/cyber/HolographicBorder.tsx
@@ -1,5 +1,3 @@
-'use client';
-
import React from 'react';
import { motion } from 'framer-motion';
diff --git a/src/components/ui/cyber/NoiseOverlay.tsx b/src/components/ui/cyber/NoiseOverlay.tsx
index 5e2f694..4d41813 100644
--- a/src/components/ui/cyber/NoiseOverlay.tsx
+++ b/src/components/ui/cyber/NoiseOverlay.tsx
@@ -1,5 +1,3 @@
-'use client';
-
import React from 'react';
interface NoiseOverlayProps {
diff --git a/src/components/ui/cyber/ParallaxSection.tsx b/src/components/ui/cyber/ParallaxSection.tsx
index f79f81f..eb29202 100644
--- a/src/components/ui/cyber/ParallaxSection.tsx
+++ b/src/components/ui/cyber/ParallaxSection.tsx
@@ -1,5 +1,3 @@
-'use client';
-
import React, { useRef } from 'react';
import { motion, useScroll, useTransform, useSpring } from 'framer-motion';
diff --git a/src/components/ui/cyber/ScrollReveal.tsx b/src/components/ui/cyber/ScrollReveal.tsx
index 3220e64..08c734c 100644
--- a/src/components/ui/cyber/ScrollReveal.tsx
+++ b/src/components/ui/cyber/ScrollReveal.tsx
@@ -1,5 +1,3 @@
-'use client';
-
import React, { useRef } from 'react';
import { motion, useInView, type Variants } from 'framer-motion';
diff --git a/src/components/widgets/CallToAction.astro b/src/components/widgets/CallToAction.astro
index cdd681d..23041bb 100644
--- a/src/components/widgets/CallToAction.astro
+++ b/src/components/widgets/CallToAction.astro
@@ -1,5 +1,23 @@
---
import { CyberButton } from '~/components/ui/cyber';
+
+/**
+ * Call to Action component for conversion points
+ *
+ * @component
+ * @example
+ * ```astro
+ *
+ * ```
+ */
+export interface Props {
+ /** Link destination for the CTA button @default '#contact' */
+ href?: string;
+ /** Optional custom class name */
+ class?: string;
+}
+
+const { href = '#contact', class: _className = '' } = Astro.props;
---
@@ -22,7 +40,7 @@ import { CyberButton } from '~/components/ui/cyber';