feat: harmonize out-dir flags, add blockchain language support and E2E tests#545
Open
feat: harmonize out-dir flags, add blockchain language support and E2E tests#545
Conversation
Replace the external ct-remote C# binary with native Nim implementations built directly into the ct executable. This eliminates the packaging complexity of bundling a separate AOT-compiled .NET binary. New modules in src/ct/online_sharing/: - remote_config.nim: key=value config file (~/.config/codetracer/remote.config) - api_client.nim: REST client for /api/v1/ endpoints (tenants, traces, license) - file_transfer.nim: presigned S3 URL upload/download - tenant_resolver.nim: org slug → tenant GUID resolution - authenticate.nim: OAuth browser callback via TCP listener - activate_command.nim: download and save CTL license blob - check_license_command.nim: query license tier info New CLI commands added via confutils: - ct activate [--token TOKEN] [--base-url URL] - ct check-license [--token TOKEN] [--base-url URL] - ct get-default-org Modified commands now use native HTTP instead of shelling out: - ct upload (with new --token, --base-url flags) - ct download (with new --token, --base-url flags) - ct login (with new --base-url flag) - ct set-default-org (native config write) The ct remote <args> passthrough is kept but deprecated. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Allow overriding the config directory via environment variable, enabling isolated testing of ct-remote commands without touching the user's real config at ~/.config/codetracer/remote.config. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Both commands now catch CatchableError and exit with code 1 on failure instead of letting unhandled exceptions propagate with exit code 0. This is needed for the subprocess-based integration tests to detect missing tokens and other errors. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…ing (M4) Add Lang::Solidity variant, tree-sitter-solidity grammar integration in ExprLoader, find_evm_recorder() in test harness, and Solidity flow test program. DAP flow test and integration test are scaffolded but #[ignore]d pending EVM recorder CLI implementation. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add SolidityExample.sol (ERC20-like contract with storage, events, internal calls) for visual testing. Add Playwright test spec with guards for EVM pipeline availability, testing editor display, event log, state panel, and call trace visualization. Register .sol in DB_BASED_EXTENSIONS. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…nt test bodies - Add record_solidity_trace() to test harness, invoking `codetracer-evm-recorder record` - Implement solidity_flow_dap_variables test body with full DAP flow verification - Implement test_solidity_flow_integration test body with run_db_flow_test - Update justfile test-solidity-flow target to build evm-recorder and use its dev shell - Replace soft skips (eprintln + return) with hard asserts for prerequisite checks - Add Language::Solidity to create_db_trace() and breakpoint path resolution Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…Fuel, Solana, and Move Add blockchain language support for four new platforms: - Miden/MASM: Lang::Masm variant, masm_flow_test.masm test program, find_miden_recorder() + record_masm_trace() in test harness, masm_flow_dap_test.rs DAP integration test - Sway/FuelVM: Lang::Sway variant, flow_test Sway project (Forc.toml + src/main.sw), find_fuel_recorder() + record_fuel_trace(), sway_flow_dap_test.rs DAP integration test - Move/Sui: Lang::Move variant, flow_test Move project (Move.toml + sources/flow_test.move), find_move_recorder() + record_move_trace(), move_flow_dap_test.rs DAP integration test - Solana/SBF: Language::Solana variant, solana_flow_test.rs test program, find_solana_recorder() + record_solana_trace(), solana_flow_dap_test.rs DAP integration test All tests use #[ignore] since they require external recorder binaries. Justfile targets: test-masm-flow, test-sway-flow, test-move-flow, test-solana-flow. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…en, and Move (M7) Add four new blockchain language test suites following the Solidity template: - solana_example: Rust-based Solana/SBF trace tests with codetracer-solana-recorder guard; structural test correctly verifies .rs is NOT DB-based (pipeline detection) - sway_example: Sway/Fuel trace tests with codetracer-fuel-recorder guard and Forc.toml project marker; .sw extension classified as DB-based - masm_example: Miden/MASM trace tests with codetracer-miden-recorder guard; .masm extension classified as DB-based - move_example: Move trace tests with codetracer-move-recorder guard and Move.toml project marker; .move extension classified as DB-based Each test program implements the canonical computation (a=10, b=32, sum=42, doubled=84, final_result=94) in its respective language. All UI interaction tests are gated with test.skip() on recorder availability, and unimplemented features (variable decoding, calltrace, stepping) use test.fixme(). lang-support.ts updated with masm, sw, move extensions and Forc.toml, Move.toml folder markers in the DB-based sets. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace trivial 5-variable test programs with comprehensive programs that exercise all language constructs for each smart contract language: MASM (193 lines): 9 procedures covering arithmetic, bitwise ops, fibonacci loops, conditionals, memory operations, nested calls, stack manipulation, and comparisons. Sway (298 lines): 13 functions with structs, enums, pattern matching, while loops, conditionals, arrays, tuples, bitwise ops, and nested function calls. Move (407 lines): 10 functions + 9 test functions with structs (abilities), generics, vectors, loops, references, tuple returns, constants, and abort handling. Solana/Rust (599 lines): structs, enums, pattern matching, for/while/ loop, arrays/slices/tuples, multi-width arithmetic, bitwise ops, Option/Result patterns, iterators, references, byte manipulation, and recursive fibonacci. Expand each DAP test file from 1 to 7 tests with breakpoints at different program locations verifying distinct language features. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Per Test-Program-Layout.md, test programs belong in their recorder
repos and are discovered via sibling detection. This commit:
- Removes local test-programs/{masm,sway,move,solana}/ directories
- Adds 6 discovery functions to test_harness (find_masm_flow_test,
find_sway_flow_test, find_sway_flow_source, find_move_flow_test,
find_move_flow_source, find_solana_flow_test) with 2-tier fallback
(sibling repo canonical, local deprecated)
- Updates all 4 DAP test files to use the new discovery functions
The canonical test programs now live in:
codetracer-miden-recorder/test-programs/masm/masm_flow_test.masm
codetracer-fuel-recorder/test-programs/flow_test/
codetracer-move-recorder/test-programs/move/flow_test/
codetracer-solana-recorder/test-programs/solana/solana_flow_test.rs
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Per Test-Program-Layout.md, test programs live exclusively in their canonical recorder repos. Remove the deprecated local fallback paths — discovery now returns None if the sibling recorder repo is not checked out. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Implements the core CI command infrastructure for the ct CLI: - New CICommand enum with 8 subcommands: start, attach, exec, finish, run (all-in-one), log, status, and cancel - ci_state.nim: State file management for active CI run context (runId, tenantId, baseUrl, token, sequenceCounter) persisted to $CODETRACER_STATE_DIR or ~/.codetracer-ci/ci-run.json - ci_api_client.nim: CI-specific API client wrapping ApiClient with methods for all CI endpoints (create, start, complete, cancel, logs, status, traces) and exponential backoff retry on network errors - ci_commands.nim: Command implementations with auto-detection of git info, child process spawning with log streaming (500ms/100-line flush), cancellation polling every 10s with SIGTERM/SIGKILL, and token resolution (--token flag > CODETRACER_TOKEN env > stored token) - Config fields added to codetracerconf.nim for all subcommands - CI dispatch added to launch.nim - Exported baseApiUrl and httpClient fields on ApiClient Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add bpf_monitor.nim which spawns bpftrace via sudo to capture process
lifecycle events (EXEC, EXIT, INTV) for the child process tree during
`ct ci exec` and `ct ci run`. Events are parsed from bpftrace's JSON
output, batched, and POSTed to the Monolith backend's
POST /api/v1/ci/runs/{runId}/processes endpoint.
Key design decisions:
- Non-blocking pipe I/O via O_NONBLOCK + posix.read to avoid blocking
the main stdout-reading loop when bpftrace has no output ready
- Graceful fallback: if bpftrace is unavailable or passwordless sudo
fails, a warning is printed and execution continues unmonitored
- Environment deduplication via SHA-256 content-addressing to avoid
re-sending identical env snapshots across processes
- bpftrace subprocess cleanup uses SIGTERM with grace period, then
SIGKILL, followed by a blocking drain of remaining output
- Process event types (ProcessStartEvent, ProcessExitEvent,
ProcessMetricsEvent, ProcessEnvironment) are defined in
ci_api_client.nim to avoid circular imports
- New --monitor-processes flag on both exec and run subcommands
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Previously verify_flow_results had 4 ways to silently pass despite missing or incorrect data: - Missing expected variables: silently skipped (no else clause) - Unloaded values: printed warning but continued - Non-numeric values: silently skipped extraction - Partial verification: only required >=1 match, not all Now all 4 paths return Err with descriptive messages. A verified_count ensures every expected value is explicitly checked. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Test program discovery functions now check environment variables before falling back to sibling repo paths, matching the pattern used by recorder binary discovery functions: - find_masm_flow_test() → CODETRACER_MASM_FLOW_TEST - find_sway_flow_test() → CODETRACER_SWAY_FLOW_TEST - find_sway_flow_source() → CODETRACER_SWAY_FLOW_SOURCE - find_move_flow_test() → CODETRACER_MOVE_FLOW_TEST - find_move_flow_source() → CODETRACER_MOVE_FLOW_SOURCE - find_solana_flow_test() → CODETRACER_SOLANA_FLOW_TEST This enables CI and custom setups to specify test program locations without requiring sibling repo checkout. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Extracted verify_flow_results into a free function (method delegates to it) to enable lightweight unit testing without spawning a DAP subprocess. Added 3 meta-tests that verify the function's error handling: - test_verify_rejects_missing_variable: Err when expected var absent - test_verify_rejects_wrong_value: Err when value doesn't match - test_verify_accepts_correct_values: Ok when values match These guard against regressions that might re-introduce silent-pass behavior in the flow test infrastructure. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Strengthen the verify_flow_results test suite with additional edge cases: - test_verify_rejects_excluded_identifier: ensures function names in excluded_identifiers cause rejection when present in flow data - test_verify_rejects_unloaded_value: ensures <NONE> values are rejected - test_verify_rejects_non_integer_value: ensures non-parseable values are rejected when integer comparison is expected - test_verify_accepts_multiple_variables: ensures multi-variable configs with all correct values pass - test_verify_rejects_when_no_values_loaded: ensures zero loaded values cause rejection even without explicit expected_values Total meta-tests: 8 (3 existing + 5 new), all passing. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add capabilities-based bpftrace setup so BPF process monitoring can run without sudo at runtime. The new `src/common/bpf_install.nim` module handles kernel version verification (>=5.8 for CAP_BPF), locating the system bpftrace, copying it to /usr/local/lib/codetracer/ with cap_bpf,cap_perfmon,cap_dac_read_search capabilities, and creating the codetracer-bpf group -- all in a single sudo invocation with input validation to prevent shell injection. Key changes: - `ct install --bpf` (default true, `--no-bpf` to skip) triggers setup - GUI install dialog adds BPF checkbox; privileged step uses pkexec - bpf_monitor.nim now uses priority: nix wrapper > local caps > sudo - install-on-distributions.sh splits BPF into a non-fatal second step - NixOS module uses security.wrappers for declarative capabilities - Nix package (codetracer-appimage) bundles bpftrace in libexec Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…ctations Two fixes to make the Noir flow DAP test pass: 1. Change --out-dir to --trace-dir in record_noir_trace() to match the current nargo trace CLI interface. 2. Update noir_flow_dap_variables_and_values to expect only the variables that the Noir trace actually exposes (sum_val, doubled, final_result). Function parameters (a, b) are inlined by the Noir compiler and don't appear in the trace output. Test now passes with all 3 values verified: sum_val=42, doubled=84, final_result=94. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The nargo CLI renamed --out-dir to --trace-dir in a recent version. This fixes the same issue in tracepoint_interpreter/tests.rs that was already fixed in test_harness/mod.rs (commit 4a0d44d). Fixes the pre-existing array_indexing test failure. Full test suite now passes: 124/124 tests pass, 0 failures. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…lake Add a `just user-setup` target for one-time developer machine setup that: - Runs ct install for PATH and desktop file (non-privileged) - Sets up BPF process monitoring with capabilities (requires sudo) - Detects NixOS security.wrappers and skips manual setup - Supports --without-bpf flag to skip BPF setup Wire the codetracer-appimage package into the flake outputs so it's buildable via `nix build .#codetracer-appimage`. Expose the NixOS module at `nixosModules.default` for declarative BPF setup via `programs.codetracer.enable = true`. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Rename to better reflect its purpose: setting up a development machine for iterative BPF script development without requiring sudo at runtime. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…or Noir Implement the three remaining M5 deliverables: - Multi-breakpoint test: sets breakpoints at lines 25 and 26, verifies sum_val=42 and doubled=84 at each stop - Stepping test: breaks at line 24, steps next through lines 25 and 26 - Call stack test: breaks inside add_offset, verifies stack frames [add_offset, calculate_sum, main] Also adds stack_trace() and dap_step() to ct-dap-client, and fixes dap_continue() to consume trailing response from the step handler. Updates noir_flow_integration test for restructured main.nr. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Convert test.fixme() to real tests for MASM, Sway, Move, and Solana: - State panel variable assertions (decoded values) - Call trace pane entry verification - Continue and next stepping operations Tests remain behind pipeline availability skip guards. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…esting Add helper functions, conditional branches, and function calls to all 4 blockchain test programs while preserving the original arithmetic (a=10, b=32, sum=42, doubled=84, final_result=94) for backward compatibility with existing Playwright assertions. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace bpftrace dependency with C BPF programs loaded via libbpf from Nim. bpftrace 0.24.x has a hardcoded geteuid()==0 check that prevents non-root execution even with Linux capabilities (CAP_BPF + CAP_PERFMON + CAP_DAC_READ_SEARCH). The native backend compiles BPF programs with clang, loads them via libbpf's C API, and sets capabilities directly on the ct binary. New files (Stage 1 — additive, no existing code modified): - src/bpf-monitor/monitor.bpf.c: kernel-side BPF programs (execve + exit) - src/bpf-monitor/events.h: shared event struct definitions (C + Nim) - src/bpf-monitor/vmlinux_minimal.h: minimal kernel type definitions - src/ct/ci/libbpf_wrapper.nim: Nim FFI bindings for libbpf C API - src/ct/ci/bpf_monitor_native.nim: native libbpf-based backend - src/ct/ci/bpf_monitor_native_test.nim: 16 unit tests - nix/modules/developer-bpf.nix: NixOS module for passwordless setcap Build integration: - Tuprules.tup: split !codetracer into !codetracer (plain) and !codetracer_bpf (with automatic setcap after compilation) - justfile: build-bpf-programs, test-bpf-native, setcap-bpf targets - nix/shells/main.nix: add libbpf and bpftools packages - developer-setup.sh: NixOS module instructions + sudoers drop-in for non-NixOS systems The existing bpftrace backend (bpf_monitor.nim) is unchanged and continues to work. Both backends coexist during the transition. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
sudoers validates that command arguments are fully-qualified paths, which rejects bare capability strings like 'cap_bpf,...=eip'. Fix by wrapping setcap in a single-purpose `codetracer-setcap` script that the NixOS module installs on PATH and allows via sudoers. The tup rule now calls `sudo -n codetracer-setcap` instead of `sudo -n setcap <caps> <path>`. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
sudo matches commands against the real path in the sudoers rule, not the /run/current-system/sw/bin symlink. Use readlink -f to resolve codetracer-setcap to its Nix store path before passing to sudo -n. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add bpf_native_integration_test.nim with 9 tests covering: - Capability detection (available + missing file) - Live EXEC event capture (basic, binary path, command line args) - Live EXIT event capture (PID matching, root PID detection) - Environment variable capture - Process tree tracking (child processes, exit codes) Extend codetracer-setcap to accept an optional path argument (restricted to files under the repo root) so test binaries can also receive BPF capabilities. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Complete Stage 3 of the native BPF migration: ci_commands.nim now auto-selects the native libbpf backend when available (CAP_BPF + monitor.bpf.o present) and falls back to bpftrace otherwise. Key changes: - ci_commands.nim: runtime backend selection — try native first, fall back to bpftrace. Both backends use the same polling/flush loop. - monitor.bpf.c: fix BPF verifier "8193 jumps too complex" error by reducing MAX_ARGV/ENVP_COUNT to 32 and moving envp KEY=VALUE splitting to userspace. The BPF program now emits raw "KEY=VALUE" strings via a single bpf_probe_read_user_str() call, eliminating the nested byte-by-byte loops that exceeded the verifier's jump complexity limit. - events.h + bpf_monitor_native.nim: envp event struct uses a single `raw` field instead of separate key/value; Nim splits on '='. - Tuprules.tup: simplified !codetracer_bpf rule — removed inline setcap attempt since tup's FUSE sandbox prevents sudo. Setcap is now a post-build step in build-once.sh. - build-once.sh + post-build-setcap.sh: re-apply BPF capabilities after each tup build via the codetracer-setcap helper. - nix/shells/main.nix: export LIBRARY_PATH (elfutils, zlib) and C_INCLUDE_PATH (libbpf) so Nim's gcc invocation finds libbpf headers and link libraries inside tup's sanitized environment. - bpf_native_integration_test.nim: complete rewrite as an E2E test that drives the ct binary (not the BPF programs directly). Uses a non-blocking polling loop for both ct's stdout pipe and a mock HTTP server to avoid deadlocks. All 4 tests pass. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add PolkaVM, Cairo, Circom, Leo, Tolk, Aiken, and Cadence to the language enum, test harness, and UI test infrastructure. For each language: Lang variant + extension mapping, recorder binary discovery (env var override + sibling repo fallback), flow test source file discovery, trace recording function, DAP flow test, Playwright UI test, and stub test program. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…orted languages Add comprehensive user-facing documentation to the CodeTracer book: - 13 getting-started guides covering all supported languages (Solidity, Circom, Cairo, Aiken, Cadence, Solana, Move, Sway, Miden, PolkaVM, Leo, Tolk, JavaScript/TypeScript) - ct CLI reference page with all commands, flags, and env variables - Recorder CLI reference covering all 14 recorder binaries - Reorganized SUMMARY.md and overview with categorized language sections - Added [*.md] exception to .editorconfig for indent_size and max_line_length since markdown code blocks use language-native indentation and tables/URLs inherently exceed 80 characters Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Update BPF installation to set capabilities on the ct binary itself (not just bpftrace) for the native libbpf BPF backend. The native backend loads BPF programs directly via libbpf, eliminating the bpftrace dependency for production use. - bpf_install.nim: Add installNativeBpf() that sets cap_bpf, cap_perfmon, cap_dac_read_search on the ct binary and installs monitor.bpf.o to /usr/local/lib/codetracer/. Rename the old installBpf to installBpftraceFallback. New installBpf tries native first, then falls back to bpftrace. - bpf_monitor_native.nim: Add exe-relative and system install paths to defaultBpfObjectPath() discovery chain. Fix two pre-existing editorconfig line-length violations. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add Agent Harbor installation, machine-readable JSON progress output, and step-by-step GUI progress display to `ct install`. All features are now enabled by default with --no-X flags to opt out. New modules: - agent_harbor_install.nim: Detects and installs Agent Harbor via the official installer script. Retries 3 times on download failure and reports a descriptive error if internet is unavailable. - install_progress.nim: Unified progress reporter that emits either human-readable text or NDJSON events (--json flag) for each install step (path, desktop, bpf, agent-harbor). CLI changes (codetracerconf.nim): - Add --agent-harbor flag (default: true, --no-agent-harbor to skip) - Add --json flag for machine-readable progress output - Update existing flag descriptions for consistency Install handler (launch.nim): - Refactor install case to use InstallReporter for all 4 steps - Add Agent Harbor as step 4 (non-fatal on failure) Frontend changes: - subwindow.nim: Add Agent Harbor checkbox, step-by-step progress display with status icons, IPC handler for step/done events - install.nim: Use --json flag, stream progress via readProcessOutputStreaming, forward JSON events to subwindow - electron_lib.nim: Add readProcessOutputStreaming() for line-by- line stdout parsing with Node.js data events Also fixes all pre-existing editorconfig violations (line length, indentation) in the modified files. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- install-on-distributions.sh: Replace split ct install calls (--no-bpf then --no-path --no-desktop --bpf) with a single `ct install` invocation. All features are now enabled by default. - developer-setup.sh: Update comments to reflect native BPF backend. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…languages Add just targets for running flow-level integration tests for the newly supported blockchain languages: test-polkavm-flow, test-cairo-flow, test-circom-flow, test-leo-flow, test-aiken-flow, test-cadence-flow, test-tolk-flow, and test-stylus-flow. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add resolveRecorderTestProgram() helper in sibling-test-programs.ts to locate test programs in sibling recorder repositories at build time. Update fixtures.ts to support absolute source paths. Add new JS and Stylus e2e specs, and update all blockchain-specific specs (aiken, cadence, cairo, circom, leo, polkavm, tolk) to use the sibling resolution mechanism. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
4d7b320 to
0243a9c
Compare
- ci/lint/nix.sh: set NIXPKGS_ALLOW_UNFREE=1 and --impure to allow evaluation of codetracer-appimage which has an unfree license - codetracerconf.nim: qualify ambiguous `run` as `StartupCommand.run` to disambiguate from `CICommand.run` - db-backend tests: change `--trace-dir` to `--out-dir` in noir test helpers to match nargo's expected flag name Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The BPF backend modules (libbpf_wrapper.nim, bpf_monitor_native.nim) require libbpf headers and elfutils for compilation. These were available in the dev shell but missing from the nix derivation, causing nix build to fail with 'fatal error: bpf/libbpf.h: No such file'. Also export C_INCLUDE_PATH and LIBRARY_PATH in the build phase so the Nim-invoked C compiler can find the headers and libraries. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
--out-direverywhere, replacing inconsistent--trace-dirvariantsct ciCLI subcommand group with 8 CI commandsct installexperience with Agent Harbor and GUI updatesTest plan
just test-e2eto verify Playwright UI tests pass for all blockchain languagescargo testinsrc/db-backendto verify language support and DAP testsjust flow-test-*targets for each new blockchain languagect installworks with the simplified scripts🤖 Generated with Claude Code