Skip to main content

feature-development

Guide for developing new features in the DEVS platform following the modular feature architecture. Use this when asked to add a new feature, create a feature module, or understand the feature structure.

معلومات المصدر

المستودع
codename-co/devs
آخر نشاط في المصدر
٧ مارس ٢٠٢٦ في ١٣:١٤
لغة SKILL.md المكتشفة
الإنجليزية
النجوم
٥٣
التفرعات
٢

خيارات التثبيت

يُحدَّد Prompt الذي يراجع المصدر أولًا بشكل افتراضي. يمكنك التبديل إلى أمر مباشر أو تنزيل نسخة محلية.

مراجعة ملفات المصدر

اقرأ SKILL.md وأي ملفات مرافقة يعرضها SkillsMP قبل أن تقرر التثبيت.

عرض SKILL.md

SKILL.md
تعليمات المصدر · معاينة للقراءة فقط
name
feature-development
description
Guide for developing new features in the DEVS platform following the modular feature architecture. Use this when asked to add a new feature, create a feature module, or understand the feature structure.
# Feature Development for DEVS Features in DEVS are self-contained modules that encapsulate related functionality. Each feature has its own components, hooks, stores, and logic. ## Feature Directory Structure ``` src/features/{feature-name}/ ├── index.ts # Public exports ├── components/ # Feature-specific components │ ├── FeatureComponent.tsx │ └── index.ts ├── hooks/ # Feature-specific hooks │ ├── useFeatureHook.ts │ └── index.ts ├── stores/ # Feature-specific stores (if needed) │ └── featureStore.ts ├── lib/ # Feature-specific utilities │ └── feature-utils.ts ├── types/ # Feature-specific types │ └── index.ts └── README.md # Feature documentation ``` ## Existing Features Reference | Feature | Directory | Description | | ------------ | ---------------------------- | ----------------------------------- | | Connectors | `src/features/connectors/` | OAuth integrations (Google, Notion) | | Live | `src/features/live/` | Real-time collaboration | | Sync | `src/features/sync/` | P2P data synchronization via Yjs | | Traces | `src/features/traces/` | LLM observability and analytics | | Local Backup | `src/features/local-backup/` | File system sync | ## Creating a New Feature ### 1. Create Feature Directory ```bash mkdir -p src/features/my-feature/{components,hooks,lib,types} ``` ### 2. Define Types ```typescript // src/features/my-feature/types/index.ts export interface MyFeatureConfig { enabled: boolean option1: string option2: number } export interface MyFeatureState { isActive: boolean data: MyFeatureData[] } export interface MyFeatureData { id: string name: string createdAt: Date } ``` ### 3. Create Feature Store (if needed) ```typescript // src/features/my-feature/stores/myFeatureStore.ts import { create } from 'zustand' import type { MyFeatureState, MyFeatureData } from '../types' interface MyFeatureActions { initialize: () => Promise<void> addData: (data: MyFeatureData) => void clear: () => void } export const useMyFeatureStore = create<MyFeatureState & MyFeatureActions>( (set) => ({ isActive: false, data: [], initialize: async () => { // Initialize feature set({ isActive: true }) }, addData: (data) => { set((state) => ({ data: [...state.data, data] })) }, clear: () => { set({ data: [], isActive: false }) }, }), ) ``` ### 4. Create Components ```typescript // src/features/my-feature/components/MyFeaturePanel.tsx import { Card, CardBody, Button } from '@heroui/react' import { useTranslation } from 'react-i18next' import { useMyFeatureStore } from '../stores/myFeatureStore' export function MyFeaturePanel() { const { t } = useTranslation() const { isActive, data, initialize } = useMyFeatureStore() if (!isActive) { return ( <Card> <CardBody> <Button onPress={initialize}> {t('myFeature.activate')} </Button> </CardBody> </Card> ) } return ( <Card> <CardBody> <h2>{t('myFeature.title')}</h2> {data.map((item) => ( <div key={item.id}>{item.name}</div> ))} </CardBody> </Card> ) } ``` ### 5. Create Hooks ```typescript // src/features/my-feature/hooks/useMyFeature.ts import { useCallback, useEffect } from 'react' import { useMyFeatureStore } from '../stores/myFeatureStore' export function useMyFeature() { const store = useMyFeatureStore() useEffect(() => { // Setup on mount return () => { // Cleanup on unmount } }, []) const handleAction = useCallback(async () => { // Feature-specific logic }, []) return { ...store, handleAction, } } ``` ### 6. Create Public Exports ```typescript // src/features/my-feature/index.ts export { MyFeaturePanel } from './components/MyFeaturePanel' export { useMyFeature } from './hooks/useMyFeature' export { useMyFeatureStore } from './stores/myFeatureStore' export type { MyFeatureConfig, MyFeatureState, MyFeatureData } from './types' ``` ### 7. Add Feature Documentation ```markdown <!-- src/features/my-feature/README.md --> # My Feature Brief description of what this feature does. ## Usage \`\`\`tsx import { MyFeaturePanel, useMyFeature } from '@/features/my-feature' function App() { const { isActive, handleAction } = useMyFeature() return <MyFeaturePanel /> } \`\`\` ## Configuration Describe configuration options... ## API Reference ### Components - `MyFeaturePanel` - Main UI component ### Hooks - `useMyFeature()` - Primary hook for feature functionality ### Store - `useMyFeatureStore` - Zustand store for feature state ``` ## Integration Points ### Adding to Navigation ```typescript // In relevant page or layout import { MyFeaturePanel } from '@/features/my-feature' function MyPage() { return ( <div> <MyFeaturePanel /> </div> ) } ``` ### Feature Flags For features that need to be toggleable: ```typescript // src/features/my-feature/lib/feature-flags.ts export function isMyFeatureEnabled(): boolean { // Check user settings, environment, etc. return localStorage.getItem('myFeature.enabled') === 'true' } ``` ### Adding Translations ```typescript // Add to src/i18n/locales/en.ts export default { // ... existing translations myFeature: { title: 'My Feature', activate: 'Activate Feature', description: 'Feature description', }, } ``` ## Testing Features ```typescript // src/test/features/my-feature/MyFeaturePanel.test.tsx import { render, screen } from '@testing-library/react' import { describe, it, expect, vi, beforeEach } from 'vitest' import { MyFeaturePanel } from '@/features/my-feature' import { useMyFeatureStore } from '@/features/my-feature/stores/myFeatureStore' vi.mock('react-i18next', () => ({ useTranslation: () => ({ t: (key: string) => key }), })) describe('MyFeaturePanel', () => { beforeEach(() => { useMyFeatureStore.setState({ isActive: false, data: [] }) }) it('shows activate button when inactive', () => { render(<MyFeaturePanel />) expect(screen.getByText('myFeature.activate')).toBeInTheDocument() }) it('shows data when active', () => { useMyFeatureStore.setState({ isActive: true, data: [{ id: '1', name: 'Test', createdAt: new Date() }], }) render(<MyFeaturePanel />) expect(screen.getByText('Test')).toBeInTheDocument() }) }) ``` ## Best Practices 1. **Keep features isolated**: Minimize dependencies between features 2. **Use index exports**: Only expose public API through `index.ts` 3. **Document thoroughly**: Each feature should have a README 4. **Test in isolation**: Feature tests shouldn't depend on other features 5. **Lazy load when possible**: Use dynamic imports for large features
عرض على GitHub