@smartsoft001-mobilems/claude-plugins 2.67.0 → 2.69.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.
Files changed (33) hide show
  1. package/.claude-plugin/marketplace.json +4 -0
  2. package/package.json +1 -1
  3. package/plugins/flow/.claude-plugin/plugin.json +1 -1
  4. package/plugins/flow-legacy/.claude-plugin/README.md +143 -0
  5. package/plugins/flow-legacy/.claude-plugin/merge-permissions.js +80 -0
  6. package/plugins/flow-legacy/.claude-plugin/plugin.json +5 -0
  7. package/plugins/flow-legacy/.claude-plugin/settings.template.json +75 -0
  8. package/plugins/flow-legacy/agents/angular-component-scaffolder.md +323 -0
  9. package/plugins/flow-legacy/agents/angular-directive-builder.md +258 -0
  10. package/plugins/flow-legacy/agents/angular-guard-builder.md +322 -0
  11. package/plugins/flow-legacy/agents/angular-pipe-builder.md +227 -0
  12. package/plugins/flow-legacy/agents/angular-resolver-builder.md +332 -0
  13. package/plugins/flow-legacy/agents/angular-service-builder.md +271 -0
  14. package/plugins/flow-legacy/agents/angular-state-builder.md +473 -0
  15. package/plugins/flow-legacy/agents/shared-impl-orchestrator.md +161 -0
  16. package/plugins/flow-legacy/agents/shared-impl-reporter.md +204 -0
  17. package/plugins/flow-legacy/agents/shared-linear-subtask-iterator.md +187 -0
  18. package/plugins/flow-legacy/agents/shared-tdd-developer.md +304 -0
  19. package/plugins/flow-legacy/agents/shared-test-runner.md +131 -0
  20. package/plugins/flow-legacy/agents/shared-ui-classifier.md +137 -0
  21. package/plugins/flow-legacy/commands/commit.md +162 -0
  22. package/plugins/flow-legacy/commands/impl.md +495 -0
  23. package/plugins/flow-legacy/commands/plan.md +488 -0
  24. package/plugins/flow-legacy/commands/push.md +470 -0
  25. package/plugins/flow-legacy/skills/a11y-audit/SKILL.md +214 -0
  26. package/plugins/flow-legacy/skills/angular-patterns/SKILL.md +361 -0
  27. package/plugins/flow-legacy/skills/browser-capture/SKILL.md +238 -0
  28. package/plugins/flow-legacy/skills/debug-helper/SKILL.md +387 -0
  29. package/plugins/flow-legacy/skills/linear-suggestion/SKILL.md +132 -0
  30. package/plugins/flow-legacy/skills/maia-files-delete/SKILL.md +59 -0
  31. package/plugins/flow-legacy/skills/maia-files-upload/SKILL.md +57 -0
  32. package/plugins/flow-legacy/skills/nx-conventions/SKILL.md +371 -0
  33. package/plugins/flow-legacy/skills/test-unit/SKILL.md +494 -0
@@ -0,0 +1,387 @@
1
+ ---
2
+ name: debug-helper
3
+ description: Cross-stack debugging workflows for Angular 14, NestJS, and MongoDB applications
4
+ ---
5
+
6
+ # Debug Helper (Angular 14 Legacy)
7
+
8
+ This skill provides debugging workflows and techniques for Angular 14 legacy projects.
9
+
10
+ ## 1. Angular 14 Debugging
11
+
12
+ ### Component Not Rendering
13
+
14
+ 1. **Check selector usage**
15
+
16
+ ```typescript
17
+ // Verify selector matches
18
+ @Component({ selector: 'app-my-component' })
19
+ // Template: <app-my-component></app-my-component>
20
+ ```
21
+
22
+ 2. **Check module declarations**
23
+
24
+ ```typescript
25
+ @NgModule({
26
+ declarations: [MyComponent], // Is it declared?
27
+ exports: [MyComponent], // Is it exported (if used outside)?
28
+ })
29
+ export class FeatureModule {}
30
+ ```
31
+
32
+ 3. **Check module imports**
33
+ ```typescript
34
+ @NgModule({
35
+ imports: [FeatureModule], // Is feature module imported?
36
+ })
37
+ export class AppModule {}
38
+ ```
39
+
40
+ ### BehaviorSubject/Observable Issues
41
+
42
+ 1. **BehaviorSubject not updating view**
43
+
44
+ ```typescript
45
+ // Wrong: mutating array directly
46
+ const items = this._items.getValue();
47
+ items.push(newItem); // Won't trigger update
48
+ this._items.next(items);
49
+
50
+ // Correct: create new reference
51
+ const items = this._items.getValue();
52
+ this._items.next([...items, newItem]);
53
+ ```
54
+
55
+ 2. **Subscription not receiving values**
56
+
57
+ ```typescript
58
+ // Ensure subscription is active
59
+ ngOnInit(): void {
60
+ this.items$ = this.stateService.items$;
61
+
62
+ // Debug: log values
63
+ this.items$.pipe(
64
+ tap(items => console.log('Items received:', items)),
65
+ takeUntil(this.destroy$)
66
+ ).subscribe();
67
+ }
68
+ ```
69
+
70
+ 3. **Memory leak from subscriptions**
71
+ ```typescript
72
+ // Always unsubscribe with takeUntil pattern
73
+ private readonly destroy$ = new Subject<void>();
74
+
75
+ ngOnInit(): void {
76
+ this.service.data$
77
+ .pipe(takeUntil(this.destroy$))
78
+ .subscribe(data => this.data = data);
79
+ }
80
+
81
+ ngOnDestroy(): void {
82
+ this.destroy$.next();
83
+ this.destroy$.complete();
84
+ }
85
+ ```
86
+
87
+ ### Change Detection Issues
88
+
89
+ ```typescript
90
+ // Force change detection (use sparingly)
91
+ constructor(private cdr: ChangeDetectorRef) {}
92
+
93
+ // After async operation
94
+ this.cdr.detectChanges();
95
+
96
+ // Or mark for check (OnPush)
97
+ this.cdr.markForCheck();
98
+ ```
99
+
100
+ ### HTTP Debugging (Angular 14)
101
+
102
+ ```typescript
103
+ // HTTP interceptor for logging
104
+ @Injectable()
105
+ export class LoggingInterceptor implements HttpInterceptor {
106
+ intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
107
+ console.log('Request:', req.method, req.url);
108
+
109
+ return next.handle(req).pipe(
110
+ tap({
111
+ next: (event) => {
112
+ if (event instanceof HttpResponse) {
113
+ console.log('Response:', event.status, event.body);
114
+ }
115
+ },
116
+ error: (error) => console.error('HTTP Error:', error),
117
+ })
118
+ );
119
+ }
120
+ }
121
+
122
+ // Register in module
123
+ @NgModule({
124
+ providers: [
125
+ { provide: HTTP_INTERCEPTORS, useClass: LoggingInterceptor, multi: true },
126
+ ],
127
+ })
128
+ export class AppModule {}
129
+ ```
130
+
131
+ ### Template Debugging
132
+
133
+ ```html
134
+ <!-- Debug in template with json pipe -->
135
+ <pre>{{ data | json }}</pre>
136
+
137
+ <!-- Debug *ngIf condition -->
138
+ <p>isLoading: {{ isLoading }}</p>
139
+ <p>items.length: {{ items?.length }}</p>
140
+
141
+ <!-- Debug *ngFor -->
142
+ <div *ngFor="let item of items; let i = index">
143
+ {{ i }}: {{ item | json }}
144
+ </div>
145
+ ```
146
+
147
+ ### Browser DevTools
148
+
149
+ 1. **Angular DevTools** - Install Chrome extension (works with Angular 14)
150
+ 2. **Component inspector** - Click "Components" tab
151
+ 3. **Profiler** - Record change detection cycles
152
+ 4. **Network tab** - Check API calls
153
+
154
+ ## 2. NestJS Debugging
155
+
156
+ ### Request Not Reaching Controller
157
+
158
+ 1. **Check route path**
159
+
160
+ ```typescript
161
+ @Controller('features') // /features
162
+ @Get(':id') // /features/:id
163
+ ```
164
+
165
+ 2. **Check module imports**
166
+
167
+ ```typescript
168
+ @Module({
169
+ imports: [FeatureModule], // Is module imported?
170
+ })
171
+ export class AppModule {}
172
+ ```
173
+
174
+ 3. **Check guards/interceptors**
175
+ ```typescript
176
+ @UseGuards(AuthGuard) // Is guard blocking?
177
+ ```
178
+
179
+ ### Dependency Injection Errors
180
+
181
+ ```
182
+ Error: Nest can't resolve dependencies of FeatureService
183
+ ```
184
+
185
+ **Solutions:**
186
+
187
+ 1. Check provider is in module
188
+
189
+ ```typescript
190
+ @Module({
191
+ providers: [FeatureService, FeatureRepository],
192
+ })
193
+ ```
194
+
195
+ 2. Check circular dependencies
196
+
197
+ ```typescript
198
+ // Use forwardRef
199
+ @Inject(forwardRef(() => OtherService))
200
+ private readonly other: OtherService,
201
+ ```
202
+
203
+ 3. Check module exports
204
+ ```typescript
205
+ @Module({
206
+ providers: [SharedService],
207
+ exports: [SharedService], // Must export if used elsewhere
208
+ })
209
+ ```
210
+
211
+ ### Logging
212
+
213
+ ```typescript
214
+ import { Logger } from '@nestjs/common';
215
+
216
+ @Injectable()
217
+ export class FeatureService {
218
+ private readonly logger = new Logger(FeatureService.name);
219
+
220
+ async findAll() {
221
+ this.logger.log('Finding all features');
222
+ this.logger.debug('Debug info');
223
+ this.logger.warn('Warning');
224
+ this.logger.error('Error occurred', error.stack);
225
+ }
226
+ }
227
+ ```
228
+
229
+ ## 3. MongoDB/Mongoose Debugging
230
+
231
+ ### Connection Issues
232
+
233
+ ```typescript
234
+ // Log connection events
235
+ mongoose.connection.on('connected', () => console.log('MongoDB connected'));
236
+ mongoose.connection.on('error', (err) => console.error('MongoDB error:', err));
237
+ mongoose.connection.on('disconnected', () => console.log('MongoDB disconnected'));
238
+ ```
239
+
240
+ ### Query Debugging
241
+
242
+ ```typescript
243
+ // Enable Mongoose debug mode
244
+ mongoose.set('debug', true);
245
+
246
+ // Or for specific query
247
+ const result = await this.model.find({ status: 'active' });
248
+ console.log('Query:', this.model.find({ status: 'active' }).getQuery());
249
+ ```
250
+
251
+ ## 4. Common Debugging Patterns
252
+
253
+ ### Console Debugging
254
+
255
+ ```typescript
256
+ // Temporary debug logs (remove before commit)
257
+ console.log('DEBUG:', variable);
258
+ console.table(arrayOfObjects);
259
+ console.group('Group');
260
+ console.log('Item 1');
261
+ console.log('Item 2');
262
+ console.groupEnd();
263
+ console.time('Operation');
264
+ // ... operation
265
+ console.timeEnd('Operation');
266
+ ```
267
+
268
+ ### Breakpoint Debugging
269
+
270
+ ```typescript
271
+ // Add debugger statement
272
+ function processData(data: Data) {
273
+ debugger; // Execution pauses here in DevTools
274
+ return transform(data);
275
+ }
276
+ ```
277
+
278
+ ### VS Code Launch Configuration (Angular 14 / Nx 14)
279
+
280
+ ```json
281
+ // .vscode/launch.json
282
+ {
283
+ "version": "0.2.0",
284
+ "configurations": [
285
+ {
286
+ "type": "node",
287
+ "request": "launch",
288
+ "name": "Debug NestJS",
289
+ "runtimeArgs": ["-r", "ts-node/register"],
290
+ "args": ["${workspaceFolder}/apps/api/src/main.ts"],
291
+ "cwd": "${workspaceFolder}"
292
+ },
293
+ {
294
+ "type": "chrome",
295
+ "request": "launch",
296
+ "name": "Debug Angular",
297
+ "url": "http://localhost:4200",
298
+ "webRoot": "${workspaceFolder}/apps/web/src"
299
+ }
300
+ ]
301
+ }
302
+ ```
303
+
304
+ ## 5. Error Investigation Workflow
305
+
306
+ ### Step 1: Reproduce
307
+
308
+ - Get exact steps to reproduce
309
+ - Note environment (browser, Node version - should be Node 18)
310
+
311
+ ### Step 2: Isolate
312
+
313
+ - Identify component/service causing issue
314
+ - Check if issue is frontend, backend, or database
315
+
316
+ ### Step 3: Trace
317
+
318
+ - Add logging at key points
319
+ - Use debugger to step through code
320
+ - Check network requests/responses
321
+
322
+ ### Step 4: Root Cause
323
+
324
+ - Identify the actual cause (not symptoms)
325
+ - Document findings
326
+
327
+ ### Step 5: Fix & Verify
328
+
329
+ - Apply fix
330
+ - Write test that catches the bug
331
+ - Verify fix doesn't introduce regressions
332
+
333
+ ## 6. Quick Fixes (Angular 14)
334
+
335
+ ### "Cannot read property of undefined"
336
+
337
+ ```typescript
338
+ // Use optional chaining
339
+ const name = user?.profile?.name;
340
+
341
+ // With nullish coalescing
342
+ const name = user?.profile?.name ?? 'Unknown';
343
+
344
+ // In templates (Angular 14)
345
+ {{ user?.profile?.name }}
346
+ ```
347
+
348
+ ### "Expression has changed after it was checked"
349
+
350
+ ```typescript
351
+ // Option 1: setTimeout
352
+ ngAfterViewInit(): void {
353
+ setTimeout(() => this.value = newValue);
354
+ }
355
+
356
+ // Option 2: ChangeDetectorRef
357
+ ngAfterViewInit(): void {
358
+ this.value = newValue;
359
+ this.cdr.detectChanges();
360
+ }
361
+ ```
362
+
363
+ ### "Circular dependency detected"
364
+
365
+ ```typescript
366
+ // Use forwardRef
367
+ @Inject(forwardRef(() => ServiceB))
368
+ private serviceB: ServiceB
369
+
370
+ // Or refactor to remove circular dependency
371
+ ```
372
+
373
+ ### "NullInjectorError: No provider for X"
374
+
375
+ ```typescript
376
+ // Check module providers
377
+ @NgModule({
378
+ providers: [MyService], // Add missing provider
379
+ })
380
+ export class AppModule {}
381
+
382
+ // Or check providedIn
383
+ @Injectable({
384
+ providedIn: 'root', // Or specific module
385
+ })
386
+ export class MyService {}
387
+ ```
@@ -0,0 +1,132 @@
1
+ ---
2
+ name: linear-suggestion
3
+ description: Create a Linear issue in the "MobileMS Framework" project with a suggestion for agent, command, or skill improvements.
4
+ allowed-tools: mcp__linear-server__create_issue
5
+ ---
6
+
7
+ # Linear Suggestion
8
+
9
+ Create a Linear issue in the **MobileMS Framework** project containing a suggestion for improving agent definitions, commands, or skills. Used by automated analysis agents to propose changes without blocking the workflow.
10
+
11
+ ## When to Use
12
+
13
+ - When an automated agent (e.g., `shared-parallelization-analyzer`) identifies a recurring pattern that could improve an agent, command, or skill
14
+ - When proposing orchestrator rule changes based on parallelization analysis
15
+ - When any non-interactive process needs to suggest framework improvements
16
+
17
+ ## Input Parameters
18
+
19
+ The invoking agent must provide:
20
+
21
+ | Parameter | Required | Description |
22
+ | ------------- | -------- | --------------------------------------------------------------- |
23
+ | `title` | YES | Short summary of the suggestion (max 100 chars) |
24
+ | `description` | YES | Full markdown description with rationale and proposed changes |
25
+ | `source` | YES | Agent that generated the suggestion (e.g., `shared-parallelization-analyzer`) |
26
+ | `targetFile` | NO | Path to the file to be modified (e.g., `agents/shared-impl-orchestrator.md`) |
27
+ | `category` | NO | One of: `OPTIMIZATION`, `NEW_RULE`, `PATTERN_UPDATE`, `BUG_FIX` |
28
+
29
+ ## Issue Format
30
+
31
+ ### Title
32
+
33
+ ```
34
+ [Agent Suggestion] {title}
35
+ ```
36
+
37
+ ### Description
38
+
39
+ ```markdown
40
+ ## Agent Improvement Suggestion
41
+
42
+ **Source agent**: `{source}`
43
+ **Category**: {category}
44
+ **Target file**: `{targetFile}`
45
+
46
+ ---
47
+
48
+ {description}
49
+
50
+ ---
51
+
52
+ _This issue was automatically created by `{source}` via the `linear-suggestion` skill._
53
+ _Review and apply manually if the suggestion is valid._
54
+ ```
55
+
56
+ ## Process
57
+
58
+ 1. **Format the issue title** with `[Agent Suggestion]` prefix
59
+ 2. **Build the description** using the template above, inserting all provided parameters
60
+ 3. **Create the issue** using MCP Linear server:
61
+
62
+ ```
63
+ Create issue in project "MobileMS Framework":
64
+ - Title: [Agent Suggestion] {title}
65
+ - Description: {formatted description}
66
+ - Label: agent-evolution
67
+ ```
68
+
69
+ 4. **Return the issue ID and URL** to the invoking agent
70
+
71
+ ## Output Format
72
+
73
+ After successful creation, return:
74
+
75
+ ```
76
+ Linear issue created:
77
+ - ID: {issueId}
78
+ - Title: [Agent Suggestion] {title}
79
+ - URL: {issueUrl}
80
+ ```
81
+
82
+ ## Error Handling
83
+
84
+ If issue creation fails (e.g., MCP Linear server unavailable):
85
+
86
+ - Log the error silently
87
+ - Do NOT block the parent workflow
88
+ - Return a failure notice without throwing
89
+
90
+ ```
91
+ Linear suggestion skipped: {error reason}
92
+ ```
93
+
94
+ ## Example
95
+
96
+ **Input from `shared-parallelization-analyzer`:**
97
+
98
+ ```
99
+ title: Add parallel scaffolding rule to orchestrator
100
+ description: |
101
+ ### Observation
102
+
103
+ In 3 out of 5 recent tasks, scaffolding agents for independent files
104
+ (e.g., `angular-component-scaffolder` + `angular-service-builder`) were
105
+ marked as SEQ despite having no shared output files.
106
+
107
+ ### Proposed Change
108
+
109
+ Add to `shared-impl-orchestrator.md` -> Execution Patterns -> Parallel vs Sequential:
110
+
111
+ | Scenario | Pattern | Reason |
112
+ | --------------------------------------- | -------- | ------------------------------- |
113
+ | Multiple scaffolding for independent files | PARALLEL | No shared output files between scaffolders |
114
+
115
+ ### Evidence
116
+
117
+ - MOB-700: scaffold-component + scaffold-service (independent)
118
+ - MOB-705: scaffold-directive + scaffold-service (independent)
119
+ - MOB-710: scaffold-component + scaffold-pipe (independent)
120
+ source: shared-parallelization-analyzer
121
+ targetFile: packages/shared/claude-plugins/src/plugins/flow-legacy/agents/shared-impl-orchestrator.md
122
+ category: OPTIMIZATION
123
+ ```
124
+
125
+ **Created issue:**
126
+
127
+ ```
128
+ Linear issue created:
129
+ - ID: MOB-815
130
+ - Title: [Agent Suggestion] Add parallel scaffolding rule to orchestrator
131
+ - URL: https://linear.app/mobilems/issue/MOB-815
132
+ ```
@@ -0,0 +1,59 @@
1
+ ---
2
+ name: maia-files-delete
3
+ description: Delete a file from Maia API temporary storage.
4
+ allowed-tools: Bash
5
+ ---
6
+
7
+ # Maia Files Delete
8
+
9
+ Delete a file from Maia AI API temporary storage to free up space.
10
+
11
+ ## API Endpoint
12
+
13
+ ```
14
+ DELETE https://maia-ai-api.smartsoft.biz.pl/files/{id}
15
+ ```
16
+
17
+ ## Usage
18
+
19
+ When given a file ID or URL, delete it:
20
+
21
+ ```bash
22
+ curl -s -X DELETE https://maia-ai-api.smartsoft.biz.pl/files/{id}
23
+ ```
24
+
25
+ ## Process
26
+
27
+ 1. Extract ID from input (can be full URL or just ID)
28
+ 2. Send DELETE request
29
+ 3. Confirm deletion
30
+
31
+ ## Input Formats
32
+
33
+ Accept either:
34
+
35
+ - Full URL: `https://maia-ai-api.smartsoft.biz.pl/files/abc123`
36
+ - Just ID: `abc123`
37
+
38
+ ## Output Format
39
+
40
+ After successful deletion:
41
+
42
+ ```
43
+ Deleted: {id}
44
+ ```
45
+
46
+ ## Batch Deletion
47
+
48
+ When given multiple IDs, delete them all:
49
+
50
+ ```bash
51
+ for id in id1 id2 id3; do
52
+ curl -s -X DELETE "https://maia-ai-api.smartsoft.biz.pl/files/$id"
53
+ echo "Deleted: $id"
54
+ done
55
+ ```
56
+
57
+ ## Error Handling
58
+
59
+ If deletion fails, report the error but continue with remaining files.
@@ -0,0 +1,57 @@
1
+ ---
2
+ name: maia-files-upload
3
+ description: Upload a file to Maia API temporary storage.
4
+ allowed-tools: Bash
5
+ ---
6
+
7
+ # Maia Files Upload
8
+
9
+ Upload a file to the Maia AI API temporary storage and get a URL for use in Linear comments or markdown.
10
+
11
+ ## API Endpoint
12
+
13
+ ```
14
+ POST https://maia-ai-api.smartsoft.biz.pl/files
15
+ ```
16
+
17
+ ## Usage
18
+
19
+ When given a file path, upload it:
20
+
21
+ ```bash
22
+ curl -s -X POST https://maia-ai-api.smartsoft.biz.pl/files \
23
+ -F "file=@/path/to/file.png"
24
+ ```
25
+
26
+ ## Response
27
+
28
+ ```json
29
+ { "id": "abc123def456" }
30
+ ```
31
+
32
+ ## Result URL
33
+
34
+ ```
35
+ https://maia-ai-api.smartsoft.biz.pl/files/{id}
36
+ ```
37
+
38
+ ## Process
39
+
40
+ 1. Validate file exists: `test -f "/path/to/file" && echo "OK"`
41
+ 2. Upload file using curl
42
+ 3. Extract ID from JSON response
43
+ 4. Return ID and full URL
44
+
45
+ ## Output Format
46
+
47
+ After successful upload, return:
48
+
49
+ ```
50
+ Uploaded: {filename}
51
+ ID: {id}
52
+ URL: https://maia-ai-api.smartsoft.biz.pl/files/{id}
53
+ ```
54
+
55
+ ## Error Handling
56
+
57
+ If file doesn't exist or upload fails, report the error clearly.