feat: add Ollama proxy timeouts, SSH key migration, polish skills, and demo content
- Update all skill SSH commands from sshpass to key-based auth (~/.ssh/archipelago-deploy) - Add proxy_connect_timeout 120s to nginx Ollama location blocks - Add new polish/sweep skills for overnight automation - Add demo content (documents, photos) for demo stack - Add .ssh/ to .gitignore Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.6
parent
d3f0f1192e
commit
e8a0e1af19
@@ -0,0 +1,82 @@
|
||||
# Skill: Polish Error Handling
|
||||
|
||||
Fix silent error handling patterns across the entire codebase. Every async operation must have visible, actionable error feedback for the user.
|
||||
|
||||
## What to Fix
|
||||
|
||||
### Frontend (neode-ui/src/)
|
||||
|
||||
1. **Silent catch blocks**: Find and replace all `.catch(() => {})` patterns
|
||||
- Search: `grep -rn "catch.*=>.*{}" --include="*.vue" --include="*.ts" src/`
|
||||
- Replace with: proper error logging + user-visible feedback (toast, inline error, or modal)
|
||||
- Pattern:
|
||||
```typescript
|
||||
.catch((err) => {
|
||||
console.error('[ComponentName] operation failed:', err)
|
||||
errorMessage.value = formatError(err)
|
||||
})
|
||||
```
|
||||
|
||||
2. **Unhandled router.push**: Find `router.push(...).catch(() => {})`
|
||||
- Replace with: `router.push(...).catch(console.error)` minimum
|
||||
- Or handle NavigationDuplicated gracefully
|
||||
|
||||
3. **Silent try/catch**: Find `try { ... } catch { /* empty */ }`
|
||||
- Every catch block must either: log the error, show user feedback, or explicitly comment why it's safe to ignore
|
||||
|
||||
4. **Missing error states**: For each view, verify:
|
||||
- `ref<string | null>` error variable exists
|
||||
- Error is displayed in template (inline message, not just console)
|
||||
- Error clears on retry or navigation
|
||||
|
||||
### Backend (core/)
|
||||
|
||||
5. **Silent error swallowing**: Find `unwrap_or_default()` on serialization
|
||||
- Replace with proper error propagation or logging
|
||||
- Pattern: `.map_err(|e| anyhow::anyhow!("Serialization failed: {}", e))?`
|
||||
|
||||
6. **Error response consistency**: All RPC errors should use:
|
||||
- Consistent error codes (not random negative numbers)
|
||||
- Human-readable messages
|
||||
- Consistent JSON structure
|
||||
|
||||
## Verification
|
||||
|
||||
After fixes, run:
|
||||
```bash
|
||||
# Zero silent catches
|
||||
grep -rn "catch.*=>.*{}\|catch\s*{" neode-ui/src/ --include="*.vue" --include="*.ts" | grep -v node_modules | grep -v "console\|error\|log\|warn"
|
||||
|
||||
# Zero empty catch blocks
|
||||
grep -rn "catch.*{$" neode-ui/src/ --include="*.vue" --include="*.ts" -A1 | grep -P "^\d+-\s*\}"
|
||||
```
|
||||
|
||||
Both should return zero results.
|
||||
|
||||
## Error Display Pattern
|
||||
|
||||
Use this consistent pattern for user-facing errors:
|
||||
```typescript
|
||||
const errorMessage = ref<string | null>(null)
|
||||
|
||||
async function doAction() {
|
||||
errorMessage.value = null
|
||||
try {
|
||||
await rpcClient.someCall()
|
||||
} catch (err) {
|
||||
errorMessage.value = err instanceof Error ? err.message : 'Operation failed'
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Template:
|
||||
```vue
|
||||
<p v-if="errorMessage" class="text-red-400 text-sm mt-2">{{ errorMessage }}</p>
|
||||
```
|
||||
|
||||
## Deploy After Fixes
|
||||
|
||||
Always deploy and verify on live server after making changes:
|
||||
```bash
|
||||
./scripts/deploy-to-target.sh --live
|
||||
```
|
||||
Reference in New Issue
Block a user