@icarusmx/creta 1.4.18 → 1.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +395 -0
- package/bin/creta.js +1645 -25
- package/docs/diagrams/README.md +131 -0
- package/docs/diagrams/architecture-overview.mmd +71 -0
- package/docs/diagrams/architecture.svg +1 -0
- package/docs/diagrams/ecosystem-integration.mmd +49 -0
- package/docs/diagrams/evolution-phases.mmd +49 -0
- package/docs/diagrams/output.svg +1 -0
- package/docs/diagrams/phase2-command-help-flow.mmd +51 -0
- package/docs/diagrams/user-journey.mmd +78 -0
- package/lib/cli/index.js +6 -0
- package/lib/customizers/TerminalCustomizer.js +186 -15
- package/lib/data/command-help/cd.js +47 -0
- package/lib/data/command-help/git-add.js +43 -0
- package/lib/data/command-help/git-commit.js +39 -0
- package/lib/data/command-help/git-log.js +47 -0
- package/lib/data/command-help/git-push.js +35 -0
- package/lib/data/command-help/git-status.js +31 -0
- package/lib/data/command-help/index.js +30 -0
- package/lib/data/command-help/ls.js +51 -0
- package/lib/data/command-help/mkdir.js +31 -0
- package/lib/data/command-help/touch.js +26 -0
- package/lib/data/command-help/wc.js +43 -0
- package/lib/data/messages.js +16 -4
- package/lib/executors/CommandHelpExecutor.js +93 -0
- package/lib/papers/AccessControl.js +121 -0
- package/lib/papers/PapersExecutor.js +276 -0
- package/package.json +1 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg id="my-svg" width="100%" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" style="max-width: 1780.5px; background-color: white;" viewBox="-50 -10 1780.5 2156" role="graphics-document document" aria-roledescription="sequence"><g><rect x="1441" y="2070" fill="#eaeaea" stroke="#666" width="150" height="65" name="Data" rx="3" ry="3" class="actor actor-bottom"/><text x="1516" y="2102.5" dominant-baseline="central" alignment-baseline="central" class="actor actor-box" style="text-anchor: middle; font-size: 16px; font-weight: 400;"><tspan x="1516" dy="-8">command-help/</tspan></text><text x="1516" y="2102.5" dominant-baseline="central" alignment-baseline="central" class="actor actor-box" style="text-anchor: middle; font-size: 16px; font-weight: 400;"><tspan x="1516" dy="8">Data Store</tspan></text></g><g><rect x="1241" y="2070" fill="#eaeaea" stroke="#666" width="150" height="65" name="Formatter" rx="3" ry="3" class="actor actor-bottom"/><text x="1316" y="2102.5" dominant-baseline="central" alignment-baseline="central" class="actor actor-box" style="text-anchor: middle; font-size: 16px; font-weight: 400;"><tspan x="1316" dy="-8">CommandHelp</tspan></text><text x="1316" y="2102.5" dominant-baseline="central" alignment-baseline="central" class="actor actor-box" style="text-anchor: middle; font-size: 16px; font-weight: 400;"><tspan x="1316" dy="8">Formatter</tspan></text></g><g><rect x="1039" y="2070" fill="#eaeaea" stroke="#666" width="150" height="65" name="Help" rx="3" ry="3" class="actor actor-bottom"/><text x="1114" y="2102.5" dominant-baseline="central" alignment-baseline="central" class="actor actor-box" style="text-anchor: middle; font-size: 16px; font-weight: 400;"><tspan x="1114" dy="-8">Command Help</tspan></text><text x="1114" y="2102.5" dominant-baseline="central" alignment-baseline="central" class="actor actor-box" style="text-anchor: middle; font-size: 16px; font-weight: 400;"><tspan x="1114" dy="8">System</tspan></text></g><g><rect x="839" y="2070" fill="#eaeaea" stroke="#666" width="150" height="65" name="Detector" rx="3" ry="3" class="actor actor-bottom"/><text x="914" y="2102.5" dominant-baseline="central" alignment-baseline="central" class="actor actor-box" style="text-anchor: middle; font-size: 16px; font-weight: 400;"><tspan x="914" dy="0">Command Detector</tspan></text></g><g><rect x="533" y="2070" fill="#eaeaea" stroke="#666" width="150" height="65" name="Router" rx="3" ry="3" class="actor actor-bottom"/><text x="608" y="2102.5" dominant-baseline="central" alignment-baseline="central" class="actor actor-box" style="text-anchor: middle; font-size: 16px; font-weight: 400;"><tspan x="608" dy="-8">bin/creta.js</tspan></text><text x="608" y="2102.5" dominant-baseline="central" alignment-baseline="central" class="actor actor-box" style="text-anchor: middle; font-size: 16px; font-weight: 400;"><tspan x="608" dy="8">(Router)</tspan></text></g><g><rect x="282" y="2070" fill="#eaeaea" stroke="#666" width="150" height="65" name="Terminal" rx="3" ry="3" class="actor actor-bottom"/><text x="357" y="2102.5" dominant-baseline="central" alignment-baseline="central" class="actor actor-box" style="text-anchor: middle; font-size: 16px; font-weight: 400;"><tspan x="357" dy="0">Terminal</tspan></text></g><g><rect x="0" y="2070" fill="#eaeaea" stroke="#666" width="150" height="65" name="User" rx="3" ry="3" class="actor actor-bottom"/><text x="75" y="2102.5" dominant-baseline="central" alignment-baseline="central" class="actor actor-box" style="text-anchor: middle; font-size: 16px; font-weight: 400;"><tspan x="75" dy="0">User</tspan></text></g><g><line id="actor6" x1="1516" y1="65" x2="1516" y2="2070" class="actor-line 200" stroke-width="0.5px" stroke="#999" name="Data"/><g id="root-6"><rect x="1441" y="0" fill="#eaeaea" stroke="#666" width="150" height="65" name="Data" rx="3" ry="3" class="actor actor-top"/><text x="1516" y="32.5" dominant-baseline="central" alignment-baseline="central" class="actor actor-box" style="text-anchor: middle; font-size: 16px; font-weight: 400;"><tspan x="1516" dy="-8">command-help/</tspan></text><text x="1516" y="32.5" dominant-baseline="central" alignment-baseline="central" class="actor actor-box" style="text-anchor: middle; font-size: 16px; font-weight: 400;"><tspan x="1516" dy="8">Data Store</tspan></text></g></g><g><line id="actor5" x1="1316" y1="65" x2="1316" y2="2070" class="actor-line 200" stroke-width="0.5px" stroke="#999" name="Formatter"/><g id="root-5"><rect x="1241" y="0" fill="#eaeaea" stroke="#666" width="150" height="65" name="Formatter" rx="3" ry="3" class="actor actor-top"/><text x="1316" y="32.5" dominant-baseline="central" alignment-baseline="central" class="actor actor-box" style="text-anchor: middle; font-size: 16px; font-weight: 400;"><tspan x="1316" dy="-8">CommandHelp</tspan></text><text x="1316" y="32.5" dominant-baseline="central" alignment-baseline="central" class="actor actor-box" style="text-anchor: middle; font-size: 16px; font-weight: 400;"><tspan x="1316" dy="8">Formatter</tspan></text></g></g><g><line id="actor4" x1="1114" y1="65" x2="1114" y2="2070" class="actor-line 200" stroke-width="0.5px" stroke="#999" name="Help"/><g id="root-4"><rect x="1039" y="0" fill="#eaeaea" stroke="#666" width="150" height="65" name="Help" rx="3" ry="3" class="actor actor-top"/><text x="1114" y="32.5" dominant-baseline="central" alignment-baseline="central" class="actor actor-box" style="text-anchor: middle; font-size: 16px; font-weight: 400;"><tspan x="1114" dy="-8">Command Help</tspan></text><text x="1114" y="32.5" dominant-baseline="central" alignment-baseline="central" class="actor actor-box" style="text-anchor: middle; font-size: 16px; font-weight: 400;"><tspan x="1114" dy="8">System</tspan></text></g></g><g><line id="actor3" x1="914" y1="65" x2="914" y2="2070" class="actor-line 200" stroke-width="0.5px" stroke="#999" name="Detector"/><g id="root-3"><rect x="839" y="0" fill="#eaeaea" stroke="#666" width="150" height="65" name="Detector" rx="3" ry="3" class="actor actor-top"/><text x="914" y="32.5" dominant-baseline="central" alignment-baseline="central" class="actor actor-box" style="text-anchor: middle; font-size: 16px; font-weight: 400;"><tspan x="914" dy="0">Command Detector</tspan></text></g></g><g><line id="actor2" x1="608" y1="65" x2="608" y2="2070" class="actor-line 200" stroke-width="0.5px" stroke="#999" name="Router"/><g id="root-2"><rect x="533" y="0" fill="#eaeaea" stroke="#666" width="150" height="65" name="Router" rx="3" ry="3" class="actor actor-top"/><text x="608" y="32.5" dominant-baseline="central" alignment-baseline="central" class="actor actor-box" style="text-anchor: middle; font-size: 16px; font-weight: 400;"><tspan x="608" dy="-8">bin/creta.js</tspan></text><text x="608" y="32.5" dominant-baseline="central" alignment-baseline="central" class="actor actor-box" style="text-anchor: middle; font-size: 16px; font-weight: 400;"><tspan x="608" dy="8">(Router)</tspan></text></g></g><g><line id="actor1" x1="357" y1="65" x2="357" y2="2070" class="actor-line 200" stroke-width="0.5px" stroke="#999" name="Terminal"/><g id="root-1"><rect x="282" y="0" fill="#eaeaea" stroke="#666" width="150" height="65" name="Terminal" rx="3" ry="3" class="actor actor-top"/><text x="357" y="32.5" dominant-baseline="central" alignment-baseline="central" class="actor actor-box" style="text-anchor: middle; font-size: 16px; font-weight: 400;"><tspan x="357" dy="0">Terminal</tspan></text></g></g><g><line id="actor0" x1="75" y1="65" x2="75" y2="2070" class="actor-line 200" stroke-width="0.5px" stroke="#999" name="User"/><g id="root-0"><rect x="0" y="0" fill="#eaeaea" stroke="#666" width="150" height="65" name="User" rx="3" ry="3" class="actor actor-top"/><text x="75" y="32.5" dominant-baseline="central" alignment-baseline="central" class="actor actor-box" style="text-anchor: middle; font-size: 16px; font-weight: 400;"><tspan x="75" dy="0">User</tspan></text></g></g><style>#my-svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#my-svg .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#my-svg .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#my-svg .error-icon{fill:#552222;}#my-svg .error-text{fill:#552222;stroke:#552222;}#my-svg .edge-thickness-normal{stroke-width:1px;}#my-svg .edge-thickness-thick{stroke-width:3.5px;}#my-svg .edge-pattern-solid{stroke-dasharray:0;}#my-svg .edge-thickness-invisible{stroke-width:0;fill:none;}#my-svg .edge-pattern-dashed{stroke-dasharray:3;}#my-svg .edge-pattern-dotted{stroke-dasharray:2;}#my-svg .marker{fill:#333333;stroke:#333333;}#my-svg .marker.cross{stroke:#333333;}#my-svg svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#my-svg p{margin:0;}#my-svg .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#my-svg text.actor>tspan{fill:black;stroke:none;}#my-svg .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#my-svg .innerArc{stroke-width:1.5;stroke-dasharray:none;}#my-svg .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#my-svg .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#my-svg #arrowhead path{fill:#333;stroke:#333;}#my-svg .sequenceNumber{fill:white;}#my-svg #sequencenumber{fill:#333;}#my-svg #crosshead path{fill:#333;stroke:#333;}#my-svg .messageText{fill:#333;stroke:none;}#my-svg .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#my-svg .labelText,#my-svg .labelText>tspan{fill:black;stroke:none;}#my-svg .loopText,#my-svg .loopText>tspan{fill:black;stroke:none;}#my-svg .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#my-svg .note{stroke:#aaaa33;fill:#fff5ad;}#my-svg .noteText,#my-svg .noteText>tspan{fill:black;stroke:none;}#my-svg .activation0{fill:#f4f4f4;stroke:#666;}#my-svg .activation1{fill:#f4f4f4;stroke:#666;}#my-svg .activation2{fill:#f4f4f4;stroke:#666;}#my-svg .actorPopupMenu{position:absolute;}#my-svg .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#my-svg .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#my-svg .actor-man circle,#my-svg line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#my-svg :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}</style><g/><defs><symbol id="computer" width="24" height="24"><path transform="scale(.5)" d="M2 2v13h20v-13h-20zm18 11h-16v-9h16v9zm-10.228 6l.466-1h3.524l.467 1h-4.457zm14.228 3h-24l2-6h2.104l-1.33 4h18.45l-1.297-4h2.073l2 6zm-5-10h-14v-7h14v7z"/></symbol></defs><defs><symbol id="database" fill-rule="evenodd" clip-rule="evenodd"><path transform="scale(.5)" d="M12.258.001l.256.004.255.005.253.008.251.01.249.012.247.015.246.016.242.019.241.02.239.023.236.024.233.027.231.028.229.031.225.032.223.034.22.036.217.038.214.04.211.041.208.043.205.045.201.046.198.048.194.05.191.051.187.053.183.054.18.056.175.057.172.059.168.06.163.061.16.063.155.064.15.066.074.033.073.033.071.034.07.034.069.035.068.035.067.035.066.035.064.036.064.036.062.036.06.036.06.037.058.037.058.037.055.038.055.038.053.038.052.038.051.039.05.039.048.039.047.039.045.04.044.04.043.04.041.04.04.041.039.041.037.041.036.041.034.041.033.042.032.042.03.042.029.042.027.042.026.043.024.043.023.043.021.043.02.043.018.044.017.043.015.044.013.044.012.044.011.045.009.044.007.045.006.045.004.045.002.045.001.045v17l-.001.045-.002.045-.004.045-.006.045-.007.045-.009.044-.011.045-.012.044-.013.044-.015.044-.017.043-.018.044-.02.043-.021.043-.023.043-.024.043-.026.043-.027.042-.029.042-.03.042-.032.042-.033.042-.034.041-.036.041-.037.041-.039.041-.04.041-.041.04-.043.04-.044.04-.045.04-.047.039-.048.039-.05.039-.051.039-.052.038-.053.038-.055.038-.055.038-.058.037-.058.037-.06.037-.06.036-.062.036-.064.036-.064.036-.066.035-.067.035-.068.035-.069.035-.07.034-.071.034-.073.033-.074.033-.15.066-.155.064-.16.063-.163.061-.168.06-.172.059-.175.057-.18.056-.183.054-.187.053-.191.051-.194.05-.198.048-.201.046-.205.045-.208.043-.211.041-.214.04-.217.038-.22.036-.223.034-.225.032-.229.031-.231.028-.233.027-.236.024-.239.023-.241.02-.242.019-.246.016-.247.015-.249.012-.251.01-.253.008-.255.005-.256.004-.258.001-.258-.001-.256-.004-.255-.005-.253-.008-.251-.01-.249-.012-.247-.015-.245-.016-.243-.019-.241-.02-.238-.023-.236-.024-.234-.027-.231-.028-.228-.031-.226-.032-.223-.034-.22-.036-.217-.038-.214-.04-.211-.041-.208-.043-.204-.045-.201-.046-.198-.048-.195-.05-.19-.051-.187-.053-.184-.054-.179-.056-.176-.057-.172-.059-.167-.06-.164-.061-.159-.063-.155-.064-.151-.066-.074-.033-.072-.033-.072-.034-.07-.034-.069-.035-.068-.035-.067-.035-.066-.035-.064-.036-.063-.036-.062-.036-.061-.036-.06-.037-.058-.037-.057-.037-.056-.038-.055-.038-.053-.038-.052-.038-.051-.039-.049-.039-.049-.039-.046-.039-.046-.04-.044-.04-.043-.04-.041-.04-.04-.041-.039-.041-.037-.041-.036-.041-.034-.041-.033-.042-.032-.042-.03-.042-.029-.042-.027-.042-.026-.043-.024-.043-.023-.043-.021-.043-.02-.043-.018-.044-.017-.043-.015-.044-.013-.044-.012-.044-.011-.045-.009-.044-.007-.045-.006-.045-.004-.045-.002-.045-.001-.045v-17l.001-.045.002-.045.004-.045.006-.045.007-.045.009-.044.011-.045.012-.044.013-.044.015-.044.017-.043.018-.044.02-.043.021-.043.023-.043.024-.043.026-.043.027-.042.029-.042.03-.042.032-.042.033-.042.034-.041.036-.041.037-.041.039-.041.04-.041.041-.04.043-.04.044-.04.046-.04.046-.039.049-.039.049-.039.051-.039.052-.038.053-.038.055-.038.056-.038.057-.037.058-.037.06-.037.061-.036.062-.036.063-.036.064-.036.066-.035.067-.035.068-.035.069-.035.07-.034.072-.034.072-.033.074-.033.151-.066.155-.064.159-.063.164-.061.167-.06.172-.059.176-.057.179-.056.184-.054.187-.053.19-.051.195-.05.198-.048.201-.046.204-.045.208-.043.211-.041.214-.04.217-.038.22-.036.223-.034.226-.032.228-.031.231-.028.234-.027.236-.024.238-.023.241-.02.243-.019.245-.016.247-.015.249-.012.251-.01.253-.008.255-.005.256-.004.258-.001.258.001zm-9.258 20.499v.01l.001.021.003.021.004.022.005.021.006.022.007.022.009.023.01.022.011.023.012.023.013.023.015.023.016.024.017.023.018.024.019.024.021.024.022.025.023.024.024.025.052.049.056.05.061.051.066.051.07.051.075.051.079.052.084.052.088.052.092.052.097.052.102.051.105.052.11.052.114.051.119.051.123.051.127.05.131.05.135.05.139.048.144.049.147.047.152.047.155.047.16.045.163.045.167.043.171.043.176.041.178.041.183.039.187.039.19.037.194.035.197.035.202.033.204.031.209.03.212.029.216.027.219.025.222.024.226.021.23.02.233.018.236.016.24.015.243.012.246.01.249.008.253.005.256.004.259.001.26-.001.257-.004.254-.005.25-.008.247-.011.244-.012.241-.014.237-.016.233-.018.231-.021.226-.021.224-.024.22-.026.216-.027.212-.028.21-.031.205-.031.202-.034.198-.034.194-.036.191-.037.187-.039.183-.04.179-.04.175-.042.172-.043.168-.044.163-.045.16-.046.155-.046.152-.047.148-.048.143-.049.139-.049.136-.05.131-.05.126-.05.123-.051.118-.052.114-.051.11-.052.106-.052.101-.052.096-.052.092-.052.088-.053.083-.051.079-.052.074-.052.07-.051.065-.051.06-.051.056-.05.051-.05.023-.024.023-.025.021-.024.02-.024.019-.024.018-.024.017-.024.015-.023.014-.024.013-.023.012-.023.01-.023.01-.022.008-.022.006-.022.006-.022.004-.022.004-.021.001-.021.001-.021v-4.127l-.077.055-.08.053-.083.054-.085.053-.087.052-.09.052-.093.051-.095.05-.097.05-.1.049-.102.049-.105.048-.106.047-.109.047-.111.046-.114.045-.115.045-.118.044-.12.043-.122.042-.124.042-.126.041-.128.04-.13.04-.132.038-.134.038-.135.037-.138.037-.139.035-.142.035-.143.034-.144.033-.147.032-.148.031-.15.03-.151.03-.153.029-.154.027-.156.027-.158.026-.159.025-.161.024-.162.023-.163.022-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.011-.178.01-.179.008-.179.008-.181.006-.182.005-.182.004-.184.003-.184.002h-.37l-.184-.002-.184-.003-.182-.004-.182-.005-.181-.006-.179-.008-.179-.008-.178-.01-.176-.011-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.022-.162-.023-.161-.024-.159-.025-.157-.026-.156-.027-.155-.027-.153-.029-.151-.03-.15-.03-.148-.031-.146-.032-.145-.033-.143-.034-.141-.035-.14-.035-.137-.037-.136-.037-.134-.038-.132-.038-.13-.04-.128-.04-.126-.041-.124-.042-.122-.042-.12-.044-.117-.043-.116-.045-.113-.045-.112-.046-.109-.047-.106-.047-.105-.048-.102-.049-.1-.049-.097-.05-.095-.05-.093-.052-.09-.051-.087-.052-.085-.053-.083-.054-.08-.054-.077-.054v4.127zm0-5.654v.011l.001.021.003.021.004.021.005.022.006.022.007.022.009.022.01.022.011.023.012.023.013.023.015.024.016.023.017.024.018.024.019.024.021.024.022.024.023.025.024.024.052.05.056.05.061.05.066.051.07.051.075.052.079.051.084.052.088.052.092.052.097.052.102.052.105.052.11.051.114.051.119.052.123.05.127.051.131.05.135.049.139.049.144.048.147.048.152.047.155.046.16.045.163.045.167.044.171.042.176.042.178.04.183.04.187.038.19.037.194.036.197.034.202.033.204.032.209.03.212.028.216.027.219.025.222.024.226.022.23.02.233.018.236.016.24.014.243.012.246.01.249.008.253.006.256.003.259.001.26-.001.257-.003.254-.006.25-.008.247-.01.244-.012.241-.015.237-.016.233-.018.231-.02.226-.022.224-.024.22-.025.216-.027.212-.029.21-.03.205-.032.202-.033.198-.035.194-.036.191-.037.187-.039.183-.039.179-.041.175-.042.172-.043.168-.044.163-.045.16-.045.155-.047.152-.047.148-.048.143-.048.139-.05.136-.049.131-.05.126-.051.123-.051.118-.051.114-.052.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.051.07-.052.065-.051.06-.05.056-.051.051-.049.023-.025.023-.024.021-.025.02-.024.019-.024.018-.024.017-.024.015-.023.014-.023.013-.024.012-.022.01-.023.01-.023.008-.022.006-.022.006-.022.004-.021.004-.022.001-.021.001-.021v-4.139l-.077.054-.08.054-.083.054-.085.052-.087.053-.09.051-.093.051-.095.051-.097.05-.1.049-.102.049-.105.048-.106.047-.109.047-.111.046-.114.045-.115.044-.118.044-.12.044-.122.042-.124.042-.126.041-.128.04-.13.039-.132.039-.134.038-.135.037-.138.036-.139.036-.142.035-.143.033-.144.033-.147.033-.148.031-.15.03-.151.03-.153.028-.154.028-.156.027-.158.026-.159.025-.161.024-.162.023-.163.022-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.011-.178.009-.179.009-.179.007-.181.007-.182.005-.182.004-.184.003-.184.002h-.37l-.184-.002-.184-.003-.182-.004-.182-.005-.181-.007-.179-.007-.179-.009-.178-.009-.176-.011-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.022-.162-.023-.161-.024-.159-.025-.157-.026-.156-.027-.155-.028-.153-.028-.151-.03-.15-.03-.148-.031-.146-.033-.145-.033-.143-.033-.141-.035-.14-.036-.137-.036-.136-.037-.134-.038-.132-.039-.13-.039-.128-.04-.126-.041-.124-.042-.122-.043-.12-.043-.117-.044-.116-.044-.113-.046-.112-.046-.109-.046-.106-.047-.105-.048-.102-.049-.1-.049-.097-.05-.095-.051-.093-.051-.09-.051-.087-.053-.085-.052-.083-.054-.08-.054-.077-.054v4.139zm0-5.666v.011l.001.02.003.022.004.021.005.022.006.021.007.022.009.023.01.022.011.023.012.023.013.023.015.023.016.024.017.024.018.023.019.024.021.025.022.024.023.024.024.025.052.05.056.05.061.05.066.051.07.051.075.052.079.051.084.052.088.052.092.052.097.052.102.052.105.051.11.052.114.051.119.051.123.051.127.05.131.05.135.05.139.049.144.048.147.048.152.047.155.046.16.045.163.045.167.043.171.043.176.042.178.04.183.04.187.038.19.037.194.036.197.034.202.033.204.032.209.03.212.028.216.027.219.025.222.024.226.021.23.02.233.018.236.017.24.014.243.012.246.01.249.008.253.006.256.003.259.001.26-.001.257-.003.254-.006.25-.008.247-.01.244-.013.241-.014.237-.016.233-.018.231-.02.226-.022.224-.024.22-.025.216-.027.212-.029.21-.03.205-.032.202-.033.198-.035.194-.036.191-.037.187-.039.183-.039.179-.041.175-.042.172-.043.168-.044.163-.045.16-.045.155-.047.152-.047.148-.048.143-.049.139-.049.136-.049.131-.051.126-.05.123-.051.118-.052.114-.051.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.052.07-.051.065-.051.06-.051.056-.05.051-.049.023-.025.023-.025.021-.024.02-.024.019-.024.018-.024.017-.024.015-.023.014-.024.013-.023.012-.023.01-.022.01-.023.008-.022.006-.022.006-.022.004-.022.004-.021.001-.021.001-.021v-4.153l-.077.054-.08.054-.083.053-.085.053-.087.053-.09.051-.093.051-.095.051-.097.05-.1.049-.102.048-.105.048-.106.048-.109.046-.111.046-.114.046-.115.044-.118.044-.12.043-.122.043-.124.042-.126.041-.128.04-.13.039-.132.039-.134.038-.135.037-.138.036-.139.036-.142.034-.143.034-.144.033-.147.032-.148.032-.15.03-.151.03-.153.028-.154.028-.156.027-.158.026-.159.024-.161.024-.162.023-.163.023-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.01-.178.01-.179.009-.179.007-.181.006-.182.006-.182.004-.184.003-.184.001-.185.001-.185-.001-.184-.001-.184-.003-.182-.004-.182-.006-.181-.006-.179-.007-.179-.009-.178-.01-.176-.01-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.023-.162-.023-.161-.024-.159-.024-.157-.026-.156-.027-.155-.028-.153-.028-.151-.03-.15-.03-.148-.032-.146-.032-.145-.033-.143-.034-.141-.034-.14-.036-.137-.036-.136-.037-.134-.038-.132-.039-.13-.039-.128-.041-.126-.041-.124-.041-.122-.043-.12-.043-.117-.044-.116-.044-.113-.046-.112-.046-.109-.046-.106-.048-.105-.048-.102-.048-.1-.05-.097-.049-.095-.051-.093-.051-.09-.052-.087-.052-.085-.053-.083-.053-.08-.054-.077-.054v4.153zm8.74-8.179l-.257.004-.254.005-.25.008-.247.011-.244.012-.241.014-.237.016-.233.018-.231.021-.226.022-.224.023-.22.026-.216.027-.212.028-.21.031-.205.032-.202.033-.198.034-.194.036-.191.038-.187.038-.183.04-.179.041-.175.042-.172.043-.168.043-.163.045-.16.046-.155.046-.152.048-.148.048-.143.048-.139.049-.136.05-.131.05-.126.051-.123.051-.118.051-.114.052-.11.052-.106.052-.101.052-.096.052-.092.052-.088.052-.083.052-.079.052-.074.051-.07.052-.065.051-.06.05-.056.05-.051.05-.023.025-.023.024-.021.024-.02.025-.019.024-.018.024-.017.023-.015.024-.014.023-.013.023-.012.023-.01.023-.01.022-.008.022-.006.023-.006.021-.004.022-.004.021-.001.021-.001.021.001.021.001.021.004.021.004.022.006.021.006.023.008.022.01.022.01.023.012.023.013.023.014.023.015.024.017.023.018.024.019.024.02.025.021.024.023.024.023.025.051.05.056.05.06.05.065.051.07.052.074.051.079.052.083.052.088.052.092.052.096.052.101.052.106.052.11.052.114.052.118.051.123.051.126.051.131.05.136.05.139.049.143.048.148.048.152.048.155.046.16.046.163.045.168.043.172.043.175.042.179.041.183.04.187.038.191.038.194.036.198.034.202.033.205.032.21.031.212.028.216.027.22.026.224.023.226.022.231.021.233.018.237.016.241.014.244.012.247.011.25.008.254.005.257.004.26.001.26-.001.257-.004.254-.005.25-.008.247-.011.244-.012.241-.014.237-.016.233-.018.231-.021.226-.022.224-.023.22-.026.216-.027.212-.028.21-.031.205-.032.202-.033.198-.034.194-.036.191-.038.187-.038.183-.04.179-.041.175-.042.172-.043.168-.043.163-.045.16-.046.155-.046.152-.048.148-.048.143-.048.139-.049.136-.05.131-.05.126-.051.123-.051.118-.051.114-.052.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.051.07-.052.065-.051.06-.05.056-.05.051-.05.023-.025.023-.024.021-.024.02-.025.019-.024.018-.024.017-.023.015-.024.014-.023.013-.023.012-.023.01-.023.01-.022.008-.022.006-.023.006-.021.004-.022.004-.021.001-.021.001-.021-.001-.021-.001-.021-.004-.021-.004-.022-.006-.021-.006-.023-.008-.022-.01-.022-.01-.023-.012-.023-.013-.023-.014-.023-.015-.024-.017-.023-.018-.024-.019-.024-.02-.025-.021-.024-.023-.024-.023-.025-.051-.05-.056-.05-.06-.05-.065-.051-.07-.052-.074-.051-.079-.052-.083-.052-.088-.052-.092-.052-.096-.052-.101-.052-.106-.052-.11-.052-.114-.052-.118-.051-.123-.051-.126-.051-.131-.05-.136-.05-.139-.049-.143-.048-.148-.048-.152-.048-.155-.046-.16-.046-.163-.045-.168-.043-.172-.043-.175-.042-.179-.041-.183-.04-.187-.038-.191-.038-.194-.036-.198-.034-.202-.033-.205-.032-.21-.031-.212-.028-.216-.027-.22-.026-.224-.023-.226-.022-.231-.021-.233-.018-.237-.016-.241-.014-.244-.012-.247-.011-.25-.008-.254-.005-.257-.004-.26-.001-.26.001z"/></symbol></defs><defs><symbol id="clock" width="24" height="24"><path transform="scale(.5)" d="M12 2c5.514 0 10 4.486 10 10s-4.486 10-10 10-10-4.486-10-10 4.486-10 10-10zm0-2c-6.627 0-12 5.373-12 12s5.373 12 12 12 12-5.373 12-12-5.373-12-12-12zm5.848 12.459c.202.038.202.333.001.372-1.907.361-6.045 1.111-6.547 1.111-.719 0-1.301-.582-1.301-1.301 0-.512.77-5.447 1.125-7.445.034-.192.312-.181.343.014l.985 6.238 5.394 1.011z"/></symbol></defs><defs><marker id="arrowhead" refX="7.9" refY="5" markerUnits="userSpaceOnUse" markerWidth="12" markerHeight="12" orient="auto-start-reverse"><path d="M -1 0 L 10 5 L 0 10 z"/></marker></defs><defs><marker id="crosshead" markerWidth="15" markerHeight="8" orient="auto" refX="4" refY="4.5"><path fill="none" stroke="#000000" stroke-width="1pt" d="M 1,2 L 6,7 M 6,2 L 1,7" style="stroke-dasharray: 0, 0;"/></marker></defs><defs><marker id="filled-head" refX="15.5" refY="7" markerWidth="20" markerHeight="28" orient="auto"><path d="M 18,7 L9,13 L14,7 L9,1 Z"/></marker></defs><defs><marker id="sequencenumber" refX="15" refY="15" markerWidth="60" markerHeight="40" orient="auto"><circle cx="15" cy="15" r="6"/></marker></defs><g><rect x="1233" y="768" fill="#EDF2AE" stroke="#666" width="166" height="96" class="note"/><text x="1316" y="773" text-anchor="middle" dominant-baseline="middle" alignment-baseline="middle" class="noteText" dy="1em" style="font-size: 16px; font-weight: 400;"><tspan x="1316">- Bold command name</tspan></text><text x="1316" y="792" text-anchor="middle" dominant-baseline="middle" alignment-baseline="middle" class="noteText" dy="1em" style="font-size: 16px; font-weight: 400;"><tspan x="1316">- Colored sections</tspan></text><text x="1316" y="811" text-anchor="middle" dominant-baseline="middle" alignment-baseline="middle" class="noteText" dy="1em" style="font-size: 16px; font-weight: 400;"><tspan x="1316">- Formatted examples</tspan></text><text x="1316" y="830" text-anchor="middle" dominant-baseline="middle" alignment-baseline="middle" class="noteText" dy="1em" style="font-size: 16px; font-weight: 400;"><tspan x="1316">- Clean spacing</tspan></text></g><g><rect x="50" y="1006" fill="#EDF2AE" stroke="#666" width="332" height="308" class="note"/><text x="216" y="1011" text-anchor="middle" dominant-baseline="middle" alignment-baseline="middle" class="noteText" dy="1em" style="font-size: 16px; font-weight: 400;"><tspan x="216">User sees:</tspan></text><text x="216" y="1030" text-anchor="middle" dominant-baseline="middle" alignment-baseline="middle" class="noteText" dy="1em" style="font-size: 16px; font-weight: 400;"><tspan x="216">━━━━━━━━━━━━━━━━</tspan></text><text x="216" y="1049" text-anchor="middle" dominant-baseline="middle" alignment-baseline="middle" class="noteText" dy="1em" style="font-size: 16px; font-weight: 400;"><tspan x="216">ls - Lista archivos</tspan></text><text x="216" y="1068" text-anchor="middle" dominant-baseline="middle" alignment-baseline="middle" class="noteText" dy="1em" style="font-size: 16px; font-weight: 400;"><tspan x="216"></tspan></text><text x="216" y="1087" text-anchor="middle" dominant-baseline="middle" alignment-baseline="middle" class="noteText" dy="1em" style="font-size: 16px; font-weight: 400;"><tspan x="216">USO: ls [opciones]</tspan></text><text x="216" y="1106" text-anchor="middle" dominant-baseline="middle" alignment-baseline="middle" class="noteText" dy="1em" style="font-size: 16px; font-weight: 400;"><tspan x="216"></tspan></text><text x="216" y="1125" text-anchor="middle" dominant-baseline="middle" alignment-baseline="middle" class="noteText" dy="1em" style="font-size: 16px; font-weight: 400;"><tspan x="216">OPCIONES:</tspan></text><text x="216" y="1144" text-anchor="middle" dominant-baseline="middle" alignment-baseline="middle" class="noteText" dy="1em" style="font-size: 16px; font-weight: 400;"><tspan x="216"> -l Formato largo</tspan></text><text x="216" y="1163" text-anchor="middle" dominant-baseline="middle" alignment-baseline="middle" class="noteText" dy="1em" style="font-size: 16px; font-weight: 400;"><tspan x="216"> -a Archivos ocultos</tspan></text><text x="216" y="1182" text-anchor="middle" dominant-baseline="middle" alignment-baseline="middle" class="noteText" dy="1em" style="font-size: 16px; font-weight: 400;"><tspan x="216"></tspan></text><text x="216" y="1201" text-anchor="middle" dominant-baseline="middle" alignment-baseline="middle" class="noteText" dy="1em" style="font-size: 16px; font-weight: 400;"><tspan x="216">EJEMPLOS:</tspan></text><text x="216" y="1220" text-anchor="middle" dominant-baseline="middle" alignment-baseline="middle" class="noteText" dy="1em" style="font-size: 16px; font-weight: 400;"><tspan x="216"> $ ls -la</tspan></text><text x="216" y="1239" text-anchor="middle" dominant-baseline="middle" alignment-baseline="middle" class="noteText" dy="1em" style="font-size: 16px; font-weight: 400;"><tspan x="216"> Ver todo incluyendo ocultos</tspan></text><text x="216" y="1258" text-anchor="middle" dominant-baseline="middle" alignment-baseline="middle" class="noteText" dy="1em" style="font-size: 16px; font-weight: 400;"><tspan x="216"></tspan></text><text x="216" y="1277" text-anchor="middle" dominant-baseline="middle" alignment-baseline="middle" class="noteText" dy="1em" style="font-size: 16px; font-weight: 400;"><tspan x="216">💡 Aprende más: Primeros comandos</tspan></text></g><g><rect x="530" y="1531" fill="#EDF2AE" stroke="#666" width="156" height="58" class="note"/><text x="608" y="1536" text-anchor="middle" dominant-baseline="middle" alignment-baseline="middle" class="noteText" dy="1em" style="font-size: 16px; font-weight: 400;"><tspan x="608">Falls back to existing</tspan></text><text x="608" y="1555" text-anchor="middle" dominant-baseline="middle" alignment-baseline="middle" class="noteText" dy="1em" style="font-size: 16px; font-weight: 400;"><tspan x="608">menu/project system</tspan></text></g><g><line x1="505.5" y1="1324" x2="925" y2="1324" class="loopLine"/><line x1="925" y1="1324" x2="925" y2="1599" class="loopLine"/><line x1="505.5" y1="1599" x2="925" y2="1599" class="loopLine"/><line x1="505.5" y1="1324" x2="505.5" y2="1599" class="loopLine"/><polygon points="505.5,1324 555.5,1324 555.5,1337 547.1,1344 505.5,1344" class="labelBox"/><text x="531" y="1337" text-anchor="middle" dominant-baseline="middle" alignment-baseline="middle" class="labelText" style="font-size: 16px; font-weight: 400;">alt</text><text x="740.25" y="1342" text-anchor="middle" class="loopText" style="font-size: 16px; font-weight: 400;"><tspan x="740.25">[Command not found]</tspan></text></g><g><line x1="64" y1="1609" x2="1527" y2="1609" class="loopLine"/><line x1="1527" y1="1609" x2="1527" y2="2050" class="loopLine"/><line x1="64" y1="2050" x2="1527" y2="2050" class="loopLine"/><line x1="64" y1="1609" x2="64" y2="2050" class="loopLine"/><polygon points="64,1609 114,1609 114,1622 105.6,1629 64,1629" class="labelBox"/><text x="89" y="1622" text-anchor="middle" dominant-baseline="middle" alignment-baseline="middle" class="labelText" style="font-size: 16px; font-weight: 400;">alt</text><text x="820.5" y="1627" text-anchor="middle" class="loopText" style="font-size: 16px; font-weight: 400;"><tspan x="820.5">[Git subcommand]</tspan></text></g><text x="215" y="80" text-anchor="middle" dominant-baseline="middle" alignment-baseline="middle" class="messageText" dy="1em" style="font-size: 16px; font-weight: 400;">creta ls</text><line x1="76" y1="109" x2="353" y2="109" class="messageLine0" stroke-width="2" stroke="none" marker-end="url(#arrowhead)" style="fill: none;"/><text x="481" y="124" text-anchor="middle" dominant-baseline="middle" alignment-baseline="middle" class="messageText" dy="1em" style="font-size: 16px; font-weight: 400;">process.argv = ['ls']</text><line x1="358" y1="153" x2="604" y2="153" class="messageLine0" stroke-width="2" stroke="none" marker-end="url(#arrowhead)" style="fill: none;"/><text x="760" y="168" text-anchor="middle" dominant-baseline="middle" alignment-baseline="middle" class="messageText" dy="1em" style="font-size: 16px; font-weight: 400;">isCommandHelpRequest('ls')</text><line x1="609" y1="197" x2="910" y2="197" class="messageLine0" stroke-width="2" stroke="none" marker-end="url(#arrowhead)" style="fill: none;"/><text x="915" y="212" text-anchor="middle" dominant-baseline="middle" alignment-baseline="middle" class="messageText" dy="1em" style="font-size: 16px; font-weight: 400;">Check against known commands</text><path d="M 915,241 C 975,231 975,271 915,261" class="messageLine0" stroke-width="2" stroke="none" marker-end="url(#arrowhead)" style="fill: none;"/><text x="763" y="286" text-anchor="middle" dominant-baseline="middle" alignment-baseline="middle" class="messageText" dy="1em" style="font-size: 16px; font-weight: 400;">true</text><line x1="913" y1="315" x2="612" y2="315" class="messageLine1" stroke-width="2" stroke="none" marker-end="url(#arrowhead)" style="stroke-dasharray: 3, 3; fill: none;"/><text x="860" y="330" text-anchor="middle" dominant-baseline="middle" alignment-baseline="middle" class="messageText" dy="1em" style="font-size: 16px; font-weight: 400;">showCommandHelp('ls')</text><line x1="609" y1="359" x2="1110" y2="359" class="messageLine0" stroke-width="2" stroke="none" marker-end="url(#arrowhead)" style="fill: none;"/><text x="1314" y="374" text-anchor="middle" dominant-baseline="middle" alignment-baseline="middle" class="messageText" dy="1em" style="font-size: 16px; font-weight: 400;">loadHelpContent('ls')</text><line x1="1115" y1="403" x2="1512" y2="403" class="messageLine0" stroke-width="2" stroke="none" marker-end="url(#arrowhead)" style="fill: none;"/><text x="1517" y="418" text-anchor="middle" dominant-baseline="middle" alignment-baseline="middle" class="messageText" dy="1em" style="font-size: 16px; font-weight: 400;">Read lib/data/command-help/basic-commands/ls.js</text><path d="M 1517,447 C 1577,437 1577,477 1517,467" class="messageLine0" stroke-width="2" stroke="none" marker-end="url(#arrowhead)" style="fill: none;"/><text x="1317" y="492" text-anchor="middle" dominant-baseline="middle" alignment-baseline="middle" class="messageText" dy="1em" style="font-size: 16px; font-weight: 400;">{</text><text x="1317" y="511" text-anchor="middle" dominant-baseline="middle" alignment-baseline="middle" class="messageText" dy="1em" style="font-size: 16px; font-weight: 400;"> command: 'ls',</text><text x="1317" y="530" text-anchor="middle" dominant-baseline="middle" alignment-baseline="middle" class="messageText" dy="1em" style="font-size: 16px; font-weight: 400;"> description: '...',</text><text x="1317" y="549" text-anchor="middle" dominant-baseline="middle" alignment-baseline="middle" class="messageText" dy="1em" style="font-size: 16px; font-weight: 400;"> usage: '...',</text><text x="1317" y="568" text-anchor="middle" dominant-baseline="middle" alignment-baseline="middle" class="messageText" dy="1em" style="font-size: 16px; font-weight: 400;"> commonOptions: [...],</text><text x="1317" y="587" text-anchor="middle" dominant-baseline="middle" alignment-baseline="middle" class="messageText" dy="1em" style="font-size: 16px; font-weight: 400;"> examples: [...],</text><text x="1317" y="606" text-anchor="middle" dominant-baseline="middle" alignment-baseline="middle" class="messageText" dy="1em" style="font-size: 16px; font-weight: 400;"> tips: '...'</text><text x="1317" y="625" text-anchor="middle" dominant-baseline="middle" alignment-baseline="middle" class="messageText" dy="1em" style="font-size: 16px; font-weight: 400;">}</text><line x1="1515" y1="640" x2="1118" y2="640" class="messageLine1" stroke-width="2" stroke="none" marker-end="url(#arrowhead)" style="stroke-dasharray: 3, 3; fill: none;"/><text x="1214" y="655" text-anchor="middle" dominant-baseline="middle" alignment-baseline="middle" class="messageText" dy="1em" style="font-size: 16px; font-weight: 400;">format(helpContent)</text><line x1="1115" y1="684" x2="1312" y2="684" class="messageLine0" stroke-width="2" stroke="none" marker-end="url(#arrowhead)" style="fill: none;"/><text x="1317" y="699" text-anchor="middle" dominant-baseline="middle" alignment-baseline="middle" class="messageText" dy="1em" style="font-size: 16px; font-weight: 400;">Build pretty output with chalk</text><path d="M 1317,728 C 1377,718 1377,758 1317,748" class="messageLine0" stroke-width="2" stroke="none" marker-end="url(#arrowhead)" style="fill: none;"/><text x="1217" y="879" text-anchor="middle" dominant-baseline="middle" alignment-baseline="middle" class="messageText" dy="1em" style="font-size: 16px; font-weight: 400;">Formatted string</text><line x1="1315" y1="908" x2="1118" y2="908" class="messageLine1" stroke-width="2" stroke="none" marker-end="url(#arrowhead)" style="stroke-dasharray: 3, 3; fill: none;"/><text x="737" y="923" text-anchor="middle" dominant-baseline="middle" alignment-baseline="middle" class="messageText" dy="1em" style="font-size: 16px; font-weight: 400;">Display help</text><line x1="1113" y1="952" x2="361" y2="952" class="messageLine1" stroke-width="2" stroke="none" marker-end="url(#arrowhead)" style="stroke-dasharray: 3, 3; fill: none;"/><text x="218" y="967" text-anchor="middle" dominant-baseline="middle" alignment-baseline="middle" class="messageText" dy="1em" style="font-size: 16px; font-weight: 400;">Shows formatted help in Spanish</text><line x1="356" y1="996" x2="79" y2="996" class="messageLine1" stroke-width="2" stroke="none" marker-end="url(#arrowhead)" style="stroke-dasharray: 3, 3; fill: none;"/><text x="760" y="1374" text-anchor="middle" dominant-baseline="middle" alignment-baseline="middle" class="messageText" dy="1em" style="font-size: 16px; font-weight: 400;">isCommandHelpRequest('unknown')</text><line x1="609" y1="1403" x2="910" y2="1403" class="messageLine0" stroke-width="2" stroke="none" marker-end="url(#arrowhead)" style="fill: none;"/><text x="763" y="1418" text-anchor="middle" dominant-baseline="middle" alignment-baseline="middle" class="messageText" dy="1em" style="font-size: 16px; font-weight: 400;">false</text><line x1="913" y1="1447" x2="612" y2="1447" class="messageLine1" stroke-width="2" stroke="none" marker-end="url(#arrowhead)" style="stroke-dasharray: 3, 3; fill: none;"/><text x="609" y="1462" text-anchor="middle" dominant-baseline="middle" alignment-baseline="middle" class="messageText" dy="1em" style="font-size: 16px; font-weight: 400;">Continue to main menu logic</text><path d="M 609,1491 C 669,1481 669,1521 609,1511" class="messageLine0" stroke-width="2" stroke="none" marker-end="url(#arrowhead)" style="fill: none;"/><text x="215" y="1659" text-anchor="middle" dominant-baseline="middle" alignment-baseline="middle" class="messageText" dy="1em" style="font-size: 16px; font-weight: 400;">creta git status</text><line x1="76" y1="1688" x2="353" y2="1688" class="messageLine0" stroke-width="2" stroke="none" marker-end="url(#arrowhead)" style="fill: none;"/><text x="481" y="1703" text-anchor="middle" dominant-baseline="middle" alignment-baseline="middle" class="messageText" dy="1em" style="font-size: 16px; font-weight: 400;">process.argv = ['git', 'status']</text><line x1="358" y1="1732" x2="604" y2="1732" class="messageLine0" stroke-width="2" stroke="none" marker-end="url(#arrowhead)" style="fill: none;"/><text x="760" y="1747" text-anchor="middle" dominant-baseline="middle" alignment-baseline="middle" class="messageText" dy="1em" style="font-size: 16px; font-weight: 400;">isCommandHelpRequest('git status')</text><line x1="609" y1="1776" x2="910" y2="1776" class="messageLine0" stroke-width="2" stroke="none" marker-end="url(#arrowhead)" style="fill: none;"/><text x="763" y="1791" text-anchor="middle" dominant-baseline="middle" alignment-baseline="middle" class="messageText" dy="1em" style="font-size: 16px; font-weight: 400;">true</text><line x1="913" y1="1820" x2="612" y2="1820" class="messageLine1" stroke-width="2" stroke="none" marker-end="url(#arrowhead)" style="stroke-dasharray: 3, 3; fill: none;"/><text x="860" y="1835" text-anchor="middle" dominant-baseline="middle" alignment-baseline="middle" class="messageText" dy="1em" style="font-size: 16px; font-weight: 400;">showCommandHelp('git status')</text><line x1="609" y1="1864" x2="1110" y2="1864" class="messageLine0" stroke-width="2" stroke="none" marker-end="url(#arrowhead)" style="fill: none;"/><text x="1314" y="1879" text-anchor="middle" dominant-baseline="middle" alignment-baseline="middle" class="messageText" dy="1em" style="font-size: 16px; font-weight: 400;">loadHelpContent('git/status')</text><line x1="1115" y1="1908" x2="1512" y2="1908" class="messageLine0" stroke-width="2" stroke="none" marker-end="url(#arrowhead)" style="fill: none;"/><text x="1317" y="1923" text-anchor="middle" dominant-baseline="middle" alignment-baseline="middle" class="messageText" dy="1em" style="font-size: 16px; font-weight: 400;">Git-specific help content</text><line x1="1515" y1="1952" x2="1118" y2="1952" class="messageLine1" stroke-width="2" stroke="none" marker-end="url(#arrowhead)" style="stroke-dasharray: 3, 3; fill: none;"/><text x="1214" y="1967" text-anchor="middle" dominant-baseline="middle" alignment-baseline="middle" class="messageText" dy="1em" style="font-size: 16px; font-weight: 400;">format(helpContent)</text><line x1="1115" y1="1996" x2="1312" y2="1996" class="messageLine0" stroke-width="2" stroke="none" marker-end="url(#arrowhead)" style="fill: none;"/><text x="838" y="2011" text-anchor="middle" dominant-baseline="middle" alignment-baseline="middle" class="messageText" dy="1em" style="font-size: 16px; font-weight: 400;">Formatted git status help</text><line x1="1315" y1="2040" x2="361" y2="2040" class="messageLine1" stroke-width="2" stroke="none" marker-end="url(#arrowhead)" style="stroke-dasharray: 3, 3; fill: none;"/></svg>
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
sequenceDiagram
|
|
2
|
+
participant User
|
|
3
|
+
participant Terminal
|
|
4
|
+
participant Router as bin/creta.js<br/>(Router)
|
|
5
|
+
participant Detector as Command Detector
|
|
6
|
+
participant Help as Command Help<br/>System
|
|
7
|
+
participant Formatter as CommandHelp<br/>Formatter
|
|
8
|
+
participant Data as command-help/<br/>Data Store
|
|
9
|
+
|
|
10
|
+
User->>Terminal: creta ls
|
|
11
|
+
Terminal->>Router: process.argv = ['ls']
|
|
12
|
+
|
|
13
|
+
Router->>Detector: isCommandHelpRequest('ls')
|
|
14
|
+
Detector->>Detector: Check against known commands
|
|
15
|
+
Detector-->>Router: true
|
|
16
|
+
|
|
17
|
+
Router->>Help: showCommandHelp('ls')
|
|
18
|
+
|
|
19
|
+
Help->>Data: loadHelpContent('ls')
|
|
20
|
+
Data->>Data: Read lib/data/command-help/basic-commands/ls.js
|
|
21
|
+
Data-->>Help: {<br/> command: 'ls',<br/> description: '...',<br/> usage: '...',<br/> commonOptions: [...],<br/> examples: [...],<br/> tips: '...'<br/>}
|
|
22
|
+
|
|
23
|
+
Help->>Formatter: format(helpContent)
|
|
24
|
+
|
|
25
|
+
Formatter->>Formatter: Build pretty output with chalk
|
|
26
|
+
Note over Formatter: - Bold command name<br/>- Colored sections<br/>- Formatted examples<br/>- Clean spacing
|
|
27
|
+
|
|
28
|
+
Formatter-->>Help: Formatted string
|
|
29
|
+
Help-->>Terminal: Display help
|
|
30
|
+
Terminal-->>User: Shows formatted help in Spanish
|
|
31
|
+
|
|
32
|
+
Note over User,Terminal: User sees:<br/>━━━━━━━━━━━━━━━━<br/>ls - Lista archivos<br/><br/>USO: ls [opciones]<br/><br/>OPCIONES:<br/> -l Formato largo<br/> -a Archivos ocultos<br/><br/>EJEMPLOS:<br/> $ ls -la<br/> Ver todo incluyendo ocultos<br/><br/>💡 Aprende más: Primeros comandos
|
|
33
|
+
|
|
34
|
+
alt Command not found
|
|
35
|
+
Router->>Detector: isCommandHelpRequest('unknown')
|
|
36
|
+
Detector-->>Router: false
|
|
37
|
+
Router->>Router: Continue to main menu logic
|
|
38
|
+
Note over Router: Falls back to existing<br/>menu/project system
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
alt Git subcommand
|
|
42
|
+
User->>Terminal: creta git status
|
|
43
|
+
Terminal->>Router: process.argv = ['git', 'status']
|
|
44
|
+
Router->>Detector: isCommandHelpRequest('git status')
|
|
45
|
+
Detector-->>Router: true
|
|
46
|
+
Router->>Help: showCommandHelp('git status')
|
|
47
|
+
Help->>Data: loadHelpContent('git/status')
|
|
48
|
+
Data-->>Help: Git-specific help content
|
|
49
|
+
Help->>Formatter: format(helpContent)
|
|
50
|
+
Formatter-->>Terminal: Formatted git status help
|
|
51
|
+
end
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
flowchart TD
|
|
2
|
+
Start([Student joins Icarus]) --> Discord[Join Discord Server]
|
|
3
|
+
Discord --> Learn[Learn basic terminal commands]
|
|
4
|
+
Learn --> Install[Install Node.js]
|
|
5
|
+
Install --> RunCreta[npx @icarusmx/creta]
|
|
6
|
+
|
|
7
|
+
RunCreta --> Menu{Main Menu}
|
|
8
|
+
Menu -->|Sintaxis| SintaxisLesson[Choose Lesson]
|
|
9
|
+
Menu -->|Enunciados| EnunciadoLesson[Choose OOP Lesson]
|
|
10
|
+
Menu -->|Proyectos| Portfolio[Generate Portfolio]
|
|
11
|
+
|
|
12
|
+
SintaxisLesson --> Interactive[Interactive Practice]
|
|
13
|
+
Interactive --> Sandbox[Execute real commands in sandbox]
|
|
14
|
+
Sandbox --> Validate{Command correct?}
|
|
15
|
+
Validate -->|No| Error[Show error: 'Ese no es el comando']
|
|
16
|
+
Error --> Sandbox
|
|
17
|
+
Validate -->|Yes| Execute[Run command, show output]
|
|
18
|
+
Execute --> Explain[Show explanation]
|
|
19
|
+
Explain --> NextStep{More steps?}
|
|
20
|
+
NextStep -->|Yes| Sandbox
|
|
21
|
+
NextStep -->|No| Complete[Lesson Complete]
|
|
22
|
+
|
|
23
|
+
EnunciadoLesson --> ReadConcept[Read OOP Concept]
|
|
24
|
+
ReadConcept --> Examples[See Code Examples]
|
|
25
|
+
Examples --> Understand[Build Understanding]
|
|
26
|
+
Understand --> CompleteConcept[Concept Complete]
|
|
27
|
+
|
|
28
|
+
Complete --> GetHash[Receive Hash]
|
|
29
|
+
CompleteConcept --> GetHash
|
|
30
|
+
|
|
31
|
+
GetHash --> BackDiscord[Return to Discord]
|
|
32
|
+
BackDiscord --> Redeem[/redeem hash]
|
|
33
|
+
Redeem --> YouTube[Watch Hidden Video]
|
|
34
|
+
YouTube --> LearnMore[Learn Advanced Concepts]
|
|
35
|
+
LearnMore --> RunCreta
|
|
36
|
+
|
|
37
|
+
Portfolio --> ChooseLevel{Choose Level}
|
|
38
|
+
ChooseLevel -->|0| Level0[Full Challenge]
|
|
39
|
+
ChooseLevel -->|1| Level1[Navbar Done]
|
|
40
|
+
ChooseLevel -->|2| Level2[Navbar + Hero Done]
|
|
41
|
+
ChooseLevel -->|3| Level3[Complete Solution]
|
|
42
|
+
|
|
43
|
+
Level0 --> Build[Build Portfolio]
|
|
44
|
+
Level1 --> Build
|
|
45
|
+
Level2 --> Build
|
|
46
|
+
Level3 --> Build
|
|
47
|
+
|
|
48
|
+
Build --> Deploy[Deploy Project]
|
|
49
|
+
Deploy --> Share[Share with Community]
|
|
50
|
+
|
|
51
|
+
Share --> Graduate{Graduated?}
|
|
52
|
+
Graduate -->|Keep Learning| RunCreta
|
|
53
|
+
Graduate -->|Junior Dev| Phase2Start[Start using creta ls]
|
|
54
|
+
|
|
55
|
+
Phase2Start --> DevWork[Working on projects]
|
|
56
|
+
DevWork --> NeedHelp{Need command help?}
|
|
57
|
+
NeedHelp -->|Yes| CretaCmd[creta ls]
|
|
58
|
+
CretaCmd --> QuickRef[See quick reference]
|
|
59
|
+
QuickRef --> BackToWork[Continue coding]
|
|
60
|
+
BackToWork --> DevWork
|
|
61
|
+
|
|
62
|
+
DevWork --> TeamReady{Join professional team?}
|
|
63
|
+
TeamReady -->|Yes| Phase3Start[creta login]
|
|
64
|
+
Phase3Start --> AuthTeam[Authenticate & Sync]
|
|
65
|
+
AuthTeam --> ProWork[Professional Workflow]
|
|
66
|
+
ProWork --> CheckReq[creta requirement]
|
|
67
|
+
CheckReq --> SeeTicket[See assigned ticket]
|
|
68
|
+
SeeTicket --> WorkTicket[Work on ticket]
|
|
69
|
+
WorkTicket --> Submit[creta submit]
|
|
70
|
+
Submit --> ProWork
|
|
71
|
+
|
|
72
|
+
style Start fill:#86efac
|
|
73
|
+
style GetHash fill:#fde047
|
|
74
|
+
style YouTube fill:#f87171
|
|
75
|
+
style Phase2Start fill:#fbbf24
|
|
76
|
+
style Phase3Start fill:#60a5fa
|
|
77
|
+
style Complete fill:#4ade80
|
|
78
|
+
style CompleteConcept fill:#4ade80
|
package/lib/cli/index.js
CHANGED
|
@@ -46,6 +46,11 @@ async function customizeTerminal() {
|
|
|
46
46
|
await customizer.customize()
|
|
47
47
|
}
|
|
48
48
|
|
|
49
|
+
async function revertTerminal() {
|
|
50
|
+
const customizer = new TerminalCustomizer()
|
|
51
|
+
await customizer.revert()
|
|
52
|
+
}
|
|
53
|
+
|
|
49
54
|
const COMMANDS = new Map([
|
|
50
55
|
['enunciados', () => executeEnunciados()],
|
|
51
56
|
['sintaxis', () => executeSintaxis()],
|
|
@@ -54,6 +59,7 @@ const COMMANDS = new Map([
|
|
|
54
59
|
['code', () => runCodeSession()],
|
|
55
60
|
['reset', () => resetUserState()],
|
|
56
61
|
['icarus-terminal', () => customizeTerminal()],
|
|
62
|
+
['revert-terminal', () => revertTerminal()],
|
|
57
63
|
['help', () => showHelp()],
|
|
58
64
|
['ayuda', () => showHelp()]
|
|
59
65
|
])
|
|
@@ -2,16 +2,75 @@ import fs from 'fs';
|
|
|
2
2
|
import path from 'path';
|
|
3
3
|
import os from 'os';
|
|
4
4
|
import { execSync } from 'child_process';
|
|
5
|
+
import { UserState } from '../utils/user-state.js';
|
|
5
6
|
|
|
6
7
|
class TerminalCustomizer {
|
|
7
8
|
constructor() {
|
|
8
9
|
this.homeDir = os.homedir();
|
|
9
10
|
this.zshrcPath = path.join(this.homeDir, '.zshrc');
|
|
10
11
|
this.icarusZshPath = path.join(this.homeDir, '.icarus-zsh');
|
|
12
|
+
this.tips = this.initializeTips();
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
initializeTips() {
|
|
16
|
+
return {
|
|
17
|
+
'terminal-basico': [
|
|
18
|
+
'💡 Usa "cd -" para volver al directorio anterior',
|
|
19
|
+
'💡 "pwd" muestra tu ubicación actual en el sistema',
|
|
20
|
+
'💡 "ls -la" muestra archivos ocultos y permisos',
|
|
21
|
+
'💡 Usa Tab para autocompletar nombres de archivos'
|
|
22
|
+
],
|
|
23
|
+
'git-basico': [
|
|
24
|
+
'💡 Siempre usa "git status" antes de hacer commit',
|
|
25
|
+
'💡 "git log --oneline" muestra el historial compacto',
|
|
26
|
+
'💡 "git diff" te muestra los cambios antes de commit',
|
|
27
|
+
'💡 Commits frecuentes = mejor historial'
|
|
28
|
+
],
|
|
29
|
+
'piping-redireccion': [
|
|
30
|
+
'💡 El pipe "|" conecta la salida de un comando con otro',
|
|
31
|
+
'💡 ">" sobrescribe archivos, ">>" agrega al final',
|
|
32
|
+
'💡 "grep" es tu mejor amigo para buscar en texto'
|
|
33
|
+
],
|
|
34
|
+
'bash-scripts': [
|
|
35
|
+
'💡 Usa "chmod +x script.sh" para hacer ejecutable tu script',
|
|
36
|
+
'💡 Siempre empieza con "#!/bin/bash" en la primera línea',
|
|
37
|
+
'💡 "$?" te dice el código de salida del último comando'
|
|
38
|
+
],
|
|
39
|
+
'portafolio': [
|
|
40
|
+
'💡 "npm run dev" para ver cambios en tiempo real',
|
|
41
|
+
'💡 Tailwind CSS usa clases utilitarias, no CSS custom',
|
|
42
|
+
'💡 Usa "md:" para breakpoints responsive en Tailwind',
|
|
43
|
+
'💡 SvelteKit recarga automáticamente al guardar cambios'
|
|
44
|
+
],
|
|
45
|
+
'general': [
|
|
46
|
+
'💡 Lee los errores completos, suelen decirte qué hacer',
|
|
47
|
+
'💡 Google es tu amigo, pero StackOverflow más',
|
|
48
|
+
'💡 Commits pequeños y frecuentes > commits gigantes',
|
|
49
|
+
'💡 Comenta tu código como si fueras a olvidarlo mañana'
|
|
50
|
+
]
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
getContextualTip() {
|
|
55
|
+
const userState = UserState.get();
|
|
56
|
+
const recentLessons = userState.lessonsCompleted.slice(-3);
|
|
57
|
+
|
|
58
|
+
// Try to get a tip from recently completed lessons
|
|
59
|
+
for (const lesson of recentLessons.reverse()) {
|
|
60
|
+
const lessonId = typeof lesson === 'object' ? lesson.id : lesson;
|
|
61
|
+
if (this.tips[lessonId] && this.tips[lessonId].length > 0) {
|
|
62
|
+
const tips = this.tips[lessonId];
|
|
63
|
+
return tips[Math.floor(Math.random() * tips.length)];
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// Fallback to general tips
|
|
68
|
+
const generalTips = this.tips.general;
|
|
69
|
+
return generalTips[Math.floor(Math.random() * generalTips.length)];
|
|
11
70
|
}
|
|
12
71
|
|
|
13
72
|
async customize() {
|
|
14
|
-
console.log('\n🏛️ Configurando tu terminal
|
|
73
|
+
console.log('\n🏛️ Configurando tu terminal Creta...\n');
|
|
15
74
|
|
|
16
75
|
try {
|
|
17
76
|
// Backup existing .zshrc if it exists
|
|
@@ -33,7 +92,7 @@ class TerminalCustomizer {
|
|
|
33
92
|
// Apply changes instantly
|
|
34
93
|
this.applyChanges();
|
|
35
94
|
|
|
36
|
-
console.log('\n🎉 ¡Terminal
|
|
95
|
+
console.log('\n🎉 ¡Terminal Creta configurado exitosamente!');
|
|
37
96
|
console.log('💡 Reinicia tu terminal o ejecuta: source ~/.zshrc\n');
|
|
38
97
|
|
|
39
98
|
} catch (error) {
|
|
@@ -43,34 +102,76 @@ class TerminalCustomizer {
|
|
|
43
102
|
}
|
|
44
103
|
|
|
45
104
|
createIcarusZsh() {
|
|
105
|
+
const tip = this.getContextualTip();
|
|
106
|
+
const roadmapHint = this.getRoadmapHint();
|
|
107
|
+
|
|
46
108
|
// Use template literal with escaped $ to prevent Node.js interpolation
|
|
47
109
|
const config = `# ========================================
|
|
48
|
-
# 🏛️
|
|
110
|
+
# 🏛️ Creta Terminal Configuration
|
|
49
111
|
# ========================================
|
|
50
112
|
|
|
51
|
-
# Custom
|
|
113
|
+
# Custom prompt with color #007acc
|
|
52
114
|
autoload -U colors && colors
|
|
115
|
+
setopt PROMPT_SUBST
|
|
53
116
|
|
|
54
117
|
# Prompt color codes
|
|
55
|
-
|
|
118
|
+
CRETA_BLUE='%F{39}'
|
|
56
119
|
RESET='%f'
|
|
120
|
+
GIT_BRANCH_COLOR='%F{245}' # Gray for branch
|
|
121
|
+
|
|
122
|
+
# Git branch detection function
|
|
123
|
+
function git_branch_name() {
|
|
124
|
+
git symbolic-ref --short HEAD 2>/dev/null || echo ""
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
function git_prompt_info() {
|
|
128
|
+
local branch=\$(git_branch_name)
|
|
129
|
+
if [[ -n "\$branch" ]]; then
|
|
130
|
+
echo " | \${branch}"
|
|
131
|
+
fi
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
# Custom prompt: [🏛️ creta | branch] ~/path $
|
|
135
|
+
PROMPT="\${CRETA_BLUE}[🏛️ creta\${GIT_BRANCH_COLOR}\$(git_prompt_info)\${CRETA_BLUE}]\${RESET} %~ $ "
|
|
136
|
+
|
|
137
|
+
# Welcome message function
|
|
138
|
+
function creta_welcome() {
|
|
139
|
+
print ""
|
|
140
|
+
print -P "\${CRETA_BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\${RESET}"
|
|
141
|
+
print -P "\${CRETA_BLUE} 🏛️ Bienvenido a Creta Terminal\${RESET}"
|
|
142
|
+
print -P "\${CRETA_BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\${RESET}"
|
|
143
|
+
print ""
|
|
57
144
|
|
|
58
|
-
#
|
|
59
|
-
|
|
145
|
+
# Show contextual tip
|
|
146
|
+
echo "${tip.replace(/"/g, '\\"')}"
|
|
147
|
+
|
|
148
|
+
# Show roadmap hint if available
|
|
149
|
+
if [[ -f "roadmap.txt" ]]; then
|
|
150
|
+
local next_item=\$(grep -v "^#" roadmap.txt | head -n 1)
|
|
151
|
+
if [[ -n "\$next_item" ]]; then
|
|
152
|
+
echo ""
|
|
153
|
+
echo "📋 Siguiente en roadmap: \$next_item"
|
|
154
|
+
fi
|
|
155
|
+
fi
|
|
156
|
+
|
|
157
|
+
print ""
|
|
158
|
+
}
|
|
60
159
|
|
|
61
|
-
#
|
|
62
|
-
|
|
63
|
-
print -P "\${ICARUS_BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\${RESET}"
|
|
64
|
-
print -P "\${ICARUS_BLUE} 🏛️ Bienvenido a Icarus Terminal\${RESET}"
|
|
65
|
-
print -P "\${ICARUS_BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\${RESET}"
|
|
66
|
-
print ""
|
|
160
|
+
# Show welcome message
|
|
161
|
+
creta_welcome
|
|
67
162
|
`;
|
|
68
163
|
|
|
69
164
|
fs.writeFileSync(this.icarusZshPath, config, 'utf8');
|
|
70
165
|
}
|
|
71
166
|
|
|
167
|
+
getRoadmapHint() {
|
|
168
|
+
// This is a placeholder - actual parsing happens in the shell script
|
|
169
|
+
// We could potentially read roadmap.txt here if we want to customize the message
|
|
170
|
+
return null;
|
|
171
|
+
}
|
|
172
|
+
|
|
72
173
|
updateZshrc() {
|
|
73
|
-
const sourceLine = '\n# Source
|
|
174
|
+
const sourceLine = '\n# Source Creta terminal configuration\n[ -f ~/.icarus-zsh ] && source ~/.icarus-zsh\n';
|
|
74
175
|
|
|
75
176
|
// Create .zshrc if it doesn't exist
|
|
76
177
|
if (!fs.existsSync(this.zshrcPath)) {
|
|
@@ -81,7 +182,7 @@ print ""
|
|
|
81
182
|
// Check if already sourced
|
|
82
183
|
const currentContent = fs.readFileSync(this.zshrcPath, 'utf8');
|
|
83
184
|
if (currentContent.includes('source ~/.icarus-zsh') || currentContent.includes('. ~/.icarus-zsh')) {
|
|
84
|
-
console.log('⚠️
|
|
185
|
+
console.log('⚠️ Creta ya estaba configurado en .zshrc (actualizando)');
|
|
85
186
|
return;
|
|
86
187
|
}
|
|
87
188
|
|
|
@@ -99,6 +200,76 @@ print ""
|
|
|
99
200
|
// User can manually source or restart terminal
|
|
100
201
|
}
|
|
101
202
|
}
|
|
203
|
+
|
|
204
|
+
async revert() {
|
|
205
|
+
console.log('\n🔄 Revirtiendo configuración de Creta Terminal...\n');
|
|
206
|
+
|
|
207
|
+
try {
|
|
208
|
+
let changesMade = false;
|
|
209
|
+
|
|
210
|
+
// Remove ~/.icarus-zsh if it exists
|
|
211
|
+
if (fs.existsSync(this.icarusZshPath)) {
|
|
212
|
+
fs.unlinkSync(this.icarusZshPath);
|
|
213
|
+
console.log('✅ Archivo ~/.icarus-zsh eliminado');
|
|
214
|
+
changesMade = true;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
// Remove source line from .zshrc
|
|
218
|
+
if (fs.existsSync(this.zshrcPath)) {
|
|
219
|
+
const currentContent = fs.readFileSync(this.zshrcPath, 'utf8');
|
|
220
|
+
|
|
221
|
+
if (currentContent.includes('source ~/.icarus-zsh') || currentContent.includes('. ~/.icarus-zsh')) {
|
|
222
|
+
// Remove the entire Creta block (comment + source line)
|
|
223
|
+
const cleanedContent = currentContent
|
|
224
|
+
.replace(/\n# Source Creta terminal configuration\n\[ -f ~\/\.icarus-zsh \] && source ~\/\.icarus-zsh\n/g, '')
|
|
225
|
+
.replace(/\n# Source Icarus terminal configuration\n\[ -f ~\/\.icarus-zsh \] && source ~\/\.icarus-zsh\n/g, '');
|
|
226
|
+
|
|
227
|
+
fs.writeFileSync(this.zshrcPath, cleanedContent, 'utf8');
|
|
228
|
+
console.log('✅ Configuración eliminada de ~/.zshrc');
|
|
229
|
+
changesMade = true;
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
if (!changesMade) {
|
|
234
|
+
console.log('⚠️ No se encontró configuración de Creta para revertir');
|
|
235
|
+
return;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
// Show available backups
|
|
239
|
+
this.showBackups();
|
|
240
|
+
|
|
241
|
+
console.log('\n🎉 ¡Configuración revertida exitosamente!');
|
|
242
|
+
console.log('💡 Reinicia tu terminal o ejecuta: source ~/.zshrc\n');
|
|
243
|
+
|
|
244
|
+
} catch (error) {
|
|
245
|
+
console.error('❌ Error al revertir configuración:', error.message);
|
|
246
|
+
throw error;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
showBackups() {
|
|
251
|
+
try {
|
|
252
|
+
const backupFiles = fs.readdirSync(this.homeDir)
|
|
253
|
+
.filter(file => file.startsWith('.zshrc.backup.'))
|
|
254
|
+
.sort()
|
|
255
|
+
.reverse()
|
|
256
|
+
.slice(0, 5); // Show last 5 backups
|
|
257
|
+
|
|
258
|
+
if (backupFiles.length > 0) {
|
|
259
|
+
console.log('\n📦 Backups disponibles (últimos 5):');
|
|
260
|
+
backupFiles.forEach((file, index) => {
|
|
261
|
+
const filepath = path.join(this.homeDir, file);
|
|
262
|
+
const stats = fs.statSync(filepath);
|
|
263
|
+
const date = stats.mtime.toLocaleString('es-MX');
|
|
264
|
+
console.log(` ${index + 1}. ${file} (${date})`);
|
|
265
|
+
});
|
|
266
|
+
console.log('\n💡 Para restaurar un backup manualmente:');
|
|
267
|
+
console.log(' cp ~/.zshrc.backup.TIMESTAMP ~/.zshrc');
|
|
268
|
+
}
|
|
269
|
+
} catch (error) {
|
|
270
|
+
// Silent fail - backups are optional
|
|
271
|
+
}
|
|
272
|
+
}
|
|
102
273
|
}
|
|
103
274
|
|
|
104
275
|
export default TerminalCustomizer;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
export const cd = {
|
|
2
|
+
command: 'cd',
|
|
3
|
+
description: 'Cambia el directorio actual (Change Directory)',
|
|
4
|
+
usage: 'cd [directorio]',
|
|
5
|
+
commonOptions: [
|
|
6
|
+
{
|
|
7
|
+
flag: '..',
|
|
8
|
+
description: 'Sube un nivel (directorio padre)'
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
flag: '~',
|
|
12
|
+
description: 'Va a tu directorio home (/Users/tunombre)'
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
flag: '-',
|
|
16
|
+
description: 'Regresa al directorio anterior'
|
|
17
|
+
}
|
|
18
|
+
],
|
|
19
|
+
examples: [
|
|
20
|
+
{
|
|
21
|
+
command: 'cd Documents',
|
|
22
|
+
description: 'Entrar a la carpeta Documents'
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
command: 'cd ..',
|
|
26
|
+
description: 'Subir un nivel (salir de la carpeta actual)'
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
command: 'cd ~',
|
|
30
|
+
description: 'Ir a tu directorio home'
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
command: 'cd -',
|
|
34
|
+
description: 'Volver al directorio donde estabas antes'
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
command: 'cd ../..',
|
|
38
|
+
description: 'Subir dos niveles'
|
|
39
|
+
}
|
|
40
|
+
],
|
|
41
|
+
relatedLesson: 'Primeros comandos',
|
|
42
|
+
tips: [
|
|
43
|
+
'Usa Tab para autocompletar nombres de carpetas',
|
|
44
|
+
'Si el nombre tiene espacios, usa comillas: cd "My Documents"',
|
|
45
|
+
'pwd te muestra dónde estás parado actualmente'
|
|
46
|
+
]
|
|
47
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
export const gitAdd = {
|
|
2
|
+
command: 'git add',
|
|
3
|
+
description: 'Agrega archivos al staging area (preparar cambios para commit)',
|
|
4
|
+
usage: 'git add [archivo|patrón]',
|
|
5
|
+
commonOptions: [
|
|
6
|
+
{
|
|
7
|
+
flag: '.',
|
|
8
|
+
description: 'Agregar TODOS los archivos modificados del directorio actual'
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
flag: '-A',
|
|
12
|
+
description: 'Agregar todos los cambios del repositorio (incluyendo eliminados)'
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
flag: '-p',
|
|
16
|
+
description: 'Agregar cambios interactivamente (elegir qué líneas incluir)'
|
|
17
|
+
}
|
|
18
|
+
],
|
|
19
|
+
examples: [
|
|
20
|
+
{
|
|
21
|
+
command: 'git add index.js',
|
|
22
|
+
description: 'Agregar un archivo específico'
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
command: 'git add .',
|
|
26
|
+
description: 'Agregar todos los archivos del directorio actual'
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
command: 'git add src/',
|
|
30
|
+
description: 'Agregar todos los archivos de la carpeta src/'
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
command: 'git add *.js',
|
|
34
|
+
description: 'Agregar todos los archivos .js'
|
|
35
|
+
}
|
|
36
|
+
],
|
|
37
|
+
relatedLesson: 'Git básico',
|
|
38
|
+
tips: [
|
|
39
|
+
'git add . es el más común - agrega todo',
|
|
40
|
+
'Usa git status después para verificar qué se agregó',
|
|
41
|
+
'Staging area = zona de preparación antes del commit'
|
|
42
|
+
]
|
|
43
|
+
}
|