jackwener/OpenCLI · warning · CliError

NOT_FOUND

NOT_FOUND

Error message

No recommended projects found on Gitee Explore

What it means

CliError with code NOT_FOUND thrown when the Explore page parsed successfully but zero recommended projects survive the toProject/merge/filter pipeline after slicing to limit. The hint suggests Gitee may be blocking the request or the page structure changed.

Source

Thrown at clis/gitee/trending.js:564

        }

        return projects;
      })()
    `);
        if (!Array.isArray(rawProjects)) {
            throw new CliError('FETCH_ERROR', 'Failed to parse Gitee Explore page', 'Gitee may have changed its page structure');
        }
        const projects = rawProjects
            .map(toProject)
            .filter((project) => project !== null)
            .map((project) => mergeCapturedProject(project, projectsFromCapture.get(project.url)))
            .map((project) => ({
            ...project,
            description: compactDescription(project.description),
        }))
            .slice(0, limit);
        if (projects.length === 0) {
            throw new CliError('NOT_FOUND', 'No recommended projects found on Gitee Explore', 'Gitee may be blocking this request or the page structure changed');
        }
        return projects;
    },
});

View on GitHub (pinned to 49907e53dc)

Solutions

  1. Open https://gitee.com/explore in a logged-in browser to confirm recommendations actually render
  2. Check whether toProject is returning null for the new markup and update its selectors
  3. Retry from a different network/with login cookies if Gitee is soft-blocking the session
  4. Fall back to another source (e.g. trending API or search API) when the feed is empty

Example fix

// before
opencli gitee trending --limit 10   # NOT_FOUND: no recommended projects
// after
# log in via `opencli gitee auth` first, then rerun with a populated feed
opencli gitee trending --limit 10
Defensive patterns

Strategy: fallback

Validate before calling

// Confirm the Explore feed actually renders projects
const cardCount = await page.evaluate(() => document.querySelectorAll('.project-card, .explore__project').length);
if (cardCount === 0) {
  console.error('Explore feed is empty or blocked — log in or change network');
  process.exit(1);
}

Try / catch

try {
  projects = await giteeTrending();
} catch (e) {
  if (e.code === 'NOT_FOUND') {
    console.warn('No recommended projects; falling back to search-based trending');
    projects = await giteeSearch('stars:>1000');
  } else throw e;
}

Prevention

When it happens

Trigger: rawProjects was an array but toProject returned null for every entry, or captured/merged data produced no rows with a valid url, leaving projects.length === 0 after .slice(0, limit).

Common situations: Gitee serving an empty 'recommended' feed for the region/anonymous sessions; anti-bot soft-block returning valid but empty markup; new project-card markup that toProject cannot map (all entries dropped as null); requesting a category/tab where no projects are listed.

Understand the failure class

Background: NOT_FOUND error code: why tRPC, Harbor, Nacos and other libraries return 404 "not found" errors for resources that may still exist — this error's family across 11 libraries.

Related errors


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