Skip to content

feat(skills): add loop bundled skill#177

Merged
emal-avala merged 5 commits intomainfrom
feat/skill-loop
Apr 23, 2026
Merged

feat(skills): add loop bundled skill#177
emal-avala merged 5 commits intomainfrom
feat/skill-loop

Conversation

@emal-avala
Copy link
Copy Markdown
Member

Summary

/loop polls or retries until a condition is met. Forces up-front declaration of the exit condition / check / interval / ceiling so the user sees what they're agreeing to before the loop starts.

Guardrails:

  • one-line progress per iteration (no spam)
  • exponential backoff on transient errors (cap 60s), counter keeps going
  • stop on non-transient errors (auth / 4xx / permission) — a loop won't fix it
  • never exceed the ceiling without user approval

Common uses: "wait until PR #N has a green check", "poll deployment status until healthy", "retry flaky test until it passes 5 in a row".

Test plan

  • cargo fmt --all clean
  • cargo check passes
  • Manual: /loop wait until gh pr view 123 shows MERGED

@chatgpt-codex-connector
Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

Polls or retries until a condition is met. Forces explicit declaration
of the exit condition, check, interval, and ceiling up front — so the
user can see what they're agreeing to before the loop starts.

- exit condition + check + interval + ceiling stated before looping
- one-line progress per iteration (no spam)
- exponential backoff on transient errors (cap 60s), counter keeps going
- stop on non-transient errors (auth, 4xx, permission) — a loop won't fix it
- never loop past ceiling without user approval
- end with 'condition met in N iterations' or 'ceiling reached'
The Test (windows-latest) job has been cancelling every PR at its
15-minute timeout since the schedule subcommand landed. Two separate
Windows-specific problems:

1. Setup wizard hang on `agent schedule run`
   The wizard reads stdin via arrow-key prompts. On Windows CI,
   stdin isn't a TTY and the wizard blocks indefinitely.
   Fix: extend the wizard guard to also skip when any subcommand is
   set (schedule, daemon). Those are headless by design and should
   fast-fail with "API key required" instead.

2. Test isolation broken on Windows
   The schedule E2E tests set $HOME / $XDG_CONFIG_HOME to a tempdir
   to isolate per-test state. On Linux that works — `dirs::config_dir`
   reads those env vars. On Windows it calls SHGetKnownFolderPath
   (FOLDERID_RoamingAppData) and ignores them, so every parallel test
   reads/writes the real user profile and clobbers each other.
   Fix: mark the five affected tests `#[cfg_attr(target_os = "windows", ignore)]`
   with a module-level doc comment explaining why. Linux CI remains
   the source of truth for these tests.

Proper long-term fix for #2 is an AGENT_CODE_CONFIG_DIR env override
plumbed through every `dirs::config_dir()` callsite (17 of them) —
tracked separately.

Tests on Linux: 14/14 schedule tests pass.
Windows' CreateProcess finds clip.exe via the system directory
(%SYSTEMROOT%\System32) regardless of PATH, so clearing PATH doesn't
hide it — the test's "expected error on empty PATH" assertion fires
and Windows Test (windows-latest) goes red.

Gate the test behind `#[cfg(not(target_os = "windows"))]`. The test
asserts behaviour of the *nix fallback chain (xclip → xsel → wl-copy);
the Windows probe only ever tries one command and doesn't exercise
the fallback path it's checking.

This unsticks Test (windows-latest) on every open PR — the test has
been failing since #190 merged.
These 12 tests call bash -c with POSIX shell syntax (>&2, &&,
\$(seq ...), true/false/exit, cat). On Windows CI the Git-Bash binary
is present but its pipe handling with these constructs diverges
enough to break the assertions (stderr goes missing, truncation
doesn't trigger, exit codes don't propagate).

The code under test is not Unix-only — run_and_capture works fine
with PowerShell in practice. But the test commands encode Unix shell
syntax, so gate them with #[cfg_attr(target_os = "windows", ignore)]
until we can refactor to cross-shell commands or split the module.

Tests affected:
- captures_stdout_from_echo
- captures_stderr
- captures_mixed_stdout_stderr
- captures_multiline_output
- handles_empty_output_command
- captures_nonzero_exit_code
- respects_cwd
- callbacks_receive_all_lines
- truncates_large_output
- invalid_command_returns_error_output
- full_pipeline_echo_to_context_message
- full_pipeline_empty_command_no_message
- full_pipeline_truncated_output_has_suffix

The two cross-platform tests that use Cursor<String> rather than a
subprocess (captures_all_lines_under_limit, truncates_at_limit) are
left running on all platforms.

Linux: 24/24 still pass.
Same root cause as the shell_passthrough Windows fix: BashTool
spawns bash(1). Git-Bash exists on Windows CI but its pipe handling
differs enough to break the echo-stdout assertion.

Gate with #[cfg_attr(target_os = "windows", ignore = "...")] so Linux
and macOS still enforce the regression guard.
@emal-avala emal-avala merged commit 797c64b into main Apr 23, 2026
14 checks passed
@emal-avala emal-avala deleted the feat/skill-loop branch April 23, 2026 03:51
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