@geekmidas/cli 1.0.1 → 1.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 (51) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/{SSMStateProvider-C4wp4AZe.mjs → SSMStateProvider-BjCi_58g.mjs} +16 -7
  3. package/dist/SSMStateProvider-BjCi_58g.mjs.map +1 -0
  4. package/dist/{SSMStateProvider-BxAPU99a.cjs → SSMStateProvider-D79o_JjM.cjs} +16 -7
  5. package/dist/SSMStateProvider-D79o_JjM.cjs.map +1 -0
  6. package/dist/{config-BGeJsW1r.cjs → config-CKfif10N.cjs} +2 -2
  7. package/dist/{config-BGeJsW1r.cjs.map → config-CKfif10N.cjs.map} +1 -1
  8. package/dist/{config-C6awcFBx.mjs → config-ClfjsfwH.mjs} +2 -2
  9. package/dist/{config-C6awcFBx.mjs.map → config-ClfjsfwH.mjs.map} +1 -1
  10. package/dist/config.cjs +2 -2
  11. package/dist/config.d.cts +1 -1
  12. package/dist/config.d.mts +1 -1
  13. package/dist/config.mjs +2 -2
  14. package/dist/{index-KFEbMIRa.d.mts → index-CHQs8G3q.d.mts} +6 -1
  15. package/dist/index-CHQs8G3q.d.mts.map +1 -0
  16. package/dist/{index-B5rGIc4g.d.cts → index-afBljZKY.d.cts} +6 -1
  17. package/dist/index-afBljZKY.d.cts.map +1 -0
  18. package/dist/index.cjs +39 -26
  19. package/dist/index.cjs.map +1 -1
  20. package/dist/index.mjs +39 -26
  21. package/dist/index.mjs.map +1 -1
  22. package/dist/{openapi-BMFmLnX6.mjs → openapi-C6sa0L8b.mjs} +2 -2
  23. package/dist/{openapi-BMFmLnX6.mjs.map → openapi-C6sa0L8b.mjs.map} +1 -1
  24. package/dist/{openapi-D1KXv2Ml.cjs → openapi-D3p6s8UA.cjs} +2 -2
  25. package/dist/{openapi-D1KXv2Ml.cjs.map → openapi-D3p6s8UA.cjs.map} +1 -1
  26. package/dist/openapi.cjs +3 -3
  27. package/dist/openapi.mjs +3 -3
  28. package/dist/workspace/index.cjs +1 -1
  29. package/dist/workspace/index.d.cts +1 -1
  30. package/dist/workspace/index.d.mts +1 -1
  31. package/dist/workspace/index.mjs +1 -1
  32. package/dist/{workspace-BFRUOOrh.cjs → workspace-CjT323qw.cjs} +3 -2
  33. package/dist/{workspace-BFRUOOrh.cjs.map → workspace-CjT323qw.cjs.map} +1 -1
  34. package/dist/{workspace-DAxG3_H2.mjs → workspace-CmITpum4.mjs} +3 -2
  35. package/dist/{workspace-DAxG3_H2.mjs.map → workspace-CmITpum4.mjs.map} +1 -1
  36. package/package.json +4 -4
  37. package/scripts/sync-versions.ts +25 -3
  38. package/src/deploy/SSMStateProvider.ts +20 -7
  39. package/src/deploy/StateProvider.ts +1 -1
  40. package/src/deploy/__tests__/SSMStateProvider.spec.ts +15 -8
  41. package/src/deploy/__tests__/state-e2e.spec.ts +385 -0
  42. package/src/init/__tests__/init.spec.ts +10 -1
  43. package/src/init/versions.ts +24 -2
  44. package/src/secrets/__tests__/storage.spec.ts +6 -2
  45. package/src/workspace/__tests__/index.spec.ts +61 -0
  46. package/src/workspace/index.ts +1 -0
  47. package/src/workspace/types.ts +7 -0
  48. package/dist/SSMStateProvider-BxAPU99a.cjs.map +0 -1
  49. package/dist/SSMStateProvider-C4wp4AZe.mjs.map +0 -1
  50. package/dist/index-B5rGIc4g.d.cts.map +0 -1
  51. package/dist/index-KFEbMIRa.d.mts.map +0 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # @geekmidas/cli
2
2
 
3
+ ## 1.1.0
4
+
5
+ ### Minor Changes
6
+
7
+ - ✨ [`3b6d7d9`](https://github.com/geekmidas/toolbox/commit/3b6d7d9ed41dc08675395d937248a8ab754af9e1) Thanks [@geekmidas](https://github.com/geekmidas)! - Add state provider configuration to workspace config
8
+
9
+ ## 1.0.2
10
+
11
+ ### Patch Changes
12
+
13
+ - 🐛 [`159e365`](https://github.com/geekmidas/toolbox/commit/159e36572adb2b489629d4ab2a0142f8ff59b7a8) Thanks [@geekmidas](https://github.com/geekmidas)! - Resolve correct cli version at runtime
14
+
3
15
  ## 1.0.1
4
16
 
5
17
  ### Patch Changes
@@ -7,12 +7,21 @@ import { GetParameterCommand, ParameterNotFound, PutParameterCommand, SSMClient
7
7
  * Stores state as encrypted SecureString parameters.
8
8
  * Parameter path: /gkm/{workspaceName}/{stage}/state
9
9
  */
10
- var SSMStateProvider = class {
11
- client;
12
- workspaceName;
13
- constructor(options) {
14
- this.workspaceName = options.workspaceName;
15
- this.client = new SSMClient({ region: options.region });
10
+ var SSMStateProvider = class SSMStateProvider {
11
+ constructor(workspaceName, client) {
12
+ this.workspaceName = workspaceName;
13
+ this.client = client;
14
+ }
15
+ /**
16
+ * Create an SSMStateProvider with a new SSMClient.
17
+ */
18
+ static create(options) {
19
+ const client = new SSMClient({
20
+ region: options.region,
21
+ credentials: options.credentials,
22
+ endpoint: options.endpoint
23
+ });
24
+ return new SSMStateProvider(options.workspaceName, client);
16
25
  }
17
26
  /**
18
27
  * Get the SSM parameter name for a stage.
@@ -49,4 +58,4 @@ var SSMStateProvider = class {
49
58
 
50
59
  //#endregion
51
60
  export { SSMStateProvider };
52
- //# sourceMappingURL=SSMStateProvider-C4wp4AZe.mjs.map
61
+ //# sourceMappingURL=SSMStateProvider-BjCi_58g.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SSMStateProvider-BjCi_58g.mjs","names":["workspaceName: string","client: SSMClient","options: SSMStateProviderOptions","stage: string","state: DokployStageState"],"sources":["../src/deploy/SSMStateProvider.ts"],"sourcesContent":["/**\n * AWS SSM Parameter Store State Provider\n *\n * Stores deployment state as SecureString parameters in AWS SSM.\n * Uses AWS-managed KMS key for encryption (free tier).\n *\n * Parameter naming: /gkm/{workspaceName}/{stage}/state\n */\n\nimport {\n\tGetParameterCommand,\n\tParameterNotFound,\n\tPutParameterCommand,\n\tSSMClient,\n\ttype SSMClientConfig,\n} from '@aws-sdk/client-ssm';\nimport type { AwsRegion, StateProvider } from './StateProvider';\nimport type { DokployStageState } from './state';\n\nexport interface SSMStateProviderOptions {\n\t/** Workspace name (used in parameter path) */\n\tworkspaceName: string;\n\t/** AWS region */\n\tregion?: AwsRegion;\n\t/** AWS credentials (optional - uses default credential chain if not provided) */\n\tcredentials?: SSMClientConfig['credentials'];\n\t/** Custom endpoint (for LocalStack or other S3-compatible services) */\n\tendpoint?: string;\n}\n\n/**\n * AWS SSM Parameter Store state provider.\n *\n * Stores state as encrypted SecureString parameters.\n * Parameter path: /gkm/{workspaceName}/{stage}/state\n */\nexport class SSMStateProvider implements StateProvider {\n\tconstructor(\n\t\treadonly workspaceName: string,\n\t\tprivate readonly client: SSMClient,\n\t) {}\n\n\t/**\n\t * Create an SSMStateProvider with a new SSMClient.\n\t */\n\tstatic create(options: SSMStateProviderOptions): SSMStateProvider {\n\t\tconst client = new SSMClient({\n\t\t\tregion: options.region,\n\t\t\tcredentials: options.credentials,\n\t\t\tendpoint: options.endpoint,\n\t\t});\n\n\t\treturn new SSMStateProvider(options.workspaceName, client);\n\t}\n\n\t/**\n\t * Get the SSM parameter name for a stage.\n\t */\n\tprivate getParameterName(stage: string): string {\n\t\treturn `/gkm/${this.workspaceName}/${stage}/state`;\n\t}\n\n\tasync read(stage: string): Promise<DokployStageState | null> {\n\t\tconst parameterName = this.getParameterName(stage);\n\n\t\ttry {\n\t\t\tconst response = await this.client.send(\n\t\t\t\tnew GetParameterCommand({\n\t\t\t\t\tName: parameterName,\n\t\t\t\t\tWithDecryption: true,\n\t\t\t\t}),\n\t\t\t);\n\n\t\t\tif (!response.Parameter?.Value) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\treturn JSON.parse(response.Parameter.Value) as DokployStageState;\n\t\t} catch (error) {\n\t\t\t// Parameter doesn't exist - return null (new deployment)\n\t\t\tif (error instanceof ParameterNotFound) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\t// Re-throw other errors (permission denied, network, etc.)\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tasync write(stage: string, state: DokployStageState): Promise<void> {\n\t\tconst parameterName = this.getParameterName(stage);\n\n\t\t// Update last deployed timestamp\n\t\tstate.lastDeployedAt = new Date().toISOString();\n\n\t\tawait this.client.send(\n\t\t\tnew PutParameterCommand({\n\t\t\t\tName: parameterName,\n\t\t\t\tValue: JSON.stringify(state),\n\t\t\t\tType: 'SecureString',\n\t\t\t\tOverwrite: true,\n\t\t\t\tDescription: `GKM deployment state for ${this.workspaceName}/${stage}`,\n\t\t\t}),\n\t\t);\n\t}\n}\n"],"mappings":";;;;;;;;;AAoCA,IAAa,mBAAb,MAAa,iBAA0C;CACtD,YACUA,eACQC,QAChB;EAFQ;EACQ;CACd;;;;CAKJ,OAAO,OAAOC,SAAoD;EACjE,MAAM,SAAS,IAAI,UAAU;GAC5B,QAAQ,QAAQ;GAChB,aAAa,QAAQ;GACrB,UAAU,QAAQ;EAClB;AAED,SAAO,IAAI,iBAAiB,QAAQ,eAAe;CACnD;;;;CAKD,AAAQ,iBAAiBC,OAAuB;AAC/C,UAAQ,OAAO,KAAK,cAAc,GAAG,MAAM;CAC3C;CAED,MAAM,KAAKA,OAAkD;EAC5D,MAAM,gBAAgB,KAAK,iBAAiB,MAAM;AAElD,MAAI;GACH,MAAM,WAAW,MAAM,KAAK,OAAO,KAClC,IAAI,oBAAoB;IACvB,MAAM;IACN,gBAAgB;GAChB,GACD;AAED,QAAK,SAAS,WAAW,MACxB,QAAO;AAGR,UAAO,KAAK,MAAM,SAAS,UAAU,MAAM;EAC3C,SAAQ,OAAO;AAEf,OAAI,iBAAiB,kBACpB,QAAO;AAIR,SAAM;EACN;CACD;CAED,MAAM,MAAMA,OAAeC,OAAyC;EACnE,MAAM,gBAAgB,KAAK,iBAAiB,MAAM;AAGlD,QAAM,iBAAiB,qBAAI,QAAO,aAAa;AAE/C,QAAM,KAAK,OAAO,KACjB,IAAI,oBAAoB;GACvB,MAAM;GACN,OAAO,KAAK,UAAU,MAAM;GAC5B,MAAM;GACN,WAAW;GACX,cAAc,2BAA2B,KAAK,cAAc,GAAG,MAAM;EACrE,GACD;CACD;AACD"}
@@ -8,12 +8,21 @@ const __aws_sdk_client_ssm = require_chunk.__toESM(require("@aws-sdk/client-ssm"
8
8
  * Stores state as encrypted SecureString parameters.
9
9
  * Parameter path: /gkm/{workspaceName}/{stage}/state
10
10
  */
11
- var SSMStateProvider = class {
12
- client;
13
- workspaceName;
14
- constructor(options) {
15
- this.workspaceName = options.workspaceName;
16
- this.client = new __aws_sdk_client_ssm.SSMClient({ region: options.region });
11
+ var SSMStateProvider = class SSMStateProvider {
12
+ constructor(workspaceName, client) {
13
+ this.workspaceName = workspaceName;
14
+ this.client = client;
15
+ }
16
+ /**
17
+ * Create an SSMStateProvider with a new SSMClient.
18
+ */
19
+ static create(options) {
20
+ const client = new __aws_sdk_client_ssm.SSMClient({
21
+ region: options.region,
22
+ credentials: options.credentials,
23
+ endpoint: options.endpoint
24
+ });
25
+ return new SSMStateProvider(options.workspaceName, client);
17
26
  }
18
27
  /**
19
28
  * Get the SSM parameter name for a stage.
@@ -50,4 +59,4 @@ var SSMStateProvider = class {
50
59
 
51
60
  //#endregion
52
61
  exports.SSMStateProvider = SSMStateProvider;
53
- //# sourceMappingURL=SSMStateProvider-BxAPU99a.cjs.map
62
+ //# sourceMappingURL=SSMStateProvider-D79o_JjM.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SSMStateProvider-D79o_JjM.cjs","names":["workspaceName: string","client: SSMClient","options: SSMStateProviderOptions","SSMClient","stage: string","GetParameterCommand","ParameterNotFound","state: DokployStageState","PutParameterCommand"],"sources":["../src/deploy/SSMStateProvider.ts"],"sourcesContent":["/**\n * AWS SSM Parameter Store State Provider\n *\n * Stores deployment state as SecureString parameters in AWS SSM.\n * Uses AWS-managed KMS key for encryption (free tier).\n *\n * Parameter naming: /gkm/{workspaceName}/{stage}/state\n */\n\nimport {\n\tGetParameterCommand,\n\tParameterNotFound,\n\tPutParameterCommand,\n\tSSMClient,\n\ttype SSMClientConfig,\n} from '@aws-sdk/client-ssm';\nimport type { AwsRegion, StateProvider } from './StateProvider';\nimport type { DokployStageState } from './state';\n\nexport interface SSMStateProviderOptions {\n\t/** Workspace name (used in parameter path) */\n\tworkspaceName: string;\n\t/** AWS region */\n\tregion?: AwsRegion;\n\t/** AWS credentials (optional - uses default credential chain if not provided) */\n\tcredentials?: SSMClientConfig['credentials'];\n\t/** Custom endpoint (for LocalStack or other S3-compatible services) */\n\tendpoint?: string;\n}\n\n/**\n * AWS SSM Parameter Store state provider.\n *\n * Stores state as encrypted SecureString parameters.\n * Parameter path: /gkm/{workspaceName}/{stage}/state\n */\nexport class SSMStateProvider implements StateProvider {\n\tconstructor(\n\t\treadonly workspaceName: string,\n\t\tprivate readonly client: SSMClient,\n\t) {}\n\n\t/**\n\t * Create an SSMStateProvider with a new SSMClient.\n\t */\n\tstatic create(options: SSMStateProviderOptions): SSMStateProvider {\n\t\tconst client = new SSMClient({\n\t\t\tregion: options.region,\n\t\t\tcredentials: options.credentials,\n\t\t\tendpoint: options.endpoint,\n\t\t});\n\n\t\treturn new SSMStateProvider(options.workspaceName, client);\n\t}\n\n\t/**\n\t * Get the SSM parameter name for a stage.\n\t */\n\tprivate getParameterName(stage: string): string {\n\t\treturn `/gkm/${this.workspaceName}/${stage}/state`;\n\t}\n\n\tasync read(stage: string): Promise<DokployStageState | null> {\n\t\tconst parameterName = this.getParameterName(stage);\n\n\t\ttry {\n\t\t\tconst response = await this.client.send(\n\t\t\t\tnew GetParameterCommand({\n\t\t\t\t\tName: parameterName,\n\t\t\t\t\tWithDecryption: true,\n\t\t\t\t}),\n\t\t\t);\n\n\t\t\tif (!response.Parameter?.Value) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\treturn JSON.parse(response.Parameter.Value) as DokployStageState;\n\t\t} catch (error) {\n\t\t\t// Parameter doesn't exist - return null (new deployment)\n\t\t\tif (error instanceof ParameterNotFound) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\t// Re-throw other errors (permission denied, network, etc.)\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tasync write(stage: string, state: DokployStageState): Promise<void> {\n\t\tconst parameterName = this.getParameterName(stage);\n\n\t\t// Update last deployed timestamp\n\t\tstate.lastDeployedAt = new Date().toISOString();\n\n\t\tawait this.client.send(\n\t\t\tnew PutParameterCommand({\n\t\t\t\tName: parameterName,\n\t\t\t\tValue: JSON.stringify(state),\n\t\t\t\tType: 'SecureString',\n\t\t\t\tOverwrite: true,\n\t\t\t\tDescription: `GKM deployment state for ${this.workspaceName}/${stage}`,\n\t\t\t}),\n\t\t);\n\t}\n}\n"],"mappings":";;;;;;;;;;AAoCA,IAAa,mBAAb,MAAa,iBAA0C;CACtD,YACUA,eACQC,QAChB;EAFQ;EACQ;CACd;;;;CAKJ,OAAO,OAAOC,SAAoD;EACjE,MAAM,SAAS,IAAIC,+BAAU;GAC5B,QAAQ,QAAQ;GAChB,aAAa,QAAQ;GACrB,UAAU,QAAQ;EAClB;AAED,SAAO,IAAI,iBAAiB,QAAQ,eAAe;CACnD;;;;CAKD,AAAQ,iBAAiBC,OAAuB;AAC/C,UAAQ,OAAO,KAAK,cAAc,GAAG,MAAM;CAC3C;CAED,MAAM,KAAKA,OAAkD;EAC5D,MAAM,gBAAgB,KAAK,iBAAiB,MAAM;AAElD,MAAI;GACH,MAAM,WAAW,MAAM,KAAK,OAAO,KAClC,IAAIC,yCAAoB;IACvB,MAAM;IACN,gBAAgB;GAChB,GACD;AAED,QAAK,SAAS,WAAW,MACxB,QAAO;AAGR,UAAO,KAAK,MAAM,SAAS,UAAU,MAAM;EAC3C,SAAQ,OAAO;AAEf,OAAI,iBAAiBC,uCACpB,QAAO;AAIR,SAAM;EACN;CACD;CAED,MAAM,MAAMF,OAAeG,OAAyC;EACnE,MAAM,gBAAgB,KAAK,iBAAiB,MAAM;AAGlD,QAAM,iBAAiB,qBAAI,QAAO,aAAa;AAE/C,QAAM,KAAK,OAAO,KACjB,IAAIC,yCAAoB;GACvB,MAAM;GACN,OAAO,KAAK,UAAU,MAAM;GAC5B,MAAM;GACN,WAAW;GACX,cAAc,2BAA2B,KAAK,cAAc,GAAG,MAAM;EACrE,GACD;CACD;AACD"}
@@ -1,5 +1,5 @@
1
1
  const require_chunk = require('./chunk-CUT6urMc.cjs');
2
- const require_workspace = require('./workspace-BFRUOOrh.cjs');
2
+ const require_workspace = require('./workspace-CjT323qw.cjs');
3
3
  const node_fs = require_chunk.__toESM(require("node:fs"));
4
4
  const node_path = require_chunk.__toESM(require("node:path"));
5
5
 
@@ -222,4 +222,4 @@ Object.defineProperty(exports, 'parseModuleConfig', {
222
222
  return parseModuleConfig;
223
223
  }
224
224
  });
225
- //# sourceMappingURL=config-BGeJsW1r.cjs.map
225
+ //# sourceMappingURL=config-CKfif10N.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"config-BGeJsW1r.cjs","names":["config: GkmConfig","configString: string","defaultAlias: string","cwd: string"],"sources":["../src/config.ts"],"sourcesContent":["import { existsSync, readFileSync } from 'node:fs';\nimport { dirname, join, parse } from 'node:path';\nimport type { GkmConfig } from './types.js';\nimport {\n\tgetAppGkmConfig,\n\tisWorkspaceConfig,\n\ttype LoadedConfig,\n\ttype NormalizedAppConfig,\n\ttype NormalizedWorkspace,\n\tprocessConfig,\n\ttype WorkspaceConfig,\n} from './workspace/index.js';\n\nexport type { GkmConfig } from './types.js';\nexport type { LoadedConfig, WorkspaceConfig } from './workspace/index.js';\nexport { defineWorkspace } from './workspace/index.js';\n/**\n * Define GKM configuration with full TypeScript support.\n * This is an identity function that provides type safety and autocomplete.\n *\n * @example\n * ```ts\n * // gkm.config.ts\n * import { defineConfig } from '@geekmidas/cli/config';\n *\n * export default defineConfig({\n * routes: './src/endpoints/**\\/*.ts',\n * envParser: './src/config/env',\n * logger: './src/config/logger',\n * telescope: true,\n * });\n * ```\n */\nexport function defineConfig(config: GkmConfig): GkmConfig {\n\treturn config;\n}\n\nexport interface ParsedModuleConfig {\n\tpath: string;\n\timportPattern: string;\n}\n\n/**\n * Parse a module config string into path and import pattern.\n *\n * @param configString - Config string in format \"./path/to/module\" or \"./path/to/module#exportName\"\n * @param defaultAlias - The default alias name to use if no export name specified\n * @returns Object with path and import pattern\n *\n * @example\n * parseModuleConfig('./src/config/env', 'envParser')\n * // { path: './src/config/env', importPattern: 'envParser' }\n *\n * parseModuleConfig('./src/config/env#envParser', 'envParser')\n * // { path: './src/config/env', importPattern: '{ envParser }' }\n *\n * parseModuleConfig('./src/config/env#myEnv', 'envParser')\n * // { path: './src/config/env', importPattern: '{ myEnv as envParser }' }\n */\nexport function parseModuleConfig(\n\tconfigString: string,\n\tdefaultAlias: string,\n): ParsedModuleConfig {\n\tconst parts = configString.split('#');\n\tconst path = parts[0] ?? configString;\n\tconst exportName = parts[1];\n\tconst importPattern = !exportName\n\t\t? defaultAlias\n\t\t: exportName === defaultAlias\n\t\t\t? `{ ${defaultAlias} }`\n\t\t\t: `{ ${exportName} as ${defaultAlias} }`;\n\n\treturn { path, importPattern };\n}\n\nexport interface ConfigDiscoveryResult {\n\tconfigPath: string;\n\tworkspaceRoot: string;\n}\n\n/**\n * Find and return the path to the config file.\n *\n * Resolution order:\n * 1. GKM_CONFIG_PATH env var (set by workspace dev command)\n * 2. Walk up directory tree from cwd\n */\nfunction findConfigPath(cwd: string): ConfigDiscoveryResult {\n\tconst files = ['gkm.config.json', 'gkm.config.ts', 'gkm.config.js'];\n\n\t// Check GKM_CONFIG_PATH env var first (set by workspace dev command)\n\tconst envConfigPath = process.env.GKM_CONFIG_PATH;\n\tif (envConfigPath && existsSync(envConfigPath)) {\n\t\treturn {\n\t\t\tconfigPath: envConfigPath,\n\t\t\tworkspaceRoot: dirname(envConfigPath),\n\t\t};\n\t}\n\n\t// Walk up directory tree to find config\n\tlet currentDir = cwd;\n\tconst { root } = parse(currentDir);\n\n\twhile (currentDir !== root) {\n\t\tfor (const file of files) {\n\t\t\tconst configPath = join(currentDir, file);\n\t\t\tif (existsSync(configPath)) {\n\t\t\t\treturn {\n\t\t\t\t\tconfigPath,\n\t\t\t\t\tworkspaceRoot: currentDir,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t\tcurrentDir = dirname(currentDir);\n\t}\n\n\tthrow new Error(\n\t\t'Configuration file not found. Please create gkm.config.json, gkm.config.ts, or gkm.config.js in the project root.',\n\t);\n}\n\n/**\n * Get app name from package.json in the given directory.\n * Handles scoped packages by extracting the name after the scope.\n *\n * @example\n * getAppNameFromCwd('/path/to/apps/api')\n * // package.json: { \"name\": \"@myorg/api\" }\n * // Returns: 'api'\n */\nexport function getAppNameFromCwd(cwd: string = process.cwd()): string | null {\n\tconst packageJsonPath = join(cwd, 'package.json');\n\n\tif (!existsSync(packageJsonPath)) {\n\t\treturn null;\n\t}\n\n\ttry {\n\t\tconst packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));\n\t\tconst name = packageJson.name as string | undefined;\n\n\t\tif (!name) {\n\t\t\treturn null;\n\t\t}\n\n\t\t// Handle scoped packages: @scope/name -> name\n\t\tif (name.startsWith('@') && name.includes('/')) {\n\t\t\treturn name.split('/')[1] ?? null;\n\t\t}\n\n\t\treturn name;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\ninterface RawConfigResult {\n\tconfig: GkmConfig | WorkspaceConfig;\n\tworkspaceRoot: string;\n}\n\n/**\n * Load raw configuration from file.\n */\nasync function loadRawConfig(cwd: string): Promise<RawConfigResult> {\n\tconst { configPath, workspaceRoot } = findConfigPath(cwd);\n\n\ttry {\n\t\tconst config = await import(configPath);\n\t\treturn {\n\t\t\tconfig: config.default,\n\t\t\tworkspaceRoot,\n\t\t};\n\t} catch (error) {\n\t\tthrow new Error(`Failed to load config: ${(error as Error).message}`);\n\t}\n}\n\n/**\n * Load configuration file (single-app format).\n * For backwards compatibility with existing code.\n *\n * @deprecated Use loadWorkspaceConfig for new code\n */\nexport async function loadConfig(\n\tcwd: string = process.cwd(),\n): Promise<GkmConfig> {\n\tconst { config } = await loadRawConfig(cwd);\n\n\t// If it's a workspace config, throw an error\n\tif (isWorkspaceConfig(config)) {\n\t\tthrow new Error(\n\t\t\t'Workspace configuration detected. Use loadWorkspaceConfig() instead.',\n\t\t);\n\t}\n\n\treturn config;\n}\n\n/**\n * Load configuration file and process it as a workspace.\n * Works with both single-app and workspace configurations.\n *\n * Single-app configs are automatically wrapped as a workspace with one app.\n *\n * @example\n * ```ts\n * const { type, workspace } = await loadWorkspaceConfig();\n *\n * if (type === 'workspace') {\n * console.log('Multi-app workspace:', workspace.apps);\n * } else {\n * console.log('Single app wrapped as workspace');\n * }\n * ```\n */\nexport async function loadWorkspaceConfig(\n\tcwd: string = process.cwd(),\n): Promise<LoadedConfig> {\n\tconst { config, workspaceRoot } = await loadRawConfig(cwd);\n\treturn processConfig(config, workspaceRoot);\n}\n\nexport interface AppConfigResult {\n\tappName: string;\n\tapp: NormalizedAppConfig;\n\tgkmConfig: GkmConfig;\n\tworkspace: NormalizedWorkspace;\n\tworkspaceRoot: string;\n\tappRoot: string;\n}\n\n/**\n * Load app-specific configuration from workspace.\n * Uses the app name from package.json to find the correct app config.\n *\n * @example\n * ```ts\n * // From apps/api directory with package.json: { \"name\": \"@myorg/api\" }\n * const { app, workspace, workspaceRoot } = await loadAppConfig();\n * console.log(app.routes); // './src/endpoints/**\\/*.ts'\n * ```\n */\nexport async function loadAppConfig(\n\tcwd: string = process.cwd(),\n): Promise<AppConfigResult> {\n\tconst appName = getAppNameFromCwd(cwd);\n\n\tif (!appName) {\n\t\tthrow new Error(\n\t\t\t'Could not determine app name. Ensure package.json exists with a \"name\" field.',\n\t\t);\n\t}\n\n\tconst { config, workspaceRoot } = await loadRawConfig(cwd);\n\tconst loadedConfig = processConfig(config, workspaceRoot);\n\n\t// Find the app in workspace (apps is a Record<string, NormalizedAppConfig>)\n\tconst app = loadedConfig.workspace.apps[appName];\n\n\tif (!app) {\n\t\tconst availableApps = Object.keys(loadedConfig.workspace.apps).join(', ');\n\t\tthrow new Error(\n\t\t\t`App \"${appName}\" not found in workspace config. Available apps: ${availableApps}. ` +\n\t\t\t\t`Ensure the package.json name matches the app key in gkm.config.ts.`,\n\t\t);\n\t}\n\n\t// Get the app's GKM config using the helper\n\tconst gkmConfig = getAppGkmConfig(loadedConfig.workspace, appName);\n\n\tif (!gkmConfig) {\n\t\tthrow new Error(\n\t\t\t`App \"${appName}\" is not a backend app and cannot be run with gkm dev.`,\n\t\t);\n\t}\n\n\treturn {\n\t\tappName,\n\t\tapp,\n\t\tgkmConfig,\n\t\tworkspace: loadedConfig.workspace,\n\t\tworkspaceRoot,\n\t\tappRoot: join(workspaceRoot, app.path),\n\t};\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"config-CKfif10N.cjs","names":["config: GkmConfig","configString: string","defaultAlias: string","cwd: string"],"sources":["../src/config.ts"],"sourcesContent":["import { existsSync, readFileSync } from 'node:fs';\nimport { dirname, join, parse } from 'node:path';\nimport type { GkmConfig } from './types.js';\nimport {\n\tgetAppGkmConfig,\n\tisWorkspaceConfig,\n\ttype LoadedConfig,\n\ttype NormalizedAppConfig,\n\ttype NormalizedWorkspace,\n\tprocessConfig,\n\ttype WorkspaceConfig,\n} from './workspace/index.js';\n\nexport type { GkmConfig } from './types.js';\nexport type { LoadedConfig, WorkspaceConfig } from './workspace/index.js';\nexport { defineWorkspace } from './workspace/index.js';\n/**\n * Define GKM configuration with full TypeScript support.\n * This is an identity function that provides type safety and autocomplete.\n *\n * @example\n * ```ts\n * // gkm.config.ts\n * import { defineConfig } from '@geekmidas/cli/config';\n *\n * export default defineConfig({\n * routes: './src/endpoints/**\\/*.ts',\n * envParser: './src/config/env',\n * logger: './src/config/logger',\n * telescope: true,\n * });\n * ```\n */\nexport function defineConfig(config: GkmConfig): GkmConfig {\n\treturn config;\n}\n\nexport interface ParsedModuleConfig {\n\tpath: string;\n\timportPattern: string;\n}\n\n/**\n * Parse a module config string into path and import pattern.\n *\n * @param configString - Config string in format \"./path/to/module\" or \"./path/to/module#exportName\"\n * @param defaultAlias - The default alias name to use if no export name specified\n * @returns Object with path and import pattern\n *\n * @example\n * parseModuleConfig('./src/config/env', 'envParser')\n * // { path: './src/config/env', importPattern: 'envParser' }\n *\n * parseModuleConfig('./src/config/env#envParser', 'envParser')\n * // { path: './src/config/env', importPattern: '{ envParser }' }\n *\n * parseModuleConfig('./src/config/env#myEnv', 'envParser')\n * // { path: './src/config/env', importPattern: '{ myEnv as envParser }' }\n */\nexport function parseModuleConfig(\n\tconfigString: string,\n\tdefaultAlias: string,\n): ParsedModuleConfig {\n\tconst parts = configString.split('#');\n\tconst path = parts[0] ?? configString;\n\tconst exportName = parts[1];\n\tconst importPattern = !exportName\n\t\t? defaultAlias\n\t\t: exportName === defaultAlias\n\t\t\t? `{ ${defaultAlias} }`\n\t\t\t: `{ ${exportName} as ${defaultAlias} }`;\n\n\treturn { path, importPattern };\n}\n\nexport interface ConfigDiscoveryResult {\n\tconfigPath: string;\n\tworkspaceRoot: string;\n}\n\n/**\n * Find and return the path to the config file.\n *\n * Resolution order:\n * 1. GKM_CONFIG_PATH env var (set by workspace dev command)\n * 2. Walk up directory tree from cwd\n */\nfunction findConfigPath(cwd: string): ConfigDiscoveryResult {\n\tconst files = ['gkm.config.json', 'gkm.config.ts', 'gkm.config.js'];\n\n\t// Check GKM_CONFIG_PATH env var first (set by workspace dev command)\n\tconst envConfigPath = process.env.GKM_CONFIG_PATH;\n\tif (envConfigPath && existsSync(envConfigPath)) {\n\t\treturn {\n\t\t\tconfigPath: envConfigPath,\n\t\t\tworkspaceRoot: dirname(envConfigPath),\n\t\t};\n\t}\n\n\t// Walk up directory tree to find config\n\tlet currentDir = cwd;\n\tconst { root } = parse(currentDir);\n\n\twhile (currentDir !== root) {\n\t\tfor (const file of files) {\n\t\t\tconst configPath = join(currentDir, file);\n\t\t\tif (existsSync(configPath)) {\n\t\t\t\treturn {\n\t\t\t\t\tconfigPath,\n\t\t\t\t\tworkspaceRoot: currentDir,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t\tcurrentDir = dirname(currentDir);\n\t}\n\n\tthrow new Error(\n\t\t'Configuration file not found. Please create gkm.config.json, gkm.config.ts, or gkm.config.js in the project root.',\n\t);\n}\n\n/**\n * Get app name from package.json in the given directory.\n * Handles scoped packages by extracting the name after the scope.\n *\n * @example\n * getAppNameFromCwd('/path/to/apps/api')\n * // package.json: { \"name\": \"@myorg/api\" }\n * // Returns: 'api'\n */\nexport function getAppNameFromCwd(cwd: string = process.cwd()): string | null {\n\tconst packageJsonPath = join(cwd, 'package.json');\n\n\tif (!existsSync(packageJsonPath)) {\n\t\treturn null;\n\t}\n\n\ttry {\n\t\tconst packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));\n\t\tconst name = packageJson.name as string | undefined;\n\n\t\tif (!name) {\n\t\t\treturn null;\n\t\t}\n\n\t\t// Handle scoped packages: @scope/name -> name\n\t\tif (name.startsWith('@') && name.includes('/')) {\n\t\t\treturn name.split('/')[1] ?? null;\n\t\t}\n\n\t\treturn name;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\ninterface RawConfigResult {\n\tconfig: GkmConfig | WorkspaceConfig;\n\tworkspaceRoot: string;\n}\n\n/**\n * Load raw configuration from file.\n */\nasync function loadRawConfig(cwd: string): Promise<RawConfigResult> {\n\tconst { configPath, workspaceRoot } = findConfigPath(cwd);\n\n\ttry {\n\t\tconst config = await import(configPath);\n\t\treturn {\n\t\t\tconfig: config.default,\n\t\t\tworkspaceRoot,\n\t\t};\n\t} catch (error) {\n\t\tthrow new Error(`Failed to load config: ${(error as Error).message}`);\n\t}\n}\n\n/**\n * Load configuration file (single-app format).\n * For backwards compatibility with existing code.\n *\n * @deprecated Use loadWorkspaceConfig for new code\n */\nexport async function loadConfig(\n\tcwd: string = process.cwd(),\n): Promise<GkmConfig> {\n\tconst { config } = await loadRawConfig(cwd);\n\n\t// If it's a workspace config, throw an error\n\tif (isWorkspaceConfig(config)) {\n\t\tthrow new Error(\n\t\t\t'Workspace configuration detected. Use loadWorkspaceConfig() instead.',\n\t\t);\n\t}\n\n\treturn config;\n}\n\n/**\n * Load configuration file and process it as a workspace.\n * Works with both single-app and workspace configurations.\n *\n * Single-app configs are automatically wrapped as a workspace with one app.\n *\n * @example\n * ```ts\n * const { type, workspace } = await loadWorkspaceConfig();\n *\n * if (type === 'workspace') {\n * console.log('Multi-app workspace:', workspace.apps);\n * } else {\n * console.log('Single app wrapped as workspace');\n * }\n * ```\n */\nexport async function loadWorkspaceConfig(\n\tcwd: string = process.cwd(),\n): Promise<LoadedConfig> {\n\tconst { config, workspaceRoot } = await loadRawConfig(cwd);\n\treturn processConfig(config, workspaceRoot);\n}\n\nexport interface AppConfigResult {\n\tappName: string;\n\tapp: NormalizedAppConfig;\n\tgkmConfig: GkmConfig;\n\tworkspace: NormalizedWorkspace;\n\tworkspaceRoot: string;\n\tappRoot: string;\n}\n\n/**\n * Load app-specific configuration from workspace.\n * Uses the app name from package.json to find the correct app config.\n *\n * @example\n * ```ts\n * // From apps/api directory with package.json: { \"name\": \"@myorg/api\" }\n * const { app, workspace, workspaceRoot } = await loadAppConfig();\n * console.log(app.routes); // './src/endpoints/**\\/*.ts'\n * ```\n */\nexport async function loadAppConfig(\n\tcwd: string = process.cwd(),\n): Promise<AppConfigResult> {\n\tconst appName = getAppNameFromCwd(cwd);\n\n\tif (!appName) {\n\t\tthrow new Error(\n\t\t\t'Could not determine app name. Ensure package.json exists with a \"name\" field.',\n\t\t);\n\t}\n\n\tconst { config, workspaceRoot } = await loadRawConfig(cwd);\n\tconst loadedConfig = processConfig(config, workspaceRoot);\n\n\t// Find the app in workspace (apps is a Record<string, NormalizedAppConfig>)\n\tconst app = loadedConfig.workspace.apps[appName];\n\n\tif (!app) {\n\t\tconst availableApps = Object.keys(loadedConfig.workspace.apps).join(', ');\n\t\tthrow new Error(\n\t\t\t`App \"${appName}\" not found in workspace config. Available apps: ${availableApps}. ` +\n\t\t\t\t`Ensure the package.json name matches the app key in gkm.config.ts.`,\n\t\t);\n\t}\n\n\t// Get the app's GKM config using the helper\n\tconst gkmConfig = getAppGkmConfig(loadedConfig.workspace, appName);\n\n\tif (!gkmConfig) {\n\t\tthrow new Error(\n\t\t\t`App \"${appName}\" is not a backend app and cannot be run with gkm dev.`,\n\t\t);\n\t}\n\n\treturn {\n\t\tappName,\n\t\tapp,\n\t\tgkmConfig,\n\t\tworkspace: loadedConfig.workspace,\n\t\tworkspaceRoot,\n\t\tappRoot: join(workspaceRoot, app.path),\n\t};\n}\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { getAppGkmConfig, isWorkspaceConfig, processConfig } from "./workspace-DAxG3_H2.mjs";
1
+ import { getAppGkmConfig, isWorkspaceConfig, processConfig } from "./workspace-CmITpum4.mjs";
2
2
  import { existsSync, readFileSync } from "node:fs";
3
3
  import { dirname, join, parse } from "node:path";
4
4
 
@@ -186,4 +186,4 @@ async function loadAppConfig(cwd = process.cwd()) {
186
186
 
187
187
  //#endregion
188
188
  export { defineConfig, getAppNameFromCwd, loadAppConfig, loadConfig, loadWorkspaceConfig, parseModuleConfig };
189
- //# sourceMappingURL=config-C6awcFBx.mjs.map
189
+ //# sourceMappingURL=config-ClfjsfwH.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"config-C6awcFBx.mjs","names":["config: GkmConfig","configString: string","defaultAlias: string","cwd: string"],"sources":["../src/config.ts"],"sourcesContent":["import { existsSync, readFileSync } from 'node:fs';\nimport { dirname, join, parse } from 'node:path';\nimport type { GkmConfig } from './types.js';\nimport {\n\tgetAppGkmConfig,\n\tisWorkspaceConfig,\n\ttype LoadedConfig,\n\ttype NormalizedAppConfig,\n\ttype NormalizedWorkspace,\n\tprocessConfig,\n\ttype WorkspaceConfig,\n} from './workspace/index.js';\n\nexport type { GkmConfig } from './types.js';\nexport type { LoadedConfig, WorkspaceConfig } from './workspace/index.js';\nexport { defineWorkspace } from './workspace/index.js';\n/**\n * Define GKM configuration with full TypeScript support.\n * This is an identity function that provides type safety and autocomplete.\n *\n * @example\n * ```ts\n * // gkm.config.ts\n * import { defineConfig } from '@geekmidas/cli/config';\n *\n * export default defineConfig({\n * routes: './src/endpoints/**\\/*.ts',\n * envParser: './src/config/env',\n * logger: './src/config/logger',\n * telescope: true,\n * });\n * ```\n */\nexport function defineConfig(config: GkmConfig): GkmConfig {\n\treturn config;\n}\n\nexport interface ParsedModuleConfig {\n\tpath: string;\n\timportPattern: string;\n}\n\n/**\n * Parse a module config string into path and import pattern.\n *\n * @param configString - Config string in format \"./path/to/module\" or \"./path/to/module#exportName\"\n * @param defaultAlias - The default alias name to use if no export name specified\n * @returns Object with path and import pattern\n *\n * @example\n * parseModuleConfig('./src/config/env', 'envParser')\n * // { path: './src/config/env', importPattern: 'envParser' }\n *\n * parseModuleConfig('./src/config/env#envParser', 'envParser')\n * // { path: './src/config/env', importPattern: '{ envParser }' }\n *\n * parseModuleConfig('./src/config/env#myEnv', 'envParser')\n * // { path: './src/config/env', importPattern: '{ myEnv as envParser }' }\n */\nexport function parseModuleConfig(\n\tconfigString: string,\n\tdefaultAlias: string,\n): ParsedModuleConfig {\n\tconst parts = configString.split('#');\n\tconst path = parts[0] ?? configString;\n\tconst exportName = parts[1];\n\tconst importPattern = !exportName\n\t\t? defaultAlias\n\t\t: exportName === defaultAlias\n\t\t\t? `{ ${defaultAlias} }`\n\t\t\t: `{ ${exportName} as ${defaultAlias} }`;\n\n\treturn { path, importPattern };\n}\n\nexport interface ConfigDiscoveryResult {\n\tconfigPath: string;\n\tworkspaceRoot: string;\n}\n\n/**\n * Find and return the path to the config file.\n *\n * Resolution order:\n * 1. GKM_CONFIG_PATH env var (set by workspace dev command)\n * 2. Walk up directory tree from cwd\n */\nfunction findConfigPath(cwd: string): ConfigDiscoveryResult {\n\tconst files = ['gkm.config.json', 'gkm.config.ts', 'gkm.config.js'];\n\n\t// Check GKM_CONFIG_PATH env var first (set by workspace dev command)\n\tconst envConfigPath = process.env.GKM_CONFIG_PATH;\n\tif (envConfigPath && existsSync(envConfigPath)) {\n\t\treturn {\n\t\t\tconfigPath: envConfigPath,\n\t\t\tworkspaceRoot: dirname(envConfigPath),\n\t\t};\n\t}\n\n\t// Walk up directory tree to find config\n\tlet currentDir = cwd;\n\tconst { root } = parse(currentDir);\n\n\twhile (currentDir !== root) {\n\t\tfor (const file of files) {\n\t\t\tconst configPath = join(currentDir, file);\n\t\t\tif (existsSync(configPath)) {\n\t\t\t\treturn {\n\t\t\t\t\tconfigPath,\n\t\t\t\t\tworkspaceRoot: currentDir,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t\tcurrentDir = dirname(currentDir);\n\t}\n\n\tthrow new Error(\n\t\t'Configuration file not found. Please create gkm.config.json, gkm.config.ts, or gkm.config.js in the project root.',\n\t);\n}\n\n/**\n * Get app name from package.json in the given directory.\n * Handles scoped packages by extracting the name after the scope.\n *\n * @example\n * getAppNameFromCwd('/path/to/apps/api')\n * // package.json: { \"name\": \"@myorg/api\" }\n * // Returns: 'api'\n */\nexport function getAppNameFromCwd(cwd: string = process.cwd()): string | null {\n\tconst packageJsonPath = join(cwd, 'package.json');\n\n\tif (!existsSync(packageJsonPath)) {\n\t\treturn null;\n\t}\n\n\ttry {\n\t\tconst packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));\n\t\tconst name = packageJson.name as string | undefined;\n\n\t\tif (!name) {\n\t\t\treturn null;\n\t\t}\n\n\t\t// Handle scoped packages: @scope/name -> name\n\t\tif (name.startsWith('@') && name.includes('/')) {\n\t\t\treturn name.split('/')[1] ?? null;\n\t\t}\n\n\t\treturn name;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\ninterface RawConfigResult {\n\tconfig: GkmConfig | WorkspaceConfig;\n\tworkspaceRoot: string;\n}\n\n/**\n * Load raw configuration from file.\n */\nasync function loadRawConfig(cwd: string): Promise<RawConfigResult> {\n\tconst { configPath, workspaceRoot } = findConfigPath(cwd);\n\n\ttry {\n\t\tconst config = await import(configPath);\n\t\treturn {\n\t\t\tconfig: config.default,\n\t\t\tworkspaceRoot,\n\t\t};\n\t} catch (error) {\n\t\tthrow new Error(`Failed to load config: ${(error as Error).message}`);\n\t}\n}\n\n/**\n * Load configuration file (single-app format).\n * For backwards compatibility with existing code.\n *\n * @deprecated Use loadWorkspaceConfig for new code\n */\nexport async function loadConfig(\n\tcwd: string = process.cwd(),\n): Promise<GkmConfig> {\n\tconst { config } = await loadRawConfig(cwd);\n\n\t// If it's a workspace config, throw an error\n\tif (isWorkspaceConfig(config)) {\n\t\tthrow new Error(\n\t\t\t'Workspace configuration detected. Use loadWorkspaceConfig() instead.',\n\t\t);\n\t}\n\n\treturn config;\n}\n\n/**\n * Load configuration file and process it as a workspace.\n * Works with both single-app and workspace configurations.\n *\n * Single-app configs are automatically wrapped as a workspace with one app.\n *\n * @example\n * ```ts\n * const { type, workspace } = await loadWorkspaceConfig();\n *\n * if (type === 'workspace') {\n * console.log('Multi-app workspace:', workspace.apps);\n * } else {\n * console.log('Single app wrapped as workspace');\n * }\n * ```\n */\nexport async function loadWorkspaceConfig(\n\tcwd: string = process.cwd(),\n): Promise<LoadedConfig> {\n\tconst { config, workspaceRoot } = await loadRawConfig(cwd);\n\treturn processConfig(config, workspaceRoot);\n}\n\nexport interface AppConfigResult {\n\tappName: string;\n\tapp: NormalizedAppConfig;\n\tgkmConfig: GkmConfig;\n\tworkspace: NormalizedWorkspace;\n\tworkspaceRoot: string;\n\tappRoot: string;\n}\n\n/**\n * Load app-specific configuration from workspace.\n * Uses the app name from package.json to find the correct app config.\n *\n * @example\n * ```ts\n * // From apps/api directory with package.json: { \"name\": \"@myorg/api\" }\n * const { app, workspace, workspaceRoot } = await loadAppConfig();\n * console.log(app.routes); // './src/endpoints/**\\/*.ts'\n * ```\n */\nexport async function loadAppConfig(\n\tcwd: string = process.cwd(),\n): Promise<AppConfigResult> {\n\tconst appName = getAppNameFromCwd(cwd);\n\n\tif (!appName) {\n\t\tthrow new Error(\n\t\t\t'Could not determine app name. Ensure package.json exists with a \"name\" field.',\n\t\t);\n\t}\n\n\tconst { config, workspaceRoot } = await loadRawConfig(cwd);\n\tconst loadedConfig = processConfig(config, workspaceRoot);\n\n\t// Find the app in workspace (apps is a Record<string, NormalizedAppConfig>)\n\tconst app = loadedConfig.workspace.apps[appName];\n\n\tif (!app) {\n\t\tconst availableApps = Object.keys(loadedConfig.workspace.apps).join(', ');\n\t\tthrow new Error(\n\t\t\t`App \"${appName}\" not found in workspace config. Available apps: ${availableApps}. ` +\n\t\t\t\t`Ensure the package.json name matches the app key in gkm.config.ts.`,\n\t\t);\n\t}\n\n\t// Get the app's GKM config using the helper\n\tconst gkmConfig = getAppGkmConfig(loadedConfig.workspace, appName);\n\n\tif (!gkmConfig) {\n\t\tthrow new Error(\n\t\t\t`App \"${appName}\" is not a backend app and cannot be run with gkm dev.`,\n\t\t);\n\t}\n\n\treturn {\n\t\tappName,\n\t\tapp,\n\t\tgkmConfig,\n\t\tworkspace: loadedConfig.workspace,\n\t\tworkspaceRoot,\n\t\tappRoot: join(workspaceRoot, app.path),\n\t};\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"config-ClfjsfwH.mjs","names":["config: GkmConfig","configString: string","defaultAlias: string","cwd: string"],"sources":["../src/config.ts"],"sourcesContent":["import { existsSync, readFileSync } from 'node:fs';\nimport { dirname, join, parse } from 'node:path';\nimport type { GkmConfig } from './types.js';\nimport {\n\tgetAppGkmConfig,\n\tisWorkspaceConfig,\n\ttype LoadedConfig,\n\ttype NormalizedAppConfig,\n\ttype NormalizedWorkspace,\n\tprocessConfig,\n\ttype WorkspaceConfig,\n} from './workspace/index.js';\n\nexport type { GkmConfig } from './types.js';\nexport type { LoadedConfig, WorkspaceConfig } from './workspace/index.js';\nexport { defineWorkspace } from './workspace/index.js';\n/**\n * Define GKM configuration with full TypeScript support.\n * This is an identity function that provides type safety and autocomplete.\n *\n * @example\n * ```ts\n * // gkm.config.ts\n * import { defineConfig } from '@geekmidas/cli/config';\n *\n * export default defineConfig({\n * routes: './src/endpoints/**\\/*.ts',\n * envParser: './src/config/env',\n * logger: './src/config/logger',\n * telescope: true,\n * });\n * ```\n */\nexport function defineConfig(config: GkmConfig): GkmConfig {\n\treturn config;\n}\n\nexport interface ParsedModuleConfig {\n\tpath: string;\n\timportPattern: string;\n}\n\n/**\n * Parse a module config string into path and import pattern.\n *\n * @param configString - Config string in format \"./path/to/module\" or \"./path/to/module#exportName\"\n * @param defaultAlias - The default alias name to use if no export name specified\n * @returns Object with path and import pattern\n *\n * @example\n * parseModuleConfig('./src/config/env', 'envParser')\n * // { path: './src/config/env', importPattern: 'envParser' }\n *\n * parseModuleConfig('./src/config/env#envParser', 'envParser')\n * // { path: './src/config/env', importPattern: '{ envParser }' }\n *\n * parseModuleConfig('./src/config/env#myEnv', 'envParser')\n * // { path: './src/config/env', importPattern: '{ myEnv as envParser }' }\n */\nexport function parseModuleConfig(\n\tconfigString: string,\n\tdefaultAlias: string,\n): ParsedModuleConfig {\n\tconst parts = configString.split('#');\n\tconst path = parts[0] ?? configString;\n\tconst exportName = parts[1];\n\tconst importPattern = !exportName\n\t\t? defaultAlias\n\t\t: exportName === defaultAlias\n\t\t\t? `{ ${defaultAlias} }`\n\t\t\t: `{ ${exportName} as ${defaultAlias} }`;\n\n\treturn { path, importPattern };\n}\n\nexport interface ConfigDiscoveryResult {\n\tconfigPath: string;\n\tworkspaceRoot: string;\n}\n\n/**\n * Find and return the path to the config file.\n *\n * Resolution order:\n * 1. GKM_CONFIG_PATH env var (set by workspace dev command)\n * 2. Walk up directory tree from cwd\n */\nfunction findConfigPath(cwd: string): ConfigDiscoveryResult {\n\tconst files = ['gkm.config.json', 'gkm.config.ts', 'gkm.config.js'];\n\n\t// Check GKM_CONFIG_PATH env var first (set by workspace dev command)\n\tconst envConfigPath = process.env.GKM_CONFIG_PATH;\n\tif (envConfigPath && existsSync(envConfigPath)) {\n\t\treturn {\n\t\t\tconfigPath: envConfigPath,\n\t\t\tworkspaceRoot: dirname(envConfigPath),\n\t\t};\n\t}\n\n\t// Walk up directory tree to find config\n\tlet currentDir = cwd;\n\tconst { root } = parse(currentDir);\n\n\twhile (currentDir !== root) {\n\t\tfor (const file of files) {\n\t\t\tconst configPath = join(currentDir, file);\n\t\t\tif (existsSync(configPath)) {\n\t\t\t\treturn {\n\t\t\t\t\tconfigPath,\n\t\t\t\t\tworkspaceRoot: currentDir,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t\tcurrentDir = dirname(currentDir);\n\t}\n\n\tthrow new Error(\n\t\t'Configuration file not found. Please create gkm.config.json, gkm.config.ts, or gkm.config.js in the project root.',\n\t);\n}\n\n/**\n * Get app name from package.json in the given directory.\n * Handles scoped packages by extracting the name after the scope.\n *\n * @example\n * getAppNameFromCwd('/path/to/apps/api')\n * // package.json: { \"name\": \"@myorg/api\" }\n * // Returns: 'api'\n */\nexport function getAppNameFromCwd(cwd: string = process.cwd()): string | null {\n\tconst packageJsonPath = join(cwd, 'package.json');\n\n\tif (!existsSync(packageJsonPath)) {\n\t\treturn null;\n\t}\n\n\ttry {\n\t\tconst packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));\n\t\tconst name = packageJson.name as string | undefined;\n\n\t\tif (!name) {\n\t\t\treturn null;\n\t\t}\n\n\t\t// Handle scoped packages: @scope/name -> name\n\t\tif (name.startsWith('@') && name.includes('/')) {\n\t\t\treturn name.split('/')[1] ?? null;\n\t\t}\n\n\t\treturn name;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\ninterface RawConfigResult {\n\tconfig: GkmConfig | WorkspaceConfig;\n\tworkspaceRoot: string;\n}\n\n/**\n * Load raw configuration from file.\n */\nasync function loadRawConfig(cwd: string): Promise<RawConfigResult> {\n\tconst { configPath, workspaceRoot } = findConfigPath(cwd);\n\n\ttry {\n\t\tconst config = await import(configPath);\n\t\treturn {\n\t\t\tconfig: config.default,\n\t\t\tworkspaceRoot,\n\t\t};\n\t} catch (error) {\n\t\tthrow new Error(`Failed to load config: ${(error as Error).message}`);\n\t}\n}\n\n/**\n * Load configuration file (single-app format).\n * For backwards compatibility with existing code.\n *\n * @deprecated Use loadWorkspaceConfig for new code\n */\nexport async function loadConfig(\n\tcwd: string = process.cwd(),\n): Promise<GkmConfig> {\n\tconst { config } = await loadRawConfig(cwd);\n\n\t// If it's a workspace config, throw an error\n\tif (isWorkspaceConfig(config)) {\n\t\tthrow new Error(\n\t\t\t'Workspace configuration detected. Use loadWorkspaceConfig() instead.',\n\t\t);\n\t}\n\n\treturn config;\n}\n\n/**\n * Load configuration file and process it as a workspace.\n * Works with both single-app and workspace configurations.\n *\n * Single-app configs are automatically wrapped as a workspace with one app.\n *\n * @example\n * ```ts\n * const { type, workspace } = await loadWorkspaceConfig();\n *\n * if (type === 'workspace') {\n * console.log('Multi-app workspace:', workspace.apps);\n * } else {\n * console.log('Single app wrapped as workspace');\n * }\n * ```\n */\nexport async function loadWorkspaceConfig(\n\tcwd: string = process.cwd(),\n): Promise<LoadedConfig> {\n\tconst { config, workspaceRoot } = await loadRawConfig(cwd);\n\treturn processConfig(config, workspaceRoot);\n}\n\nexport interface AppConfigResult {\n\tappName: string;\n\tapp: NormalizedAppConfig;\n\tgkmConfig: GkmConfig;\n\tworkspace: NormalizedWorkspace;\n\tworkspaceRoot: string;\n\tappRoot: string;\n}\n\n/**\n * Load app-specific configuration from workspace.\n * Uses the app name from package.json to find the correct app config.\n *\n * @example\n * ```ts\n * // From apps/api directory with package.json: { \"name\": \"@myorg/api\" }\n * const { app, workspace, workspaceRoot } = await loadAppConfig();\n * console.log(app.routes); // './src/endpoints/**\\/*.ts'\n * ```\n */\nexport async function loadAppConfig(\n\tcwd: string = process.cwd(),\n): Promise<AppConfigResult> {\n\tconst appName = getAppNameFromCwd(cwd);\n\n\tif (!appName) {\n\t\tthrow new Error(\n\t\t\t'Could not determine app name. Ensure package.json exists with a \"name\" field.',\n\t\t);\n\t}\n\n\tconst { config, workspaceRoot } = await loadRawConfig(cwd);\n\tconst loadedConfig = processConfig(config, workspaceRoot);\n\n\t// Find the app in workspace (apps is a Record<string, NormalizedAppConfig>)\n\tconst app = loadedConfig.workspace.apps[appName];\n\n\tif (!app) {\n\t\tconst availableApps = Object.keys(loadedConfig.workspace.apps).join(', ');\n\t\tthrow new Error(\n\t\t\t`App \"${appName}\" not found in workspace config. Available apps: ${availableApps}. ` +\n\t\t\t\t`Ensure the package.json name matches the app key in gkm.config.ts.`,\n\t\t);\n\t}\n\n\t// Get the app's GKM config using the helper\n\tconst gkmConfig = getAppGkmConfig(loadedConfig.workspace, appName);\n\n\tif (!gkmConfig) {\n\t\tthrow new Error(\n\t\t\t`App \"${appName}\" is not a backend app and cannot be run with gkm dev.`,\n\t\t);\n\t}\n\n\treturn {\n\t\tappName,\n\t\tapp,\n\t\tgkmConfig,\n\t\tworkspace: loadedConfig.workspace,\n\t\tworkspaceRoot,\n\t\tappRoot: join(workspaceRoot, app.path),\n\t};\n}\n"],"mappings":"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"}
package/dist/config.cjs CHANGED
@@ -1,5 +1,5 @@
1
- const require_workspace = require('./workspace-BFRUOOrh.cjs');
2
- const require_config = require('./config-BGeJsW1r.cjs');
1
+ const require_workspace = require('./workspace-CjT323qw.cjs');
2
+ const require_config = require('./config-CKfif10N.cjs');
3
3
 
4
4
  exports.defineConfig = require_config.defineConfig;
5
5
  exports.defineWorkspace = require_workspace.defineWorkspace;
package/dist/config.d.cts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { GkmConfig } from "./types-l53qUmGt.cjs";
2
- import { LoadedConfig, NormalizedAppConfig, NormalizedWorkspace, WorkspaceConfig, defineWorkspace } from "./index-B5rGIc4g.cjs";
2
+ import { LoadedConfig, NormalizedAppConfig, NormalizedWorkspace, WorkspaceConfig, defineWorkspace } from "./index-afBljZKY.cjs";
3
3
 
4
4
  //#region src/config.d.ts
5
5
 
package/dist/config.d.mts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { GkmConfig } from "./types-BldpmqQX.mjs";
2
- import { LoadedConfig, NormalizedAppConfig, NormalizedWorkspace, WorkspaceConfig, defineWorkspace } from "./index-KFEbMIRa.mjs";
2
+ import { LoadedConfig, NormalizedAppConfig, NormalizedWorkspace, WorkspaceConfig, defineWorkspace } from "./index-CHQs8G3q.mjs";
3
3
 
4
4
  //#region src/config.d.ts
5
5
 
package/dist/config.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { defineWorkspace } from "./workspace-DAxG3_H2.mjs";
2
- import { defineConfig, getAppNameFromCwd, loadAppConfig, loadConfig, loadWorkspaceConfig, parseModuleConfig } from "./config-C6awcFBx.mjs";
1
+ import { defineWorkspace } from "./workspace-CmITpum4.mjs";
2
+ import { defineConfig, getAppNameFromCwd, loadAppConfig, loadConfig, loadWorkspaceConfig, parseModuleConfig } from "./config-ClfjsfwH.mjs";
3
3
 
4
4
  export { defineConfig, defineWorkspace, getAppNameFromCwd, loadAppConfig, loadConfig, loadWorkspaceConfig, parseModuleConfig };
@@ -1205,6 +1205,8 @@ type WorkspaceInput<TApps extends AppsRecord> = {
1205
1205
  services?: ServicesConfig;
1206
1206
  /** Encrypted secrets configuration */
1207
1207
  secrets?: SecretsConfig;
1208
+ /** State provider configuration (local filesystem by default, or SSM for team collaboration) */
1209
+ state?: StateConfig;
1208
1210
  };
1209
1211
  /**
1210
1212
  * Extract app names from apps record.
@@ -1222,6 +1224,7 @@ type InferredWorkspaceConfig<TApps extends AppsRecord> = {
1222
1224
  deploy?: DeployConfig;
1223
1225
  services?: ServicesConfig;
1224
1226
  secrets?: SecretsConfig;
1227
+ state?: StateConfig;
1225
1228
  };
1226
1229
  /** @deprecated Use WorkspaceInput */
1227
1230
 
@@ -1313,6 +1316,8 @@ interface WorkspaceConfig {
1313
1316
  services?: ServicesConfig;
1314
1317
  /** Encrypted secrets configuration */
1315
1318
  secrets?: SecretsConfig;
1319
+ /** State provider configuration (local filesystem by default, or SSM for team collaboration) */
1320
+ state?: StateConfig;
1316
1321
  }
1317
1322
  /**
1318
1323
  * Normalized app configuration with resolved defaults.
@@ -1466,4 +1471,4 @@ declare function getDependencyEnvVars(workspace: NormalizedWorkspace, appName: s
1466
1471
 
1467
1472
  //#endregion
1468
1473
  export { AppConfig, AppConfigInput, AppInput, AppsRecord, BackendFramework, ClientConfig, ConstrainedApps, DeployConfig, DeployTarget, DokployWorkspaceConfig, FrontendFramework, InferAppNames, InferredWorkspaceConfig, LoadedConfig, MailServiceConfig, ModelsConfig, NormalizedAppConfig, NormalizedWorkspace, PHASE_2_DEPLOY_TARGETS, SUPPORTED_DEPLOY_TARGETS, SecretsConfig, ServiceImageConfig, ServicesConfig, SharedConfig, WorkspaceConfig, WorkspaceConfigSchema, WorkspaceInput, defineWorkspace, formatValidationErrors, getAppBuildOrder, getAppGkmConfig, getDependencyEnvVars, getDeployTargetError, isDeployTargetSupported, isPhase2DeployTarget, isWorkspaceConfig, normalizeWorkspace, processConfig, safeValidateWorkspaceConfig, validateWorkspaceConfig, wrapSingleAppAsWorkspace };
1469
- //# sourceMappingURL=index-KFEbMIRa.d.mts.map
1474
+ //# sourceMappingURL=index-CHQs8G3q.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-CHQs8G3q.d.mts","names":[],"sources":["../src/deploy/state.ts","../src/deploy/StateProvider.ts","../src/workspace/schema.ts","../src/workspace/types.ts","../src/workspace/index.ts"],"sourcesContent":[],"mappings":"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"}
@@ -1205,6 +1205,8 @@ type WorkspaceInput<TApps extends AppsRecord> = {
1205
1205
  services?: ServicesConfig;
1206
1206
  /** Encrypted secrets configuration */
1207
1207
  secrets?: SecretsConfig;
1208
+ /** State provider configuration (local filesystem by default, or SSM for team collaboration) */
1209
+ state?: StateConfig;
1208
1210
  };
1209
1211
  /**
1210
1212
  * Extract app names from apps record.
@@ -1222,6 +1224,7 @@ type InferredWorkspaceConfig<TApps extends AppsRecord> = {
1222
1224
  deploy?: DeployConfig;
1223
1225
  services?: ServicesConfig;
1224
1226
  secrets?: SecretsConfig;
1227
+ state?: StateConfig;
1225
1228
  };
1226
1229
  /** @deprecated Use WorkspaceInput */
1227
1230
 
@@ -1313,6 +1316,8 @@ interface WorkspaceConfig {
1313
1316
  services?: ServicesConfig;
1314
1317
  /** Encrypted secrets configuration */
1315
1318
  secrets?: SecretsConfig;
1319
+ /** State provider configuration (local filesystem by default, or SSM for team collaboration) */
1320
+ state?: StateConfig;
1316
1321
  }
1317
1322
  /**
1318
1323
  * Normalized app configuration with resolved defaults.
@@ -1466,4 +1471,4 @@ declare function getDependencyEnvVars(workspace: NormalizedWorkspace, appName: s
1466
1471
 
1467
1472
  //#endregion
1468
1473
  export { AppConfig, AppConfigInput, AppInput, AppsRecord, BackendFramework, ClientConfig, ConstrainedApps, DeployConfig, DeployTarget, DokployWorkspaceConfig, FrontendFramework, InferAppNames, InferredWorkspaceConfig, LoadedConfig, MailServiceConfig, ModelsConfig, NormalizedAppConfig, NormalizedWorkspace, PHASE_2_DEPLOY_TARGETS, SUPPORTED_DEPLOY_TARGETS, SecretsConfig, ServiceImageConfig, ServicesConfig, SharedConfig, WorkspaceConfig, WorkspaceConfigSchema, WorkspaceInput, defineWorkspace, formatValidationErrors, getAppBuildOrder, getAppGkmConfig, getDependencyEnvVars, getDeployTargetError, isDeployTargetSupported, isPhase2DeployTarget, isWorkspaceConfig, normalizeWorkspace, processConfig, safeValidateWorkspaceConfig, validateWorkspaceConfig, wrapSingleAppAsWorkspace };
1469
- //# sourceMappingURL=index-B5rGIc4g.d.cts.map
1474
+ //# sourceMappingURL=index-afBljZKY.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-afBljZKY.d.cts","names":[],"sources":["../src/deploy/state.ts","../src/deploy/StateProvider.ts","../src/workspace/schema.ts","../src/workspace/types.ts","../src/workspace/index.ts"],"sourcesContent":[],"mappings":"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"}
package/dist/index.cjs CHANGED
@@ -1,9 +1,9 @@
1
1
  #!/usr/bin/env -S npx tsx
2
2
  const require_chunk = require('./chunk-CUT6urMc.cjs');
3
- const require_workspace = require('./workspace-BFRUOOrh.cjs');
4
- const require_config = require('./config-BGeJsW1r.cjs');
3
+ const require_workspace = require('./workspace-CjT323qw.cjs');
4
+ const require_config = require('./config-CKfif10N.cjs');
5
5
  const require_credentials = require('./credentials-C8DWtnMY.cjs');
6
- const require_openapi = require('./openapi-D1KXv2Ml.cjs');
6
+ const require_openapi = require('./openapi-D3p6s8UA.cjs');
7
7
  const require_storage = require('./storage-CoCNe0Pt.cjs');
8
8
  const require_dokploy_api = require('./dokploy-api-CQvhV6Hd.cjs');
9
9
  const require_encryption = require('./encryption-BE0UOb8j.cjs');
@@ -32,7 +32,7 @@ const prompts = require_chunk.__toESM(require("prompts"));
32
32
 
33
33
  //#region package.json
34
34
  var name = "@geekmidas/cli";
35
- var version = "1.0.0";
35
+ var version = "1.0.2";
36
36
  var description = "CLI tools for building Lambda handlers, server applications, and generating OpenAPI specs";
37
37
  var private$1 = false;
38
38
  var type = "module";
@@ -1126,13 +1126,13 @@ async function validateFrontendApp(appName, appPath, workspaceRoot) {
1126
1126
  if (!hasConfigFile) errors.push(`Next.js config file not found. Expected one of: ${NEXTJS_CONFIG_FILES.join(", ")}`);
1127
1127
  const packageJsonPath = (0, node_path.join)(fullPath, "package.json");
1128
1128
  if ((0, node_fs.existsSync)(packageJsonPath)) try {
1129
- const pkg = require(packageJsonPath);
1129
+ const pkg$1 = require(packageJsonPath);
1130
1130
  const deps = {
1131
- ...pkg.dependencies,
1132
- ...pkg.devDependencies
1131
+ ...pkg$1.dependencies,
1132
+ ...pkg$1.devDependencies
1133
1133
  };
1134
1134
  if (!deps.next) errors.push("Next.js not found in dependencies. Run: pnpm add next react react-dom");
1135
- if (!pkg.scripts?.dev) warnings.push("No \"dev\" script found in package.json. Turbo expects a \"dev\" script to run.");
1135
+ if (!pkg$1.scripts?.dev) warnings.push("No \"dev\" script found in package.json. Turbo expects a \"dev\" script to run.");
1136
1136
  } catch {
1137
1137
  errors.push(`Failed to read package.json at ${packageJsonPath}`);
1138
1138
  }
@@ -3365,8 +3365,8 @@ function resolveDockerConfig$1(config) {
3365
3365
  const docker = config.docker ?? {};
3366
3366
  let defaultImageName = "api";
3367
3367
  try {
3368
- const pkg = require(`${process.cwd()}/package.json`);
3369
- if (pkg.name) defaultImageName = pkg.name.replace(/^@[^/]+\//, "");
3368
+ const pkg$1 = require(`${process.cwd()}/package.json`);
3369
+ if (pkg$1.name) defaultImageName = pkg$1.name.replace(/^@[^/]+\//, "");
3370
3370
  } catch {}
3371
3371
  return {
3372
3372
  registry: docker.registry ?? "",
@@ -3722,9 +3722,9 @@ async function dockerCommand(options) {
3722
3722
  } else throw new Error("Monorepo detected but turbo.json not found.\n\nDocker builds in monorepos require Turborepo for proper dependency isolation.\n\nTo fix this:\n 1. Install turbo: pnpm add -Dw turbo\n 2. Create turbo.json in your monorepo root\n 3. Run this command again\n\nSee: https://turbo.build/repo/docs/guides/tools/docker");
3723
3723
  let turboPackage = options.turboPackage ?? dockerConfig.imageName;
3724
3724
  if (useTurbo && !options.turboPackage) try {
3725
- const pkg = require(`${process.cwd()}/package.json`);
3726
- if (pkg.name) {
3727
- turboPackage = pkg.name;
3725
+ const pkg$1 = require(`${process.cwd()}/package.json`);
3726
+ if (pkg$1.name) {
3727
+ turboPackage = pkg$1.name;
3728
3728
  logger$5.log(` Turbo package: ${turboPackage}`);
3729
3729
  }
3730
3730
  } catch {}
@@ -3849,8 +3849,8 @@ function getAppPackageName(appPath) {
3849
3849
  const pkgPath = (0, node_path.join)(appPath, "package.json");
3850
3850
  if (!(0, node_fs.existsSync)(pkgPath)) return void 0;
3851
3851
  const content = (0, node_fs.readFileSync)(pkgPath, "utf-8");
3852
- const pkg = JSON.parse(content);
3853
- return pkg.name;
3852
+ const pkg$1 = JSON.parse(content);
3853
+ return pkg$1.name;
3854
3854
  } catch {
3855
3855
  return void 0;
3856
3856
  }
@@ -3946,8 +3946,8 @@ function getAppNameFromCwd$1() {
3946
3946
  const packageJsonPath = (0, node_path.join)(process.cwd(), "package.json");
3947
3947
  if (!(0, node_fs.existsSync)(packageJsonPath)) return void 0;
3948
3948
  try {
3949
- const pkg = JSON.parse((0, node_fs.readFileSync)(packageJsonPath, "utf-8"));
3950
- if (pkg.name) return pkg.name.replace(/^@[^/]+\//, "");
3949
+ const pkg$1 = JSON.parse((0, node_fs.readFileSync)(packageJsonPath, "utf-8"));
3950
+ if (pkg$1.name) return pkg$1.name.replace(/^@[^/]+\//, "");
3951
3951
  } catch {}
3952
3952
  return void 0;
3953
3953
  }
@@ -3963,8 +3963,8 @@ function getAppNameFromPackageJson() {
3963
3963
  const packageJsonPath = (0, node_path.join)(projectRoot, "package.json");
3964
3964
  if (!(0, node_fs.existsSync)(packageJsonPath)) return void 0;
3965
3965
  try {
3966
- const pkg = JSON.parse((0, node_fs.readFileSync)(packageJsonPath, "utf-8"));
3967
- if (pkg.name) return pkg.name.replace(/^@[^/]+\//, "");
3966
+ const pkg$1 = JSON.parse((0, node_fs.readFileSync)(packageJsonPath, "utf-8"));
3967
+ if (pkg$1.name) return pkg$1.name.replace(/^@[^/]+\//, "");
3968
3968
  } catch {}
3969
3969
  return void 0;
3970
3970
  }
@@ -4541,10 +4541,10 @@ async function createStateProvider(options) {
4541
4541
  if (provider === "ssm") {
4542
4542
  if (!workspaceName) throw new Error("Workspace name is required for SSM state provider. Set \"name\" in gkm.config.ts.");
4543
4543
  const { LocalStateProvider } = await Promise.resolve().then(() => require("./LocalStateProvider-CdspeSVL.cjs"));
4544
- const { SSMStateProvider } = await Promise.resolve().then(() => require("./SSMStateProvider-BxAPU99a.cjs"));
4544
+ const { SSMStateProvider } = await Promise.resolve().then(() => require("./SSMStateProvider-D79o_JjM.cjs"));
4545
4545
  const { CachedStateProvider: CachedStateProvider$1 } = await Promise.resolve().then(() => require("./CachedStateProvider-D_uISMmJ.cjs"));
4546
4546
  const local = new LocalStateProvider(workspaceRoot);
4547
- const ssm = new SSMStateProvider({
4547
+ const ssm = SSMStateProvider.create({
4548
4548
  workspaceName,
4549
4549
  region: config.region
4550
4550
  });
@@ -4659,8 +4659,8 @@ const __dirname$1 = (0, node_path.dirname)(__filename$1);
4659
4659
  * This ensures tsx is available regardless of whether the target project has it installed.
4660
4660
  */
4661
4661
  function resolveTsxPath() {
4662
- const require$1 = (0, node_module.createRequire)(require("url").pathToFileURL(__filename).href);
4663
- return require$1.resolve("tsx");
4662
+ const require$2 = (0, node_module.createRequire)(require("url").pathToFileURL(__filename).href);
4663
+ return require$2.resolve("tsx");
4664
4664
  }
4665
4665
  /**
4666
4666
  * Resolve the path to a sniffer helper file.
@@ -6292,17 +6292,29 @@ function rotateServicePassword(secrets, service) {
6292
6292
 
6293
6293
  //#endregion
6294
6294
  //#region src/init/versions.ts
6295
+ const require$1 = (0, node_module.createRequire)(require("url").pathToFileURL(__filename).href);
6296
+ function loadPackageJson() {
6297
+ try {
6298
+ return require$1("../package.json");
6299
+ } catch {
6300
+ return require$1("../../package.json");
6301
+ }
6302
+ }
6303
+ const pkg = loadPackageJson();
6304
+ /**
6305
+ * CLI version resolved from package.json at runtime
6306
+ */
6307
+ const CLI_VERSION = `~${pkg.version}`;
6295
6308
  /**
6296
6309
  * Package versions for @geekmidas packages
6297
6310
  *
6298
- * AUTO-GENERATED - Do not edit manually
6311
+ * AUTO-GENERATED (except CLI) - Do not edit manually
6299
6312
  * Run: pnpm --filter @geekmidas/cli sync-versions
6300
6313
  */
6301
6314
  const GEEKMIDAS_VERSIONS = {
6302
6315
  "@geekmidas/audit": "~1.0.0",
6303
6316
  "@geekmidas/auth": "~1.0.0",
6304
6317
  "@geekmidas/cache": "~1.0.0",
6305
- "@geekmidas/cli": "~1.0.0",
6306
6318
  "@geekmidas/client": "~1.0.0",
6307
6319
  "@geekmidas/cloud": "~1.0.0",
6308
6320
  "@geekmidas/constructs": "~1.0.0",
@@ -6318,7 +6330,8 @@ const GEEKMIDAS_VERSIONS = {
6318
6330
  "@geekmidas/storage": "~1.0.0",
6319
6331
  "@geekmidas/studio": "~1.0.0",
6320
6332
  "@geekmidas/telescope": "~1.0.0",
6321
- "@geekmidas/testkit": "~1.0.0"
6333
+ "@geekmidas/testkit": "~1.0.0",
6334
+ "@geekmidas/cli": CLI_VERSION
6322
6335
  };
6323
6336
 
6324
6337
  //#endregion