1212from simulateinput .mcp .server import MCPServer , list_tools
1313from simulateinput .runner .case_runner import load_case , run_case
1414
15+
1516def emit (payload : dict ) -> None :
1617 print (json .dumps (payload , indent = 2 ))
1718
@@ -21,7 +22,10 @@ def build_parser() -> argparse.ArgumentParser:
2122 subparsers = parser .add_subparsers (dest = "command" , required = True )
2223
2324 subparsers .add_parser ("version" , help = "Print the current package version." )
24- subparsers .add_parser ("doctor" , help = "Show built-in profiles and MCP tool names." )
25+ doctor_parser = subparsers .add_parser ("doctor" , help = "Show built-in profiles, driver diagnostics, and MCP tool names." )
26+ doctor_mode = doctor_parser .add_mutually_exclusive_group ()
27+ doctor_mode .add_argument ("--compact" , action = "store_true" , help = "Emit a reduced payload focused on driver status and remediation." )
28+ doctor_mode .add_argument ("--verbose" , action = "store_true" , help = "Emit expanded driver details plus full MCP tool metadata." )
2529
2630 session_parser = subparsers .add_parser ("session" , help = "Manage automation sessions." )
2731 session_subparsers = session_parser .add_subparsers (dest = "session_command" , required = True )
@@ -208,6 +212,32 @@ def resolve_engine(state_root: Path | None) -> AutomationEngine:
208212 return AutomationEngine (state_root = state_root )
209213
210214
215+ def build_doctor_payload (engine : AutomationEngine , compact : bool = False , verbose : bool = False ) -> dict :
216+ driver = engine .probe_driver ()
217+ tool_defs = list_tools ()
218+ if compact :
219+ return {
220+ "ok" : True ,
221+ "driver" : {
222+ "available" : driver ["available" ],
223+ "platform" : driver ["platform" ],
224+ "message" : driver ["message" ],
225+ "capabilities" : driver ["capabilities" ],
226+ "remediation" : driver .get ("details" , {}).get ("remediation" , []),
227+ },
228+ }
229+ payload = {
230+ "ok" : True ,
231+ "profiles" : sorted (BUILTIN_PROFILES ),
232+ "mcp_tools" : [tool .name for tool in tool_defs ],
233+ "driver" : driver ,
234+ }
235+ if verbose :
236+ payload ["version" ] = __version__
237+ payload ["mcp_tool_details" ] = [tool .to_dict () for tool in tool_defs ]
238+ return payload
239+
240+
211241def main (argv : list [str ] | None = None ) -> int :
212242 parser = build_parser ()
213243 try :
@@ -219,14 +249,7 @@ def main(argv: list[str] | None = None) -> int:
219249
220250 if args .command == "doctor" :
221251 engine = resolve_engine (None )
222- emit (
223- {
224- "ok" : True ,
225- "profiles" : sorted (BUILTIN_PROFILES ),
226- "mcp_tools" : [tool .name for tool in list_tools ()],
227- "driver" : engine .probe_driver (),
228- }
229- )
252+ emit (build_doctor_payload (engine , compact = getattr (args , "compact" , False ), verbose = getattr (args , "verbose" , False )))
230253 return 0
231254
232255 if args .command == "mcp" :
0 commit comments