{"record":{"id":"b254f91f63a2688a","repo":"nanocoai/nanoclaw","slug":"nothing-to-update-provide-at-least-one-of-pro","errorCode":null,"errorMessage":"Nothing to update — provide at least one of: --provider, --model, --effort, --image-tag, --assistant-name, --max-messages-per-prompt, --cli-scope, --timezone","messagePattern":"Nothing to update — provide at least one of: --provider, --model, --effort, --image-tag, --assistant-name, --max-messages-per-prompt, --cli-scope, --timezone","errorType":"validation","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"src/cli/resources/groups.ts","lineNumber":412,"sourceCode":"        if (args.provider !== undefined) updates.provider = args.provider as string;\n        const timezone = parseTimezoneFlag(args.timezone);\n        if (timezone !== undefined) updates.timezone = timezone;\n        if (args.model !== undefined) updates.model = args.model as string;\n        if (args.effort !== undefined) updates.effort = args.effort as string;\n        if (args.image_tag !== undefined) updates.image_tag = args.image_tag as string;\n        if (args.assistant_name !== undefined) updates.assistant_name = args.assistant_name as string;\n        if (args.max_messages_per_prompt !== undefined)\n          updates.max_messages_per_prompt = Number(args.max_messages_per_prompt);\n        if (args['cli-scope'] !== undefined || args.cli_scope !== undefined) {\n          const scope = (args['cli-scope'] ?? args.cli_scope) as string;\n          if (!['disabled', 'group', 'global'].includes(scope)) {\n            throw new Error('--cli-scope must be one of: disabled, group, global');\n          }\n          updates.cli_scope = scope;\n        }\n\n        if (Object.keys(updates).length === 0) {\n          throw new Error(\n            'Nothing to update — provide at least one of: --provider, --model, --effort, --image-tag, --assistant-name, --max-messages-per-prompt, --cli-scope, --timezone',\n          );\n        }\n\n        await updateContainerConfigScalars(id, updates);\n\n        const updated = (await getContainerConfig(id))!;\n        return presentConfig(updated);\n      },\n    },\n    'config add-mcp-server': {\n      access: 'approval',\n      description:\n        'Add an MCP server to a group. Requires `ncl groups restart` to take effect. ' +\n        'Use --id <group-id> --name <server-name> with either --command <cmd> [--args <json-array>] [--env <json-object>] ' +\n        'or --url <url> [--headers <json-object>] (HTTPS, or plain HTTP for localhost / host.docker.internal).',\n      handler: async (args) => {\n        const id = args.id as string;","sourceCodeStart":394,"sourceCodeEnd":430,"githubUrl":"https://github.com/nanocoai/nanoclaw/blob/294ef2aee85218b23ad30eda9dfe10e590b54a8c/src/cli/resources/groups.ts#L394-L430","documentation":"Thrown by the `ncl groups config update` CLI handler when the parsed args produced no recognized scalar update fields, so `updates` is empty. The command refuses to issue a no-op UPDATE against the container_configs table.","triggerScenarios":"Running `ncl groups config update --id <group-id>` with no flags, or with only flags the config-update handler ignores (e.g. a misspelled flag like `--model` vs `--modl`, or JSON-only flags such as add-mcp-server flags).","commonSituations":"Typo'd flag names silently producing empty args; copy-pasting a `config add-mcp-server` style command against `config update`; assuming `--image` works instead of `--image-tag`.","solutions":["Re-run with at least one recognized flag: --provider, --model, --effort, --image-tag, --assistant-name, --max-messages-per-prompt, --cli-scope, or --timezone","Check flag spelling against `ncl groups config update` help","Use `ncl groups config add-mcp-server` / `remove-mcp-server` for MCP changes, and `config add-package`/`remove-package` for packages"],"exampleFix":"# before\nncl groups config update --id my-group\n# after\nncl groups config update --id my-group --model claude-sonnet-4-6","handlingStrategy":"validation","validationCode":"const fields = ['provider','model','effort','image-tag','assistant-name','max-messages-per-prompt','cli-scope','timezone'];\nconst hasAny = fields.some(f => opts[f] !== undefined);\nif (!hasAny) throw new Error('config update: no update fields provided');","typeGuard":null,"tryCatchPattern":"catch (e) { if (e instanceof Error && e.message.startsWith('Nothing to update')) { /* print usage, exit 2 */ } else throw e; }","preventionTips":["Build CLI args programmatically and assert the array is non-empty before invoking","Keep scalar updates and structural changes (MCP/packages) on separate code paths"],"tags":["cli","validation","container-config"],"backgroundTag":"missing-required-argument","analyzedSha":"294ef2aee85218b23ad30eda9dfe10e590b54a8c","analyzedAt":"2026-08-28T13:59:10.357Z","schemaVersion":2},"datasetVersion":"2026-08-28T16:17:29.566Z"}