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
- Use one of the three valid roles: owner, admin, or developer (case-sensitive)
- If you want the default, simply omit the role argument — it defaults to 'developer'
- 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
- Use only 'owner', 'admin', or 'developer' — these are case-sensitive
- Omit the role argument entirely to default to 'developer'
- Do not use abbreviations like 'dev' or 'adm' — spell the full word
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
- First argument `orgname` is required.
- Second argument `username` is required.
- ${argv[2]} not recognized
- Unknown profile command: ${subcmd}
- npm profile set <prop> <value>
AI-assisted analysis of nodejs/node@1b2de5e052 (2026-08-13).
Data as JSON: /api/errors/34eeb4a21f07abac.
Report an issue: GitHub.