specweave 0.1.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/INSTALL.md +848 -0
- package/LICENSE +21 -0
- package/README.md +675 -0
- package/SPECWEAVE.md +665 -0
- package/bin/install-agents.sh +57 -0
- package/bin/install-all.sh +49 -0
- package/bin/install-commands.sh +56 -0
- package/bin/install-skills.sh +57 -0
- package/bin/specweave.js +81 -0
- package/dist/adapters/adapter-base.d.ts +50 -0
- package/dist/adapters/adapter-base.d.ts.map +1 -0
- package/dist/adapters/adapter-base.js +146 -0
- package/dist/adapters/adapter-base.js.map +1 -0
- package/dist/adapters/adapter-interface.d.ts +108 -0
- package/dist/adapters/adapter-interface.d.ts.map +1 -0
- package/dist/adapters/adapter-interface.js +9 -0
- package/dist/adapters/adapter-interface.js.map +1 -0
- package/dist/adapters/claude/adapter.d.ts +54 -0
- package/dist/adapters/claude/adapter.d.ts.map +1 -0
- package/dist/adapters/claude/adapter.js +184 -0
- package/dist/adapters/claude/adapter.js.map +1 -0
- package/dist/adapters/copilot/adapter.d.ts +42 -0
- package/dist/adapters/copilot/adapter.d.ts.map +1 -0
- package/dist/adapters/copilot/adapter.js +239 -0
- package/dist/adapters/copilot/adapter.js.map +1 -0
- package/dist/adapters/cursor/adapter.d.ts +42 -0
- package/dist/adapters/cursor/adapter.d.ts.map +1 -0
- package/dist/adapters/cursor/adapter.js +297 -0
- package/dist/adapters/cursor/adapter.js.map +1 -0
- package/dist/adapters/generic/adapter.d.ts +40 -0
- package/dist/adapters/generic/adapter.d.ts.map +1 -0
- package/dist/adapters/generic/adapter.js +155 -0
- package/dist/adapters/generic/adapter.js.map +1 -0
- package/dist/cli/commands/init.d.ts +6 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +247 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/install.d.ts +7 -0
- package/dist/cli/commands/install.d.ts.map +1 -0
- package/dist/cli/commands/install.js +160 -0
- package/dist/cli/commands/install.js.map +1 -0
- package/dist/cli/commands/list.d.ts +6 -0
- package/dist/cli/commands/list.d.ts.map +1 -0
- package/dist/cli/commands/list.js +154 -0
- package/dist/cli/commands/list.js.map +1 -0
- package/package.json +90 -0
- package/src/adapters/README.md +312 -0
- package/src/adapters/adapter-base.ts +146 -0
- package/src/adapters/adapter-interface.ts +120 -0
- package/src/adapters/claude/README.md +241 -0
- package/src/adapters/claude/adapter.ts +157 -0
- package/src/adapters/copilot/.github/copilot/instructions.md +376 -0
- package/src/adapters/copilot/README.md +200 -0
- package/src/adapters/copilot/adapter.ts +210 -0
- package/src/adapters/cursor/.cursor/context/docs-context.md +62 -0
- package/src/adapters/cursor/.cursor/context/increments-context.md +71 -0
- package/src/adapters/cursor/.cursor/context/strategy-context.md +73 -0
- package/src/adapters/cursor/.cursor/context/tests-context.md +89 -0
- package/src/adapters/cursor/.cursorrules +325 -0
- package/src/adapters/cursor/README.md +243 -0
- package/src/adapters/cursor/adapter.ts +268 -0
- package/src/adapters/generic/README.md +277 -0
- package/src/adapters/generic/SPECWEAVE-MANUAL.md +676 -0
- package/src/adapters/generic/adapter.ts +159 -0
- package/src/adapters/registry.yaml +126 -0
- package/src/agents/architect/AGENT.md +416 -0
- package/src/agents/devops/AGENT.md +1738 -0
- package/src/agents/docs-writer/AGENT.md +239 -0
- package/src/agents/performance/AGENT.md +228 -0
- package/src/agents/pm/AGENT.md +751 -0
- package/src/agents/qa-lead/AGENT.md +150 -0
- package/src/agents/security/AGENT.md +179 -0
- package/src/agents/sre/AGENT.md +582 -0
- package/src/agents/sre/modules/backend-diagnostics.md +481 -0
- package/src/agents/sre/modules/database-diagnostics.md +509 -0
- package/src/agents/sre/modules/infrastructure.md +561 -0
- package/src/agents/sre/modules/monitoring.md +439 -0
- package/src/agents/sre/modules/security-incidents.md +421 -0
- package/src/agents/sre/modules/ui-diagnostics.md +302 -0
- package/src/agents/sre/playbooks/01-high-cpu-usage.md +204 -0
- package/src/agents/sre/playbooks/02-database-deadlock.md +241 -0
- package/src/agents/sre/playbooks/03-memory-leak.md +252 -0
- package/src/agents/sre/playbooks/04-slow-api-response.md +269 -0
- package/src/agents/sre/playbooks/05-ddos-attack.md +293 -0
- package/src/agents/sre/playbooks/06-disk-full.md +314 -0
- package/src/agents/sre/playbooks/07-service-down.md +333 -0
- package/src/agents/sre/playbooks/08-data-corruption.md +337 -0
- package/src/agents/sre/playbooks/09-cascade-failure.md +430 -0
- package/src/agents/sre/playbooks/10-rate-limit-exceeded.md +464 -0
- package/src/agents/sre/scripts/health-check.sh +230 -0
- package/src/agents/sre/scripts/log-analyzer.py +213 -0
- package/src/agents/sre/scripts/metrics-collector.sh +294 -0
- package/src/agents/sre/scripts/trace-analyzer.js +257 -0
- package/src/agents/sre/templates/incident-report.md +249 -0
- package/src/agents/sre/templates/mitigation-plan.md +375 -0
- package/src/agents/sre/templates/post-mortem.md +418 -0
- package/src/agents/sre/templates/runbook-template.md +412 -0
- package/src/agents/tech-lead/AGENT.md +263 -0
- package/src/commands/add-tasks.md +176 -0
- package/src/commands/close-increment.md +347 -0
- package/src/commands/create-increment.md +223 -0
- package/src/commands/create-project.md +528 -0
- package/src/commands/generate-docs.md +623 -0
- package/src/commands/list-increments.md +180 -0
- package/src/commands/review-docs.md +331 -0
- package/src/commands/start-increment.md +139 -0
- package/src/commands/sync-github.md +115 -0
- package/src/commands/validate-increment.md +800 -0
- package/src/hooks/README.md +252 -0
- package/src/hooks/docs-changed.sh +59 -0
- package/src/hooks/human-input-required.sh +55 -0
- package/src/hooks/post-task-completion.sh +57 -0
- package/src/hooks/pre-implementation.sh +47 -0
- package/src/skills/ado-sync/README.md +449 -0
- package/src/skills/ado-sync/SKILL.md +245 -0
- package/src/skills/ado-sync/test-cases/test-1.yaml +9 -0
- package/src/skills/ado-sync/test-cases/test-2.yaml +8 -0
- package/src/skills/ado-sync/test-cases/test-3.yaml +9 -0
- package/src/skills/bmad-method-expert/SKILL.md +628 -0
- package/src/skills/bmad-method-expert/scripts/analyze-project.js +318 -0
- package/src/skills/bmad-method-expert/scripts/check-setup.js +208 -0
- package/src/skills/bmad-method-expert/scripts/generate-template.js +1149 -0
- package/src/skills/bmad-method-expert/scripts/validate-documents.js +340 -0
- package/src/skills/bmad-method-expert/test-cases/test-1-placeholder.yaml +12 -0
- package/src/skills/bmad-method-expert/test-cases/test-2-placeholder.yaml +12 -0
- package/src/skills/bmad-method-expert/test-cases/test-3-placeholder.yaml +12 -0
- package/src/skills/brownfield-analyzer/SKILL.md +523 -0
- package/src/skills/brownfield-analyzer/test-cases/test-1-basic-analysis.yaml +48 -0
- package/src/skills/brownfield-analyzer/test-cases/test-2-placeholder.yaml +12 -0
- package/src/skills/brownfield-analyzer/test-cases/test-3-placeholder.yaml +12 -0
- package/src/skills/brownfield-onboarder/SKILL.md +625 -0
- package/src/skills/brownfield-onboarder/test-cases/test-1-placeholder.yaml +12 -0
- package/src/skills/brownfield-onboarder/test-cases/test-2-placeholder.yaml +12 -0
- package/src/skills/brownfield-onboarder/test-cases/test-3-placeholder.yaml +12 -0
- package/src/skills/calendar-system/test-cases/test-1-placeholder.yaml +12 -0
- package/src/skills/calendar-system/test-cases/test-2-placeholder.yaml +12 -0
- package/src/skills/calendar-system/test-cases/test-3-placeholder.yaml +12 -0
- package/src/skills/context-loader/SKILL.md +734 -0
- package/src/skills/context-loader/test-cases/test-1-basic-loading.yaml +39 -0
- package/src/skills/context-loader/test-cases/test-2-token-budget-exceeded.yaml +44 -0
- package/src/skills/context-loader/test-cases/test-3-section-anchors.yaml +45 -0
- package/src/skills/context-optimizer/SKILL.md +618 -0
- package/src/skills/context-optimizer/test-cases/test-1-bug-fix-narrow.yaml +97 -0
- package/src/skills/context-optimizer/test-cases/test-2-feature-focused.yaml +109 -0
- package/src/skills/context-optimizer/test-cases/test-3-architecture-broad.yaml +98 -0
- package/src/skills/cost-optimizer/SKILL.md +190 -0
- package/src/skills/cost-optimizer/test-cases/test-1-basic-comparison.yaml +75 -0
- package/src/skills/cost-optimizer/test-cases/test-2-budget-constraint.yaml +52 -0
- package/src/skills/cost-optimizer/test-cases/test-3-scale-requirement.yaml +63 -0
- package/src/skills/cost-optimizer/test-results/README.md +46 -0
- package/src/skills/design-system-architect/SKILL.md +107 -0
- package/src/skills/design-system-architect/test-cases/test-1-token-structure.yaml +23 -0
- package/src/skills/design-system-architect/test-cases/test-2-component-hierarchy.yaml +24 -0
- package/src/skills/design-system-architect/test-cases/test-3-accessibility-checklist.yaml +23 -0
- package/src/skills/diagrams-architect/SKILL.md +763 -0
- package/src/skills/diagrams-generator/SKILL.md +25 -0
- package/src/skills/diagrams-generator/test-cases/test-1.yaml +9 -0
- package/src/skills/diagrams-generator/test-cases/test-2.yaml +9 -0
- package/src/skills/diagrams-generator/test-cases/test-3.yaml +8 -0
- package/src/skills/docs-updater/README.md +48 -0
- package/src/skills/docs-updater/test-cases/test-1-placeholder.yaml +12 -0
- package/src/skills/docs-updater/test-cases/test-2-placeholder.yaml +12 -0
- package/src/skills/docs-updater/test-cases/test-3-placeholder.yaml +12 -0
- package/src/skills/dotnet-backend/SKILL.md +250 -0
- package/src/skills/e2e-playwright/README.md +506 -0
- package/src/skills/e2e-playwright/SKILL.md +457 -0
- package/src/skills/e2e-playwright/execute.js +373 -0
- package/src/skills/e2e-playwright/lib/utils.js +514 -0
- package/src/skills/e2e-playwright/package.json +33 -0
- package/src/skills/e2e-playwright/test-cases/TC-001-basic-navigation.yaml +54 -0
- package/src/skills/e2e-playwright/test-cases/TC-002-form-interaction.yaml +64 -0
- package/src/skills/e2e-playwright/test-cases/TC-003-specweave-integration.yaml +74 -0
- package/src/skills/e2e-playwright/test-cases/TC-004-accessibility-check.yaml +98 -0
- package/src/skills/figma-designer/SKILL.md +149 -0
- package/src/skills/figma-implementer/SKILL.md +148 -0
- package/src/skills/figma-mcp-connector/SKILL.md +136 -0
- package/src/skills/figma-mcp-connector/test-cases/test-1-read-file-desktop.yaml +22 -0
- package/src/skills/figma-mcp-connector/test-cases/test-2-read-file-framelink.yaml +21 -0
- package/src/skills/figma-mcp-connector/test-cases/test-3-error-handling.yaml +18 -0
- package/src/skills/figma-to-code/SKILL.md +128 -0
- package/src/skills/figma-to-code/test-cases/test-1-token-generation.yaml +29 -0
- package/src/skills/figma-to-code/test-cases/test-2-component-generation.yaml +27 -0
- package/src/skills/figma-to-code/test-cases/test-3-typescript-generation.yaml +28 -0
- package/src/skills/frontend/SKILL.md +177 -0
- package/src/skills/github-sync/SKILL.md +252 -0
- package/src/skills/github-sync/test-cases/test-1-placeholder.yaml +12 -0
- package/src/skills/github-sync/test-cases/test-2-placeholder.yaml +12 -0
- package/src/skills/github-sync/test-cases/test-3-placeholder.yaml +12 -0
- package/src/skills/hetzner-provisioner/README.md +308 -0
- package/src/skills/hetzner-provisioner/SKILL.md +251 -0
- package/src/skills/hetzner-provisioner/test-cases/test-1-basic-provision.yaml +71 -0
- package/src/skills/hetzner-provisioner/test-cases/test-2-postgres-provision.yaml +85 -0
- package/src/skills/hetzner-provisioner/test-cases/test-3-ssl-config.yaml +126 -0
- package/src/skills/hetzner-provisioner/test-results/README.md +259 -0
- package/src/skills/increment-planner/SKILL.md +889 -0
- package/src/skills/increment-planner/scripts/feature-utils.js +250 -0
- package/src/skills/increment-planner/test-cases/test-1-basic-feature.yaml +27 -0
- package/src/skills/increment-planner/test-cases/test-2-complex-feature.yaml +30 -0
- package/src/skills/increment-planner/test-cases/test-3-auto-numbering.yaml +24 -0
- package/src/skills/increment-quality-judge/SKILL.md +566 -0
- package/src/skills/increment-quality-judge/test-cases/test-1-good-spec.yaml +95 -0
- package/src/skills/increment-quality-judge/test-cases/test-2-poor-spec.yaml +108 -0
- package/src/skills/increment-quality-judge/test-cases/test-3-export-suggestions.yaml +87 -0
- package/src/skills/jira-sync/README.md +328 -0
- package/src/skills/jira-sync/SKILL.md +209 -0
- package/src/skills/jira-sync/test-cases/test-1.yaml +9 -0
- package/src/skills/jira-sync/test-cases/test-2.yaml +9 -0
- package/src/skills/jira-sync/test-cases/test-3.yaml +10 -0
- package/src/skills/nextjs/SKILL.md +176 -0
- package/src/skills/nodejs-backend/SKILL.md +181 -0
- package/src/skills/notification-system/test-cases/test-1-placeholder.yaml +12 -0
- package/src/skills/notification-system/test-cases/test-2-placeholder.yaml +12 -0
- package/src/skills/notification-system/test-cases/test-3-placeholder.yaml +12 -0
- package/src/skills/python-backend/SKILL.md +226 -0
- package/src/skills/role-orchestrator/README.md +197 -0
- package/src/skills/role-orchestrator/SKILL.md +1184 -0
- package/src/skills/role-orchestrator/test-cases/test-1-simple-product.yaml +98 -0
- package/src/skills/role-orchestrator/test-cases/test-2-quality-gate-failure.yaml +73 -0
- package/src/skills/role-orchestrator/test-cases/test-3-security-workflow.yaml +121 -0
- package/src/skills/role-orchestrator/test-cases/test-4-parallel-execution.yaml +145 -0
- package/src/skills/role-orchestrator/test-cases/test-5-feedback-loops.yaml +149 -0
- package/src/skills/skill-creator/LICENSE.txt +202 -0
- package/src/skills/skill-creator/SKILL.md +209 -0
- package/src/skills/skill-creator/scripts/init_skill.py +303 -0
- package/src/skills/skill-creator/scripts/package_skill.py +110 -0
- package/src/skills/skill-creator/scripts/quick_validate.py +65 -0
- package/src/skills/skill-creator/test-cases/test-1-placeholder.yaml +12 -0
- package/src/skills/skill-creator/test-cases/test-2-placeholder.yaml +12 -0
- package/src/skills/skill-creator/test-cases/test-3-placeholder.yaml +12 -0
- package/src/skills/skill-router/SKILL.md +497 -0
- package/src/skills/skill-router/test-cases/test-1-basic-routing.yaml +33 -0
- package/src/skills/skill-router/test-cases/test-2-ambiguous-request.yaml +42 -0
- package/src/skills/skill-router/test-cases/test-3-nested-orchestration.yaml +50 -0
- package/src/skills/spec-driven-brainstorming/README.md +264 -0
- package/src/skills/spec-driven-brainstorming/SKILL.md +439 -0
- package/src/skills/spec-driven-brainstorming/test-cases/TC-001-simple-idea-to-design.yaml +148 -0
- package/src/skills/spec-driven-brainstorming/test-cases/TC-002-complex-ultrathink-design.yaml +190 -0
- package/src/skills/spec-driven-brainstorming/test-cases/TC-003-unclear-requirements-socratic.yaml +233 -0
- package/src/skills/spec-driven-debugging/README.md +479 -0
- package/src/skills/spec-driven-debugging/SKILL.md +652 -0
- package/src/skills/spec-driven-debugging/test-cases/TC-001-simple-auth-bug.yaml +212 -0
- package/src/skills/spec-driven-debugging/test-cases/TC-002-race-condition-ultrathink.yaml +461 -0
- package/src/skills/spec-driven-debugging/test-cases/TC-003-brownfield-missing-spec.yaml +366 -0
- package/src/skills/spec-kit-expert/SKILL.md +1012 -0
- package/src/skills/spec-kit-expert/test-cases/test-1-placeholder.yaml +12 -0
- package/src/skills/spec-kit-expert/test-cases/test-2-placeholder.yaml +12 -0
- package/src/skills/spec-kit-expert/test-cases/test-3-placeholder.yaml +12 -0
- package/src/skills/specweave-ado-mapper/SKILL.md +501 -0
- package/src/skills/specweave-detector/SKILL.md +420 -0
- package/src/skills/specweave-detector/test-cases/test-1-basic-detection.yaml +37 -0
- package/src/skills/specweave-detector/test-cases/test-2-missing-config.yaml +37 -0
- package/src/skills/specweave-detector/test-cases/test-3-non-specweave-project.yaml +34 -0
- package/src/skills/specweave-jira-mapper/SKILL.md +500 -0
- package/src/skills/stripe-integrator/test-cases/test-1-placeholder.yaml +12 -0
- package/src/skills/stripe-integrator/test-cases/test-2-placeholder.yaml +12 -0
- package/src/skills/stripe-integrator/test-cases/test-3-placeholder.yaml +12 -0
- package/src/skills/task-builder/README.md +90 -0
- package/src/skills/task-builder/test-cases/test-1-placeholder.yaml +12 -0
- package/src/skills/task-builder/test-cases/test-2-placeholder.yaml +12 -0
- package/src/skills/task-builder/test-cases/test-3-placeholder.yaml +12 -0
- package/src/templates/.env.example +144 -0
- package/src/templates/.gitignore.template +81 -0
- package/src/templates/CLAUDE.md.template +383 -0
- package/src/templates/README.md.template +240 -0
- package/src/templates/config.yaml +333 -0
- package/src/templates/docs/README.md +124 -0
- package/src/templates/docs/adr-template.md +118 -0
- package/src/templates/docs/hld-template.md +220 -0
- package/src/templates/docs/lld-template.md +580 -0
- package/src/templates/docs/prd-template.md +132 -0
- package/src/templates/docs/rfc-template.md +229 -0
- package/src/templates/docs/runbook-template.md +298 -0
- package/src/templates/environments/minimal/.env.production +16 -0
- package/src/templates/environments/minimal/README.md +54 -0
- package/src/templates/environments/minimal/deploy-production.yml +52 -0
- package/src/templates/environments/progressive/.env.qa +28 -0
- package/src/templates/environments/progressive/README.md +129 -0
- package/src/templates/environments/progressive/deploy-production.yml +93 -0
- package/src/templates/environments/progressive/deploy-qa.yml +62 -0
- package/src/templates/environments/progressive/deploy-staging.yml +67 -0
- package/src/templates/environments/standard/.env.development +20 -0
- package/src/templates/environments/standard/.env.production +30 -0
- package/src/templates/environments/standard/.env.staging +23 -0
- package/src/templates/environments/standard/README.md +97 -0
- package/src/templates/environments/standard/deploy-production.yml +68 -0
- package/src/templates/environments/standard/deploy-staging.yml +61 -0
- package/src/templates/environments/standard/docker-compose.yml +43 -0
- package/src/templates/increment-metadata-template.yaml +138 -0
|
@@ -0,0 +1,421 @@
|
|
|
1
|
+
# Security Incidents
|
|
2
|
+
|
|
3
|
+
**Purpose**: Respond to security breaches, DDoS attacks, and unauthorized access attempts.
|
|
4
|
+
|
|
5
|
+
**IMPORTANT**: For security incidents, SRE Agent collaborates with `security-agent` skill.
|
|
6
|
+
|
|
7
|
+
## Incident Response Protocol
|
|
8
|
+
|
|
9
|
+
### SEV1 Security Incidents (CRITICAL)
|
|
10
|
+
|
|
11
|
+
**Immediate Actions** (First 5 minutes):
|
|
12
|
+
1. **Isolate** affected systems
|
|
13
|
+
2. **Preserve** evidence (logs, snapshots)
|
|
14
|
+
3. **Notify** security team and management
|
|
15
|
+
4. **Assess** scope of breach
|
|
16
|
+
5. **Document** timeline
|
|
17
|
+
|
|
18
|
+
**DO NOT**:
|
|
19
|
+
- Delete logs (preserve evidence)
|
|
20
|
+
- Reboot systems (unless absolutely necessary)
|
|
21
|
+
- Make changes without documenting
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## Common Security Incidents
|
|
26
|
+
|
|
27
|
+
### 1. DDoS Attack
|
|
28
|
+
|
|
29
|
+
**Symptoms**:
|
|
30
|
+
- Sudden traffic spike (10x-100x normal)
|
|
31
|
+
- Legitimate users can't access service
|
|
32
|
+
- High bandwidth usage
|
|
33
|
+
- Server overload
|
|
34
|
+
|
|
35
|
+
**Diagnosis**:
|
|
36
|
+
|
|
37
|
+
#### Check Traffic Patterns
|
|
38
|
+
```bash
|
|
39
|
+
# Check connections by IP
|
|
40
|
+
netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr | head -20
|
|
41
|
+
|
|
42
|
+
# Check HTTP requests by IP (nginx)
|
|
43
|
+
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -20
|
|
44
|
+
|
|
45
|
+
# Check requests per second
|
|
46
|
+
tail -f /var/log/nginx/access.log | awk '{print $4}' | uniq -c
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
**Red flags**:
|
|
50
|
+
- Single IP making thousands of requests
|
|
51
|
+
- Requests from suspicious IPs (botnets)
|
|
52
|
+
- High rate of 4xx errors (probing)
|
|
53
|
+
- Unusual traffic patterns
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
#### Immediate Mitigation
|
|
58
|
+
```bash
|
|
59
|
+
# 1. Rate limiting (nginx)
|
|
60
|
+
# Add to nginx.conf:
|
|
61
|
+
limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;
|
|
62
|
+
limit_req zone=one burst=20 nodelay;
|
|
63
|
+
|
|
64
|
+
# 2. Block suspicious IPs (iptables)
|
|
65
|
+
iptables -A INPUT -s <ATTACKER_IP> -j DROP
|
|
66
|
+
|
|
67
|
+
# 3. Enable DDoS protection (CloudFlare, AWS Shield)
|
|
68
|
+
# CloudFlare: Enable "I'm Under Attack" mode
|
|
69
|
+
# AWS: Enable AWS Shield Standard/Advanced
|
|
70
|
+
|
|
71
|
+
# 4. Increase capacity (auto-scaling)
|
|
72
|
+
# Scale up to handle traffic (if legitimate)
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
---
|
|
76
|
+
|
|
77
|
+
### 2. Unauthorized Access / Data Breach
|
|
78
|
+
|
|
79
|
+
**Symptoms**:
|
|
80
|
+
- Alerts for failed login attempts
|
|
81
|
+
- Successful login from unusual location
|
|
82
|
+
- Unusual data access patterns
|
|
83
|
+
- Data exfiltration detected
|
|
84
|
+
|
|
85
|
+
**Diagnosis**:
|
|
86
|
+
|
|
87
|
+
#### Check Access Logs
|
|
88
|
+
```bash
|
|
89
|
+
# Check authentication logs (Linux)
|
|
90
|
+
grep "Failed password" /var/log/auth.log | tail -50
|
|
91
|
+
|
|
92
|
+
# Check successful logins
|
|
93
|
+
grep "Accepted password" /var/log/auth.log | tail -50
|
|
94
|
+
|
|
95
|
+
# Check login attempts by IP
|
|
96
|
+
awk '/Failed password/ {print $(NF-3)}' /var/log/auth.log | sort | uniq -c | sort -nr
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
**Red flags**:
|
|
100
|
+
- Hundreds of failed login attempts (brute force)
|
|
101
|
+
- Successful login from suspicious IP/location
|
|
102
|
+
- Login at unusual time (3am)
|
|
103
|
+
- Multiple accounts accessed from same IP
|
|
104
|
+
|
|
105
|
+
---
|
|
106
|
+
|
|
107
|
+
#### Immediate Response (SEV1)
|
|
108
|
+
```bash
|
|
109
|
+
# 1. ISOLATE: Disable compromised account
|
|
110
|
+
# Application-level:
|
|
111
|
+
UPDATE users SET disabled = true WHERE id = <COMPROMISED_USER_ID>;
|
|
112
|
+
|
|
113
|
+
# System-level:
|
|
114
|
+
passwd -l <username> # Lock account
|
|
115
|
+
|
|
116
|
+
# 2. PRESERVE: Copy logs for forensics
|
|
117
|
+
cp /var/log/auth.log /forensics/auth.log.$(date +%Y%m%d)
|
|
118
|
+
cp /var/log/nginx/access.log /forensics/access.log.$(date +%Y%m%d)
|
|
119
|
+
|
|
120
|
+
# 3. ASSESS: Check what was accessed
|
|
121
|
+
# Database audit logs
|
|
122
|
+
# Application logs
|
|
123
|
+
# File access logs
|
|
124
|
+
|
|
125
|
+
# 4. NOTIFY: Alert security team
|
|
126
|
+
# Email, Slack, PagerDuty
|
|
127
|
+
|
|
128
|
+
# 5. DOCUMENT: Create incident timeline
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
---
|
|
132
|
+
|
|
133
|
+
#### Long-term Mitigation
|
|
134
|
+
- Force password reset for all users
|
|
135
|
+
- Enable 2FA/MFA
|
|
136
|
+
- Review access controls
|
|
137
|
+
- Conduct security audit
|
|
138
|
+
- Update security policies
|
|
139
|
+
- Train users on security
|
|
140
|
+
|
|
141
|
+
---
|
|
142
|
+
|
|
143
|
+
### 3. SQL Injection Attempt
|
|
144
|
+
|
|
145
|
+
**Symptoms**:
|
|
146
|
+
- Unusual SQL queries in logs
|
|
147
|
+
- 500 errors with SQL syntax messages
|
|
148
|
+
- Alerts from WAF (Web Application Firewall)
|
|
149
|
+
|
|
150
|
+
**Diagnosis**:
|
|
151
|
+
|
|
152
|
+
#### Check Application Logs
|
|
153
|
+
```bash
|
|
154
|
+
# Look for SQL injection patterns
|
|
155
|
+
grep -E "(SELECT|INSERT|UPDATE|DELETE).*FROM.*WHERE" /var/log/application.log
|
|
156
|
+
|
|
157
|
+
# Look for SQL errors
|
|
158
|
+
grep "SQLException\|SQL syntax" /var/log/application.log
|
|
159
|
+
|
|
160
|
+
# Check for malicious patterns
|
|
161
|
+
grep -E "(\'\s*OR\s*\'|\-\-|UNION\s+SELECT)" /var/log/nginx/access.log
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
**Example Malicious Request**:
|
|
165
|
+
```
|
|
166
|
+
GET /api/users?id=1' OR '1'='1
|
|
167
|
+
GET /api/users?id=1; DROP TABLE users;--
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
---
|
|
171
|
+
|
|
172
|
+
#### Immediate Response
|
|
173
|
+
```bash
|
|
174
|
+
# 1. Block attacker IP
|
|
175
|
+
iptables -A INPUT -s <ATTACKER_IP> -j DROP
|
|
176
|
+
|
|
177
|
+
# 2. Enable WAF rule (ModSecurity, AWS WAF)
|
|
178
|
+
# Block requests with SQL keywords
|
|
179
|
+
|
|
180
|
+
# 3. Check database for unauthorized changes
|
|
181
|
+
# Compare current schema with backup
|
|
182
|
+
# Check audit logs for suspicious queries
|
|
183
|
+
|
|
184
|
+
# 4. Review application code
|
|
185
|
+
# Use parameterized queries, not string concatenation
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
**Long-term Fix**:
|
|
189
|
+
```javascript
|
|
190
|
+
// BAD: SQL injection vulnerable
|
|
191
|
+
const query = `SELECT * FROM users WHERE id = ${req.query.id}`;
|
|
192
|
+
|
|
193
|
+
// GOOD: Parameterized query
|
|
194
|
+
const query = 'SELECT * FROM users WHERE id = ?';
|
|
195
|
+
db.query(query, [req.query.id]);
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
---
|
|
199
|
+
|
|
200
|
+
### 4. Malware / Crypto Mining
|
|
201
|
+
|
|
202
|
+
**Symptoms**:
|
|
203
|
+
- High CPU usage (100%)
|
|
204
|
+
- Unusual network traffic (to crypto pool)
|
|
205
|
+
- Unknown processes running
|
|
206
|
+
- Server slow
|
|
207
|
+
|
|
208
|
+
**Diagnosis**:
|
|
209
|
+
|
|
210
|
+
#### Check Running Processes
|
|
211
|
+
```bash
|
|
212
|
+
# Check CPU usage by process
|
|
213
|
+
top -bn1 | head -20
|
|
214
|
+
|
|
215
|
+
# Check all processes
|
|
216
|
+
ps aux | sort -nrk 3,3 | head -20
|
|
217
|
+
|
|
218
|
+
# Check for suspicious processes
|
|
219
|
+
ps aux | grep -v -E "^(root|www-data|mysql|postgres)"
|
|
220
|
+
|
|
221
|
+
# Check network connections
|
|
222
|
+
netstat -tunap | grep ESTABLISHED
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
**Red flags**:
|
|
226
|
+
- Unknown process using 100% CPU
|
|
227
|
+
- Connections to crypto mining pools
|
|
228
|
+
- Processes running as unexpected user
|
|
229
|
+
- Processes with random names (xmrig, minerd)
|
|
230
|
+
|
|
231
|
+
---
|
|
232
|
+
|
|
233
|
+
#### Immediate Response
|
|
234
|
+
```bash
|
|
235
|
+
# 1. Kill malicious process
|
|
236
|
+
kill -9 <PID>
|
|
237
|
+
|
|
238
|
+
# 2. Find and remove malware
|
|
239
|
+
find / -name "<PROCESS_NAME>" -delete
|
|
240
|
+
|
|
241
|
+
# 3. Check for persistence mechanisms
|
|
242
|
+
crontab -l # Cron jobs
|
|
243
|
+
cat /etc/rc.local # Startup scripts
|
|
244
|
+
systemctl list-unit-files # Systemd services
|
|
245
|
+
|
|
246
|
+
# 4. Change all credentials
|
|
247
|
+
# Root password
|
|
248
|
+
# SSH keys
|
|
249
|
+
# Database passwords
|
|
250
|
+
# API keys
|
|
251
|
+
|
|
252
|
+
# 5. Restore from clean backup (if available)
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
---
|
|
256
|
+
|
|
257
|
+
### 5. Insider Threat / Data Exfiltration
|
|
258
|
+
|
|
259
|
+
**Symptoms**:
|
|
260
|
+
- Large data downloads
|
|
261
|
+
- Database dump exports
|
|
262
|
+
- Unusual file transfers
|
|
263
|
+
- After-hours access
|
|
264
|
+
|
|
265
|
+
**Diagnosis**:
|
|
266
|
+
|
|
267
|
+
#### Check Data Access Logs
|
|
268
|
+
```bash
|
|
269
|
+
# Check database queries (large exports)
|
|
270
|
+
grep "SELECT.*FROM" /var/log/postgresql/postgresql.log | grep -E "LIMIT\s+[0-9]{5,}"
|
|
271
|
+
|
|
272
|
+
# Check file downloads (nginx)
|
|
273
|
+
awk '$10 > 10000000 {print $1, $7, $10}' /var/log/nginx/access.log
|
|
274
|
+
|
|
275
|
+
# Check SSH file transfers
|
|
276
|
+
grep "sftp\|scp" /var/log/auth.log
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
**Red flags**:
|
|
280
|
+
- SELECT with no LIMIT (full table export)
|
|
281
|
+
- Large file downloads (>10MB)
|
|
282
|
+
- Multiple consecutive downloads
|
|
283
|
+
- Access from unusual location
|
|
284
|
+
|
|
285
|
+
---
|
|
286
|
+
|
|
287
|
+
#### Immediate Response
|
|
288
|
+
```bash
|
|
289
|
+
# 1. Disable account
|
|
290
|
+
UPDATE users SET disabled = true WHERE id = <USER_ID>;
|
|
291
|
+
|
|
292
|
+
# 2. Preserve evidence
|
|
293
|
+
cp /var/log/* /forensics/
|
|
294
|
+
|
|
295
|
+
# 3. Assess damage
|
|
296
|
+
# What data was accessed?
|
|
297
|
+
# What data was exported?
|
|
298
|
+
# What systems were compromised?
|
|
299
|
+
|
|
300
|
+
# 4. Legal/compliance notification
|
|
301
|
+
# GDPR: Notify within 72 hours
|
|
302
|
+
# HIPAA: Notify within 60 days
|
|
303
|
+
# PCI-DSS: Immediate notification
|
|
304
|
+
|
|
305
|
+
# 5. Incident report
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
---
|
|
309
|
+
|
|
310
|
+
## Security Incident Checklist
|
|
311
|
+
|
|
312
|
+
**When security incident detected**:
|
|
313
|
+
|
|
314
|
+
### Phase 1: Immediate Response (0-5 min)
|
|
315
|
+
- [ ] Classify severity (SEV1/SEV2/SEV3)
|
|
316
|
+
- [ ] Isolate affected systems
|
|
317
|
+
- [ ] Preserve evidence (logs, snapshots)
|
|
318
|
+
- [ ] Notify security team
|
|
319
|
+
- [ ] Document timeline (start timestamp)
|
|
320
|
+
|
|
321
|
+
### Phase 2: Assessment (5-30 min)
|
|
322
|
+
- [ ] Identify attack vector
|
|
323
|
+
- [ ] Assess scope (what was compromised?)
|
|
324
|
+
- [ ] Check for data exfiltration
|
|
325
|
+
- [ ] Identify attacker (IP, location, identity)
|
|
326
|
+
- [ ] Determine if ongoing or stopped
|
|
327
|
+
|
|
328
|
+
### Phase 3: Containment (30 min - 2 hours)
|
|
329
|
+
- [ ] Block attacker access
|
|
330
|
+
- [ ] Close vulnerability
|
|
331
|
+
- [ ] Revoke compromised credentials
|
|
332
|
+
- [ ] Remove malware/backdoors
|
|
333
|
+
- [ ] Restore from clean backup (if needed)
|
|
334
|
+
|
|
335
|
+
### Phase 4: Recovery (2 hours - days)
|
|
336
|
+
- [ ] Restore normal operations
|
|
337
|
+
- [ ] Verify no persistence mechanisms
|
|
338
|
+
- [ ] Monitor for re-infection
|
|
339
|
+
- [ ] Change all credentials
|
|
340
|
+
- [ ] Apply security patches
|
|
341
|
+
|
|
342
|
+
### Phase 5: Post-Incident (1 week)
|
|
343
|
+
- [ ] Complete post-mortem
|
|
344
|
+
- [ ] Legal/compliance notifications
|
|
345
|
+
- [ ] Security audit
|
|
346
|
+
- [ ] Update security policies
|
|
347
|
+
- [ ] Train team on lessons learned
|
|
348
|
+
|
|
349
|
+
---
|
|
350
|
+
|
|
351
|
+
## Collaboration with Security Agent
|
|
352
|
+
|
|
353
|
+
**SRE Agent Role**:
|
|
354
|
+
- Initial detection and triage
|
|
355
|
+
- Immediate containment
|
|
356
|
+
- Preserve evidence
|
|
357
|
+
- Restore service
|
|
358
|
+
|
|
359
|
+
**Security Agent Role** (handoff):
|
|
360
|
+
- Forensic analysis
|
|
361
|
+
- Legal compliance
|
|
362
|
+
- Security audit
|
|
363
|
+
- Policy updates
|
|
364
|
+
|
|
365
|
+
**Handoff Protocol**:
|
|
366
|
+
```
|
|
367
|
+
SRE: Detects security incident → Immediate containment
|
|
368
|
+
SRE: Preserves evidence → Creates incident report
|
|
369
|
+
SRE: Hands off to Security Agent
|
|
370
|
+
Security Agent: Forensic analysis → Legal compliance → Long-term fixes
|
|
371
|
+
SRE: Implements security fixes → Updates runbook
|
|
372
|
+
```
|
|
373
|
+
|
|
374
|
+
---
|
|
375
|
+
|
|
376
|
+
## Security Metrics
|
|
377
|
+
|
|
378
|
+
**Detection Time**:
|
|
379
|
+
- SEV1: <5 minutes from first indicator
|
|
380
|
+
- SEV2: <30 minutes
|
|
381
|
+
- SEV3: <24 hours
|
|
382
|
+
|
|
383
|
+
**Response Time**:
|
|
384
|
+
- SEV1: Containment within 30 minutes
|
|
385
|
+
- SEV2: Containment within 2 hours
|
|
386
|
+
- SEV3: Containment within 24 hours
|
|
387
|
+
|
|
388
|
+
**False Positives**:
|
|
389
|
+
- Target: <5% of security alerts
|
|
390
|
+
|
|
391
|
+
---
|
|
392
|
+
|
|
393
|
+
## Related Documentation
|
|
394
|
+
|
|
395
|
+
- [SKILL.md](../SKILL.md) - Main SRE agent
|
|
396
|
+
- [infrastructure.md](infrastructure.md) - Server security hardening
|
|
397
|
+
- [monitoring.md](monitoring.md) - Security monitoring setup
|
|
398
|
+
- `security-agent` skill - Full security expertise (handoff for forensics)
|
|
399
|
+
|
|
400
|
+
---
|
|
401
|
+
|
|
402
|
+
## Important Notes
|
|
403
|
+
|
|
404
|
+
**For SRE Agent**:
|
|
405
|
+
- Focus on IMMEDIATE containment and service restoration
|
|
406
|
+
- Preserve evidence (don't delete logs!)
|
|
407
|
+
- Hand off to `security-agent` for forensic analysis
|
|
408
|
+
- Document everything with timestamps
|
|
409
|
+
- Blameless post-mortem (focus on systems, not people)
|
|
410
|
+
|
|
411
|
+
**Legal Compliance**:
|
|
412
|
+
- GDPR: Notify within 72 hours of breach
|
|
413
|
+
- HIPAA: Notify within 60 days
|
|
414
|
+
- PCI-DSS: Immediate notification to card brands
|
|
415
|
+
- SOC 2: Document in audit trail
|
|
416
|
+
|
|
417
|
+
**Evidence Preservation**:
|
|
418
|
+
- Copy logs before any changes
|
|
419
|
+
- Take disk/memory snapshots
|
|
420
|
+
- Document all actions taken
|
|
421
|
+
- Preserve chain of custody
|
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
# UI/Frontend Diagnostics
|
|
2
|
+
|
|
3
|
+
**Purpose**: Troubleshoot frontend performance, rendering, and user experience issues.
|
|
4
|
+
|
|
5
|
+
## Common UI Issues
|
|
6
|
+
|
|
7
|
+
### 1. Slow Page Load
|
|
8
|
+
|
|
9
|
+
**Symptoms**:
|
|
10
|
+
- Users report long loading times
|
|
11
|
+
- Lighthouse score <50
|
|
12
|
+
- Time to Interactive (TTI) >5 seconds
|
|
13
|
+
|
|
14
|
+
**Diagnosis**:
|
|
15
|
+
|
|
16
|
+
#### Check Bundle Size
|
|
17
|
+
```bash
|
|
18
|
+
# Check JavaScript bundle size
|
|
19
|
+
ls -lh dist/*.js
|
|
20
|
+
|
|
21
|
+
# Analyze bundle composition
|
|
22
|
+
npx webpack-bundle-analyzer dist/stats.json
|
|
23
|
+
|
|
24
|
+
# Check for large dependencies
|
|
25
|
+
npm ls --depth=0
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
**Red flags**:
|
|
29
|
+
- Main bundle >500KB
|
|
30
|
+
- Unused dependencies in bundle
|
|
31
|
+
- Multiple copies of same library
|
|
32
|
+
|
|
33
|
+
**Mitigation**:
|
|
34
|
+
- Code splitting: `import()` for dynamic imports
|
|
35
|
+
- Tree shaking: Remove unused code
|
|
36
|
+
- Lazy loading: Load components on demand
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
#### Check Network Requests
|
|
41
|
+
```bash
|
|
42
|
+
# Chrome DevTools → Network tab
|
|
43
|
+
# Look for:
|
|
44
|
+
# - Number of requests (>100 = too many)
|
|
45
|
+
# - Large assets (images >200KB)
|
|
46
|
+
# - Slow API calls (>1s)
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
**Red flags**:
|
|
50
|
+
- Waterfall pattern (sequential loading)
|
|
51
|
+
- Large uncompressed images
|
|
52
|
+
- Blocking requests
|
|
53
|
+
|
|
54
|
+
**Mitigation**:
|
|
55
|
+
- Image optimization: WebP, lazy loading
|
|
56
|
+
- HTTP/2: Multiplexing
|
|
57
|
+
- CDN: Cache static assets
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
#### Check Render Performance
|
|
62
|
+
```bash
|
|
63
|
+
# Chrome DevTools → Performance tab
|
|
64
|
+
# Record page load, check:
|
|
65
|
+
# - Long tasks (>50ms)
|
|
66
|
+
# - Layout thrashing
|
|
67
|
+
# - JavaScript execution time
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
**Red flags**:
|
|
71
|
+
- Long tasks blocking main thread
|
|
72
|
+
- Multiple layout recalculations
|
|
73
|
+
- Heavy JavaScript computation
|
|
74
|
+
|
|
75
|
+
**Mitigation**:
|
|
76
|
+
- Web Workers: Move heavy computation off main thread
|
|
77
|
+
- requestIdleCallback: Defer non-critical work
|
|
78
|
+
- Virtual scrolling: Render only visible items
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
### 2. Memory Leak (UI)
|
|
83
|
+
|
|
84
|
+
**Symptoms**:
|
|
85
|
+
- Browser tab becomes slow over time
|
|
86
|
+
- Memory usage increases continuously
|
|
87
|
+
- Browser eventually crashes
|
|
88
|
+
|
|
89
|
+
**Diagnosis**:
|
|
90
|
+
|
|
91
|
+
#### Chrome DevTools → Memory
|
|
92
|
+
```bash
|
|
93
|
+
# Take heap snapshot before/after user interaction
|
|
94
|
+
# Compare snapshots
|
|
95
|
+
# Look for:
|
|
96
|
+
# - Detached DOM nodes
|
|
97
|
+
# - Event listeners not removed
|
|
98
|
+
# - Growing arrays/objects
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
**Red flags**:
|
|
102
|
+
- Detached DOM elements increasing
|
|
103
|
+
- Event listeners not garbage collected
|
|
104
|
+
- Timers/intervals not cleared
|
|
105
|
+
|
|
106
|
+
**Mitigation**:
|
|
107
|
+
```javascript
|
|
108
|
+
// Clean up event listeners
|
|
109
|
+
componentWillUnmount() {
|
|
110
|
+
element.removeEventListener('click', handler);
|
|
111
|
+
clearInterval(this.intervalId);
|
|
112
|
+
clearTimeout(this.timeoutId);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// Use WeakMap for DOM references
|
|
116
|
+
const cache = new WeakMap();
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
### 3. Unresponsive UI
|
|
122
|
+
|
|
123
|
+
**Symptoms**:
|
|
124
|
+
- Clicks don't register
|
|
125
|
+
- Input lag
|
|
126
|
+
- Frozen UI
|
|
127
|
+
|
|
128
|
+
**Diagnosis**:
|
|
129
|
+
|
|
130
|
+
#### Check Main Thread
|
|
131
|
+
```bash
|
|
132
|
+
# Chrome DevTools → Performance
|
|
133
|
+
# Look for:
|
|
134
|
+
# - Long tasks (>50ms)
|
|
135
|
+
# - Blocking JavaScript
|
|
136
|
+
# - Forced synchronous layout
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
**Red flags**:
|
|
140
|
+
- JavaScript blocking >100ms
|
|
141
|
+
- Synchronous XHR requests
|
|
142
|
+
- Layout thrashing (read → write → read)
|
|
143
|
+
|
|
144
|
+
**Mitigation**:
|
|
145
|
+
```javascript
|
|
146
|
+
// Break up long tasks
|
|
147
|
+
async function processLargeArray(items) {
|
|
148
|
+
for (let i = 0; i < items.length; i++) {
|
|
149
|
+
await processItem(items[i]);
|
|
150
|
+
|
|
151
|
+
// Yield to main thread every 100 items
|
|
152
|
+
if (i % 100 === 0) {
|
|
153
|
+
await new Promise(resolve => setTimeout(resolve, 0));
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
// Use requestIdleCallback
|
|
159
|
+
requestIdleCallback(() => {
|
|
160
|
+
// Non-critical work
|
|
161
|
+
});
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
---
|
|
165
|
+
|
|
166
|
+
### 4. White Screen / Failed Render
|
|
167
|
+
|
|
168
|
+
**Symptoms**:
|
|
169
|
+
- Blank page
|
|
170
|
+
- Error boundary triggered
|
|
171
|
+
- Console errors
|
|
172
|
+
|
|
173
|
+
**Diagnosis**:
|
|
174
|
+
|
|
175
|
+
#### Check Console Errors
|
|
176
|
+
```bash
|
|
177
|
+
# Chrome DevTools → Console
|
|
178
|
+
# Look for:
|
|
179
|
+
# - Uncaught exceptions
|
|
180
|
+
# - Network errors (failed chunks)
|
|
181
|
+
# - CORS errors
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
**Common causes**:
|
|
185
|
+
- JavaScript error in render
|
|
186
|
+
- Failed to load chunk (code splitting)
|
|
187
|
+
- CORS blocking API calls
|
|
188
|
+
- Missing dependencies
|
|
189
|
+
|
|
190
|
+
**Mitigation**:
|
|
191
|
+
```javascript
|
|
192
|
+
// Error boundary
|
|
193
|
+
class ErrorBoundary extends React.Component {
|
|
194
|
+
componentDidCatch(error, errorInfo) {
|
|
195
|
+
logErrorToService(error, errorInfo);
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
render() {
|
|
199
|
+
if (this.state.hasError) {
|
|
200
|
+
return <ErrorFallback />;
|
|
201
|
+
}
|
|
202
|
+
return this.props.children;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
// Retry failed chunk loads
|
|
207
|
+
const retryImport = (fn, retriesLeft = 3) => {
|
|
208
|
+
return new Promise((resolve, reject) => {
|
|
209
|
+
fn()
|
|
210
|
+
.then(resolve)
|
|
211
|
+
.catch(error => {
|
|
212
|
+
if (retriesLeft === 0) {
|
|
213
|
+
reject(error);
|
|
214
|
+
} else {
|
|
215
|
+
setTimeout(() => {
|
|
216
|
+
retryImport(fn, retriesLeft - 1).then(resolve, reject);
|
|
217
|
+
}, 1000);
|
|
218
|
+
}
|
|
219
|
+
});
|
|
220
|
+
});
|
|
221
|
+
};
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
---
|
|
225
|
+
|
|
226
|
+
## UI Performance Metrics
|
|
227
|
+
|
|
228
|
+
**Core Web Vitals**:
|
|
229
|
+
- **LCP** (Largest Contentful Paint): <2.5s (good), <4s (needs improvement), >4s (poor)
|
|
230
|
+
- **FID** (First Input Delay): <100ms (good), <300ms (needs improvement), >300ms (poor)
|
|
231
|
+
- **CLS** (Cumulative Layout Shift): <0.1 (good), <0.25 (needs improvement), >0.25 (poor)
|
|
232
|
+
|
|
233
|
+
**Other Metrics**:
|
|
234
|
+
- **TTFB** (Time to First Byte): <200ms
|
|
235
|
+
- **FCP** (First Contentful Paint): <1.8s
|
|
236
|
+
- **TTI** (Time to Interactive): <3.8s
|
|
237
|
+
|
|
238
|
+
**Measurement**:
|
|
239
|
+
```javascript
|
|
240
|
+
// Web Vitals library
|
|
241
|
+
import {getLCP, getFID, getCLS} from 'web-vitals';
|
|
242
|
+
|
|
243
|
+
getLCP(console.log);
|
|
244
|
+
getFID(console.log);
|
|
245
|
+
getCLS(console.log);
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
---
|
|
249
|
+
|
|
250
|
+
## Common UI Anti-Patterns
|
|
251
|
+
|
|
252
|
+
### 1. Render Everything Upfront
|
|
253
|
+
**Problem**: Rendering 10,000 items at once
|
|
254
|
+
**Solution**: Virtual scrolling, pagination, infinite scroll
|
|
255
|
+
|
|
256
|
+
### 2. No Code Splitting
|
|
257
|
+
**Problem**: 5MB JavaScript bundle loaded upfront
|
|
258
|
+
**Solution**: Route-based code splitting, lazy loading
|
|
259
|
+
|
|
260
|
+
### 3. Large Images
|
|
261
|
+
**Problem**: 5MB PNG images
|
|
262
|
+
**Solution**: WebP, compression, lazy loading, responsive images
|
|
263
|
+
|
|
264
|
+
### 4. Blocking JavaScript
|
|
265
|
+
**Problem**: Heavy computation on main thread
|
|
266
|
+
**Solution**: Web Workers, requestIdleCallback, async/await
|
|
267
|
+
|
|
268
|
+
### 5. Memory Leaks
|
|
269
|
+
**Problem**: Event listeners not removed, timers not cleared
|
|
270
|
+
**Solution**: Cleanup in componentWillUnmount, WeakMap
|
|
271
|
+
|
|
272
|
+
---
|
|
273
|
+
|
|
274
|
+
## UI Diagnostic Checklist
|
|
275
|
+
|
|
276
|
+
**When diagnosing slow UI**:
|
|
277
|
+
|
|
278
|
+
- [ ] Check bundle size (target: <500KB gzipped)
|
|
279
|
+
- [ ] Check number of network requests (target: <50)
|
|
280
|
+
- [ ] Check Core Web Vitals (LCP <2.5s, FID <100ms, CLS <0.1)
|
|
281
|
+
- [ ] Check for JavaScript errors in console
|
|
282
|
+
- [ ] Check render performance (no long tasks >50ms)
|
|
283
|
+
- [ ] Check memory usage (no continuous growth)
|
|
284
|
+
- [ ] Check for CORS errors
|
|
285
|
+
- [ ] Check for failed chunk loads
|
|
286
|
+
- [ ] Check image sizes (target: <200KB per image)
|
|
287
|
+
- [ ] Check for blocking resources
|
|
288
|
+
|
|
289
|
+
**Tools**:
|
|
290
|
+
- Chrome DevTools (Network, Performance, Memory, Console)
|
|
291
|
+
- Lighthouse
|
|
292
|
+
- Web Vitals library
|
|
293
|
+
- webpack-bundle-analyzer
|
|
294
|
+
- React DevTools Profiler
|
|
295
|
+
|
|
296
|
+
---
|
|
297
|
+
|
|
298
|
+
## Related Documentation
|
|
299
|
+
|
|
300
|
+
- [SKILL.md](../SKILL.md) - Main SRE agent
|
|
301
|
+
- [backend-diagnostics.md](backend-diagnostics.md) - Backend troubleshooting
|
|
302
|
+
- [monitoring.md](monitoring.md) - Observability tools
|