# Tasks — Add @suaveplan/currency-provider-cryptocompare ## Spec-completeness preflight (AGENTS.md §12a) - [x] Numbered checklist of every `### Requirement` and `#### Scenario` drafted in `specs/currency-provider-cryptocompare/spec.md` (4 requirements, 11 scenarios). ## Package scaffolding - [x] Create `packages/finance/currency-provider-cryptocompare/` with `package.json` (`0.1.0`, sibling deps on slim core / currency / types / error / tslib), `tsconfig.json`, `tsconfig.lib.json`, `vite.config.ts`, `vitest.config.ts`. - [x] Create `tests/setup/polyfills.ts` no-op shim mirroring sibling packages. ## Implementation - [x] `src/cryptocompare/cryptocompare.ts` — `CryptoCompareConfig` (extends `NoKeyConfig` with optional `apiKey`), `CryptoCompareProvider` class implementing `CurrencyProvider`. Defaults: `name = "cryptocompare"`, `supportsCrypto = true`, `supportsFiat = false`, base `"USD"`, 15-symbol default `targets`. - [x] Optional `apiKey` attached via `authorization: Apikey ` header on every request when present and non-whitespace. - [x] Error mapping: `HTTP_ERROR` (shared `httpRequest`), `PARSE_ERROR` (invalid JSON / non-object payload), `UPSTREAM_ERROR` (`Response === "Error"`), `UNKNOWN_CURRENCY` (no positive quotes). - [x] `src/cryptocompare/index.ts` explicit-named barrel. - [x] `src/index.ts` explicit-named root barrel. ## Tests - [x] `src/cryptocompare/cryptocompare.test.ts` — runner imports from `@suaveplan/testing/runner`, recording `FetchLike`, 14 cases covering: metadata, default invert + zero-skip + USD default, keyless vs keyed header, whitespace-only key treated as absent, custom `baseUrl` + explicit targets, empty `targets` falls back to defaults, `HTTP_ERROR`, `PARSE_ERROR` (invalid JSON), `PARSE_ERROR` (non-object payload), `UPSTREAM_ERROR` (with `Message`), `UPSTREAM_ERROR` (no `Message` → default message), `UNKNOWN_CURRENCY` (empty map), `UNKNOWN_CURRENCY` (every quote non-finite or non-positive), `AbortSignal` forwarding. Every test carries `{ timeout: 5000 }`. ## Documentation - [x] `src/cryptocompare/cryptocompare.md` sibling doc (≥200 words, Purpose / Features / Usage Basic / Usage Advanced / API Reference / Implementation Notes). - [x] Root `README.md` (install, quick start, modules link, error table). ## Pre-archive gates (AGENTS.md §13) - [x] Step 0 — spec reconciliation: every `### Requirement` and `**Verified by:**` resolves to a real file + verbatim test name. - [x] Step 1 — `bunx turbo lint typecheck test --filter=@suaveplan/currency-provider-cryptocompare` green. - [x] Step 2 — `bunx turbo test:coverage --filter=@suaveplan/currency-provider-cryptocompare` reports 100/100/100/100 via istanbul. - [x] Step 3 — `bunx turbo build --filter=@suaveplan/currency-provider-cryptocompare` green. - [x] Step 4 — banned-pattern grep returns zero. - [x] Step 4a — barrel-shape grep returns zero (`src/index.ts` exempt). - [x] Step 4b — test-runner-import grep returns zero. - [x] Step 5 — missing-`.md` grep returns zero. - [x] Step 6 — README present. - [x] Step 7 — bare-version grep returns zero. - [x] Step 8 — subpath-export count = 1 (`./cryptocompare/cryptocompare`). - [x] Step 9 — security-scan grep returns zero. - [x] Step 10 — no dependents (new package). ## Root-doc refresh (AGENTS.md §13b) - [x] Re-run `bun scripts/folder-reorg/generate-manifest.ts` to refresh `MANIFEST.md`. - [x] Re-run `bun scripts/generate-missing.ts` to refresh `MISSING.yml`. - [x] Update `STATUS.md` row for `@suaveplan/currency-provider-cryptocompare`. - [x] Update `SUMMARY.md` row likewise. - [x] `bunx markdownlint-cli2 --fix` across touched root + change files. ## Archive (AGENTS.md §14) - [x] Fold `specs/currency-provider-cryptocompare/spec.md` into `openspec/specs/currency-provider-cryptocompare/spec.md`. - [x] Move change folder to `openspec/archive/2026-05-17-add-currency-provider-cryptocompare/`.