Skip to content

Add URL feed detail flags#265

Merged
axisrow merged 1 commit into
feat/issue-239-optional-fields-gatefrom
codex/issue-253-feeds-urlfeed-fields
May 24, 2026
Merged

Add URL feed detail flags#265
axisrow merged 1 commit into
feat/issue-239-optional-fields-gatefrom
codex/issue-253-feeds-urlfeed-fields

Conversation

@axisrow

@axisrow axisrow commented May 24, 2026

Copy link
Copy Markdown
Owner

Summary\n- add typed feeds add/update flags for UrlFeed.RemoveUtmTags, UrlFeed.Login, and UrlFeed.Password\n- keep FileFeed upload/base64 support out of patch scope and link those WSDL rows to follow-up #264\n- update dry-run tests, WSDL parity audit, and single-line README examples\n\n## Docs\n- Official Yandex Direct Feeds.add: https://yandex.ru/dev/direct/doc/en/feeds/add\n- Official Yandex Direct Feeds.update: https://yandex.ru/dev/direct/doc/en/feeds/update\n\n## Verification\n- python3 -m pytest tests/test_dry_run.py -k "feeds and (urlfeed or without_fields)"\n- python3 -m pytest tests/test_wsdl_parity_gate.py\n- python3 -m pytest tests/test_cli.py tests/test_dry_run.py tests/test_wsdl_parity_gate.py\n\nCloses #253.

Copilot AI review requested due to automatic review settings May 24, 2026 04:42
@axisrow

axisrow commented May 24, 2026

Copy link
Copy Markdown
Owner Author

@codex @claude review. Focus on critical issues: bugs, security vulnerabilities, logical errors, data loss risks, performance problems, CLI contract violations, WSDL/API mismatch, and issue-scope gaps. Do NOT nitpick style, naming conventions, minor formatting, or subjective preferences; only flag issues that could break functionality, violate the public CLI contract, or make issue #253 incomplete.

@claude

claude Bot commented May 24, 2026

Copy link
Copy Markdown

Claude finished @axisrow's task in 2m 42s —— View job


Code Review — PR #265 (URL feed detail flags)

Scoped to critical issues only (bugs, security, logical errors, CLI contract, WSDL/API mismatch, issue-scope gaps), per the request.

Verdict

No blocking issues. The change correctly implements UrlFeed.RemoveUtmTags, UrlFeed.Login, UrlFeed.Password for feeds add/feeds update, preserves the empty-subtype UsageError gate, and properly defers FileFeed to follow-up #264. WSDL parity audit counts and per-field statuses are coherent.

Checks performed

  • PR diff against origin/feat/issue-239-optional-fields-gate
  • direct_cli/commands/feeds.pyadd / update semantics
  • tests/test_dry_run.py — add/update payload tests + UsageError tightening
  • tests/test_wsdl_parity_gate.pyOPTIONAL_FIELD_CLI_OPTIONS + audit follow-ups
  • tests/WSDL_OPTIONAL_FIELD_AUDIT.md — status flips and counts
  • Issue-scope cross-check (UrlFeed in scope; FileFeed deferred)

Findings

1. No critical bugs. The helper _url_feed_payload at direct_cli/commands/feeds.py:17-32 correctly conditions each subfield on truthiness, and the update handler at feeds.py:164-171 still raises click.UsageError when no field besides Id is provided — so the parity gate's "empty subtype no-op" invariant (CLAUDE.md, gate #1) is preserved.

2. WSDL parity is internally consistent. Audit counts shift missing_followup: 2823 → 2817 and supported: 418 → 424 (net +6 supported), matching exactly the six rows flipped (3 UrlFeed.* under feeds.add, 3 under feeds.update). The WSDL_FIELD_TO_CLI_OPTION mapping additions at tests/test_wsdl_parity_gate.py:800-808 align with the audit, and the FileFeed follow-up rows correctly cite #264.

3. feeds add empty-UrlFeed impossible by construction. Because --url is required=True on add, the UrlFeed object always contains at least Url, so no silent empty subtype can leak. ✅

4. feeds update allows UrlFeed updates without --url. This is intentional and matches the WSDL (UrlFeedUpdate.Url is minOccurs=0). Tested by test_feeds_update_payload_accepts_urlfeed_details. No mismatch.

5. Minor (non-blocking) observations — flagged only because the request asks for any CLI-contract / API-mismatch surfaces, not as required changes:

  • No way to clear Login/Password. if login: / if password: skip both None and empty strings, so users cannot send an empty Login/Password to unset previously-stored credentials. Yandex Direct's update model is "omit to leave unchanged", so this is almost certainly correct — but if the WSDL allows clearing via empty string, it would be the only way to remove auth from a feed that previously had it. Worth confirming against the Yandex docs you linked; not necessary to fix in this PR.
  • remove_utm_tags.upper() is redundant. click.Choice(["YES", "NO"], case_sensitive=False) already normalizes the returned value to the canonical case in choices on Click ≥ 7.0. Harmless and matches the existing business_type.upper() style — keep for consistency.
  • --password echoed in dry-run JSON. Same surface as other credential-bearing dry-run payloads in the repo; consistent with current behavior, no regression.

6. Issue #253 scope. PR body and the audit both indicate FileFeed is split to #264. I was unable to verify #264 exists from the runner (no gh permissions here) — if it doesn't, the audit will silently link a dead reference and test_optional_field_audit_links_resolve (if present) could fail. Quick sanity check on your end: gh issue view 264 -R axisrow/direct-cli.

Conclusion

PR is ready w.r.t. the stated scope. No bugs, no security regressions, no data-loss risks, no WSDL mismatch, no CLI contract violations identified. Issue #253 (UrlFeed details) is fully addressed; FileFeed deferral to #264 is consistent across audit + parity gate.
· branch: codex/issue-253-feeds-urlfeed-fields

Copilot AI 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.

Pull request overview

This PR extends the feeds add/feeds update CLI surface to cover additional UrlFeed fields required for WSDL parity, while explicitly deferring FileFeed upload/base64 handling to follow-up issue #264.

Changes:

  • Add typed flags for UrlFeed.RemoveUtmTags, UrlFeed.Login, and UrlFeed.Password in direct feeds add/update.
  • Update dry-run tests and WSDL parity gate/audit classifications to mark these UrlFeed fields as supported and FileFeed as a tracked follow-up.
  • Refresh README single-line examples to include the new URL feed detail flags.

Reviewed changes

Copilot reviewed 5 out of 5 changed files in this pull request and generated 2 comments.

Show a summary per file
File Description
direct_cli/commands/feeds.py Adds new URL feed detail flags and builds UrlFeed payloads via a helper.
tests/test_dry_run.py Adds dry-run coverage for the new URL feed detail flags and updates the “missing fields” error expectation.
tests/test_wsdl_parity_gate.py Maps new WSDL optional paths to typed flags and records FileFeed as a deferred follow-up (#264).
tests/WSDL_OPTIONAL_FIELD_AUDIT.md Updates audit counts and reclassifies UrlFeed.* as supported; links FileFeed.* to #264.
README.md Updates one-line examples for feeds add/update to demonstrate the new flags.
Comments suppressed due to low confidence (5)

direct_cli/commands/feeds.py:101

  • --login here means UrlFeed.Login, but direct already has a top-level --login option for the Direct client login (see direct_cli/cli.py). Reusing the same flag name with a different meaning is easy to misread in scripts/docs; consider renaming to something explicit like --url-login / --feed-login (and updating parity mappings/tests accordingly).
@click.option("--login", help="UrlFeed.Login for protected feed URL")

direct_cli/commands/feeds.py:102

  • Accepting --password as a plain command-line option makes the credential visible in shell history and process listings, and --dry-run will print it verbatim. Consider supporting a safer input path (e.g., envvar-backed option and/or prompt=True, hide_input=True) and redacting the password in dry-run output by default.
@click.option("--password", help="UrlFeed.Password for protected feed URL")

direct_cli/commands/feeds.py:153

  • Same --login ambiguity as in feeds add: this flag name collides with the root direct --login (client login) but has a different meaning (UrlFeed.Login). Consider renaming to an explicit flag name to avoid accidental misuse.
@click.option("--login", help="UrlFeed.Login for protected feed URL")

direct_cli/commands/feeds.py:154

  • Same concern as in feeds add: --password is a secret and is exposed via shell history / ps, and will be echoed in --dry-run output. Consider envvar/prompt+hide_input support and redaction in dry-run output.
@click.option("--password", help="UrlFeed.Password for protected feed URL")

README.md:1235

  • Same as the English example: showing --password FEED_PASSWORD in docs encourages passing secrets via CLI args (visible in history/process list). Consider switching the example to an env var or omitting the password.
direct feeds add --name "Фид A" --url "https://example.com/feed.xml" --business-type RETAIL --remove-utm-tags YES --login feedbot --password FEED_PASSWORD --dry-run

Comment thread direct_cli/commands/feeds.py Outdated
Comment on lines +28 to +30
if login:
payload["Login"] = login
if password:
Comment thread README.md Outdated
direct creatives add --video-id video-id --dry-run
direct feeds add --name "Feed A" --url "https://example.com/feed.xml" --business-type RETAIL --dry-run
direct feeds update --id 18 --name "Feed A v2" --url "https://example.com/feed-v2.xml" --dry-run
direct feeds add --name "Feed A" --url "https://example.com/feed.xml" --business-type RETAIL --remove-utm-tags YES --login feedbot --password FEED_PASSWORD --dry-run

@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: 0ad395bc5d

ℹ️ 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 direct_cli/commands/feeds.py Outdated
Comment on lines +28 to +31
if login:
payload["Login"] = login
if password:
payload["Password"] = password

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 Add explicit nulling path for UrlFeed credentials

The new --login/--password support for feeds update cannot clear previously set credentials even though UrlFeedUpdate.Login and UrlFeedUpdate.Password are nillable in the Feeds API/WSDL. In _url_feed_payload, falsy values are dropped, so there is no CLI path that emits Login: null/Password: null (or equivalent clear semantics); users who need to remove auth after switching a feed to public access are stuck with stale credentials. Please add clear flags (for example --clear-login / --clear-password) or another explicit null mechanism so update parity with the API is complete.

Useful? React with 👍 / 👎.

@axisrow
axisrow force-pushed the codex/issue-253-feeds-urlfeed-fields branch from 0ad395b to bb84815 Compare May 24, 2026 04:53
@axisrow

axisrow commented May 24, 2026

Copy link
Copy Markdown
Owner Author

Addressed review feedback in bb84815: added explicit update-only --clear-login / --clear-password flags that serialize UrlFeed.Login/Password as null, reject conflicting set+clear flags, and removed password usage from README examples. Verification: python3 -m pytest tests/test_dry_run.py -k "feeds and (urlfeed or clear or without_fields)"; python3 -m pytest tests/test_wsdl_parity_gate.py; python3 -m pytest tests/test_cli.py tests/test_dry_run.py tests/test_wsdl_parity_gate.py.\n\n@codex @claude review. Focus on critical issues: bugs, security vulnerabilities, logical errors, data loss risks, performance problems, CLI contract violations, WSDL/API mismatch, and issue-scope gaps. Do NOT nitpick style, naming conventions, minor formatting, or subjective preferences; only flag issues that could break functionality, violate the public CLI contract, or make issue #253 incomplete.

@claude

claude Bot commented May 24, 2026

Copy link
Copy Markdown

Claude finished @axisrow's task in 2m 13s —— View job


Code Review — PR #265 (URL feed detail flags, follow-up commit bb84815)

Scoped to critical issues only.

Verdict

No blocking issues. The follow-up correctly implements the requested null-clearing path, the conflict guard, and the README scrub. Issue #253 scope (UrlFeed) is fully addressed; FileFeed is deferred to #264 consistently across audit + parity gate.

Todo

Findings

1. Clear-flag semantics correct. _url_feed_payload at direct_cli/commands/feeds.py:17-32 emits "Login": None / "Password": None only when the clear flag is true, falling back to the set value otherwise (if clear_login: … elif login: …). Dry-run output in test_feeds_update_payload_can_clear_urlfeed_credentials confirms the wire payload contains {"Login": None, "Password": None}, which tapi_yandex_direct serializes as JSON null — the only documented way to drop credentials on UrlFeedUpdate. ✅

2. Conflict guard correctly placed before payload build. feeds.py:179-184 raises click.UsageError for --login + --clear-login (and the password pair) before _url_feed_payload is called, so the contradictory combination cannot leak into the request. The guard uses login is not None (not truthiness) so even --login "" triggers the conflict path. ✅ Covered by test_feeds_update_rejects_setting_and_clearing_login. Note: the UsageError is then caught by the surrounding except Exception and re-raised as click.Abort() (exit code 1 instead of 2) — this matches the existing pattern for --name/--url empty validation in the same handler, so no regression vs. prior behavior.

3. Clear flags scoped to update only. add (feeds.py:99-120) does not expose --clear-login/--clear-password, and _url_feed_payload defaults clear_login=False, clear_password=False, so the add path can never emit a null for these fields. Correct — clearing makes no semantic sense on create.

4. Empty-subtype no-op gate preserved. The "provide at least one of …" message at feeds.py:201-204 now lists --clear-login and --clear-password, and test_feeds_update_without_fields_errors asserts both flag names appear in the error. The len(feed_data) == 1 guard still fires when nothing meaningful was passed. CLAUDE.md WSDL parity gate #1 (empty-subtype no-op) holds. ✅

5. WSDL parity audit deltas consistent. Counts shift missing_followup 2823→2817 (-6) and supported 418→424 (+6), matching the 6 row flips (3 UrlFeed.* × 2 ops). The mapping ("feeds","update","UrlFeed.Login"): {"--login", "--clear-login"} at tests/test_wsdl_parity_gate.py:806-807 (and the password equivalent) is correct — both flags resolve the same WSDL optional path, and set[str] membership is the audit's declared satisfaction model.

6. README scrub. Both EN (line 528) and RU (line 1235) one-liner examples no longer contain --password FEED_PASSWORD. They retain --login feedbot (non-secret), and the update example demonstrates --clear-login --clear-password — which is actually a better doc pattern than passing real credentials. ✅

7. Issue #253 scope. UrlFeed details (RemoveUtmTags, Login, Password — set and clear) are fully covered; FileFeed.* is consistently labeled as missing_followup linking #264 in both the follow-up table and the per-field audit. Cross-check passes. ⚠️ Sanity note (unchanged from prior review): I cannot verify #264 exists from this runner. Worth a quick gh issue view 264 -R axisrow/direct-cli if you have not already opened it — otherwise the audit links will be dead.

Non-blocking observations (no action required)

  • add still passes --password on the command line. Same surface as the rest of the repo (and now unused in the EN/RU docs), no regression. If a future hardening pass adds prompt=True, hide_input=True and an envvar fallback, doing it for clients update, etc. at the same time would be more consistent than one-off here.
  • _url_feed_payload still uses truthiness (if login:) for the set path. Empty string --login "" is silently dropped. This is fine because the clear flags now provide the explicit null path the API actually wants — empty-string ≠ null in Yandex's serializer, so dropping is the safer default. Not a regression.

Conclusion

PR fully addresses the Codex P2 feedback (explicit null path for credentials) and the Copilot security/UX feedback (README password scrub, conflict detection). No bugs, security regressions, data-loss risks, WSDL mismatch, or CLI contract violations identified. Issue #253 (UrlFeed details) is complete; FileFeed remains scoped to #264.

— branch: codex/issue-253-feeds-urlfeed-fields ·

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

ℹ️ 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 direct_cli/commands/feeds.py Outdated
type=click.Choice(_YES_NO, case_sensitive=False),
help="UrlFeed.RemoveUtmTags: delete UTM tags from feed links, YES or NO.",
)
@click.option("--login", help="UrlFeed.Login for protected feed URL")

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 Rename feed credential --login to avoid root-login collision

direct already defines a global --login for Client-Login (in direct_cli/cli.py), and this commit adds another --login on feeds add/update; with Click parsing, direct feeds update --id 9 --login client_a ... now binds that value to UrlFeed.Login instead of account selection. That turns a previously invalid invocation into a valid but semantically wrong request, which can execute against the default account and update the wrong tenant while also leaking the client login into feed credentials. Use a distinct flag name (for example, --url-login) to keep global account routing unambiguous.

Useful? React with 👍 / 👎.

@axisrow
axisrow force-pushed the codex/issue-253-feeds-urlfeed-fields branch from bb84815 to 7401bb3 Compare May 24, 2026 05:01
@axisrow

axisrow commented May 24, 2026

Copy link
Copy Markdown
Owner Author

Addressed the P1 CLI-contract review in 7401bb3: feed credentials now use --feed-login / --feed-password plus --clear-feed-login / --clear-feed-password, so they no longer collide with global direct --login. Also fixed the quality failure by annotating the UrlFeed payload dict for mypy. Verification: python3 -m pytest tests/test_dry_run.py -k "feeds and (urlfeed or clear or without_fields)"; python3 -m pytest tests/test_wsdl_parity_gate.py; mypy .; python3 -m pytest tests/test_cli.py tests/test_dry_run.py tests/test_wsdl_parity_gate.py.\n\n@codex @claude review. Focus on critical issues: bugs, security vulnerabilities, logical errors, data loss risks, performance problems, CLI contract violations, WSDL/API mismatch, and issue-scope gaps. Do NOT nitpick style, naming conventions, minor formatting, or subjective preferences; only flag issues that could break functionality, violate the public CLI contract, or make issue #253 incomplete.

@claude

claude Bot commented May 24, 2026

Copy link
Copy Markdown

Claude finished @axisrow's task in 2m 2s —— View job


Code Review — PR #265 (follow-up commit 7401bb3)

Scoped to critical issues only (bugs, security, logical errors, CLI contract, WSDL/API mismatch, issue-scope gaps).

Verdict

No blocking issues. The rename to --feed-login / --feed-password (+ --clear-feed-*) fully resolves the P1 global---login collision flagged by Codex. CLI contract, audit, parity gate, and README are internally consistent. Issue #253 (UrlFeed) is complete; FileFeed remains deferred to #264.

Todo

  • Fetch diff vs origin/feat/issue-239-optional-fields-gate
  • Read direct_cli/commands/feeds.py (renamed flags, conflict guard, mypy annotation)
  • Read tests/test_dry_run.py deltas
  • Read tests/test_wsdl_parity_gate.py mapping deltas
  • Read tests/WSDL_OPTIONAL_FIELD_AUDIT.md deltas
  • Read README.md example deltas
  • Cross-check P1 collision fully resolved (no remaining --login/--password on feeds)
  • Post review

Findings

1. P1 root-login collision fully resolved. direct_cli/cli.py:175 defines the root-level @click.option("--login", envvar="YANDEX_DIRECT_LOGIN") for Client-Login. The PR now uses --feed-login / --feed-password on feeds add (feeds.py:106-107) and feeds update (feeds.py:162-163), and --clear-feed-login / --clear-feed-password for the null path (feeds.py:164-167). grep confirms zero remaining --login / --password occurrences inside feeds.py. Click parses parent options before subcommand options, but having the same name on both still risks confusion in scripted invocations; the distinct prefix removes that ambiguity entirely. ✅

2. Conflict guard correct and exit code preserved. feeds.py:184-191 raises click.UsageError for --feed-login + --clear-feed-login (and password equivalent) before _url_feed_payload is built. The check is feed_login is not None and clear_feed_login, so even --feed-login "" triggers the conflict — empty-string cannot smuggle past the guard. The new except click.UsageError: raise clause at feeds.py:229-230 ensures the UsageError keeps Click's standard exit code 2 instead of being swallowed into click.Abort (exit code 1). That's an improvement over the v2 review's noted exit-code regression. ✅

3. Null-clearing semantics correct. _url_feed_payload (feeds.py:14-32) emits "Login": None / "Password": None only when the corresponding clear flag is true, falling back to the set value otherwise (if clear_login: … elif login: …). Dry-run test test_feeds_update_payload_can_clear_urlfeed_credentials (tests/test_dry_run.py:3478-3488) confirms {"Login": None, "Password": None} is emitted — the only path the Yandex API documents for dropping UrlFeedUpdate credentials. ✅

4. Clear flags restricted to update. add exposes only --feed-login / --feed-password (no clear variants), and _url_feed_payload's clear_login=False, clear_password=False defaults are unreachable from the add path. No way to send a null on create. Correct. ✅

5. Empty-subtype no-op gate preserved. feeds.py:207-212 error message now lists every flag combination that would satisfy the gate (--name, --url, --remove-utm-tags, --feed-login, --feed-password, --clear-feed-login, --clear-feed-password). Test test_feeds_update_without_fields_errors asserts presence of --name, --url, --remove-utm-tags, and --clear-feed-login in the error. CLAUDE.md WSDL parity gate invariant #1 holds. ✅

6. WSDL parity gate / audit math coherent. OPTIONAL_FIELD_CLI_OPTIONS updates at tests/test_wsdl_parity_gate.py:800-811 correctly reference the renamed flag names:

  • ("feeds","update","UrlFeed.Login"): {"--feed-login","--clear-feed-login"}
  • ("feeds","update","UrlFeed.Password"): {"--feed-password","--clear-feed-password"}

Audit counts shift missing_followup 2823→2817 (-6) and supported 418→424 (+6), matching exactly the 6 row flips (3 UrlFeed × 2 ops). The per-field rows for UrlFeed.Login/Password on update now list both flags in the satisfaction note. FileFeed.* (6 rows) consistently re-tagged with #264. ✅

7. mypy annotation correct. payload: Dict[str, object] (feeds.py:21) lets the dict accept both str values (Url, RemoveUtmTags, Login, Password) and the explicit None for clear paths. Dict[str, str] would have failed under --strict. ✅

8. Issue #253 scope. UrlFeed.* (RemoveUtmTags, Login, Password — set and clear) is complete. FileFeed.* (FileFeed, FileFeed.Data, FileFeed.Filename — both ops) is consistently labeled missing_followup#264 in both audit table and parity-gate OPTIONAL_FIELD_AUDIT. ✅

Non-blocking observations (no action required)

  • add handler still lacks except click.UsageError: raise. add (feeds.py:148-150) has only the catch-all except Exception. In practice add doesn't raise UsageError from inside the try block (all required=True validation runs before the try), so there's nothing to misroute today. If a future change adds a body-side UsageError to add, mirror the except click.UsageError: raise pattern used in update. Not a regression.
  • --feed-password still echoed in dry-run JSON. Same surface as other credential-bearing dry-run payloads in this repo (e.g., agencyclients add-passport-organization); consistent and explicitly accepted in earlier reviews. Hardening (envvar-backed + hide_input=True + dry-run redaction) is worth a dedicated cross-cutting follow-up rather than one-off here. Not a regression introduced by this PR.
  • UsageError is now raised, not abort-wrapped. This changes the exit code on validation failure for feeds update from 1 → 2. If any external script greps for the previous Abort exit code, it would need adjustment — but standard CLI conventions (and the rest of the codebase's typed-flag handlers, see clients update) use 2 for usage errors, so this aligns rather than diverges.

Conclusion

PR is ready. The P1 collision and all prior P2 nits (null path, conflict detection, README password scrub) are resolved. No bugs, no security regressions, no WSDL/API mismatch, no data-loss risks, no CLI contract violations identified. Issue #253 fully addressed; FileFeed follow-up #264 consistently linked across audit + gate.

— · branch: codex/issue-253-feeds-urlfeed-fields

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. 👍

ℹ️ 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".

@axisrow
axisrow merged commit 64504ee into feat/issue-239-optional-fields-gate May 24, 2026
6 checks passed
@axisrow
axisrow deleted the codex/issue-253-feeds-urlfeed-fields branch May 24, 2026 05:07
axisrow added a commit that referenced this pull request May 24, 2026
* [codex] Add adgroup tracking params flags (#258)

* Add adgroup tracking params flags

* test: cover adgroup tracking params add rejection

---------

Co-authored-by: axisrow <[email protected]>

* [codex] Add sitelink TurboPageId typed input (#259)

* feat(sitelinks): support turbo page id

* test(sitelinks): cover turbo page json input

---------

Co-authored-by: axisrow <[email protected]>

* [codex] Add retargeting description flags (#260)

* feat(retargeting): add description flags

* fix(retargeting): preserve empty description

---------

Co-authored-by: axisrow <[email protected]>

* [codex] Add adgroups negative keyword flags (#261)

* feat(adgroups): add negative keyword flags

* fix(adgroups): report invalid negative set ids as usage errors

---------

Co-authored-by: axisrow <[email protected]>

* [codex] Add vcards nested contact flags (#262)

* feat(vcards): add nested contact fields

* fix(vcards): preserve grouped flag usage errors

---------

Co-authored-by: axisrow <[email protected]>

* feat(ads): add text ad extension update flags (#263)

Co-authored-by: axisrow <[email protected]>

* feat(feeds): add url feed detail flags (#265)

Co-authored-by: axisrow <[email protected]>

* docs: align optional WSDL audit depth notes

* docs: document milestone 18 typed flags

---------

Co-authored-by: axisrow <[email protected]>
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.

2 participants