Claude-code-plugins-plus-skills evernote-common-errors
install
source · Clone the upstream repo
git clone https://github.com/jeremylongshore/claude-code-plugins-plus-skills
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/jeremylongshore/claude-code-plugins-plus-skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/plugins/saas-packs/evernote-pack/skills/evernote-common-errors" ~/.claude/skills/jeremylongshore-claude-code-plugins-plus-skills-evernote-common-errors && rm -rf "$T"
manifest:
plugins/saas-packs/evernote-pack/skills/evernote-common-errors/SKILL.mdsource content
Evernote Common Errors
Overview
Comprehensive guide to diagnosing and resolving Evernote API errors. Evernote uses three exception types:
EDAMUserException (client errors), EDAMSystemException (server/rate limit errors), and EDAMNotFoundException (invalid GUIDs).
Prerequisites
- Basic Evernote SDK setup
- Understanding of Evernote data model
Instructions
EDAMUserException Error Codes
| Code | Name | Cause | Fix |
|---|---|---|---|
| 1 | | Invalid ENML, missing DOCTYPE | Validate ENML before sending; check for forbidden elements |
| 2 | | Missing required field (title, content) | Ensure and are set |
| 3 | | API key lacks permissions | Request additional permissions from Evernote |
| 4 | | Invalid or revoked token | Re-authenticate user via OAuth |
| 5 | | Token past expiration date | Check , refresh token |
| 6 | | Account limit exceeded (250 notebooks) | Clean up resources before creating new ones |
| 7 | | Monthly upload quota exceeded | Check |
ENML Validation
The most common error is
BAD_DATA_FORMAT from invalid ENML. Validate before sending:
function validateENML(content) { const errors = []; if (!content.includes('<?xml version="1.0"')) errors.push('Missing XML declaration'); if (!content.includes('<!DOCTYPE en-note')) errors.push('Missing DOCTYPE'); if (!content.includes('<en-note>')) errors.push('Missing <en-note> root'); const forbidden = [/<script/i, /<form/i, /<iframe/i, /<input/i]; forbidden.forEach(p => { if (p.test(content)) errors.push(`Forbidden: ${p.source}`); }); if (/\s(class|id|onclick)=/i.test(content)) errors.push('Forbidden attributes'); return { valid: errors.length === 0, errors }; }
EDAMSystemException Handling
Rate limit errors include
rateLimitDuration (seconds to wait). Maintenance errors should be retried with progressive backoff.
async function withRetry(operation, maxRetries = 3) { for (let i = 0; i < maxRetries; i++) { try { return await operation(); } catch (error) { if (error.rateLimitDuration) { await new Promise(r => setTimeout(r, error.rateLimitDuration * 1000)); continue; } throw error; } } }
EDAMNotFoundException Handling
Thrown when a GUID does not exist (deleted note, wrong user, invalid format). Handle gracefully by returning null instead of throwing.
async function safeGetNote(noteStore, guid) { try { return await noteStore.getNote(guid, true, false, false, false); } catch (error) { if (error.identifier === 'Note.guid') return null; throw error; } }
Error Handler Service
Build a centralized error handler that classifies exceptions and returns structured results with
type, code, action, and recoverable flags. See Implementation Guide for the complete EvernoteErrorHandler class.
Output
- Error code reference table for all
codesEDAMUserException - ENML validation utility that catches common content errors
- Rate limit retry with
handlingrateLimitDuration - Safe getter pattern for
EDAMNotFoundException - Centralized
service classEvernoteErrorHandler
Error Handling
| Exception | When Thrown | Recovery |
|---|---|---|
| Client error (invalid input, permissions) | Fix input or re-authenticate |
| Server error (rate limits, maintenance) | Wait and retry |
| Resource not found (invalid GUID) | Verify GUID, check trash |
Resources
Next Steps
For debugging tools and techniques, see
evernote-debug-bundle.
Examples
ENML debugging: Note creation fails with
BAD_DATA_FORMAT. Run validateENML() on the content to identify missing DOCTYPE, unclosed tags, or forbidden elements like <script>.
Token refresh flow: API call returns
AUTH_EXPIRED (code 5). Check stored edam_expires timestamp, redirect user to OAuth re-authorization, store new token with updated expiration.