MrMarble / termsvg

Record, share and export your terminal as a animated SVG image.
GNU General Public License v3.0
185 stars 9 forks source link

termsvg: error: unexpected end of JSON input #8

Closed brian6932 closed 4 months ago

brian6932 commented 4 months ago

Occurs on both play and export subcommands for me, --debug doesn't show any additional error context. Recorded with https://github.com/Watfaq/PowerSession-rs (powersession rec -c pwsh file.cast -f) and playable on powersession play file.cast. Works fine in https://github.com/marionebl/svg-term-cli.

❯ @'
{"version":2,"width":121,"height":42,"timestamp":1715960578,"env":{"SHELL":"powershell.exe","TERM":"xterm-256color"}}
[0.11586546897888184,"o","\u001b[2J\u001b[m\u001b[HPowerShell 7.5.0-preview.2\r\n\u001b]0;C:\\Users\\username\\scoop\\apps\\pwsh-beta\\current\\pwsh.exe\u0007\u001b[?25h"]
[0.12951397895812988,"o","\u001b]0;Administrator: C:\\Users\\username\\scoop\\apps\\pwsh-beta\\current\\pwsh.exe\u0007"]
[1.5709638595581055,"o","Loading personal and system profiles took 1308ms.\r\n"]
[1.7109723091125488,"o","\u001b[25l\u001b[31musername\u001b[m \u001b[34m~\u001b[m \u001b[35m\r\n❯\u001b[m       \u001b[4;3H\u001b[?25h"]
[3.3348982334136963,"o","\u001b[?25l"]
[3.355496644973755,"o","\u001b[?25h"]
[3.827202796936035,"o","\u001b[?25l"]
[3.838937759399414,"o","(\u001b[93mirm\u001b[m https://api.quotable.io/random).\u001b[97mcontent\u001b[m | \u001b[93mttype\u001b[38;2;68;68;68mr -"]
[3.8545053005218506,"o","\u001b[m\u001b[4;3H(\u001b[93mirm\u001b[m https://api.quotable.io/random).\u001b[97mcontent\u001b[m | \u001b[93mttyper\u001b[m -\u001b[?25h"]
[3.9324028491973877,"o","\r\n"]
[4.13167929649353,"o","\u001b[25l\u001b[H\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\u001b[H\u001b[?25h"]
[4.151064157485962,"o","\u001b[36m╭\u001b[1m\u001b[97mInput\u001b[22m\u001b[36m──────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮\r\n│\u001b[m\u001b[K\u001b[36m\u001b[119C│\r\n╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[32m\r\n╭\u001b[1m\u001b[97mPrompt\u001b[22m\u001b[32m──────────────────────────────────────────────────────────────────────────"]
[4.151370048522949,"o","───────────────────────────────────────╮\r\n│\u001b[4m\u001b[1m\u001b[34mT\u001b[24mhe best way out is always through.\u001b[m \u001b[K\u001b[32m\u001b[83C│\r\n│\u001b[m\u001b[K\u001b[32m\u001b[119C│\r\n│\u001b[m\u001b[K\u001b[32m\u001b[119C│\r\n│\u001b[m\u001b[K\u001b[32m\u001b[119C│\r\n│\u001b[m\u001b[K\u001b[32m\u001b[119C│\r\n│\u001b[m\u001b[K\u001b[32m\u001b[119C│\r\n│\u001b[m\u001b[K\u001b[32m\u001b[119C│\r\n│\u001b[m\u001b[K\u001b[32m\u001b[119C│\r\n│\u001b[m\u001b[K\u001b[32m\u001b[119C│\r\n│\u001b[m\u001b[K\u001b[32m\u001b[119C│\r\n│\u001b[m\u001b[K\u001b[32m\u001b[119C│\r\n│\u001b[m\u001b[K\u001b[32m\u001b[119C│\r\n│\u001b[m\u001b[K\u001b[32m\u001b[119C│\r\n│\u001b[m\u001b[K\u001b[32m\u001b[119C│\r\n│\u001b[m\u001b[K\u001b[32m\u001b[119C│\r\n│\u001b[m\u001b[K\u001b[32m\u001b[119C│\r\n│\u001b[m\u001b[K\u001b[32m\u001b[119C│\r\n│\u001b[m\u001b[K\u001b[32m\u001b[119C│\r\n│\u001b[m\u001b[K\u001b[32m\u001b[119C│\r\n│\u001b[m\u001b[K\u001b[32m\u001b[119C│\r\n│\u001b[m\u001b[K\u001b[32m\u001b[119C│\r\n│\u001b[m\u001b[K\u001b[32m\u001b[119C│\r\n│\u001b[m\u001b[K\u001b[32m\u001b[119C│\r\n│\u001b[m\u001b[K\u001b[32m\u001b[119C│\r\n│\u001b[m\u001b[K\u001b[32m\u001b[119C│\r\n│\u001b[m\u001b[K\u001b[32m\u001b[119C│\r\n│\u001b[m\u001b[K\u001b[32m\u001b[119C│\r\n│\u001b[m\u001b[K\u001b[32m\u001b[119C│\r\n│\u001b[m\u001b[K\u001b[32m\u001b[119C│\r\n│\u001b[m\u001b[K\u001b[32m\u001b[119C│\r\n│\u001b[m\u001b[K\u001b[32m\u001b[119C│\r\n│\u001b[m\u001b[K\u001b[32m\u001b[119C│\r\n│\u001b[m\u001b[K\u001b[32m\u001b[119C│\r\n│\u001b[m\u001b[K\u001b[32m\u001b[119C│\r"]
[4.153248310089111,"o","\n│\u001b[m\u001b[K\u001b[32m\u001b[119C│\r\n│\u001b[m\u001b[K\u001b[32m\u001b[119C│\r\n│\u001b[m\u001b[K\u001b[32m\u001b[119C│\r\n╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[?25l"]
[4.7808051109313965,"o","\u001b[m\u001b[2;2HT \u001b[36m\u001b[3;2H──\u001b[1m\u001b[97m\u001b[4;2HPr\u001b[32m\u001b[5;2HT\u001b[4m\u001b[34mh"]
[4.789718151092529,"o","\u001b[24m\u001b[m"]
[4.820528984069824,"o","\u001b[2;3Hh \u001b[36m\u001b[3;3H──\u001b[1m\u001b[97m\u001b[4;3Hro\u001b[32m\u001b[5;3Hh\u001b[4m\u001b[34me"]
[4.836268901824951,"o","\u001b[24m\u001b[m"]
[4.9035325050354,"o","\u001b[2;4He \u001b[36m\u001b[3;4H──\u001b[1m\u001b[97m\u001b[4;4Hom\u001b[32m\u001b[5;4He\u001b[4m\u001b[34m "]
[4.9141130447387695,"o","\u001b[24m\u001b[m"]
[4.951860427856445,"o","\u001b[1m\u001b[32m\b \u001b[4m\u001b[34mb"]
[4.960858106613159,"o","\u001b[24m\u001b[m"]
[5.026880741119385,"o","\u001b[2;6Hb \u001b[36m\u001b[3;6H──\u001b[1m\u001b[97m\u001b[4;6Hpt\u001b[32m\u001b[5;6Hb\u001b[4m\u001b[34me"]
[5.038886547088623,"o","\u001b[24m\u001b[m"]
[5.0596160888671875,"o","\u001b[2;7He \u001b[36m\u001b[3;7H──\u001b[1m\u001b[97m\u001b[4;7Ht\u001b[22m\u001b[32m─\u001b[1m\u001b[5;7He\u001b[4m\u001b[34ms"]
[5.06990909576416,"o","\u001b[24m\u001b[m"]
[5.128671407699585,"o","\u001b[2;8Hs \u001b[36m\u001b[3;8H──\u001b[32m\u001b[4;8H──\u001b[1m\u001b[5;8Hs\u001b[4m\u001b[34mt"]
[5.147950649261475,"o","\u001b[24m\u001b[m"]
[5.197993993759155,"o","\u001b[2;9Ht \u001b[36m\u001b[3;9H──\u001b[32m\u001b[4;9H──\u001b[1m\u001b[5;9Ht\u001b[4m\u001b[34m "]
[5.210113525390625,"o","\u001b[24m\u001b[m"]
[5.27980375289917,"o","\u001b[1m\u001b[32m\b \u001b[4m\u001b[34mw"]
[5.28824520111084,"o","\u001b[24m\u001b[m"]
[5.347570896148682,"o","\u001b[2;11Hw \u001b[36m\u001b[3;11H──\u001b[32m\u001b[4;11H──\u001b[1m\u001b[5;11Hw\u001b[4m\u001b[34ma"]
[5.365937948226929,"o","\u001b[24m\u001b[m"]
[5.404861927032471,"o","\u001b[2;12Ha \u001b[36m\u001b[3;12H──\u001b[32m\u001b[4;12H──\u001b[1m\u001b[5;12Ha\u001b[4m\u001b[34my"]
[5.428235292434692,"o","\u001b[24m\u001b[m"]
[5.495815277099609,"o","\u001b[2;13Hy \u001b[36m\u001b[3;13H──\u001b[32m\u001b[4;13H──\u001b[1m\u001b[5;13Hy\u001b[4m\u001b[34m "]
[5.5063323974609375,"o","\u001b[24m\u001b[m"]
[5.563552618026733,"o","\u001b[1m\u001b[32m\b \u001b[4m\u001b[34mo"]
[5.584038734436035,"o","\u001b[24m\u001b[m"]
[5.665868043899536,"o","\u001b[2;15Ho \u001b[36m\u001b[3;15H──\u001b[32m\u001b[4;15H──\u001b[1m\u001b[5;15Ho\u001b[4m\u001b[34mu"]
[5.677497625350952,"o","\u001b[24m\u001b[m"]
[5.74094557762146,"o","\u001b[2;16Hu \u001b[36m\u001b[3;16H──\u001b[32m\u001b[4;16H──\u001b[1m\u001b[5;16Hu\u001b[4m\u001b[34mt"]
[5.755569219589233,"o","\u001b[24m\u001b[m"]
[5.795818328857422,"o","\u001b[H\u001b[K\r\n \u001b[36m╭\u001b[1m\u001b[97mOverview\u001b[22m\u001b[36m──────────────────────────────────────────────────╮╭\u001b[1m\u001b[97mWorst Keys\u001b[22m\u001b[36m───────────────────────────────────────────────╮\u001b[m \r\n \u001b[36m│\u001b[m\u001b[58X\u001b[36m\u001b[58C││\u001b[m\u001b[57X\u001b[36m\u001b[57C│\u001b[m \r\n \u001b[36m│\u001b[mAdjusted WPM: 166.4\u001b[39X\u001b[36m\u001b[39C││\u001b[m-   at 75.0% accuracy\u001b[36X\u001b[36m\u001b[36C│\u001b[m \r\n \u001b[36m│\u001b[mAccuracy: 93.8%\u001b[20X\u001b[20C\u001b[23X\u001b[36m\u001b[23C││\u001b[m\u001b[57X\u001b[36m\u001b[57C│\u001b[m \r\n \u001b[36m│\u001b[mRaw WPM: 17\u001b[K\u001b[32m\u001b[107C│"]
[5.818266153335571,"o","\u001b[m\r \u001b[36m│\u001b[mRaw WPM: 177.5\u001b[44X\u001b[36m\u001b[44C││\u001b[m\u001b[57X\u001b[36m\u001b[57C│\u001b[m \r\n \u001b[36m│\u001b[mCorrect Keypresses: 15/16\u001b[33X\u001b[36m\u001b[33C││\u001b[m\u001b[57X\u001b[36m\u001b[57C│\u001b[m \r\n \u001b[36m│\u001b[m\u001b[58X\u001b[36m\u001b[58C││\u001b[m\u001b[57X\u001b[36m\u001b[57C│\u001b[m \r\n \u001b[36m│\u001b[m\u001b[58X\u001b[36m\u001b[58C││\u001b[m\u001b[57X\u001b[36m\u001b[57C│\u001b[m \r\n \u001b[36m│\u001b[m\u001b[58X\u001b[36m\u001b[58C││\u001b[m\u001b[57X\u001b[36m\u001b[57C│\u001b[m \r\n \u001b[36m│\u001b[m\u001b[58X\u001b[36m\u001b[58C││\u001b[m\u001b[57X\u001b[36m\u001b[57C│\u001b[m \r\n \u001b[36m│\u001b[m\u001b[58X\u001b[36m\u001b[58C││\u001b[m\u001b[57X\u001b[36m\u001b[57C│\u001b[m \r\n \u001b[36m│\u001b[m\u001b[58X\u001b[36m\u001b[58C││\u001b[m\u001b[57X\u001b[36m\u001b[57C│\u001b[m \r\n \u001b[36m╰──────────────────────────────────────────────────────────╯╰─────────────────────────────────────────────────────────╯\u001b[m \r\n \u001b[1m\u001b[97mChart\u001b[m\u001b[K\u001b[114C \r\n 188│\u001b[1mWPM (10-keypress rolling average)\u001b[22m\u001b[43X\u001b[36m\u001b[43C⢣\u001b[m\u001b[33X\u001b[33C┌───┐ \r\n    "]
[5.819575309753418,"o","│\u001b[76X\u001b[36m\u001b[76C⠈⡆\u001b[m\u001b[32X\u001b[32C│\u001b[36mWPM\u001b[m│ \r\n    │\u001b[77X\u001b[36m\u001b[77C⢱\u001b[m\u001b[32X\u001b[32C└───┘ \r\n    │\u001b[78X\u001b[36m\u001b[78C⢇\u001b[m\u001b[K\u001b[36C \r\n    │\u001b[78X\u001b[36m\u001b[78C⠘⡄\u001b[m\u001b[K\u001b[35C \r\n 183│\u001b[79X\u001b[36m\u001b[79C⢣\u001b[m\u001b[K\u001b[35C \r\n    │\u001b[79X\u001b[36m\u001b[79C⠈⡆\u001b[m\u001b[K\u001b[34C \r\n    │\u001b[80X\u001b[36m\u001b[80C⢸\u001b[m\u001b[K\u001b[34C \r\n    │\u001b[81X\u001b[36m\u001b[81C⢇\u001b[m\u001b[9X\u001b[36m\u001b[9C⢀\u001b[m\u001b[K\u001b[23C \r\n    │\u001b[81X\u001b[36m\u001b[81C⠘⡄\u001b[m      \u001b[36m⣀⠔⠉⡆\u001b[m\u001b[K\u001b[22C \r\n 178│\u001b[82X\u001b[36m\u001b[82C⢱\u001b[m    \u001b[36m⡠⠊\u001b[m   \u001b[36m⠸⡀\u001b[m\u001b[K\u001b[21C \r\n    │\u001b[82X\u001b[36m\u001b[82C⠈⡆⢀⠤⠊\u001b[m      \u001b[36m⢣\u001b[m\u001b[K\u001b[21C \r\n    │\u001b[83X\u001b[36m\u001b[83C⠘⠁\u001b[m        \u001b[36m⠘⡄\u001b[m\u001b[K\u001b[20C \r\n    │\u001b[94X\u001b[36m\u001b[94C⢱\u001b[m\u001b[K\u001b[20C \r\n    │\u001b[95X\u001b[36m\u001b[95C⢇\u001b[m\u001b[K\u001b[19C \r\n 173│\u001b[95X\u001b[36m\u001b[95C⠘⡄\u001b[m\u001b[K\u001b[18C \r\n    │\u001b[96X\u001b[36m\u001b[96C⢱\u001b[m\u001b[K\u001b[18C \r\n    │\u001b[97X\u001b[36m\u001b[97C⡇\u001b[m\u001b[K\u001b[17C \r\n    │\u001b[97X\u001b[36m\u001b[97C⠸⡀\u001b[m\u001b[K\u001b[16C \r\n    │\u001b[98X\u001b[36m\u001b[98C⢣\u001b[m\u001b[K\u001b[16C \r\n 168│\u001b[98X\u001b[36m\u001b[98C⠈⠦⠤⠤⠤⠤⠤⠤⠤⡀\u001b[m        \r\n    │\u001b[107X\u001b[36m\u001b[107C⠈⠢⡀\u001b"]
[5.8215696811676025,"o","[m      \r\n    │\u001b[109X\u001b[36m\u001b[109C⠈⢢\u001b[m     \r\n    │\u001b[111X\u001b[36m\u001b[111C⠑⢄\u001b[m   \r\n 163│\u001b[105X\u001b[36m\u001b[105CKeypresses\u001b[m \r\n \u001b[K\u001b[119C \u001b[3m\r\nPress 'q' to quit, 'r' for another test or 'p' to practice missed words\u001b[23m\u001b[K\u001b[50C"]
[9.284175634384155,"o","\u001b[HPowerShell 7.5.0-preview.2\u001b[K\r\nLoading personal and system profiles took 1308ms.\u001b[K\u001b[31m\r\nusername\u001b[m \u001b[34m~\u001b[m \u001b[K\u001b[35m\r\n❯\u001b[m (\u001b[93mirm\u001b[m https://api.quotable.io/random).\u001b[97mcontent\u001b[m | \u001b[93mttyper\u001b[m -\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\r\n\u001b[K\u001b[121C"]
[9.2934091091156,"o","\u001b[5;1H\u001b[?25h"]
[9.393930435180664,"o","\u001b[31musername\u001b[m \u001b[34m~\u001b[m \u001b[33m5s\u001b[m \u001b[35m\r\n❯\u001b[m \u001b[9X"]
'@ > file.cast

❯ termsvg play file.cast
termsvg: error: unexpected end of JSON input

❯ termsvg export file.cast -o file.svg
termsvg: error: unexpected end of JSON input

❯ termsvg --version
termsvg has version 0.9.0 built from 642f0a4 on 2024-02-14T16:48:39Z

❯ $_=Get-ItemProperty 'HKLM:/SOFTWARE/Microsoft/Windows NT/CurrentVersion';$_.CurrentBuild+'.'+$_.UBR
19044.4412
MrMarble commented 4 months ago

I think the problem is with the header of the cast, PowerSession adds a custom environment property POWERSESSION_RECORDING as you can see on the test file https://github.com/Watfaq/PowerSession-rs/blob/75495685faaa40fac9932ad9dcb439f461fd0705/testdata/play.txt#L1C94-L1C116 which is not expected on my definition of environment https://github.com/MrMarble/termsvg/blob/642f0a49f3671b466e074eec68a354a6b0ecea1e/pkg/asciicast/asciicast.go#L27-L30 at least that my quick guess, I'll need to have a deeper look just in case.

I'll try to fix it soon

brian6932 commented 4 months ago

Doesn't seem like a POWERSESSION_RECORDING property showed up in my recording 🤔

MrMarble commented 4 months ago

Doesn't seem like a POWERSESSION_RECORDING property showed up in my recording 🤔

You're right, it was way simpler than that, just had to ignore empty lines

brian6932 commented 4 months ago

Now getting

❯ termsvg export file.cast -o file2.svg
unexpected fault address 0x4a5e0c8
fatal error: fault
[signal 0xc0000005 code=0x0 addr=0x4a5e0c8 pc=0x247804]

goroutine 1 gp=0xc000068000 m=0 mp=0x61efc0 [running]:
runtime.throw({0x3e0839?, 0xc0000a50e8?})
        runtime/panic.go:1023 +0x65 fp=0xc0000a4e90 sp=0xc0000a4e60 pc=0x102305
runtime.sigpanic()
        runtime/signal_windows.go:414 +0xca fp=0xc0000a4ec0 sp=0xc0000a4e90 pc=0x116f6a
github.com/mrmarble/termsvg/pkg/color.GetColor(0x390680?)
        github.com/mrmarble/termsvg/pkg/color/color.go:14 +0x24 fp=0xc0000a4ec8 sp=0xc0000a4ec0 pc=0x247804
github.com/mrmarble/termsvg/internal/svg.(*Canvas).getColors(0xc0000a5038, {0x1e780?, 0xc0?, 0x5c?, 0x0?})
        github.com/mrmarble/termsvg/internal/svg/svg.go:98 +0x25 fp=0xc0000a4f30 sp=0xc0000a4ec8 pc=0x2484a5
github.com/mrmarble/termsvg/internal/svg.parseCast(0xc0000a5038)
        github.com/mrmarble/termsvg/internal/svg/svg.go:91 +0x13a fp=0xc0000a4fc0 sp=0xc0000a4f30 pc=0x24841a
github.com/mrmarble/termsvg/internal/svg.createCanvas(0xc0001ba5a0, {{0x2, 0x79, 0x2a, 0x66477b02, 0x4022917f78000000, 0x
0, {0x0, 0x0}, {0x0, ...}, ...}, ...}, ...)
        github.com/mrmarble/termsvg/internal/svg/svg.go:57 +0x14a fp=0xc0000a5248 sp=0xc0000a4fc0 pc=0x24800a
github.com/mrmarble/termsvg/internal/svg.Export({{0x2, 0x79, 0x2a, 0x66477b02, 0x4022917f78000000, 0x0, {0x0, 0x0}, {0x0,
 0x0}, ...}, ...}, ...)
        github.com/mrmarble/termsvg/internal/svg/svg.go:49 +0x105 fp=0xc0000a52f0 sp=0xc0000a5248 pc=0x247de5
github.com/mrmarble/termsvg/cmd/termsvg/export.export({0xc000016c80?, 0xc00000b618?}, {0xc000016ca0, 0x1a}, 0x0, {0x0, 0x
0}, {0x0, 0x0}, 0x0)
        github.com/mrmarble/termsvg/cmd/termsvg/export/export.go:73 +0x36b fp=0xc0000a5520 sp=0xc0000a52f0 pc=0x35368b
github.com/mrmarble/termsvg/cmd/termsvg/export.(*Cmd).Run(0x16775d?)
        github.com/mrmarble/termsvg/cmd/termsvg/export/export.go:29 +0x85 fp=0xc0000a5590 sp=0xc0000a5520 pc=0x3532a5
runtime.call16(0xc000195830, 0xc000072178, 0x0, 0x0, 0x0, 0x8, 0xc0000a5868)
        runtime/asm_amd64.s:770 +0x48 fp=0xc0000a55b0 sp=0xc0000a5590 pc=0x132808
runtime.reflectcall(0x38bfa0?, 0xc00003c3b8?, 0x1?, 0xa5868?, 0xc0?, 0x1?, 0x1?)
        <autogenerated>:1 +0x36 fp=0xc0000a55f0 sp=0xc0000a55b0 pc=0x13a016
reflect.Value.call({0x38bfa0?, 0xc00003c3b8?, 0x15d0b5?}, {0x3e03b6, 0x4}, {0xc0000a5ca8, 0x0, 0x160217?})
        reflect/value.go:596 +0x90a fp=0xc0000a5bc8 sp=0xc0000a55f0 pc=0x168fca
reflect.Value.Call({0x38bfa0?, 0xc00003c3b8?, 0x396de0?}, {0xc0000a5ca8, 0x0, 0x0})
        reflect/value.go:380 +0x92 fp=0xc0000a5c30 sp=0xc0000a5bc8 pc=0x168592
github.com/alecthomas/kong.callFunction({0x38bfa0?, 0xc00003c3b8?, 0xc0000a5e20?}, 0xc0001957a0)
        github.com/alecthomas/kong@v0.8.1/callbacks.go:98 +0x465 fp=0xc0000a5d68 sp=0xc0000a5c30 pc=0x208945
github.com/alecthomas/kong.(*Context).RunNode(0xc00003c400, 0xc00018c4b0, {0xc0000a5f10, 0x1, 0x1})
        github.com/alecthomas/kong@v0.8.1/context.go:765 +0x3fc fp=0xc0000a5e88 sp=0xc0000a5d68 pc=0x20da5c
github.com/alecthomas/kong.(*Context).Run(0xc00003c400, {0xc0000a5f10, 0x1, 0x1})
        github.com/alecthomas/kong@v0.8.1/context.go:790 +0xec fp=0xc0000a5ec8 sp=0xc0000a5e88 pc=0x20dc4c
main.main()
        github.com/mrmarble/termsvg/cmd/termsvg/main_windows.go:58 +0x129 fp=0xc0000a5f78 sp=0xc0000a5ec8 pc=0x353f89
runtime.main()
        runtime/proc.go:271 +0x232 fp=0xc0000a5fe0 sp=0xc0000a5f78 pc=0x104a12
runtime.goexit({})
        runtime/asm_amd64.s:1695 +0x1 fp=0xc0000a5fe8 sp=0xc0000a5fe0 pc=0x134301

goroutine 2 gp=0xc000068700 m=nil [force gc (idle)]:
runtime.gopark(0x4132b8, 0x61dbc0, 0x11, 0xa, 0x1)
        runtime/proc.go:402 +0xfc fp=0xc00006bf80 sp=0xc00006bf50 pc=0x104e5c
runtime.goparkunlock(0x61dbc0?, 0x0?, 0x0?, 0x0?)
        runtime/proc.go:408 +0x25 fp=0xc00006bfb0 sp=0xc00006bf80 pc=0x104ee5
runtime.forcegchelper()
        runtime/proc.go:326 +0xb5 fp=0xc00006bfe0 sp=0xc00006bfb0 pc=0x104c75
runtime.goexit({})
        runtime/asm_amd64.s:1695 +0x1 fp=0xc00006bfe8 sp=0xc00006bfe0 pc=0x134301
created by runtime.init.6 in goroutine 1
        runtime/proc.go:314 +0x1a

goroutine 3 gp=0xc000068a80 m=nil [GC sweep wait]:
runtime.gopark(0x4132b8, 0x61dfe0, 0xc, 0x9, 0x1)
        runtime/proc.go:402 +0xfc fp=0xc00006df58 sp=0xc00006df28 pc=0x104e5c
runtime.goparkunlock(0x61dfe0?, 0x0?, 0x0?, 0x0?)
        runtime/proc.go:408 +0x25 fp=0xc00006df88 sp=0xc00006df58 pc=0x104ee5
runtime.bgsweep(0xc000024150)
        runtime/mgcsweep.go:278 +0xa5 fp=0xc00006dfc8 sp=0xc00006df88 pc=0xee625
runtime.gcenable.gowrap1()
        runtime/mgc.go:203 +0x25 fp=0xc00006dfe0 sp=0xc00006dfc8 pc=0xe2605
runtime.goexit({})
        runtime/asm_amd64.s:1695 +0x1 fp=0xc00006dfe8 sp=0xc00006dfe0 pc=0x134301
created by runtime.gcenable in goroutine 1
        runtime/mgc.go:203 +0x66

goroutine 4 gp=0xc000068c40 m=nil [GC scavenge wait]:
runtime.gopark(0x4132b8, 0x61e880, 0xd, 0xa, 0x2)
        runtime/proc.go:402 +0xfc fp=0xc00007df48 sp=0xc00007df18 pc=0x104e5c
runtime.goparkunlock(0x61e880?, 0x1?, 0x0?, 0xc000068c40?)
        runtime/proc.go:408 +0x25 fp=0xc00007df78 sp=0xc00007df48 pc=0x104ee5
runtime.(*scavengerState).park(0x61e880)
        runtime/mgcscavenge.go:425 +0x45 fp=0xc00007dfa0 sp=0xc00007df78 pc=0xebc85
runtime.bgscavenge(0xc000024150)
        runtime/mgcscavenge.go:653 +0x45 fp=0xc00007dfc8 sp=0xc00007dfa0 pc=0xec1e5
runtime.gcenable.gowrap2()
        runtime/mgc.go:204 +0x25 fp=0xc00007dfe0 sp=0xc00007dfc8 pc=0xe25a5
runtime.goexit({})
        runtime/asm_amd64.s:1695 +0x1 fp=0xc00007dfe8 sp=0xc00007dfe0 pc=0x134301
created by runtime.gcenable in goroutine 1
        runtime/mgc.go:204 +0xa5

goroutine 5 gp=0xc000068fc0 m=nil [finalizer wait]:
runtime.gopark(0x412fe8, 0x6a5c70, 0x10, 0xa, 0x1)
        runtime/proc.go:402 +0xfc fp=0xc00006fe28 sp=0xc00006fdf8 pc=0x104e5c
runtime.runfinq()
        runtime/mfinal.go:194 +0x107 fp=0xc00006ffe0 sp=0xc00006fe28 pc=0xe1647
runtime.goexit({})
        runtime/asm_amd64.s:1695 +0x1 fp=0xc00006ffe8 sp=0xc00006ffe0 pc=0x134301
created by runtime.createfing in goroutine 1
        runtime/mfinal.go:164 +0x45

But play does seem to work now. I'll open a new issue.