Skip to content

[Automated] Update podman CLI Options - #3970

Open
thomhurst wants to merge 7 commits into
mainfrom
automated/update-cli-options-podman
Open

[Automated] Update podman CLI Options#3970
thomhurst wants to merge 7 commits into
mainfrom
automated/update-cli-options-podman

Conversation

@thomhurst

@thomhurst thomhurst commented Aug 16, 2026

Copy link
Copy Markdown
Owner

Summary

This PR contains automatically generated updates to podman CLI options classes.

The generator scraped the latest CLI help output from the installed tool.

Changes

  • Updated options classes to reflect latest CLI documentation
  • Added new commands if any were detected
  • Updated option types and descriptions

Command coverage

Command coverage report:

  • podman (podman version 5.8.4): 238 commands, tree 9da9e7056096e91daa5877f559082f50231388743c878114978035370d2dfc3f
    • Added: podman artifact add, podman artifact extract, podman artifact inspect, podman artifact ls, podman artifact pull, podman artifact push, podman artifact rm, podman machine cp, podman machine reset, podman quadlet install, podman quadlet list, podman quadlet print, podman quadlet rm, podman system check

Verification

  • Solution builds successfully
  • API compatibility gate: failure

🤖 Generated with ModularPipelines.OptionsGenerator

Summary by CodeRabbit

  • New Features

    • Added Podman CLI reference entries for artifact, machine, quadlet, and system check commands.
    • Improved generated Podman command options, positional arguments, and compatibility handling for renamed or deprecated properties.
    • Added support for scalar-to-collection and nullable integer-to-string compatibility conversions.
  • Bug Fixes

    • Improved parsing of credential options, optional files, variadic operands, artifact paths, output settings, and timestamps.
  • Tests

    • Expanded coverage for Podman CLI scraping and compatibility-property generation.

@thomhurst thomhurst added automated dependencies Pull requests that update a dependency file labels Aug 16, 2026
@coderabbitai

coderabbitai Bot commented Aug 16, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 312a85ba-d571-40a4-8264-1bd92ad35ac4

📥 Commits

Reviewing files that changed from the base of the PR and between 8a831c7 and 045521c.

⛔ Files ignored due to path filters (89)
  • src/ModularPipelines.Podman/Extensions/PodmanExtensions.Generated.cs is excluded by !**/*.generated.*
  • src/ModularPipelines.Podman/Generated/Podman.CommandCoverage.json is excluded by !**/generated/**
  • src/ModularPipelines.Podman/Options/PodmanArtifactAddOptions.Generated.cs is excluded by !**/*.generated.*
  • src/ModularPipelines.Podman/Options/PodmanArtifactExtractOptions.Generated.cs is excluded by !**/*.generated.*
  • src/ModularPipelines.Podman/Options/PodmanArtifactInspectOptions.Generated.cs is excluded by !**/*.generated.*
  • src/ModularPipelines.Podman/Options/PodmanArtifactLsOptions.Generated.cs is excluded by !**/*.generated.*
  • src/ModularPipelines.Podman/Options/PodmanArtifactPullOptions.Generated.cs is excluded by !**/*.generated.*
  • src/ModularPipelines.Podman/Options/PodmanArtifactPushOptions.Generated.cs is excluded by !**/*.generated.*
  • src/ModularPipelines.Podman/Options/PodmanArtifactRmOptions.Generated.cs is excluded by !**/*.generated.*
  • src/ModularPipelines.Podman/Options/PodmanBuildOptions.Generated.cs is excluded by !**/*.generated.*
  • src/ModularPipelines.Podman/Options/PodmanContainerCreateOptions.Generated.cs is excluded by !**/*.generated.*
  • src/ModularPipelines.Podman/Options/PodmanContainerExecOptions.Generated.cs is excluded by !**/*.generated.*
  • src/ModularPipelines.Podman/Options/PodmanContainerRestoreOptions.Generated.cs is excluded by !**/*.generated.*
  • src/ModularPipelines.Podman/Options/PodmanContainerRunOptions.Generated.cs is excluded by !**/*.generated.*
  • src/ModularPipelines.Podman/Options/PodmanContainerRunlabelOptions.Generated.cs is excluded by !**/*.generated.*
  • src/ModularPipelines.Podman/Options/PodmanContainerStartOptions.Generated.cs is excluded by !**/*.generated.*
  • src/ModularPipelines.Podman/Options/PodmanContainerUpdateOptions.Generated.cs is excluded by !**/*.generated.*
  • src/ModularPipelines.Podman/Options/PodmanContainerWaitOptions.Generated.cs is excluded by !**/*.generated.*
  • src/ModularPipelines.Podman/Options/PodmanCreateOptions.Generated.cs is excluded by !**/*.generated.*
  • src/ModularPipelines.Podman/Options/PodmanExecOptions.Generated.cs is excluded by !**/*.generated.*
  • src/ModularPipelines.Podman/Options/PodmanFarmBuildOptions.Generated.cs is excluded by !**/*.generated.*
  • src/ModularPipelines.Podman/Options/PodmanGenerateKubeOptions.Generated.cs is excluded by !**/*.generated.*
  • src/ModularPipelines.Podman/Options/PodmanImageBuildOptions.Generated.cs is excluded by !**/*.generated.*
  • src/ModularPipelines.Podman/Options/PodmanImageListOptions.Generated.cs is excluded by !**/*.generated.*
  • src/ModularPipelines.Podman/Options/PodmanImagePruneOptions.Generated.cs is excluded by !**/*.generated.*
  • src/ModularPipelines.Podman/Options/PodmanImagePullOptions.Generated.cs is excluded by !**/*.generated.*
  • src/ModularPipelines.Podman/Options/PodmanImagePushOptions.Generated.cs is excluded by !**/*.generated.*
  • src/ModularPipelines.Podman/Options/PodmanImageSearchOptions.Generated.cs is excluded by !**/*.generated.*
  • src/ModularPipelines.Podman/Options/PodmanImagesOptions.Generated.cs is excluded by !**/*.generated.*
  • src/ModularPipelines.Podman/Options/PodmanKubeDownOptions.Generated.cs is excluded by !**/*.generated.*
  • src/ModularPipelines.Podman/Options/PodmanKubeGenerateOptions.Generated.cs is excluded by !**/*.generated.*
  • src/ModularPipelines.Podman/Options/PodmanKubePlayOptions.Generated.cs is excluded by !**/*.generated.*
  • src/ModularPipelines.Podman/Options/PodmanMachineCpOptions.Generated.cs is excluded by !**/*.generated.*
  • src/ModularPipelines.Podman/Options/PodmanMachineInitOptions.Generated.cs is excluded by !**/*.generated.*
  • src/ModularPipelines.Podman/Options/PodmanMachineListOptions.Generated.cs is excluded by !**/*.generated.*
  • src/ModularPipelines.Podman/Options/PodmanMachineResetOptions.Generated.cs is excluded by !**/*.generated.*
  • src/ModularPipelines.Podman/Options/PodmanMachineRmOptions.Generated.cs is excluded by !**/*.generated.*
  • src/ModularPipelines.Podman/Options/PodmanManifestAddOptions.Generated.cs is excluded by !**/*.generated.*
  • src/ModularPipelines.Podman/Options/PodmanManifestAnnotateOptions.Generated.cs is excluded by !**/*.generated.*
  • src/ModularPipelines.Podman/Options/PodmanManifestCreateOptions.Generated.cs is excluded by !**/*.generated.*
  • src/ModularPipelines.Podman/Options/PodmanManifestPushOptions.Generated.cs is excluded by !**/*.generated.*
  • src/ModularPipelines.Podman/Options/PodmanManifestRemoveOptions.Generated.cs is excluded by !**/*.generated.*
  • src/ModularPipelines.Podman/Options/PodmanManifestRmOptions.Generated.cs is excluded by !**/*.generated.*
  • src/ModularPipelines.Podman/Options/PodmanPodCloneOptions.Generated.cs is excluded by !**/*.generated.*
  • src/ModularPipelines.Podman/Options/PodmanPodCreateOptions.Generated.cs is excluded by !**/*.generated.*
  • src/ModularPipelines.Podman/Options/PodmanPullOptions.Generated.cs is excluded by !**/*.generated.*
  • src/ModularPipelines.Podman/Options/PodmanPushOptions.Generated.cs is excluded by !**/*.generated.*
  • src/ModularPipelines.Podman/Options/PodmanQuadletInstallOptions.Generated.cs is excluded by !**/*.generated.*
  • src/ModularPipelines.Podman/Options/PodmanQuadletListOptions.Generated.cs is excluded by !**/*.generated.*
  • src/ModularPipelines.Podman/Options/PodmanQuadletPrintOptions.Generated.cs is excluded by !**/*.generated.*
  • src/ModularPipelines.Podman/Options/PodmanQuadletRmOptions.Generated.cs is excluded by !**/*.generated.*
  • src/ModularPipelines.Podman/Options/PodmanRunOptions.Generated.cs is excluded by !**/*.generated.*
  • src/ModularPipelines.Podman/Options/PodmanSearchOptions.Generated.cs is excluded by !**/*.generated.*
  • src/ModularPipelines.Podman/Options/PodmanSecretCreateOptions.Generated.cs is excluded by !**/*.generated.*
  • src/ModularPipelines.Podman/Options/PodmanSecretLsOptions.Generated.cs is excluded by !**/*.generated.*
  • src/ModularPipelines.Podman/Options/PodmanStartOptions.Generated.cs is excluded by !**/*.generated.*
  • src/ModularPipelines.Podman/Options/PodmanSystemCheckOptions.Generated.cs is excluded by !**/*.generated.*
  • src/ModularPipelines.Podman/Options/PodmanSystemConnectionAddOptions.Generated.cs is excluded by !**/*.generated.*
  • src/ModularPipelines.Podman/Options/PodmanSystemMigrateOptions.Generated.cs is excluded by !**/*.generated.*
  • src/ModularPipelines.Podman/Options/PodmanSystemPruneOptions.Generated.cs is excluded by !**/*.generated.*
  • src/ModularPipelines.Podman/Options/PodmanSystemServiceOptions.Generated.cs is excluded by !**/*.generated.*
  • src/ModularPipelines.Podman/Options/PodmanUpdateOptions.Generated.cs is excluded by !**/*.generated.*
  • src/ModularPipelines.Podman/Options/PodmanVolumeCreateOptions.Generated.cs is excluded by !**/*.generated.*
  • src/ModularPipelines.Podman/Options/PodmanVolumeExportOptions.Generated.cs is excluded by !**/*.generated.*
  • src/ModularPipelines.Podman/Options/PodmanWaitOptions.Generated.cs is excluded by !**/*.generated.*
  • src/ModularPipelines.Podman/Services/IPodman.Generated.cs is excluded by !**/*.generated.*
  • src/ModularPipelines.Podman/Services/IPodmanArtifact.Generated.cs is excluded by !**/*.generated.*
  • src/ModularPipelines.Podman/Services/IPodmanCompose.Generated.cs is excluded by !**/*.generated.*
  • src/ModularPipelines.Podman/Services/IPodmanContainer.Generated.cs is excluded by !**/*.generated.*
  • src/ModularPipelines.Podman/Services/IPodmanFarm.Generated.cs is excluded by !**/*.generated.*
  • src/ModularPipelines.Podman/Services/IPodmanGenerate.Generated.cs is excluded by !**/*.generated.*
  • src/ModularPipelines.Podman/Services/IPodmanHealthcheck.Generated.cs is excluded by !**/*.generated.*
  • src/ModularPipelines.Podman/Services/IPodmanImage.Generated.cs is excluded by !**/*.generated.*
  • src/ModularPipelines.Podman/Services/IPodmanKube.Generated.cs is excluded by !**/*.generated.*
  • src/ModularPipelines.Podman/Services/IPodmanMachine.Generated.cs is excluded by !**/*.generated.*
  • src/ModularPipelines.Podman/Services/IPodmanManifest.Generated.cs is excluded by !**/*.generated.*
  • src/ModularPipelines.Podman/Services/IPodmanNetwork.Generated.cs is excluded by !**/*.generated.*
  • src/ModularPipelines.Podman/Services/IPodmanPod.Generated.cs is excluded by !**/*.generated.*
  • src/ModularPipelines.Podman/Services/IPodmanQuadlet.Generated.cs is excluded by !**/*.generated.*
  • src/ModularPipelines.Podman/Services/IPodmanSecret.Generated.cs is excluded by !**/*.generated.*
  • src/ModularPipelines.Podman/Services/IPodmanSystem.Generated.cs is excluded by !**/*.generated.*
  • src/ModularPipelines.Podman/Services/IPodmanVolume.Generated.cs is excluded by !**/*.generated.*
  • src/ModularPipelines.Podman/Services/Podman.Generated.cs is excluded by !**/*.generated.*
  • src/ModularPipelines.Podman/Services/PodmanArtifact.Generated.cs is excluded by !**/*.generated.*
  • src/ModularPipelines.Podman/Services/PodmanKube.Generated.cs is excluded by !**/*.generated.*
  • src/ModularPipelines.Podman/Services/PodmanMachine.Generated.cs is excluded by !**/*.generated.*
  • src/ModularPipelines.Podman/Services/PodmanManifest.Generated.cs is excluded by !**/*.generated.*
  • src/ModularPipelines.Podman/Services/PodmanQuadlet.Generated.cs is excluded by !**/*.generated.*
  • src/ModularPipelines.Podman/Services/PodmanSystem.Generated.cs is excluded by !**/*.generated.*
📒 Files selected for processing (8)
  • docs/docs/mp-packages/cli/podman.md
  • tools/ModularPipelines.OptionsGenerator/src/ModularPipelines.OptionsGenerator.Tests/Generators/GeneratorHardeningTests.cs
  • tools/ModularPipelines.OptionsGenerator/src/ModularPipelines.OptionsGenerator.Tests/Scrapers/Cli/CliScraperTraversalTests.cs
  • tools/ModularPipelines.OptionsGenerator/src/ModularPipelines.OptionsGenerator/External/ExternalToolDefinitionLoader.cs
  • tools/ModularPipelines.OptionsGenerator/src/ModularPipelines.OptionsGenerator/Generators/OptionsClassGenerator.cs
  • tools/ModularPipelines.OptionsGenerator/src/ModularPipelines.OptionsGenerator/Models/CliCommandDefinition.cs
  • tools/ModularPipelines.OptionsGenerator/src/ModularPipelines.OptionsGenerator/Scrapers/Cli/CobraCliScraper.cs
  • tools/ModularPipelines.OptionsGenerator/src/ModularPipelines.OptionsGenerator/Scrapers/Cli/PodmanCliScraper.cs

Included review availability: Your plan includes up to 3 reviews per rolling hour; 0 remain after this review.


📝 Walkthrough

Walkthrough

The OptionsGenerator now supports typed compatibility forwarding and Podman-specific CLI corrections. The change adds scraper extension hooks, improves positional argument metadata, expands generated compatibility properties, adds tests, and documents additional Podman commands.

Changes

Podman CLI compatibility generation

Layer / File(s) Summary
Compatibility forwarding contracts and generation
tools/ModularPipelines.OptionsGenerator/src/ModularPipelines.OptionsGenerator/Models/CliCommandDefinition.cs, .../External/ExternalToolDefinitionLoader.cs, .../Generators/OptionsClassGenerator.cs
The generator defines direct, scalar-to-collection, and nullable-int-to-string forwarding. It validates supported type combinations and emits corresponding getters and setters.
Podman scraper integration
tools/ModularPipelines.OptionsGenerator/src/ModularPipelines.OptionsGenerator/Scrapers/Cli/CobraCliScraper.cs, .../PodmanCliScraper.cs
The scraper adds option-fix and compatibility hooks. The Podman scraper remaps options, configures positional arguments, and supplies command-specific compatibility properties.
Behavior coverage and CLI reference
tools/ModularPipelines.OptionsGenerator/src/ModularPipelines.OptionsGenerator.Tests/Generators/GeneratorHardeningTests.cs, .../Tests/Scrapers/Cli/CliScraperTraversalTests.cs, docs/docs/mp-packages/cli/podman.md
Tests cover forwarding, option classification, positional arguments, compatibility properties, and stable names. The reference adds artifact, machine, quadlet, and system command mappings.

Estimated code review effort: 3 (Moderate) | ~25 minutes

Merge Risk: 🟡 Moderate · up to 04552

This update changes generated Podman command and option APIs, but the API compatibility gate is failing, which may break existing consumers; merge should wait until the failure is resolved or explicitly accepted. The documentation build should also be validated.

Possibly related issues

Possibly related PRs

Poem

A rabbit checks each flag in line,
Old names forward, new types align.
Paths and timestamps safely flow,
Podman commands now clearly show.
Tests hop lightly through the gate.
“Good build!” says Bunny—“Ship it straight!” 🐇

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 16.67% 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 clearly summarizes the main change: updating the Podman CLI options and related generated support.
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.
✨ Finishing Touches 💡 1
📝 Generate docstrings 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch automated/update-cli-options-podman

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

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 8ef7582bcc

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/ModularPipelines.Podman/Options/PodmanKubeDownOptions.Generated.cs Outdated
Comment thread src/ModularPipelines.Podman/Options/PodmanArtifactRmOptions.Generated.cs Outdated
@claude

claude Bot commented Aug 16, 2026

Copy link
Copy Markdown

Review: [Automated] Update podman CLI Options (#3970)

This is an auto-generated PR from ModularPipelines.OptionsGenerator bumping the scraped podman CLI surface from 4.9.3 → 5.8.4 (224 → 238 commands). Per repo conventions, the touched files are all .Generated.cs/generated docs, so there's no hand-written logic to critique — I focused on whether the generator's output is internally consistent and whether anything here needs human judgment before merge.

⚠️ Worth flagging before merge: this PR failed the API compatibility gate

The PR description reports API compatibility gate: **failure**, and per .github/workflows/generate-cli-options.yml that means auto-merge was deliberately not enabled for this PR — it's waiting on a human. I traced the actual break:

  • PodmanGenerateKubeOptions and PodmanKubeGenerateOptions both drop the NoTrunc property (--no-trunc).
  • PodmanMachineRmOptions drops the SaveKeys property (--save-keys).

These are all real removals from upstream podman between 4.9.3 and 5.8.4 (not generator bugs — the flags are genuinely gone from --help in 5.8.4), so regenerating correctly produces a breaking change here. Since these are public record properties, any consumer code setting them (e.g. new PodmanMachineRmOptions { SaveKeys = true }) will fail to compile after this merges. Given this repo gates major-version bumps behind explicit approval (approve-api-breaking-changes), this PR should probably go through that path (or at minimum get a deliberate "yes, breaking, that's fine" sign-off) rather than being merged as routine automation — right now it's just sitting unmerged with no visible acknowledgment of the break.

Everything else checks out

  • New podman artifact, podman quadlet, podman machine cp/reset, and podman system check commands are wired consistently with the existing pattern: options record → interface method (with the now-standard => throw new NotSupportedException() default body) → concrete service implementation → DI registration in PodmanExtensions.Generated.cs → docs table entry.
  • Podman.CommandCoverage.json: the new command count (238) and the list of added commands match exactly what's listed in the PR description and the new option/service files — no silent drops.
  • Spot-checked several modified option classes (PodmanBuildOptions, PodmanContainerRunOptions, PodmanRunOptions, etc.) — additions look like straightforward new flags picked up from the newer CLI, nothing structurally odd.
  • Wasn't able to do a local build in this sandbox (SDK 10.0.400 pinned in global.json isn't installed here), but the PR checklist already reports a successful solution build, and CI's "Build solution to verify changes" step covers this independently of my review.

Recommendation: hold merge until someone explicitly confirms the NoTrunc/SaveKeys removal is an acceptable breaking change for a minor/patch release (or route it through the approve-api-breaking-changes workflow input so the gate reflects that decision). No other issues found — the generated output itself looks correct and consistent.

@thomhurst

Copy link
Copy Markdown
Owner Author

Addressed the review findings in ee5fae1.

The Podman scraper now:

  • emits artifact rm and quadlet rm operands as optional variadic collections, allowing operandless --all invocations;
  • normalizes kube down/play KUBEFILE operands to optional IEnumerable? properties;
  • retains the removed NoTrunc and SaveKeys public properties as obsolete, no-effect compatibility members so this generated update does not remove the existing API.

The seven affected generated option files were regenerated through OptionsClassGenerator, not edited by hand.

Validation:

  • focused Podman scraper regressions: 7/7 passed
  • OptionsGenerator Release build: passed, 0 warnings/errors
  • targeted dotnet format verification: passed
  • narrowed ModularPipelines.Podman compile: passed, 0 warnings/errors
  • generated output: deterministic across repeated targeted regeneration

The broader Podman solution/project builds reached the repository agent memory guard (exit 137) after restore, so I did not retry them with higher limits.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: ee5fae1a55

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/ModularPipelines.Podman/Options/PodmanArtifactAddOptions.Generated.cs Outdated
@claude

claude Bot commented Aug 16, 2026

Copy link
Copy Markdown

Review: follow-up on ee5fae1

Re-reviewed against the earlier finding (the NoTrunc/SaveKeys breaking removal flagged in my previous comment). That's been addressed correctly:

  • PodmanCliScraper now exposes GetCompatibilityProperties(commandParts), which CobraCliScraper.ParseCommandAsync calls to inject obsolete, no-effect stub properties (NoTrunc on generate kube/kube generate, SaveKeys on machine rm) so the previously-removed flags stay source-compatible instead of being a breaking change. This mirrors the existing DotNetCliCompatibility pattern already used elsewhere in the generator, so it's reuse of an established idiom rather than a new mechanism.
  • artifact rm / quadlet rm operands are now emitted as optional variadic collections (via SetOptionalVariadic), and kube down / kube play KUBEFILE operands are normalized to optional IEnumerable<string>? — both correctly restore the operandless / multi-value invocation shapes that existed pre-regen.
  • Traced GetCompatibilityProperties(commandParts)'s commandParts convention against the pre-existing ApplyPositionalArgumentFixes — same tool-name-stripped, space-joined convention, so the new switch cases ("generate kube", "kube generate", "machine rm", "kube down", "kube play", "artifact rm", "quadlet rm") match correctly.
  • usage.PositionalArguments is deduplicated by CliPositionalArgument.MergeDuplicates before these fixups run, so the new tests' .Single() assumptions and SetOptionalVariadic's positionalArguments[0] indexing are safe.
  • The seven regenerated .Generated.cs files match what the generator would produce from this logic, and no code in the repo references the removed primary constructor or old property names, so this isn't a breaking change to any in-repo consumer.
  • GetCompatibilityProperties defaults to [] in the base CobraCliScraper, so this is scoped to Podman only — no other Cobra-based scraper (Docker, kubectl, Helm, etc.) is affected.
  • New CliScraperTraversalTests cases exercise the new behavior and match the generator's actual output.

No remaining issues. This looks correct and ready to merge from a code standpoint.

🤖 Generated with Claude Code

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 2360b83048

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/ModularPipelines.Podman/Services/PodmanArtifact.Generated.cs
Comment thread src/ModularPipelines.Podman/Services/PodmanArtifact.Generated.cs

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 8befd42631

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +44 to +45
[CliOption("--image", Format = OptionFormat.EqualsSeparated)]
public string? Image { get; set; }

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Preserve the machine-init compatibility properties

When consumers upgrade while using PodmanMachineInitOptions.ImagePath, replacing it outright with Image breaks source compilation and can cause MissingMethodException for already-compiled consumers; VolumeDriver is likewise removed from this record without a shim. Since this patch already retains removed NoTrunc and SaveKeys members, add a forwarding ImagePath compatibility property and an obsolete no-effect VolumeDriver property in the Podman scraper, then regenerate the options class.

AGENTS.md reference: AGENTS.md:L164-L168

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

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

Fixed in 46e6b6585e. PodmanCliScraper now supplies machine init compatibility metadata so ImagePath forwards to Image and VolumeDriver remains as an obsolete no-effect property; PodmanMachineInitOptions.Generated.cs was regenerated through OptionsClassGenerator rather than edited as the source of truth.

Validation:

  • focused machine-init scraper regression: 1/1 passed
  • full OptionsGenerator suite: 823/823 passed
  • OptionsGenerator Release build: 0 warnings/errors
  • scoped formatting: passed, including the regenerated Podman record
  • Podman solution/project builds reached the repository's fixed 2 GB agent guard after compiling core dependencies, so I did not raise the limit; CI will complete that gate

@claude

claude Bot commented Aug 17, 2026

Copy link
Copy Markdown

Code review

Re-reviewed the commits added since my last pass (ee5fae1a558befd426): 2360b830 (support multiple artifact paths), 2d484336 (mark Creds as secret), 8befd426 (preserve generated API compatibility for kube play).

No issues found. These changes look correct and are well-covered:

  • PodmanCliScraper.ApplyPositionalArgumentFixes was refactored from the old SetOptionalVariadic/SetRequiredCount pair into a single SetPositionalArgument/ConfigurePositionalArgument implementation that can target an arbitrary positional index and optionally rename/re-type it. This correctly fixes the earlier kube play bug where fixing up the KUBEFILE operand would silently clobber the second INPUT operand (now covered by Podman_Kube_File_Fix_Preserves_Additional_Parsed_Operands).
  • artifact add's PATH operand is now generated as a required variadic IEnumerable<string> (index 1), matching upstream's support for adding multiple paths per artifact; covered by Podman_Artifact_Add_Accepts_Multiple_Paths.
  • artifact rm / quadlet rm now produce a fully-optional, variadic operand, and the corresponding RmAsync(options = null) signature change in IPodmanArtifact/IPodmanQuadlet falls naturally out of the pre-existing GeneratorUtils.BuildOptionsParameter logic (making the parameter optional when every property on the options record is optional) rather than being a special case — good reuse of an existing mechanism.
  • kube play gained the NoTrunc obsolete compatibility property (mirroring generate kube/kube generate), keeping this update source-compatible for existing consumers, consistent with the DotNetCliCompatibility pattern already used elsewhere.
  • Creds is now explicitly marked [SecretValue] via a scraper-level IsSecretOption override, since it doesn't match the generic secret-keyword heuristic in GeneratorUtils.IsSecretOption. Verified it doesn't collide with CredsHelper (exact Equals, not Contains), and covered by Podman_Creds_Option_Is_Secret.
  • All hand-written logic lives in the generator (PodmanCliScraper.cs) with the .Generated.cs files regenerated from it, per this repo's CLAUDE.md convention of never hand-editing generated options classes.

The earlier breaking-change concern (NoTrunc/SaveKeys removal) that I flagged in my first review was already addressed in ee5fae1a55 and remains correctly handled here. No new issues to raise.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 46e6b6585e

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

/// </summary>
[CliOption("--output", ShortForm = "-o", Format = OptionFormat.EqualsSeparated)]
public string? Output { get; set; }
public IEnumerable<string>? Output { get; set; }

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Preserve existing build option property types

When an application compiled against the previous package accesses Output, changing its getter/setter signature from string to IEnumerable<string> causes a MissingMethodException; source consumers assigning a string also stop compiling. The same regression occurs for the Timestamp change from int? to string? in PodmanBuildOptions, PodmanImageBuildOptions, and PodmanFarmBuildOptions. Keep the existing properties and expose broader CLI values through compatibility additions generated by the scraper.

AGENTS.md reference: AGENTS.md:L164-L168

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

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

Fixed in 045521c. The Podman scraper now emits the broader CLI-bound Outputs and TimestampValue properties while generating obsolete forwarding aliases with the original Output:string? and Timestamp:int? signatures. The aliases convert scalar-to-collection and nullable-int-to-invariant-string without creating duplicate switches; all three generated build records were regenerated. Full OptionsGenerator tests pass 833/833 and its Release build is clean (0 warnings/errors). The Podman build compiled core dependencies before reaching the fixed 2 GB local guard at 2103 MB; the cap was not raised.

[CliSubCommand("inspect")]
public record PodmanInspectOptions(
[property: CliArgument(0, Phase = CommandLinePhase.Passthrough, Required = true)] IEnumerable<string> Container
[property: CliArgument(0, Phase = CommandLinePhase.Passthrough, Required = true)] IEnumerable<string> Artifact

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Retain existing positional property names

When consumers upgrade while reading PodmanInspectOptions.Container or using that constructor parameter by name, renaming the synthesized property to Artifact breaks source compatibility and compiled property access; the command still accepts containers, so the new name is also misleading. The same generated rename affects Image in manifest add/annotate/remove. Preserve the previous names or emit forwarding compatibility properties from the generator.

AGENTS.md reference: AGENTS.md:L164-L168

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

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

Fixed in 045521c. Podman positional metadata is now normalized back to the established CLR names: Container for inspect and Image for manifest add/annotate/remove, while retaining the current CLI cardinality and operand behavior. The seven affected generated records were regenerated from Podman 5.8.4; focused traversal coverage includes all four renamed commands, and the full OptionsGenerator suite passes 833/833.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 045521c88b

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

/// <summary>
/// Gets the artifact sub-domain service.
/// </summary>
IPodmanArtifact Artifact { get; }

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Provide defaults for new sub-domain getters

When a consumer supplies its own IPodman implementation, upgrading now fails with CS0535 because the new Artifact and Quadlet getters are abstract. The regenerated command methods below deliberately use default interface bodies to preserve implementors, so generate equivalent throwing getter bodies for both new sub-domains in ServiceInterfaceGenerator and regenerate this file.

AGENTS.md reference: AGENTS.md:L164-L168

Useful? React with 👍 / 👎.

@claude

claude Bot commented Aug 17, 2026

Copy link
Copy Markdown

Code review: 8befd42045521c

Re-reviewed the full state of the PR (diffed against merge-base 8a831c706), including the two newest commits (46e6b6585 machine init API preservation, 045521c88 general option API preservation). The prior review's finding (NoTrunc/SaveKeys breaking removal) remains addressed. This PR is well covered — the new CliScraperTraversalTests map ~1:1 onto each scraper fixup, and I cross-checked dozens of the ~90 regenerated files against the scraper logic without finding a currently-manifesting bug.

One structural gap is worth fixing before this pattern gets copied to the next CLI-scraped tool:

Compatibility-property forwarding has no validation on the CLI-scraper path (design gap)

PodmanCliScraper.cs (GetCompatibilityProperties, ~L65-92) hardcodes ForwardToPropertyName values (e.g. OutputOutputs, TimestampTimestampValue, ImagePathImage), and ApplyOptionFixes (~L216-233) independently decides — via string-matched command/property switches — which properties actually get renamed in the generated options class. These two mappings have no shared source of truth.

For JSON-defined external tools, this exact class of mismatch is caught at generation time: ExternalToolDefinitionLoader.Validate()ValidateCompatibilityMetadataValidateCompatibilityProperty (External/ExternalToolDefinitionLoader.cs ~L77-121, ~L474-479, ~L534-560) checks that a ForwardToPropertyName target actually exists, is writable, and is type-compatible before code gets emitted. That validation is wired into CodeGeneratorOrchestrator.GenerateFromDefinitionAsync only — the CLI-scraper path (ProcessCliOnlyScrapersAsyncGenerateFromCliAsyncGenerateForToolAsync) never calls it. OptionsClassGenerator.GenerateCompatibilityProperty emits get => {ForwardToPropertyName}?.FirstOrDefault(); straight from the string with no existence/type check.

Why this matters: if a future podman release changes help-text wording so ApplyOptionFixes's string match stops firing, GetCompatibilityProperties still claims ForwardToPropertyName = "Outputs", and the generator emits a getter referencing a property that no longer exists — a raw C# compile error in ModularPipelines.Podman with nothing pointing back at the scraper mismatch that caused it. The JSON-tool path would catch the equivalent drift immediately at generation time with a clear message.

Suggested fix: route CLI-scraped commands through the same ValidateCompatibilityMetadata/ValidateCompatibilityProperty check used for JSON-defined tools (or extract it into a shared validator both paths call) before OptionsClassGenerator emits compatibility-property code. That turns a silent future drift into a fast, actionable generation-time failure instead of a mystery compile error, and keeps the two scraper mappings honest against each other going forward.

Minor, lower-confidence (not blocking)

RenamePositionalArgument/SetPositionalArgument (PodmanCliScraper.cs ~L255) silently no-op when positionalArguments.Count <= index rather than failing loudly. Not observably wrong for any command scraped today (verified against generated output), but if a future podman release drops an operand, the intended fix silently stops applying with no warning — same "quiet drift, no diagnostic" shape as the finding above. Worth at least a Debug.Assert/log if not a hard failure, given the pattern already established elsewhere in this PR of surfacing scraper assumptions loudly.

No other correctness issues found in this pass.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

automated dependencies Pull requests that update a dependency file

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant