dynamitecircle 1.6.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.
@@ -0,0 +1,29 @@
1
+ # API keys — never commit
2
+ .env
3
+ .env.local
4
+ .env.*.local
5
+ .env.dc
6
+ **/.env.dc
7
+
8
+ # Python
9
+ __pycache__/
10
+ *.pyc
11
+ *.pyo
12
+ .venv/
13
+ .venv*
14
+ *.egg-info/
15
+ dist/
16
+ build/
17
+
18
+ # Node (in case any tool ships a sub-app)
19
+ node_modules/
20
+
21
+ # OS
22
+ .DS_Store
23
+ Thumbs.db
24
+
25
+ # Editor
26
+ .vscode/*
27
+ !.vscode/extensions.json
28
+ !.vscode/settings.json
29
+ .idea/
@@ -0,0 +1,234 @@
1
+ # Changelog
2
+
3
+ All notable changes to the **`dc` client repo** (formerly `dc-official` /
4
+ `dc-py`) are listed here. The version
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.
9
+
10
+ The format is loosely based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
11
+ and the project follows [Semantic Versioning](https://semver.org/) for
12
+ the public Python API surface (`dc.DC`, `dc.DCError`, `dc.Result`,
13
+ `dc.Runtime`).
14
+
15
+ ---
16
+
17
+ ## [Unreleased]
18
+
19
+ Structural / repo-layout changes since 1.6.1 — no API surface changes,
20
+ no `DC_API_VERSION` bump (the version constant tracks the API, not the
21
+ file structure).
22
+
23
+ ### Changed
24
+
25
+ - **Repo renamed** — `dynamitecircle/dc-py` → `dynamitecircle/dc`. The
26
+ repo is now a **monorepo** so future Go / Node / Rust clients can sit
27
+ alongside the Python one without a separate repo per language.
28
+ - **Python client moved to `/py/`** — `/dc/dc.py` → `/py/dc.py`,
29
+ `/dc/SKILL.md` → `/py/SKILL.md`, etc. The `.claude/skills/dc` and
30
+ `.agents/skills/dc` symlinks now point at `../../py` so AI-tool
31
+ auto-discovery is unchanged. (Future siblings will live at `/go/`,
32
+ `/node/`, `/rs/`.)
33
+ - **Layout** — canonical files moved out of dotfile-prefixed directories
34
+ so they're visible in `ls`. Python client is at `/py/` and the
35
+ design docs are `/docs/`. `.claude/skills/dc/`, `.agents/skills/dc/`,
36
+ `.claude/docs/`, and `.agents/docs/` are now symlinks pointing at the
37
+ canonical folders. AI-tool auto-discovery still works through the
38
+ symlinks; you only edit files in one place.
39
+ - **File rename** — `dc/dc_skill.py` → `dc/dc.py` (later moved to
40
+ `py/dc.py` in the monorepo flip; the `_skill` suffix was redundant
41
+ once the folder itself is the skill).
42
+ - **Class renames** — public Python surface refreshed:
43
+ - `DCSkill` → `DC`
44
+ - `Skill` (base) → `Runtime`
45
+ - `SkillError` → `DCError`
46
+ - `SkillResult` → `Result`
47
+ - Old: `from dc_skill import DCSkill; DCSkill().profile()`
48
+ - New: `from dc import DC; DC().profile()`
49
+ - **Doc renames** for symmetry inside `docs/`:
50
+ - `docs/skill-conventions.md` → `docs/skill-info.md`
51
+ - `docs/mcp.md` → `docs/mcp-info.md`
52
+ - **User-Agent** — `dc-official-skill/<version>` →
53
+ `dc-py/<version>`. Reserves a clean naming pattern for future ports
54
+ (`dc-go`, `dc-node`, `dc-rs`).
55
+
56
+ ### Added
57
+
58
+ - **PyPI packaging** — `pyproject.toml` at repo root (hatchling backend)
59
+ builds the `dynamitecircle` package from `py/dc.py`. The single file
60
+ ships in the wheel as `dynamitecircle.py`, so installs give users
61
+ `from dynamitecircle import DC` and a `dc` console script on PATH.
62
+ Optional `[mcp]` extra installs the MCP server dependency. Version is
63
+ read at build time from `DC_API_VERSION` so it stays in lockstep with
64
+ the repo's existing version constant.
65
+ - **`main()` entry point** in `py/dc.py` — extracted from the
66
+ `if __name__ == "__main__"` block so the `dc` console script
67
+ (`pip install dynamitecircle` → `dc help`) can target it directly.
68
+ - **GitHub Actions publish workflow** at `.github/workflows/publish.yml`
69
+ — builds wheel + sdist on every push, smoke-tests installs across
70
+ Python 3.9 + 3.12 on Ubuntu / macOS / Windows, publishes to PyPI on
71
+ every `v*` tag via OIDC trusted publishing (no API tokens stored),
72
+ then auto-creates a GitHub Release with notes pulled from CHANGELOG.md.
73
+ - **README rewrite** — opens with "DC Official Client" + a paragraph
74
+ about what the Dynamite Circle actually is (founded 2011, ~1,500
75
+ founders, $100k+ revenue requirement) with inline links to
76
+ dynamitecircle.com and the apply funnel, both UTM-tagged so we can
77
+ track inbound from this repo. Removes the "multi-language client suite"
78
+ framing — only the Python client exists today.
79
+ - **Pre-approval configs** for all three auto-discovery AI tools so users
80
+ don't get per-tool-call approval prompts when they open this repo:
81
+ - Claude Code: `.claude/settings.json` with `mcp__dc__*`,
82
+ `Skill(dc *)`, `enableAllProjectMcpServers: true`
83
+ - Codex CLI: `.codex/config.toml` with
84
+ `default_tools_approval_mode = "approve"`
85
+ - Gemini CLI: `.gemini/settings.json` with `trust: true`
86
+ - **`Agent Skill` row** in the README's "How it's exposed" table —
87
+ acknowledges the SKILL.md auto-discovery path that 90% of users will
88
+ actually use, alongside CLI / Python import / MCP server.
89
+
90
+ ### Removed
91
+
92
+ - **Pin-to-commit guidance** from the README's "Update etiquette"
93
+ section — the API moves fast enough that pinning is anti-recommended.
94
+ - **Hardcoded command counts** ("28 commands", "29 commands") replaced
95
+ with "full Member API coverage" + a pointer to `help` for the live
96
+ list. Counts went stale every time we shipped.
97
+ - **`dk_<userID>_<random>` format string** replaced with `dk_<api-key>`
98
+ in user-facing docs — members shouldn't have to know the key's
99
+ internal structure.
100
+
101
+ ---
102
+
103
+ ## [1.6.1] – 2026-05-02
104
+
105
+ ### Added
106
+
107
+ - **`manifest.json`** at the repo root — MCPB schema 0.3
108
+ ([MCP 2025-11 spec](https://modelcontextprotocol.io/specification/2025-11-25/changelog)).
109
+ Carries `display_name`, `long_description`, `author`, `repository`,
110
+ `license`, `capabilities`, `compatibility`, `user_config` blocks.
111
+ Aligns the repo with the `.mcpb` bundle convention so we can ship
112
+ installable bundles later.
113
+ - **MIT `LICENSE`** at the repo root. Repo is private today, but the
114
+ license is in place if/when it opens up.
115
+ - **`dc/` symlink at the repo root** — shortcut pointing at
116
+ `.claude/skills/dc/` (later inverted in the unreleased layout flip,
117
+ but introduced here).
118
+
119
+ ### Changed
120
+
121
+ - **`DC_API_VERSION`** bumped to 1.6.1 to match the deployed server API
122
+ release.
123
+ - **README's "Three integration modes" → "How it's exposed"** with
124
+ Agent Skill added as the primary integration.
125
+ - **Cross-platform** — explicit UTF-8 stdout/stderr reconfigure for
126
+ legacy Windows `cmd.exe`; chmod-on-Windows note in `setup`; README
127
+ "Platform support" section.
128
+
129
+ ---
130
+
131
+ ## [1.6.0] – 2026-04-30
132
+
133
+ ### Added
134
+
135
+ - **MCP per-command JSON Schemas** — `@skill_command(args={...})` lets
136
+ each command declare typed input schemas (types, required, enums,
137
+ formats, descriptions). MCP clients now see rich autocomplete and
138
+ validation instead of a `additionalProperties: true` fallback.
139
+ - **`mcpSchemas` check** in `self-test` — fails if any command is
140
+ missing an `args=` schema, catching coverage drift.
141
+ - **Hive-style `emit()`** — ContextVar sink, `Result` wrapper. Commands
142
+ can call `Runtime.emit(...)` (or pass dict/list for auto-JSON
143
+ serialization) to send follow-up text to the calling agent. Surfaces
144
+ to CLI stderr, MCP TextContent, or `result.emitted` for Python.
145
+ JSON envelope `{ok, client, command, result, emitted}` when `--json`
146
+ is set with non-empty emit.
147
+ - **Version-mismatch warning** — `DC_API_VERSION` constant. Every request
148
+ sends `User-Agent: dc-py/<version>` and reads the server's
149
+ `X-API-Version` response header. `_VersionTracker` warns once per
150
+ process when the server is on a newer minor/major.
151
+
152
+ ---
153
+
154
+ ## [1.5.0] – 2026-04-30
155
+
156
+ ### Added
157
+
158
+ - **Announcements** (2 commands):
159
+ - `announcements` — cursor-paginated mixed feed across visible
160
+ broadcast channels (DC, DCBKK, DCMEX, DC BLACK)
161
+ - `announcements-latest` — one most-recent announcement per channel
162
+ - **Event extras** — 8 commands gated by an event ticket:
163
+ - `event-schedule` — sessions grouped by day; wall-clock ISO time +
164
+ IANA timezone (NOT real UTC — read both fields together)
165
+ - `event-agenda` — your bookmarked sessions + joined meetups
166
+ - `event-meetups` — approved member-organized meetups
167
+ - `event-sponsors` — sponsors ordered by tier then display order
168
+ - `session-attendees` — who else bookmarked a session
169
+ - `meetup-attendees` — who else RSVP'd to a meetup
170
+ - `session-bookmark` — add/remove a session from your agenda
171
+ - `meetup-rsvp` — join/leave a meetup
172
+
173
+ ---
174
+
175
+ ## [1.3.0] – 2026-04-30
176
+
177
+ ### Added
178
+
179
+ - **`limits` command** — wraps `/profile/limits`. Returns effective
180
+ per-minute / per-day rate limits and current usage as JSON, so
181
+ scripts get a structured snapshot without parsing `X-RateLimit-*`
182
+ headers manually.
183
+ - **HTTP 429 retry** — `HttpClient` auto-retries on rate-limit responses.
184
+ Wait time parsed from `Retry-After` (RFC 7231, preferred), then
185
+ `X-RateLimit-Reset`, then "Try again in N seconds." regex from the
186
+ body, then a 60-second fallback. Configurable via class attributes
187
+ (`max_retries=1`, `max_retry_wait=120`, `fallback_retry_wait=60`).
188
+ Emits a friendly `Rate limited (HTTP 429) — waiting Ns before retry…`
189
+ message to stderr before sleeping; no silent multi-minute hangs.
190
+
191
+ ---
192
+
193
+ ## [1.0.0] – 2026-04-30
194
+
195
+ ### Added
196
+
197
+ - **Initial scaffold** — `Dynamite-Circle-Builders/dc-official` private
198
+ repo created with the single-file Python client at
199
+ `.claude/skills/dc/dc_skill.py` (later moved to `dc/dc.py`).
200
+ - **28 commands** wrapping the public DC Member API — profile,
201
+ trips (CRUD + overlaps), events + RSVP, virtual events + RSVP,
202
+ tickets, invites, inbox, rooms, chapters, places lookup, locator
203
+ digest. Plus `setup` (writes API key to skill-local `.env.dc`) and
204
+ `self-test` (env + network + `/profile` end-to-end).
205
+ - **Three integration modes**:
206
+ - CLI (`python3 dc_skill.py <command>`) — stdlib only
207
+ - Python library (`from dc_skill import DCSkill`) — stdlib only
208
+ - MCP server (`dc_skill.py --mcp`) — `pip install mcp` (optional, lazy import)
209
+ - **Auto-discovery configs** for Claude Code (`.mcp.json`),
210
+ Codex CLI (`.codex/config.toml`), Gemini CLI (`GEMINI.md` symlink),
211
+ GitHub Copilot (`.github/copilot-instructions.md`), and the
212
+ `.agents/skills/` symlink for Codex skill discovery.
213
+ - **Output formats** — text (default, pretty JSON for dicts/lists),
214
+ `--json` (canonical machine-readable), `--python` (eval-safe `repr`).
215
+ - **Cursor pagination** envelope `{items, count, cursor, has_more}`
216
+ on every list-returning command. Non-paginated extras (e.g.
217
+ `totalUnread` on `inbox`) pass through under `extra`.
218
+ - **Hive-inspired conventions**: two-class pattern (`DC` public wrapper
219
+ + `_DCCore` private helper), `@skill_command(name=, help=, parser=)`
220
+ decorator, space-form CLI flags, ArgHelpers + HttpClient utilities.
221
+ - **Cross-platform-safe** — every text-mode file op specifies
222
+ `encoding="utf-8"`, atomic env-file write via `.tmp` + `replace()`,
223
+ chmod 600 on `.env.dc` (no-op on Windows, documented).
224
+ - **No telemetry, no usage tracking, no error logging** — public-grade
225
+ design intentionally stripped of internal Hive concerns.
226
+
227
+ ---
228
+
229
+ [Unreleased]: https://github.com/dynamitecircle/dc/compare/v1.6.1...HEAD
230
+ [1.6.1]: https://github.com/dynamitecircle/dc/releases/tag/v1.6.1
231
+ [1.6.0]: https://github.com/dynamitecircle/dc/releases/tag/v1.6.0
232
+ [1.5.0]: https://github.com/dynamitecircle/dc/releases/tag/v1.5.0
233
+ [1.3.0]: https://github.com/dynamitecircle/dc/releases/tag/v1.3.0
234
+ [1.0.0]: https://github.com/dynamitecircle/dc/releases/tag/v1.0.0
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Dynamite Circle
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.