nodejs/node · error · Error

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

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.

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.

Appendix: 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)