The following works by removing the optional argument. Without it there is no look-ahead for the [
that will accidentally tokenize the {
and freeze its category code to 1 (begin-group). Because of this category code freezing the argument grabbing for a verbatim environment doesn't work (the corresponding \end{shell}
is part of a local group and hence hidden from TeX's delimited argument scanner).
\documentclass{article}
\usepackage[minted]{tcolorbox}
\newtcblisting{shell}{listing only, title={Output},
listing engine=minted, minted language=text}
\begin{document}
\begin{shell}
a {"John Marwood Cleese", 123456}
\end{shell}
\begin{shell}
{"John Marwood Cleese", 123456}
\end{shell}
\end{document}
If you absolutely need the optional argument you'll have a few options:
- implement the argument grabbing logic yourself
- patch some internals to get it working
- use something that doesn't hurt if it's tokenized
The following shows the last option, freezing an \empty
that'll just expand to nothing in later steps:
\documentclass{article}
\usepackage[minted]{tcolorbox}
\newtcblisting{shell}[1][]{listing only, title={Output},
listing engine=minted, minted language=text}
\begin{document}
\begin{shell}
a {"John Marwood Cleese", 123456}
\end{shell}
\begin{shell}
\empty{"John Marwood Cleese", 123456}
\end{shell}
\end{document}
But this just shows the problematic aspect of this: You'll always have to watch out to use your environment in a way that doesn't hurt. It would be better to use a mandatory argument (or at least the last argument should be a mandatory one).
Both show the following output:

\begin{shell} \ {"John Marwood Cleese", 123456} \end{shell}
will work, but I can explain why. It seems that{
might be the troublemaker.[1][]
(which is making it look for a[
and finding{