nodejs/node · error · Error

Third argument `role` must be one of `owner`, `admin`, or `d

Error message

Third argument `role` must be one of `owner`, `admin`, or `developer`, with `developer` being the default value if omitted.

What it means

Thrown by the `org set` method when the optional `role` argument is present but not one of the three allowed values: 'owner', 'admin', or 'developer'. If the role argument is omitted entirely it defaults to 'developer', so this error only fires when an explicit invalid role string is passed.

Source

Thrown at deps/npm/lib/commands/org.js:63

          return this.ls(orgname, username, opts)
        default:
          throw this.usageError()
      }
    })
  }

  async set (org, user, role, opts) {
    role = role || 'developer'
    if (!org) {
      throw new Error('First argument `orgname` is required.')
    }

    if (!user) {
      throw new Error('Second argument `username` is required.')
    }

    if (!['owner', 'admin', 'developer'].find(x => x === role)) {
      throw new Error(
        'Third argument `role` must be one of `owner`, `admin`, or `developer`, with `developer` being the default value if omitted.'
      )
    }

    const memDeets = await liborg.set(org, user, role, opts)
    if (opts.json) {
      output.standard(JSON.stringify(memDeets, null, 2))
    } else if (opts.parseable) {
      output.standard(['org', 'orgsize', 'user', 'role'].join('\t'))
      output.standard(
        [memDeets.org.name, memDeets.org.size, memDeets.user, memDeets.role].join('\t')
      )
    } else if (!this.npm.silent) {
      output.standard(
        `Added ${memDeets.user} as ${memDeets.role} to ${memDeets.org.name}. You now have ${
            memDeets.org.size
          } member${memDeets.org.size === 1 ? '' : 's'} in this org.`
      )

View on GitHub (pinned to 1b2de5e052)

Solutions

  1. Use one of the three valid roles: owner, admin, or developer (case-sensitive)
  2. If you want the default, simply omit the role argument — it defaults to 'developer'
  3. Double-check spelling: 'developer' not 'dev', 'admin' not 'administrator'

Example fix

// before
npm org set my-org someuser member

// after
npm org set my-org someuser developer
Defensive patterns

Strategy: validation

Validate before calling

const VALID_ROLES = ['owner', 'admin', 'developer']
function isValidRole(role) {
  return role === undefined || VALID_ROLES.includes(role)
}
// Before calling:
if (!isValidRole(role)) {
  throw new Error(`Role must be one of: ${VALID_ROLES.join(', ')} (or omit for default 'developer')`)
}

Type guard

function isOrgRole(role) {
  return typeof role === 'string' && ['owner', 'admin', 'developer'].includes(role)
}

Try / catch

try {
  await exec(['set', orgName, userName, role])
} catch (e) {
  if (e.message.includes('role')) {
    console.error('Valid roles: owner, admin, developer (default: developer)')
  }
  throw e
}

Prevention

When it happens

Trigger: Passing a role argument that is not in the set ['owner', 'admin', 'developer']. For example `npm org set my-org someuser admin` works, but `npm org set my-org someuser superadmin` throws. The check uses `['owner','admin','developer'].find(x => x === role)`.

Common situations: Misspelling the role name, using a role from a different system (e.g., 'member' or 'write'), or assuming case-insensitivity (the check is case-sensitive). Using 'dev' instead of 'developer'.

Related errors


AI-assisted analysis of nodejs/node@1b2de5e052 (2026-08-13). Data as JSON: /api/errors/34eeb4a21f07abac. Report an issue: GitHub.