@icarusmx/creta 1.5.7 → 1.5.9
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/bin/creta.js +165 -51
- package/lib/cli/index.js +1 -1
- package/lib/data/messages.js +1 -1
- package/lib/executors/ExercisesExecutor.js +2 -2
- package/lib/papers/PapersExecutor.js +2 -2
- package/lib/vim-setup-tutorial.js +1 -1
- package/package.json +1 -1
package/bin/creta.js
CHANGED
|
@@ -12,6 +12,7 @@ import { AWSGuideViewer } from '../lib/aws-guide-viewer.js'
|
|
|
12
12
|
import { CommandHelpExecutor } from '../lib/executors/CommandHelpExecutor.js'
|
|
13
13
|
import { PapersExecutor } from '../lib/papers/PapersExecutor.js'
|
|
14
14
|
import { ExercisesExecutor } from '../lib/executors/ExercisesExecutor.js'
|
|
15
|
+
import { executeSintaxis } from '../lib/executors/sintaxis-executor.js'
|
|
15
16
|
import { LessonBuilder } from '../lib/builders/LessonBuilder.js'
|
|
16
17
|
import { LESSON_1_SYSTEM_DECOMPOSITION } from '../lib/data/lessons/lesson1-system-decomposition.js'
|
|
17
18
|
import { LESSON_2_OBJECT_REQUESTS } from '../lib/data/lessons/lesson2-object-requests.js'
|
|
@@ -84,7 +85,7 @@ console.log(`
|
|
|
84
85
|
█ █ █ █ █ █ █
|
|
85
86
|
█████████████████████████
|
|
86
87
|
|
|
87
|
-
Bienvenido
|
|
88
|
+
Bienvenido al taller de software
|
|
88
89
|
Salgamos de este laberinto 🏛️
|
|
89
90
|
`)
|
|
90
91
|
|
|
@@ -106,6 +107,9 @@ if (command.startsWith('portafolio')) {
|
|
|
106
107
|
} else if (command === 'enunciados') {
|
|
107
108
|
// Start enunciados selector
|
|
108
109
|
await startEnunciadosSelector()
|
|
110
|
+
} else if (command === 'sintaxis') {
|
|
111
|
+
// Start sintaxis selector with interactive sandbox lessons
|
|
112
|
+
await startSintaxisSelector()
|
|
109
113
|
} else if (command === 'code') {
|
|
110
114
|
// Start interactive coding session
|
|
111
115
|
const session = new CretaCodeSession()
|
|
@@ -607,20 +611,27 @@ async function unstuckProject(level) {
|
|
|
607
611
|
}
|
|
608
612
|
|
|
609
613
|
function showHelp() {
|
|
610
|
-
console.log("\
|
|
611
|
-
console.log("
|
|
612
|
-
console.log("
|
|
613
|
-
|
|
614
|
-
console.log("
|
|
615
|
-
console.log(" creta
|
|
616
|
-
console.log(" creta
|
|
617
|
-
console.log(" creta
|
|
618
|
-
console.log(" creta
|
|
619
|
-
|
|
620
|
-
console.log("
|
|
621
|
-
console.log("
|
|
622
|
-
console.log("
|
|
623
|
-
console.log("
|
|
614
|
+
console.log("\nCreta es una herramienta de CLI desarrollada por icarus.mx.")
|
|
615
|
+
console.log("El propósito de esta herramienta es acompañar a aprendices y")
|
|
616
|
+
console.log("constructores del taller en su camino de aprendizaje.\n")
|
|
617
|
+
|
|
618
|
+
console.log("📖 Documentación de comandos:")
|
|
619
|
+
console.log(" creta ls - Documentación en español del comando ls")
|
|
620
|
+
console.log(" creta cd - Documentación en español del comando cd")
|
|
621
|
+
console.log(" creta git status - Documentación en español de git status")
|
|
622
|
+
console.log(" creta [comando] - Documentación de cualquier comando soportado\n")
|
|
623
|
+
|
|
624
|
+
console.log("🎓 Aprendizaje:")
|
|
625
|
+
console.log(" creta - Menú principal interactivo")
|
|
626
|
+
console.log(" creta sintaxis - Aprende comandos de terminal y Git")
|
|
627
|
+
console.log(" creta enunciados - Explora los 7 enunciados fundamentales de OOP")
|
|
628
|
+
console.log(" creta papers - Recrea papers clásicos de Computer Science\n")
|
|
629
|
+
|
|
630
|
+
console.log("🛠️ Proyectos:")
|
|
631
|
+
console.log(" creta portafolio - Crea tu portafolio personal")
|
|
632
|
+
console.log(" creta code - Sesión interactiva de programación con IA\n")
|
|
633
|
+
|
|
634
|
+
console.log("💡 Usa 'creta' sin argumentos para ver el menú principal.")
|
|
624
635
|
}
|
|
625
636
|
|
|
626
637
|
async function startMainMenu() {
|
|
@@ -696,7 +707,7 @@ Salgamos de este laberinto 🏛️
|
|
|
696
707
|
if (key === 'q' || key === '\x03') { // q or Ctrl+C
|
|
697
708
|
process.stdin.setRawMode(false)
|
|
698
709
|
process.stdin.removeListener('data', onKeyPress)
|
|
699
|
-
console.log("\nHecho con <3
|
|
710
|
+
console.log("\nHecho con <3")
|
|
700
711
|
resolve()
|
|
701
712
|
return
|
|
702
713
|
}
|
|
@@ -727,6 +738,46 @@ Salgamos de este laberinto 🏛️
|
|
|
727
738
|
return
|
|
728
739
|
}
|
|
729
740
|
|
|
741
|
+
// Handle vim-style navigation
|
|
742
|
+
if (key === 'k' || key === 'K') { // Vim: up
|
|
743
|
+
selectedIndex = selectedIndex > 0 ? selectedIndex - 1 : options.length - 1
|
|
744
|
+
renderOptions()
|
|
745
|
+
return
|
|
746
|
+
} else if (key === 'j' || key === 'J') { // Vim: down
|
|
747
|
+
selectedIndex = selectedIndex < options.length - 1 ? selectedIndex + 1 : 0
|
|
748
|
+
renderOptions()
|
|
749
|
+
return
|
|
750
|
+
}
|
|
751
|
+
|
|
752
|
+
// Handle number key selection
|
|
753
|
+
const num = parseInt(key)
|
|
754
|
+
if (num >= 1 && num <= options.length) {
|
|
755
|
+
selectedIndex = num - 1
|
|
756
|
+
process.stdin.setRawMode(false)
|
|
757
|
+
process.stdin.removeListener('data', onKeyPress)
|
|
758
|
+
|
|
759
|
+
const selectedOption = options[selectedIndex]
|
|
760
|
+
|
|
761
|
+
// Clear screen
|
|
762
|
+
process.stdout.write('\x1b[2J')
|
|
763
|
+
process.stdout.write('\x1b[H')
|
|
764
|
+
|
|
765
|
+
if (selectedOption.id === 1) {
|
|
766
|
+
startSintaxisSelector().then(resolve)
|
|
767
|
+
} else if (selectedOption.id === 2) {
|
|
768
|
+
startEnunciadosSelector().then(resolve)
|
|
769
|
+
} else if (selectedOption.id === 3) {
|
|
770
|
+
startProyectosSelector().then(resolve)
|
|
771
|
+
} else if (selectedOption.id === 4) {
|
|
772
|
+
const executor = new PapersExecutor()
|
|
773
|
+
executor.execute().then(resolve)
|
|
774
|
+
} else if (selectedOption.id === 5) {
|
|
775
|
+
const executor = new ExercisesExecutor()
|
|
776
|
+
executor.execute().then(resolve)
|
|
777
|
+
}
|
|
778
|
+
return
|
|
779
|
+
}
|
|
780
|
+
|
|
730
781
|
// Handle arrow keys (escape sequences)
|
|
731
782
|
if (key === '\u001b[A') { // Up arrow
|
|
732
783
|
selectedIndex = selectedIndex > 0 ? selectedIndex - 1 : options.length - 1
|
|
@@ -766,7 +817,7 @@ async function startMainMenuFallback() {
|
|
|
766
817
|
const respuesta = await askQuestion("Elige una opción (1-5) o 'q' para salir: ")
|
|
767
818
|
|
|
768
819
|
if (respuesta.toLowerCase() === 'q') {
|
|
769
|
-
console.log("Hecho con <3
|
|
820
|
+
console.log("Hecho con <3")
|
|
770
821
|
rl.close()
|
|
771
822
|
return
|
|
772
823
|
}
|
|
@@ -889,7 +940,7 @@ async function startEnunciadosSelectorInteractive() {
|
|
|
889
940
|
if (key === 'q' || key === '\x03') { // q or Ctrl+C
|
|
890
941
|
process.stdin.setRawMode(false)
|
|
891
942
|
process.stdin.removeListener('data', onKeyPress)
|
|
892
|
-
console.log("\nHecho con <3
|
|
943
|
+
console.log("\nHecho con <3")
|
|
893
944
|
resolve()
|
|
894
945
|
return
|
|
895
946
|
}
|
|
@@ -1047,6 +1098,27 @@ async function startEnunciadosSelectorInteractive() {
|
|
|
1047
1098
|
return
|
|
1048
1099
|
}
|
|
1049
1100
|
|
|
1101
|
+
// Handle vim-style navigation
|
|
1102
|
+
if (key === 'k' || key === 'K') { // Vim: up
|
|
1103
|
+
selectedIndex = selectedIndex > 0 ? selectedIndex - 1 : ENUNCIADOS.length - 1
|
|
1104
|
+
renderOptions()
|
|
1105
|
+
return
|
|
1106
|
+
} else if (key === 'j' || key === 'J') { // Vim: down
|
|
1107
|
+
selectedIndex = selectedIndex < ENUNCIADOS.length - 1 ? selectedIndex + 1 : 0
|
|
1108
|
+
renderOptions()
|
|
1109
|
+
return
|
|
1110
|
+
}
|
|
1111
|
+
|
|
1112
|
+
// Handle number key selection (1-7)
|
|
1113
|
+
const num = parseInt(key)
|
|
1114
|
+
if (num >= 1 && num <= ENUNCIADOS.length) {
|
|
1115
|
+
selectedIndex = num - 1
|
|
1116
|
+
// Simulate Enter key press to execute the selected option
|
|
1117
|
+
const enterEvent = '\r'
|
|
1118
|
+
onKeyPress(enterEvent)
|
|
1119
|
+
return
|
|
1120
|
+
}
|
|
1121
|
+
|
|
1050
1122
|
// Handle arrow keys (escape sequences)
|
|
1051
1123
|
if (key === '\u001b[A') { // Up arrow
|
|
1052
1124
|
selectedIndex = selectedIndex > 0 ? selectedIndex - 1 : ENUNCIADOS.length - 1
|
|
@@ -1099,7 +1171,7 @@ async function startEnunciadosSelectorFallback() {
|
|
|
1099
1171
|
const respuesta = await askQuestion("Elige un número (1-7) o 'q' para salir: ")
|
|
1100
1172
|
|
|
1101
1173
|
if (respuesta.toLowerCase() === 'q') {
|
|
1102
|
-
console.log("Hecho con <3
|
|
1174
|
+
console.log("Hecho con <3")
|
|
1103
1175
|
rl.close()
|
|
1104
1176
|
return
|
|
1105
1177
|
}
|
|
@@ -1262,33 +1334,7 @@ async function startEnunciadosSelectorFallback() {
|
|
|
1262
1334
|
|
|
1263
1335
|
|
|
1264
1336
|
async function startSintaxisSelector() {
|
|
1265
|
-
|
|
1266
|
-
input: process.stdin,
|
|
1267
|
-
output: process.stdout
|
|
1268
|
-
})
|
|
1269
|
-
|
|
1270
|
-
console.log("Sintaxis: estudia el modo en que se combinan las palabras y los distintos grupos que forman para expresar significado.")
|
|
1271
|
-
|
|
1272
|
-
await new Promise((resolve) => {
|
|
1273
|
-
rl.question("\nPresiona Enter para comenzar...", () => {
|
|
1274
|
-
rl.close()
|
|
1275
|
-
resolve()
|
|
1276
|
-
})
|
|
1277
|
-
})
|
|
1278
|
-
|
|
1279
|
-
console.log("\nEn esta sección aprenderemos algo más que palabras, aprenderemos comandos.")
|
|
1280
|
-
console.log("")
|
|
1281
|
-
console.log("Al final del día un comando es una palabra, la diferencia es que está dotada de un significado que tu computadora entiende.")
|
|
1282
|
-
console.log("")
|
|
1283
|
-
console.log("🚀 Próximamente:")
|
|
1284
|
-
console.log("- Terminal básico (pwd, ls, cd, mkdir, touch, cat)")
|
|
1285
|
-
console.log("- Git básico (init, status, add, commit)")
|
|
1286
|
-
console.log("- Git colaboración (remote, push, pull, clone)")
|
|
1287
|
-
console.log("- Git avanzado (branch, checkout, merge)")
|
|
1288
|
-
console.log("")
|
|
1289
|
-
console.log("Este es tu primer comando: ls")
|
|
1290
|
-
console.log("")
|
|
1291
|
-
console.log("Presiona ctrl + c para terminar esta sesión y después ejecuta el comando ls en tu terminal")
|
|
1337
|
+
await executeSintaxis()
|
|
1292
1338
|
}
|
|
1293
1339
|
|
|
1294
1340
|
async function startProyectosSelector() {
|
|
@@ -1354,7 +1400,7 @@ async function startProyectosSelectorInteractive() {
|
|
|
1354
1400
|
if (key === 'q' || key === '\x03') { // q or Ctrl+C
|
|
1355
1401
|
process.stdin.setRawMode(false)
|
|
1356
1402
|
process.stdin.removeListener('data', onKeyPress)
|
|
1357
|
-
console.log("\nHecho con <3
|
|
1403
|
+
console.log("\nHecho con <3")
|
|
1358
1404
|
resolve()
|
|
1359
1405
|
return
|
|
1360
1406
|
}
|
|
@@ -1379,6 +1425,40 @@ async function startProyectosSelectorInteractive() {
|
|
|
1379
1425
|
return
|
|
1380
1426
|
}
|
|
1381
1427
|
|
|
1428
|
+
// Handle vim-style navigation
|
|
1429
|
+
if (key === 'k' || key === 'K') { // Vim: up
|
|
1430
|
+
selectedIndex = selectedIndex > 0 ? selectedIndex - 1 : projects.length - 1
|
|
1431
|
+
renderOptions()
|
|
1432
|
+
return
|
|
1433
|
+
} else if (key === 'j' || key === 'J') { // Vim: down
|
|
1434
|
+
selectedIndex = selectedIndex < projects.length - 1 ? selectedIndex + 1 : 0
|
|
1435
|
+
renderOptions()
|
|
1436
|
+
return
|
|
1437
|
+
}
|
|
1438
|
+
|
|
1439
|
+
// Handle number key selection
|
|
1440
|
+
const num = parseInt(key)
|
|
1441
|
+
if (num >= 1 && num <= projects.length) {
|
|
1442
|
+
selectedIndex = num - 1
|
|
1443
|
+
process.stdin.setRawMode(false)
|
|
1444
|
+
process.stdin.removeListener('data', onKeyPress)
|
|
1445
|
+
|
|
1446
|
+
const selectedProject = projects[selectedIndex]
|
|
1447
|
+
|
|
1448
|
+
// Clear screen
|
|
1449
|
+
process.stdout.write('\x1b[2J')
|
|
1450
|
+
process.stdout.write('\x1b[H')
|
|
1451
|
+
|
|
1452
|
+
if (selectedProject.type === 'pr') {
|
|
1453
|
+
startPullRequestTutorial().then(resolve)
|
|
1454
|
+
} else if (selectedProject.type === 'portfolio') {
|
|
1455
|
+
startPortfolioSelector().then(resolve)
|
|
1456
|
+
} else if (selectedProject.type === 'vim') {
|
|
1457
|
+
startVimSetupTutorial().then(resolve)
|
|
1458
|
+
}
|
|
1459
|
+
return
|
|
1460
|
+
}
|
|
1461
|
+
|
|
1382
1462
|
// Handle arrow keys (escape sequences)
|
|
1383
1463
|
if (key === '\u001b[A') { // Up arrow
|
|
1384
1464
|
selectedIndex = selectedIndex > 0 ? selectedIndex - 1 : projects.length - 1
|
|
@@ -1416,7 +1496,7 @@ async function returnToMainMenu() {
|
|
|
1416
1496
|
console.clear()
|
|
1417
1497
|
await startMainMenu()
|
|
1418
1498
|
} else {
|
|
1419
|
-
console.log("\nHecho con <3
|
|
1499
|
+
console.log("\nHecho con <3")
|
|
1420
1500
|
rl.close()
|
|
1421
1501
|
}
|
|
1422
1502
|
}
|
|
@@ -1445,7 +1525,7 @@ async function startProyectosSelectorFallback() {
|
|
|
1445
1525
|
const respuesta = await askQuestion("Elige una opción (1-3) o 'q' para salir: ")
|
|
1446
1526
|
|
|
1447
1527
|
if (respuesta.toLowerCase() === 'q') {
|
|
1448
|
-
console.log("Hecho con <3
|
|
1528
|
+
console.log("Hecho con <3")
|
|
1449
1529
|
rl.close()
|
|
1450
1530
|
return
|
|
1451
1531
|
}
|
|
@@ -1540,7 +1620,7 @@ async function startPortfolioSelectorInteractive() {
|
|
|
1540
1620
|
if (key === 'q' || key === '\x03') { // q or Ctrl+C
|
|
1541
1621
|
process.stdin.setRawMode(false)
|
|
1542
1622
|
process.stdin.removeListener('data', onKeyPress)
|
|
1543
|
-
console.log("\nHecho con <3
|
|
1623
|
+
console.log("\nHecho con <3")
|
|
1544
1624
|
resolve()
|
|
1545
1625
|
return
|
|
1546
1626
|
}
|
|
@@ -1565,6 +1645,40 @@ async function startPortfolioSelectorInteractive() {
|
|
|
1565
1645
|
return
|
|
1566
1646
|
}
|
|
1567
1647
|
|
|
1648
|
+
// Handle vim-style navigation
|
|
1649
|
+
if (key === 'k' || key === 'K') { // Vim: up
|
|
1650
|
+
selectedIndex = selectedIndex > 0 ? selectedIndex - 1 : projects.length - 1
|
|
1651
|
+
renderOptions()
|
|
1652
|
+
return
|
|
1653
|
+
} else if (key === 'j' || key === 'J') { // Vim: down
|
|
1654
|
+
selectedIndex = selectedIndex < projects.length - 1 ? selectedIndex + 1 : 0
|
|
1655
|
+
renderOptions()
|
|
1656
|
+
return
|
|
1657
|
+
}
|
|
1658
|
+
|
|
1659
|
+
// Handle number key selection
|
|
1660
|
+
const num = parseInt(key)
|
|
1661
|
+
if (num >= 1 && num <= projects.length) {
|
|
1662
|
+
selectedIndex = num - 1
|
|
1663
|
+
process.stdin.setRawMode(false)
|
|
1664
|
+
process.stdin.removeListener('data', onKeyPress)
|
|
1665
|
+
|
|
1666
|
+
const selectedProject = projects[selectedIndex]
|
|
1667
|
+
const level = selectedProject.level
|
|
1668
|
+
|
|
1669
|
+
// Clear screen
|
|
1670
|
+
process.stdout.write('\x1b[2J')
|
|
1671
|
+
process.stdout.write('\x1b[H')
|
|
1672
|
+
|
|
1673
|
+
// Check if we're in an existing Creta project
|
|
1674
|
+
if (level > 0 && isInCretaProject()) {
|
|
1675
|
+
unstuckProject(level).then(resolve)
|
|
1676
|
+
} else {
|
|
1677
|
+
createPortfolioProject(level).then(resolve)
|
|
1678
|
+
}
|
|
1679
|
+
return
|
|
1680
|
+
}
|
|
1681
|
+
|
|
1568
1682
|
// Handle arrow keys (escape sequences)
|
|
1569
1683
|
if (key === '\u001b[A') { // Up arrow
|
|
1570
1684
|
selectedIndex = selectedIndex > 0 ? selectedIndex - 1 : projects.length - 1
|
|
@@ -1604,7 +1718,7 @@ async function startPortfolioSelectorFallback() {
|
|
|
1604
1718
|
const respuesta = await askQuestion("Elige una opción (1-4) o 'q' para salir: ")
|
|
1605
1719
|
|
|
1606
1720
|
if (respuesta.toLowerCase() === 'q') {
|
|
1607
|
-
console.log("Hecho con <3
|
|
1721
|
+
console.log("Hecho con <3")
|
|
1608
1722
|
rl.close()
|
|
1609
1723
|
return
|
|
1610
1724
|
}
|
package/lib/cli/index.js
CHANGED
package/lib/data/messages.js
CHANGED
|
@@ -99,7 +99,7 @@ export class ExercisesExecutor {
|
|
|
99
99
|
if (key === 'q' || key === '\x03') { // q or Ctrl+C
|
|
100
100
|
process.stdin.setRawMode(false)
|
|
101
101
|
process.stdin.removeListener('data', onKeyPress)
|
|
102
|
-
console.log("\nHecho con <3
|
|
102
|
+
console.log("\nHecho con <3")
|
|
103
103
|
resolve()
|
|
104
104
|
return
|
|
105
105
|
}
|
|
@@ -163,7 +163,7 @@ export class ExercisesExecutor {
|
|
|
163
163
|
const respuesta = await askQuestion(`Elige una opción (1-${this.exercises.length}) o 'q' para salir: `)
|
|
164
164
|
|
|
165
165
|
if (respuesta.toLowerCase() === 'q') {
|
|
166
|
-
console.log("Hecho con <3
|
|
166
|
+
console.log("Hecho con <3")
|
|
167
167
|
rl.close()
|
|
168
168
|
return
|
|
169
169
|
}
|
|
@@ -86,7 +86,7 @@ export class PapersExecutor {
|
|
|
86
86
|
if (key === 'q' || key === '\x03') {
|
|
87
87
|
process.stdin.setRawMode(false)
|
|
88
88
|
process.stdin.removeListener('data', onKeyPress)
|
|
89
|
-
console.log(chalk.dim('\nHecho con <3
|
|
89
|
+
console.log(chalk.dim('\nHecho con <3'))
|
|
90
90
|
resolve()
|
|
91
91
|
return
|
|
92
92
|
}
|
|
@@ -179,7 +179,7 @@ export class PapersExecutor {
|
|
|
179
179
|
const answer = await askQuestion('Elige un número (1-3) o \'q\' para salir: ')
|
|
180
180
|
|
|
181
181
|
if (answer.toLowerCase() === 'q') {
|
|
182
|
-
console.log(chalk.dim('\nHecho con <3
|
|
182
|
+
console.log(chalk.dim('\nHecho con <3'))
|
|
183
183
|
rl.close()
|
|
184
184
|
return
|
|
185
185
|
}
|
|
@@ -346,7 +346,7 @@ export class VimSetupTutorial {
|
|
|
346
346
|
console.log(' • Creta CLI: ' + chalk.yellow('creta') + ' (este programa)')
|
|
347
347
|
console.log(' • Comunidad Icarus: https://icarus.mx')
|
|
348
348
|
|
|
349
|
-
console.log('\n' + chalk.gray('Hecho con <3
|
|
349
|
+
console.log('\n' + chalk.gray('Hecho con <3') + ' - Salgamos de este laberinto 🏛️')
|
|
350
350
|
console.log()
|
|
351
351
|
}
|
|
352
352
|
|