Skip to content

Commit a299cdc

Browse files
jkebingerclaude
andauthored
fix: include encrypted value in create --secret payload (#84)
* fix: include encrypted value in create --secret payload When using `reforge create --secret`, the encrypted value was missing from the API payload. The `mapConfigValueToDto` function wasn't handling the `value` property returned by `makeConfidentialValue`. Changes: - Extract `mapConfigValueToDto` to shared utility (config-value-dto.ts) - Add handling for `configValue.value` (used by encrypted values) - Update both create.ts and set-default.ts to use shared utility - Add payload validation in create test mock for encrypted values - Add `set-default --secret` to interactive menu for consistency - Bump version to 0.0.14 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * Prettier this file * add generated readme update --------- Co-authored-by: Claude <noreply@anthropic.com>
1 parent 9b1a880 commit a299cdc

File tree

7 files changed

+140
-93
lines changed

7 files changed

+140
-93
lines changed

README.md

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ $ npm install -g @reforge-com/cli
1414
$ reforge COMMAND
1515
running command...
1616
$ reforge (--version)
17-
@reforge-com/cli/0.0.13 darwin-arm64 node-v24.4.1
17+
@reforge-com/cli/0.0.14 darwin-arm64 node-v24.6.0
1818
$ reforge --help [COMMAND]
1919
USAGE
2020
$ reforge COMMAND
@@ -91,7 +91,7 @@ EXAMPLES
9191
$ reforge create my.new.string --type json --value="{\"key\": \"value\"}"
9292
```
9393

94-
_See code: [src/commands/create.ts](https://github.com/ReforgeHQ/cli/blob/v0.0.13/src/commands/create.ts)_
94+
_See code: [src/commands/create.ts](https://github.com/ReforgeHQ/cli/blob/v0.0.14/src/commands/create.ts)_
9595

9696
## `reforge download`
9797

@@ -124,7 +124,7 @@ EXAMPLES
124124
$ reforge download --environment=test --sdk-key=YOUR_SDK_KEY
125125
```
126126

127-
_See code: [src/commands/download.ts](https://github.com/ReforgeHQ/cli/blob/v0.0.13/src/commands/download.ts)_
127+
_See code: [src/commands/download.ts](https://github.com/ReforgeHQ/cli/blob/v0.0.14/src/commands/download.ts)_
128128

129129
## `reforge generate`
130130

@@ -194,7 +194,7 @@ EXAMPLES
194194
$ reforge generate --targets node-ts -o ./dist # combine with targets
195195
```
196196
197-
_See code: [src/commands/generate.ts](https://github.com/ReforgeHQ/cli/blob/v0.0.13/src/commands/generate.ts)_
197+
_See code: [src/commands/generate.ts](https://github.com/ReforgeHQ/cli/blob/v0.0.14/src/commands/generate.ts)_
198198
199199
## `reforge generate-new-hex-key`
200200
@@ -217,7 +217,7 @@ EXAMPLES
217217
$ reforge generate-new-hex-key
218218
```
219219
220-
_See code: [src/commands/generate-new-hex-key.ts](https://github.com/ReforgeHQ/cli/blob/v0.0.13/src/commands/generate-new-hex-key.ts)_
220+
_See code: [src/commands/generate-new-hex-key.ts](https://github.com/ReforgeHQ/cli/blob/v0.0.14/src/commands/generate-new-hex-key.ts)_
221221
222222
## `reforge get [NAME]`
223223
@@ -250,7 +250,7 @@ EXAMPLES
250250
$ reforge get my.config.name --environment=production
251251
```
252252
253-
_See code: [src/commands/get.ts](https://github.com/ReforgeHQ/cli/blob/v0.0.13/src/commands/get.ts)_
253+
_See code: [src/commands/get.ts](https://github.com/ReforgeHQ/cli/blob/v0.0.14/src/commands/get.ts)_
254254
255255
## `reforge info [NAME]`
256256
@@ -281,7 +281,7 @@ EXAMPLES
281281
$ reforge info my.config.name
282282
```
283283
284-
_See code: [src/commands/info.ts](https://github.com/ReforgeHQ/cli/blob/v0.0.13/src/commands/info.ts)_
284+
_See code: [src/commands/info.ts](https://github.com/ReforgeHQ/cli/blob/v0.0.14/src/commands/info.ts)_
285285
286286
## `reforge interactive`
287287
@@ -299,7 +299,7 @@ EXAMPLES
299299
$ reforge
300300
```
301301
302-
_See code: [src/commands/interactive.ts](https://github.com/ReforgeHQ/cli/blob/v0.0.13/src/commands/interactive.ts)_
302+
_See code: [src/commands/interactive.ts](https://github.com/ReforgeHQ/cli/blob/v0.0.14/src/commands/interactive.ts)_
303303
304304
## `reforge list`
305305
@@ -336,7 +336,7 @@ EXAMPLES
336336
$ reforge list --feature-flags
337337
```
338338
339-
_See code: [src/commands/list.ts](https://github.com/ReforgeHQ/cli/blob/v0.0.13/src/commands/list.ts)_
339+
_See code: [src/commands/list.ts](https://github.com/ReforgeHQ/cli/blob/v0.0.14/src/commands/list.ts)_
340340
341341
## `reforge login`
342342
@@ -364,7 +364,7 @@ EXAMPLES
364364
$ reforge login --profile myprofile
365365
```
366366
367-
_See code: [src/commands/login.ts](https://github.com/ReforgeHQ/cli/blob/v0.0.13/src/commands/login.ts)_
367+
_See code: [src/commands/login.ts](https://github.com/ReforgeHQ/cli/blob/v0.0.14/src/commands/login.ts)_
368368
369369
## `reforge logout`
370370
@@ -387,7 +387,7 @@ EXAMPLES
387387
$ reforge logout
388388
```
389389
390-
_See code: [src/commands/logout.ts](https://github.com/ReforgeHQ/cli/blob/v0.0.13/src/commands/logout.ts)_
390+
_See code: [src/commands/logout.ts](https://github.com/ReforgeHQ/cli/blob/v0.0.14/src/commands/logout.ts)_
391391
392392
## `reforge mcp`
393393
@@ -420,7 +420,7 @@ EXAMPLES
420420
$ reforge mcp --url http://local-launch.goatsofreforge.com:3003/api/v1/mcp
421421
```
422422
423-
_See code: [src/commands/mcp.ts](https://github.com/ReforgeHQ/cli/blob/v0.0.13/src/commands/mcp.ts)_
423+
_See code: [src/commands/mcp.ts](https://github.com/ReforgeHQ/cli/blob/v0.0.14/src/commands/mcp.ts)_
424424
425425
## `reforge override [NAME]`
426426
@@ -459,7 +459,7 @@ EXAMPLES
459459
$ reforge override my.double.config --value=3.14159
460460
```
461461
462-
_See code: [src/commands/override.ts](https://github.com/ReforgeHQ/cli/blob/v0.0.13/src/commands/override.ts)_
462+
_See code: [src/commands/override.ts](https://github.com/ReforgeHQ/cli/blob/v0.0.14/src/commands/override.ts)_
463463
464464
## `reforge profile`
465465
@@ -482,7 +482,7 @@ EXAMPLES
482482
$ reforge profile
483483
```
484484
485-
_See code: [src/commands/profile.ts](https://github.com/ReforgeHQ/cli/blob/v0.0.13/src/commands/profile.ts)_
485+
_See code: [src/commands/profile.ts](https://github.com/ReforgeHQ/cli/blob/v0.0.14/src/commands/profile.ts)_
486486
487487
## `reforge schema NAME`
488488
@@ -516,7 +516,7 @@ EXAMPLES
516516
$ reforge schema my-schema --get
517517
```
518518
519-
_See code: [src/commands/schema.ts](https://github.com/ReforgeHQ/cli/blob/v0.0.13/src/commands/schema.ts)_
519+
_See code: [src/commands/schema.ts](https://github.com/ReforgeHQ/cli/blob/v0.0.14/src/commands/schema.ts)_
520520
521521
## `reforge serve DATA-FILE`
522522
@@ -552,7 +552,7 @@ EXAMPLES
552552
$ reforge serve ./reforge.test.588.config.json --port=3099
553553
```
554554
555-
_See code: [src/commands/serve.ts](https://github.com/ReforgeHQ/cli/blob/v0.0.13/src/commands/serve.ts)_
555+
_See code: [src/commands/serve.ts](https://github.com/ReforgeHQ/cli/blob/v0.0.14/src/commands/serve.ts)_
556556
557557
## `reforge set-default [NAME]`
558558
@@ -596,7 +596,7 @@ EXAMPLES
596596
$ reforge set-default my.config.name --env-var=MY_ENV_VAR_NAME --environment=production
597597
```
598598
599-
_See code: [src/commands/set-default.ts](https://github.com/ReforgeHQ/cli/blob/v0.0.13/src/commands/set-default.ts)_
599+
_See code: [src/commands/set-default.ts](https://github.com/ReforgeHQ/cli/blob/v0.0.14/src/commands/set-default.ts)_
600600
601601
## `reforge whoami`
602602
@@ -619,7 +619,7 @@ EXAMPLES
619619
$ reforge whoami
620620
```
621621
622-
_See code: [src/commands/whoami.ts](https://github.com/ReforgeHQ/cli/blob/v0.0.13/src/commands/whoami.ts)_
622+
_See code: [src/commands/whoami.ts](https://github.com/ReforgeHQ/cli/blob/v0.0.14/src/commands/whoami.ts)_
623623
624624
## `reforge workspace`
625625
@@ -642,7 +642,7 @@ EXAMPLES
642642
$ reforge workspace
643643
```
644644
645-
_See code: [src/commands/workspace.ts](https://github.com/ReforgeHQ/cli/blob/v0.0.13/src/commands/workspace.ts)_
645+
_See code: [src/commands/workspace.ts](https://github.com/ReforgeHQ/cli/blob/v0.0.14/src/commands/workspace.ts)_
646646
<!-- commandsstop -->
647647
648648
## Local Development

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"packageManager": "yarn@4.11.0",
33
"name": "@reforge-com/cli",
4-
"version": "0.0.13",
4+
"version": "0.0.14",
55
"author": "Jeffrey Chupp @semanticart",
66
"bugs": {
77
"url": "https://github.com/ReforgeHQ/cli/issues"

src/commands/create.ts

Lines changed: 3 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import {JsonObj} from '../result.js'
77
import getValue from '../ui/get-value.js'
88
import {TYPE_MAPPING, coerceBool, coerceIntoType} from '../util/coerce.js'
99
import {checkmark} from '../util/color.js'
10+
import {mapConfigValueToDto, mapValueTypeToString} from '../util/config-value-dto.js'
1011
import {makeConfidentialValue} from '../util/encryption.js'
1112
import secretFlags, {parsedSecretFlags} from '../util/secret-flags.js'
1213

@@ -117,13 +118,13 @@ export default class Create extends APICommand {
117118
const createConfigRequest = {
118119
key: args.name,
119120
type: 'config',
120-
valueType: this.mapValueTypeToString(valueType),
121+
valueType: mapValueTypeToString(valueType),
121122
sendToClientSdk: false,
122123
default: {
123124
rules: [
124125
{
125126
criteria: [],
126-
value: this.mapConfigValueToDto(configValue, valueType),
127+
value: mapConfigValueToDto(configValue, valueType),
127128
},
128129
],
129130
},
@@ -208,70 +209,4 @@ export default class Create extends APICommand {
208209

209210
return this.ok(`${checkmark} Created boolean flag: ${key}`, {key, ...response})
210211
}
211-
212-
private mapConfigValueToDto(configValue: ConfigValue, valueType: ConfigValueType): Record<string, unknown> {
213-
const dto: Record<string, unknown> = {
214-
type: this.mapValueTypeToString(valueType),
215-
}
216-
217-
// Handle provided (env-var) values
218-
if (configValue.provided) {
219-
return {
220-
...dto,
221-
provided: {
222-
source: configValue.provided.source,
223-
lookup: configValue.provided.lookup,
224-
},
225-
}
226-
}
227-
228-
// Extract the actual value based on type
229-
let value: unknown
230-
if (configValue.bool !== undefined) {
231-
value = configValue.bool
232-
} else if (configValue.string !== undefined) {
233-
value = configValue.string
234-
} else if (configValue.int !== undefined) {
235-
value = configValue.int
236-
} else if (configValue.double !== undefined) {
237-
value = configValue.double
238-
} else if (configValue.stringList !== undefined) {
239-
value = configValue.stringList.values
240-
} else if (configValue.json !== undefined) {
241-
value = configValue.json
242-
} else if (configValue.duration !== undefined) {
243-
value = configValue.duration
244-
} else if (configValue.intRange !== undefined) {
245-
value = configValue.intRange
246-
}
247-
248-
dto.value = value
249-
250-
if (configValue.confidential) {
251-
dto.confidential = true
252-
}
253-
254-
if (configValue.decryptWith) {
255-
dto.decryptWith = configValue.decryptWith
256-
}
257-
258-
return dto
259-
}
260-
261-
private mapValueTypeToString(valueType: ConfigValueType): string {
262-
const mapping: Partial<Record<ConfigValueType, string>> = {
263-
[ConfigValueType.Bool]: 'bool',
264-
[ConfigValueType.String]: 'string',
265-
[ConfigValueType.Int]: 'int',
266-
[ConfigValueType.Double]: 'double',
267-
[ConfigValueType.StringList]: 'string_list',
268-
[ConfigValueType.Json]: 'json',
269-
[ConfigValueType.LimitDefinition]: 'limit_definition',
270-
[ConfigValueType.Duration]: 'duration',
271-
[ConfigValueType.IntRange]: 'int_range',
272-
[ConfigValueType.Bytes]: 'bytes',
273-
[ConfigValueType.LogLevel]: 'log_level',
274-
}
275-
return mapping[valueType] || 'string'
276-
}
277212
}

src/commands/set-default.ts

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,14 @@ import {Flags} from '@oclif/core'
22
import {ProvidedSource} from '@reforge-com/node'
33

44
import {APICommand} from '../index.js'
5+
import {ConfigValueType} from '../reforge-common/src/types.js'
56
import {JsonObj} from '../result.js'
67
import getConfirmation, {confirmFlag} from '../ui/get-confirmation.js'
78
import getEnvironment from '../ui/get-environment.js'
89
import getString from '../ui/get-string.js'
910
import autocomplete from '../util/autocomplete.js'
1011
import {checkmark} from '../util/color.js'
12+
import {mapConfigValueToDto} from '../util/config-value-dto.js'
1113
import {makeConfidentialValue} from '../util/encryption.js'
1214
import isInteractive from '../util/is-interactive.js'
1315
import nameArg from '../util/name-arg.js'
@@ -246,16 +248,13 @@ export default class SetDefault extends APICommand {
246248
successMessage = `Successfully changed default to \`${value}\``
247249

248250
if (secret.selected) {
249-
// Handle encrypted values
251+
// Handle encrypted values using shared utility
250252
const encryptedValueResult = await makeConfidentialValue(this, value, secret, environmentId)
251253
if (!encryptedValueResult.ok) {
252254
return this.err(encryptedValueResult.message || 'Failed to encrypt value')
253255
}
254256

255-
configValue = {
256-
type: 'string',
257-
...encryptedValueResult.value,
258-
}
257+
configValue = mapConfigValueToDto(encryptedValueResult.value, ConfigValueType.String)
259258
successMessage += ' (encrypted)'
260259
} else {
261260
// Parse the value based on type and build value object

src/interactive-prompt.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,13 @@ commands.push(
7070
id: 'set-default',
7171
implicitFlags: ['env-var'],
7272
},
73+
{
74+
command: SetDefault,
75+
description: 'Set/update the default value for an environment with --secret',
76+
displayCommandName: 'set-default --secret',
77+
id: 'set-default',
78+
implicitFlags: ['secret'],
79+
},
7380
{
7481
command: Create,
7582
description: 'Create a new item in Reforge with --secret',

0 commit comments

Comments
 (0)