specpilot 1.3.0 ā 1.6.1
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 +96 -27
- package/dist/cli.js +23 -7
- package/dist/cli.js.map +1 -1
- package/dist/commands/add-specs.d.ts.map +1 -1
- package/dist/commands/add-specs.js +4 -9
- package/dist/commands/add-specs.js.map +1 -1
- package/dist/commands/archive.d.ts +5 -0
- package/dist/commands/archive.d.ts.map +1 -0
- package/dist/commands/archive.js +52 -0
- package/dist/commands/archive.js.map +1 -0
- package/dist/commands/init.d.ts +1 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +131 -14
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/list.d.ts.map +1 -1
- package/dist/commands/list.js +23 -3
- package/dist/commands/list.js.map +1 -1
- package/dist/commands/migrate.d.ts.map +1 -1
- package/dist/commands/migrate.js.map +1 -1
- package/dist/commands/refine.d.ts +8 -0
- package/dist/commands/refine.d.ts.map +1 -0
- package/dist/commands/refine.js +286 -0
- package/dist/commands/refine.js.map +1 -0
- package/dist/commands/specify.d.ts.map +1 -1
- package/dist/commands/specify.js +98 -15
- package/dist/commands/specify.js.map +1 -1
- package/dist/commands/validate.d.ts.map +1 -1
- package/dist/commands/validate.js.map +1 -1
- package/dist/utils/agentConfigGenerator.d.ts +15 -0
- package/dist/utils/agentConfigGenerator.d.ts.map +1 -0
- package/dist/utils/agentConfigGenerator.js +234 -0
- package/dist/utils/agentConfigGenerator.js.map +1 -0
- package/dist/utils/codeAnalyzer.js +10 -10
- package/dist/utils/codeAnalyzer.js.map +1 -1
- package/dist/utils/frameworks.d.ts +2 -0
- package/dist/utils/frameworks.d.ts.map +1 -0
- package/dist/utils/frameworks.js +11 -0
- package/dist/utils/frameworks.js.map +1 -0
- package/dist/utils/ideConfigGenerator.d.ts +20 -0
- package/dist/utils/ideConfigGenerator.d.ts.map +1 -0
- package/dist/utils/ideConfigGenerator.js +176 -0
- package/dist/utils/ideConfigGenerator.js.map +1 -0
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +27 -18
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/projectDetector.d.ts.map +1 -1
- package/dist/utils/projectDetector.js.map +1 -1
- package/dist/utils/projectMigrator.d.ts.map +1 -1
- package/dist/utils/projectMigrator.js +36 -33
- package/dist/utils/projectMigrator.js.map +1 -1
- package/dist/utils/specArchiver.d.ts +20 -0
- package/dist/utils/specArchiver.d.ts.map +1 -0
- package/dist/utils/specArchiver.js +124 -0
- package/dist/utils/specArchiver.js.map +1 -0
- package/dist/utils/specFileGenerator.d.ts +27 -0
- package/dist/utils/specFileGenerator.d.ts.map +1 -0
- package/dist/utils/specFileGenerator.js +805 -0
- package/dist/utils/specFileGenerator.js.map +1 -0
- package/dist/utils/specGenerator.d.ts +11 -14
- package/dist/utils/specGenerator.d.ts.map +1 -1
- package/dist/utils/specGenerator.js +25 -431
- package/dist/utils/specGenerator.js.map +1 -1
- package/dist/utils/specTreePrinter.d.ts +8 -0
- package/dist/utils/specTreePrinter.d.ts.map +1 -0
- package/dist/utils/specTreePrinter.js +38 -0
- package/dist/utils/specTreePrinter.js.map +1 -0
- package/dist/utils/specValidator.d.ts +3 -0
- package/dist/utils/specValidator.d.ts.map +1 -1
- package/dist/utils/specValidator.js +85 -10
- package/dist/utils/specValidator.js.map +1 -1
- package/dist/utils/templateEngine.d.ts +9 -3
- package/dist/utils/templateEngine.d.ts.map +1 -1
- package/dist/utils/templateEngine.js +44 -36
- package/dist/utils/templateEngine.js.map +1 -1
- package/package.json +10 -6
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# SpecPilot
|
|
2
2
|
|
|
3
|
-
[](https://www.npmjs.com/package/specpilot)
|
|
4
4
|
[](https://opensource.org/licenses/MIT)
|
|
5
5
|
|
|
6
6
|
A CLI tool for initializing specification-driven development projects with flexible, production-ready structures.
|
|
@@ -35,14 +35,20 @@ This AI-assisted approach ensures comprehensive, high-quality specifications tai
|
|
|
35
35
|
|
|
36
36
|
## Commands
|
|
37
37
|
|
|
38
|
-
| Command
|
|
39
|
-
|
|
|
40
|
-
| `init <name>`
|
|
41
|
-
| `
|
|
42
|
-
| `
|
|
43
|
-
| `
|
|
44
|
-
| `
|
|
45
|
-
| `
|
|
38
|
+
| Command | Description |
|
|
39
|
+
| ----------------------- | --------------------------------------------------- |
|
|
40
|
+
| `init <name>` | Initialize new SDD project |
|
|
41
|
+
| `init <name> --dry-run` | Preview files that would be created without writing |
|
|
42
|
+
| `add-specs` | Add specs to existing project |
|
|
43
|
+
| `validate` | Validate specification files |
|
|
44
|
+
| `archive` | Archive oversized `prompts.md` / `tasks.md` entries |
|
|
45
|
+
| `list` | Show available templates |
|
|
46
|
+
| `migrate` | Migrate between spec versions |
|
|
47
|
+
| `refine [desc]` | Refine project specifications |
|
|
48
|
+
|
|
49
|
+
> **Tip ā command aliases:** All commands have a short alias you can use instead of the full name.
|
|
50
|
+
> `init` ā `i` Ā· `validate` ā `v` Ā· `migrate` ā `m` Ā· `list` ā `ls` Ā· `refine` ā `ref` Ā· `archive` ā `ar` Ā· `add-specs` ā `add`
|
|
51
|
+
> Example: `specpilot i my-app` is identical to `specpilot init my-app`.
|
|
46
52
|
|
|
47
53
|
### Examples
|
|
48
54
|
|
|
@@ -50,8 +56,11 @@ This AI-assisted approach ensures comprehensive, high-quality specifications tai
|
|
|
50
56
|
# Initialize with specific language/framework
|
|
51
57
|
specpilot init api --lang python --framework fastapi
|
|
52
58
|
|
|
53
|
-
#
|
|
54
|
-
specpilot
|
|
59
|
+
# Preview files that would be created without writing anything
|
|
60
|
+
specpilot init api --dry-run
|
|
61
|
+
|
|
62
|
+
# Refine specifications
|
|
63
|
+
specpilot refine "REST API for user management" --update
|
|
55
64
|
|
|
56
65
|
# Validate with auto-fix
|
|
57
66
|
specpilot validate --fix
|
|
@@ -64,20 +73,23 @@ specpilot validate --fix
|
|
|
64
73
|
- **React**: SPA applications
|
|
65
74
|
- **Express**: REST APIs
|
|
66
75
|
- **Next.js**: Full-stack apps
|
|
67
|
-
- **
|
|
76
|
+
- **Nest.js**: Scalable server-side apps
|
|
77
|
+
- **Vue**: Progressive UI framework
|
|
78
|
+
- **Angular**: Enterprise SPA framework
|
|
68
79
|
|
|
69
80
|
### JavaScript
|
|
70
81
|
|
|
71
82
|
- **React**: SPA applications
|
|
72
83
|
- **Express**: REST APIs
|
|
73
|
-
|
|
74
|
-
|
|
84
|
+
|
|
85
|
+
> Note: no framework prompt is shown for JavaScript ā pass `--framework` explicitly if needed.
|
|
75
86
|
|
|
76
87
|
### Python
|
|
77
88
|
|
|
78
89
|
- **FastAPI**: Modern REST APIs
|
|
79
90
|
- **Django**: Full-stack applications
|
|
80
|
-
- **
|
|
91
|
+
- **Flask**: Lightweight REST APIs
|
|
92
|
+
- **Streamlit**: Data Science / ML apps
|
|
81
93
|
|
|
82
94
|
## Project Structure
|
|
83
95
|
|
|
@@ -85,25 +97,82 @@ SpecPilot generates a `.specs/` folder with organized subdirectories:
|
|
|
85
97
|
|
|
86
98
|
```
|
|
87
99
|
.specs/
|
|
88
|
-
āāā
|
|
89
|
-
āāā
|
|
90
|
-
|
|
91
|
-
āāā
|
|
92
|
-
|
|
100
|
+
āāā architecture/
|
|
101
|
+
ā āāā api.yaml # CLI / REST API / GraphQL interface spec
|
|
102
|
+
ā āāā architecture.md # System design decisions and patterns
|
|
103
|
+
āāā development/
|
|
104
|
+
ā āāā context.md # Development memory, decisions, learnings
|
|
105
|
+
ā āāā docs.md # Dev guidelines, spec conventions, checklist
|
|
106
|
+
ā āāā prompts.md # AI interaction log ā MANDATED, update every session
|
|
107
|
+
āāā planning/
|
|
108
|
+
ā āāā roadmap.md # Release milestones and objectives
|
|
109
|
+
ā āāā tasks.md # Sprint tracker (backlog / current / completed)
|
|
110
|
+
āāā project/
|
|
111
|
+
ā āāā project.yaml # Project config, rules, and AI context (MANDATED)
|
|
112
|
+
ā āāā requirements.md # Functional & non-functional requirements
|
|
113
|
+
āāā quality/
|
|
114
|
+
āāā tests.md # Test strategy, coverage targets, acceptance criteria
|
|
93
115
|
```
|
|
94
116
|
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
- **`project.yaml`**: Project configuration and rules
|
|
98
|
-
- **`requirements.md`**: Functional/non-functional requirements
|
|
99
|
-
- **`architecture.md`**: System architecture decisions
|
|
100
|
-
- **`prompts.md`**: AI interaction tracking (MANDATED)
|
|
101
|
-
- **`tasks.md`**: Task management (backlog/sprint/completed)
|
|
117
|
+
> Also generated at project root: `.github/copilot-instructions.md` (AI mandate enforcement)
|
|
102
118
|
|
|
103
119
|
## Configuration
|
|
104
120
|
|
|
105
121
|
SpecPilot requires no global configuration. Each project is self-contained with settings in `project.yaml`.
|
|
106
122
|
|
|
123
|
+
### IDE & Agent Support
|
|
124
|
+
|
|
125
|
+
SpecPilot generates AI agent configuration files during project initialization. When you run `specpilot init`, you'll be prompted to select your AI IDE/Agent:
|
|
126
|
+
|
|
127
|
+
**Desktop IDEs (Workspace Settings):**
|
|
128
|
+
|
|
129
|
+
- **VSCode** - Industry standard with Copilot integration
|
|
130
|
+
- **Cursor** - AI-first code editor with enhanced AI context
|
|
131
|
+
- **Windsurf** - Advanced AI coding assistant
|
|
132
|
+
- **Kiro** - Specialized AI development environment
|
|
133
|
+
- **Antigravity** - AI-powered IDE with context awareness
|
|
134
|
+
|
|
135
|
+
**Cloud-Based AI Agents (Instruction Files):**
|
|
136
|
+
|
|
137
|
+
- **Cowork** - Anthropic Claude agent with Skills framework
|
|
138
|
+
- **Codex** - OpenAI Codex agent with instruction context
|
|
139
|
+
|
|
140
|
+
**Generated Configuration Files:**
|
|
141
|
+
|
|
142
|
+
For **all** IDE/Agent selections: `.github/copilot-instructions.md`
|
|
143
|
+
|
|
144
|
+
- Critical mandates injected into every AI request automatically
|
|
145
|
+
- Read on every interaction by GitHub Copilot, Cursor, and most AI tools
|
|
146
|
+
- Contains project name/stack, 5 critical mandates, and a Re-Anchor Prompt reference
|
|
147
|
+
|
|
148
|
+
For desktop IDEs: `.vscode/settings.json` (or `.cursor/`, `.windsurf/`, etc.)
|
|
149
|
+
|
|
150
|
+
- IDE-specific workspace folder setup for code + .specs
|
|
151
|
+
- Extensions recommendations for development
|
|
152
|
+
- AI context configuration for better spec integration
|
|
153
|
+
|
|
154
|
+
For cloud agents:
|
|
155
|
+
|
|
156
|
+
- **Cowork**: `.claude/skills/specpilot-project/SKILL.md` with project context and development guidelines
|
|
157
|
+
- **Codex**: `CODEX_INSTRUCTIONS.md` at project root with architecture overview and mandates
|
|
158
|
+
|
|
159
|
+
The generated settings/instructions automatically configure your AI agent to:
|
|
160
|
+
|
|
161
|
+
- Include `.specs/` folder in AI context
|
|
162
|
+
- Understand project structure and requirements
|
|
163
|
+
- Follow specification-driven development principles
|
|
164
|
+
- Access development guidelines and onboarding prompts
|
|
165
|
+
|
|
166
|
+
**Example:**
|
|
167
|
+
|
|
168
|
+
```bash
|
|
169
|
+
# During init, you'll be prompted to select your IDE/Agent
|
|
170
|
+
specpilot init my-project --lang typescript --framework react
|
|
171
|
+
# Respond with your preferred IDE/Agent:
|
|
172
|
+
# - vscode, cursor, windsurf, kiro, antigravity (desktop)
|
|
173
|
+
# - cowork, codex (cloud agents)
|
|
174
|
+
```
|
|
175
|
+
|
|
107
176
|
## Troubleshooting
|
|
108
177
|
|
|
109
178
|
### Common Issues
|
package/dist/cli.js
CHANGED
|
@@ -10,8 +10,9 @@ const init_1 = require("./commands/init");
|
|
|
10
10
|
const validate_1 = require("./commands/validate");
|
|
11
11
|
const migrate_1 = require("./commands/migrate");
|
|
12
12
|
const list_1 = require("./commands/list");
|
|
13
|
-
const
|
|
13
|
+
const refine_1 = require("./commands/refine");
|
|
14
14
|
const add_specs_1 = require("./commands/add-specs");
|
|
15
|
+
const archive_1 = require("./commands/archive");
|
|
15
16
|
const logger_1 = require("./utils/logger");
|
|
16
17
|
const packageJson = require('../package.json');
|
|
17
18
|
commander_1.program
|
|
@@ -29,6 +30,7 @@ commander_1.program
|
|
|
29
30
|
.option('-d, --dir <directory>', 'Target directory', '.')
|
|
30
31
|
.option('--specs-name <name>', 'Name for specs folder', '.specs')
|
|
31
32
|
.option('--no-prompts', 'Skip interactive prompts')
|
|
33
|
+
.option('--dry-run', 'List files that would be created without writing them')
|
|
32
34
|
.action(init_1.initCommand);
|
|
33
35
|
// Validate command
|
|
34
36
|
commander_1.program
|
|
@@ -57,17 +59,24 @@ commander_1.program
|
|
|
57
59
|
.option('--lang <language>', 'Filter by language')
|
|
58
60
|
.option('--verbose', 'Show template details')
|
|
59
61
|
.action(list_1.listCommand);
|
|
60
|
-
//
|
|
62
|
+
// Refine command
|
|
61
63
|
commander_1.program
|
|
62
|
-
.command('
|
|
63
|
-
.alias('
|
|
64
|
-
.description('
|
|
65
|
-
.argument('[description]', 'Natural language description of
|
|
64
|
+
.command('refine')
|
|
65
|
+
.alias('ref')
|
|
66
|
+
.description('Refine project specifications from natural language description')
|
|
67
|
+
.argument('[description]', 'Natural language description of changes to apply')
|
|
66
68
|
.option('-d, --dir <directory>', 'Project directory', '.')
|
|
67
69
|
.option('--specs-name <name>', 'Name for specs folder', '.specs')
|
|
68
70
|
.option('--no-prompts', 'Skip interactive prompts')
|
|
69
71
|
.option('-u, --update', 'Regenerate specs with new description')
|
|
70
|
-
.action(
|
|
72
|
+
.action(refine_1.refineCommand);
|
|
73
|
+
// Archive command
|
|
74
|
+
commander_1.program
|
|
75
|
+
.command('archive')
|
|
76
|
+
.alias('ar')
|
|
77
|
+
.description('Archive oversized .specs/ files (prompts.md > 300 lines, tasks.md Completed > 150 lines)')
|
|
78
|
+
.option('--dry-run', 'Preview what would be archived without writing any files')
|
|
79
|
+
.action(archive_1.archiveCommand);
|
|
71
80
|
// Add-specs command
|
|
72
81
|
commander_1.program
|
|
73
82
|
.command('add-specs')
|
|
@@ -79,6 +88,13 @@ commander_1.program
|
|
|
79
88
|
.option('--deep-analysis', 'Perform thorough codebase analysis')
|
|
80
89
|
.option('--no-prompts', 'Skip interactive prompts')
|
|
81
90
|
.action(add_specs_1.addSpecsCommand);
|
|
91
|
+
commander_1.program.addHelpText('after', `
|
|
92
|
+
Aliases:
|
|
93
|
+
init ā i validate ā v migrate ā m list ā ls
|
|
94
|
+
refine ā ref archive ā ar add-specs ā add
|
|
95
|
+
|
|
96
|
+
Per-command options: specpilot <command> --help
|
|
97
|
+
`);
|
|
82
98
|
// Parse command line arguments
|
|
83
99
|
const args = process.argv.slice(2);
|
|
84
100
|
// If no arguments provided, show welcome message
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;;;;AAEA,yCAAoC;AACpC,kDAA0B;AAC1B,0CAA8C;AAC9C,kDAAsD;AACtD,gDAAoD;AACpD,0CAA8C;AAC9C,
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add-specs.d.ts","sourceRoot":"","sources":["../../src/commands/add-specs.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,YAAY,EAAE,OAAO,CAAC;IACtB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,wBAAsB,eAAe,CAAC,OAAO,EAAE,eAAe,
|
|
1
|
+
{"version":3,"file":"add-specs.d.ts","sourceRoot":"","sources":["../../src/commands/add-specs.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,YAAY,EAAE,OAAO,CAAC;IACtB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,wBAAsB,eAAe,CAAC,OAAO,EAAE,eAAe,iBAwH7D"}
|
|
@@ -9,6 +9,7 @@ const fs_1 = require("fs");
|
|
|
9
9
|
const chalk_1 = __importDefault(require("chalk"));
|
|
10
10
|
const inquirer_1 = __importDefault(require("inquirer"));
|
|
11
11
|
const projectDetector_1 = require("../utils/projectDetector");
|
|
12
|
+
const frameworks_1 = require("../utils/frameworks");
|
|
12
13
|
const codeAnalyzer_1 = require("../utils/codeAnalyzer");
|
|
13
14
|
const templateEngine_1 = require("../utils/templateEngine");
|
|
14
15
|
const specGenerator_1 = require("../utils/specGenerator");
|
|
@@ -45,7 +46,7 @@ async function addSpecsCommand(options) {
|
|
|
45
46
|
}
|
|
46
47
|
// Prompt for missing information
|
|
47
48
|
if (!framework && options.prompts) {
|
|
48
|
-
const frameworks = getFrameworksForLanguage(language);
|
|
49
|
+
const frameworks = (0, frameworks_1.getFrameworksForLanguage)(language);
|
|
49
50
|
if (frameworks.length > 0) {
|
|
50
51
|
const response = await inquirer_1.default.prompt([{
|
|
51
52
|
type: 'list',
|
|
@@ -102,7 +103,8 @@ async function addSpecsCommand(options) {
|
|
|
102
103
|
specsName: '.specs',
|
|
103
104
|
author: developerName,
|
|
104
105
|
description,
|
|
105
|
-
analysis: (!options.noAnalysis && analysis) ? analysis : undefined
|
|
106
|
+
analysis: (!options.noAnalysis && analysis) ? analysis : undefined,
|
|
107
|
+
mode: 'existing',
|
|
106
108
|
});
|
|
107
109
|
logger.success('ā
.specs folder created successfully!');
|
|
108
110
|
logger.info(`š Location: ${specsDir}`);
|
|
@@ -114,11 +116,4 @@ async function addSpecsCommand(options) {
|
|
|
114
116
|
process.exit(1);
|
|
115
117
|
}
|
|
116
118
|
}
|
|
117
|
-
function getFrameworksForLanguage(language) {
|
|
118
|
-
const frameworks = {
|
|
119
|
-
typescript: ['react', 'express', 'next', 'nest', 'vue', 'angular'],
|
|
120
|
-
python: ['fastapi', 'django', 'flask', 'streamlit']
|
|
121
|
-
};
|
|
122
|
-
return frameworks[language] || [];
|
|
123
|
-
}
|
|
124
119
|
//# sourceMappingURL=add-specs.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add-specs.js","sourceRoot":"","sources":["../../src/commands/add-specs.ts"],"names":[],"mappings":";;;;;AAmBA,
|
|
1
|
+
{"version":3,"file":"add-specs.js","sourceRoot":"","sources":["../../src/commands/add-specs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"archive.d.ts","sourceRoot":"","sources":["../../src/commands/archive.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,wBAAsB,cAAc,CAAC,OAAO,EAAE,cAAc,iBA2C3D"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.archiveCommand = archiveCommand;
|
|
7
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
8
|
+
const specArchiver_1 = require("../utils/specArchiver");
|
|
9
|
+
const logger_1 = require("../utils/logger");
|
|
10
|
+
async function archiveCommand(options) {
|
|
11
|
+
const logger = new logger_1.Logger();
|
|
12
|
+
const projectDir = process.cwd();
|
|
13
|
+
try {
|
|
14
|
+
if (options.dryRun) {
|
|
15
|
+
logger.info('š Dry run ā previewing archive operations (no files will be changed)...');
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
logger.info('š¦ Archiving oversized .specs/ files...');
|
|
19
|
+
}
|
|
20
|
+
const archiver = new specArchiver_1.SpecArchiver();
|
|
21
|
+
const result = await archiver.archive(projectDir, { dryRun: options.dryRun });
|
|
22
|
+
if (result.entries.length === 0) {
|
|
23
|
+
logger.success('ā
All .specs/ files are within limits. Nothing to archive.');
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
console.log('');
|
|
27
|
+
if (options.dryRun) {
|
|
28
|
+
console.log(chalk_1.default.yellow('š Archive preview (--dry-run):'));
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
console.log(chalk_1.default.green('š Archive report:'));
|
|
32
|
+
}
|
|
33
|
+
console.log('');
|
|
34
|
+
for (const entry of result.entries) {
|
|
35
|
+
const verb = options.dryRun ? 'Would move' : 'Moved';
|
|
36
|
+
console.log(` ${chalk_1.default.cyan(entry.file)}`);
|
|
37
|
+
console.log(` ${verb} ${chalk_1.default.yellow(String(entry.linesMoved))} lines ā ${chalk_1.default.cyan(entry.archiveFile)}`);
|
|
38
|
+
console.log('');
|
|
39
|
+
}
|
|
40
|
+
if (!options.dryRun) {
|
|
41
|
+
logger.success(`ā
Archived ${result.entries.length} file(s). Run \`specpilot validate\` to confirm.`);
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
logger.info('š” Run without --dry-run to apply these changes.');
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
logger.displayError('Archive Failed', error instanceof Error ? error.message : 'Unknown error');
|
|
49
|
+
process.exit(1);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=archive.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"archive.js","sourceRoot":"","sources":["../../src/commands/archive.ts"],"names":[],"mappings":";;;;;AAQA,wCA2CC;AAnDD,kDAA0B;AAC1B,wDAAqD;AACrD,4CAAyC;AAMlC,KAAK,UAAU,cAAc,CAAC,OAAuB;IAC1D,MAAM,MAAM,GAAG,IAAI,eAAM,EAAE,CAAC;IAC5B,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAEjC,IAAI,CAAC;QACH,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,MAAM,CAAC,IAAI,CAAC,0EAA0E,CAAC,CAAC;QAC1F,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;QACzD,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,2BAAY,EAAE,CAAC;QACpC,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QAE9E,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAChC,MAAM,CAAC,OAAO,CAAC,4DAA4D,CAAC,CAAC;YAC7E,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,iCAAiC,CAAC,CAAC,CAAC;QAC/D,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC,CAAC;QACjD,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAEhB,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnC,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC;YACrD,OAAO,CAAC,GAAG,CAAC,KAAK,eAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC3C,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,IAAI,eAAK,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,YAAY,eAAK,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;YAC9G,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClB,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YACpB,MAAM,CAAC,OAAO,CAAC,cAAc,MAAM,CAAC,OAAO,CAAC,MAAM,kDAAkD,CAAC,CAAC;QACxG,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC;QAClE,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,YAAY,CAAC,gBAAgB,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;QAChG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
|
package/dist/commands/init.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAUA,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,
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAUA,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;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,iBAmRnE"}
|
package/dist/commands/init.js
CHANGED
|
@@ -42,6 +42,7 @@ const fs_1 = require("fs");
|
|
|
42
42
|
const chalk_1 = __importDefault(require("chalk"));
|
|
43
43
|
const inquirer_1 = __importDefault(require("inquirer"));
|
|
44
44
|
const yaml = __importStar(require("js-yaml"));
|
|
45
|
+
const frameworks_1 = require("../utils/frameworks");
|
|
45
46
|
const templateEngine_1 = require("../utils/templateEngine");
|
|
46
47
|
const specGenerator_1 = require("../utils/specGenerator");
|
|
47
48
|
const logger_1 = require("../utils/logger");
|
|
@@ -54,9 +55,14 @@ async function initCommand(name, options) {
|
|
|
54
55
|
process.exit(1);
|
|
55
56
|
}
|
|
56
57
|
const projectName = name.trim();
|
|
57
|
-
// Validate project name
|
|
58
|
-
if (
|
|
59
|
-
logger.displayError('Invalid Project Name', 'Project name
|
|
58
|
+
// Validate project name length (npm limit)
|
|
59
|
+
if (projectName.length > 214) {
|
|
60
|
+
logger.displayError('Invalid Project Name', 'Project name must be 214 characters or fewer');
|
|
61
|
+
process.exit(1);
|
|
62
|
+
}
|
|
63
|
+
// Validate project name with allowlist (prevents filesystem issues and Handlebars template injection)
|
|
64
|
+
if (!/^[a-zA-Z0-9][a-zA-Z0-9._-]*$/.test(projectName)) {
|
|
65
|
+
logger.displayError('Invalid Project Name', 'Project name must start with a letter or number and contain only letters, numbers, dots, hyphens, and underscores\n\nš” Example: my-project, app_v2, project.name');
|
|
60
66
|
process.exit(1);
|
|
61
67
|
}
|
|
62
68
|
// Validate supported language
|
|
@@ -65,10 +71,58 @@ async function initCommand(name, options) {
|
|
|
65
71
|
logger.displayError('Unsupported Language', `Language "${options.lang}" is not supported\n\nš” Supported languages: ${supportedLanguages.join(', ')}`);
|
|
66
72
|
process.exit(1);
|
|
67
73
|
}
|
|
74
|
+
// Dry-run: list files that would be created without writing them
|
|
75
|
+
if (options.dryRun) {
|
|
76
|
+
const targetDir = (0, path_1.resolve)(options.dir, projectName);
|
|
77
|
+
const specsName = options.specsName;
|
|
78
|
+
const specsDir = (0, path_1.join)(targetDir, specsName);
|
|
79
|
+
const ideDir = '.vscode'; // default for dry-run (IDE is chosen interactively)
|
|
80
|
+
const entries = [
|
|
81
|
+
targetDir + '/',
|
|
82
|
+
specsDir + '/',
|
|
83
|
+
(0, path_1.join)(specsDir, 'README.md'),
|
|
84
|
+
(0, path_1.join)(specsDir, 'project') + '/',
|
|
85
|
+
(0, path_1.join)(specsDir, 'project', 'project.yaml'),
|
|
86
|
+
(0, path_1.join)(specsDir, 'project', 'requirements.md'),
|
|
87
|
+
(0, path_1.join)(specsDir, 'architecture') + '/',
|
|
88
|
+
(0, path_1.join)(specsDir, 'architecture', 'architecture.md'),
|
|
89
|
+
(0, path_1.join)(specsDir, 'architecture', 'api.yaml'),
|
|
90
|
+
(0, path_1.join)(specsDir, 'planning') + '/',
|
|
91
|
+
(0, path_1.join)(specsDir, 'planning', 'tasks.md'),
|
|
92
|
+
(0, path_1.join)(specsDir, 'planning', 'roadmap.md'),
|
|
93
|
+
(0, path_1.join)(specsDir, 'quality') + '/',
|
|
94
|
+
(0, path_1.join)(specsDir, 'quality', 'tests.md'),
|
|
95
|
+
(0, path_1.join)(specsDir, 'development') + '/',
|
|
96
|
+
(0, path_1.join)(specsDir, 'development', 'docs.md'),
|
|
97
|
+
(0, path_1.join)(specsDir, 'development', 'context.md'),
|
|
98
|
+
(0, path_1.join)(specsDir, 'development', 'prompts.md'),
|
|
99
|
+
(0, path_1.join)(specsDir, 'security') + '/',
|
|
100
|
+
(0, path_1.join)(specsDir, 'security', 'threat-model.md'),
|
|
101
|
+
(0, path_1.join)(specsDir, 'security', 'security-decisions.md'),
|
|
102
|
+
(0, path_1.join)(targetDir, ideDir) + '/',
|
|
103
|
+
(0, path_1.join)(targetDir, ideDir, 'settings.json'),
|
|
104
|
+
(0, path_1.join)(targetDir, ideDir, 'extensions.json'),
|
|
105
|
+
(0, path_1.join)(targetDir, '.github') + '/',
|
|
106
|
+
(0, path_1.join)(targetDir, '.github', 'copilot-instructions.md'),
|
|
107
|
+
];
|
|
108
|
+
const content = [
|
|
109
|
+
chalk_1.default.blue('š Dry run ā no files will be written'),
|
|
110
|
+
'',
|
|
111
|
+
chalk_1.default.blue.bold('Files that would be created:'),
|
|
112
|
+
'',
|
|
113
|
+
...entries.map(e => chalk_1.default.white(' ' + e)),
|
|
114
|
+
'',
|
|
115
|
+
chalk_1.default.gray(`(${entries.filter(e => !e.endsWith('/')).length} files, ${entries.filter(e => e.endsWith('/')).length} directories)`),
|
|
116
|
+
'',
|
|
117
|
+
chalk_1.default.cyan(`š” Run without --dry-run to create these files.`),
|
|
118
|
+
];
|
|
119
|
+
logger.displayWithLogo(content);
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
68
122
|
// Get framework if not provided and prompts enabled
|
|
69
123
|
let framework = options.framework;
|
|
70
124
|
if (!framework && options.prompts) {
|
|
71
|
-
const frameworks = getFrameworksForLanguage(options.lang);
|
|
125
|
+
const frameworks = (0, frameworks_1.getFrameworksForLanguage)(options.lang);
|
|
72
126
|
if (frameworks.length > 0) {
|
|
73
127
|
// Display logo before framework selection
|
|
74
128
|
const frameworkPromptContent = [
|
|
@@ -102,6 +156,73 @@ async function initCommand(name, options) {
|
|
|
102
156
|
}]);
|
|
103
157
|
developerName = nameResponse.developerName.trim() || 'Your Name';
|
|
104
158
|
}
|
|
159
|
+
// Get IDE/Agent preference for context configuration
|
|
160
|
+
let ide = 'vscode'; // default
|
|
161
|
+
if (options.prompts) {
|
|
162
|
+
const ideResponse = await inquirer_1.default.prompt([{
|
|
163
|
+
type: 'list',
|
|
164
|
+
name: 'ide',
|
|
165
|
+
message: 'Select your AI IDE/Agent for SpecPilot context:',
|
|
166
|
+
choices: ['vscode', 'Cursor', 'Windsurf', 'Antigravity', 'Kiro', 'Cowork', 'Codex']
|
|
167
|
+
}]);
|
|
168
|
+
ide = ideResponse.ide;
|
|
169
|
+
}
|
|
170
|
+
// Project context questions (helps AI generate better specs)
|
|
171
|
+
const NOT_SPECIFIED = 'Not specified ā use your judgment and mark as [ASSUMPTION]';
|
|
172
|
+
let projectContext = {
|
|
173
|
+
whatItDoes: NOT_SPECIFIED,
|
|
174
|
+
targetUsers: NOT_SPECIFIED,
|
|
175
|
+
expectedScale: NOT_SPECIFIED,
|
|
176
|
+
constraints: NOT_SPECIFIED,
|
|
177
|
+
};
|
|
178
|
+
if (options.prompts) {
|
|
179
|
+
console.log('');
|
|
180
|
+
console.log(chalk_1.default.blue.bold('š Project Context') + chalk_1.default.gray(' (helps AI generate better specs)'));
|
|
181
|
+
console.log('');
|
|
182
|
+
// Mandatory question ā re-prompt if empty
|
|
183
|
+
let whatItDoes = '';
|
|
184
|
+
while (!whatItDoes.trim()) {
|
|
185
|
+
const descResponse = await inquirer_1.default.prompt([{
|
|
186
|
+
type: 'input',
|
|
187
|
+
name: 'whatItDoes',
|
|
188
|
+
message: 'What does your project do? (required):',
|
|
189
|
+
}]);
|
|
190
|
+
whatItDoes = descResponse.whatItDoes.trim();
|
|
191
|
+
if (!whatItDoes) {
|
|
192
|
+
console.log(chalk_1.default.yellow(' This is required ā a brief sentence about what the project does.'));
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
// Optional questions ā Enter to skip
|
|
196
|
+
const optionalResponse = await inquirer_1.default.prompt([
|
|
197
|
+
{
|
|
198
|
+
type: 'input',
|
|
199
|
+
name: 'targetUsers',
|
|
200
|
+
message: 'Who are the target users? (Enter to skip):',
|
|
201
|
+
default: '',
|
|
202
|
+
filter: (val) => val.trim(),
|
|
203
|
+
},
|
|
204
|
+
{
|
|
205
|
+
type: 'input',
|
|
206
|
+
name: 'expectedScale',
|
|
207
|
+
message: 'What\'s the expected scale? (Enter to skip):',
|
|
208
|
+
default: '',
|
|
209
|
+
filter: (val) => val.trim(),
|
|
210
|
+
},
|
|
211
|
+
{
|
|
212
|
+
type: 'input',
|
|
213
|
+
name: 'constraints',
|
|
214
|
+
message: 'Any key constraints or requirements? (Enter to skip):',
|
|
215
|
+
default: '',
|
|
216
|
+
filter: (val) => val.trim(),
|
|
217
|
+
},
|
|
218
|
+
]);
|
|
219
|
+
projectContext = {
|
|
220
|
+
whatItDoes,
|
|
221
|
+
targetUsers: optionalResponse.targetUsers || NOT_SPECIFIED,
|
|
222
|
+
expectedScale: optionalResponse.expectedScale || NOT_SPECIFIED,
|
|
223
|
+
constraints: optionalResponse.constraints || NOT_SPECIFIED,
|
|
224
|
+
};
|
|
225
|
+
}
|
|
105
226
|
// Create project directory
|
|
106
227
|
const targetDir = (0, path_1.join)(options.dir, projectName);
|
|
107
228
|
if (!(0, fs_1.existsSync)(targetDir)) {
|
|
@@ -124,7 +245,7 @@ async function initCommand(name, options) {
|
|
|
124
245
|
projectInfo += `\n Framework: ${projectData.framework || 'Unknown'}`;
|
|
125
246
|
projectInfo += `\n Author: ${projectData.author || 'Unknown'}`;
|
|
126
247
|
}
|
|
127
|
-
catch
|
|
248
|
+
catch {
|
|
128
249
|
projectInfo += '\n\nā ļø Could not read project.yaml';
|
|
129
250
|
}
|
|
130
251
|
}
|
|
@@ -134,7 +255,7 @@ async function initCommand(name, options) {
|
|
|
134
255
|
const lines = requirementsContent.split('\n').slice(0, 5); // First 5 lines
|
|
135
256
|
projectInfo += `\n\nš Requirements Preview:\n${lines.map(line => ` ${line}`).join('\n')}`;
|
|
136
257
|
}
|
|
137
|
-
catch
|
|
258
|
+
catch {
|
|
138
259
|
projectInfo += '\n\nā ļø Could not read requirements.md';
|
|
139
260
|
}
|
|
140
261
|
}
|
|
@@ -163,7 +284,10 @@ async function initCommand(name, options) {
|
|
|
163
284
|
framework,
|
|
164
285
|
targetDir,
|
|
165
286
|
specsName: options.specsName,
|
|
166
|
-
author: developerName
|
|
287
|
+
author: developerName,
|
|
288
|
+
ide,
|
|
289
|
+
mode: 'new',
|
|
290
|
+
projectContext,
|
|
167
291
|
});
|
|
168
292
|
// Show success with logo (includes initialization message and all details)
|
|
169
293
|
logger.displayInitSuccess(projectName, targetDir, (0, path_1.join)(targetDir, options.specsName));
|
|
@@ -173,11 +297,4 @@ async function initCommand(name, options) {
|
|
|
173
297
|
process.exit(1);
|
|
174
298
|
}
|
|
175
299
|
}
|
|
176
|
-
function getFrameworksForLanguage(language) {
|
|
177
|
-
const frameworks = {
|
|
178
|
-
typescript: ['react', 'express', 'next', 'nest', 'vue', 'angular'],
|
|
179
|
-
python: ['fastapi', 'django', 'flask', 'streamlit']
|
|
180
|
-
};
|
|
181
|
-
return frameworks[language] || [];
|
|
182
|
-
}
|
|
183
300
|
//# sourceMappingURL=init.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|