[{"data":1,"prerenderedAt":902},["ShallowReactive",2],{"navigation_docs":3,"-guide-cli":116,"-guide-cli-surround":897},[4,36],{"title":5,"path":6,"stem":7,"children":8,"icon":35},"Guide","\u002Fguide","1.guide\u002F01.index",[9,11,15,19,23,27,31],{"title":10,"path":6,"stem":7},"Getting Started",{"title":12,"path":13,"stem":14},"Encode and decode","\u002Fguide\u002Ftransform","1.guide\u002F02.transform",{"title":16,"path":17,"stem":18},"Analysis","\u002Fguide\u002Fanalysis","1.guide\u002F03.analysis",{"title":20,"path":21,"stem":22},"CLI","\u002Fguide\u002Fcli","1.guide\u002F04.cli",{"title":24,"path":25,"stem":26},"Agents","\u002Fguide\u002Fagents","1.guide\u002F05.agents",{"title":28,"path":29,"stem":30},"Custom ciphers","\u002Fguide\u002Fcustom","1.guide\u002F06.custom",{"title":32,"path":33,"stem":34},"Playground","\u002Fguide\u002Fplayground","1.guide\u002F07.playground","i-solar-book-2-linear",{"title":37,"path":38,"stem":39,"children":40,"icon":115},"Ciphers","\u002Fciphers","2.ciphers\u002F00.index",[41,43,47,51,55,59,63,67,71,75,79,83,87,91,95,99,103,107,111],{"title":42,"path":38,"stem":39},"Overview",{"title":44,"path":45,"stem":46},"Caesar","\u002Fciphers\u002Fcaesar","2.ciphers\u002F01.caesar",{"title":48,"path":49,"stem":50},"ROT-13","\u002Fciphers\u002Frot13","2.ciphers\u002F02.rot13",{"title":52,"path":53,"stem":54},"ROT-47","\u002Fciphers\u002Frot47","2.ciphers\u002F03.rot47",{"title":56,"path":57,"stem":58},"Atbash","\u002Fciphers\u002Fatbash","2.ciphers\u002F04.atbash",{"title":60,"path":61,"stem":62},"Affine","\u002Fciphers\u002Faffine","2.ciphers\u002F05.affine",{"title":64,"path":65,"stem":66},"Vigenère","\u002Fciphers\u002Fvigenere","2.ciphers\u002F06.vigenere",{"title":68,"path":69,"stem":70},"Trithemius","\u002Fciphers\u002Ftrithemius","2.ciphers\u002F07.trithemius",{"title":72,"path":73,"stem":74},"Alberti","\u002Fciphers\u002Falberti","2.ciphers\u002F08.alberti",{"title":76,"path":77,"stem":78},"Playfair","\u002Fciphers\u002Fplayfair","2.ciphers\u002F09.playfair",{"title":80,"path":81,"stem":82},"Polybius square","\u002Fciphers\u002Fpolybius","2.ciphers\u002F10.polybius",{"title":84,"path":85,"stem":86},"Morse code","\u002Fciphers\u002Fmorse","2.ciphers\u002F11.morse",{"title":88,"path":89,"stem":90},"Bacon's cipher","\u002Fciphers\u002Fbacon","2.ciphers\u002F12.bacon",{"title":92,"path":93,"stem":94},"Tap code","\u002Fciphers\u002Ftap-code","2.ciphers\u002F13.tap-code",{"title":96,"path":97,"stem":98},"ADFGVX","\u002Fciphers\u002Fadfgvx","2.ciphers\u002F14.adfgvx",{"title":100,"path":101,"stem":102},"Bifid","\u002Fciphers\u002Fbifid","2.ciphers\u002F15.bifid",{"title":104,"path":105,"stem":106},"Rail fence","\u002Fciphers\u002Frail-fence","2.ciphers\u002F16.rail-fence",{"title":108,"path":109,"stem":110},"Columnar transposition","\u002Fciphers\u002Fcolumnar","2.ciphers\u002F17.columnar",{"title":112,"path":113,"stem":114},"Enigma M3","\u002Fciphers\u002Fenigma","2.ciphers\u002F18.enigma","i-solar-library-linear",{"id":117,"title":20,"body":118,"description":889,"extension":890,"links":891,"meta":892,"navigation":894,"path":21,"seo":895,"stem":22,"__hash__":896},"docs\u002F1.guide\u002F04.cli.md",{"type":119,"value":120,"toc":883},"minimark",[121,126,190,206,300,304,671,675,683,806,824,838,842,845,872,879],[122,123,125],"h2",{"id":124},"run-it","Run it",[127,128,133],"pre",{"className":129,"code":130,"language":131,"meta":132,"style":132},"language-bash shiki shiki-themes github-light github-light poimandres","pnpm add -g @agntn\u002Fciphers\nciphers caesar \"ATTACK AT DAWN\" --shift 3\n# DWWDFN DW GDZQ\n","bash","",[134,135,136,156,183],"code",{"__ignoreMap":132},[137,138,141,145,149,153],"span",{"class":139,"line":140},"line",1,[137,142,144],{"class":143},"sseY5","pnpm",[137,146,148],{"class":147},"sX7Zv"," add",[137,150,152],{"class":151},"sqT1Y"," -g",[137,154,155],{"class":147}," @agntn\u002Fciphers\n",[137,157,159,162,165,169,173,176,179],{"class":139,"line":158},2,[137,160,161],{"class":143},"ciphers",[137,163,164],{"class":147}," caesar",[137,166,168],{"class":167},"scVjq"," \"",[137,170,172],{"class":171},"sQ7BG","ATTACK AT DAWN",[137,174,175],{"class":167},"\"",[137,177,178],{"class":151}," --shift",[137,180,182],{"class":181},"siHFe"," 3\n",[137,184,186],{"class":139,"line":185},3,[137,187,189],{"class":188},"sjhu3","# DWWDFN DW GDZQ\n",[191,192,193,194,197,198,201,202,205],"p",{},"First argument not a subcommand? Then it's a cipher name and the CLI encodes. ",[134,195,196],{},"ciphers caesar ..."," and ",[134,199,200],{},"ciphers encode caesar ..."," are the same call, because typing ",[134,203,204],{},"encode"," every time gets old fast.",[207,208,209,222],"table",{},[210,211,212],"thead",{},[213,214,215,219],"tr",{},[216,217,218],"th",{},"Command",[216,220,221],{},"Description",[223,224,225,236,246,256,266,280,290],"tbody",{},[213,226,227,233],{},[228,229,230],"td",{},[134,231,232],{},"ciphers encode \u003Ccipher> \u003Ctext>",[228,234,235],{},"Encode with a cipher",[213,237,238,243],{},[228,239,240],{},[134,241,242],{},"ciphers decode \u003Ccipher> \u003Ctext>",[228,244,245],{},"Decode with a cipher",[213,247,248,253],{},[228,249,250],{},[134,251,252],{},"ciphers brute \u003Ctext>",[228,254,255],{},"All 25 Caesar shifts",[213,257,258,263],{},[228,259,260],{},[134,261,262],{},"ciphers frequency \u003Ctext>",[228,264,265],{},"Letter histogram and index of coincidence",[213,267,268,273],{},[228,269,270],{},[134,271,272],{},"ciphers ciphers",[228,274,275,276,279],{},"List the registered ciphers, ",[134,277,278],{},"-v"," adds the options",[213,281,282,287],{},[228,283,284],{},[134,285,286],{},"ciphers info \u003Ccipher>",[228,288,289],{},"One cipher's family, options and keyspace",[213,291,292,297],{},[228,293,294],{},[134,295,296],{},"ciphers mcp",[228,298,299],{},"Run the MCP server over stdio",[122,301,303],{"id":302},"examples","Examples",[127,305,307],{"className":129,"code":306,"language":131,"meta":132,"style":132},"ciphers encode caesar \"ATTACK AT DAWN\" --shift 3     # DWWDFN DW GDZQ\nciphers decode atbash \"ZGGZXP ZG WZDM\"                # ATTACK AT DAWN\nciphers encode vigenere \"ATTACK AT DAWN\" --key LEMON  # LXFOPV EF RNHR\nciphers encode alberti \"ATTACK AT DAWN\" --key ALBERTI --period 4\nciphers encode affine \"AFFINE CIPHER\" --a 5 --b 8     # IHHWVC SWFRCP\nciphers encode rail-fence \"WEAREDISCOVEREDRUNATONCE\" --rails 3\nciphers encode playfair \"HIDE THE GOLD\" --key \"PLAYFAIR EXAMPLE\"\nciphers encode columnar \"ATTACK AT DAWN\" --key ZEBRA\nciphers encode bifid \"FLEE AT ONCE\" --key BICONDITIONAL --period 5\nciphers encode enigma \"ATTACK AT DAWN\" --positions MCK --rings BDF --plugboard \"AV BS CG\"\nciphers encode morse \"SOS\"                             # ... --- ...\nciphers encode tap-code \"HELP\"                         # 2 3 1 5 3 1 3 5\nciphers brute \"KHOOR\"                                  # shift=3 → HELLO\nciphers frequency \"DWWDFN DW GDZQ\" --lang en\nciphers ciphers -v\nciphers info enigma\n",[134,308,309,332,352,376,403,435,457,484,505,532,570,590,610,628,649,660],{"__ignoreMap":132},[137,310,311,313,316,318,320,322,324,326,329],{"class":139,"line":140},[137,312,161],{"class":143},[137,314,315],{"class":147}," encode",[137,317,164],{"class":147},[137,319,168],{"class":167},[137,321,172],{"class":171},[137,323,175],{"class":167},[137,325,178],{"class":151},[137,327,328],{"class":181}," 3",[137,330,331],{"class":188},"     # DWWDFN DW GDZQ\n",[137,333,334,336,339,342,344,347,349],{"class":139,"line":158},[137,335,161],{"class":143},[137,337,338],{"class":147}," decode",[137,340,341],{"class":147}," atbash",[137,343,168],{"class":167},[137,345,346],{"class":171},"ZGGZXP ZG WZDM",[137,348,175],{"class":167},[137,350,351],{"class":188},"                # ATTACK AT DAWN\n",[137,353,354,356,358,361,363,365,367,370,373],{"class":139,"line":185},[137,355,161],{"class":143},[137,357,315],{"class":147},[137,359,360],{"class":147}," vigenere",[137,362,168],{"class":167},[137,364,172],{"class":171},[137,366,175],{"class":167},[137,368,369],{"class":151}," --key",[137,371,372],{"class":147}," LEMON",[137,374,375],{"class":188},"  # LXFOPV EF RNHR\n",[137,377,379,381,383,386,388,390,392,394,397,400],{"class":139,"line":378},4,[137,380,161],{"class":143},[137,382,315],{"class":147},[137,384,385],{"class":147}," alberti",[137,387,168],{"class":167},[137,389,172],{"class":171},[137,391,175],{"class":167},[137,393,369],{"class":151},[137,395,396],{"class":147}," ALBERTI",[137,398,399],{"class":151}," --period",[137,401,402],{"class":181}," 4\n",[137,404,406,408,410,413,415,418,420,423,426,429,432],{"class":139,"line":405},5,[137,407,161],{"class":143},[137,409,315],{"class":147},[137,411,412],{"class":147}," affine",[137,414,168],{"class":167},[137,416,417],{"class":171},"AFFINE CIPHER",[137,419,175],{"class":167},[137,421,422],{"class":151}," --a",[137,424,425],{"class":181}," 5",[137,427,428],{"class":151}," --b",[137,430,431],{"class":181}," 8",[137,433,434],{"class":188},"     # IHHWVC SWFRCP\n",[137,436,438,440,442,445,447,450,452,455],{"class":139,"line":437},6,[137,439,161],{"class":143},[137,441,315],{"class":147},[137,443,444],{"class":147}," rail-fence",[137,446,168],{"class":167},[137,448,449],{"class":171},"WEAREDISCOVEREDRUNATONCE",[137,451,175],{"class":167},[137,453,454],{"class":151}," --rails",[137,456,182],{"class":181},[137,458,460,462,464,467,469,472,474,476,478,481],{"class":139,"line":459},7,[137,461,161],{"class":143},[137,463,315],{"class":147},[137,465,466],{"class":147}," playfair",[137,468,168],{"class":167},[137,470,471],{"class":171},"HIDE THE GOLD",[137,473,175],{"class":167},[137,475,369],{"class":151},[137,477,168],{"class":167},[137,479,480],{"class":171},"PLAYFAIR EXAMPLE",[137,482,483],{"class":167},"\"\n",[137,485,487,489,491,494,496,498,500,502],{"class":139,"line":486},8,[137,488,161],{"class":143},[137,490,315],{"class":147},[137,492,493],{"class":147}," columnar",[137,495,168],{"class":167},[137,497,172],{"class":171},[137,499,175],{"class":167},[137,501,369],{"class":151},[137,503,504],{"class":147}," ZEBRA\n",[137,506,508,510,512,515,517,520,522,524,527,529],{"class":139,"line":507},9,[137,509,161],{"class":143},[137,511,315],{"class":147},[137,513,514],{"class":147}," bifid",[137,516,168],{"class":167},[137,518,519],{"class":171},"FLEE AT ONCE",[137,521,175],{"class":167},[137,523,369],{"class":151},[137,525,526],{"class":147}," BICONDITIONAL",[137,528,399],{"class":151},[137,530,531],{"class":181}," 5\n",[137,533,535,537,539,542,544,546,548,551,554,557,560,563,565,568],{"class":139,"line":534},10,[137,536,161],{"class":143},[137,538,315],{"class":147},[137,540,541],{"class":147}," enigma",[137,543,168],{"class":167},[137,545,172],{"class":171},[137,547,175],{"class":167},[137,549,550],{"class":151}," --positions",[137,552,553],{"class":147}," MCK",[137,555,556],{"class":151}," --rings",[137,558,559],{"class":147}," BDF",[137,561,562],{"class":151}," --plugboard",[137,564,168],{"class":167},[137,566,567],{"class":171},"AV BS CG",[137,569,483],{"class":167},[137,571,573,575,577,580,582,585,587],{"class":139,"line":572},11,[137,574,161],{"class":143},[137,576,315],{"class":147},[137,578,579],{"class":147}," morse",[137,581,168],{"class":167},[137,583,584],{"class":171},"SOS",[137,586,175],{"class":167},[137,588,589],{"class":188},"                             # ... --- ...\n",[137,591,593,595,597,600,602,605,607],{"class":139,"line":592},12,[137,594,161],{"class":143},[137,596,315],{"class":147},[137,598,599],{"class":147}," tap-code",[137,601,168],{"class":167},[137,603,604],{"class":171},"HELP",[137,606,175],{"class":167},[137,608,609],{"class":188},"                         # 2 3 1 5 3 1 3 5\n",[137,611,613,615,618,620,623,625],{"class":139,"line":612},13,[137,614,161],{"class":143},[137,616,617],{"class":147}," brute",[137,619,168],{"class":167},[137,621,622],{"class":171},"KHOOR",[137,624,175],{"class":167},[137,626,627],{"class":188},"                                  # shift=3 → HELLO\n",[137,629,631,633,636,638,641,643,646],{"class":139,"line":630},14,[137,632,161],{"class":143},[137,634,635],{"class":147}," frequency",[137,637,168],{"class":167},[137,639,640],{"class":171},"DWWDFN DW GDZQ",[137,642,175],{"class":167},[137,644,645],{"class":151}," --lang",[137,647,648],{"class":147}," en\n",[137,650,652,654,657],{"class":139,"line":651},15,[137,653,161],{"class":143},[137,655,656],{"class":147}," ciphers",[137,658,659],{"class":151}," -v\n",[137,661,663,665,668],{"class":139,"line":662},16,[137,664,161],{"class":143},[137,666,667],{"class":147}," info",[137,669,670],{"class":147}," enigma\n",[122,672,674],{"id":673},"flags","Flags",[191,676,677,197,679,682],{},[134,678,204],{},[134,680,681],{},"decode"," read the same flags. A flag the cipher doesn't use is ignored, no complaint.",[207,684,685,697],{},[210,686,687],{},[213,688,689,692,695],{},[216,690,691],{},"Flag",[216,693,694],{},"Alias",[216,696,37],{},[223,698,699,714,729,744,756,772,784,795],{},[213,700,701,706,711],{},[228,702,703],{},[134,704,705],{},"--shift \u003Cn>",[228,707,708],{},[134,709,710],{},"-s",[228,712,713],{},"caesar",[213,715,716,721,726],{},[228,717,718],{},[134,719,720],{},"--key \u003Cword>",[228,722,723],{},[134,724,725],{},"-k",[228,727,728],{},"vigenere, alberti, playfair, polybius, columnar, adfgvx, bifid",[213,730,731,736,741],{},[228,732,733],{},[134,734,735],{},"--rails \u003Cn>",[228,737,738],{},[134,739,740],{},"-r",[228,742,743],{},"rail-fence",[213,745,746,751,753],{},[228,747,748],{},[134,749,750],{},"--period \u003Cn>",[228,752],{},[228,754,755],{},"alberti, bifid",[213,757,758,767,769],{},[228,759,760,763,764],{},[134,761,762],{},"--a \u003Cn>",", ",[134,765,766],{},"--b \u003Cn>",[228,768],{},[228,770,771],{},"affine",[213,773,774,779,781],{},[228,775,776],{},[134,777,778],{},"--positions \u003CABC>",[228,780],{},[228,782,783],{},"enigma",[213,785,786,791,793],{},[228,787,788],{},[134,789,790],{},"--rings \u003CABC>",[228,792],{},[228,794,783],{},[213,796,797,802,804],{},[228,798,799],{},[134,800,801],{},"--plugboard \"AB CD\"",[228,803],{},[228,805,783],{},[191,807,808,811,812,815,816,819,820,823],{},[134,809,810],{},"frequency"," takes ",[134,813,814],{},"--lang en"," or ",[134,817,818],{},"--lang pl"," (",[134,821,822],{},"-l",").",[191,825,826,827,197,830,833,834,837],{},"The two library flags ",[134,828,829],{},"preserveCase",[134,831,832],{},"stripNonAlpha"," are not on the CLI. Quote the text and the shell keeps its case. When a puzzle wants a block, ",[134,835,836],{},"tr -cd A-Z"," does it in a pipe.",[122,839,841],{"id":840},"exit-codes-and-output","Exit codes and output",[191,843,844],{},"The transformed text goes to stdout, one line, nothing else. So it composes:",[127,846,848],{"className":129,"code":847,"language":131,"meta":132,"style":132},"ciphers rot13 \"$(ciphers atbash \"HELLO\")\"\n",[134,849,850],{"__ignoreMap":132},[137,851,852,854,857,860,862,864,866,869],{"class":139,"line":140},[137,853,161],{"class":143},[137,855,856],{"class":147}," rot13",[137,858,859],{"class":167}," \"$(",[137,861,161],{"class":143},[137,863,341],{"class":147},[137,865,168],{"class":167},[137,867,868],{"class":171},"HELLO",[137,870,871],{"class":167},"\")\"\n",[191,873,874,875,878],{},"A ",[134,876,877],{},"CipherError"," - unknown cipher, missing key, shift out of range - prints its message to stderr and exits 1. No stack trace. Anything else is a bug in the library and still gets one, on purpose.",[880,881,882],"style",{},"html pre.shiki code .sseY5, html code.shiki .sseY5{--shiki-light:#6F42C1;--shiki-default:#6F42C1;--shiki-dark:#91B4D5}html pre.shiki code .sX7Zv, html code.shiki .sX7Zv{--shiki-light:#032F62;--shiki-default:#032F62;--shiki-dark:#ADD7FF}html pre.shiki code .sqT1Y, html code.shiki .sqT1Y{--shiki-light:#005CC5;--shiki-default:#005CC5;--shiki-dark:#ADD7FF}html pre.shiki code .scVjq, html code.shiki .scVjq{--shiki-light:#032F62;--shiki-default:#032F62;--shiki-dark:#A6ACCD}html pre.shiki code .sQ7BG, html code.shiki .sQ7BG{--shiki-light:#032F62;--shiki-default:#032F62;--shiki-dark:#5DE4C7}html pre.shiki code .siHFe, html code.shiki .siHFe{--shiki-light:#005CC5;--shiki-default:#005CC5;--shiki-dark:#5DE4C7}html pre.shiki code .sjhu3, html code.shiki .sjhu3{--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#767C9DB0;--shiki-dark-font-style:italic}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":132,"searchDepth":158,"depth":158,"links":884},[885,886,887,888],{"id":124,"depth":158,"text":125},{"id":302,"depth":158,"text":303},{"id":673,"depth":158,"text":674},{"id":840,"depth":158,"text":841},"The ciphers command, seven subcommands, and the flags each cipher reads.","md",null,{"icon":893},"i-solar-code-square-linear",true,{"title":20,"description":889},"d1C3rg0h8AuWf3JL79bZEIHSDNv1H70Go1v7HWq8A_g",[898,900],{"title":16,"path":17,"stem":18,"description":899,"children":-1},"Brute force a Caesar with all 25 shifts. Read a histogram and the index of coincidence before guessing a key.",{"title":24,"path":25,"stem":26,"description":901,"children":-1},"The same five tools over MCP, the Pi extension and the OMP extension. What they validate, what they bound.",1788614952931]