specdrive-cli 0.1.9 → 0.1.12

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 (74) hide show
  1. package/README.md +955 -506
  2. package/agents/00-onboarding.md +261 -0
  3. package/agents/01-constitution.md +214 -201
  4. package/agents/02-specification.md +249 -226
  5. package/agents/03-uiux.md +156 -144
  6. package/agents/04-cascade.md +151 -122
  7. package/agents/05-discover-skills.md +136 -136
  8. package/agents/06-documentation.md +158 -145
  9. package/agents/07-implementation.md +201 -169
  10. package/agents/08-performance.md +179 -165
  11. package/agents/09-review-complete.md +239 -168
  12. package/agents/10-security.md +180 -167
  13. package/agents/11-test.md +195 -0
  14. package/commands/gates.js +73 -73
  15. package/commands/manifest.json +113 -95
  16. package/commands/permissions.json +39 -0
  17. package/commands/router.js +151 -127
  18. package/commands/tools.json +19 -19
  19. package/dashboard/app.js +394 -0
  20. package/dashboard/index.html +74 -0
  21. package/dashboard/server.js +166 -0
  22. package/dashboard/style.css +157 -0
  23. package/mcp/mcp.json +31 -0
  24. package/mcp/server.js +108 -0
  25. package/package.json +35 -32
  26. package/schemas/config.schema.json +20 -0
  27. package/schemas/workflow-state.schema.json +152 -35
  28. package/scripts/anti-redundancy.js +176 -176
  29. package/scripts/audit-log.js +46 -46
  30. package/scripts/check-permission.js +87 -0
  31. package/scripts/diff-spec.js +51 -0
  32. package/scripts/diff-version.js +96 -0
  33. package/scripts/generate-adapters.js +80 -80
  34. package/scripts/generate-from-template.js +97 -70
  35. package/scripts/generate-openapi.js +76 -0
  36. package/scripts/github-team-sync.js +81 -0
  37. package/scripts/install-hooks.js +21 -0
  38. package/scripts/load-plugins.js +65 -65
  39. package/scripts/migrate-openspec.js +318 -0
  40. package/scripts/migrate-speckit.js +322 -0
  41. package/scripts/migrate.js +12 -0
  42. package/scripts/onboard.js +312 -0
  43. package/scripts/pre-commit.js +56 -20
  44. package/scripts/team.js +113 -113
  45. package/scripts/test-adapters.js +118 -118
  46. package/scripts/test-create.js +13 -13
  47. package/scripts/test-end-to-end.js +137 -137
  48. package/scripts/test-router.js +110 -110
  49. package/scripts/test-state-transitions.js +146 -146
  50. package/scripts/test-validator.js +152 -152
  51. package/scripts/validate-config.js +36 -0
  52. package/scripts/validate-governance.js +150 -130
  53. package/scripts/verify.js +525 -0
  54. package/scripts/version-new.js +202 -0
  55. package/src/index.js +1010 -400
  56. package/templates/expo/plan.json +12 -0
  57. package/templates/expo/spec.json +12 -0
  58. package/templates/expo/tasks.json +5 -0
  59. package/templates/fastapi/plan.json +12 -0
  60. package/templates/fastapi/spec.json +12 -0
  61. package/templates/fastapi/tasks.json +5 -0
  62. package/templates/generic/plan.json +12 -0
  63. package/templates/generic/spec.json +11 -0
  64. package/templates/generic/tasks.json +5 -0
  65. package/templates/nextjs/plan.json +23 -0
  66. package/templates/nextjs/spec.json +12 -0
  67. package/templates/nextjs/tasks.json +5 -0
  68. package/templates/react-node/plan.json +15 -0
  69. package/templates/react-node/spec.json +12 -0
  70. package/templates/react-node/tasks.json +5 -0
  71. package/templates/registry.json +30 -0
  72. package/templates/turborepo/plan.json +12 -0
  73. package/templates/turborepo/spec.json +12 -0
  74. package/templates/turborepo/tasks.json +5 -0
package/README.md CHANGED
@@ -1,506 +1,955 @@
1
-
2
- ```markdown
3
- # SpecDrive
4
-
5
- **Enterprise Spec-Driven Development for AI Coding Tools**
6
-
7
- SpecDrive gives AI coding tools like GitHub Copilot, Cline, Claude Code, and Cursor a deterministic governance layer for spec-driven development.
8
-
9
- It adds:
10
-
11
- - 10 specialized governance agents
12
- - Machine-readable JSON schemas
13
- - Requirement → AC → task → test traceability
14
- - Human approval gates
15
- - Anti-redundancy checks
16
- - Anti-hallucination controls
17
- - CI/CD integration
18
-
19
- ---
20
-
21
- ## Table of Contents
22
-
23
- - [Why SpecDrive](#why-specdrive)
24
- - [Prerequisites](#prerequisites)
25
- - [Installation](#installation)
26
- - [Where to Run Commands](#where-to-run-commands)
27
- - [Quickstart](#quickstart)
28
- - [Core Workflow](#core-workflow)
29
- - [Optional Commands](#optional-commands)
30
- - [Terminal Commands](#terminal-commands)
31
- - [Agents](#agents)
32
- - [Directory Structure](#directory-structure)
33
- - [Validation](#validation)
34
- - [CI/CD Integration](#cicd-integration)
35
- - [Tool Support](#tool-support)
36
- - [Team Collaboration](#team-collaboration)
37
- - [Contributing](#contributing)
38
- - [License](#license)
39
-
40
- ---
41
-
42
- ## Why SpecDrive
43
-
44
- OpenSpec and Spec-Kit are great, but they lack strict governance controls.
45
-
46
- SpecDrive adds:
47
-
48
- - Strict JSON Schema validation
49
- - Complete requirement-to-test traceability
50
- - Human approval at every critical phase
51
- - Anti-redundancy engine
52
- - Deterministic governance validator
53
-
54
- This makes AI-generated specs and code safe for enterprise use.
55
-
56
- ---
57
-
58
- ## Prerequisites
59
-
60
- - Node.js 18 or later
61
- - npm 9 or later
62
- - Git
63
- - An AI coding tool that supports custom commands or instructions
64
-
65
- ---
66
-
67
- ## Installation
68
-
69
- ### Global Install
70
-
71
- ```bash
72
- npm install -g specdrive-cli@latest
73
- ```
74
-
75
- ### Verify Install
76
-
77
- ```bash
78
- sdrive --version
79
- ```
80
-
81
- ### Initialize a Project
82
-
83
- Inside your project root, run:
84
-
85
- ```bash
86
- sdrive init
87
- ```
88
-
89
- SpecDrive will ask you to select which AI tools you use.
90
-
91
- It then creates the `.sdrive/` folder and tool adapters for the selected tools.
92
-
93
- ---
94
-
95
- ## Where to Run Commands
96
-
97
- | Command Type | Where to Run | Example |
98
- |--------------|--------------|---------|
99
- | Terminal command | In your terminal / shell | `sdrive init` |
100
- | Slash command | In your AI tool's chat | `/sdrive:propose "User login"` |
101
-
102
- **Rule:** If it starts with `sdrive`, run it in the terminal. If it starts with `/sdrive:`, run it in your AI chat.
103
-
104
- ---
105
-
106
- ## Quickstart
107
-
108
- 1. Initialize the project:
109
-
110
- ```bash
111
- sdrive init
112
- ```
113
-
114
- 2. Create your constitution:
115
-
116
- ```text
117
- /sdrive:constitution
118
- ```
119
-
120
- 3. Propose a feature:
121
-
122
- ```text
123
- /sdrive:propose "User login with email and password"
124
- ```
125
-
126
- 4. Implement:
127
-
128
- ```text
129
- /sdrive:apply
130
- ```
131
-
132
- 5. Review and merge:
133
-
134
- ```text
135
- /sdrive:review
136
- ```
137
-
138
- ---
139
-
140
- ## Core Workflow
141
-
142
- ### 1. `/sdrive:constitution`
143
-
144
- Creates or updates the project constitution.
145
-
146
- **What it does:**
147
-
148
- - Discovers project stack, coding standards, and architecture
149
- - Creates context files under `.sdrive/context/`
150
- - Merges rules into `.sdrive/constitution.md`
151
- - Requires human approval before writing
152
-
153
- **When to use:**
154
-
155
- - First time setting up a project
156
- - When project standards change
157
-
158
- ---
159
-
160
- ### 2. `/sdrive:propose`
161
-
162
- Creates the feature specification, traceability matrix, technical plan, and execution tasks.
163
-
164
- **What it does:**
165
-
166
- - Accepts a natural feature description
167
- - Generates a kebab-case feature name
168
- - Creates spec, plan, tasks, and traceability files
169
- - Runs anti-redundancy check
170
- - Requires two human approval gates
171
-
172
- **When to use:**
173
-
174
- - Whenever a new feature is needed
175
- - Before any code is written
176
-
177
- ---
178
-
179
- ### 3. `/sdrive:apply`
180
-
181
- Writes production code from the approved tasks.
182
-
183
- **What it does:**
184
-
185
- - Reads approved tasks and plan
186
- - Asks which base branch to pull from
187
- - Creates a feature branch with user approval
188
- - Implements tasks one by one
189
- - Runs validators and tests
190
- - Commits and pushes
191
-
192
- **When to use:**
193
-
194
- - After spec and plan are approved
195
- - When implementation is ready
196
-
197
- ---
198
-
199
- ### 4. `/sdrive:review`
200
-
201
- Final audit, merge, and archive.
202
-
203
- **What it does:**
204
-
205
- - Audits code against spec and traceability
206
- - Runs security and quality checks
207
- - Requires human approval before merging
208
- - Merges to main and archives the feature
209
-
210
- **When to use:**
211
-
212
- - After implementation is complete
213
- - Before shipping to production
214
-
215
- ---
216
-
217
- ## Optional Commands
218
-
219
- | Command | Purpose | When to Use |
220
- |---------|---------|-------------|
221
- | `/sdrive:design` | Build UI/UX prototype | When there is no existing prototype |
222
- | `/sdrive:secure` | Security audit and fixes | When security is a concern |
223
- | `/sdrive:performance` | Benchmark and optimize | When performance NFRs are not met |
224
- | `/sdrive:docs` | Generate documentation | When docs are outdated or missing |
225
- | `/sdrive:sync` | Sync spec → plan → tasks | When higher-level files change |
226
- | `/sdrive:skills` | Manage AI skills | When auditing or discovering skills |
227
-
228
- ---
229
-
230
- ### `/sdrive:design`
231
-
232
- Builds interactive prototype using vanilla HTML, CSS, and JavaScript.
233
-
234
- **What it does:**
235
-
236
- - Creates design system under `.sdrive/prototype/`
237
- - Builds screens and user flows
238
- - Supports light/dark mode
239
- - Maps screens to user stories
240
-
241
- **When to use:**
242
-
243
- - When there is no existing UI/UX prototype
244
- - When visual validation is needed before coding
245
-
246
- ---
247
-
248
- ### `/sdrive:secure`
249
-
250
- Performs deep security audit.
251
-
252
- **What it does:**
253
-
254
- - Threat modeling
255
- - OWASP Top 10 checks
256
- - Dependency scanning
257
- - Secret detection
258
- - CVSS scoring
259
- - Applies fixes after approval
260
-
261
- **When to use:**
262
-
263
- - Before release
264
- - After adding new dependencies
265
-
266
- ---
267
-
268
- ### `/sdrive:performance`
269
-
270
- Benchmarks and optimizes performance.
271
-
272
- **What it does:**
273
-
274
- - Measures baseline metrics
275
- - Identifies bottlenecks
276
- - Applies optimizations with approval
277
- - Verifies improvements
278
-
279
- **When to use:**
280
-
281
- - When performance NFRs are not met
282
- - After major feature implementations
283
-
284
- ---
285
-
286
- ### `/sdrive:docs`
287
-
288
- Generates documentation.
289
-
290
- **What it does:**
291
-
292
- - Adds inline comments with traceability IDs
293
- - Updates README
294
- - Detects code/spec drift
295
- - Generates coverage report
296
-
297
- **When to use:**
298
-
299
- - After implementation
300
- - When docs are stale
301
-
302
- ---
303
-
304
- ### `/sdrive:sync`
305
-
306
- Cascades changes across spec, plan, tasks, and traceability.
307
-
308
- **What it does:**
309
-
310
- - Detects changes in higher-level files
311
- - Updates downstream files
312
- - Preserves task status and IDs
313
-
314
- **When to use:**
315
-
316
- - When spec or plan changes after implementation has started
317
-
318
- ---
319
-
320
- ### `/sdrive:skills`
321
-
322
- Audits and manages AI skills.
323
-
324
- **What it does:**
325
-
326
- - Scans existing skills
327
- - Discovers new skills from GitHub
328
- - Verifies security of community skills
329
- - Installs approved skills
330
-
331
- **When to use:**
332
-
333
- - When setting up a new workspace
334
- - When auditing existing AI skills
335
-
336
- ---
337
-
338
- ## Terminal Commands
339
-
340
- | Command | Purpose |
341
- |---------|---------|
342
- | `sdrive init` | Initialize SpecDrive structure |
343
- | `sdrive validate` | Validate governance files |
344
- | `sdrive status` | Show feature lifecycle state |
345
- | `sdrive approve <gate>` | Approve a workflow gate |
346
- | `sdrive create <feature>` | Create feature scaffold (internal) |
347
- | `sdrive team:add <username> <role>` | Add a new team member |
348
- | `sdrive team:remove <username>` | Remove a team member |
349
- | `sdrive team:list` | List all team members |
350
- | `sdrive team:update <username> <role>` | Update a member's role |
351
-
352
- ---
353
-
354
- ## Agents
355
-
356
- | Agent | File | Role |
357
- |-------|------|------|
358
- | Constitution | `01-constitution.md` | Discover project rules, merge into constitution |
359
- | Specification | `02-specification.md` | Generate spec, plan, tasks, traceability |
360
- | UI/UX | `03-uiux.md` | Build interactive prototype |
361
- | Cascade | `04-cascade.md` | Sync spec → plan → tasks |
362
- | Discover-skills | `05-discover-skills.md` | Audit AI skills |
363
- | Documentation | `06-documentation.md` | Generate docs, detect drift |
364
- | Implementation | `07-implementation.md` | Write production code |
365
- | Performance | `08-performance.md` | Benchmark and optimize |
366
- | Review & Complete | `09-review-complete.md` | Final audit and merge |
367
- | Security | `10-security.md` | Security audit and fixes |
368
-
369
- ---
370
-
371
- ## Directory Structure
372
-
373
- ```text
374
- .sdrive/
375
- ├── agents/ # 10 agent definitions
376
- ├── commands/ # Manifest, router, gates
377
- ├── schemas/ # JSON schemas
378
- ├── specs/ # Human-readable specs
379
- │ ├── backlog/
380
- │ ├── ongoing/
381
- │ └── completed/
382
- ├── governance/ # Machine-readable JSON
383
- ├── prototype/ # UI/UX prototypes
384
- ├── reports/ # Security, performance, docs reports
385
- ├── context/ # Discovered project context
386
- ├── skills/ # AI skills
387
- ├── constitution.md # Governance source of truth
388
- └── workflow-state.json # Feature lifecycle state
389
- ```
390
-
391
- ---
392
-
393
- ## Validation
394
-
395
- Run the governance validator:
396
-
397
- ```bash
398
- sdrive validate
399
- ```
400
-
401
- This checks all governance JSON against the schemas.
402
-
403
- If anything is invalid, it reports exact errors.
404
-
405
- ---
406
-
407
- ## CI/CD Integration
408
-
409
- SpecDrive ships with a GitHub Actions workflow.
410
-
411
- Create `.github/workflows/sdrive-governance.yml`:
412
-
413
- ```yaml
414
- name: SpecDrive Governance Validation
415
-
416
- on:
417
- pull_request:
418
- branches:
419
- - main
420
- paths:
421
- - '.sdrive/**'
422
- - 'package.json'
423
-
424
- jobs:
425
- validate-governance:
426
- runs-on: ubuntu-latest
427
- steps:
428
- - uses: actions/checkout@v4
429
- - uses: actions/setup-node@v4
430
- with:
431
- node-version: '20'
432
- - name: Install Dependencies
433
- run: |
434
- cd .sdrive
435
- npm install
436
- - name: Run Governance Validation
437
- run: node .sdrive/scripts/validate-governance.js
438
- ```
439
-
440
- ---
441
-
442
- ## Tool Support
443
-
444
- SpecDrive supports 15 AI tools.
445
-
446
- | Tool | Adapter |
447
- |------|---------|
448
- | GitHub Copilot | `.github/copilot-instructions.md` |
449
- | Cline | `.clinerules/sdrive.md` |
450
- | Claude Code | `.claude/commands/sdrive.md` |
451
- | Cursor | `.cursor/rules/sdrive.md` |
452
- | VS Code | `.vscode/sdrive-commands.json` |
453
- | Amazon Q Developer | `.amazonq/rules/sdrive.md` |
454
- | Gemini CLI | `.gemini/commands/sdrive.md` |
455
- | Continue | `.continue/rules/sdrive.md` |
456
- | Codex | `.codex/rules/sdrive.md` |
457
- | Windsurf | `.windsurf/rules/sdrive.md` |
458
- | Kilo Code | `.kilocode/rules/sdrive.md` |
459
- | OpenCode | `.opencode/rules/sdrive.md` |
460
- | Qoder | `.qoder/rules/sdrive.md` |
461
- | Qwen Code | `.qwen/rules/sdrive.md` |
462
- | Rovo Dev CLI | `.rovo/rules/sdrive.md` |
463
-
464
- Adapters are generated automatically when you run `sdrive init`.
465
-
466
- During initialization, you select which tools you use. Only selected tools get adapters.
467
-
468
- ---
469
-
470
- ## Team Collaboration
471
-
472
- SpecDrive supports team roles.
473
-
474
- | Role | Can approve | Can implement |
475
- |------|-------------|---------------|
476
- | admin | ✅ | ✅ |
477
- | reviewer | ✅ | ❌ |
478
- | developer | ❌ | ✅ |
479
-
480
- Manage team:
481
-
482
- ```bash
483
- sdrive team:add alice admin
484
- sdrive team:list
485
- sdrive team:update bob reviewer
486
- sdrive team:remove carol
487
- ```
488
-
489
- ---
490
-
491
- ## Contributing
492
-
493
- Contributions are welcome.
494
-
495
- Please read the constitution and agent definitions before contributing.
496
-
497
- ---
498
-
499
- ## License
500
-
501
- MIT
502
- ```
503
-
504
- ---
505
-
506
- This README is now clean and correct.
1
+ # SpecDrive
2
+
3
+ **Enterprise Spec-Driven Development for AI Coding Tools**
4
+
5
+ SpecDrive gives AI coding tools like GitHub Copilot, Cline, Claude Code, and Cursor a deterministic governance layer for spec-driven development.
6
+
7
+ It adds:
8
+
9
+ - 12 specialized governance agents
10
+ - Machine-readable JSON schemas
11
+ - Requirement → AC → task → test traceability
12
+ - Per-version lifecycle tracking
13
+ - Human approval gates
14
+ - Anti-redundancy checks
15
+ - Spec-to-code verification
16
+ - Brownfield onboarding for existing projects
17
+ - OpenSpec and Spec-Kit migration
18
+ - Anti-hallucination controls
19
+ - CI/CD integration
20
+
21
+ ---
22
+
23
+ ## Table of Contents
24
+
25
+ - [Why SpecDrive](#why-specdrive)
26
+ - [Prerequisites](#prerequisites)
27
+ - [Installation](#installation)
28
+ - [Where to Run Commands](#where-to-run-commands)
29
+ - [Quickstart](#quickstart)
30
+ - [Onboarding an Existing Project](#onboarding-an-existing-project)
31
+ - [Migrating from OpenSpec or Spec-Kit](#migrating-from-openspec-or-spec-kit)
32
+ - [Core Workflow](#core-workflow)
33
+ - [Optional Commands](#optional-commands)
34
+ - [Terminal Commands](#terminal-commands)
35
+ - [Agents](#agents)
36
+ - [Templates](#templates)
37
+ - [Versions](#versions)
38
+ - [Directory Structure](#directory-structure)
39
+ - [Validation](#validation)
40
+ - [Spec-to-Code Verification](#spec-to-code-verification)
41
+ - [CI/CD Integration](#cicd-integration)
42
+ - [MCP Server](#mcp-server)
43
+ - [Tool Support](#tool-support)
44
+ - [Web Dashboard](#web-dashboard)
45
+ - [Team Collaboration](#team-collaboration)
46
+ - [Permissions](#permissions)
47
+ - [Contributing](#contributing)
48
+ - [License](#license)
49
+
50
+ ---
51
+
52
+ ## Why SpecDrive
53
+
54
+ OpenSpec and Spec-Kit are great, but they lack strict governance controls.
55
+
56
+ SpecDrive adds:
57
+
58
+ - Strict JSON Schema validation
59
+ - Complete requirement-to-test traceability
60
+ - Human approval at every critical phase
61
+ - Anti-redundancy engine
62
+ - Deterministic governance validator
63
+ - Spec-to-code verification
64
+ - Per-version lifecycle tracking
65
+ - Brownfield onboarding without breaking existing code
66
+ - OpenSpec and Spec-Kit migration
67
+
68
+ This makes AI-generated specs and code safe for enterprise use.
69
+
70
+ ---
71
+
72
+ ## Prerequisites
73
+
74
+ - Node.js 18 or later
75
+ - npm 9 or later
76
+ - Git
77
+ - An AI coding tool that supports custom commands or instructions
78
+
79
+ ---
80
+
81
+ ## Installation
82
+
83
+ ### Global Install
84
+
85
+ ```bash
86
+ npm install -g specdrive-cli@latest
87
+ ```
88
+
89
+ ### Verify Install
90
+
91
+ ```bash
92
+ sdrive --version
93
+ ```
94
+
95
+ ### Initialize a Project
96
+
97
+ Inside your project root, run:
98
+
99
+ ```bash
100
+ sdrive init
101
+ ```
102
+
103
+ SpecDrive will ask you to:
104
+
105
+ 1. Select which AI tools you use
106
+ 2. Select a default template
107
+ 3. Wire MCP clients (optional)
108
+
109
+ It then creates the `.sdrive/` folder, tool adapters, and MCP server.
110
+
111
+ ---
112
+
113
+ ## Where to Run Commands
114
+
115
+ | Command Type | Where to Run | Example |
116
+ |--------------|--------------|---------|
117
+ | Terminal command | In your terminal / shell | `sdrive init` |
118
+ | Slash command | In your AI tool's chat | `/sdrive:propose "User login"` |
119
+
120
+ **Rule:** If it starts with `sdrive`, run it in the terminal. If it starts with `/sdrive:`, run it in your AI chat.
121
+
122
+ ---
123
+
124
+ ## Quickstart
125
+
126
+ 1. Initialize the project:
127
+
128
+ ```bash
129
+ sdrive init
130
+ ```
131
+
132
+ 2. Create your constitution:
133
+
134
+ ```text
135
+ /sdrive:constitution
136
+ ```
137
+
138
+ 3. Propose a feature:
139
+
140
+ ```text
141
+ /sdrive:propose "User login with email and password"
142
+ ```
143
+
144
+ 4. Implement:
145
+
146
+ ```text
147
+ /sdrive:apply
148
+ ```
149
+
150
+ 5. Write tests:
151
+
152
+ ```text
153
+ /sdrive:test user-login
154
+ ```
155
+
156
+ 6. Review and merge:
157
+
158
+ ```text
159
+ /sdrive:review
160
+ ```
161
+
162
+ ---
163
+
164
+ ## Onboarding an Existing Project
165
+
166
+ If your project already has code but no SpecDrive governance, run:
167
+
168
+ ```text
169
+ /sdrive:onboard
170
+ ```
171
+
172
+ That is the only command you need.
173
+
174
+ The Onboarding Agent will:
175
+
176
+ 1. Scan your project automatically
177
+ 2. Detect any `openspec/` or `.specify/` folders
178
+ 3. Write `.sdrive/onboarding/inventory.json` and `report.md`
179
+ 4. Show the inventory for your approval
180
+ 5. Ask which missing pieces to fill vs. defer
181
+ 6. Optionally generate a baseline constitution
182
+ 7. Optionally generate retroactive specs for existing features
183
+ 8. Optionally migrate OpenSpec or Spec-Kit specs
184
+ 9. Record onboarding state in `workflow-state.json`
185
+
186
+ ### What onboarding does NOT do
187
+
188
+ - Does not overwrite existing files
189
+ - Does not delete anything
190
+ - Does not modify code
191
+ - Does not fabricate spec IDs or history
192
+
193
+ ### Optional: manual scan
194
+
195
+ If you prefer to scan from the terminal before opening your AI tool:
196
+
197
+ ```bash
198
+ sdrive onboard
199
+ ```
200
+
201
+ This only writes the inventory. Adoption still happens via `/sdrive:onboard`.
202
+
203
+ ---
204
+
205
+ ## Migrating from OpenSpec or Spec-Kit
206
+
207
+ Migration is part of onboarding. It runs automatically when OpenSpec or Spec-Kit is detected and the user approves.
208
+
209
+ ### Step 1: Detect
210
+
211
+ When the Onboarding Agent runs, it scans for:
212
+
213
+ - `openspec/` folder
214
+ - `.specify/` folder
215
+
216
+ If found, it records them in `.sdrive/onboarding/inventory.json` under `detectedSystems`.
217
+
218
+ ### Step 2: Migrate
219
+
220
+ The agent will ask:
221
+
222
+ > "I found an OpenSpec project with 3 specs and 2 changes. Migrate them into SpecDrive?"
223
+
224
+ Options:
225
+
226
+ 1. Migrate all
227
+ 2. Skip migration
228
+
229
+ ### What Migration Does
230
+
231
+ **OpenSpec → SpecDrive:**
232
+
233
+ - `openspec/specs/<feature>/` → `.sdrive/specs/ongoing/<feature>/v1/`
234
+ - `openspec/changes/<name>/` → `.sdrive/specs/ongoing/<name>/v1/`
235
+ - `openspec/archive/<feature>/` → `.sdrive/specs/completed/<feature>/v1/`
236
+
237
+ **Spec-Kit → SpecDrive:**
238
+
239
+ - `.specify/specs/###-<feature>/` → `.sdrive/specs/ongoing/<feature>/v1/`
240
+ - `.specify/memory/constitution.md` → merged into `.sdrive/constitution.md`
241
+
242
+ ### What Migration Preserves
243
+
244
+ - Original `openspec/` and `.specify/` folders are never deleted
245
+ - All migrated features are marked `retroactive: true`
246
+ - Every migrated feature records `migratedFrom: openspec` or `migratedFrom: speckit`
247
+ - Every migration is logged in `workflow-state.json` under `onboarding.migrated`
248
+ - Skipped migrations are logged under `onboarding.skipped`
249
+
250
+ ### What Migration Does NOT Do
251
+
252
+ - Does not overwrite existing SpecDrive files
253
+ - Does not invent requirements
254
+ - Does not link tests
255
+ - Does not run verification
256
+ - Does not modify source code
257
+
258
+ ---
259
+
260
+ ## Core Workflow
261
+
262
+ ### 1. `/sdrive:constitution`
263
+
264
+ Creates or updates the project constitution.
265
+
266
+ **What it does:**
267
+
268
+ - Discovers project stack, standards, and architecture
269
+ - Detects test framework, command, and folder
270
+ - Creates context files under `.sdrive/context/`
271
+ - Merges rules into `.sdrive/constitution.md`
272
+ - Includes versioning rules (`CON-603` to `CON-605`)
273
+ - Requires human approval before writing
274
+
275
+ **When to use:**
276
+
277
+ - First time setting up a project
278
+ - When project standards change
279
+
280
+ ---
281
+
282
+ ### 2. `/sdrive:propose`
283
+
284
+ Creates the feature specification, traceability matrix, technical plan, and execution tasks.
285
+
286
+ **What it does:**
287
+
288
+ - Accepts a natural feature description
289
+ - Generates a kebab-case feature name
290
+ - Uses default template from `.sdrive/config.json`
291
+ - Creates spec, plan, tasks, and traceability files
292
+ - Assigns the feature to `v1` automatically if new
293
+ - Runs anti-redundancy check
294
+ - Requires two human approval gates
295
+
296
+ **When to use:**
297
+
298
+ - Whenever a new feature is needed
299
+ - Before any code is written
300
+
301
+ ---
302
+
303
+ ### 3. `/sdrive:apply`
304
+
305
+ Writes production code from the approved tasks.
306
+
307
+ **What it does:**
308
+
309
+ - Reads approved tasks and plan from the current version
310
+ - Asks which base branch to pull from
311
+ - Creates a feature branch with user approval
312
+ - Implements production code only (no tests)
313
+ - Runs `sdrive verify <feature>`
314
+ - Commits and pushes
315
+
316
+ **When to use:**
317
+
318
+ - After spec and plan are approved
319
+ - When implementation is ready
320
+
321
+ ---
322
+
323
+ ### 4. `/sdrive:test`
324
+
325
+ Writes tests for every acceptance criterion, runs them, and reports coverage.
326
+
327
+ **What it does:**
328
+
329
+ - Reads spec, plan, tasks, and traceability from the current version
330
+ - Detects the project's test framework
331
+ - Writes one test per AC
332
+ - Requires approval before writing
333
+ - Runs tests and updates `traceability.json`
334
+ - Generates a coverage report
335
+ - Runs `sdrive verify <feature>` and the governance validator
336
+
337
+ **When to use:**
338
+
339
+ - After `/sdrive:apply`
340
+ - Before `/sdrive:review`
341
+
342
+ ---
343
+
344
+ ### 5. `/sdrive:review`
345
+
346
+ Final audit, merge, and archive.
347
+
348
+ **What it does:**
349
+
350
+ - Verifies coverage: every AC has a linked, existing, passing test
351
+ - Runs spec-to-code verification
352
+ - Audits code against spec and traceability
353
+ - Requires human approval before merging
354
+ - Merges to main and archives the feature
355
+ - Marks the current version as `completed`
356
+ - Preserves older versions
357
+
358
+ **When to use:**
359
+
360
+ - After `/sdrive:test`
361
+ - Before shipping to production
362
+
363
+ ---
364
+
365
+ ## Optional Commands
366
+
367
+ | Command | Purpose | When to Use |
368
+ |---------|---------|-------------|
369
+ | `/sdrive:design` | Build UI/UX prototype | When there is no existing prototype |
370
+ | `/sdrive:secure` | Security audit and fixes | When security is a concern |
371
+ | `/sdrive:performance` | Benchmark and optimize | When performance NFRs are not met |
372
+ | `/sdrive:docs` | Generate documentation | When docs are outdated or missing |
373
+ | `/sdrive:sync` | Sync spec → plan → tasks | When higher-level files change |
374
+ | `/sdrive:skills` | Manage AI skills | When auditing or discovering skills |
375
+
376
+ ---
377
+
378
+ ### `/sdrive:design`
379
+
380
+ Builds interactive prototype using vanilla HTML, CSS, and JavaScript.
381
+
382
+ **What it does:**
383
+
384
+ - Creates design system under `.sdrive/prototype/`
385
+ - Builds screens and user flows
386
+ - Supports light/dark mode
387
+ - Maps screens to user stories
388
+
389
+ **When to use:**
390
+
391
+ - When there is no existing UI/UX prototype
392
+ - When visual validation is needed before coding
393
+
394
+ ---
395
+
396
+ ### `/sdrive:secure`
397
+
398
+ Performs deep security audit.
399
+
400
+ **What it does:**
401
+
402
+ - Threat modeling
403
+ - OWASP Top 10 checks
404
+ - Dependency scanning
405
+ - Secret detection
406
+ - CVSS scoring
407
+ - Applies fixes after approval
408
+
409
+ **When to use:**
410
+
411
+ - Before release
412
+ - After adding new dependencies
413
+
414
+ ---
415
+
416
+ ### `/sdrive:performance`
417
+
418
+ Benchmarks and optimizes performance.
419
+
420
+ **What it does:**
421
+
422
+ - Measures baseline metrics
423
+ - Identifies bottlenecks
424
+ - Applies optimizations with approval
425
+ - Verifies improvements
426
+
427
+ **When to use:**
428
+
429
+ - When performance NFRs are not met
430
+ - After major feature implementations
431
+
432
+ ---
433
+
434
+ ### `/sdrive:docs`
435
+
436
+ Generates documentation.
437
+
438
+ **What it does:**
439
+
440
+ - Adds inline comments with traceability IDs
441
+ - Updates README
442
+ - Detects code/spec drift
443
+ - Generates coverage report
444
+
445
+ **When to use:**
446
+
447
+ - After implementation
448
+ - When docs are stale
449
+
450
+ ---
451
+
452
+ ### `/sdrive:sync`
453
+
454
+ Cascades changes across spec, plan, tasks, and traceability.
455
+
456
+ **What it does:**
457
+
458
+ - Detects changes in higher-level files
459
+ - Updates downstream files
460
+ - Preserves task status and IDs
461
+ - Runs `sdrive verify <feature>` after sync
462
+
463
+ **When to use:**
464
+
465
+ - When spec or plan changes after implementation has started
466
+
467
+ ---
468
+
469
+ ### `/sdrive:skills`
470
+
471
+ Audits and manages AI skills.
472
+
473
+ **What it does:**
474
+
475
+ - Scans existing skills
476
+ - Discovers new skills from GitHub
477
+ - Verifies security of community skills
478
+ - Installs approved skills
479
+
480
+ **When to use:**
481
+
482
+ - When setting up a new workspace
483
+ - When auditing existing AI skills
484
+
485
+ ---
486
+
487
+ ## Terminal Commands
488
+
489
+ | Command | Purpose |
490
+ |---------|---------|
491
+ | `sdrive init` | Initialize SpecDrive structure |
492
+ | `sdrive onboard` | Scan an existing project (usually run automatically by `/sdrive:onboard`) |
493
+ | `sdrive validate` | Validate governance files |
494
+ | `sdrive config:validate` | Validate `.sdrive/config.json` |
495
+ | `sdrive status` | Show feature lifecycle state |
496
+ | `sdrive approve <gate>` | Approve a workflow gate |
497
+ | `sdrive create <feature>` | Create feature scaffold (internal) |
498
+ | `sdrive team:add <username> <role>` | Add a new team member |
499
+ | `sdrive team:remove <username>` | Remove a team member |
500
+ | `sdrive team:list` | List all team members |
501
+ | `sdrive team:update <username> <role>` | Update a member's role |
502
+ | `sdrive team:sync` | Sync team members from GitHub collaborators |
503
+ | `sdrive template:list` | List available templates |
504
+ | `sdrive template:set <name>` | Set default template |
505
+ | `sdrive hooks:install` | Install pre-commit validation hook |
506
+ | `sdrive diff <old> <new>` | Show differences between two spec files |
507
+ | `sdrive openapi:generate <feature>` | Generate OpenAPI spec from plan.json |
508
+ | `sdrive dashboard` | Start local web dashboard |
509
+ | `sdrive reopen <feature>` | Reopen a completed feature |
510
+ | `sdrive verify <feature>` | Verify code matches plan.json |
511
+ | `sdrive version:new <feature>` | Create a new version of a feature |
512
+ | `sdrive diff:version <feature> <vA> <vB>` | Compare two versions of a feature |
513
+
514
+ ---
515
+
516
+ ## Agents
517
+
518
+ | Agent | File | Role |
519
+ |-------|------|------|
520
+ | Onboarding | `00-onboarding.md` | Adopt SpecDrive into an existing project, migrate OpenSpec and Spec-Kit |
521
+ | Constitution | `01-constitution.md` | Discover project rules, merge into constitution |
522
+ | Specification | `02-specification.md` | Generate spec, plan, tasks, traceability |
523
+ | UI/UX | `03-uiux.md` | Build interactive prototype |
524
+ | Cascade | `04-cascade.md` | Sync spec → plan → tasks |
525
+ | Discover-skills | `05-discover-skills.md` | Audit AI skills |
526
+ | Documentation | `06-documentation.md` | Generate docs, detect drift |
527
+ | Implementation | `07-implementation.md` | Write production code |
528
+ | Performance | `08-performance.md` | Benchmark and optimize |
529
+ | Review & Complete | `09-review-complete.md` | Final audit and merge |
530
+ | Security | `10-security.md` | Security audit and fixes |
531
+ | Test | `11-test.md` | Write tests, run them, report coverage |
532
+
533
+ ---
534
+
535
+ ## Templates
536
+
537
+ SpecDrive includes starter templates for common stacks.
538
+
539
+ | Template | Stack |
540
+ |----------|-------|
541
+ | `generic` | Any project |
542
+ | `react-node` | React + Node |
543
+ | `nextjs` | Next.js |
544
+ | `expo` | Expo / React Native |
545
+ | `fastapi` | Python FastAPI |
546
+ | `turborepo` | Turborepo monorepo |
547
+
548
+ The default template is stored in `.sdrive/config.json`.
549
+
550
+ Manage templates:
551
+
552
+ ```bash
553
+ sdrive template:list
554
+ sdrive template:set nextjs
555
+ ```
556
+
557
+ ---
558
+
559
+ ## Versions
560
+
561
+ Every feature is versioned. Each version has its own phase, gates, tasks, and history.
562
+
563
+ ### Automatic `v1`
564
+
565
+ When you run `/sdrive:propose` on a new feature, SpecDrive assigns it to `v1` automatically.
566
+
567
+ ### Creating a New Version
568
+
569
+ For structural changes (new workflow, new user story, behavior change), create a new version:
570
+
571
+ ```bash
572
+ sdrive version:new user-login
573
+ ```
574
+
575
+ This:
576
+
577
+ - Migrates the current files into `v1/` (if they weren't already)
578
+ - Creates a new `v2/` folder
579
+ - Preserves `v1` history
580
+ - Sets `v2` as the current version
581
+
582
+ Then run `/sdrive:propose` to fill in `v2`.
583
+
584
+ ### Comparing Versions
585
+
586
+ ```bash
587
+ sdrive diff:version user-login v1 v2
588
+ ```
589
+
590
+ Shows added and removed lines across spec, plan, and tasks.
591
+
592
+ ### When to Use Versions
593
+
594
+ | Change | Version? |
595
+ |--------|----------|
596
+ | Typo fix | No |
597
+ | Small edge case | No |
598
+ | New user story | Yes |
599
+ | New workflow | Yes |
600
+ | Behavior change | Yes |
601
+
602
+ ### Version Isolation
603
+
604
+ All agents operate within the **current version** folder only. Older versions are never modified.
605
+
606
+ ---
607
+
608
+ ## Directory Structure
609
+
610
+ ```text
611
+ .sdrive/
612
+ ├── agents/ # 12 agent definitions
613
+ ├── commands/ # Manifest, router, gates, permissions
614
+ ├── schemas/ # JSON schemas
615
+ ├── specs/ # Human-readable specs
616
+ │ ├── backlog/
617
+ │ │ └── <feature>/
618
+ │ │ └── <version>/
619
+ │ ├── ongoing/
620
+ │ └── completed/
621
+ ├── governance/ # Machine-readable JSON
622
+ │ └── <feature>/
623
+ │ └── <version>/
624
+ ├── onboarding/ # Brownfield onboarding inventory + migration results
625
+ ├── mcp/ # MCP server for AI chat integration
626
+ ├── prototype/ # UI/UX prototypes
627
+ ├── reports/ # Security, performance, docs, tests reports
628
+ ├── context/ # Discovered project context
629
+ ├── dashboard/ # Local web dashboard
630
+ ├── skills/ # AI skills
631
+ ├── templates/ # Starter templates
632
+ ├── constitution.md # Governance source of truth
633
+ ├── config.json # Default template + settings
634
+ ├── team.json # Team roles and rules
635
+ └── workflow-state.json # Feature lifecycle state (per-version + onboarding)
636
+ ```
637
+
638
+ ---
639
+
640
+ ## Validation
641
+
642
+ Run the governance validator:
643
+
644
+ ```bash
645
+ sdrive validate
646
+ ```
647
+
648
+ This checks all governance JSON against the schemas, including `config.json`.
649
+
650
+ If anything is invalid, it reports exact errors.
651
+
652
+ ### Config Validation
653
+
654
+ ```bash
655
+ sdrive config:validate
656
+ ```
657
+
658
+ Checks only `.sdrive/config.json`.
659
+
660
+ ### Pre-commit Hook
661
+
662
+ Automatically validate governance files before every commit:
663
+
664
+ ```bash
665
+ sdrive hooks:install
666
+ ```
667
+
668
+ ---
669
+
670
+ ## Spec-to-Code Verification
671
+
672
+ SpecDrive includes a deterministic validator that compares `plan.json` against actual code.
673
+
674
+ It detects:
675
+
676
+ - Missing implementation
677
+ - Renamed components, functions, endpoints, fields
678
+ - Extra code not in the plan
679
+ - Dependencies not installed
680
+
681
+ ### Run Verification
682
+
683
+ ```bash
684
+ sdrive verify user-login
685
+ ```
686
+
687
+ ### Where It Runs
688
+
689
+ - After `/sdrive:apply`
690
+ - Before `/sdrive:review`
691
+ - On every `git commit` (if hooks installed)
692
+ - In CI on every PR
693
+
694
+ ### Report
695
+
696
+ Results saved to:
697
+
698
+ ```text
699
+ .sdrive/governance/<feature>/<version>/verification.json
700
+ ```
701
+
702
+ Status can be:
703
+
704
+ | Status | Meaning |
705
+ |--------|---------|
706
+ | `pass` | Everything matches |
707
+ | `warn` | Extra code detected |
708
+ | `fail` | Missing or renamed code detected |
709
+
710
+ ### Source Roots
711
+
712
+ SpecDrive reads source folders from the constitution.
713
+
714
+ If no source root is defined, it scans common folders:
715
+
716
+ - `src`, `app`, `lib`, `pages`, `server`, `internal`, `cmd`, `pkg`, `api`, `apps`, `packages`
717
+
718
+ ---
719
+
720
+ ## CI/CD Integration
721
+
722
+ SpecDrive ships with a GitHub Actions workflow.
723
+
724
+ Create `.github/workflows/sdrive-governance.yml`:
725
+
726
+ ```yaml
727
+ name: SpecDrive Governance Validation
728
+
729
+ on:
730
+ pull_request:
731
+ branches:
732
+ - main
733
+ paths:
734
+ - '.sdrive/**'
735
+ - 'package.json'
736
+
737
+ jobs:
738
+ validate-governance:
739
+ runs-on: ubuntu-latest
740
+ steps:
741
+ - uses: actions/checkout@v4
742
+ - uses: actions/setup-node@v4
743
+ with:
744
+ node-version: '20'
745
+ - name: Install Dependencies
746
+ run: |
747
+ cd .sdrive
748
+ npm install
749
+ - name: Run Governance Validation
750
+ run: node .sdrive/scripts/validate-governance.js
751
+ - name: Run Spec-to-Code Verification
752
+ run: node .sdrive/scripts/verify.js
753
+ ```
754
+
755
+ ---
756
+
757
+ ## MCP Server
758
+
759
+ SpecDrive ships with an MCP server so AI tools can call SpecDrive directly from chat.
760
+
761
+ You can ask in plain language:
762
+
763
+ ```text
764
+ Show me all features
765
+ Is the governance valid?
766
+ Get the traceability for user-login
767
+ ```
768
+
769
+ The AI tool calls SpecDrive automatically through MCP.
770
+
771
+ ### Setup
772
+
773
+ `sdrive init` creates the MCP server at:
774
+
775
+ ```text
776
+ .sdrive/mcp/server.js
777
+ ```
778
+
779
+ It also asks which MCP clients to wire. Supported:
780
+
781
+ | Client | Config Path |
782
+ |--------|-------------|
783
+ | Claude Desktop (macOS) | `~/Library/Application Support/Claude/claude_desktop_config.json` |
784
+ | Claude Desktop (Windows) | `%APPDATA%\Claude\claude_desktop_config.json` |
785
+ | Cursor | `.cursor/mcp.json` |
786
+ | Cline | `.cline/mcp.json` |
787
+ | VS Code | `.vscode/mcp.json` |
788
+
789
+ SpecDrive never overwrites existing MCP entries. It merges safely.
790
+
791
+ ### Available MCP Methods
792
+
793
+ | Method | Purpose |
794
+ |--------|---------|
795
+ | `specdrive.list_features` | List all features |
796
+ | `specdrive.get_feature` | Get details for a feature |
797
+ | `specdrive.get_spec` | Get `spec.json` for a feature |
798
+ | `specdrive.get_traceability` | Get traceability matrix |
799
+ | `specdrive.validate` | Run governance validator |
800
+ | `specdrive.status` | Get status summary |
801
+
802
+ ---
803
+
804
+ ## Tool Support
805
+
806
+ SpecDrive supports 15 AI tools.
807
+
808
+ | Tool | Adapter |
809
+ |------|---------|
810
+ | GitHub Copilot | `.github/copilot-instructions.md` |
811
+ | Cline | `.clinerules/sdrive.md` |
812
+ | Claude Code | `.claude/commands/sdrive.md` |
813
+ | Cursor | `.cursor/rules/sdrive.md` |
814
+ | VS Code | `.vscode/sdrive-commands.json` |
815
+ | Amazon Q Developer | `.amazonq/rules/sdrive.md` |
816
+ | Gemini CLI | `.gemini/commands/sdrive.md` |
817
+ | Continue | `.continue/rules/sdrive.md` |
818
+ | Codex | `.codex/rules/sdrive.md` |
819
+ | Windsurf | `.windsurf/rules/sdrive.md` |
820
+ | Kilo Code | `.kilocode/rules/sdrive.md` |
821
+ | OpenCode | `.opencode/rules/sdrive.md` |
822
+ | Qoder | `.qoder/rules/sdrive.md` |
823
+ | Qwen Code | `.qwen/rules/sdrive.md` |
824
+ | Rovo Dev CLI | `.rovo/rules/sdrive.md` |
825
+
826
+ Adapters are generated automatically when you run `sdrive init`.
827
+
828
+ During initialization, you select which tools you use. Only selected tools get adapters.
829
+
830
+ ---
831
+
832
+ ## Web Dashboard
833
+
834
+ SpecDrive includes a local web dashboard for visual inspection of your specs, features, and team.
835
+
836
+ ### Start the Dashboard
837
+
838
+ ```bash
839
+ sdrive dashboard
840
+ ```
841
+
842
+ Then open:
843
+
844
+ ```text
845
+ http://localhost:4747
846
+ ```
847
+
848
+ ### What It Shows
849
+
850
+ - Onboarding status (greenfield, brownfield partial, brownfield complete)
851
+ - Detected external spec systems (OpenSpec, Spec-Kit)
852
+ - Migrated features and their source
853
+ - Skipped migrations and reasons
854
+ - Missing and deferred items
855
+ - All features and their current version
856
+ - All versions per feature, with their own phase and gates
857
+ - Branch name for each feature
858
+ - Gate status per version
859
+ - Who approved each gate
860
+ - Traceability coverage per version
861
+ - Spec-to-code verification status per version
862
+ - Test coverage per version
863
+ - Team members and roles
864
+ - Recent audit activity
865
+
866
+ ### Filters
867
+
868
+ The dashboard includes a filter bar:
869
+
870
+ - Search by feature name
871
+ - Filter by phase
872
+ - Filter by verification status
873
+ - Filter by test coverage
874
+ - Show current version only
875
+
876
+ ### Notes
877
+
878
+ - The dashboard runs locally on port `4747`
879
+ - It reads directly from `.sdrive/`
880
+ - No data leaves your machine
881
+
882
+ ---
883
+
884
+ ## Team Collaboration
885
+
886
+ SpecDrive supports team roles.
887
+
888
+ | Role | Can approve | Can implement |
889
+ |------|-------------|---------------|
890
+ | admin | ✅ | ✅ |
891
+ | reviewer | ✅ | ❌ |
892
+ | developer | ❌ | ✅ |
893
+
894
+ Manage team:
895
+
896
+ ```bash
897
+ sdrive team:add alice admin
898
+ sdrive team:list
899
+ sdrive team:update bob reviewer
900
+ sdrive team:remove carol
901
+ ```
902
+
903
+ ### Sync from GitHub
904
+
905
+ Automatically pull collaborators from your GitHub repository:
906
+
907
+ ```bash
908
+ sdrive team:sync
909
+ ```
910
+
911
+ Roles are auto-assigned:
912
+
913
+ - GitHub admins → `admin`
914
+ - Others → `developer`
915
+
916
+ Reviewer roles must be assigned manually.
917
+
918
+ ---
919
+
920
+ ## Permissions
921
+
922
+ SpecDrive enforces role-based permissions on both slash commands and CLI commands.
923
+
924
+ Permission rules live in:
925
+
926
+ ```text
927
+ .sdrive/commands/permissions.json
928
+ ```
929
+
930
+ The current Git user is detected via:
931
+
932
+ ```bash
933
+ git config user.name
934
+ ```
935
+
936
+ That user must exist in `.sdrive/team.json`.
937
+
938
+ If they are not in the team, or their role is not allowed, the command is blocked before execution.
939
+
940
+ Customize rules by editing `.sdrive/commands/permissions.json`.
941
+
942
+ ---
943
+
944
+ ## Contributing
945
+
946
+ Contributions are welcome.
947
+
948
+ Please read the constitution and agent definitions before contributing.
949
+
950
+ ---
951
+
952
+ ## License
953
+
954
+ MIT
955
+ ```