gspec 1.17.0 → 1.17.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.
@@ -0,0 +1,104 @@
1
+ import { mkdir, writeFile } from 'node:fs/promises';
2
+ import { join } from 'node:path';
3
+
4
+ // Placeholder pattern used in generic command files
5
+ export const PLACEHOLDER_RE = /<<<\w+>>>/g;
6
+
7
+ export function buildFrontmatter(fields) {
8
+ const lines = ['---'];
9
+ for (const [key, value] of Object.entries(fields)) {
10
+ lines.push(`${key}: ${value}`);
11
+ }
12
+ lines.push('---');
13
+ return lines.join('\n');
14
+ }
15
+
16
+ // Platform target definitions: how to emit a skill file for each AI tool.
17
+ // Used by both `scripts/build.js` (writing to dist/) and `bin/gspec.js`
18
+ // (writing user-installed extensions directly to a project's install dir).
19
+ export const TARGETS = {
20
+ claude: {
21
+ label: 'Claude Code',
22
+ distSubdir: 'claude',
23
+ installDir: '.claude/skills',
24
+ layout: 'directory',
25
+ // .claude/skills/<name>/SKILL.md
26
+ async emit(outDir, content, meta) {
27
+ const frontmatter = buildFrontmatter({
28
+ name: meta.name,
29
+ description: meta.description,
30
+ });
31
+ const body = content.replace(PLACEHOLDER_RE, '$ARGUMENTS');
32
+ const skillDir = join(outDir, meta.name);
33
+ await mkdir(skillDir, { recursive: true });
34
+ await writeFile(join(skillDir, 'SKILL.md'), frontmatter + '\n\n' + body, 'utf-8');
35
+ },
36
+ },
37
+ cursor: {
38
+ label: 'Cursor',
39
+ distSubdir: 'cursor',
40
+ installDir: '.cursor/commands',
41
+ layout: 'flat',
42
+ // .cursor/commands/<name>.mdc (flat file)
43
+ async emit(outDir, content, meta) {
44
+ const frontmatter = buildFrontmatter({
45
+ description: meta.description,
46
+ });
47
+ // Cursor has no $ARGUMENTS convention; strip the placeholder lines
48
+ const body = content.replace(/^.*<<<\w+>>>.*$\n?/gm, '');
49
+ await mkdir(outDir, { recursive: true });
50
+ await writeFile(join(outDir, `${meta.name}.mdc`), frontmatter + '\n\n' + body, 'utf-8');
51
+ },
52
+ },
53
+ antigravity: {
54
+ label: 'Antigravity',
55
+ distSubdir: 'antigravity',
56
+ installDir: '.agent/skills',
57
+ layout: 'directory',
58
+ // .agent/skills/<name>/SKILL.md
59
+ async emit(outDir, content, meta) {
60
+ const frontmatter = buildFrontmatter({
61
+ name: meta.name,
62
+ description: meta.description,
63
+ });
64
+ const body = content.replace(/^.*<<<\w+>>>.*$\n?/gm, '');
65
+ const skillDir = join(outDir, meta.name);
66
+ await mkdir(skillDir, { recursive: true });
67
+ await writeFile(join(skillDir, 'SKILL.md'), frontmatter + '\n\n' + body, 'utf-8');
68
+ },
69
+ },
70
+ codex: {
71
+ label: 'Codex',
72
+ distSubdir: 'codex',
73
+ installDir: '.agents/skills',
74
+ layout: 'directory',
75
+ // .agents/skills/<name>/SKILL.md
76
+ async emit(outDir, content, meta) {
77
+ const frontmatter = buildFrontmatter({
78
+ name: meta.name,
79
+ description: meta.description,
80
+ });
81
+ const body = content.replace(/^.*<<<\w+>>>.*$\n?/gm, '');
82
+ const skillDir = join(outDir, meta.name);
83
+ await mkdir(skillDir, { recursive: true });
84
+ await writeFile(join(skillDir, 'SKILL.md'), frontmatter + '\n\n' + body, 'utf-8');
85
+ },
86
+ },
87
+ opencode: {
88
+ label: 'Open Code',
89
+ distSubdir: 'opencode',
90
+ installDir: '.opencode/skills',
91
+ layout: 'directory',
92
+ // .opencode/skills/<name>/SKILL.md
93
+ async emit(outDir, content, meta) {
94
+ const frontmatter = buildFrontmatter({
95
+ name: meta.name,
96
+ description: meta.description,
97
+ });
98
+ const body = content.replace(/^.*<<<\w+>>>.*$\n?/gm, '');
99
+ const skillDir = join(outDir, meta.name);
100
+ await mkdir(skillDir, { recursive: true });
101
+ await writeFile(join(skillDir, 'SKILL.md'), frontmatter + '\n\n' + body, 'utf-8');
102
+ },
103
+ },
104
+ };
package/bin/gspec.js CHANGED
@@ -7,7 +7,7 @@ import { homedir } from 'node:os';
7
7
  import { fileURLToPath } from 'node:url';
8
8
  import { createInterface } from 'node:readline';
9
9
  import chalk from 'chalk';
10
- import { TARGETS as EMITTER_TARGETS } from '../scripts/emitters.js';
10
+ import { TARGETS as EMITTER_TARGETS } from './emitters.js';
11
11
 
12
12
  const __dirname = dirname(fileURLToPath(import.meta.url));
13
13
  const DIST_DIR = join(__dirname, '..', 'dist');
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gspec",
3
- "version": "1.17.0",
3
+ "version": "1.17.1",
4
4
  "description": "Install gspec specification commands for Claude Code, Cursor, and other AI tools",
5
5
  "main": "bin/gspec.js",
6
6
  "type": "module",