ima-claude 2.20.0 → 2.26.0
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 +74 -9
- package/dist/cli.js +2 -1
- package/package.json +1 -1
- package/plugins/ima-claude/.claude-plugin/plugin.json +2 -2
- package/plugins/ima-claude/agents/explorer.md +29 -15
- package/plugins/ima-claude/agents/implementer.md +58 -13
- package/plugins/ima-claude/agents/memory.md +19 -19
- package/plugins/ima-claude/agents/reviewer.md +84 -34
- package/plugins/ima-claude/agents/tester.md +59 -16
- package/plugins/ima-claude/agents/wp-developer.md +66 -21
- package/plugins/ima-claude/hooks/bootstrap.sh +42 -44
- package/plugins/ima-claude/hooks/prompt_coach_digest.md +14 -17
- package/plugins/ima-claude/hooks/prompt_coach_system.md +10 -12
- package/plugins/ima-claude/personalities/README.md +17 -6
- package/plugins/ima-claude/personalities/enable-efficient.md +61 -0
- package/plugins/ima-claude/personalities/enable-terse.md +71 -0
- package/plugins/ima-claude/skills/agentic-workflows/SKILL.md +35 -71
- package/plugins/ima-claude/skills/architect/SKILL.md +54 -168
- package/plugins/ima-claude/skills/compound-bridge/SKILL.md +41 -94
- package/plugins/ima-claude/skills/design-to-code/SKILL.md +43 -78
- package/plugins/ima-claude/skills/discourse/SKILL.md +79 -194
- package/plugins/ima-claude/skills/discourse-admin/SKILL.md +41 -103
- package/plugins/ima-claude/skills/docs-organize/SKILL.md +63 -203
- package/plugins/ima-claude/skills/ember-discourse/SKILL.md +90 -200
- package/plugins/ima-claude/skills/espocrm/SKILL.md +14 -23
- package/plugins/ima-claude/skills/espocrm-api/SKILL.md +79 -192
- package/plugins/ima-claude/skills/functional-programmer/SKILL.md +33 -237
- package/plugins/ima-claude/skills/gh-cli/SKILL.md +26 -65
- package/plugins/ima-claude/skills/ima-bootstrap/SKILL.md +71 -104
- package/plugins/ima-claude/skills/ima-bootstrap/references/ima-brand.md +32 -22
- package/plugins/ima-claude/skills/ima-brand/SKILL.md +18 -23
- package/plugins/ima-claude/skills/ima-copywriting/SKILL.md +68 -179
- package/plugins/ima-claude/skills/ima-doc2pdf/SKILL.md +32 -102
- package/plugins/ima-claude/skills/ima-editorial-scorecard/SKILL.md +38 -63
- package/plugins/ima-claude/skills/ima-editorial-workflow/SKILL.md +69 -114
- package/plugins/ima-claude/skills/ima-email-creator/SKILL.md +16 -22
- package/plugins/ima-claude/skills/ima-forms-expert/SKILL.md +21 -37
- package/plugins/ima-claude/skills/ima-git/SKILL.md +81 -0
- package/plugins/ima-claude/skills/jira-checkpoint/SKILL.md +39 -120
- package/plugins/ima-claude/skills/jquery/SKILL.md +107 -233
- package/plugins/ima-claude/skills/js-fp/SKILL.md +75 -296
- package/plugins/ima-claude/skills/js-fp-api/SKILL.md +52 -162
- package/plugins/ima-claude/skills/js-fp-react/SKILL.md +47 -270
- package/plugins/ima-claude/skills/js-fp-vue/SKILL.md +55 -209
- package/plugins/ima-claude/skills/js-fp-wordpress/SKILL.md +59 -204
- package/plugins/ima-claude/skills/livecanvas/SKILL.md +19 -32
- package/plugins/ima-claude/skills/mcp-atlassian/SKILL.md +92 -162
- package/plugins/ima-claude/skills/mcp-context7/SKILL.md +32 -64
- package/plugins/ima-claude/skills/mcp-gitea/SKILL.md +98 -188
- package/plugins/ima-claude/skills/mcp-github/SKILL.md +60 -124
- package/plugins/ima-claude/skills/mcp-memory/SKILL.md +1 -177
- package/plugins/ima-claude/skills/mcp-qdrant/SKILL.md +58 -115
- package/plugins/ima-claude/skills/mcp-sequential/SKILL.md +32 -87
- package/plugins/ima-claude/skills/mcp-serena/SKILL.md +54 -80
- package/plugins/ima-claude/skills/mcp-tavily/SKILL.md +40 -63
- package/plugins/ima-claude/skills/mcp-vestige/SKILL.md +75 -116
- package/plugins/ima-claude/skills/php-authnet/SKILL.md +32 -65
- package/plugins/ima-claude/skills/php-fp/SKILL.md +50 -129
- package/plugins/ima-claude/skills/php-fp-wordpress/SKILL.md +25 -73
- package/plugins/ima-claude/skills/phpunit-wp/SKILL.md +103 -463
- package/plugins/ima-claude/skills/playwright/SKILL.md +69 -220
- package/plugins/ima-claude/skills/prompt-starter/SKILL.md +33 -83
- package/plugins/ima-claude/skills/prompt-starter/references/code-review.md +38 -0
- package/plugins/ima-claude/skills/py-fp/SKILL.md +78 -384
- package/plugins/ima-claude/skills/quasar-fp/SKILL.md +54 -255
- package/plugins/ima-claude/skills/quickstart/SKILL.md +7 -11
- package/plugins/ima-claude/skills/rails/SKILL.md +63 -184
- package/plugins/ima-claude/skills/resume-session/SKILL.md +14 -35
- package/plugins/ima-claude/skills/rg/SKILL.md +61 -146
- package/plugins/ima-claude/skills/ruby-fp/SKILL.md +66 -163
- package/plugins/ima-claude/skills/save-session/SKILL.md +10 -39
- package/plugins/ima-claude/skills/scorecard/SKILL.md +42 -40
- package/plugins/ima-claude/skills/skill-analyzer/SKILL.md +42 -71
- package/plugins/ima-claude/skills/skill-creator/SKILL.md +79 -250
- package/plugins/ima-claude/skills/task-master/SKILL.md +11 -31
- package/plugins/ima-claude/skills/task-planner/SKILL.md +44 -153
- package/plugins/ima-claude/skills/task-runner/SKILL.md +61 -143
- package/plugins/ima-claude/skills/unit-testing/SKILL.md +59 -134
- package/plugins/ima-claude/skills/wp-ddev/SKILL.md +38 -120
- package/plugins/ima-claude/skills/wp-local/SKILL.md +26 -108
|
@@ -5,67 +5,27 @@ description: "FP patterns for Vue.js with composables, wrappers, and pure compon
|
|
|
5
5
|
|
|
6
6
|
# JavaScript FP - Vue.js
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
Pure components with business logic in composables, wrapper pattern for side effects, composables over stores (95% of cases). Builds on `../js-fp/SKILL.md`.
|
|
9
9
|
|
|
10
|
-
##
|
|
10
|
+
## Pure Component + Composable Pattern
|
|
11
11
|
|
|
12
|
-
|
|
13
|
-
- Need pure, testable component logic
|
|
14
|
-
- Implementing composables with FP principles
|
|
15
|
-
- Wrapper patterns for external dependencies
|
|
16
|
-
- Performance optimization without over-engineering
|
|
17
|
-
|
|
18
|
-
## Core Philosophy
|
|
19
|
-
|
|
20
|
-
**Pure components** with **business logic in composables**, **wrapper pattern for side effects**, and **simple state management** (composables > stores for 95% of use cases).
|
|
21
|
-
|
|
22
|
-
**Foundation**: This skill builds on `js-fp` core principles. Reference `../js-fp/SKILL.md` for purity, composition, dependency injection, and testing patterns.
|
|
23
|
-
|
|
24
|
-
## Pure Component with Composable Pattern
|
|
25
|
-
|
|
26
|
-
**Rule**: Separate business logic (composables) from presentation (components).
|
|
12
|
+
Separate business logic (composables) from presentation (components).
|
|
27
13
|
|
|
28
14
|
```vue
|
|
29
15
|
<script setup lang="ts">
|
|
30
|
-
/**
|
|
31
|
-
* Business logic in composables, presentation in component
|
|
32
|
-
* - Zero side effects in component
|
|
33
|
-
* - All logic in composables
|
|
34
|
-
* - 100% testable through dependency injection
|
|
35
|
-
*/
|
|
36
|
-
|
|
37
16
|
import type { Ref } from 'vue'
|
|
38
17
|
import { computed, readonly, toRef } from 'vue'
|
|
39
18
|
|
|
40
|
-
interface UserData {
|
|
41
|
-
|
|
42
|
-
name: string
|
|
43
|
-
email: string
|
|
44
|
-
}
|
|
19
|
+
interface UserData { id: string; name: string; email: string }
|
|
20
|
+
interface UserConfig { showEmail: boolean; variant: 'compact' | 'detailed' }
|
|
45
21
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
22
|
+
const useUserLogic = (userData: Readonly<Ref<UserData>>, config: Readonly<Ref<UserConfig>>) => {
|
|
23
|
+
const displayData = computed(() => ({
|
|
24
|
+
...userData.value,
|
|
25
|
+
displayName: userData.value.name.trim(),
|
|
26
|
+
...(config.value.showEmail ? {} : { email: undefined })
|
|
27
|
+
}))
|
|
50
28
|
|
|
51
|
-
// ───── Composable with pure business logic ─────
|
|
52
|
-
const useUserLogic = (
|
|
53
|
-
userData: Readonly<Ref<UserData>>,
|
|
54
|
-
config: Readonly<Ref<UserConfig>>
|
|
55
|
-
) => {
|
|
56
|
-
// Pure computation - no side effects
|
|
57
|
-
const displayData = computed(() => {
|
|
58
|
-
const user = userData.value
|
|
59
|
-
const cfg = config.value
|
|
60
|
-
|
|
61
|
-
return {
|
|
62
|
-
...user,
|
|
63
|
-
displayName: user.name.trim(),
|
|
64
|
-
...(cfg.showEmail ? {} : { email: undefined })
|
|
65
|
-
}
|
|
66
|
-
})
|
|
67
|
-
|
|
68
|
-
// Pre-compiled CSS for performance
|
|
69
29
|
const cssClasses = computed(() => ({
|
|
70
30
|
card: `user-card user-card--${config.value.variant}`,
|
|
71
31
|
name: `user-card__name user-card__name--${config.value.variant}`
|
|
@@ -74,13 +34,7 @@ const useUserLogic = (
|
|
|
74
34
|
return { displayData, cssClasses }
|
|
75
35
|
}
|
|
76
36
|
|
|
77
|
-
|
|
78
|
-
const props = defineProps<{
|
|
79
|
-
userData: UserData
|
|
80
|
-
config: UserConfig
|
|
81
|
-
}>()
|
|
82
|
-
|
|
83
|
-
// ───── Use composable ─────
|
|
37
|
+
const props = defineProps<{ userData: UserData; config: UserConfig }>()
|
|
84
38
|
const { displayData, cssClasses } = useUserLogic(
|
|
85
39
|
readonly(toRef(props, 'userData')),
|
|
86
40
|
readonly(toRef(props, 'config'))
|
|
@@ -95,44 +49,24 @@ const { displayData, cssClasses } = useUserLogic(
|
|
|
95
49
|
</template>
|
|
96
50
|
```
|
|
97
51
|
|
|
98
|
-
## Wrapper Pattern for
|
|
52
|
+
## Wrapper Pattern for Side Effects
|
|
99
53
|
|
|
100
|
-
|
|
54
|
+
Pure inner component receives data via props, emits events. Wrapper handles all I/O.
|
|
101
55
|
|
|
102
56
|
```vue
|
|
103
|
-
<!-- UserDisplayPure.vue
|
|
57
|
+
<!-- UserDisplayPure.vue -->
|
|
104
58
|
<script setup lang="ts">
|
|
105
|
-
const props = defineProps<{
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
const emit = defineEmits<{
|
|
110
|
-
update: [user: UserData]
|
|
111
|
-
}>()
|
|
112
|
-
|
|
113
|
-
const handleUpdate = (updates: Partial<UserData>) => {
|
|
114
|
-
const updatedUser = { ...props.user, ...updates }
|
|
115
|
-
emit('update', updatedUser)
|
|
116
|
-
}
|
|
59
|
+
const props = defineProps<{ user: UserData }>()
|
|
60
|
+
const emit = defineEmits<{ update: [user: UserData] }>()
|
|
61
|
+
const handleUpdate = (updates: Partial<UserData>) => emit('update', { ...props.user, ...updates })
|
|
117
62
|
</script>
|
|
118
63
|
|
|
119
|
-
|
|
120
|
-
<div class="user-display">
|
|
121
|
-
<h3>{{ user.name }}</h3>
|
|
122
|
-
<button @click="handleUpdate({ name: 'Updated' })">Update</button>
|
|
123
|
-
</div>
|
|
124
|
-
</template>
|
|
125
|
-
|
|
126
|
-
<!-- UserDisplayWrapper.vue - Wrapper with Side Effects -->
|
|
64
|
+
<!-- UserDisplayWrapper.vue -->
|
|
127
65
|
<script setup lang="ts">
|
|
128
66
|
import { ref } from 'vue'
|
|
129
67
|
import UserDisplayPure from './UserDisplayPure.vue'
|
|
130
68
|
|
|
131
|
-
const props = defineProps<{
|
|
132
|
-
userId: string
|
|
133
|
-
}>()
|
|
134
|
-
|
|
135
|
-
// Side effect: External API call
|
|
69
|
+
const props = defineProps<{ userId: string }>()
|
|
136
70
|
const user = ref<UserData | null>(null)
|
|
137
71
|
const loading = ref(true)
|
|
138
72
|
const error = ref<Error | null>(null)
|
|
@@ -148,175 +82,87 @@ const fetchUser = async () => {
|
|
|
148
82
|
}
|
|
149
83
|
}
|
|
150
84
|
|
|
151
|
-
// Side effect isolated to wrapper
|
|
152
85
|
const handleUpdate = async (updatedUser: UserData) => {
|
|
153
86
|
await userApi.updateUser(updatedUser)
|
|
154
|
-
await fetchUser()
|
|
87
|
+
await fetchUser()
|
|
155
88
|
}
|
|
156
89
|
|
|
157
|
-
// Initial load
|
|
158
90
|
fetchUser()
|
|
159
91
|
</script>
|
|
160
92
|
|
|
161
93
|
<template>
|
|
162
|
-
<UserDisplayPure
|
|
163
|
-
v-if="user && !loading"
|
|
164
|
-
:user="user"
|
|
165
|
-
@update="handleUpdate"
|
|
166
|
-
/>
|
|
94
|
+
<UserDisplayPure v-if="user && !loading" :user="user" @update="handleUpdate" />
|
|
167
95
|
<div v-else-if="loading">Loading...</div>
|
|
168
96
|
<div v-else-if="error">Error: {{ error.message }}</div>
|
|
169
97
|
</template>
|
|
170
98
|
```
|
|
171
99
|
|
|
172
|
-
##
|
|
173
|
-
|
|
174
|
-
### Reactive vs. Ref
|
|
100
|
+
## Reactive vs. Ref
|
|
175
101
|
|
|
176
102
|
```typescript
|
|
177
|
-
//
|
|
103
|
+
// ref for primitives and simple objects (default choice)
|
|
178
104
|
const count = ref(0)
|
|
179
105
|
const user = ref<UserData>({ id: '1', name: 'Alice', email: 'alice@test.com' })
|
|
180
106
|
|
|
181
|
-
//
|
|
182
|
-
const state = reactive({
|
|
183
|
-
users: [],
|
|
184
|
-
filters: { search: '', minAge: 0 }
|
|
185
|
-
})
|
|
107
|
+
// reactive sparingly — only for complex nested objects
|
|
108
|
+
const state = reactive({ users: [], filters: { search: '', minAge: 0 } })
|
|
186
109
|
|
|
187
|
-
//
|
|
110
|
+
// computed over watch for derived state
|
|
188
111
|
const filteredUsers = computed(() =>
|
|
189
112
|
state.users.filter(u => u.name.includes(state.filters.search))
|
|
190
113
|
)
|
|
191
114
|
```
|
|
192
115
|
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
```typescript
|
|
196
|
-
import { onMounted, onUnmounted } from 'vue'
|
|
197
|
-
|
|
198
|
-
// Side effects in lifecycle hooks
|
|
199
|
-
onMounted(() => {
|
|
200
|
-
fetchData()
|
|
201
|
-
const interval = setInterval(refreshData, 60000)
|
|
202
|
-
|
|
203
|
-
onUnmounted(() => {
|
|
204
|
-
clearInterval(interval)
|
|
205
|
-
})
|
|
206
|
-
})
|
|
207
|
-
```
|
|
208
|
-
|
|
209
|
-
## Anti-Patterns (AVOID)
|
|
210
|
-
|
|
211
|
-
### Pinia/Vuex Over-Usage
|
|
116
|
+
## Anti-Patterns
|
|
212
117
|
|
|
213
118
|
```typescript
|
|
214
|
-
// BAD:
|
|
119
|
+
// BAD: Pinia store for simple state
|
|
215
120
|
const useUserStore = defineStore('users', {
|
|
216
121
|
state: () => ({ users: [], loading: false }),
|
|
217
|
-
actions: {
|
|
218
|
-
async fetchUsers() { /* complex async logic */ }
|
|
219
|
-
}
|
|
122
|
+
actions: { async fetchUsers() { /* ... */ } }
|
|
220
123
|
})
|
|
221
124
|
|
|
222
|
-
// GOOD:
|
|
125
|
+
// GOOD: Composable (covers 95% of cases)
|
|
223
126
|
const useUsers = () => {
|
|
224
127
|
const users = ref<UserData[]>([])
|
|
225
128
|
const loading = ref(false)
|
|
226
|
-
|
|
227
129
|
const fetchUsers = async () => {
|
|
228
130
|
loading.value = true
|
|
229
131
|
users.value = await userApi.getUsers()
|
|
230
132
|
loading.value = false
|
|
231
133
|
}
|
|
232
|
-
|
|
233
134
|
return { users: readonly(users), loading: readonly(loading), fetchUsers }
|
|
234
135
|
}
|
|
235
|
-
```
|
|
236
136
|
|
|
237
|
-
|
|
137
|
+
// BAD: watch for derived state
|
|
138
|
+
watch([firstName, lastName], () => { fullName.value = `${firstName.value} ${lastName.value}` })
|
|
238
139
|
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
const user = reactive({
|
|
242
|
-
profile: reactive({
|
|
243
|
-
settings: reactive({
|
|
244
|
-
theme: 'dark'
|
|
245
|
-
})
|
|
246
|
-
})
|
|
247
|
-
})
|
|
140
|
+
// GOOD: computed
|
|
141
|
+
const fullName = computed(() => `${firstName.value} ${lastName.value}`)
|
|
248
142
|
|
|
249
|
-
//
|
|
143
|
+
// BAD: Nested reactive
|
|
144
|
+
const user = reactive({ profile: reactive({ settings: reactive({ theme: 'dark' }) }) })
|
|
145
|
+
|
|
146
|
+
// GOOD: ref with computed
|
|
250
147
|
const userSettings = ref({ theme: 'dark', notifications: true })
|
|
251
148
|
const isDarkTheme = computed(() => userSettings.value.theme === 'dark')
|
|
252
149
|
```
|
|
253
150
|
|
|
254
|
-
### Watch Over-Usage
|
|
255
|
-
|
|
256
|
-
```typescript
|
|
257
|
-
// BAD: Watch for derived state
|
|
258
|
-
const fullName = ref('')
|
|
259
|
-
watch([firstName, lastName], () => {
|
|
260
|
-
fullName.value = `${firstName.value} ${lastName.value}`
|
|
261
|
-
})
|
|
262
|
-
|
|
263
|
-
// GOOD: Computed for derived state
|
|
264
|
-
const fullName = computed(() => `${firstName.value} ${lastName.value}`)
|
|
265
|
-
```
|
|
266
|
-
|
|
267
151
|
## Quality Gates
|
|
268
152
|
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
### Reactivity Patterns
|
|
287
|
-
**File**: `references/reactivity-patterns.md`
|
|
288
|
-
**When**: Performance optimization, reactivity issues, memory management
|
|
289
|
-
**Contains**: Deep reactive vs ref patterns, shallowRef, computed optimization, cleanup patterns
|
|
290
|
-
|
|
291
|
-
### Testing
|
|
292
|
-
**File**: `references/testing.md`
|
|
293
|
-
**When**: Writing tests for Vue FP components
|
|
294
|
-
**Contains**: Testing pure composables, component tests, wrapper tests, mocking patterns
|
|
295
|
-
|
|
296
|
-
### Complete Examples
|
|
297
|
-
**File**: `references/complete-examples.md`
|
|
298
|
-
**When**: Need full working component examples
|
|
299
|
-
**Contains**: Product card, user dashboard with wrapper, form with validation
|
|
300
|
-
|
|
301
|
-
## Foundation Reference
|
|
302
|
-
|
|
303
|
-
**Core FP Principles**: `../js-fp/SKILL.md`
|
|
304
|
-
- Purity and side effect isolation
|
|
305
|
-
- Composition patterns
|
|
306
|
-
- Dependency injection
|
|
307
|
-
- Immutability
|
|
308
|
-
- Testing strategies
|
|
309
|
-
|
|
310
|
-
**Deep Dive**: `../js-fp/core-principles.md` for complete FP philosophy
|
|
311
|
-
|
|
312
|
-
## Success Metrics
|
|
313
|
-
|
|
314
|
-
- **Testability**: 100% testable composables
|
|
315
|
-
- **Performance**: Pre-compiled configurations, reactive optimization
|
|
316
|
-
- **Maintainability**: Clear separation of concerns
|
|
317
|
-
- **Code Quality**: Simple, readable component logic
|
|
318
|
-
- **Bundle Size**: Minimal overhead, tree-shakeable composables
|
|
319
|
-
|
|
320
|
-
## Philosophy
|
|
321
|
-
|
|
322
|
-
*"Pure component architecture through composables, wrapper patterns for side effects, and simple state management - optimize for testability and simplicity over clever reactivity."*
|
|
153
|
+
1. Business logic in composable, not component?
|
|
154
|
+
2. Side effects isolated to wrapper component?
|
|
155
|
+
3. computed over watch for derived state?
|
|
156
|
+
4. Composable instead of store (unless truly global state)?
|
|
157
|
+
5. All dependencies injectable for testing?
|
|
158
|
+
6. Immutable updates, pure functions?
|
|
159
|
+
|
|
160
|
+
## Reference Files
|
|
161
|
+
|
|
162
|
+
| File | Load When |
|
|
163
|
+
|------|-----------|
|
|
164
|
+
| `references/composables-advanced.md` | Factory patterns, provide/inject DI, lifecycle integration |
|
|
165
|
+
| `references/reactivity-patterns.md` | Performance, shallowRef, computed optimization, cleanup |
|
|
166
|
+
| `references/testing.md` | Testing composables, component tests, wrapper tests, mocking |
|
|
167
|
+
| `references/complete-examples.md` | Full working examples (product card, user dashboard, form) |
|
|
168
|
+
| `../js-fp/SKILL.md` | Core FP: purity, composition, DI, immutability, testing |
|