specpilot 1.6.2 → 1.6.7
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 +27 -11
- package/dist/cli.js +15 -3
- package/dist/cli.js.map +1 -1
- package/dist/commands/add-specs.d.ts.map +1 -1
- package/dist/commands/add-specs.js +17 -9
- package/dist/commands/add-specs.js.map +1 -1
- package/dist/commands/archive.d.ts +1 -0
- package/dist/commands/archive.d.ts.map +1 -1
- package/dist/commands/archive.js +66 -0
- package/dist/commands/archive.js.map +1 -1
- package/dist/commands/backfill.d.ts +8 -0
- package/dist/commands/backfill.d.ts.map +1 -0
- package/dist/commands/backfill.js +81 -0
- package/dist/commands/backfill.js.map +1 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +17 -10
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/validate.d.ts.map +1 -1
- package/dist/commands/validate.js +51 -1
- package/dist/commands/validate.js.map +1 -1
- package/dist/utils/ideConfigGenerator.d.ts +19 -2
- package/dist/utils/ideConfigGenerator.d.ts.map +1 -1
- package/dist/utils/ideConfigGenerator.js +117 -20
- package/dist/utils/ideConfigGenerator.js.map +1 -1
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +3 -2
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/specArchiver.js +4 -4
- package/dist/utils/specArchiver.js.map +1 -1
- package/dist/utils/specBackfiller.d.ts +66 -0
- package/dist/utils/specBackfiller.d.ts.map +1 -0
- package/dist/utils/specBackfiller.js +502 -0
- package/dist/utils/specBackfiller.js.map +1 -0
- package/dist/utils/specFileGenerator.d.ts.map +1 -1
- package/dist/utils/specFileGenerator.js +15 -3
- package/dist/utils/specFileGenerator.js.map +1 -1
- package/dist/utils/specGenerator.d.ts +1 -0
- package/dist/utils/specGenerator.d.ts.map +1 -1
- package/dist/utils/specGenerator.js +3 -1
- package/dist/utils/specGenerator.js.map +1 -1
- package/dist/utils/specTreePrinter.d.ts +3 -2
- package/dist/utils/specTreePrinter.d.ts.map +1 -1
- package/dist/utils/specTreePrinter.js +61 -20
- package/dist/utils/specTreePrinter.js.map +1 -1
- package/dist/utils/specValidator.d.ts +8 -0
- package/dist/utils/specValidator.d.ts.map +1 -1
- package/dist/utils/specValidator.js +171 -19
- package/dist/utils/specValidator.js.map +1 -1
- package/dist/utils/templateEngine.d.ts.map +1 -1
- package/dist/utils/templateEngine.js +2 -0
- package/dist/utils/templateEngine.js.map +1 -1
- package/package.json +3 -3
- package/dist/commands/specify.d.ts +0 -8
- package/dist/commands/specify.d.ts.map +0 -1
- package/dist/commands/specify.js +0 -286
- package/dist/commands/specify.js.map +0 -1
- package/dist/utils/templateRegistry.d.ts +0 -14
- package/dist/utils/templateRegistry.d.ts.map +0 -1
- package/dist/utils/templateRegistry.js +0 -87
- package/dist/utils/templateRegistry.js.map +0 -1
package/README.md
CHANGED
|
@@ -37,19 +37,35 @@ This AI-assisted approach ensures comprehensive, high-quality specifications tai
|
|
|
37
37
|
|
|
38
38
|
| Command | Description |
|
|
39
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
|
-
| `
|
|
46
|
-
| `
|
|
47
|
-
| `
|
|
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
|
+
| `backfill` | Backfill missing mandates into existing project files |
|
|
46
|
+
| `list` | Show available templates |
|
|
47
|
+
| `migrate` | Convert legacy `.project-spec` folder (rarely needed) |
|
|
48
|
+
| `refine [desc]` | Refine project specifications |
|
|
48
49
|
|
|
49
50
|
> **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
|
+
> `init` → `i` · `validate` → `v` · `migrate` → `m` · `list` → `ls` · `refine` → `ref` · `archive` → `ar` · `add-specs` → `add` · `backfill` → `bf`
|
|
51
52
|
> Example: `specpilot i my-app` is identical to `specpilot init my-app`.
|
|
52
53
|
|
|
54
|
+
### Per-Command Options
|
|
55
|
+
|
|
56
|
+
| Command | Options |
|
|
57
|
+
| ----------- | ----------------------------------------------------------------------------------- |
|
|
58
|
+
| `init` | `--lang` · `--framework` · `--dir` · `--specs-name` · `--no-prompts` · `--dry-run` |
|
|
59
|
+
| `validate` | `--fix` · `--verbose` |
|
|
60
|
+
| `migrate` | `--from` · `--to` · `--backup` |
|
|
61
|
+
| `list` | `--lang` · `--verbose` |
|
|
62
|
+
| `refine` | `--update` · `--no-prompts` |
|
|
63
|
+
| `archive` | `--dry-run` |
|
|
64
|
+
| `add-specs` | `--no-analysis` · `--deep-analysis` · `--no-prompts` |
|
|
65
|
+
| `backfill` | `--dir` · `--specs-name` · `--dry-run` |
|
|
66
|
+
|
|
67
|
+
> Run `specpilot <command> --help` for full flag descriptions and default values.
|
|
68
|
+
|
|
53
69
|
### Examples
|
|
54
70
|
|
|
55
71
|
```bash
|
|
@@ -132,7 +148,6 @@ SpecPilot generates AI agent configuration files during project initialization.
|
|
|
132
148
|
- **VSCode** - Industry standard with Copilot integration
|
|
133
149
|
- **Cursor** - AI-first code editor with enhanced AI context
|
|
134
150
|
- **Windsurf** - Advanced AI coding assistant
|
|
135
|
-
- **Kiro** - Specialized AI development environment
|
|
136
151
|
- **Antigravity** - AI-powered IDE with context awareness
|
|
137
152
|
|
|
138
153
|
**Cloud-Based AI Agents (Instruction Files):**
|
|
@@ -172,7 +187,7 @@ The generated settings/instructions automatically configure your AI agent to:
|
|
|
172
187
|
# During init, you'll be prompted to select your IDE/Agent
|
|
173
188
|
specpilot init my-project --lang typescript --framework react
|
|
174
189
|
# Respond with your preferred IDE/Agent:
|
|
175
|
-
# - vscode, cursor, windsurf,
|
|
190
|
+
# - vscode, cursor, windsurf, antigravity (desktop)
|
|
176
191
|
# - cowork, codex (cloud agents)
|
|
177
192
|
```
|
|
178
193
|
|
|
@@ -260,6 +275,7 @@ npm link # For local testing
|
|
|
260
275
|
## Documentation
|
|
261
276
|
|
|
262
277
|
- **[Full Guide](docs/GUIDE.md)**: Comprehensive documentation
|
|
278
|
+
- **[SpecPilot vs GitHub Spec Kit](docs/comparison.md)**: Side-by-side comparison to help you choose the right tool
|
|
263
279
|
- **[CHANGELOG](CHANGELOG.md)**: Version history
|
|
264
280
|
- **[Issues](https://github.com/girishr/SpecPilot/issues)**: Bug reports & feature requests
|
|
265
281
|
|
package/dist/cli.js
CHANGED
|
@@ -13,6 +13,7 @@ const list_1 = require("./commands/list");
|
|
|
13
13
|
const refine_1 = require("./commands/refine");
|
|
14
14
|
const add_specs_1 = require("./commands/add-specs");
|
|
15
15
|
const archive_1 = require("./commands/archive");
|
|
16
|
+
const backfill_1 = require("./commands/backfill");
|
|
16
17
|
const logger_1 = require("./utils/logger");
|
|
17
18
|
const packageJson = require('../package.json');
|
|
18
19
|
commander_1.program
|
|
@@ -45,7 +46,7 @@ commander_1.program
|
|
|
45
46
|
commander_1.program
|
|
46
47
|
.command('migrate')
|
|
47
48
|
.alias('m')
|
|
48
|
-
.description('
|
|
49
|
+
.description('Convert legacy .project-spec folder to current .specs/ structure (rarely needed)')
|
|
49
50
|
.option('-d, --dir <directory>', 'Project directory', '.')
|
|
50
51
|
.option('--from <structure>', 'Source structure (complex, project-spec)', 'complex')
|
|
51
52
|
.option('--to <structure>', 'Target structure (simple)', 'simple')
|
|
@@ -74,8 +75,9 @@ commander_1.program
|
|
|
74
75
|
commander_1.program
|
|
75
76
|
.command('archive')
|
|
76
77
|
.alias('ar')
|
|
77
|
-
.description('Archive oversized .specs/ files (prompts.md >
|
|
78
|
+
.description('Archive oversized .specs/ files (prompts.md > 100 lines, tasks.md Completed > 25 lines)')
|
|
78
79
|
.option('--dry-run', 'Preview what would be archived without writing any files')
|
|
80
|
+
.option('--force', 'Skip branch warning and archive without confirmation')
|
|
79
81
|
.action(archive_1.archiveCommand);
|
|
80
82
|
// Add-specs command
|
|
81
83
|
commander_1.program
|
|
@@ -88,10 +90,20 @@ commander_1.program
|
|
|
88
90
|
.option('--deep-analysis', 'Perform thorough codebase analysis')
|
|
89
91
|
.option('--no-prompts', 'Skip interactive prompts')
|
|
90
92
|
.action(add_specs_1.addSpecsCommand);
|
|
93
|
+
// Backfill command
|
|
94
|
+
commander_1.program
|
|
95
|
+
.command('backfill')
|
|
96
|
+
.alias('bf')
|
|
97
|
+
.description('Backfill missing SpecPilot mandates into existing project.yaml and copilot-instructions.md')
|
|
98
|
+
.option('-d, --dir <directory>', 'Project directory', '.')
|
|
99
|
+
.option('--specs-name <name>', 'Name for specs folder', '.specs')
|
|
100
|
+
.option('--dry-run', 'Preview changes without writing any files')
|
|
101
|
+
.option('--no-prompts', 'Accept suggested devPrefix silently when team.devPrefix is missing')
|
|
102
|
+
.action(backfill_1.backfillCommand);
|
|
91
103
|
commander_1.program.addHelpText('after', `
|
|
92
104
|
Aliases:
|
|
93
105
|
init → i validate → v migrate → m list → ls
|
|
94
|
-
refine → ref archive → ar add-specs → add
|
|
106
|
+
refine → ref archive → ar add-specs → add backfill → bf
|
|
95
107
|
|
|
96
108
|
Per-command options: specpilot <command> --help
|
|
97
109
|
`);
|
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,8CAAkD;AAClD,oDAAuD;AACvD,gDAAoD;AACpD,2CAAwC;AAExC,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,WAAW,EAAE,uDAAuD,CAAC;KAC5E,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,
|
|
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":"
|
|
1
|
+
{"version":3,"file":"add-specs.d.ts","sourceRoot":"","sources":["../../src/commands/add-specs.ts"],"names":[],"mappings":"AAYA,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,iBA8H7D"}
|
|
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
exports.addSpecsCommand = addSpecsCommand;
|
|
7
7
|
const path_1 = require("path");
|
|
8
8
|
const fs_1 = require("fs");
|
|
9
|
+
const os_1 = __importDefault(require("os"));
|
|
9
10
|
const chalk_1 = __importDefault(require("chalk"));
|
|
10
11
|
const inquirer_1 = __importDefault(require("inquirer"));
|
|
11
12
|
const projectDetector_1 = require("../utils/projectDetector");
|
|
@@ -57,16 +58,22 @@ async function addSpecsCommand(options) {
|
|
|
57
58
|
framework = response.framework === 'none' ? undefined : response.framework;
|
|
58
59
|
}
|
|
59
60
|
}
|
|
60
|
-
// Get
|
|
61
|
-
|
|
61
|
+
// Get short handle for task/prompt ID namespacing (mandatory when prompts enabled)
|
|
62
|
+
const osUsername = os_1.default.userInfo().username;
|
|
63
|
+
let developerName = projectInfo?.author || osUsername;
|
|
62
64
|
if (options.prompts) {
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
65
|
+
let handle = '';
|
|
66
|
+
while (!handle) {
|
|
67
|
+
const nameResponse = await inquirer_1.default.prompt([{
|
|
68
|
+
type: 'input',
|
|
69
|
+
name: 'developerName',
|
|
70
|
+
message: `Your short handle is used as a prefix in task IDs (e.g. CD-jsmith-001) and prompt IDs\n (e.g. PROMPT-jsmith-001) to avoid collisions when multiple devs share the same spec files.\n Use your GitHub, GitLab, or Bitbucket username, or any short tag of your choice [${osUsername}]:`,
|
|
71
|
+
}]);
|
|
72
|
+
handle = nameResponse.developerName.trim();
|
|
73
|
+
if (!handle)
|
|
74
|
+
handle = osUsername;
|
|
75
|
+
}
|
|
76
|
+
developerName = handle;
|
|
70
77
|
}
|
|
71
78
|
// Analyze codebase if requested
|
|
72
79
|
let analysis = null;
|
|
@@ -105,6 +112,7 @@ async function addSpecsCommand(options) {
|
|
|
105
112
|
description,
|
|
106
113
|
analysis: (!options.noAnalysis && analysis) ? analysis : undefined,
|
|
107
114
|
mode: 'existing',
|
|
115
|
+
noPrompts: !options.prompts,
|
|
108
116
|
});
|
|
109
117
|
logger.success('✅ .specs folder created successfully!');
|
|
110
118
|
logger.info(`📁 Location: ${specsDir}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add-specs.js","sourceRoot":"","sources":["../../src/commands/add-specs.ts"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"add-specs.js","sourceRoot":"","sources":["../../src/commands/add-specs.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"archive.d.ts","sourceRoot":"","sources":["../../src/commands/archive.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"archive.d.ts","sourceRoot":"","sources":["../../src/commands/archive.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAsBD,wBAAsB,cAAc,CAAC,OAAO,EAAE,cAAc,iBAwD3D"}
|
package/dist/commands/archive.js
CHANGED
|
@@ -1,16 +1,82 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
2
35
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
36
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
37
|
};
|
|
5
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
39
|
exports.archiveCommand = archiveCommand;
|
|
7
40
|
const chalk_1 = __importDefault(require("chalk"));
|
|
41
|
+
const child_process_1 = require("child_process");
|
|
42
|
+
const readline = __importStar(require("readline"));
|
|
8
43
|
const specArchiver_1 = require("../utils/specArchiver");
|
|
9
44
|
const logger_1 = require("../utils/logger");
|
|
45
|
+
function getCurrentBranch() {
|
|
46
|
+
try {
|
|
47
|
+
return (0, child_process_1.execSync)('git rev-parse --abbrev-ref HEAD', { stdio: ['pipe', 'pipe', 'pipe'] })
|
|
48
|
+
.toString()
|
|
49
|
+
.trim();
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
function askConfirmation(question) {
|
|
56
|
+
return new Promise(resolve => {
|
|
57
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
58
|
+
rl.question(question, answer => {
|
|
59
|
+
rl.close();
|
|
60
|
+
resolve(answer.trim().toLowerCase() === 'y');
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
}
|
|
10
64
|
async function archiveCommand(options) {
|
|
11
65
|
const logger = new logger_1.Logger();
|
|
12
66
|
const projectDir = process.cwd();
|
|
13
67
|
try {
|
|
68
|
+
// Branch guard — warn if not on main/master
|
|
69
|
+
if (!options.dryRun && !options.force) {
|
|
70
|
+
const branch = getCurrentBranch();
|
|
71
|
+
if (branch && branch !== 'main' && branch !== 'master') {
|
|
72
|
+
console.log(chalk_1.default.yellow(`⚠ You're on branch '${branch}'. Archive is recommended only on the default branch after merging.`));
|
|
73
|
+
const confirmed = await askConfirmation('Continue? [y/N] ');
|
|
74
|
+
if (!confirmed) {
|
|
75
|
+
logger.info('Archive cancelled.');
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
14
80
|
if (options.dryRun) {
|
|
15
81
|
logger.info('🔍 Dry run — previewing archive operations (no files will be changed)...');
|
|
16
82
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"archive.js","sourceRoot":"","sources":["../../src/commands/archive.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"archive.js","sourceRoot":"","sources":["../../src/commands/archive.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+BA,wCAwDC;AAvFD,kDAA0B;AAC1B,iDAAyC;AACzC,mDAAqC;AACrC,wDAAqD;AACrD,4CAAyC;AAOzC,SAAS,gBAAgB;IACvB,IAAI,CAAC;QACH,OAAO,IAAA,wBAAQ,EAAC,iCAAiC,EAAE,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;aACpF,QAAQ,EAAE;aACV,IAAI,EAAE,CAAC;IACZ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,QAAgB;IACvC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE;QAC3B,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QACtF,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE;YAC7B,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,GAAG,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAEM,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,4CAA4C;QAC5C,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACtC,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;YAClC,IAAI,MAAM,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;gBACvD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,uBAAuB,MAAM,qEAAqE,CAAC,CAAC,CAAC;gBAC9H,MAAM,SAAS,GAAG,MAAM,eAAe,CAAC,kBAAkB,CAAC,CAAC;gBAC5D,IAAI,CAAC,SAAS,EAAE,CAAC;oBACf,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;oBAClC,OAAO;gBACT,CAAC;YACH,CAAC;QACH,CAAC;QAED,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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backfill.d.ts","sourceRoot":"","sources":["../../src/commands/backfill.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,wBAAsB,eAAe,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAsB7E"}
|
|
@@ -0,0 +1,81 @@
|
|
|
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.backfillCommand = backfillCommand;
|
|
7
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
8
|
+
const path_1 = require("path");
|
|
9
|
+
const specBackfiller_1 = require("../utils/specBackfiller");
|
|
10
|
+
const logger_1 = require("../utils/logger");
|
|
11
|
+
async function backfillCommand(options) {
|
|
12
|
+
const logger = new logger_1.Logger();
|
|
13
|
+
const projectDir = (0, path_1.resolve)(options.dir);
|
|
14
|
+
if (options.dryRun) {
|
|
15
|
+
logger.info('🔍 Dry-run mode — no files will be written.\n');
|
|
16
|
+
}
|
|
17
|
+
const backfiller = new specBackfiller_1.SpecBackfiller();
|
|
18
|
+
try {
|
|
19
|
+
const result = await backfiller.backfill(projectDir, options.specsName, options.dryRun ?? false, options.noPrompts ?? false);
|
|
20
|
+
displayResult(result, options.dryRun ?? false, logger);
|
|
21
|
+
}
|
|
22
|
+
catch (error) {
|
|
23
|
+
logger.error(`❌ ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
24
|
+
process.exit(1);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
function fileResultLines(label, r, dryRun) {
|
|
28
|
+
const lines = [chalk_1.default.cyan(`📄 ${label}`)];
|
|
29
|
+
if (r.action === 'missing') {
|
|
30
|
+
lines.push(chalk_1.default.yellow(` ⚠️ File not found — ${r.reason}`));
|
|
31
|
+
}
|
|
32
|
+
else if (r.action === 'skipped') {
|
|
33
|
+
if (r.reason) {
|
|
34
|
+
lines.push(chalk_1.default.yellow(` ⚠️ Skipped — ${r.reason}`));
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
lines.push(chalk_1.default.green(` ✅ All ${r.total} items already present — nothing to backfill`));
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
else if (r.action === 'created') {
|
|
41
|
+
const verb = dryRun ? 'Would create' : 'Created';
|
|
42
|
+
lines.push(chalk_1.default.green(` ✅ ${verb} with all ${r.total} mandates`));
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
// updated
|
|
46
|
+
lines.push(chalk_1.default.green(` ✅ ${r.found}/${r.total} items already present`));
|
|
47
|
+
const verb = dryRun ? 'Would add' : 'Added';
|
|
48
|
+
lines.push(chalk_1.default.white(` ➕ ${verb} ${r.added.length} missing item(s):`));
|
|
49
|
+
r.added.forEach((label) => lines.push(chalk_1.default.white(` • ${label}`)));
|
|
50
|
+
}
|
|
51
|
+
return lines;
|
|
52
|
+
}
|
|
53
|
+
function displayResult(result, dryRun, logger) {
|
|
54
|
+
const allResults = [result.projectYaml, result.copilotInstructions, result.tasksMd];
|
|
55
|
+
const content = [
|
|
56
|
+
chalk_1.default.blue.bold(`Backfill Results${dryRun ? ' (dry-run — no changes written)' : ''}`),
|
|
57
|
+
'',
|
|
58
|
+
...fileResultLines('.specs/project/project.yaml', result.projectYaml, dryRun),
|
|
59
|
+
'',
|
|
60
|
+
...fileResultLines('.github/copilot-instructions.md', result.copilotInstructions, dryRun),
|
|
61
|
+
'',
|
|
62
|
+
...fileResultLines('.specs/planning/tasks.md', result.tasksMd, dryRun),
|
|
63
|
+
'',
|
|
64
|
+
];
|
|
65
|
+
const updatedCount = allResults.filter((r) => r.action === 'updated' || r.action === 'created').length;
|
|
66
|
+
const skippedCount = allResults.filter((r) => r.action === 'skipped').length;
|
|
67
|
+
if (updatedCount === 0) {
|
|
68
|
+
content.push(chalk_1.default.green('✅ Everything is up to date — nothing to backfill.'));
|
|
69
|
+
}
|
|
70
|
+
else if (dryRun) {
|
|
71
|
+
content.push(chalk_1.default.yellow(`ℹ️ ${updatedCount} file(s) would be updated, ${skippedCount} already up to date. Run without --dry-run to apply.`));
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
content.push(chalk_1.default.green(`✅ ${updatedCount} file(s) updated, ${skippedCount} already up to date.`));
|
|
75
|
+
content.push('');
|
|
76
|
+
content.push(chalk_1.default.cyan('📖 Next steps:'));
|
|
77
|
+
content.push(chalk_1.default.white(' specpilot validate # Verify your specs are complete'));
|
|
78
|
+
}
|
|
79
|
+
logger.displayWithLogo(content);
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=backfill.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backfill.js","sourceRoot":"","sources":["../../src/commands/backfill.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAWA,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,iBAwRnE"}
|
package/dist/commands/init.js
CHANGED
|
@@ -39,6 +39,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
39
39
|
exports.initCommand = initCommand;
|
|
40
40
|
const path_1 = require("path");
|
|
41
41
|
const fs_1 = require("fs");
|
|
42
|
+
const os_1 = __importDefault(require("os"));
|
|
42
43
|
const chalk_1 = __importDefault(require("chalk"));
|
|
43
44
|
const inquirer_1 = __importDefault(require("inquirer"));
|
|
44
45
|
const yaml = __importStar(require("js-yaml"));
|
|
@@ -145,16 +146,22 @@ async function initCommand(name, options) {
|
|
|
145
146
|
framework = response.framework === 'none' ? undefined : response.framework;
|
|
146
147
|
}
|
|
147
148
|
}
|
|
148
|
-
// Get
|
|
149
|
-
|
|
149
|
+
// Get short handle for task/prompt ID namespacing (mandatory when prompts enabled)
|
|
150
|
+
const osUsername = os_1.default.userInfo().username;
|
|
151
|
+
let developerName = osUsername;
|
|
150
152
|
if (options.prompts) {
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
153
|
+
let handle = '';
|
|
154
|
+
while (!handle) {
|
|
155
|
+
const nameResponse = await inquirer_1.default.prompt([{
|
|
156
|
+
type: 'input',
|
|
157
|
+
name: 'developerName',
|
|
158
|
+
message: `Your short handle is used as a prefix in task IDs (e.g. CD-jsmith-001) and prompt IDs\n (e.g. PROMPT-jsmith-001) to avoid collisions when multiple devs share the same spec files.\n Use your GitHub, GitLab, or Bitbucket username, or any short tag of your choice [${osUsername}]:`,
|
|
159
|
+
}]);
|
|
160
|
+
handle = nameResponse.developerName.trim();
|
|
161
|
+
if (!handle)
|
|
162
|
+
handle = osUsername;
|
|
163
|
+
}
|
|
164
|
+
developerName = handle;
|
|
158
165
|
}
|
|
159
166
|
// Get IDE/Agent preference for context configuration
|
|
160
167
|
let ide = 'vscode'; // default
|
|
@@ -163,7 +170,7 @@ async function initCommand(name, options) {
|
|
|
163
170
|
type: 'list',
|
|
164
171
|
name: 'ide',
|
|
165
172
|
message: 'Select your AI IDE/Agent for SpecPilot context:',
|
|
166
|
-
choices: ['vscode', 'Cursor', 'Windsurf', 'Antigravity', '
|
|
173
|
+
choices: ['vscode', 'Cursor', 'Windsurf', 'Antigravity', 'Cowork', 'Codex']
|
|
167
174
|
}]);
|
|
168
175
|
ide = ideResponse.ide;
|
|
169
176
|
}
|
|
@@ -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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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,OAAO,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;CAClB;
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,OAAO,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;CAClB;AAcD,wBAAsB,eAAe,CAAC,OAAO,EAAE,eAAe,iBAwG7D"}
|
|
@@ -7,6 +7,18 @@ exports.validateCommand = validateCommand;
|
|
|
7
7
|
const chalk_1 = __importDefault(require("chalk"));
|
|
8
8
|
const specValidator_1 = require("../utils/specValidator");
|
|
9
9
|
const logger_1 = require("../utils/logger");
|
|
10
|
+
function displayFixPrompts(results) {
|
|
11
|
+
if (results.fixPrompts.length === 0)
|
|
12
|
+
return;
|
|
13
|
+
console.log(chalk_1.default.cyan('\n📋 AI Fix Prompts — copy these to your AI assistant:'));
|
|
14
|
+
console.log(chalk_1.default.dim('─'.repeat(60)));
|
|
15
|
+
for (const { issue, prompt } of results.fixPrompts) {
|
|
16
|
+
console.log(chalk_1.default.white(`\n▸ ${issue}`));
|
|
17
|
+
const indented = prompt.split('\n').map(l => ` ${l}`).join('\n');
|
|
18
|
+
console.log(chalk_1.default.gray(indented));
|
|
19
|
+
}
|
|
20
|
+
console.log(chalk_1.default.dim('─'.repeat(60)));
|
|
21
|
+
}
|
|
10
22
|
async function validateCommand(options) {
|
|
11
23
|
const logger = new logger_1.Logger();
|
|
12
24
|
try {
|
|
@@ -36,9 +48,19 @@ async function validateCommand(options) {
|
|
|
36
48
|
}
|
|
37
49
|
else {
|
|
38
50
|
if (options.fix && results.fixable.length > 0) {
|
|
51
|
+
// Capture pre-fix prompts (e.g. "fill in newly created security files")
|
|
52
|
+
const prefixPrompts = results.fixPrompts;
|
|
39
53
|
console.log(chalk_1.default.blue('\n🔧 Auto-fixing issues...'));
|
|
40
54
|
const fixed = await validator.autoFix(options.dir, results.fixable);
|
|
41
|
-
console.log(chalk_1.default.green(`✅ Fixed ${fixed.length}
|
|
55
|
+
console.log(chalk_1.default.green(`✅ Fixed ${fixed.length} issue(s):`));
|
|
56
|
+
for (const fix of fixed) {
|
|
57
|
+
const label = fix.startsWith('create-')
|
|
58
|
+
? `Created missing file: ${fix.replace('create-', '')}`
|
|
59
|
+
: fix === 'create-prompts-entry'
|
|
60
|
+
? 'Created initial prompts entry in prompts.md'
|
|
61
|
+
: fix;
|
|
62
|
+
console.log(chalk_1.default.green(` • ${label}`));
|
|
63
|
+
}
|
|
42
64
|
// Re-validate after fixing
|
|
43
65
|
const reResults = await validator.validate(options.dir, {
|
|
44
66
|
fix: false,
|
|
@@ -50,6 +72,24 @@ async function validateCommand(options) {
|
|
|
50
72
|
warnings: reResults.warnings.length,
|
|
51
73
|
mandatesVerified: reResults.mandatesVerified
|
|
52
74
|
} : undefined);
|
|
75
|
+
// Combine: re-validation prompts + any prompts from the files just created
|
|
76
|
+
const allPrompts = [
|
|
77
|
+
...reResults.fixPrompts,
|
|
78
|
+
...prefixPrompts.filter(p => !reResults.fixPrompts.some(r => r.issue === p.issue))
|
|
79
|
+
];
|
|
80
|
+
if (!reResults.isValid) {
|
|
81
|
+
// Phase 2: structure is fixed — only content issues remain, show AI prompts
|
|
82
|
+
if (allPrompts.length > 0) {
|
|
83
|
+
console.log(chalk_1.default.cyan('\n📋 Next step — content guidance for your AI assistant:'));
|
|
84
|
+
displayFixPrompts({ ...reResults, fixPrompts: allPrompts });
|
|
85
|
+
}
|
|
86
|
+
process.exit(1);
|
|
87
|
+
}
|
|
88
|
+
// Re-validation passed — still show fill-in prompts for newly created files
|
|
89
|
+
if (allPrompts.length > 0) {
|
|
90
|
+
console.log(chalk_1.default.cyan('\n📋 Next step — fill in the newly created files:'));
|
|
91
|
+
displayFixPrompts({ ...reResults, fixPrompts: allPrompts });
|
|
92
|
+
}
|
|
53
93
|
}
|
|
54
94
|
else {
|
|
55
95
|
logger.displayValidationResults(false, results.errors, results.warnings, options.verbose ? {
|
|
@@ -58,6 +98,16 @@ async function validateCommand(options) {
|
|
|
58
98
|
warnings: results.warnings.length,
|
|
59
99
|
mandatesVerified: results.mandatesVerified
|
|
60
100
|
} : undefined);
|
|
101
|
+
if (results.fixable.length > 0) {
|
|
102
|
+
// Phase 1: missing files — direct to --fix, suppress AI prompts to avoid confusion
|
|
103
|
+
console.log(chalk_1.default.yellow(`\n💡 ${results.fixable.length} issue(s) can be auto-fixed.`));
|
|
104
|
+
console.log(chalk_1.default.yellow(` Run: specpilot validate --fix`));
|
|
105
|
+
console.log(chalk_1.default.dim(` Once all files are created, re-run validate for content guidance.`));
|
|
106
|
+
}
|
|
107
|
+
else if (results.fixPrompts.length > 0) {
|
|
108
|
+
// Phase 2: all files exist — only content issues remain, show AI prompts
|
|
109
|
+
displayFixPrompts(results);
|
|
110
|
+
}
|
|
61
111
|
process.exit(1);
|
|
62
112
|
}
|
|
63
113
|
}
|