From 57e2435b4f06069ab27df00cdac9dba4cf5e6e90 Mon Sep 17 00:00:00 2001 From: Affaan Mustafa Date: Sun, 5 Apr 2026 17:16:18 -0700 Subject: [PATCH] docs: remove orphaned template translations --- WORKING-CONTEXT.md | 1 + .../project-guidelines-example/SKILL.md | 349 ----------------- .../project-guidelines-example/SKILL.md | 354 ------------------ 3 files changed, 1 insertion(+), 703 deletions(-) delete mode 100644 docs/ko-KR/skills/project-guidelines-example/SKILL.md delete mode 100644 docs/zh-CN/skills/project-guidelines-example/SKILL.md diff --git a/WORKING-CONTEXT.md b/WORKING-CONTEXT.md index 50bc46b9..64eace5a 100644 --- a/WORKING-CONTEXT.md +++ b/WORKING-CONTEXT.md @@ -156,3 +156,4 @@ Keep this file detailed for only the current sprint, blockers, and next actions. - 2026-04-05: Added `skills/product-capability` plus `docs/examples/product-capability-template.md` as the canonical PRD-to-SRS lane for issue `#1185`. This is the ECC-native capability-contract step between vague product intent and implementation, and it lives in `business-content` rather than spawning a parallel planning subsystem. - 2026-04-05: Tightened `product-lens` so it no longer overlaps the new capability-contract lane. `product-lens` now explicitly owns product diagnosis / brief validation, while `product-capability` owns implementation-ready capability plans and SRS-style constraints. - 2026-04-05: Continued `#1213` cleanup by removing stale references to the deleted `project-guidelines-example` skill from exported inventory/docs and marking `continuous-learning` v1 as a supported legacy path with an explicit handoff to `continuous-learning-v2`. +- 2026-04-05: Removed the last orphaned localized `project-guidelines-example` docs from `docs/ko-KR` and `docs/zh-CN`. The template now lives only in `docs/examples/project-guidelines-template.md`, which matches the current repo surface and avoids shipping translated docs for a deleted skill. diff --git a/docs/ko-KR/skills/project-guidelines-example/SKILL.md b/docs/ko-KR/skills/project-guidelines-example/SKILL.md deleted file mode 100644 index a70dcc3a..00000000 --- a/docs/ko-KR/skills/project-guidelines-example/SKILL.md +++ /dev/null @@ -1,349 +0,0 @@ ---- -name: project-guidelines-example -description: "실제 프로덕션 애플리케이션을 기반으로 한 프로젝트별 스킬 템플릿 예시." -origin: ECC ---- - -# 프로젝트 가이드라인 스킬 (예시) - -이것은 프로젝트별 스킬의 예시입니다. 자신의 프로젝트에 맞는 템플릿으로 사용하세요. - -실제 프로덕션 애플리케이션을 기반으로 합니다: [Zenith](https://zenith.chat) - AI 기반 고객 발견 플랫폼. - -## 사용 시점 - -이 스킬이 설계된 특정 프로젝트에서 작업할 때 참조하세요. 프로젝트 스킬에는 다음이 포함됩니다: -- 아키텍처 개요 -- 파일 구조 -- 코드 패턴 -- 테스팅 요구사항 -- 배포 워크플로우 - ---- - -## 아키텍처 개요 - -**기술 스택:** -- **Frontend**: Next.js 15 (App Router), TypeScript, React -- **Backend**: FastAPI (Python), Pydantic 모델 -- **Database**: Supabase (PostgreSQL) -- **AI**: Claude API (도구 호출 및 구조화된 출력) -- **Deployment**: Google Cloud Run -- **Testing**: Playwright (E2E), pytest (백엔드), React Testing Library - -**서비스:** -``` -┌─────────────────────────────────────────────────────────────┐ -│ Frontend │ -│ Next.js 15 + TypeScript + TailwindCSS │ -│ Deployed: Vercel / Cloud Run │ -└─────────────────────────────────────────────────────────────┘ - │ - ▼ -┌─────────────────────────────────────────────────────────────┐ -│ Backend │ -│ FastAPI + Python 3.11 + Pydantic │ -│ Deployed: Cloud Run │ -└─────────────────────────────────────────────────────────────┘ - │ - ┌───────────────┼───────────────┐ - ▼ ▼ ▼ - ┌──────────┐ ┌──────────┐ ┌──────────┐ - │ Supabase │ │ Claude │ │ Redis │ - │ Database │ │ API │ │ Cache │ - └──────────┘ └──────────┘ └──────────┘ -``` - ---- - -## 파일 구조 - -``` -project/ -├── frontend/ -│ └── src/ -│ ├── app/ # Next.js app router 페이지 -│ │ ├── api/ # API 라우트 -│ │ ├── (auth)/ # 인증 보호 라우트 -│ │ └── workspace/ # 메인 앱 워크스페이스 -│ ├── components/ # React 컴포넌트 -│ │ ├── ui/ # 기본 UI 컴포넌트 -│ │ ├── forms/ # 폼 컴포넌트 -│ │ └── layouts/ # 레이아웃 컴포넌트 -│ ├── hooks/ # 커스텀 React hooks -│ ├── lib/ # 유틸리티 -│ ├── types/ # TypeScript 정의 -│ └── config/ # 설정 -│ -├── backend/ -│ ├── routers/ # FastAPI 라우트 핸들러 -│ ├── models.py # Pydantic 모델 -│ ├── main.py # FastAPI 앱 엔트리 -│ ├── auth_system.py # 인증 -│ ├── database.py # 데이터베이스 작업 -│ ├── services/ # 비즈니스 로직 -│ └── tests/ # pytest 테스트 -│ -├── deploy/ # 배포 설정 -├── docs/ # 문서 -└── scripts/ # 유틸리티 스크립트 -``` - ---- - -## 코드 패턴 - -### API 응답 형식 (FastAPI) - -```python -from pydantic import BaseModel -from typing import Generic, TypeVar, Optional - -T = TypeVar('T') - -class ApiResponse(BaseModel, Generic[T]): - success: bool - data: Optional[T] = None - error: Optional[str] = None - - @classmethod - def ok(cls, data: T) -> "ApiResponse[T]": - return cls(success=True, data=data) - - @classmethod - def fail(cls, error: str) -> "ApiResponse[T]": - return cls(success=False, error=error) -``` - -### Frontend API 호출 (TypeScript) - -```typescript -interface ApiResponse { - success: boolean - data?: T - error?: string -} - -async function fetchApi( - endpoint: string, - options?: RequestInit -): Promise> { - try { - const response = await fetch(`/api${endpoint}`, { - ...options, - headers: { - 'Content-Type': 'application/json', - ...options?.headers, - }, - }) - - if (!response.ok) { - return { success: false, error: `HTTP ${response.status}` } - } - - return await response.json() - } catch (error) { - return { success: false, error: String(error) } - } -} -``` - -### Claude AI 통합 (구조화된 출력) - -```python -from anthropic import Anthropic -from pydantic import BaseModel - -class AnalysisResult(BaseModel): - summary: str - key_points: list[str] - confidence: float - -async def analyze_with_claude(content: str) -> AnalysisResult: - client = Anthropic() - - response = client.messages.create( - model="claude-sonnet-4-5-20250514", - max_tokens=1024, - messages=[{"role": "user", "content": content}], - tools=[{ - "name": "provide_analysis", - "description": "Provide structured analysis", - "input_schema": AnalysisResult.model_json_schema() - }], - tool_choice={"type": "tool", "name": "provide_analysis"} - ) - - # Extract tool use result - tool_use = next( - block for block in response.content - if block.type == "tool_use" - ) - - return AnalysisResult(**tool_use.input) -``` - -### 커스텀 Hooks (React) - -```typescript -import { useState, useCallback } from 'react' - -interface UseApiState { - data: T | null - loading: boolean - error: string | null -} - -export function useApi( - fetchFn: () => Promise> -) { - const [state, setState] = useState>({ - data: null, - loading: false, - error: null, - }) - - const execute = useCallback(async () => { - setState(prev => ({ ...prev, loading: true, error: null })) - - const result = await fetchFn() - - if (result.success) { - setState({ data: result.data!, loading: false, error: null }) - } else { - setState({ data: null, loading: false, error: result.error! }) - } - }, [fetchFn]) - - return { ...state, execute } -} -``` - ---- - -## 테스팅 요구사항 - -### Backend (pytest) - -```bash -# Run all tests -poetry run pytest tests/ - -# Run with coverage -poetry run pytest tests/ --cov=. --cov-report=html - -# Run specific test file -poetry run pytest tests/test_auth.py -v -``` - -**테스트 구조:** -```python -import pytest -from httpx import AsyncClient -from main import app - -@pytest.fixture -async def client(): - async with AsyncClient(app=app, base_url="http://test") as ac: - yield ac - -@pytest.mark.asyncio -async def test_health_check(client: AsyncClient): - response = await client.get("/health") - assert response.status_code == 200 - assert response.json()["status"] == "healthy" -``` - -### Frontend (React Testing Library) - -```bash -# Run tests -npm run test - -# Run with coverage -npm run test -- --coverage - -# Run E2E tests -npm run test:e2e -``` - -**테스트 구조:** -```typescript -import { render, screen, fireEvent } from '@testing-library/react' -import { WorkspacePanel } from './WorkspacePanel' - -describe('WorkspacePanel', () => { - it('renders workspace correctly', () => { - render() - expect(screen.getByRole('main')).toBeInTheDocument() - }) - - it('handles session creation', async () => { - render() - fireEvent.click(screen.getByText('New Session')) - expect(await screen.findByText('Session created')).toBeInTheDocument() - }) -}) -``` - ---- - -## 배포 워크플로우 - -### 배포 전 체크리스트 - -- [ ] 모든 테스트가 로컬에서 통과 -- [ ] `npm run build` 성공 (frontend) -- [ ] `poetry run pytest` 통과 (backend) -- [ ] 하드코딩된 시크릿 없음 -- [ ] 환경 변수 문서화됨 -- [ ] 데이터베이스 마이그레이션 준비됨 - -### 배포 명령어 - -```bash -# Build and deploy frontend -cd frontend && npm run build -gcloud run deploy frontend --source . - -# Build and deploy backend -cd backend -gcloud run deploy backend --source . -``` - -### 환경 변수 - -```bash -# Frontend (.env.local) -NEXT_PUBLIC_API_URL=https://api.example.com -NEXT_PUBLIC_SUPABASE_URL=https://xxx.supabase.co -NEXT_PUBLIC_SUPABASE_ANON_KEY=eyJ... - -# Backend (.env) -DATABASE_URL=postgresql://... -ANTHROPIC_API_KEY=sk-ant-... -SUPABASE_URL=https://xxx.supabase.co -SUPABASE_KEY=eyJ... -``` - ---- - -## 핵심 규칙 - -1. **코드, 주석, 문서에 이모지 없음** -2. **불변성** - 객체나 배열을 절대 변형하지 않음 -3. **TDD** - 구현 전에 테스트 작성 -4. **80% 커버리지** 최소 -5. **작은 파일 여러 개** - 200-400줄이 일반적, 800줄 최대 -6. **프로덕션 코드에 console.log 없음** -7. **적절한 에러 처리** (try/catch 사용) -8. **입력 유효성 검사** (Pydantic/Zod 사용) - ---- - -## 관련 스킬 - -- `coding-standards.md` - 일반 코딩 모범 사례 -- `backend-patterns.md` - API 및 데이터베이스 패턴 -- `frontend-patterns.md` - React 및 Next.js 패턴 -- `tdd-workflow/` - 테스트 주도 개발 방법론 diff --git a/docs/zh-CN/skills/project-guidelines-example/SKILL.md b/docs/zh-CN/skills/project-guidelines-example/SKILL.md deleted file mode 100644 index 6de989e3..00000000 --- a/docs/zh-CN/skills/project-guidelines-example/SKILL.md +++ /dev/null @@ -1,354 +0,0 @@ ---- -name: project-guidelines-example -description: "基于真实生产应用的示例项目特定技能模板。" -origin: ECC ---- - -# 项目指南技能(示例) - -这是一个项目特定技能的示例。将其用作您自己项目的模板。 - -基于一个真实的生产应用程序:[Zenith](https://zenith.chat) - 由 AI 驱动的客户发现平台。 - -## 何时使用 - -在为其设计的特定项目上工作时,请参考此技能。项目技能包含: - -* 架构概述 -* 文件结构 -* 代码模式 -* 测试要求 -* 部署工作流 - -*** - -## 架构概述 - -**技术栈:** - -* **前端**: Next.js 15 (App Router), TypeScript, React -* **后端**: FastAPI (Python), Pydantic 模型 -* **数据库**: Supabase (PostgreSQL) -* **AI**: Claude API,支持工具调用和结构化输出 -* **部署**: Google Cloud Run -* **测试**: Playwright (E2E), pytest (后端), React Testing Library - -**服务:** - -``` -┌─────────────────────────────────────────────────────────────┐ -│ 前端 │ -│ Next.js 15 + TypeScript + TailwindCSS │ -│ 部署平台:Vercel / Cloud Run │ -└─────────────────────────────────────────────────────────────┘ - │ - ▼ -┌─────────────────────────────────────────────────────────────┐ -│ 后端 │ -│ FastAPI + Python 3.11 + Pydantic │ -│ 部署平台:Cloud Run │ -└─────────────────────────────────────────────────────────────┘ - │ - ┌───────────────┼───────────────┐ - ▼ ▼ ▼ - ┌──────────┐ ┌──────────┐ ┌──────────┐ - │ Supabase │ │ Claude │ │ Redis │ - │ 数据库 │ │ API │ │ 缓存 │ - └──────────┘ └──────────┘ └──────────┘ -``` - -*** - -## 文件结构 - -``` -project/ -├── frontend/ -│ └── src/ -│ ├── app/ # Next.js 应用路由页面 -│ │ ├── api/ # API 路由 -│ │ ├── (auth)/ # 受身份验证保护的路由 -│ │ └── workspace/ # 主应用工作区 -│ ├── components/ # React 组件 -│ │ ├── ui/ # 基础 UI 组件 -│ │ ├── forms/ # 表单组件 -│ │ └── layouts/ # 布局组件 -│ ├── hooks/ # 自定义 React 钩子 -│ ├── lib/ # 工具库 -│ ├── types/ # TypeScript 类型定义 -│ └── config/ # 配置文件 -│ -├── backend/ -│ ├── routers/ # FastAPI 路由处理器 -│ ├── models.py # Pydantic 模型 -│ ├── main.py # FastAPI 应用入口 -│ ├── auth_system.py # 身份验证模块 -│ ├── database.py # 数据库操作 -│ ├── services/ # 业务逻辑层 -│ └── tests/ # pytest 测试 -│ -├── deploy/ # 部署配置 -├── docs/ # 文档 -└── scripts/ # 工具脚本 -``` - -*** - -## 代码模式 - -### API 响应格式 (FastAPI) - -```python -from pydantic import BaseModel -from typing import Generic, TypeVar, Optional - -T = TypeVar('T') - -class ApiResponse(BaseModel, Generic[T]): - success: bool - data: Optional[T] = None - error: Optional[str] = None - - @classmethod - def ok(cls, data: T) -> "ApiResponse[T]": - return cls(success=True, data=data) - - @classmethod - def fail(cls, error: str) -> "ApiResponse[T]": - return cls(success=False, error=error) -``` - -### 前端 API 调用 (TypeScript) - -```typescript -interface ApiResponse { - success: boolean - data?: T - error?: string -} - -async function fetchApi( - endpoint: string, - options?: RequestInit -): Promise> { - try { - const response = await fetch(`/api${endpoint}`, { - ...options, - headers: { - 'Content-Type': 'application/json', - ...options?.headers, - }, - }) - - if (!response.ok) { - return { success: false, error: `HTTP ${response.status}` } - } - - return await response.json() - } catch (error) { - return { success: false, error: String(error) } - } -} -``` - -### Claude AI 集成 (结构化输出) - -```python -from anthropic import Anthropic -from pydantic import BaseModel - -class AnalysisResult(BaseModel): - summary: str - key_points: list[str] - confidence: float - -async def analyze_with_claude(content: str) -> AnalysisResult: - client = Anthropic() - - response = client.messages.create( - model="claude-sonnet-4-5-20250514", - max_tokens=1024, - messages=[{"role": "user", "content": content}], - tools=[{ - "name": "provide_analysis", - "description": "Provide structured analysis", - "input_schema": AnalysisResult.model_json_schema() - }], - tool_choice={"type": "tool", "name": "provide_analysis"} - ) - - # Extract tool use result - tool_use = next( - block for block in response.content - if block.type == "tool_use" - ) - - return AnalysisResult(**tool_use.input) -``` - -### 自定义 Hooks (React) - -```typescript -import { useState, useCallback } from 'react' - -interface UseApiState { - data: T | null - loading: boolean - error: string | null -} - -export function useApi( - fetchFn: () => Promise> -) { - const [state, setState] = useState>({ - data: null, - loading: false, - error: null, - }) - - const execute = useCallback(async () => { - setState(prev => ({ ...prev, loading: true, error: null })) - - const result = await fetchFn() - - if (result.success) { - setState({ data: result.data!, loading: false, error: null }) - } else { - setState({ data: null, loading: false, error: result.error! }) - } - }, [fetchFn]) - - return { ...state, execute } -} -``` - -*** - -## 测试要求 - -### 后端 (pytest) - -```bash -# Run all tests -poetry run pytest tests/ - -# Run with coverage -poetry run pytest tests/ --cov=. --cov-report=html - -# Run specific test file -poetry run pytest tests/test_auth.py -v -``` - -**测试结构:** - -```python -import pytest -from httpx import AsyncClient -from main import app - -@pytest.fixture -async def client(): - async with AsyncClient(app=app, base_url="http://test") as ac: - yield ac - -@pytest.mark.asyncio -async def test_health_check(client: AsyncClient): - response = await client.get("/health") - assert response.status_code == 200 - assert response.json()["status"] == "healthy" -``` - -### 前端 (React Testing Library) - -```bash -# Run tests -npm run test - -# Run with coverage -npm run test -- --coverage - -# Run E2E tests -npm run test:e2e -``` - -**测试结构:** - -```typescript -import { render, screen, fireEvent } from '@testing-library/react' -import { WorkspacePanel } from './WorkspacePanel' - -describe('WorkspacePanel', () => { - it('renders workspace correctly', () => { - render() - expect(screen.getByRole('main')).toBeInTheDocument() - }) - - it('handles session creation', async () => { - render() - fireEvent.click(screen.getByText('New Session')) - expect(await screen.findByText('Session created')).toBeInTheDocument() - }) -}) -``` - -*** - -## 部署工作流 - -### 部署前检查清单 - -* \[ ] 所有测试在本地通过 -* \[ ] `npm run build` 成功 (前端) -* \[ ] `poetry run pytest` 通过 (后端) -* \[ ] 没有硬编码的密钥 -* \[ ] 环境变量已记录 -* \[ ] 数据库迁移就绪 - -### 部署命令 - -```bash -# Build and deploy frontend -cd frontend && npm run build -gcloud run deploy frontend --source . - -# Build and deploy backend -cd backend -gcloud run deploy backend --source . -``` - -### 环境变量 - -```bash -# Frontend (.env.local) -NEXT_PUBLIC_API_URL=https://api.example.com -NEXT_PUBLIC_SUPABASE_URL=https://xxx.supabase.co -NEXT_PUBLIC_SUPABASE_ANON_KEY=eyJ... - -# Backend (.env) -DATABASE_URL=postgresql://... -ANTHROPIC_API_KEY=sk-ant-... -SUPABASE_URL=https://xxx.supabase.co -SUPABASE_KEY=eyJ... -``` - -*** - -## 关键规则 - -1. 在代码、注释或文档中**不使用表情符号** -2. **不可变性** - 永不改变对象或数组 -3. **测试驱动开发 (TDD)** - 在实现之前编写测试 -4. **最低 80% 覆盖率** -5. **许多小文件** - 典型 200-400 行,最多 800 行 -6. 在生产代码中**不使用 console.log** -7. 使用 try/catch 进行**适当的错误处理** -8. 使用 Pydantic/Zod 进行**输入验证** - -*** - -## 相关技能 - -* `coding-standards.md` - 通用编码最佳实践 -* `backend-patterns.md` - API 和数据库模式 -* `frontend-patterns.md` - React 和 Next.js 模式 -* `tdd-workflow/` - 测试驱动开发方法论