ecomcoder-cli 1.3.3 → 1.3.5

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 (80) hide show
  1. package/README.md +0 -23
  2. package/dist/cli.js +4 -84
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/discount/index.d.ts.map +1 -1
  5. package/dist/commands/discount/index.js +10 -49
  6. package/dist/commands/discount/index.js.map +1 -1
  7. package/dist/commands/docs/index.d.ts.map +1 -1
  8. package/dist/commands/docs/index.js +4 -18
  9. package/dist/commands/docs/index.js.map +1 -1
  10. package/dist/commands/metafield/index.d.ts.map +1 -1
  11. package/dist/commands/metafield/index.js +6 -24
  12. package/dist/commands/metafield/index.js.map +1 -1
  13. package/dist/commands/product/create.d.ts +8 -0
  14. package/dist/commands/product/create.d.ts.map +1 -0
  15. package/dist/commands/product/create.js +166 -0
  16. package/dist/commands/product/create.js.map +1 -0
  17. package/dist/commands/product/get-metafield.d.ts +8 -0
  18. package/dist/commands/product/get-metafield.d.ts.map +1 -0
  19. package/dist/commands/product/get-metafield.js +131 -0
  20. package/dist/commands/product/get-metafield.js.map +1 -0
  21. package/dist/commands/product/index.d.ts.map +1 -1
  22. package/dist/commands/product/index.js +42 -42
  23. package/dist/commands/product/index.js.map +1 -1
  24. package/dist/commands/product/queries.d.ts +19 -0
  25. package/dist/commands/product/queries.d.ts.map +1 -1
  26. package/dist/commands/product/queries.js +122 -0
  27. package/dist/commands/product/queries.js.map +1 -1
  28. package/dist/commands/product/service.d.ts +35 -1
  29. package/dist/commands/product/service.d.ts.map +1 -1
  30. package/dist/commands/product/service.js +241 -1
  31. package/dist/commands/product/service.js.map +1 -1
  32. package/dist/commands/product/set-metafield.d.ts +8 -0
  33. package/dist/commands/product/set-metafield.d.ts.map +1 -0
  34. package/dist/commands/product/set-metafield.js +174 -0
  35. package/dist/commands/product/set-metafield.js.map +1 -0
  36. package/dist/commands/product/types.d.ts +88 -0
  37. package/dist/commands/product/types.d.ts.map +1 -1
  38. package/dist/commands/product/update-status.d.ts +8 -0
  39. package/dist/commands/product/update-status.d.ts.map +1 -0
  40. package/dist/commands/product/update-status.js +105 -0
  41. package/dist/commands/product/update-status.js.map +1 -0
  42. package/dist/commands/products/index.d.ts.map +1 -1
  43. package/dist/commands/products/index.js +5 -31
  44. package/dist/commands/products/index.js.map +1 -1
  45. package/dist/commands/shop/get-metafield.d.ts +8 -0
  46. package/dist/commands/shop/get-metafield.d.ts.map +1 -0
  47. package/dist/commands/shop/get-metafield.js +117 -0
  48. package/dist/commands/shop/get-metafield.js.map +1 -0
  49. package/dist/commands/shop/index.d.ts +10 -0
  50. package/dist/commands/shop/index.d.ts.map +1 -0
  51. package/dist/commands/shop/index.js +38 -0
  52. package/dist/commands/shop/index.js.map +1 -0
  53. package/dist/commands/shop/queries.d.ts +24 -0
  54. package/dist/commands/shop/queries.d.ts.map +1 -0
  55. package/dist/commands/shop/queries.js +83 -0
  56. package/dist/commands/shop/queries.js.map +1 -0
  57. package/dist/commands/shop/service.d.ts +30 -0
  58. package/dist/commands/shop/service.d.ts.map +1 -0
  59. package/dist/commands/shop/service.js +131 -0
  60. package/dist/commands/shop/service.js.map +1 -0
  61. package/dist/commands/shop/set-metafield.d.ts +8 -0
  62. package/dist/commands/shop/set-metafield.d.ts.map +1 -0
  63. package/dist/commands/shop/set-metafield.js +174 -0
  64. package/dist/commands/shop/set-metafield.js.map +1 -0
  65. package/dist/commands/shop/types.d.ts +84 -0
  66. package/dist/commands/shop/types.d.ts.map +1 -0
  67. package/dist/commands/shop/types.js +6 -0
  68. package/dist/commands/shop/types.js.map +1 -0
  69. package/dist/lib/command-registry.d.ts +2 -0
  70. package/dist/lib/command-registry.d.ts.map +1 -1
  71. package/dist/lib/command-registry.js.map +1 -1
  72. package/dist/lib/help-generator.d.ts +28 -0
  73. package/dist/lib/help-generator.d.ts.map +1 -0
  74. package/dist/lib/help-generator.js +131 -0
  75. package/dist/lib/help-generator.js.map +1 -0
  76. package/dist/lib/help-utils.d.ts +17 -0
  77. package/dist/lib/help-utils.d.ts.map +1 -0
  78. package/dist/lib/help-utils.js +24 -0
  79. package/dist/lib/help-utils.js.map +1 -0
  80. package/package.json +1 -1
package/README.md CHANGED
@@ -53,22 +53,6 @@ ecomcoder products list --limit=50
53
53
  **Options:**
54
54
  - `--limit` - Maximum number of products to retrieve (default: 50)
55
55
 
56
- #### Set Product Rating
57
-
58
- Add rating metafields to a product (useful for testing review systems).
59
-
60
- ```bash
61
- ecomcoder products set-rating \
62
- --product-id="gid://shopify/Product/123456789" \
63
- --rating=4.5 \
64
- --count=127
65
- ```
66
-
67
- **Options:**
68
- - `--product-id` - Shopify product GID
69
- - `--rating` - Rating value (e.g., 4.5)
70
- - `--count` - Number of reviews/ratings
71
-
72
56
  ### Metafields
73
57
 
74
58
  #### Create Metafield Definition
@@ -173,7 +157,6 @@ ecomcoder-cli/
173
157
  │ ├── commands/ # Command implementations
174
158
  │ │ ├── create-dummy-products.ts
175
159
  │ │ ├── list-products.ts
176
- │ │ ├── set-product-rating.ts
177
160
  │ │ ├── create-metafield.ts
178
161
  │ │ ├── get-metafield.ts
179
162
  │ │ └── docs-search.ts
@@ -253,12 +236,6 @@ ecomcoder products create --count=25
253
236
  # List all products (up to 100)
254
237
  ecomcoder products list --limit=100
255
238
 
256
- # Add a 4.8 star rating with 243 reviews
257
- ecomcoder products set-rating \
258
- --product-id="gid://shopify/Product/8234567890" \
259
- --rating=4.8 \
260
- --count=243
261
-
262
239
  # Create a shop-level recommended products metafield
263
240
  ecomcoder metafield create \
264
241
  --name="Recommended Products" \
package/dist/cli.js CHANGED
@@ -12,103 +12,23 @@
12
12
  */
13
13
  import { getPositionalArgs } from './lib/args-parser.js';
14
14
  import { registry } from './lib/command-registry.js';
15
+ import { HelpGenerator } from './lib/help-generator.js';
15
16
  // Register all command groups
16
17
  import { registerProductCommands } from './commands/product/index.js';
18
+ import { registerShopCommands } from './commands/shop/index.js';
17
19
  import { registerMetafieldCommands } from './commands/metafield/index.js';
18
20
  import { registerProductsCommands } from './commands/products/index.js';
19
21
  import { registerDocsCommands } from './commands/docs/index.js';
20
22
  import { registerDiscountCommands } from './commands/discount/index.js';
21
23
  // Initialize registry
22
24
  registerProductCommands();
25
+ registerShopCommands();
23
26
  registerMetafieldCommands();
24
27
  registerProductsCommands();
25
28
  registerDocsCommands();
26
29
  registerDiscountCommands();
27
30
  function showMainHelp() {
28
- console.log(`
29
- EcomCoder CLI - Shopify Development Utilities
30
-
31
- USAGE:
32
- ecomcoder <command> <subcommand> [options]
33
-
34
- COMMANDS:
35
- products create Create dummy Shopify products for testing
36
- products list List products in your Shopify store
37
- products set-rating Set rating metafields on a product
38
- product get Get detailed product data
39
- product update-title Update product title
40
- product update-description Update product description
41
- product update-price Update product price and compare-at price
42
- product update-template Change product template assignment
43
- product create-variants Create product variants (bulk operation)
44
- product delete-variants Delete product variants (bulk operation)
45
- discount create-basic Create basic discount (percentage or fixed amount)
46
- discount create-bxgy Create BXGY (Buy X Get Y) discount
47
- discount create-shipping Create free shipping discount
48
- discount list List all discounts with filtering
49
- discount delete Delete a discount by ID
50
- metafield create Create metafield definition
51
- metafield get Get metafield definition(s)
52
- docs search Search Shopify theme documentation
53
-
54
- GLOBAL OPTIONS:
55
- --session-id Session ID for authentication (auto-provided when used with Claude)
56
- --help, -h Show help information
57
-
58
- ENVIRONMENT VARIABLES:
59
- SESSION_ID Session ID (auto-injected by Claude Agent SDK)
60
- BACKEND_URL Orchestrator backend URL (auto-injected by agent)
61
- SUPABASE_JWT Authentication token (auto-injected by agent)
62
- SUPABASE_URL Supabase project URL (auto-injected by agent)
63
- SUPABASE_ANON_KEY Supabase anonymous key (auto-injected by agent)
64
-
65
- EXAMPLES:
66
- # Create 10 dummy products
67
- ecomcoder products create --count=10
68
-
69
- # List 50 products
70
- ecomcoder products list --limit=50
71
-
72
- # Set product rating
73
- ecomcoder products set-rating --product-id="gid://shopify/Product/123" --rating=4.5 --count=127
74
-
75
- # Get product details
76
- ecomcoder product get --id=123456789
77
- ecomcoder product get --title="Blue T-Shirt"
78
-
79
- # Update product title
80
- ecomcoder product update-title --id=123 --title="Premium Hair Serum"
81
-
82
- # Update product description
83
- ecomcoder product update-description --id=123 --description="Premium cotton t-shirt"
84
-
85
- # Update product price (all variants)
86
- ecomcoder product update-price --id=123 --price=34.99 --compare-at-price=49.99 --all-variants
87
-
88
- # Change product template
89
- ecomcoder product update-template --id=123 --template=premium
90
-
91
- # Create product variants
92
- ecomcoder product create-variants --product-id=123 --variants='[{"price":"29.99","inventoryItem":{"sku":"TEST-001"}}]'
93
-
94
- # Delete product variants
95
- ecomcoder product delete-variants --product-id=123 --variant-ids="456,789"
96
-
97
- # Create product-level metafield
98
- ecomcoder metafield create --name="Rating" --key=rating --type=number_decimal --owner-type=PRODUCT
99
-
100
- # Create shop-level metafield (global)
101
- ecomcoder metafield create --name="Cart Upsell" --key=cart_upsell --type=product_reference --owner-type=SHOP
102
-
103
- # Get metafield definition
104
- ecomcoder metafield get --namespace=ecomcoder --key=upsell --owner-type=PRODUCT
105
-
106
- # Search Shopify theme docs
107
- ecomcoder docs search --query="How do sections work?"
108
-
109
- For more help on specific commands, run:
110
- ecomcoder <command> <subcommand> --help
111
- `);
31
+ console.log(HelpGenerator.generateMainHelp());
112
32
  }
113
33
  async function main() {
114
34
  const args = process.argv.slice(2);
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/discount/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH;;GAEG;AACH,wBAAgB,wBAAwB,IAAI,IAAI,CA4F/C"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/discount/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH;;GAEG;AACH,wBAAgB,wBAAwB,IAAI,IAAI,CAoD/C"}
@@ -4,6 +4,7 @@
4
4
  * Following Open/Closed Principle - commands register themselves
5
5
  */
6
6
  import { registry } from '../../lib/command-registry.js';
7
+ import { HelpGenerator } from '../../lib/help-generator.js';
7
8
  /**
8
9
  * Register all discount commands
9
10
  */
@@ -11,56 +12,9 @@ export function registerDiscountCommands() {
11
12
  // Register command group
12
13
  registry.registerGroup({
13
14
  command: 'discount',
14
- description: 'Create and manage Shopify discounts',
15
+ description: 'Create and manage discounts',
15
16
  showHelp: () => {
16
- console.log(`
17
- Discount Commands - Create and manage Shopify discounts
18
-
19
- USAGE:
20
- ecomcoder discount <subcommand> [options]
21
-
22
- SUBCOMMANDS:
23
- create-basic Create basic discount (percentage or fixed amount off)
24
- create-bxgy Create BXGY (Buy X Get Y) discount
25
- create-shipping Create free shipping discount
26
- list List all discounts with filtering
27
- delete Delete a discount by ID
28
-
29
- EXAMPLES:
30
- # Create percentage discount with code
31
- ecomcoder discount create-basic \\
32
- --title="Summer Sale" \\
33
- --code="SUMMER25" \\
34
- --type=percentage \\
35
- --value=0.25 \\
36
- --starts-at="2026-06-01T00:00:00Z"
37
-
38
- # Create fixed amount discount with minimum
39
- ecomcoder discount create-basic \\
40
- --title="$10 Off Orders Over $50" \\
41
- --code="SAVE10" \\
42
- --type=fixed_amount \\
43
- --value=10.00 \\
44
- --min-subtotal=50.00 \\
45
- --starts-at="2026-06-01T00:00:00Z"
46
-
47
- # Create automatic discount
48
- ecomcoder discount create-basic \\
49
- --title="VIP Discount" \\
50
- --automatic \\
51
- --type=percentage \\
52
- --value=0.15 \\
53
- --starts-at="2026-06-01T00:00:00Z"
54
-
55
- # List active discounts
56
- ecomcoder discount list --status=active
57
-
58
- # Delete discount
59
- ecomcoder discount delete --id="gid://shopify/DiscountCodeNode/123"
60
-
61
- For detailed help on a specific subcommand:
62
- ecomcoder discount <subcommand> --help
63
- `);
17
+ console.log(HelpGenerator.generateGroupHelp('discount'));
64
18
  }
65
19
  });
66
20
  // Register individual subcommands
@@ -68,30 +22,37 @@ For detailed help on a specific subcommand:
68
22
  command: 'discount',
69
23
  subcommand: 'create-basic',
70
24
  description: 'Create basic discount (percentage or fixed amount off)',
25
+ category: 'Create',
26
+ quickExample: 'ecomcoder discount create-basic --title="Summer Sale" --code="SUMMER25" --type=percentage --value=0.25 --starts-at="2026-06-01T00:00:00Z"',
71
27
  handler: async () => await import('./create-basic.js')
72
28
  });
73
29
  registry.register({
74
30
  command: 'discount',
75
31
  subcommand: 'create-bxgy',
76
32
  description: 'Create BXGY (Buy X Get Y) discount',
33
+ category: 'Create',
77
34
  handler: async () => await import('./create-bxgy.js')
78
35
  });
79
36
  registry.register({
80
37
  command: 'discount',
81
38
  subcommand: 'create-shipping',
82
39
  description: 'Create free shipping discount',
40
+ category: 'Create',
83
41
  handler: async () => await import('./create-shipping.js')
84
42
  });
85
43
  registry.register({
86
44
  command: 'discount',
87
45
  subcommand: 'list',
88
46
  description: 'List all discounts with filtering',
47
+ category: 'Manage',
48
+ quickExample: 'ecomcoder discount list --status=active',
89
49
  handler: async () => await import('./list.js')
90
50
  });
91
51
  registry.register({
92
52
  command: 'discount',
93
53
  subcommand: 'delete',
94
54
  description: 'Delete a discount by ID',
55
+ category: 'Manage',
95
56
  handler: async () => await import('./delete.js')
96
57
  });
97
58
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/discount/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AAEzD;;GAEG;AACH,MAAM,UAAU,wBAAwB;IACtC,yBAAyB;IACzB,QAAQ,CAAC,aAAa,CAAC;QACrB,OAAO,EAAE,UAAU;QACnB,WAAW,EAAE,qCAAqC;QAClD,QAAQ,EAAE,GAAG,EAAE;YACb,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+CjB,CAAC,CAAC;QACC,CAAC;KACF,CAAC,CAAC;IAEH,kCAAkC;IAClC,QAAQ,CAAC,QAAQ,CAAC;QAChB,OAAO,EAAE,UAAU;QACnB,UAAU,EAAE,cAAc;QAC1B,WAAW,EAAE,wDAAwD;QACrE,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,MAAM,MAAM,CAAC,mBAAmB,CAAC;KACvD,CAAC,CAAC;IAEH,QAAQ,CAAC,QAAQ,CAAC;QAChB,OAAO,EAAE,UAAU;QACnB,UAAU,EAAE,aAAa;QACzB,WAAW,EAAE,oCAAoC;QACjD,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,MAAM,MAAM,CAAC,kBAAkB,CAAC;KACtD,CAAC,CAAC;IAEH,QAAQ,CAAC,QAAQ,CAAC;QAChB,OAAO,EAAE,UAAU;QACnB,UAAU,EAAE,iBAAiB;QAC7B,WAAW,EAAE,+BAA+B;QAC5C,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,MAAM,MAAM,CAAC,sBAAsB,CAAC;KAC1D,CAAC,CAAC;IAEH,QAAQ,CAAC,QAAQ,CAAC;QAChB,OAAO,EAAE,UAAU;QACnB,UAAU,EAAE,MAAM;QAClB,WAAW,EAAE,mCAAmC;QAChD,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,MAAM,MAAM,CAAC,WAAW,CAAC;KAC/C,CAAC,CAAC;IAEH,QAAQ,CAAC,QAAQ,CAAC;QAChB,OAAO,EAAE,UAAU;QACnB,UAAU,EAAE,QAAQ;QACpB,WAAW,EAAE,yBAAyB;QACtC,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,MAAM,MAAM,CAAC,aAAa,CAAC;KACjD,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/discount/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAE5D;;GAEG;AACH,MAAM,UAAU,wBAAwB;IACtC,yBAAyB;IACzB,QAAQ,CAAC,aAAa,CAAC;QACrB,OAAO,EAAE,UAAU;QACnB,WAAW,EAAE,6BAA6B;QAC1C,QAAQ,EAAE,GAAG,EAAE;YACb,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC,CAAC;QAC3D,CAAC;KACF,CAAC,CAAC;IAEH,kCAAkC;IAClC,QAAQ,CAAC,QAAQ,CAAC;QAChB,OAAO,EAAE,UAAU;QACnB,UAAU,EAAE,cAAc;QAC1B,WAAW,EAAE,wDAAwD;QACrE,QAAQ,EAAE,QAAQ;QAClB,YAAY,EAAE,2IAA2I;QACzJ,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,MAAM,MAAM,CAAC,mBAAmB,CAAC;KACvD,CAAC,CAAC;IAEH,QAAQ,CAAC,QAAQ,CAAC;QAChB,OAAO,EAAE,UAAU;QACnB,UAAU,EAAE,aAAa;QACzB,WAAW,EAAE,oCAAoC;QACjD,QAAQ,EAAE,QAAQ;QAClB,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,MAAM,MAAM,CAAC,kBAAkB,CAAC;KACtD,CAAC,CAAC;IAEH,QAAQ,CAAC,QAAQ,CAAC;QAChB,OAAO,EAAE,UAAU;QACnB,UAAU,EAAE,iBAAiB;QAC7B,WAAW,EAAE,+BAA+B;QAC5C,QAAQ,EAAE,QAAQ;QAClB,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,MAAM,MAAM,CAAC,sBAAsB,CAAC;KAC1D,CAAC,CAAC;IAEH,QAAQ,CAAC,QAAQ,CAAC;QAChB,OAAO,EAAE,UAAU;QACnB,UAAU,EAAE,MAAM;QAClB,WAAW,EAAE,mCAAmC;QAChD,QAAQ,EAAE,QAAQ;QAClB,YAAY,EAAE,yCAAyC;QACvD,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,MAAM,MAAM,CAAC,WAAW,CAAC;KAC/C,CAAC,CAAC;IAEH,QAAQ,CAAC,QAAQ,CAAC;QAChB,OAAO,EAAE,UAAU;QACnB,UAAU,EAAE,QAAQ;QACpB,WAAW,EAAE,yBAAyB;QACtC,QAAQ,EAAE,QAAQ;QAClB,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,MAAM,MAAM,CAAC,aAAa,CAAC;KACjD,CAAC,CAAC;AACL,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/docs/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,IAAI,CAiC3C"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/docs/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,IAAI,CAkB3C"}
@@ -4,6 +4,7 @@
4
4
  * Following Open/Closed Principle - commands register themselves
5
5
  */
6
6
  import { registry } from '../../lib/command-registry.js';
7
+ import { HelpGenerator } from '../../lib/help-generator.js';
7
8
  /**
8
9
  * Register all docs commands
9
10
  */
@@ -11,25 +12,9 @@ export function registerDocsCommands() {
11
12
  // Register command group
12
13
  registry.registerGroup({
13
14
  command: 'docs',
14
- description: 'Search Shopify theme documentation',
15
+ description: 'Search theme documentation',
15
16
  showHelp: () => {
16
- console.log(`
17
- Docs Commands - Search Shopify theme documentation
18
-
19
- USAGE:
20
- ecomcoder docs <subcommand> [options]
21
-
22
- SUBCOMMANDS:
23
- search Search Shopify theme docs using RAG
24
-
25
- EXAMPLES:
26
- # Search Shopify theme docs
27
- ecomcoder docs search --query="How do sections work?"
28
- ecomcoder docs search --query="Liquid filters for dates"
29
-
30
- For detailed help on a specific subcommand:
31
- ecomcoder docs <subcommand> --help
32
- `);
17
+ console.log(HelpGenerator.generateGroupHelp('docs'));
33
18
  }
34
19
  });
35
20
  // Register individual subcommands
@@ -37,6 +22,7 @@ For detailed help on a specific subcommand:
37
22
  command: 'docs',
38
23
  subcommand: 'search',
39
24
  description: 'Search Shopify theme documentation',
25
+ quickExample: 'ecomcoder docs search --query="How do sections work?"',
40
26
  handler: async () => await import('../docs-search.js')
41
27
  });
42
28
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/docs/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AAEzD;;GAEG;AACH,MAAM,UAAU,oBAAoB;IAClC,yBAAyB;IACzB,QAAQ,CAAC,aAAa,CAAC;QACrB,OAAO,EAAE,MAAM;QACf,WAAW,EAAE,oCAAoC;QACjD,QAAQ,EAAE,GAAG,EAAE;YACb,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;CAgBjB,CAAC,CAAC;QACC,CAAC;KACF,CAAC,CAAC;IAEH,kCAAkC;IAClC,QAAQ,CAAC,QAAQ,CAAC;QAChB,OAAO,EAAE,MAAM;QACf,UAAU,EAAE,QAAQ;QACpB,WAAW,EAAE,oCAAoC;QACjD,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,MAAM,MAAM,CAAC,mBAAmB,CAAC;KACvD,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/docs/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAE5D;;GAEG;AACH,MAAM,UAAU,oBAAoB;IAClC,yBAAyB;IACzB,QAAQ,CAAC,aAAa,CAAC;QACrB,OAAO,EAAE,MAAM;QACf,WAAW,EAAE,4BAA4B;QACzC,QAAQ,EAAE,GAAG,EAAE;YACb,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC;QACvD,CAAC;KACF,CAAC,CAAC;IAEH,kCAAkC;IAClC,QAAQ,CAAC,QAAQ,CAAC;QAChB,OAAO,EAAE,MAAM;QACf,UAAU,EAAE,QAAQ;QACpB,WAAW,EAAE,oCAAoC;QACjD,YAAY,EAAE,uDAAuD;QACrE,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,MAAM,MAAM,CAAC,mBAAmB,CAAC;KACvD,CAAC,CAAC;AACL,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/metafield/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH;;GAEG;AACH,wBAAgB,yBAAyB,IAAI,IAAI,CA8ChD"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/metafield/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH;;GAEG;AACH,wBAAgB,yBAAyB,IAAI,IAAI,CA2BhD"}
@@ -4,6 +4,7 @@
4
4
  * Following Open/Closed Principle - commands register themselves
5
5
  */
6
6
  import { registry } from '../../lib/command-registry.js';
7
+ import { HelpGenerator } from '../../lib/help-generator.js';
7
8
  /**
8
9
  * Register all metafield commands
9
10
  */
@@ -11,31 +12,9 @@ export function registerMetafieldCommands() {
11
12
  // Register command group
12
13
  registry.registerGroup({
13
14
  command: 'metafield',
14
- description: 'Manage Shopify metafield definitions',
15
+ description: 'Metafield definitions',
15
16
  showHelp: () => {
16
- console.log(`
17
- Metafield Commands - Manage Shopify metafield definitions
18
-
19
- USAGE:
20
- ecomcoder metafield <subcommand> [options]
21
-
22
- SUBCOMMANDS:
23
- create Create metafield definition
24
- get Get metafield definition(s)
25
-
26
- EXAMPLES:
27
- # Create product-level metafield
28
- ecomcoder metafield create --name="Rating" --key=rating --type=number_decimal --owner-type=PRODUCT
29
-
30
- # Create shop-level metafield (global)
31
- ecomcoder metafield create --name="Cart Upsell" --key=cart_upsell --type=product_reference --owner-type=SHOP
32
-
33
- # Get metafield definition
34
- ecomcoder metafield get --namespace=ecomcoder --key=upsell --owner-type=PRODUCT
35
-
36
- For detailed help on a specific subcommand:
37
- ecomcoder metafield <subcommand> --help
38
- `);
17
+ console.log(HelpGenerator.generateGroupHelp('metafield'));
39
18
  }
40
19
  });
41
20
  // Register individual subcommands
@@ -43,12 +22,15 @@ For detailed help on a specific subcommand:
43
22
  command: 'metafield',
44
23
  subcommand: 'create',
45
24
  description: 'Create metafield definition',
25
+ category: 'Definitions',
26
+ quickExample: 'ecomcoder metafield create --name="Rating" --key=rating --type=number_decimal --owner-type=PRODUCT',
46
27
  handler: async () => await import('../create-metafield.js')
47
28
  });
48
29
  registry.register({
49
30
  command: 'metafield',
50
31
  subcommand: 'get',
51
32
  description: 'Get metafield definition(s)',
33
+ category: 'Definitions',
52
34
  handler: async () => await import('../get-metafield.js')
53
35
  });
54
36
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/metafield/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AAEzD;;GAEG;AACH,MAAM,UAAU,yBAAyB;IACvC,yBAAyB;IACzB,QAAQ,CAAC,aAAa,CAAC;QACrB,OAAO,EAAE,WAAW;QACpB,WAAW,EAAE,sCAAsC;QACnD,QAAQ,EAAE,GAAG,EAAE;YACb,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;CAsBjB,CAAC,CAAC;QACC,CAAC;KACF,CAAC,CAAC;IAEH,kCAAkC;IAClC,QAAQ,CAAC,QAAQ,CAAC;QAChB,OAAO,EAAE,WAAW;QACpB,UAAU,EAAE,QAAQ;QACpB,WAAW,EAAE,6BAA6B;QAC1C,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,MAAM,MAAM,CAAC,wBAAwB,CAAC;KAC5D,CAAC,CAAC;IAEH,QAAQ,CAAC,QAAQ,CAAC;QAChB,OAAO,EAAE,WAAW;QACpB,UAAU,EAAE,KAAK;QACjB,WAAW,EAAE,6BAA6B;QAC1C,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,MAAM,MAAM,CAAC,qBAAqB,CAAC;KACzD,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/metafield/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAE5D;;GAEG;AACH,MAAM,UAAU,yBAAyB;IACvC,yBAAyB;IACzB,QAAQ,CAAC,aAAa,CAAC;QACrB,OAAO,EAAE,WAAW;QACpB,WAAW,EAAE,uBAAuB;QACpC,QAAQ,EAAE,GAAG,EAAE;YACb,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC,CAAC;QAC5D,CAAC;KACF,CAAC,CAAC;IAEH,kCAAkC;IAClC,QAAQ,CAAC,QAAQ,CAAC;QAChB,OAAO,EAAE,WAAW;QACpB,UAAU,EAAE,QAAQ;QACpB,WAAW,EAAE,6BAA6B;QAC1C,QAAQ,EAAE,aAAa;QACvB,YAAY,EAAE,oGAAoG;QAClH,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,MAAM,MAAM,CAAC,wBAAwB,CAAC;KAC5D,CAAC,CAAC;IAEH,QAAQ,CAAC,QAAQ,CAAC;QAChB,OAAO,EAAE,WAAW;QACpB,UAAU,EAAE,KAAK;QACjB,WAAW,EAAE,6BAA6B;QAC1C,QAAQ,EAAE,aAAa;QACvB,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,MAAM,MAAM,CAAC,qBAAqB,CAAC;KACzD,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Create Product Command
3
+ *
4
+ * Following Command Pattern - thin orchestration layer
5
+ * Delegates business logic to ProductService
6
+ */
7
+ export declare function run(argv?: string[]): Promise<void>;
8
+ //# sourceMappingURL=create.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../src/commands/product/create.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAqEH,wBAAsB,GAAG,CAAC,IAAI,GAAE,MAAM,EAA0B,iBAiH/D"}
@@ -0,0 +1,166 @@
1
+ /**
2
+ * Create Product Command
3
+ *
4
+ * Following Command Pattern - thin orchestration layer
5
+ * Delegates business logic to ProductService
6
+ */
7
+ import { getCredentials, getSessionId } from '../../lib/api-client.js';
8
+ import { parseArgs, hasHelpFlag } from '../../lib/args-parser.js';
9
+ import { ProductService } from './service.js';
10
+ function showHelp() {
11
+ console.log(`
12
+ Create Product
13
+
14
+ USAGE:
15
+ ecomcoder product create [OPTIONS]
16
+
17
+ REQUIRED OPTIONS:
18
+ --title <text> Product title (required)
19
+
20
+ OPTIONAL:
21
+ --description <text> Product description (HTML supported)
22
+ --price <amount> Initial variant price
23
+ --compare-at-price <amount> Sale/original price
24
+ --sku <sku> SKU for initial variant
25
+ --product-type <type> Product type/category
26
+ --vendor <name> Product vendor/brand
27
+ --status <status> Product status: ACTIVE, DRAFT, or ARCHIVED (default: DRAFT)
28
+ --handle <handle> URL slug (auto-generated from title if not provided)
29
+ --tags <tags> Comma-separated tags
30
+ --session-id Session ID (auto-provided via SESSION_ID env var)
31
+ --help, -h Show this help message
32
+
33
+ EXAMPLES:
34
+ # Minimal product (title only)
35
+ ecomcoder product create --title="Premium Hair Serum"
36
+
37
+ # Product with pricing
38
+ ecomcoder product create \\
39
+ --title="Premium Hair Serum" \\
40
+ --price=29.99 \\
41
+ --compare-at-price=44.95 \\
42
+ --sku="HAIR-001"
43
+
44
+ # Complete product
45
+ ecomcoder product create \\
46
+ --title="Therapy Hair Serum - Natural Formula" \\
47
+ --description="<h2>Premium Formula</h2><p>Natural ingredients for healthy hair</p>" \\
48
+ --price=34.99 \\
49
+ --sku="HAIR-SERUM-001" \\
50
+ --product-type="Hair Care" \\
51
+ --vendor="Beauty Co" \\
52
+ --status=ACTIVE \\
53
+ --tags="natural,organic,hair-care"
54
+
55
+ # Draft product (for review before publishing)
56
+ ecomcoder product create \\
57
+ --title="New Product Launch" \\
58
+ --status=DRAFT
59
+
60
+ IMPORTANT NOTES:
61
+ ⚠️ Inventory Setup Required: Created products start with 0 inventory.
62
+ You must set inventory quantities in Shopify Admin:
63
+ Products → [Product Name] → Variants → Edit inventory
64
+
65
+ ⚠️ Single Variant: Creates only 1 initial variant.
66
+ Use 'product create-variants' to add more variants.
67
+
68
+ ⚠️ No Images: Product images must be added separately.
69
+ `);
70
+ process.exit(0);
71
+ }
72
+ export async function run(argv = process.argv.slice(2)) {
73
+ if (hasHelpFlag(argv)) {
74
+ showHelp();
75
+ }
76
+ const args = parseArgs(argv);
77
+ // Validate required argument
78
+ if (!args.title) {
79
+ console.error(JSON.stringify({
80
+ success: false,
81
+ error: 'Missing required argument: --title'
82
+ }));
83
+ process.exit(1);
84
+ }
85
+ // Validate title is not empty
86
+ if (typeof args.title === 'string' && args.title.trim() === '') {
87
+ console.error(JSON.stringify({
88
+ success: false,
89
+ error: 'Title cannot be empty'
90
+ }));
91
+ process.exit(1);
92
+ }
93
+ // Validate status if provided
94
+ const validStatuses = ['ACTIVE', 'DRAFT', 'ARCHIVED'];
95
+ if (args.status && !validStatuses.includes(args.status.toUpperCase())) {
96
+ console.error(JSON.stringify({
97
+ success: false,
98
+ error: `Invalid status. Must be one of: ${validStatuses.join(', ')}`
99
+ }));
100
+ process.exit(1);
101
+ }
102
+ try {
103
+ // Get credentials
104
+ const sessionId = getSessionId(args.sessionId);
105
+ const credentials = await getCredentials(sessionId, args.backendUrl, args.jwt);
106
+ // Build input object
107
+ const input = {
108
+ title: args.title.trim()
109
+ };
110
+ // Add optional fields
111
+ if (args.description) {
112
+ input.descriptionHtml = args.description;
113
+ }
114
+ if (args.productType) {
115
+ input.productType = args.productType;
116
+ }
117
+ if (args.vendor) {
118
+ input.vendor = args.vendor;
119
+ }
120
+ if (args.status) {
121
+ input.status = args.status.toUpperCase();
122
+ }
123
+ if (args.handle) {
124
+ input.handle = args.handle;
125
+ }
126
+ if (args.tags) {
127
+ input.tags = args.tags.split(',').map((tag) => tag.trim());
128
+ }
129
+ // Build initial variant if price or SKU provided
130
+ // Service layer will update the variant after product creation
131
+ if (args.price || args.sku || args.compareAtPrice) {
132
+ const variant = {};
133
+ if (args.price) {
134
+ variant.price = args.price;
135
+ }
136
+ if (args.compareAtPrice) {
137
+ variant.compareAtPrice = args.compareAtPrice;
138
+ }
139
+ if (args.sku) {
140
+ variant.inventoryItem = {
141
+ sku: args.sku
142
+ };
143
+ }
144
+ input.variants = [variant];
145
+ }
146
+ // Execute create via service
147
+ const result = await ProductService.createProduct(credentials, input);
148
+ // Output result
149
+ console.log(JSON.stringify(result, null, 2));
150
+ // Show inventory warning if successful
151
+ if (result.success) {
152
+ console.error('\n⚠️ IMPORTANT: Product created with 0 inventory. Set inventory quantities in Shopify Admin.\n');
153
+ }
154
+ if (!result.success) {
155
+ process.exit(1);
156
+ }
157
+ }
158
+ catch (error) {
159
+ console.error(JSON.stringify({
160
+ success: false,
161
+ error: error.message || 'Unknown error occurred'
162
+ }));
163
+ process.exit(1);
164
+ }
165
+ }
166
+ //# sourceMappingURL=create.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.js","sourceRoot":"","sources":["../../../src/commands/product/create.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Get Product Metafield Command
3
+ *
4
+ * Following Command Pattern - thin orchestration layer
5
+ * Delegates business logic to ProductService
6
+ */
7
+ export declare function run(argv?: string[]): Promise<void>;
8
+ //# sourceMappingURL=get-metafield.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-metafield.d.ts","sourceRoot":"","sources":["../../../src/commands/product/get-metafield.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAmFH,wBAAsB,GAAG,CAAC,IAAI,GAAE,MAAM,EAA0B,iBAkD/D"}