@smartsoft001-mobilems/claude-plugins 2.85.0 → 2.87.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 (176) hide show
  1. package/.claude-plugin/marketplace.json +2 -6
  2. package/package.json +2 -2
  3. package/plugins/mobilems/.claude-plugin/README.md +30 -0
  4. package/plugins/mobilems/.claude-plugin/plugin.json +5 -0
  5. package/plugins/mobilems/scripts/refresh-mobilems-api-spec.sh +372 -0
  6. package/plugins/mobilems/skills/mobilems-articles/SKILL.md +84 -0
  7. package/plugins/mobilems/skills/mobilems-articles/references/lib-contents.md +164 -0
  8. package/plugins/mobilems/skills/mobilems-articles/references/module-and-routes.md +146 -0
  9. package/plugins/mobilems/skills/mobilems-articles/references/shared-components.md +56 -0
  10. package/plugins/mobilems/skills/mobilems-articles/scripts/detect-init.sh +29 -0
  11. package/plugins/mobilems/skills/mobilems-articles/scripts/verify-module.sh +61 -0
  12. package/plugins/mobilems/skills/mobilems-docs-reader/SKILL.md +116 -0
  13. package/plugins/mobilems/skills/mobilems-events/SKILL.md +65 -0
  14. package/plugins/mobilems/skills/mobilems-events/references/lib-contents.md +212 -0
  15. package/plugins/mobilems/skills/mobilems-events/references/module-and-routes.md +113 -0
  16. package/plugins/mobilems/skills/mobilems-events/scripts/detect-init.sh +29 -0
  17. package/plugins/mobilems/skills/mobilems-events/scripts/verify-module.sh +59 -0
  18. package/plugins/mobilems/skills/mobilems-object-collections/SKILL.md +52 -0
  19. package/plugins/mobilems/skills/mobilems-object-collections/references/lib-contents.md +76 -0
  20. package/plugins/mobilems/skills/mobilems-object-collections/references/module-and-routes.md +116 -0
  21. package/plugins/mobilems/skills/mobilems-object-collections/references/shared-components.md +61 -0
  22. package/plugins/mobilems/skills/mobilems-object-collections/scripts/detect-init.sh +29 -0
  23. package/plugins/mobilems/skills/mobilems-object-collections/scripts/verify-module.sh +44 -0
  24. package/plugins/mobilems/skills/mobilems-objects/SKILL.md +52 -0
  25. package/plugins/mobilems/skills/mobilems-objects/references/lib-contents.md +68 -0
  26. package/plugins/mobilems/skills/mobilems-objects/references/module-and-routes.md +108 -0
  27. package/plugins/mobilems/skills/mobilems-objects/references/shared-components.md +69 -0
  28. package/plugins/mobilems/skills/mobilems-objects/scripts/detect-init.sh +29 -0
  29. package/plugins/mobilems/skills/mobilems-objects/scripts/verify-module.sh +51 -0
  30. package/plugins/mobilems/skills/mobilems-partners/SKILL.md +65 -0
  31. package/plugins/mobilems/skills/mobilems-partners/references/lib-contents.md +160 -0
  32. package/plugins/mobilems/skills/mobilems-partners/references/module-and-routes.md +125 -0
  33. package/plugins/mobilems/skills/mobilems-partners/scripts/detect-init.sh +29 -0
  34. package/plugins/mobilems/skills/mobilems-partners/scripts/verify-module.sh +59 -0
  35. package/plugins/mobilems/skills/mobilems-project-init/SKILL.md +134 -0
  36. package/plugins/mobilems/skills/mobilems-project-init/references/app-shell.md +107 -0
  37. package/plugins/mobilems/skills/mobilems-project-init/references/claude-config.md +44 -0
  38. package/plugins/mobilems/skills/mobilems-project-init/references/config-providers.md +203 -0
  39. package/plugins/mobilems/skills/mobilems-project-init/references/npm-deps.md +66 -0
  40. package/plugins/mobilems/skills/mobilems-project-init/references/server-env.md +89 -0
  41. package/plugins/mobilems/skills/mobilems-project-init/references/shared-lib.md +125 -0
  42. package/plugins/mobilems/skills/mobilems-project-init/references/tailwind-styles.md +106 -0
  43. package/plugins/mobilems/skills/mobilems-project-init/scripts/classify-shared-components.py +114 -0
  44. package/plugins/mobilems/skills/mobilems-project-init/scripts/detect-base.sh +49 -0
  45. package/plugins/mobilems/skills/mobilems-project-init/scripts/verify-init.sh +73 -0
  46. package/plugins/mobilems/skills/mobilems-thematic-publications/SKILL.md +60 -0
  47. package/plugins/mobilems/skills/mobilems-thematic-publications/references/lib-contents.md +134 -0
  48. package/plugins/mobilems/skills/mobilems-thematic-publications/references/module-and-routes.md +107 -0
  49. package/plugins/mobilems/skills/mobilems-thematic-publications/scripts/detect-init.sh +29 -0
  50. package/plugins/mobilems/skills/mobilems-thematic-publications/scripts/verify-module.sh +56 -0
  51. package/plugins/flow/.claude-plugin/README.md +0 -91
  52. package/plugins/flow/.claude-plugin/merge-permissions.js +0 -97
  53. package/plugins/flow/.claude-plugin/plugin.json +0 -5
  54. package/plugins/flow/.claude-plugin/settings.template.json +0 -86
  55. package/plugins/flow/agents/angular-component-scaffolder.md +0 -175
  56. package/plugins/flow/agents/angular-directive-builder.md +0 -153
  57. package/plugins/flow/agents/angular-guard-builder.md +0 -243
  58. package/plugins/flow/agents/angular-jest-test-writer.md +0 -474
  59. package/plugins/flow/agents/angular-pipe-builder.md +0 -169
  60. package/plugins/flow/agents/angular-resolver-builder.md +0 -286
  61. package/plugins/flow/agents/angular-service-builder.md +0 -161
  62. package/plugins/flow/agents/angular-signal-state-builder.md +0 -339
  63. package/plugins/flow/agents/angular-test-diagnostician.md +0 -279
  64. package/plugins/flow/agents/angular-testbed-configurator.md +0 -315
  65. package/plugins/flow/agents/arch-scaffolder.md +0 -278
  66. package/plugins/flow/agents/e2e-data-testid-injector.md +0 -197
  67. package/plugins/flow/agents/e2e-project-scaffolder.md +0 -194
  68. package/plugins/flow/agents/e2e-test-writer.md +0 -350
  69. package/plugins/flow/agents/shared-agent-evolver.md +0 -294
  70. package/plugins/flow/agents/shared-build-verifier.md +0 -160
  71. package/plugins/flow/agents/shared-config-updater.md +0 -310
  72. package/plugins/flow/agents/shared-coverage-enforcer.md +0 -184
  73. package/plugins/flow/agents/shared-error-handler.md +0 -217
  74. package/plugins/flow/agents/shared-file-creator.md +0 -344
  75. package/plugins/flow/agents/shared-impl-orchestrator.md +0 -312
  76. package/plugins/flow/agents/shared-impl-reporter.md +0 -368
  77. package/plugins/flow/agents/shared-impl-teammate.md +0 -201
  78. package/plugins/flow/agents/shared-linear-subtask-iterator.md +0 -337
  79. package/plugins/flow/agents/shared-logic-implementer.md +0 -243
  80. package/plugins/flow/agents/shared-maia-api.md +0 -26
  81. package/plugins/flow/agents/shared-parallelization-analyzer.md +0 -343
  82. package/plugins/flow/agents/shared-performance-validator.md +0 -168
  83. package/plugins/flow/agents/shared-plan-perspective.md +0 -269
  84. package/plugins/flow/agents/shared-project-standardizer.md +0 -205
  85. package/plugins/flow/agents/shared-report-synthesizer.md +0 -188
  86. package/plugins/flow/agents/shared-review-teammate.md +0 -189
  87. package/plugins/flow/agents/shared-security-scanner.md +0 -186
  88. package/plugins/flow/agents/shared-style-enforcer.md +0 -230
  89. package/plugins/flow/agents/shared-subtask-dependency-analyzer.md +0 -188
  90. package/plugins/flow/agents/shared-tdd-developer.md +0 -350
  91. package/plugins/flow/agents/shared-team-coordinator.md +0 -189
  92. package/plugins/flow/agents/shared-test-fixer.md +0 -186
  93. package/plugins/flow/agents/shared-test-runner.md +0 -191
  94. package/plugins/flow/agents/shared-ui-classifier.md +0 -263
  95. package/plugins/flow/agents/shared-verification-orchestrator.md +0 -194
  96. package/plugins/flow/agents/shared-verification-runner.md +0 -140
  97. package/plugins/flow/agents/ui-a11y-validator.md +0 -305
  98. package/plugins/flow/agents/ui-screenshot-reporter.md +0 -329
  99. package/plugins/flow/agents/ui-web-designer.md +0 -214
  100. package/plugins/flow/scripts/compute-session-tokens.sh +0 -39
  101. package/plugins/flow/skills/a11y-audit/SKILL.md +0 -214
  102. package/plugins/flow/skills/angular-patterns/SKILL.md +0 -191
  103. package/plugins/flow/skills/browser-capture/SKILL.md +0 -238
  104. package/plugins/flow/skills/commit/SKILL.md +0 -259
  105. package/plugins/flow/skills/debug-helper/SKILL.md +0 -375
  106. package/plugins/flow/skills/impl/SKILL.md +0 -992
  107. package/plugins/flow/skills/linear-suggestion/SKILL.md +0 -132
  108. package/plugins/flow/skills/maia-files-delete/SKILL.md +0 -59
  109. package/plugins/flow/skills/maia-files-upload/SKILL.md +0 -57
  110. package/plugins/flow/skills/nx-conventions/SKILL.md +0 -326
  111. package/plugins/flow/skills/plan/SKILL.md +0 -1033
  112. package/plugins/flow/skills/push/SKILL.md +0 -759
  113. package/plugins/flow/skills/review/SKILL.md +0 -443
  114. package/plugins/flow/skills/test-e2e/SKILL.md +0 -161
  115. package/plugins/flow/skills/test-unit/SKILL.md +0 -456
  116. package/plugins/flow-external/.claude-plugin/README.md +0 -152
  117. package/plugins/flow-external/.claude-plugin/merge-permissions.js +0 -80
  118. package/plugins/flow-external/.claude-plugin/plugin.json +0 -5
  119. package/plugins/flow-external/.claude-plugin/settings.template.json +0 -78
  120. package/plugins/flow-external/agents/angular-component-scaffolder.md +0 -269
  121. package/plugins/flow-external/agents/angular-directive-builder.md +0 -130
  122. package/plugins/flow-external/agents/angular-guard-builder.md +0 -70
  123. package/plugins/flow-external/agents/angular-pipe-builder.md +0 -82
  124. package/plugins/flow-external/agents/angular-resolver-builder.md +0 -74
  125. package/plugins/flow-external/agents/angular-service-builder.md +0 -160
  126. package/plugins/flow-external/agents/angular-state-builder.md +0 -254
  127. package/plugins/flow-external/agents/shared-build-verifier.md +0 -67
  128. package/plugins/flow-external/agents/shared-impl-orchestrator.md +0 -88
  129. package/plugins/flow-external/agents/shared-impl-reporter.md +0 -135
  130. package/plugins/flow-external/agents/shared-linear-subtask-iterator.md +0 -70
  131. package/plugins/flow-external/agents/shared-ui-classifier.md +0 -38
  132. package/plugins/flow-external/agents/ui-web-designer.md +0 -179
  133. package/plugins/flow-external/scripts/compute-session-tokens.sh +0 -39
  134. package/plugins/flow-external/skills/a11y-audit/SKILL.md +0 -96
  135. package/plugins/flow-external/skills/angular-cli-conventions/SKILL.md +0 -267
  136. package/plugins/flow-external/skills/angular-patterns/SKILL.md +0 -170
  137. package/plugins/flow-external/skills/browser-capture/SKILL.md +0 -68
  138. package/plugins/flow-external/skills/commit/SKILL.md +0 -114
  139. package/plugins/flow-external/skills/debug-helper/SKILL.md +0 -131
  140. package/plugins/flow-external/skills/impl/SKILL.md +0 -217
  141. package/plugins/flow-external/skills/linear-suggestion/SKILL.md +0 -62
  142. package/plugins/flow-external/skills/maia-files-delete/SKILL.md +0 -34
  143. package/plugins/flow-external/skills/maia-files-upload/SKILL.md +0 -41
  144. package/plugins/flow-external/skills/plan/SKILL.md +0 -334
  145. package/plugins/flow-external/skills/push/SKILL.md +0 -232
  146. package/plugins/flow-legacy/.claude-plugin/README.md +0 -143
  147. package/plugins/flow-legacy/.claude-plugin/merge-permissions.js +0 -94
  148. package/plugins/flow-legacy/.claude-plugin/plugin.json +0 -5
  149. package/plugins/flow-legacy/.claude-plugin/settings.template.json +0 -79
  150. package/plugins/flow-legacy/agents/angular-component-scaffolder.md +0 -323
  151. package/plugins/flow-legacy/agents/angular-directive-builder.md +0 -258
  152. package/plugins/flow-legacy/agents/angular-guard-builder.md +0 -322
  153. package/plugins/flow-legacy/agents/angular-pipe-builder.md +0 -227
  154. package/plugins/flow-legacy/agents/angular-resolver-builder.md +0 -332
  155. package/plugins/flow-legacy/agents/angular-service-builder.md +0 -271
  156. package/plugins/flow-legacy/agents/angular-state-builder.md +0 -479
  157. package/plugins/flow-legacy/agents/shared-impl-orchestrator.md +0 -174
  158. package/plugins/flow-legacy/agents/shared-impl-reporter.md +0 -232
  159. package/plugins/flow-legacy/agents/shared-linear-subtask-iterator.md +0 -187
  160. package/plugins/flow-legacy/agents/shared-tdd-developer.md +0 -306
  161. package/plugins/flow-legacy/agents/shared-test-runner.md +0 -131
  162. package/plugins/flow-legacy/agents/shared-ui-classifier.md +0 -145
  163. package/plugins/flow-legacy/scripts/compute-session-tokens.sh +0 -39
  164. package/plugins/flow-legacy/skills/a11y-audit/SKILL.md +0 -214
  165. package/plugins/flow-legacy/skills/angular-patterns/SKILL.md +0 -346
  166. package/plugins/flow-legacy/skills/browser-capture/SKILL.md +0 -238
  167. package/plugins/flow-legacy/skills/commit/SKILL.md +0 -215
  168. package/plugins/flow-legacy/skills/debug-helper/SKILL.md +0 -395
  169. package/plugins/flow-legacy/skills/impl/SKILL.md +0 -710
  170. package/plugins/flow-legacy/skills/linear-suggestion/SKILL.md +0 -132
  171. package/plugins/flow-legacy/skills/maia-files-delete/SKILL.md +0 -59
  172. package/plugins/flow-legacy/skills/maia-files-upload/SKILL.md +0 -57
  173. package/plugins/flow-legacy/skills/nx-conventions/SKILL.md +0 -368
  174. package/plugins/flow-legacy/skills/plan/SKILL.md +0 -742
  175. package/plugins/flow-legacy/skills/push/SKILL.md +0 -645
  176. package/plugins/flow-legacy/skills/test-unit/SKILL.md +0 -500
@@ -1,169 +0,0 @@
1
- ---
2
- name: angular-pipe-builder
3
- description: Create Angular standalone pipes. Use when building transform pipes for templates.
4
- tools: Read, Write, Glob, Grep
5
- model: haiku
6
- color: "#DD0031"
7
- ---
8
-
9
- You are an expert at creating Angular pipes following modern best practices.
10
-
11
- ## Primary Responsibility
12
-
13
- Create Angular pipes for transforming data in templates.
14
-
15
- ## When to Use
16
-
17
- - Creating data transformation pipes
18
- - Building formatting pipes (dates, numbers, text)
19
- - Implementing filter pipes
20
-
21
- ## Project-Specific Patterns
22
-
23
- This project uses:
24
-
25
- - **No explicit `standalone: true`** - Angular 19+ default
26
- - **Constructor injection** for services (pipes still use old pattern)
27
- - **Pure pipes** by default (better performance)
28
- - **Helper functions** in separate files for complex logic
29
-
30
- ## Pipe Templates
31
-
32
- ### Simple Pure Pipe
33
-
34
- ```typescript
35
- import { Pipe, PipeTransform } from '@angular/core';
36
-
37
- import { capitalize } from '../tools';
38
-
39
- @Pipe({
40
- name: 'capitalize',
41
- })
42
- export class CapitalizePipe implements PipeTransform {
43
- transform(val: string): string {
44
- return capitalize(val);
45
- }
46
- }
47
- ```
48
-
49
- ### Pipe with Service Injection
50
-
51
- ```typescript
52
- import { Pipe, PipeTransform } from '@angular/core';
53
- import { DomSanitizer, SafeStyle } from '@angular/platform-browser';
54
- import { FileUrlMode, FileUrlService } from '@smartsoft001-mobilems/angular';
55
- import { MsFile } from '@smartsoft001-mobilems/models';
56
-
57
- @Pipe({ name: 'fileUrl' })
58
- export class FileUrlPipe implements PipeTransform {
59
- constructor(private readonly service: FileUrlService) {}
60
-
61
- transform(file?: MsFile | string, mode: FileUrlMode = 'cache'): string {
62
- return this.service.get(file, mode);
63
- }
64
- }
65
-
66
- @Pipe({ name: 'backgroundUrl' })
67
- export class BackgroundUrlPipe implements PipeTransform {
68
- constructor(
69
- private readonly sanitizer: DomSanitizer,
70
- private readonly service: FileUrlService,
71
- ) {}
72
-
73
- transform(file?: MsFile, mode: FileUrlMode = 'cache'): SafeStyle {
74
- const url = this.service.get(file, mode);
75
- return this.sanitizer.bypassSecurityTrustStyle('url(' + url + ')');
76
- }
77
- }
78
- ```
79
-
80
- ### HTML Sanitization Pipe
81
-
82
- ```typescript
83
- import { Pipe, PipeTransform } from '@angular/core';
84
-
85
- @Pipe({
86
- name: 'removeHtml',
87
- })
88
- export class RemoveHtmlPipe implements PipeTransform {
89
- transform(value: string): string {
90
- if (!value) return '';
91
- return value.replace(/<[^>]*>/g, '');
92
- }
93
- }
94
- ```
95
-
96
- ### Alt Text Pipe
97
-
98
- ```typescript
99
- import { Pipe, PipeTransform } from '@angular/core';
100
-
101
- @Pipe({
102
- name: 'altText',
103
- })
104
- export class AltTextPipe implements PipeTransform {
105
- transform(value: string | undefined, fallback = ''): string {
106
- if (!value) return fallback;
107
- return value.replace(/<[^>]*>/g, '').trim() || fallback;
108
- }
109
- }
110
- ```
111
-
112
- ## Exporting Pipes
113
-
114
- All pipes should be exported from an index file:
115
-
116
- ```typescript
117
- // pipes/index.ts
118
- export * from './capitalize.pipe';
119
- export * from './file-url.pipe';
120
- export * from './remove-html.pipe';
121
- export * from './alt-text.pipe';
122
- ```
123
-
124
- ## Usage in Components
125
-
126
- ```typescript
127
- import { CapitalizePipe, FileUrlPipe } from '../../pipes';
128
-
129
- @Component({
130
- imports: [CapitalizePipe, FileUrlPipe],
131
- template: `
132
- <p>{{ title | capitalize }}</p>
133
- <img [src]="image | fileUrl:'cache'" />
134
- `,
135
- })
136
- ```
137
-
138
- ## Checklist
139
-
140
- - [ ] Implements `PipeTransform`
141
- - [ ] Has `@Pipe({ name: 'pipeName' })` decorator
142
- - [ ] Pure by default (no `pure: false` unless needed)
143
- - [ ] Exported from `pipes/index.ts`
144
- - [ ] Handles null/undefined inputs gracefully
145
-
146
- ## Output Format
147
-
148
- ````markdown
149
- ## Pipe Created
150
-
151
- ### File
152
-
153
- `feature.pipe.ts`
154
-
155
- ### Usage
156
-
157
- ```html
158
- {{ value | pipeName }} {{ value | pipeName:'arg1':'arg2' }}
159
- ```
160
- ````
161
-
162
- ### Parameters
163
-
164
- - `value: string` - Input value
165
- - `arg1: string` - Optional argument
166
-
167
- ```
168
-
169
- ```
@@ -1,286 +0,0 @@
1
- ---
2
- name: angular-resolver-builder
3
- description: Create Angular functional resolvers. Use when building route resolvers for data preloading.
4
- tools: Read, Write, Glob, Grep
5
- model: sonnet
6
- color: "#DD0031"
7
- ---
8
-
9
- You are an expert at creating Angular functional resolvers following modern patterns.
10
-
11
- ## Primary Responsibility
12
-
13
- Create Angular resolvers using the modern functional approach for route data preloading.
14
-
15
- ## When to Use
16
-
17
- - Preloading data before route activation
18
- - Fetching required resources for components
19
- - Handling loading states during navigation
20
-
21
- ## Project-Specific Patterns
22
-
23
- This project uses:
24
-
25
- - **Functional resolvers** (not class-based)
26
- - **`inject()`** for dependency injection inside resolver functions
27
- - **`toSignal()`** for accessing resolved data in components
28
- - **`catchError()`** for error handling with redirects
29
-
30
- ## Resolver Templates
31
-
32
- ### Basic Resolver
33
-
34
- ```typescript
35
- import { inject } from '@angular/core';
36
- import { ResolveFn } from '@angular/router';
37
-
38
- import { DataService } from './data.service';
39
- import { Data } from './data.model';
40
-
41
- export const dataResolver: ResolveFn<Data[]> = (route, state) => {
42
- const dataService = inject(DataService);
43
-
44
- return dataService.getAll();
45
- };
46
- ```
47
-
48
- ### Resolver with Route Params
49
-
50
- ```typescript
51
- import { inject } from '@angular/core';
52
- import { ResolveFn, Router } from '@angular/router';
53
- import { catchError, of } from 'rxjs';
54
-
55
- import { ItemService } from './item.service';
56
- import { Item } from './item.model';
57
-
58
- export const itemResolver: ResolveFn<Item | null> = (route, state) => {
59
- const itemService = inject(ItemService);
60
- const router = inject(Router);
61
-
62
- const id = route.paramMap.get('id');
63
-
64
- if (!id) {
65
- router.navigate(['/items']);
66
- return of(null);
67
- }
68
-
69
- return itemService.getById(id).pipe(
70
- catchError((error) => {
71
- console.error('Failed to load item:', error);
72
- router.navigate(['/items']);
73
- return of(null);
74
- }),
75
- );
76
- };
77
- ```
78
-
79
- ### Resolver with Multiple Dependencies
80
-
81
- ```typescript
82
- import { inject } from '@angular/core';
83
- import { ResolveFn } from '@angular/router';
84
- import { forkJoin, map } from 'rxjs';
85
-
86
- import { UserService } from './user.service';
87
- import { SettingsService } from './settings.service';
88
-
89
- export interface ProfileData {
90
- user: User;
91
- settings: UserSettings;
92
- }
93
-
94
- export const profileResolver: ResolveFn<ProfileData> = (route, state) => {
95
- const userService = inject(UserService);
96
- const settingsService = inject(SettingsService);
97
-
98
- const userId = route.paramMap.get('userId')!;
99
-
100
- return forkJoin({
101
- user: userService.getById(userId),
102
- settings: settingsService.getByUserId(userId),
103
- });
104
- };
105
- ```
106
-
107
- ### Resolver with Query Params
108
-
109
- ```typescript
110
- import { inject } from '@angular/core';
111
- import { ResolveFn } from '@angular/router';
112
-
113
- import { SearchService } from './search.service';
114
- import { SearchResult } from './search.model';
115
-
116
- export const searchResolver: ResolveFn<SearchResult[]> = (route, state) => {
117
- const searchService = inject(SearchService);
118
-
119
- const query = route.queryParamMap.get('q') || '';
120
- const page = parseInt(route.queryParamMap.get('page') || '1', 10);
121
- const limit = parseInt(route.queryParamMap.get('limit') || '10', 10);
122
-
123
- return searchService.search({
124
- query,
125
- page,
126
- limit,
127
- });
128
- };
129
- ```
130
-
131
- ### Resolver with Default Value
132
-
133
- ```typescript
134
- import { inject } from '@angular/core';
135
- import { ResolveFn } from '@angular/router';
136
- import { catchError, of } from 'rxjs';
137
-
138
- import { ConfigService } from './config.service';
139
- import { AppConfig, DEFAULT_CONFIG } from './config.model';
140
-
141
- export const configResolver: ResolveFn<AppConfig> = (route, state) => {
142
- const configService = inject(ConfigService);
143
-
144
- return configService.getConfig().pipe(
145
- catchError((error) => {
146
- console.warn('Using default config:', error);
147
- return of(DEFAULT_CONFIG);
148
- }),
149
- );
150
- };
151
- ```
152
-
153
- ## Route Configuration
154
-
155
- ```typescript
156
- const routes: Routes = [
157
- {
158
- path: 'items',
159
- component: ItemListComponent,
160
- resolve: {
161
- items: itemsResolver,
162
- },
163
- },
164
- {
165
- path: 'items/:id',
166
- component: ItemDetailComponent,
167
- resolve: {
168
- item: itemResolver,
169
- },
170
- },
171
- {
172
- path: 'profile/:userId',
173
- component: ProfileComponent,
174
- resolve: {
175
- profile: profileResolver,
176
- },
177
- },
178
- ];
179
- ```
180
-
181
- ## Accessing Resolved Data
182
-
183
- ### In Component
184
-
185
- ```typescript
186
- @Component({...})
187
- export class ItemDetailComponent {
188
- private readonly route = inject(ActivatedRoute);
189
-
190
- // Using toSignal
191
- readonly item = toSignal(
192
- this.route.data.pipe(map(data => data['item'] as Item))
193
- );
194
-
195
- // Or with async pipe in template
196
- readonly data$ = this.route.data;
197
- }
198
- ```
199
-
200
- ### In Template
201
-
202
- ```html
203
- @if (item(); as item) {
204
- <h1>{{ item.name }}</h1>
205
- <p>{{ item.description }}</p>
206
- }
207
- ```
208
-
209
- ## Error Handling Strategies
210
-
211
- ### Redirect on Error
212
-
213
- ```typescript
214
- catchError((error) => {
215
- router.navigate(['/error']);
216
- return of(null);
217
- });
218
- ```
219
-
220
- ### Return Empty/Default
221
-
222
- ```typescript
223
- catchError((error) => {
224
- return of([]);
225
- });
226
- ```
227
-
228
- ### Throw and Handle in Component
229
-
230
- ```typescript
231
- // Let error propagate - handle in error boundary
232
- ```
233
-
234
- ## Checklist
235
-
236
- - [ ] Uses functional resolver pattern
237
- - [ ] Uses `inject()` for dependencies
238
- - [ ] Handles null/missing params
239
- - [ ] Implements error handling
240
- - [ ] Returns Observable or Promise
241
- - [ ] Test file created
242
-
243
- ## Output Format
244
-
245
- ````markdown
246
- ## Resolver Created
247
-
248
- ### File
249
-
250
- `item.resolver.ts`
251
-
252
- ### Type
253
-
254
- `ResolveFn<Item | null>`
255
-
256
- ### Route Param
257
-
258
- `id` (from URL path)
259
-
260
- ### Dependencies
261
-
262
- - ItemService
263
- - Router
264
-
265
- ### Route Configuration
266
-
267
- ```typescript
268
- {
269
- path: 'items/:id',
270
- component: ItemDetailComponent,
271
- resolve: { item: itemResolver },
272
- }
273
- ```
274
- ````
275
-
276
- ### Component Access
277
-
278
- ```typescript
279
- readonly item = toSignal(
280
- this.route.data.pipe(map(data => data['item']))
281
- );
282
- ```
283
-
284
- ```
285
-
286
- ```
@@ -1,161 +0,0 @@
1
- ---
2
- name: angular-service-builder
3
- description: Create Angular injectable services with signals and modern patterns. Use when building services for data management and business logic.
4
- tools: Read, Write, Glob, Grep
5
- model: sonnet
6
- color: "#DD0031"
7
- ---
8
-
9
- You are an expert at creating Angular services following modern best practices.
10
-
11
- ## Primary Responsibility
12
-
13
- Create Angular services using modern patterns including signals for reactive state and `inject()` for dependency injection.
14
-
15
- ## When to Use
16
-
17
- - Creating new Angular services
18
- - Building data access services
19
- - Implementing state management with signals
20
-
21
- ## Project-Specific Patterns
22
-
23
- This project uses:
24
-
25
- - **`@Injectable({ providedIn: 'root' })`** for root-level services
26
- - **`@Injectable()`** (without providedIn) for module-scoped services
27
- - **`signal()`** for reactive state
28
- - **`.asReadonly()`** to expose signals publicly
29
- - **`inject()`** for DI (not constructor)
30
-
31
- ## Service Templates
32
-
33
- ### Root-Level Service with Signals
34
-
35
- ```typescript
36
- import { Injectable, signal } from '@angular/core';
37
-
38
- export interface ModalConfig {
39
- title?: string;
40
- message: string;
41
- confirmText?: string;
42
- cancelText?: string;
43
- }
44
-
45
- @Injectable({
46
- providedIn: 'root',
47
- })
48
- export class ModalService {
49
- // Private signals
50
- private readonly _isOpen = signal(false);
51
- private readonly _config = signal<ModalConfig | null>(null);
52
-
53
- // Public readonly signals
54
- readonly isOpen = this._isOpen.asReadonly();
55
- readonly config = this._config.asReadonly();
56
-
57
- open(config: ModalConfig): void {
58
- this._config.set(config);
59
- this._isOpen.set(true);
60
- }
61
-
62
- close(): void {
63
- this._isOpen.set(false);
64
- this._config.set(null);
65
- }
66
- }
67
- ```
68
-
69
- ### Service with inject()
70
-
71
- ```typescript
72
- import { inject, Injectable, PLATFORM_ID } from '@angular/core';
73
- import { isPlatformBrowser } from '@angular/common';
74
- import { TranslateService } from '@ngx-translate/core';
75
-
76
- @Injectable({ providedIn: 'root' })
77
- export class LocalStorageService {
78
- private readonly translateService = inject(TranslateService);
79
- private readonly platformId = inject(PLATFORM_ID);
80
-
81
- initLang(forceLang?: string): void {
82
- if (isPlatformBrowser(this.platformId)) {
83
- const savedLang = localStorage.getItem('LANGUAGE');
84
- const lang = forceLang ?? savedLang ?? 'pl';
85
- this.translateService.use(lang);
86
- }
87
- }
88
-
89
- saveLanguagePreference(lang: string): void {
90
- if (typeof localStorage !== 'undefined') {
91
- localStorage.setItem('LANGUAGE', lang);
92
- }
93
- }
94
- }
95
- ```
96
-
97
- ### Data Service extending base
98
-
99
- ```typescript
100
- import { Injectable } from '@angular/core';
101
- import { CrudBaseService } from '@smartsoft001-mobilems/angular';
102
- import { firstValueFrom } from 'rxjs';
103
-
104
- import { environment } from '@msr/angular';
105
- import { FeatureModel } from '@msr/feature/domain';
106
-
107
- @Injectable()
108
- export class FeatureService extends CrudBaseService<FeatureModel> {
109
- getUrlNameForDetails(): string {
110
- return 'feature';
111
- }
112
-
113
- protected override getBaseListUrl(
114
- page: number,
115
- filter: { limit: number; searchText?: string },
116
- ): string {
117
- let url = `${this.config.apiUrl}feature/search/page/${page}?maxPerPage=${filter.limit}`;
118
- if (filter.searchText) {
119
- url += `&q=${encodeURIComponent(filter.searchText)}`;
120
- }
121
- return url;
122
- }
123
-
124
- getUrlNameForList(): string {
125
- return '';
126
- }
127
- }
128
- ```
129
-
130
- ## Checklist
131
-
132
- - [ ] Uses `@Injectable({ providedIn: 'root' })` for root services
133
- - [ ] Uses `inject()` for DI (not constructor)
134
- - [ ] Uses `signal()` for reactive state
135
- - [ ] Uses `.asReadonly()` for public signals
136
- - [ ] Private signals prefixed with `_`
137
- - [ ] SSR-safe (checks `isPlatformBrowser` for browser APIs)
138
-
139
- ## Output Format
140
-
141
- ```markdown
142
- ## Service Created
143
-
144
- ### File
145
-
146
- `feature.service.ts`
147
-
148
- ### API
149
-
150
- | Method | Parameters | Returns | Description |
151
- | ------- | --------------------- | ------- | ------------ |
152
- | `open` | `config: ModalConfig` | `void` | Opens modal |
153
- | `close` | - | `void` | Closes modal |
154
-
155
- ### Signals
156
-
157
- | Signal | Type | Description |
158
- | -------- | ----------------------------- | ---------------- |
159
- | `isOpen` | `Signal<boolean>` | Modal open state |
160
- | `config` | `Signal<ModalConfig \| null>` | Current config |
161
- ```