@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 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 a la escuela de software de icarus.mx
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("\n📚 Comandos disponibles:")
611
- console.log(" creta - Explora los 7 enunciados fundamentales (comando principal) 🧠")
612
- console.log(" creta enunciados - Explora los 7 enunciados fundamentales 🧠")
613
- console.log(" creta portafolio - Crea tu portafolio personal (reto completo)")
614
- console.log(" creta portafolio-1 - Desbloquea nivel 1 (navbar) 🔓")
615
- console.log(" creta portafolio-2 - Desbloquea nivel 2 (navbar + hero) 🔓")
616
- console.log(" creta portafolio-3 - Desbloquea nivel 3 (solución completa) 🔓")
617
- console.log(" creta code - Inicia sesión interactiva de programación 🤖")
618
- console.log(" creta aws - Guía de AWS Billing Detective 🕵️")
619
- console.log(" creta help - Muestra esta ayuda")
620
- console.log("\n💡 Tip: Si estás dentro de un proyecto existente, los comandos")
621
- console.log(" portafolio-1/2/3 actualizarán tus archivos directamente")
622
- console.log("\n🎯 La filosofía Creta: partir de enunciados que generan 'ruido' para")
623
- console.log(" construir comprensión real, no solo sintaxis.")
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 por icarus.mx")
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 por icarus.mx")
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 por icarus.mx")
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 por icarus.mx")
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
- const rl = createInterface({
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 por icarus.mx")
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 por icarus.mx")
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 por icarus.mx")
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 por icarus.mx")
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 por icarus.mx")
1721
+ console.log("Hecho con <3")
1608
1722
  rl.close()
1609
1723
  return
1610
1724
  }
package/lib/cli/index.js CHANGED
@@ -16,7 +16,7 @@ async function executeMainMenu() {
16
16
  while (true) {
17
17
  const choice = await menu.show()
18
18
  if (!choice) {
19
- console.log('\nHecho con <3 por icarus.mx')
19
+ console.log('\nHecho con <3')
20
20
  return
21
21
  }
22
22
 
@@ -5,7 +5,7 @@ export const WELCOME_BANNER = `
5
5
  █ █ █ █ █ █ █
6
6
  █████████████████████████
7
7
 
8
- Bienvenido a la escuela de software de icarus.mx
8
+ Bienvenido al taller de software
9
9
  Salgamos de este laberinto 🏛️
10
10
  `
11
11
 
@@ -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 por icarus.mx")
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 por icarus.mx")
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 por icarus.mx'))
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 por icarus.mx'))
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 por icarus.mx') + ' - Salgamos de este laberinto 🏛️')
349
+ console.log('\n' + chalk.gray('Hecho con <3') + ' - Salgamos de este laberinto 🏛️')
350
350
  console.log()
351
351
  }
352
352
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@icarusmx/creta",
3
- "version": "1.5.7",
3
+ "version": "1.5.9",
4
4
  "description": "Salgamos de este laberinto.",
5
5
  "type": "module",
6
6
  "bin": {