import argparse, datetime, pathlib, subprocess
p=argparse.ArgumentParser(description='Run the real, independently bundled T3 CLI; source the Connect test-stage environment first. Authorize via the printed device URL in a browser before link. Never use production.')
p.add_argument('checkout'); p.add_argument('home'); p.add_argument('output'); p.add_argument('phase',choices=['link','pending','serve','status','cleanup']); p.add_argument('--port',default='15867')
a=p.parse_args(); out=pathlib.Path(a.output)/datetime.datetime.now(datetime.timezone.utc).strftime('%Y%m%dT%H%M%S%fZ'); out.mkdir(parents=True)
cli=['node',str(pathlib.Path(a.checkout)/'apps/server/dist/bin.mjs')]
def run(name,args):
    result=subprocess.run(cli+args+['--base-dir',a.home],cwd=a.checkout,text=True,stdout=subprocess.PIPE,stderr=subprocess.STDOUT)
    (out/(name+'.raw')).write_text('$ t3 '+ ' '.join(args)+' --base-dir <isolated-home>\n'+result.stdout)
    print(name, 'exit',result.returncode,flush=True)
    if result.returncode: raise SystemExit(result.returncode)
if a.phase=='link': run('link',['connect','link','--publish-only','--headless'])
if a.phase=='pending': run('pending',['connect','status'])
if a.phase=='serve':
    with (out/'server.raw').open('w') as f:
        proc=subprocess.Popen(cli+['serve','--host','127.0.0.1','--port',a.port,'--base-dir',a.home],cwd=a.checkout,stdout=f,stderr=subprocess.STDOUT)
        print('server pid',proc.pid,flush=True)
        try: proc.wait()
        except KeyboardInterrupt:
            proc.terminate(); proc.wait()
if a.phase=='status':
    run('status',['status','--json']); run('running',['connect','status']); run('connect-json',['connect','status','--json'])
if a.phase=='cleanup':
    run('unlink',['connect','unlink']); run('logout',['connect','logout'])
