@icarusmx/creta 1.4.6 → 1.4.8

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/ejemplo.sh ADDED
@@ -0,0 +1,3 @@
1
+ #!/bin/bash
2
+ MENSAJE="Salgamos de este laberinto."
3
+ echo $MENSAJE
@@ -3,9 +3,9 @@ export const GIT_BASICO = {
3
3
  id: 'git-basico',
4
4
 
5
5
  intro: {
6
- definition: 'Git es un sistema de control de versiones que te permite rastrear cambios en tu código.',
7
- explanation: 'Con git puedes guardar "snapshots" de tu proyecto en diferentes momentos.',
8
- detail: 'Esto te permite experimentar sin miedo, colaborar con otros, y volver atrás si algo sale mal.'
6
+ definition: 'Git es un sistema de registro y control de versiones que te permite gestionar los distintos estados de un proyecto a lo largo de su desarrollo.',
7
+ explanation: 'Imagina un álbum de fotos: cada commit es una foto de todos tus archivos en un momento específico.',
8
+ detail: 'Con Git puedes hojear el álbum completo, volver a cualquier foto anterior, o tomar nuevas fotos conforme avanzas. Esto te permite experimentar sin miedo porque siempre puedes regresar.'
9
9
  },
10
10
 
11
11
  steps: [
@@ -29,17 +29,17 @@ export const GIT_BASICO = {
29
29
  type: 'command-intro',
30
30
  command: 'git add',
31
31
  description: 'Tercer comando: git add',
32
- explanation: 'git add prepara archivos para ser guardados en el siguiente commit.',
32
+ explanation: 'git add prepara los archivos que quieres incluir en tu próxima foto.',
33
33
  example: 'git add archivo.js\ngit add .',
34
- instruction: 'Usa "git add ." para agregar todos los cambios, o especifica archivos individuales.'
34
+ instruction: 'Usa git add . para incluir todos los cambios, o git add archivo.js para elegir archivos específicos.'
35
35
  },
36
36
  {
37
37
  type: 'command-intro',
38
38
  command: 'git commit',
39
39
  description: 'Cuarto comando: git commit',
40
- explanation: 'git commit guarda un snapshot de los cambios que agregaste con git add.',
40
+ explanation: 'git commit toma la foto y la guarda en tu álbum.',
41
41
  example: 'git commit -m "Mensaje descriptivo"',
42
- instruction: 'Siempre incluye un mensaje que describa qué cambiaste y por qué.'
42
+ instruction: 'El mensaje con -m es como escribir al reverso de la foto para recordar qué cambiaste y por qué.'
43
43
  },
44
44
  {
45
45
  type: 'command-intro',
@@ -0,0 +1,142 @@
1
+ // Piping y Redirección - Conectando comandos y manejando flujos de datos
2
+ export const PIPING_REDIRECCION = {
3
+ id: 'piping-redireccion',
4
+
5
+ intro: {
6
+ definition: 'Piping y redirección son mecanismos para conectar comandos y controlar hacia dónde va la información.',
7
+ explanation: 'En lugar de ver resultados en pantalla, puedes enviarlos a archivos, otros comandos, o usarlos como entrada.',
8
+ detail: 'Esto es lo que hace a bash tan poderoso: puedes combinar comandos simples para crear flujos de trabajo complejos.'
9
+ },
10
+
11
+ steps: [
12
+ {
13
+ type: 'command-intro',
14
+ command: '|',
15
+ description: 'El pipe (tubería)',
16
+ explanation: 'El símbolo | toma la salida de un comando y la envía como entrada a otro.',
17
+ example: 'ls | grep ".js"\ncat archivo.txt | wc -l',
18
+ instruction: 'Úsalo para encadenar comandos. La salida del izquierdo entra al derecho.'
19
+ },
20
+ {
21
+ type: 'command-intro',
22
+ command: '>',
23
+ description: 'Redirección de salida (sobrescribir)',
24
+ explanation: '> toma la salida de un comando y la guarda en un archivo, sobrescribiendo contenido previo.',
25
+ example: 'echo "Hola mundo" > saludo.txt\nls > archivos.txt',
26
+ instruction: 'Si el archivo existe, se borra y se reemplaza con el nuevo contenido.'
27
+ },
28
+ {
29
+ type: 'command-intro',
30
+ command: '>>',
31
+ description: 'Redirección de salida (agregar)',
32
+ explanation: '>> agrega contenido al final de un archivo sin borrar lo que ya existe.',
33
+ example: 'echo "Primera línea" > log.txt\necho "Segunda línea" >> log.txt',
34
+ instruction: 'Útil para logs y archivos donde quieres preservar el contenido anterior.'
35
+ },
36
+ {
37
+ type: 'command-intro',
38
+ command: '<',
39
+ description: 'Redirección de entrada',
40
+ explanation: '< toma el contenido de un archivo y lo usa como entrada para un comando.',
41
+ example: 'wc -l < archivo.txt\nsort < nombres.txt',
42
+ instruction: 'En lugar de leer desde teclado, el comando lee desde el archivo.'
43
+ },
44
+ {
45
+ type: 'command-intro',
46
+ command: '<<<',
47
+ description: 'Here-string (cadena directa)',
48
+ explanation: '<<< pasa un string directamente como entrada a un comando.',
49
+ example: 'wc -w <<< "Salgamos de este laberinto"\ngrep "mundo" <<< "Hola mundo"',
50
+ instruction: 'Muy útil para pasar variables como entrada: grep "patrón" <<< "$VARIABLE"'
51
+ },
52
+ {
53
+ type: 'command-intro',
54
+ command: 'read <<< "$VAR"',
55
+ description: 'Usando read con here-string',
56
+ explanation: 'read puede tomar una string y dividirla en partes.',
57
+ example: 'VERSION="1.2.3"\nIFS=\'.\' read -r MAJOR MINOR PATCH <<< "$VERSION"\necho $PATCH # imprime: 3',
58
+ instruction: 'IFS define el delimitador. read separa la string y asigna a cada variable.'
59
+ },
60
+ {
61
+ type: 'command-intro',
62
+ command: 'read -r -a',
63
+ description: 'Read en un array',
64
+ explanation: 'Con -a, read guarda las partes en un array en lugar de variables separadas.',
65
+ example: 'VERSION="1.2.3"\nIFS=\'.\' read -r -a PARTS <<< "$VERSION"\necho ${PARTS[0]} # 1\necho ${PARTS[1]} # 2\necho ${PARTS[2]} # 3',
66
+ instruction: 'Accede a cada parte con ${ARRAY[índice]}. Los índices empiezan en 0.'
67
+ },
68
+ {
69
+ type: 'command-intro',
70
+ command: '2>',
71
+ description: 'Redirección de errores',
72
+ explanation: '2> redirige los mensajes de error (stderr) a un archivo.',
73
+ example: 'npm install 2> errores.log\nls archivo-que-no-existe 2> /dev/null',
74
+ instruction: '/dev/null es como un "agujero negro" - descarta todo lo que le envíes.'
75
+ },
76
+ {
77
+ type: 'command-intro',
78
+ command: '&>',
79
+ description: 'Redirección de salida Y errores',
80
+ explanation: '&> redirige tanto la salida normal como los errores al mismo destino.',
81
+ example: 'npm install &> install-log.txt\ngit pull &> pull.log',
82
+ instruction: 'Útil cuando quieres capturar todo lo que un comando produce.'
83
+ },
84
+ {
85
+ type: 'code',
86
+ title: 'Ejemplo real: Procesando una versión',
87
+ code: `#!/bin/bash
88
+
89
+ # Obtener versión del package.json
90
+ VERSION=$(node -p "require('./package.json').version")
91
+
92
+ # Aquí está la magia del here-string:
93
+ # 1. Tomamos $VERSION (ej: "1.2.3")
94
+ # 2. Se lo pasamos como entrada a read usando <<<
95
+ # 3. IFS='.' le dice a read que separe por puntos
96
+ # 4. -r significa "raw" (no interpretar backslashes)
97
+ # 5. -a PARTS dice "guarda las partes en el array PARTS"
98
+
99
+ IFS='.' read -r -a PARTS <<< "$VERSION"
100
+
101
+ # Ahora podemos acceder a cada parte
102
+ echo "Major: \${PARTS[0]}" # 1
103
+ echo "Minor: \${PARTS[1]}" # 2
104
+ echo "Patch: \${PARTS[2]}" # 3
105
+
106
+ # Incrementar el patch
107
+ NEW_PATCH=$((PARTS[2] + 1))
108
+ echo "Nueva versión: \${PARTS[0]}.\${PARTS[1]}.$NEW_PATCH"`,
109
+ after: [
110
+ '',
111
+ 'El operador <<< es una forma elegante de pasar datos.',
112
+ 'Sin él, tendrías que crear un archivo temporal o usar echo | read.',
113
+ 'Es especialmente útil para procesar variables.'
114
+ ]
115
+ },
116
+ {
117
+ type: 'code',
118
+ title: 'Combinando pipes y redirección',
119
+ code: `# Ver solo archivos .js, contar líneas, guardar resultado
120
+ ls | grep ".js" | wc -l > total-archivos.txt
121
+
122
+ # Buscar en múltiples archivos y guardar matches
123
+ cat *.js | grep "function" > funciones.txt
124
+
125
+ # Procesar git log y extraer solo los commits
126
+ git log --oneline | head -5 > ultimos-commits.txt
127
+
128
+ # Buscar errores en logs, ignorar otros mensajes
129
+ cat app.log | grep "ERROR" 2> /dev/null > errores-importantes.txt`,
130
+ after: [
131
+ '',
132
+ 'Puedes encadenar cuantos pipes necesites.',
133
+ 'Cada comando procesa la salida del anterior.'
134
+ ]
135
+ },
136
+ {
137
+ type: 'maze-completion',
138
+ message: 'Piping y Redirección completado!',
139
+ unlocked: 'Ahora entiendes cómo fluye la información entre comandos.'
140
+ }
141
+ ]
142
+ }
@@ -12,34 +12,67 @@ export const TERMINAL_BASICO = {
12
12
  {
13
13
  type: 'command-intro',
14
14
  command: 'ls',
15
- description: 'Este es tu primer comando: ls',
15
+ description: 'Primer comando: ls',
16
16
  explanation: 'ls lista los archivos y carpetas en tu ubicación actual.',
17
- instruction: 'Presiona ctrl + c para terminar esta sesión y después ejecuta el comando ls en tu terminal',
18
- exitOnComplete: true
17
+ example: 'ls\nls -la',
18
+ instruction: 'Pruébalo en tu terminal. Con -la verás archivos ocultos y más detalles.'
19
+ },
20
+ {
21
+ type: 'command-intro',
22
+ command: 'mkdir',
23
+ description: 'Segundo comando: mkdir',
24
+ explanation: 'mkdir crea un nuevo directorio (carpeta).',
25
+ example: 'mkdir mi-carpeta\nmkdir proyectos/nuevo-proyecto',
26
+ instruction: 'Crea una carpeta nueva. Prueba: mkdir prueba'
19
27
  },
20
28
  {
21
29
  type: 'command-intro',
22
30
  command: 'cd',
23
- description: 'Segundo comando: cd',
31
+ description: 'Tercer comando: cd',
24
32
  explanation: 'cd te permite cambiar de directorio (carpeta).',
25
- example: 'cd nombre-carpeta',
26
- instruction: 'Úsalo para navegar a una carpeta. Ejemplo: cd Documentos'
33
+ example: 'cd mi-carpeta\ncd ..\ncd ~',
34
+ instruction: 'cd nombre-carpeta entra a una carpeta. cd .. regresa al directorio padre. cd ~ te lleva a tu carpeta home.'
27
35
  },
28
36
  {
29
37
  type: 'command-intro',
30
- command: 'cd ..',
31
- description: 'Tercer comando: cd ..',
32
- explanation: 'cd .. te regresa al directorio anterior (el padre).',
33
- example: 'cd ..',
34
- instruction: 'Si estás en /home/usuario/Documentos, cd .. te lleva a /home/usuario'
38
+ command: 'touch',
39
+ description: 'Cuarto comando: touch',
40
+ explanation: 'touch crea un archivo vacío si no existe, o actualiza su fecha de modificación.',
41
+ example: 'touch archivo.txt\ntouch script.js README.md',
42
+ instruction: 'Muy útil para crear archivos rápidamente antes de editarlos.'
35
43
  },
36
44
  {
37
45
  type: 'command-intro',
38
- command: 'mkdir',
39
- description: 'Cuarto comando: mkdir',
40
- explanation: 'mkdir crea un nuevo directorio (carpeta).',
41
- example: 'mkdir mi-proyecto',
42
- instruction: 'Crea una carpeta nueva. Prueba: mkdir prueba'
46
+ command: 'wc',
47
+ description: 'Quinto comando: wc (word count)',
48
+ explanation: 'wc cuenta líneas, palabras y caracteres en archivos o texto.',
49
+ example: 'wc archivo.txt\nwc -l archivo.txt # solo líneas\nwc -w archivo.txt # solo palabras\nwc -c archivo.txt # solo caracteres',
50
+ instruction: 'Por defecto muestra: líneas palabras caracteres. Con flags puedes ver solo lo que necesitas.'
51
+ },
52
+ {
53
+ type: 'code',
54
+ title: 'Ejemplos detallados de wc',
55
+ code: `# Contar líneas de código en un archivo
56
+ wc -l script.js
57
+
58
+ # Contar palabras en un texto
59
+ echo "Salgamos de este laberinto" | wc -w
60
+ # Resultado: 4
61
+
62
+ # Contar archivos en un directorio
63
+ ls | wc -l
64
+
65
+ # Contar líneas en múltiples archivos
66
+ wc -l *.js
67
+
68
+ # Combinar con otros comandos
69
+ cat archivo.txt | grep "error" | wc -l
70
+ # Cuenta cuántas líneas contienen "error"`,
71
+ after: [
72
+ '',
73
+ 'wc es especialmente útil cuando lo combinas con pipes.',
74
+ 'Puedes contar resultados de búsquedas, líneas de código, etc.'
75
+ ]
43
76
  },
44
77
  {
45
78
  type: 'maze-completion',
package/lib/data/menus.js CHANGED
@@ -8,7 +8,8 @@ export const SINTAXIS_MENU_CONFIG = {
8
8
  options: [
9
9
  { id: 'terminal-basico', title: '1. Terminal básico', description: 'ls, cd, mkdir' },
10
10
  { id: 'git-basico', title: '2. Git básico', description: 'init, status, add, commit' },
11
- { id: 'bash-scripts', title: '3. Bash Scripts', description: 'variables, sed, condicionales' }
11
+ { id: 'bash-scripts', title: '3. Bash Scripts', description: 'variables, sed, condicionales' },
12
+ { id: 'piping-redireccion', title: '4. Piping y Redirección', description: '|, >, <, <<<' }
12
13
  ]
13
14
  }
14
15
 
@@ -4,6 +4,7 @@ import { LessonBuilder } from '../builders/LessonBuilder.js'
4
4
  import { TERMINAL_BASICO } from '../data/lessons/sintaxis/terminal-basico.js'
5
5
  import { GIT_BASICO } from '../data/lessons/sintaxis/git-basico.js'
6
6
  import { BASH_SCRIPTS } from '../data/lessons/sintaxis/bash-scripts.js'
7
+ import { PIPING_REDIRECCION } from '../data/lessons/sintaxis/piping-redireccion.js'
7
8
  import { clearConsole } from '../utils/output.js'
8
9
  import { createPromptInterface } from '../utils/input.js'
9
10
  import { UserState } from '../utils/user-state.js'
@@ -12,7 +13,8 @@ import { UNLOCK_CONFIG } from '../data/progression.js'
12
13
  const LESSONS_BY_ID = new Map([
13
14
  ['terminal-basico', TERMINAL_BASICO],
14
15
  ['git-basico', GIT_BASICO],
15
- ['bash-scripts', BASH_SCRIPTS]
16
+ ['bash-scripts', BASH_SCRIPTS],
17
+ ['piping-redireccion', PIPING_REDIRECCION]
16
18
  ])
17
19
 
18
20
  function waitForEnter(message = '\nPresiona Enter para continuar...') {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@icarusmx/creta",
3
- "version": "1.4.6",
3
+ "version": "1.4.8",
4
4
  "description": "Salgamos de este laberinto.",
5
5
  "type": "module",
6
6
  "bin": {