hydrogen-forge 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.
Files changed (118) hide show
  1. package/README.md +212 -0
  2. package/dist/commands/add.d.ts +7 -0
  3. package/dist/commands/add.d.ts.map +1 -0
  4. package/dist/commands/add.js +123 -0
  5. package/dist/commands/add.js.map +1 -0
  6. package/dist/commands/create.d.ts +8 -0
  7. package/dist/commands/create.d.ts.map +1 -0
  8. package/dist/commands/create.js +160 -0
  9. package/dist/commands/create.js.map +1 -0
  10. package/dist/commands/setup-mcp.d.ts +7 -0
  11. package/dist/commands/setup-mcp.d.ts.map +1 -0
  12. package/dist/commands/setup-mcp.js +179 -0
  13. package/dist/commands/setup-mcp.js.map +1 -0
  14. package/dist/index.d.ts +3 -0
  15. package/dist/index.d.ts.map +1 -0
  16. package/dist/index.js +50 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/lib/generators.d.ts +6 -0
  19. package/dist/lib/generators.d.ts.map +1 -0
  20. package/dist/lib/generators.js +470 -0
  21. package/dist/lib/generators.js.map +1 -0
  22. package/dist/lib/utils.d.ts +17 -0
  23. package/dist/lib/utils.d.ts.map +1 -0
  24. package/dist/lib/utils.js +101 -0
  25. package/dist/lib/utils.js.map +1 -0
  26. package/package.json +54 -0
  27. package/templates/starter/.env.example +21 -0
  28. package/templates/starter/.graphqlrc.ts +27 -0
  29. package/templates/starter/README.md +117 -0
  30. package/templates/starter/app/assets/favicon.svg +28 -0
  31. package/templates/starter/app/components/AddToCartButton.tsx +102 -0
  32. package/templates/starter/app/components/Aside.tsx +136 -0
  33. package/templates/starter/app/components/CartLineItem.tsx +229 -0
  34. package/templates/starter/app/components/CartMain.tsx +131 -0
  35. package/templates/starter/app/components/CartSummary.tsx +315 -0
  36. package/templates/starter/app/components/CollectionFilters.tsx +330 -0
  37. package/templates/starter/app/components/CollectionGrid.tsx +141 -0
  38. package/templates/starter/app/components/Footer.tsx +218 -0
  39. package/templates/starter/app/components/Header.tsx +296 -0
  40. package/templates/starter/app/components/PageLayout.tsx +174 -0
  41. package/templates/starter/app/components/PaginatedResourceSection.tsx +41 -0
  42. package/templates/starter/app/components/ProductCard.tsx +151 -0
  43. package/templates/starter/app/components/ProductForm.tsx +156 -0
  44. package/templates/starter/app/components/ProductGallery.tsx +164 -0
  45. package/templates/starter/app/components/ProductGrid.tsx +64 -0
  46. package/templates/starter/app/components/ProductImage.tsx +23 -0
  47. package/templates/starter/app/components/ProductItem.tsx +44 -0
  48. package/templates/starter/app/components/ProductPrice.tsx +97 -0
  49. package/templates/starter/app/components/SearchDialog.tsx +599 -0
  50. package/templates/starter/app/components/SearchForm.tsx +68 -0
  51. package/templates/starter/app/components/SearchFormPredictive.tsx +76 -0
  52. package/templates/starter/app/components/SearchResults.tsx +161 -0
  53. package/templates/starter/app/components/SearchResultsPredictive.tsx +461 -0
  54. package/templates/starter/app/entry.client.tsx +21 -0
  55. package/templates/starter/app/entry.server.tsx +53 -0
  56. package/templates/starter/app/graphql/customer-account/CustomerAddressMutations.ts +64 -0
  57. package/templates/starter/app/graphql/customer-account/CustomerDetailsQuery.ts +40 -0
  58. package/templates/starter/app/graphql/customer-account/CustomerOrderQuery.ts +90 -0
  59. package/templates/starter/app/graphql/customer-account/CustomerOrdersQuery.ts +63 -0
  60. package/templates/starter/app/graphql/customer-account/CustomerUpdateMutation.ts +25 -0
  61. package/templates/starter/app/lib/context.ts +60 -0
  62. package/templates/starter/app/lib/fragments.ts +234 -0
  63. package/templates/starter/app/lib/orderFilters.ts +90 -0
  64. package/templates/starter/app/lib/redirect.ts +23 -0
  65. package/templates/starter/app/lib/search.ts +79 -0
  66. package/templates/starter/app/lib/session.ts +72 -0
  67. package/templates/starter/app/lib/variants.ts +46 -0
  68. package/templates/starter/app/root.tsx +209 -0
  69. package/templates/starter/app/routes/$.tsx +11 -0
  70. package/templates/starter/app/routes/[robots.txt].tsx +117 -0
  71. package/templates/starter/app/routes/[sitemap.xml].tsx +16 -0
  72. package/templates/starter/app/routes/_index.tsx +167 -0
  73. package/templates/starter/app/routes/account.$.tsx +9 -0
  74. package/templates/starter/app/routes/account._index.tsx +5 -0
  75. package/templates/starter/app/routes/account.addresses.tsx +516 -0
  76. package/templates/starter/app/routes/account.orders.$id.tsx +222 -0
  77. package/templates/starter/app/routes/account.orders._index.tsx +222 -0
  78. package/templates/starter/app/routes/account.profile.tsx +133 -0
  79. package/templates/starter/app/routes/account.tsx +97 -0
  80. package/templates/starter/app/routes/account_.authorize.tsx +5 -0
  81. package/templates/starter/app/routes/account_.login.tsx +7 -0
  82. package/templates/starter/app/routes/account_.logout.tsx +11 -0
  83. package/templates/starter/app/routes/api.$version.[graphql.json].tsx +14 -0
  84. package/templates/starter/app/routes/blogs.$blogHandle.$articleHandle.tsx +129 -0
  85. package/templates/starter/app/routes/blogs.$blogHandle._index.tsx +175 -0
  86. package/templates/starter/app/routes/blogs._index.tsx +109 -0
  87. package/templates/starter/app/routes/cart.$lines.tsx +70 -0
  88. package/templates/starter/app/routes/cart.tsx +117 -0
  89. package/templates/starter/app/routes/collections.$handle.tsx +161 -0
  90. package/templates/starter/app/routes/collections._index.tsx +133 -0
  91. package/templates/starter/app/routes/collections.all.tsx +122 -0
  92. package/templates/starter/app/routes/discount.$code.tsx +48 -0
  93. package/templates/starter/app/routes/pages.$handle.tsx +88 -0
  94. package/templates/starter/app/routes/policies.$handle.tsx +93 -0
  95. package/templates/starter/app/routes/policies._index.tsx +69 -0
  96. package/templates/starter/app/routes/products.$handle.tsx +232 -0
  97. package/templates/starter/app/routes/search.tsx +426 -0
  98. package/templates/starter/app/routes/sitemap.$type.$page[.xml].tsx +23 -0
  99. package/templates/starter/app/routes.ts +9 -0
  100. package/templates/starter/app/styles/app.css +574 -0
  101. package/templates/starter/app/styles/reset.css +139 -0
  102. package/templates/starter/app/styles/tailwind.css +116 -0
  103. package/templates/starter/customer-accountapi.generated.d.ts +543 -0
  104. package/templates/starter/env.d.ts +7 -0
  105. package/templates/starter/eslint.config.js +247 -0
  106. package/templates/starter/guides/predictiveSearch/predictiveSearch.jpg +0 -0
  107. package/templates/starter/guides/predictiveSearch/predictiveSearch.md +394 -0
  108. package/templates/starter/guides/search/search.jpg +0 -0
  109. package/templates/starter/guides/search/search.md +335 -0
  110. package/templates/starter/package.json +71 -0
  111. package/templates/starter/postcss.config.js +6 -0
  112. package/templates/starter/public/.gitkeep +0 -0
  113. package/templates/starter/react-router.config.ts +13 -0
  114. package/templates/starter/server.ts +59 -0
  115. package/templates/starter/storefrontapi.generated.d.ts +1264 -0
  116. package/templates/starter/tailwind.config.js +83 -0
  117. package/templates/starter/tsconfig.json +67 -0
  118. package/templates/starter/vite.config.ts +32 -0
package/README.md ADDED
@@ -0,0 +1,212 @@
1
+ # hydrogen-forge
2
+
3
+ CLI for creating and managing Hydrogen Forge projects.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install -g hydrogen-forge
9
+ ```
10
+
11
+ Or use directly with npx:
12
+
13
+ ```bash
14
+ npx hydrogen-forge create my-store
15
+ ```
16
+
17
+ ## Commands
18
+
19
+ ### create
20
+
21
+ Create a new Hydrogen Forge project.
22
+
23
+ ```bash
24
+ hydrogen-forge create [name]
25
+ ```
26
+
27
+ **Options:**
28
+
29
+ | Option | Description |
30
+ | ---------------- | ---------------------------------- |
31
+ | `-t, --template` | Template to use (default: starter) |
32
+ | `--skip-install` | Skip npm install |
33
+ | `--skip-git` | Skip git initialization |
34
+
35
+ **Examples:**
36
+
37
+ ```bash
38
+ # Interactive mode
39
+ hydrogen-forge create
40
+
41
+ # With project name
42
+ hydrogen-forge create my-store
43
+
44
+ # Skip npm install
45
+ hydrogen-forge create my-store --skip-install
46
+
47
+ # Use different template
48
+ hydrogen-forge create my-store --template starter
49
+ ```
50
+
51
+ ### add
52
+
53
+ Add a component or route to your project.
54
+
55
+ ```bash
56
+ hydrogen-forge add <type> <name>
57
+ ```
58
+
59
+ **Types:**
60
+
61
+ - `component` - Add a React component
62
+ - `route` - Add a React Router route
63
+
64
+ **Options:**
65
+
66
+ | Option | Description |
67
+ | ------------- | ------------------------- |
68
+ | `-d, --dir` | Output directory |
69
+ | `--no-styles` | Skip Tailwind CSS classes |
70
+
71
+ **Examples:**
72
+
73
+ ```bash
74
+ # Add a component
75
+ hydrogen-forge add component ProductCard
76
+ hydrogen-forge add component CartDrawer
77
+ hydrogen-forge add component NewsletterForm
78
+
79
+ # Add a route
80
+ hydrogen-forge add route products.$handle
81
+ hydrogen-forge add route collections._index
82
+ hydrogen-forge add route api.webhook
83
+
84
+ # Custom directory
85
+ hydrogen-forge add component ProductCard --dir app/components/products
86
+
87
+ # Without Tailwind styles
88
+ hydrogen-forge add component BasicCard --no-styles
89
+ ```
90
+
91
+ **Component Types (auto-detected from name):**
92
+
93
+ | Name Contains | Template Type |
94
+ | ------------- | ----------------------------------- |
95
+ | `Product` | Product component with Image, Money |
96
+ | `Collection` | Collection card with overlay |
97
+ | `Cart` | Cart line item with CartForm |
98
+ | `Form` | Form with useNavigation |
99
+ | `Layout` | Layout wrapper with slots |
100
+ | (other) | Basic component |
101
+
102
+ **Route Types (auto-detected from name):**
103
+
104
+ | Name Pattern | Template Type |
105
+ | -------------- | --------------- |
106
+ | `api.*` | API endpoint |
107
+ | `account*` | Account page |
108
+ | `*product*` | Product page |
109
+ | `*collection*` | Collection page |
110
+ | (other) | Standard page |
111
+
112
+ ### setup-mcp
113
+
114
+ Configure MCP servers for Claude Code.
115
+
116
+ ```bash
117
+ hydrogen-forge setup-mcp
118
+ ```
119
+
120
+ **Options:**
121
+
122
+ | Option | Description |
123
+ | ------------ | ------------------------ |
124
+ | `--shopify` | Set up Shopify MCP only |
125
+ | `--hydrogen` | Set up Hydrogen MCP only |
126
+
127
+ **Examples:**
128
+
129
+ ```bash
130
+ # Interactive setup (both MCPs)
131
+ hydrogen-forge setup-mcp
132
+
133
+ # Shopify MCP only
134
+ hydrogen-forge setup-mcp --shopify
135
+
136
+ # Hydrogen MCP only
137
+ hydrogen-forge setup-mcp --hydrogen
138
+ ```
139
+
140
+ This command will:
141
+
142
+ 1. Detect your Claude Code configuration location
143
+ 2. Prompt for Shopify store credentials (if configuring Shopify MCP)
144
+ 3. Add MCP server configurations to `claude_desktop_config.json`
145
+
146
+ ## Quick Start
147
+
148
+ ```bash
149
+ # Create a new project
150
+ npx hydrogen-forge create my-store
151
+ cd my-store
152
+
153
+ # Connect to Shopify
154
+ npx shopify hydrogen link
155
+
156
+ # Start development
157
+ npm run dev
158
+
159
+ # Set up MCP servers for Claude Code
160
+ npx hydrogen-forge setup-mcp
161
+ ```
162
+
163
+ ## Project Structure
164
+
165
+ Projects created with `hydrogen-forge create` include:
166
+
167
+ ```
168
+ my-store/
169
+ ├── app/
170
+ │ ├── components/ # React components
171
+ │ ├── routes/ # React Router routes
172
+ │ ├── lib/ # Utilities
173
+ │ └── styles/ # CSS files
174
+ ├── public/ # Static assets
175
+ ├── .env # Environment variables
176
+ ├── package.json
177
+ ├── tailwind.config.js
178
+ └── vite.config.ts
179
+ ```
180
+
181
+ ## MCP Servers
182
+
183
+ After running `setup-mcp`, you'll have access to:
184
+
185
+ ### Shopify MCP
186
+
187
+ - `executeGraphQL` - Run any Shopify Admin API query
188
+ - `createProduct` - Create products with variants
189
+ - `updateProduct` - Update product fields
190
+ - `getProduct` - Get product by ID or handle
191
+ - `listProducts` - List and filter products
192
+ - `deleteProduct` - Delete products
193
+ - `updateInventory` - Set inventory quantity
194
+ - `adjustInventory` - Adjust inventory by delta
195
+ - `getInventoryLevels` - Get stock levels
196
+ - `listLocations` - List inventory locations
197
+ - `getProductInventory` - Get variant inventory
198
+
199
+ ### Hydrogen MCP
200
+
201
+ - `scaffoldComponent` - Generate component files
202
+ - `scaffoldRoute` - Generate route files
203
+ - `analyzeProject` - Analyze project structure
204
+
205
+ ## Requirements
206
+
207
+ - Node.js 20.0.0 or later
208
+ - npm, pnpm, or yarn
209
+
210
+ ## License
211
+
212
+ MIT
@@ -0,0 +1,7 @@
1
+ interface AddOptions {
2
+ dir?: string;
3
+ styles?: boolean;
4
+ }
5
+ export declare function addCommand(type: string, name: string, options: AddOptions): Promise<void>;
6
+ export {};
7
+ //# sourceMappingURL=add.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"AAOA,UAAU,UAAU;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAOD,wBAAsB,UAAU,CAC9B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,UAAU,GAClB,OAAO,CAAC,IAAI,CAAC,CAwBf"}
@@ -0,0 +1,123 @@
1
+ import * as fs from 'fs-extra';
2
+ import * as path from 'node:path';
3
+ import chalk from 'chalk';
4
+ import { printSuccess, printError, printInfo } from '../lib/utils.js';
5
+ import { generateComponent } from '../lib/generators.js';
6
+ import { generateRoute } from '../lib/generators.js';
7
+ const COMPONENT_TYPES = ['basic', 'product', 'collection', 'cart', 'form', 'layout'];
8
+ const ROUTE_TYPES = ['page', 'resource', 'collection', 'product', 'account', 'api'];
9
+ export async function addCommand(type, name, options) {
10
+ const normalizedType = type.toLowerCase();
11
+ if (normalizedType !== 'component' && normalizedType !== 'route') {
12
+ printError(`Invalid type "${type}". Use "component" or "route".`);
13
+ console.log();
14
+ console.log('Examples:');
15
+ console.log(` ${chalk.cyan('hydrogen-forge add component ProductCard')}`);
16
+ console.log(` ${chalk.cyan('hydrogen-forge add route products.$handle')}`);
17
+ process.exit(1);
18
+ }
19
+ // Check if we're in a Hydrogen project
20
+ const packageJsonPath = path.join(process.cwd(), 'package.json');
21
+ if (!(await fs.pathExists(packageJsonPath))) {
22
+ printError('Not in a project directory. Run this command from your project root.');
23
+ process.exit(1);
24
+ }
25
+ if (normalizedType === 'component') {
26
+ await addComponent(name, options);
27
+ }
28
+ else {
29
+ await addRoute(name, options);
30
+ }
31
+ }
32
+ async function addComponent(name, options) {
33
+ // Validate component name is PascalCase
34
+ if (!/^[A-Z][a-zA-Z0-9]*$/.test(name)) {
35
+ printError('Component name must be PascalCase (e.g., "ProductCard", "CartDrawer")');
36
+ process.exit(1);
37
+ }
38
+ // Detect component type from name
39
+ const componentType = detectComponentType(name);
40
+ const withStyles = options.styles !== false;
41
+ const outputDir = options.dir || 'app/components';
42
+ const componentPath = path.join(process.cwd(), outputDir, `${name}.tsx`);
43
+ // Check if file already exists
44
+ if (await fs.pathExists(componentPath)) {
45
+ printError(`Component ${name} already exists at ${componentPath}`);
46
+ process.exit(1);
47
+ }
48
+ // Generate component
49
+ const code = generateComponent(name, componentType, withStyles);
50
+ // Ensure directory exists
51
+ await fs.ensureDir(path.dirname(componentPath));
52
+ // Write file
53
+ await fs.writeFile(componentPath, code);
54
+ printSuccess(`Created ${chalk.cyan(name)} component`);
55
+ printInfo(`Location: ${chalk.dim(componentPath)}`);
56
+ console.log();
57
+ console.log(chalk.dim('Import with:'));
58
+ console.log(` ${chalk.cyan(`import {${name}} from '~/components/${name}';`)}`);
59
+ }
60
+ async function addRoute(name, options) {
61
+ // Validate route name
62
+ if (!/^[a-z$_.[\]]+$/i.test(name)) {
63
+ printError('Invalid route name. Use format like "products.$handle" or "collections._index"');
64
+ process.exit(1);
65
+ }
66
+ // Detect route type from name
67
+ const routeType = detectRouteType(name);
68
+ const outputDir = options.dir || 'app/routes';
69
+ const routePath = path.join(process.cwd(), outputDir, `${name}.tsx`);
70
+ // Check if file already exists
71
+ if (await fs.pathExists(routePath)) {
72
+ printError(`Route ${name} already exists at ${routePath}`);
73
+ process.exit(1);
74
+ }
75
+ // Generate route
76
+ const code = generateRoute(name, routeType);
77
+ // Ensure directory exists
78
+ await fs.ensureDir(path.dirname(routePath));
79
+ // Write file
80
+ await fs.writeFile(routePath, code);
81
+ // Calculate URL path
82
+ const urlPath = routeNameToUrlPath(name);
83
+ printSuccess(`Created ${chalk.cyan(name)} route`);
84
+ printInfo(`Location: ${chalk.dim(routePath)}`);
85
+ printInfo(`URL: ${chalk.dim(urlPath)}`);
86
+ }
87
+ function detectComponentType(name) {
88
+ const lowerName = name.toLowerCase();
89
+ if (lowerName.includes('product'))
90
+ return 'product';
91
+ if (lowerName.includes('collection'))
92
+ return 'collection';
93
+ if (lowerName.includes('cart'))
94
+ return 'cart';
95
+ if (lowerName.includes('form'))
96
+ return 'form';
97
+ if (lowerName.includes('layout'))
98
+ return 'layout';
99
+ return 'basic';
100
+ }
101
+ function detectRouteType(name) {
102
+ const lowerName = name.toLowerCase();
103
+ if (lowerName.startsWith('api.'))
104
+ return 'api';
105
+ if (lowerName.startsWith('account'))
106
+ return 'account';
107
+ if (lowerName.includes('product'))
108
+ return 'product';
109
+ if (lowerName.includes('collection'))
110
+ return 'collection';
111
+ if (lowerName.includes('_index'))
112
+ return 'page';
113
+ return 'page';
114
+ }
115
+ function routeNameToUrlPath(routeName) {
116
+ return ('/' +
117
+ routeName
118
+ .replace(/\._index$/, '')
119
+ .replace(/\./g, '/')
120
+ .replace(/\$/g, ':')
121
+ .replace(/\[([^\]]+)\]/g, '$1'));
122
+ }
123
+ //# sourceMappingURL=add.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add.js","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ interface CreateOptions {
2
+ template: string;
3
+ skipInstall?: boolean;
4
+ skipGit?: boolean;
5
+ }
6
+ export declare function createCommand(name: string | undefined, options: CreateOptions): Promise<void>;
7
+ export {};
8
+ //# sourceMappingURL=create.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"AAeA,UAAU,aAAa;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wBAAsB,aAAa,CACjC,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,IAAI,CAAC,CAoIf"}
@@ -0,0 +1,160 @@
1
+ import * as fs from 'fs-extra';
2
+ import * as path from 'node:path';
3
+ import chalk from 'chalk';
4
+ import inquirer from 'inquirer';
5
+ import { withSpinner, runCommand, validateProjectName, isDirectoryEmpty, printSuccess, printError, printInfo, printStep, } from '../lib/utils.js';
6
+ export async function createCommand(name, options) {
7
+ console.log();
8
+ console.log(chalk.bold('🔨 Hydrogen Forge'));
9
+ console.log(chalk.dim('Create a new Hydrogen project'));
10
+ console.log();
11
+ // Get project name if not provided
12
+ let projectName = name;
13
+ if (!projectName) {
14
+ const answers = await inquirer.prompt([
15
+ {
16
+ type: 'input',
17
+ name: 'projectName',
18
+ message: 'What is your project named?',
19
+ default: 'my-hydrogen-store',
20
+ validate: (input) => {
21
+ if (!validateProjectName(input)) {
22
+ return 'Project name must be a valid npm package name (lowercase, no spaces)';
23
+ }
24
+ return true;
25
+ },
26
+ },
27
+ ]);
28
+ projectName = answers.projectName;
29
+ }
30
+ // Validate project name
31
+ if (!projectName || !validateProjectName(projectName)) {
32
+ printError('Project name must be a valid npm package name (lowercase, no spaces)');
33
+ process.exit(1);
34
+ }
35
+ const targetDir = path.resolve(process.cwd(), projectName);
36
+ // Check if directory exists and is not empty
37
+ if (await fs.pathExists(targetDir)) {
38
+ if (!(await isDirectoryEmpty(targetDir))) {
39
+ const { overwrite } = await inquirer.prompt([
40
+ {
41
+ type: 'confirm',
42
+ name: 'overwrite',
43
+ message: `Directory ${projectName} is not empty. Continue anyway?`,
44
+ default: false,
45
+ },
46
+ ]);
47
+ if (!overwrite) {
48
+ printInfo('Cancelled');
49
+ process.exit(0);
50
+ }
51
+ }
52
+ }
53
+ const totalSteps = options.skipInstall ? (options.skipGit ? 2 : 3) : (options.skipGit ? 3 : 4);
54
+ let currentStep = 1;
55
+ // Step 1: Create project directory
56
+ printStep(currentStep++, totalSteps, 'Creating project directory...');
57
+ await withSpinner({ text: 'Setting up project structure' }, async () => {
58
+ await fs.ensureDir(targetDir);
59
+ // Copy template files
60
+ const templateDir = await getTemplateDir(options.template);
61
+ await copyTemplateFiles(templateDir, targetDir, projectName);
62
+ });
63
+ // Step 2: Update package.json
64
+ printStep(currentStep++, totalSteps, 'Configuring project...');
65
+ await withSpinner({ text: 'Updating package.json' }, async () => {
66
+ const packageJsonPath = path.join(targetDir, 'package.json');
67
+ if (await fs.pathExists(packageJsonPath)) {
68
+ const packageJson = await fs.readJson(packageJsonPath);
69
+ packageJson.name = projectName;
70
+ await fs.writeJson(packageJsonPath, packageJson, { spaces: 2 });
71
+ }
72
+ });
73
+ // Step 3: Initialize git (optional)
74
+ if (!options.skipGit) {
75
+ printStep(currentStep++, totalSteps, 'Initializing git repository...');
76
+ await withSpinner({ text: 'Running git init' }, async () => {
77
+ await runCommand('git', ['init'], targetDir);
78
+ await runCommand('git', ['add', '.'], targetDir);
79
+ await runCommand('git', ['commit', '-m', 'Initial commit from Hydrogen Forge'], targetDir);
80
+ });
81
+ }
82
+ // Step 4: Install dependencies (optional)
83
+ if (!options.skipInstall) {
84
+ printStep(currentStep++, totalSteps, 'Installing dependencies...');
85
+ await withSpinner({ text: 'Running npm install (this may take a moment)' }, async () => {
86
+ await runCommand('npm', ['install'], targetDir);
87
+ });
88
+ }
89
+ // Success message
90
+ console.log();
91
+ printSuccess(`Project ${chalk.cyan(projectName)} created successfully!`);
92
+ console.log();
93
+ console.log(chalk.bold('Next steps:'));
94
+ console.log();
95
+ console.log(` ${chalk.cyan('cd')} ${projectName}`);
96
+ if (options.skipInstall) {
97
+ console.log(` ${chalk.cyan('npm install')}`);
98
+ }
99
+ console.log(` ${chalk.cyan('npm run dev')}`);
100
+ console.log();
101
+ console.log(chalk.dim('To connect to Shopify, run:'));
102
+ console.log(` ${chalk.cyan('npx shopify hydrogen link')}`);
103
+ console.log();
104
+ console.log(chalk.dim('To set up MCP servers for Claude Code:'));
105
+ console.log(` ${chalk.cyan('hydrogen-forge setup-mcp')}`);
106
+ console.log();
107
+ }
108
+ async function getTemplateDir(template) {
109
+ // First, check if running from the monorepo (development)
110
+ const monorepoTemplate = path.resolve(import.meta.dirname, '../../../../templates', template);
111
+ if (await fs.pathExists(monorepoTemplate)) {
112
+ return monorepoTemplate;
113
+ }
114
+ // Check in the package's templates directory (published)
115
+ const packageTemplate = path.resolve(import.meta.dirname, '../templates', template);
116
+ if (await fs.pathExists(packageTemplate)) {
117
+ return packageTemplate;
118
+ }
119
+ throw new Error(`Template "${template}" not found`);
120
+ }
121
+ async function copyTemplateFiles(templateDir, targetDir, _projectName) {
122
+ // Copy all files from template
123
+ await fs.copy(templateDir, targetDir, {
124
+ filter: (src) => {
125
+ const basename = path.basename(src);
126
+ // Skip node_modules and build artifacts
127
+ if (basename === 'node_modules' || basename === 'dist' || basename === '.cache') {
128
+ return false;
129
+ }
130
+ return true;
131
+ },
132
+ });
133
+ // Create .env file if it doesn't exist
134
+ const envPath = path.join(targetDir, '.env');
135
+ if (!(await fs.pathExists(envPath))) {
136
+ const envContent = `# Shopify Storefront API
137
+ SESSION_SECRET="your-session-secret"
138
+ PUBLIC_STOREFRONT_API_TOKEN=""
139
+ PUBLIC_STORE_DOMAIN=""
140
+
141
+ # Optional: Customer Account API
142
+ PUBLIC_CUSTOMER_ACCOUNT_API_CLIENT_ID=""
143
+ PUBLIC_CUSTOMER_ACCOUNT_API_URL=""
144
+ `;
145
+ await fs.writeFile(envPath, envContent);
146
+ }
147
+ // Create .gitignore if it doesn't exist
148
+ const gitignorePath = path.join(targetDir, '.gitignore');
149
+ if (!(await fs.pathExists(gitignorePath))) {
150
+ const gitignoreContent = `node_modules
151
+ .cache
152
+ dist
153
+ .env
154
+ *.local
155
+ .DS_Store
156
+ `;
157
+ await fs.writeFile(gitignorePath, gitignoreContent);
158
+ }
159
+ }
160
+ //# sourceMappingURL=create.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ interface SetupMcpOptions {
2
+ shopify?: boolean;
3
+ hydrogen?: boolean;
4
+ }
5
+ export declare function setupMcpCommand(options: SetupMcpOptions): Promise<void>;
6
+ export {};
7
+ //# sourceMappingURL=setup-mcp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup-mcp.d.ts","sourceRoot":"","sources":["../../src/commands/setup-mcp.ts"],"names":[],"mappings":"AAOA,UAAU,eAAe;IACvB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAYD,wBAAsB,eAAe,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CA2H7E"}