# ScriptC

**ScriptC** (`ScriptCommand`) es un lenguaje de scripting y orquestación lineal implementado en Java. Sus archivos físicos usan la extensión `.sc` y comienzan con la firma mágica `_/sc`.

> Estado: prototipo funcional. El motor Java ejecuta comandos integrados y puede delegar comandos Python/Node.js mediante procesos reales del sistema.

## Inicio rápido

Requisitos: JDK 17+, Python 3 y Node.js cuando se usen comandos externos.

```bash
javac -d build src/ScriptCEngine.java
java -cp build ScriptCEngine examples/ScriptFrankestein.sc
./run-tests.sh
```

## Sintaxis

### Cabecera y terminación

La primera línea debe ser exactamente:

```sc
_/sc
```

La ejecución finaliza inmediatamente al encontrar:

```sc
/terminate
```

Todo lo que aparezca después de `/terminate` se ignora.

### Comandos

Cada comando comienza con `/`:

```sc
/systemstart player [Sabies]
/check lvlHigh [5]
```

Los comandos se resuelven contra el registro integrado del motor. Los comandos desconocidos producen un fallo y establecen `lastSuccess=false`.

### Tuberías

El operador `\to\` enlaza etapas secuenciales. La salida de cada etapa queda disponible en el contexto compartido:

```sc
/python:runDataClean \to\ /python:trainModel [epochs=50]
```

Las etapas Python se ejecutan con `python3` (o con `SCRIPTC_PYTHON`) y las etapas Node.js con `node` (o `SCRIPTC_NODE`). El motor busca primero el archivo indicado y después `runtime/python/<comando>.py` o `runtime/node/<comando>.js`.

### Condicionales

El resultado de la última orden controla las ramas:

```sc
/?yes:
  /= calculate bonus \to\ sendconfirmation

/?no:
  /= notifylvl is low
```

`/?yes:` se ejecuta si `lastSuccess` es verdadero. `/?no:` se ejecuta si es falso. El prefijo `/=` representa un pipeline o expresión de comandos.

## Comandos integrados

El bootstrap Java incluye `/systemstart`, `/check`, `/initProcess`, `/calculate`, `/sendconfirmation`, `/actuallvl`, `/notifylvl`, `/register`, `/contextRequired`, `/compileProcess`, `/scanHeader`, `/tokenizeLines`, `/matchRegistry`, `/dispatchToCloud` y `/executeBlocks`.

Los comandos externos tienen la forma `/python:nombre` o `/node:nombre`. El motor captura la salida combinada, la coloca en `lastExternalOutput`, guarda el estado en `lastExternalExitCode` y considera exitoso únicamente un proceso con código `0`.

## Estructura

```text
src/ScriptCEngine.java       # intérprete y contexto compartido
src/ScriptCStudio.java       # editor Swing de escritorio
sc-exporter.js               # exportación .sc y puente Node.js
examples/                    # scripts de ejemplo
runtime/python/              # comandos Python de demostración
runtime/node/                # comandos Node.js de demostración
site/                       # landing page oficial
```

## Landing page

La landing es HTML estático con Tailwind CSS por CDN. Para verla localmente:

```bash
python3 -m http.server 8080 --directory site
```

## Licencia

MIT. Consulta [LICENSE](LICENSE).
