@smartsoft001-mobilems/claude-plugins 2.58.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/.claude-plugin/marketplace.json +14 -0
- package/package.json +13 -0
- package/plugins/flow/.claude-plugin/plugin.json +5 -0
- package/plugins/flow/agents/angular-component-scaffolder.md +174 -0
- package/plugins/flow/agents/angular-directive-builder.md +152 -0
- package/plugins/flow/agents/angular-guard-builder.md +242 -0
- package/plugins/flow/agents/angular-jest-test-writer.md +473 -0
- package/plugins/flow/agents/angular-pipe-builder.md +168 -0
- package/plugins/flow/agents/angular-resolver-builder.md +285 -0
- package/plugins/flow/agents/angular-service-builder.md +160 -0
- package/plugins/flow/agents/angular-signal-state-builder.md +338 -0
- package/plugins/flow/agents/angular-test-diagnostician.md +278 -0
- package/plugins/flow/agents/angular-testbed-configurator.md +314 -0
- package/plugins/flow/agents/arch-scaffolder.md +277 -0
- package/plugins/flow/agents/shared-build-verifier.md +159 -0
- package/plugins/flow/agents/shared-config-updater.md +309 -0
- package/plugins/flow/agents/shared-coverage-enforcer.md +183 -0
- package/plugins/flow/agents/shared-error-handler.md +216 -0
- package/plugins/flow/agents/shared-file-creator.md +343 -0
- package/plugins/flow/agents/shared-impl-orchestrator.md +309 -0
- package/plugins/flow/agents/shared-impl-reporter.md +338 -0
- package/plugins/flow/agents/shared-linear-subtask-iterator.md +336 -0
- package/plugins/flow/agents/shared-logic-implementer.md +242 -0
- package/plugins/flow/agents/shared-maia-api.md +25 -0
- package/plugins/flow/agents/shared-performance-validator.md +167 -0
- package/plugins/flow/agents/shared-project-standardizer.md +204 -0
- package/plugins/flow/agents/shared-security-scanner.md +185 -0
- package/plugins/flow/agents/shared-style-enforcer.md +229 -0
- package/plugins/flow/agents/shared-tdd-developer.md +349 -0
- package/plugins/flow/agents/shared-test-fixer.md +185 -0
- package/plugins/flow/agents/shared-test-runner.md +190 -0
- package/plugins/flow/agents/shared-ui-classifier.md +229 -0
- package/plugins/flow/agents/shared-verification-orchestrator.md +193 -0
- package/plugins/flow/agents/shared-verification-runner.md +139 -0
- package/plugins/flow/agents/ui-a11y-validator.md +304 -0
- package/plugins/flow/agents/ui-screenshot-reporter.md +328 -0
- package/plugins/flow/agents/ui-web-designer.md +213 -0
- package/plugins/flow/commands/commit.md +131 -0
- package/plugins/flow/commands/impl.md +625 -0
- package/plugins/flow/commands/plan.md +598 -0
- package/plugins/flow/commands/push.md +584 -0
- package/plugins/flow/skills/a11y-audit/SKILL.md +214 -0
- package/plugins/flow/skills/angular-patterns/SKILL.md +191 -0
- package/plugins/flow/skills/browser-capture/SKILL.md +238 -0
- package/plugins/flow/skills/debug-helper/SKILL.md +375 -0
- package/plugins/flow/skills/maia-files-delete/SKILL.md +60 -0
- package/plugins/flow/skills/maia-files-upload/SKILL.md +58 -0
- package/plugins/flow/skills/nx-conventions/SKILL.md +327 -0
- package/plugins/flow/skills/test-unit/SKILL.md +456 -0
- package/src/index.d.ts +6 -0
- package/src/index.js +10 -0
- package/src/index.js.map +1 -0
|
@@ -0,0 +1,375 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: debug-helper
|
|
3
|
+
description: Cross-stack debugging workflows for Angular, NestJS, and MongoDB applications
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Debug Helper
|
|
7
|
+
|
|
8
|
+
This skill provides debugging workflows and techniques for this project's tech stack.
|
|
9
|
+
|
|
10
|
+
## 1. Angular 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 />
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
2. **Check imports (standalone)**
|
|
23
|
+
|
|
24
|
+
```typescript
|
|
25
|
+
@Component({
|
|
26
|
+
standalone: true,
|
|
27
|
+
imports: [MyComponent], // Is it imported?
|
|
28
|
+
})
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
3. **Check module exports (non-standalone)**
|
|
32
|
+
```typescript
|
|
33
|
+
@NgModule({
|
|
34
|
+
exports: [MyComponent], // Is it exported?
|
|
35
|
+
})
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
### Signal/Reactive Issues
|
|
39
|
+
|
|
40
|
+
1. **Signal not updating**
|
|
41
|
+
|
|
42
|
+
```typescript
|
|
43
|
+
// Wrong: mutating object
|
|
44
|
+
items()[0].name = 'new'; // Won't trigger update
|
|
45
|
+
|
|
46
|
+
// Correct: create new reference
|
|
47
|
+
items.update((arr) =>
|
|
48
|
+
arr.map((item) => (item.id === id ? { ...item, name: 'new' } : item)),
|
|
49
|
+
);
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
2. **Effect not running**
|
|
53
|
+
|
|
54
|
+
```typescript
|
|
55
|
+
// Ensure signal is read inside effect
|
|
56
|
+
effect(() => {
|
|
57
|
+
const value = this.mySignal(); // Must call signal
|
|
58
|
+
console.log('Value changed:', value);
|
|
59
|
+
});
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
3. **Computed not recalculating**
|
|
63
|
+
```typescript
|
|
64
|
+
// Ensure all dependencies are read
|
|
65
|
+
readonly filtered = computed(() => {
|
|
66
|
+
const items = this.items(); // Dependency
|
|
67
|
+
const filter = this.filter(); // Dependency
|
|
68
|
+
return items.filter(i => i.name.includes(filter));
|
|
69
|
+
});
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
### Change Detection Issues
|
|
73
|
+
|
|
74
|
+
```typescript
|
|
75
|
+
// Force change detection
|
|
76
|
+
constructor(private cdr: ChangeDetectorRef) {}
|
|
77
|
+
|
|
78
|
+
// After async operation
|
|
79
|
+
this.cdr.detectChanges();
|
|
80
|
+
|
|
81
|
+
// Or mark for check (OnPush)
|
|
82
|
+
this.cdr.markForCheck();
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
### HTTP Debugging
|
|
86
|
+
|
|
87
|
+
```typescript
|
|
88
|
+
// Add HTTP interceptor for logging
|
|
89
|
+
export const loggingInterceptor: HttpInterceptorFn = (req, next) => {
|
|
90
|
+
console.log('Request:', req.method, req.url);
|
|
91
|
+
return next(req).pipe(
|
|
92
|
+
tap({
|
|
93
|
+
next: (event) => {
|
|
94
|
+
if (event instanceof HttpResponse) {
|
|
95
|
+
console.log('Response:', event.status, event.body);
|
|
96
|
+
}
|
|
97
|
+
},
|
|
98
|
+
error: (error) => console.error('HTTP Error:', error),
|
|
99
|
+
}),
|
|
100
|
+
);
|
|
101
|
+
};
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
### Browser DevTools
|
|
105
|
+
|
|
106
|
+
1. **Angular DevTools** - Install Chrome extension
|
|
107
|
+
2. **Component inspector** - Click "Components" tab
|
|
108
|
+
3. **Profiler** - Record change detection cycles
|
|
109
|
+
4. **Network tab** - Check API calls
|
|
110
|
+
|
|
111
|
+
## 2. NestJS Debugging
|
|
112
|
+
|
|
113
|
+
### Request Not Reaching Controller
|
|
114
|
+
|
|
115
|
+
1. **Check route path**
|
|
116
|
+
|
|
117
|
+
```typescript
|
|
118
|
+
@Controller('features') // /features
|
|
119
|
+
@Get(':id') // /features/:id
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
2. **Check module imports**
|
|
123
|
+
|
|
124
|
+
```typescript
|
|
125
|
+
@Module({
|
|
126
|
+
imports: [FeatureModule], // Is module imported?
|
|
127
|
+
})
|
|
128
|
+
export class AppModule {}
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
3. **Check guards/interceptors**
|
|
132
|
+
```typescript
|
|
133
|
+
@UseGuards(AuthGuard) // Is guard blocking?
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
### Dependency Injection Errors
|
|
137
|
+
|
|
138
|
+
```
|
|
139
|
+
Error: Nest can't resolve dependencies of FeatureService
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
**Solutions:**
|
|
143
|
+
|
|
144
|
+
1. Check provider is in module
|
|
145
|
+
|
|
146
|
+
```typescript
|
|
147
|
+
@Module({
|
|
148
|
+
providers: [FeatureService, FeatureRepository],
|
|
149
|
+
})
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
2. Check circular dependencies
|
|
153
|
+
|
|
154
|
+
```typescript
|
|
155
|
+
// Use forwardRef
|
|
156
|
+
@Inject(forwardRef(() => OtherService))
|
|
157
|
+
private readonly other: OtherService,
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
3. Check module exports
|
|
161
|
+
```typescript
|
|
162
|
+
@Module({
|
|
163
|
+
providers: [SharedService],
|
|
164
|
+
exports: [SharedService], // Must export if used elsewhere
|
|
165
|
+
})
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
### Logging
|
|
169
|
+
|
|
170
|
+
```typescript
|
|
171
|
+
import { Logger } from '@nestjs/common';
|
|
172
|
+
|
|
173
|
+
@Injectable()
|
|
174
|
+
export class FeatureService {
|
|
175
|
+
private readonly logger = new Logger(FeatureService.name);
|
|
176
|
+
|
|
177
|
+
async findAll() {
|
|
178
|
+
this.logger.log('Finding all features');
|
|
179
|
+
this.logger.debug('Debug info');
|
|
180
|
+
this.logger.warn('Warning');
|
|
181
|
+
this.logger.error('Error occurred', error.stack);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
### Exception Debugging
|
|
187
|
+
|
|
188
|
+
```typescript
|
|
189
|
+
// Global exception filter
|
|
190
|
+
@Catch()
|
|
191
|
+
export class AllExceptionsFilter implements ExceptionFilter {
|
|
192
|
+
private readonly logger = new Logger('ExceptionFilter');
|
|
193
|
+
|
|
194
|
+
catch(exception: unknown, host: ArgumentsHost) {
|
|
195
|
+
const ctx = host.switchToHttp();
|
|
196
|
+
const response = ctx.getResponse();
|
|
197
|
+
const request = ctx.getRequest();
|
|
198
|
+
|
|
199
|
+
this.logger.error(
|
|
200
|
+
`${request.method} ${request.url}`,
|
|
201
|
+
exception instanceof Error ? exception.stack : exception,
|
|
202
|
+
);
|
|
203
|
+
|
|
204
|
+
// Return error response
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
## 3. MongoDB/Mongoose Debugging
|
|
210
|
+
|
|
211
|
+
### Connection Issues
|
|
212
|
+
|
|
213
|
+
```typescript
|
|
214
|
+
// Log connection events
|
|
215
|
+
mongoose.connection.on('connected', () => console.log('MongoDB connected'));
|
|
216
|
+
mongoose.connection.on('error', (err) => console.error('MongoDB error:', err));
|
|
217
|
+
mongoose.connection.on('disconnected', () =>
|
|
218
|
+
console.log('MongoDB disconnected'),
|
|
219
|
+
);
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
### Query Debugging
|
|
223
|
+
|
|
224
|
+
```typescript
|
|
225
|
+
// Enable Mongoose debug mode
|
|
226
|
+
mongoose.set('debug', true);
|
|
227
|
+
|
|
228
|
+
// Or for specific query
|
|
229
|
+
const result = await this.model.find({ status: 'active' });
|
|
230
|
+
console.log('Query:', this.model.find({ status: 'active' }).getQuery());
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
### Aggregation Debugging
|
|
234
|
+
|
|
235
|
+
```typescript
|
|
236
|
+
// Log pipeline
|
|
237
|
+
const pipeline = [
|
|
238
|
+
{ $match: { status: 'active' } },
|
|
239
|
+
{ $group: { _id: '$category', count: { $sum: 1 } } },
|
|
240
|
+
];
|
|
241
|
+
console.log('Pipeline:', JSON.stringify(pipeline, null, 2));
|
|
242
|
+
|
|
243
|
+
// Explain query
|
|
244
|
+
const explanation = await this.model.aggregate(pipeline).explain();
|
|
245
|
+
console.log('Explain:', explanation);
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
### Index Issues
|
|
249
|
+
|
|
250
|
+
```bash
|
|
251
|
+
# Check indexes in MongoDB shell
|
|
252
|
+
db.features.getIndexes()
|
|
253
|
+
|
|
254
|
+
# Check query uses index
|
|
255
|
+
db.features.find({ status: 'active' }).explain('executionStats')
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
## 4. Common Debugging Patterns
|
|
259
|
+
|
|
260
|
+
### Console Debugging
|
|
261
|
+
|
|
262
|
+
```typescript
|
|
263
|
+
// Temporary debug logs (remove before commit)
|
|
264
|
+
console.log('DEBUG:', variable);
|
|
265
|
+
console.table(arrayOfObjects);
|
|
266
|
+
console.group('Group');
|
|
267
|
+
console.log('Item 1');
|
|
268
|
+
console.log('Item 2');
|
|
269
|
+
console.groupEnd();
|
|
270
|
+
console.time('Operation');
|
|
271
|
+
// ... operation
|
|
272
|
+
console.timeEnd('Operation');
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
### Breakpoint Debugging
|
|
276
|
+
|
|
277
|
+
```typescript
|
|
278
|
+
// Add debugger statement
|
|
279
|
+
function processData(data: Data) {
|
|
280
|
+
debugger; // Execution pauses here in DevTools
|
|
281
|
+
return transform(data);
|
|
282
|
+
}
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
### VS Code Launch Configuration
|
|
286
|
+
|
|
287
|
+
```json
|
|
288
|
+
// .vscode/launch.json
|
|
289
|
+
{
|
|
290
|
+
"version": "0.2.0",
|
|
291
|
+
"configurations": [
|
|
292
|
+
{
|
|
293
|
+
"type": "node",
|
|
294
|
+
"request": "launch",
|
|
295
|
+
"name": "Debug NestJS",
|
|
296
|
+
"runtimeArgs": ["-r", "ts-node/register"],
|
|
297
|
+
"args": ["${workspaceFolder}/apps/api/src/main.ts"],
|
|
298
|
+
"cwd": "${workspaceFolder}"
|
|
299
|
+
},
|
|
300
|
+
{
|
|
301
|
+
"type": "chrome",
|
|
302
|
+
"request": "launch",
|
|
303
|
+
"name": "Debug Angular",
|
|
304
|
+
"url": "http://localhost:4210",
|
|
305
|
+
"webRoot": "${workspaceFolder}/apps/web/src"
|
|
306
|
+
}
|
|
307
|
+
]
|
|
308
|
+
}
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
## 5. Error Investigation Workflow
|
|
312
|
+
|
|
313
|
+
### Step 1: Reproduce
|
|
314
|
+
|
|
315
|
+
- Get exact steps to reproduce
|
|
316
|
+
- Note environment (browser, Node version)
|
|
317
|
+
|
|
318
|
+
### Step 2: Isolate
|
|
319
|
+
|
|
320
|
+
- Identify component/service causing issue
|
|
321
|
+
- Check if issue is frontend, backend, or database
|
|
322
|
+
|
|
323
|
+
### Step 3: Trace
|
|
324
|
+
|
|
325
|
+
- Add logging at key points
|
|
326
|
+
- Use debugger to step through code
|
|
327
|
+
- Check network requests/responses
|
|
328
|
+
|
|
329
|
+
### Step 4: Root Cause
|
|
330
|
+
|
|
331
|
+
- Identify the actual cause (not symptoms)
|
|
332
|
+
- Document findings
|
|
333
|
+
|
|
334
|
+
### Step 5: Fix & Verify
|
|
335
|
+
|
|
336
|
+
- Apply fix
|
|
337
|
+
- Write test that catches the bug
|
|
338
|
+
- Verify fix doesn't introduce regressions
|
|
339
|
+
|
|
340
|
+
## 6. Quick Fixes
|
|
341
|
+
|
|
342
|
+
### "Cannot read property of undefined"
|
|
343
|
+
|
|
344
|
+
```typescript
|
|
345
|
+
// Use optional chaining
|
|
346
|
+
const name = user?.profile?.name;
|
|
347
|
+
|
|
348
|
+
// With nullish coalescing
|
|
349
|
+
const name = user?.profile?.name ?? 'Unknown';
|
|
350
|
+
```
|
|
351
|
+
|
|
352
|
+
### "Expression has changed after it was checked"
|
|
353
|
+
|
|
354
|
+
```typescript
|
|
355
|
+
// Option 1: setTimeout
|
|
356
|
+
ngAfterViewInit() {
|
|
357
|
+
setTimeout(() => this.value = newValue);
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
// Option 2: ChangeDetectorRef
|
|
361
|
+
ngAfterViewInit() {
|
|
362
|
+
this.value = newValue;
|
|
363
|
+
this.cdr.detectChanges();
|
|
364
|
+
}
|
|
365
|
+
```
|
|
366
|
+
|
|
367
|
+
### "Circular dependency detected"
|
|
368
|
+
|
|
369
|
+
```typescript
|
|
370
|
+
// Use forwardRef
|
|
371
|
+
@Inject(forwardRef(() => ServiceB))
|
|
372
|
+
private serviceB: ServiceB
|
|
373
|
+
|
|
374
|
+
// Or refactor to remove circular dependency
|
|
375
|
+
```
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: maia-files-delete
|
|
3
|
+
description: Delete a file from Maia API temporary storage.
|
|
4
|
+
allowed-tools:
|
|
5
|
+
- Bash
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Maia Files Delete
|
|
9
|
+
|
|
10
|
+
Delete a file from Maia AI API temporary storage to free up space.
|
|
11
|
+
|
|
12
|
+
## API Endpoint
|
|
13
|
+
|
|
14
|
+
```
|
|
15
|
+
DELETE https://maia-ai-api.smartsoft.biz.pl/files/{id}
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## Usage
|
|
19
|
+
|
|
20
|
+
When given a file ID or URL, delete it:
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
curl -s -X DELETE https://maia-ai-api.smartsoft.biz.pl/files/{id}
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Process
|
|
27
|
+
|
|
28
|
+
1. Extract ID from input (can be full URL or just ID)
|
|
29
|
+
2. Send DELETE request
|
|
30
|
+
3. Confirm deletion
|
|
31
|
+
|
|
32
|
+
## Input Formats
|
|
33
|
+
|
|
34
|
+
Accept either:
|
|
35
|
+
|
|
36
|
+
- Full URL: `https://maia-ai-api.smartsoft.biz.pl/files/abc123`
|
|
37
|
+
- Just ID: `abc123`
|
|
38
|
+
|
|
39
|
+
## Output Format
|
|
40
|
+
|
|
41
|
+
After successful deletion:
|
|
42
|
+
|
|
43
|
+
```
|
|
44
|
+
Deleted: {id}
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## Batch Deletion
|
|
48
|
+
|
|
49
|
+
When given multiple IDs, delete them all:
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
for id in id1 id2 id3; do
|
|
53
|
+
curl -s -X DELETE "https://maia-ai-api.smartsoft.biz.pl/files/$id"
|
|
54
|
+
echo "Deleted: $id"
|
|
55
|
+
done
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
## Error Handling
|
|
59
|
+
|
|
60
|
+
If deletion fails, report the error but continue with remaining files.
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: maia-files-upload
|
|
3
|
+
description: Upload a file to Maia API temporary storage.
|
|
4
|
+
allowed-tools:
|
|
5
|
+
- Bash
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Maia Files Upload
|
|
9
|
+
|
|
10
|
+
Upload a file to the Maia AI API temporary storage and get a URL for use in Linear comments or markdown.
|
|
11
|
+
|
|
12
|
+
## API Endpoint
|
|
13
|
+
|
|
14
|
+
```
|
|
15
|
+
POST https://maia-ai-api.smartsoft.biz.pl/files
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## Usage
|
|
19
|
+
|
|
20
|
+
When given a file path, upload it:
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
curl -s -X POST https://maia-ai-api.smartsoft.biz.pl/files \
|
|
24
|
+
-F "file=@/path/to/file.png"
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Response
|
|
28
|
+
|
|
29
|
+
```json
|
|
30
|
+
{ "id": "abc123def456" }
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## Result URL
|
|
34
|
+
|
|
35
|
+
```
|
|
36
|
+
https://maia-ai-api.smartsoft.biz.pl/files/{id}
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## Process
|
|
40
|
+
|
|
41
|
+
1. Validate file exists: `test -f "/path/to/file" && echo "OK"`
|
|
42
|
+
2. Upload file using curl
|
|
43
|
+
3. Extract ID from JSON response
|
|
44
|
+
4. Return ID and full URL
|
|
45
|
+
|
|
46
|
+
## Output Format
|
|
47
|
+
|
|
48
|
+
After successful upload, return:
|
|
49
|
+
|
|
50
|
+
```
|
|
51
|
+
Uploaded: {filename}
|
|
52
|
+
ID: {id}
|
|
53
|
+
URL: https://maia-ai-api.smartsoft.biz.pl/files/{id}
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## Error Handling
|
|
57
|
+
|
|
58
|
+
If file doesn't exist or upload fails, report the error clearly.
|