ecomcoder-cli 1.3.13 → 1.3.14

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.
@@ -17,12 +17,27 @@ export interface ApprovalResponse {
17
17
  * Request approval from user (via ecomcoder-app)
18
18
  *
19
19
  * Protocol:
20
- * 1. Check if APPROVAL_GRANTED=true env var is set
21
- * 2. If set, return true (approved)
22
- * 3. If not set, output APPROVAL_REQUIRED JSON and exit
20
+ * 1. Check if approvals are globally disabled via configuration
21
+ * 2. Check if APPROVAL_GRANTED=true env var is set (for testing)
22
+ * 3. If neither, output APPROVAL_REQUIRED JSON and exit
23
+ *
24
+ * Configuration priority:
25
+ * - REQUIRE_APPROVAL environment variable
26
+ * - .ecomcoder.json in current directory
27
+ * - .ecomcoder.json in home directory
28
+ * - Default (true)
23
29
  *
24
30
  * @param request - Approval request details
25
- * @returns true if approved (only returns if pre-approved via env var)
31
+ * @returns true if approved (only returns if pre-approved)
32
+ *
33
+ * @example
34
+ * // Disable approvals globally
35
+ * REQUIRE_APPROVAL=false ecomcoder product update-price --id=123 --price=29.99
36
+ *
37
+ * @example
38
+ * // Disable approvals via config file
39
+ * echo '{"requireApproval": false}' > .ecomcoder.json
40
+ * ecomcoder product update-price --id=123 --price=29.99
26
41
  */
27
42
  export declare function requestApproval(request: ApprovalRequest): Promise<boolean>;
28
43
  //# sourceMappingURL=approval.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"approval.d.ts","sourceRoot":"","sources":["../../src/lib/approval.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,UAAU,GAAG,MAAM,CAAC;CAChC;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC,CAsBhF"}
1
+ {"version":3,"file":"approval.d.ts","sourceRoot":"","sources":["../../src/lib/approval.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,UAAU,GAAG,MAAM,CAAC;CAChC;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC,CA4BhF"}
@@ -5,19 +5,40 @@
5
5
  * Communicates with ecomcoder-app via stdout/stdin
6
6
  */
7
7
  import { randomUUID } from 'crypto';
8
+ import { getConfig } from './config.js';
8
9
  /**
9
10
  * Request approval from user (via ecomcoder-app)
10
11
  *
11
12
  * Protocol:
12
- * 1. Check if APPROVAL_GRANTED=true env var is set
13
- * 2. If set, return true (approved)
14
- * 3. If not set, output APPROVAL_REQUIRED JSON and exit
13
+ * 1. Check if approvals are globally disabled via configuration
14
+ * 2. Check if APPROVAL_GRANTED=true env var is set (for testing)
15
+ * 3. If neither, output APPROVAL_REQUIRED JSON and exit
16
+ *
17
+ * Configuration priority:
18
+ * - REQUIRE_APPROVAL environment variable
19
+ * - .ecomcoder.json in current directory
20
+ * - .ecomcoder.json in home directory
21
+ * - Default (true)
15
22
  *
16
23
  * @param request - Approval request details
17
- * @returns true if approved (only returns if pre-approved via env var)
24
+ * @returns true if approved (only returns if pre-approved)
25
+ *
26
+ * @example
27
+ * // Disable approvals globally
28
+ * REQUIRE_APPROVAL=false ecomcoder product update-price --id=123 --price=29.99
29
+ *
30
+ * @example
31
+ * // Disable approvals via config file
32
+ * echo '{"requireApproval": false}' > .ecomcoder.json
33
+ * ecomcoder product update-price --id=123 --price=29.99
18
34
  */
19
35
  export async function requestApproval(request) {
20
- // Check if approval was pre-granted via environment variable
36
+ // Check if approvals are globally disabled
37
+ const config = getConfig();
38
+ if (!config.requireApproval) {
39
+ return true; // Auto-approve when disabled
40
+ }
41
+ // Check if approval was pre-granted via environment variable (for automated tests)
21
42
  if (process.env.APPROVAL_GRANTED === 'true') {
22
43
  return true;
23
44
  }
@@ -1 +1 @@
1
- {"version":3,"file":"approval.js","sourceRoot":"","sources":["../../src/lib/approval.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAapC;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,OAAwB;IAC5D,6DAA6D;IAC7D,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,KAAK,MAAM,EAAE,CAAC;QAC5C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,UAAU,GAAG,UAAU,EAAE,CAAC;IAEhC,yCAAyC;IACzC,MAAM,eAAe,GAAG;QACtB,IAAI,EAAE,mBAAmB;QACzB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,UAAU;QACV,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC;IAEF,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC,CAAC;IAE7C,sFAAsF;IACtF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC"}
1
+ {"version":3,"file":"approval.js","sourceRoot":"","sources":["../../src/lib/approval.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAaxC;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,OAAwB;IAC5D,2CAA2C;IAC3C,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAC,CAAC,6BAA6B;IAC5C,CAAC;IAED,mFAAmF;IACnF,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,KAAK,MAAM,EAAE,CAAC;QAC5C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,UAAU,GAAG,UAAU,EAAE,CAAC;IAEhC,yCAAyC;IACzC,MAAM,eAAe,GAAG;QACtB,IAAI,EAAE,mBAAmB;QACzB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,UAAU;QACV,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC;IAEF,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC,CAAC;IAE7C,sFAAsF;IACtF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Configuration Management
3
+ *
4
+ * Centralized configuration for CLI behavior
5
+ * Supports multiple configuration sources with priority order:
6
+ * 1. Environment variables (highest priority)
7
+ * 2. .ecomcoder.json in current directory
8
+ * 3. .ecomcoder.json in home directory
9
+ * 4. Default values (lowest priority)
10
+ */
11
+ /**
12
+ * CLI Configuration Interface
13
+ */
14
+ export interface Config {
15
+ /**
16
+ * Whether to require user approval for destructive operations
17
+ * Set to true to enable approval prompts (useful for safety)
18
+ * @default false
19
+ */
20
+ requireApproval: boolean;
21
+ }
22
+ /**
23
+ * Get current CLI configuration
24
+ *
25
+ * Priority order:
26
+ * 1. REQUIRE_APPROVAL environment variable
27
+ * 2. .ecomcoder.json in current working directory
28
+ * 3. .ecomcoder.json in home directory
29
+ * 4. Default values (requireApproval: false)
30
+ *
31
+ * @returns Current configuration
32
+ *
33
+ * @example
34
+ * // Environment variable (highest priority)
35
+ * REQUIRE_APPROVAL=false ecomcoder product update-price --id=123 --price=29.99
36
+ *
37
+ * @example
38
+ * // Project-specific config
39
+ * echo '{"requireApproval": false}' > .ecomcoder.json
40
+ * ecomcoder product update-price --id=123 --price=29.99
41
+ *
42
+ * @example
43
+ * // Global user config
44
+ * echo '{"requireApproval": false}' > ~/.ecomcoder.json
45
+ * ecomcoder product update-price --id=123 --price=29.99
46
+ */
47
+ export declare function getConfig(): Config;
48
+ /**
49
+ * Clear cached configuration (useful for testing)
50
+ */
51
+ export declare function clearConfigCache(): void;
52
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAMH;;GAEG;AACH,MAAM,WAAW,MAAM;IACrB;;;;OAIG;IACH,eAAe,EAAE,OAAO,CAAC;CAC1B;AAWD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,SAAS,IAAI,MAAM,CAsClC;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC"}
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Configuration Management
3
+ *
4
+ * Centralized configuration for CLI behavior
5
+ * Supports multiple configuration sources with priority order:
6
+ * 1. Environment variables (highest priority)
7
+ * 2. .ecomcoder.json in current directory
8
+ * 3. .ecomcoder.json in home directory
9
+ * 4. Default values (lowest priority)
10
+ */
11
+ import { existsSync, readFileSync } from 'fs';
12
+ import { join } from 'path';
13
+ import { homedir } from 'os';
14
+ let cachedConfig = null;
15
+ /**
16
+ * Get current CLI configuration
17
+ *
18
+ * Priority order:
19
+ * 1. REQUIRE_APPROVAL environment variable
20
+ * 2. .ecomcoder.json in current working directory
21
+ * 3. .ecomcoder.json in home directory
22
+ * 4. Default values (requireApproval: false)
23
+ *
24
+ * @returns Current configuration
25
+ *
26
+ * @example
27
+ * // Environment variable (highest priority)
28
+ * REQUIRE_APPROVAL=false ecomcoder product update-price --id=123 --price=29.99
29
+ *
30
+ * @example
31
+ * // Project-specific config
32
+ * echo '{"requireApproval": false}' > .ecomcoder.json
33
+ * ecomcoder product update-price --id=123 --price=29.99
34
+ *
35
+ * @example
36
+ * // Global user config
37
+ * echo '{"requireApproval": false}' > ~/.ecomcoder.json
38
+ * ecomcoder product update-price --id=123 --price=29.99
39
+ */
40
+ export function getConfig() {
41
+ // Return cached config if available
42
+ if (cachedConfig) {
43
+ return cachedConfig;
44
+ }
45
+ // Default configuration
46
+ let requireApproval = false;
47
+ // Priority 1: Check environment variable
48
+ if (process.env.REQUIRE_APPROVAL !== undefined) {
49
+ requireApproval = process.env.REQUIRE_APPROVAL !== 'false';
50
+ }
51
+ else {
52
+ // Priority 2 & 3: Check for config files
53
+ const configPaths = [
54
+ join(process.cwd(), '.ecomcoder.json'), // Current directory
55
+ join(homedir(), '.ecomcoder.json') // Home directory
56
+ ];
57
+ for (const configPath of configPaths) {
58
+ if (existsSync(configPath)) {
59
+ try {
60
+ const configData = JSON.parse(readFileSync(configPath, 'utf-8'));
61
+ if (configData.requireApproval !== undefined) {
62
+ requireApproval = configData.requireApproval;
63
+ break; // Use first found config file
64
+ }
65
+ }
66
+ catch (error) {
67
+ // Invalid JSON or read error, skip to next config file
68
+ continue;
69
+ }
70
+ }
71
+ }
72
+ }
73
+ // Cache and return configuration
74
+ cachedConfig = { requireApproval };
75
+ return cachedConfig;
76
+ }
77
+ /**
78
+ * Clear cached configuration (useful for testing)
79
+ */
80
+ export function clearConfigCache() {
81
+ cachedConfig = null;
82
+ }
83
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAqB7B,IAAI,YAAY,GAAkB,IAAI,CAAC;AAEvC;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,UAAU,SAAS;IACvB,oCAAoC;IACpC,IAAI,YAAY,EAAE,CAAC;QACjB,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,wBAAwB;IACxB,IAAI,eAAe,GAAG,KAAK,CAAC;IAE5B,yCAAyC;IACzC,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,KAAK,SAAS,EAAE,CAAC;QAC/C,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,KAAK,OAAO,CAAC;IAC7D,CAAC;SAAM,CAAC;QACN,yCAAyC;QACzC,MAAM,WAAW,GAAG;YAClB,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,iBAAiB,CAAC,EAAY,oBAAoB;YACtE,IAAI,CAAC,OAAO,EAAE,EAAE,iBAAiB,CAAC,CAAgB,iBAAiB;SACpE,CAAC;QAEF,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;YACrC,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC3B,IAAI,CAAC;oBACH,MAAM,UAAU,GAAe,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;oBAC7E,IAAI,UAAU,CAAC,eAAe,KAAK,SAAS,EAAE,CAAC;wBAC7C,eAAe,GAAG,UAAU,CAAC,eAAe,CAAC;wBAC7C,MAAM,CAAC,8BAA8B;oBACvC,CAAC;gBACH,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,uDAAuD;oBACvD,SAAS;gBACX,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,iCAAiC;IACjC,YAAY,GAAG,EAAE,eAAe,EAAE,CAAC;IACnC,OAAO,YAAY,CAAC;AACtB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB;IAC9B,YAAY,GAAG,IAAI,CAAC;AACtB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ecomcoder-cli",
3
- "version": "1.3.13",
3
+ "version": "1.3.14",
4
4
  "type": "module",
5
5
  "description": "CLI tools for EcomCoder - Shopify development utilities",
6
6
  "main": "./dist/index.js",
@@ -54,6 +54,7 @@
54
54
  "form-data": "^4.0.0"
55
55
  },
56
56
  "devDependencies": {
57
+ "@types/form-data": "^2.2.1",
57
58
  "@types/node": "^20.10.0",
58
59
  "@vitest/coverage-v8": "^2.1.9",
59
60
  "tsx": "^4.21.0",