cmp-standards 2.0.0 → 2.4.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 +171 -101
- package/dist/cli/index.js +239 -7
- package/dist/cli/index.js.map +1 -1
- package/dist/dashboard/server.d.ts.map +1 -1
- package/dist/dashboard/server.js +203 -39
- package/dist/dashboard/server.js.map +1 -1
- package/dist/db/cloud.d.ts +174 -0
- package/dist/db/cloud.d.ts.map +1 -0
- package/dist/db/cloud.js +241 -0
- package/dist/db/cloud.js.map +1 -0
- package/dist/db/errors.d.ts +76 -0
- package/dist/db/errors.d.ts.map +1 -0
- package/dist/db/errors.js +135 -0
- package/dist/db/errors.js.map +1 -0
- package/dist/db/turso-client.d.ts +178 -0
- package/dist/db/turso-client.d.ts.map +1 -0
- package/dist/db/turso-client.js +455 -0
- package/dist/db/turso-client.js.map +1 -0
- package/dist/db/upstash-client.d.ts +161 -0
- package/dist/db/upstash-client.d.ts.map +1 -0
- package/dist/db/upstash-client.js +325 -0
- package/dist/db/upstash-client.js.map +1 -0
- package/dist/hooks/cloud-post-tool-use.d.ts +30 -0
- package/dist/hooks/cloud-post-tool-use.d.ts.map +1 -0
- package/dist/hooks/cloud-post-tool-use.js +116 -0
- package/dist/hooks/cloud-post-tool-use.js.map +1 -0
- package/dist/hooks/cloud-pre-tool-use.d.ts +19 -0
- package/dist/hooks/cloud-pre-tool-use.d.ts.map +1 -0
- package/dist/hooks/cloud-pre-tool-use.js +149 -0
- package/dist/hooks/cloud-pre-tool-use.js.map +1 -0
- package/dist/hooks/cloud-session-start.d.ts +20 -0
- package/dist/hooks/cloud-session-start.d.ts.map +1 -0
- package/dist/hooks/cloud-session-start.js +130 -0
- package/dist/hooks/cloud-session-start.js.map +1 -0
- package/dist/hooks/index.d.ts +3 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +5 -0
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/memory-checkpoint.d.ts.map +1 -1
- package/dist/hooks/memory-checkpoint.js +12 -20
- package/dist/hooks/memory-checkpoint.js.map +1 -1
- package/dist/hooks/pre-tool-use.d.ts +2 -8
- package/dist/hooks/pre-tool-use.d.ts.map +1 -1
- package/dist/hooks/pre-tool-use.js +7 -106
- package/dist/hooks/pre-tool-use.js.map +1 -1
- package/dist/hooks/session-start.d.ts.map +1 -1
- package/dist/hooks/session-start.js +15 -6
- package/dist/hooks/session-start.js.map +1 -1
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +14 -1
- package/dist/index.js.map +1 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +223 -0
- package/dist/mcp/server.js.map +1 -1
- package/dist/schema/tracking.d.ts +644 -0
- package/dist/schema/tracking.d.ts.map +1 -0
- package/dist/schema/tracking.js +204 -0
- package/dist/schema/tracking.js.map +1 -0
- package/dist/services/ProjectScaffold.d.ts.map +1 -1
- package/dist/services/ProjectScaffold.js +33 -5
- package/dist/services/ProjectScaffold.js.map +1 -1
- package/dist/services/TaskTracker.d.ts +1 -1
- package/dist/services/TaskTracker.d.ts.map +1 -1
- package/dist/services/TaskTracker.js +4 -8
- package/dist/services/TaskTracker.js.map +1 -1
- package/dist/services/WorkPlanManager.d.ts +1 -1
- package/dist/services/WorkPlanManager.d.ts.map +1 -1
- package/dist/services/WorkPlanManager.js +8 -14
- package/dist/services/WorkPlanManager.js.map +1 -1
- package/dist/services/auto-inject.d.ts +1 -0
- package/dist/services/auto-inject.d.ts.map +1 -1
- package/dist/services/auto-inject.js +12 -17
- package/dist/services/auto-inject.js.map +1 -1
- package/dist/services/cross-project-sync.d.ts +2 -0
- package/dist/services/cross-project-sync.d.ts.map +1 -1
- package/dist/services/cross-project-sync.js +26 -21
- package/dist/services/cross-project-sync.js.map +1 -1
- package/dist/services/memory-consolidation.d.ts.map +1 -1
- package/dist/services/memory-consolidation.js +30 -27
- package/dist/services/memory-consolidation.js.map +1 -1
- package/dist/utils/env-loader.d.ts +41 -0
- package/dist/utils/env-loader.d.ts.map +1 -0
- package/dist/utils/env-loader.js +78 -0
- package/dist/utils/env-loader.js.map +1 -0
- package/dist/utils/git.d.ts +52 -0
- package/dist/utils/git.d.ts.map +1 -0
- package/dist/utils/git.js +267 -0
- package/dist/utils/git.js.map +1 -0
- package/dist/utils/paths.d.ts +39 -5
- package/dist/utils/paths.d.ts.map +1 -1
- package/dist/utils/paths.js +88 -7
- package/dist/utils/paths.js.map +1 -1
- package/package.json +9 -4
- package/standards/README.md +50 -0
- package/standards/experts/expert-routing.md +215 -0
- package/standards/general/code-quality.md +86 -0
- package/standards/general/memory-usage.md +205 -0
- package/standards/general/sync-workflow.md +235 -0
- package/standards/general/workflow.md +82 -0
- package/standards/hooks/mandatory-tracking.md +446 -0
- package/standards/infrastructure/cloud-database.md +287 -0
- package/standards/mcp/server-design.md +243 -0
- package/standards/mcp/tool-patterns.md +354 -0
- package/standards/skills/skill-structure.md +286 -0
- package/standards/skills/workflow-design.md +323 -0
- package/standards/tools/tool-design.md +297 -0
- package/templates/claude-settings.json +72 -0
- package/templates/memory-config.json +2 -28
- package/templates/skills/continue.md +205 -0
|
@@ -0,0 +1,323 @@
|
|
|
1
|
+
# Diseño de Workflows con Skills
|
|
2
|
+
|
|
3
|
+
## Concepto
|
|
4
|
+
|
|
5
|
+
Un **workflow** es una secuencia de pasos que Claude ejecuta. Las skills definen workflows reutilizables.
|
|
6
|
+
|
|
7
|
+
## Tipos de Workflows
|
|
8
|
+
|
|
9
|
+
### 1. Linear Workflow
|
|
10
|
+
|
|
11
|
+
Pasos en secuencia:
|
|
12
|
+
|
|
13
|
+
```markdown
|
|
14
|
+
---
|
|
15
|
+
name: deploy
|
|
16
|
+
description: Deploy to production
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
# Deploy Workflow
|
|
20
|
+
|
|
21
|
+
## Steps (execute in order)
|
|
22
|
+
|
|
23
|
+
1. **Verify** - Run tests and typecheck
|
|
24
|
+
2. **Build** - Create production build
|
|
25
|
+
3. **Deploy** - Push to production
|
|
26
|
+
4. **Verify** - Check deployment health
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
### 2. Branching Workflow
|
|
30
|
+
|
|
31
|
+
Decisiones basadas en condiciones:
|
|
32
|
+
|
|
33
|
+
```markdown
|
|
34
|
+
---
|
|
35
|
+
name: fix-issue
|
|
36
|
+
description: Fix a reported issue
|
|
37
|
+
arguments:
|
|
38
|
+
- name: issueType
|
|
39
|
+
enum: [bug, performance, security]
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
# Fix Issue
|
|
43
|
+
|
|
44
|
+
## Analyze
|
|
45
|
+
|
|
46
|
+
First, identify the type of issue.
|
|
47
|
+
|
|
48
|
+
## If bug
|
|
49
|
+
1. Reproduce the issue
|
|
50
|
+
2. Write failing test
|
|
51
|
+
3. Fix the code
|
|
52
|
+
4. Verify test passes
|
|
53
|
+
|
|
54
|
+
## If performance
|
|
55
|
+
1. Profile the code
|
|
56
|
+
2. Identify bottleneck
|
|
57
|
+
3. Optimize
|
|
58
|
+
4. Benchmark improvement
|
|
59
|
+
|
|
60
|
+
## If security
|
|
61
|
+
1. Assess severity
|
|
62
|
+
2. Create fix
|
|
63
|
+
3. Run security scan
|
|
64
|
+
4. Document in changelog
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
### 3. Iterative Workflow
|
|
68
|
+
|
|
69
|
+
Repetir hasta condición:
|
|
70
|
+
|
|
71
|
+
```markdown
|
|
72
|
+
---
|
|
73
|
+
name: refactor
|
|
74
|
+
description: Iterative refactoring
|
|
75
|
+
---
|
|
76
|
+
|
|
77
|
+
# Refactor Workflow
|
|
78
|
+
|
|
79
|
+
## Loop until complete
|
|
80
|
+
|
|
81
|
+
1. **Identify** next refactoring opportunity
|
|
82
|
+
2. **Apply** refactoring
|
|
83
|
+
3. **Verify** tests still pass
|
|
84
|
+
4. **Check** if more refactoring needed
|
|
85
|
+
- If yes: continue to step 1
|
|
86
|
+
- If no: complete workflow
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
### 4. Parallel Workflow
|
|
90
|
+
|
|
91
|
+
Tareas independientes en paralelo:
|
|
92
|
+
|
|
93
|
+
```markdown
|
|
94
|
+
---
|
|
95
|
+
name: full-check
|
|
96
|
+
description: Run all checks
|
|
97
|
+
---
|
|
98
|
+
|
|
99
|
+
# Full Check Workflow
|
|
100
|
+
|
|
101
|
+
## Run in parallel
|
|
102
|
+
|
|
103
|
+
Execute these independently:
|
|
104
|
+
- `npm run typecheck`
|
|
105
|
+
- `npm run lint`
|
|
106
|
+
- `npm run test`
|
|
107
|
+
- `npm run build`
|
|
108
|
+
|
|
109
|
+
## Collect results
|
|
110
|
+
|
|
111
|
+
Report status of all checks.
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
## Integración con Expertos
|
|
115
|
+
|
|
116
|
+
Para decisiones críticas, consultar `/experts`:
|
|
117
|
+
|
|
118
|
+
```markdown
|
|
119
|
+
---
|
|
120
|
+
name: implement-feature
|
|
121
|
+
description: Implement a new feature with expert review
|
|
122
|
+
---
|
|
123
|
+
|
|
124
|
+
# Implement Feature
|
|
125
|
+
|
|
126
|
+
## 1. Plan
|
|
127
|
+
|
|
128
|
+
Create implementation plan using TodoWrite.
|
|
129
|
+
|
|
130
|
+
## 2. Implement
|
|
131
|
+
|
|
132
|
+
Execute the plan step by step.
|
|
133
|
+
|
|
134
|
+
## 3. Expert Review
|
|
135
|
+
|
|
136
|
+
If touching critical paths (finance, auth, schema):
|
|
137
|
+
|
|
138
|
+
```
|
|
139
|
+
/experts [modified files]
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
Wait for approval before proceeding.
|
|
143
|
+
|
|
144
|
+
## 4. Finalize
|
|
145
|
+
|
|
146
|
+
If approved:
|
|
147
|
+
- Run final verification
|
|
148
|
+
- Create commit
|
|
149
|
+
|
|
150
|
+
If rejected:
|
|
151
|
+
- Address feedback
|
|
152
|
+
- Return to step 2
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
## Workflows Estándar Recomendados
|
|
156
|
+
|
|
157
|
+
### Feature Development
|
|
158
|
+
|
|
159
|
+
```markdown
|
|
160
|
+
1. Understand requirements
|
|
161
|
+
2. Create plan (TodoWrite)
|
|
162
|
+
3. Implement incrementally
|
|
163
|
+
4. Write tests for critical paths
|
|
164
|
+
5. Run verification (typecheck, lint)
|
|
165
|
+
6. Expert review if critical
|
|
166
|
+
7. Commit changes
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
### Bug Fix
|
|
170
|
+
|
|
171
|
+
```markdown
|
|
172
|
+
1. Reproduce issue
|
|
173
|
+
2. Identify root cause
|
|
174
|
+
3. Write failing test
|
|
175
|
+
4. Implement fix
|
|
176
|
+
5. Verify test passes
|
|
177
|
+
6. Check for regressions
|
|
178
|
+
7. Commit with issue reference
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
### Refactoring
|
|
182
|
+
|
|
183
|
+
```markdown
|
|
184
|
+
1. Identify scope
|
|
185
|
+
2. Ensure test coverage
|
|
186
|
+
3. Small, incremental changes
|
|
187
|
+
4. Run tests after each change
|
|
188
|
+
5. No behavior changes
|
|
189
|
+
6. Commit atomically
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
## Estado y Tracking
|
|
193
|
+
|
|
194
|
+
Usar TodoWrite para tracking:
|
|
195
|
+
|
|
196
|
+
```markdown
|
|
197
|
+
## Tracking
|
|
198
|
+
|
|
199
|
+
Use TodoWrite to:
|
|
200
|
+
- Create tasks at workflow start
|
|
201
|
+
- Update status as you progress
|
|
202
|
+
- Mark completed when done
|
|
203
|
+
- Add discovered tasks as needed
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
## Memory Integration
|
|
207
|
+
|
|
208
|
+
Registrar aprendizajes:
|
|
209
|
+
|
|
210
|
+
```markdown
|
|
211
|
+
## Learning Capture
|
|
212
|
+
|
|
213
|
+
During workflow:
|
|
214
|
+
- Capture new patterns discovered
|
|
215
|
+
- Note gotchas for future reference
|
|
216
|
+
- Record decisions made and why
|
|
217
|
+
|
|
218
|
+
Use memory tools to persist learnings.
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
## Error Handling
|
|
222
|
+
|
|
223
|
+
```markdown
|
|
224
|
+
## If errors occur
|
|
225
|
+
|
|
226
|
+
1. **Log** the error context
|
|
227
|
+
2. **Analyze** root cause
|
|
228
|
+
3. **Decide** next action:
|
|
229
|
+
- Retry if transient
|
|
230
|
+
- Ask user if unclear
|
|
231
|
+
- Abort if unrecoverable
|
|
232
|
+
4. **Document** the issue if new pattern
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
## Composing Workflows
|
|
236
|
+
|
|
237
|
+
Skills pueden llamar otras skills:
|
|
238
|
+
|
|
239
|
+
```markdown
|
|
240
|
+
---
|
|
241
|
+
name: release
|
|
242
|
+
description: Full release workflow
|
|
243
|
+
---
|
|
244
|
+
|
|
245
|
+
# Release
|
|
246
|
+
|
|
247
|
+
## Steps
|
|
248
|
+
|
|
249
|
+
1. Run `/full-check` - all validations
|
|
250
|
+
2. Run `/changelog` - update changelog
|
|
251
|
+
3. Run `/version-bump` - increment version
|
|
252
|
+
4. Run `/deploy` - push to production
|
|
253
|
+
5. Run `/notify` - send notifications
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
## Ejemplo Completo
|
|
257
|
+
|
|
258
|
+
```markdown
|
|
259
|
+
---
|
|
260
|
+
name: add-api-endpoint
|
|
261
|
+
description: Add new TRPC endpoint with full workflow
|
|
262
|
+
arguments:
|
|
263
|
+
- name: routerName
|
|
264
|
+
required: true
|
|
265
|
+
- name: procedureName
|
|
266
|
+
required: true
|
|
267
|
+
---
|
|
268
|
+
|
|
269
|
+
# Add API Endpoint: {{routerName}}.{{procedureName}}
|
|
270
|
+
|
|
271
|
+
## 1. Setup Tasks
|
|
272
|
+
|
|
273
|
+
Create TodoWrite entries:
|
|
274
|
+
- [ ] Create procedure in router
|
|
275
|
+
- [ ] Add Zod schema
|
|
276
|
+
- [ ] Write tests
|
|
277
|
+
- [ ] Update client types
|
|
278
|
+
|
|
279
|
+
## 2. Implementation
|
|
280
|
+
|
|
281
|
+
### 2.1 Locate Router
|
|
282
|
+
|
|
283
|
+
Find `src/server/api/routers/{{routerName}}.ts`
|
|
284
|
+
|
|
285
|
+
### 2.2 Add Procedure
|
|
286
|
+
|
|
287
|
+
```typescript
|
|
288
|
+
{{procedureName}}: protectedProcedure
|
|
289
|
+
.input({{procedureName}}Schema)
|
|
290
|
+
.mutation(async ({ ctx, input }) => {
|
|
291
|
+
// Implementation
|
|
292
|
+
})
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
### 2.3 Add Schema
|
|
296
|
+
|
|
297
|
+
```typescript
|
|
298
|
+
const {{procedureName}}Schema = z.object({
|
|
299
|
+
// Define input schema
|
|
300
|
+
})
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
## 3. Testing
|
|
304
|
+
|
|
305
|
+
Create test at `src/server/api/routers/__tests__/{{routerName}}.test.ts`
|
|
306
|
+
|
|
307
|
+
## 4. Verification
|
|
308
|
+
|
|
309
|
+
Run:
|
|
310
|
+
- `npm run typecheck`
|
|
311
|
+
- `npm run test -- {{routerName}}`
|
|
312
|
+
|
|
313
|
+
## 5. Expert Review
|
|
314
|
+
|
|
315
|
+
If {{routerName}} is in critical path:
|
|
316
|
+
```
|
|
317
|
+
/experts src/server/api/routers/{{routerName}}.ts
|
|
318
|
+
```
|
|
319
|
+
|
|
320
|
+
## 6. Complete
|
|
321
|
+
|
|
322
|
+
Mark all todos as completed.
|
|
323
|
+
```
|
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
# Diseño de Tools Internas
|
|
2
|
+
|
|
3
|
+
## Qué es una Tool
|
|
4
|
+
|
|
5
|
+
Una **Tool** es una utilidad reutilizable que automatiza tareas comunes. Diferente de MCP tools, estas son funciones/scripts internos del proyecto.
|
|
6
|
+
|
|
7
|
+
## Categorías
|
|
8
|
+
|
|
9
|
+
### 1. CLI Tools
|
|
10
|
+
|
|
11
|
+
Scripts ejecutables desde terminal:
|
|
12
|
+
|
|
13
|
+
```
|
|
14
|
+
scripts/
|
|
15
|
+
├── checks/ # Validaciones
|
|
16
|
+
│ ├── typecheck.mjs
|
|
17
|
+
│ └── lint.mjs
|
|
18
|
+
├── migration/ # Migraciones
|
|
19
|
+
│ └── run-migration.mjs
|
|
20
|
+
└── ai/ # AI-related
|
|
21
|
+
└── generate.mjs
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
### 2. Build Tools
|
|
25
|
+
|
|
26
|
+
Parte del proceso de build:
|
|
27
|
+
|
|
28
|
+
```typescript
|
|
29
|
+
// tools/build/
|
|
30
|
+
├── compile.ts
|
|
31
|
+
├── bundle.ts
|
|
32
|
+
└── optimize.ts
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
### 3. Dev Tools
|
|
36
|
+
|
|
37
|
+
Para desarrollo local:
|
|
38
|
+
|
|
39
|
+
```typescript
|
|
40
|
+
// tools/dev/
|
|
41
|
+
├── mock-server.ts
|
|
42
|
+
├── seed-db.ts
|
|
43
|
+
└── test-utils.ts
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## Estructura de una CLI Tool
|
|
47
|
+
|
|
48
|
+
```typescript
|
|
49
|
+
#!/usr/bin/env node
|
|
50
|
+
// scripts/my-tool.mjs
|
|
51
|
+
|
|
52
|
+
import { parseArgs } from 'node:util'
|
|
53
|
+
|
|
54
|
+
// 1. Parse arguments
|
|
55
|
+
const { values, positionals } = parseArgs({
|
|
56
|
+
options: {
|
|
57
|
+
verbose: { type: 'boolean', short: 'v', default: false },
|
|
58
|
+
output: { type: 'string', short: 'o' }
|
|
59
|
+
},
|
|
60
|
+
allowPositionals: true
|
|
61
|
+
})
|
|
62
|
+
|
|
63
|
+
// 2. Validate input
|
|
64
|
+
if (positionals.length === 0) {
|
|
65
|
+
console.error('Usage: my-tool <input> [--verbose] [--output path]')
|
|
66
|
+
process.exit(1)
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// 3. Execute
|
|
70
|
+
async function main() {
|
|
71
|
+
try {
|
|
72
|
+
const result = await doWork(positionals[0], values)
|
|
73
|
+
console.log('Done:', result)
|
|
74
|
+
process.exit(0)
|
|
75
|
+
} catch (error) {
|
|
76
|
+
console.error('Error:', error.message)
|
|
77
|
+
process.exit(1)
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
main()
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
## Patrones Recomendados
|
|
85
|
+
|
|
86
|
+
### Patrón: Reporter
|
|
87
|
+
|
|
88
|
+
Para tools que analizan y reportan:
|
|
89
|
+
|
|
90
|
+
```typescript
|
|
91
|
+
interface ReportResult {
|
|
92
|
+
passed: boolean
|
|
93
|
+
items: ReportItem[]
|
|
94
|
+
summary: string
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
async function analyze(path: string): Promise<ReportResult> {
|
|
98
|
+
const items = await scanFiles(path)
|
|
99
|
+
const issues = items.filter(i => !i.valid)
|
|
100
|
+
|
|
101
|
+
return {
|
|
102
|
+
passed: issues.length === 0,
|
|
103
|
+
items: issues,
|
|
104
|
+
summary: `Found ${issues.length} issues in ${items.length} files`
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
### Patrón: Transformer
|
|
110
|
+
|
|
111
|
+
Para tools que transforman archivos:
|
|
112
|
+
|
|
113
|
+
```typescript
|
|
114
|
+
interface TransformOptions {
|
|
115
|
+
input: string
|
|
116
|
+
output: string
|
|
117
|
+
dryRun?: boolean
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
async function transform(options: TransformOptions): Promise<void> {
|
|
121
|
+
const content = await readFile(options.input, 'utf-8')
|
|
122
|
+
const transformed = applyTransformations(content)
|
|
123
|
+
|
|
124
|
+
if (options.dryRun) {
|
|
125
|
+
console.log('Would write to:', options.output)
|
|
126
|
+
console.log(transformed)
|
|
127
|
+
return
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
await writeFile(options.output, transformed)
|
|
131
|
+
}
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
### Patrón: Batch Processor
|
|
135
|
+
|
|
136
|
+
Para operaciones sobre múltiples archivos:
|
|
137
|
+
|
|
138
|
+
```typescript
|
|
139
|
+
async function processBatch(
|
|
140
|
+
files: string[],
|
|
141
|
+
processor: (file: string) => Promise<void>
|
|
142
|
+
): Promise<BatchResult> {
|
|
143
|
+
const results = await Promise.allSettled(
|
|
144
|
+
files.map(processor)
|
|
145
|
+
)
|
|
146
|
+
|
|
147
|
+
return {
|
|
148
|
+
total: files.length,
|
|
149
|
+
succeeded: results.filter(r => r.status === 'fulfilled').length,
|
|
150
|
+
failed: results.filter(r => r.status === 'rejected').length
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
## Configuración
|
|
156
|
+
|
|
157
|
+
### En package.json
|
|
158
|
+
|
|
159
|
+
```json
|
|
160
|
+
{
|
|
161
|
+
"scripts": {
|
|
162
|
+
"tool:analyze": "node scripts/analyze.mjs",
|
|
163
|
+
"tool:migrate": "node scripts/migrate.mjs",
|
|
164
|
+
"tool:generate": "node scripts/generate.mjs"
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
### Con argumentos
|
|
170
|
+
|
|
171
|
+
```json
|
|
172
|
+
{
|
|
173
|
+
"scripts": {
|
|
174
|
+
"lint:all": "npm run lint -- --fix",
|
|
175
|
+
"check:verbose": "npm run check -- --verbose"
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
## Logging
|
|
181
|
+
|
|
182
|
+
```typescript
|
|
183
|
+
// Usar chalk para colores
|
|
184
|
+
import chalk from 'chalk'
|
|
185
|
+
|
|
186
|
+
function log(level: 'info' | 'warn' | 'error', msg: string) {
|
|
187
|
+
const prefix = {
|
|
188
|
+
info: chalk.blue('ℹ'),
|
|
189
|
+
warn: chalk.yellow('⚠'),
|
|
190
|
+
error: chalk.red('✖')
|
|
191
|
+
}
|
|
192
|
+
console.error(`${prefix[level]} ${msg}`)
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
// Usar stderr para logs, stdout para output
|
|
196
|
+
console.error('[INFO] Processing...') // logs
|
|
197
|
+
console.log(JSON.stringify(result)) // output (puede ser piped)
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
## Testing Tools
|
|
201
|
+
|
|
202
|
+
```typescript
|
|
203
|
+
import { describe, it, expect } from 'vitest'
|
|
204
|
+
import { execSync } from 'child_process'
|
|
205
|
+
|
|
206
|
+
describe('my-tool', () => {
|
|
207
|
+
it('should process valid input', () => {
|
|
208
|
+
const result = execSync('node scripts/my-tool.mjs input.txt')
|
|
209
|
+
expect(result.toString()).toContain('Done')
|
|
210
|
+
})
|
|
211
|
+
|
|
212
|
+
it('should fail on invalid input', () => {
|
|
213
|
+
expect(() => {
|
|
214
|
+
execSync('node scripts/my-tool.mjs')
|
|
215
|
+
}).toThrow()
|
|
216
|
+
})
|
|
217
|
+
})
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
## Anti-Patterns
|
|
221
|
+
|
|
222
|
+
### NO: Hardcoded paths
|
|
223
|
+
|
|
224
|
+
```typescript
|
|
225
|
+
// MAL
|
|
226
|
+
const config = await readFile('/Users/carlos/project/config.json')
|
|
227
|
+
|
|
228
|
+
// BIEN
|
|
229
|
+
const config = await readFile(path.join(process.cwd(), 'config.json'))
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
### NO: Silent failures
|
|
233
|
+
|
|
234
|
+
```typescript
|
|
235
|
+
// MAL
|
|
236
|
+
try {
|
|
237
|
+
await doWork()
|
|
238
|
+
} catch {
|
|
239
|
+
// silencio
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
// BIEN
|
|
243
|
+
try {
|
|
244
|
+
await doWork()
|
|
245
|
+
} catch (error) {
|
|
246
|
+
console.error('Failed:', error.message)
|
|
247
|
+
process.exit(1)
|
|
248
|
+
}
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
### NO: Sin validación de input
|
|
252
|
+
|
|
253
|
+
```typescript
|
|
254
|
+
// MAL
|
|
255
|
+
async function main() {
|
|
256
|
+
await processFile(process.argv[2])
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
// BIEN
|
|
260
|
+
async function main() {
|
|
261
|
+
const file = process.argv[2]
|
|
262
|
+
if (!file) {
|
|
263
|
+
console.error('Usage: tool <file>')
|
|
264
|
+
process.exit(1)
|
|
265
|
+
}
|
|
266
|
+
if (!existsSync(file)) {
|
|
267
|
+
console.error(`File not found: ${file}`)
|
|
268
|
+
process.exit(1)
|
|
269
|
+
}
|
|
270
|
+
await processFile(file)
|
|
271
|
+
}
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
## Documentación
|
|
275
|
+
|
|
276
|
+
Cada tool debe tener:
|
|
277
|
+
|
|
278
|
+
1. **JSDoc header** con descripción y ejemplos
|
|
279
|
+
2. **--help** flag que explica uso
|
|
280
|
+
3. **README** si es compleja
|
|
281
|
+
|
|
282
|
+
```typescript
|
|
283
|
+
/**
|
|
284
|
+
* @file Analyze TypeScript files for common issues
|
|
285
|
+
* @example
|
|
286
|
+
* ```bash
|
|
287
|
+
* # Analyze single file
|
|
288
|
+
* npm run tool:analyze src/index.ts
|
|
289
|
+
*
|
|
290
|
+
* # Analyze directory
|
|
291
|
+
* npm run tool:analyze src/ --recursive
|
|
292
|
+
*
|
|
293
|
+
* # Output JSON
|
|
294
|
+
* npm run tool:analyze src/ --format json > report.json
|
|
295
|
+
* ```
|
|
296
|
+
*/
|
|
297
|
+
```
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://claude.ai/settings-schema.json",
|
|
3
|
+
"claudeMdPath": "CLAUDE.md",
|
|
4
|
+
"hooks": {
|
|
5
|
+
"SessionStart": [
|
|
6
|
+
{
|
|
7
|
+
"matcher": "",
|
|
8
|
+
"hooks": [
|
|
9
|
+
{
|
|
10
|
+
"type": "command",
|
|
11
|
+
"command": "npx tsx node_modules/cmp-standards/dist/hooks/cloud-session-start.js"
|
|
12
|
+
}
|
|
13
|
+
]
|
|
14
|
+
}
|
|
15
|
+
],
|
|
16
|
+
"PreToolUse": [
|
|
17
|
+
{
|
|
18
|
+
"matcher": "Edit",
|
|
19
|
+
"hooks": [
|
|
20
|
+
{
|
|
21
|
+
"type": "command",
|
|
22
|
+
"command": "npx tsx node_modules/cmp-standards/dist/hooks/cloud-pre-tool-use.js Edit"
|
|
23
|
+
}
|
|
24
|
+
]
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
"matcher": "Write",
|
|
28
|
+
"hooks": [
|
|
29
|
+
{
|
|
30
|
+
"type": "command",
|
|
31
|
+
"command": "npx tsx node_modules/cmp-standards/dist/hooks/cloud-pre-tool-use.js Write"
|
|
32
|
+
}
|
|
33
|
+
]
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
"matcher": "Task",
|
|
37
|
+
"hooks": [
|
|
38
|
+
{
|
|
39
|
+
"type": "command",
|
|
40
|
+
"command": "npx tsx node_modules/cmp-standards/dist/hooks/cloud-pre-tool-use.js Task"
|
|
41
|
+
}
|
|
42
|
+
]
|
|
43
|
+
}
|
|
44
|
+
],
|
|
45
|
+
"PostToolUse": [
|
|
46
|
+
{
|
|
47
|
+
"matcher": "Edit",
|
|
48
|
+
"hooks": [
|
|
49
|
+
{
|
|
50
|
+
"type": "command",
|
|
51
|
+
"command": "npx tsx node_modules/cmp-standards/dist/hooks/cloud-post-tool-use.js Edit"
|
|
52
|
+
}
|
|
53
|
+
]
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
"matcher": "Write",
|
|
57
|
+
"hooks": [
|
|
58
|
+
{
|
|
59
|
+
"type": "command",
|
|
60
|
+
"command": "npx tsx node_modules/cmp-standards/dist/hooks/cloud-post-tool-use.js Write"
|
|
61
|
+
}
|
|
62
|
+
]
|
|
63
|
+
}
|
|
64
|
+
]
|
|
65
|
+
},
|
|
66
|
+
"plugins": {
|
|
67
|
+
"cmp-standards": {
|
|
68
|
+
"version": "2.2.0",
|
|
69
|
+
"enabled": true
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
@@ -14,34 +14,8 @@
|
|
|
14
14
|
"infrastructure"
|
|
15
15
|
],
|
|
16
16
|
"guards": {
|
|
17
|
-
"enabled":
|
|
18
|
-
"rules": [
|
|
19
|
-
{
|
|
20
|
-
"id": "schema-protection",
|
|
21
|
-
"type": "block",
|
|
22
|
-
"filePattern": "src/server/schema/auth.ts",
|
|
23
|
-
"contentTrigger": ".*",
|
|
24
|
-
"message": "PANEL_* tables are READ-ONLY. Do not modify auth.ts.",
|
|
25
|
-
"allowOverride": false
|
|
26
|
-
},
|
|
27
|
-
{
|
|
28
|
-
"id": "dev-items-filter",
|
|
29
|
-
"type": "warn",
|
|
30
|
-
"filePattern": "**/*.ts",
|
|
31
|
-
"contentTrigger": "from\\(devItems\\)(?!.*\\.where.*system)",
|
|
32
|
-
"message": "Always filter DEV_Items by system='SWARMSCALE'",
|
|
33
|
-
"allowOverride": true
|
|
34
|
-
},
|
|
35
|
-
{
|
|
36
|
-
"id": "marketing-tables-only",
|
|
37
|
-
"type": "warn",
|
|
38
|
-
"filePattern": "src/server/schema/*.ts",
|
|
39
|
-
"contentTrigger": "mysqlTable\\(['\"](?!MARKETING_)",
|
|
40
|
-
"excludeFiles": ["marketing.ts", "dev.ts", "index.ts"],
|
|
41
|
-
"message": "SwarmScale only owns MARKETING_* tables",
|
|
42
|
-
"allowOverride": true
|
|
43
|
-
}
|
|
44
|
-
]
|
|
17
|
+
"enabled": false,
|
|
18
|
+
"rules": []
|
|
45
19
|
},
|
|
46
20
|
"embedding": {
|
|
47
21
|
"enabled": true,
|