{"record":{"id":"8775c75cc95dbab6","repo":"chenhg5/cc-connect","slug":"multiple-projects-contain-a-tuitui-platform-speci","errorCode":null,"errorMessage":"multiple projects contain a tuitui platform; specify --project","messagePattern":"multiple projects contain a tuitui platform; specify --project","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"cmd/cc-connect/tuitui.go","lineNumber":432,"sourceCode":"\nfunc findTuiTuiOptions(cfg *config.Config, opts tuituiCLIOptions) (map[string]any, bool, error) {\n\tvar matches []config.PlatformConfig\n\tfor _, proj := range cfg.Projects {\n\t\tif opts.project != \"\" && proj.Name != opts.project {\n\t\t\tcontinue\n\t\t}\n\t\tfor _, pc := range proj.Platforms {\n\t\t\tif pc.Type != \"tuitui\" {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tmatches = append(matches, pc)\n\t\t}\n\t}\n\tif len(matches) == 0 {\n\t\treturn map[string]any{}, false, nil\n\t}\n\tif opts.project == \"\" && len(matches) > 1 {\n\t\treturn nil, false, fmt.Errorf(\"multiple projects contain a tuitui platform; specify --project\")\n\t}\n\tout := make(map[string]any, len(matches[0].Options))\n\tfor k, v := range matches[0].Options {\n\t\tout[k] = v\n\t}\n\treturn out, true, nil\n}\n\nfunc filterTuiTuiHistory(result *tuitui.HistoryResult, query string) *tuitui.HistoryResult {\n\tquery = strings.ToLower(strings.TrimSpace(query))\n\tif query == \"\" {\n\t\treturn result\n\t}\n\tfiltered := *result\n\tfiltered.Messages = nil\n\tfor _, msg := range result.Messages {\n\t\tdata, _ := json.Marshal(msg)\n\t\tif strings.Contains(strings.ToLower(string(data)), query) {","sourceCodeStart":414,"sourceCodeEnd":450,"githubUrl":"https://github.com/chenhg5/cc-connect/blob/4000b2338aa6e850c99df54f8b0ed6ed7460b401/cmd/cc-connect/tuitui.go#L414-L450","documentation":"findTuiTuiOptions scans all projects in the config for a tuitui platform. If more than one project matches and no --project was given, the choice is ambiguous, so it refuses to guess and asks the user to disambiguate. Matches==0 returns an empty map instead (no error), which is why only the multi-match case errors.","triggerScenarios":"Config contains >=2 projects each with a tuitui platform section, and runTuiTuiMessages/runTuiTuiPost is invoked without --project.","commonSituations":"Growing config where a second project recently gained a tuitui platform, breaking previously-working commands; shared team config with multiple tuitui workspaces.","solutions":["Add --project <name> to select one of the matching projects","Remove/duplicate-check the tuitui platform section if one project's copy is stale","Keep a single tuitui platform if you intend a global default"],"exampleFix":"// before\ncc-connect tuitui post --channel-id 123 --message hi\n// after\ncc-connect tuitui post --project team-a --channel-id 123 --message hi","handlingStrategy":"validation","validationCode":"matches := countProjectsWithPlatform(cfg, \"tuitui\")\nif matches > 1 && project == \"\" {\n\treturn fmt.Errorf(\"%d projects have tuitui; pass --project\", matches)\n}","typeGuard":null,"tryCatchPattern":"cli, err := loadTuiTuiPlatform(opts)\nif err != nil && strings.Contains(err.Error(), \"multiple projects\") {\n\treturn fmt.Errorf(\"%w (available: %v)\", err, listTuituiProjects(cfg))\n}","preventionTips":["Always pass --project in scripts once you have >1 tuitui project","Keep exactly one tuitui platform if you rely on auto-selection","Document project names in team config"],"tags":["config","cli","ambiguity"],"backgroundTag":"invalid-cli-argument","analyzedSha":"4000b2338aa6e850c99df54f8b0ed6ed7460b401","analyzedAt":"2026-09-06T11:45:09.575Z","contentChangedAt":"2026-09-06T11:45:09.575Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}