Skip to content

fix(installer): restore piped TTY notice prompt#3055

Merged
ericksoa merged 10 commits intomainfrom
fix/curl-pipe-tty-acceptance
May 6, 2026
Merged

fix(installer): restore piped TTY notice prompt#3055
ericksoa merged 10 commits intomainfrom
fix/curl-pipe-tty-acceptance

Conversation

@ericksoa
Copy link
Copy Markdown
Contributor

@ericksoa ericksoa commented May 5, 2026

Summary

  • Restore the documented piped installer path by prompting for third-party notice acceptance through /dev/tty before phase 1 when stdin is the installer pipe.
  • Preserve the headless safety behavior: no TTY and no explicit acceptance still exits before installing Node.js or the CLI.
  • Add installer regression coverage for both controlling-TTY acceptance and decline paths, and document the correct headless curl | bash env placement.

Testing

  • npm ci --ignore-scripts
  • npm run build:cli
  • npm run typecheck:cli
  • npm run source-shape:check
  • bash -n install.sh && bash -n scripts/install.sh
  • git diff --check
  • npx vitest run test/install-preflight.test.ts

Summary by CodeRabbit

  • New Features

    • Non-interactive installer mode for headless and CI environments—set environment variables to run the installer unattended
    • Third-party software acceptance workflow in the installer with persistent state tracking
  • Documentation

    • Updated quickstart and command reference guides with scripted installation instructions
    • Enhanced README with examples for automated installation scenarios
    • Improved onboarding command flag descriptions and usage examples

@ericksoa ericksoa changed the title Fix piped installer TTY notice prompt fix(installer): restore piped TTY notice prompt May 5, 2026
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented May 5, 2026

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 6d660888-2cf9-42dd-90e9-1c10c4981c79

📥 Commits

Reviewing files that changed from the base of the PR and between 593d832 and c02e774.

📒 Files selected for processing (3)
  • docs/get-started/quickstart.md
  • src/lib/commands/onboard.test.ts
  • src/lib/commands/onboard/common.ts

📝 Walkthrough

Walkthrough

This PR introduces a third-party software usage notice acceptance workflow to the NemoClaw installer. The implementation adds shell functions for config resolution, state persistence, and interactive prompting, integrates a preflight acceptance check into the installer's startup sequence, documents the headless/CI usage pattern, and includes comprehensive test coverage for both interactive and non-interactive acceptance flows.

Changes

Usage Notice Acceptance Workflow

Layer / File(s) Summary
Infrastructure & State Management
scripts/install.sh
New helper functions: usage_notice_config_path() resolves notice config; json_string_field() extracts JSON fields; usage_notice_state_file() and usage_notice_accepted_shell() manage persistent acceptance state; print_usage_notice_body_shell() formats notice text.
Core Acceptance Flow
scripts/install.sh
show_usage_notice_shell() orchestrates loading, displaying, and prompting for acceptance; preflight_usage_notice_prompt() implements the main flow with support for non-interactive mode, TTY presence, and /dev/tty attachment when stdin is piped.
Installer Integration
scripts/install.sh
main() now calls preflight_usage_notice_prompt() at startup, enforcing acceptance before phase 1 execution.
Command Integration
src/lib/commands/onboard/*
src/lib/commands/onboard/common.ts: added --yes example usage and updated flag description to reflect safe unattended onboarding prompts. src/lib/commands/onboard.test.ts: added beforeEach mock clearing and tests for --yes and -y flag forwarding.
Documentation & Usage
README.md, docs/get-started/quickstart.md, docs/reference/commands.md
Added headless/CI usage notes and code examples showing how to pass NEMOCLAW_NON_INTERACTIVE=1 and NEMOCLAW_ACCEPT_THIRD_PARTY_SOFTWARE=1 to the piped installer bash process.
Testing & Verification
test/install-preflight.test.ts
Introduced PTY-based test harness (runInstallerWithTty, runInstallerWithPipedStdinAndTty, runInstallerWithInteractiveStdin) to drive interactive flows; replaced prior #2671 scenario with comprehensive tests covering piped/interactive stdin, acceptance/rejection paths, TTY availability, and non-interactive mode; updated sandbox environment wiring in PATH-refresh tests; asserts proper phase execution and state persistence.

Sequence Diagram

sequenceDiagram
    participant User
    participant Installer as scripts/install.sh
    participant Config as Config File
    participant State as State File
    participant TTY as /dev/tty
    
    User->>Installer: Run piped installer or interactive
    Installer->>Installer: main() starts
    Installer->>Installer: preflight_usage_notice_prompt()
    
    alt Environment: ACCEPT_THIRD_PARTY_SOFTWARE=1
        Installer->>Installer: Skip prompt, continue
    else Check State File
        Installer->>State: usage_notice_accepted_shell(version)
        State-->>Installer: Already accepted?
        alt Version matches
            Installer->>Installer: Continue to Phase 1
        else Version mismatch or no state
            alt NON_INTERACTIVE mode
                Installer->>User: Error: acceptance required
                Installer->>Installer: Exit fail-fast
            else Interactive + TTY available
                Installer->>Config: Load notice config
                Config-->>Installer: title, body, version
                alt stdin is piped
                    Installer->>TTY: Attach /dev/tty for prompting
                else stdin is TTY
                    Installer->>User: Display notice + prompt
                end
                User->>Installer: Accept or reject
                alt User accepts
                    Installer->>State: Save acceptance + version
                    Installer->>Installer: Continue to Phase 1
                else User rejects
                    Installer->>Installer: Exit fail-fast before Phase 1
                end
            end
        end
    end
    
    Installer->>Installer: Phase 1, Phase 2, etc.
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Poem

🐰 A notice now blooms in the script's early dawn,
With state files and configs to check if you've sworn,
Interactive prompts or non-interactive grace,
Acceptance flows through with /dev/tty's embrace,
The installer bids welcome, then trusts you once more! ✨

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 11.76% 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 title "fix(installer): restore piped TTY notice prompt" directly addresses the main objective of restoring the documented piped installer path with TTY-based third-party notice acceptance prompting before phase 1.
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 docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/curl-pipe-tty-acceptance

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

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 5, 2026

Selective E2E Results — ❌ Some jobs failed

Run: 25398263536
Branch: fix/curl-pipe-tty-acceptance
Requested jobs: cloud-onboard-e2e
Summary: 0 passed, 1 failed, 21 skipped

Job Result
cloud-e2e ⏭️ skipped
cloud-inference-e2e ⏭️ skipped
cloud-onboard-e2e ❌ failure
deployment-services-e2e ⏭️ skipped
diagnostics-e2e ⏭️ skipped
docs-validation-e2e ⏭️ skipped
gpu-e2e ⏭️ skipped
hermes-e2e ⏭️ skipped
inference-routing-e2e ⏭️ skipped
messaging-compatible-endpoint-e2e ⏭️ skipped
messaging-providers-e2e ⏭️ skipped
network-policy-e2e ⏭️ skipped
overlayfs-autofix-e2e ⏭️ skipped
rebuild-hermes-e2e ⏭️ skipped
rebuild-openclaw-e2e ⏭️ skipped
sandbox-operations-e2e ⏭️ skipped
sandbox-survival-e2e ⏭️ skipped
shields-config-e2e ⏭️ skipped
skill-agent-e2e ⏭️ skipped
snapshot-commands-e2e ⏭️ skipped
token-rotation-e2e ⏭️ skipped
upgrade-stale-sandbox-e2e ⏭️ skipped

Failed jobs: cloud-onboard-e2e. Check run artifacts for logs.

Copy link
Copy Markdown
Contributor

@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: 3

🤖 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 `@docs/get-started/quickstart.md`:
- Around line 49-51: Replace the triple-backtick bash block containing the curl
install command with a console block and add a leading "$ " prompt; specifically
change the code fence from ```bash to ```console and prefix the line "curl -fsSL
https://www.nvidia.com/nemoclaw.sh | NEMOCLAW_NON_INTERACTIVE=1
NEMOCLAW_ACCEPT_THIRD_PARTY_SOFTWARE=1 bash" with "$ " so the CLI snippet in
quickstart.md uses the required console language tag and prompt.

In `@scripts/install.sh`:
- Around line 678-691: preflight_usage_notice_prompt currently returns early
when NON_INTERACTIVE=1 which lets headless installs bypass the preflight; change
the logic so the function does NOT skip prompting merely because NON_INTERACTIVE
is set — only skip when an explicit acceptance/bypass is provided (e.g.
NEMOCLAW_ACCEPT_THIRD_PARTY_SOFTWARE=1 or the equivalent --yes-i-accept flag),
and keep the existing TTY check/third-party prompt using show_usage_notice_shell
on /dev/tty; update the condition at the top of preflight_usage_notice_prompt to
remove the NON_INTERACTIVE early-return and instead check the explicit
acceptance env/flag before returning.

In `@test/install-preflight.test.ts`:
- Around line 3193-3205: The test should explicitly assert the installer
succeeded and derive the expected notice version from bin/lib/usage-notice.json
instead of hard-coding it: after calling
runInstallerWithPipedStdinAndTty(checking result, phases, state), add an
assertion that the process exit code/status is zero (e.g. expect(result.status
or result.exitCode).toBe(0)) to ensure success, read/require
bin/lib/usage-notice.json to obtain the "version" (or equivalent field) and use
that value in the state assertion (replace the hard-coded "2026-04-01b" with the
derived version), while leaving the existing TTY/prompt/ordering assertions
intact; locate symbols runInstallerWithPipedStdinAndTty, result, phases, state
and update the test accordingly.
🪄 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: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 5d3f4923-7533-4523-85ea-f1786013ce21

📥 Commits

Reviewing files that changed from the base of the PR and between 400869e and 9789910.

📒 Files selected for processing (5)
  • README.md
  • docs/get-started/quickstart.md
  • docs/reference/commands.md
  • scripts/install.sh
  • test/install-preflight.test.ts

Comment thread docs/get-started/quickstart.md Outdated
Comment thread scripts/install.sh
Comment thread test/install-preflight.test.ts Outdated
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 5, 2026

Selective E2E Results — ✅ All requested jobs passed

Run: 25398516876
Branch: fix/curl-pipe-tty-acceptance
Requested jobs: cloud-onboard-e2e
Summary: 0 passed, 0 failed, 21 skipped

Job Result
cloud-e2e ⏭️ skipped
cloud-inference-e2e ⏭️ skipped
cloud-onboard-e2e ⚠️ cancelled
deployment-services-e2e ⏭️ skipped
diagnostics-e2e ⏭️ skipped
docs-validation-e2e ⏭️ skipped
gpu-e2e ⏭️ skipped
hermes-e2e ⏭️ skipped
inference-routing-e2e ⏭️ skipped
messaging-compatible-endpoint-e2e ⏭️ skipped
messaging-providers-e2e ⏭️ skipped
network-policy-e2e ⏭️ skipped
overlayfs-autofix-e2e ⏭️ skipped
rebuild-hermes-e2e ⏭️ skipped
rebuild-openclaw-e2e ⏭️ skipped
sandbox-operations-e2e ⏭️ skipped
sandbox-survival-e2e ⏭️ skipped
shields-config-e2e ⏭️ skipped
skill-agent-e2e ⏭️ skipped
snapshot-commands-e2e ⏭️ skipped
token-rotation-e2e ⏭️ skipped
upgrade-stale-sandbox-e2e ⏭️ skipped

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 5, 2026

Selective E2E Results — ✅ All requested jobs passed

Run: 25398874036
Branch: fix/curl-pipe-tty-acceptance
Requested jobs: cloud-onboard-e2e
Summary: 1 passed, 0 failed, 21 skipped

Job Result
cloud-e2e ⏭️ skipped
cloud-inference-e2e ⏭️ skipped
cloud-onboard-e2e ✅ success
deployment-services-e2e ⏭️ skipped
diagnostics-e2e ⏭️ skipped
docs-validation-e2e ⏭️ skipped
gpu-e2e ⏭️ skipped
hermes-e2e ⏭️ skipped
inference-routing-e2e ⏭️ skipped
messaging-compatible-endpoint-e2e ⏭️ skipped
messaging-providers-e2e ⏭️ skipped
network-policy-e2e ⏭️ skipped
overlayfs-autofix-e2e ⏭️ skipped
rebuild-hermes-e2e ⏭️ skipped
rebuild-openclaw-e2e ⏭️ skipped
sandbox-operations-e2e ⏭️ skipped
sandbox-survival-e2e ⏭️ skipped
shields-config-e2e ⏭️ skipped
skill-agent-e2e ⏭️ skipped
snapshot-commands-e2e ⏭️ skipped
token-rotation-e2e ⏭️ skipped
upgrade-stale-sandbox-e2e ⏭️ skipped

Copy link
Copy Markdown
Contributor

@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)
scripts/install.sh (1)

623-675: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Fail closed if the shell path cannot render the notice body.

This path validates version, but it never verifies that print_usage_notice_body_shell() actually produced any notice text. If usage-notice.json is missing/reformatted around body, the installer can still collect yes without showing the notice content first.

Suggested fix
 show_usage_notice_shell() {
-  local notice_json version title prompt answer answer_lc
+  local notice_json version title prompt answer answer_lc rendered_body
   notice_json="$(usage_notice_config_path)"
   if [[ ! -f "$notice_json" ]]; then
     error "Third-party software notice configuration not found."
@@
   prompt="$(json_string_field "$notice_json" "interactivePrompt")"
   if [[ -z "$version" ]]; then
     error "Third-party software notice version not found."
   fi
+  rendered_body="$(print_usage_notice_body_shell "$notice_json")"
+  [[ -n "${rendered_body//[$'\t\r\n ']/}" ]] || error "Third-party software notice body not found."
 
   if usage_notice_accepted_shell "$version"; then
     return 0
   fi
 
   printf "\n"
   printf "  %s\n" "${title:-Third-Party Software Notice - NemoClaw Installer}"
   printf "  ──────────────────────────────────────────────────\n"
-  print_usage_notice_body_shell "$notice_json"
+  printf "%s\n" "$rendered_body"
   printf "\n"
🤖 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 `@scripts/install.sh` around lines 623 - 675, In show_usage_notice_shell,
ensure the installer fails closed if the notice body is missing by capturing the
output of print_usage_notice_body_shell (call it e.g.
notice_body="$(print_usage_notice_body_shell "$notice_json")"), checking that
notice_body is non-empty before printing the prompt, and calling error/return 1
if empty; keep the existing validation of version and acceptance flow, and then
print notice_body (instead of calling print_usage_notice_body_shell directly) so
the absence or empty body from usage_notice_config_path/json_string_field is
detected and aborts rather than allowing the prompt to proceed.
🧹 Nitpick comments (1)
test/install-preflight.test.ts (1)

3217-3255: ⚡ Quick win

Add the direct-TTY acceptance case too.

The new happy-path assertion only covers the /dev/tty fallback via runInstallerWithPipedStdinAndTty("yes\n"). The [ -t 0 ] branch is only exercised for decline, so a success regression there would still slip through. A matching runInstallerWithInteractiveStdin("yes\n") case would keep both acceptance paths protected.

🤖 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/install-preflight.test.ts` around lines 3217 - 3255, Add a new test that
mirrors the existing successful `/dev/tty` case but uses
runInstallerWithInteractiveStdin("yes\n") to exercise the direct-TTY ([ -t 0 ])
branch: call runInstallerWithInteractiveStdin("yes\n"), combine result.stdout
and result.stderr, load the usage-notice.json version, assert result.status is
0, assert the output contains the TTY prompt and "Third-Party Software Notice -
NemoClaw Installer", assert the output does not contain "Interactive third-party
software acceptance requires a TTY", assert the ordering of "Third-Party
Software Notice - NemoClaw Installer" before "Node.js", assert phases is not
empty, and assert state contains `"acceptedVersion": "<noticeVersion>"`; place
this next to the other acceptance/decline tests.
🤖 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 `@scripts/install.sh`:
- Around line 623-675: In show_usage_notice_shell, ensure the installer fails
closed if the notice body is missing by capturing the output of
print_usage_notice_body_shell (call it e.g.
notice_body="$(print_usage_notice_body_shell "$notice_json")"), checking that
notice_body is non-empty before printing the prompt, and calling error/return 1
if empty; keep the existing validation of version and acceptance flow, and then
print notice_body (instead of calling print_usage_notice_body_shell directly) so
the absence or empty body from usage_notice_config_path/json_string_field is
detected and aborts rather than allowing the prompt to proceed.

---

Nitpick comments:
In `@test/install-preflight.test.ts`:
- Around line 3217-3255: Add a new test that mirrors the existing successful
`/dev/tty` case but uses runInstallerWithInteractiveStdin("yes\n") to exercise
the direct-TTY ([ -t 0 ]) branch: call
runInstallerWithInteractiveStdin("yes\n"), combine result.stdout and
result.stderr, load the usage-notice.json version, assert result.status is 0,
assert the output contains the TTY prompt and "Third-Party Software Notice -
NemoClaw Installer", assert the output does not contain "Interactive third-party
software acceptance requires a TTY", assert the ordering of "Third-Party
Software Notice - NemoClaw Installer" before "Node.js", assert phases is not
empty, and assert state contains `"acceptedVersion": "<noticeVersion>"`; place
this next to the other acceptance/decline tests.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 0a1bcfc1-68bd-4156-bd2a-32a3f02cc14f

📥 Commits

Reviewing files that changed from the base of the PR and between 6d10e68 and 9956323.

📒 Files selected for processing (2)
  • scripts/install.sh
  • test/install-preflight.test.ts

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 5, 2026

Selective E2E Results — ✅ All requested jobs passed

Run: 25400175221
Branch: fix/curl-pipe-tty-acceptance
Requested jobs: cloud-onboard-e2e
Summary: 0 passed, 0 failed, 21 skipped

Job Result
cloud-e2e ⏭️ skipped
cloud-inference-e2e ⏭️ skipped
cloud-onboard-e2e ⚠️ cancelled
deployment-services-e2e ⏭️ skipped
diagnostics-e2e ⏭️ skipped
docs-validation-e2e ⏭️ skipped
gpu-e2e ⏭️ skipped
hermes-e2e ⏭️ skipped
inference-routing-e2e ⏭️ skipped
messaging-compatible-endpoint-e2e ⏭️ skipped
messaging-providers-e2e ⏭️ skipped
network-policy-e2e ⏭️ skipped
overlayfs-autofix-e2e ⏭️ skipped
rebuild-hermes-e2e ⏭️ skipped
rebuild-openclaw-e2e ⏭️ skipped
sandbox-operations-e2e ⏭️ skipped
sandbox-survival-e2e ⏭️ skipped
shields-config-e2e ⏭️ skipped
skill-agent-e2e ⏭️ skipped
snapshot-commands-e2e ⏭️ skipped
token-rotation-e2e ⏭️ skipped
upgrade-stale-sandbox-e2e ⏭️ skipped

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 5, 2026

Selective E2E Results — ✅ All requested jobs passed

Run: 25400686425
Branch: fix/curl-pipe-tty-acceptance
Requested jobs: cloud-onboard-e2e
Summary: 1 passed, 0 failed, 21 skipped

Job Result
cloud-e2e ⏭️ skipped
cloud-inference-e2e ⏭️ skipped
cloud-onboard-e2e ✅ success
deployment-services-e2e ⏭️ skipped
diagnostics-e2e ⏭️ skipped
docs-validation-e2e ⏭️ skipped
gpu-e2e ⏭️ skipped
hermes-e2e ⏭️ skipped
inference-routing-e2e ⏭️ skipped
messaging-compatible-endpoint-e2e ⏭️ skipped
messaging-providers-e2e ⏭️ skipped
network-policy-e2e ⏭️ skipped
overlayfs-autofix-e2e ⏭️ skipped
rebuild-hermes-e2e ⏭️ skipped
rebuild-openclaw-e2e ⏭️ skipped
sandbox-operations-e2e ⏭️ skipped
sandbox-survival-e2e ⏭️ skipped
shields-config-e2e ⏭️ skipped
skill-agent-e2e ⏭️ skipped
snapshot-commands-e2e ⏭️ skipped
token-rotation-e2e ⏭️ skipped
upgrade-stale-sandbox-e2e ⏭️ skipped

@ericksoa ericksoa self-assigned this May 5, 2026
@ericksoa ericksoa added bug Something isn't working v0.0.35 Release target labels May 5, 2026
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 5, 2026

Selective E2E Results — ✅ All requested jobs passed

Run: 25405102067
Branch: fix/curl-pipe-tty-acceptance
Requested jobs: cloud-onboard-e2e
Summary: 1 passed, 0 failed, 21 skipped

Job Result
cloud-e2e ⏭️ skipped
cloud-inference-e2e ⏭️ skipped
cloud-onboard-e2e ✅ success
deployment-services-e2e ⏭️ skipped
diagnostics-e2e ⏭️ skipped
docs-validation-e2e ⏭️ skipped
gpu-e2e ⏭️ skipped
hermes-e2e ⏭️ skipped
inference-routing-e2e ⏭️ skipped
messaging-compatible-endpoint-e2e ⏭️ skipped
messaging-providers-e2e ⏭️ skipped
network-policy-e2e ⏭️ skipped
overlayfs-autofix-e2e ⏭️ skipped
rebuild-hermes-e2e ⏭️ skipped
rebuild-openclaw-e2e ⏭️ skipped
sandbox-operations-e2e ⏭️ skipped
sandbox-survival-e2e ⏭️ skipped
shields-config-e2e ⏭️ skipped
skill-agent-e2e ⏭️ skipped
snapshot-commands-e2e ⏭️ skipped
token-rotation-e2e ⏭️ skipped
upgrade-stale-sandbox-e2e ⏭️ skipped

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 5, 2026

Selective E2E Results — ✅ All requested jobs passed

Run: 25405701586
Branch: fix/curl-pipe-tty-acceptance
Requested jobs: cloud-onboard-e2e
Summary: 1 passed, 0 failed, 21 skipped

Job Result
cloud-e2e ⏭️ skipped
cloud-inference-e2e ⏭️ skipped
cloud-onboard-e2e ✅ success
deployment-services-e2e ⏭️ skipped
diagnostics-e2e ⏭️ skipped
docs-validation-e2e ⏭️ skipped
gpu-e2e ⏭️ skipped
hermes-e2e ⏭️ skipped
inference-routing-e2e ⏭️ skipped
messaging-compatible-endpoint-e2e ⏭️ skipped
messaging-providers-e2e ⏭️ skipped
network-policy-e2e ⏭️ skipped
overlayfs-autofix-e2e ⏭️ skipped
rebuild-hermes-e2e ⏭️ skipped
rebuild-openclaw-e2e ⏭️ skipped
sandbox-operations-e2e ⏭️ skipped
sandbox-survival-e2e ⏭️ skipped
shields-config-e2e ⏭️ skipped
skill-agent-e2e ⏭️ skipped
snapshot-commands-e2e ⏭️ skipped
token-rotation-e2e ⏭️ skipped
upgrade-stale-sandbox-e2e ⏭️ skipped

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 6, 2026

Selective E2E Results — ✅ All requested jobs passed

Run: 25408752042
Branch: fix/curl-pipe-tty-acceptance
Requested jobs: cloud-onboard-e2e
Summary: 1 passed, 0 failed, 22 skipped

Job Result
cloud-e2e ⏭️ skipped
cloud-inference-e2e ⏭️ skipped
cloud-onboard-e2e ✅ success
deployment-services-e2e ⏭️ skipped
diagnostics-e2e ⏭️ skipped
docs-validation-e2e ⏭️ skipped
gpu-e2e ⏭️ skipped
hermes-discord-e2e ⏭️ skipped
hermes-e2e ⏭️ skipped
inference-routing-e2e ⏭️ skipped
messaging-compatible-endpoint-e2e ⏭️ skipped
messaging-providers-e2e ⏭️ skipped
network-policy-e2e ⏭️ skipped
overlayfs-autofix-e2e ⏭️ skipped
rebuild-hermes-e2e ⏭️ skipped
rebuild-openclaw-e2e ⏭️ skipped
sandbox-operations-e2e ⏭️ skipped
sandbox-survival-e2e ⏭️ skipped
shields-config-e2e ⏭️ skipped
skill-agent-e2e ⏭️ skipped
snapshot-commands-e2e ⏭️ skipped
token-rotation-e2e ⏭️ skipped
upgrade-stale-sandbox-e2e ⏭️ skipped

Copy link
Copy Markdown
Contributor

@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: 2

🤖 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 `@scripts/install.sh`:
- Around line 696-713: The new preflight blocks reject the existing FIFO-driven
smoke install path by requiring a TTY; update the logic so scripted/stdin-piped
installs are still supported: when exec 3</dev/tty fails, check whether stdin is
a pipe (i.e. [ -t 0 ] is false) and if so call show_usage_notice_shell reading
from stdin (or from the piped FD) instead of erroring; additionally avoid
conflating NEMOCLAW_ACCEPT_THIRD_PARTY_SOFTWARE with NON_INTERACTIVE in
main()—keep acceptance from the env/flag separate so the smoke harness can set
NEMOCLAW_ACCEPT_THIRD_PARTY_SOFTWARE=1 without the installer switching to
NON_INTERACTIVE and stopping further stdin-driven prompts (update the handling
in main() and retain show_usage_notice_shell usage for piped stdin).
- Around line 683-685: The early return when ACCEPT_THIRD_PARTY_SOFTWARE is set
prevents persisting acceptance, so modify the branch that checks the
ACCEPT_THIRD_PARTY_SOFTWARE / NEMOCLAW_ACCEPT_THIRD_PARTY_SOFTWARE flag to call
save_usage_notice_acceptance_shell() (or whatever persistence helper is used)
before returning; ensure the code path that exits early still invokes the same
persistence function used for interactive acceptance so
~/.nemoclaw/usage-notice.json is written and state is versioned.
🪄 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: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: f12ed924-bdc8-40d5-9560-21ed3ebbd901

📥 Commits

Reviewing files that changed from the base of the PR and between 440de6d and 593d832.

📒 Files selected for processing (3)
  • scripts/install.sh
  • src/lib/onboard-cli-commands.ts
  • test/install-preflight.test.ts

Comment thread scripts/install.sh
Comment on lines +683 to +685
if [ "${ACCEPT_THIRD_PARTY_SOFTWARE:-}" = "1" ]; then
return 0
fi
Copy link
Copy Markdown
Contributor

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

Persist explicit acceptance as well.

Line 683 short-circuits before save_usage_notice_acceptance_shell(), so the documented headless path (NEMOCLAW_ACCEPT_THIRD_PARTY_SOFTWARE=1 / --yes-i-accept-third-party-software) never writes ~/.nemoclaw/usage-notice.json. Users who accept via env/flag will be prompted again on the next run even though this flow is now versioned and stateful.

Suggested fix
 preflight_usage_notice_prompt() {
   if [ "${ACCEPT_THIRD_PARTY_SOFTWARE:-}" = "1" ]; then
+    local notice_json version
+    notice_json="$(usage_notice_config_path)"
+    if [[ -f "$notice_json" ]]; then
+      version="$(json_string_field "$notice_json" "version")"
+      if [[ -n "$version" ]]; then
+        save_usage_notice_acceptance_shell "$version"
+      fi
+    fi
     return 0
   fi
🤖 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 `@scripts/install.sh` around lines 683 - 685, The early return when
ACCEPT_THIRD_PARTY_SOFTWARE is set prevents persisting acceptance, so modify the
branch that checks the ACCEPT_THIRD_PARTY_SOFTWARE /
NEMOCLAW_ACCEPT_THIRD_PARTY_SOFTWARE flag to call
save_usage_notice_acceptance_shell() (or whatever persistence helper is used)
before returning; ensure the code path that exits early still invokes the same
persistence function used for interactive acceptance so
~/.nemoclaw/usage-notice.json is written and state is versioned.

Comment thread scripts/install.sh
Comment on lines +696 to +713
if [ "${NON_INTERACTIVE:-}" = "1" ]; then
error "Non-interactive installation requires explicit third-party software acceptance. Re-run with --yes-i-accept-third-party-software or set NEMOCLAW_ACCEPT_THIRD_PARTY_SOFTWARE=1."
fi

if [ -t 0 ]; then
show_usage_notice_shell
return "$?"
fi

if { exec 3</dev/tty; } 2>/dev/null; then
info "Installer stdin is piped; prompting for the third-party software notice on /dev/tty before install."
local status=0
show_usage_notice_shell <&3 || status=$?
exec 3<&-
return "$status"
fi

error "Interactive third-party software acceptance requires a TTY. Re-run in a terminal or pass --yes-i-accept-third-party-software (or set NEMOCLAW_ACCEPT_THIRD_PARTY_SOFTWARE=1)."
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major | 🏗️ Heavy lift

This closes off the existing FIFO-driven smoke install path.

scripts/smoke-macos-install.sh:205-212 still drives install.sh with stdin from a named pipe and no controlling TTY. With this preflight, that path now exits before phase 1. The obvious workaround (NEMOCLAW_ACCEPT_THIRD_PARTY_SOFTWARE=1) still changes behavior, because main() later coerces explicit acceptance into NON_INTERACTIVE=1, so the smoke harness can no longer feed the remaining prompts from its answers pipe. Please update that harness in the same PR, or preserve a supported scripted-input path here.

Also applies to: 1701-1705

🤖 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 `@scripts/install.sh` around lines 696 - 713, The new preflight blocks reject
the existing FIFO-driven smoke install path by requiring a TTY; update the logic
so scripted/stdin-piped installs are still supported: when exec 3</dev/tty
fails, check whether stdin is a pipe (i.e. [ -t 0 ] is false) and if so call
show_usage_notice_shell reading from stdin (or from the piped FD) instead of
erroring; additionally avoid conflating NEMOCLAW_ACCEPT_THIRD_PARTY_SOFTWARE
with NON_INTERACTIVE in main()—keep acceptance from the env/flag separate so the
smoke harness can set NEMOCLAW_ACCEPT_THIRD_PARTY_SOFTWARE=1 without the
installer switching to NON_INTERACTIVE and stopping further stdin-driven prompts
(update the handling in main() and retain show_usage_notice_shell usage for
piped stdin).

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 6, 2026

Selective E2E Results — ✅ All requested jobs passed

Run: 25410330520
Branch: fix/curl-pipe-tty-acceptance
Requested jobs: cloud-onboard-e2e
Summary: 1 passed, 0 failed, 22 skipped

Job Result
cloud-e2e ⏭️ skipped
cloud-inference-e2e ⏭️ skipped
cloud-onboard-e2e ✅ success
deployment-services-e2e ⏭️ skipped
diagnostics-e2e ⏭️ skipped
docs-validation-e2e ⏭️ skipped
gpu-e2e ⏭️ skipped
hermes-discord-e2e ⏭️ skipped
hermes-e2e ⏭️ skipped
inference-routing-e2e ⏭️ skipped
messaging-compatible-endpoint-e2e ⏭️ skipped
messaging-providers-e2e ⏭️ skipped
network-policy-e2e ⏭️ skipped
overlayfs-autofix-e2e ⏭️ skipped
rebuild-hermes-e2e ⏭️ skipped
rebuild-openclaw-e2e ⏭️ skipped
sandbox-operations-e2e ⏭️ skipped
sandbox-survival-e2e ⏭️ skipped
shields-config-e2e ⏭️ skipped
skill-agent-e2e ⏭️ skipped
snapshot-commands-e2e ⏭️ skipped
token-rotation-e2e ⏭️ skipped
upgrade-stale-sandbox-e2e ⏭️ skipped

@ericksoa ericksoa merged commit 8cb4f55 into main May 6, 2026
60 checks passed
@ericksoa ericksoa deleted the fix/curl-pipe-tty-acceptance branch May 6, 2026 00:54
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working v0.0.35 Release target

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants