Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Configure CI/CD pipelines for Evernote integrations. Use when setting up automated testing, continuous integration, or deployment pipelines for Evernote projects. Trigger with phrases like "evernote ci", "evernote github actions", "evernote pipeline", "automate evernote tests".
.claude/skills/jeremylongshore-evernote-ci-integration/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-07 | ✗→✓ | ▲ Improved | 31% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 63% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 41% | 0% |
| case-14 | ✗→✓ | ▲ Improved | 40% | 0% |
| case-15 | ✗→✓ | ▲ Improved | -14% | 0% |
Configure continuous integration pipelines for Evernote integrations with mock-based unit tests, sandbox-based integration tests, credential management, and deployment workflows.
Create a workflow that runs unit tests on every PR and integration tests on merges to main. Store sandbox credentials as GitHub Actions secrets.
yaml# .github/workflows/evernote-ci.yml name: Evernote CI on: [push, pull_request] jobs: test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: { node-version: '20' } - run: npm ci - run: npm test - name: Integration tests if: github.ref == 'refs/heads/main' env: EVERNOTE_DEV_TOKEN: ${{ secrets.EVERNOTE_SANDBOX_TOKEN }} EVERNOTE_SANDBOX: 'true' run: npm run test:integration
Create a mock NoteStore that returns predictable data without hitting the API. Mock createNote, getNote, findNotesMetadata, listNotebooks, and listTags.
javascriptclass MockNoteStore { constructor() { this.notes = new Map(); this.notebooks = [{ guid: 'nb-1', name: 'Default', defaultNotebook: true }]; } async createNote(note) { const guid = `note-${Date.now()}`; const created = { ...note, guid, created: Date.now(), updated: Date.now() }; this.notes.set(guid, created); return created; } async getNote(guid, withContent) { const note = this.notes.get(guid); if (!note) throw { identifier: 'Note.guid', key: guid }; return withContent ? note : { ...note, content: undefined }; } async listNotebooks() { return this.notebooks; } }
Write unit tests against the mock client (fast, no credentials needed). Write integration tests against the sandbox (slow, needs EVERNOTE_DEV_TOKEN). Tag integration tests so they can run separately.
Store EVERNOTE_CONSUMER_KEY, EVERNOTE_CONSUMER_SECRET, and EVERNOTE_DEV_TOKEN as repository secrets. Never log or echo secret values. Use environment-specific secret names for staging vs production.
For the full CI workflow, mock client, test examples, and deployment pipeline, see Implementation Guide.
MockNoteStore class for deterministic unit testingtest, test:unit, test:integration| Error | Cause | Solution | |-------|-------|----------| | Integration test auth failure | Expired sandbox token | Regenerate Developer Token in sandbox settings | | Flaky integration tests | Rate limits in CI | Add delays between integration tests, reduce parallelism | | Secret not available | Missing repository secret | Add secret in GitHub Settings > Secrets and variables | | Mock drift | Mock doesn't match real API behavior | Update mock when upgrading SDK version |
For deployment pipelines, see evernote-deploy-integration.
Unit test suite: Test NoteService.createNote() against MockNoteStore to verify ENML wrapping, title sanitization, and tag handling without any API calls.
Sandbox integration test: In CI, create a note in the sandbox, retrieve it by GUID, verify content matches, then delete it. Runs only on main branch merges.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 19,827 | 31,024 | +56% | 1 | 1 | 0% | 3,187 | 5,688 | +78% | 0 | 0 | — |
case-02 | fail→fail | 26,575 | 33,471 | +26% | 1 | 1 | 0% | 5,156 | 6,624 | +28% | 0 | 0 | — |
case-03 | fail→fail | 22,374 | 36,169 | +62% | 1 | 1 | 0% | 4,399 | 8,526 | +94% | 0 | 0 | — |
case-04 | fail→fail | 14,253 | 11,665 | -18% | 1 | 1 | 0% | 2,032 | 3,321 | +63% | 0 | 0 | — |
case-05 | pass→pass | 13,775 | 7,896 | -43% | 1 | 1 | 0% | 1,883 | 2,353 | +25% | 0 | 0 | — |
case-06 | pass→pass | 10,140 | 7,939 | -22% | 1 | 1 | 0% | 1,666 | 2,580 | +55% | 0 | 0 | — |
case-07 | fail→pass | 10,983 | 5,964 | -46% | 1 | 1 | 0% | 1,454 | 1,907 | +31% | 0 | 0 | — |
case-08 | fail→pass | 9,356 | 9,372 | +0% | 1 | 1 | 0% | 1,631 | 2,666 | +63% | 0 | 0 | — |
case-09 | pass→pass | 19,116 | 6,961 | -64% | 1 | 1 | 0% | 2,855 | 2,203 | -23% | 0 | 0 | — |
case-10 | fail→pass | 15,539 | 17,601 | +13% | 1 | 1 | 0% | 2,635 | 3,710 | +41% | 0 | 0 | — |
case-11 | pass→pass | 15,025 | 11,415 | -24% | 1 | 1 | 0% | 2,081 | 2,746 | +32% | 0 | 0 | — |
case-12 | pass→pass | 16,957 | 13,461 | -21% | 1 | 1 | 0% | 2,286 | 3,295 | +44% | 0 | 0 | — |
case-13 | pass→pass | 15,099 | 6,780 | -55% | 1 | 1 | 0% | 2,232 | 2,275 | +2% | 0 | 0 | — |
case-14 | fail→pass | 15,279 | 14,644 | -4% | 1 | 1 | 0% | 2,727 | 3,823 | +40% | 0 | 0 | — |
case-15 | fail→pass | 13,237 | 4,083 | -69% | 1 | 1 | 0% | 1,894 | 1,637 | -14% | 0 | 0 | — |
case-16 | pass→pass | 15,907 | 16,379 | +3% | 1 | 1 | 0% | 2,443 | 3,601 | +47% | 0 | 0 | — |
case-17 | fail→fail | 13,756 | 11,219 | -18% | 1 | 1 | 0% | 2,294 | 2,717 | +18% | 0 | 0 | — |
case-18 | pass→pass | 5,446 | 2,093 | -62% | 1 | 1 | 0% | 759 | 1,320 | +74% | 0 | 0 | — |
case-19 | pass→pass | 6,552 | 5,234 | -20% | 1 | 1 | 0% | 1,156 | 1,703 | +47% | 0 | 0 | — |
case-20 | fail→fail | 19,222 | 18,856 | -2% | 1 | 1 | 0% | 4,125 | 4,914 | +19% | 0 | 0 | — |
case-21 | fail→fail | 20,143 | 13,880 | -31% | 1 | 1 | 0% | 3,292 | 3,811 | +16% | 0 | 0 | — |
case-22 | fail→fail | 21,455 | 15,030 | -30% | 1 | 1 | 0% | 4,052 | 4,095 | +1% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +23 percentage points is the difference between those two pass rates over the 22 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.