Files
suaveplan/openspec/archive/2026-05-25-enterprise-sms/tasks.md
2026-05-27 23:29:53 +01:00

4.3 KiB
Raw Blame History

Tasks — @suaveplan/sms enterprise migration

1. Package scaffold

  • Create packages/communication/messaging/sms/ with package.json, tsconfig.lib.json, vite.config.ts, README.md.
  • Add deps: @suaveplan/error, @suaveplan/events, @suaveplan/types, @opentelemetry/api, tslib, zod; devdeps: @suaveplan/testing, @opentelemetry/sdk-metrics, @vitest/coverage-istanbul, vitest, vite, vite-plugin-dts, typescript.
  • Subpath exports for every feature module + ./types, ./routes/problem-json.

2. Error codes

  • error-codes/error-codes.ts — defineCodes("SMS", [...]) with 13 codes, typed SmsError base, 12 leaf classes.
  • error-codes/error-codes.test.ts — registry sort assertion + reachability test (every code raised from a real call site).
  • error-codes/error-codes.md.

3. Legacy compatibility

  • legacy-errors/legacy-errors.ts — back-compat SmsError class with the upstream SmsErrorCode union + factories (invalidPhoneNumber, sendFailed, templateNotFound, recipientOptedOut, providerNotConfigured).
  • legacy-errors/legacy-errors.test.ts.
  • legacy-metadata/legacy-metadata.ts — SMS_ERROR_METADATA + registerSmsErrorCodes() + SmsRegisteredErrorCode; eager-register on import.
  • legacy-metadata/legacy-metadata.test.ts.

4. Types + schemas

  • types/sms.types.ts — SmsDeliveryStatus, SmsMessage, SmsDeliveryReport, SmsProvider, OptOutEntry, SmsTemplate, SmsEventMap, SmsServiceOptions, ScheduledMessage, ScheduleHandle.
  • schemas/schemas.ts — Zod for SmsMessage, SmsTemplate, SmsDeliveryReport, SmsServiceOptions; parseSmsMessage / parseSmsTemplate throw SmsInvalidConfigError.

5. Pipeline primitives

  • validation/phone.ts — isValidE164.
  • templates/templates.ts — TemplateRegistry, renderTemplate(template, vars, defaults?).
  • opt-out/opt-out.ts — OptOutRegistry (set/clear/check/bulk).
  • rate-limiter/rate-limiter.ts — RateLimiter token-bucket with injectable Clock.
  • retry/retry.ts — RetryPolicy exponential w/ jitter, abort-aware.
  • scheduler/scheduler.ts — MessageScheduler with injectable Timers.
  • delivery-tracker/delivery-tracker.ts — bounded LRU receipt cache.

6. In-memory provider

  • in-memory-provider/in-memory-provider.ts — InMemorySmsProvider implementing SmsProvider; records sent messages, configurable per-send outcome (queued/sent/delivered/failed/undelivered), supports simulateFailure, supports advance for delivery state transitions.

7. OTel

  • otel/metrics.ts — counters sms.sent_total, sms.failed_total, sms.retry_total; histogram sms.send_duration_ms; refreshSmsMeters().

8. Service orchestrator

  • service/sms-service.ts — SmsService extends/wraps EventBus<SmsEventMap>; constructor accepts SmsServiceOptions (Zod-validated); legacy on/off/emit mirrors against the bus; integrates rate-limiter + retry + scheduler + delivery-tracker; honours AbortSignal.
  • service/sms-service.test.ts — full pipeline tests against InMemorySmsProvider.

9. Hono helper

  • routes/problem-json.ts — respondProblemJson + PROBLEM_JSON_CONTENT_TYPE, mapping SuaveplanError / HttpError / unknown → problem+json.

10. Index barrel + sibling docs

  • src/index.ts — explicit named re-exports of every public symbol.
  • Sibling .md per .ts (≥200 words, 6 sections).
  • Package-root README.md with quick start, modules table, install.

11. Verification

  • bunx turbo lint typecheck test build --filter=@suaveplan/sms green.
  • bunx turbo test:coverage --filter=@suaveplan/sms ≥ 100/100/100/100.
  • Banned-pattern scan zero output (TODO, FIXME, ts-ignore, .skip, .only, any, biome-ignore).
  • Test-runner-import scan zero output (from "vitest"|"bun:test").
  • All sibling .md present; README.md present.

12. Manifest + STATUS

  • bun scripts/folder-reorg/generate-manifest.ts to refresh MANIFEST.md.
  • STATUS.md: flip @suaveplan/sms – → ✅, decrement Pending, increment Migrated.

13. Spec finalisation

  • Fold specs/sms/spec.md into openspec/specs/sms/spec.md.
  • Move change folder to openspec/archive/2026-05-25-enterprise-sms/.