@kurokeita/add-skill 2.6.1 → 3.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +43 -64
- package/dist/bin/cli.js +270 -478
- package/dist/skills/statusline-setup/.claude-plugin/plugin.json +1 -1
- package/dist/skills/statusline-setup/SKILL.md +48 -448
- package/dist/skills/statusline-setup/mod/hooks/register.tsx +93 -103
- package/dist/skills/statusline-setup/mod/tests/work.test.ts +28 -10
- package/dist/skills/statusline-setup/mod/types/index.d.ts +2 -1
- package/dist/skills/universalize-agents/reference/mapping.md +3 -2
- package/package.json +3 -3
- package/dist/agents/backend-specialist.md +0 -277
- package/dist/agents/code-archaeologist.md +0 -114
- package/dist/agents/database-architect.md +0 -238
- package/dist/agents/debugger.md +0 -231
- package/dist/agents/devops-engineer.md +0 -242
- package/dist/agents/documentation-writer.md +0 -104
- package/dist/agents/explorer-agent.md +0 -79
- package/dist/agents/frontend-specialist.md +0 -594
- package/dist/agents/game-developer.md +0 -162
- package/dist/agents/mobile-developer.md +0 -383
- package/dist/agents/orchestrator.md +0 -435
- package/dist/agents/penetration-tester.md +0 -188
- package/dist/agents/performance-optimizer.md +0 -191
- package/dist/agents/product-manager.md +0 -122
- package/dist/agents/product-owner.md +0 -106
- package/dist/agents/project-planner.md +0 -408
- package/dist/agents/qa-automation-engineer.md +0 -109
- package/dist/agents/security-auditor.md +0 -171
- package/dist/agents/test-engineer.md +0 -158
- package/dist/skills/agent-identifier/SKILL.md +0 -431
- package/dist/skills/agent-identifier/examples/agent-creation-prompt.md +0 -247
- package/dist/skills/agent-identifier/examples/complete-agent-examples.md +0 -432
- package/dist/skills/agent-identifier/references/agent-creation-system-prompt.md +0 -215
- package/dist/skills/agent-identifier/references/system-prompt-design.md +0 -419
- package/dist/skills/agent-identifier/references/triggering-examples.md +0 -508
- package/dist/skills/agent-identifier/scripts/validate-agent.sh +0 -217
- package/dist/skills/code-review-excellence/SKILL.md +0 -525
- package/dist/skills/component-refactoring/SKILL.md +0 -492
- package/dist/skills/component-refactoring/references/complexity-patterns.md +0 -493
- package/dist/skills/component-refactoring/references/component-splitting.md +0 -477
- package/dist/skills/component-refactoring/references/hook-extraction.md +0 -317
- package/dist/skills/context7-guidelines/SKILL.md +0 -31
- package/dist/skills/feature-design-assistant/SKILL.md +0 -371
- package/dist/skills/find-bugs/SKILL.md +0 -75
- package/dist/skills/frontend-design/SKILL.md +0 -45
- package/dist/skills/go-concurrency-patterns/SKILL.md +0 -657
- package/dist/skills/grill-me/SKILL.md +0 -9
- package/dist/skills/handoff/SKILL.md +0 -16
- package/dist/skills/koreader-plugin-development/SKILL.md +0 -141
- package/dist/skills/koreader-plugin-development/examples/2-example-patch.lua +0 -17
- package/dist/skills/koreader-plugin-development/examples/_meta.lua +0 -6
- package/dist/skills/koreader-plugin-development/examples/helloworld.lua +0 -36
- package/dist/skills/koreader-plugin-development/references/debugging.md +0 -92
- package/dist/skills/koreader-plugin-development/references/events-and-widgets.md +0 -102
- package/dist/skills/koreader-plugin-development/references/patches.md +0 -118
- package/dist/skills/koreader-plugin-development/references/plugin-anatomy.md +0 -97
- package/dist/skills/make-instruction/SKILL.md +0 -68
- package/dist/skills/make-prompt/SKILL.md +0 -70
- package/dist/skills/make-skill/SKILL.md +0 -147
- package/dist/skills/prd-to-tasks/SKILL.md +0 -164
- package/dist/skills/react-native-async-patterns/SKILL.md +0 -256
- package/dist/skills/react-native-performance/SKILL.md +0 -425
- package/dist/skills/react-native-testing/SKILL.md +0 -458
- package/dist/skills/react-native-zustand-patterns/SKILL.md +0 -343
- package/dist/skills/skill-creator/SKILL.md +0 -385
- package/dist/skills/skill-creator/scripts/init_skill.cjs +0 -235
- package/dist/skills/skill-creator/scripts/package_skill.cjs +0 -84
- package/dist/skills/skill-creator/scripts/validate_skill.cjs +0 -127
- package/dist/skills/skill-development/SKILL.md +0 -676
- package/dist/skills/skill-development/references/skill-creator-original.md +0 -210
- package/dist/skills/sql-optimization-patterns/SKILL.md +0 -509
- package/dist/skills/test-driven-development/SKILL.md +0 -114
- package/dist/skills/test-driven-development/deep-modules.md +0 -33
- package/dist/skills/test-driven-development/interface-design.md +0 -35
- package/dist/skills/test-driven-development/mocking.md +0 -68
- package/dist/skills/test-driven-development/refactoring.md +0 -10
- package/dist/skills/test-driven-development/tests.md +0 -61
- package/dist/skills/vercel-react-best-practices/AGENTS.md +0 -2410
- package/dist/skills/vercel-react-best-practices/SKILL.md +0 -127
- package/dist/skills/vercel-react-best-practices/rules/advanced-event-handler-refs.md +0 -55
- package/dist/skills/vercel-react-best-practices/rules/advanced-use-latest.md +0 -49
- package/dist/skills/vercel-react-best-practices/rules/async-api-routes.md +0 -38
- package/dist/skills/vercel-react-best-practices/rules/async-defer-await.md +0 -80
- package/dist/skills/vercel-react-best-practices/rules/async-dependencies.md +0 -36
- package/dist/skills/vercel-react-best-practices/rules/async-parallel.md +0 -28
- package/dist/skills/vercel-react-best-practices/rules/async-suspense-boundaries.md +0 -99
- package/dist/skills/vercel-react-best-practices/rules/bundle-barrel-imports.md +0 -59
- package/dist/skills/vercel-react-best-practices/rules/bundle-conditional.md +0 -31
- package/dist/skills/vercel-react-best-practices/rules/bundle-defer-third-party.md +0 -49
- package/dist/skills/vercel-react-best-practices/rules/bundle-dynamic-imports.md +0 -35
- package/dist/skills/vercel-react-best-practices/rules/bundle-preload.md +0 -50
- package/dist/skills/vercel-react-best-practices/rules/client-event-listeners.md +0 -74
- package/dist/skills/vercel-react-best-practices/rules/client-localstorage-schema.md +0 -71
- package/dist/skills/vercel-react-best-practices/rules/client-passive-event-listeners.md +0 -48
- package/dist/skills/vercel-react-best-practices/rules/client-swr-dedup.md +0 -56
- package/dist/skills/vercel-react-best-practices/rules/js-batch-dom-css.md +0 -82
- package/dist/skills/vercel-react-best-practices/rules/js-cache-function-results.md +0 -80
- package/dist/skills/vercel-react-best-practices/rules/js-cache-property-access.md +0 -28
- package/dist/skills/vercel-react-best-practices/rules/js-cache-storage.md +0 -70
- package/dist/skills/vercel-react-best-practices/rules/js-combine-iterations.md +0 -32
- package/dist/skills/vercel-react-best-practices/rules/js-early-exit.md +0 -50
- package/dist/skills/vercel-react-best-practices/rules/js-hoist-regexp.md +0 -45
- package/dist/skills/vercel-react-best-practices/rules/js-index-maps.md +0 -37
- package/dist/skills/vercel-react-best-practices/rules/js-length-check-first.md +0 -50
- package/dist/skills/vercel-react-best-practices/rules/js-min-max-loop.md +0 -82
- package/dist/skills/vercel-react-best-practices/rules/js-set-map-lookups.md +0 -24
- package/dist/skills/vercel-react-best-practices/rules/js-tosorted-immutable.md +0 -57
- package/dist/skills/vercel-react-best-practices/rules/rendering-activity.md +0 -26
- package/dist/skills/vercel-react-best-practices/rules/rendering-animate-svg-wrapper.md +0 -47
- package/dist/skills/vercel-react-best-practices/rules/rendering-conditional-render.md +0 -40
- package/dist/skills/vercel-react-best-practices/rules/rendering-content-visibility.md +0 -38
- package/dist/skills/vercel-react-best-practices/rules/rendering-hoist-jsx.md +0 -46
- package/dist/skills/vercel-react-best-practices/rules/rendering-hydration-no-flicker.md +0 -82
- package/dist/skills/vercel-react-best-practices/rules/rendering-svg-precision.md +0 -28
- package/dist/skills/vercel-react-best-practices/rules/rerender-defer-reads.md +0 -39
- package/dist/skills/vercel-react-best-practices/rules/rerender-dependencies.md +0 -45
- package/dist/skills/vercel-react-best-practices/rules/rerender-derived-state.md +0 -29
- package/dist/skills/vercel-react-best-practices/rules/rerender-functional-setstate.md +0 -74
- package/dist/skills/vercel-react-best-practices/rules/rerender-lazy-state-init.md +0 -58
- package/dist/skills/vercel-react-best-practices/rules/rerender-memo.md +0 -44
- package/dist/skills/vercel-react-best-practices/rules/rerender-transitions.md +0 -40
- package/dist/skills/vercel-react-best-practices/rules/server-after-nonblocking.md +0 -73
- package/dist/skills/vercel-react-best-practices/rules/server-cache-lru.md +0 -41
- package/dist/skills/vercel-react-best-practices/rules/server-cache-react.md +0 -76
- package/dist/skills/vercel-react-best-practices/rules/server-parallel-fetching.md +0 -83
- package/dist/skills/vercel-react-best-practices/rules/server-serialization.md +0 -38
- package/dist/skills/web-design-guidelines/SKILL.md +0 -40
- package/dist/skills/workflow-patterns/SKILL.md +0 -623
- package/dist/skills/write-prd/SKILL.md +0 -162
- package/dist/workflows/brainstorm.md +0 -113
- package/dist/workflows/create.md +0 -60
- package/dist/workflows/debug.md +0 -107
- package/dist/workflows/deploy.md +0 -178
- package/dist/workflows/enhance.md +0 -64
- package/dist/workflows/github-pull-request-create.md +0 -134
- package/dist/workflows/orchestrate.md +0 -246
- package/dist/workflows/plan.md +0 -90
- package/dist/workflows/preview.md +0 -83
- package/dist/workflows/status.md +0 -87
- package/dist/workflows/test.md +0 -144
- package/dist/workflows/ui-ux-pro-max.md +0 -315
|
@@ -1,317 +0,0 @@
|
|
|
1
|
-
# Hook Extraction Patterns
|
|
2
|
-
|
|
3
|
-
This document provides detailed guidance on extracting custom hooks from complex components in Dify.
|
|
4
|
-
|
|
5
|
-
## When to Extract Hooks
|
|
6
|
-
|
|
7
|
-
Extract a custom hook when you identify:
|
|
8
|
-
|
|
9
|
-
1. **Coupled state groups** - Multiple `useState` hooks that are always used together
|
|
10
|
-
1. **Complex effects** - `useEffect` with multiple dependencies or cleanup logic
|
|
11
|
-
1. **Business logic** - Data transformations, validations, or calculations
|
|
12
|
-
1. **Reusable patterns** - Logic that appears in multiple components
|
|
13
|
-
|
|
14
|
-
## Extraction Process
|
|
15
|
-
|
|
16
|
-
### Step 1: Identify State Groups
|
|
17
|
-
|
|
18
|
-
Look for state variables that are logically related:
|
|
19
|
-
|
|
20
|
-
```typescript
|
|
21
|
-
// ❌ These belong together - extract to hook
|
|
22
|
-
const [modelConfig, setModelConfig] = useState<ModelConfig>(...)
|
|
23
|
-
const [completionParams, setCompletionParams] = useState<FormValue>({})
|
|
24
|
-
const [modelModeType, setModelModeType] = useState<ModelModeType>(...)
|
|
25
|
-
|
|
26
|
-
// These are model-related state that should be in useModelConfig()
|
|
27
|
-
```
|
|
28
|
-
|
|
29
|
-
### Step 2: Identify Related Effects
|
|
30
|
-
|
|
31
|
-
Find effects that modify the grouped state:
|
|
32
|
-
|
|
33
|
-
```typescript
|
|
34
|
-
// ❌ These effects belong with the state above
|
|
35
|
-
useEffect(() => {
|
|
36
|
-
if (hasFetchedDetail && !modelModeType) {
|
|
37
|
-
const mode = currModel?.model_properties.mode
|
|
38
|
-
if (mode) {
|
|
39
|
-
const newModelConfig = produce(modelConfig, (draft) => {
|
|
40
|
-
draft.mode = mode
|
|
41
|
-
})
|
|
42
|
-
setModelConfig(newModelConfig)
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
}, [textGenerationModelList, hasFetchedDetail, modelModeType, currModel])
|
|
46
|
-
```
|
|
47
|
-
|
|
48
|
-
### Step 3: Create the Hook
|
|
49
|
-
|
|
50
|
-
```typescript
|
|
51
|
-
// hooks/use-model-config.ts
|
|
52
|
-
import type { FormValue } from '@/app/components/header/account-setting/model-provider-page/declarations'
|
|
53
|
-
import type { ModelConfig } from '@/models/debug'
|
|
54
|
-
import { produce } from 'immer'
|
|
55
|
-
import { useEffect, useState } from 'react'
|
|
56
|
-
import { ModelModeType } from '@/types/app'
|
|
57
|
-
|
|
58
|
-
interface UseModelConfigParams {
|
|
59
|
-
initialConfig?: Partial<ModelConfig>
|
|
60
|
-
currModel?: { model_properties?: { mode?: ModelModeType } }
|
|
61
|
-
hasFetchedDetail: boolean
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
interface UseModelConfigReturn {
|
|
65
|
-
modelConfig: ModelConfig
|
|
66
|
-
setModelConfig: (config: ModelConfig) => void
|
|
67
|
-
completionParams: FormValue
|
|
68
|
-
setCompletionParams: (params: FormValue) => void
|
|
69
|
-
modelModeType: ModelModeType
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
export const useModelConfig = ({
|
|
73
|
-
initialConfig,
|
|
74
|
-
currModel,
|
|
75
|
-
hasFetchedDetail,
|
|
76
|
-
}: UseModelConfigParams): UseModelConfigReturn => {
|
|
77
|
-
const [modelConfig, setModelConfig] = useState<ModelConfig>({
|
|
78
|
-
provider: 'langgenius/openai/openai',
|
|
79
|
-
model_id: 'gpt-3.5-turbo',
|
|
80
|
-
mode: ModelModeType.unset,
|
|
81
|
-
// ... default values
|
|
82
|
-
...initialConfig,
|
|
83
|
-
})
|
|
84
|
-
|
|
85
|
-
const [completionParams, setCompletionParams] = useState<FormValue>({})
|
|
86
|
-
|
|
87
|
-
const modelModeType = modelConfig.mode
|
|
88
|
-
|
|
89
|
-
// Fill old app data missing model mode
|
|
90
|
-
useEffect(() => {
|
|
91
|
-
if (hasFetchedDetail && !modelModeType) {
|
|
92
|
-
const mode = currModel?.model_properties?.mode
|
|
93
|
-
if (mode) {
|
|
94
|
-
setModelConfig(produce(modelConfig, (draft) => {
|
|
95
|
-
draft.mode = mode
|
|
96
|
-
}))
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
}, [hasFetchedDetail, modelModeType, currModel])
|
|
100
|
-
|
|
101
|
-
return {
|
|
102
|
-
modelConfig,
|
|
103
|
-
setModelConfig,
|
|
104
|
-
completionParams,
|
|
105
|
-
setCompletionParams,
|
|
106
|
-
modelModeType,
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
```
|
|
110
|
-
|
|
111
|
-
### Step 4: Update Component
|
|
112
|
-
|
|
113
|
-
```typescript
|
|
114
|
-
// Before: 50+ lines of state management
|
|
115
|
-
const Configuration: FC = () => {
|
|
116
|
-
const [modelConfig, setModelConfig] = useState<ModelConfig>(...)
|
|
117
|
-
// ... lots of related state and effects
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
// After: Clean component
|
|
121
|
-
const Configuration: FC = () => {
|
|
122
|
-
const {
|
|
123
|
-
modelConfig,
|
|
124
|
-
setModelConfig,
|
|
125
|
-
completionParams,
|
|
126
|
-
setCompletionParams,
|
|
127
|
-
modelModeType,
|
|
128
|
-
} = useModelConfig({
|
|
129
|
-
currModel,
|
|
130
|
-
hasFetchedDetail,
|
|
131
|
-
})
|
|
132
|
-
|
|
133
|
-
// Component now focuses on UI
|
|
134
|
-
}
|
|
135
|
-
```
|
|
136
|
-
|
|
137
|
-
## Naming Conventions
|
|
138
|
-
|
|
139
|
-
### Hook Names
|
|
140
|
-
|
|
141
|
-
- Use `use` prefix: `useModelConfig`, `useDatasetConfig`
|
|
142
|
-
- Be specific: `useAdvancedPromptConfig` not `usePrompt`
|
|
143
|
-
- Include domain: `useWorkflowVariables`, `useMCPServer`
|
|
144
|
-
|
|
145
|
-
### File Names
|
|
146
|
-
|
|
147
|
-
- Kebab-case: `use-model-config.ts`
|
|
148
|
-
- Place in `hooks/` subdirectory when multiple hooks exist
|
|
149
|
-
- Place alongside component for single-use hooks
|
|
150
|
-
|
|
151
|
-
### Return Type Names
|
|
152
|
-
|
|
153
|
-
- Suffix with `Return`: `UseModelConfigReturn`
|
|
154
|
-
- Suffix params with `Params`: `UseModelConfigParams`
|
|
155
|
-
|
|
156
|
-
## Common Hook Patterns in Dify
|
|
157
|
-
|
|
158
|
-
### 1. Data Fetching Hook (React Query)
|
|
159
|
-
|
|
160
|
-
```typescript
|
|
161
|
-
// Pattern: Use @tanstack/react-query for data fetching
|
|
162
|
-
import { useQuery, useQueryClient } from '@tanstack/react-query'
|
|
163
|
-
import { get } from '@/service/base'
|
|
164
|
-
import { useInvalid } from '@/service/use-base'
|
|
165
|
-
|
|
166
|
-
const NAME_SPACE = 'appConfig'
|
|
167
|
-
|
|
168
|
-
// Query keys for cache management
|
|
169
|
-
export const appConfigQueryKeys = {
|
|
170
|
-
detail: (appId: string) => [NAME_SPACE, 'detail', appId] as const,
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
// Main data hook
|
|
174
|
-
export const useAppConfig = (appId: string) => {
|
|
175
|
-
return useQuery({
|
|
176
|
-
enabled: !!appId,
|
|
177
|
-
queryKey: appConfigQueryKeys.detail(appId),
|
|
178
|
-
queryFn: () => get<AppDetailResponse>(`/apps/${appId}`),
|
|
179
|
-
select: data => data?.model_config || null,
|
|
180
|
-
})
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
// Invalidation hook for refreshing data
|
|
184
|
-
export const useInvalidAppConfig = () => {
|
|
185
|
-
return useInvalid([NAME_SPACE])
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
// Usage in component
|
|
189
|
-
const Component = () => {
|
|
190
|
-
const { data: config, isLoading, error, refetch } = useAppConfig(appId)
|
|
191
|
-
const invalidAppConfig = useInvalidAppConfig()
|
|
192
|
-
|
|
193
|
-
const handleRefresh = () => {
|
|
194
|
-
invalidAppConfig() // Invalidates cache and triggers refetch
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
return <div>...</div>
|
|
198
|
-
}
|
|
199
|
-
```
|
|
200
|
-
|
|
201
|
-
### 2. Form State Hook
|
|
202
|
-
|
|
203
|
-
```typescript
|
|
204
|
-
// Pattern: Form state + validation + submission
|
|
205
|
-
export const useConfigForm = (initialValues: ConfigFormValues) => {
|
|
206
|
-
const [values, setValues] = useState(initialValues)
|
|
207
|
-
const [errors, setErrors] = useState<Record<string, string>>({})
|
|
208
|
-
const [isSubmitting, setIsSubmitting] = useState(false)
|
|
209
|
-
|
|
210
|
-
const validate = useCallback(() => {
|
|
211
|
-
const newErrors: Record<string, string> = {}
|
|
212
|
-
if (!values.name) newErrors.name = 'Name is required'
|
|
213
|
-
setErrors(newErrors)
|
|
214
|
-
return Object.keys(newErrors).length === 0
|
|
215
|
-
}, [values])
|
|
216
|
-
|
|
217
|
-
const handleChange = useCallback((field: string, value: any) => {
|
|
218
|
-
setValues(prev => ({ ...prev, [field]: value }))
|
|
219
|
-
}, [])
|
|
220
|
-
|
|
221
|
-
const handleSubmit = useCallback(async (onSubmit: (values: ConfigFormValues) => Promise<void>) => {
|
|
222
|
-
if (!validate()) return
|
|
223
|
-
setIsSubmitting(true)
|
|
224
|
-
try {
|
|
225
|
-
await onSubmit(values)
|
|
226
|
-
} finally {
|
|
227
|
-
setIsSubmitting(false)
|
|
228
|
-
}
|
|
229
|
-
}, [values, validate])
|
|
230
|
-
|
|
231
|
-
return { values, errors, isSubmitting, handleChange, handleSubmit }
|
|
232
|
-
}
|
|
233
|
-
```
|
|
234
|
-
|
|
235
|
-
### 3. Modal State Hook
|
|
236
|
-
|
|
237
|
-
```typescript
|
|
238
|
-
// Pattern: Multiple modal management
|
|
239
|
-
type ModalType = 'edit' | 'delete' | 'duplicate' | null
|
|
240
|
-
|
|
241
|
-
export const useModalState = () => {
|
|
242
|
-
const [activeModal, setActiveModal] = useState<ModalType>(null)
|
|
243
|
-
const [modalData, setModalData] = useState<any>(null)
|
|
244
|
-
|
|
245
|
-
const openModal = useCallback((type: ModalType, data?: any) => {
|
|
246
|
-
setActiveModal(type)
|
|
247
|
-
setModalData(data)
|
|
248
|
-
}, [])
|
|
249
|
-
|
|
250
|
-
const closeModal = useCallback(() => {
|
|
251
|
-
setActiveModal(null)
|
|
252
|
-
setModalData(null)
|
|
253
|
-
}, [])
|
|
254
|
-
|
|
255
|
-
return {
|
|
256
|
-
activeModal,
|
|
257
|
-
modalData,
|
|
258
|
-
openModal,
|
|
259
|
-
closeModal,
|
|
260
|
-
isOpen: useCallback((type: ModalType) => activeModal === type, [activeModal]),
|
|
261
|
-
}
|
|
262
|
-
}
|
|
263
|
-
```
|
|
264
|
-
|
|
265
|
-
### 4. Toggle/Boolean Hook
|
|
266
|
-
|
|
267
|
-
```typescript
|
|
268
|
-
// Pattern: Boolean state with convenience methods
|
|
269
|
-
export const useToggle = (initialValue = false) => {
|
|
270
|
-
const [value, setValue] = useState(initialValue)
|
|
271
|
-
|
|
272
|
-
const toggle = useCallback(() => setValue(v => !v), [])
|
|
273
|
-
const setTrue = useCallback(() => setValue(true), [])
|
|
274
|
-
const setFalse = useCallback(() => setValue(false), [])
|
|
275
|
-
|
|
276
|
-
return [value, { toggle, setTrue, setFalse, set: setValue }] as const
|
|
277
|
-
}
|
|
278
|
-
|
|
279
|
-
// Usage
|
|
280
|
-
const [isExpanded, { toggle, setTrue: expand, setFalse: collapse }] = useToggle()
|
|
281
|
-
```
|
|
282
|
-
|
|
283
|
-
## Testing Extracted Hooks
|
|
284
|
-
|
|
285
|
-
After extraction, test hooks in isolation:
|
|
286
|
-
|
|
287
|
-
```typescript
|
|
288
|
-
// use-model-config.spec.ts
|
|
289
|
-
import { renderHook, act } from '@testing-library/react'
|
|
290
|
-
import { useModelConfig } from './use-model-config'
|
|
291
|
-
|
|
292
|
-
describe('useModelConfig', () => {
|
|
293
|
-
it('should initialize with default values', () => {
|
|
294
|
-
const { result } = renderHook(() => useModelConfig({
|
|
295
|
-
hasFetchedDetail: false,
|
|
296
|
-
}))
|
|
297
|
-
|
|
298
|
-
expect(result.current.modelConfig.provider).toBe('langgenius/openai/openai')
|
|
299
|
-
expect(result.current.modelModeType).toBe(ModelModeType.unset)
|
|
300
|
-
})
|
|
301
|
-
|
|
302
|
-
it('should update model config', () => {
|
|
303
|
-
const { result } = renderHook(() => useModelConfig({
|
|
304
|
-
hasFetchedDetail: true,
|
|
305
|
-
}))
|
|
306
|
-
|
|
307
|
-
act(() => {
|
|
308
|
-
result.current.setModelConfig({
|
|
309
|
-
...result.current.modelConfig,
|
|
310
|
-
model_id: 'gpt-4',
|
|
311
|
-
})
|
|
312
|
-
})
|
|
313
|
-
|
|
314
|
-
expect(result.current.modelConfig.model_id).toBe('gpt-4')
|
|
315
|
-
})
|
|
316
|
-
})
|
|
317
|
-
```
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: context7-guidelines
|
|
3
|
-
description: Guidelines for using Context7 as the primary source of truth for documentation and standards. Trigger when the user asks about documentation, standards, or when gathering context for a task.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Context7 Usage Guidelines
|
|
7
|
-
|
|
8
|
-
This skill defines the standard operating procedure for using **Context7**.
|
|
9
|
-
|
|
10
|
-
## Core Instructions
|
|
11
|
-
|
|
12
|
-
- **Primary Source**: Always use `context7` to gather information about the user's request. It is the authoritative source for documentation, code snippets, and project resources.
|
|
13
|
-
- **Alignment**: Reference `context7` when formulating answers to ensure they align with project standards and practices.
|
|
14
|
-
- **Transparency**: Clearly indicate when information is sourced from `context7`.
|
|
15
|
-
- **Conflict Resolution**: Always prioritize `context7` over other sources (including training data) if there is a conflict.
|
|
16
|
-
- **Code Standards**: When providing code examples, ensure they adhere to conventions found in `context7`.
|
|
17
|
-
- **Tool Usage**: If `context7` includes specific tools or libraries, utilize them in your response.
|
|
18
|
-
- **Troubleshooting**: Use `context7` as the first reference point for troubleshooting and problem-solving.
|
|
19
|
-
- **Verification**: When in doubt, refer back to `context7` to verify accuracy before responding.
|
|
20
|
-
|
|
21
|
-
## Handling Missing Information
|
|
22
|
-
|
|
23
|
-
- If `context7` does not contain sufficient information, politely inform the user and suggest alternative ways to find the information, or ask for clarification.
|
|
24
|
-
|
|
25
|
-
- Seek clarification if `context7` data is ambiguous.
|
|
26
|
-
|
|
27
|
-
## Best Practices
|
|
28
|
-
|
|
29
|
-
- **Regular Checks**: Assume `context7` content may change; fetch fresh data when starting new significant tasks.
|
|
30
|
-
|
|
31
|
-
- **Attribution**: Attribute direct quotes or specific information to `context7`.
|