grg-kit-cli 0.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/README.md ADDED
@@ -0,0 +1,245 @@
1
+ # @grg-kit/cli
2
+
3
+ CLI tool for pulling GRG Kit resources into your Angular project with simple, memorable commands.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install -g @grg-kit/cli
9
+ ```
10
+
11
+ ## Quick Start
12
+
13
+ ```bash
14
+ # Initialize GRG Kit with a theme
15
+ grg init
16
+
17
+ # Or choose a specific theme
18
+ grg init --theme claude
19
+
20
+ # List available resources
21
+ grg list
22
+
23
+ # Add resources
24
+ grg add theme:claude
25
+ grg add component:stepper
26
+ grg add examples:all
27
+ ```
28
+
29
+ ## Commands
30
+
31
+ ### `grg init`
32
+
33
+ Initialize GRG Kit in your Angular project with themes directory and configuration.
34
+
35
+ ```bash
36
+ grg init [options]
37
+
38
+ Options:
39
+ -t, --theme <name> Theme to install (default: "grg-theme")
40
+
41
+ Examples:
42
+ grg init
43
+ grg init --theme claude
44
+ grg init -t modern-minimal
45
+ ```
46
+
47
+ **What it does:**
48
+ - Creates `src/themes` directory
49
+ - Downloads the selected theme
50
+ - Updates `src/styles.css` with theme import
51
+
52
+ **Available themes:**
53
+ - `grg-theme` - Default theme with purple/orange accents
54
+ - `claude` - Claude-inspired warm tones
55
+ - `clean-slate` - Minimal grayscale palette
56
+ - `modern-minimal` - Contemporary minimal design
57
+ - `amber-minimal` - Warm amber accents
58
+ - `mocks` - Theme for mockups and prototypes
59
+
60
+ ### `grg add <resource>`
61
+
62
+ Add a GRG Kit resource to your project.
63
+
64
+ ```bash
65
+ grg add <category>:<name> [options]
66
+
67
+ Options:
68
+ -o, --output <path> Custom output directory
69
+
70
+ Examples:
71
+ grg add theme:claude
72
+ grg add component:stepper
73
+ grg add layout:dashboard
74
+ grg add examples:button
75
+ grg add examples:all
76
+ ```
77
+
78
+ **Resource format:** `<category>:<name>`
79
+
80
+ **Categories:**
81
+ - `theme` - Pre-built theme files
82
+ - `component` - Reusable components
83
+ - `layout` - Page layouts
84
+ - `examples` - Spartan-NG component examples
85
+
86
+ ### `grg list [category]`
87
+
88
+ List available GRG Kit resources.
89
+
90
+ ```bash
91
+ grg list [category]
92
+
93
+ Examples:
94
+ grg list # Show all categories
95
+ grg list themes # List all themes
96
+ grg list components
97
+ grg list layouts
98
+ grg list examples
99
+ ```
100
+
101
+ ### `grg metadata`
102
+
103
+ Output structured metadata about all available commands and resources (for MCP servers and LLMs).
104
+
105
+ ```bash
106
+ grg metadata [options]
107
+
108
+ Options:
109
+ -f, --format <type> Output format: json, yaml (default: "json")
110
+
111
+ Examples:
112
+ grg metadata
113
+ grg metadata --format json
114
+ ```
115
+
116
+ **Purpose:**
117
+ This command outputs structured JSON/YAML metadata that can be consumed by:
118
+ - MCP (Model Context Protocol) servers
119
+ - LLMs for automated resource discovery
120
+ - CI/CD pipelines
121
+ - Documentation generators
122
+
123
+ ## MCP Server Integration
124
+
125
+ The CLI is designed to work seamlessly with MCP servers. The `metadata` command provides structured information that LLMs can use to:
126
+
127
+ 1. **Discover available resources** - Themes, components, layouts, examples
128
+ 2. **Understand command usage** - Syntax, options, examples
129
+ 3. **Execute commands automatically** - Based on user intent
130
+ 4. **Provide contextual help** - Descriptions, tags, dependencies
131
+
132
+ ### Metadata Structure
133
+
134
+ ```json
135
+ {
136
+ "version": "0.1.0",
137
+ "name": "grg-kit-cli",
138
+ "description": "CLI tool for pulling GRG Kit resources into Angular projects",
139
+ "commands": [
140
+ {
141
+ "name": "init",
142
+ "description": "Initialize GRG Kit in your Angular project",
143
+ "usage": "grg init [options]",
144
+ "options": [...],
145
+ "examples": [...],
146
+ "effects": [...]
147
+ }
148
+ ],
149
+ "resources": {
150
+ "themes": [...],
151
+ "components": [...],
152
+ "layouts": [...],
153
+ "examples": {...}
154
+ }
155
+ }
156
+ ```
157
+
158
+ ## Examples
159
+
160
+ ### Initialize a new project
161
+
162
+ ```bash
163
+ # Initialize with default theme
164
+ grg init
165
+
166
+ # Initialize with Claude theme
167
+ grg init --theme claude
168
+ ```
169
+
170
+ ### Add resources
171
+
172
+ ```bash
173
+ # Add a different theme
174
+ grg add theme:modern-minimal
175
+
176
+ # Add a component
177
+ grg add component:stepper
178
+
179
+ # Add a layout
180
+ grg add layout:dashboard
181
+
182
+ # Add all Spartan-NG examples
183
+ grg add examples:all
184
+
185
+ # Add specific component examples
186
+ grg add examples:button
187
+ grg add examples:dialog
188
+ ```
189
+
190
+ ### Browse resources
191
+
192
+ ```bash
193
+ # See all categories
194
+ grg list
195
+
196
+ # See all themes
197
+ grg list themes
198
+
199
+ # See all components
200
+ grg list components
201
+
202
+ # See all examples
203
+ grg list examples
204
+ ```
205
+
206
+ ## Comparison with degit
207
+
208
+ ### Before (with degit):
209
+ ```bash
210
+ npx degit gh:Genesis-Research/grg-kit/templates/ui/themes/grg-theme.css src/themes/grg-theme.css
211
+ npx degit gh:Genesis-Research/grg-kit/templates/spartan-examples src/app/spartan-examples
212
+ ```
213
+
214
+ ### After (with @grg-kit/cli):
215
+ ```bash
216
+ grg add theme:grg-theme
217
+ grg add examples:all
218
+ ```
219
+
220
+ **Benefits:**
221
+ - ✅ Shorter, memorable commands
222
+ - ✅ Built-in resource discovery
223
+ - ✅ Automatic path management
224
+ - ✅ Helpful error messages
225
+ - ✅ MCP server integration
226
+ - ✅ Structured metadata for LLMs
227
+
228
+ ## Development
229
+
230
+ ```bash
231
+ # Install dependencies
232
+ npm install
233
+
234
+ # Link for local development
235
+ npm link
236
+
237
+ # Test commands
238
+ grg --help
239
+ grg list
240
+ grg metadata
241
+ ```
242
+
243
+ ## License
244
+
245
+ MIT
package/bin/grg.js ADDED
@@ -0,0 +1,43 @@
1
+ #!/usr/bin/env node
2
+
3
+ const { Command } = require('commander');
4
+ const { add } = require('../commands/add');
5
+ const { list } = require('../commands/list');
6
+ const { init } = require('../commands/init');
7
+ const { metadata } = require('../commands/metadata');
8
+
9
+ const program = new Command();
10
+
11
+ program
12
+ .name('grg')
13
+ .description('GRG Kit CLI - Pull themes, components, and examples into your Angular project')
14
+ .version('0.1.0');
15
+
16
+ // Init command
17
+ program
18
+ .command('init')
19
+ .description('Initialize GRG Kit in your Angular project with themes directory and configuration')
20
+ .option('-t, --theme <name>', 'Theme to install (grg-theme, claude, clean-slate, modern-minimal, amber-minimal, mocks)', 'grg-theme')
21
+ .action(init);
22
+
23
+ // Add command
24
+ program
25
+ .command('add <resource>')
26
+ .description('Add a GRG Kit resource to your project')
27
+ .option('-o, --output <path>', 'Output directory for the resource')
28
+ .action(add);
29
+
30
+ // List command
31
+ program
32
+ .command('list [category]')
33
+ .description('List available GRG Kit resources (themes, components, layouts, examples)')
34
+ .action(list);
35
+
36
+ // Metadata command (for MCP server integration)
37
+ program
38
+ .command('metadata')
39
+ .description('Output structured metadata about all available commands and resources (JSON format for MCP servers)')
40
+ .option('-f, --format <type>', 'Output format (json, yaml)', 'json')
41
+ .action(metadata);
42
+
43
+ program.parse();
@@ -0,0 +1,125 @@
1
+ const degit = require('degit');
2
+ const chalk = require('chalk');
3
+ const ora = require('ora');
4
+ const { RESOURCES, REPO } = require('../config/resources');
5
+
6
+ /**
7
+ * Add command - downloads a specific resource
8
+ * Format: grg add <category>:<name>
9
+ * Examples:
10
+ * grg add theme:claude
11
+ * grg add component:stepper
12
+ * grg add examples:button
13
+ * grg add examples:all
14
+ */
15
+ async function add(resource, options) {
16
+ const [category, name] = resource.split(':');
17
+
18
+ if (!category || !name) {
19
+ console.error(chalk.red('Error: Invalid resource format. Use <category>:<name>'));
20
+ console.log(chalk.yellow('Examples:'));
21
+ console.log(' grg add theme:claude');
22
+ console.log(' grg add component:stepper');
23
+ console.log(' grg add examples:button');
24
+ console.log(' grg add examples:all');
25
+ process.exit(1);
26
+ }
27
+
28
+ let resourceData;
29
+ let sourcePath;
30
+ let outputPath;
31
+
32
+ // Find the resource
33
+ switch (category) {
34
+ case 'theme':
35
+ resourceData = RESOURCES.themes.find(t => t.name === name);
36
+ if (resourceData) {
37
+ sourcePath = resourceData.path;
38
+ outputPath = options.output || resourceData.defaultOutput;
39
+ }
40
+ break;
41
+
42
+ case 'component':
43
+ resourceData = RESOURCES.components.find(c => c.name === name);
44
+ if (resourceData) {
45
+ sourcePath = resourceData.path;
46
+ outputPath = options.output || resourceData.defaultOutput;
47
+ }
48
+ break;
49
+
50
+ case 'layout':
51
+ resourceData = RESOURCES.layouts.find(l => l.name === name);
52
+ if (resourceData) {
53
+ sourcePath = resourceData.path;
54
+ outputPath = options.output || resourceData.defaultOutput;
55
+ }
56
+ break;
57
+
58
+ case 'examples':
59
+ if (name === 'all') {
60
+ resourceData = RESOURCES.examples.all;
61
+ sourcePath = resourceData.path;
62
+ outputPath = options.output || resourceData.defaultOutput;
63
+ } else {
64
+ resourceData = RESOURCES.examples.components.find(e => e.name === name);
65
+ if (resourceData) {
66
+ sourcePath = resourceData.path;
67
+ outputPath = options.output || resourceData.defaultOutput;
68
+ }
69
+ }
70
+ break;
71
+
72
+ default:
73
+ console.error(chalk.red(`Error: Unknown category "${category}"`));
74
+ console.log(chalk.yellow('Valid categories: theme, component, layout, examples'));
75
+ process.exit(1);
76
+ }
77
+
78
+ if (!resourceData) {
79
+ console.error(chalk.red(`Error: Resource "${name}" not found in category "${category}"`));
80
+ console.log(chalk.yellow(`\nRun ${chalk.cyan('grg list ' + category + 's')} to see available resources`));
81
+ process.exit(1);
82
+ }
83
+
84
+ // Download the resource
85
+ const spinner = ora(`Downloading ${resourceData.title}...`).start();
86
+
87
+ try {
88
+ const emitter = degit(`${REPO}/${sourcePath}`, {
89
+ cache: false,
90
+ force: true,
91
+ verbose: false,
92
+ });
93
+
94
+ await emitter.clone(outputPath);
95
+
96
+ spinner.succeed(chalk.green(`✓ ${resourceData.title} added successfully!`));
97
+ console.log(chalk.gray(` Location: ${outputPath}`));
98
+
99
+ if (resourceData.description) {
100
+ console.log(chalk.gray(` ${resourceData.description}`));
101
+ }
102
+
103
+ // Show next steps for themes
104
+ if (category === 'theme') {
105
+ console.log(chalk.yellow('\nNext steps:'));
106
+ console.log(chalk.gray(` 1. Import the theme in your src/styles.css:`));
107
+ console.log(chalk.cyan(` @import './${outputPath.replace('src/', '')}';`));
108
+ }
109
+
110
+ // Show dependencies if any
111
+ if (resourceData.dependencies && resourceData.dependencies.length > 0) {
112
+ console.log(chalk.yellow('\nRequired dependencies:'));
113
+ resourceData.dependencies.forEach(dep => {
114
+ console.log(chalk.gray(` - ${dep}`));
115
+ });
116
+ }
117
+
118
+ } catch (error) {
119
+ spinner.fail(chalk.red('Failed to download resource'));
120
+ console.error(chalk.red(error.message));
121
+ process.exit(1);
122
+ }
123
+ }
124
+
125
+ module.exports = { add };
@@ -0,0 +1,102 @@
1
+ const fs = require('fs').promises;
2
+ const path = require('path');
3
+ const degit = require('degit');
4
+ const chalk = require('chalk');
5
+ const ora = require('ora');
6
+ const { RESOURCES, REPO } = require('../config/resources');
7
+
8
+ /**
9
+ * Init command - initializes GRG Kit in the project
10
+ * Creates themes directory and downloads a theme
11
+ */
12
+ async function init(options) {
13
+ const themeName = options.theme || 'grg-theme';
14
+ const theme = RESOURCES.themes.find(t => t.name === themeName);
15
+
16
+ if (!theme) {
17
+ console.error(chalk.red(`Error: Theme "${themeName}" not found`));
18
+ console.log(chalk.yellow('Available themes:'));
19
+ RESOURCES.themes.forEach(t => console.log(chalk.gray(` - ${t.name}`)));
20
+ process.exit(1);
21
+ }
22
+
23
+ console.log(chalk.bold.cyan('\n🚀 Initializing GRG Kit\n'));
24
+
25
+ // Step 1: Create themes directory
26
+ const spinner = ora('Creating themes directory...').start();
27
+ try {
28
+ await fs.mkdir('src/themes', { recursive: true });
29
+ spinner.succeed(chalk.green('✓ Created src/themes directory'));
30
+ } catch (error) {
31
+ spinner.fail(chalk.red('Failed to create themes directory'));
32
+ console.error(chalk.red(error.message));
33
+ process.exit(1);
34
+ }
35
+
36
+ // Step 2: Download theme
37
+ spinner.start(`Downloading ${theme.title}...`);
38
+ try {
39
+ const emitter = degit(`${REPO}/${theme.path}`, {
40
+ cache: false,
41
+ force: true,
42
+ verbose: false,
43
+ });
44
+
45
+ await emitter.clone(theme.defaultOutput);
46
+ spinner.succeed(chalk.green(`✓ Downloaded ${theme.title}`));
47
+ } catch (error) {
48
+ spinner.fail(chalk.red('Failed to download theme'));
49
+ console.error(chalk.red(error.message));
50
+ process.exit(1);
51
+ }
52
+
53
+ // Step 3: Check and update styles.css
54
+ spinner.start('Checking src/styles.css...');
55
+ try {
56
+ const stylesPath = 'src/styles.css';
57
+ let stylesContent = '';
58
+
59
+ try {
60
+ stylesContent = await fs.readFile(stylesPath, 'utf-8');
61
+ } catch (error) {
62
+ // File doesn't exist, create it
63
+ stylesContent = '';
64
+ }
65
+
66
+ const themeImport = `@import './themes/${theme.file}';`;
67
+
68
+ if (!stylesContent.includes(themeImport)) {
69
+ // Add required imports if not present
70
+ const requiredImports = [
71
+ '@import "@angular/cdk/overlay-prebuilt.css";',
72
+ '@import "tailwindcss";',
73
+ '@import "@spartan-ng/brain/hlm-tailwind-preset.css";',
74
+ '',
75
+ themeImport
76
+ ];
77
+
78
+ const newContent = requiredImports.join('\n') + '\n';
79
+ await fs.writeFile(stylesPath, newContent);
80
+ spinner.succeed(chalk.green('✓ Updated src/styles.css with theme import'));
81
+ } else {
82
+ spinner.succeed(chalk.green('✓ Theme already imported in src/styles.css'));
83
+ }
84
+ } catch (error) {
85
+ spinner.warn(chalk.yellow('Could not update src/styles.css automatically'));
86
+ console.log(chalk.gray('\nPlease add the following to your src/styles.css:'));
87
+ console.log(chalk.cyan(` @import './themes/${theme.file}';`));
88
+ }
89
+
90
+ // Success message
91
+ console.log(chalk.bold.green('\n✨ GRG Kit initialized successfully!\n'));
92
+ console.log(chalk.gray('Theme installed:'), chalk.cyan(theme.title));
93
+ console.log(chalk.gray('Description:'), theme.description);
94
+
95
+ console.log(chalk.yellow('\nNext steps:'));
96
+ console.log(chalk.gray(' 1. Run'), chalk.cyan('grg list'), chalk.gray('to see available resources'));
97
+ console.log(chalk.gray(' 2. Add components with'), chalk.cyan('grg add component:<name>'));
98
+ console.log(chalk.gray(' 3. Add examples with'), chalk.cyan('grg add examples:all'));
99
+ console.log();
100
+ }
101
+
102
+ module.exports = { init };
@@ -0,0 +1,94 @@
1
+ const chalk = require('chalk');
2
+ const { RESOURCES } = require('../config/resources');
3
+
4
+ /**
5
+ * List command - displays available resources
6
+ * Usage: grg list [category]
7
+ */
8
+ async function list(category) {
9
+ if (!category) {
10
+ // Show all categories
11
+ console.log(chalk.bold.cyan('\n📦 GRG Kit Resources\n'));
12
+
13
+ console.log(chalk.bold('Themes') + chalk.gray(` (${RESOURCES.themes.length} available)`));
14
+ console.log(chalk.gray(' Run: grg list themes\n'));
15
+
16
+ console.log(chalk.bold('Components') + chalk.gray(` (${RESOURCES.components.length} available)`));
17
+ console.log(chalk.gray(' Run: grg list components\n'));
18
+
19
+ console.log(chalk.bold('Layouts') + chalk.gray(` (${RESOURCES.layouts.length} available)`));
20
+ console.log(chalk.gray(' Run: grg list layouts\n'));
21
+
22
+ console.log(chalk.bold('Spartan-NG Examples') + chalk.gray(` (${RESOURCES.examples.components.length}+ available)`));
23
+ console.log(chalk.gray(' Run: grg list examples\n'));
24
+
25
+ return;
26
+ }
27
+
28
+ switch (category) {
29
+ case 'themes':
30
+ console.log(chalk.bold.cyan('\n🎨 Available Themes\n'));
31
+ RESOURCES.themes.forEach(theme => {
32
+ console.log(chalk.bold(` ${theme.name}`));
33
+ console.log(chalk.gray(` ${theme.description}`));
34
+ console.log(chalk.yellow(` grg add theme:${theme.name}`));
35
+ if (theme.tags.length > 0) {
36
+ console.log(chalk.gray(` Tags: ${theme.tags.join(', ')}`));
37
+ }
38
+ console.log();
39
+ });
40
+ break;
41
+
42
+ case 'components':
43
+ console.log(chalk.bold.cyan('\n🧩 Available Components\n'));
44
+ RESOURCES.components.forEach(component => {
45
+ console.log(chalk.bold(` ${component.name}`));
46
+ console.log(chalk.gray(` ${component.description}`));
47
+ console.log(chalk.yellow(` grg add component:${component.name}`));
48
+ if (component.tags.length > 0) {
49
+ console.log(chalk.gray(` Tags: ${component.tags.join(', ')}`));
50
+ }
51
+ console.log();
52
+ });
53
+ break;
54
+
55
+ case 'layouts':
56
+ console.log(chalk.bold.cyan('\n📐 Available Layouts\n'));
57
+ RESOURCES.layouts.forEach(layout => {
58
+ console.log(chalk.bold(` ${layout.name}`));
59
+ console.log(chalk.gray(` ${layout.description}`));
60
+ console.log(chalk.yellow(` grg add layout:${layout.name}`));
61
+ if (layout.tags.length > 0) {
62
+ console.log(chalk.gray(` Tags: ${layout.tags.join(', ')}`));
63
+ }
64
+ console.log();
65
+ });
66
+ break;
67
+
68
+ case 'examples':
69
+ console.log(chalk.bold.cyan('\n📚 Available Spartan-NG Examples\n'));
70
+
71
+ // Show "all" option first
72
+ console.log(chalk.bold(` all`) + chalk.gray(' (recommended)'));
73
+ console.log(chalk.gray(` ${RESOURCES.examples.all.description}`));
74
+ console.log(chalk.yellow(` grg add examples:all`));
75
+ console.log();
76
+
77
+ console.log(chalk.gray(' Or add individual component examples:\n'));
78
+
79
+ RESOURCES.examples.components.forEach(example => {
80
+ console.log(chalk.bold(` ${example.name}`));
81
+ console.log(chalk.gray(` ${example.description}`));
82
+ console.log(chalk.yellow(` grg add examples:${example.name}`));
83
+ console.log();
84
+ });
85
+ break;
86
+
87
+ default:
88
+ console.error(chalk.red(`Error: Unknown category "${category}"`));
89
+ console.log(chalk.yellow('Valid categories: themes, components, layouts, examples'));
90
+ process.exit(1);
91
+ }
92
+ }
93
+
94
+ module.exports = { list };
@@ -0,0 +1,122 @@
1
+ const chalk = require('chalk');
2
+ const { RESOURCES } = require('../config/resources');
3
+
4
+ /**
5
+ * Metadata command - outputs structured information about all commands and resources
6
+ * This is designed to be consumed by MCP servers and LLMs
7
+ */
8
+ async function metadata(options) {
9
+ const format = options.format || 'json';
10
+
11
+ const commandMetadata = {
12
+ version: '0.1.0',
13
+ name: 'grg-kit-cli',
14
+ description: 'CLI tool for pulling GRG Kit resources into Angular projects',
15
+ repository: 'https://github.com/Genesis-Research/grg-kit',
16
+ commands: [
17
+ {
18
+ name: 'init',
19
+ description: 'Initialize GRG Kit in your Angular project with themes directory and configuration',
20
+ usage: 'grg init [options]',
21
+ options: [
22
+ {
23
+ flag: '-t, --theme <name>',
24
+ description: 'Theme to install',
25
+ default: 'grg-theme',
26
+ choices: ['grg-theme', 'claude', 'clean-slate', 'modern-minimal', 'amber-minimal', 'mocks']
27
+ }
28
+ ],
29
+ examples: [
30
+ 'grg init',
31
+ 'grg init --theme claude',
32
+ 'grg init -t modern-minimal'
33
+ ],
34
+ effects: [
35
+ 'Creates src/themes directory',
36
+ 'Downloads selected theme file',
37
+ 'Updates src/styles.css with theme import'
38
+ ]
39
+ },
40
+ {
41
+ name: 'add',
42
+ description: 'Add a GRG Kit resource to your project',
43
+ usage: 'grg add <resource> [options]',
44
+ options: [
45
+ {
46
+ flag: '-o, --output <path>',
47
+ description: 'Output directory for the resource',
48
+ default: 'Auto-determined based on resource type'
49
+ }
50
+ ],
51
+ examples: [
52
+ 'grg add theme:claude',
53
+ 'grg add component:stepper',
54
+ 'grg add layout:dashboard',
55
+ 'grg add examples:button',
56
+ 'grg add examples:all'
57
+ ],
58
+ resourceFormat: '<category>:<name>',
59
+ categories: ['theme', 'component', 'layout', 'examples'],
60
+ effects: [
61
+ 'Downloads the specified resource',
62
+ 'Places it in the appropriate directory'
63
+ ]
64
+ },
65
+ {
66
+ name: 'list',
67
+ description: 'List available GRG Kit resources',
68
+ usage: 'grg list [category]',
69
+ examples: [
70
+ 'grg list',
71
+ 'grg list themes',
72
+ 'grg list components',
73
+ 'grg list layouts',
74
+ 'grg list examples'
75
+ ],
76
+ categories: ['themes', 'components', 'layouts', 'examples'],
77
+ effects: [
78
+ 'Displays available resources in the specified category'
79
+ ]
80
+ },
81
+ {
82
+ name: 'metadata',
83
+ description: 'Output structured metadata about all available commands and resources (for MCP servers)',
84
+ usage: 'grg metadata [options]',
85
+ options: [
86
+ {
87
+ flag: '-f, --format <type>',
88
+ description: 'Output format',
89
+ default: 'json',
90
+ choices: ['json', 'yaml']
91
+ }
92
+ ],
93
+ examples: [
94
+ 'grg metadata',
95
+ 'grg metadata --format json'
96
+ ],
97
+ effects: [
98
+ 'Outputs structured metadata in specified format'
99
+ ]
100
+ }
101
+ ],
102
+ resources: RESOURCES
103
+ };
104
+
105
+ if (format === 'json') {
106
+ console.log(JSON.stringify(commandMetadata, null, 2));
107
+ } else if (format === 'yaml') {
108
+ // Simple YAML output (could use a library for more complex cases)
109
+ console.log('# GRG Kit CLI Metadata');
110
+ console.log(`version: ${commandMetadata.version}`);
111
+ console.log(`name: ${commandMetadata.name}`);
112
+ console.log(`description: ${commandMetadata.description}`);
113
+ console.log('\ncommands:');
114
+ commandMetadata.commands.forEach(cmd => {
115
+ console.log(` - name: ${cmd.name}`);
116
+ console.log(` description: ${cmd.description}`);
117
+ console.log(` usage: ${cmd.usage}`);
118
+ });
119
+ }
120
+ }
121
+
122
+ module.exports = { metadata };
@@ -0,0 +1,208 @@
1
+ /**
2
+ * Resource definitions for GRG Kit
3
+ * This structure is designed to be easily consumed by MCP servers and LLMs
4
+ */
5
+
6
+ const RESOURCES = {
7
+ themes: [
8
+ {
9
+ name: 'grg-theme',
10
+ title: 'GRG Theme',
11
+ description: 'Default theme with purple/orange accents',
12
+ file: 'grg-theme.css',
13
+ path: 'templates/ui/themes/grg-theme.css',
14
+ defaultOutput: 'src/themes/grg-theme.css',
15
+ tags: ['default', 'purple', 'orange', 'colorful'],
16
+ features: ['dark-mode', 'tailwind-v4', 'spartan-ng', 'oklch']
17
+ },
18
+ {
19
+ name: 'claude',
20
+ title: 'Claude Theme',
21
+ description: 'Claude-inspired warm tones',
22
+ file: 'claude.css',
23
+ path: 'templates/ui/themes/claude.css',
24
+ defaultOutput: 'src/themes/claude.css',
25
+ tags: ['warm', 'orange', 'brown', 'claude'],
26
+ features: ['dark-mode', 'tailwind-v4', 'spartan-ng', 'oklch']
27
+ },
28
+ {
29
+ name: 'clean-slate',
30
+ title: 'Clean Slate',
31
+ description: 'Minimal grayscale palette',
32
+ file: 'clean-slate.css',
33
+ path: 'templates/ui/themes/clean-slate.css',
34
+ defaultOutput: 'src/themes/clean-slate.css',
35
+ tags: ['minimal', 'grayscale', 'neutral', 'clean'],
36
+ features: ['dark-mode', 'tailwind-v4', 'spartan-ng', 'oklch']
37
+ },
38
+ {
39
+ name: 'modern-minimal',
40
+ title: 'Modern Minimal',
41
+ description: 'Contemporary minimal design',
42
+ file: 'modern-minimal.css',
43
+ path: 'templates/ui/themes/modern-minimal.css',
44
+ defaultOutput: 'src/themes/modern-minimal.css',
45
+ tags: ['minimal', 'modern', 'contemporary', 'clean'],
46
+ features: ['dark-mode', 'tailwind-v4', 'spartan-ng', 'oklch']
47
+ },
48
+ {
49
+ name: 'amber-minimal',
50
+ title: 'Amber Minimal',
51
+ description: 'Warm amber accents',
52
+ file: 'amber-minimal.css',
53
+ path: 'templates/ui/themes/amber-minimal.css',
54
+ defaultOutput: 'src/themes/amber-minimal.css',
55
+ tags: ['minimal', 'warm', 'amber', 'orange'],
56
+ features: ['dark-mode', 'tailwind-v4', 'spartan-ng', 'oklch']
57
+ },
58
+ {
59
+ name: 'mocks',
60
+ title: 'Mocks Theme',
61
+ description: 'Theme for mockups and prototypes',
62
+ file: 'mocks.css',
63
+ path: 'templates/ui/themes/mocks.css',
64
+ defaultOutput: 'src/themes/mocks.css',
65
+ tags: ['mockup', 'prototype', 'design'],
66
+ features: ['dark-mode', 'tailwind-v4', 'spartan-ng', 'oklch']
67
+ }
68
+ ],
69
+ components: [
70
+ {
71
+ name: 'stepper',
72
+ title: 'Stepper Component',
73
+ description: 'Multi-step form component with progress indicator',
74
+ path: 'templates/ui/components/stepper',
75
+ defaultOutput: 'src/app/components/stepper',
76
+ tags: ['form', 'wizard', 'multi-step', 'progress'],
77
+ dependencies: ['@spartan-ng/helm/button', '@spartan-ng/helm/card'],
78
+ type: 'grg-component',
79
+ prefix: 'grg'
80
+ }
81
+ ],
82
+ layouts: [
83
+ {
84
+ name: 'dashboard',
85
+ title: 'Dashboard Layout',
86
+ description: 'Full dashboard layout with sidebar and header',
87
+ path: 'templates/ui/layouts/dashboard',
88
+ defaultOutput: 'src/app/layouts/dashboard',
89
+ tags: ['dashboard', 'admin', 'sidebar', 'navigation'],
90
+ dependencies: ['@spartan-ng/helm/button', '@spartan-ng/helm/card', '@spartan-ng/helm/navigation-menu']
91
+ },
92
+ {
93
+ name: 'auth',
94
+ title: 'Authentication Layout',
95
+ description: 'Authentication pages layout (login, signup, forgot password)',
96
+ path: 'templates/ui/layouts/auth',
97
+ defaultOutput: 'src/app/layouts/auth',
98
+ tags: ['auth', 'login', 'signup', 'authentication'],
99
+ dependencies: ['@spartan-ng/helm/button', '@spartan-ng/helm/card', '@spartan-ng/helm/form-field']
100
+ }
101
+ ],
102
+ examples: {
103
+ all: {
104
+ name: 'all',
105
+ title: 'All Spartan-NG Examples',
106
+ description: 'Complete collection of 50+ Spartan-NG component examples with usage patterns and variants',
107
+ path: 'templates/spartan-examples',
108
+ defaultOutput: 'src/app/spartan-examples',
109
+ tags: ['examples', 'spartan-ng', 'all', 'reference'],
110
+ count: '50+',
111
+ purpose: 'Learning and reference for developers and LLMs'
112
+ },
113
+ components: [
114
+ {
115
+ name: 'accordion',
116
+ title: 'Accordion Examples',
117
+ description: 'Collapsible content sections examples',
118
+ path: 'templates/spartan-examples/components/(accordion)',
119
+ defaultOutput: 'src/app/examples/accordion',
120
+ tags: ['accordion', 'collapsible', 'expand']
121
+ },
122
+ {
123
+ name: 'alert',
124
+ title: 'Alert Examples',
125
+ description: 'Status messages and notifications examples',
126
+ path: 'templates/spartan-examples/components/(alert)',
127
+ defaultOutput: 'src/app/examples/alert',
128
+ tags: ['alert', 'notification', 'message']
129
+ },
130
+ {
131
+ name: 'alert-dialog',
132
+ title: 'Alert Dialog Examples',
133
+ description: 'Confirmation and alert dialogs examples',
134
+ path: 'templates/spartan-examples/components/(alert-dialog)',
135
+ defaultOutput: 'src/app/examples/alert-dialog',
136
+ tags: ['dialog', 'alert', 'confirmation', 'modal']
137
+ },
138
+ {
139
+ name: 'button',
140
+ title: 'Button Examples',
141
+ description: 'Interactive buttons with multiple variants examples',
142
+ path: 'templates/spartan-examples/components/(button)',
143
+ defaultOutput: 'src/app/examples/button',
144
+ tags: ['button', 'action', 'interactive']
145
+ },
146
+ {
147
+ name: 'card',
148
+ title: 'Card Examples',
149
+ description: 'Content containers with header, content, and footer examples',
150
+ path: 'templates/spartan-examples/components/(card)',
151
+ defaultOutput: 'src/app/examples/card',
152
+ tags: ['card', 'container', 'layout']
153
+ },
154
+ {
155
+ name: 'dialog',
156
+ title: 'Dialog Examples',
157
+ description: 'Modal dialogs and popups examples',
158
+ path: 'templates/spartan-examples/components/(dialog)',
159
+ defaultOutput: 'src/app/examples/dialog',
160
+ tags: ['dialog', 'modal', 'popup', 'overlay']
161
+ },
162
+ {
163
+ name: 'form-field',
164
+ title: 'Form Field Examples',
165
+ description: 'Complete form fields with validation examples',
166
+ path: 'templates/spartan-examples/components/(form-field)',
167
+ defaultOutput: 'src/app/examples/form-field',
168
+ tags: ['form', 'input', 'validation']
169
+ },
170
+ {
171
+ name: 'input',
172
+ title: 'Input Examples',
173
+ description: 'Form input fields examples',
174
+ path: 'templates/spartan-examples/components/(input)',
175
+ defaultOutput: 'src/app/examples/input',
176
+ tags: ['input', 'form', 'text']
177
+ },
178
+ {
179
+ name: 'select',
180
+ title: 'Select Examples',
181
+ description: 'Dropdown selection controls examples',
182
+ path: 'templates/spartan-examples/components/(select)',
183
+ defaultOutput: 'src/app/examples/select',
184
+ tags: ['select', 'dropdown', 'form']
185
+ },
186
+ {
187
+ name: 'table',
188
+ title: 'Table Examples',
189
+ description: 'Data tables examples',
190
+ path: 'templates/spartan-examples/components/(table)',
191
+ defaultOutput: 'src/app/examples/table',
192
+ tags: ['table', 'data', 'grid']
193
+ },
194
+ {
195
+ name: 'data-table',
196
+ title: 'Data Table Examples',
197
+ description: 'Advanced data tables with sorting and filtering examples',
198
+ path: 'templates/spartan-examples/components/(data-table)',
199
+ defaultOutput: 'src/app/examples/data-table',
200
+ tags: ['table', 'data', 'sorting', 'filtering', 'advanced']
201
+ }
202
+ ]
203
+ }
204
+ };
205
+
206
+ const REPO = 'gh:Genesis-Research/grg-kit';
207
+
208
+ module.exports = { RESOURCES, REPO };
package/package.json ADDED
@@ -0,0 +1,36 @@
1
+ {
2
+ "name": "grg-kit-cli",
3
+ "version": "0.1.0",
4
+ "description": "CLI tool for pulling GRG Kit resources into your Angular project",
5
+ "main": "index.js",
6
+ "bin": {
7
+ "grg": "./bin/grg.js"
8
+ },
9
+ "scripts": {
10
+ "test": "echo \"Error: no test specified\" && exit 1"
11
+ },
12
+ "keywords": [
13
+ "angular",
14
+ "ui",
15
+ "components",
16
+ "tailwind",
17
+ "spartan-ng",
18
+ "cli"
19
+ ],
20
+ "author": "Genesis Research",
21
+ "license": "MIT",
22
+ "repository": {
23
+ "type": "git",
24
+ "url": "https://github.com/Genesis-Research/grg-kit.git",
25
+ "directory": "cli"
26
+ },
27
+ "dependencies": {
28
+ "commander": "^11.1.0",
29
+ "degit": "^2.8.4",
30
+ "chalk": "^4.1.2",
31
+ "ora": "^5.4.1"
32
+ },
33
+ "engines": {
34
+ "node": ">=16.0.0"
35
+ }
36
+ }