Skip to content

feat(cli): validate sensitive fields require env() references#110

Closed
tonychang04 wants to merge 10 commits into
mainfrom
feat/insforge-toml-secrets-validation
Closed

feat(cli): validate sensitive fields require env() references#110
tonychang04 wants to merge 10 commits into
mainfrom
feat/insforge-toml-secrets-validation

Conversation

@tonychang04
Copy link
Copy Markdown
Contributor

@tonychang04 tonychang04 commented May 7, 2026

Summary

  • Adds parseEnvRef() and validateSensitiveString() in src/lib/config-secrets.ts
  • Sensitive TOML fields (OAuth client_secret, SMTP password, S3 secret key, etc.) MUST be env(NAME) references — never literal values
  • Same convention as Vercel/Fly.io/Supabase: makes insforge.toml unconditionally safe to commit to git
  • Foundation laid but not yet wired — first consumer will be [email.smtp] or [auth.providers.<built_in>]

Why this is a separate branch

The MVP scope on feat/insforge-toml-mvp (PR #109) is [auth] allowed_redirect_urls only — zero sensitive fields, so the validator wouldn't be exercised. This branch lands the foundation so the next sensitive section to ship has the validator ready to register.

Test plan

  • 6 vitest cases in src/lib/config-secrets.test.ts — all pass
  • Full src/lib test suite (18 tests across config-toml, config-diff, config-format, config-secrets) passes
  • Wired into validateConfig() when first sensitive field section ships

🤖 Generated with Claude Code


Summary by cubic

Adds insforge.toml support to the CLI with config export, plan, and apply for [auth] allowed_redirect_urls. Sets up env(NAME) validation for sensitive fields to keep configs safe to commit.

  • New Features
    • insforge config subcommands:
      • export writes live config to insforge.toml; plan shows a readable diff; apply updates via PUT /api/auth/config with confirm and --dry-run/--auto-approve.
    • v1 config schema and TOML codec via smol-toml, with deterministic formatting.
    • Structured diff and plan: diffConfig() + formatPlan() with default-keep semantics for absent fields.
    • Sensitive-field validation foundation: parseEnvRef() and validateSensitiveString() enforce env(NAME) (UPPER_SNAKE_CASE); wiring will happen when SMTP/OAuth sections land.

Written for commit 8f05013. Summary will update on new commits.

Summary by CodeRabbit

  • New Features
    • New CLI "config" group: export, plan, and apply commands (preview, JSON output, optional confirm/apply).
  • Validation & Formatting
    • TOML parsing/serialization and schema validation for insforge.toml; secrets must be env(...) refs.
    • Human-readable plan formatter and deterministic TOML output.
  • Tests
    • Added unit tests covering diffing, formatting, TOML parsing, schema and secret validation.
  • Chores
    • Added TOML parsing dependency.

Review Change Stack

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented May 7, 2026

Walkthrough

Adds insforge.toml management to the CLI: parse/serialize TOML, validate schema and secrets, compute and format diffs, and register config export|plan|apply subcommands that interact with /api/metadata and apply allowed redirect URL changes.

Changes

Config File Management and CLI Commands

Layer / File(s) Summary
TOML Serialization Dependency
package.json
Added smol-toml ^1.6.1 as a runtime dependency.
Config Schema and Validation
src/lib/config-schema.ts
Introduced InsforgeConfig and AuthConfig TypeScript interfaces with optional project_id and auth.allowed_redirect_urls. Implemented ConfigValidationError and validateConfig() enforcing schema types.
Sensitive Field Validation
src/lib/config-secrets.ts, src/lib/config-secrets.test.ts
Added parseEnvRef() and validateSensitiveString() with tests to require env(NAME) references for sensitive fields and produce actionable validation errors.
TOML Parsing and Serialization
src/lib/config-toml.ts, src/lib/config-toml.test.ts
Implemented parseConfigToml() to parse TOML via smol-toml and validate the schema (wrap parse errors), and stringifyConfigToml() to deterministically serialize InsforgeConfig back to TOML.
Config Diffing
src/lib/config-diff.ts, src/lib/config-diff.test.ts
Implemented diffConfig() to compare live and file configs for auth.allowed_redirect_urls using order-sensitive array equality; returns DiffChange entries and DiffSummary. Tests cover additive, identical, omitted, and empty-array cases.
Plan Formatting
src/lib/config-format.ts, src/lib/config-format.test.ts
Implemented formatPlan() to render DiffResult as grouped, human-readable multi-line plans (~ key: from → to) and a no-change message; tests verify formatting and empty-state output.
CLI Config Commands and Integration
src/commands/config/index.ts, src/commands/config/export.ts, src/commands/config/plan.ts, src/commands/config/apply.ts, src/index.ts
Registered the config command group and export, plan, apply subcommands. export fetches live metadata and writes TOML; plan diffs a file against live metadata and prints a plan; apply shows a plan, optionally prompts, and applies auth.allowed_redirect_urls via PUT /api/auth/config. All commands support JSON output, auth checks, CLI usage reporting, and central error handling.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Poem

🐰 A config file appears, crisp and clean,
With export, plan, and apply—a CLI dream!
From TOML we parse, to diffs we compare,
Then format it pretty for all eyes to share.

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 31.25% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The PR title focuses on validating sensitive fields to require env() references, which is the core feature added in config-secrets.ts and config-secrets.test.ts. However, the changeset also includes substantial work implementing a complete config management system (config diff, format, schema, TOML parsing, and multiple CLI commands for export/plan/apply). The title addresses only one aspect of the changes and misses the broader context of adding the entire config CLI command structure.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/insforge-toml-secrets-validation

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown

@cubic-dev-ai cubic-dev-ai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No issues found across 2 files

@tonychang04 tonychang04 force-pushed the feat/insforge-toml-mvp branch from d8d34a6 to 0fb69b3 Compare May 11, 2026 00:15
@tonychang04 tonychang04 force-pushed the feat/insforge-toml-secrets-validation branch from 44496e6 to 150ef30 Compare May 12, 2026 05:12
@tonychang04 tonychang04 changed the base branch from feat/insforge-toml-mvp to main May 12, 2026 05:13
tonychang04 and others added 10 commits May 12, 2026 10:23
Sensitive fields in insforge.toml (OAuth client_secret, SMTP password,
S3 secret key, etc.) MUST be env(NAME) references — never literal
values. Same convention as Vercel/Fly.io/Supabase, makes the file
unconditionally safe to commit to git.

parseEnvRef() extracts the secret name from a well-formed env(NAME)
reference (NAME must be UPPER_SNAKE_CASE).

validateSensitiveString() throws ConfigValidationError with an
actionable message naming the exact 'insforge secrets add' command
when a literal is pasted in place of an env() ref.

Foundation laid but not yet wired — first consumer will be
[email.smtp] or [auth.providers.<built_in>], whichever ships next.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@tonychang04 tonychang04 force-pushed the feat/insforge-toml-secrets-validation branch from 9d7329b to 8f05013 Compare May 12, 2026 17:23
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 5

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/commands/config/apply.ts`:
- Around line 65-67: The call to applyChange(result.changes) passes an unused
file parameter; remove the unused parameter from applyChange's signature and all
its call sites (including the loop that does await applyChange(change, file))
or, if you intend to reserve it, rename the parameter to _file in the
applyChange function and the call sites to suppress linter warnings; update
applyChange's definition and every place that calls applyChange to match the new
parameter list (or underscore name) so the codebase compiles cleanly.
- Around line 42-46: The command currently prints two separate JSON payloads
when the --json flag is used (the JSON print of result at the
console.log(JSON.stringify(result...)) and a second JSON output later), which
breaks single-document parsers; update the apply command so that when the json
flag is true it emits exactly one JSON document containing the final output
(merge or replace whatever intermediate JSON payloads into the single canonical
result object) and skip any additional console.log(JSON.stringify(...)) or
formatPlan(...) calls that would print a second document; specifically change
the logic around the json check in apply.ts (the
console.log(JSON.stringify(result...)) and the later JSON print near the code
that currently calls formatPlan(result)) so only one JSON.stringify(result) is
executed and non-JSON formatted output (formatPlan) is used only when json is
false.

In `@src/commands/config/export.ts`:
- Around line 42-45: The current construction of const config: InsforgeConfig
always emits auth.allowed_redirect_urls as an empty array when
raw.auth?.allowedRedirectUrls is missing; change the config assembly so
allowed_redirect_urls is only set when raw.auth?.allowedRedirectUrls is defined
(i.e. do not synthesize an empty array). Update the config/auth object creation
in export.ts (the const config and auth block) to conditionally include
allowed_redirect_urls (using a conditional spread or guard on
raw.auth?.allowedRedirectUrls !== undefined) so the field is omitted when the
source metadata omits it.

In `@src/lib/config-schema.ts`:
- Around line 18-20: The constructor for ConfigValidationError currently formats
the message as `config.${path}: ${message}` which yields `config.: ...` when
path is empty; update the constructor in the ConfigValidationError class (the
constructor(public readonly path: string, message: string)) to conditionally
format the prefix: use `config: ${message}` when path is empty or whitespace,
otherwise use `config.<path>: ${message}` so the CLI output never shows a stray
dot for root paths.

In `@src/lib/config-toml.ts`:
- Around line 8-10: The catch block that throws new Error("TOML parse error:
...") is losing the original parse exception; update the throw to include the
caught error as the ES2022 error cause (e.g., throw new Error(`TOML parse error:
${(err as Error).message}`, { cause: err })); locate the catch in
src/lib/config-toml.ts where the TOML parse is handled and add the { cause: err
} option so the original exception is preserved.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 2652fb45-1427-4173-a391-fc9f547ac23d

📥 Commits

Reviewing files that changed from the base of the PR and between 8401962 and 9d7329b.

⛔ Files ignored due to path filters (1)
  • package-lock.json is excluded by !**/package-lock.json
📒 Files selected for processing (15)
  • package.json
  • src/commands/config/apply.ts
  • src/commands/config/export.ts
  • src/commands/config/index.ts
  • src/commands/config/plan.ts
  • src/index.ts
  • src/lib/config-diff.test.ts
  • src/lib/config-diff.ts
  • src/lib/config-format.test.ts
  • src/lib/config-format.ts
  • src/lib/config-schema.ts
  • src/lib/config-secrets.test.ts
  • src/lib/config-secrets.ts
  • src/lib/config-toml.test.ts
  • src/lib/config-toml.ts

Comment on lines +42 to +46
if (json) {
console.log(JSON.stringify(result, null, 2));
} else {
console.log(formatPlan(result));
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

--json currently emits two separate JSON documents.

At Line 43 and Line 70, the command prints two top-level JSON payloads in a single run when changes are applied. That breaks parsers expecting one JSON document per invocation.

Suggested fix
-        if (json) {
-          console.log(JSON.stringify(result, null, 2));
-        } else {
+        if (!json) {
           console.log(formatPlan(result));
         }
@@
-        if (json) {
-          console.log(JSON.stringify({ applied: true, changes: result.changes }));
+        if (json) {
+          console.log(JSON.stringify({ plan: result, applied: true }, null, 2));
         } else {

Also applies to: 69-71

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/commands/config/apply.ts` around lines 42 - 46, The command currently
prints two separate JSON payloads when the --json flag is used (the JSON print
of result at the console.log(JSON.stringify(result...)) and a second JSON output
later), which breaks single-document parsers; update the apply command so that
when the json flag is true it emits exactly one JSON document containing the
final output (merge or replace whatever intermediate JSON payloads into the
single canonical result object) and skip any additional
console.log(JSON.stringify(...)) or formatPlan(...) calls that would print a
second document; specifically change the logic around the json check in apply.ts
(the console.log(JSON.stringify(result...)) and the later JSON print near the
code that currently calls formatPlan(result)) so only one JSON.stringify(result)
is executed and non-JSON formatted output (formatPlan) is used only when json is
false.

Comment on lines +65 to +67
for (const change of result.changes) {
await applyChange(change, file);
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Remove or underscore the unused file parameter.

Line 87 introduces an unused argument that already shows up in CI lint warnings. Either remove it from applyChange and its call site, or rename to _file if intentionally reserved.

Suggested fix
-        for (const change of result.changes) {
-          await applyChange(change, file);
-        }
+        for (const change of result.changes) {
+          await applyChange(change);
+        }
@@
-async function applyChange(
-  change: DiffChange,
-  file: InsforgeConfig,
-): Promise<void> {
+async function applyChange(change: DiffChange): Promise<void> {

Also applies to: 85-88

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/commands/config/apply.ts` around lines 65 - 67, The call to
applyChange(result.changes) passes an unused file parameter; remove the unused
parameter from applyChange's signature and all its call sites (including the
loop that does await applyChange(change, file)) or, if you intend to reserve it,
rename the parameter to _file in the applyChange function and the call sites to
suppress linter warnings; update applyChange's definition and every place that
calls applyChange to match the new parameter list (or underscore name) so the
codebase compiles cleanly.

Comment on lines +42 to +45
const config: InsforgeConfig = {
auth: {
allowed_redirect_urls: raw.auth?.allowedRedirectUrls ?? [],
},
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Don’t synthesize allowed_redirect_urls: [] when metadata omits the field.
Line 44 conflates “missing” with “explicit empty,” which can produce unintended destructive diffs on apply.

Suggested patch
-        const config: InsforgeConfig = {
-          auth: {
-            allowed_redirect_urls: raw.auth?.allowedRedirectUrls ?? [],
-          },
-        };
+        const redirects = raw.auth?.allowedRedirectUrls;
+        const config: InsforgeConfig =
+          redirects === undefined
+            ? {}
+            : {
+                auth: { allowed_redirect_urls: redirects },
+              };
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
const config: InsforgeConfig = {
auth: {
allowed_redirect_urls: raw.auth?.allowedRedirectUrls ?? [],
},
const redirects = raw.auth?.allowedRedirectUrls;
const config: InsforgeConfig =
redirects === undefined
? {}
: {
auth: { allowed_redirect_urls: redirects },
};
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/commands/config/export.ts` around lines 42 - 45, The current construction
of const config: InsforgeConfig always emits auth.allowed_redirect_urls as an
empty array when raw.auth?.allowedRedirectUrls is missing; change the config
assembly so allowed_redirect_urls is only set when raw.auth?.allowedRedirectUrls
is defined (i.e. do not synthesize an empty array). Update the config/auth
object creation in export.ts (the const config and auth block) to conditionally
include allowed_redirect_urls (using a conditional spread or guard on
raw.auth?.allowedRedirectUrls !== undefined) so the field is omitted when the
source metadata omits it.

Comment thread src/lib/config-schema.ts
Comment on lines +18 to +20
constructor(public readonly path: string, message: string) {
super(`config.${path}: ${message}`);
this.name = 'ConfigValidationError';
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Fix root-path error formatting (config.: ...).
At Line 30, an empty path renders as config.: ..., which is confusing in CLI output.

Suggested patch
 export class ConfigValidationError extends Error {
   constructor(public readonly path: string, message: string) {
-    super(`config.${path}: ${message}`);
+    super(path ? `config.${path}: ${message}` : `config: ${message}`);
     this.name = 'ConfigValidationError';
   }
 }

Also applies to: 30-30

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/lib/config-schema.ts` around lines 18 - 20, The constructor for
ConfigValidationError currently formats the message as `config.${path}:
${message}` which yields `config.: ...` when path is empty; update the
constructor in the ConfigValidationError class (the constructor(public readonly
path: string, message: string)) to conditionally format the prefix: use `config:
${message}` when path is empty or whitespace, otherwise use `config.<path>:
${message}` so the CLI output never shows a stray dot for root paths.

Comment thread src/lib/config-toml.ts
Comment on lines +8 to +10
} catch (err) {
throw new Error(`TOML parse error: ${(err as Error).message}`);
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Verify tsconfig target/lib compatibility for ErrorOptions ({ cause })
fd -i 'tsconfig.*\.json' -x sh -c 'echo "## $1"; rg -n "\"target\"|\"lib\"" "$1"' sh {}

Repository: InsForge/CLI

Length of output: 126


🏁 Script executed:

cat -n src/lib/config-toml.ts | head -20

Repository: InsForge/CLI

Length of output: 839


Preserve the original TOML parse exception as cause.

Line 9 currently drops the caught error context and fails the preserve-caught-error CI check. Error chaining via { cause } is supported by your ES2022 target.

Suggested patch
   try {
     parsed = smolToml.parse(input);
   } catch (err) {
-    throw new Error(`TOML parse error: ${(err as Error).message}`);
+    const cause = err instanceof Error ? err : new Error(String(err));
+    throw new Error(`TOML parse error: ${cause.message}`, { cause });
   }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
} catch (err) {
throw new Error(`TOML parse error: ${(err as Error).message}`);
}
try {
parsed = smolToml.parse(input);
} catch (err) {
const cause = err instanceof Error ? err : new Error(String(err));
throw new Error(`TOML parse error: ${cause.message}`, { cause });
}
🧰 Tools
🪛 ESLint

[error] 9-9: There is no cause attached to the symptom error being thrown.

(preserve-caught-error)

🪛 GitHub Actions: CI / 0_Lint & Build.txt

[error] 9-9: ESLint preserve-caught-error: There is no cause attached to the symptom error being thrown

🪛 GitHub Actions: CI / Lint & Build

[error] 9-9: There is no cause attached to the symptom error being thrown preserve-caught-error

🪛 GitHub Check: Lint & Build

[failure] 9-9:
There is no cause attached to the symptom error being thrown

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/lib/config-toml.ts` around lines 8 - 10, The catch block that throws new
Error("TOML parse error: ...") is losing the original parse exception; update
the throw to include the caught error as the ES2022 error cause (e.g., throw new
Error(`TOML parse error: ${(err as Error).message}`, { cause: err })); locate
the catch in src/lib/config-toml.ts where the TOML parse is handled and add the
{ cause: err } option so the original exception is preserved.

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

♻️ Duplicate comments (1)
src/lib/config-toml.ts (1)

8-10: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Attach the original parse exception as cause on Line 9.

Line 9 rethrows without { cause }, which both loses root error context and fails preserve-caught-error in CI.

Suggested patch
   try {
     parsed = smolToml.parse(input);
   } catch (err) {
-    throw new Error(`TOML parse error: ${(err as Error).message}`);
+    const cause = err instanceof Error ? err : new Error(String(err));
+    throw new Error(`TOML parse error: ${cause.message}`, { cause });
   }
#!/bin/bash
# Verify the throw site and TS target/lib compatibility for ErrorOptions.cause.
cat -n src/lib/config-toml.ts | sed -n '1,24p'
fd -i 'tsconfig*.json' -x sh -c 'echo "## $1"; rg -n "\"target\"|\"lib\"" "$1"' sh {}
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/lib/config-toml.ts` around lines 8 - 10, Update the rethrow in the catch
block in src/lib/config-toml.ts to attach the original exception as the
Error.cause by changing the throw to: throw new Error(`TOML parse error: ${(err
as Error).message}`, { cause: err }); and ensure your TS compilation target/libs
support ErrorOptions.cause (adjust tsconfig "target" / "lib" if necessary).
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Duplicate comments:
In `@src/lib/config-toml.ts`:
- Around line 8-10: Update the rethrow in the catch block in
src/lib/config-toml.ts to attach the original exception as the Error.cause by
changing the throw to: throw new Error(`TOML parse error: ${(err as
Error).message}`, { cause: err }); and ensure your TS compilation target/libs
support ErrorOptions.cause (adjust tsconfig "target" / "lib" if necessary).

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: d4330d5e-e9b4-4edc-bf0f-9807451ac316

📥 Commits

Reviewing files that changed from the base of the PR and between 9d7329b and 8f05013.

⛔ Files ignored due to path filters (1)
  • package-lock.json is excluded by !**/package-lock.json
📒 Files selected for processing (15)
  • package.json
  • src/commands/config/apply.ts
  • src/commands/config/export.ts
  • src/commands/config/index.ts
  • src/commands/config/plan.ts
  • src/index.ts
  • src/lib/config-diff.test.ts
  • src/lib/config-diff.ts
  • src/lib/config-format.test.ts
  • src/lib/config-format.ts
  • src/lib/config-schema.ts
  • src/lib/config-secrets.test.ts
  • src/lib/config-secrets.ts
  • src/lib/config-toml.test.ts
  • src/lib/config-toml.ts
✅ Files skipped from review due to trivial changes (3)
  • package.json
  • src/lib/config-schema.ts
  • src/lib/config-toml.test.ts
🚧 Files skipped from review as they are similar to previous changes (11)
  • src/lib/config-diff.test.ts
  • src/lib/config-format.test.ts
  • src/commands/config/apply.ts
  • src/lib/config-diff.ts
  • src/commands/config/plan.ts
  • src/index.ts
  • src/commands/config/export.ts
  • src/lib/config-secrets.test.ts
  • src/lib/config-format.ts
  • src/commands/config/index.ts
  • src/lib/config-secrets.ts

@tonychang04
Copy link
Copy Markdown
Contributor Author

Consolidated into #109 (the env() validation commit is now part of the unified config-as-code PR for combined review/merge).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant