@icarusmx/creta 1.4.6 → 1.4.7

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
@@ -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
+ }
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.7",
4
4
  "description": "Salgamos de este laberinto.",
5
5
  "type": "module",
6
6
  "bin": {