devcake-cli 0.1.0__py3-none-any.whl

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,375 @@
1
+ Metadata-Version: 2.4
2
+ Name: devcake-cli
3
+ Version: 0.1.0
4
+ Summary: DevCake host CLI (up/down/status/doctor/setup/baker run)
5
+ License: GPL-3.0-only
6
+ Project-URL: Homepage, https://github.com/flieber-inc/devcake
7
+ Project-URL: Documentation, https://github.com/flieber-inc/devcake/tree/main/docs
8
+ Keywords: devcake,agents,orchestration,self-hosted
9
+ Requires-Python: >=3.12
10
+ Description-Content-Type: text/markdown
11
+ License-File: LICENSE
12
+ Dynamic: license-file
13
+
14
+ <div align="center">
15
+ <picture>
16
+ <source media="(prefers-color-scheme: dark)" srcset="docs/img/brand/A-devcake-full-color-transparent.svg">
17
+ <img src="docs/img/brand/C-devcake-full-black-transparent.svg" alt="DevCake" width="380">
18
+ </picture>
19
+
20
+ ### Your personal software factory. Tickets in, pull requests out.
21
+
22
+ </div>
23
+
24
+ DevCake turns the task board you already run into a software team. Write a
25
+ ticket the way you would brief a colleague; DevCake staffs it with an AI
26
+ developer in a fresh, disposable container — it triages, plans, implements,
27
+ and passes every mission through REVIEW — and the work comes back as a **pull
28
+ request**, with the full **transcript and token bill** attached to the ticket.
29
+
30
+ You steer with labels. You own the merge. **Done means merged** — with
31
+ auto-merge off (the default), DevCake parks approved work and waits for you.
32
+
33
+ - **Board-native.** Linear or GitHub / GitLab / Gitea Issues — no second
34
+ work queue, no chat window pretending to be one. The bundled admin UI is
35
+ for configuration and operations; the board drives the work. A human edit
36
+ always beats an in-flight agent.
37
+ - **Receipts, not vibes.** Missions post their transcript and token cost to
38
+ the ticket (the documented invariant, named exceptions and all), and every
39
+ dispatch, kill, sweep, and merge is traced end to end.
40
+ - **Your box, your rules.** Self-hosted on a dedicated machine, with **your**
41
+ model subscriptions or API keys and **your** forge (code-hosting platform)
42
+ credentials. There is no hosted SaaS; the control plane does not ship your
43
+ secrets anywhere.
44
+ - **A workforce, not a bot.** Six CLI harnesses — Claude Code, Grok Build,
45
+ Codex, Pi, OpenCode, Qwen Code — staffable per role: judgment work here,
46
+ volume work there. Every harness release upgrades your workforce without a
47
+ line of DevCake changing.
48
+
49
+ > **The deal, stated plainly:** anyone who can write tickets on the
50
+ > configured team (or land content in a configured repo) can influence agents
51
+ > that hold forge and model credentials. You own branch protection, team
52
+ > membership, and whether the **app** may auto-merge after REVIEW. That
53
+ > ownership is *why* the output can be trusted. Full contract:
54
+ > [`docs/14-security.md`](docs/14-security.md).
55
+
56
+ **Proof over promises:** we pointed DevCake at its own codebase — one board
57
+ prompt became 54 self-decomposed tickets, 257 agent runs, and 42 human-merged
58
+ pull requests, receipts included. Read the field report:
59
+ [`docs/evidence/2026-08-devcake-audits-devcake.md`](docs/evidence/2026-08-devcake-audits-devcake.md).
60
+
61
+ Product voice and pitch variants: [`docs/17-positioning.md`](docs/17-positioning.md).
62
+
63
+ ---
64
+
65
+ ## Why DevCake?
66
+
67
+ The deepest AI-assisted work today happens in CLI harnesses — Claude Code,
68
+ Grok Build, Codex, Pi, OpenCode, and Qwen Code — with an expert invisibly
69
+ orchestrating each session:
70
+ curating context, sizing the task, sequencing the work, verifying the output.
71
+ DevCake mechanizes that orchestration for board-shaped work. It is a
72
+ **meta-harness** — a CLI agent orchestrator that staffs those harnesses rather
73
+ than competing with them: not a new coding agent, but a session made
74
+ repeatable, without the expert chained to the keyboard.
75
+
76
+ The method is context hygiene, engineered: one clear goal per session, tasks
77
+ decomposed until they fit, fresh containers, curated read-only mounts of
78
+ exactly the relevant prior work, feedback at step boundaries — never
79
+ interruption inside one. We call it putting AI to work in a state of flow,
80
+ and we treat the conditions for it as a design target, not a hope. In one
81
+ phrase: **the clean room for delegated deep work** — as capability gets
82
+ cheap, the scarce thing is accountability, and the envelope supplies it,
83
+ domain-free ([`docs/17-positioning.md`](docs/17-positioning.md) §1c).
84
+
85
+ We believe this works. The mechanisms are built and tested; the evidence so far
86
+ is our own production use, self-reported ([`docs/16-roadmap.md`](docs/16-roadmap.md), living log).
87
+ The full argument — its evidence status stated claim by claim, and what
88
+ would change our mind — is [`docs/19-thesis.md`](docs/19-thesis.md).
89
+
90
+ ---
91
+
92
+ ## Who this is for
93
+
94
+ - Teams already running work on a **PMO board** (project-management system —
95
+ Linear, Gitea Issues, GitHub Issues, and GitLab Issues are all
96
+ launch-supported)
97
+ - A **single operator** who will **self-host on a dedicated machine** (Docker,
98
+ Bake, your forge, your models) — not multi-tenant SaaS
99
+ - People who want **receipts** (transcripts, costs, traces) more than a chat copilot
100
+
101
+ **Not for:** anyone wanting a hosted, zero-ops service (self-hosting *is* the
102
+ trust model); boards without discipline (DevCake amplifies your board — it
103
+ cannot invent one); shared Docker hosts; exposing the admin UI to the open
104
+ internet on basic auth alone; or expecting injection-proof agents. Prompt
105
+ injection is in scope of “ticket writers are trusted,” not a product defect to
106
+ be papered over.
107
+
108
+ What you own as the operator — once at setup, and recurring — fits on one page:
109
+ [`docs/18-operator-contract.md`](docs/18-operator-contract.md).
110
+
111
+ ---
112
+
113
+ ## What you get
114
+
115
+ | You set up | The system does |
116
+ |---|---|
117
+ | One or more **PMO instances** (teams) | Polls, managed labels, feed posts, adoption modes |
118
+ | Zero or more **external repos** | Clone, branch, PR; zero uses the bundled Gitea; **RO** + **reviewer** tokens recommended (write always for work repos) |
119
+ | **Work** vs **reference** vs **memory** repos per PMO | Routing targets vs read-only consultation clones vs team-memory notebooks (curated notes, mounted read-only into every run — ADR-0035) |
120
+ | **Dev Types**, assignments, prompts | ONBOARD → PLAN → EXECUTE → REVIEW (plus optional steward) |
121
+ | **Skills** per Dev Type (skill store + skill sources) | Curated skills seeded into an editable Gitea repo, plus your own external **skill sources** — dedicated read-only connections serving `<source>/<skill>` — installed into agent sessions |
122
+ | **Scheduled Tasks** | Built-in maintenance on a timer — the Relations Steward (proposes ticket orderings) and the Memory Curator (reviews raw leads into notebook notes via PRs) — plus your own recurring ticket-creating tasks |
123
+ | Auto-merge, intake pause, limits | Operator knobs — defaults favor a human merge |
124
+
125
+ ### Three ways to use it
126
+
127
+ 1. **External forge** — Classic path: a Linear ticket becomes a PR on your
128
+ GitHub or GitLab repo, with the full label pipeline and receipts on the issue.
129
+ 2. **Internal forge** — No external repo: work runs on the **bundled Gitea**;
130
+ missions still complete on the board, with deliverables you can take from the
131
+ PMO feed. Useful for non-code or sandbox workloads without burning forge PATs.
132
+ 3. **Multi-connection** — Several teams and/or repos on one stack. Missions
133
+ route by instance config and optional markers; reference repos can ride along
134
+ read-only for every stage.
135
+
136
+ REVIEW is always a pipeline stage (judgment in `result.json`). The
137
+ **reviewer token** — app-only, different forge account — is what is
138
+ **recommended** when branch protection requires formal approval; it is never
139
+ injected into a Dev. Staffing a different Dev Type for REVIEW than EXECUTE is
140
+ optional and about role focus (skills, identifying prompt), not security. How
141
+ merges are actually controlled is next.
142
+
143
+ ### How forge merges are controlled (first deploy)
144
+
145
+ Three different things are easy to conflate. Only the forge enforces the last:
146
+
147
+ | Knob | Who it constrains | What it does |
148
+ |---|---|---|
149
+ | **`auto_merge`** (per repo, default **off**) | The **app** only | Off on a repo → app never merges that repo's PRs; parks at `DEVCAKE-MERGE` until a real merge is observed. On → app squash-merges after REVIEW approve. (ADR-0020) |
150
+ | **Forge tokens** (Repositories page) | Devs + app | **Write** token: EXECUTE push + open PR; app also uses it to **merge** when auto-merge is on. **RO** token (recommended): non-EXECUTE stages clone without write. **Reviewer** token (**recommended** for formal PR/MR approval under branch protection; **app-only** — never injected into a Dev). |
151
+ | **Branch protection** (on the forge; the Repositories page can **apply** a derived baseline per repo or in bulk) | Everyone with a token | Server rules on the **default branch** (require a PR, require ≥1 approval, no bypass for the Dev account). Token scopes usually **cannot** separate “push a feature branch” from “merge to main” — protection is what does. |
152
+
153
+ **Happy path with protection + tokens configured:**
154
+
155
+ 1. **EXECUTE** Dev (write token) pushes a feature branch and opens a PR.
156
+ 2. **REVIEW** Dev judges the PR (`result.json`). It does **not** formally approve on the forge. With an RO token set, it does not even hold write credentials.
157
+ 3. **App** (on approve): posts the PR comment; if a **reviewer** token is set, files a **formal forge approval** with that token (different identity from the PR author — needed when the forge blocks self-approval).
158
+ 4. Then either:
159
+ - **mission's repo `auto_merge` off:** park at `DEVCAKE-MERGE`; **you** merge on the forge; the app marks Done when it sees the merge.
160
+ - **mission's repo `auto_merge` on:** the app **merges with the write token** (not the reviewer token), then Done.
161
+
162
+ Without branch protection, a Dev that holds the write token can often merge (or push) despite `auto_merge` being off — playbooks say not to; that is guidance, not enforcement. Full contract: [`docs/14-security.md`](docs/14-security.md) §2 zone C · setup steps: [`docs/13-deployment.md`](docs/13-deployment.md) §8a · token details: [`docs/06-forge-adapter.md`](docs/06-forge-adapter.md) §4–5.
163
+
164
+ ---
165
+
166
+ ## A day on the board
167
+
168
+ 1. Write a ticket; add `DEVCAKE` (opt-in mode) — or adopt a whole team deliberately.
169
+ 2. Labels advance: ONBOARD → PLAN → EXECUTE → REVIEW as work completes.
170
+ 3. A PR opens on `devcake/…` (or the internal forge equivalent).
171
+ 4. With auto-merge **off** (default): the **app** parks at `DEVCAKE-MERGE` until
172
+ the PR is merged (normally by you); then Done. Branch protection is what
173
+ stops Devs from merging on their own — see above.
174
+ 5. Steer with comments and label swaps; stop everything with `DEVCAKE-SKIP`.
175
+ (Comments steer the *next run*; granting a failing step **fresh attempts**
176
+ takes the literal `DEVCAKE-RETRY` in a comment, or a label op — the strict
177
+ default keeps bot comments from resetting the budget. ADR-0026.)
178
+
179
+ Details and interventions: [Tutorial 2](docs/tutorials/02-operating-devcake.md).
180
+
181
+ ---
182
+
183
+ ## Architecture (one screen)
184
+
185
+ ```
186
+ PMO (Linear / Gitea Issues) ──poll / labels──► app (orchestrator)
187
+ │ RunBootstrap → Dagu
188
+
189
+ docker.sock ──► Dev containers
190
+ (runtime net, open egress)
191
+
192
+ Redis Streams (per-run ACL)
193
+
194
+ finalize → PMO + forge
195
+
196
+ OpenObserve ← app OTLP
197
+ (Devs → otel-collector only)
198
+ ```
199
+
200
+ - **Dedicated host.** Dagu holds `docker.sock` (root-equivalent). See
201
+ [`docs/14`](docs/14-security.md) §5 and [`docs/13`](docs/13-deployment.md).
202
+ - **No per-mission lease or checkout.** A crashed agent holds nothing; the next
203
+ poll reschedules. Process-local locks serialize dispatch and maintenance.
204
+ - **PMO is source of truth.** Local run files are advisory
205
+ ([`docs/10`](docs/10-persistence.md)).
206
+ - **Control plane** (app, admin, Dagu, OpenObserve) stays off the Dev network;
207
+ optional **Gitea** straddles both for clone/push.
208
+
209
+ ---
210
+
211
+ ## Trust in one breath
212
+
213
+ Self-hosted, single operator, loopback by default. Stack passwords live in
214
+ `.env`; **operator secrets** (PMO keys, forge tokens, model credentials) are
215
+ entered through the admin UI's Connections (Repositories, PMO, Skill sources), Fleet, and Settings pages and stored
216
+ on the app volume — never echoed back. Be clear-eyed about what "GUI secret
217
+ store" means: values rest as **plaintext files (mode 0600) on the `/data`
218
+ volume** — there is no vault and no at-rest encryption (a key would have to
219
+ live on the same host); anyone with host root or a volume backup reads
220
+ everything. Treat `/data` backups like a password-manager export
221
+ ([`docs/14-security.md`](docs/14-security.md) §4).
222
+
223
+ Agents are powerful by design. The app enforces outcome legality and never lets
224
+ Devs write the PMO directly; it **warns** on weak posture (write token on every
225
+ stage, unprotected default branch). It does not replace forge branch protection
226
+ or careful team membership.
227
+
228
+ → [`docs/14-security.md`](docs/14-security.md) (contract) · checklist before first
229
+ real EXECUTE: §9.
230
+
231
+ ---
232
+
233
+ ## Quickstart
234
+
235
+ > **Have an agent set it up for you.** Tell your CLI agent:
236
+ > *“Read `.claude/skills/devcake-ops/SKILL.md` in this repo and help me set
237
+ > up and manage DevCake.”* The skill teaches any capable agent the install,
238
+ > preflight, bring-up, non-interactive configuration, day-to-day operations,
239
+ > and upgrades — with JSON receipts and sealed exit codes it can assert on.
240
+ > (Claude Code discovers it automatically when opened in this repo.)
241
+
242
+ ```bash
243
+ # Clone the remote or fork you intend to run:
244
+ git clone <this-repo-url> && cd devcake
245
+ uv tool install . # or: pipx install . → console script `devcake`
246
+ devcake doctor # named preflight + one-time remedies (--json ok)
247
+ devcake up --bake # auto-inits .env secrets, DOCKER_GID, control plane + hello + baker
248
+ # Later restarts (images already baked): devcake up
249
+
250
+ # Configure in a browser: http://localhost:8080 — basic auth (from .env) →
251
+ # Connections / Fleet / Settings → secrets + connection tests. Saving Dev
252
+ # Types triggers the baker's harness bake; the first mission waits for it.
253
+
254
+ # Or configure non-interactively (agents; same validation as the UI):
255
+ devcake setup --same-harness claude-code --json # first Dev roster
256
+ devcake setup --help # PMO/repo wiring (secrets via env/file/stdin) + settings-bundle import
257
+
258
+ # Telemetry connectivity: app boot auto-provisions the OO ingest user from OO_INGEST_*.
259
+ # Optional dashboard/alerts only: python3 scripts/provision_oo.py (docs/12 §5)
260
+ ```
261
+
262
+ `devcake up` is the only bring-up path (ADR-0038): it auto-generates missing
263
+ bootstrap secrets into a mode-600 `.env`, upserts the docker socket group id,
264
+ optionally bakes, then runs compose and installs the host baker. Control
265
+ ports bind `127.0.0.1`. Images are **Bake-only** — compose never builds them.
266
+
267
+ **macOS / Docker Desktop:** see [`docs/13-deployment.md`](docs/13-deployment.md) §8b before first `devcake up --bake` — socket gid, install gates, and the nested-engine probe.
268
+
269
+ **Before the first real mission:**
270
+
271
+ 1. Sandbox (or tightly controlled) Linear team — ticket writers = agent trust.
272
+ 2. On the forge: **protect the default branch** (require PR + ≥1 approval; Dev
273
+ write account must not bypass) — see [merge control](#how-forge-merges-are-controlled-first-deploy).
274
+ 3. Repositories: write token; prefer **RO** for non-EXECUTE and a **reviewer**
275
+ token (app-only formal approval — the security-relevant second identity).
276
+ 4. Leave each repo's **`auto_merge` off** until you want the **app** to merge that repo after REVIEW.
277
+
278
+ Then, step by step:
279
+
280
+ - [Tutorial 1 — first mission](docs/tutorials/01-first-mission.md)
281
+ - [Tutorial 2 — daily operations](docs/tutorials/02-operating-devcake.md)
282
+ - [Tutorial 3 — MCP plugins](docs/tutorials/03-mcp-plugins.md)
283
+ - Fresh empty volume drill: [operator-drill](docs/tutorials/operator-drill.md)
284
+ - Pre-v1 host wipe-and-re-onboard: [host-refresh](docs/tutorials/host-refresh.md)
285
+
286
+ After upgrades or changes under `app/`, `admin/`, or `images/`:
287
+
288
+ ```bash
289
+ devcake up --bake
290
+ ```
291
+
292
+ More detail: [`AGENTS.md`](AGENTS.md) · [`docs/13-deployment.md`](docs/13-deployment.md).
293
+
294
+ ---
295
+
296
+ ## Verify
297
+
298
+ Primary local unit path (always rebakes `app-test` so the image matches the
299
+ tree; prefers Docker Buildx bake and falls back to a plain Dockerfile build
300
+ where bake is unavailable — e.g. podman/buildah hosts, see
301
+ `scripts/lib/bake_app_test.sh`):
302
+
303
+ ```bash
304
+ ./scripts/pytest_app.sh
305
+ ```
306
+
307
+ CI-shaped proof on a full Docker Engine (real Buildx — not buildah's shim)
308
+ matches [`.github/workflows/ci.yml`](.github/workflows/ci.yml) — bake group
309
+ `ci`, then Redis + pytest in `app-test`, then the dispatch smoke. Locally
310
+ that bake is:
311
+
312
+ ```bash
313
+ docker buildx bake ci
314
+ ```
315
+
316
+ (GHA applies `type=gha` cache via bake-action `set:` — not a second bake
317
+ file; see `docs/13-deployment.md` §6.)
318
+
319
+ Full local suite when the stack is up (pin gate + ruff + pytest + forge/PMO
320
+ contract batteries + dispatch-hello smoke). Not a full GHA clone (no
321
+ npm/pip-audit, no control-plane rebake); a mixed-version live stack prints a
322
+ warning banner:
323
+
324
+ ```bash
325
+ ./scripts/ci_suite.sh
326
+ ```
327
+
328
+ PR CI (`.github/workflows/ci.yml`) also runs pin gate, npm checks, pip-audit,
329
+ compose with Gitea, and contract batteries — see `docs/13-deployment.md` §6.
330
+ Token-spending golden path (**manual pre-release only**, real models/forges —
331
+ **not** FOSS CI / `ci_suite` / GHA unit path): `scripts/acceptance.py` —
332
+ including internal-forge / Gitea lanes when configured. Tester credentials
333
+ from shell/`.env`; spends model + PMO tokens.
334
+
335
+ Coding agents: follow [`AGENTS.md`](AGENTS.md). Security and autonomy claims
336
+ must not exceed [`docs/14-security.md`](docs/14-security.md).
337
+
338
+ ---
339
+
340
+ ## Documentation
341
+
342
+ | I want to… | Start here |
343
+ |---|---|
344
+ | Understand the product and invariants | [`docs/00-overview.md`](docs/00-overview.md) |
345
+ | Onboard as a new engineer (reading path) | [`docs/00-overview.md`](docs/00-overview.md) §6a |
346
+ | Contribute (build, tests, PR expectations) | [`CONTRIBUTING.md`](CONTRIBUTING.md) |
347
+ | Report a vulnerability | [`SECURITY.md`](SECURITY.md) |
348
+ | Understand the security deal | [`docs/14-security.md`](docs/14-security.md) |
349
+ | Know what you own as operator | [`docs/18-operator-contract.md`](docs/18-operator-contract.md) |
350
+ | Run a first mission / operate daily | [`docs/tutorials/`](docs/tutorials/) |
351
+ | Deploy, networks, runbook | [`docs/13-deployment.md`](docs/13-deployment.md) |
352
+ | Labels, lifecycle, orchestrator | [`docs/02`](docs/02-domain-model.md) · [`03`](docs/03-mission-lifecycle.md) · [`04`](docs/04-orchestrator.md) |
353
+ | PMO / forge / harnesses | [`05`](docs/05-pmo-adapter.md) · [`06`](docs/06-forge-adapter.md) · [`08`](docs/08-harness-templates.md) |
354
+ | Admin API & UI contract | [`docs/11-admin-panel.md`](docs/11-admin-panel.md) |
355
+ | History and backlog | [`docs/16-roadmap.md`](docs/16-roadmap.md) · [`CHANGELOG.md`](CHANGELOG.md) |
356
+ | How we talk about it | [`docs/17-positioning.md`](docs/17-positioning.md) |
357
+ | Why this exists — the thesis | [`docs/19-thesis.md`](docs/19-thesis.md) |
358
+
359
+ Full map and architecture: [`docs/00`](docs/00-overview.md) §7 · [`docs/01`](docs/01-architecture.md).
360
+
361
+ ---
362
+
363
+ ## Contributing
364
+
365
+ Self-hosted operator software. Prefer PRs with tests at public seams
366
+ (`app/tests/`) and zero-drift docs when public contracts change. Build with
367
+ **Bake**, target **Python 3.12**, and prove run/up paths — not only “build
368
+ succeeded.” Full contributor guide: [`CONTRIBUTING.md`](CONTRIBUTING.md) ·
369
+ coding agents: [`AGENTS.md`](AGENTS.md) · vulnerability reporting:
370
+ [`SECURITY.md`](SECURITY.md).
371
+
372
+ ## License
373
+
374
+ DevCake is free software, released under the **GNU General Public License,
375
+ version 3** — see [`LICENSE`](LICENSE) for the full text.
@@ -0,0 +1,17 @@
1
+ devcake_cli/__init__.py,sha256=2tyN2uqp_FYwNnktMZ6G9Y4aPr9wqUR8nD1hrkV1y-E,280
2
+ devcake_cli/__main__.py,sha256=Yrivns0-nI9sRx3knAbqypEv_44dbB29MRneVRIqw-s,156
3
+ devcake_cli/baker.py,sha256=MOOqDcn_NH-Fa3YYad_YvcjoW-mQLRXJW-l8aEQmG0s,532
4
+ devcake_cli/doctor.py,sha256=JNs5mUPceBr96nx6zKXuCtCRZ0tDMUaidO2OlWE8IRE,19552
5
+ devcake_cli/down.py,sha256=GU3nSbyWtwMWJlSB482NtARJxsN46x_rFx1iC443JIE,1005
6
+ devcake_cli/envfile.py,sha256=HBALyxRBmz_EyGpcRoInuCDme6mXooXjenXPz6p0QCU,6936
7
+ devcake_cli/main.py,sha256=jHonQMLePh4S2A6Mv7x2Rgck8picBvuUvfBlNEi5Uuo,6707
8
+ devcake_cli/paths.py,sha256=tWVjYFuTUgHHJopIgNvpq6xwE0f5zZk8c0PT7FHcHio,883
9
+ devcake_cli/setup.py,sha256=9ltsjmUEQfcT3OMOgHTcZzyAB67bEMstjyzTYNxqGOo,32475
10
+ devcake_cli/status.py,sha256=Fs9ipE2P2yGtNjx0x9aF9mn3YR0bCSbtnqcd8UmL2Vo,2394
11
+ devcake_cli/up.py,sha256=9Ww41yhxyXLY-xSLgnVMyY2KcHQWbOc8-Z_up3TEAog,23334
12
+ devcake_cli-0.1.0.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
13
+ devcake_cli-0.1.0.dist-info/METADATA,sha256=GVVuHsnwp-9W-9SmzTH7Bzj-D18HBldHfgjE3BgNN6w,19966
14
+ devcake_cli-0.1.0.dist-info/WHEEL,sha256=YVMoNqKzERt-wjUZwJ33xBGAwnFl-4cqbYkTtWa4itE,91
15
+ devcake_cli-0.1.0.dist-info/entry_points.txt,sha256=JsopJxP_M6UP07mSV2G958nF7eB75zTuymntWQ_wce8,50
16
+ devcake_cli-0.1.0.dist-info/top_level.txt,sha256=yF4B2jt9z0a11bWZlzuk2qbjry9L2uc5y8lJsfJP3Yk,12
17
+ devcake_cli-0.1.0.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (84.0.0)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ devcake = devcake_cli.main:main