dynamitecircle 2.0.4__tar.gz → 2.3.1__tar.gz

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 (29) hide show
  1. {dynamitecircle-2.0.4 → dynamitecircle-2.3.1}/.gitignore +4 -0
  2. {dynamitecircle-2.0.4 → dynamitecircle-2.3.1}/CHANGELOG.md +237 -5
  3. {dynamitecircle-2.0.4 → dynamitecircle-2.3.1}/PKG-INFO +38 -11
  4. {dynamitecircle-2.0.4 → dynamitecircle-2.3.1}/README.md +37 -10
  5. dynamitecircle-2.3.1/contracts/README.md +10 -0
  6. dynamitecircle-2.3.1/contracts/openapi.json +9103 -0
  7. dynamitecircle-2.3.1/contracts/operation-map.json +636 -0
  8. {dynamitecircle-2.0.4 → dynamitecircle-2.3.1}/manifest.json +4 -10
  9. {dynamitecircle-2.0.4 → dynamitecircle-2.3.1}/py/SKILL.md +3 -0
  10. {dynamitecircle-2.0.4 → dynamitecircle-2.3.1}/py/config.json +1 -1
  11. {dynamitecircle-2.0.4 → dynamitecircle-2.3.1}/py/dc.py +14 -1
  12. {dynamitecircle-2.0.4 → dynamitecircle-2.3.1}/pyproject.toml +5 -1
  13. {dynamitecircle-2.0.4 → dynamitecircle-2.3.1}/server.json +2 -2
  14. dynamitecircle-2.3.1/ts/README.md +179 -0
  15. dynamitecircle-2.3.1/ts/examples/basic.ts +14 -0
  16. dynamitecircle-2.3.1/ts/package-lock.json +33 -0
  17. dynamitecircle-2.3.1/ts/package.json +53 -0
  18. dynamitecircle-2.3.1/ts/src/client.ts +475 -0
  19. dynamitecircle-2.3.1/ts/src/errors.ts +49 -0
  20. dynamitecircle-2.3.1/ts/src/index.ts +41 -0
  21. dynamitecircle-2.3.1/ts/src/types.ts +245 -0
  22. dynamitecircle-2.3.1/ts/src/version.ts +3 -0
  23. dynamitecircle-2.3.1/ts/tests/client.test.mjs +247 -0
  24. dynamitecircle-2.3.1/ts/tsconfig.json +17 -0
  25. {dynamitecircle-2.0.4 → dynamitecircle-2.3.1}/LICENSE +0 -0
  26. {dynamitecircle-2.0.4 → dynamitecircle-2.3.1}/docs/mcp-info.md +0 -0
  27. {dynamitecircle-2.0.4 → dynamitecircle-2.3.1}/docs/skill-info.md +0 -0
  28. {dynamitecircle-2.0.4 → dynamitecircle-2.3.1}/py/.env.dc.example +0 -0
  29. {dynamitecircle-2.0.4 → dynamitecircle-2.3.1}/py/requirements.txt +0 -0
@@ -13,10 +13,14 @@ __pycache__/
13
13
  .venv*
14
14
  *.egg-info/
15
15
  dist/
16
+
17
+ # MCPB bundle — built in CI (publish.yml) + attached to releases; never commit
18
+ *.mcpb
16
19
  build/
17
20
 
18
21
  # Node (in case any tool ships a sub-app)
19
22
  node_modules/
23
+ .npm-cache/
20
24
 
21
25
  # OS
22
26
  .DS_Store
@@ -3,9 +3,10 @@
3
3
  All notable changes to the **`dc` client repo** (formerly `dc-official` /
4
4
  `dc-py`) are listed here. The version
5
5
  numbers below track `DC_API_VERSION` in [`py/dc.py`](py/dc.py), which is
6
- deliberately aligned with the DC Member API server version it was last
7
- verified against. Patch bumps from the server are silent; minor or major
8
- bumps surface a one-shot stderr warning when this client falls behind.
6
+ deliberately aligned with the DC Member API contract version it was last
7
+ verified against. Python, TypeScript, and the API contract are released
8
+ together on purpose. Patch bumps from the API are silent; minor or major bumps
9
+ surface a one-shot stderr warning when an installed client falls behind.
9
10
 
10
11
  The format is loosely based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
11
12
  and the project follows [Semantic Versioning](https://semver.org/) for
@@ -14,8 +15,238 @@ the public Python API surface (`dc.DC`, `dc.DCError`, `dc.Result`,
14
15
 
15
16
  ---
16
17
 
18
+ ## [v2.3.1] - 2026-07-14
19
+
20
+ ### Added
21
+ - **`virtual-event-attendees`** — list the attendees (RSVP `yes`/`maybe`) of a Live Call: `dc virtual-event-attendees <sessionID> [--limit N] [--cursor TOKEN]`. Mirrors `event-attendees` — same paginated envelope, surfaces the true `total` (under `extra`) + `cursor`. TS: `client.virtualEvents.attendees(sessionID, { limit, cursor })`.
22
+
23
+ ### Changed
24
+ - Realigned `DC_API_VERSION` to the deployed Member API contract **2.3.1**. The server added the Live Call attendees endpoint plus cursor pagination and a true aggregate `total` on `GET /events/:eventID/attendees`; the pinned OpenAPI snapshot + operation-map were updated to match (no other client command changes since 2.0.4).
25
+
26
+ ## [v2.0.4] - 2026-06-16
27
+
28
+ ### Added
29
+
30
+ - list in the Official MCP Registry (b2f1d26)
31
+ - one-click install badges, VS Code docs, and .mcpb bundle (6108d51)
32
+ - MCP tool annotations and structured output (9b62eb0)
33
+ - snake_case MCP tool names and fields (f4573f8)
34
+
35
+
36
+ ## [v2.0.1] - 2026-06-16
37
+
38
+ ### Added
39
+
40
+ - v2.0.1 — formal field names (breaking) to match Member API rename (2bb90f2)
41
+
42
+
43
+ ## [v1.23.3] - 2026-06-13
44
+
45
+ ### Fixed
46
+
47
+ - dc.py help — sponsors/attendee-agenda/agendas are public (not ticket-gated) (9181cc8)
48
+
49
+
50
+ ## [v1.22.6] - 2026-06-05
51
+
52
+ ### Fixed
53
+
54
+ - explicit profile-update/calendar parsers + offline test suite (aecaca1)
55
+ - accept top-level --note on trip-create and trip-update (26a9c61)
56
+
57
+
58
+ ## [v1.22.5] - 2026-06-03
59
+
60
+ ### Fixed
61
+
62
+ - accept declared args= flags on parser-less commands (MCP bridge) (267fad2)
63
+
64
+
65
+ ## [v1.22.4] - 2026-05-27
66
+
67
+ ### Fixed
68
+
69
+ - align client with api 1.22.4 (3fe5f91)
70
+
71
+
72
+ ## [v1.22.3] - 2026-05-24
73
+
74
+ ### Added
75
+
76
+ - 6 follow commands + Follows SKILL.md section (no version bump — pending server deploy) (5f19db6)
77
+
78
+
79
+ ## [v1.20.1] - 2026-05-22
80
+
81
+ _No customer-facing changes in this release._
82
+
83
+
84
+ ## [v1.19.3] - 2026-05-21
85
+
86
+ _No customer-facing changes in this release._
87
+
88
+
89
+ ## [v1.19.2] - 2026-05-21
90
+
91
+ _No customer-facing changes in this release._
92
+
93
+
94
+ ## [v1.17.3] - 2026-05-20
95
+
96
+ _No customer-facing changes in this release._
97
+
98
+
99
+ ## [v1.17.2] - 2026-05-20
100
+
101
+ _No customer-facing changes in this release._
102
+
103
+
104
+ ## [v1.17.1] - 2026-05-20
105
+
106
+ _No customer-facing changes in this release._
107
+
108
+
109
+ ## [v1.17.0] - 2026-05-20
110
+
111
+ _No customer-facing changes in this release._
112
+
113
+
114
+ ## [v1.16.2] - 2026-05-20
115
+
116
+ _No customer-facing changes in this release._
117
+
118
+
119
+ ## [v1.14.1] - 2026-05-19
120
+
121
+ ### Added
122
+
123
+ - dc-py rooms — path-segment URLs + trim type enum (be09d76)
124
+ - dc 1.14.0 — room + room-messages; rooms enum adds direct/group (a7b8ea9)
125
+
126
+
127
+ ## [v1.13.1] - 2026-05-19
128
+
129
+ ### Fixed
130
+
131
+ - stabilize MCP stdio transport (21c8022)
132
+
133
+
134
+ ## [v1.12.5] - 2026-05-14
135
+
136
+ _No customer-facing changes in this release._
137
+
138
+
139
+ ## [v1.12.1] - 2026-05-08
140
+
141
+ _No customer-facing changes in this release._
142
+
143
+
144
+ ## [v1.11.1] - 2026-05-07
145
+
146
+ _No customer-facing changes in this release._
147
+
148
+
149
+ ## [v1.10.5] - 2026-05-07
150
+
151
+ _No customer-facing changes in this release._
152
+
153
+
154
+ ## [v1.10.4] - 2026-05-04
155
+
156
+ _No customer-facing changes in this release._
157
+
158
+
159
+ ## [v1.10.2] - 2026-05-04
160
+
161
+ _No customer-facing changes in this release._
162
+
163
+
164
+ ## [v1.9.1] - 2026-05-04
165
+
166
+ _No customer-facing changes in this release._
167
+
168
+
169
+ ## [v1.8.1] - 2026-05-04
170
+
171
+ _No customer-facing changes in this release._
172
+
173
+
174
+ ## [v1.7.1] - 2026-05-03
175
+
176
+ _No customer-facing changes in this release._
177
+
178
+
179
+ ## [v1.6.3] - 2026-05-02
180
+
181
+ ### Fixed
182
+
183
+ - rewrite CLI smoke step + bump to 1.6.3 (b098dfe)
184
+
185
+
186
+ ## [v1.6.2] - 2026-05-02
187
+
188
+ ### Added
189
+
190
+ - PyPI packaging (`dynamitecircle`) + publish workflow (77aefa4)
191
+ - add Gemini CLI pre-approval (.gemini/settings.json) (fd09acb)
192
+ - pre-approve dc MCP server + skill + CLI for Claude Code & Codex (4d234ec)
193
+ - flip canonical paths to /dc/ and /docs/, rename dc_skill.py → dc.py (42aa541)
194
+
195
+ ### Changed
196
+
197
+ - monorepo restructure — repo renamed to dc, Python client moved to /py/ (80d7166)
198
+ - SKILL_VERSION → DC_API_VERSION; deduplicate Quick start sections in README (a1e99c6)
199
+ - User-Agent → 'dc-py/<version>' (e1b5a6a)
200
+ - rename Skill base class → Runtime; SkillError → DCError; SkillResult → Result (06a2c44)
201
+ - rename public class DCSkill → DC, rename doc files (bc9d04f)
202
+
203
+ ### Fixed
204
+
205
+ - use only-include + bypass-selection so sdist ships py/ (c42abed)
206
+
207
+
208
+ ## [v1.6.1] - 2026-05-02
209
+
210
+ ### Added
211
+
212
+ - add manifest.json + LICENSE; bump to 1.6.1 (8e949d6)
213
+ - add dc/ symlink shortcut + drop hardcoded command counts (96bc6a3)
214
+
215
+
216
+ ## [v1.6.0] - 2026-04-30
217
+
218
+ _No customer-facing changes in this release._
219
+
220
+
221
+ ## [v1.5.0] - 2026-04-30
222
+
223
+ ### Added
224
+
225
+ - add announcements + event-extras commands (10 new) (f4f901f)
226
+
227
+
228
+ ## [v1.3.0] - 2026-04-30
229
+
230
+ ### Added
231
+
232
+ - add 429 retry handling and `limits` command (02bf994)
233
+
234
+
235
+ ## [v1.0.0] - 2026-04-30
236
+
237
+ _No customer-facing changes in this release._
238
+
239
+
17
240
  ## [Unreleased]
18
241
 
242
+ ### Added
243
+
244
+ - TypeScript npm library scaffold under `ts/`, published as
245
+ `@dynamitecircle/dc`, with a hand-written SDK surface for every pinned
246
+ Member API operation. It is a library only: no CLI and no MCP server.
247
+ - Pinned OpenAPI contract under `contracts/` plus an explicit operation map
248
+ that validates API operation → Python command → TypeScript method parity.
249
+
19
250
  ## [2.0.4] – 2026-06-16
20
251
 
21
252
  ### Added
@@ -277,7 +508,7 @@ cutover — were server-only with no client surface change, so no client release
277
508
 
278
509
  No client-side change required — the `hint` field on 404 payloads
279
510
  is already surfaced by `DCError`. Bump kept in lockstep with the
280
- deployed server version per the triple-lock rule.
511
+ deployed API contract version per the triple-lock rule.
281
512
 
282
513
  ---
283
514
 
@@ -1121,7 +1352,8 @@ Tag exists but no PyPI release. Replaced by 1.6.3.
1121
1352
 
1122
1353
  ---
1123
1354
 
1124
- [Unreleased]: https://github.com/dynamitecircle/dc/compare/v2.0.4...HEAD
1355
+ [Unreleased]: https://github.com/dynamitecircle/dc/compare/v2.3.1...HEAD
1356
+ [2.3.1]: https://github.com/dynamitecircle/dc/compare/v2.0.4...v2.3.1
1125
1357
  [2.0.4]: https://github.com/dynamitecircle/dc/compare/v2.0.1...v2.0.4
1126
1358
  [2.0.1]: https://github.com/dynamitecircle/dc/releases/tag/v2.0.1
1127
1359
  [1.23.3]: https://github.com/dynamitecircle/dc/releases/tag/v1.23.3
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dynamitecircle
3
- Version: 2.0.4
3
+ Version: 2.3.1
4
4
  Summary: Official Python client for the public Dynamite Circle Member API. CLI, library, Agent Skill, and MCP server in one file.
5
5
  Project-URL: Homepage, https://github.com/dynamitecircle/dc
6
6
  Project-URL: Repository, https://github.com/dynamitecircle/dc
@@ -51,14 +51,18 @@ Provides-Extra: test
51
51
  Requires-Dist: pytest>=7.0; extra == 'test'
52
52
  Description-Content-Type: text/markdown
53
53
 
54
- # DC Official Client
54
+ # DC Official Clients
55
55
 
56
- The official Python client for the [Dynamite Circle Member API](https://www.dynamitecircle.com/developers/) — your own profile, trips, events, virtual events, tickets, invites, inbox, rooms, chapters, places lookup, and the weekly locator digest.
56
+ Official clients for the [Dynamite Circle Member API](https://www.dynamitecircle.com/developers/) — your own profile, trips, events, virtual events, tickets, invites, inbox, rooms, chapters, places lookup, and the weekly locator digest.
57
57
 
58
- A single self-contained file. Zero dependencies (stdlib only). Works as a CLI, a Python library, **and** a [Model Context Protocol](https://modelcontextprotocol.io) server. Compatible with Claude Code, Claude Desktop, Codex CLI, Gemini CLI, Cursor, GitHub Copilot, and every other Agent Skills / MCP-compatible tool.
58
+ The Python client is a single self-contained file. Zero dependencies (stdlib only). Works as a CLI, a Python library, **and** a [Model Context Protocol](https://modelcontextprotocol.io) server. Compatible with Claude Code, Claude Desktop, Codex CLI, Gemini CLI, Cursor, GitHub Copilot, and every other Agent Skills / MCP-compatible tool.
59
+
60
+ The TypeScript client is an npm library for trusted server-side TypeScript projects. It is not a CLI and not an MCP server.
59
61
 
60
62
  ```
61
- py/dc.py one file, three integration modes
63
+ py/dc.py Python: CLI + library + MCP server
64
+ ts/src/ ← TypeScript: npm library
65
+ contracts/ ← pinned OpenAPI contract shared by both clients
62
66
  ```
63
67
 
64
68
  ## About the Dynamite Circle
@@ -153,6 +157,21 @@ The same `dc.py` file is shipped as **four** integrations — pick whichever fit
153
157
 
154
158
  The `mcp` package is **lazy-imported** — Agent Skill / CLI / Python-library users never need it.
155
159
 
160
+ ### TypeScript npm library
161
+
162
+ For TypeScript projects, use the package under [`ts/`](ts/):
163
+
164
+ ```ts
165
+ import { DC } from "@dynamitecircle/dc";
166
+
167
+ const dc = new DC({ apiKey: process.env.DC_API_KEY! });
168
+
169
+ const profile = await dc.profile.get();
170
+ const trips = await dc.trips.list({ limit: 10 });
171
+ ```
172
+
173
+ Keep `dk_...` API keys server-side. Do not ship a member API key in browser JavaScript.
174
+
156
175
  ### Don't want to install anything? Use the hosted MCP
157
176
 
158
177
  The DC Member API is **also a hosted MCP server** — a remote endpoint you point your AI app at, with nothing to clone, install, or update:
@@ -437,7 +456,7 @@ The full live reference for the DC Member API — every endpoint, parameter, and
437
456
 
438
457
  ## Staying up to date
439
458
 
440
- The DC Member API ships new endpoints and refinements regularly. This skill is the official client and we update it whenever the API changes. **Plan for updates** — the skill will warn you on stderr the first time a request returns a server `X-API-Version` newer than `DC_API_VERSION`, and major-version bumps may break older clients.
459
+ The DC Member API ships new endpoints and refinements regularly. This skill is the official client and we update it whenever the API changes. **Plan for updates** — the skill will warn you on stderr the first time a request returns an `X-API-Version` newer than `DC_API_VERSION`, and major-version bumps may break older clients.
441
460
 
442
461
  **The no-maintenance option:** if you use the [hosted MCP](#hosted-mcp-no-install-always-current) (`https://api.dynamitecircle.com/mcp`), there's nothing to update — the server always runs the current API version. The strategies below apply only to the **local client**.
443
462
 
@@ -544,7 +563,7 @@ Best for: CI environments, ephemeral containers, scripted setups.
544
563
 
545
564
  - **Stay current.** The DC Member API ships new endpoints regularly and the client mirrors them; running stale means missing features and (eventually) compatibility warnings on stderr.
546
565
  - **Run `self-test` after every update.** Five seconds, catches breakage.
547
- - **Watch stderr the first time you call any command after updating.** The version-mismatch warning prints once per process when the server is on a newer minor/major.
566
+ - **Watch stderr the first time you call any command after updating.** The version-mismatch warning prints once per process when the API is on a newer minor/major.
548
567
  - **Major version bumps may be backwards-incompatible.** Read the release notes on the GitHub repo before pulling across a major boundary.
549
568
 
550
569
  ## Rate limits
@@ -590,7 +609,16 @@ dc/
590
609
  │ ├── .env.dc.example # template
591
610
  │ └── .env.dc # gitignored (created by `setup`)
592
611
 
593
- │ (Future: go/, node/, rs/ folders for sister clients in other languages)
612
+ ├── ts/ # TypeScript npm library (@dynamitecircle/dc)
613
+ │ ├── src/ # hand-written SDK surface
614
+ │ ├── tests/ # contract + request behavior tests
615
+ │ ├── examples/ # TypeScript usage examples
616
+ │ ├── package.json
617
+ │ └── tsconfig.json
618
+
619
+ ├── contracts/ # pinned API contract shared by clients
620
+ │ ├── openapi.json # committed snapshot of /openapi.json
621
+ │ └── operation-map.json # OpenAPI op → Python command → TS method
594
622
 
595
623
  ├── DC/
596
624
  │ └── SKILL.md → ../py/SKILL.md # human-friendly skill path (symlink)
@@ -616,9 +644,9 @@ dc/
616
644
 
617
645
  ### About the layout
618
646
 
619
- This is a **monorepo**. The Python client lives at `/py/` so we can add future sister clients (`go/`, `node/`, `rs/`) at the same level they all wrap the same DC Member API. `/docs/` is shared. The dotfile-prefixed directories (`.claude/`, `.agents/`, `.gemini/`) exist because AI tools auto-discover skills from those specific paths — they're kept hidden but each one **symlinks (or points) straight to the canonical folder**, so you only edit files in one place. Edit `py/dc.py` and Claude Code, Codex, and Gemini CLI all see the same file via their respective discovery directories. Gemini CLI also reads `.agents/skills/` as an alias, so we don't need a redundant `.gemini/skills/` symlink.
647
+ This is a **monorepo**. The Python client lives at `/py/`; the TypeScript client lives at `/ts/`. Both wrap the same DC Member API and are validated against the pinned contract in `/contracts/`. `/docs/` is shared. The dotfile-prefixed directories (`.claude/`, `.agents/`, `.gemini/`) exist because AI tools auto-discover skills from those specific paths — they're kept hidden but each one **symlinks (or points) straight to the canonical folder**, so you only edit files in one place. Edit `py/dc.py` and Claude Code, Codex, and Gemini CLI all see the same file via their respective discovery directories. Gemini CLI also reads `.agents/skills/` as an alias, so we don't need a redundant `.gemini/skills/` symlink.
620
648
 
621
- If you're adding new code or docs, edit `py/` (or `docs/`) directly. The discovery folders take care of themselves.
649
+ If you're adding Python code or skill docs, edit `py/` (or `docs/`) directly. If you're adding TypeScript library code, edit `ts/`. The discovery folders take care of themselves.
622
650
 
623
651
  ### Pre-approval out of the box
624
652
 
@@ -631,4 +659,3 @@ This repo is maintained by the Dynamite Circle team. It's read-only for the publ
631
659
  ## License
632
660
 
633
661
  [MIT](LICENSE) — see the LICENSE file for the full text.
634
-
@@ -1,11 +1,15 @@
1
- # DC Official Client
1
+ # DC Official Clients
2
2
 
3
- The official Python client for the [Dynamite Circle Member API](https://www.dynamitecircle.com/developers/) — your own profile, trips, events, virtual events, tickets, invites, inbox, rooms, chapters, places lookup, and the weekly locator digest.
3
+ Official clients for the [Dynamite Circle Member API](https://www.dynamitecircle.com/developers/) — your own profile, trips, events, virtual events, tickets, invites, inbox, rooms, chapters, places lookup, and the weekly locator digest.
4
4
 
5
- A single self-contained file. Zero dependencies (stdlib only). Works as a CLI, a Python library, **and** a [Model Context Protocol](https://modelcontextprotocol.io) server. Compatible with Claude Code, Claude Desktop, Codex CLI, Gemini CLI, Cursor, GitHub Copilot, and every other Agent Skills / MCP-compatible tool.
5
+ The Python client is a single self-contained file. Zero dependencies (stdlib only). Works as a CLI, a Python library, **and** a [Model Context Protocol](https://modelcontextprotocol.io) server. Compatible with Claude Code, Claude Desktop, Codex CLI, Gemini CLI, Cursor, GitHub Copilot, and every other Agent Skills / MCP-compatible tool.
6
+
7
+ The TypeScript client is an npm library for trusted server-side TypeScript projects. It is not a CLI and not an MCP server.
6
8
 
7
9
  ```
8
- py/dc.py one file, three integration modes
10
+ py/dc.py Python: CLI + library + MCP server
11
+ ts/src/ ← TypeScript: npm library
12
+ contracts/ ← pinned OpenAPI contract shared by both clients
9
13
  ```
10
14
 
11
15
  ## About the Dynamite Circle
@@ -100,6 +104,21 @@ The same `dc.py` file is shipped as **four** integrations — pick whichever fit
100
104
 
101
105
  The `mcp` package is **lazy-imported** — Agent Skill / CLI / Python-library users never need it.
102
106
 
107
+ ### TypeScript npm library
108
+
109
+ For TypeScript projects, use the package under [`ts/`](ts/):
110
+
111
+ ```ts
112
+ import { DC } from "@dynamitecircle/dc";
113
+
114
+ const dc = new DC({ apiKey: process.env.DC_API_KEY! });
115
+
116
+ const profile = await dc.profile.get();
117
+ const trips = await dc.trips.list({ limit: 10 });
118
+ ```
119
+
120
+ Keep `dk_...` API keys server-side. Do not ship a member API key in browser JavaScript.
121
+
103
122
  ### Don't want to install anything? Use the hosted MCP
104
123
 
105
124
  The DC Member API is **also a hosted MCP server** — a remote endpoint you point your AI app at, with nothing to clone, install, or update:
@@ -384,7 +403,7 @@ The full live reference for the DC Member API — every endpoint, parameter, and
384
403
 
385
404
  ## Staying up to date
386
405
 
387
- The DC Member API ships new endpoints and refinements regularly. This skill is the official client and we update it whenever the API changes. **Plan for updates** — the skill will warn you on stderr the first time a request returns a server `X-API-Version` newer than `DC_API_VERSION`, and major-version bumps may break older clients.
406
+ The DC Member API ships new endpoints and refinements regularly. This skill is the official client and we update it whenever the API changes. **Plan for updates** — the skill will warn you on stderr the first time a request returns an `X-API-Version` newer than `DC_API_VERSION`, and major-version bumps may break older clients.
388
407
 
389
408
  **The no-maintenance option:** if you use the [hosted MCP](#hosted-mcp-no-install-always-current) (`https://api.dynamitecircle.com/mcp`), there's nothing to update — the server always runs the current API version. The strategies below apply only to the **local client**.
390
409
 
@@ -491,7 +510,7 @@ Best for: CI environments, ephemeral containers, scripted setups.
491
510
 
492
511
  - **Stay current.** The DC Member API ships new endpoints regularly and the client mirrors them; running stale means missing features and (eventually) compatibility warnings on stderr.
493
512
  - **Run `self-test` after every update.** Five seconds, catches breakage.
494
- - **Watch stderr the first time you call any command after updating.** The version-mismatch warning prints once per process when the server is on a newer minor/major.
513
+ - **Watch stderr the first time you call any command after updating.** The version-mismatch warning prints once per process when the API is on a newer minor/major.
495
514
  - **Major version bumps may be backwards-incompatible.** Read the release notes on the GitHub repo before pulling across a major boundary.
496
515
 
497
516
  ## Rate limits
@@ -537,7 +556,16 @@ dc/
537
556
  │ ├── .env.dc.example # template
538
557
  │ └── .env.dc # gitignored (created by `setup`)
539
558
 
540
- │ (Future: go/, node/, rs/ folders for sister clients in other languages)
559
+ ├── ts/ # TypeScript npm library (@dynamitecircle/dc)
560
+ │ ├── src/ # hand-written SDK surface
561
+ │ ├── tests/ # contract + request behavior tests
562
+ │ ├── examples/ # TypeScript usage examples
563
+ │ ├── package.json
564
+ │ └── tsconfig.json
565
+
566
+ ├── contracts/ # pinned API contract shared by clients
567
+ │ ├── openapi.json # committed snapshot of /openapi.json
568
+ │ └── operation-map.json # OpenAPI op → Python command → TS method
541
569
 
542
570
  ├── DC/
543
571
  │ └── SKILL.md → ../py/SKILL.md # human-friendly skill path (symlink)
@@ -563,9 +591,9 @@ dc/
563
591
 
564
592
  ### About the layout
565
593
 
566
- This is a **monorepo**. The Python client lives at `/py/` so we can add future sister clients (`go/`, `node/`, `rs/`) at the same level they all wrap the same DC Member API. `/docs/` is shared. The dotfile-prefixed directories (`.claude/`, `.agents/`, `.gemini/`) exist because AI tools auto-discover skills from those specific paths — they're kept hidden but each one **symlinks (or points) straight to the canonical folder**, so you only edit files in one place. Edit `py/dc.py` and Claude Code, Codex, and Gemini CLI all see the same file via their respective discovery directories. Gemini CLI also reads `.agents/skills/` as an alias, so we don't need a redundant `.gemini/skills/` symlink.
594
+ This is a **monorepo**. The Python client lives at `/py/`; the TypeScript client lives at `/ts/`. Both wrap the same DC Member API and are validated against the pinned contract in `/contracts/`. `/docs/` is shared. The dotfile-prefixed directories (`.claude/`, `.agents/`, `.gemini/`) exist because AI tools auto-discover skills from those specific paths — they're kept hidden but each one **symlinks (or points) straight to the canonical folder**, so you only edit files in one place. Edit `py/dc.py` and Claude Code, Codex, and Gemini CLI all see the same file via their respective discovery directories. Gemini CLI also reads `.agents/skills/` as an alias, so we don't need a redundant `.gemini/skills/` symlink.
567
595
 
568
- If you're adding new code or docs, edit `py/` (or `docs/`) directly. The discovery folders take care of themselves.
596
+ If you're adding Python code or skill docs, edit `py/` (or `docs/`) directly. If you're adding TypeScript library code, edit `ts/`. The discovery folders take care of themselves.
569
597
 
570
598
  ### Pre-approval out of the box
571
599
 
@@ -578,4 +606,3 @@ This repo is maintained by the Dynamite Circle team. It's read-only for the publ
578
606
  ## License
579
607
 
580
608
  [MIT](LICENSE) — see the LICENSE file for the full text.
581
-
@@ -0,0 +1,10 @@
1
+ # DC Member API Contract
2
+
3
+ This directory pins the API contract used to validate the official clients.
4
+
5
+ - `openapi.json` is a committed snapshot of `https://api.dynamitecircle.com/openapi.json`.
6
+ - `operation-map.json` maps each OpenAPI operation to the Python command and
7
+ TypeScript SDK method that covers it.
8
+
9
+ CI should read this pinned contract, not the live API. Live drift checks can be
10
+ run manually during releases, then the pinned snapshot is updated intentionally.