specpilot 1.1.0 ā 1.1.2
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.
- package/README.md +170 -150
- package/dist/cli.js +2 -2
- package/dist/cli.js.map +1 -1
- package/dist/commands/init.d.ts +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +21 -3
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/list.d.ts.map +1 -1
- package/dist/commands/list.js +0 -3
- package/dist/commands/list.js.map +1 -1
- package/dist/utils/specGenerator.d.ts +4 -22
- package/dist/utils/specGenerator.d.ts.map +1 -1
- package/dist/utils/specGenerator.js +189 -1088
- package/dist/utils/specGenerator.js.map +1 -1
- package/dist/utils/specValidator.d.ts +1 -0
- package/dist/utils/specValidator.d.ts.map +1 -1
- package/dist/utils/specValidator.js +64 -21
- package/dist/utils/specValidator.js.map +1 -1
- package/dist/utils/templateEngine.d.ts.map +1 -1
- package/dist/utils/templateEngine.js +22 -5
- package/dist/utils/templateEngine.js.map +1 -1
- package/dist/utils/templateRegistry.d.ts.map +1 -1
- package/dist/utils/templateRegistry.js +0 -14
- package/dist/utils/templateRegistry.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -2,6 +2,47 @@
|
|
|
2
2
|
|
|
3
3
|
A CLI tool for initializing specification-driven development projects with flexible, production-ready structures.
|
|
4
4
|
|
|
5
|
+
## Table of Contents
|
|
6
|
+
|
|
7
|
+
- [Quick Start](#quick-start)
|
|
8
|
+
- [Description](#description)
|
|
9
|
+
- [Why SpecPilot?](#why-specpilot)
|
|
10
|
+
- [The Problem with Traditional Development](#the-problem-with-traditional-development)
|
|
11
|
+
- [The SpecPilot Solution](#the-specpilot-solution)
|
|
12
|
+
- [šļø Analogy: Building a House](#ļø-analogy-building-a-house)
|
|
13
|
+
- [š” Example: Building a Task Management App](#-example-building-a-task-management-app)
|
|
14
|
+
- [š Why SDD is the Future](#-why-sdd-is-the-future)
|
|
15
|
+
- [Prerequisites](#prerequisites)
|
|
16
|
+
- [Installation](#installation)
|
|
17
|
+
- [Usage Examples](#usage-examples)
|
|
18
|
+
- [Basic Project Initialization](#basic-project-initialization)
|
|
19
|
+
- [Additional Commands](#additional-commands)
|
|
20
|
+
- [Configuration](#configuration)
|
|
21
|
+
- [Global Configuration](#global-configuration)
|
|
22
|
+
- [Project Configuration](#project-configuration)
|
|
23
|
+
- [Templates](#templates)
|
|
24
|
+
- [Available Templates](#available-templates)
|
|
25
|
+
- [Custom Templates](#custom-templates)
|
|
26
|
+
- [Features](#features)
|
|
27
|
+
- [Project Structure](#project-structure)
|
|
28
|
+
- [Troubleshooting](#troubleshooting)
|
|
29
|
+
- [Common Issues](#common-issues)
|
|
30
|
+
- [Debug Mode](#debug-mode)
|
|
31
|
+
- [Getting Help](#getting-help)
|
|
32
|
+
- [Getting Started](#getting-started)
|
|
33
|
+
- [Best Practices](#best-practices)
|
|
34
|
+
- [How to Contribute](#how-to-contribute)
|
|
35
|
+
- [Version History](#version-history)
|
|
36
|
+
- [MIT License](#mit-license)
|
|
37
|
+
- [Extended Configuration](#extended-configuration)
|
|
38
|
+
- [CI/CD Integration](#cicd-integration)
|
|
39
|
+
- [Team Collaboration](#team-collaboration)
|
|
40
|
+
- [Enterprise Integration](#enterprise-integration)
|
|
41
|
+
- [API Usage](#api-usage)
|
|
42
|
+
- [Contributing](#contributing)
|
|
43
|
+
- [Development Setup](#development-setup)
|
|
44
|
+
- [License](#license)
|
|
45
|
+
|
|
5
46
|
## Quick Start
|
|
6
47
|
|
|
7
48
|
```bash
|
|
@@ -9,7 +50,7 @@ A CLI tool for initializing specification-driven development projects with flexi
|
|
|
9
50
|
npm install -g specpilot
|
|
10
51
|
|
|
11
52
|
# Initialize your first project
|
|
12
|
-
specpilot my-project --lang typescript --framework react
|
|
53
|
+
specpilot init my-project --lang typescript --framework react
|
|
13
54
|
|
|
14
55
|
# Start coding with full control
|
|
15
56
|
cd my-project
|
|
@@ -70,68 +111,69 @@ cd task-manager
|
|
|
70
111
|
|
|
71
112
|
**SpecPilot gives you a professional project foundation in seconds, so you can focus on building great features instead of figuring out folder structures.**
|
|
72
113
|
|
|
114
|
+
## Prerequisites
|
|
115
|
+
|
|
116
|
+
- **Node.js**: 16.0.0 or higher (18+ recommended)
|
|
117
|
+
- **npm**: 8.0.0 or higher (or yarn 1.22+)
|
|
118
|
+
- **Git**: For version control (recommended)
|
|
119
|
+
- **Operating System**: Windows, macOS, or Linux
|
|
120
|
+
|
|
73
121
|
## Installation
|
|
74
122
|
|
|
75
123
|
```bash
|
|
76
124
|
npm install -g specpilot
|
|
77
125
|
```
|
|
78
126
|
|
|
127
|
+
### Verify Installation
|
|
128
|
+
|
|
129
|
+
```bash
|
|
130
|
+
specpilot --version
|
|
131
|
+
# Should output: 1.1.1 (or current version)
|
|
132
|
+
|
|
133
|
+
specpilot --help
|
|
134
|
+
# Shows available commands
|
|
135
|
+
```
|
|
136
|
+
|
|
79
137
|
## Usage Examples
|
|
80
138
|
|
|
81
139
|
### Basic Project Initialization
|
|
82
140
|
|
|
83
141
|
```bash
|
|
84
142
|
# Initialize with default settings (.specs folder)
|
|
85
|
-
specpilot my-project
|
|
143
|
+
specpilot init my-project
|
|
86
144
|
|
|
87
145
|
# Specify language and framework
|
|
88
|
-
specpilot my-project --lang typescript --framework react
|
|
89
|
-
specpilot my-project --lang
|
|
90
|
-
specpilot my-project --lang
|
|
146
|
+
specpilot init my-project --lang typescript --framework react
|
|
147
|
+
specpilot init my-project --lang typescript --framework express
|
|
148
|
+
specpilot init my-project --lang python --framework fastapi
|
|
149
|
+
specpilot init my-project --lang python --framework django
|
|
91
150
|
|
|
92
|
-
# Use custom
|
|
93
|
-
specpilot my-project --
|
|
94
|
-
specpilot my-project --spec-dir docs/specifications
|
|
151
|
+
# Use a custom specs folder name
|
|
152
|
+
specpilot init my-project --specs-name .project-specs
|
|
95
153
|
|
|
96
|
-
#
|
|
97
|
-
specpilot --
|
|
154
|
+
# Skip interactive prompts
|
|
155
|
+
specpilot init my-project --no-prompts
|
|
98
156
|
```
|
|
99
157
|
|
|
100
|
-
###
|
|
101
|
-
|
|
102
|
-
```bash
|
|
103
|
-
# Initialize with specific template
|
|
104
|
-
specpilot my-api --lang typescript --framework express --template rest-api
|
|
105
|
-
|
|
106
|
-
# Initialize for team collaboration
|
|
107
|
-
specpilot team-project --lang python --framework fastapi --collaboration
|
|
108
|
-
|
|
109
|
-
# Initialize with custom author and license
|
|
110
|
-
specpilot my-lib --lang typescript --author "Your Name" --license MIT
|
|
111
|
-
```
|
|
112
|
-
|
|
113
|
-
### Validation and Management
|
|
158
|
+
### Additional Commands
|
|
114
159
|
|
|
115
160
|
```bash
|
|
116
161
|
# Validate project specs
|
|
117
|
-
specpilot --
|
|
118
|
-
|
|
119
|
-
# Validate with strict rules and auto-fix
|
|
120
|
-
specpilot --validate --strict --fix
|
|
121
|
-
|
|
122
|
-
# Check for migration needs
|
|
123
|
-
specpilot --migrate
|
|
124
|
-
|
|
125
|
-
# Show migration history
|
|
126
|
-
specpilot --migrate --show-history
|
|
162
|
+
specpilot validate --verbose
|
|
163
|
+
specpilot validate --fix
|
|
127
164
|
|
|
128
165
|
# List available templates
|
|
129
|
-
specpilot
|
|
166
|
+
specpilot list
|
|
130
167
|
|
|
131
|
-
#
|
|
132
|
-
specpilot --
|
|
168
|
+
# Migrate legacy structures (when applicable)
|
|
169
|
+
specpilot migrate --from complex --to simple --backup
|
|
170
|
+
|
|
171
|
+
# Generate or update specs from a natural language description
|
|
172
|
+
specpilot specify "A simple REST API for todos" --update
|
|
133
173
|
```
|
|
134
174
|
|
|
175
|
+
> Tip: Run `specpilot --help` or `specpilot <command> --help` for full options.
|
|
176
|
+
|
|
135
177
|
## Configuration
|
|
136
178
|
|
|
137
179
|
### Global Configuration
|
|
@@ -158,7 +200,7 @@ validation:
|
|
|
158
200
|
|
|
159
201
|
### Project Configuration
|
|
160
202
|
|
|
161
|
-
After initialization, customize `.specs/project.yaml`:
|
|
203
|
+
After initialization, customize `.specs/project/project.yaml`:
|
|
162
204
|
|
|
163
205
|
```yaml
|
|
164
206
|
project:
|
|
@@ -166,7 +208,7 @@ project:
|
|
|
166
208
|
description: "My awesome project"
|
|
167
209
|
language: "typescript"
|
|
168
210
|
framework: "react"
|
|
169
|
-
version: "1.
|
|
211
|
+
version: "1.1.1"
|
|
170
212
|
|
|
171
213
|
rules:
|
|
172
214
|
- "Follow specification-driven development"
|
|
@@ -187,26 +229,20 @@ ai-context:
|
|
|
187
229
|
- **Generic**: Basic TypeScript project structure
|
|
188
230
|
- **React**: React application with modern tooling
|
|
189
231
|
- **Express**: REST API server setup
|
|
190
|
-
- **Library**: NPM package development
|
|
191
|
-
- **CLI**: Command-line tool development
|
|
192
232
|
|
|
193
233
|
#### Python
|
|
194
234
|
|
|
195
235
|
- **Generic**: Basic Python project structure
|
|
196
236
|
- **FastAPI**: Modern API development
|
|
197
237
|
- **Django**: Web application framework
|
|
198
|
-
- **Data Science**: Jupyter, pandas, scikit-learn setup
|
|
199
|
-
- **CLI**: Python command-line tools
|
|
200
|
-
|
|
201
|
-
#### Java
|
|
202
238
|
|
|
203
|
-
|
|
204
|
-
- **Spring Boot**: Microservices development
|
|
205
|
-
- **Android**: Mobile app development
|
|
239
|
+
> **Note**: Run `specpilot list` to see all currently available templates and their status.
|
|
206
240
|
|
|
207
241
|
### Custom Templates
|
|
208
242
|
|
|
209
|
-
|
|
243
|
+
> **Coming Soon**: Custom template support is planned for future releases. Currently, SpecPilot uses built-in templates optimized for specification-driven development.
|
|
244
|
+
|
|
245
|
+
**Planned custom template structure:**
|
|
210
246
|
|
|
211
247
|
```text
|
|
212
248
|
~/.specpilot-templates/
|
|
@@ -218,14 +254,12 @@ Create custom templates in `~/.specpilot-templates/`:
|
|
|
218
254
|
|
|
219
255
|
## Features
|
|
220
256
|
|
|
221
|
-
- **Flexible Structure**: Generates `.specs`
|
|
222
|
-
- **Language Support**: Templates for TypeScript
|
|
223
|
-
- **Spec Validation**: Built-in validation with auto-fix
|
|
257
|
+
- **Flexible Structure**: Generates `.specs` with customizable, production-ready layout
|
|
258
|
+
- **Language Support**: Templates for TypeScript and Python
|
|
259
|
+
- **Spec Validation**: Built-in validation with optional auto-fix
|
|
224
260
|
- **AI Integration**: Dedicated prompts tracking for development cycles
|
|
225
|
-
- **
|
|
226
|
-
- **
|
|
227
|
-
- **Custom Templates**: Support for organization-specific templates
|
|
228
|
-
- **Team Collaboration**: Built-in support for team development workflows
|
|
261
|
+
- **Migration Support**: Helps transition older structures
|
|
262
|
+
- **Template Listing**: Discover available language/framework combinations
|
|
229
263
|
|
|
230
264
|
## Project Structure
|
|
231
265
|
|
|
@@ -233,17 +267,14 @@ After initialization, your project will have:
|
|
|
233
267
|
|
|
234
268
|
```text
|
|
235
269
|
project-root/
|
|
236
|
-
āāā .specs/
|
|
237
|
-
ā āāā
|
|
238
|
-
ā āāā architecture/
|
|
239
|
-
ā āāā
|
|
240
|
-
ā āāā
|
|
241
|
-
ā
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
ā āāā docs/ # Development guidelines
|
|
245
|
-
āāā src/ # Your source code
|
|
246
|
-
āāā README.md # This file
|
|
270
|
+
āāā .specs/
|
|
271
|
+
ā āāā project/ # project.yaml, requirements.md, project-plan.md
|
|
272
|
+
ā āāā architecture/ # architecture.md, api.yaml
|
|
273
|
+
ā āāā planning/ # tasks.md, roadmap.md
|
|
274
|
+
ā āāā quality/ # tests.md
|
|
275
|
+
ā āāā development/ # docs.md, context.md, prompts.md
|
|
276
|
+
āāā src/
|
|
277
|
+
āāā README.md
|
|
247
278
|
```
|
|
248
279
|
|
|
249
280
|
## Troubleshooting
|
|
@@ -263,50 +294,42 @@ npm config set prefix '~/.npm-global'
|
|
|
263
294
|
|
|
264
295
|
#### Template Not Found
|
|
265
296
|
|
|
266
|
-
```bash
|
|
267
297
|
```bash
|
|
268
298
|
# List available templates
|
|
269
|
-
specpilot
|
|
270
|
-
|
|
271
|
-
# Update templates
|
|
272
|
-
specpilot --update-templates
|
|
273
|
-
````
|
|
299
|
+
specpilot list
|
|
300
|
+
```
|
|
274
301
|
|
|
275
302
|
#### Validation Failures
|
|
276
303
|
|
|
277
304
|
```bash
|
|
278
305
|
# Run with detailed error output
|
|
279
|
-
specpilot
|
|
306
|
+
specpilot validate --verbose
|
|
280
307
|
|
|
281
308
|
# Auto-fix common issues
|
|
282
|
-
specpilot
|
|
309
|
+
specpilot validate --fix
|
|
283
310
|
```
|
|
284
311
|
|
|
285
312
|
#### Migration Issues
|
|
286
313
|
|
|
287
|
-
````bash
|
|
288
314
|
```bash
|
|
289
|
-
#
|
|
315
|
+
# Show CLI version
|
|
290
316
|
specpilot --version
|
|
291
317
|
|
|
292
|
-
#
|
|
293
|
-
specpilot
|
|
294
|
-
|
|
295
|
-
# Rollback migration
|
|
296
|
-
specpilot --migrate --rollback
|
|
297
|
-
````
|
|
318
|
+
# Migrate legacy structure
|
|
319
|
+
specpilot migrate --from complex --to simple --backup
|
|
320
|
+
```
|
|
298
321
|
|
|
299
322
|
### Debug Mode
|
|
300
323
|
|
|
301
324
|
```bash
|
|
302
325
|
# Enable debug logging
|
|
303
|
-
DEBUG=specpilot specpilot my-project
|
|
326
|
+
DEBUG=specpilot specpilot init my-project
|
|
304
327
|
|
|
305
328
|
# Verbose output
|
|
306
|
-
specpilot
|
|
329
|
+
specpilot validate --verbose
|
|
307
330
|
|
|
308
|
-
#
|
|
309
|
-
specpilot
|
|
331
|
+
# Check what templates are available
|
|
332
|
+
specpilot list --verbose
|
|
310
333
|
```
|
|
311
334
|
|
|
312
335
|
### Getting Help
|
|
@@ -318,54 +341,40 @@ specpilot --help
|
|
|
318
341
|
# Command-specific help
|
|
319
342
|
specpilot init --help
|
|
320
343
|
specpilot validate --help
|
|
344
|
+
specpilot list --help
|
|
345
|
+
specpilot migrate --help
|
|
346
|
+
specpilot specify --help
|
|
321
347
|
```
|
|
322
348
|
|
|
323
349
|
## Getting Started
|
|
324
350
|
|
|
325
|
-
1. **Initialize your project**: `specpilot my-project --lang typescript`
|
|
351
|
+
1. **Initialize your project**: `specpilot init my-project --lang typescript`
|
|
326
352
|
2. **Review the generated `.specs` structure** - This provides your flexible framework
|
|
327
|
-
3. **Customize the specifications** in `.specs/project.yaml`
|
|
328
|
-
4. **Document your architecture** in `.specs/architecture.md`
|
|
329
|
-
5. **Track all development prompts** in `.specs/prompts.md`
|
|
330
|
-
6. **
|
|
331
|
-
7. **
|
|
353
|
+
3. **Customize the specifications** in `.specs/project/project.yaml`
|
|
354
|
+
4. **Document your architecture** in `.specs/architecture/architecture.md`
|
|
355
|
+
5. **Track all development prompts** in `.specs/development/prompts.md`
|
|
356
|
+
6. **Plan your work** in `.specs/planning/tasks.md` and `.specs/planning/roadmap.md`
|
|
357
|
+
7. **Define tests** in `.specs/quality/tests.md`
|
|
358
|
+
8. **Start building** your production code in `src/`
|
|
332
359
|
|
|
333
360
|
### Best Practices
|
|
334
361
|
|
|
335
362
|
- **Start with specifications**: Define what you're building before coding
|
|
336
363
|
- **Keep prompts updated**: Log all AI interactions for future reference
|
|
337
|
-
- **Validate regularly**: Use `specpilot
|
|
338
|
-
- **
|
|
364
|
+
- **Validate regularly**: Use `specpilot validate` during development
|
|
365
|
+
- **Follow the subfolder structure**: Organize specs in `project/`, `architecture/`, `planning/`, `quality/`, `development/`
|
|
366
|
+
- **Use stable IDs**: Reference requirements and tasks by their IDs (e.g., `REQ-001`, `TASK-002`)
|
|
339
367
|
- **Version control everything**: Include `.specs/` in your git repository
|
|
368
|
+
- **Update metadata**: Keep `lastUpdated` and `version` fields current in spec files
|
|
340
369
|
|
|
341
370
|
## How to Contribute
|
|
342
371
|
|
|
343
|
-
We welcome contributions! Please
|
|
344
|
-
|
|
345
|
-
1. **Fork the repository** and create a feature branch
|
|
346
|
-
2. **Follow the existing code style** and add tests for new features
|
|
347
|
-
3. **Update documentation** for any new functionality
|
|
348
|
-
4. **Submit a pull request** with a clear description of changes
|
|
349
|
-
|
|
350
|
-
### Local Development Setup
|
|
351
|
-
|
|
352
|
-
```bash
|
|
353
|
-
# Clone the repository
|
|
354
|
-
git clone https://github.com/specpilot/specpilot.git
|
|
355
|
-
cd specpilot
|
|
356
|
-
|
|
357
|
-
# Install dependencies
|
|
358
|
-
npm install
|
|
359
|
-
|
|
360
|
-
# Run in development mode
|
|
361
|
-
npm run dev -- my-test-project --lang typescript
|
|
372
|
+
We welcome contributions! Please:
|
|
362
373
|
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
npm run build
|
|
368
|
-
```
|
|
374
|
+
1. Fork the repo and create a feature branch
|
|
375
|
+
2. Follow the existing code style and add tests for new features
|
|
376
|
+
3. Update documentation for new functionality
|
|
377
|
+
4. Submit a pull request with a clear description
|
|
369
378
|
|
|
370
379
|
## Version History
|
|
371
380
|
|
|
@@ -389,77 +398,87 @@ jobs:
|
|
|
389
398
|
steps:
|
|
390
399
|
- uses: actions/checkout@v3
|
|
391
400
|
- uses: actions/setup-node@v3
|
|
401
|
+
with:
|
|
402
|
+
node-version: '18'
|
|
392
403
|
- run: npm install -g specpilot
|
|
393
|
-
- run: specpilot
|
|
404
|
+
- run: specpilot validate --verbose
|
|
394
405
|
```
|
|
395
406
|
|
|
396
407
|
### Team Collaboration
|
|
397
408
|
|
|
398
409
|
```bash
|
|
399
|
-
# Initialize for team
|
|
400
|
-
specpilot team-project --lang typescript --
|
|
410
|
+
# Initialize project for team collaboration
|
|
411
|
+
specpilot init team-project --lang typescript --framework react
|
|
401
412
|
|
|
402
|
-
#
|
|
403
|
-
|
|
413
|
+
# Share specs folder structure with team
|
|
414
|
+
git add .specs/
|
|
415
|
+
git commit -m "feat: add specification-driven development structure"
|
|
404
416
|
|
|
405
|
-
#
|
|
406
|
-
specpilot
|
|
417
|
+
# Team members can validate specs consistently
|
|
418
|
+
specpilot validate --verbose
|
|
407
419
|
```
|
|
408
420
|
|
|
409
421
|
### Enterprise Integration
|
|
410
422
|
|
|
411
|
-
|
|
412
|
-
# Use corporate templates
|
|
413
|
-
specforge --template-repo https://internal.company.com/templates
|
|
414
|
-
|
|
415
|
-
# Apply company policies
|
|
416
|
-
specforge --apply-policies company-standards
|
|
417
|
-
|
|
418
|
-
# Generate compliance reports
|
|
419
|
-
specforge --compliance-report --output report.json
|
|
420
|
-
```
|
|
423
|
+
Your organization can wrap SpecPilot with internal tooling and templates. For now, use `specpilot list` to explore built-ins.
|
|
421
424
|
|
|
422
425
|
### API Usage
|
|
423
426
|
|
|
427
|
+
> **Coming Soon**: Programmatic API support is planned for future releases. Currently, SpecPilot is designed as a CLI-first tool.
|
|
428
|
+
|
|
429
|
+
**Planned programmatic usage:**
|
|
424
430
|
```javascript
|
|
425
|
-
//
|
|
431
|
+
// Future API (not yet available)
|
|
426
432
|
const { initProject, validateSpecs } = require("specpilot");
|
|
427
433
|
|
|
428
|
-
// Initialize project
|
|
429
434
|
await initProject({
|
|
430
435
|
name: "my-project",
|
|
431
436
|
language: "typescript",
|
|
432
|
-
framework: "react"
|
|
433
|
-
specDir: ".specs",
|
|
437
|
+
framework: "react"
|
|
434
438
|
});
|
|
439
|
+
```
|
|
435
440
|
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
+
For now, use the CLI commands or shell integration:
|
|
442
|
+
```bash
|
|
443
|
+
# Use in shell scripts
|
|
444
|
+
specpilot init my-project --lang typescript --no-prompts
|
|
445
|
+
specpilot validate --fix
|
|
441
446
|
```
|
|
442
447
|
|
|
443
448
|
## Contributing
|
|
444
449
|
|
|
445
|
-
This project follows specification-driven development.
|
|
450
|
+
This project follows specification-driven development principles. Please review our [`.specs/`](.specs/) folder for detailed contribution guidelines, architecture decisions, and development context.
|
|
451
|
+
|
|
452
|
+
### Quick Contribution Guide
|
|
453
|
+
|
|
454
|
+
1. **Read the specs**: Review [`.specs/project/requirements.md`](.specs/project/requirements.md) and [`.specs/architecture/architecture.md`](.specs/architecture/architecture.md)
|
|
455
|
+
2. **Check current tasks**: See [`.specs/planning/tasks.md`](.specs/planning/tasks.md) for open issues
|
|
456
|
+
3. **Follow conventions**: Use the metadata format documented in [`.specs/development/docs.md`](.specs/development/docs.md)
|
|
457
|
+
4. **Update specs**: Modify relevant spec files when making changes
|
|
458
|
+
5. **Validate**: Run `specpilot validate` before committing
|
|
446
459
|
|
|
447
460
|
### Development Setup
|
|
448
461
|
|
|
449
462
|
```bash
|
|
450
463
|
# Clone and setup
|
|
451
|
-
git clone https://github.com/
|
|
452
|
-
cd
|
|
464
|
+
git clone https://github.com/girishr/SpecPilot.git
|
|
465
|
+
cd SpecPilot
|
|
453
466
|
npm install
|
|
454
467
|
|
|
455
468
|
# Run in development mode
|
|
456
|
-
npm run dev
|
|
469
|
+
npm run dev -- init test-project --lang typescript
|
|
457
470
|
|
|
458
471
|
# Run tests
|
|
459
472
|
npm test
|
|
460
473
|
|
|
474
|
+
# Run tests with coverage
|
|
475
|
+
npm run test:coverage
|
|
476
|
+
|
|
461
477
|
# Build for production
|
|
462
478
|
npm run build
|
|
479
|
+
|
|
480
|
+
# Test CLI locally
|
|
481
|
+
node cli.js init my-test --lang python
|
|
463
482
|
```
|
|
464
483
|
|
|
465
484
|
## License
|
|
@@ -469,3 +488,4 @@ MIT License - see LICENSE file for details.
|
|
|
469
488
|
---
|
|
470
489
|
|
|
471
490
|
_Built with specification-driven development principles for serious production projects._
|
|
491
|
+
````
|
package/dist/cli.js
CHANGED
|
@@ -17,8 +17,8 @@ commander_1.program
|
|
|
17
17
|
.command('init')
|
|
18
18
|
.alias('i')
|
|
19
19
|
.description('Initialize a new SDD project')
|
|
20
|
-
.argument('
|
|
21
|
-
.option('-l, --lang <language>', 'Programming language (typescript, python
|
|
20
|
+
.argument('<name>', 'Project name (required)')
|
|
21
|
+
.option('-l, --lang <language>', 'Programming language (typescript, python)', 'typescript')
|
|
22
22
|
.option('-f, --framework <framework>', 'Framework (react, express, django, spring, etc.)')
|
|
23
23
|
.option('-d, --dir <directory>', 'Target directory', '.')
|
|
24
24
|
.option('--specs-name <name>', 'Name for specs folder', '.specs')
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;AAEA,yCAAoC;AACpC,0CAA8C;AAC9C,kDAAsD;AACtD,gDAAoD;AACpD,0CAA8C;AAC9C,gDAAoD;AAEpD,MAAM,WAAW,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;AAE/C,mBAAO;KACJ,IAAI,CAAC,WAAW,CAAC;KACjB,WAAW,CAAC,qEAAqE,CAAC;KAClF,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;AAEhC,qBAAqB;AACrB,mBAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,KAAK,CAAC,GAAG,CAAC;KACV,WAAW,CAAC,8BAA8B,CAAC;KAC3C,QAAQ,CAAC,QAAQ,EAAE,
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;AAEA,yCAAoC;AACpC,0CAA8C;AAC9C,kDAAsD;AACtD,gDAAoD;AACpD,0CAA8C;AAC9C,gDAAoD;AAEpD,MAAM,WAAW,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;AAE/C,mBAAO;KACJ,IAAI,CAAC,WAAW,CAAC;KACjB,WAAW,CAAC,qEAAqE,CAAC;KAClF,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;AAEhC,qBAAqB;AACrB,mBAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,KAAK,CAAC,GAAG,CAAC;KACV,WAAW,CAAC,8BAA8B,CAAC;KAC3C,QAAQ,CAAC,QAAQ,EAAE,yBAAyB,CAAC;KAC7C,MAAM,CAAC,uBAAuB,EAAE,2CAA2C,EAAE,YAAY,CAAC;KAC1F,MAAM,CAAC,6BAA6B,EAAE,kDAAkD,CAAC;KACzF,MAAM,CAAC,uBAAuB,EAAE,kBAAkB,EAAE,GAAG,CAAC;KACxD,MAAM,CAAC,qBAAqB,EAAE,uBAAuB,EAAE,QAAQ,CAAC;KAChE,MAAM,CAAC,cAAc,EAAE,0BAA0B,CAAC;KAClD,MAAM,CAAC,kBAAW,CAAC,CAAC;AAEvB,mBAAmB;AACnB,mBAAO;KACJ,OAAO,CAAC,UAAU,CAAC;KACnB,KAAK,CAAC,GAAG,CAAC;KACV,WAAW,CAAC,iCAAiC,CAAC;KAC9C,MAAM,CAAC,uBAAuB,EAAE,mBAAmB,EAAE,GAAG,CAAC;KACzD,MAAM,CAAC,OAAO,EAAE,wBAAwB,CAAC;KACzC,MAAM,CAAC,WAAW,EAAE,kCAAkC,CAAC;KACvD,MAAM,CAAC,0BAAe,CAAC,CAAC;AAE3B,kBAAkB;AAClB,mBAAO;KACJ,OAAO,CAAC,SAAS,CAAC;KAClB,KAAK,CAAC,GAAG,CAAC;KACV,WAAW,CAAC,oCAAoC,CAAC;KACjD,MAAM,CAAC,uBAAuB,EAAE,mBAAmB,EAAE,GAAG,CAAC;KACzD,MAAM,CAAC,oBAAoB,EAAE,0CAA0C,EAAE,SAAS,CAAC;KACnF,MAAM,CAAC,kBAAkB,EAAE,2BAA2B,EAAE,QAAQ,CAAC;KACjE,MAAM,CAAC,UAAU,EAAE,gCAAgC,CAAC;KACpD,MAAM,CAAC,wBAAc,CAAC,CAAC;AAE1B,yBAAyB;AACzB,mBAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,KAAK,CAAC,IAAI,CAAC;KACX,WAAW,CAAC,0BAA0B,CAAC;KACvC,MAAM,CAAC,mBAAmB,EAAE,oBAAoB,CAAC;KACjD,MAAM,CAAC,WAAW,EAAE,uBAAuB,CAAC;KAC5C,MAAM,CAAC,kBAAW,CAAC,CAAC;AAEvB,kBAAkB;AAClB,mBAAO;KACJ,OAAO,CAAC,SAAS,CAAC;KAClB,KAAK,CAAC,MAAM,CAAC;KACb,WAAW,CAAC,gEAAgE,CAAC;KAC7E,QAAQ,CAAC,eAAe,EAAE,+CAA+C,CAAC;KAC1E,MAAM,CAAC,uBAAuB,EAAE,mBAAmB,EAAE,GAAG,CAAC;KACzD,MAAM,CAAC,qBAAqB,EAAE,uBAAuB,EAAE,QAAQ,CAAC;KAChE,MAAM,CAAC,cAAc,EAAE,0BAA0B,CAAC;KAClD,MAAM,CAAC,cAAc,EAAE,uCAAuC,CAAC;KAC/D,MAAM,CAAC,wBAAc,CAAC,CAAC;AAE1B,+BAA+B;AAC/B,mBAAO,CAAC,KAAK,EAAE,CAAC"}
|
package/dist/commands/init.d.ts
CHANGED
|
@@ -5,5 +5,5 @@ export interface InitOptions {
|
|
|
5
5
|
specsName: string;
|
|
6
6
|
prompts: boolean;
|
|
7
7
|
}
|
|
8
|
-
export declare function initCommand(name: string
|
|
8
|
+
export declare function initCommand(name: string, options: InitOptions): Promise<void>;
|
|
9
9
|
//# sourceMappingURL=init.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,iBA+EnE"}
|
package/dist/commands/init.js
CHANGED
|
@@ -15,7 +15,26 @@ async function initCommand(name, options) {
|
|
|
15
15
|
const logger = new logger_1.Logger();
|
|
16
16
|
try {
|
|
17
17
|
logger.info('š Initializing SDD project...');
|
|
18
|
-
|
|
18
|
+
// Validate project name
|
|
19
|
+
if (!name || name.trim() === '') {
|
|
20
|
+
logger.error('ā Project name is required and cannot be empty');
|
|
21
|
+
logger.info('š” Usage: specpilot init <project-name>');
|
|
22
|
+
process.exit(1);
|
|
23
|
+
}
|
|
24
|
+
const projectName = name.trim();
|
|
25
|
+
// Validate project name doesn't contain invalid characters
|
|
26
|
+
if (/[<>:"/\\|?*]/.test(projectName)) {
|
|
27
|
+
logger.error('ā Project name contains invalid characters: < > : " / \\ | ? *');
|
|
28
|
+
logger.info('š” Please use only letters, numbers, hyphens, and underscores');
|
|
29
|
+
process.exit(1);
|
|
30
|
+
}
|
|
31
|
+
// Validate supported language
|
|
32
|
+
const supportedLanguages = ['typescript', 'python'];
|
|
33
|
+
if (!supportedLanguages.includes(options.lang)) {
|
|
34
|
+
logger.error(`ā Language "${options.lang}" is not supported`);
|
|
35
|
+
logger.info(`š” Supported languages: ${supportedLanguages.join(', ')}`);
|
|
36
|
+
process.exit(1);
|
|
37
|
+
}
|
|
19
38
|
// Get framework if not provided and prompts enabled
|
|
20
39
|
let framework = options.framework;
|
|
21
40
|
if (!framework && options.prompts) {
|
|
@@ -64,8 +83,7 @@ async function initCommand(name, options) {
|
|
|
64
83
|
function getFrameworksForLanguage(language) {
|
|
65
84
|
const frameworks = {
|
|
66
85
|
typescript: ['react', 'express', 'next', 'nest', 'vue', 'angular'],
|
|
67
|
-
python: ['fastapi', 'django', 'flask', 'streamlit']
|
|
68
|
-
java: ['spring-boot', 'spring-mvc', 'android']
|
|
86
|
+
python: ['fastapi', 'django', 'flask', 'streamlit']
|
|
69
87
|
};
|
|
70
88
|
return frameworks[language] || [];
|
|
71
89
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":";;;;;AAiBA,
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,
|
|
1
|
+
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,iBA6CrD"}
|
package/dist/commands/list.js
CHANGED
|
@@ -41,9 +41,6 @@ async function listCommand(options) {
|
|
|
41
41
|
}
|
|
42
42
|
});
|
|
43
43
|
});
|
|
44
|
-
console.log(chalk_1.default.cyan('\nš Usage:'));
|
|
45
|
-
console.log(' specpilot <project-name> --lang <language> --framework <framework>');
|
|
46
|
-
console.log(' specpilot my-app --lang typescript --framework react');
|
|
47
44
|
}
|
|
48
45
|
catch (error) {
|
|
49
46
|
logger.error(`ā Failed to list templates: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":";;;;;AAUA,
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":";;;;;AAUA,kCA6CC;AAtDD,kDAA0B;AAC1B,gEAA6D;AAC7D,4CAAyC;AAOlC,KAAK,UAAU,WAAW,CAAC,OAAoB;IACpD,MAAM,MAAM,GAAG,IAAI,eAAM,EAAE,CAAC;IAE5B,IAAI,CAAC;QACH,MAAM,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;QAEvC,MAAM,QAAQ,GAAG,IAAI,mCAAgB,EAAE,CAAC;QACxC,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAE5D,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,MAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;YACtC,OAAO;QACT,CAAC;QAED,8BAA8B;QAC9B,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,QAAQ,EAAE,EAAE;YACjD,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC5B,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;YAC9B,CAAC;YACD,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACtC,OAAO,GAAG,CAAC;QACb,CAAC,EAAE,EAAsC,CAAC,CAAC;QAE3C,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE,aAAa,CAAC,EAAE,EAAE;YAC5D,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,QAAQ,QAAQ,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC;YAE1D,aAAa,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAC/B,MAAM,IAAI,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;oBAC/B,GAAG,QAAQ,CAAC,IAAI,KAAK,QAAQ,CAAC,SAAS,GAAG,CAAC,CAAC;oBAC5C,QAAQ,CAAC,IAAI,CAAC;gBAEhB,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;oBACpB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC;oBACxC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,oBAAoB,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;oBACpE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,cAAc,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;gBACrE,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,OAAO,IAAI,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;gBACpE,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IAEL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,+BAA+B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC;QACxG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
|