{"record":{"id":"a6f273180a888c38","repo":"caddyserver/caddy","slug":"cannot-adapt-config-without-config-file-use-con","errorCode":null,"errorMessage":"cannot adapt config without config file (use --config)","messagePattern":"cannot adapt config without config file \\(use --config\\)","errorType":"console","errorClass":null,"httpStatus":null,"severity":"error","filePath":"cmd/main.go","lineNumber":155,"sourceCode":"\n\t// adapter is not empty,\n\t// adapter is not \"caddyfile\",\n\t// extension is not \".json\",\n\t// extension is not \".caddyfile\"\n\t// file does not start with \"Caddyfile\"\n\treturn false, nil\n}\n\nfunc loadConfigWithLogger(logger *zap.Logger, configFile, adapterName string) ([]byte, string, string, error) {\n\t// if no logger is provided, use a nop logger\n\t// just so we don't have to check for nil\n\tif logger == nil {\n\t\tlogger = zap.NewNop()\n\t}\n\n\t// specifying an adapter without a config file is ambiguous\n\tif adapterName != \"\" && configFile == \"\" {\n\t\treturn nil, \"\", \"\", fmt.Errorf(\"cannot adapt config without config file (use --config)\")\n\t}\n\n\t// load initial config and adapter\n\tvar config []byte\n\tvar cfgAdapter caddyconfig.Adapter\n\tvar err error\n\tif configFile != \"\" {\n\t\tif configFile == \"-\" {\n\t\t\tconfig, err = io.ReadAll(os.Stdin)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, \"\", \"\", fmt.Errorf(\"reading config from stdin: %v\", err)\n\t\t\t}\n\t\t\tlogger.Info(\"using config from stdin\")\n\t\t} else {\n\t\t\tconfig, err = os.ReadFile(configFile)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, \"\", \"\", fmt.Errorf(\"reading config from file: %v\", err)\n\t\t\t}","sourceCodeStart":137,"sourceCodeEnd":173,"githubUrl":"https://github.com/caddyserver/caddy/blob/50e54ee279aa1e504fe218ca49ab6ae16c100410/cmd/main.go#L137-L173","documentation":"loadConfigWithLogger rejects the combination --adapter <name> with no --config: an adapter only transforms file content, so naming one without input is ambiguous. It points you at --config explicitly because stdin alone ('-') also requires being named via --config -.","triggerScenarios":"Running 'caddy adapt --adapter caddyfile' with no --config; piping a config to stdin but forgetting --config -; 'caddy run --adapter json' with no file.","commonSituations":"Users assuming the adapter flag implies reading stdin; copy-pasted commands that dropped the --config part.","solutions":["Add --config with a path, or --config - to read stdin"],"exampleFix":"# before\ncaddy adapt --adapter caddyfile\n\n# after\ncaddy adapt --config Caddyfile --adapter caddyfile\ncat Caddyfile | caddy adapt --config - --adapter caddyfile","handlingStrategy":"validation","validationCode":"if adapterName != \"\" && configFile == \"\" { return errors.New(\"--adapter requires --config (use '--config -' for stdin)\") }","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Treat --adapter and --config as a pair","Use '--config -' explicitly for stdin"],"tags":["cli","configuration","missing-flag","adapter"],"backgroundTag":null,"analyzedSha":"50e54ee279aa1e504fe218ca49ab6ae16c100410","analyzedAt":"2026-08-15T09:20:21.641Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}