diff --git a/crates/api-test/tests/fixtures/grpc/smoke.suite.json b/crates/api-test/tests/fixtures/grpc/smoke.suite.json deleted file mode 100644 index 15943ac0..00000000 --- a/crates/api-test/tests/fixtures/grpc/smoke.suite.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "version": 1, - "name": "grpc-smoke", - "defaults": { - "env": "local", - "grpc": { - "url": "127.0.0.1:50051" - } - }, - "cases": [ - { - "id": "grpc.health", - "type": "grpc", - "request": "setup/grpc/requests/health.grpc.json" - } - ] -} diff --git a/crates/codex-cli/tests/parity_oracle.rs b/crates/codex-cli/tests/parity_oracle.rs index 106a2662..80375a64 100644 --- a/crates/codex-cli/tests/parity_oracle.rs +++ b/crates/codex-cli/tests/parity_oracle.rs @@ -22,18 +22,6 @@ fn run_gemini(args: &[&str]) -> CmdOutput { cmd::run(&bin, args, &[], None) } -fn assert_unrecognized_subcommand(output: &CmdOutput, command: &str) { - let stderr = output.stderr_text(); - assert!( - stderr.contains("unrecognized subcommand"), - "missing clap parse error for {command}: {stderr}" - ); - assert!( - stderr.contains(command), - "missing command token {command}: {stderr}" - ); -} - fn extract_commands(help_text: &str) -> Vec { let mut commands = Vec::new(); let mut in_commands = false; @@ -75,32 +63,6 @@ fn parity_oracle_topology_matches_gemini() { assert_eq!(codex_commands, gemini_commands); } -#[test] -fn parity_oracle_removed_redirect_commands_match_gemini_parse_behavior() { - for command in [ - "list", - "prompt", - "advice", - "knowledge", - "commit", - "auto-refresh", - "rate-limits", - "provider", - "debug", - "workflow", - "automation", - ] { - let codex = run_codex(&[command]); - let gemini = run_gemini(&[command]); - assert_eq!( - codex.code, gemini.code, - "removed command mismatch: {command}" - ); - assert_unrecognized_subcommand(&codex, command); - assert_unrecognized_subcommand(&gemini, command); - } -} - #[test] fn parity_oracle_json_flags_match_gemini_for_auth_and_diag_help() { let codex_auth = run_codex(&["auth", "current", "--help"]); diff --git a/crates/gemini-cli/tests/parity_oracle.rs b/crates/gemini-cli/tests/parity_oracle.rs index a9a4b5e7..596146e0 100644 --- a/crates/gemini-cli/tests/parity_oracle.rs +++ b/crates/gemini-cli/tests/parity_oracle.rs @@ -22,18 +22,6 @@ fn run_codex(args: &[&str]) -> CmdOutput { cmd::run(&bin, args, &[], None) } -fn assert_unrecognized_subcommand(output: &CmdOutput, command: &str) { - let stderr = output.stderr_text(); - assert!( - stderr.contains("unrecognized subcommand"), - "missing clap parse error for {command}: {stderr}" - ); - assert!( - stderr.contains(command), - "missing command token {command}: {stderr}" - ); -} - fn extract_commands(help_text: &str) -> Vec { let mut commands = Vec::new(); let mut in_commands = false; @@ -75,32 +63,6 @@ fn parity_oracle_topology_matches_codex() { assert_eq!(gemini_commands, codex_commands); } -#[test] -fn parity_oracle_removed_redirect_commands_match_codex_parse_behavior() { - for command in [ - "list", - "prompt", - "advice", - "knowledge", - "commit", - "auto-refresh", - "rate-limits", - "provider", - "debug", - "workflow", - "automation", - ] { - let gemini = run_gemini(&[command]); - let codex = run_codex(&[command]); - assert_eq!( - gemini.code, codex.code, - "removed command mismatch: {command}" - ); - assert_unrecognized_subcommand(&gemini, command); - assert_unrecognized_subcommand(&codex, command); - } -} - #[test] fn parity_oracle_json_flags_match_codex_for_auth_and_diag_help() { let gemini_auth = run_gemini(&["auth", "current", "--help"]); diff --git a/crates/plan-issue-cli/tests/fixtures/shell_parity/README.md b/crates/plan-issue-cli/tests/fixtures/shell_parity/README.md index 07e18765..584fe844 100644 --- a/crates/plan-issue-cli/tests/fixtures/shell_parity/README.md +++ b/crates/plan-issue-cli/tests/fixtures/shell_parity/README.md @@ -15,6 +15,5 @@ Normalization rules applied by `regenerate.sh`: - Replace `${HOME}/.config/agent-kit` absolute path with `$AGENT_KIT_HOME`. Fixtures: -- `help.txt`: `--help` surface baseline. - `multi_sprint_guide_dry_run.txt`: `multi-sprint-guide --dry-run` baseline. - `comment_template_start.md`: extracted start-sprint markdown comment template. diff --git a/crates/plan-issue-cli/tests/fixtures/shell_parity/help.txt b/crates/plan-issue-cli/tests/fixtures/shell_parity/help.txt deleted file mode 100644 index 4ff50f43..00000000 --- a/crates/plan-issue-cli/tests/fixtures/shell_parity/help.txt +++ /dev/null @@ -1,40 +0,0 @@ -Rust implementation of the plan-issue orchestration workflow. - -Usage: plan-issue-local [OPTIONS] - -Commands: - build-task-spec Build sprint-scoped task-spec TSV from a plan - build-plan-task-spec Build plan-scoped task-spec TSV (all sprints) for the single plan issue - start-plan Open one plan issue with all plan tasks in Task Decomposition - status-plan Wrapper of issue-delivery-loop status for the plan issue - link-pr Link PR to task rows and set runtime status (default: in-progress) - ready-plan Wrapper of issue-delivery-loop ready-for-review for final plan review - close-plan Close the single plan issue after final approval + merged PR gates, then enforce worktree cleanup - cleanup-worktrees Enforce cleanup of all issue-assigned task worktrees - start-sprint Start sprint from Task Decomposition runtime truth after previous sprint merge+done gate passes - ready-sprint Post sprint-ready comment for main-agent review before merge - accept-sprint Enforce merged-PR gate, sync sprint status=done, then post accepted comment - multi-sprint-guide Print the full repeated command flow for a plan (1 plan = 1 issue) - completion Export shell completion script - -Options: - --repo Pass-through repository target for GitHub operations - --dry-run Print write actions without mutating GitHub state - -f, --force Bypass markdown payload guard for GitHub body/comment writes - --json Output machine-readable JSON (alias for --format json) - --format Output format [possible values: text, json] - -h, --help Print help - -V, --version Print version - -Usage paths: - - plan-issue: live GitHub-backed orchestration - - plan-issue-local: local-first rehearsal and dry-run flow - -Unsupported in plan-issue-local: - - Any --issue path that requires live GitHub reads/writes (for example: status-plan/ready-plan with --issue, close-plan with --issue-only, cleanup-worktrees). - -Use instead: - - plan-issue ... (live GitHub path) - - --body-file + --dry-run flows (local rehearsal path where supported) - -Both binaries share the same typed command contract. diff --git a/crates/plan-issue-cli/tests/fixtures/shell_parity/regenerate.sh b/crates/plan-issue-cli/tests/fixtures/shell_parity/regenerate.sh index dee0ca5c..04bba493 100755 --- a/crates/plan-issue-cli/tests/fixtures/shell_parity/regenerate.sh +++ b/crates/plan-issue-cli/tests/fixtures/shell_parity/regenerate.sh @@ -22,8 +22,6 @@ run_plan_issue_local() { cargo run -q -p nils-plan-issue-cli --bin plan-issue-local -- "$@" } -run_plan_issue_local --help >"$script_dir/help.txt" - run_plan_issue_local --format json multi-sprint-guide \ --plan "$plan_fixture_rel" \ --dry-run \ diff --git a/crates/plan-issue-cli/tests/parity_guardrails.rs b/crates/plan-issue-cli/tests/parity_guardrails.rs index 86045ce7..7fa0ba87 100644 --- a/crates/plan-issue-cli/tests/parity_guardrails.rs +++ b/crates/plan-issue-cli/tests/parity_guardrails.rs @@ -28,50 +28,30 @@ fn normalize_shell_text(text: &str, agent_home: &str) -> String { .replace("\\>", ">") } -fn fixture_subcommands(help_fixture: &str) -> Vec<(String, String)> { - let mut rows = Vec::new(); - let mut in_section = false; - for line in help_fixture.lines() { - if line.trim() == "Subcommands:" { - in_section = true; - continue; - } - if in_section && line.trim().is_empty() { - break; - } - if !in_section { - continue; - } - - if !line.starts_with(" ") { - continue; - } - let trimmed = line.trim(); - let mut parts = trimmed.splitn(2, char::is_whitespace); - let Some(name) = parts.next() else { continue }; - let desc = parts.next().unwrap_or("").trim(); - if !name.is_empty() && !desc.is_empty() { - rows.push((name.to_string(), desc.to_string())); - } - } - rows -} - #[test] -fn parity_shell_help_surface_tracks_shell_fixture_commands() { - let fixture = shell_fixture("help.txt"); - let out = common::run_plan_issue(&["--help"]); +fn parity_shell_help_surface_tracks_current_command_contract() { + let out = common::run_plan_issue_local(&["--help"]); assert_eq!(out.code, 0, "stderr: {}", out.stderr); - for (name, description) in fixture_subcommands(&fixture) { - assert!( - out.stdout.contains(&name), - "help output missing subcommand `{name}`\n{}", - out.stdout - ); + for token in [ + "Commands:", + "build-task-spec Build sprint-scoped task-spec TSV from a plan", + "build-plan-task-spec Build plan-scoped task-spec TSV (all sprints) for the single plan issue", + "start-plan Open one plan issue with all plan tasks in Task Decomposition", + "status-plan Wrapper of issue-delivery-loop status for the plan issue", + "link-pr Link PR to task rows and set runtime status (default: in-progress)", + "ready-plan Wrapper of issue-delivery-loop ready-for-review for final plan review", + "close-plan Close the single plan issue after final approval + merged PR gates, then enforce worktree cleanup", + "cleanup-worktrees Enforce cleanup of all issue-assigned task worktrees", + "start-sprint Start sprint from Task Decomposition runtime truth after previous sprint merge+done gate passes", + "ready-sprint Post sprint-ready comment for main-agent review before merge", + "accept-sprint Enforce merged-PR gate, sync sprint status=done, then post accepted comment", + "multi-sprint-guide Print the full repeated command flow for a plan (1 plan = 1 issue)", + "completion Export shell completion script", + ] { assert!( - out.stdout.contains(&description), - "help output missing description `{description}`\n{}", + out.stdout.contains(token), + "help output missing token `{token}`\n{}", out.stdout ); }