grg-kit-cli 0.4.0 → 0.6.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/README.md +34 -25
- package/bin/grg.js +7 -7
- package/commands/init.js +46 -21
- package/commands/{llm-prompts.js → llm-setup.js} +214 -8
- package/package.json +7 -6
- package/scripts/generate-resources.js +0 -0
package/README.md
CHANGED
|
@@ -11,14 +11,17 @@ pnpm install -g grg-kit-cli
|
|
|
11
11
|
## Quick Start
|
|
12
12
|
|
|
13
13
|
```bash
|
|
14
|
-
#
|
|
15
|
-
|
|
14
|
+
# Create Angular project first
|
|
15
|
+
ng new my-app --style=css
|
|
16
|
+
cd my-app
|
|
16
17
|
|
|
17
|
-
# Initialize
|
|
18
|
-
grg init
|
|
18
|
+
# Initialize GRG Kit in the project
|
|
19
|
+
grg init
|
|
19
20
|
|
|
20
|
-
#
|
|
21
|
-
|
|
21
|
+
# Or with a specific theme
|
|
22
|
+
grg init --theme claude
|
|
23
|
+
|
|
24
|
+
# Add blocks
|
|
22
25
|
grg add block --auth
|
|
23
26
|
grg add block --shell
|
|
24
27
|
grg add block --all
|
|
@@ -31,24 +34,27 @@ grg list themes
|
|
|
31
34
|
|
|
32
35
|
## Commands
|
|
33
36
|
|
|
34
|
-
### `grg init
|
|
37
|
+
### `grg init`
|
|
35
38
|
|
|
36
|
-
|
|
39
|
+
Initialize GRG Kit in an existing Angular project.
|
|
37
40
|
|
|
38
41
|
```bash
|
|
39
|
-
grg init
|
|
42
|
+
grg init [options]
|
|
40
43
|
|
|
41
44
|
Options:
|
|
42
45
|
-t, --theme <name> Theme to install (default: "grg-theme")
|
|
43
46
|
|
|
44
47
|
Examples:
|
|
45
|
-
grg init
|
|
46
|
-
grg init
|
|
47
|
-
grg init
|
|
48
|
+
grg init
|
|
49
|
+
grg init --theme claude
|
|
50
|
+
grg init -t modern-minimal
|
|
48
51
|
```
|
|
49
52
|
|
|
53
|
+
**Prerequisites:**
|
|
54
|
+
- Must be run inside an existing Angular project (with `angular.json`)
|
|
55
|
+
- Create one with: `ng new my-app --style=css`
|
|
56
|
+
|
|
50
57
|
**What it does:**
|
|
51
|
-
- Creates Angular project with CSS styling
|
|
52
58
|
- Installs Tailwind CSS v4 (`tailwindcss @tailwindcss/postcss postcss`)
|
|
53
59
|
- Creates `.postcssrc.json` with PostCSS configuration
|
|
54
60
|
- Installs and configures Spartan-NG CLI
|
|
@@ -98,19 +104,19 @@ Examples:
|
|
|
98
104
|
grg list themes # List all themes
|
|
99
105
|
```
|
|
100
106
|
|
|
101
|
-
### `grg llm-
|
|
107
|
+
### `grg llm-setup`
|
|
102
108
|
|
|
103
109
|
Generate LLM-specific prompts and rules for AI assistants (Windsurf, Cursor, etc.).
|
|
104
110
|
|
|
105
111
|
```bash
|
|
106
|
-
grg llm-
|
|
112
|
+
grg llm-setup [options]
|
|
107
113
|
|
|
108
114
|
Options:
|
|
109
115
|
-o, --output <path> Output directory for rules (default: ".windsurf/rules")
|
|
110
116
|
|
|
111
117
|
Examples:
|
|
112
|
-
grg llm-
|
|
113
|
-
grg llm-
|
|
118
|
+
grg llm-setup # Windsurf (multiple .md files)
|
|
119
|
+
grg llm-setup --output .claude # Claude Code (single CLAUDE.md)
|
|
114
120
|
```
|
|
115
121
|
|
|
116
122
|
## MCP Server Integration
|
|
@@ -137,7 +143,7 @@ pnpm install -g @grg-kit/mcp-server
|
|
|
137
143
|
}
|
|
138
144
|
```
|
|
139
145
|
|
|
140
|
-
**
|
|
146
|
+
**Claude Code** (`~/.claude/settings.json`):
|
|
141
147
|
|
|
142
148
|
```json
|
|
143
149
|
{
|
|
@@ -153,7 +159,7 @@ pnpm install -g @grg-kit/mcp-server
|
|
|
153
159
|
|
|
154
160
|
```bash
|
|
155
161
|
cd your-angular-project
|
|
156
|
-
grg llm-
|
|
162
|
+
grg llm-setup
|
|
157
163
|
```
|
|
158
164
|
|
|
159
165
|
### 4. Restart Your IDE
|
|
@@ -167,12 +173,15 @@ grg llm-prompts
|
|
|
167
173
|
## Quick Reference
|
|
168
174
|
|
|
169
175
|
```bash
|
|
170
|
-
#
|
|
171
|
-
|
|
172
|
-
grg init my-app --theme claude # Custom theme
|
|
173
|
-
|
|
174
|
-
# Add blocks (inside project directory)
|
|
176
|
+
# Create Angular project first
|
|
177
|
+
ng new my-app --style=css
|
|
175
178
|
cd my-app
|
|
179
|
+
|
|
180
|
+
# Initialize GRG Kit
|
|
181
|
+
grg init # Default theme
|
|
182
|
+
grg init --theme claude # Custom theme
|
|
183
|
+
|
|
184
|
+
# Add blocks
|
|
176
185
|
grg add block --auth # Auth pages
|
|
177
186
|
grg add block --shell # App shell
|
|
178
187
|
grg add block --settings # Settings page
|
|
@@ -185,7 +194,7 @@ grg list blocks # Available blocks
|
|
|
185
194
|
grg list themes # Available themes
|
|
186
195
|
|
|
187
196
|
# AI setup
|
|
188
|
-
grg llm-
|
|
197
|
+
grg llm-setup # Generate AI rules
|
|
189
198
|
```
|
|
190
199
|
|
|
191
200
|
## License
|
package/bin/grg.js
CHANGED
|
@@ -4,19 +4,19 @@ const { Command } = require('commander');
|
|
|
4
4
|
const { add } = require('../commands/add');
|
|
5
5
|
const { list } = require('../commands/list');
|
|
6
6
|
const { init } = require('../commands/init');
|
|
7
|
-
const { llmPrompts } = require('../commands/llm-
|
|
7
|
+
const { llmPrompts } = require('../commands/llm-setup');
|
|
8
8
|
|
|
9
9
|
const program = new Command();
|
|
10
10
|
|
|
11
11
|
program
|
|
12
12
|
.name('grg')
|
|
13
13
|
.description('GRG Kit CLI - Initialize your Angular project with GRG Kit components and add blocks')
|
|
14
|
-
.version('0.
|
|
14
|
+
.version('0.5.0');
|
|
15
15
|
|
|
16
|
-
// Init command - sets up
|
|
16
|
+
// Init command - sets up GRG Kit in existing Angular project
|
|
17
17
|
program
|
|
18
|
-
.command('init
|
|
19
|
-
.description('Initialize GRG Kit
|
|
18
|
+
.command('init')
|
|
19
|
+
.description('Initialize GRG Kit in current Angular project: installs Tailwind CSS v4, Spartan-NG, theme, and examples')
|
|
20
20
|
.option('-t, --theme <name>', 'Theme to install (grg-theme, claude, clean-slate, modern-minimal, amber-minimal, mocks)', 'grg-theme')
|
|
21
21
|
.action(init);
|
|
22
22
|
|
|
@@ -39,9 +39,9 @@ program
|
|
|
39
39
|
.description('List available blocks and components')
|
|
40
40
|
.action(list);
|
|
41
41
|
|
|
42
|
-
// LLM
|
|
42
|
+
// LLM Setup command
|
|
43
43
|
program
|
|
44
|
-
.command('llm-
|
|
44
|
+
.command('llm-setup')
|
|
45
45
|
.description('Generate LLM-specific prompts and rules for AI assistants (Windsurf, Cursor, etc.)')
|
|
46
46
|
.option('-o, --output <path>', 'Output directory for rules', '.windsurf/rules')
|
|
47
47
|
.action(llmPrompts);
|
package/commands/init.js
CHANGED
|
@@ -10,10 +10,12 @@ const { RESOURCES, REPO } = require('../config/resources');
|
|
|
10
10
|
const execAsync = promisify(exec);
|
|
11
11
|
|
|
12
12
|
/**
|
|
13
|
-
* Init command - initializes GRG Kit in
|
|
14
|
-
*
|
|
13
|
+
* Init command - initializes GRG Kit in an existing Angular project
|
|
14
|
+
* Installs Tailwind CSS v4, runs spartan-ng ui, downloads theme
|
|
15
|
+
*
|
|
16
|
+
* Prerequisites: Must be run inside an existing Angular project directory
|
|
15
17
|
*/
|
|
16
|
-
async function init(
|
|
18
|
+
async function init(options) {
|
|
17
19
|
const themeName = options.theme || 'grg-theme';
|
|
18
20
|
const theme = RESOURCES.themes.find(t => t.name === themeName);
|
|
19
21
|
|
|
@@ -24,27 +26,26 @@ async function init(projectName, options) {
|
|
|
24
26
|
process.exit(1);
|
|
25
27
|
}
|
|
26
28
|
|
|
27
|
-
|
|
28
|
-
console.log(chalk.gray(` Project: ${projectName}`));
|
|
29
|
-
console.log(chalk.gray(` Theme: ${theme.title}\n`));
|
|
30
|
-
|
|
29
|
+
// Check if we're in an Angular project
|
|
31
30
|
const spinner = ora();
|
|
32
|
-
|
|
33
|
-
// Step 1: Create Angular project
|
|
34
|
-
spinner.start(`Creating Angular project "${projectName}"...`);
|
|
31
|
+
spinner.start('Checking for Angular project...');
|
|
35
32
|
try {
|
|
36
|
-
await
|
|
37
|
-
spinner.succeed(chalk.green(
|
|
33
|
+
await fs.access('angular.json');
|
|
34
|
+
spinner.succeed(chalk.green('✓ Angular project detected'));
|
|
38
35
|
} catch (error) {
|
|
39
|
-
spinner.fail(chalk.red('
|
|
40
|
-
console.error(chalk.red(
|
|
36
|
+
spinner.fail(chalk.red('Not an Angular project'));
|
|
37
|
+
console.error(chalk.red('\nError: angular.json not found'));
|
|
38
|
+
console.log(chalk.yellow('\nPlease run this command inside an existing Angular project:'));
|
|
39
|
+
console.log(chalk.cyan(' ng new my-app --style=css'));
|
|
40
|
+
console.log(chalk.cyan(' cd my-app'));
|
|
41
|
+
console.log(chalk.cyan(' grg init'));
|
|
41
42
|
process.exit(1);
|
|
42
43
|
}
|
|
43
44
|
|
|
44
|
-
|
|
45
|
-
|
|
45
|
+
console.log(chalk.bold.cyan('\n🚀 Initializing GRG Kit\n'));
|
|
46
|
+
console.log(chalk.gray(` Theme: ${theme.title}\n`));
|
|
46
47
|
|
|
47
|
-
// Step
|
|
48
|
+
// Step 1: Install Tailwind CSS v4
|
|
48
49
|
spinner.start('Installing Tailwind CSS v4...');
|
|
49
50
|
try {
|
|
50
51
|
await execAsync('pnpm install tailwindcss @tailwindcss/postcss postcss', { stdio: 'pipe' });
|
|
@@ -117,15 +118,39 @@ async function init(projectName, options) {
|
|
|
117
118
|
}
|
|
118
119
|
|
|
119
120
|
// Step 7: Run Spartan-NG UI generator (install all components)
|
|
121
|
+
// The spartan CLI prompts for component selection - we send 'a' to select all, then Enter
|
|
120
122
|
spinner.start('Installing all Spartan-NG UI components...');
|
|
121
123
|
try {
|
|
122
124
|
const { spawn } = require('child_process');
|
|
123
125
|
await new Promise((resolve, reject) => {
|
|
124
|
-
const child = spawn('pnpm', ['ng', 'g', '@spartan-ng/cli:ui'
|
|
125
|
-
stdio: '
|
|
126
|
+
const child = spawn('pnpm', ['ng', 'g', '@spartan-ng/cli:ui'], {
|
|
127
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
126
128
|
shell: true
|
|
127
129
|
});
|
|
130
|
+
|
|
131
|
+
let output = '';
|
|
132
|
+
child.stdout.on('data', (data) => {
|
|
133
|
+
output += data.toString();
|
|
134
|
+
// When we see the prompt, send 'a' to select all, then Enter
|
|
135
|
+
if (output.includes('Choose which primitives')) {
|
|
136
|
+
child.stdin.write('a');
|
|
137
|
+
setTimeout(() => {
|
|
138
|
+
child.stdin.write('\n');
|
|
139
|
+
}, 100);
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
child.stderr.on('data', (data) => {
|
|
144
|
+
// Spartan CLI outputs progress to stderr
|
|
145
|
+
const text = data.toString();
|
|
146
|
+
if (text.includes('CREATE') || text.includes('UPDATE')) {
|
|
147
|
+
// Show progress dots
|
|
148
|
+
process.stdout.write('.');
|
|
149
|
+
}
|
|
150
|
+
});
|
|
151
|
+
|
|
128
152
|
child.on('close', (code) => {
|
|
153
|
+
console.log(); // New line after progress dots
|
|
129
154
|
if (code === 0) resolve();
|
|
130
155
|
else reject(new Error(`Process exited with code ${code}`));
|
|
131
156
|
});
|
|
@@ -219,12 +244,12 @@ async function init(projectName, options) {
|
|
|
219
244
|
|
|
220
245
|
console.log(chalk.bold('Installed:'));
|
|
221
246
|
console.log(chalk.gray(' Tailwind CSS:'), chalk.cyan('v4 with PostCSS'));
|
|
222
|
-
console.log(chalk.gray(' Spartan-NG:'), chalk.cyan('All UI components in libs/ui'));
|
|
247
|
+
console.log(chalk.gray(' Spartan-NG:'), chalk.cyan('All UI components in libs/spartan-ui'));
|
|
223
248
|
console.log(chalk.gray(' Examples:'), chalk.cyan('56+ component examples in libs/examples'));
|
|
224
249
|
console.log(chalk.gray(' Theme:'), chalk.cyan(theme.title));
|
|
225
250
|
|
|
226
251
|
console.log(chalk.yellow('\nNext steps:'));
|
|
227
|
-
console.log(chalk.gray(' 1.'), chalk.cyan(
|
|
252
|
+
console.log(chalk.gray(' 1. Run'), chalk.cyan('grg llm-setup'), chalk.gray('to generate AI assistant rules'));
|
|
228
253
|
console.log(chalk.gray(' 2. Run'), chalk.cyan('grg list blocks'), chalk.gray('to see available blocks'));
|
|
229
254
|
console.log(chalk.gray(' 3. Add blocks with'), chalk.cyan('grg add block --auth'));
|
|
230
255
|
console.log();
|
|
@@ -5,16 +5,88 @@ const ora = require('ora');
|
|
|
5
5
|
const { RESOURCES } = require('../config/resources');
|
|
6
6
|
|
|
7
7
|
/**
|
|
8
|
-
* LLM
|
|
8
|
+
* LLM Setup command - generates LLM-specific prompts and rules
|
|
9
9
|
* Helps AI assistants understand GRG Kit design system and use MCP server
|
|
10
10
|
*/
|
|
11
11
|
async function llmPrompts(options) {
|
|
12
12
|
const outputDir = options.output || '.windsurf/rules';
|
|
13
|
+
const isClaudeOutput = outputDir.includes('.claude') || outputDir.includes('CLAUDE');
|
|
13
14
|
|
|
14
|
-
console.log(chalk.bold.cyan('\n🤖 Generating LLM
|
|
15
|
+
console.log(chalk.bold.cyan('\n🤖 Generating LLM Rules\n'));
|
|
16
|
+
|
|
17
|
+
const spinner = ora();
|
|
18
|
+
|
|
19
|
+
// For Claude Code, generate a single CLAUDE.md file
|
|
20
|
+
if (isClaudeOutput) {
|
|
21
|
+
// Step 1: Create output directory
|
|
22
|
+
spinner.start('Creating directory...');
|
|
23
|
+
try {
|
|
24
|
+
await fs.mkdir(outputDir, { recursive: true });
|
|
25
|
+
spinner.succeed(chalk.green(`✓ Created ${outputDir} directory`));
|
|
26
|
+
} catch (error) {
|
|
27
|
+
spinner.fail(chalk.red('Failed to create directory'));
|
|
28
|
+
console.error(chalk.red(error.message));
|
|
29
|
+
process.exit(1);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// Step 2: Check if CLAUDE.md already exists
|
|
33
|
+
const claudePath = path.join(outputDir, 'CLAUDE.md');
|
|
34
|
+
let existingContent = '';
|
|
35
|
+
let fileExists = false;
|
|
36
|
+
|
|
37
|
+
try {
|
|
38
|
+
existingContent = await fs.readFile(claudePath, 'utf-8');
|
|
39
|
+
fileExists = true;
|
|
40
|
+
} catch (error) {
|
|
41
|
+
// File doesn't exist, that's fine
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// Step 3: Generate CLAUDE.md (append GRG Kit section if file exists)
|
|
45
|
+
spinner.start(fileExists ? 'Updating CLAUDE.md...' : 'Generating CLAUDE.md...');
|
|
46
|
+
try {
|
|
47
|
+
const claudeContent = generateClaudeMdRules();
|
|
48
|
+
|
|
49
|
+
if (fileExists) {
|
|
50
|
+
// Check if GRG Kit section already exists
|
|
51
|
+
if (existingContent.includes('# GRG Kit Project Rules')) {
|
|
52
|
+
// Replace existing GRG Kit section
|
|
53
|
+
const grgKitStart = existingContent.indexOf('# GRG Kit Project Rules');
|
|
54
|
+
const beforeGrgKit = existingContent.substring(0, grgKitStart).trim();
|
|
55
|
+
const newContent = beforeGrgKit ? `${beforeGrgKit}\n\n${claudeContent}` : claudeContent;
|
|
56
|
+
await fs.writeFile(claudePath, newContent);
|
|
57
|
+
spinner.succeed(chalk.green('✓ Updated GRG Kit section in CLAUDE.md'));
|
|
58
|
+
} else {
|
|
59
|
+
// Append GRG Kit section
|
|
60
|
+
const newContent = `${existingContent.trim()}\n\n${claudeContent}`;
|
|
61
|
+
await fs.writeFile(claudePath, newContent);
|
|
62
|
+
spinner.succeed(chalk.green('✓ Appended GRG Kit rules to existing CLAUDE.md'));
|
|
63
|
+
}
|
|
64
|
+
} else {
|
|
65
|
+
await fs.writeFile(claudePath, claudeContent);
|
|
66
|
+
spinner.succeed(chalk.green('✓ Generated CLAUDE.md'));
|
|
67
|
+
}
|
|
68
|
+
} catch (error) {
|
|
69
|
+
spinner.fail(chalk.red('Failed to generate CLAUDE.md'));
|
|
70
|
+
console.error(chalk.red(error.message));
|
|
71
|
+
process.exit(1);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// Success message for Claude
|
|
75
|
+
console.log(chalk.bold.green('\n✨ Claude Code rules generated successfully!\n'));
|
|
76
|
+
console.log(chalk.gray('File created:'));
|
|
77
|
+
console.log(chalk.cyan(` ${outputDir}/CLAUDE.md`));
|
|
78
|
+
|
|
79
|
+
console.log(chalk.yellow('\nNext steps:'));
|
|
80
|
+
console.log(chalk.gray(' 1. The CLAUDE.md file will be automatically picked up by Claude Code'));
|
|
81
|
+
console.log(chalk.gray(' 2. Make sure the grg-kit MCP server is configured'));
|
|
82
|
+
console.log(chalk.gray(' 3. Claude will now check GRG Kit resources before writing custom code'));
|
|
83
|
+
console.log();
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
15
86
|
|
|
87
|
+
// For Windsurf and other IDEs, generate multiple rule files
|
|
16
88
|
// Step 1: Create output directory
|
|
17
|
-
|
|
89
|
+
spinner.start('Creating rules directory...');
|
|
18
90
|
try {
|
|
19
91
|
await fs.mkdir(outputDir, { recursive: true });
|
|
20
92
|
spinner.succeed(chalk.green(`✓ Created ${outputDir} directory`));
|
|
@@ -64,16 +136,17 @@ async function llmPrompts(options) {
|
|
|
64
136
|
}
|
|
65
137
|
|
|
66
138
|
// Success message
|
|
67
|
-
console.log(chalk.bold.green('\n✨ LLM
|
|
139
|
+
console.log(chalk.bold.green('\n✨ LLM rules generated successfully!\n'));
|
|
68
140
|
console.log(chalk.gray('Files created:'));
|
|
69
141
|
console.log(chalk.cyan(` ${outputDir}/design-system.md`));
|
|
70
142
|
console.log(chalk.cyan(` ${outputDir}/grg-kit-mcp.md`));
|
|
71
143
|
console.log(chalk.cyan(` ${outputDir}/angular-components.md`));
|
|
72
144
|
|
|
73
145
|
console.log(chalk.yellow('\nNext steps:'));
|
|
74
|
-
console.log(chalk.gray(' 1. These rules will be automatically picked up by
|
|
146
|
+
console.log(chalk.gray(' 1. These rules will be automatically picked up by your AI assistant'));
|
|
75
147
|
console.log(chalk.gray(' 2. Make sure the grg-kit MCP server is configured in your IDE'));
|
|
76
148
|
console.log(chalk.gray(' 3. AI will now check GRG Kit resources before writing custom code'));
|
|
149
|
+
console.log(chalk.gray('\nSupported IDEs: Windsurf, Claude Code, Claude Desktop'));
|
|
77
150
|
console.log();
|
|
78
151
|
}
|
|
79
152
|
|
|
@@ -465,9 +538,11 @@ trigger: always_on
|
|
|
465
538
|
|
|
466
539
|
## Setup
|
|
467
540
|
|
|
468
|
-
Add the grg-kit MCP server to your
|
|
541
|
+
Add the grg-kit MCP server to your AI assistant configuration:
|
|
469
542
|
|
|
470
|
-
**
|
|
543
|
+
**Windsurf:** \`~/.codeium/windsurf/mcp_config.json\`
|
|
544
|
+
**Claude Code:** \`~/.claude/settings.json\`
|
|
545
|
+
**Claude Desktop (macOS):** \`~/Library/Application Support/Claude/claude_desktop_config.json\`
|
|
471
546
|
|
|
472
547
|
\`\`\`json
|
|
473
548
|
{
|
|
@@ -480,7 +555,7 @@ Add the grg-kit MCP server to your Windsurf configuration:
|
|
|
480
555
|
}
|
|
481
556
|
\`\`\`
|
|
482
557
|
|
|
483
|
-
After adding, restart
|
|
558
|
+
After adding, restart your IDE for the MCP server to be available.
|
|
484
559
|
|
|
485
560
|
## Important: Spartan-NG is Pre-installed
|
|
486
561
|
|
|
@@ -779,4 +854,135 @@ Use MCP only for:
|
|
|
779
854
|
`;
|
|
780
855
|
}
|
|
781
856
|
|
|
857
|
+
function generateClaudeMdRules() {
|
|
858
|
+
// Generate a combined CLAUDE.md file for Claude Code
|
|
859
|
+
const themes = RESOURCES.themes || [];
|
|
860
|
+
const components = RESOURCES.components || [];
|
|
861
|
+
const blocks = RESOURCES.blocks || [];
|
|
862
|
+
|
|
863
|
+
const themesList = themes.map(t => `- \`theme:${t.name}\` - ${t.description}`).join('\n');
|
|
864
|
+
const componentsList = components.map(c => `- \`component:${c.name}\` - ${c.description}`).join('\n');
|
|
865
|
+
const blocksList = blocks.map(b => `- \`block:${b.name}\` - ${b.description}`).join('\n');
|
|
866
|
+
|
|
867
|
+
return `# GRG Kit Project Rules
|
|
868
|
+
|
|
869
|
+
This project uses **GRG Kit**, an Angular UI toolkit built on **Spartan-NG UI**.
|
|
870
|
+
|
|
871
|
+
## Critical: Check GRG Kit First
|
|
872
|
+
|
|
873
|
+
**BEFORE writing any UI component:**
|
|
874
|
+
1. Use MCP tool \`mcp2_search_ui_resources\` to search for existing resources
|
|
875
|
+
2. Check if a component, layout, or block already exists
|
|
876
|
+
3. Only write custom code if no suitable resource exists
|
|
877
|
+
|
|
878
|
+
## Architecture
|
|
879
|
+
|
|
880
|
+
- **Spartan-NG** (\`@spartan-ng/helm\`): Pre-installed UI components with \`hlm\` prefix
|
|
881
|
+
- **GRG Kit** (\`@grg-kit/ui\`): Custom components with \`grg-\` prefix
|
|
882
|
+
- **Blocks**: Pre-built page layouts (auth, shell, settings)
|
|
883
|
+
|
|
884
|
+
## Import Patterns
|
|
885
|
+
|
|
886
|
+
**Spartan-NG:**
|
|
887
|
+
\`\`\`typescript
|
|
888
|
+
import { HlmButtonImports } from '@spartan-ng/helm/button';
|
|
889
|
+
import { HlmCardImports } from '@spartan-ng/helm/card';
|
|
890
|
+
import { BrnDialogImports } from '@spartan-ng/brain/dialog';
|
|
891
|
+
import { HlmDialogImports } from '@spartan-ng/helm/dialog';
|
|
892
|
+
\`\`\`
|
|
893
|
+
|
|
894
|
+
**GRG Kit:**
|
|
895
|
+
\`\`\`typescript
|
|
896
|
+
import { GrgStepperImports } from '@grg-kit/ui/stepper';
|
|
897
|
+
\`\`\`
|
|
898
|
+
|
|
899
|
+
## Common Components
|
|
900
|
+
|
|
901
|
+
**Button:**
|
|
902
|
+
\`\`\`html
|
|
903
|
+
<button hlmBtn>Default</button>
|
|
904
|
+
<button hlmBtn variant="outline">Outline</button>
|
|
905
|
+
<button hlmBtn variant="destructive">Destructive</button>
|
|
906
|
+
\`\`\`
|
|
907
|
+
|
|
908
|
+
**Card:**
|
|
909
|
+
\`\`\`html
|
|
910
|
+
<section hlmCard>
|
|
911
|
+
<div hlmCardHeader>
|
|
912
|
+
<h3 hlmCardTitle>Title</h3>
|
|
913
|
+
<p hlmCardDescription>Description</p>
|
|
914
|
+
</div>
|
|
915
|
+
<div hlmCardContent>Content</div>
|
|
916
|
+
</section>
|
|
917
|
+
\`\`\`
|
|
918
|
+
|
|
919
|
+
**Form Field:**
|
|
920
|
+
\`\`\`html
|
|
921
|
+
<hlm-form-field>
|
|
922
|
+
<input hlmInput [formControl]="control" placeholder="Email" />
|
|
923
|
+
<hlm-error>Required</hlm-error>
|
|
924
|
+
</hlm-form-field>
|
|
925
|
+
\`\`\`
|
|
926
|
+
|
|
927
|
+
**Dialog:**
|
|
928
|
+
\`\`\`html
|
|
929
|
+
<hlm-dialog>
|
|
930
|
+
<button brnDialogTrigger hlmBtn>Open</button>
|
|
931
|
+
<hlm-dialog-content *brnDialogContent="let ctx">
|
|
932
|
+
<hlm-dialog-header>
|
|
933
|
+
<h3 hlmDialogTitle>Title</h3>
|
|
934
|
+
</hlm-dialog-header>
|
|
935
|
+
<!-- content -->
|
|
936
|
+
</hlm-dialog-content>
|
|
937
|
+
</hlm-dialog>
|
|
938
|
+
\`\`\`
|
|
939
|
+
|
|
940
|
+
**Icons:**
|
|
941
|
+
\`\`\`typescript
|
|
942
|
+
import { NgIcon, provideIcons } from '@ng-icons/core';
|
|
943
|
+
import { lucideCheck } from '@ng-icons/lucide';
|
|
944
|
+
|
|
945
|
+
@Component({
|
|
946
|
+
providers: [provideIcons({ lucideCheck })],
|
|
947
|
+
template: \`<ng-icon hlm name="lucideCheck" />\`
|
|
948
|
+
})
|
|
949
|
+
\`\`\`
|
|
950
|
+
|
|
951
|
+
## MCP Server Tools
|
|
952
|
+
|
|
953
|
+
Use the \`grg-kit\` MCP server for themes, blocks, and GRG Kit components:
|
|
954
|
+
|
|
955
|
+
- \`mcp2_search_ui_resources({ query: "auth" })\` - Search resources
|
|
956
|
+
- \`mcp2_suggest_resources({ requirement: "login page" })\` - Get suggestions
|
|
957
|
+
- \`mcp2_install_resource({ resource: "block:auth" })\` - Install resource
|
|
958
|
+
- \`mcp2_list_available_resources({ category: "all" })\` - List all
|
|
959
|
+
|
|
960
|
+
## Available Resources
|
|
961
|
+
|
|
962
|
+
### Themes
|
|
963
|
+
${themesList}
|
|
964
|
+
|
|
965
|
+
### GRG Kit Components
|
|
966
|
+
${componentsList}
|
|
967
|
+
|
|
968
|
+
### Blocks
|
|
969
|
+
${blocksList}
|
|
970
|
+
|
|
971
|
+
## Decision Tree
|
|
972
|
+
|
|
973
|
+
- Need button, card, dialog, form field, table? → Use Spartan-NG (already installed)
|
|
974
|
+
- Need page layout (dashboard, auth, settings)? → Use MCP: \`mcp2_search_ui_resources\`
|
|
975
|
+
- Need theme? → Use MCP: \`mcp2_list_available_resources({ category: "themes" })\`
|
|
976
|
+
- Need stepper, file-upload? → Use MCP: \`mcp2_search_ui_resources\`
|
|
977
|
+
|
|
978
|
+
## Package Manager
|
|
979
|
+
|
|
980
|
+
**ALWAYS use pnpm** instead of npm.
|
|
981
|
+
|
|
982
|
+
## Styling
|
|
983
|
+
|
|
984
|
+
Use TailwindCSS v4 for all styling. Prefer signals for state management.
|
|
985
|
+
`;
|
|
986
|
+
}
|
|
987
|
+
|
|
782
988
|
module.exports = { llmPrompts };
|
package/package.json
CHANGED
|
@@ -1,11 +1,16 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "grg-kit-cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.0",
|
|
4
4
|
"description": "CLI tool for pulling GRG Kit resources into your Angular project",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"bin": {
|
|
7
7
|
"grg": "./bin/grg.js"
|
|
8
8
|
},
|
|
9
|
+
"scripts": {
|
|
10
|
+
"generate": "node scripts/generate-resources.js",
|
|
11
|
+
"prepublishOnly": "npm run generate",
|
|
12
|
+
"test": "echo \"Error: no test specified\" && exit 1"
|
|
13
|
+
},
|
|
9
14
|
"keywords": [
|
|
10
15
|
"angular",
|
|
11
16
|
"ui",
|
|
@@ -30,9 +35,5 @@
|
|
|
30
35
|
},
|
|
31
36
|
"engines": {
|
|
32
37
|
"node": ">=16.0.0"
|
|
33
|
-
},
|
|
34
|
-
"scripts": {
|
|
35
|
-
"generate": "node scripts/generate-resources.js",
|
|
36
|
-
"test": "echo \"Error: no test specified\" && exit 1"
|
|
37
38
|
}
|
|
38
|
-
}
|
|
39
|
+
}
|
|
File without changes
|