test(e2e): add interactive onboard policy-preset step-ordering test (#6042) - #8618
test(e2e): add interactive onboard policy-preset step-ordering test (#6042)#8618wakqasahmed wants to merge 6 commits into
Conversation
|
Note Reviews pausedIt looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
📝 WalkthroughWalkthroughChangesInteractive onboarding validation
Estimated code review effort: 4 (Complex) | ~45 minutes Sequence Diagram(s)sequenceDiagram
participant OnboardingE2ETest
participant driveInteractiveCommand
participant OnboardingWizard
participant MockOpenAICompatibleServer
OnboardingE2ETest->>MockOpenAICompatibleServer: start authenticated mock endpoint
OnboardingE2ETest->>driveInteractiveCommand: provide command and prompt rules
driveInteractiveCommand->>OnboardingWizard: launch through PTY
OnboardingWizard->>MockOpenAICompatibleServer: request inference
MockOpenAICompatibleServer-->>OnboardingWizard: return mock response
OnboardingWizard-->>driveInteractiveCommand: emit prompts and step markers
driveInteractiveCommand-->>OnboardingE2ETest: return transcript and exit state
OnboardingE2ETest->>OnboardingE2ETest: verify ordered steps and successful completion
Possibly related PRs
Suggested labels: 🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
Comment |
There was a problem hiding this comment.
Actionable comments posted: 3
🧹 Nitpick comments (4)
test/e2e/live/onboard-policy-preset-sequencing.test.ts (2)
104-106: 🩺 Stability & Availability | 🔵 Trivial | ⚡ Quick winUse
process.execPathinstead of thenodename.The command resolves
nodethroughPATHinbuildAvailabilityProbeEnv(). If the probe environment trimsPATH, or if the runner exposes a different Node version, the wizard runs under an unexpected interpreter or fails to start. The sibling fixturetest/e2e/fixtures/fake-openai-compatible.tsspawnsprocess.execPathfor this reason.♻️ Proposed fix
cmd: [ - "node", + process.execPath, CLI_ENTRYPOINT,🤖 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 `@test/e2e/live/onboard-policy-preset-sequencing.test.ts` around lines 104 - 106, Update the command array in the onboarding policy preset sequencing test to use process.execPath instead of the literal "node" entry, while preserving CLI_ENTRYPOINT and the remaining arguments.
159-168: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick winAssert the fired triggers, and check the timeout first.
The test never uses
result.firedTriggers. The issue claims the wizard skips the Policy presets TUI step. A header marker proves only that the header printed. A fired"Policy tier"trigger proves the interactive selector appeared and accepted input.Also check
timedOutandexitCodebefore the marker assertions. On a timeout the ordered-marker loop at line 150 fails first and hides the real cause.♻️ Proposed addition
progress.phase("confirm Policy presets is reached before completion"); + expect( + result.firedTriggers, + `Policy tier selector was never presented:\n${result.output}`, + ).toContain("Policy tier"); const policyIndex = result.output.indexOf("[8/8] Policy presets");🤖 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 `@test/e2e/live/onboard-policy-preset-sequencing.test.ts` around lines 159 - 168, Update the onboarding sequencing test assertions to check result.timedOut and result.exitCode before validating output markers, so timeout or process failures are reported first. Then use result.firedTriggers to assert the "Policy tier" trigger fired, in addition to retaining the existing Policy presets marker and abort checks.test/e2e/live/onboard-interactive-pty.ts (2)
141-166: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick winStderr line buffering can drop or split
FIREDrecords.The handler at line 144 splits each chunk on
\n. A chunk boundary can fall inside aFIRED\t<trigger>line. The partial line then fails the regular expression, and the record is lost.Keep a residual buffer between chunks.
♻️ Proposed fix: buffer partial stderr lines
+ let stderrRest = ""; child.stderr?.on("data", (chunk: Buffer) => { - for (const line of chunk.toString("utf-8").split("\n")) { + const lines = (stderrRest + chunk.toString("utf-8")).split("\n"); + stderrRest = lines.pop() ?? ""; + for (const line of lines) { const fired = line.match(/^FIRED\t(.*)$/); if (fired) firedTriggers.push(fired[1]); } });🤖 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 `@test/e2e/live/onboard-interactive-pty.ts` around lines 141 - 166, Update the stderr handling around the child process listeners to retain a residual buffer across chunks, append each decoded chunk, and process only complete newline-delimited lines for FIRED records. Preserve any trailing partial line for the next chunk and process it appropriately when the stream closes.
111-125: 🔒 Security & Privacy | 🔵 Trivial | ⚡ Quick winPass the rules payload outside argv.
The payload contains rule responses. In
test/e2e/live/onboard-policy-preset-sequencing.test.tsthose responses include an API key (line 128). Command arguments are readable by other local processes throughpsand/proc. The value is ephemeral in this test, but the driver is a reusable contract.Pass the payload through an environment variable or the child's stdin instead.
🤖 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 `@test/e2e/live/onboard-interactive-pty.ts` around lines 111 - 125, Update the call to spawnObservedChild in the surrounding PTY execution flow so the JSON rules payload is no longer included in the child process argv. Pass payload through a child environment variable or stdin, and update PTY_DRIVER_SCRIPT to read it from that channel while preserving existing command, rule, timeout, and driver behavior.
🤖 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 `@test/e2e/live/onboard-interactive-pty.ts`:
- Around line 133-136: Update the timeout handling around the detached driver
spawn and timer callback: ensure the Python driver is spawned as a detached
process-group leader, then signal the process group rather than only calling
child.kill so the PTY CLI child is terminated too. Preserve the documented
whole-process-tree cleanup behavior and existing timeout state handling.
- Around line 69-101: Update the PTY driver loop around the child read and wait
handling so EOF or OSError from os.read does not leave a normally exited child
classified as a timeout. Track whether the deadline actually expired, then
perform a final os.waitpid(pid, 0) after the loop breaks from EOF/read failure
and derive exit_code when the child has exited; only send SIGKILL and return 124
when the deadline was genuinely reached.
In `@test/e2e/live/onboard-policy-preset-sequencing.test.ts`:
- Around line 124-129: In the provider-selection flow of the live onboarding
test, add an explicit guard that expects the “Other OpenAI-compatible endpoint”
prompt immediately after selecting provider 4, so reordered options fail fast.
Update the API-key response trigger from “API key:” to “Other OpenAI-compatible
endpoint API key:” and retain the existing base URL and model responses.
---
Nitpick comments:
In `@test/e2e/live/onboard-interactive-pty.ts`:
- Around line 141-166: Update the stderr handling around the child process
listeners to retain a residual buffer across chunks, append each decoded chunk,
and process only complete newline-delimited lines for FIRED records. Preserve
any trailing partial line for the next chunk and process it appropriately when
the stream closes.
- Around line 111-125: Update the call to spawnObservedChild in the surrounding
PTY execution flow so the JSON rules payload is no longer included in the child
process argv. Pass payload through a child environment variable or stdin, and
update PTY_DRIVER_SCRIPT to read it from that channel while preserving existing
command, rule, timeout, and driver behavior.
In `@test/e2e/live/onboard-policy-preset-sequencing.test.ts`:
- Around line 104-106: Update the command array in the onboarding policy preset
sequencing test to use process.execPath instead of the literal "node" entry,
while preserving CLI_ENTRYPOINT and the remaining arguments.
- Around line 159-168: Update the onboarding sequencing test assertions to check
result.timedOut and result.exitCode before validating output markers, so timeout
or process failures are reported first. Then use result.firedTriggers to assert
the "Policy tier" trigger fired, in addition to retaining the existing Policy
presets marker and abort checks.
🪄 Autofix
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: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Enterprise
Run ID: 34d2bc6d-f833-4c1d-bb0f-53622aff0a15
📒 Files selected for processing (3)
test/e2e/live/onboard-interactive-pty.tstest/e2e/live/onboard-policy-preset-sequencing.test.tstools/e2e/check-semantic-phases.mts
| // "Other OpenAI-compatible endpoint" — position depends on | ||
| // src/lib/onboard/providers.ts's provider list for the openclaw agent. | ||
| { trigger: "Select your inference provider:", response: "4\n" }, | ||
| { trigger: "OpenAI-compatible base URL", response: `${fake.baseUrl}\n` }, | ||
| { trigger: "API key:", response: `${apiKey}\n` }, | ||
| { trigger: "endpoint model", response: `${MODEL}\n` }, |
There was a problem hiding this comment.
📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
# Confirm the provider list order for the openclaw agent and the exact prompt strings.
fd -t f 'providers.ts' -p src/lib/onboard --exec cat -n {}
rg -n 'Select your inference provider|OpenAI-compatible base URL|API key:' src --type=ts -C2Repository: NVIDIA/NemoClaw
Length of output: 32639
🏁 Script executed:
#!/bin/bash
set -e
printf '%s\n' '--- test outline ---'
ast-grep outline test/e2e/live/onboard-policy-preset-sequencing.test.ts
printf '%s\n' '--- test focused range ---'
cat -n test/e2e/live/onboard-policy-preset-sequencing.test.ts | sed -n '70,155p'
printf '%s\n' '--- provider selection implementation ---'
cat -n src/lib/onboard/provider-selection-prompt.ts | sed -n '1,130p'
printf '%s\n' '--- provider selection callers/options ---'
rg -n 'provider-selection-prompt|REMOTE_PROVIDER_CONFIG|Select your inference provider|Other OpenAI-compatible endpoint' src/lib/onboard test/e2e/live --type ts -C3
printf '%s\n' '--- E2E trigger and transcript APIs ---'
rg -n 'trigger:|transcript|Transcript|class .*Driver|35.?minute|timeout' test/e2e src --glob '*.{ts,js}' -C2Repository: NVIDIA/NemoClaw
Length of output: 50372
🏁 Script executed:
#!/bin/bash
set -e
log=/tmp/coderabbit-shell-logs/shell-output-Zzob9i
printf '%s\n' '--- saved output markers ---'
rg -n -- '-- test outline|-- test focused range|-- provider selection implementation|-- provider selection callers/options|-- E2E trigger and transcript APIs' "$log" || true
printf '%s\n' '--- test source ---'
cat -n test/e2e/live/onboard-policy-preset-sequencing.test.ts | sed -n '1,170p'
printf '%s\n' '--- provider prompt source ---'
cat -n src/lib/onboard/provider-selection-prompt.ts | sed -n '1,120p'
printf '%s\n' '--- focused provider-selection references ---'
rg -n 'providerSelection|provider-selection-prompt|REMOTE_PROVIDER_CONFIG|Select your inference provider|Other OpenAI-compatible endpoint' src/lib/onboard test/e2e/live --glob '*.{ts,js}' -C2
printf '%s\n' '--- focused E2E support files ---'
fd -t f . test/e2e | rg 'driver|shell|probe|fixture|progress|live' | head -80Repository: NVIDIA/NemoClaw
Length of output: 38798
🏁 Script executed:
#!/bin/bash
set -e
printf '%s\n' '--- provider menu ---'
cat -n src/lib/onboard/provider-menu.ts | sed -n '1,180p'
printf '%s\n' '--- menu construction and agent options ---'
rg -n 'buildInferenceProviderMenu|agentProviderOptions|openclaw|ProviderMenuChoice' src/lib/onboard --glob '*.{ts,js}' -C4
printf '%s\n' '--- interactive driver ---'
cat -n test/e2e/live/onboard-interactive-pty.ts | sed -n '1,280p'
printf '%s\n' '--- custom provider prompt path ---'
rg -n 'API key|base URL|endpoint model|COMPATIBLE_API_KEY|custom' src/lib/onboard/inference-providers src/lib/onboard/setup-inference.ts --glob '*.{ts,js}' -C4Repository: NVIDIA/NemoClaw
Length of output: 50372
🏁 Script executed:
#!/bin/bash
set -e
printf '%s\n' '--- provider menu ---'
cat -n src/lib/onboard/provider-menu.ts | sed -n '1,130p'
printf '%s\n' '--- interactive driver ---'
wc -l test/e2e/live/onboard-interactive-pty.ts
cat -n test/e2e/live/onboard-interactive-pty.ts | sed -n '1,260p'
printf '%s\n' '--- custom-provider prompt matches ---'
rg -n 'API key|base URL|endpoint model|COMPATIBLE_API_KEY' src/lib/onboard/inference-providers src/lib/onboard/setup-inference.ts -C2
printf '%s\n' '--- menu construction calls ---'
rg -n 'buildInferenceProviderMenu|agentProviderOptions' src/lib/onboard --glob '!*.test.ts' -C3Repository: NVIDIA/NemoClaw
Length of output: 16674
🏁 Script executed:
#!/bin/bash
set -e
printf '%s\n' '--- all API-key prompt strings ---'
rg -n -i 'API key|apiKey|api_key' src/lib/onboard --glob '!*.test.ts' -C2
printf '%s\n' '--- setup-nim-selection ---'
cat -n src/lib/onboard/setup-nim-selection.ts | sed -n '1,180p'
printf '%s\n' '--- setup-nim-flow provider selection range ---'
cat -n src/lib/onboard/setup-nim-flow.ts | sed -n '490,660p'
printf '%s\n' '--- agent provider option definitions ---'
rg -n 'getAgentInferenceProviderOptions|agentInferenceProviderOptions|inferenceProviderOptions' src --glob '!*.test.ts' -C3Repository: NVIDIA/NemoClaw
Length of output: 50372
🏁 Script executed:
#!/bin/bash
set -e
printf '%s\n' '--- credential prompt helpers ---'
rg -n 'ensureNamedCredential|replaceNamedCredential|promptNamedCredential|credential.*prompt|prompt\(.*key|API key:' src/lib test/e2e --glob '*.{ts,js}' -C3 | head -240
printf '%s\n' '--- setup inference prompt calls ---'
rg -n 'ensureNamedCredential|replaceNamedCredential|prompt\(' src/lib/onboard/setup-inference.ts src/lib/onboard/inference-providers src/lib/onboard/credential-env.ts src/lib/onboard --glob '!*.test.ts' -C2 | head -240
printf '%s\n' '--- test driver behavioral probe ---'
node - <<'JS'
const rules = [
{ trigger: "Select your inference provider:", response: "4\n" },
{ trigger: "API key:", response: "custom-key\n" },
{ trigger: "Enable web search", response: "1\n" },
];
let text = "";
const fired = [];
for (const chunk of [
"Select your inference provider:\n",
"Other OpenAI-compatible endpoint\n",
"OpenAI-compatible API key: ",
"Enable web search\n",
"Brave Search API key: ",
]) {
text += chunk;
for (const [i, rule] of rules.entries()) {
if (!fired[i] && text.includes(rule.trigger)) {
fired[i] = true;
console.log(`fired ${rule.trigger}`);
}
}
}
JSRepository: NVIDIA/NemoClaw
Length of output: 36614
Make provider selection fail fast.
"4\n" selects custom only while BASE_REMOTE_PROVIDER_OPTIONS keeps it at position 4. A reordered menu can select another provider and leave later rules waiting for the 35-minute driver timeout. Add a guard for Other OpenAI-compatible endpoint, and replace "API key:" with Other OpenAI-compatible endpoint API key:. A post-timeout transcript assertion alone will not prevent the delay.
🤖 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 `@test/e2e/live/onboard-policy-preset-sequencing.test.ts` around lines 124 -
129, In the provider-selection flow of the live onboarding test, add an explicit
guard that expects the “Other OpenAI-compatible endpoint” prompt immediately
after selecting provider 4, so reordered options fail fast. Update the API-key
response trigger from “API key:” to “Other OpenAI-compatible endpoint API key:”
and retain the existing base URL and model responses.
PR Review Advisor — No blocking findings reportedAdvisor assessment: No blocking advisor findings reported Model lanes
Second-opinion terminology and E2E selections are advisory. Live E2E does not run automatically for pull requests. 3 semantic terminology decisionsTerminology decisions are advisory. They affect the assessment only when a separate finding identifies concrete semantic impact.
E2E guidanceAdvisory only. A maintainer can dispatch the default E2E suite against this exact revision. Recommended E2E: This automated review informs maintainers. Warnings and suggestions do not require a response. A maintainer decides whether to merge. |
…VIDIA#6042) Three independent investigations (comments on NVIDIA#6042) could not reproduce the reported skip of the Policy Presets TUI step, and a structural audit confirmed the onboard state machine has no transition path from any earlier state directly to complete -- every path passes through policies. What was missing was a checked-in test that actually drives the real interactive wizard through a PTY (piped stdin does not reproduce this wizard's raw-mode selectors) to prove it. Add such a test: it answers every interactive prompt in the compatible-endpoint onboarding journey through a real pseudo-terminal and asserts the ordered step markers ([1/8] through [8/8] Policy presets) appear in order, with completion only reachable after Policy presets. This is test-only; no production onboarding behavior changes. The new PTY driver is routed through the suite's single audited async child-process boundary (spawnObservedChild), so its progress-capability callsite is registered in the reviewed allowlist in tools/e2e/check-semantic-phases.mts. Signed-off-by: Waqas Ahmed <wakqasahmed@protonmail.com>
32fd0ea to
49c18e4
Compare
|
Re: Confirmed the gap. Investigated adding it as a second step in Doing this properly means a dedicated new job (its own bespoke validator function in Correction to an earlier draft of this comment: this test lives under |
…heck codebase-growth-guardrails flagged the manual Docker prerequisite check as two added `if` statements in the test body. Replace it with the existing `docker` fixture's `requireDocker()` (already used by e.g. sandbox-operations.test.ts), which encapsulates the same throw-in-CI/skip-locally branching in the fixture layer instead of the test body. Drops the now-unused `resultText` import. Signed-off-by: Waqas Ahmed <wakqasahmed@protonmail.com>
…ssages PRA-2 (PR review advisor): the assertion messages for the abort/timeout/ exit-code checks interpolated the raw PTY transcript, which still contains the generated mock API key -- ArtifactSink's own redaction only applies to the separate onboard-transcript.txt write, not to text Vitest prints inline on a failed assertion. Route the same redactionValues through the shared redactString() helper (ArtifactSink's own redaction primitive) before interpolating, and point the messages at the artifact file the way the step-marker assertion already does. Signed-off-by: Waqas Ahmed <wakqasahmed@protonmail.com>
|
Note GitHub couldn't provide a complete incremental comparison for this pull request, so CodeRabbit is performing a full review instead. This review may take a little longer. |
cv
left a comment
There was a problem hiding this comment.
Blocking findings:
test/e2e/live/onboard-interactive-pty.ts:69-101treats PTY EOF or LinuxEIOafter a normal child exit as a timeout because those branches bypasswaitpid. A successful onboarding run can therefore return 124 nondeterministically. Reap the child after EOF/read failure and report timeout only after deadline expiry. Add focused regression evidence for a PTY child that exits 0 after producing output.test/e2e/live/onboard-interactive-pty.ts:118-136passes every scripted response, including the generated provider API key, in the Python process arguments. The timeout also kills only the Python driver, leaving its PTY onboarding child and host resources active. Transport responses through a channel that is absent from process arguments, and terminate/reap the complete process group on timeout. Add regression evidence that the secret is absent from the spawned argument list and that a timed-out descendant no longer exists.test/e2e/live/onboard-policy-preset-sequencing.test.ts:54-164is an opt-ine2e-livetest, but no checked-in workflow selects it. The existingcloud-onboardjob also setsNEMOCLAW_NON_INTERACTIVE=1. The claimed interactive regression evidence therefore does not run in ordinary CI or a supported E2E job. Select this test in the smallest suitable checked-in E2E job with interactive mode enabled, and add or update the workflow-boundary regression evidence for that invocation.
Three blocking findings from cv's review: 1. The PTY driver's read loop broke on EOF/EIO without reaping the child first, so a clean successful run could be misreported as DRIVER_TIMEOUT (exit 124) nondeterministically. Block on waitpid at that point and record the real exit code instead. 2. The Node-side timeout only killed the Python driver by pid, leaving its pty.fork()'d onboard child (and any sandbox operations it had in flight) running past the test. Spawn the driver detached (its own process group/session) and kill the whole group on timeout so the descendant is reaped too. 3. onboard-policy-preset-sequencing.test.ts had no checked-in E2E workflow selection. Added a dedicated onboard-policy-preset-sequencing job (modeled on double-onboard, the closest existing job shape) that does NOT set NEMOCLAW_NON_INTERACTIVE -- unlike cloud-onboard/double-onboard, this test needs real interactive mode. Registered its bespoke workflow-boundary validator (mirroring validateDoubleOnboardJob), added it to the CLI-artifact consumer list and recomputed the pinned contract hash, added it to report-to-pr's needs, and pointed its mock-parity entry at the new fast coverage below. Regression evidence for all three, per review request: - test/e2e/support/onboard-interactive-pty.test.ts (new): a clean exit after output is not misreported as a timeout; a generated secret never appears in the spawned process arguments; a timed-out driver and its forked PTY child are both gone afterward. - test/e2e/support/onboard-policy-preset-sequencing-workflow-boundary.test.ts (new, its own file rather than growing the already near-budget e2e-workflow.test.ts): the new job selects the right test file with interactive mode enabled today, and reintroducing NEMOCLAW_NON_INTERACTIVE on that job is caught. Registered both cases in ci/source-shape-test-budget.json's exception list, matching this repo's existing workflow-boundary test entries. Signed-off-by: Waqas Ahmed <wakqasahmed@protonmail.com>
Summary
Three independent investigations on #6042 (comments from
@yimoj,@dfernandez365-rgb) could not reproduce the reported skip of the interactive onboard wizard's Policy Presets TUI step, and a structural audit confirmed the onboard state machine has no transition path from any earlier state directly tocomplete— every path passes throughpolicies. What was missing was a checked-in test that actually drives the real interactive wizard through a PTY to prove it (piped stdin does not reproduce this wizard's raw-mode selectors, so the existing non-interactive FSM tests don't cover this).This PR adds that test. No production onboarding behavior changes — it is test-only, matching the defensible contribution boundary
@dfernandez365-rgbscoped in their 2026-07-20 comment on the issue.Changes
test/e2e/live/onboard-interactive-pty.ts— new PTY driver that answers scripted prompts (by trigger substring, firing independently of order) against a real pseudo-terminal, using the suite's single audited async child-process boundary (spawnObservedChild).test/e2e/live/onboard-policy-preset-sequencing.test.ts— drivesnemoclaw onboard --freshthrough the "Other OpenAI-compatible endpoint" journey (hermetic, no NVIDIA credential needed) against a local fake OpenAI-compatible server, and asserts the ordered step markers[1/8]through[8/8] Policy presetsappear strictly in order, with completion only reachable after Policy presets.tools/e2e/check-semantic-phases.mts— registers the new driver's progress-capability callsite in the reviewed allowlist (required for the audited async-boundary check).Verification
npm run test:e2e-phases:check— passes (123 tests across 80 files)npx tsc -p tsconfig.cli.json— clean[8/8] Policy presets(including its two raw-mode selectors: Policy tier, then individual preset toggles) and the wizard completes.Related Issue
Relates to #6042
Type of Change
(Test-only change; no user-facing behavior, command, or documentation changed.)
Quality Gates
Documentation Writer Review
no-docs-neededVerification
Signed-off-by:line and every commit appears asVerifiedin GitHubnpm run test:e2e-phases:check,npx tsc -p tsconfig.cli.jsonSigned-off-by: Waqas Ahmed wakqasahmed@protonmail.com
Summary by CodeRabbit
Bug Fixes
Tests