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.
Files changed (48) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +100 -47
  3. package/bin/gspec.js +106 -16
  4. package/commands/gspec.architect.md +333 -0
  5. package/commands/gspec.dor.md +34 -14
  6. package/commands/gspec.epic.md +91 -43
  7. package/commands/gspec.feature.md +82 -27
  8. package/commands/gspec.implement.md +69 -23
  9. package/commands/gspec.migrate.md +115 -0
  10. package/commands/gspec.practices.md +7 -0
  11. package/commands/gspec.profile.md +7 -0
  12. package/commands/gspec.record.md +22 -13
  13. package/commands/gspec.stack.md +7 -0
  14. package/commands/gspec.style.md +38 -3
  15. package/dist/antigravity/gspec-architect/SKILL.md +337 -0
  16. package/dist/antigravity/gspec-dor/SKILL.md +34 -14
  17. package/dist/antigravity/gspec-epic/SKILL.md +91 -43
  18. package/dist/antigravity/gspec-feature/SKILL.md +82 -27
  19. package/dist/antigravity/gspec-implement/SKILL.md +69 -23
  20. package/dist/antigravity/gspec-migrate/SKILL.md +119 -0
  21. package/dist/antigravity/gspec-practices/SKILL.md +7 -0
  22. package/dist/antigravity/gspec-profile/SKILL.md +7 -0
  23. package/dist/antigravity/gspec-record/SKILL.md +22 -13
  24. package/dist/antigravity/gspec-stack/SKILL.md +7 -0
  25. package/dist/antigravity/gspec-style/SKILL.md +38 -3
  26. package/dist/claude/gspec-architect/SKILL.md +338 -0
  27. package/dist/claude/gspec-dor/SKILL.md +34 -14
  28. package/dist/claude/gspec-epic/SKILL.md +91 -43
  29. package/dist/claude/gspec-feature/SKILL.md +82 -27
  30. package/dist/claude/gspec-implement/SKILL.md +69 -23
  31. package/dist/claude/gspec-migrate/SKILL.md +120 -0
  32. package/dist/claude/gspec-practices/SKILL.md +7 -0
  33. package/dist/claude/gspec-profile/SKILL.md +7 -0
  34. package/dist/claude/gspec-record/SKILL.md +22 -13
  35. package/dist/claude/gspec-stack/SKILL.md +7 -0
  36. package/dist/claude/gspec-style/SKILL.md +38 -3
  37. package/dist/cursor/gspec-architect.mdc +336 -0
  38. package/dist/cursor/gspec-dor.mdc +34 -14
  39. package/dist/cursor/gspec-epic.mdc +91 -43
  40. package/dist/cursor/gspec-feature.mdc +82 -27
  41. package/dist/cursor/gspec-implement.mdc +69 -23
  42. package/dist/cursor/gspec-migrate.mdc +118 -0
  43. package/dist/cursor/gspec-practices.mdc +7 -0
  44. package/dist/cursor/gspec-profile.mdc +7 -0
  45. package/dist/cursor/gspec-record.mdc +22 -13
  46. package/dist/cursor/gspec-stack.mdc +7 -0
  47. package/dist/cursor/gspec-style.mdc +38 -3
  48. 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 Commands
1
+ # gspec
2
2
 
3
- This directory contains slash commands for generating project specification documents. Each command produces a standalone Markdown document in the `gspec/` folder.
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 also skip the prompt by passing a target directly:
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
- ## Commands
85
+ That's it. The commands are immediately available in your AI tool.
28
86
 
29
- | Command | Role | Output | Description |
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
- ## Workflow
89
+ All specifications live in a `gspec/` directory at your project root:
42
90
 
43
- ### 1. Fundamentals
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
- Define the foundation that drives how your entire application is built.
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
- - **`gspec.profile`** Define *what* the product is, who it's for, and why it exists
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
- ### 2. Pre-Build
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
- Define *what* to build.
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
- - **`gspec.epic`** Break down a large body of work into multiple feature PRDs with dependencies and phasing
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
- ### 3. Build
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
- - **`gspec.implement`** Implement the software using all generated gspec documents
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
- ### 4. Iterate
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
- - **`gspec.dor`** — Make code changes and update gspec specs to keep documentation in sync
66
- - **`gspec.record`** — Record decisions, changes, or context to gspec specs without touching code
122
+ ## Supported Platforms
67
123
 
68
- > Each command is self-contained and will ask clarifying questions when essential information is missing.
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
- ## Output Structure
130
+ ## Project Status
71
131
 
72
- ```
73
- project-root/
74
- └── gspec/
75
- ├── profile.md
76
- ├── style.md
77
- ├── stack.md
78
- ├── practices.md
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('║')} ${chalk.cyan('║')}
16
- ${chalk.cyan('║')} ${chalk.bold.white(' ██████ ███████ ██████ ███████ ██████')} ${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.cyan('║')}
22
- ${chalk.cyan('║')} ${chalk.dim('AI-powered project specification tools')} ${chalk.cyan('║')}
23
- ${chalk.cyan('║')} ${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 { /* doesn't exist */ }
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 { /* doesn't exist */ }
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('1.0.0')
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();