{"record":{"id":"315d0609eabcecbe","repo":"nikivdev/code","slug":"cursor-transcripts-are-readable-only-use-f-curso","errorCode":null,"errorMessage":"Cursor transcripts are readable only; use `f cursor list`, `f cursor copy`, or `f cursor context`","messagePattern":"Cursor transcripts are readable only; use `f cursor list`, `f cursor copy`, or `f cursor context`","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/ai.rs","lineNumber":600,"sourceCode":"                    \"global Codex enablement is only supported for Codex sessions; use `f codex enable-global`\"\n                );\n            }\n            Some(ProviderAiAction::Daemon { .. }) => {\n                bail!(\"daemon is only supported for Codex sessions; use `f codex daemon ...`\");\n            }\n            Some(ProviderAiAction::Memory { .. }) => {\n                bail!(\"memory is only supported for Codex sessions; use `f codex memory ...`\");\n            }\n            Some(ProviderAiAction::Telemetry { .. }) => {\n                bail!(\n                    \"telemetry is only supported for Codex sessions; use `f codex telemetry ...`\"\n                );\n            }\n            Some(ProviderAiAction::Trace { .. }) => {\n                bail!(\"trace is only supported for Codex sessions; use `f codex trace ...`\");\n            }\n            Some(ProviderAiAction::ProjectAi { .. }) => {\n                bail!(\n                    \"project-ai is only supported for Codex sessions; use `f codex project-ai ...`\"\n                );\n            }\n            Some(ProviderAiAction::SkillEval { .. }) => {\n                bail!(\n                    \"skill-eval is only supported for Codex sessions; use `f codex skill-eval ...`\"\n                );\n            }\n            Some(ProviderAiAction::SkillSource { .. }) => {\n                bail!(\n                    \"skill-source is only supported for Codex sessions; use `f codex skill-source ...`\"\n                );\n            }\n            Some(ProviderAiAction::Agent { .. }) => {\n                bail!(\"agent is only supported for Codex sessions; use `f codex agent ...`\");\n            }\n            Some(ProviderAiAction::Log { .. }) => {\n                bail!(\"log is only supported for Codex sessions; use `f codex log ...`\");","sourceCodeStart":582,"sourceCodeEnd":618,"githubUrl":"https://github.com/nikivdev/code/blob/a747e741ae92c09071d0ae946ab48488adcff1ce/src/ai.rs#L582-L618","documentation":"Raised by `run_provider` in src/ai.rs (Cursor match arm) when any session-mutating or session-lifecycle action — Sessions, Browse, Continue, New, Open, Resolve, Resume, Find, FindAndCopy — is dispatched against Cursor. The tool treats Cursor transcripts as read-only data sources; only listing, copying, and context extraction are implemented, so all other actions bail with guidance.","triggerScenarios":"Running any of `f cursor sessions|browse|continue|new|open|resolve|resume|find|find-and-copy ...`, i.e. run_provider(Provider::Cursor, Some(ProviderAiAction::{Sessions|Browse|Continue|New|Open|Resolve|Resume|Find|FindAndCopy}{..})).","commonSituations":"Trying to resume or continue a Cursor chat from the CLI, scripting session enumeration against Cursor the same way as Codex, assuming feature parity across providers after switching AI tools.","solutions":["List Cursor transcripts with `f cursor list`","Extract a transcript with `f cursor copy` or get recent context with `f cursor context`","If you need to continue/new/open/resume sessions, do it against Codex or Claude (`f codex ...` / `f claude ...`), not Cursor","Adjust automation to treat Cursor as read-only and branch on provider before issuing lifecycle actions"],"exampleFix":"// before\nf cursor continue --session abc\n// after\nf cursor copy --session abc   # read-only extraction\n# or, for resumable sessions:\nf codex continue --session abc","handlingStrategy":"validation","validationCode":"const CURSOR_ALLOWED: &[&str] = &[\"list\", \"latest-id\", \"copy\", \"context\", \"show\"];\nfn cursor_action_allowed(verb: &str) -> bool {\n    CURSOR_ALLOWED.contains(&verb)\n}\nif provider == Provider::Cursor && !cursor_action_allowed(verb) {\n    eprintln!(\"Cursor transcripts are readable only; use `f cursor list`, `f cursor copy`, or `f cursor context`\");\n    return;\n}","typeGuard":"fn is_cursor_readonly(action: &ProviderAiAction) -> bool {\n    matches!(\n        action,\n        ProviderAiAction::List\n            | ProviderAiAction::LatestId { .. }\n            | ProviderAiAction::Copy { .. }\n            | ProviderAiAction::Context { .. }\n            | ProviderAiAction::Show { .. }\n    )\n}","tryCatchPattern":"match run_provider(Provider::Cursor, action) {\n    Err(e) if e.to_string().contains(\"Cursor transcripts are readable only\") => {\n        eprintln!(\"Cursor is read-only; extracting via `f cursor copy` instead\");\n    }\n    other => other?,\n}","preventionTips":["Treat Cursor as read-only: never attempt continue/new/open/resume/resolve against it","For resumable sessions use Codex or Claude providers","Whitelist the four read-only Cursor verbs in any dispatch layer","Keep Cursor transcript backups externally since lifecycle actions are unsupported"],"tags":["unsupported-action","read-only","provider-dispatch"],"backgroundTag":"provider-unsupported-action","analyzedSha":"a747e741ae92c09071d0ae946ab48488adcff1ce","analyzedAt":"2026-09-01T22:43:55.719Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}