@smartsoft001-mobilems/claude-plugins 2.76.0 → 2.78.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/package.json +1 -1
- package/plugins/flow/.claude-plugin/merge-permissions.js +17 -0
- package/plugins/flow/.claude-plugin/plugin.json +1 -1
- package/plugins/flow/.claude-plugin/settings.template.json +5 -0
- package/plugins/flow/agents/shared-impl-teammate.md +201 -0
- package/plugins/flow/agents/shared-linear-subtask-iterator.md +1 -1
- package/plugins/flow/agents/shared-plan-perspective.md +269 -0
- package/plugins/flow/agents/shared-report-synthesizer.md +188 -0
- package/plugins/flow/agents/shared-review-teammate.md +189 -0
- package/plugins/flow/agents/shared-subtask-dependency-analyzer.md +188 -0
- package/plugins/flow/agents/shared-team-coordinator.md +189 -0
- package/plugins/flow/skills/impl/SKILL.md +102 -1
- package/plugins/flow/skills/plan/SKILL.md +164 -1
- package/plugins/flow/skills/review/SKILL.md +443 -0
- package/plugins/flow-external/.claude-plugin/README.md +152 -0
- package/plugins/flow-external/.claude-plugin/merge-permissions.js +80 -0
- package/plugins/flow-external/.claude-plugin/plugin.json +5 -0
- package/plugins/flow-external/.claude-plugin/settings.template.json +75 -0
- package/plugins/flow-external/agents/angular-component-scaffolder.md +269 -0
- package/plugins/flow-external/agents/angular-directive-builder.md +130 -0
- package/plugins/flow-external/agents/angular-guard-builder.md +70 -0
- package/plugins/flow-external/agents/angular-pipe-builder.md +82 -0
- package/plugins/flow-external/agents/angular-resolver-builder.md +74 -0
- package/plugins/flow-external/agents/angular-service-builder.md +160 -0
- package/plugins/flow-external/agents/angular-state-builder.md +254 -0
- package/plugins/flow-external/agents/shared-build-verifier.md +67 -0
- package/plugins/flow-external/agents/shared-impl-orchestrator.md +88 -0
- package/plugins/flow-external/agents/shared-impl-reporter.md +107 -0
- package/plugins/flow-external/agents/shared-linear-subtask-iterator.md +70 -0
- package/plugins/flow-external/agents/shared-ui-classifier.md +38 -0
- package/plugins/flow-external/agents/ui-web-designer.md +179 -0
- package/plugins/flow-external/skills/a11y-audit/SKILL.md +96 -0
- package/plugins/flow-external/skills/angular-cli-conventions/SKILL.md +267 -0
- package/plugins/flow-external/skills/angular-patterns/SKILL.md +170 -0
- package/plugins/flow-external/skills/browser-capture/SKILL.md +68 -0
- package/plugins/flow-external/skills/commit/SKILL.md +113 -0
- package/plugins/flow-external/skills/debug-helper/SKILL.md +131 -0
- package/plugins/flow-external/skills/impl/SKILL.md +158 -0
- package/plugins/flow-external/skills/linear-suggestion/SKILL.md +62 -0
- package/plugins/flow-external/skills/maia-files-delete/SKILL.md +34 -0
- package/plugins/flow-external/skills/maia-files-upload/SKILL.md +41 -0
- package/plugins/flow-external/skills/plan/SKILL.md +163 -0
- package/plugins/flow-external/skills/push/SKILL.md +201 -0
- package/plugins/flow-legacy/.claude-plugin/plugin.json +1 -1
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: angular-patterns
|
|
3
|
+
description: Angular 6-11 legacy patterns including *ngIf/*ngFor directives, constructor DI, @Input/@Output decorators, and NgRx state management
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Angular 6-11 Patterns
|
|
7
|
+
|
|
8
|
+
This skill provides guidance on Angular 6-11 patterns for standalone projects.
|
|
9
|
+
|
|
10
|
+
## CRITICAL: Use Legacy Patterns ONLY
|
|
11
|
+
|
|
12
|
+
**DO NOT use modern Angular features (Angular 14+):**
|
|
13
|
+
|
|
14
|
+
| Feature | CORRECT (Angular 6-11) | WRONG (Modern) |
|
|
15
|
+
|---------|------------------------|----------------|
|
|
16
|
+
| Control flow | `*ngIf`, `*ngFor`, `[ngSwitch]` | `@if`, `@for`, `@switch` |
|
|
17
|
+
| DI | Constructor injection | `inject()` |
|
|
18
|
+
| Inputs | `@Input()` decorator | `input()` function |
|
|
19
|
+
| Outputs | `@Output()` decorator | `output()` function |
|
|
20
|
+
| Two-way | `@Input()` + `@Output()` | `model()` |
|
|
21
|
+
| State | BehaviorSubject, NgRx | signals, `signal()` |
|
|
22
|
+
| Derived | `pipe(map())`, getters | `computed()` |
|
|
23
|
+
| Side effects | `subscribe()`, NgRx effects | `effect()` |
|
|
24
|
+
| Components | NgModule-based | standalone |
|
|
25
|
+
|
|
26
|
+
## 1. Control Flow
|
|
27
|
+
|
|
28
|
+
```html
|
|
29
|
+
<!-- *ngIf with else -->
|
|
30
|
+
<div *ngIf="isLoading; else content">
|
|
31
|
+
<app-spinner></app-spinner>
|
|
32
|
+
</div>
|
|
33
|
+
<ng-template #content>
|
|
34
|
+
<ul>
|
|
35
|
+
<li *ngFor="let item of items; trackBy: trackById">{{ item.name }}</li>
|
|
36
|
+
</ul>
|
|
37
|
+
</ng-template>
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
```typescript
|
|
41
|
+
trackById(index: number, item: Item): string {
|
|
42
|
+
return item.id;
|
|
43
|
+
}
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## 2. BehaviorSubject State Management
|
|
47
|
+
|
|
48
|
+
```typescript
|
|
49
|
+
@Injectable({ providedIn: 'root' })
|
|
50
|
+
export class StateService {
|
|
51
|
+
private readonly _items = new BehaviorSubject<Item[]>([]);
|
|
52
|
+
readonly items$ = this._items.asObservable();
|
|
53
|
+
|
|
54
|
+
readonly count$ = this._items.pipe(
|
|
55
|
+
map(items => items.length)
|
|
56
|
+
);
|
|
57
|
+
|
|
58
|
+
setItems(items: Item[]): void {
|
|
59
|
+
this._items.next(items);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## 3. Constructor Injection
|
|
65
|
+
|
|
66
|
+
```typescript
|
|
67
|
+
@Component({
|
|
68
|
+
selector: 'app-feature',
|
|
69
|
+
templateUrl: './feature.component.html',
|
|
70
|
+
})
|
|
71
|
+
export class FeatureComponent implements OnInit, OnDestroy {
|
|
72
|
+
private readonly destroy$ = new Subject<void>();
|
|
73
|
+
|
|
74
|
+
constructor(
|
|
75
|
+
private readonly service: FeatureService,
|
|
76
|
+
private readonly router: Router
|
|
77
|
+
) {}
|
|
78
|
+
|
|
79
|
+
ngOnInit(): void {
|
|
80
|
+
this.service.items$
|
|
81
|
+
.pipe(takeUntil(this.destroy$))
|
|
82
|
+
.subscribe(items => this.items = items);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
ngOnDestroy(): void {
|
|
86
|
+
this.destroy$.next();
|
|
87
|
+
this.destroy$.complete();
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
## 4. Input/Output Decorators
|
|
93
|
+
|
|
94
|
+
```typescript
|
|
95
|
+
@Component({
|
|
96
|
+
selector: 'app-card',
|
|
97
|
+
templateUrl: './card.component.html',
|
|
98
|
+
})
|
|
99
|
+
export class CardComponent {
|
|
100
|
+
@Input() item!: Item;
|
|
101
|
+
@Input() showActions = true;
|
|
102
|
+
@Output() selected = new EventEmitter<Item>();
|
|
103
|
+
|
|
104
|
+
// Two-way binding
|
|
105
|
+
@Input() value = '';
|
|
106
|
+
@Output() valueChange = new EventEmitter<string>();
|
|
107
|
+
}
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
## 5. NgModule
|
|
111
|
+
|
|
112
|
+
```typescript
|
|
113
|
+
@NgModule({
|
|
114
|
+
declarations: [FeatureComponent, CardComponent],
|
|
115
|
+
imports: [CommonModule, TranslateModule, NgbModule],
|
|
116
|
+
exports: [FeatureComponent],
|
|
117
|
+
})
|
|
118
|
+
export class FeatureModule {}
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
## 6. NgRx Patterns
|
|
122
|
+
|
|
123
|
+
```typescript
|
|
124
|
+
// Actions
|
|
125
|
+
export const loadItems = createAction('[Items] Load');
|
|
126
|
+
export const loadItemsSuccess = createAction('[Items] Load Success', props<{ items: Item[] }>());
|
|
127
|
+
|
|
128
|
+
// Reducer
|
|
129
|
+
export const reducer = createReducer(
|
|
130
|
+
initialState,
|
|
131
|
+
on(loadItems, state => ({ ...state, loading: true })),
|
|
132
|
+
on(loadItemsSuccess, (state, { items }) => ({ ...state, items, loading: false }))
|
|
133
|
+
);
|
|
134
|
+
|
|
135
|
+
// Effects
|
|
136
|
+
@Injectable()
|
|
137
|
+
export class ItemEffects {
|
|
138
|
+
constructor(private actions$: Actions, private service: ItemService) {}
|
|
139
|
+
|
|
140
|
+
load$ = createEffect(() => this.actions$.pipe(
|
|
141
|
+
ofType(loadItems),
|
|
142
|
+
mergeMap(() => this.service.getAll().pipe(
|
|
143
|
+
map(items => loadItemsSuccess({ items })),
|
|
144
|
+
catchError(error => of(loadItemsFailure({ error: error.message })))
|
|
145
|
+
))
|
|
146
|
+
));
|
|
147
|
+
}
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
## 7. Async Pipe
|
|
151
|
+
|
|
152
|
+
```html
|
|
153
|
+
<div *ngIf="isLoading$ | async; else content">Loading...</div>
|
|
154
|
+
<ng-template #content>
|
|
155
|
+
<li *ngFor="let item of items$ | async; trackBy: trackById">
|
|
156
|
+
{{ item.name }}
|
|
157
|
+
</li>
|
|
158
|
+
</ng-template>
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
## 8. PR Checklist
|
|
162
|
+
|
|
163
|
+
- [ ] Using `*ngIf`/`*ngFor` (NOT `@if`/`@for`)
|
|
164
|
+
- [ ] Every `*ngFor` has `trackBy`
|
|
165
|
+
- [ ] Using constructor DI (NOT `inject()`)
|
|
166
|
+
- [ ] Using `@Input()`/`@Output()` (NOT `input()`/`output()`)
|
|
167
|
+
- [ ] Using BehaviorSubject/NgRx for state (NOT signals)
|
|
168
|
+
- [ ] Component declared in NgModule
|
|
169
|
+
- [ ] Using `async` pipe in templates
|
|
170
|
+
- [ ] `OnDestroy` with `takeUntil` pattern
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: browser-capture
|
|
3
|
+
description: Manage browser sessions and capture screenshots. Ensures dev server is running, navigates to pages, and captures responsive screenshots.
|
|
4
|
+
allowed-tools:
|
|
5
|
+
- Bash
|
|
6
|
+
- Read
|
|
7
|
+
- Glob
|
|
8
|
+
- mcp__playwright__browser_navigate
|
|
9
|
+
- mcp__playwright__browser_snapshot
|
|
10
|
+
- mcp__playwright__browser_take_screenshot
|
|
11
|
+
- mcp__playwright__browser_resize
|
|
12
|
+
- mcp__playwright__browser_close
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
# Browser Capture Skill
|
|
16
|
+
|
|
17
|
+
Capture screenshots of web pages at multiple viewport sizes.
|
|
18
|
+
|
|
19
|
+
## Server Management
|
|
20
|
+
|
|
21
|
+
### Detect Port
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
# Check angular.json location and read port
|
|
25
|
+
if [ -f "angular.json" ]; then
|
|
26
|
+
grep -o '"port":[^,}]*' angular.json | head -1
|
|
27
|
+
elif [ -f "app/angular.json" ]; then
|
|
28
|
+
grep -o '"port":[^,}]*' app/angular.json | head -1
|
|
29
|
+
fi
|
|
30
|
+
# Default: 4200
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
### Start Server if Needed
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
lsof -i :4200 -t || (npm start & for i in {1..15}; do curl -s http://localhost:4200 > /dev/null && break; sleep 2; done)
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## Capture Process
|
|
40
|
+
|
|
41
|
+
1. Ensure server is running
|
|
42
|
+
2. Navigate to URL with `mcp__playwright__browser_navigate`
|
|
43
|
+
3. For each viewport:
|
|
44
|
+
- `mcp__playwright__browser_resize` → set dimensions
|
|
45
|
+
- `mcp__playwright__browser_take_screenshot` → capture
|
|
46
|
+
|
|
47
|
+
### Viewport Sizes
|
|
48
|
+
|
|
49
|
+
| Name | Width | Height |
|
|
50
|
+
|------|-------|--------|
|
|
51
|
+
| Desktop | 1920 | 1080 |
|
|
52
|
+
| Tablet | 768 | 1024 |
|
|
53
|
+
| Mobile | 375 | 667 |
|
|
54
|
+
|
|
55
|
+
## Upload
|
|
56
|
+
|
|
57
|
+
Delegate to `maia-api` agent for upload to temporary storage.
|
|
58
|
+
|
|
59
|
+
## Output
|
|
60
|
+
|
|
61
|
+
```json
|
|
62
|
+
{
|
|
63
|
+
"screenshots": [
|
|
64
|
+
{ "viewport": "desktop", "url": "https://maia-ai-api.smartsoft.biz.pl/files/abc123" },
|
|
65
|
+
{ "viewport": "mobile", "url": "https://maia-ai-api.smartsoft.biz.pl/files/def456" }
|
|
66
|
+
]
|
|
67
|
+
}
|
|
68
|
+
```
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: commit
|
|
3
|
+
description: Create a conventional commit message based on Linear task and staged changes. Fetches task details, analyzes changes, and generates commit message.
|
|
4
|
+
allowed-tools:
|
|
5
|
+
- Bash
|
|
6
|
+
- Read
|
|
7
|
+
- Glob
|
|
8
|
+
- Grep
|
|
9
|
+
- AskUserQuestion
|
|
10
|
+
- mcp__linear-server__get_issue
|
|
11
|
+
- mcp__linear-server__list_comments
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# Commit Skill
|
|
15
|
+
|
|
16
|
+
Create a conventional commit message based on Linear task and staged changes.
|
|
17
|
+
|
|
18
|
+
## Usage
|
|
19
|
+
|
|
20
|
+
```
|
|
21
|
+
/commit [linearTaskId]
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## Parameters
|
|
25
|
+
|
|
26
|
+
- `linearTaskId` - Linear task ID (e.g., MOB-123)
|
|
27
|
+
|
|
28
|
+
## Execution Checklist
|
|
29
|
+
|
|
30
|
+
- [ ] **1. Fetch Linear task** — get title, description, labels/type from MCP Linear server
|
|
31
|
+
- [ ] **2. Analyze staged changes** — run `git diff --cached` to understand scope
|
|
32
|
+
- [ ] **3. Verify completeness** — compare task requirements with staged changes; if incomplete, ask user whether to continue or stop
|
|
33
|
+
- [ ] **4. Determine commit type and scope** — based on changes and task type
|
|
34
|
+
- [ ] **5. Generate commit message** — draft `<type>(<scope>): <subject>` with body and `Refs: <linearTaskId>`
|
|
35
|
+
- [ ] **6. Show message to user** — present commit message for approval before proceeding
|
|
36
|
+
- [ ] **7. Create commit** — execute `git commit` with the approved message
|
|
37
|
+
|
|
38
|
+
## Commit Message Format
|
|
39
|
+
|
|
40
|
+
```
|
|
41
|
+
<type>(<scope>): <subject>
|
|
42
|
+
|
|
43
|
+
<body>
|
|
44
|
+
|
|
45
|
+
Refs: <linearTaskId>
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
### Type
|
|
49
|
+
|
|
50
|
+
| Type | Use when |
|
|
51
|
+
|------|----------|
|
|
52
|
+
| `feat` | New feature or functionality |
|
|
53
|
+
| `fix` | Bug fix |
|
|
54
|
+
| `refactor` | Code restructuring without behavior change |
|
|
55
|
+
| `style` | Styling/CSS changes only |
|
|
56
|
+
| `docs` | Documentation changes |
|
|
57
|
+
| `chore` | Maintenance, config, dependencies |
|
|
58
|
+
| `perf` | Performance improvements |
|
|
59
|
+
|
|
60
|
+
### Scope
|
|
61
|
+
|
|
62
|
+
Determine scope from the changed files and project structure. Common scopes for external projects:
|
|
63
|
+
|
|
64
|
+
- Component name (e.g., `gallery`, `articles`, `navigation`)
|
|
65
|
+
- Feature area (e.g., `wcag`, `i18n`, `auth`)
|
|
66
|
+
- Infrastructure (e.g., `config`, `docker`)
|
|
67
|
+
|
|
68
|
+
### Subject
|
|
69
|
+
|
|
70
|
+
- Imperative mood ("add feature" not "added feature")
|
|
71
|
+
- Lowercase first letter
|
|
72
|
+
- No period at end
|
|
73
|
+
- Max 72 characters
|
|
74
|
+
|
|
75
|
+
### Body
|
|
76
|
+
|
|
77
|
+
- Explain WHAT changed and WHY
|
|
78
|
+
- Reference Linear task
|
|
79
|
+
- List affected files if helpful
|
|
80
|
+
|
|
81
|
+
## Example
|
|
82
|
+
|
|
83
|
+
```
|
|
84
|
+
feat(gallery): add lightbox for exhibition photos
|
|
85
|
+
|
|
86
|
+
Add lightbox modal for viewing gallery photos in full screen.
|
|
87
|
+
Uses ng-bootstrap modal with keyboard navigation support.
|
|
88
|
+
|
|
89
|
+
Refs: MOB-548
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
## Error Handling
|
|
93
|
+
|
|
94
|
+
### No Staged Changes
|
|
95
|
+
|
|
96
|
+
```markdown
|
|
97
|
+
## No staged changes
|
|
98
|
+
|
|
99
|
+
Run `git add` to stage your changes before committing.
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
### Linear Task Not Found
|
|
103
|
+
|
|
104
|
+
If linearTaskId is not provided or task not found:
|
|
105
|
+
- Try to detect from branch name
|
|
106
|
+
- If still not found, proceed without Linear context
|
|
107
|
+
|
|
108
|
+
## Guidelines
|
|
109
|
+
|
|
110
|
+
1. **Always show commit message for approval** before creating the commit
|
|
111
|
+
2. **Use Polish branch naming** if branch follows MOB-XXX pattern
|
|
112
|
+
3. **Include Refs:** with Linear task ID when available
|
|
113
|
+
4. **Keep subject line under 72 characters**
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: debug-helper
|
|
3
|
+
description: Debugging workflows for Angular 6-11 standalone projects
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Debug Helper (Angular 6-11)
|
|
7
|
+
|
|
8
|
+
Debugging workflows for standalone Angular CLI projects.
|
|
9
|
+
|
|
10
|
+
## 1. Angular Debugging
|
|
11
|
+
|
|
12
|
+
### Component Not Rendering
|
|
13
|
+
|
|
14
|
+
1. Check selector matches template usage
|
|
15
|
+
2. Check NgModule declarations - is component declared?
|
|
16
|
+
3. Check NgModule exports - is it exported for external use?
|
|
17
|
+
4. Check NgModule imports - is the feature module imported?
|
|
18
|
+
|
|
19
|
+
### BehaviorSubject Issues
|
|
20
|
+
|
|
21
|
+
```typescript
|
|
22
|
+
// Wrong: mutating array (won't trigger update)
|
|
23
|
+
const items = this._items.getValue();
|
|
24
|
+
items.push(newItem);
|
|
25
|
+
this._items.next(items);
|
|
26
|
+
|
|
27
|
+
// Correct: create new reference
|
|
28
|
+
this._items.next([...this._items.getValue(), newItem]);
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
### Memory Leaks
|
|
32
|
+
|
|
33
|
+
```typescript
|
|
34
|
+
// Always use takeUntil pattern
|
|
35
|
+
private readonly destroy$ = new Subject<void>();
|
|
36
|
+
|
|
37
|
+
ngOnInit(): void {
|
|
38
|
+
this.service.data$
|
|
39
|
+
.pipe(takeUntil(this.destroy$))
|
|
40
|
+
.subscribe(data => this.data = data);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
ngOnDestroy(): void {
|
|
44
|
+
this.destroy$.next();
|
|
45
|
+
this.destroy$.complete();
|
|
46
|
+
}
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### Change Detection
|
|
50
|
+
|
|
51
|
+
```typescript
|
|
52
|
+
constructor(private cdr: ChangeDetectorRef) {}
|
|
53
|
+
|
|
54
|
+
// Force detection
|
|
55
|
+
this.cdr.detectChanges();
|
|
56
|
+
|
|
57
|
+
// Mark for check (OnPush)
|
|
58
|
+
this.cdr.markForCheck();
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
### Template Debugging
|
|
62
|
+
|
|
63
|
+
```html
|
|
64
|
+
<pre>{{ data | json }}</pre>
|
|
65
|
+
<p>isLoading: {{ isLoading }}</p>
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
## 2. NgRx Debugging
|
|
69
|
+
|
|
70
|
+
### State Not Updating
|
|
71
|
+
|
|
72
|
+
1. Verify action is dispatched: add `tap(action => console.log(action))` to effects
|
|
73
|
+
2. Verify reducer handles the action
|
|
74
|
+
3. Verify selector reads correct state slice
|
|
75
|
+
4. Check Redux DevTools (install Chrome extension)
|
|
76
|
+
|
|
77
|
+
### Effects Not Running
|
|
78
|
+
|
|
79
|
+
1. Check effect is registered in `EffectsModule.forFeature([Effects])`
|
|
80
|
+
2. Check `ofType` matches dispatched action
|
|
81
|
+
3. Check effect observable completes (use `mergeMap` not `switchMap` for parallel)
|
|
82
|
+
|
|
83
|
+
## 3. Common Errors
|
|
84
|
+
|
|
85
|
+
### "Cannot read property of undefined"
|
|
86
|
+
|
|
87
|
+
```typescript
|
|
88
|
+
// Use optional chaining
|
|
89
|
+
const name = user?.profile?.name ?? 'Unknown';
|
|
90
|
+
|
|
91
|
+
// In templates
|
|
92
|
+
{{ user?.profile?.name }}
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
### "Expression has changed after it was checked"
|
|
96
|
+
|
|
97
|
+
```typescript
|
|
98
|
+
ngAfterViewInit(): void {
|
|
99
|
+
setTimeout(() => this.value = newValue);
|
|
100
|
+
}
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
### "NullInjectorError: No provider for X"
|
|
104
|
+
|
|
105
|
+
```typescript
|
|
106
|
+
// Add to module providers or use providedIn: 'root'
|
|
107
|
+
@Injectable({ providedIn: 'root' })
|
|
108
|
+
export class MyService {}
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
### "Circular dependency detected"
|
|
112
|
+
|
|
113
|
+
```typescript
|
|
114
|
+
// Use forwardRef
|
|
115
|
+
@Inject(forwardRef(() => ServiceB))
|
|
116
|
+
private serviceB: ServiceB
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
## 4. Build Errors
|
|
120
|
+
|
|
121
|
+
```bash
|
|
122
|
+
# Check TypeScript errors
|
|
123
|
+
npx tsc --noEmit
|
|
124
|
+
|
|
125
|
+
# Check Angular build
|
|
126
|
+
ng build --prod 2>&1 | head -50
|
|
127
|
+
|
|
128
|
+
# Common: AOT compilation errors
|
|
129
|
+
# - Private members used in templates (make them public or use getters)
|
|
130
|
+
# - Function calls in templates (extract to component methods)
|
|
131
|
+
```
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: impl
|
|
3
|
+
description: Implement plans from Linear task comments. Reads approved implementation plan, orchestrates agents, and executes changes step by step.
|
|
4
|
+
allowed-tools:
|
|
5
|
+
- Bash
|
|
6
|
+
- Read
|
|
7
|
+
- Write
|
|
8
|
+
- Edit
|
|
9
|
+
- Glob
|
|
10
|
+
- Grep
|
|
11
|
+
- AskUserQuestion
|
|
12
|
+
- mcp__linear-server__get_issue
|
|
13
|
+
- mcp__linear-server__list_issues
|
|
14
|
+
- mcp__linear-server__list_comments
|
|
15
|
+
- mcp__linear-server__create_comment
|
|
16
|
+
- mcp__linear-server__update_issue
|
|
17
|
+
- mcp__linear-server__list_issue_statuses
|
|
18
|
+
- mcp__playwright__browser_navigate
|
|
19
|
+
- mcp__playwright__browser_snapshot
|
|
20
|
+
- mcp__playwright__browser_take_screenshot
|
|
21
|
+
- mcp__playwright__browser_resize
|
|
22
|
+
- mcp__playwright__browser_close
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
# Implementation Skill
|
|
26
|
+
|
|
27
|
+
Implement changes based on approved plans from Linear task comments.
|
|
28
|
+
|
|
29
|
+
## Usage
|
|
30
|
+
|
|
31
|
+
```
|
|
32
|
+
/impl <linearTaskId>
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## Parameters
|
|
36
|
+
|
|
37
|
+
- `linearTaskId` - Linear task ID (e.g., MOB-123)
|
|
38
|
+
|
|
39
|
+
## CRITICAL: Angular 6-11 + Angular CLI
|
|
40
|
+
|
|
41
|
+
This is for standalone Angular CLI projects. Key rules:
|
|
42
|
+
|
|
43
|
+
- Use `ng` commands (NOT `nx`)
|
|
44
|
+
- Use constructor DI (NOT `inject()`)
|
|
45
|
+
- Use `*ngIf`/`*ngFor` (NOT `@if`/`@for`)
|
|
46
|
+
- Use `@Input()`/`@Output()` (NOT `input()`/`output()`)
|
|
47
|
+
- Use BehaviorSubject/NgRx (NOT signals)
|
|
48
|
+
- Use NgModules (NOT standalone components)
|
|
49
|
+
- Styling: follow whatever CSS approach the project uses (check `package.json` for Bootstrap, etc.)
|
|
50
|
+
|
|
51
|
+
## Execution Steps
|
|
52
|
+
|
|
53
|
+
### Step 1: Fetch Task and Plan
|
|
54
|
+
|
|
55
|
+
1. Fetch the Linear task using `mcp__linear-server__get_issue`
|
|
56
|
+
2. Fetch task comments using `mcp__linear-server__list_comments`
|
|
57
|
+
3. Search comments for an approved implementation plan (look for "## Plan" or "## Implementation Plan")
|
|
58
|
+
4. If no plan found, inform user and suggest running `/plan` first
|
|
59
|
+
|
|
60
|
+
### Step 2: Detect Project Structure
|
|
61
|
+
|
|
62
|
+
Before implementing, detect the project layout:
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
# Check if angular.json is at root or in app/ subdirectory
|
|
66
|
+
ls angular.json 2>/dev/null && echo "ROOT" || (ls app/angular.json 2>/dev/null && echo "APP_DIR")
|
|
67
|
+
|
|
68
|
+
# Check package.json for dependencies
|
|
69
|
+
cat package.json 2>/dev/null || cat app/package.json 2>/dev/null
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
Key things to detect:
|
|
73
|
+
- Angular version (6-11)
|
|
74
|
+
- CSS framework (Bootstrap 4 / custom SCSS / none)
|
|
75
|
+
- NgRx version and patterns
|
|
76
|
+
- i18n setup (ngx-translate)
|
|
77
|
+
- Project structure (app/src/ vs src/)
|
|
78
|
+
|
|
79
|
+
### Step 3: List Subtasks
|
|
80
|
+
|
|
81
|
+
If task has subtasks:
|
|
82
|
+
|
|
83
|
+
1. Fetch subtasks using `mcp__linear-server__list_issues` with parent filter
|
|
84
|
+
2. Sort by priority/creation order
|
|
85
|
+
3. Process each subtask in order
|
|
86
|
+
|
|
87
|
+
### Step 4: Implement Each Step
|
|
88
|
+
|
|
89
|
+
For each step in the plan:
|
|
90
|
+
|
|
91
|
+
1. **Read relevant files** - Understand existing code before modifying
|
|
92
|
+
2. **Follow existing patterns** - Match the codebase style exactly
|
|
93
|
+
3. **Create/modify files** - Implement the planned changes
|
|
94
|
+
4. **Register in modules** - Add declarations/imports to NgModules
|
|
95
|
+
5. **Update subtask status** - Mark as Done when complete
|
|
96
|
+
|
|
97
|
+
### Step 5: Build Verification
|
|
98
|
+
|
|
99
|
+
After all steps are complete:
|
|
100
|
+
|
|
101
|
+
```bash
|
|
102
|
+
# Verify build passes (adapt path based on project structure)
|
|
103
|
+
ng build --prod
|
|
104
|
+
# OR
|
|
105
|
+
cd app && ng build --prod
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
### Step 6: Report Results
|
|
109
|
+
|
|
110
|
+
Create a summary comment on the Linear task:
|
|
111
|
+
|
|
112
|
+
```markdown
|
|
113
|
+
## Raport Implementacji
|
|
114
|
+
|
|
115
|
+
### Zrealizowane
|
|
116
|
+
|
|
117
|
+
| Podzadanie | Tytul | Status |
|
|
118
|
+
|-----------|-------|--------|
|
|
119
|
+
| MOB-549 | [title] | Zrealizowane |
|
|
120
|
+
|
|
121
|
+
### Zmiany
|
|
122
|
+
|
|
123
|
+
| Plik | Typ | Opis |
|
|
124
|
+
|------|-----|------|
|
|
125
|
+
| `src/app/components/feature.component.ts` | Nowy | Komponent |
|
|
126
|
+
| `src/app/components/feature.module.ts` | Zmodyfikowany | Dodano deklaracje |
|
|
127
|
+
|
|
128
|
+
### Build
|
|
129
|
+
|
|
130
|
+
- `ng build --prod` - Sukces
|
|
131
|
+
|
|
132
|
+
---
|
|
133
|
+
|
|
134
|
+
_Raport wygenerowany przez Claude Code_
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
## Agent Selection
|
|
138
|
+
|
|
139
|
+
| Task Type | Agent |
|
|
140
|
+
|-----------|-------|
|
|
141
|
+
| New component | `angular-component-scaffolder` |
|
|
142
|
+
| New service | `angular-service-builder` |
|
|
143
|
+
| NgRx state | `angular-state-builder` |
|
|
144
|
+
| New directive | `angular-directive-builder` |
|
|
145
|
+
| New pipe | `angular-pipe-builder` |
|
|
146
|
+
| Guard/resolver | `angular-guard-builder` / `angular-resolver-builder` |
|
|
147
|
+
| Styling | `ui-web-designer` |
|
|
148
|
+
|
|
149
|
+
## Guidelines
|
|
150
|
+
|
|
151
|
+
1. **Always read existing code first** before making changes
|
|
152
|
+
2. **Follow the project's existing patterns** exactly
|
|
153
|
+
3. **Register everything in NgModules** - declarations, imports, exports
|
|
154
|
+
4. **Use the project's CSS approach** - detect from package.json
|
|
155
|
+
5. **Write all Linear comments in Polish**
|
|
156
|
+
6. **Verify build after implementation**
|
|
157
|
+
7. **Do NOT add tests** unless explicitly requested
|
|
158
|
+
8. **Do NOT modify deployment configuration**
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: linear-suggestion
|
|
3
|
+
description: Create a Linear issue in the "MobileMS Framework" project with a suggestion for agent 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 or skills.
|
|
10
|
+
|
|
11
|
+
## When to Use
|
|
12
|
+
|
|
13
|
+
- When an automated agent identifies a recurring pattern that could improve an agent or skill
|
|
14
|
+
- When proposing orchestrator rule changes
|
|
15
|
+
- When any non-interactive process needs to suggest framework improvements
|
|
16
|
+
|
|
17
|
+
## Input Parameters
|
|
18
|
+
|
|
19
|
+
| Parameter | Required | Description |
|
|
20
|
+
|-----------|----------|-------------|
|
|
21
|
+
| `title` | YES | Short summary (max 100 chars) |
|
|
22
|
+
| `description` | YES | Full markdown description with rationale |
|
|
23
|
+
| `source` | YES | Agent that generated the suggestion |
|
|
24
|
+
| `targetFile` | NO | Path to the file to be modified |
|
|
25
|
+
| `category` | NO | One of: `OPTIMIZATION`, `NEW_RULE`, `PATTERN_UPDATE`, `BUG_FIX` |
|
|
26
|
+
|
|
27
|
+
## Issue Format
|
|
28
|
+
|
|
29
|
+
### Title
|
|
30
|
+
|
|
31
|
+
```
|
|
32
|
+
[Agent Suggestion] {title}
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
### Description
|
|
36
|
+
|
|
37
|
+
```markdown
|
|
38
|
+
## Agent Improvement Suggestion
|
|
39
|
+
|
|
40
|
+
**Source agent**: `{source}`
|
|
41
|
+
**Category**: {category}
|
|
42
|
+
**Target file**: `{targetFile}`
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
{description}
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
_This issue was automatically created by `{source}` via the `linear-suggestion` skill._
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
## Process
|
|
54
|
+
|
|
55
|
+
1. Format the issue title with `[Agent Suggestion]` prefix
|
|
56
|
+
2. Build the description using the template
|
|
57
|
+
3. Create the issue using MCP Linear server
|
|
58
|
+
4. Return the issue ID and URL
|
|
59
|
+
|
|
60
|
+
## Error Handling
|
|
61
|
+
|
|
62
|
+
If creation fails, log error silently and do NOT block the parent workflow.
|