@neetru/sdk 1.0.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.
Files changed (65) hide show
  1. package/CHANGELOG.md +183 -0
  2. package/README.md +218 -0
  3. package/dist/auth.cjs +1137 -0
  4. package/dist/auth.cjs.map +1 -0
  5. package/dist/auth.d.cts +25 -0
  6. package/dist/auth.d.ts +25 -0
  7. package/dist/auth.mjs +1135 -0
  8. package/dist/auth.mjs.map +1 -0
  9. package/dist/catalog.cjs +179 -0
  10. package/dist/catalog.cjs.map +1 -0
  11. package/dist/catalog.d.cts +17 -0
  12. package/dist/catalog.d.ts +17 -0
  13. package/dist/catalog.mjs +177 -0
  14. package/dist/catalog.mjs.map +1 -0
  15. package/dist/db.cjs +232 -0
  16. package/dist/db.cjs.map +1 -0
  17. package/dist/db.d.cts +8 -0
  18. package/dist/db.d.ts +8 -0
  19. package/dist/db.mjs +230 -0
  20. package/dist/db.mjs.map +1 -0
  21. package/dist/entitlements.cjs +140 -0
  22. package/dist/entitlements.cjs.map +1 -0
  23. package/dist/entitlements.d.cts +14 -0
  24. package/dist/entitlements.d.ts +14 -0
  25. package/dist/entitlements.mjs +138 -0
  26. package/dist/entitlements.mjs.map +1 -0
  27. package/dist/errors.cjs +20 -0
  28. package/dist/errors.cjs.map +1 -0
  29. package/dist/errors.d.cts +27 -0
  30. package/dist/errors.d.ts +27 -0
  31. package/dist/errors.mjs +18 -0
  32. package/dist/errors.mjs.map +1 -0
  33. package/dist/index.cjs +1154 -0
  34. package/dist/index.cjs.map +1 -0
  35. package/dist/index.d.cts +24 -0
  36. package/dist/index.d.ts +24 -0
  37. package/dist/index.mjs +1142 -0
  38. package/dist/index.mjs.map +1 -0
  39. package/dist/mocks.cjs +281 -0
  40. package/dist/mocks.cjs.map +1 -0
  41. package/dist/mocks.d.cts +138 -0
  42. package/dist/mocks.d.ts +138 -0
  43. package/dist/mocks.mjs +274 -0
  44. package/dist/mocks.mjs.map +1 -0
  45. package/dist/support.cjs +176 -0
  46. package/dist/support.cjs.map +1 -0
  47. package/dist/support.d.cts +5 -0
  48. package/dist/support.d.ts +5 -0
  49. package/dist/support.mjs +174 -0
  50. package/dist/support.mjs.map +1 -0
  51. package/dist/telemetry.cjs +225 -0
  52. package/dist/telemetry.cjs.map +1 -0
  53. package/dist/telemetry.d.cts +35 -0
  54. package/dist/telemetry.d.ts +35 -0
  55. package/dist/telemetry.mjs +223 -0
  56. package/dist/telemetry.mjs.map +1 -0
  57. package/dist/types-PKUaFtBY.d.cts +408 -0
  58. package/dist/types-PKUaFtBY.d.ts +408 -0
  59. package/dist/usage.cjs +235 -0
  60. package/dist/usage.cjs.map +1 -0
  61. package/dist/usage.d.cts +5 -0
  62. package/dist/usage.d.ts +5 -0
  63. package/dist/usage.mjs +233 -0
  64. package/dist/usage.mjs.map +1 -0
  65. package/package.json +79 -0
package/CHANGELOG.md ADDED
@@ -0,0 +1,183 @@
1
+ # Changelog
2
+
3
+ All notable changes to `@neetru/sdk` will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## [Unreleased]
9
+
10
+ ### Planned (post-1.0)
11
+ - Telemetry batching + flush on unload.
12
+ - LRU cache em entitlements.check (TTL configurável).
13
+ - size-limit budget no CI (<12KB gz core com db namespace).
14
+ - CDN distribution (`cdn.neetru.com/sdk/v1/`).
15
+
16
+ ## [1.0.0] - 2026-05-06 — **GA (General Availability)**
17
+
18
+ Marco de estabilidade. A partir desta versão, **a superfície pública do SDK
19
+ está congelada** — breaking changes só em majors (semver estrito).
20
+
21
+ ### Added
22
+ - **API stability lock** — todos os contratos (`createNeetruClient`,
23
+ `NeetruClient`, namespaces `auth`/`catalog`/`entitlements`/`telemetry`/
24
+ `usage`/`support`/`db`, `NeetruError`) ficam estáveis em v1.x. Coberto
25
+ por `api-surface-stability.test.ts` que falha o build se algum método
26
+ muda forma.
27
+ - **JSDoc completo** em toda função/método público — base pra `npm run docs:gen`
28
+ (typedoc → `sdk/docs-html/`).
29
+ - **`docs:gen` script** + `scripts/typedoc.config.json` — gera HTML
30
+ navigable das APIs.
31
+ - **`engines.node`** relaxado de `>=20` → `>=18` (suporta runtimes Node 18 LTS
32
+ ainda em uso por consumers).
33
+
34
+ ### Changed
35
+ - `VERSION` bump `0.3.0` → `1.0.0`.
36
+ - README atualizado com seção de migração v0.3 → v1.0 (no breaking changes —
37
+ upgrade transparente).
38
+
39
+ ### Migration v0.3 → v1.0
40
+ - **Sem breaking changes.** Upgrade direto via `npm install @neetru/sdk@1.0.0`.
41
+ - `initNeetru` continua deprecated mas funcional. **Será removido em v2.0.0.**
42
+ - `NeetruConfig` continua deprecated. Use `NeetruClientConfig`.
43
+
44
+ ### Stability promise (v1.x)
45
+ A partir de v1.0:
46
+ - Métodos novos podem ser adicionados a namespaces existentes (minor bump).
47
+ - Métodos podem ser marcados `@deprecated` em qualquer minor — só removidos
48
+ em major.
49
+ - Tipos nunca ganham campos required em minor (só optional ou via union).
50
+ - `NeetruErrorCode` é union fechado em v1.0 — qualquer novo código bumpa minor.
51
+
52
+ ### Notes
53
+ - Pacote ainda **privado** (`private: true`). Publicação no npm é
54
+ responsabilidade do owner — gate no CHANGELOG continua trancado até decisão.
55
+
56
+ ## [0.3.0] - 2026-05-06
57
+
58
+ ### Added
59
+ - Namespace `client.db` (v0.3) — wrapper minimalista pra coleções tenant-scoped:
60
+ - `client.db.collection(name).list({ limit? })`
61
+ - `client.db.collection(name).get(id)` (retorna null em not_found)
62
+ - `client.db.collection(name).set(id, data)` upsert
63
+ - `client.db.collection(name).remove(id)` delete
64
+ - Endpoints: `/sdk/v1/datastore/{collection}/{id?}` (placeholder REST — Sprint 9
65
+ finaliza; SDK já expõe interface estável).
66
+ - `MockDb` (in-memory) ativo em `NEETRU_ENV=dev`.
67
+ - Namespace `client.usage` ganhou `report()` e `check()`:
68
+ - `usage.report(resource, qty?)` → `POST /sdk/v1/usage/record` canônico
69
+ (Sprint 7) — incrementa atomicamente `usage_counters/{tid}_{pid}_{r}_{yyyymm}`.
70
+ - `usage.check(resource)` → `GET /sdk/v1/entitlements?productId&tenantId&feature` —
71
+ retorna `{allowed, reason, remaining, limit, planId, planFeatures}`.
72
+ - `NeetruClientConfig.productId` / `.tenantId` — defaults pra `usage.report` /
73
+ `usage.check` / `db.collection` quando não passado em options.
74
+ - Mock helpers: `MockDb`, `MockUsage.report()`, `MockUsage.check()`.
75
+
76
+ ### Changed
77
+ - `VERSION` bump `0.2.0` → `0.3.0`.
78
+ - `NeetruClient` agora expõe `.db` além dos antigos.
79
+ - `ResolvedConfig` ganhou `productId` + `tenantId` opcionais.
80
+
81
+ ### Backend (acompanha esta release)
82
+ - Novos endpoints (Sprint 7):
83
+ - `POST /sdk/v1/usage/record` — atomic increment + 80%/100% notifications + audit.
84
+ - `GET /sdk/v1/entitlements` — lookup canônico subscription→plan→counter.
85
+ - `POST /sdk/v1/telemetry/log` — batch logger pra `logs/{productId}/{yyyymmdd}/`.
86
+
87
+ ## [0.2.0] - 2026-05-06
88
+
89
+ ### Added
90
+ - Namespace `client.auth` (v0.2 — OIDC + dev mocks):
91
+ - `signIn(options?)` — redireciona pra auth.neetru.com authorize endpoint
92
+ (browser) ou retorna mock user em dev (`NEETRU_ENV=dev`).
93
+ - `signOut()` — limpa `localStorage.neetru_id_token` + revoga refresh
94
+ server-side (best-effort).
95
+ - `getUser()` — decodifica id_token cached e retorna `NeetruUser` ou null.
96
+ - `onAuthStateChanged(listener)` — sub a mudanças, dispatcha sync no subscribe.
97
+ - Namespace `client.usage` (v0.2 — meter):
98
+ - `track(event, props?)` → `POST /sdk/v1/usage/record` com Bearer.
99
+ - `getQuota(metric)` → `GET /sdk/v1/usage/quota?metric=` returns
100
+ `{ metric, used, limit, plan, resetsAt? }`.
101
+ - Namespace `client.support` (v0.2 — tickets):
102
+ - `createTicket({subject, message, severity?, productSlug?})` →
103
+ `POST /api/v1/products/{slug}/tickets` (default `_default`).
104
+ - `listMyTickets()` → `GET ...` retorna array (aceita envelope `{tickets:[]}`).
105
+ - `mocks` module (`@neetru/sdk/mocks`):
106
+ - `MockAuth`, `MockUsage`, `MockSupport`, `MockEntitlements` — overridáveis
107
+ via `createNeetruClient({ mocks: { auth: MockAuth(...), ... } })`.
108
+ - `DEV_FIXTURE_USER` constante exportada.
109
+ - `NEETRU_ENV` resolution chain: config arg > `process.env.NEETRU_ENV` >
110
+ `globalThis.NEETRU_ENV` > default `prod`. `dev` ativa mocks automáticos.
111
+ - Subpath exports adicionais: `@neetru/sdk/{auth,usage,support,mocks}`.
112
+ - Tipos novos: `NeetruUser`, `AuthNamespace`, `UsageNamespace`,
113
+ `SupportNamespace`, `SignInOptions`, `SupportTicket`, `UsageQuota`,
114
+ `NeetruEnv`, `CreateTicketInput`.
115
+
116
+ ### Changed
117
+ - `VERSION` bump `0.1.0` → `0.2.0`.
118
+ - `NeetruClientConfig` ganhou campos `env` + `mocks`.
119
+ - `ResolvedConfig` ganhou `env` resolved.
120
+ - `NeetruClient` agora expõe `.auth`, `.usage`, `.support` além dos antigos.
121
+
122
+ ### Backend (acompanha esta release — endpoints documentados em `docs/SDK_OPENAPI.md`)
123
+ - `POST /sdk/v1/usage/record` — record event meterado.
124
+ - `GET /sdk/v1/usage/quota?metric=` — ler quota atual.
125
+ - `POST /api/v1/products/{slug}/tickets` — criar ticket.
126
+ - `GET /api/v1/products/{slug}/tickets` — listar meus tickets.
127
+ - (auth) `auth.neetru.com/oauth/authorize` — já live (Sprint 1 OIDC).
128
+ - (auth) `auth.neetru.com/oauth/revoke` — revoga refresh token.
129
+
130
+ ### Notes
131
+ - Pacote ainda **privado** (`private: true`) — não publicado no npm.
132
+ - Carry-over: integração OIDC live aguarda owner habilitar redirect_uri pro
133
+ domain do consumer (configurar em `oidc_clients/{client_id}.redirect_uris`).
134
+ - TODO: `support.listMyTickets` precisa parametrizar productSlug (fixed
135
+ `_default` na v0.2).
136
+
137
+ ## [0.1.0] - 2026-05-05
138
+
139
+ ### Added
140
+ - `createNeetruClient(config)` factory — entry point principal.
141
+ - Resolve `apiKey` (arg explícito > `NEETRU_API_KEY` env em Node).
142
+ - Resolve `baseUrl` (default `https://api.neetru.com`).
143
+ - Resolve `fetch` (arg > `globalThis.fetch`).
144
+ - Namespace `client.catalog`:
145
+ - `list(opts?)` → `GET /api/v1/cli/catalog`. Aceita `includeDrafts`.
146
+ - `get(slug)` → `GET /api/v1/cli/catalog/{slug}`.
147
+ - Namespace `client.entitlements`:
148
+ - `check(slug, feature)` → boolean.
149
+ - `checkDetailed(slug, feature)` → `EntitlementCheck` com `reason`.
150
+ - Backed por `GET /api/v1/sdk/entitlements/check`.
151
+ - Namespace `client.telemetry`:
152
+ - `event({ name, properties?, timestamp? })` → `POST /api/v1/sdk/telemetry/event`.
153
+ - Subpath exports map: `@neetru/sdk/{catalog,entitlements,telemetry,errors}`.
154
+ - HTTP transport com mapeamento status → `NeetruError.code` estável.
155
+ - Tipos exportados: `NeetruClient`, `NeetruClientConfig`, `Product`, `ProductPlan`,
156
+ `EntitlementCheck`, `TelemetryEventInput`, `TelemetryEventAck`, `NeetruErrorCode`.
157
+ - Compat alias `initNeetru` (deprecated, será removido em v1.0).
158
+
159
+ ### Changed
160
+ - `VERSION` bump `0.0.1` → `0.1.0`.
161
+ - tsup config multi-entry pra subpath imports.
162
+
163
+ ### Backend (acompanha esta release)
164
+ - `GET /api/v1/cli/catalog/{slug}` — produto único.
165
+ - `GET /api/v1/sdk/entitlements/check?slug=&feature=` — verificação por user.
166
+ - `POST /api/v1/sdk/telemetry/event` — persiste em `usage_events`.
167
+
168
+ ### Notes
169
+ - Pacote ainda **privado** (`private: true`). Publicação no npm é
170
+ responsabilidade do owner em Sprint 6.
171
+ - API instável; pré-1.0 segue regra "breaking allowed em qualquer minor".
172
+
173
+ ## [0.0.1] - 2026-05-04
174
+
175
+ ### Added
176
+ - Scaffold inicial do pacote `@neetru/sdk` (private, não publicado no npm ainda).
177
+ - `initNeetru(config)` com validação de `apiUrl` e injeção opcional de `fetch`.
178
+ - `NeetruError` com `code`, `status` e `requestId` opcionais.
179
+ - `NeetruConfig` e `NeetruClient` types públicos.
180
+ - `VERSION` const exportada.
181
+ - Build pipeline com tsup (dual ESM + CJS + `.d.ts`).
182
+ - README + CHANGELOG.
183
+ - `tsconfig.json` strict ES2022 ESNext.
package/README.md ADDED
@@ -0,0 +1,218 @@
1
+ # @neetru/sdk
2
+
3
+ Biblioteca runtime para consumir o ecossistema Neetru — catálogo público de
4
+ produtos, entitlements de tenant e telemetria — de qualquer
5
+ JavaScript/TypeScript moderno (browser, Node ≥20, Edge runtimes).
6
+
7
+ > **Status:** `1.0.0` GA — superfície pública estabilizada (2026-05-06).
8
+ > Namespaces `auth`/`catalog`/`entitlements`/`telemetry`/`usage`/`support`/`db`.
9
+ > A partir de v1.0, breaking changes só em majors. CDN distribution segue
10
+ > roadmap pós-1.0 — vide [`docs/PLAN_SDK_NEETRU.md`](../docs/PLAN_SDK_NEETRU.md).
11
+
12
+ ---
13
+
14
+ ## Princípios
15
+
16
+ - **Vendor-neutral** — apesar do Core usar Firebase, a superfície pública do
17
+ SDK não vaza isso (sem `firebase/app` exposto).
18
+ - **TypeScript-first** — `.d.ts` shipped, JSDoc em toda função pública.
19
+ - **Tree-shakable** — ESM-first, `"sideEffects": false`. Subpath imports
20
+ permitidos (`@neetru/sdk/catalog`, `@neetru/sdk/telemetry`, etc).
21
+ - **Universal** — usa `fetch` global. Sem `node:` builtins no core.
22
+ - **Erros tipados** — todos erros são `NeetruError` com `.code`, `.status`,
23
+ `.requestId`.
24
+ - **Semver estrito** — pós v1.0, breaking changes só em majors.
25
+
26
+ ## Install
27
+
28
+ ```bash
29
+ npm install @neetru/sdk
30
+ ```
31
+
32
+ > Pacote ainda **privado** (`private: true`) e não publicado no npm.
33
+ > Reservar é responsabilidade do owner em Sprint 6 do plano.
34
+
35
+ ## Quick start
36
+
37
+ ```ts
38
+ import { createNeetruClient, NeetruError } from '@neetru/sdk';
39
+
40
+ const client = createNeetruClient({
41
+ apiKey: process.env.NEETRU_API_KEY, // ou deixe undefined que ele lê do env
42
+ baseUrl: 'https://api.neetru.com', // default
43
+ });
44
+
45
+ // 1. Catálogo público de produtos
46
+ const { products } = await client.catalog.list();
47
+ console.log(products.map((p) => p.slug));
48
+
49
+ const product = await client.catalog.get('neetru-pulse');
50
+
51
+ // 2. Entitlements — pode o caller usar a feature `export-pdf` do produto?
52
+ const allowed = await client.entitlements.check('neetru-pulse', 'export-pdf');
53
+ if (!allowed) showUpgradeBanner();
54
+
55
+ // 3. Telemetria — emite evento de uso
56
+ await client.telemetry.event({
57
+ name: 'report_exported',
58
+ properties: { format: 'pdf', plan: 'pro' },
59
+ });
60
+ ```
61
+
62
+ Discriminação de erro:
63
+
64
+ ```ts
65
+ try {
66
+ await client.catalog.list();
67
+ } catch (err) {
68
+ if (err instanceof NeetruError) {
69
+ if (err.code === 'rate_limited') retry();
70
+ if (err.code === 'unauthorized') promptLogin();
71
+ console.error(err.code, err.message, err.status, err.requestId);
72
+ }
73
+ }
74
+ ```
75
+
76
+ ## API reference (v0.2)
77
+
78
+ ### `createNeetruClient(config?)`
79
+
80
+ | Campo | Tipo | Descrição |
81
+ |---|---|---|
82
+ | `apiKey` | `string?` | Bearer token `nrt_<keyId>_<secret>`. Default lê `process.env.NEETRU_API_KEY` em Node. |
83
+ | `baseUrl` | `string?` | URL base. Default `https://api.neetru.com`. |
84
+ | `fetch` | `typeof fetch?` | Implementação custom. Default `globalThis.fetch`. |
85
+ | `env` | `'dev' \| 'workspace' \| 'prod'?` | Ativa mocks automáticos em `dev`. Default `prod` (lê `NEETRU_ENV`). |
86
+ | `mocks` | `{ auth?, usage?, support?, entitlements? }?` | Override de namespaces — útil em tests do consumer. |
87
+
88
+ Retorna `NeetruClient` com `.config`, `.auth`, `.catalog`, `.entitlements`, `.telemetry`, `.usage`, `.support`.
89
+
90
+ ### `client.auth` (v0.2)
91
+
92
+ | Método | Descrição |
93
+ |---|---|
94
+ | `signIn(options?)` | Redireciona pro authorize endpoint (browser) ou retorna fixture user (dev). |
95
+ | `signOut()` | Limpa session local + revoga refresh server-side. |
96
+ | `getUser()` | Retorna `NeetruUser` cached do id_token ou `null`. |
97
+ | `onAuthStateChanged(listener)` | Sub a mudanças. Dispatch sync no subscribe. Retorna unsubscribe. |
98
+
99
+ ### `client.catalog`
100
+
101
+ | Método | Descrição |
102
+ |---|---|
103
+ | `list(opts?)` | `GET /api/v1/cli/catalog`. Retorna `{ products, fetchedAt }`. |
104
+ | `get(slug)` | `GET /api/v1/cli/catalog/{slug}`. Retorna `Product` ou lança `not_found`. |
105
+
106
+ ### `client.entitlements`
107
+
108
+ | Método | Descrição |
109
+ |---|---|
110
+ | `check(slug, feature)` | `boolean`. Atalho do `checkDetailed`. |
111
+ | `checkDetailed(slug, feature)` | `EntitlementCheck` com `allowed`, `reason`. |
112
+
113
+ ### `client.telemetry`
114
+
115
+ | Método | Descrição |
116
+ |---|---|
117
+ | `event({ name, properties?, timestamp? })` | `POST /api/v1/sdk/telemetry/event`. Retorna `{ ok, eventId }`. |
118
+
119
+ ### `client.usage` (v0.2)
120
+
121
+ | Método | Descrição |
122
+ |---|---|
123
+ | `track(event, props?)` | `POST /sdk/v1/usage/record`. Persiste consumo. |
124
+ | `getQuota(metric)` | `GET /sdk/v1/usage/quota?metric=`. Retorna `{ used, limit, plan, resetsAt? }`. |
125
+
126
+ ### `client.support` (v0.2)
127
+
128
+ | Método | Descrição |
129
+ |---|---|
130
+ | `createTicket({subject, message, severity?, productSlug?})` | `POST /api/v1/products/{slug}/tickets`. |
131
+ | `listMyTickets()` | `GET /api/v1/products/_default/tickets`. |
132
+
133
+ ### Mocks (`@neetru/sdk/mocks`)
134
+
135
+ Use em tests do consumer ou ative globalmente com `NEETRU_ENV=dev`:
136
+
137
+ ```ts
138
+ import { createNeetruClient, MockAuth, MockUsage, MockSupport } from '@neetru/sdk';
139
+
140
+ const client = createNeetruClient({
141
+ mocks: {
142
+ auth: new MockAuth({ uid: 'fake', email: 'fake@x.com' }),
143
+ usage: new MockUsage(),
144
+ support: new MockSupport(),
145
+ },
146
+ });
147
+ ```
148
+
149
+ ### Códigos de erro estáveis (`NeetruError.code`)
150
+
151
+ `invalid_config` · `missing_api_key` · `unauthorized` · `forbidden` ·
152
+ `not_found` · `rate_limited` · `validation_failed` · `network_error` ·
153
+ `invalid_response` · `server_error` · `unknown`.
154
+
155
+ ## Subpath imports (tree-shaking)
156
+
157
+ ```ts
158
+ // Importa só o tipo de erro (zero deps de transport)
159
+ import { NeetruError } from '@neetru/sdk/errors';
160
+
161
+ // Bundlers podem fazer code-split por namespace
162
+ import { createCatalogNamespace } from '@neetru/sdk/catalog';
163
+ ```
164
+
165
+ ## Build
166
+
167
+ ```bash
168
+ npm run build # tsup → dist/{index,catalog,entitlements,telemetry,errors}.{mjs,cjs,d.ts}
169
+ npm run dev # watch mode
170
+ npm run lint # tsc --noEmit
171
+ npm run test # vitest run (Sprint 2+)
172
+ ```
173
+
174
+ Tooling: [tsup](https://tsup.egoist.dev) (esbuild backend, dual ESM+CJS,
175
+ auto `.d.ts`).
176
+
177
+ ## Migration v0.3 → v1.0
178
+
179
+ **Sem breaking changes.** Upgrade direto via `npm install @neetru/sdk@1.0.0`.
180
+
181
+ - `initNeetru` continua deprecated mas funcional. **Será removido em v2.0.0.**
182
+ Use `createNeetruClient` em código novo.
183
+ - `NeetruConfig` continua deprecated — use `NeetruClientConfig`.
184
+ - Tipos exportados continuam idênticos.
185
+ - Comportamento runtime idêntico — apenas estabilização de contratos.
186
+
187
+ ## Stability promise (v1.x)
188
+
189
+ A partir de v1.0:
190
+ - Métodos novos podem ser adicionados a namespaces existentes (minor bump).
191
+ - Métodos podem ser marcados `@deprecated` em qualquer minor — só removidos
192
+ em major.
193
+ - Tipos nunca ganham campos required em minor (só optional ou via union).
194
+ - `NeetruErrorCode` é union fechado em v1.0 — qualquer novo código bumpa minor.
195
+
196
+ ## Generate API docs
197
+
198
+ ```bash
199
+ npm install --include=dev # garante typedoc
200
+ npm run docs:gen # → sdk/docs-html/index.html
201
+ ```
202
+
203
+ ## Roadmap
204
+
205
+ - ✅ **v1.0** — API stability + GA. JSDoc completo + typedoc.
206
+ - **v1.1** — Telemetry batching + flush on unload.
207
+ - **v1.2** — LRU cache em entitlements.check (TTL configurável).
208
+ - **v1.x** — CDN release (`cdn.neetru.com/sdk/v1/`), SRI integrity.json,
209
+ UMD/IIFE bundle.
210
+
211
+ Detalhes em
212
+ [`docs/PLAN_SDK_NEETRU.md`](../docs/PLAN_SDK_NEETRU.md) +
213
+ [`docs/PLAN_SDK_CLI_CDN.md`](../docs/PLAN_SDK_CLI_CDN.md).
214
+
215
+ ## License
216
+
217
+ UNLICENSED — uso interno Neetru. License pública será definida em release
218
+ público (npm publish).