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 CHANGED
@@ -11,14 +11,17 @@ pnpm install -g grg-kit-cli
11
11
  ## Quick Start
12
12
 
13
13
  ```bash
14
- # Initialize a new Angular project with GRG Kit
15
- grg init my-app
14
+ # Create Angular project first
15
+ ng new my-app --style=css
16
+ cd my-app
16
17
 
17
- # Initialize with a specific theme
18
- grg init my-app --theme claude
18
+ # Initialize GRG Kit in the project
19
+ grg init
19
20
 
20
- # Add blocks (inside project directory)
21
- cd my-app
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 <project-name>`
37
+ ### `grg init`
35
38
 
36
- Create a new Angular project with GRG Kit fully configured. One command to set up everything.
39
+ Initialize GRG Kit in an existing Angular project.
37
40
 
38
41
  ```bash
39
- grg init <project-name> [options]
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 my-app
46
- grg init my-app --theme claude
47
- grg init dashboard -t modern-minimal
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-prompts`
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-prompts [options]
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-prompts
113
- grg llm-prompts --output .cursor/rules
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
- **Cursor** (`~/.cursor/mcp_config.json`):
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-prompts
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
- # Initialize project
171
- grg init my-app # Default theme
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-prompts # Generate AI rules
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-prompts');
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.3.0');
14
+ .version('0.5.0');
15
15
 
16
- // Init command - sets up everything in one shot
16
+ // Init command - sets up GRG Kit in existing Angular project
17
17
  program
18
- .command('init <project-name>')
19
- .description('Initialize GRG Kit: creates Angular project with zoneless, sets up styles.css with theme, adds all components')
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 Prompts command
42
+ // LLM Setup command
43
43
  program
44
- .command('llm-prompts')
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 the project
14
- * Creates Angular project, installs Tailwind CSS v4, runs spartan-ng ui, downloads theme
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(projectName, options) {
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
- console.log(chalk.bold.cyan('\n🚀 Initializing GRG Kit\n'));
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 execAsync(`ng new ${projectName} --style=css`, { stdio: 'pipe' });
37
- spinner.succeed(chalk.green(`✓ Created Angular project "${projectName}"`));
33
+ await fs.access('angular.json');
34
+ spinner.succeed(chalk.green('✓ Angular project detected'));
38
35
  } catch (error) {
39
- spinner.fail(chalk.red('Failed to create Angular project'));
40
- console.error(chalk.red(error.message));
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
- // Change to project directory for remaining steps
45
- process.chdir(projectName);
45
+ console.log(chalk.bold.cyan('\n🚀 Initializing GRG Kit\n'));
46
+ console.log(chalk.gray(` Theme: ${theme.title}\n`));
46
47
 
47
- // Step 2: Install Tailwind CSS v4
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', 'all', '--defaults'], {
125
- stdio: 'inherit',
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(`cd ${projectName}`));
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 Prompts command - generates LLM-specific prompts and rules
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 Prompts and Rules\n'));
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
- const spinner = ora('Creating rules directory...').start();
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 prompts and rules generated successfully!\n'));
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 Windsurf/Cascade'));
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 Windsurf configuration:
541
+ Add the grg-kit MCP server to your AI assistant configuration:
469
542
 
470
- **File:** \`~/.codeium/windsurf/mcp_config.json\`
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 Windsurf for the MCP server to be available.
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.4.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