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 +245 -0
- package/bin/grg.js +43 -0
- package/commands/add.js +125 -0
- package/commands/init.js +102 -0
- package/commands/list.js +94 -0
- package/commands/metadata.js +122 -0
- package/config/resources.js +208 -0
- package/package.json +36 -0
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();
|
package/commands/add.js
ADDED
|
@@ -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 };
|
package/commands/init.js
ADDED
|
@@ -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 };
|
package/commands/list.js
ADDED
|
@@ -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
|
+
}
|