gspec 1.0.1 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +100 -47
- package/bin/gspec.js +106 -16
- package/commands/gspec.architect.md +333 -0
- package/commands/gspec.dor.md +34 -14
- package/commands/gspec.epic.md +91 -43
- package/commands/gspec.feature.md +82 -27
- package/commands/gspec.implement.md +69 -23
- package/commands/gspec.migrate.md +115 -0
- package/commands/gspec.practices.md +7 -0
- package/commands/gspec.profile.md +7 -0
- package/commands/gspec.record.md +22 -13
- package/commands/gspec.stack.md +7 -0
- package/commands/gspec.style.md +38 -3
- package/dist/antigravity/gspec-architect/SKILL.md +337 -0
- package/dist/antigravity/gspec-dor/SKILL.md +34 -14
- package/dist/antigravity/gspec-epic/SKILL.md +91 -43
- package/dist/antigravity/gspec-feature/SKILL.md +82 -27
- package/dist/antigravity/gspec-implement/SKILL.md +69 -23
- package/dist/antigravity/gspec-migrate/SKILL.md +119 -0
- package/dist/antigravity/gspec-practices/SKILL.md +7 -0
- package/dist/antigravity/gspec-profile/SKILL.md +7 -0
- package/dist/antigravity/gspec-record/SKILL.md +22 -13
- package/dist/antigravity/gspec-stack/SKILL.md +7 -0
- package/dist/antigravity/gspec-style/SKILL.md +38 -3
- package/dist/claude/gspec-architect/SKILL.md +338 -0
- package/dist/claude/gspec-dor/SKILL.md +34 -14
- package/dist/claude/gspec-epic/SKILL.md +91 -43
- package/dist/claude/gspec-feature/SKILL.md +82 -27
- package/dist/claude/gspec-implement/SKILL.md +69 -23
- package/dist/claude/gspec-migrate/SKILL.md +120 -0
- package/dist/claude/gspec-practices/SKILL.md +7 -0
- package/dist/claude/gspec-profile/SKILL.md +7 -0
- package/dist/claude/gspec-record/SKILL.md +22 -13
- package/dist/claude/gspec-stack/SKILL.md +7 -0
- package/dist/claude/gspec-style/SKILL.md +38 -3
- package/dist/cursor/gspec-architect.mdc +336 -0
- package/dist/cursor/gspec-dor.mdc +34 -14
- package/dist/cursor/gspec-epic.mdc +91 -43
- package/dist/cursor/gspec-feature.mdc +82 -27
- package/dist/cursor/gspec-implement.mdc +69 -23
- package/dist/cursor/gspec-migrate.mdc +118 -0
- package/dist/cursor/gspec-practices.mdc +7 -0
- package/dist/cursor/gspec-profile.mdc +7 -0
- package/dist/cursor/gspec-record.mdc +22 -13
- package/dist/cursor/gspec-stack.mdc +7 -0
- package/dist/cursor/gspec-style.mdc +38 -3
- package/package.json +6 -3
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Baller Software
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,6 +1,62 @@
|
|
|
1
|
-
# gspec
|
|
1
|
+
# gspec
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
**Structured product specifications for AI-assisted development.**
|
|
4
|
+
|
|
5
|
+
AI coding tools are powerful, but they build better software when they understand *what* you're building and *why*. gspec gives your AI tools that context — a set of living specification documents that define your product, guide implementation, and stay in sync as your project evolves.
|
|
6
|
+
|
|
7
|
+
Without structured context, AI tools guess. They make assumptions about your audience, your tech stack, your design language, and your quality standards. gspec eliminates that guesswork by creating a shared specification layer that any AI coding tool can read and follow.
|
|
8
|
+
|
|
9
|
+
## The Problem
|
|
10
|
+
|
|
11
|
+
Two things go wrong when building with AI:
|
|
12
|
+
|
|
13
|
+
1. **AI tools lack product context.** They don't know your target audience, your design system, your architectural decisions, or your engineering standards. Every prompt starts from zero.
|
|
14
|
+
2. **Specs drift from reality.** Even when you write great specs upfront, they fall out of sync as the project evolves — leading to inconsistency, rework, and compounding confusion.
|
|
15
|
+
|
|
16
|
+
gspec solves both problems. It provides a structured specification workflow that gives AI tools rich context, and keeps that context accurate as your codebase changes.
|
|
17
|
+
|
|
18
|
+
## How It Works
|
|
19
|
+
|
|
20
|
+
gspec installs as a set of slash commands (skills) in your AI coding tool. Each command plays a specific role — business strategist, product manager, architect, designer, engineer — and produces a structured Markdown document in your project's `gspec/` directory.
|
|
21
|
+
|
|
22
|
+
These documents become the shared context for all subsequent AI interactions. When you implement features, your AI reads the specs. When the code changes, the specs update to match.
|
|
23
|
+
|
|
24
|
+
### The Workflow
|
|
25
|
+
|
|
26
|
+
```
|
|
27
|
+
Define → Specify → Build → Iterate
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
**1. Define the Fundamentals** — Establish the foundation that drives every decision.
|
|
31
|
+
|
|
32
|
+
| Command | Role | What it produces |
|
|
33
|
+
|---|---|---|
|
|
34
|
+
| `gspec.profile` | Business Strategist | Product identity, audience, value proposition, positioning |
|
|
35
|
+
| `gspec.style` | UI/UX Designer | Visual design language, design tokens, component patterns |
|
|
36
|
+
| `gspec.stack` | Software Architect | Technology stack, frameworks, infrastructure, architecture |
|
|
37
|
+
| `gspec.practices` | Engineering Lead | Development standards, code quality, testing, workflows |
|
|
38
|
+
|
|
39
|
+
**2. Specify What to Build** — Define features and requirements.
|
|
40
|
+
|
|
41
|
+
| Command | Role | What it produces |
|
|
42
|
+
|---|---|---|
|
|
43
|
+
| `gspec.feature` | Product Manager | PRD for a single feature with prioritized capabilities |
|
|
44
|
+
| `gspec.epic` | Product Manager | Breaks a large epic into multiple feature PRDs with dependency mapping |
|
|
45
|
+
|
|
46
|
+
**3. Build** — Implement with full context.
|
|
47
|
+
|
|
48
|
+
| Command | Role | What it does |
|
|
49
|
+
|---|---|---|
|
|
50
|
+
| `gspec.implement` | Senior Engineer | Reads all specs, identifies gaps, researches competitors, plans and builds |
|
|
51
|
+
|
|
52
|
+
**4. Iterate** — Keep specs and code in sync as the project evolves.
|
|
53
|
+
|
|
54
|
+
| Command | Role | What it does |
|
|
55
|
+
|---|---|---|
|
|
56
|
+
| `gspec.dor` | Engineer + Doc Lead | Makes code changes and updates specs to match |
|
|
57
|
+
| `gspec.record` | Doc Lead | Updates specs to reflect decisions or changes — no code modifications |
|
|
58
|
+
|
|
59
|
+
Each command is self-contained and will ask clarifying questions when essential information is missing.
|
|
4
60
|
|
|
5
61
|
## Installation
|
|
6
62
|
|
|
@@ -18,68 +74,65 @@ The CLI will ask which platform you're installing for:
|
|
|
18
74
|
| Cursor | `.cursor/commands/` |
|
|
19
75
|
| Antigravity | `.agent/skills/` |
|
|
20
76
|
|
|
21
|
-
You can
|
|
77
|
+
You can skip the prompt by passing a target directly:
|
|
22
78
|
|
|
23
79
|
```bash
|
|
80
|
+
npx gspec --target claude
|
|
24
81
|
npx gspec --target cursor
|
|
82
|
+
npx gspec --target antigravity
|
|
25
83
|
```
|
|
26
84
|
|
|
27
|
-
|
|
85
|
+
That's it. The commands are immediately available in your AI tool.
|
|
28
86
|
|
|
29
|
-
|
|
30
|
-
|---|---|---|---|
|
|
31
|
-
| `gspec.profile` | Business Strategist | `gspec/profile.md` | Product identity, audience, value proposition, and positioning |
|
|
32
|
-
| `gspec.feature` | Product Manager | `gspec/features/<name>.md` | Product Requirements Document (PRD) for a specific feature |
|
|
33
|
-
| `gspec.epic` | Product Manager | `gspec/epics/<name>.md` + `gspec/features/*.md` | Breaks down a large epic into multiple focused feature PRDs with dependency mapping and phasing |
|
|
34
|
-
| `gspec.style` | UI/UX Designer | `gspec/style.md` | Visual style guide, design tokens, and component patterns |
|
|
35
|
-
| `gspec.stack` | Software Architect | `gspec/stack.md` | Technology stack, frameworks, infrastructure, and tooling |
|
|
36
|
-
| `gspec.practices` | Engineering Lead | `gspec/practices.md` | Development practices, code quality standards, and workflows |
|
|
37
|
-
| `gspec.implement` | Senior Engineer / Tech Lead | Code files | Reads gspec docs, identifies gaps, plans and builds the software |
|
|
38
|
-
| `gspec.dor` | Engineer + Doc Lead | Code files + `gspec/*.md` | Makes code changes and updates gspec specs to keep documentation in sync |
|
|
39
|
-
| `gspec.record` | Doc Lead | `gspec/*.md` | Updates gspec specs to reflect changes, decisions, or context — no code changes |
|
|
87
|
+
## Output Structure
|
|
40
88
|
|
|
41
|
-
|
|
89
|
+
All specifications live in a `gspec/` directory at your project root:
|
|
42
90
|
|
|
43
|
-
|
|
91
|
+
```
|
|
92
|
+
project-root/
|
|
93
|
+
└── gspec/
|
|
94
|
+
├── profile.md # Product identity and positioning
|
|
95
|
+
├── style.md # Visual design language
|
|
96
|
+
├── stack.md # Technology stack and architecture
|
|
97
|
+
├── practices.md # Development standards
|
|
98
|
+
├── epics/
|
|
99
|
+
│ └── onboarding-flow.md
|
|
100
|
+
└── features/
|
|
101
|
+
├── user-authentication.md
|
|
102
|
+
├── dashboard-analytics.md
|
|
103
|
+
└── ...
|
|
104
|
+
```
|
|
44
105
|
|
|
45
|
-
|
|
106
|
+
These are standard Markdown files. They live in your repo, are version-controlled with your code, and are readable by both humans and AI tools.
|
|
46
107
|
|
|
47
|
-
|
|
48
|
-
- **`gspec.style`** — Define the visual design language and design system
|
|
49
|
-
- **`gspec.stack`** — Define the technology choices and architecture
|
|
50
|
-
- **`gspec.practices`** — Define the development standards and engineering practices
|
|
108
|
+
## Key Design Decisions
|
|
51
109
|
|
|
52
|
-
|
|
110
|
+
**Spec-first development.** Every implementation decision traces back to a specification. AI tools don't guess — they follow documented decisions about your product, stack, design, and standards.
|
|
53
111
|
|
|
54
|
-
|
|
112
|
+
**Living documents.** Specifications aren't write-once artifacts. The `dor` and `record` commands keep them in sync as your project evolves, so they remain a reliable source of truth.
|
|
55
113
|
|
|
56
|
-
-
|
|
57
|
-
- **`gspec.feature`** — Define individual features and requirements (run once per feature)
|
|
114
|
+
**Role-based commands.** Each command adopts a specific professional perspective — product manager, architect, designer, engineer. This ensures specifications are comprehensive and consider multiple viewpoints.
|
|
58
115
|
|
|
59
|
-
|
|
116
|
+
**Incremental implementation.** Feature PRDs use checkboxes to track which capabilities have been built. The `implement` command reads these to know what's done and what's remaining, so it can be run multiple times as your project grows.
|
|
60
117
|
|
|
61
|
-
|
|
118
|
+
**Competitive research.** The `implement` command can optionally research competitors named in your product profile, identifying table-stakes features you might be missing and opportunities for differentiation.
|
|
62
119
|
|
|
63
|
-
|
|
120
|
+
**Platform-agnostic.** A single set of source commands builds for Claude Code, Cursor, and Antigravity. The build system handles platform-specific formatting so the commands stay consistent across tools.
|
|
64
121
|
|
|
65
|
-
|
|
66
|
-
- **`gspec.record`** — Record decisions, changes, or context to gspec specs without touching code
|
|
122
|
+
## Supported Platforms
|
|
67
123
|
|
|
68
|
-
|
|
124
|
+
| Platform | Version | Status |
|
|
125
|
+
|---|---|---|
|
|
126
|
+
| [Claude Code](https://docs.anthropic.com/en/docs/claude-code) | Skills format | Supported |
|
|
127
|
+
| [Cursor](https://www.cursor.com/) | Commands format | Supported |
|
|
128
|
+
| [Antigravity](https://www.antigravity.dev/) | Skills format | Supported |
|
|
69
129
|
|
|
70
|
-
##
|
|
130
|
+
## Project Status
|
|
71
131
|
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
├── epics/
|
|
80
|
-
│ └── onboarding-flow.md
|
|
81
|
-
└── features/
|
|
82
|
-
├── user-authentication.md
|
|
83
|
-
├── dashboard-analytics.md
|
|
84
|
-
└── ...
|
|
85
|
-
```
|
|
132
|
+
gspec is early-stage and actively evolving. The core workflow is stable, but commands and output formats may change as AI tool capabilities expand and user feedback comes in.
|
|
133
|
+
|
|
134
|
+
If you run into issues or have ideas, please [open an issue](https://github.com/gballer77/gspec/issues).
|
|
135
|
+
|
|
136
|
+
## License
|
|
137
|
+
|
|
138
|
+
[MIT](LICENSE)
|
package/bin/gspec.js
CHANGED
|
@@ -9,19 +9,21 @@ import chalk from 'chalk';
|
|
|
9
9
|
|
|
10
10
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
11
11
|
const DIST_DIR = join(__dirname, '..', 'dist');
|
|
12
|
+
const pkg = JSON.parse(await readFile(join(__dirname, '..', 'package.json'), 'utf-8'));
|
|
12
13
|
|
|
13
14
|
const BANNER = `
|
|
14
|
-
${chalk.cyan('
|
|
15
|
-
${chalk.cyan('║')}
|
|
16
|
-
${chalk.cyan('║')} ${chalk.bold.white(' ██████ ███████ ██████ ███████ ██████')}
|
|
17
|
-
${chalk.cyan('║')} ${chalk.bold.white('██ ██ ██ ██ ██ ██ ')}
|
|
18
|
-
${chalk.cyan('║')} ${chalk.bold.white('██ ███ ███████ ██████ █████ ██ ')}
|
|
19
|
-
${chalk.cyan('║')} ${chalk.bold.white('██ ██ ██ ██ ██ ██ ')}
|
|
20
|
-
${chalk.cyan('║')} ${chalk.bold.white(' ██████ ███████ ██ ███████ ██████')}
|
|
21
|
-
${chalk.cyan('║')}
|
|
22
|
-
${chalk.cyan('║')}
|
|
23
|
-
${chalk.cyan('║')}
|
|
24
|
-
${chalk.cyan('
|
|
15
|
+
${chalk.cyan('╔══════════════════════════════════════════════╗')}
|
|
16
|
+
${chalk.cyan('║')} ${chalk.cyan('║')}
|
|
17
|
+
${chalk.cyan('║')} ${chalk.bold.white(' ██████ ███████ ██████ ███████ ██████')} ${chalk.cyan('║')}
|
|
18
|
+
${chalk.cyan('║')} ${chalk.bold.white('██ ██ ██ ██ ██ ██ ')} ${chalk.cyan('║')}
|
|
19
|
+
${chalk.cyan('║')} ${chalk.bold.white('██ ███ ███████ ██████ █████ ██ ')} ${chalk.cyan('║')}
|
|
20
|
+
${chalk.cyan('║')} ${chalk.bold.white('██ ██ ██ ██ ██ ██ ')} ${chalk.cyan('║')}
|
|
21
|
+
${chalk.cyan('║')} ${chalk.bold.white(' ██████ ███████ ██ ███████ ██████')} ${chalk.cyan('║')}
|
|
22
|
+
${chalk.cyan('║')} ${chalk.cyan('║')}
|
|
23
|
+
${chalk.cyan('║')} ${chalk.dim('AI-powered project specification tools')} ${chalk.cyan('║')}
|
|
24
|
+
${chalk.cyan('║')} ${chalk.cyan('║')}
|
|
25
|
+
${chalk.cyan('╚══════════════════════════════════════════════╝')}
|
|
26
|
+
${chalk.white('═════════════════════════════baller.software═══')}
|
|
25
27
|
`;
|
|
26
28
|
|
|
27
29
|
const TARGETS = {
|
|
@@ -96,8 +98,9 @@ async function findExistingFiles(target, cwd) {
|
|
|
96
98
|
|
|
97
99
|
try {
|
|
98
100
|
await stat(destBase);
|
|
99
|
-
} catch {
|
|
100
|
-
return existing;
|
|
101
|
+
} catch (e) {
|
|
102
|
+
if (e.code === 'ENOENT') return existing;
|
|
103
|
+
throw e;
|
|
101
104
|
}
|
|
102
105
|
|
|
103
106
|
if (target.layout === 'flat') {
|
|
@@ -106,7 +109,9 @@ async function findExistingFiles(target, cwd) {
|
|
|
106
109
|
try {
|
|
107
110
|
await stat(join(destBase, file));
|
|
108
111
|
existing.push(file);
|
|
109
|
-
} catch {
|
|
112
|
+
} catch (e) {
|
|
113
|
+
if (e.code !== 'ENOENT') throw e;
|
|
114
|
+
}
|
|
110
115
|
}
|
|
111
116
|
} else {
|
|
112
117
|
const srcEntries = await readdir(target.sourceDir);
|
|
@@ -116,7 +121,9 @@ async function findExistingFiles(target, cwd) {
|
|
|
116
121
|
try {
|
|
117
122
|
await stat(join(destBase, entry, 'SKILL.md'));
|
|
118
123
|
existing.push(`${entry}/SKILL.md`);
|
|
119
|
-
} catch {
|
|
124
|
+
} catch (e) {
|
|
125
|
+
if (e.code !== 'ENOENT') throw e;
|
|
126
|
+
}
|
|
120
127
|
}
|
|
121
128
|
}
|
|
122
129
|
|
|
@@ -204,10 +211,92 @@ async function install(targetName, cwd) {
|
|
|
204
211
|
console.log(chalk.bold(`\n${count} skills installed to ${target.installDir}/\n`));
|
|
205
212
|
}
|
|
206
213
|
|
|
214
|
+
const MIGRATE_COMMANDS = {
|
|
215
|
+
claude: '/gspec-migrate',
|
|
216
|
+
cursor: '/gspec-migrate',
|
|
217
|
+
antigravity: '/gspec-migrate',
|
|
218
|
+
};
|
|
219
|
+
|
|
220
|
+
function parseGspecVersion(content) {
|
|
221
|
+
const match = content.match(/^---\n([\s\S]*?)\n---/);
|
|
222
|
+
if (!match) return null;
|
|
223
|
+
const versionMatch = match[1].match(/^gspec-version:\s*(.+)$/m);
|
|
224
|
+
return versionMatch ? versionMatch[1].trim() : null;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
async function collectGspecFiles(gspecDir) {
|
|
228
|
+
const files = [];
|
|
229
|
+
|
|
230
|
+
const topEntries = await readdir(gspecDir);
|
|
231
|
+
for (const entry of topEntries) {
|
|
232
|
+
if (entry.endsWith('.md')) {
|
|
233
|
+
files.push({ path: join(gspecDir, entry), label: `gspec/${entry}` });
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
for (const subdir of ['features', 'epics']) {
|
|
238
|
+
try {
|
|
239
|
+
const entries = await readdir(join(gspecDir, subdir));
|
|
240
|
+
for (const entry of entries) {
|
|
241
|
+
if (entry.endsWith('.md')) {
|
|
242
|
+
files.push({ path: join(gspecDir, subdir, entry), label: `gspec/${subdir}/${entry}` });
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
} catch (e) {
|
|
246
|
+
if (e.code !== 'ENOENT') throw e;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
return files;
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
async function checkGspecFiles(cwd, targetName) {
|
|
254
|
+
const gspecDir = join(cwd, 'gspec');
|
|
255
|
+
|
|
256
|
+
try {
|
|
257
|
+
await stat(gspecDir);
|
|
258
|
+
} catch (e) {
|
|
259
|
+
if (e.code === 'ENOENT') return;
|
|
260
|
+
throw e;
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
const files = await collectGspecFiles(gspecDir);
|
|
264
|
+
if (files.length === 0) return;
|
|
265
|
+
|
|
266
|
+
const outdated = [];
|
|
267
|
+
for (const file of files) {
|
|
268
|
+
const content = await readFile(file.path, 'utf-8');
|
|
269
|
+
const version = parseGspecVersion(content);
|
|
270
|
+
if (version === pkg.version) continue;
|
|
271
|
+
outdated.push({
|
|
272
|
+
label: file.label,
|
|
273
|
+
version,
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
if (outdated.length === 0) return;
|
|
278
|
+
|
|
279
|
+
console.log(chalk.yellow(` Found existing gspec files that may need updating:\n`));
|
|
280
|
+
for (const file of outdated) {
|
|
281
|
+
const status = file.version
|
|
282
|
+
? `version ${file.version} (current: ${pkg.version})`
|
|
283
|
+
: `no version (pre-${pkg.version})`;
|
|
284
|
+
console.log(` ${chalk.yellow('!')} ${file.label} — ${status}`);
|
|
285
|
+
}
|
|
286
|
+
console.log();
|
|
287
|
+
|
|
288
|
+
const confirmed = await promptConfirm(chalk.bold(' Update existing gspec files to the current format? [y/N]: '));
|
|
289
|
+
if (!confirmed) return;
|
|
290
|
+
|
|
291
|
+
const cmd = MIGRATE_COMMANDS[targetName] || '/gspec-migrate';
|
|
292
|
+
console.log(chalk.bold(`\n To update your files, run the following command in ${TARGETS[targetName].label}:\n`));
|
|
293
|
+
console.log(` ${chalk.cyan(cmd)}\n`);
|
|
294
|
+
}
|
|
295
|
+
|
|
207
296
|
program
|
|
208
297
|
.name('gspec')
|
|
209
298
|
.description('Install gspec specification commands')
|
|
210
|
-
.version(
|
|
299
|
+
.version(pkg.version)
|
|
211
300
|
.option('-t, --target <target>', 'target platform (claude, cursor, antigravity)')
|
|
212
301
|
.action(async (opts) => {
|
|
213
302
|
console.log(BANNER);
|
|
@@ -219,6 +308,7 @@ program
|
|
|
219
308
|
}
|
|
220
309
|
|
|
221
310
|
await install(targetName, process.cwd());
|
|
311
|
+
await checkGspecFiles(process.cwd(), targetName);
|
|
222
312
|
});
|
|
223
313
|
|
|
224
314
|
program.parse();
|