Skip to content

config:set, config:get & config:unset

CLI commands for safely reading, modifying, and deleting keys in workspace.yaml with Zod schema validation. All three commands use the same key routing logic: all keys must be fully qualified from the workspace root (e.g., software_delivery.gates.minCoverage, not gates.minCoverage).

When you provide a key, config:set, config:get, and config:unset route it based on its first segment:

| First segment matches | Behavior | Example key | | --------------------- | ----------------------------------------------------------------------------- | ------------------------------------- | | Writable root key | Writes/reads directly at the workspace root | control_plane.sync_interval | | Pack config key | Writes/reads under the pack’s config block, validated against the pack schema | software_delivery.gates.minCoverage | | Managed root key | Error with guidance: “use <command> instead” | packs, lanes, security | | Unknown key | Error with did-you-mean suggestion if possible | gates.minCoverage |

These keys can be written directly without a dedicated command:

  • control_plane — Control plane connection and sync settings
  • memory_namespace — Memory layer namespace
  • event_namespace — Event stream namespace

Pack config keys are declared by domain packs in their manifest.yaml via the config_key field. For example, the Software Delivery pack declares config_key: software_delivery, making all software_delivery.* paths writable via config:set.

Writes to pack config keys are validated against the pack’s config schema if one is provided.

These keys require dedicated CLI commands:

| Key | Command | | ---------- | ---------------- | | id | workspace-init | | name | workspace-init | | packs | pack:install | | lanes | lane:edit | | policies | policy:set | | security | security:set |

If you use an unqualified key that matches a known pack sub-key, the error includes a suggestion:

[config:set] Unknown root key "gates".
  Did you mean "software_delivery.gates.minCoverage"?

Safely updates a value in workspace.yaml.

pnpm config:set --key <dotpath> --value <value>

| Flag | Required | Description | | --------- | -------- | ---------------------------------------------------------------------------------------- | | --key | Yes | Fully qualified config key in dot notation (e.g., software_delivery.gates.minCoverage) | | --value | Yes | Value to set (comma-separated for array append) | | --help | No | Show usage information |

# Set methodology testing mode
pnpm config:set --key software_delivery.methodology.testing --value test-after

# Set minimum coverage threshold
pnpm config:set --key software_delivery.gates.minCoverage --value 85

# Disable coverage gate
pnpm config:set --key software_delivery.gates.enableCoverage --value false

# Set experimental feature
pnpm config:set --key software_delivery.experimental.context_validation --value true

config:set automatically coerces string values based on context:

| Input Value | Existing Type | Coerced To | | ----------- | ------------- | ------------------ | | "true" | any | true (boolean) | | "false" | any | false (boolean) | | "42" | number | 42 (number) | | "A,B,C" | array | append A, B, C | | "hello" | string | "hello" (string) |

If the value fails Zod schema validation, the command exits with a descriptive error and no changes are written:

[config:set] Validation failed for software_delivery.methodology.testing=invalid-value:
  Invalid enum value. Expected 'tdd' | 'test-after' | 'none', received 'invalid-value'

If you use an unqualified key, you get a routing error:

[config:set] Unknown root key "gates".
  Did you mean "software_delivery.gates.minCoverage"?

If you try to write a managed key:

[config:set] Key "packs" is managed by a dedicated command. Use `pnpm pack:install` instead.

Reads and displays a value from workspace.yaml. Uses the same routing logic as config:set.

pnpm config:get --key <dotpath>

| Flag | Required | Description | | -------- | -------- | ------------------------------------------------------------------------------------------ | | --key | Yes | Fully qualified config key in dot notation (e.g., software_delivery.methodology.testing) | | --help | No | Show usage information |

# Read a pack config value
pnpm config:get --key software_delivery.methodology.testing
# Output: tdd

# Read a numeric value
pnpm config:get --key software_delivery.gates.minCoverage
# Output: 90

# Read an object (outputs as YAML)
pnpm config:get --key software_delivery.methodology
# Output:
#   testing: tdd
#   architecture: hexagonal

# Read a writable root key
pnpm config:get --key control_plane
# Output:
#   sync_interval: 60
#   endpoint: https://api.lumenflow.dev

# Read a missing key
pnpm config:get --key software_delivery.nonexistent.key
# Output: [config:get] Key "software_delivery.nonexistent.key" is not set (undefined)

Safely deletes a key from workspace.yaml. The delete inverse of config:set — use it to remove stale config blocks (e.g., a decommissioned agent client) without hand-editing YAML.

pnpm config:unset --key <dotpath>

| Flag | Required | Description | | -------- | -------- | ------------------------------------------------------------------------------------------------ | | --key | Yes | Fully qualified config key in dot notation (e.g., software_delivery.agents.clients.gemini-cli) | | --help | No | Show usage information |

# Remove a stale agent client block
pnpm config:unset --key software_delivery.agents.clients.gemini-cli

# Remove a control plane sub-key
pnpm config:unset --key control_plane.sync_interval

# Remove a scalar root key
pnpm config:unset --key memory_namespace
  1. Routes the key with the same prefix rules as config:set
  2. Errors if the key does not exist (nothing to unset)
  3. Deletes the key, then validates the post-delete workspace against the owning schema
  4. If validation passes, writes via micro-worktree atomic commit

Unknown-key detection is deliberately not applied to the deleted path: removing a key the schema no longer recognizes is exactly what config:unset is for (stale config blocks). Only the remaining config must validate.

[config:unset] Key "software_delivery.agents.clients.codex-cli" not found in workspace — nothing to unset.
[config:unset] Key "packs" is managed by a dedicated command. Use `pnpm pack:install` instead.

Deleting an entire pack config block (software_delivery) or the control_plane object is refused — unset individual sub-keys instead. Deletions that would leave the remaining config schema-invalid (e.g., removing a required sub-field of a configured provider) are rejected before commit.

Software Delivery pack (software_delivery.*)

Section titled “Software Delivery pack (software_delivery.*)”

| Dotpath | Type | Values | | --------------------------------------------------- | -------- | ------------------------------------------------------- | | software_delivery.methodology.testing | enum | tdd, test-after, none | | software_delivery.methodology.architecture | enum | hexagonal, layered, none | | software_delivery.gates.minCoverage | number | 0-100 | | software_delivery.gates.enableCoverage | boolean | true, false | | software_delivery.gates.maxEslintWarnings | number | Non-negative integer | | software_delivery.experimental.context_validation | boolean | true, false | | software_delivery.experimental.validation_mode | enum | off, warn, error | | software_delivery.git.requireRemote | boolean | true, false | | software_delivery.cleanup.trigger | enum | on_done, on_init, manual | | software_delivery.external_work_items.* | object | Provider close-out/readback adapters and audit settings | | software_delivery.agents.methodology.principles | string[] | Array of methodology names |

| Dotpath | Type | Description | | ----------------------------- | ------ | ------------------------------------ | | control_plane.sync_interval | number | Seconds between control plane syncs | | control_plane.endpoint | string | Control plane API URL | | memory_namespace | string | Namespace for memory layer isolation | | event_namespace | string | Namespace for kernel event stream |