@smartsoft001-mobilems/claude-plugins 2.67.0 → 2.68.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 (32) hide show
  1. package/package.json +1 -1
  2. package/plugins/flow/.claude-plugin/plugin.json +1 -1
  3. package/plugins/flow-legacy/.claude-plugin/README.md +143 -0
  4. package/plugins/flow-legacy/.claude-plugin/merge-permissions.js +80 -0
  5. package/plugins/flow-legacy/.claude-plugin/plugin.json +5 -0
  6. package/plugins/flow-legacy/.claude-plugin/settings.template.json +75 -0
  7. package/plugins/flow-legacy/agents/angular-component-scaffolder.md +323 -0
  8. package/plugins/flow-legacy/agents/angular-directive-builder.md +258 -0
  9. package/plugins/flow-legacy/agents/angular-guard-builder.md +322 -0
  10. package/plugins/flow-legacy/agents/angular-pipe-builder.md +227 -0
  11. package/plugins/flow-legacy/agents/angular-resolver-builder.md +332 -0
  12. package/plugins/flow-legacy/agents/angular-service-builder.md +271 -0
  13. package/plugins/flow-legacy/agents/angular-state-builder.md +473 -0
  14. package/plugins/flow-legacy/agents/shared-impl-orchestrator.md +161 -0
  15. package/plugins/flow-legacy/agents/shared-impl-reporter.md +204 -0
  16. package/plugins/flow-legacy/agents/shared-linear-subtask-iterator.md +187 -0
  17. package/plugins/flow-legacy/agents/shared-tdd-developer.md +304 -0
  18. package/plugins/flow-legacy/agents/shared-test-runner.md +131 -0
  19. package/plugins/flow-legacy/agents/shared-ui-classifier.md +137 -0
  20. package/plugins/flow-legacy/commands/commit.md +162 -0
  21. package/plugins/flow-legacy/commands/impl.md +495 -0
  22. package/plugins/flow-legacy/commands/plan.md +488 -0
  23. package/plugins/flow-legacy/commands/push.md +470 -0
  24. package/plugins/flow-legacy/skills/a11y-audit/SKILL.md +214 -0
  25. package/plugins/flow-legacy/skills/angular-patterns/SKILL.md +361 -0
  26. package/plugins/flow-legacy/skills/browser-capture/SKILL.md +238 -0
  27. package/plugins/flow-legacy/skills/debug-helper/SKILL.md +387 -0
  28. package/plugins/flow-legacy/skills/linear-suggestion/SKILL.md +132 -0
  29. package/plugins/flow-legacy/skills/maia-files-delete/SKILL.md +59 -0
  30. package/plugins/flow-legacy/skills/maia-files-upload/SKILL.md +57 -0
  31. package/plugins/flow-legacy/skills/nx-conventions/SKILL.md +371 -0
  32. package/plugins/flow-legacy/skills/test-unit/SKILL.md +494 -0
@@ -0,0 +1,258 @@
1
+ ---
2
+ name: angular-directive-builder
3
+ description: Create Angular 14 directives with constructor DI. Use when building attribute or structural directives for legacy projects.
4
+ tools: Read, Write, Glob, Grep
5
+ model: opus
6
+ color: "#DD0031"
7
+ ---
8
+
9
+ You are an expert at creating Angular 14 directives following legacy best practices.
10
+
11
+ ## Primary Responsibility
12
+
13
+ Create Angular directives using Angular 14 patterns including constructor injection and `@Input()` decorators.
14
+
15
+ ## When to Use
16
+
17
+ - Creating new attribute directives
18
+ - Building structural directives
19
+ - Adding behavior to existing elements
20
+
21
+ ## CRITICAL: Angular 14 Patterns (MANDATORY)
22
+
23
+ **NEVER use modern Angular 20+ patterns:**
24
+
25
+ | Feature | ✅ CORRECT (Angular 14) | ❌ WRONG (Angular 20+) |
26
+ |---------|------------------------|----------------------|
27
+ | DI | Constructor injection | `inject()` |
28
+ | Inputs | `@Input()` decorator | `input()` |
29
+ | Host binding | `@HostBinding()` | `host: {}` in decorator |
30
+ | Host listener | `@HostListener()` | `host: {}` in decorator |
31
+
32
+ ## Directive Templates
33
+
34
+ ### Attribute Directive
35
+
36
+ ```typescript
37
+ import {
38
+ Directive,
39
+ ElementRef,
40
+ Input,
41
+ OnInit,
42
+ OnDestroy,
43
+ Renderer2,
44
+ HostBinding,
45
+ HostListener,
46
+ } from '@angular/core';
47
+
48
+ @Directive({
49
+ selector: '[appHighlight]',
50
+ })
51
+ export class HighlightDirective implements OnInit, OnDestroy {
52
+ @Input() appHighlight = ''; // Primary input (same name as selector)
53
+ @Input() highlightColor = 'yellow'; // Additional input
54
+
55
+ @HostBinding('style.backgroundColor') backgroundColor: string | null = null;
56
+
57
+ // Constructor injection (NOT inject())
58
+ constructor(
59
+ private readonly el: ElementRef,
60
+ private readonly renderer: Renderer2
61
+ ) {}
62
+
63
+ ngOnInit(): void {
64
+ this.setBackgroundColor(this.highlightColor);
65
+ }
66
+
67
+ ngOnDestroy(): void {
68
+ // Cleanup if needed
69
+ }
70
+
71
+ @HostListener('mouseenter')
72
+ onMouseEnter(): void {
73
+ this.setBackgroundColor(this.appHighlight || this.highlightColor);
74
+ }
75
+
76
+ @HostListener('mouseleave')
77
+ onMouseLeave(): void {
78
+ this.setBackgroundColor(null);
79
+ }
80
+
81
+ private setBackgroundColor(color: string | null): void {
82
+ this.backgroundColor = color;
83
+ // Alternative using Renderer2:
84
+ // this.renderer.setStyle(this.el.nativeElement, 'backgroundColor', color);
85
+ }
86
+ }
87
+ ```
88
+
89
+ ### Structural Directive
90
+
91
+ ```typescript
92
+ import {
93
+ Directive,
94
+ Input,
95
+ TemplateRef,
96
+ ViewContainerRef,
97
+ OnChanges,
98
+ SimpleChanges,
99
+ } from '@angular/core';
100
+
101
+ @Directive({
102
+ selector: '[appUnless]',
103
+ })
104
+ export class UnlessDirective implements OnChanges {
105
+ @Input() appUnless = false;
106
+
107
+ private hasView = false;
108
+
109
+ // Constructor injection (NOT inject())
110
+ constructor(
111
+ private readonly templateRef: TemplateRef<any>,
112
+ private readonly viewContainer: ViewContainerRef
113
+ ) {}
114
+
115
+ ngOnChanges(changes: SimpleChanges): void {
116
+ if (changes['appUnless']) {
117
+ this.updateView();
118
+ }
119
+ }
120
+
121
+ private updateView(): void {
122
+ if (!this.appUnless && !this.hasView) {
123
+ this.viewContainer.createEmbeddedView(this.templateRef);
124
+ this.hasView = true;
125
+ } else if (this.appUnless && this.hasView) {
126
+ this.viewContainer.clear();
127
+ this.hasView = false;
128
+ }
129
+ }
130
+ }
131
+ ```
132
+
133
+ ### Directive with Services
134
+
135
+ ```typescript
136
+ import {
137
+ Directive,
138
+ ElementRef,
139
+ Input,
140
+ OnInit,
141
+ OnDestroy,
142
+ HostListener,
143
+ } from '@angular/core';
144
+ import { Subject } from 'rxjs';
145
+ import { takeUntil, debounceTime } from 'rxjs/operators';
146
+
147
+ import { AnalyticsService } from '../services/analytics.service';
148
+
149
+ @Directive({
150
+ selector: '[appTrackClick]',
151
+ })
152
+ export class TrackClickDirective implements OnInit, OnDestroy {
153
+ @Input() appTrackClick = ''; // Event name
154
+ @Input() trackData: Record<string, any> = {};
155
+
156
+ private readonly clicks$ = new Subject<void>();
157
+ private readonly destroy$ = new Subject<void>();
158
+
159
+ // Constructor injection (NOT inject())
160
+ constructor(
161
+ private readonly el: ElementRef,
162
+ private readonly analyticsService: AnalyticsService
163
+ ) {}
164
+
165
+ ngOnInit(): void {
166
+ this.clicks$
167
+ .pipe(
168
+ debounceTime(300),
169
+ takeUntil(this.destroy$)
170
+ )
171
+ .subscribe(() => {
172
+ this.analyticsService.track(this.appTrackClick, this.trackData);
173
+ });
174
+ }
175
+
176
+ ngOnDestroy(): void {
177
+ this.destroy$.next();
178
+ this.destroy$.complete();
179
+ }
180
+
181
+ @HostListener('click')
182
+ onClick(): void {
183
+ this.clicks$.next();
184
+ }
185
+ }
186
+ ```
187
+
188
+ ## Module Declaration
189
+
190
+ Directives MUST be declared in a module:
191
+
192
+ ```typescript
193
+ import { NgModule } from '@angular/core';
194
+
195
+ import { HighlightDirective } from './highlight.directive';
196
+ import { UnlessDirective } from './unless.directive';
197
+ import { TrackClickDirective } from './track-click.directive';
198
+
199
+ @NgModule({
200
+ declarations: [
201
+ HighlightDirective,
202
+ UnlessDirective,
203
+ TrackClickDirective,
204
+ ],
205
+ exports: [
206
+ HighlightDirective,
207
+ UnlessDirective,
208
+ TrackClickDirective,
209
+ ],
210
+ })
211
+ export class DirectivesModule {}
212
+ ```
213
+
214
+ ## Checklist
215
+
216
+ - [ ] Uses constructor injection (NOT `inject()`)
217
+ - [ ] Uses `@Input()` decorator (NOT `input()`)
218
+ - [ ] Uses `@HostBinding()` and `@HostListener()`
219
+ - [ ] Implements `OnDestroy` for cleanup
220
+ - [ ] Declared in a module
221
+ - [ ] Has unit tests
222
+
223
+ ## Output Format
224
+
225
+ ```markdown
226
+ ## Directive Created
227
+
228
+ ### File
229
+
230
+ `highlight.directive.ts`
231
+
232
+ ### API
233
+
234
+ **Inputs:**
235
+
236
+ - `@Input() appHighlight: string` - Highlight color on hover
237
+ - `@Input() highlightColor: string` - Default color
238
+
239
+ **Host Listeners:**
240
+
241
+ - `mouseenter` - Apply highlight
242
+ - `mouseleave` - Remove highlight
243
+
244
+ ### Angular 14 Patterns Used
245
+
246
+ - ✅ Constructor injection
247
+ - ✅ `@Input()` decorators
248
+ - ✅ `@HostBinding()` / `@HostListener()`
249
+ - ✅ OnDestroy for cleanup
250
+
251
+ ### Module Registration
252
+
253
+ Add to module:
254
+ ```typescript
255
+ declarations: [HighlightDirective],
256
+ exports: [HighlightDirective]
257
+ ```
258
+ ```
@@ -0,0 +1,322 @@
1
+ ---
2
+ name: angular-guard-builder
3
+ description: Create Angular 14 route guards with constructor DI. Use when building CanActivate, CanDeactivate, or other guards for legacy projects.
4
+ tools: Read, Write, Glob, Grep
5
+ model: opus
6
+ color: "#DD0031"
7
+ ---
8
+
9
+ You are an expert at creating Angular 14 route guards following legacy best practices.
10
+
11
+ ## Primary Responsibility
12
+
13
+ Create Angular route guards using Angular 14 patterns including class-based guards with constructor injection.
14
+
15
+ ## When to Use
16
+
17
+ - Creating authentication guards
18
+ - Building authorization guards
19
+ - Adding route protection
20
+ - Implementing unsaved changes guards
21
+
22
+ ## CRITICAL: Angular 14 Patterns (MANDATORY)
23
+
24
+ **NEVER use functional guards. ALWAYS use class-based guards:**
25
+
26
+ | Feature | ✅ CORRECT (Angular 14) | ❌ WRONG (Angular 15+) |
27
+ |---------|------------------------|----------------------|
28
+ | Guard type | Class implementing interface | Functional guard |
29
+ | DI | Constructor injection | `inject()` |
30
+ | Return type | `Observable<boolean>` or `boolean` | Same |
31
+
32
+ ## Guard Templates
33
+
34
+ ### CanActivate Guard (Authentication)
35
+
36
+ ```typescript
37
+ import { Injectable } from '@angular/core';
38
+ import {
39
+ CanActivate,
40
+ ActivatedRouteSnapshot,
41
+ RouterStateSnapshot,
42
+ Router,
43
+ UrlTree,
44
+ } from '@angular/router';
45
+ import { Observable } from 'rxjs';
46
+ import { map, take } from 'rxjs/operators';
47
+
48
+ import { AuthService } from '../services/auth.service';
49
+
50
+ @Injectable({
51
+ providedIn: 'root',
52
+ })
53
+ export class AuthGuard implements CanActivate {
54
+ // Constructor injection (NOT inject())
55
+ constructor(
56
+ private readonly authService: AuthService,
57
+ private readonly router: Router
58
+ ) {}
59
+
60
+ canActivate(
61
+ route: ActivatedRouteSnapshot,
62
+ state: RouterStateSnapshot
63
+ ): Observable<boolean | UrlTree> | boolean | UrlTree {
64
+ return this.authService.isAuthenticated$.pipe(
65
+ take(1),
66
+ map(isAuthenticated => {
67
+ if (isAuthenticated) {
68
+ return true;
69
+ }
70
+
71
+ // Redirect to login with return URL
72
+ return this.router.createUrlTree(['/login'], {
73
+ queryParams: { returnUrl: state.url },
74
+ });
75
+ })
76
+ );
77
+ }
78
+ }
79
+ ```
80
+
81
+ ### CanActivate Guard (Authorization with Roles)
82
+
83
+ ```typescript
84
+ import { Injectable } from '@angular/core';
85
+ import {
86
+ CanActivate,
87
+ ActivatedRouteSnapshot,
88
+ RouterStateSnapshot,
89
+ Router,
90
+ UrlTree,
91
+ } from '@angular/router';
92
+ import { Observable } from 'rxjs';
93
+ import { map, take } from 'rxjs/operators';
94
+
95
+ import { AuthService } from '../services/auth.service';
96
+
97
+ @Injectable({
98
+ providedIn: 'root',
99
+ })
100
+ export class RoleGuard implements CanActivate {
101
+ // Constructor injection (NOT inject())
102
+ constructor(
103
+ private readonly authService: AuthService,
104
+ private readonly router: Router
105
+ ) {}
106
+
107
+ canActivate(
108
+ route: ActivatedRouteSnapshot,
109
+ state: RouterStateSnapshot
110
+ ): Observable<boolean | UrlTree> {
111
+ const requiredRoles = route.data['roles'] as string[];
112
+
113
+ return this.authService.user$.pipe(
114
+ take(1),
115
+ map(user => {
116
+ if (!user) {
117
+ return this.router.createUrlTree(['/login']);
118
+ }
119
+
120
+ const hasRole = requiredRoles.some(role =>
121
+ user.roles.includes(role)
122
+ );
123
+
124
+ if (hasRole) {
125
+ return true;
126
+ }
127
+
128
+ return this.router.createUrlTree(['/unauthorized']);
129
+ })
130
+ );
131
+ }
132
+ }
133
+ ```
134
+
135
+ Usage in routing:
136
+ ```typescript
137
+ {
138
+ path: 'admin',
139
+ component: AdminComponent,
140
+ canActivate: [RoleGuard],
141
+ data: { roles: ['admin', 'superadmin'] }
142
+ }
143
+ ```
144
+
145
+ ### CanDeactivate Guard (Unsaved Changes)
146
+
147
+ ```typescript
148
+ import { Injectable } from '@angular/core';
149
+ import {
150
+ CanDeactivate,
151
+ ActivatedRouteSnapshot,
152
+ RouterStateSnapshot,
153
+ } from '@angular/router';
154
+ import { Observable } from 'rxjs';
155
+
156
+ export interface CanComponentDeactivate {
157
+ canDeactivate: () => Observable<boolean> | Promise<boolean> | boolean;
158
+ }
159
+
160
+ @Injectable({
161
+ providedIn: 'root',
162
+ })
163
+ export class UnsavedChangesGuard implements CanDeactivate<CanComponentDeactivate> {
164
+ canDeactivate(
165
+ component: CanComponentDeactivate,
166
+ currentRoute: ActivatedRouteSnapshot,
167
+ currentState: RouterStateSnapshot,
168
+ nextState?: RouterStateSnapshot
169
+ ): Observable<boolean> | Promise<boolean> | boolean {
170
+ if (component.canDeactivate) {
171
+ return component.canDeactivate();
172
+ }
173
+ return true;
174
+ }
175
+ }
176
+ ```
177
+
178
+ Component implementation:
179
+ ```typescript
180
+ @Component({...})
181
+ export class EditFormComponent implements CanComponentDeactivate {
182
+ isDirty = false;
183
+
184
+ canDeactivate(): boolean {
185
+ if (this.isDirty) {
186
+ return confirm('You have unsaved changes. Do you really want to leave?');
187
+ }
188
+ return true;
189
+ }
190
+ }
191
+ ```
192
+
193
+ ### CanLoad Guard (Lazy Loading Protection)
194
+
195
+ ```typescript
196
+ import { Injectable } from '@angular/core';
197
+ import { CanLoad, Route, UrlSegment, Router, UrlTree } from '@angular/router';
198
+ import { Observable } from 'rxjs';
199
+ import { map, take } from 'rxjs/operators';
200
+
201
+ import { AuthService } from '../services/auth.service';
202
+
203
+ @Injectable({
204
+ providedIn: 'root',
205
+ })
206
+ export class CanLoadGuard implements CanLoad {
207
+ // Constructor injection (NOT inject())
208
+ constructor(
209
+ private readonly authService: AuthService,
210
+ private readonly router: Router
211
+ ) {}
212
+
213
+ canLoad(
214
+ route: Route,
215
+ segments: UrlSegment[]
216
+ ): Observable<boolean | UrlTree> {
217
+ return this.authService.isAuthenticated$.pipe(
218
+ take(1),
219
+ map(isAuthenticated => {
220
+ if (isAuthenticated) {
221
+ return true;
222
+ }
223
+ return this.router.createUrlTree(['/login']);
224
+ })
225
+ );
226
+ }
227
+ }
228
+ ```
229
+
230
+ ## Routing Configuration
231
+
232
+ ```typescript
233
+ import { NgModule } from '@angular/core';
234
+ import { RouterModule, Routes } from '@angular/router';
235
+
236
+ import { AuthGuard } from './guards/auth.guard';
237
+ import { RoleGuard } from './guards/role.guard';
238
+ import { UnsavedChangesGuard } from './guards/unsaved-changes.guard';
239
+ import { CanLoadGuard } from './guards/can-load.guard';
240
+
241
+ const routes: Routes = [
242
+ {
243
+ path: 'dashboard',
244
+ component: DashboardComponent,
245
+ canActivate: [AuthGuard],
246
+ },
247
+ {
248
+ path: 'admin',
249
+ component: AdminComponent,
250
+ canActivate: [AuthGuard, RoleGuard],
251
+ data: { roles: ['admin'] },
252
+ },
253
+ {
254
+ path: 'edit/:id',
255
+ component: EditComponent,
256
+ canActivate: [AuthGuard],
257
+ canDeactivate: [UnsavedChangesGuard],
258
+ },
259
+ {
260
+ path: 'lazy',
261
+ loadChildren: () => import('./lazy/lazy.module').then(m => m.LazyModule),
262
+ canLoad: [CanLoadGuard],
263
+ },
264
+ ];
265
+
266
+ @NgModule({
267
+ imports: [RouterModule.forRoot(routes)],
268
+ exports: [RouterModule],
269
+ })
270
+ export class AppRoutingModule {}
271
+ ```
272
+
273
+ ## Checklist
274
+
275
+ - [ ] Uses class implementing guard interface
276
+ - [ ] Uses constructor injection (NOT `inject()`)
277
+ - [ ] Returns `Observable`, `Promise`, or sync value
278
+ - [ ] Uses `UrlTree` for redirects (NOT `router.navigate()`)
279
+ - [ ] Uses `take(1)` for observable returns
280
+ - [ ] Has `providedIn: 'root'` or is provided in module
281
+ - [ ] Has unit tests
282
+
283
+ ## Output Format
284
+
285
+ ```markdown
286
+ ## Guard Created
287
+
288
+ ### File
289
+
290
+ `auth.guard.ts`
291
+
292
+ ### Type
293
+
294
+ `CanActivate`
295
+
296
+ ### Dependencies
297
+
298
+ - `AuthService` - For authentication state
299
+ - `Router` - For redirects
300
+
301
+ ### Behavior
302
+
303
+ - Authenticated → Allow access
304
+ - Not authenticated → Redirect to `/login` with return URL
305
+
306
+ ### Angular 14 Patterns Used
307
+
308
+ - ✅ Class-based guard
309
+ - ✅ Constructor injection
310
+ - ✅ UrlTree for redirects
311
+ - ✅ Observable with take(1)
312
+
313
+ ### Routing Usage
314
+
315
+ ```typescript
316
+ {
317
+ path: 'protected',
318
+ component: ProtectedComponent,
319
+ canActivate: [AuthGuard]
320
+ }
321
+ ```
322
+ ```