cli/cli · warning
project number is required when not running interactively
Error message
project number is required when not running interactively
What it means
NewProject needs a project number. When opts.number is 0 the command would normally prompt: it fetches the owner's projects via c.Projects and shows a picker. In non-interactive mode (canPrompt false) it fails immediately with this error rather than querying. Related guard just below: an owner with zero projects yields "no projects found for %s" instead.
Source
Thrown at pkg/cmd/project/shared/queries/queries.go:1524
var query userOwner
variables["login"] = githubv4.String(o.Login)
err := c.doQueryWithProgressIndicator("UserProject", &query, variables)
return newProjectFromQueryWithoutItemsQuery(query.Owner.Project), err
} else if o.Type == OrgOwner {
variables["login"] = githubv4.String(o.Login)
var query orgOwner
err := c.doQueryWithProgressIndicator("OrgProject", &query, variables)
return newProjectFromQueryWithoutItemsQuery(query.Owner.Project), err
} else if o.Type == ViewerOwner {
var query viewerOwner
err := c.doQueryWithProgressIndicator("ViewerProject", &query, variables)
return newProjectFromQueryWithoutItemsQuery(query.Owner.Project), err
}
return nil, errors.New("unknown owner type")
}
if !canPrompt {
return nil, fmt.Errorf("project number is required when not running interactively")
}
projects, err := c.Projects(o.Login, o.Type, 0, fields)
if err != nil {
return nil, err
}
if len(projects.Nodes) == 0 {
return nil, fmt.Errorf("no projects found for %s", o.Login)
}
options := make([]string, 0, len(projects.Nodes))
for _, p := range projects.Nodes {
title := fmt.Sprintf("%s (#%d)", p.Title, p.Number)
options = append(options, title)
}
answerIndex, err := c.prompter.Select("Which project would you like to use?", "", options)View on GitHub (pinned to 0eeec0b92e)
Solutions
- Pass the project number: `gh project item-list 42 --owner myorg` (find it in the project URL or via `gh project list --owner myorg`)
- Run interactively to get the project picker
- In scripts, discover numbers first: `gh project list --owner X --json number,title --jq '.[] | "\(.number) \(.title)"'`
Example fix
# before (in CI) gh project item-list --owner myorg # after gh project list --owner myorg --json number,title gh project item-list 42 --owner myorg
Defensive patterns
Strategy: validation
Validate before calling
if !interactive() && projectNumber == 0 {
return errors.New("project number argument is required in non-interactive mode")
} Prevention
- Resolve project numbers with `gh project list --json number` and pass them explicitly
- Treat interactive pickers as unavailable in CI; supply number and owner
- Extract the number from the project URL when automating
When it happens
Trigger: Running a project subcommand without the <number> argument in a non-interactive environment (CI, piped stdin), or passing 0/empty for the number.
Common situations: CI jobs or Makefile targets copied from interactive sessions where the project picker silently supplied the number; forgetting the positional argument.
Related errors
- owner is required when not running interactively
- no fields to edit
- passing `--single-select-options` is required for SINGLE_SEL
- expected the \"[HOST/]OWNER/REPO\" or \"REPO\" format, got \
- expected the \"[HOST/]OWNER/TEAM\" or \"TEAM\" format, got \
AI-assisted analysis of cli/cli@0eeec0b92e (2026-08-15).
Data as JSON: /api/errors/2c44ae28a6ee3a4b.
Report an issue: GitHub.