@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.
Files changed (140) hide show
  1. package/README.md +43 -64
  2. package/dist/bin/cli.js +270 -478
  3. package/dist/skills/statusline-setup/.claude-plugin/plugin.json +1 -1
  4. package/dist/skills/statusline-setup/SKILL.md +48 -448
  5. package/dist/skills/statusline-setup/mod/hooks/register.tsx +93 -103
  6. package/dist/skills/statusline-setup/mod/tests/work.test.ts +28 -10
  7. package/dist/skills/statusline-setup/mod/types/index.d.ts +2 -1
  8. package/dist/skills/universalize-agents/reference/mapping.md +3 -2
  9. package/package.json +3 -3
  10. package/dist/agents/backend-specialist.md +0 -277
  11. package/dist/agents/code-archaeologist.md +0 -114
  12. package/dist/agents/database-architect.md +0 -238
  13. package/dist/agents/debugger.md +0 -231
  14. package/dist/agents/devops-engineer.md +0 -242
  15. package/dist/agents/documentation-writer.md +0 -104
  16. package/dist/agents/explorer-agent.md +0 -79
  17. package/dist/agents/frontend-specialist.md +0 -594
  18. package/dist/agents/game-developer.md +0 -162
  19. package/dist/agents/mobile-developer.md +0 -383
  20. package/dist/agents/orchestrator.md +0 -435
  21. package/dist/agents/penetration-tester.md +0 -188
  22. package/dist/agents/performance-optimizer.md +0 -191
  23. package/dist/agents/product-manager.md +0 -122
  24. package/dist/agents/product-owner.md +0 -106
  25. package/dist/agents/project-planner.md +0 -408
  26. package/dist/agents/qa-automation-engineer.md +0 -109
  27. package/dist/agents/security-auditor.md +0 -171
  28. package/dist/agents/test-engineer.md +0 -158
  29. package/dist/skills/agent-identifier/SKILL.md +0 -431
  30. package/dist/skills/agent-identifier/examples/agent-creation-prompt.md +0 -247
  31. package/dist/skills/agent-identifier/examples/complete-agent-examples.md +0 -432
  32. package/dist/skills/agent-identifier/references/agent-creation-system-prompt.md +0 -215
  33. package/dist/skills/agent-identifier/references/system-prompt-design.md +0 -419
  34. package/dist/skills/agent-identifier/references/triggering-examples.md +0 -508
  35. package/dist/skills/agent-identifier/scripts/validate-agent.sh +0 -217
  36. package/dist/skills/code-review-excellence/SKILL.md +0 -525
  37. package/dist/skills/component-refactoring/SKILL.md +0 -492
  38. package/dist/skills/component-refactoring/references/complexity-patterns.md +0 -493
  39. package/dist/skills/component-refactoring/references/component-splitting.md +0 -477
  40. package/dist/skills/component-refactoring/references/hook-extraction.md +0 -317
  41. package/dist/skills/context7-guidelines/SKILL.md +0 -31
  42. package/dist/skills/feature-design-assistant/SKILL.md +0 -371
  43. package/dist/skills/find-bugs/SKILL.md +0 -75
  44. package/dist/skills/frontend-design/SKILL.md +0 -45
  45. package/dist/skills/go-concurrency-patterns/SKILL.md +0 -657
  46. package/dist/skills/grill-me/SKILL.md +0 -9
  47. package/dist/skills/handoff/SKILL.md +0 -16
  48. package/dist/skills/koreader-plugin-development/SKILL.md +0 -141
  49. package/dist/skills/koreader-plugin-development/examples/2-example-patch.lua +0 -17
  50. package/dist/skills/koreader-plugin-development/examples/_meta.lua +0 -6
  51. package/dist/skills/koreader-plugin-development/examples/helloworld.lua +0 -36
  52. package/dist/skills/koreader-plugin-development/references/debugging.md +0 -92
  53. package/dist/skills/koreader-plugin-development/references/events-and-widgets.md +0 -102
  54. package/dist/skills/koreader-plugin-development/references/patches.md +0 -118
  55. package/dist/skills/koreader-plugin-development/references/plugin-anatomy.md +0 -97
  56. package/dist/skills/make-instruction/SKILL.md +0 -68
  57. package/dist/skills/make-prompt/SKILL.md +0 -70
  58. package/dist/skills/make-skill/SKILL.md +0 -147
  59. package/dist/skills/prd-to-tasks/SKILL.md +0 -164
  60. package/dist/skills/react-native-async-patterns/SKILL.md +0 -256
  61. package/dist/skills/react-native-performance/SKILL.md +0 -425
  62. package/dist/skills/react-native-testing/SKILL.md +0 -458
  63. package/dist/skills/react-native-zustand-patterns/SKILL.md +0 -343
  64. package/dist/skills/skill-creator/SKILL.md +0 -385
  65. package/dist/skills/skill-creator/scripts/init_skill.cjs +0 -235
  66. package/dist/skills/skill-creator/scripts/package_skill.cjs +0 -84
  67. package/dist/skills/skill-creator/scripts/validate_skill.cjs +0 -127
  68. package/dist/skills/skill-development/SKILL.md +0 -676
  69. package/dist/skills/skill-development/references/skill-creator-original.md +0 -210
  70. package/dist/skills/sql-optimization-patterns/SKILL.md +0 -509
  71. package/dist/skills/test-driven-development/SKILL.md +0 -114
  72. package/dist/skills/test-driven-development/deep-modules.md +0 -33
  73. package/dist/skills/test-driven-development/interface-design.md +0 -35
  74. package/dist/skills/test-driven-development/mocking.md +0 -68
  75. package/dist/skills/test-driven-development/refactoring.md +0 -10
  76. package/dist/skills/test-driven-development/tests.md +0 -61
  77. package/dist/skills/vercel-react-best-practices/AGENTS.md +0 -2410
  78. package/dist/skills/vercel-react-best-practices/SKILL.md +0 -127
  79. package/dist/skills/vercel-react-best-practices/rules/advanced-event-handler-refs.md +0 -55
  80. package/dist/skills/vercel-react-best-practices/rules/advanced-use-latest.md +0 -49
  81. package/dist/skills/vercel-react-best-practices/rules/async-api-routes.md +0 -38
  82. package/dist/skills/vercel-react-best-practices/rules/async-defer-await.md +0 -80
  83. package/dist/skills/vercel-react-best-practices/rules/async-dependencies.md +0 -36
  84. package/dist/skills/vercel-react-best-practices/rules/async-parallel.md +0 -28
  85. package/dist/skills/vercel-react-best-practices/rules/async-suspense-boundaries.md +0 -99
  86. package/dist/skills/vercel-react-best-practices/rules/bundle-barrel-imports.md +0 -59
  87. package/dist/skills/vercel-react-best-practices/rules/bundle-conditional.md +0 -31
  88. package/dist/skills/vercel-react-best-practices/rules/bundle-defer-third-party.md +0 -49
  89. package/dist/skills/vercel-react-best-practices/rules/bundle-dynamic-imports.md +0 -35
  90. package/dist/skills/vercel-react-best-practices/rules/bundle-preload.md +0 -50
  91. package/dist/skills/vercel-react-best-practices/rules/client-event-listeners.md +0 -74
  92. package/dist/skills/vercel-react-best-practices/rules/client-localstorage-schema.md +0 -71
  93. package/dist/skills/vercel-react-best-practices/rules/client-passive-event-listeners.md +0 -48
  94. package/dist/skills/vercel-react-best-practices/rules/client-swr-dedup.md +0 -56
  95. package/dist/skills/vercel-react-best-practices/rules/js-batch-dom-css.md +0 -82
  96. package/dist/skills/vercel-react-best-practices/rules/js-cache-function-results.md +0 -80
  97. package/dist/skills/vercel-react-best-practices/rules/js-cache-property-access.md +0 -28
  98. package/dist/skills/vercel-react-best-practices/rules/js-cache-storage.md +0 -70
  99. package/dist/skills/vercel-react-best-practices/rules/js-combine-iterations.md +0 -32
  100. package/dist/skills/vercel-react-best-practices/rules/js-early-exit.md +0 -50
  101. package/dist/skills/vercel-react-best-practices/rules/js-hoist-regexp.md +0 -45
  102. package/dist/skills/vercel-react-best-practices/rules/js-index-maps.md +0 -37
  103. package/dist/skills/vercel-react-best-practices/rules/js-length-check-first.md +0 -50
  104. package/dist/skills/vercel-react-best-practices/rules/js-min-max-loop.md +0 -82
  105. package/dist/skills/vercel-react-best-practices/rules/js-set-map-lookups.md +0 -24
  106. package/dist/skills/vercel-react-best-practices/rules/js-tosorted-immutable.md +0 -57
  107. package/dist/skills/vercel-react-best-practices/rules/rendering-activity.md +0 -26
  108. package/dist/skills/vercel-react-best-practices/rules/rendering-animate-svg-wrapper.md +0 -47
  109. package/dist/skills/vercel-react-best-practices/rules/rendering-conditional-render.md +0 -40
  110. package/dist/skills/vercel-react-best-practices/rules/rendering-content-visibility.md +0 -38
  111. package/dist/skills/vercel-react-best-practices/rules/rendering-hoist-jsx.md +0 -46
  112. package/dist/skills/vercel-react-best-practices/rules/rendering-hydration-no-flicker.md +0 -82
  113. package/dist/skills/vercel-react-best-practices/rules/rendering-svg-precision.md +0 -28
  114. package/dist/skills/vercel-react-best-practices/rules/rerender-defer-reads.md +0 -39
  115. package/dist/skills/vercel-react-best-practices/rules/rerender-dependencies.md +0 -45
  116. package/dist/skills/vercel-react-best-practices/rules/rerender-derived-state.md +0 -29
  117. package/dist/skills/vercel-react-best-practices/rules/rerender-functional-setstate.md +0 -74
  118. package/dist/skills/vercel-react-best-practices/rules/rerender-lazy-state-init.md +0 -58
  119. package/dist/skills/vercel-react-best-practices/rules/rerender-memo.md +0 -44
  120. package/dist/skills/vercel-react-best-practices/rules/rerender-transitions.md +0 -40
  121. package/dist/skills/vercel-react-best-practices/rules/server-after-nonblocking.md +0 -73
  122. package/dist/skills/vercel-react-best-practices/rules/server-cache-lru.md +0 -41
  123. package/dist/skills/vercel-react-best-practices/rules/server-cache-react.md +0 -76
  124. package/dist/skills/vercel-react-best-practices/rules/server-parallel-fetching.md +0 -83
  125. package/dist/skills/vercel-react-best-practices/rules/server-serialization.md +0 -38
  126. package/dist/skills/web-design-guidelines/SKILL.md +0 -40
  127. package/dist/skills/workflow-patterns/SKILL.md +0 -623
  128. package/dist/skills/write-prd/SKILL.md +0 -162
  129. package/dist/workflows/brainstorm.md +0 -113
  130. package/dist/workflows/create.md +0 -60
  131. package/dist/workflows/debug.md +0 -107
  132. package/dist/workflows/deploy.md +0 -178
  133. package/dist/workflows/enhance.md +0 -64
  134. package/dist/workflows/github-pull-request-create.md +0 -134
  135. package/dist/workflows/orchestrate.md +0 -246
  136. package/dist/workflows/plan.md +0 -90
  137. package/dist/workflows/preview.md +0 -83
  138. package/dist/workflows/status.md +0 -87
  139. package/dist/workflows/test.md +0 -144
  140. 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`.