mirror of
https://github.com/jackwener/OpenCLI.git
synced 2026-09-14 18:25:42 +08:00
40592ea5fd
* fix(adapters): drop silent-sentinel row fallbacks across Apple Podcasts, Reddit, and Gitee Continues the audit-baseline cleanup from #1611 (lesswrong) and #1631 (wikipedia / 36kr / xiaoyuzhou / zhihu), and follows the direction set by71646158(silent-empty-fallback resolutions across Douyin / Jike / WeRead) andee54eb8e(ignore sentinels in thrown errors). Replaces silent-sentinel row fallbacks with the empty-string signal so agents can tell apart "field has value Unknown" from "upstream returned no value": - apple-podcasts/search: episodes, genre - reddit/saved: title - reddit/upvoted: title - gitee/search: language, description All four files audited for downstream sentinel checks via `grep -nE "=== ?['\"](Unknown|unknown|-)['\"]"`. None reference the swapped values in control flow (verified against the v2ex/me.js class of regression caught in #1631). Intentionally skipped in this batch (will not flip to empty): - gitee/trending.js:272: downstream `project.description !== '-'` check drives the mergedDescription fallback. Same control-flow sentinel pattern as v2ex/me.js. Stays on baseline. - web/read.js x4: `'-'` lives inside rendered diagnostic lines (`lines.push(...)`), not row fields. Empty would render ` GET /a/b` with a doubled space. UX placeholder. - yollomi/{edit,video}.js x6: `file: '-'`, `size: '-'`, `credits: '-'` are user-facing status rows displayed to humans. Empty would collapse columns visually. - zsxq/dynamics.js: `title: '[${d.action || 'unknown'}]'` is a template-literal-rendered title prefix. Empty would render `[]`. Verified live: `opencli apple-podcasts search "lex fridman" --limit 2` returns populated episodes/genre. `opencli gitee search "vue" --limit 2` returns populated language/description. Baseline shrinks accordingly. * test(adapters): add empty-signal coverage for the cluster-3 sentinel swap Mirrors the cluster-2 test additions, pairing the sentinel value swap in this PR with focused unit tests that mock the upstream to return null / missing fields and assert the row surfaces an empty-string signal instead of the old fabricated '-' / 'unknown' sentinel. Coverage: - clis/apple-podcasts/commands.test.js (+1 case): stubs the iTunes Search response with a result that has collectionId / collectionName / artistName populated but no trackCount and no primaryGenreName. Asserts episodes and genre render as '' (was '-' before this PR). - clis/gitee/search.test.js (new): mocks Gitee's `so.gitee.com/v1/search` fetch with two cases - a hit that has only title + url (no langs, no description), and a hit that has all fields populated. Asserts the missing fields render as '' (was '-' before) and that populated fields pass through verbatim. The reddit/saved and reddit/upvoted changes in this PR live inside a page.evaluate template literal that fetches from reddit.com inside the browser context, so the empty-signal branch is executed inside the page rather than in adapter JS. They are 1-char `|| '-'` -> `|| ''` swaps with no downstream sentinel consumer and the same JS semantics demonstrated by the gitee + apple-podcasts tests above. * chore: rebuild cli-manifest.json to drop stale entries from rebase The previous rebase left a stale linkedin/people-search entry in cli-manifest.json that was carried over from a sibling feature branch. This branch does not include the people-search source file, so the entry was an orphan; CI's build-manifest safety check correctly refused to overwrite it. Regenerating with --allow-removals to drop the orphaned entry, after which a normal `npm run build` is a no-op.