Handbuch › freemapper-courseplan
3. Mit einem KI-Assistenten
Der Assistent legt die Bahnen für dich. Dafür ist freemapper-courseplan ein „MCP-Server“, ein Werkzeug, das KI-Assistenten nutzen können. Das Programm hat selbst keine KI. Der Assistent ruft dieselben Bearbeitungsfunktionen auf wie die Kommandozeile, und jeder Aufruf speichert in deine Projektdatei.
Einmal einrichten
- Claude Desktop:
Einstellungen > Entwickler > Konfiguration bearbeiten öffnen.
In die Datei
claude_desktop_config.jsoneintragen, mit deinem eigenen Pfad (unter Windows mit doppelten Backslashes\\):{ "mcpServers": { "freemapper-courseplan": { "command": "/Users/anna/Documents/freemapper-courseplan/freemapper-courseplan", "args": ["mcp"] } } }Claude Desktop neu starten.
- Claude Code: im Terminal
claude mcp add freemapper-courseplan -- /Pfad/zu/freemapper-courseplan mcpeingeben. - Andere Assistenten: Jeder Assistent mit MCP-Unterstützung nimmt denselben Eintrag: das Programm und das Argument
mcp.
Der Assistent liest die Werkzeugtexte in der Sprache deines Systems. Willst du die Sprache festlegen, schreibe "--lang", "de" vor "mcp" in die Argumente oder setze FREEMAPPER_LANG=de in der Umgebung des Programms. Werkzeugnamen und Feldnamen bleiben in jeder Sprache Englisch.
Vom Assistenten einrichten lassen
Das Archiv enthält neben dem Programm die READMEs, die Lizenz, dieses Handbuch und AGENTS.md, eine Anleitung für KI-Assistenten. Ein Assistent, der Befehle auf deinem Computer ausführen kann (etwa Claude Code oder Codex), lädt das Programm herunter, prüft und entpackt es nach den Schritten in dieser Datei und arbeitet dann über die Befehlszeile; einen Eintrag braucht er nicht. Nur ein Assistent, der keine Befehle ausführen kann, braucht den Eintrag von oben. Sag ihm:
Lies AGENTS.md von github.com/HenryJobst/freemapper-courseplan und richte freemapper-courseplan ein.
Auf einem Mac entfernt er die Sperre für nicht signierte Programme und sagt dir das. Je nach Einstellung fragt er vor jedem Befehl. Claude Desktop führt keine Befehle aus; dort trägst du das Programm von Hand ein, wie oben beschrieben.
Eine Bahn legen
Der Assistent sieht die Karte nicht. Er kann ihre Ausdehnung abfragen und für einen Punkt die Kartenobjekte im Umkreis, jeweils mit Symbolnummer, Art (Punkt, Linie, Fläche) und Abstand. Namen wie „Südtür“ oder „Sporthalle“ kennt er nicht, und wo ein Objekt genau liegt, sagt ihm die Abfrage auch nicht. Gib ihm deshalb Positionen vor, in Kartenmillimetern oder bezogen auf die Ausdehnung der Karte, zum Beispiel:
Lege eine Veranstaltung aus ~/karten/halle.omap an. Setze den Start ein Viertel vom linken Rand auf halbe Höhe und das Ziel 10 mm rechts daneben. Setze drei Posten über die Karte verteilt und sag mir zu jedem, welche Kartenobjekte im Umkreis von 2 mm liegen. Lege daraus die Bahn „Kurz“ für die Kategorie D10 an, setze die Postennummern und sag mir die Länge.
Der Assistent geht dann so vor:
- Er legt die Veranstaltung an. Die Projektdatei liegt neben der Karte und heißt
halle.courseplan.toml. - Er fragt die Ausdehnung der Karte ab, also ihre kleinste und größte Ecke in Kartenmillimetern, den Maßstab und die Kartenart, und rechnet daraus die Positionen aus.
- Er setzt Start, Ziel und Posten an diese Positionen.
- Er fragt für jeden Posten die Kartenobjekte in der Nähe ab und nennt dir Symbolnummern und Abstände, etwa „Symbol 521, Fläche, 0,4 mm“. Was das Symbol bedeutet, schlägst du im Symbolsatz der Karte nach.
- Er legt die Bahn an, setzt die Postennummern und liest Länge und Anstieg.
Du kannst in einem späteren Gespräch weitermachen. Gib dem Assistenten den Pfad der Projektdatei, dann setzt er dort an.
Was du wissen solltest
- Pfade sind absolut oder beginnen mit
~. Ein relativer Pfad wird abgelehnt, weil der Assistent den Arbeitsordner des Programms nicht kennt. - Jede Änderung wird sofort gespeichert. Lehnt das Programm eine Änderung ab, etwa einen Punkt außerhalb der Karte oder einen vergebenen Code, bleibt die Datei, wie sie war, und der Assistent bekommt den Grund.
- Hat sich die Projektdatei geändert, nachdem der Assistent sie gelesen hat, etwa weil du im Editor einen Posten verschoben hast, schreibt das Programm nichts. Der Assistent bekommt „
hat sich auf der Platte geändert, nachdem es gelesen wurde. Es wurde nichts geschrieben. Lies das Projekt neu und wiederhole die Änderung“ und wiederholt die Änderung mit dem neuen Stand. - Positionen stehen in Kartenmillimetern im Kartenmaßstab, y zeigt nach unten. Sieh dir jede Postenposition selbst auf der Karte an.
checkprüft Abstände, Winkel und Codes gegen die Regeln (Kapitel 8), aber nicht, ob der Posten am richtigen Objekt steht.- Postennummern setzt das Programm nur, wenn der Assistent darum bittet. Ändert er danach Strecken oder die Reihenfolge, muss er sie neu setzen lassen. Eine Nummernlage, die für einen Posten oder in einer Bahn festgelegt ist, bleibt dabei stehen.
- Die automatische Platzierung setzt die Nummer hinter den Kreis, in Verlängerung der Strecke, die zum Posten hinführt. Knickt die Bahn kaum ab, läuft die weiterführende Strecke dort entlang, und die Nummer steht außen an der Spitze des Winkels. Auf Punkt- und Liniensymbolen der Karte steht sie nur, wenn kein freier Platz bleibt; Flächen darf sie überdecken. Gefällt dir die Lage nicht, setzt du sie selbst.
- Die Nummer steht 0,5 bis 5 mm vom Kreis entfernt (Abstand der Kreislinie zum Nummernfeld, Regel
wkb2026.number.gap). Die automatische Platzierung beginnt bei 0,5 mm und rückt in 0,5-mm-Schritten nach außen, bevor sie von der bevorzugten Richtung abweicht.checkwarnt, wenn ein gespeicherter Abstand außerhalb liegt, etwa bei einer von Hand gesetzten Nummer mit 6 mm.- Ändert sich die Reihenfolge einer Bahn, verliert jede Strecke, die jetzt zu einem anderen Bahnpunkt führt, ihre Knickpunkte und ihre Abflaggung. Der Assistent bekommt eine Liste dieser Strecken.
- Einzel- und Score-Bahnen lassen sich bearbeiten (siehe Score-Bahnen unten).
infonennt die Länge von Einzelbahnen; bei einer Score-Bahn nennt es Posten, Punkte und Zeitlimit, undscore lengthmisst sie. Mannschafts- und Staffelbahnen lassen sich noch nicht bearbeiten; das Programm sagt das.- Die Projektdatei ist einfaches TOML.
freemapper-courseplan info <Projekt>zeigt, was der Assistent getan hat, undlist controls|courses|specials|classes <Projekt>führt die Einzelheiten auf;map extent <Projekt>undmap near <Projekt> --at X,Y --radius MMberichten über die Karte. Alle nehmen--json.Score-Bahnen
Auf einer Score-Bahn besuchen die Läufer die Posten in beliebiger Reihenfolge innerhalb eines Zeitlimits. Jeder Posten zählt Punkte, und jede angefangene Minute über dem Limit kostet Punkte. Diese Befehle bauen eine solche Bahn;
checkprüft sie (Abschnitt 8).freemapper-courseplan course add halle.courseplan.toml Score45 --kind score --start S1 --finish F1 --time-limit 45 freemapper-courseplan score controls halle.courseplan.toml Score45 31,32,43,54 freemapper-courseplan score link add halle.courseplan.toml Score45 31 54 freemapper-courseplan score settings halle.courseplan.toml --value-max 5 --good-pace 4:10 freemapper-courseplan score course set halle.courseplan.toml Score45 --penalty 6- Der Code trägt den Wert: die zweite Ziffer eines zweistelligen Codes, die letzte eines längeren. 43 zählt also 3 Punkte, 54 zählt 4.
score controlsliest den Wert aus dem Code. Ein Wert, den du nach=schreibst, etwa43=3, muss dazu passen; weicht er ab, lehnt das Programm ab und rät, den Code zu ändern.score valuefolgt derselben Regel und repariert deshalb nur einen Wert in der Datei, der nicht mehr zu seinem Code passt. Ein Code ohne Wert, etwaA1, braucht einen:A1=2. - Die Werte reichen von 1 bis zum höchsten Wert der Veranstaltung, standardmäßig 5, höchstens 9 (
score settings --value-max). - Ohne
--penaltyspeichert die Bahn keinen Abzug und nimmt den Standard: den höchsten Postenwert der Bahn, mindestens den höchsten Wert der Veranstaltung, damit sich eine Minute zu viel nie lohnt. Der Standard folgt den Posten.score course set --penalty Nspeichert eine eigene Zahl,--no-penaltykehrt zum Standard zurück. - Wer den Code eines Postens ändert (
control code), gibt ihm den Wert des neuen Codes. Ein Code ohne Wert lässt den alten Wert stehen, undcheckmeldet den Unterschied. - Eine Verbindung nennt zwei Posten, die der Läufer direkt nacheinander anlaufen muss, in beliebiger Richtung. Wer das nicht tut, wird disqualifiziert. Ein Posten hat höchstens zwei Verbindungen, und Verbindungen dürfen keinen Ring schließen. Ein Posten mit Verbindung bleibt in der Bahn, bis du die Verbindung entfernst (
score link remove). score settingsschreibt den Abschnitt[score]der Veranstaltung: Wertebereich, die Pace eines guten und eines sehr guten Läufers (Sekunden je Kilometer oder4:10), die Zielbänder (--good-band 87-93,--very-good-band 95-100, in Prozent), ihre Toleranz (--band-tolerance 3, 0 bis 10 Prozentpunkte), den Anteil schwerer Posten und den Startwert. Vier Abstände in Metern im Gelände regeln, wo Posten stehen (ADR 0072):--value1-min(150 m) ist der kleinste Abstand eines Postens von Start und Ziel, ab dort beginnt Wert 1;--min-gap(100 m, nicht kleiner) der kleinste Abstand zweier Posten;--high-value-gap(200 m, mindestens--min-gap) der kleinste Abstand zweier hochwertiger Posten, also der oberen vier Zehntel der Werte (4 und 5 bei höchstem Wert 5);--max-reachder größte Abstand vom Start. Ohne ihn gilt automatisch ein Viertel der Strecke, die der gute Läufer im Zeitlimit schafft (900 m bei 15 Minuten und 4:10 min/km);--auto-reachkehrt dazu zurück. Ein Abstand ist ein ganzer Wert in Metern.- Jeder dieser Befehle nimmt
--jsonund gibt aus, was das gleichnamige MCP-Werkzeug antwortet (add_score_course,set_score_controls,set_control_value,add_score_link,remove_score_link,set_score_settings,set_score_course_details). Der Editor führt dieselben Operationen aus, und Rückgängig nimmt jede zurück. - Knicke, Strecken, Postennummern und
course controlsgehören zu Einzelbahnen; eine Score-Bahn lehnt sie ab. Kategorien, Druckmaßstab,course renameundcourse removegelten für beide. Mannschafts- und Staffelbahnen lassen sich noch nicht bearbeiten. - Der IOF-XML-Export schreibt auch Score-Bahnen (siehe Export unten). Der Purple-Pen-Export lässt sie weiter aus und sagt es. Der Editor zeichnet Score-Bahnen und hat ein Score-Fenster (siehe „Das Score-Fenster“ im Editor-Kapitel).
Listen und Auswertungsbogen
freemapper-courseplan export hall.courseplan.toml --course Score45 --csv score45.csv --sheet score45.md--csvschreibt eine Zeile je Posten:code,value,x_mm,y_mm, nach Code geordnet, mit Positionen in Kartenmillimetern im Kartenmaßstab (y zeigt nach unten) und einem Punkt als Dezimaltrenner.--sheetschreibt den Auswertungsbogen als Markdown, ein Text, der sich so gut drucken lässt: das Zeitlimit, den Abzug je angefangene Minute (den gespeicherten oder den Standard), die Regel, dass bei gleicher Punktzahl gewinnt, wer schneller ist, die Pflichtverbindungen mit der Regel, dass disqualifiziert wird, wer eine Verbindung nicht direkt läuft, und eine Tabelle der Posten mit ihren Werten. Beide brauchen--courseund lehnen eine Bahn ab, die keine Score-Bahn ist. Eine vorhandene Datei wird ersetzt. Die Werkzeuge heißenexport_score_csvundexport_score_sheet, mitproject,courseundpath(Endung.csvoder.md). Die Entscheidungen stehen in ADR 0070.Vorschläge, Entwurf und Länge
Diese drei Befehle lesen die Karte und suchen Wege auf einem Raster der Kartensymbole (ohne Höhen). Auf einer großen Karte brauchen sie deshalb einige Sekunden. Start und Ziel müssen außerhalb von Gebäuden und gesperrten Gebieten liegen; sonst meldet das Programm, dass Start oder Ziel nicht erreichbar ist.
freemapper-courseplan score suggest hall.courseplan.toml --limit 30 freemapper-courseplan score draft hall.courseplan.toml Score45 --time-limit 45 freemapper-courseplan score draft hall.courseplan.toml Score45 --time-limit 45 --apply freemapper-courseplan score length hall.courseplan.toml Score45score suggestlistet Postenplätze, die beste Routenwahl zuerst, jeweils mit Position, Symbolcode des Kartenobjekts, Routenwahl und Schwierigkeit von 0 bis 1, der Zeit vom Start für den guten Läufer und dem Wert, den der Posten bekäme. Es schreibt nichts.--limitsetzt die Anzahl (standardmäßig 60, höchstens 200),--min-distanceden kleinsten Abstand in Kartenmillimetern (standardmäßig die Einstellungmin_gap_m, 100 m im Gelände). Plätze näher alsvalue1_min_man Start oder Ziel und, mit--course, weiter als die Reichweite vom Start entfernt fallen weg.score drafthält zusätzlich den Abstand hochwertiger Posten ein;checkwarnt, wenn eine Bahn ihn oder den Mindestabstand unterschreitet.--course NAMEnimmt Start und Ziel dieser Score-Bahn (--startund--finishhaben weiter Vorrang); ohne die Option gelten der erste Start und das erste Ziel des Events. Plätze in Sperr- und Gefahrengebieten, auf oder in Kartenflächen mit dem Symbol 520, 709 oder 714 und näher als 4 m an einem gesperrten Weg sind ausgeschlossen. Mit--jsonund über MCP hat jeder Kandidat außerdem einen freiencode, der seinen Wert trägt. Er istnull, wenn kein freier Code mehr da ist: Nur die bestplatzierten Kandidaten bekommen einen.score draftwählt aus diesen Plätzen Posten und gibt ihnen Werte und Codes. Der gute Läufer holt dann im Limit standardmäßig 87 bis 93 Prozent aller Punkte, der sehr gute Läufer schafft alle Posten und ist standardmäßig nach 95 bis 100 Prozent des Limits im Ziel. Beide Bänder sind Zielwerte, und ihre Toleranz auch: Ein Ergebnis bis zu 3 Prozentpunkte außerhalb eines Bandes gilt standardmäßig als nahe am Ziel. Bänder und Toleranz sind Einstellungen des Events. Ohne--applygibt der Befehl den Entwurf nur aus. Mit--applylegt er die Posten an und erstellt die Score-Bahn, oder er ersetzt die Posten einer vorhandenen Score-Bahn und entfernt die Posten, die nur sie nutzte. Eine Bahn anderer Art wird abgelehnt. Im Editor lässt sich die Änderung rückgängig machen.--link "X,Y;X,Y"macht zwei Positionen zu einer Pflichtverbindung; jede muss die Position eines Kandidaten ausscore suggestsein, mit einem--limitvon mindestens 60 aufgerufen, dem Pool des Entwurfs. Die Option lässt sich für weitere Verbindungen wiederholen.- Jeder Läufer landet im Band, nahe am Ziel oder verfehlt. Im Band und nahe am Ziel sind Erfolge: Der Befehl endet mit 0, und bei einem Entwurf nahe am Ziel nennt er die Abweichung, etwa „1,7 Prozentpunkte über dem Band ... innerhalb der Toleranz von 3 Prozentpunkten“. Verfehlt ein Entwurf ein Band über die Toleranz hinaus, endet der Befehl mit 1. Er nennt jedes verfehlte Band mit der Größe der Abweichung und einen Hinweis: ein längeres oder kürzeres Limit, mehr geeignete Plätze, freie Codes (die Postenzahl ist durch den Coderaum begrenzt: erhöhe den höchsten Wert mit
score settings --value-max, höchstens 9, oder gib Codes auf der Karte frei), ein schnellerer guter Läufer oder dass diese Eingaben nicht gehen. score lengthanalysiert eine vorhandene Bahn, zum Beispiel nachdem du einen Posten verschoben hast, und meldet dieselben Bänder und Abweichungen und sagt, in welchem der drei Zustände die Bahn liegt. Es ändert die Bahn nie.- Dieselben Antworten liefern die Werkzeuge
score_suggest,score_draftundscore_length;--jsongibt sie aus. Der Entwurf ist bei gleichem Projekt bei jedem Lauf derselbe. score reject --at X,Ylehnt einen Standort ab: Du weißt, dass die Stelle nicht passt, etwa ein privater Hof oder eine Ecke, die niemand sieht. Die Position kommt in die Projektdatei (Schlüsselrejected_sites), undscore suggest,score draftund die Kandidatenliste des Editors lassen sie von da an aus. Ein Kandidat innerhalb von 3 m am Boden gilt als derselbe Standort.score unreject --at X,Ynimmt die Ablehnung zurück und scheitert, wenn der Standort nicht abgelehnt ist. Ein Posten, der dort schon steht, bleibt. Der Editor hat in der Kandidatentabelle neben "Übernehmen" den Knopf "Ablehnen"; Rückgängig nimmt ihn zurück. Die Werkzeuge heißenreject_siteundunreject_sitemitprojectundat, und--jsongibt ihre Antwort aus:at,addedoderremovedundrejected_sites, die Zahl der abgelehnten Standorte. Die Entscheidung steht in ADR 0089.
- Positionen stehen in Kartenmillimetern im Kartenmaßstab, y zeigt nach unten. Sieh dir jede Postenposition selbst auf der Karte an.