jackwener/OpenCLI · error · CommandExecutionError

dongchedi specs ${seriesId}: No spec overview found for this

Error message

dongchedi specs ${seriesId}: No spec overview found for this series (layout may have changed).

What it means

A CommandExecutionError thrown by the dongchedi specs command (clis/dongchedi/specs.js:108). After fetching the series page's `overviewData`, the parser produced only empty rows (nothing beyond the series_id row had a value). Since every real series has at least dimension/power specs, an all-empty sheet means the overview block was missing — i.e. the page layout drifted from what the parser expects — and the library refuses to emit a blank spec sheet.

Source

Thrown at clis/dongchedi/specs.js:108

    site: 'dongchedi',
    name: 'specs',
    access: 'read',
    aliases: ['config'],
    description: '懂车帝车系配置概览(尺寸 / 动力 / 发动机 / 变速箱 / 四驱 / 悬挂 / 气囊)',
    strategy: Strategy.PUBLIC,
    browser: false,
    args: [
        { name: 'series_id', required: true, positional: true, help: '车系 ID(来自 search 的 series_id,或 /auto/series/<id> URL)' },
    ],
    columns: SPECS_COLUMNS,
    func: async (args) => {
        const seriesId = normalizeSeriesId(args.series_id);
        const pp = await dcdFetchPageProps(`/auto/series/${seriesId}`, `specs ${seriesId}`);
        const rows = parseSpecs(pp.overviewData, seriesId);
        // Every series has at least dimensions/power; an all-empty sheet means
        // the overview block was absent (layout drift) — don't emit a blank sheet.
        if (rows.every((r) => r.field === 'series_id' || !r.value)) {
            throw new CommandExecutionError(
                `dongchedi specs ${seriesId}`,
                'No spec overview found for this series (layout may have changed).',
            );
        }
        return rows;
    },
});

View on GitHub (pinned to 49907e53dc)

Solutions

  1. Check whether the series page loads normally in a browser and still contains an overview/spec section under `__NEXT_DATA__`.
  2. Inspect the live `props.pageProps.overviewData` shape and update parseSpecs to match the new layout.
  3. Try a different, well-known series_id to confirm the parser works generally (isolating layout drift vs. a bad series).
  4. Retry later — if the site is mid-rollout, some series may temporarily serve the new layout.
  5. Catch CommandExecutionError and surface a clear 'layout changed' message instead of writing an empty spec sheet.

Example fix

// before
const rows = parseSpecs(pp.overviewData, seriesId); // throws: layout drift
// after
if (pp.overviewData?.specList) {
  const rows = parseSpecs(pp.overviewData, seriesId); // adapt parser to new key/schema
}
Defensive patterns

Strategy: fallback

Type guard

function hasOverviewData(pp) {
  return Boolean(pp && pp.overviewData && typeof pp.overviewData === 'object');
}

Try / catch

try {
  const rows = await dcdSpecs(seriesId);
} catch (err) {
  if (err instanceof CommandExecutionError && /spec overview/.test(err.message)) {
    reportLayoutDrift(seriesId); // alert + degrade to empty result
  } else throw err;
}

Prevention

When it happens

Trigger: Calling dongchedi specs with a series_id whose page's `overviewData` is missing, null, or restructured: Dongchedi changed the Next.js pageProps schema for the series page, the series page uses a new template variant, or the SSR payload for that series omits the overview block entirely.

Common situations: Scrapers breaking after a silent Dongchedi front-end redeploy; spec queries for obscure/discontinued/newly-added series whose pages use a different template; caching a stale parser against an updated site.

Related errors


AI-assisted analysis of jackwener/OpenCLI@49907e53dc (2026-08-29). Data as JSON: /api/errors/46cf413c42f393fa. Report an issue: GitHub.