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

  1. Pass the project number: `gh project item-list 42 --owner myorg` (find it in the project URL or via `gh project list --owner myorg`)
  2. Run interactively to get the project picker
  3. 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

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


AI-assisted analysis of cli/cli@0eeec0b92e (2026-08-15). Data as JSON: /api/errors/2c44ae28a6ee3a4b. Report an issue: GitHub.