apps/docs/skills/objectenvy-docs/SKILL.md
Documentation site for objectenvy
npx skillsauth add pradeepmouli/objectenvy objectenvy-docsInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Documentation site for objectenvy
process.env into a typed, nested config object at application startup.prefix: 'APP' and strip the prefix from keys.LOG__LEVEL) and want { log: { level } } nesting.env object in tests while keeping the same schema and prefix.objectify + envy)..env file from a config object (e.g., for CI scaffolding or test fixtures).ToEnv<T> for compile-time validation and need the runtime values to match.objectify() → mutate config → envy() → write back to env.concat or concat-unique).envy()..env documentation or scaffolding from TypeScript property names.objectify() uses internally to an individual value.objectify() and need consistent boolean/number parsing.Avoid when:
.required() / .asInt() semantics — use env-var instead.override().env:.objectEnvy instances instead.ToEnv<T> type at compile time — no need to call envy() at runtime.Date, Map, Set, or class instances — envy() serializes them as[object Object] via String().merge() instead.override() calls.override() instead.merge(merge(a, b), c) calls.[a-z] after the underscore.PascalCase output — capitalise the first character of the result separately.toCamelCase(toSnakeCase('apiURL')) yields 'apiUrl','apiURL'.'123' must stay '123') — passcoerce: false to objectify() instead, or handle the type downstream.parseFloat/parseInt are locale-independent but only'1e5') is NOT coerced to a number.PORT_* variable later silently restructures { portNumber } into { port: { number } },SCREAMING_SNAKE_CASE env object when relying on FromEnv types — BECAUSEcoerce: true (the default) if a value looks like a number but must stay a string —'01' becomes 1 (integer parse), losing the leading zero.objectEnvy() — BECAUSE theprocess.env after caching returns stale data.process.env after calling the inner objectify() expecting the result to update —objectEnvy instance across packages that need independent schemas — BECAUSE theenvy() to round-trip arrays of objects faithfully — BECAUSE object items areJSON.stringify-ed then joined; when objectify() re-reads the comma-separated string, itnull or undefined values in the config — BECAUSE envy() silently skipsnull/undefined entries, leaving no env key for them; the round-trip loses those fields.envy() to honour a prefix — BECAUSE it outputs bare SCREAMING_SNAKE_CASE keysAPP_PORT rather than PORT.defaults or config arguments after calling override() — BECAUSE theoverride() to handle class instances or special objects (Date, Map, Set) — BECAUSEtypeof === 'object' and recurses, which may produce unexpected results formerge() to deep-clone the inputs — BECAUSE nested sub-objects are shallow-copied'concat-unique' to deduplicate object items if equality matters beyond JSON serialisation —JSON.stringify for comparison, which is order-sensitive and ignoresundefined values, Date objects, and prototype methods.merge() handles non-plain objects (Map, Set, Date, class instances) correctly —typeof === 'object' and recurses, producing incorrect results fortoCamelCase(toSnakeCase(x)) === x for all inputs — BECAUSE acronym boundariesapiURL → API_URL → apiUrl) collapse consecutive capitals, so the round-trip isgetHTTPSUrl → GET_HTTPS_URL →getHttpsUrl, losing the original casing of consecutive uppercase letters.PORT_NUMBER → PORT__NUMBER (double underscore)_N boundary.coerceValue on values that use commas as decimal separators (e.g., '3,14' in[3, 14] rather than the3.14.'01234') —parseInt('01234', 10) returns 1234.'on'/'off' being coerced to booleans — BECAUSE only true/false/yes/no/y/n'on' stays as the string 'on'.Configuration options for objectify() — controls prefix filtering,
env source, Zod schema validation, camelCase nesting behaviour, and include/exclude patterns.
| Key | Type | Required | Default | Description |
| --- | --- | --- | --- | --- |
| prefix | string | no | — | Filter environment variables by prefix.
e.g., "APP" will only include variables starting with "APP_" |
| env | EnvLike | no | — | Custom environment object. Defaults to process.env |
| schema | T extends ConfigObject ? ZodObject<any, $strip> | T : never | no | — | Schema for validation and type inference.
Can be either a Zod schema or a plain object with the same structure as your config.
Zod schemas will validate, plain objects provide type inference only. |
| coerce | boolean | no | — | Whether to automatically coerce values to numbers/booleans |
| delimiter | string | no | — | Delimiter used to indicate nesting depth.
By default, each underscore creates a new nesting level.
Set to '__' to use double underscores for nesting. |
| nonNestingPrefixes | string[] | no | — | Prefix segments that should not trigger nesting even when multiple entries share the prefix.
For example, keys starting with 'max', 'min', 'is', 'enable', 'disable' will stay flat:
MAX_CONNECTIONS, MAX_TIMEOUT -> { maxConnections, maxTimeout }
IS_DEBUG, IS_VERBOSE -> { isDebug, isVerbose } |
| include | string[] | no | — | Include only environment variables matching these patterns.
Matches against the normalized key (after prefix removal, in camelCase).
If specified, only variables matching at least one pattern will be included. |
| exclude | string[] | no | — | Exclude environment variables matching these patterns.
Matches against the normalized key (after prefix removal, in camelCase).
Variables matching any pattern will be excluded. |
Options for controlling the merge behaviour of merge() and override().
| Key | Type | Required | Default | Description |
| --- | --- | --- | --- | --- |
| arrayMergeStrategy | ArrayMergeStrategy | no | — | Strategy to apply when both objects contain an array at the same key.
'replace' — the second (higher-priority) array replaces the first entirely.'concat' — arrays are concatenated, second array appended after the first.'concat-unique' — concatenated with duplicate primitive values removed. |Parsing: objectify, objectEnvy, toCamelCase, coerceValue
Serialization: envy, toSnakeCase
Merging: override, merge
Type Utilities: ConfigObject, ConfigValue, ArrayMergeStrategy, ToEnv, FromEnv, WithPrefix, WithoutPrefix, SchemaToEnv
tools
Automatically map process.env to strongly-typed, nested config objects with camelCase fields Use when working with config, configuration, env, environment, type-safe, zod, nested, camelcase.
development
ObjectEnvy monorepo - strongly-typed environment configuration for TypeScript projects
documentation
Fetch GitHub issues, spawn sub-agents to implement fixes and open PRs, then monitor and address PR review comments. Usage: /gh-issues [owner/repo] [--label bug] [--limit 5] [--milestone v1.0] [--assignee @me] [--fork user/repo] [--watch] [--interval 5] [--reviews-only] [--cron] [--dry-run] [--model glm-5] [--notify-channel -1002381931352]
documentation
Maintain the OpenClaw memory wiki vault with deterministic pages, managed blocks, and source-backed updates.