zam-core 0.15.5 → 0.15.6
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/dist/cli/app.js +259 -3
- package/dist/cli/app.js.map +1 -1
- package/dist/cli/commands/mcp.js +259 -3
- package/dist/cli/commands/mcp.js.map +1 -1
- package/dist/copilot-extension/host.bundle.js +1 -1
- package/dist/copilot-extension/manifest.json +1 -1
- package/dist/copilot-extension/mcp-client.bundle.mjs +1 -1
- package/dist/ui/graph-panel.html +1 -1
- package/dist/ui/okf-panel.html +1 -1
- package/dist/ui/recall-panel.html +1 -1
- package/dist/ui/settings-panel.html +1 -1
- package/dist/ui/studio-panel.html +1 -1
- package/dist/vscode-extension/{ZAM_Companion_0.15.5.vsix → ZAM_Companion_0.15.6.vsix} +0 -0
- package/dist/vscode-extension/manifest.json +2 -2
- package/package.json +1 -1
package/dist/cli/app.js
CHANGED
|
@@ -10745,7 +10745,7 @@ async function readWebLink(url) {
|
|
|
10745
10745
|
redirect: "manual",
|
|
10746
10746
|
signal: controller.signal,
|
|
10747
10747
|
headers: {
|
|
10748
|
-
"User-Agent": "ZAM-Content-Studio/0.15.
|
|
10748
|
+
"User-Agent": "ZAM-Content-Studio/0.15.6"
|
|
10749
10749
|
}
|
|
10750
10750
|
});
|
|
10751
10751
|
if (res.status >= 300 && res.status < 400) {
|
|
@@ -12309,6 +12309,50 @@ async function setLastCurriculumSelection(db, breadcrumb) {
|
|
|
12309
12309
|
await setSetting(db, LAST_SELECTION_KEY, JSON.stringify(breadcrumb));
|
|
12310
12310
|
}
|
|
12311
12311
|
|
|
12312
|
+
// src/cli/curriculum/content-filter.ts
|
|
12313
|
+
function trackHasTopics(provider, schoolType, grade, subject, track) {
|
|
12314
|
+
return provider.listTopics({ schoolType, grade, subject, track }).length > 0;
|
|
12315
|
+
}
|
|
12316
|
+
function subjectHasContent(provider, schoolType, grade, subject) {
|
|
12317
|
+
const tracks = provider.listTracks(schoolType, grade, subject);
|
|
12318
|
+
if (tracks.length === 0) {
|
|
12319
|
+
return provider.listTopics({ schoolType, grade, subject }).length > 0;
|
|
12320
|
+
}
|
|
12321
|
+
return tracks.some(
|
|
12322
|
+
(track) => trackHasTopics(provider, schoolType, grade, subject, track.id)
|
|
12323
|
+
);
|
|
12324
|
+
}
|
|
12325
|
+
function gradeHasContent(provider, schoolType, grade) {
|
|
12326
|
+
return provider.listSubjects(schoolType, grade).some(
|
|
12327
|
+
(subject) => subjectHasContent(provider, schoolType, grade, subject.id)
|
|
12328
|
+
);
|
|
12329
|
+
}
|
|
12330
|
+
function withImportableContentOnly(provider) {
|
|
12331
|
+
return {
|
|
12332
|
+
...provider,
|
|
12333
|
+
listSchoolTypes() {
|
|
12334
|
+
return provider.listSchoolTypes().filter(
|
|
12335
|
+
(schoolType) => provider.listGrades(schoolType.id).some(
|
|
12336
|
+
(grade) => gradeHasContent(provider, schoolType.id, grade.id)
|
|
12337
|
+
)
|
|
12338
|
+
);
|
|
12339
|
+
},
|
|
12340
|
+
listGrades(schoolType) {
|
|
12341
|
+
return provider.listGrades(schoolType).filter((grade) => gradeHasContent(provider, schoolType, grade.id));
|
|
12342
|
+
},
|
|
12343
|
+
listSubjects(schoolType, grade) {
|
|
12344
|
+
return provider.listSubjects(schoolType, grade).filter(
|
|
12345
|
+
(subject) => subjectHasContent(provider, schoolType, grade, subject.id)
|
|
12346
|
+
);
|
|
12347
|
+
},
|
|
12348
|
+
listTracks(schoolType, grade, subject) {
|
|
12349
|
+
return provider.listTracks(schoolType, grade, subject).filter(
|
|
12350
|
+
(track) => trackHasTopics(provider, schoolType, grade, subject, track.id)
|
|
12351
|
+
);
|
|
12352
|
+
}
|
|
12353
|
+
};
|
|
12354
|
+
}
|
|
12355
|
+
|
|
12312
12356
|
// src/cli/curriculum/providers/bildungsplan-bremen/manifest.ts
|
|
12313
12357
|
var BILDUNGSPLAN_BREMEN_MANIFEST = {
|
|
12314
12358
|
schoolYear: "2025/2026",
|
|
@@ -78099,6 +78143,213 @@ var LEHRPLANPLUS_BAYERN_MANIFEST = {
|
|
|
78099
78143
|
}
|
|
78100
78144
|
};
|
|
78101
78145
|
|
|
78146
|
+
// src/cli/curriculum/providers/lehrplanplus-bayern/track-descriptions.ts
|
|
78147
|
+
var GYMNASIUM_ZWEIGE = {
|
|
78148
|
+
NTG: "Naturwissenschaftlich-technologisches Gymnasium",
|
|
78149
|
+
HG: "Humanistisches Gymnasium",
|
|
78150
|
+
SG: "Sprachliches Gymnasium",
|
|
78151
|
+
MuG: "Musisches Gymnasium",
|
|
78152
|
+
WWG: "Wirtschaftswissenschaftliches Gymnasium",
|
|
78153
|
+
SWG: "Sozialwissenschaftliches Gymnasium"
|
|
78154
|
+
};
|
|
78155
|
+
var FOS_BOS_RICHTUNGEN = {
|
|
78156
|
+
ABU: "Agrarwirtschaft, Bio- und Umwelttechnologie",
|
|
78157
|
+
G: "Gestaltung",
|
|
78158
|
+
GH: "Gesundheit",
|
|
78159
|
+
IW: "Internationale Wirtschaft",
|
|
78160
|
+
S: "Sozialwesen",
|
|
78161
|
+
T: "Technik",
|
|
78162
|
+
W: "Wirtschaft und Verwaltung"
|
|
78163
|
+
};
|
|
78164
|
+
function codesInLabel(label, table) {
|
|
78165
|
+
return Object.keys(table).filter(
|
|
78166
|
+
(code) => new RegExp(`\\b${code}\\b`).test(label)
|
|
78167
|
+
);
|
|
78168
|
+
}
|
|
78169
|
+
function fosBosCodesFromId(id) {
|
|
78170
|
+
const ignored = /* @__PURE__ */ new Set(["wahl", "pflicht"]);
|
|
78171
|
+
const tokens = id.toLowerCase().split(/[-_]/).filter((token) => token.length > 0 && !ignored.has(token));
|
|
78172
|
+
if (tokens.length === 0) return [];
|
|
78173
|
+
const codes = tokens.map((token) => token.toUpperCase());
|
|
78174
|
+
if (!codes.every((code) => code in FOS_BOS_RICHTUNGEN)) return [];
|
|
78175
|
+
return Object.keys(FOS_BOS_RICHTUNGEN).filter((code) => codes.includes(code));
|
|
78176
|
+
}
|
|
78177
|
+
function richtungenSentence(codes) {
|
|
78178
|
+
if (codes.length === 0) return void 0;
|
|
78179
|
+
const named = codes.map((code) => `${FOS_BOS_RICHTUNGEN[code]} (${code})`);
|
|
78180
|
+
if (named.length === 1) {
|
|
78181
|
+
return `F\xFCr die Ausbildungsrichtung ${named[0]}.`;
|
|
78182
|
+
}
|
|
78183
|
+
return `F\xFCr die Ausbildungsrichtungen: ${named.join(", ")}.`;
|
|
78184
|
+
}
|
|
78185
|
+
function collectRealschule(label, parts) {
|
|
78186
|
+
if (/\(I\)\s*$/.test(label)) {
|
|
78187
|
+
parts.push(
|
|
78188
|
+
"F\xFCr die Wahlpflichtf\xE4chergruppe I (mathematisch-naturwissenschaftlich-technischer Zweig, u. a. mit vertiefter Mathematik)."
|
|
78189
|
+
);
|
|
78190
|
+
} else if (/\(II\/III\)\s*$/.test(label)) {
|
|
78191
|
+
parts.push(
|
|
78192
|
+
"F\xFCr die Wahlpflichtf\xE4chergruppen II und III (wirtschaftlicher bzw. fremdsprachlicher, gestalterischer oder sozialer Zweig)."
|
|
78193
|
+
);
|
|
78194
|
+
}
|
|
78195
|
+
}
|
|
78196
|
+
function collectGymnasium(label, parts) {
|
|
78197
|
+
if (label.includes("erh\xF6htes Anforderungsniveau")) {
|
|
78198
|
+
parts.push(
|
|
78199
|
+
"Erh\xF6htes Anforderungsniveau: vertieftes Niveau der Oberstufe, z. B. f\xFCr dein Abiturpr\xFCfungsfach mit erh\xF6hten Anforderungen."
|
|
78200
|
+
);
|
|
78201
|
+
}
|
|
78202
|
+
if (label.includes("grundlegendes Anforderungsniveau")) {
|
|
78203
|
+
parts.push(
|
|
78204
|
+
"Grundlegendes Anforderungsniveau: das Standardniveau der Oberstufe."
|
|
78205
|
+
);
|
|
78206
|
+
}
|
|
78207
|
+
if (label.includes("Vertiefungskurs")) {
|
|
78208
|
+
parts.push(
|
|
78209
|
+
"Freiwilliger Vertiefungskurs zur Studienvorbereitung in der Oberstufe."
|
|
78210
|
+
);
|
|
78211
|
+
}
|
|
78212
|
+
if (/spät beginnende/i.test(label)) {
|
|
78213
|
+
parts.push(
|
|
78214
|
+
"\u201ESp\xE4t beginnend\u201C: f\xFCr alle, die das Fach erst in der Oberstufe neu begonnen haben."
|
|
78215
|
+
);
|
|
78216
|
+
} else if (label.includes("Fremdsprache") && /\d\./.test(label)) {
|
|
78217
|
+
parts.push(
|
|
78218
|
+
"Die Z\xE4hlung richtet sich danach, als wievielte Fremdsprache du die Sprache begonnen hast (Beginn ab Klasse 5 = 1. Fremdsprache)."
|
|
78219
|
+
);
|
|
78220
|
+
}
|
|
78221
|
+
const zweige = codesInLabel(label, GYMNASIUM_ZWEIGE);
|
|
78222
|
+
if (zweige.length === 1) {
|
|
78223
|
+
parts.push(
|
|
78224
|
+
`Gilt f\xFCr den Zweig ${GYMNASIUM_ZWEIGE[zweige[0]]} (${zweige[0]}).`
|
|
78225
|
+
);
|
|
78226
|
+
} else if (zweige.length > 1) {
|
|
78227
|
+
parts.push(
|
|
78228
|
+
`Gilt f\xFCr diese Zweige: ${zweige.map((code) => `${GYMNASIUM_ZWEIGE[code]} (${code})`).join(", ")}.`
|
|
78229
|
+
);
|
|
78230
|
+
}
|
|
78231
|
+
}
|
|
78232
|
+
function collectMittelschule(label, parts) {
|
|
78233
|
+
if (/\(R und M\)/.test(label)) {
|
|
78234
|
+
parts.push(
|
|
78235
|
+
"Gilt f\xFCr Regelklassen (R) und Mittlere-Reife-Klassen (M) gleicherma\xDFen."
|
|
78236
|
+
);
|
|
78237
|
+
} else if (/\bM\d+\b/.test(label)) {
|
|
78238
|
+
parts.push(
|
|
78239
|
+
"M-Klasse (Mittlere-Reife-Zug): erh\xF6htes Anforderungsniveau auf dem Weg zum mittleren Schulabschluss."
|
|
78240
|
+
);
|
|
78241
|
+
} else if (/\bR\d+\b/.test(label)) {
|
|
78242
|
+
parts.push("Regelklasse: der regul\xE4re Bildungsgang der Mittelschule.");
|
|
78243
|
+
}
|
|
78244
|
+
}
|
|
78245
|
+
function collectWirtschaftsschule(label, parts) {
|
|
78246
|
+
if (/(drei- und vier|vier- und drei)stufige/.test(label)) {
|
|
78247
|
+
parts.push(
|
|
78248
|
+
"Gilt f\xFCr die drei- und die vierstufige Wirtschaftsschule gleicherma\xDFen."
|
|
78249
|
+
);
|
|
78250
|
+
} else if (label.includes("vierstufig")) {
|
|
78251
|
+
parts.push("Vierstufige Wirtschaftsschule: Einstieg ab Jahrgangsstufe 7.");
|
|
78252
|
+
} else if (label.includes("dreistufig")) {
|
|
78253
|
+
parts.push("Dreistufige Wirtschaftsschule: Einstieg ab Jahrgangsstufe 8.");
|
|
78254
|
+
} else if (label.includes("zweistufig")) {
|
|
78255
|
+
parts.push("Zweistufige Wirtschaftsschule: Einstieg ab Jahrgangsstufe 10.");
|
|
78256
|
+
}
|
|
78257
|
+
}
|
|
78258
|
+
function collectFosBos(track, parts) {
|
|
78259
|
+
const { id, label } = track;
|
|
78260
|
+
if (label.includes("Vorklasse")) {
|
|
78261
|
+
parts.push(
|
|
78262
|
+
"Vorklasse: das Vollzeit-Vorbereitungsjahr vor Jahrgangsstufe 11 (FOS) bzw. 12 (BOS)."
|
|
78263
|
+
);
|
|
78264
|
+
}
|
|
78265
|
+
if (label.includes("Vorkurs")) {
|
|
78266
|
+
parts.push(
|
|
78267
|
+
"Vorkurs: vorbereitender Kurs (meist in Teilzeit) vor dem Einstieg in die FOS/BOS."
|
|
78268
|
+
);
|
|
78269
|
+
}
|
|
78270
|
+
if (/\bAHR\b/.test(label)) {
|
|
78271
|
+
parts.push(
|
|
78272
|
+
"AHR: Weg zur Allgemeinen Hochschulreife (Abitur), in der Regel mit zweiter Fremdsprache bis Jahrgangsstufe 13."
|
|
78273
|
+
);
|
|
78274
|
+
}
|
|
78275
|
+
if (label.includes("Grundkurs")) {
|
|
78276
|
+
parts.push("Grundkurs: Sprachkurs f\xFCr Einsteiger ohne Vorkenntnisse.");
|
|
78277
|
+
}
|
|
78278
|
+
if (label.includes("Aufbaukurs")) {
|
|
78279
|
+
parts.push(
|
|
78280
|
+
"Aufbaukurs: setzt Vorkenntnisse aus der vorherigen Schule voraus."
|
|
78281
|
+
);
|
|
78282
|
+
}
|
|
78283
|
+
if (label.includes("fortgef\xFChrt")) {
|
|
78284
|
+
parts.push(
|
|
78285
|
+
"Fortgef\xFChrt: Weiterf\xFChrung einer bereits erlernten Fremdsprache."
|
|
78286
|
+
);
|
|
78287
|
+
}
|
|
78288
|
+
if (label.includes("fachpraktisch")) {
|
|
78289
|
+
parts.push(
|
|
78290
|
+
"Teil der fachpraktischen Ausbildung (fpA) in Jahrgangsstufe 11."
|
|
78291
|
+
);
|
|
78292
|
+
}
|
|
78293
|
+
const codes = fosBosCodesFromId(id).length > 0 ? fosBosCodesFromId(id) : codesInLabel(label, FOS_BOS_RICHTUNGEN);
|
|
78294
|
+
const richtungen = richtungenSentence(codes);
|
|
78295
|
+
if (richtungen) {
|
|
78296
|
+
parts.push(richtungen);
|
|
78297
|
+
} else {
|
|
78298
|
+
const prefix = label.match(/^(.+?) – /)?.[1];
|
|
78299
|
+
const prefixRichtung = Object.values(FOS_BOS_RICHTUNGEN).find(
|
|
78300
|
+
(name) => prefix === name
|
|
78301
|
+
);
|
|
78302
|
+
if (prefixRichtung) {
|
|
78303
|
+
parts.push(`F\xFCr die Ausbildungsrichtung ${prefixRichtung}.`);
|
|
78304
|
+
}
|
|
78305
|
+
}
|
|
78306
|
+
}
|
|
78307
|
+
var WOCHENSTUNDEN = {
|
|
78308
|
+
einst\u00FCndig: "einer Wochenstunde",
|
|
78309
|
+
zweist\u00FCndig: "zwei Wochenstunden",
|
|
78310
|
+
dreist\u00FCndig: "drei Wochenstunden"
|
|
78311
|
+
};
|
|
78312
|
+
function collectShared(track, parts) {
|
|
78313
|
+
const { id, label } = track;
|
|
78314
|
+
if (label.includes("Basissport")) {
|
|
78315
|
+
parts.push("Basissport: der verbindliche Sportunterricht f\xFCr alle.");
|
|
78316
|
+
}
|
|
78317
|
+
if (label.includes("Differenzierter Sport")) {
|
|
78318
|
+
parts.push(
|
|
78319
|
+
"Differenzierter Sport: zus\xE4tzlicher Wahlsport in einzelnen Sportarten."
|
|
78320
|
+
);
|
|
78321
|
+
}
|
|
78322
|
+
const stunden = label.match(/(einstündig|zweistündig|dreistündig)/)?.[1];
|
|
78323
|
+
if (stunden) {
|
|
78324
|
+
parts.push(
|
|
78325
|
+
`Fassung mit ${WOCHENSTUNDEN[stunden]} \u2013 welche gilt, h\xE4ngt von der Stundentafel deiner Schule ab.`
|
|
78326
|
+
);
|
|
78327
|
+
}
|
|
78328
|
+
const gueltigAb = label.match(/gültig ab (?:SJ )?(\d{4}\/\d{2})/)?.[1];
|
|
78329
|
+
if (gueltigAb) {
|
|
78330
|
+
parts.push(`Neue Lehrplanfassung: gilt ab dem Schuljahr ${gueltigAb}.`);
|
|
78331
|
+
}
|
|
78332
|
+
const gueltigBis = id.match(/gueltig_bis_(\d{2})_(\d{2})/);
|
|
78333
|
+
if (gueltigBis) {
|
|
78334
|
+
parts.push(
|
|
78335
|
+
`Bisherige Lehrplanfassung: gilt noch bis einschlie\xDFlich Schuljahr 20${gueltigBis[1]}/${gueltigBis[2]}.`
|
|
78336
|
+
);
|
|
78337
|
+
}
|
|
78338
|
+
}
|
|
78339
|
+
function describeBayernTrack(schoolType, track) {
|
|
78340
|
+
const parts = [];
|
|
78341
|
+
if (schoolType === "realschule") collectRealschule(track.label, parts);
|
|
78342
|
+
else if (schoolType === "gymnasium") collectGymnasium(track.label, parts);
|
|
78343
|
+
else if (schoolType === "mittelschule")
|
|
78344
|
+
collectMittelschule(track.label, parts);
|
|
78345
|
+
else if (schoolType === "wirtschaftsschule")
|
|
78346
|
+
collectWirtschaftsschule(track.label, parts);
|
|
78347
|
+
else if (schoolType === "fos" || schoolType === "bos")
|
|
78348
|
+
collectFosBos(track, parts);
|
|
78349
|
+
collectShared(track, parts);
|
|
78350
|
+
return parts.length > 0 ? parts.join(" ") : void 0;
|
|
78351
|
+
}
|
|
78352
|
+
|
|
78102
78353
|
// src/cli/curriculum/providers/lehrplanplus-bayern/index.ts
|
|
78103
78354
|
function levelKey(schoolType, grade, subject, track) {
|
|
78104
78355
|
return track ? `${schoolType}|${grade}|${subject}|${track}` : `${schoolType}|${grade}|${subject}`;
|
|
@@ -78212,7 +78463,12 @@ var lehrplanplusBayernProvider = {
|
|
|
78212
78463
|
return LEHRPLANPLUS_BAYERN_MANIFEST.subjects[schoolType] ?? [];
|
|
78213
78464
|
},
|
|
78214
78465
|
listTracks(schoolType, grade, subject) {
|
|
78215
|
-
return LEHRPLANPLUS_BAYERN_MANIFEST.tracks[levelKey(schoolType, grade, subject)] ?? []
|
|
78466
|
+
return (LEHRPLANPLUS_BAYERN_MANIFEST.tracks[levelKey(schoolType, grade, subject)] ?? []).map(
|
|
78467
|
+
(track) => {
|
|
78468
|
+
const description = describeBayernTrack(schoolType, track);
|
|
78469
|
+
return description ? { ...track, description } : { ...track };
|
|
78470
|
+
}
|
|
78471
|
+
);
|
|
78216
78472
|
},
|
|
78217
78473
|
listTopics(selection) {
|
|
78218
78474
|
const { schoolType, grade, subject, track } = selection;
|
|
@@ -78806,7 +79062,7 @@ var CURRICULUM_PROVIDERS = [
|
|
|
78806
79062
|
rahmenrichtlinienStProvider,
|
|
78807
79063
|
fachanforderungenShProvider,
|
|
78808
79064
|
lehrplanThueringenProvider
|
|
78809
|
-
];
|
|
79065
|
+
].map(withImportableContentOnly);
|
|
78810
79066
|
function getCurriculumProvider(id) {
|
|
78811
79067
|
return CURRICULUM_PROVIDERS.find((provider) => provider.id === id);
|
|
78812
79068
|
}
|