@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 +3 -0
- package/lib/data/lessons/sintaxis/git-basico.js +7 -7
- package/lib/data/lessons/sintaxis/piping-redireccion.js +142 -0
- package/lib/data/lessons/sintaxis/terminal-basico.js +49 -16
- package/lib/data/menus.js +2 -1
- package/lib/executors/sintaxis-executor.js +3 -1
- package/package.json +1 -1
package/ejemplo.sh
ADDED
|
@@ -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
|
|
7
|
-
explanation: '
|
|
8
|
-
detail: '
|
|
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
|
|
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
|
|
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
|
|
40
|
+
explanation: 'git commit toma la foto y la guarda en tu álbum.',
|
|
41
41
|
example: 'git commit -m "Mensaje descriptivo"',
|
|
42
|
-
instruction: '
|
|
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: '
|
|
15
|
+
description: 'Primer comando: ls',
|
|
16
16
|
explanation: 'ls lista los archivos y carpetas en tu ubicación actual.',
|
|
17
|
-
|
|
18
|
-
|
|
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: '
|
|
31
|
+
description: 'Tercer comando: cd',
|
|
24
32
|
explanation: 'cd te permite cambiar de directorio (carpeta).',
|
|
25
|
-
example: 'cd
|
|
26
|
-
instruction: '
|
|
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: '
|
|
31
|
-
description: '
|
|
32
|
-
explanation: '
|
|
33
|
-
example: '
|
|
34
|
-
instruction: '
|
|
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: '
|
|
39
|
-
description: '
|
|
40
|
-
explanation: '
|
|
41
|
-
example: '
|
|
42
|
-
instruction: '
|
|
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...') {
|