@lernapps/practice 0.0.1 → 0.1.0

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/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 the lernapps.net contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
22
+
package/README.md CHANGED
@@ -1,3 +1,24 @@
1
- # @lernapps/practice
1
+ # practice
2
2
 
3
- Placeholder that reserves the name. The first release follows from CI with provenance; the source is at <https://github.com/lernapps/practice>.
3
+ lernapps.net bietet zwei Wege: **Lernen** mit den dauerhaften Apps im [Katalog](https://lernapps.net/apps/) und **Üben** für einen Anlass, etwa die nächste Arbeit. Dieses Repo ist der Weg zum Üben. Der KI-Assistent eines Creators macht aus Fotos von Schulmaterial eine App zum Üben nach Maß (Archetyp `explainer`). Der Creator reicht sie als ZIP-Datei über ein Issue-Formular ein. Ein Workflow veröffentlicht sie unter `https://lernapps.net/practice/i/<Issue-Nummer>/` und räumt sie nach 14 Tagen ab.
4
+
5
+ Das Repo enthält keine Apps und keine Laufzeit. Die Vorlagen kommen aus [lernapps/app-templates](https://github.com/lernapps/app-templates), die Regeln und Prüfungen aus [lernapps/tooling](https://github.com/lernapps/tooling).
6
+
7
+ ## Einstieg
8
+
9
+ - **Für Creator:** <https://lernapps.net/practice/>, Quelle in [docs/index.md](docs/index.md) und [docs/en/index.md](docs/en/index.md).
10
+ - **Für KI-Assistenten:** [docs/llms.txt](docs/llms.txt). Sie führt zur Plan-Vorlage [guidance/plan-template.md](guidance/plan-template.md) und zu den Skills in `skills/`.
11
+ - **Einreichung und Vorschau:** `.github/workflows/` und die Composite-Actions in `actions/`.
12
+ - **Betrieb:** [docs/operations.md](docs/operations.md). **Architektur:** [docs/arc42/](docs/arc42/). **Bewertung der Anleitung:** [docs/evaluation.md](docs/evaluation.md).
13
+
14
+ ## Mitarbeiten
15
+
16
+ - `npm test`: alle Tests (Node 22.18 oder neuer).
17
+ - `npm ci && npm run build && npm run check`: die Seite bauen und prüfen.
18
+ - `npm run try -- <zip>`: eine ZIP-Datei lokal prüfen und bauen.
19
+
20
+ `AGENTS.md` nennt die Regeln für Assistenten.
21
+
22
+ ## Lizenz
23
+
24
+ MIT, siehe [LICENSE](LICENSE).
@@ -0,0 +1,32 @@
1
+ #!/usr/bin/env node
2
+ // `lernapps-practice init <short name>`: starts an app for an occasion, from the npm registry alone. It is the init of
3
+ // @lernapps/tooling with this package as its add-on: the plan template of lernapps practice instead of the tooling's,
4
+ // and its skills next to those of the tooling. The tooling is a dependency of this package, so it is installed already
5
+ // when `npx --yes @lernapps/practice init <short name>` runs; nothing else is downloaded.
6
+ import { spawnSync } from "node:child_process";
7
+ import { readFileSync } from "node:fs";
8
+ import { createRequire } from "node:module";
9
+ import { dirname, join } from "node:path";
10
+
11
+ const USAGE = `Usage: lernapps-practice init <short name>
12
+
13
+ Starts an app for an occasion in the current folder, which must be empty except for .git: the plan template of lernapps
14
+ practice as .vibe/plans/01-<short name>.md, and the skills of lernapps practice and of the tooling. Then follow the plan.
15
+ Every other command is one of lernapps, the CLI of @lernapps/tooling (npx lernapps --help), in the app that init made.
16
+ `;
17
+
18
+ const [command, ...rest] = process.argv.slice(2);
19
+ if (command === "-h" || command === "--help") {
20
+ process.stdout.write(USAGE);
21
+ process.exit(0);
22
+ }
23
+ if (command !== "init" || rest.length !== 1) {
24
+ process.stderr.write(`lernapps-practice: ${command === undefined ? "no command given" : `unknown command or arguments: ${[command, ...rest].join(" ")}`}\n\n${USAGE}`);
25
+ process.exit(2);
26
+ }
27
+ const manifest = createRequire(import.meta.url).resolve("@lernapps/tooling/package.json");
28
+ const bin = JSON.parse(readFileSync(manifest, "utf8")).bin?.lernapps ?? "dist/cli.mjs";
29
+ const result = spawnSync(process.execPath, [join(dirname(manifest), bin), "init", rest[0], "--addon", "@lernapps/practice"], {
30
+ stdio: "inherit",
31
+ });
32
+ process.exit(result.status ?? 1);
@@ -0,0 +1,55 @@
1
+ ---
2
+ name: lernapps-practice-explore
3
+ description: Use in Explore of a lernapps practice plan when someone needs a learning app for an occasion - a class test, a cover lesson, finding out where a class stands, missed work - even if they only say "Klassenarbeit", "Vertretung" or "für die Arbeit üben". Ask once what only the creator knows, search the catalog, say what the preview means for privacy, set the scope from the material and stick to it, then move on to Plan without asking.
4
+ license: MIT
5
+ ---
6
+
7
+ # Anlass, Katalog und Umfang
8
+
9
+ ## Wann benutzen
10
+
11
+ - Explore des Plans aus der Plan-Vorlage von lernapps practice (`.vibe/plans/01-<anlass>.md`). Der Plan sagt, wann Du
12
+ diesen Skill lädst und wann Du wartest.
13
+ - Das Ergebnis: Anlass, Lernende und der Umfang aus dem Material, unter „Answers“ und „Notes“ des Plans.
14
+
15
+ ## Der Creator hat wenig Zeit
16
+
17
+ Eltern haben keine Zeit für viele Rückfragen. Frage nur, was nur der Creator weiß, in einer Nachricht:
18
+
19
+ - wofür die App gebraucht wird (der Anlass),
20
+ - Fach, Klassenstufe (1 bis 13), Bundesland; bei Religion die Konfession, denn Zählweisen (Bücher der Bibel, Gebote)
21
+ hängen davon ab,
22
+ - nach dem Material (Fotos von Arbeitsblättern, Buchseiten, Selbsttests).
23
+
24
+ Sage in derselben Nachricht, was der Creator vorher wissen muss:
25
+
26
+ - Die App ist zwei Wochen lang öffentlich erreichbar, unter einer Adresse mit Nummer. Das Issue, in dem sie
27
+ eingereicht wird, ist ebenfalls öffentlich.
28
+ - Namen, Schule, Klasse, Lehrkraft und die Handschrift des Kindes kommen nicht in die App.
29
+ - Am meisten hilft die App, wenn das Kind vorher selbst sein Material durchsieht. Das ist ein Tipp; Du wartest nicht
30
+ darauf.
31
+
32
+ Frage nicht nach Lehrwerk oder Verlag und nenne beides nirgends. Gewichtung, Abbildungen und Aufgabenformen
33
+ entscheidest Du im Plan selbst.
34
+
35
+ ## Den Katalog durchsuchen
36
+
37
+ Lies den Katalog vollständig: https://lernapps.net/apps/llms.txt (mit curl laden, dann lesen). Suche nach Fach, Stufe
38
+ und Thema. Passt eine App zum Anlass, nenne den Link und frage, ob sie reicht. Reicht sie, endet der Plan.
39
+
40
+ ## Beim Umfang bleiben
41
+
42
+ Der Umfang ist das Material des Creators: seine Themen, seine Begriffe, seine Aufgaben. Recherchiere nur, um diesen
43
+ Stoff zu erklären und Fakten zu prüfen, nie, um weiteren Stoff oder weitere Fragen zu finden. Das hält die App
44
+ fokussiert, und das Kind übt genau das, was in der Arbeit drankommt.
45
+
46
+ ## Weiter zum Plan
47
+
48
+ Steht der Umfang, gehst Du ohne Rückfrage in den Plan. Sage dem Creator in einem Satz, dass Du jetzt den Vorschlag
49
+ für die App vorbereitest.
50
+
51
+ ## Typische Stolpersteine
52
+
53
+ - Der Anlass fehlt, und die App wird zu breit. Frage ihn zuerst, auch wenn schon Fotos da sind.
54
+ - Eine fertige App im Katalog passt fast. Nenne sie trotzdem; der Creator entscheidet.
55
+ - Eine Quelle bringt interessanten Stoff, der nicht im Material steht. Lass ihn weg.
@@ -0,0 +1,85 @@
1
+ ---
2
+ name: lernapps-practice-photos
3
+ description: Use in Explore of a lernapps practice plan when you read photos of school material (worksheets, book pages, self-tests), and in Code when you redraw its figures for the explainer. How to order and divide the pages, how to treat highlighted boxes, cut-off margins and the child's handwriting, which block a task of the material becomes, and how to rebuild a figure with the same content and labels as a generated image or an SVG drawing.
4
+ license: MIT
5
+ ---
6
+
7
+ # Fotos von Schulmaterial lesen und Abbildungen nachbauen
8
+
9
+ ## Wann benutzen
10
+
11
+ - In Explore: Du bekommst Fotos von Arbeitsblättern, Buchseiten oder Selbsttests und leitest daraus die Themen und eine
12
+ Seitenliste ab. Lies erst alle Fotos, schreibe erst danach die Seitenliste.
13
+ - In Code: Du baust die Abbildungen des Materials für die App nach.
14
+ - Schreibe keinen Text der Fotos ab. Du schreibst eigene Texte und Aufgaben zu denselben Themen.
15
+ - Die Fotos kommen nie in die App, nie in das Repo und nie in die ZIP-Datei, auch keine Ausschnitte. Beschreibungen
16
+ des Materials kommen nicht in den Plan.
17
+
18
+ ## Fotos lesen
19
+
20
+ ### Reihenfolge
21
+
22
+ - Die Reihenfolge ist die der Dateinamen oder der Aufnahmezeit, nicht die der Nachricht. Lies erst alle Fotos, dann
23
+ schreibe die Seitenliste.
24
+
25
+ ### Seiten gliedern
26
+
27
+ - Gliedere jede Seite: Titel, Spalten, Text, Abbildungen, Aufgaben. Kennzeichne hervorgehobene Kästen (Info, Merke,
28
+ nummerierte Kurztexte), damit sie in der App wieder als Kasten erscheinen.
29
+ - Notiere jede Abbildung mit ihrem Inhalt: was sie zeigt, ihre Beschriftungen, Zahlen und die Anordnung.
30
+
31
+ ### Ränder
32
+
33
+ - Am Rand hereinragende Nachbarseiten sind abgeschnitten. Nimm nur die Hauptseite.
34
+
35
+ ### Handschrift des Kindes
36
+
37
+ - Kreuze, Durchstreichungen, Zahlen und ausgefüllte Felder stammen vom Kind und können falsch sein. Leite Lösungen aus
38
+ den Fakten ab.
39
+ - Hängt eine Lösung an der Vorlage selbst (welcher Buchstabe welcher Teil ist, welches Feld wohin gehört) und lässt sie
40
+ sich nicht sicher ablesen, frage den Creator in Explore. Buchstaben, Nummern und Beschriftungen des Materials änderst
41
+ Du nie: Das Kind übt für dieselbe Vorlage.
42
+
43
+ ### Aufgaben des Materials
44
+
45
+ - Welche Aufgabe des Materials welcher Block wird: [references/aufgabentypen.md](references/aufgabentypen.md).
46
+
47
+ ## Abbildungen nachbauen
48
+
49
+ Eine Abbildung des Materials baust Du inhaltsgleich nach: dieselben Teile, dieselbe Anordnung, dieselben
50
+ Beschriftungen und Zahlen. Nur die Gestaltung ist Deine.
51
+
52
+ 1. **Kannst Du Bilder erzeugen,** erzeuge die Abbildung neu, nach Deiner Beschreibung des Inhalts, nicht nach dem
53
+ Foto als Vorlage. Speichere sie als `.png`, `.jpg` oder `.webp`.
54
+ 2. **Sonst zeichne sie schematisch als SVG** von Hand: Formen, Linien, Pfeile, Text mit `<text>`. Ein SVG darf nur
55
+ zeichnen: kein `<script>`, kein `on…=`, kein `<foreignObject>`, kein `<iframe>`, `<embed>` oder `<object>`, kein
56
+ `javascript:`, kein Verweis nach außen (`href` und `url(…)` nur auf `#…` in derselben Datei), kein `@import`, kein
57
+ `<!ENTITY`. Sonst lehnt die Einreichung das Bild ab.
58
+ 3. **Ablage:** `src/images/<name>.svg` (oder `.png`, `.jpg`, `.webp`), der Name aus Kleinbuchstaben, Ziffern und
59
+ Bindestrichen.
60
+ 4. **Block:** `figure` mit `image`, `alt`, `caption`, `source` und `licence`; mit nummerierten Markern
61
+ `labelled-figure` (`labels` mit `x`, `y` in Prozent und `text`). Wie, sagt der Skill `lernapps-explainer`.
62
+ - `source`: `eigene Zeichnung` für ein SVG von Hand, `KI-generiert` für ein erzeugtes Bild.
63
+ - `licence`: `CC-BY-4.0`, die Lizenz der Einreichung.
64
+ - `alt` beschreibt den Inhalt so, dass er ohne Bild verständlich ist; die Beschriftungen gehören dazu.
65
+ 5. Prüfe am Ende jede Abbildung einzeln in voller Größe, nicht im Screenshot der ganzen Seite: Stimmen alle
66
+ Beschriftungen und Zahlen mit dem Material überein? Fehlt ein Teil? Passt jeder Buchstabe zu Form und Ort seines
67
+ Teils, zeigt jede Linie auf das Richtige? Nennen Abbildung, `alt` und Text dieselben Fakten? Ändert sich eine
68
+ Zuordnung, prüfe die Zeichnung erneut.
69
+
70
+ ## Typische Stolpersteine
71
+
72
+ - Ein Selbsttest sieht oft wie die Fortsetzung der Seite davor aus, ist aber ein eigenes Blatt. Darum erst alle Fotos
73
+ lesen, dann gliedern.
74
+ - Seiten liegen übereinander und Nachbarseiten schauen heraus: Randtext ist abgeschnitten und nicht verlässlich.
75
+ - Kinderschrift steht mitten in der Vorlage (Kreuze im Selbsttest, Zahlen an Diagrammen, ausgefüllte Tabellen, Datum
76
+ am Rand). Übernimm nichts davon, auch nicht in eine Abbildung. Sind im Selbsttest mehrere Kreuze falsch oder
77
+ durchgestrichen, lässt sich daraus keine Lösung ablesen. Leite sie aus den Fakten ab.
78
+ - Zählweisen unterscheiden sich (nach Konfession, Bundesland, Lehrwerk). Eine Zahl auf dem Foto ist eine Zählung, nicht
79
+ das einzige richtige Ergebnis. Schreibe dann beide Zählungen mit dem Hinweis auf die Zählung.
80
+ - Eine Abbildung mit Beschriftungen zum Eintragen („Beschrifte A bis E“): eine `labelled-figure` mit den Buchstaben
81
+ des Materials als `marker` und `legend: false`, die Zeichnung selbst ohne Buchstaben; dazu ein `matching` mit
82
+ `pairsFrom: material`. So stehen Buchstaben und Bezeichnungen nur einmal da, und die Lösung steht nicht daneben.
83
+ - Hervorgehobene Kästen früh erkennen (Info-Kasten, nummerierte Kurztexte, Kästen mit Buchstaben). Jeder bekommt einen
84
+ eigenen Block (`note`), damit er auf der Seite wieder sichtbar ist.
85
+ - Die Bildanalyse und das Schreiben der Seitenliste dauern lange, wenn Seiten dicht sind. Plane Zeit ein.
@@ -0,0 +1,20 @@
1
+ # Welcher Block für welche Aufgabe des Materials
2
+
3
+ | Aufgabe im Material | Block im Explainer |
4
+ |---|---|
5
+ | Kreuze die richtige Antwort an (eine) | `single-choice` |
6
+ | Mehrere Antworten können richtig sein | `multiple-choice` (mindestens eine richtige Option) |
7
+ | Ordne Bezeichnungen den Kurzbeschreibungen zu | `matching` mit `pairs` (2 bis 8 Paare) |
8
+ | Bringe in die richtige Reihenfolge | `ordering` mit `items` (2 bis 8) |
9
+ | Wie viele …? | `number` mit `answer`, `tolerance`, `mistakes` (je mit `answer` und `message`) |
10
+ | Stimmt die Aussage? | `true-false` mit `answer` |
11
+ | Rechne aus (mit neuen Zahlen je Versuch) | `generated` (Skill `lernapps-explainer`) |
12
+ | Beschreibe, erkläre, vergleiche, begründe; schreibe einen Text (offen) | `open-task`: Aufgabe, 2 bis 5 Punkte einer guten Antwort, jeder Punkt des Inhalts mit seiner `source` (der Abschnitt, in dem er steht), Punkte der Form mit `kind: form`, Musterlösung als `solution` (Skill `lernapps-explainer`). Das Kind schreibt erst selbst, auch auf Papier mit Foto, dann vergleicht es |
13
+ | Beschrifte den Plan mit A bis E | `labelled-figure` mit den Buchstaben als Marker und `matching` der Bezeichnungen |
14
+ | Info-Kasten des Materials | `note` mit Titel „Info: …“ |
15
+ | Fachwort mit Erklärung | `definition` (kommt ins Glossar) |
16
+ | Tabelle, Datumsliste | `table` |
17
+ | Zeitleiste | `timeline` mit `events` (`date` als Jahr, `label` für die Anzeige) |
18
+ | Zeichnung, Kreisdiagramm, Plan | nachgebaute Abbildung als `figure` (siehe „Abbildungen nachbauen“) und eine Aufgabe dazu |
19
+ | Etwas einzeichnen, verschieben, ablesen | eine Komponente, nur wenn kein Block passt (Skill `lernapps-explainer`, Komponenten) |
20
+ | Selbsttest des Materials | `selfAssessment` im Kapitel (Skill `lernapps-explainer-self-assessment`): Aufgaben der Seiten, das Ergebnis je Seite |
@@ -0,0 +1,81 @@
1
+ ---
2
+ name: lernapps-practice-plan
3
+ description: Use in Plan of a lernapps practice plan when the occasion and the scope of the material are clear - decide the app yourself and propose it to the creator for one yes, briefly and with your guesses highlighted - pages that explain before they practise, a self-assessment, figures, richer and interactive forms beyond choice and true-false.
4
+ license: MIT
5
+ ---
6
+
7
+ # Die App vorschlagen
8
+
9
+ ## Wann benutzen
10
+
11
+ - Plan des Plans aus der Plan-Vorlage von lernapps practice (`.vibe/plans/01-<anlass>.md`), wenn Anlass und Umfang
12
+ aus Explore feststehen.
13
+ - Das Ergebnis ist ein Vorschlag, dem der Creator mit einem Ja zustimmt. Er steht unter „Key decisions“ und in den
14
+ Aufgaben von Code.
15
+
16
+ ## Ein Vorschlag, kurz
17
+
18
+ Eltern haben keine Zeit für Rückfragen. Entscheide selbst und lege einen Vorschlag vor, den der Creator in einem Zug
19
+ liest. Nicht Seite für Seite: Hebe hervor, was besonders ist, kurz und gegliedert, zum Beispiel:
20
+
21
+ - der Schwerpunkt und warum,
22
+ - was die App erklärt, bevor das Kind übt,
23
+ - die reicheren Formen und die nachgebauten Abbildungen,
24
+ - Deine Vermutungen, sichtbar markiert („(Vorschlag)“), damit der Creator sie mit einem Blick findet,
25
+ - die Fakten, die er prüfen sollte.
26
+
27
+ Bleib beim Umfang aus Explore. Was nicht im Material steht, kommt nicht hinzu.
28
+
29
+ ## Erst erklären, dann üben
30
+
31
+ Die App vermittelt den Stoff und prüft ihn dann. Jede Themenseite erklärt zuerst: herleiten, ein Beispiel, eine
32
+ Abbildung, wo sie hilft. Danach kommen die Aufgaben zu genau dem, was die Seite erklärt hat. Nur die
33
+ Selbsteinschätzung prüft ohne zu erklären.
34
+
35
+ | Anlass | Seiten |
36
+ | --- | --- |
37
+ | Eine Arbeit steht an | Selbsteinschätzung zuerst, dann je Thema eine Seite; die Themen mit viel Raum im Material oder vielen Fehlern im Selbsttest ausführlicher |
38
+ | Eine Vertretungsstunde | wenige Seiten in der Reihenfolge der Stunde; eine Seite zum Abschluss |
39
+ | Den Stand einer Klasse feststellen | Fragen quer durch den Stoff mit Auswertung zuerst, dann je Thema eine Seite zum Nacharbeiten |
40
+ | Verpasster Stoff | je Thema eine Seite in der Reihenfolge des Unterrichts |
41
+
42
+ - **Selbsteinschätzung:** die Selbsteinschätzung des Explainers (`selfAssessment`, Skill
43
+ `lernapps-explainer-self-assessment`): Aufgaben quer durch den Stoff, und am Ende sagt sie je Seite, ob das Kind sie
44
+ schon kann oder noch einmal ansehen sollte.
45
+ - Keine Seite nur mit Plan, Etappen oder Inhaltsverzeichnis: Die App hat ihre Navigation schon, und eine Aufgabe
46
+ dazu prüft nichts vom Stoff.
47
+
48
+ Sage dem Creator dabei: Die App speichert nichts über die Lernenden außerhalb ihres Browsers. Antworten zählt die
49
+ Seite nur, solange sie offen ist; eine offene Antwort bleibt, bis der Tab geschlossen wird. Auf einem anderen Gerät
50
+ beginnt man von vorn.
51
+
52
+ ## Reichere Formen vorschlagen
53
+
54
+ Über Auswahl und Wahr-oder-falsch hinaus ist viel möglich. Wähle selbst, was zu diesem Material passt, und schlage es
55
+ mit einer groben Skizze vor: was das Kind tut und was ihm das bringt.
56
+
57
+ Reichhaltige Blöcke des Explainers (wie, sagt der Skill `lernapps-explainer`):
58
+
59
+ - `labelled-figure` mit den Buchstaben des Materials als `marker` und `legend: false`; dazu ein `matching` mit
60
+ `pairsFrom: material`: Das Kind beschriftet die Abbildung.
61
+ - `matching` mit `distractors`: Zuordnen, bei dem nicht alles aufgeht.
62
+ - `ordering` und `timeline`: Ereignisse, Schritte, Feste in ihre Reihenfolge bringen.
63
+ - `generated`: Aufgaben, die bei jedem Durchgang neu sind.
64
+ - `number` mit `mistakes`: Rückmeldung genau auf den typischen Fehler.
65
+ - `open-task`: Das Kind antwortet in eigenen Worten, getippt oder auf Papier mit Foto, und vergleicht dann mit den
66
+ Punkten einer guten Antwort. Schlage sie vor, wo das Material beschreiben, erklären, vergleichen oder einen eigenen
67
+ Text verlangt, besonders in Deutsch, Fremdsprachen und Fächern wie Religion; nicht für das, was eine Auswahl
68
+ prüfen kann. Mit oder ohne Tutor.
69
+ - `video` und `figure`: zeigen, was ein Text nur beschreibt.
70
+ - `vue-component`: alles, wofür kein Block passt.
71
+
72
+ Ideen zum Weiterdenken: auf eine Abbildung, eine Karte oder einen Kreis ziehen; Fehler in einem Text finden; in
73
+ Gruppen sortieren; erst schätzen, dann prüfen; eine kleine Geschichte mit Entscheidungen; eine Simulation, an der das
74
+ Kind dreht.
75
+
76
+ ## Typische Stolpersteine
77
+
78
+ - Eine Seite beginnt mit Aufgaben. Dann rät das Kind, statt zu lernen. Erst erklären, dann üben.
79
+ - Du fragst nach Gewichtung oder Aufgabenformen. Schlage sie vor; der Creator ändert, was ihm nicht passt.
80
+ - Der Vorschlag beschreibt jede Seite. Der Creator liest ihn dann nicht. Nenne das Besondere.
81
+ - Fragen zu Stoff, der nicht im Material steht. Die App wird breit und unscharf. Bleib beim Umfang.
@@ -0,0 +1,90 @@
1
+ ---
2
+ name: lernapps-practice-submit
3
+ description: Use in Commit of a lernapps practice plan when the explainer builds and checks locally and the creator should submit it - show the creator every page and go through the declarations, make the ZIP file of src/ (pages, data, images, components), give the link to the form of lernapps/practice, explain the declarations, read the bot's answer, correct and resubmit, and tell the creator about the two weeks and the thumbs-up.
4
+ license: MIT
5
+ ---
6
+
7
+ # Einreichen über lernapps practice
8
+
9
+ ## Wann benutzen
10
+
11
+ - Commit des Plans aus der Plan-Vorlage von lernapps practice. `npm run build` und `npm run check` sind grün.
12
+ - Die App kommt nicht über ein eigenes Repo ins Netz: Der Creator reicht den Ordner `src/` als ZIP-Datei in einem Issue
13
+ von `lernapps/practice` ein. GitHub prüft und baut ihn und kommentiert die Adresse. Kein Push, kein Listing.
14
+
15
+ ## Alle Seiten zeigen
16
+
17
+ Der Creator bestätigt im Formular, dass der Inhalt selbst erstellt ist, keine persönlichen Daten enthält und zwei
18
+ Wochen öffentlich sein darf. Das kann er nur, wenn er jede Seite gesehen hat. Zeige sie ihm vor der ZIP-Datei, nach
19
+ `npm run build`, auf dem besten Weg, den Deine Umgebung erlaubt:
20
+
21
+ 1. Läufst Du auf dem Rechner des Creators: Starte die App mit `npm run dev` und gib ihm die Adresse.
22
+ 2. Sonst Bilder aller Seiten mit `npx lernapps screenshots`, wie der Skill `lernapps-cli` sagt. Zeige die Übersicht
23
+ `screenshots/index.html`, wo Du HTML zeigen kannst, sonst die Bilder der Reihe nach. Der Ordner kommt nicht in die
24
+ ZIP-Datei.
25
+
26
+ Dann geh mit ihm die drei Erklärungen durch, in einfachen Worten:
27
+
28
+ - Texte und Abbildungen sind neu geschrieben und gezeichnet, nichts aus dem Buch oder vom Arbeitsblatt abgeschrieben,
29
+ keine Fotos.
30
+ - Keine Namen, keine Schule, keine Klasse, keine Lehrkraft, keine Handschrift.
31
+ - Er ist einverstanden, dass die App zwei Wochen öffentlich ist.
32
+
33
+ Nenne, worauf er besonders schauen soll: die nachgebauten Abbildungen, die Fakten, die er prüfen sollte, die Punkte
34
+ der offenen Aufgaben und den Scope (`scope:` in jeder Seite und in `src/app.yaml`: stimmt, was die Seiten lehren und was nicht dazugehört?). Erst nach
35
+ seinem Ja geht es weiter.
36
+
37
+ ## ZIP-Datei erzeugen
38
+
39
+ Im Ordner der App, nachdem alles committet ist:
40
+
41
+ ```sh
42
+ git archive --format=zip --output=../<anlass>.zip HEAD src
43
+ ```
44
+
45
+ - Oben in der ZIP-Datei steht `src/` mit `app.yaml`, den Kapiteln, `data/`, `images/` und `components/`. `src/main.ts`
46
+ darf darin stehen; die Einreichung ignoriert es und nimmt das der Vorlage.
47
+ - Erlaubt: `.yaml`, `.yml`, `.md`, `.png`, `.jpg`, `.webp`; `.svg` nur in `src/images/`; `.vue` und `.ts` nur in
48
+ `src/components/` (`<Name>.vue`, `<Name>.ts`, `<Name>.test.ts`). Höchstens 300 Dateien und 10 MB.
49
+ - Keine Fotos des Materials, keine Namen.
50
+ - Die Regeln: https://lernapps.net/practice/rules/
51
+
52
+ ## Einreichen
53
+
54
+ Erkläre ohne Fachwörter:
55
+
56
+ 1. Die Eltern brauchen ein kostenloses GitHub-Konto (https://github.com/signup), nur mit E-Mail-Adresse. Kinder unter
57
+ 13 dürfen keins haben, deshalb legen es die Eltern an.
58
+ 2. Gib den Link zum Formular:
59
+ `https://github.com/lernapps/practice/issues/new?template=submit.yml&subject=<Fach>&grade=<Zahl>&federalState=<Name>`
60
+ (Leerzeichen und Umlaute URL-kodiert).
61
+ 3. Die ZIP-Datei in das Feld „ZIP-Datei“ ziehen, warten, bis ein Link erscheint, die drei Erklärungen anhaken (selbst
62
+ erstellt, keine persönlichen Daten, zwei Wochen veröffentlichen), absenden.
63
+ 4. Veröffentlicht wird unter CC BY 4.0, die Eltern sind Urheber. Das bestätigen sie im Formular.
64
+
65
+ ## Antwort und Korrektur
66
+
67
+ - Nach einigen Minuten kommentiert ein Bot das Issue. Bitte den Creator, Dir den Kommentar zu geben.
68
+ - Nennt er Probleme (Datei, Zeile, Regel): Korrigiere `src/`, prüfe mit `npm run build` und `npm run check`, committe,
69
+ erzeuge eine neue ZIP-Datei. Die Eltern hängen sie als Kommentar an das Issue an (ins Kommentarfeld ziehen, auf den
70
+ Link warten, „Comment“). GitHub prüft und baut dann neu; es zählt die zuletzt angehängte ZIP-Datei.
71
+ - Nennt er die Adresse (`https://lernapps.net/practice/i/<Nummer>/`): Öffne sie und prüfe, dass die App erscheint.
72
+ - Wünscht der Creator danach eine Änderung: wie bei Problemen. Die Vorschau zeigt sie erst nach dem neuen Kommentar des
73
+ Bots; prüfe sie dort, bevor Du sie als erledigt meldest.
74
+
75
+ ## Danach
76
+
77
+ Sage ehrlich:
78
+
79
+ - Das ist eine Vorschau. Sie wird nach zwei Wochen gelöscht.
80
+ - Hat sie geholfen, soll jemand eine 👍-Reaktion auf das erste Feld des Issues setzen. Dann bleibt sie erhalten und
81
+ wird für den Katalog geprüft. Dieses Feedback hilft auch anderen, die vor demselben Stoff stehen.
82
+ - Die App speichert nichts über die Lernenden. Die Selbsteinschätzung zählen sie selbst.
83
+ - Die App erklärt den Stoff Schritt für Schritt und prüft dann, was sitzt. Am meisten hilft sie, wenn das Kind vorher
84
+ selbst sein Material durchgesehen hat.
85
+
86
+ ## Typische Stolpersteine
87
+
88
+ - Eine ZIP-Datei aus dem Ordner über `src/` (mit `node_modules/`) ist zu groß. Packe nur `src/`.
89
+ - Ein SVG-Bild mit Skript, Ereignis-Attribut oder Verweis nach außen wird abgelehnt. Zeichne es ohne.
90
+ - Eine Datei, die nicht committet ist, fehlt in `git archive`. Committe vorher.
@@ -0,0 +1,216 @@
1
+ ---
2
+ # Read by the hooks, the review, the evals. Schema: @lernapps/tooling/guidance/plan-front-matter.v1.schema.json
3
+ # Keep all four keys.
4
+ # Archetype, null until Explore ends; then explainer, the only archetype of lernapps practice. Never another value.
5
+ archetype: null
6
+ # Current phase. Allowed values: explore, plan, code, commit. Change the value line below, never this comment.
7
+ phase: explore
8
+ # prePushFailures: written by the pre-push hook. Never change it.
9
+ prePushFailures: 0
10
+ # failedChecks: failed rules and runs, written by lernapps check and the hooks. Never change it.
11
+ failedChecks: {}
12
+ ---
13
+
14
+ # Plan: <occasion>, a learning app through lernapps practice
15
+
16
+ <!--
17
+ For you, the assistant. lernapps practice: the creator has an occasion (a class test, a cover lesson, …) and no app
18
+ of the catalog fits. You make a small explainer for it on this computer; the creator submits its src/ as a ZIP file
19
+ in an issue of lernapps/practice, and GitHub serves it for two weeks at https://lernapps.net/practice/i/<number>/.
20
+ 1. Path: `.vibe/plans/01-<occasion>.md`, in a new, empty folder. A correction after the submission is no new plan:
21
+ it is a task of Commit.
22
+ 2. Read this plan before each step. One phase at a time, tasks in order.
23
+ 3. Task done → tick `[x]` at once and move it to "Completed" of its phase. An unticked box counts as not done.
24
+ 4. New task found → add it.
25
+ 5. Each phase names its skills. They are in `.agents/skills/` (`init` put them there); load a skill when its task
26
+ comes, not before. Read it in full, from its file. Install no other skill: this app is not published through GitHub
27
+ and not listed.
28
+ 6. Checkpoint: stop, ask, wait for the creator's answer. A message sent before the question is no yes.
29
+ Only a checkpoint waits. A phase's last box → set the next phase and go on in the same message.
30
+ 7. At most 2 questions per message, one topic each. No questions inside drafts or lists.
31
+ 8. Work locally, in this folder. Push nothing, create no repository, list nothing: the submission is the ZIP file.
32
+ 9. Plan in the creator's language. Keep headings and front matter keys. Delete a comment once its part is filled.
33
+ 10. Begin each reply to the creator with the phase in `phase:`, and at a checkpoint the word checkpoint:
34
+ "**Plan · Checkpoint**", "**Code**". The creator always knows where you are.
35
+ 11. You need a shell with Node 22.18 or newer, git and the network (registry.npmjs.org). Blocked → ask the creator to
36
+ allow it, then run again.
37
+ -->
38
+
39
+ *Explore, Plan, Code, Commit.*
40
+
41
+ ## Goal
42
+
43
+ <!-- 1–2 sentences: the occasion, who learns, what they can do afterwards. -->
44
+
45
+ ## Key decisions
46
+
47
+ <!-- One line each: decision and reason. Archetype explainer first (lernapps practice). Scope and weighting from
48
+ the occasion. Your own choice without the creator: mark "(Vorschlag)". -->
49
+
50
+ ## Notes
51
+
52
+ <!-- Occasion, subject, school year, Land; the topics from the material; facts to check and their sources; scope;
53
+ open questions. Never the material itself, never a name. -->
54
+
55
+ ## Explore
56
+
57
+ <!--
58
+ - Find out the occasion, whether an app exists and what the material holds: that is the scope. Ask only what only the
59
+ creator knows, in one message; decide the rest yourself and propose it in Plan.
60
+ - Stick to the scope: research only to explain the material and to check facts, never to find more to ask.
61
+ - Write no code, run no `create`.
62
+ - An answer counts only in the creator's words under "Answers". What you decided is a proposal, marked "(Vorschlag)".
63
+ - Skills: `lernapps-practice-explore`, `lernapps-practice-photos`, `lernapps-content-research`.
64
+ -->
65
+
66
+ ### Tasks
67
+
68
+ - [ ] The skills of the phases are in `.agents/skills/` (`npx --yes @lernapps/practice init <short name>` put them
69
+ there and wrote this plan). `.agents/skills/lernapps-practice-explore` missing → stop and tell the creator the
70
+ folder was not started with `init`.
71
+ - [ ] Load skill `lernapps-practice-explore`. In one message, as it says: ask the occasion, subject, school year,
72
+ Land and the material; say what the creator must know before. Wait for the answer.
73
+ - [ ] Search the catalog as the skill says. An app fits → give the creator its link and ask whether it is enough;
74
+ yes → the plan ends here.
75
+ - [ ] Load skill `lernapps-practice-photos`. Read the material as it says. Under "Notes": the topics, page by page;
76
+ each figure of the material and how you redraw it.
77
+ - [ ] Load skill `lernapps-content-research`. Every fact you are not sure of (numbers, dates, names, ways of
78
+ counting): a source you opened, under "Notes". Open it now, not later. Only what no source you opened settles
79
+ goes to the creator to check. Research only what explains the material; nothing beyond it.
80
+ - [ ] Write the answers under "Answers" and the scope under "Notes": the topics of the material, nothing else.
81
+ - [ ] Set `archetype: explainer` and `phase: plan`: change the value lines (`grep -E '^(archetype|phase):'` prints
82
+ `archetype: explainer` and `phase: plan`). Tell the creator in one sentence that you now prepare the proposal;
83
+ do not ask. Go on in the same message.
84
+
85
+ ### Answers
86
+
87
+ <!-- The creator's answers, in their words. Keep the topics. -->
88
+
89
+ - Occasion: what is coming (a class test, a cover lesson, the state of a class, missed work), for whom.
90
+ - Learners: subject, school year, Land; for religion the denomination.
91
+ - Material: what the creator gives (photos of worksheets, book pages, a self-test) and what of it counts.
92
+ - Changes: what the creator changed in your proposal.
93
+
94
+ ### Completed
95
+
96
+ ## Plan
97
+
98
+ <!--
99
+ - Decide the app and map it onto the explainer: chapters, pages, blocks, exercises, figures, components.
100
+ - No new questions. A gap → decide and mark it "(Vorschlag)". Stay within the scope of Explore.
101
+ - One proposal, confirmable in one read; the only checkpoint before the app is built. After the yes, work on your
102
+ own until Commit.
103
+ - Skills: `lernapps-practice-plan`, `lernapps-exercise-patterns`, `lernapps-explainer-design`; and
104
+ `lernapps-content-research`, loaded in Explore; reread it if it is no longer in view.
105
+ -->
106
+
107
+ ### Tasks
108
+
109
+ - [ ] `grep '^phase:'` prints `phase: plan`; else set it.
110
+ - [ ] Install the skills of the archetype: `npx lernapps skills --archetype explainer`.
111
+ - [ ] Load skills `lernapps-practice-plan`, `lernapps-exercise-patterns` and `lernapps-explainer-design`. Map the
112
+ content as skill `lernapps-explainer-design` says: chapters and pages, with the pages skill
113
+ `lernapps-practice-plan` names for the occasion.
114
+ - [ ] Choose a pattern per topic as skill `lernapps-exercise-patterns` says. Write "Content method".
115
+ - [ ] Each figure: what it shows, its labels as in the material, how you make it (generated image or SVG drawing,
116
+ as skill `lernapps-practice-photos` says). Each component: what it shows and checks, and why no block fits.
117
+ - [ ] Choose richer, interactive forms for this material, as skill `lernapps-practice-plan` says, and sketch them
118
+ roughly.
119
+ - [ ] Fill "Goal" and "Key decisions": the occasion and what learners can do afterwards; each decision with its
120
+ reason, your own choices marked "(Vorschlag)".
121
+ - [ ] The facts to check: each with its source (skill `lernapps-content-research`), or marked for the creator.
122
+ - [ ] Write the Code tasks under "Code": one per page or component, with its content and exercises.
123
+ - [ ] **Checkpoint:** proposal. Brief and structured, as skill `lernapps-practice-plan` says: only what is special
124
+ or conceptual, not page by page; your guesses ("(Vorschlag)") highlighted; the facts the creator should check.
125
+ Ask for one yes or for changes. Stop and wait. Changes → change, write them under "Answers", show
126
+ only what changed. No `create` before the yes.
127
+ - [ ] Set `phase: code`: change the value line (`grep '^phase:'` prints `phase: code`).
128
+
129
+ ### Content method
130
+
131
+ <!-- One line each: exercise patterns and where; figures and how they are made; data files; each component, what it
132
+ checks and cannot. Becomes the content guide in Code. -->
133
+
134
+ ### Completed
135
+
136
+ ## Code
137
+
138
+ <!--
139
+ - Build the app from the explainer and the confirmed plan, in this folder. Work on your own.
140
+ - A check fails → skill `lernapps-cli`. Fix from the message; never bypass a check.
141
+ - Undecidable → choose, mark "(Vorschlag)" under "Key decisions", go on.
142
+ - Creator asks for a change → first say your reading in one sentence; never narrow it silently.
143
+ - Skills: `lernapps-cli`, `lernapps-explainer`, `lernapps-content-questions`, `lernapps-practice-photos` (the
144
+ figures), and the app's content guide `app-content`.
145
+ -->
146
+
147
+ ### Tasks
148
+
149
+ - [ ] `grep '^phase:'` prints `phase: code`; else set it.
150
+ - [ ] Load skill `lernapps-cli`. Create the app in this folder as it says, with
151
+ `npx lernapps create --archetype explainer`; then `git init`, `npm install`, the
152
+ first commit. `create` keeps this plan and the skills. Never write the app by hand.
153
+ - [ ] Fill the content guide `.agents/skills/app-content/SKILL.md` from "Notes" and "Content method". Add under
154
+ "Rules learned from mistakes" the line: "Diese App wird über lernapps/practice eingereicht: eine Änderung ist
155
+ ein neues ZIP im Issue; kein Push, kein Listing." `grep -c "FILL IN" .agents/skills/app-content/SKILL.md`
156
+ prints 0.
157
+ - [ ] Load skill `lernapps-explainer` and the content guide. Questions with options and feedback: also skill
158
+ `lernapps-content-questions`.
159
+ - [ ] Replace the example chapter "Prozent" and the example component `ProzentFeld` with the planned content.
160
+ - [ ] <the tasks written in Plan; each: write it in `src/`, then `npm run build`>
161
+ - [ ] The figures: as skill `lernapps-practice-photos` says, in `src/images/`, with `source` and `licence`.
162
+ - [ ] The scope, once the pages stand: `scope:` in each page, what it teaches from the material in your own words, as
163
+ prose; and `scope: { text, out }` in `src/app.yaml`, what the app is about and what does not belong to it (skill
164
+ `lernapps-explainer`, `runtime.md`). The tutor judges open answers by it. `npm run build` checks it.
165
+ - [ ] `npm run build` and `npm run check` pass.
166
+ - [ ] The content guide matches what was built.
167
+ - [ ] Every box of Explore, Plan and Code ticked.
168
+ - [ ] Set `phase: commit`: change the value line (`grep '^phase:'` prints `phase: commit`).
169
+ No checkpoint here: set it before you ask or report anything, then start Commit in the same message.
170
+
171
+ ### Completed
172
+
173
+ ## Commit
174
+
175
+ <!--
176
+ - Hand the app over: the creator submits the ZIP file of `src/` through the form of lernapps/practice. GitHub checks
177
+ it, builds it and comments the address.
178
+ - Skill: `lernapps-practice-submit`.
179
+ -->
180
+
181
+ ### Tasks
182
+
183
+ - [ ] `grep '^phase:'` prints `phase: commit`; else set it.
184
+ - [ ] Load skill `lernapps-practice-submit`. Show the creator every page of the built app as it says.
185
+ - [ ] **Checkpoint:** pages, and the declarations. The creator has seen every page; highlight what you decided in Code
186
+ ("(Vorschlag)" under "Key decisions"); go through the three declarations of the form with them, as the skill
187
+ says. Stop and wait for a yes. Changes → change, build, check,
188
+ show the changed pages again.
189
+ - [ ] Make the ZIP file of `src/` as the skill says.
190
+ - [ ] **Checkpoint:** submit. Give the creator the ZIP file and the link to the form as the skill says; wait for the
191
+ bot's comment.
192
+ - [ ] The comment names problems → correct them in `src/`, `npm run build` and `npm run check`, a new ZIP file; the
193
+ creator attaches it as a comment of the issue. Repeat until the comment gives the address.
194
+ - [ ] The creator asks for a change after the address → add a task here; change, build, check and attach as above.
195
+ Done only when the bot's new comment is there and the preview shows the change.
196
+ - [ ] **Checkpoint:** address. The comment gives the address: open it, confirm the app shows, give the creator the
197
+ address and what the skill says about two weeks and the 👍.
198
+ - [ ] Fill the retrospective.
199
+
200
+ ### Completed
201
+
202
+ ## Retrospective
203
+
204
+ <!-- At the end of Commit. Facts, short, no names. Read by review and evals. -->
205
+
206
+ ### Phases reached
207
+
208
+ <!-- Last phase completed, checkpoints passed. E.g. "commit; submitted, address received". -->
209
+
210
+ ### Creator turns after the plan
211
+
212
+ <!-- Number of creator messages after the confirmation, topic of each. -->
213
+
214
+ ### Where I had to guess
215
+
216
+ <!-- Each gap in plan, skills, messages or answers, and your choice. "None" if none. -->
package/package.json CHANGED
@@ -1,8 +1,48 @@
1
1
  {
2
2
  "name": "@lernapps/practice",
3
- "version": "0.0.1",
4
- "description": "Placeholder that reserves the name. The first release (0.1.0) follows from CI with provenance; see https://github.com/lernapps/practice",
3
+ "version": "0.1.0",
4
+ "description": "The assistant's side of lernapps practice: the plan template and the skills with which a creator's AI assistant builds an app for an occasion (a class test, a cover lesson), which the creator submits as a ZIP file in an issue; documentation at https://lernapps.net/practice/",
5
5
  "license": "MIT",
6
- "repository": { "type": "git", "url": "git+https://github.com/lernapps/practice.git" },
7
- "publishConfig": { "access": "public" }
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "git+https://github.com/lernapps/practice.git"
9
+ },
10
+ "bin": {
11
+ "lernapps-practice": "./bin/lernapps-practice.mjs"
12
+ },
13
+ "files": [
14
+ "bin",
15
+ "dist/skills",
16
+ "guidance/plan-template.md"
17
+ ],
18
+ "exports": {
19
+ "./package.json": "./package.json",
20
+ "./guidance/plan-template.md": "./guidance/plan-template.md"
21
+ },
22
+ "publishConfig": {
23
+ "access": "public",
24
+ "provenance": true
25
+ },
26
+ "type": "module",
27
+ "scripts": {
28
+ "build": "./scripts/build.sh",
29
+ "check": "site-check --site /practice/",
30
+ "test": "node --test --test-reporter=spec \"test/*.test.ts\"",
31
+ "try": "node scripts/try.ts",
32
+ "prepack": "node scripts/dist-skills.ts"
33
+ },
34
+ "engines": {
35
+ "node": "^22.18.0 || ^24.11.0 || >=26.0.0"
36
+ },
37
+ "devDependencies": {
38
+ "@doctc/arc42": "0.38.0",
39
+ "@lernapps/site": "github:lernapps/lernapps.github.io#00b7891b625342ace8cc8cff3f295ed19e46f289",
40
+ "marked": "18.1.2"
41
+ },
42
+ "dependencies": {
43
+ "@lernapps/tooling": "0.1.0"
44
+ },
45
+ "lernapps": {
46
+ "planTemplate": "guidance/plan-template.md"
47
+ }
8
48
  }