AUTORÍA / PAQUETES

Del contenido al paquete .p2lrn

Un curso puede crearse visualmente con Studio o programáticamente con Toolkit. Esta guía se centra en el resultado común: cómo se organiza el paquete, cómo se construye y qué conviene comprobar antes de entregarlo al Player.

1. Dos caminos, un mismo resultado

No es necesario repetir ambos recorridos. Elige la forma de autoría que corresponda a tu caso y utiliza las siguientes secciones para entender el paquete resultante.

2. Qué contiene un paquete

course.p2lrn
course.p2lrn
├─ META-INF/manifest.json
├─ content/graph.json
├─ assets/...
├─ packages/...
└─ multipart/...
Manifest

Identifica el paquete, declara perfiles y entrypoints y contiene la información de integridad.

Graph

Describe la estructura de curso, unidades, actividades, recursos y relaciones.

assets / packages

Contienen los recursos que viajan dentro del paquete cuando corresponde.

multipart

Describe recursos grandes distribuidos en partes externas verificadas.

3. Workspace de autoría

Cuando creas por código, el workspace es el proyecto editable y el .p2lrn es el artefacto que publicas. Conserva el workspace si quieres reconstruir o modificar el curso más adelante.

TypeScript
import {P2LRNAuthoringWorkspace} from '@p2lrn/toolkit/authoring';

const workspace = P2LRNAuthoringWorkspace.create('./workspace', {
  title: 'Curso de seguridad básica',
  language: 'es',
});

Autoría y derechos

Si el curso debe identificar autor, fecha, licencia o titular de derechos, utiliza los metadatos portables del propio curso. Studio, Toolkit, Player y Reader comparten el mismo contrato.

TypeScript
workspace.setCourseRights({
  author: 'Nombre del autor',
  createdAt: '2026-10-26',
  license: 'CC BY 4.0',
  copyrightHolder: 'Titular de los derechos'
});

Todos los campos son opcionales y sólo se guardan los que hayas definido. Para el esquema y sus límites consulta Formato P2LRN.

4. Añadir estructura y recursos

Las unidades organizan el curso y los recursos proporcionan el contenido que utilizan las actividades. Las claves devueltas por las funciones de autoría sirven para relacionar después progresión u otras reglas con las entidades reales.

TypeScript
workspace.addUnit({
  key: 'unidad-1',
  title: 'Unidad 1 · Fundamentos',
});

const intro = workspace.addFile({
  source: './material/intro.html',
  key: 'intro',
  title: 'Introducción',
  parent: 'unidad-1',
  mediaType: 'text/html',
});

Para documentos que primero deben analizarse, consulta Reader documental.

5. Añadir reglas opcionales

Si el curso necesita obligatoriedad, bloqueo o prerrequisitos, define esas reglas antes del build. La guía Progresión explica la diferencia entre completar una actividad y bloquear la navegación posterior.

6. Construir el paquete

Cuando la estructura y los recursos estén listos, construye el archivo portable que consumirá el Player.

TypeScript
workspace.build('./curso.p2lrn', {
  strictProfiles: true,
});

El build convierte el proyecto editable en el paquete portable que debe consumir el Player.

7. Validar e inspeccionar antes de publicar

Antes de entregar el curso, valida el paquete y revisa su estructura. No publiques un paquete que falle la validación.

Terminal
p2lrn-validate curso.p2lrn
p2lrn-inspect curso.p2lrn
p2lrn-reader curso.p2lrn

validate comprueba el contrato del paquete. inspect muestra su estructura. reader permite revisar el contenido desde las herramientas del Toolkit. Corrige cualquier error de validación antes de entregar el paquete.

8. Recursos grandes

Si un recurso grande no debe viajar dentro del archivo principal, utiliza Multipart. El descriptor mantiene los hashes y permite que el Player verifique las partes que necesita.

9. Siguiente paso

Continúa con Formato P2LRN para entender con más detalle manifest, graph, perfiles e integridad. Después puedes añadir Progresión y probar el resultado con el Player.