superdev-cli 0.1.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 (182) hide show
  1. package/.claude-plugin/marketplace.json +33 -0
  2. package/.claude-plugin/plugin.json +21 -0
  3. package/.codex-plugin/plugin.json +27 -0
  4. package/CODE_OF_CONDUCT.md +109 -0
  5. package/CONTRIBUTING.md +205 -0
  6. package/LICENSE +202 -0
  7. package/NOTICE +11 -0
  8. package/README.md +1051 -0
  9. package/SECURITY.md +135 -0
  10. package/THIRD-PARTY-NOTICES.md +253 -0
  11. package/hooks/hooks.json +61 -0
  12. package/hooks/run.mjs +88 -0
  13. package/package.json +65 -0
  14. package/references/confidentiality.md +48 -0
  15. package/references/evidence-and-risk.md +73 -0
  16. package/references/operating-model.md +105 -0
  17. package/references/platform-capabilities.md +51 -0
  18. package/references/project-record.md +91 -0
  19. package/references/provider-contracts.md +102 -0
  20. package/scripts/doctor/doctor.mjs +539 -0
  21. package/scripts/privacy/scan-history.mjs +163 -0
  22. package/scripts/privacy/scan.mjs +368 -0
  23. package/scripts/validate/README.md +94 -0
  24. package/scripts/validate/common.mjs +149 -0
  25. package/scripts/validate/data-model.mjs +225 -0
  26. package/scripts/validate/dependencies.mjs +69 -0
  27. package/scripts/validate/docs-templates.mjs +99 -0
  28. package/scripts/validate/footprint.mjs +78 -0
  29. package/scripts/validate/imports.mjs +61 -0
  30. package/scripts/validate/manifests.mjs +173 -0
  31. package/scripts/validate/markdown.mjs +123 -0
  32. package/scripts/validate/migrations.mjs +187 -0
  33. package/scripts/validate/no-tests.mjs +136 -0
  34. package/scripts/validate/privacy.mjs +115 -0
  35. package/scripts/validate/record-links.mjs +127 -0
  36. package/scripts/validate/skill-commands.mjs +190 -0
  37. package/scripts/validate/skills.mjs +112 -0
  38. package/scripts/validate/specification.mjs +88 -0
  39. package/scripts/validate/style.mjs +78 -0
  40. package/scripts/validate/validate-all.mjs +175 -0
  41. package/skills/debug/SKILL.md +68 -0
  42. package/skills/decision/SKILL.md +99 -0
  43. package/skills/docs/SKILL.md +86 -0
  44. package/skills/docs/assets/fragments/api/events.md +14 -0
  45. package/skills/docs/assets/fragments/api/graphql.md +14 -0
  46. package/skills/docs/assets/fragments/api/local-only.md +13 -0
  47. package/skills/docs/assets/fragments/api/rest.md +13 -0
  48. package/skills/docs/assets/fragments/api/rpc.md +13 -0
  49. package/skills/docs/assets/fragments/async/event-bus.md +13 -0
  50. package/skills/docs/assets/fragments/async/none.md +11 -0
  51. package/skills/docs/assets/fragments/async/platform-jobs.md +13 -0
  52. package/skills/docs/assets/fragments/async/queue.md +13 -0
  53. package/skills/docs/assets/fragments/async/scheduler.md +13 -0
  54. package/skills/docs/assets/fragments/auth/detected-provider.md +15 -0
  55. package/skills/docs/assets/fragments/auth/neutral-base.md +14 -0
  56. package/skills/docs/assets/fragments/data/document.md +13 -0
  57. package/skills/docs/assets/fragments/data/external-saas.md +13 -0
  58. package/skills/docs/assets/fragments/data/key-value.md +13 -0
  59. package/skills/docs/assets/fragments/data/none.md +12 -0
  60. package/skills/docs/assets/fragments/data/sql-orm.md +13 -0
  61. package/skills/docs/assets/fragments/data/sql-plain.md +13 -0
  62. package/skills/docs/assets/fragments/env/conventional.md +13 -0
  63. package/skills/docs/assets/fragments/env/envx.md +13 -0
  64. package/skills/docs/assets/fragments/env/managed-platform.md +13 -0
  65. package/skills/docs/assets/fragments/env/none.md +11 -0
  66. package/skills/docs/assets/fragments/ui/api-only.md +13 -0
  67. package/skills/docs/assets/fragments/ui/cli.md +14 -0
  68. package/skills/docs/assets/fragments/ui/desktop.md +14 -0
  69. package/skills/docs/assets/fragments/ui/mobile.md +14 -0
  70. package/skills/docs/assets/fragments/ui/web.md +14 -0
  71. package/skills/docs/assets/templates/adr.md +62 -0
  72. package/skills/docs/assets/templates/api.md +30 -0
  73. package/skills/docs/assets/templates/architecture.md +52 -0
  74. package/skills/docs/assets/templates/change-impact-drift-report.md +29 -0
  75. package/skills/docs/assets/templates/compliance.md +29 -0
  76. package/skills/docs/assets/templates/data-schema.md +43 -0
  77. package/skills/docs/assets/templates/feature.md +43 -0
  78. package/skills/docs/assets/templates/foundations.md +55 -0
  79. package/skills/docs/assets/templates/jobs-webhooks.md +36 -0
  80. package/skills/docs/assets/templates/module-inventory.md +19 -0
  81. package/skills/docs/assets/templates/module.md +50 -0
  82. package/skills/docs/assets/templates/nfr.md +22 -0
  83. package/skills/docs/assets/templates/observability.md +28 -0
  84. package/skills/docs/assets/templates/pages-ui-actions.md +47 -0
  85. package/skills/docs/assets/templates/project-summary.md +44 -0
  86. package/skills/docs/assets/templates/roles-permissions.md +26 -0
  87. package/skills/docs/assets/templates/test-plan.md +23 -0
  88. package/skills/docs/assets/templates/workflow-state-machine.md +43 -0
  89. package/skills/docs/references/adr-authoring.md +24 -0
  90. package/skills/docs/references/apis-and-data.md +23 -0
  91. package/skills/docs/references/capability-fragments.md +25 -0
  92. package/skills/docs/references/change-tracking.md +62 -0
  93. package/skills/docs/references/diagrams.md +31 -0
  94. package/skills/docs/references/discovery.md +59 -0
  95. package/skills/docs/references/edge-cases.md +45 -0
  96. package/skills/docs/references/foundations-modules.md +18 -0
  97. package/skills/docs/references/ingestion.md +52 -0
  98. package/skills/docs/references/initialize-adopt.md +25 -0
  99. package/skills/docs/references/module-decomposition.md +38 -0
  100. package/skills/docs/references/profiles.md +60 -0
  101. package/skills/docs/references/quality-attributes.md +27 -0
  102. package/skills/docs/references/reverse-engineer.md +21 -0
  103. package/skills/docs/references/spec-depths.md +31 -0
  104. package/skills/docs/references/summarize.md +18 -0
  105. package/skills/docs/references/surfaces-and-actions.md +24 -0
  106. package/skills/docs/references/validation.md +47 -0
  107. package/skills/docs/references/workflows-and-jobs.md +25 -0
  108. package/skills/docs/scripts/ingest.mjs +984 -0
  109. package/skills/docs/scripts/profile-detect.mjs +299 -0
  110. package/skills/docs/scripts/screen.mjs +96 -0
  111. package/skills/docs/scripts/template-lint.mjs +143 -0
  112. package/skills/docs/scripts/validate-docs.mjs +363 -0
  113. package/skills/doctor/SKILL.md +167 -0
  114. package/skills/feature/SKILL.md +132 -0
  115. package/skills/init/SKILL.md +137 -0
  116. package/skills/project/SKILL.md +261 -0
  117. package/skills/project/references/commands.md +213 -0
  118. package/skills/resume/SKILL.md +79 -0
  119. package/skills/review/SKILL.md +91 -0
  120. package/skills/status/SKILL.md +85 -0
  121. package/skills/task/SKILL.md +183 -0
  122. package/src/cli/product-map.mjs +468 -0
  123. package/src/cli/render.mjs +544 -0
  124. package/src/cli.mjs +2774 -0
  125. package/src/cloud/crypto.mjs +118 -0
  126. package/src/cloud/merge.mjs +186 -0
  127. package/src/cloud/policy.mjs +115 -0
  128. package/src/cloud/sync.mjs +512 -0
  129. package/src/cloud/transport.mjs +116 -0
  130. package/src/db/connect.mjs +189 -0
  131. package/src/db/maintenance.mjs +419 -0
  132. package/src/db/migrate.mjs +188 -0
  133. package/src/db/migrations/001_initial.sql +1024 -0
  134. package/src/db/migrations/002_docs_coverage.sql +126 -0
  135. package/src/db/migrations/003_memory_retrieval_and_integrity.sql +168 -0
  136. package/src/db/migrations/004_task_categories.sql +59 -0
  137. package/src/db/migrations/005_executable_evidence.sql +32 -0
  138. package/src/db/migrations/006_module_and_feature_boundaries.sql +27 -0
  139. package/src/db/migrations/007_drop_redundant_module_users.sql +13 -0
  140. package/src/db/migrations/008_changes_assumptions_test_plans_api_services.sql +166 -0
  141. package/src/db/migrations/009_retired_documents.sql +54 -0
  142. package/src/db/migrations/010_test_plan_evidence.sql +20 -0
  143. package/src/db/migrations/011_criterion_waiver.sql +13 -0
  144. package/src/db/migrations/012_synchronization.sql +56 -0
  145. package/src/db/store.mjs +327 -0
  146. package/src/decisions/record.mjs +167 -0
  147. package/src/docs/proposals.mjs +871 -0
  148. package/src/docs/render.mjs +1424 -0
  149. package/src/docs/templates.mjs +1281 -0
  150. package/src/features/acceptance.mjs +315 -0
  151. package/src/features/specify.mjs +248 -0
  152. package/src/init/discovery.mjs +901 -0
  153. package/src/init/index.mjs +784 -0
  154. package/src/init/questions.mjs +562 -0
  155. package/src/memory/benchmark.mjs +171 -0
  156. package/src/memory/capture.mjs +135 -0
  157. package/src/memory/consolidate.mjs +255 -0
  158. package/src/memory/index.mjs +810 -0
  159. package/src/model/ids.mjs +185 -0
  160. package/src/model/screening.mjs +150 -0
  161. package/src/model/toolkit.mjs +258 -0
  162. package/src/model/vocabulary.mjs +190 -0
  163. package/src/product/assumptions.mjs +120 -0
  164. package/src/product/changes.mjs +180 -0
  165. package/src/product/test-plans.mjs +183 -0
  166. package/src/progress/index.mjs +1364 -0
  167. package/src/runtime/harness.mjs +264 -0
  168. package/src/runtime/hooks.mjs +1021 -0
  169. package/src/runtime/identity.mjs +305 -0
  170. package/src/runtime/resume.mjs +343 -0
  171. package/src/runtime/session.mjs +679 -0
  172. package/src/runtime/version.mjs +315 -0
  173. package/src/service/assets/control-center.html +206 -0
  174. package/src/service/assets/control-center.manifest.json +7 -0
  175. package/src/service/manage.mjs +542 -0
  176. package/src/service/mutations.mjs +860 -0
  177. package/src/service/read-model.mjs +1557 -0
  178. package/src/service/server.mjs +783 -0
  179. package/src/tasks/categories.mjs +154 -0
  180. package/src/tasks/derive.mjs +977 -0
  181. package/src/tasks/lifecycle.mjs +830 -0
  182. package/src/verify/index.mjs +236 -0
package/README.md ADDED
@@ -0,0 +1,1051 @@
1
+ <p align="center">
2
+ <img src="./ui/src/assets/logo.png" alt="Superdev" width="120" />
3
+ </p>
4
+
5
+ <h1 align="center">Superdev</h1>
6
+
7
+ <p align="center">
8
+ <strong>Keep your coding agent honest about what is built, why, and what proves it.</strong>
9
+ </p>
10
+
11
+ <p align="center">
12
+ <a href="https://www.npmjs.com/package/superdev-cli"><img alt="npm version" src="https://img.shields.io/npm/v/superdev-cli.svg" /></a>
13
+ <a href="LICENSE"><img alt="License: Apache 2.0" src="https://img.shields.io/badge/License-Apache_2.0-blue.svg" /></a>
14
+ <img alt="Node 20 or newer" src="https://img.shields.io/badge/node-%3E%3D20-brightgreen.svg" />
15
+ <img alt="Works offline" src="https://img.shields.io/badge/works-offline-informational.svg" />
16
+ </p>
17
+
18
+ <p align="center">
19
+ <img src="./docs/images/dashboard-overview.png" alt="The Superdev dashboard, showing progress counted from real records" width="900" />
20
+ </p>
21
+
22
+ ## Table of Contents
23
+
24
+ - [Overview](#overview)
25
+ - [The rules it enforces](#the-rules-it-enforces)
26
+ - [Prerequisites](#prerequisites)
27
+ - [Installation](#installation)
28
+ - [Step 1: the CLI](#step-1-the-cli)
29
+ - [Step 2: the plugin](#step-2-the-plugin)
30
+ - [Claude Code](#claude-code)
31
+ - [Codex](#codex)
32
+ - [Cursor](#cursor)
33
+ - [Any other editor](#any-other-editor)
34
+ - [Quick Start](#quick-start)
35
+ - [Commands](#commands)
36
+ - [superdev init](#superdev-init)
37
+ - [superdev adopt](#superdev-adopt)
38
+ - [superdev status](#superdev-status)
39
+ - [superdev resume](#superdev-resume)
40
+ - [superdev feature](#superdev-feature)
41
+ - [superdev derive](#superdev-derive)
42
+ - [superdev task](#superdev-task)
43
+ - [superdev verify](#superdev-verify)
44
+ - [superdev test-plan](#superdev-test-plan)
45
+ - [superdev decision](#superdev-decision)
46
+ - [superdev docs](#superdev-docs)
47
+ - [superdev memory](#superdev-memory)
48
+ - [superdev doctor](#superdev-doctor)
49
+ - [superdev readiness](#superdev-readiness)
50
+ - [superdev ui](#superdev-ui)
51
+ - [superdev db](#superdev-db)
52
+ - [superdev cloud and sync](#superdev-cloud-and-sync)
53
+ - [superdev settings](#superdev-settings)
54
+ - [Product map commands](#product-map-commands)
55
+ - [Global options and exit codes](#global-options-and-exit-codes)
56
+ - [The Dashboard](#the-dashboard)
57
+ - [Workflow Examples](#workflow-examples)
58
+ - [Updates and Versioning](#updates-and-versioning)
59
+ - [Privacy](#privacy)
60
+ - [Providers](#providers)
61
+ - [Troubleshooting](#troubleshooting)
62
+ - [Folder Structure](#folder-structure)
63
+ - [Development](#development)
64
+ - [Releasing](#releasing)
65
+ - [Contributing](#contributing)
66
+ - [License](#license)
67
+
68
+ ## Overview
69
+
70
+ Working with a coding agent across many sessions has a familiar failure mode.
71
+ It rebuilds something already finished. It contradicts a decision you made last
72
+ week. It tells you a feature is done when nothing verified it. The plan lives in
73
+ a conversation that scrolls away, and the documentation describes last month.
74
+
75
+ Superdev gives the agent a project record it cannot talk its way around. Goals,
76
+ features, workflows, decisions, tasks and evidence live in a database on your
77
+ machine, and every surface reads from the same place: the command line, the
78
+ generated Markdown, the dashboard, and the agent working beside you.
79
+
80
+ It will not make your code correct. What it removes is ambiguity, forgotten
81
+ context, undocumented decisions, and the distance between what a status report
82
+ says and what is true.
83
+
84
+ Superdev ships in two pieces:
85
+
86
+ | | What it is | Where it comes from |
87
+ |---|---|---|
88
+ | **`superdev-cli`** | The engine. Every command, the database, the dashboard. | npm |
89
+ | **The plugin** | The skills your agent reads, and the lifecycle hooks. | git, through your editor |
90
+
91
+ They share one version. A release moves both.
92
+
93
+ ## The rules it enforces
94
+
95
+ These are the whole idea. Everything else is machinery for keeping them true.
96
+
97
+ | Rule | What it feels like |
98
+ |---|---|
99
+ | **Completion is derived, never claimed** | A feature finishes when every acceptance criterion under it is met or waived and every task against it is closed. Nobody can mark it done. |
100
+ | **No evidence, no completion** | `task complete` refuses until the work carries a passing result, and until the accepted test plan covering it has been run. |
101
+ | **Every task implements something** | A task cannot leave draft without a link to a criterion, a workflow step, an operation or an entity. |
102
+ | **Nothing changes status quietly** | Status moves through lifecycle commands that write history. A direct update is refused by a database trigger. |
103
+ | **History is append only** | Enforced by triggers. What happened cannot be quietly revised later. |
104
+ | **Plan first, apply second** | Every command that would change something prints its plan and changes nothing until you add `--apply`. |
105
+ | **A refusal names the next step** | Every refusal says what to run to get past it. |
106
+
107
+ ## Prerequisites
108
+
109
+ - **Node.js 20 or newer.** That is the only prerequisite.
110
+ - **npm**, which comes with Node.
111
+
112
+ Nothing to compile, no build step, no service to configure. npm fetches the
113
+ right database engine for your platform.
114
+
115
+ ## Installation
116
+
117
+ ### Step 1: the CLI
118
+
119
+ ```bash
120
+ npm install -g superdev-cli
121
+ ```
122
+
123
+ Confirm it:
124
+
125
+ ```bash
126
+ superdev --version
127
+ ```
128
+
129
+ Prefer not to install globally? Every command works through
130
+ `npx superdev-cli <command>`.
131
+
132
+ ### Step 2: the plugin
133
+
134
+ The CLI does the work on its own. The plugin is what teaches your agent to drive
135
+ it, so you never have to remember a command name.
136
+
137
+ ### Claude Code
138
+
139
+ ```bash
140
+ claude plugin marketplace add superdev-ai/superdev
141
+ claude plugin install superdev@superdev
142
+ ```
143
+
144
+ The plugin is text only, so nothing is compiled and no dependency is installed.
145
+ It calls the `superdev` from step 1.
146
+
147
+ To try it without installing permanently:
148
+
149
+ ```bash
150
+ claude --plugin-dir /path/to/a/clone
151
+ ```
152
+
153
+ **If you skipped step 1**, your next session says so plainly rather than failing
154
+ cryptically: *"the plugin is installed and its command-line tool is not"*, with
155
+ the install command.
156
+
157
+ Then just describe what you want:
158
+
159
+ ```
160
+ "Set up superdev here"
161
+ "I want to build a tool for tracking recipes I actually cook"
162
+ "What should I work on?"
163
+ "Review this against the spec"
164
+ "Open the dashboard"
165
+ ```
166
+
167
+ ### Codex
168
+
169
+ ```bash
170
+ codex plugin marketplace add superdev-ai/superdev
171
+ codex plugin add superdev@superdev
172
+ ```
173
+
174
+ The same eleven skills load. Two limits apply on Codex:
175
+
176
+ 1. Lifecycle hooks do not fire until you explicitly trust each one. Until then,
177
+ ask for status directly rather than expecting it to appear on its own.
178
+ 2. Codex tool hooks cover shell commands only, so edits made through the editor
179
+ do not mark documentation stale. Run `superdev docs generate` when you want it
180
+ refreshed.
181
+
182
+ Neither affects correctness. The database is still the record either way.
183
+
184
+ ### Cursor
185
+
186
+ Cursor has no plugin system Superdev installs into, so it uses the CLI plus a
187
+ rules file. You do not need the plugin at all.
188
+
189
+ Create `.cursor/rules/superdev.mdc` in your project:
190
+
191
+ ```markdown
192
+ ---
193
+ description: Use Superdev as the project record
194
+ alwaysApply: true
195
+ ---
196
+
197
+ This project is tracked by Superdev. Its database is the authority on what is
198
+ being built, what is finished and what proves it. Do not keep project state in
199
+ chat. The command is `superdev`.
200
+
201
+ Before starting work:
202
+ - `superdev resume` to load the active task, blockers and next action
203
+ - `superdev status` to see where the project stands
204
+ - `superdev decision list` to check nothing decided contradicts the request
205
+
206
+ While working:
207
+ - `superdev task list`, then `task claim <id> --apply` to take one
208
+ - `superdev task start <id> --apply` before changing anything
209
+ - `superdev task evidence <id> --result pass --summary "<observed>" --command "<check>" --apply`
210
+ - `superdev task complete <id> --apply` last, and expect a refusal without evidence
211
+
212
+ For new behaviour:
213
+ - `superdev feature specify <id>`, then `feature accept <id> --apply`
214
+ - `superdev derive <id> --apply` for the tasks
215
+
216
+ Every command that changes something needs `--apply`. Without it you get a plan
217
+ and nothing is written. Add `--json` to parse output. `superdev --help` lists
218
+ everything.
219
+ ```
220
+
221
+ The commands are the same ones verified everywhere else. The `.mdc` frontmatter
222
+ is Cursor's own format rather than something exercised here.
223
+
224
+ ### Any other editor
225
+
226
+ Superdev is a command-line tool. Any agent that can run a shell command can use
227
+ it, and so can you.
228
+
229
+ ```bash
230
+ cd ~/my-project
231
+ superdev init --brief requirements.md --apply
232
+ superdev status
233
+ ```
234
+
235
+ ## Quick Start
236
+
237
+ ```bash
238
+ mkdir ~/recipe-keeper && cd ~/recipe-keeper
239
+ ```
240
+
241
+ Write a short brief. Plain language, and there is a template with every section
242
+ explained in [requirement.md](requirement.md) if you want one:
243
+
244
+ ```markdown
245
+ # Recipe Keeper
246
+
247
+ A tool for keeping the recipes I actually cook, not the ones I bookmark.
248
+
249
+ ## Features
250
+
251
+ - Save a recipe with its ingredients and steps.
252
+ - Mark a recipe as cooked, with the date.
253
+ - See which recipes I have not cooked in six months.
254
+ ```
255
+
256
+ Then:
257
+
258
+ ```bash
259
+ superdev init --brief brief.md # shows the plan, writes nothing
260
+ superdev init --brief brief.md --apply # now it writes
261
+ superdev ui --apply # open the dashboard
262
+ ```
263
+
264
+ You get the three features the brief names, a project named from the document's
265
+ own title, and a list of questions the brief did not answer. Nothing is invented
266
+ to fill a gap.
267
+
268
+ The headings are not decoration: Superdev classifies what it reads by the heading
269
+ it sits under, so `## Features` becomes features and `## Constraints` becomes
270
+ constraints. [requirement.md](requirement.md) lists every heading it recognises,
271
+ what each becomes, and a complete worked example. A section you leave out becomes
272
+ a recorded question rather than an assumption.
273
+
274
+ ## Commands
275
+
276
+ Every command that changes something takes `--apply`. Without it you get the
277
+ plan and nothing happens. `superdev --help` lists the full surface.
278
+
279
+ ### `superdev init`
280
+
281
+ Start a project from an idea, a brief, or a folder of notes.
282
+
283
+ ```bash
284
+ # From a written brief
285
+ superdev init --brief requirements.md --apply
286
+
287
+ # From a sentence
288
+ superdev init --idea "A reading list app with a weekly digest" --name "Readlist" --apply
289
+
290
+ # See what it would do first
291
+ superdev init --brief requirements.md
292
+ ```
293
+
294
+ **Options:** `--brief <file>`, `--idea <text>`, `--name <text>`, `--apply`
295
+
296
+ It inspects the repository before asking anything, records what the source
297
+ material states, and records what it does not as open questions rather than
298
+ guesses.
299
+
300
+ ### `superdev adopt`
301
+
302
+ Take on a codebase that already exists.
303
+
304
+ ```bash
305
+ superdev adopt --apply
306
+ ```
307
+
308
+ It reads your conventions and documentation without overwriting them, and labels
309
+ everything it inferred rather than presenting a guess as a fact.
310
+
311
+ ### `superdev status`
312
+
313
+ Where the project is, how fresh that is, and what is next.
314
+
315
+ ```bash
316
+ superdev status
317
+ superdev status --json # for scripts
318
+ superdev status --root ~/other # another project
319
+ ```
320
+
321
+ ```
322
+ Progress
323
+ --------
324
+ Overall: 100 percent (110 of 110 tracked items done)
325
+ Accepted features delivered 91 of 91
326
+ Milestones reached 9 of 9
327
+ Goal success criteria met 10 of 10
328
+
329
+ Next
330
+ ----
331
+ Nothing is pending
332
+ ```
333
+
334
+ Progress is counted from declared deliverables and attached verification. Where
335
+ nothing has been agreed to measure, it says **Not measurable** rather than
336
+ showing a percentage that would not be true.
337
+
338
+ ### `superdev resume`
339
+
340
+ Everything a new session needs to carry on, after a break, a handoff or a
341
+ compaction.
342
+
343
+ ```bash
344
+ superdev resume # read it
345
+ superdev resume --apply # and open a work session
346
+ superdev resume --end --apply
347
+ ```
348
+
349
+ Returns the objective, the active task, its contract, governing decisions,
350
+ blockers, the last verified evidence, and the recorded next action.
351
+
352
+ ### `superdev feature`
353
+
354
+ Define what to build, at a depth proportionate to its risk.
355
+
356
+ ```bash
357
+ # What is missing before this can be accepted
358
+ superdev feature depth FEAT-0001
359
+
360
+ # Write the specification
361
+ superdev feature specify FEAT-0001 \
362
+ --purpose "Save a recipe so it can be cooked again" \
363
+ --user "A cook wants their own recipe back without searching a browser" \
364
+ --in "Saving a recipe with ingredients and steps" \
365
+ --out "Importing from other sites" \
366
+ --flow "Open the new recipe screen" \
367
+ --flow "Enter the name, ingredients and steps" \
368
+ --flow "Save it and see it in the list" \
369
+ --criterion "A saved recipe survives a restart || Save one, restart, read it back" \
370
+ --edge "empty_states:The list says there are no recipes yet" \
371
+ --edge "invalid_input:A recipe with no name is refused with a reason" \
372
+ --apply
373
+
374
+ # Change how much it owes
375
+ superdev feature depth FEAT-0001 standard
376
+
377
+ # Accept it. Refused while anything above is missing.
378
+ superdev feature accept FEAT-0001 --apply
379
+
380
+ # Set a criterion aside, with the reason on the record
381
+ superdev feature waive AC-0003 --reason "Deferred to the next milestone" --apply
382
+
383
+ # Read one in full
384
+ superdev feature show FEAT-0001
385
+ superdev feature list
386
+ ```
387
+
388
+ **Three depths.** *Microspec* wants purpose, who wants it, scope in and out, the
389
+ primary flow, acceptance criteria and edge cases. *Standard* adds surfaces,
390
+ operations, entities, permissions, workflow steps, observability and a test plan.
391
+ *Full design* adds alternatives considered, migration and rollback, capacity
392
+ targets, failure recovery and decision records.
393
+
394
+ A refusal names everything missing at once:
395
+
396
+ ```
397
+ Save a recipe is declared standard depth, and 9 of the 11 things that depth
398
+ promises are missing: what is in scope and what is deliberately out; the primary
399
+ flow, step by step; how anyone can tell it works; ...
400
+ ```
401
+
402
+ <p align="center">
403
+ <img src="./docs/images/dashboard-feature.png" alt="A feature with its whole contract and a plain-language account of where it stands" width="900" />
404
+ </p>
405
+
406
+ ### `superdev derive`
407
+
408
+ Turn accepted specifications into tasks.
409
+
410
+ ```bash
411
+ superdev derive FEAT-0001 --apply # one feature
412
+ superdev derive --apply # everything accepted
413
+ ```
414
+
415
+ Tasks come from the accepted specification rather than from a list somebody
416
+ wrote. Each belongs to exactly one feature and links to the contract it
417
+ implements.
418
+
419
+ ### `superdev task`
420
+
421
+ The execution lifecycle.
422
+
423
+ ```bash
424
+ superdev task list # open tasks, oldest first
425
+ superdev task list --all # including finished
426
+ superdev task show TASK-0001
427
+
428
+ superdev task create --feature FEAT-0001 \
429
+ --name "Store a recipe" \
430
+ --outcome "A recipe survives a restart" \
431
+ --verify "Save one, restart, read it back" --apply
432
+
433
+ superdev task update TASK-0001 --link acceptance_criterion:AC-0001 --apply
434
+ superdev task claim TASK-0001 --apply
435
+ superdev task start TASK-0001 --apply
436
+
437
+ superdev task evidence TASK-0001 \
438
+ --result pass \
439
+ --summary "Saved a recipe, restarted, read the same one back" \
440
+ --command "npm test" \
441
+ --criterion AC-0001 --apply
442
+
443
+ superdev task complete TASK-0001 --apply
444
+
445
+ superdev task block TASK-0001 --reason "Waiting on the API key" --apply
446
+ superdev task unblock TASK-0001 --apply
447
+ superdev task cancel TASK-0001 --reason "Superseded by FEAT-0009" --apply
448
+ superdev task reopen TASK-0001 --reason "The fix regressed" --apply
449
+ superdev task release TASK-0001 --apply
450
+ ```
451
+
452
+ Completion refuses until the work is proven, and the refusal says how:
453
+
454
+ ```
455
+ TASK-0002 verifies acceptance criteria that are still unmet: AC-0003 (A saved
456
+ recipe survives a restart). Attach a passing result to each with task evidence
457
+ TASK-0002 --criterion AC-0003, or waive it with feature waive AC-0003 --reason.
458
+ ```
459
+
460
+ The feature above finishes on its own when its last task does.
461
+
462
+ ### `superdev verify`
463
+
464
+ Re-run the checks your recorded evidence stands on.
465
+
466
+ ```bash
467
+ superdev verify # report what still passes
468
+ superdev verify --apply # and mark anything that stopped passing as stale
469
+ ```
470
+
471
+ ```
472
+ Evidence in force 121
473
+ Carries a command 80
474
+ Checked by hand only 41
475
+ Re-ran 80
476
+ Still passing 80
477
+ No longer passing 0
478
+ ```
479
+
480
+ Evidence that names a command can be checked again. Evidence checked by hand
481
+ says so, rather than carrying an invented command.
482
+
483
+ ### `superdev test-plan`
484
+
485
+ How a feature or the product is verified, and whether anyone has run it.
486
+
487
+ ```bash
488
+ superdev test-plan list
489
+ superdev test-plan show TP-0001
490
+ superdev test-plan run TP-0001 --apply # runs it, records what it produced
491
+ superdev test-plan record TP-0007 \
492
+ --summary "Opened every dashboard area and read each against the database" \
493
+ --apply
494
+ ```
495
+
496
+ A plan whose instruction is a command can be run. A plan whose instruction is a
497
+ journey is carried out by a person and recorded with what they saw. Task
498
+ completion is refused while a plan covering the work has no passing run.
499
+
500
+ ### `superdev decision`
501
+
502
+ Record what was chosen and why, so it is not relitigated every week.
503
+
504
+ ```bash
505
+ superdev decision list
506
+ superdev decision record \
507
+ --title "Postgres over MySQL" \
508
+ --decision "Postgres, for JSONB and partial indexes" \
509
+ --rationale "Both were adequate; JSONB decided it" \
510
+ --verification "The schema uses JSONB in three tables" --apply
511
+
512
+ superdev decision supersede DEC-0007 --apply
513
+ ```
514
+
515
+ A request that contradicts an accepted decision surfaces that decision before
516
+ work starts. Changing one means superseding it, which keeps the chain.
517
+
518
+ Related:
519
+
520
+ ```bash
521
+ superdev change record --summary "Dropped the digest email" --reason "Out of scope for v1" --apply
522
+ superdev assumption record --assumption "One user per account" --trigger "The first team signs up" --apply
523
+ superdev question list
524
+ superdev question answer Q-0001 --answer "Weekly, on Sunday" --apply
525
+ ```
526
+
527
+ ### `superdev docs`
528
+
529
+ Markdown generated from the database, never a second source of truth.
530
+
531
+ ```bash
532
+ superdev docs generate --apply
533
+ superdev docs diff # what a hand edit changed
534
+ superdev docs accept talks/path/file.md --apply
535
+ superdev docs reject talks/path/file.md --apply
536
+ ```
537
+
538
+ Edit a generated file and Superdev notices, shows you the difference, and asks.
539
+ It updates the database first, then regenerates. Your edit is never silently
540
+ overwritten and never treated as authority without you accepting it.
541
+
542
+ ### `superdev memory`
543
+
544
+ Structured recall across sessions, captured from real events.
545
+
546
+ ```bash
547
+ superdev memory search "why did we choose the storage engine"
548
+ superdev memory show MEM-0042
549
+ superdev memory verify MEM-0042 # check it against the current record
550
+ superdev memory consolidate --apply # merge duplicates, mark contradictions
551
+ superdev memory status
552
+ superdev memory benchmark # measure recall, precision, ranking
553
+ ```
554
+
555
+ Every memory carries where it came from and links to the records it concerns.
556
+ Retrieval quality is measured rather than asserted, and described plainly:
557
+ structured filters plus a lexical index, with semantic search reported as a
558
+ bounded scan because that is what it would be.
559
+
560
+ ### `superdev doctor`
561
+
562
+ Whether Superdev can work here, and what to do when it cannot.
563
+
564
+ ```bash
565
+ superdev doctor
566
+ ```
567
+
568
+ ```
569
+ Check Verdict Detail
570
+ Storage engine Pass Installed and loaded
571
+ Database Pass Schema version 12 of 12, 0 migrations pending
572
+ Integrity Pass No page damage and no dangling references
573
+ Documentation Pass 299 generated files match the database
574
+ Alignment Pass Every record maps to something that declares it
575
+ Freshness Pass Nothing is out of date
576
+ Providers Pass 7 of 7 ready
577
+ Evidence Pass 80 of 121 can be re-run. Run superdev verify.
578
+ ```
579
+
580
+ ### `superdev readiness`
581
+
582
+ The production-readiness checklist, gap by gap. Thirty-two areas, each either
583
+ specified, awaiting a decision, not applicable with a reason, or deferred with an
584
+ owner and a trigger.
585
+
586
+ ```bash
587
+ superdev readiness
588
+ ```
589
+
590
+ "Not yet considered" is not one of the answers.
591
+
592
+ ### `superdev ui`
593
+
594
+ ```bash
595
+ superdev ui --apply # start and open
596
+ superdev start --apply
597
+ superdev stop --apply
598
+ superdev restart --apply
599
+ superdev services
600
+ ```
601
+
602
+ ### `superdev db`
603
+
604
+ ```bash
605
+ superdev db status # schema version, integrity, row counts
606
+ superdev db migrate --apply # apply pending migrations
607
+ superdev db backup --apply # snapshot
608
+ superdev db restore <name> --apply # put one back
609
+ superdev export project.json --apply # move between machines
610
+ superdev import project.json --apply
611
+ ```
612
+
613
+ Migrations are forward only, with a self-contained backup taken before every
614
+ run. Getting back means restoring that backup, which is why one is always taken.
615
+
616
+ `db migrate`, `db restore` and `import` all refuse while the dashboard is
617
+ running, and each refusal names the command that frees it.
618
+
619
+ ### `superdev cloud and sync`
620
+
621
+ Optional, and inert until you configure it. Your local database is always the
622
+ authority.
623
+
624
+ ```bash
625
+ superdev cloud connect ~/Dropbox/product-sync --apply # creates a local key
626
+ superdev cloud status
627
+ superdev sync --dry-run # what would move
628
+ superdev sync --apply # move it
629
+ superdev sync --resolve # list disagreements
630
+ superdev sync --resolve CONF-0001 --keep remote --apply # settle one
631
+ ```
632
+
633
+ - Everything sent is encrypted with a key created on your machine and never
634
+ transmitted. Copy the key to your other machine yourself.
635
+ - A record changed in both copies is never overwritten. It becomes a conflict and
636
+ you choose.
637
+ - Specifications, decisions, evidence and tasks travel. Memory, activity,
638
+ sessions and identities never leave.
639
+ - The only transport is a directory you provide, such as a synced folder. There
640
+ is no hosted service.
641
+
642
+ ### `superdev settings`
643
+
644
+ ```bash
645
+ superdev settings # what it checks on its own
646
+ superdev settings --no-update-check --apply # stop checking
647
+ superdev settings --update-check --apply # start again
648
+ ```
649
+
650
+ ### Product map commands
651
+
652
+ Read-only views of what has been recorded.
653
+
654
+ ```bash
655
+ superdev module list superdev module show MOD-0001
656
+ superdev goal list superdev goal show GOAL-0001
657
+ superdev milestone list superdev milestone show MS-0001
658
+ superdev workflow list superdev workflow show WF-0001
659
+ superdev architecture show superdev schema show [entity]
660
+ superdev api show superdev integration list
661
+ superdev plan
662
+ ```
663
+
664
+ ### Global options and exit codes
665
+
666
+ | Option | What it does |
667
+ |---|---|
668
+ | `--apply` | Actually do it. Without this, every changing command prints its plan and changes nothing. |
669
+ | `--json` | Machine-readable output, and nothing else on stdout. |
670
+ | `--root <path>` | Which project. Defaults to the working directory. |
671
+ | `--out <path>` | Write this command's output to a file. |
672
+ | `--actor <name>` | Who to record as responsible. |
673
+ | `--version` | The CLI's name and version. |
674
+ | `--help` | The full command surface. |
675
+
676
+ | Exit code | Meaning |
677
+ |---|---|
678
+ | `0` | It worked. |
679
+ | `1` | Something was found, or refused. |
680
+ | `2` | The command was misused. |
681
+
682
+ ## The Dashboard
683
+
684
+ ```bash
685
+ superdev ui --apply
686
+ ```
687
+
688
+ A local page at `127.0.0.1:4317`, served from a single self-contained file. It
689
+ reads the database on every request and follows it as you work.
690
+
691
+ Twenty areas, grouped by the question each answers:
692
+
693
+ | Group | Areas |
694
+ |---|---|
695
+ | Where we are | Overview, Readiness, Activity |
696
+ | What we are building | Discovery, Product, Blueprint, Features, Workflows |
697
+ | How it is built | Data, Architecture, APIs, Surfaces, Decisions |
698
+ | How we know it works | Evidence, Test Plans, Changes |
699
+ | Who is doing it | Tasks, Team, Sync, Settings |
700
+
701
+ The **Blueprint** is the whole project as one map, with pan, zoom, drag, search,
702
+ highlighting, fullscreen, and navigation into any record.
703
+
704
+ <p align="center">
705
+ <img src="./docs/images/dashboard-blueprint.png" alt="The Blueprint: goals, milestones, modules, features and tasks as one connected map" width="900" />
706
+ </p>
707
+
708
+ A view that no navigation group contains fails the build, so an area cannot exist
709
+ without a way to reach it.
710
+
711
+ ## Workflow Examples
712
+
713
+ ### One feature, end to end
714
+
715
+ ```bash
716
+ superdev feature specify FEAT-0001 --purpose "..." --user "..." \
717
+ --in "..." --out "..." --flow "..." \
718
+ --criterion "what is true || how it is checked" \
719
+ --edge "empty_states:what happens when there is nothing" --apply
720
+ superdev feature accept FEAT-0001 --apply
721
+ superdev derive FEAT-0001 --apply
722
+ superdev task claim TASK-0001 --apply
723
+ superdev task start TASK-0001 --apply
724
+ # ... write the code ...
725
+ superdev task evidence TASK-0001 --result pass \
726
+ --summary "what you observed" --command "npm test" --criterion AC-0001 --apply
727
+ superdev task complete TASK-0001 --apply
728
+ superdev docs generate --apply
729
+ ```
730
+
731
+ ### Picking up yesterday's work
732
+
733
+ ```bash
734
+ superdev resume --apply # objective, active task, blockers, next action
735
+ superdev task list # or choose something else
736
+ ```
737
+
738
+ ### Before a release
739
+
740
+ ```bash
741
+ superdev status # derived progress
742
+ superdev doctor # eight health checks
743
+ superdev verify # re-run every recorded check
744
+ superdev readiness # the production checklist
745
+ superdev docs diff # nothing unreviewed on disk
746
+ ```
747
+
748
+ ### Two machines
749
+
750
+ ```bash
751
+ # on the first
752
+ superdev cloud connect ~/Dropbox/product-sync --apply
753
+ superdev sync --apply
754
+
755
+ # copy .superdev/cloud/key to the second machine, then
756
+ superdev cloud connect ~/Dropbox/product-sync --alias laptop --apply
757
+ superdev sync --apply
758
+ ```
759
+
760
+ ## Updates and Versioning
761
+
762
+ The CLI and the plugin share one version, and a release moves both. Superdev
763
+ tells you when either has a newer release:
764
+
765
+ ```
766
+ A newer Superdev CLI is available: 0.2.0, you have 0.1.0.
767
+ Update with npm install -g superdev-cli.
768
+
769
+ A newer Superdev plugin is available: 0.2.0, you have 0.1.0.
770
+ Update with claude plugin marketplace update superdev.
771
+ ```
772
+
773
+ Updating:
774
+
775
+ ```bash
776
+ npm install -g superdev-cli # the CLI
777
+ claude plugin marketplace update superdev # the plugin
778
+ ```
779
+
780
+ If the plugin ever needs a newer CLI than you have, your next session says so
781
+ directly, naming both versions, rather than letting a skill call a command that
782
+ does not exist yet.
783
+
784
+ **How the check behaves.** It is the only outbound request Superdev makes:
785
+
786
+ - **At most once a day**, and only after a command has already answered.
787
+ - **It never delays anything.** The notice comes from a file the previous check
788
+ wrote, and the check runs in a separate process your command does not wait
789
+ for. Measured: 165 ms with the check against 148 ms with it disabled.
790
+ - **It fails silently.** No network, a proxy, a firewall: nothing is printed and
791
+ nothing is cached.
792
+ - **It writes to stderr**, so `--json` output is never affected.
793
+
794
+ Turning it off:
795
+
796
+ ```bash
797
+ superdev settings --no-update-check --apply
798
+ export SUPERDEV_NO_UPDATE_CHECK=1 # for a container or a build
799
+ ```
800
+
801
+ `CI=1` also disables it.
802
+
803
+ ## Privacy
804
+
805
+ **Your project never leaves your machine.** No telemetry, no analytics, no crash
806
+ reporting. Every read and write of your project record is local, the dashboard
807
+ binds to `127.0.0.1` and refuses anything not same origin, and synchronization
808
+ only writes to a directory you name.
809
+
810
+ **One exception, and it is small.** The update check above asks the npm registry
811
+ for a version number and reads the plugin's manifest from this repository. What
812
+ that discloses is that somebody uses Superdev. It sends nothing about you or your
813
+ project, and one command turns it off.
814
+
815
+ Everything else follows. `npm install` fetches from the registry once, as any
816
+ install does. Installing an optional provider runs that provider's own installer,
817
+ which needs a network and is never implicit. And the agent harness you run
818
+ Superdev inside is a separate program with its own network behaviour.
819
+
820
+ Where your data lives:
821
+
822
+ ```text
823
+ your-project/
824
+ .superdev/ the database, backups and runtime state, git-ignored
825
+ talks/ generated Markdown documentation, commit this
826
+ ```
827
+
828
+ Nothing else is added. No dependency entry, no `node_modules`, no lockfile
829
+ change. There is no file per task, session or event; those are database records
830
+ and they show in the dashboard.
831
+
832
+ ## Providers
833
+
834
+ Superdev works on its own. If these are installed it will use them, and if they
835
+ are not it says so and continues:
836
+
837
+ Superpowers (brainstorming, planning, test-driven development, systematic
838
+ debugging, review), Frontend Design, Impeccable, Claude Mem, envx, Find Skills,
839
+ Task Observer, skills.sh.
840
+
841
+ ```bash
842
+ superdev integration list # what each is for, and what happens when absent
843
+ superdev doctor # which are present
844
+ ```
845
+
846
+ Nothing is installed on your behalf, ever, and Superdev never presents its own
847
+ work as a provider's methodology.
848
+
849
+ ## Troubleshooting
850
+
851
+ | Problem | Fix |
852
+ |---|---|
853
+ | `superdev: command not found` | `npm install -g superdev-cli`, then `superdev --version`. |
854
+ | The plugin says its command-line tool is not installed | Same fix. The plugin is text; the CLI does the work. |
855
+ | A session says the skills need a newer CLI | `npm install -g superdev-cli` to catch up. |
856
+ | `Cannot find package '@tursodatabase/database'` | The install did not finish. Run `npm install -g superdev-cli` again. |
857
+ | `No project in this directory` | `superdev init --apply`, or pass `--root /path/to/project`. |
858
+ | `db migrate` or `db restore` refuses | The dashboard is running. `superdev stop --apply` first. |
859
+ | A command printed a plan and changed nothing | That is the default. Add `--apply`. |
860
+ | `task complete` refuses | Read the refusal. It names the missing evidence or criterion and the command that fixes it. |
861
+ | The dashboard shows old data | `superdev docs generate --apply`, then reload. |
862
+ | Anything else | `superdev doctor` reports what is wrong and what to run. |
863
+
864
+ ## Folder Structure
865
+
866
+ One repository, two published artifacts. The same tree becomes the npm package
867
+ and the plugin, so the two cannot drift apart: they are one commit.
868
+
869
+ ```text
870
+ superdev/
871
+
872
+ ├── src/ THE CLI, published to npm as superdev-cli
873
+ │ ├── cli.mjs every command, and the only entry point
874
+ │ ├── db/ storage, migrations, one writer at a time
875
+ │ │ └── migrations/ ordered SQL, applied forward only
876
+ │ ├── model/ vocabulary, identifiers, content screening
877
+ │ ├── init/ discovery, adoption, the interview
878
+ │ ├── features/ the depth gate, acceptance, completion
879
+ │ ├── tasks/ the task lifecycle and its refusals
880
+ │ ├── verify/ re-running the checks evidence stands on
881
+ │ ├── progress/ derived progress and alignment warnings
882
+ │ ├── decisions/ decision records and their chains
883
+ │ ├── product/ changes, assumptions, test plans
884
+ │ ├── memory/ structured recall, provenance, benchmarking
885
+ │ ├── docs/ the Markdown projection
886
+ │ ├── cloud/ synchronization: policy, merge, leases, crypto
887
+ │ ├── service/ the local read model and HTTP service
888
+ │ │ └── assets/ the compiled dashboard, one inlined file
889
+ │ ├── runtime/ sessions, identity, hooks, version checking
890
+ │ └── cli/ output rendering
891
+
892
+ ├── skills/ THE PLUGIN, distributed by git
893
+ │ ├── project/ the entry point skill, routes to the rest
894
+ │ ├── init/ start a project, or adopt a codebase
895
+ │ ├── feature/ specify behaviour before it is built
896
+ │ ├── task/ run the task lifecycle
897
+ │ ├── decision/ find, record, revisit, supersede
898
+ │ ├── status/ report where things stand
899
+ │ ├── resume/ rebuild context after a break
900
+ │ ├── review/ check a change against what was accepted
901
+ │ ├── debug/ investigate to root cause
902
+ │ ├── docs/ the documentation engine
903
+ │ └── doctor/ check the environment
904
+
905
+ ├── hooks/
906
+ │ ├── hooks.json which lifecycle events Superdev listens to
907
+ │ └── run.mjs finds the CLI and hands over, or says how to
908
+ │ install it. Node builtins only, so the plugin
909
+ │ needs no dependencies at all
910
+
911
+ ├── .claude-plugin/ Claude Code plugin and marketplace manifests
912
+ ├── .codex-plugin/ Codex plugin manifest
913
+ ├── .github/workflows/ publishes to npm when a release is created
914
+ ├── .release-it.json how a release is cut
915
+
916
+ ├── references/ operating contracts the skills load on demand
917
+
918
+ ├── scripts/
919
+ │ ├── validate/ fifteen validators, run by npm run validate
920
+ │ ├── check/ the release condition gate
921
+ │ ├── doctor/ environment and provider inspection
922
+ │ ├── providers/ the provider registry and detection
923
+ │ ├── privacy/ the leak scanner
924
+ │ ├── style/ the writing style scanner
925
+ │ └── package/ dashboard build, version propagation
926
+
927
+ ├── ui/ dashboard source: React, TypeScript, Tailwind.
928
+ │ Compiled into src/service/assets, and not
929
+ │ published: what ships is the compiled file
930
+
931
+ ├── docs/ requirements, decisions, images
932
+ ├── talks/ this project's own generated documentation
933
+
934
+ ├── package.json the npm package: name, bin, files allowlist
935
+ ├── LICENSE Apache 2.0
936
+ └── THIRD-PARTY-NOTICES.md notices for what the dashboard compiles in
937
+ ```
938
+
939
+ **Why the split works this way.** The plugin must be installable from git in one
940
+ command, and a git clone never carries `node_modules`. So everything needing the
941
+ database engine lives in the CLI, which npm installs properly, and the plugin
942
+ carries only text plus one dependency-free launcher. `hooks/run.mjs` is the seam:
943
+ it finds the installed `superdev` and hands the hook over, or explains what to
944
+ install.
945
+
946
+ ## Development
947
+
948
+ ```bash
949
+ git clone https://github.com/superdev-ai/superdev.git
950
+ cd superdev && npm install
951
+
952
+ npm run validate # fifteen validators; must be clean
953
+ npm run check # validators, doctor, and the release conditions
954
+ node src/cli.mjs doctor
955
+
956
+ cd ui && npm install && npm run lint # the dashboard
957
+ npm run ui:build # compile it into the CLI
958
+ npm run ui:check # confirm the committed file is current
959
+ ```
960
+
961
+ To run your checkout instead of the installed CLI, use `node src/cli.mjs` in
962
+ place of `superdev`, or `npm link` once.
963
+
964
+ ```bash
965
+ npm test # unit tests on pure functions, node --test, no framework
966
+ ```
967
+
968
+ Testing here is deliberately narrow, and the boundary is enforced by a
969
+ validator. A `.test.mjs` beside the source it tests is allowed. A test
970
+ directory, a fixture project and every third-party framework are refused,
971
+ because each earlier attempt at a suite grew one and then measured completion in
972
+ test counts. A task still completes on recorded evidence about the real product:
973
+ a green suite is not evidence and a coverage figure is not progress.
974
+
975
+ What the tests cover is arithmetic no validator can check: version comparison,
976
+ the three-way merge, lease expiry, the gate on what may run unattended, the
977
+ brief parser, and the words the product puts in front of a reader. Products
978
+ built *with* Superdev get their own tests, derived from their accepted test
979
+ plans.
980
+
981
+ ## Releasing
982
+
983
+ The CLI and the plugin share one version, so one release moves both.
984
+
985
+ ```bash
986
+ npm run release:dry # see what would happen
987
+ npm run release:patch # 0.1.0 to 0.1.1
988
+ npm run release:minor # 0.1.0 to 0.2.0
989
+ npm run release:major # 0.1.0 to 1.0.0
990
+ ```
991
+
992
+ What that does, in order:
993
+
994
+ 1. Runs the gate: unit tests, validators, doctor, the release conditions, and a
995
+ check that the committed dashboard matches its source. A release that cannot pass its own
996
+ validators is not a release.
997
+ 2. Bumps `package.json`, then propagates that version to both plugin manifests,
998
+ the marketplace entry, and the CLI version each plugin declares it needs.
999
+ A validator refuses a mismatch, so this cannot be forgotten quietly.
1000
+ 3. Writes `CHANGELOG.md` from conventional commits.
1001
+ 4. Commits, tags `v<version>`, pushes, and creates the GitHub release.
1002
+ 5. The GitHub release triggers `.github/workflows/release.yml`, which runs the
1003
+ gate again and publishes `superdev-cli` to npm.
1004
+
1005
+ The plugin needs no publish step. It is distributed by git, so the tag is the
1006
+ release, and `claude plugin marketplace update superdev` reads it directly.
1007
+
1008
+ Release tooling is installed for the one command that needs it, with
1009
+ `npm install --no-save`, rather than declared in the manifest. A validator
1010
+ enforces that this repository carries no toolchain of its own, so the published
1011
+ package has exactly one dependency: the storage engine. A maintainer cutting a
1012
+ release is a different case from a user running the product.
1013
+
1014
+ ## Contributing
1015
+
1016
+ Contributions are welcome. Read [CONTRIBUTING.md](CONTRIBUTING.md) first.
1017
+
1018
+ Two rules that surprise people:
1019
+
1020
+ - **Do not add test cases for Superdev itself.** A validator enforces this, and
1021
+ `CONTRIBUTING.md` explains what to write instead.
1022
+ - **No emoji and no em dash** in anything the project owns. This is enforced at
1023
+ the storage boundary and by a validator, not merely requested.
1024
+
1025
+ When you report something, say what you ran and what you saw rather than what you
1026
+ expected. By participating you agree to the
1027
+ [Code of Conduct](CODE_OF_CONDUCT.md).
1028
+
1029
+ **Security.** Superdev holds your project's plans and decisions in a local
1030
+ database. To report a vulnerability see [SECURITY.md](SECURITY.md). Please do not
1031
+ open a public issue for a security problem.
1032
+
1033
+ ## License
1034
+
1035
+ Released under the **[Apache License 2.0](LICENSE)**. You may use, modify and
1036
+ distribute it, including commercially, provided you keep the licence and
1037
+ copyright notices and state what you changed. It comes with no warranty.
1038
+
1039
+ The dashboard is compiled from React, Radix UI, xyflow, lucide, cmdk, dagre,
1040
+ zustand and d3, all under MIT, ISC or BSD-3-Clause. Their notices travel with the
1041
+ compiled file and are listed in
1042
+ [THIRD-PARTY-NOTICES.md](THIRD-PARTY-NOTICES.md).
1043
+
1044
+ The storage engine is `@tursodatabase/database`, installed from npm and not
1045
+ redistributed here.
1046
+
1047
+ ---
1048
+
1049
+ <p align="center">
1050
+ <sub>Crafted for developers and agents, with care and precision.</sub>
1051
+ </p>