{"id":28885287,"url":"https://github.com/steve02081504/fount-charci","last_synced_at":"2026-02-15T06:13:45.582Z","repository":{"id":297833690,"uuid":"997998015","full_name":"steve02081504/fount-charCI","owner":"steve02081504","description":"CI check for your char!","archived":false,"fork":false,"pushed_at":"2025-12-23T15:55:36.000Z","size":71,"stargazers_count":1,"open_issues_count":0,"forks_count":1,"subscribers_count":0,"default_branch":"master","last_synced_at":"2025-12-25T05:45:20.759Z","etag":null,"topics":["agent","agent-ci","agent-tools","bot-development","ci","fount","fount-repo","github-actions"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/steve02081504.png","metadata":{"files":{"readme":"docs/readme.de-DE.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-06-07T16:43:34.000Z","updated_at":"2025-12-23T15:55:29.000Z","dependencies_parsed_at":"2025-09-15T19:11:44.232Z","dependency_job_id":"3a1afc06-bb80-450e-8072-35de35b6e27a","html_url":"https://github.com/steve02081504/fount-charCI","commit_stats":null,"previous_names":["steve02081504/fount-charci"],"tags_count":7,"template":false,"template_full_name":null,"purl":"pkg:github/steve02081504/fount-charCI","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/steve02081504%2Ffount-charCI","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/steve02081504%2Ffount-charCI/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/steve02081504%2Ffount-charCI/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/steve02081504%2Ffount-charCI/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/steve02081504","download_url":"https://codeload.github.com/steve02081504/fount-charCI/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/steve02081504%2Ffount-charCI/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29471312,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-15T05:26:30.465Z","status":"ssl_error","status_checked_at":"2026-02-15T05:26:21.858Z","response_time":118,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["agent","agent-ci","agent-tools","bot-development","ci","fount","fount-repo","github-actions"],"created_at":"2025-06-20T22:06:31.394Z","updated_at":"2026-02-15T06:13:45.576Z","avatar_url":"https://github.com/steve02081504.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# fount-charCI\n\n[![fount repo](https://steve02081504.github.io/fount/badges/fount_repo.svg)](https://github.com/steve02081504/fount)\n\n[![English (United Kingdom)](https://raw.githubusercontent.com/gosquared/flags/master/flags/flags/shiny/48/United-Kingdom.png)](./readme.en-UK.md)\n[![日本語](https://raw.githubusercontent.com/gosquared/flags/master/flags/flags/shiny/48/Japan.png)](./readme.ja-JP.md)\n[![中文](https://raw.githubusercontent.com/gosquared/flags/master/flags/flags/shiny/48/China.png)](./readme.zh-CN.md)\n[![Deutsch](https://raw.githubusercontent.com/gosquared/flags/master/flags/flags/shiny/48/Germany.png)](./readme.de-DE.md)\n[![Español](https://raw.githubusercontent.com/gosquared/flags/master/flags/flags/shiny/48/Spain.png)](./readme.es-ES.md)\n[![Français](https://raw.githubusercontent.com/gosquared/flags/master/flags/flags/shiny/48/France.png)](./readme.fr-FR.md)\n[![हिन्दी](https://raw.githubusercontent.com/gosquared/flags/master/flags/flags/shiny/48/India.png)](./readme.hi-IN.md)\n[![Italiano](https://raw.githubusercontent.com/gosquared/flags/master/flags/flags/shiny/48/Italy.png)](./readme.it-IT.md)\n[![한국어](https://raw.githubusercontent.com/gosquared/flags/master/flags/flags/shiny/48/South-Korea.png)](./readme.ko-KR.md)\n[![Português (Brasil)](https://raw.githubusercontent.com/gosquared/flags/master/flags/flags/shiny/48/Brazil.png)](./readme.pt-BR.md)\n[![Русский](https://raw.githubusercontent.com/gosquared/flags/master/flags/flags/shiny/48/Russia.png)](./readme.ru-RU.md)\n[![Tiếng Việt](https://raw.githubusercontent.com/gosquared/flags/master/flags/flags/shiny/48/Vietnam.png)](./readme.vi-VN.md)\n\nEin prägnantes und dennoch leistungsstarkes Continuous Integration (CI)-Tool, das speziell für [fount](https://github.com/steve02081504/fount)-Rollenentwickler entwickelt wurde, um Tests zu automatisieren und sicherzustellen, dass Ihre Rollen stabil laufen.\n\nEs hilft Ihnen, Fehler auf Codeebene wie Syntaxprobleme, fehlgeschlagene API-Aufrufe und Ausnahmen in Werkzeugfunktionen zu erkennen und so die grundlegende Benutzerfreundlichkeit Ihrer Rolle vor der Veröffentlichung zu gewährleisten und zu verhindern, dass triviale Fehler die Benutzererfahrung beeinträchtigen.\n\n## ✨ Funktionen\n\nDieses CI-Tool konzentriert sich auf das Testen der programmatischen Robustheit Ihrer Rolle und deckt hauptsächlich die folgenden Bereiche ab:\n\n- ✅ **Strukturiertes Testen**: Organisieren Sie Ihre Testfälle mit Jest-ähnlichen `test`-Blöcken, mit Unterstützung für jede Verschachtelungsebene, wodurch Ihre Testskripte klar und leicht lesbar werden.\n- ✅ **Gleichzeitiges \u0026 sequentielles Testen**: Unterstützung für die parallele Ausführung von Tests zur Erhöhung der Geschwindigkeit oder Sicherstellung der sequentiellen Ausführung mit `await`.\n- ✅ **Test-Hooks**: Bietet `beforeAll`, `afterAll`, `beforeEach` und `afterEach` Hook-Funktionen zum Einrichten und Abbauen der Umgebung in verschiedenen Phasen des Testlebenszyklus.\n- ✅ **Isolierte Testumgebungen**: Jeder Test verfügt über einen eigenen unabhängigen, automatisch bereinigten Arbeitsbereich (für Dateioperationen) und HTTP-Router, um Interferenzen zwischen Tests zu vermeiden.\n- ✅ **Assertion-gesteuert**: Überprüfen Sie Testergebnisse mit der `assert`-Funktion, die bei Fehlern klare Fehlermeldungen meldet.\n- ✅ **Simulation mehrstufiger Interaktionen**: Simulieren Sie präzise den vollständigen \"Denken -\u003e Werkzeug verwenden -\u003e Antworten\"-Ablauf der KI und testen Sie komplexe `replyHandler`-Logik.\n- ✅ **Systemprotokoll- \u0026 Prompt-Inspektion**: Kann Systeminformationen untersuchen, die nach der Werkzeugausführung an die KI zurückgegeben werden, und sogar den endgültigen Prompt abrufen, der an die KI gesendet wurde, um sicherzustellen, dass Logik und Datenverarbeitung wie erwartet sind.\n- ✅ **Detaillierte Testberichte**: Generiert automatisch schöne, interaktive Testzusammenfassungsberichte in GitHub Actions, einschließlich Dauer, Protokolle und Fehlerdetails für jeden Test.\n\n\u003e Angesichts der nicht-deterministischen Natur von LLM-generierten Inhalten kann dieses Tool die Qualität eines Prompts oder den Wert von KI-generierten Inhalten **nicht** bewerten. Sein Kernwert liegt darin, die Korrektheit der programmatischen Teile der Rolle zu gewährleisten.\n\n## 🚀 Schnellstart\n\nRichten Sie automatisierte Tests für Ihr fount-Rollenprojekt in nur drei Schritten ein.\n\n### Schritt 1: Erstellen der Workflow-Datei\n\nErstellen Sie im Stammverzeichnis Ihres Rollenprojekts die CI-Konfigurationsdatei: `.github/workflows/CI.yml`.\n\n### Schritt 2: Füllen mit der Vorlage\n\nFügen Sie den folgenden Inhalt in die Datei `CI.yml` ein. Tests werden automatisch bei Code-Pushes ausgeführt.\n\n```yaml\nname: Test Running\n\npermissions:\n  contents: read\n  actions: write # Erforderlich für die Aktualisierung des Caches\n\non:\n  # Manuelles Auslösen erlauben\n  workflow_dispatch:\n  # Automatisch auslösen, wenn .mjs-Dateien geändert werden\n  push:\n    paths:\n      - '**.mjs'\n    # Tag-Pushes ignorieren, um ein Auslösen bei Versionsfreigaben zu vermeiden\n    tags-ignore:\n      - '*'\n    # Pushes von jedem Branch erlauben\n    branches:\n      - '*'\n\njobs:\n  test-running:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: steve02081504/fount-charCI@master\n        with:\n          # Geben Sie den Pfad zu Ihrem CI-Testskript an\n          CI-filepath: .github/workflows/CI.mjs\n          # (Optional) Geben Sie einen Benutzernamen für die CI an, standardmäßig \"CI-user\"\n          # CI-username: mein-ci-benutzer\n```\n\n### Schritt 3: Erstellen des CI-Testskripts\n\nErstellen Sie im Stammverzeichnis Ihres Rollenprojekts die CI-Eingabedatei: `.github/workflows/CI.mjs`. Unten finden Sie eine moderne, grundlegende Testvorlage:\n\n```javascript\n// fountCharCI wird automatisch in den globalen Geltungsbereich injiziert und kann direkt verwendet werden\nconst CI = fountCharCI;\n\n// --- Testfall 1: Fallback-Behandlung ohne KI-Quelle ---\nawait CI.test('noAI Fallback', async () =\u003e {\n\t// Entfernen Sie die KI-Quelle, um den Fallback-Handler zu testen\n\tawait CI.char.interfaces.config.SetData({ AIsource: '' });\n\t// runOutput ohne Argumente simuliert eine leere oder Standardanforderung\n\tawait CI.runOutput();\n\t// Wenn kein Fehler ausgelöst wird, ist der Test erfolgreich\n});\n\n// --- Testfall 2: Grundlegende KI-Konversation ---\nawait CI.test('Basic AI Response', async () =\u003e {\n\t// Stellen Sie sicher, dass eine KI-Quelle festgelegt ist\n\tawait CI.char.interfaces.config.SetData({ AIsource: 'CI' });\n\n\t// Simulieren Sie die Benutzereingabe \"Hallo\" und überprüfen Sie den endgültigen Inhalt, der von der Rolle zurückgegeben wird\n\tconst { reply } = await CI.runInput('Hallo');\n\n\t// Stellen Sie sicher, dass die endgültige Ausgabe der Rolle mit dem übereinstimmt, was die KI-Quelle zurückgegeben hat\n\t// Die CI-Mock-KI-Quelle gibt standardmäßig \"Wenn ich dich nie wiedersehe, guten Morgen, guten Tag und gute Nacht.\" zurück.\n\tCI.assert(reply.content.includes('guten Morgen'), 'Charakter konnte den KI-Inhalt nicht korrekt zurückgeben.');\n});\n```\n\nSobald diese Schritte abgeschlossen sind, wird der Test-Workflow jedes Mal automatisch ausgeführt, wenn Sie eine Aktualisierung einer `.mjs`-Datei in Ihrem GitHub-Repository pushen.\n\n## 📖 CI-API-Referenz\n\n`fount-charCI` bietet eine prägnante und dennoch leistungsstarke API zum Erstellen Ihrer Tests.\n\n### Definieren von Tests\n\n#### `CI.test(name, asyncFn, options)`\n\nDefiniert einen Testblock. Es kann ein Test auf oberster Ebene sein oder in andere `test`-Blöcke verschachtelt werden, um Untertests zu bilden.\n\n- `name` (String): Eine Beschreibung des Tests.\n- `asyncFn` (Function): Eine asynchrone Funktion, die die Testlogik enthält.\n- `options` (Object, Optional): Konfigurationsoptionen für das Verhalten des Tests.\n  - `start_emoji` (String): Emoji, das angezeigt wird, wenn der Test startet. Standardmäßig `🧪`.\n  - `success_emoji` (String): Emoji, das angezeigt wird, wenn der Test erfolgreich ist. Standardmäßig `✅`.\n  - `fail_emoji` (String): Emoji, das angezeigt wird, wenn der Test fehlschlägt. Standardmäßig `❌`.\n\n#### Gleichzeitiges \u0026 sequentielles Testen\n\n`CI.test` gibt ein Promise-ähnliches Objekt zurück, was die Steuerung des Ausführungsflusses sehr einfach macht.\n\n- **Sequentielle Ausführung**: Verwenden Sie `await`, wenn Sie `CI.test` aufrufen, wenn Tests nacheinander ausgeführt werden sollen.\n- **Gleichzeitige Ausführung**: Sie können mehrere unabhängige Tests ohne `await` aufrufen, damit sie parallel ausgeführt werden.\n\n### Test-Hooks\n\nDiese Funktionen ermöglichen es Ihnen, Code an verschiedenen Punkten im Testlebenszyklus auszuführen, ideal zum Einrichten und Abbauen gemeinsam genutzter Testumgebungen.\n\n- `CI.beforeAll(asyncFn)`: Wird einmal vor allen Tests im aktuellen Geltungsbereich (innerhalb eines `test`-Blocks) ausgeführt.\n- `CI.afterAll(asyncFn)`: Wird einmal ausgeführt, nachdem alle Tests im aktuellen Geltungsbereich abgeschlossen sind.\n- `CI.beforeEach(asyncFn)`: Wird vor jedem Test im aktuellen Geltungsbereich ausgeführt.\n- `CI.afterEach(asyncFn)`: Wird ausgeführt, nachdem jeder Test im aktuellen Geltungsbereich abgeschlossen ist.\n\n```javascript\n// Beispiel: Verwendung von Hooks und Kontextdaten zur Verwaltung einer Mock-Datenbank\nCI.test('Tests mit einer gemeinsam genutzten Datenbank', async () =\u003e {\n\tCI.beforeAll(() =\u003e {\n\t\tconsole.log('Initialisiere Mock-Datenbank...');\n\t\t// Verwenden Sie das context.data-Objekt, um gemeinsam genutzte Ressourcen innerhalb des Geltungsbereichs zu speichern\n\t\tCI.context.data.mockDB = { users: { 'steve': { visits: 0 } } };\n\t});\n\n\tCI.afterAll(() =\u003e {\n\t\tconst finalCount = CI.context.data.mockDB.users.steve.visits;\n\t\tconsole.log(`Datenbanktests abgeschlossen. Endgültige Besuche: ${finalCount}`);\n\t});\n\n\tCI.test('Benutzerbesuch erhöht Zähler', () =\u003e {\n\t\tCI.context.data.mockDB.users.steve.visits++;\n\t\tCI.assert(CI.context.data.mockDB.users.steve.visits \u003e 0, 'Besuche sollten größer als 0 sein');\n\t});\n});\n```\n\n### Testkontext\n\n#### `CI.context`\n\nEin magisches Objekt, das Zugriff auf die isolierte Umgebung des **aktuellen Tests** bietet.\n\n- `CI.context.workSpace`:\n  - `path` (String): Der absolute Pfad zum eindeutigen Arbeitsverzeichnis des aktuellen Tests.\n- `CI.context.http`:\n  - `router` (Express Router): Eine Express-Router-Instanz, die exklusiv für diesen Test gilt.\n  - `url` (String): Die vollständige URL für den Zugriff auf den dedizierten Router dieses Tests.\n- `CI.context.data` (Object): Ein leeres Objekt, das zum Übergeben von Daten zwischen den Hooks eines Tests und seinem Hauptteil verwendet wird.\n\n### Simulieren von Interaktionen\n\n#### `CI.runInput(input, request)`\n\nSimuliert, dass ein **Benutzer eine Nachricht** an die Rolle sendet.\n\n- `input` (String | Object): Die Eingabe des Benutzers.\n- `request` (Object, Optional): Ein partielles Anforderungsobjekt zum Überschreiben von Standardanforderungsparametern.\n- **Gibt zurück** (Object): Ein Objekt mit detaillierten Debugging-Informationen:\n  - `reply` (Object): Das endgültige Ergebnis, das von `GetReply` der Rolle zurückgegeben wird.\n  - `prompt_struct` (Object): Der strukturierte Prompt, der an die KI gesendet wird.\n  - `prompt_single` (String): Der an die KI gesendete Prompt, der in einen einzelnen String konvertiert wurde.\n\n#### `CI.runOutput(output, request)`\n\nSimuliert die **Ausgabe der KI**, um den `replyHandler` der Rolle zu testen.\n\n- `output` (String | Array | Function): Der simulierte Inhalt, der von der KI zurückgegeben wird.\n  - **String**: Simuliert, dass die KI diesen String direkt zurückgibt.\n  - **Array**: Simuliert eine mehrstufige Interaktion. Jedes Element im Array, das ein String oder eine Funktion sein kann, wird nacheinander als Rückgabewert der KI verwendet.\n  - **Function**: Generiert dynamisch die Ausgabe der KI.\n    - **Async**: Die Funktion kann `async` sein.\n    - **Parameter**: Die Funktion erhält ein `result`-Objekt mit `prompt_single` und `prompt_struct` als Argument.\n    - **Rückgabewert**: Der Rückgabewert der Funktion wird zur **nächsten** Ausgabe der KI in der Sequenz.\n    - **Anwendungsfall**: Dies ist äußerst nützlich, um während einer mehrstufigen Interaktion Assertions zu machen oder komplexe Logik auszuführen.\n\n- `request` (Object, Optional): Dasselbe wie `CI.runInput`.\n- **Gibt zurück** (Object): Das endgültige Ergebnis von `GetReply` der Rolle.\n\n#### Das `result`-Objekt\n\nDer Rückgabewert von Interaktionsfunktionen (oder deren `reply`-Eigenschaft) stammt aus dem Rückgabewert von `GetReply` der Rolle und enthält normalerweise:\n\n- **`content`** (String): Der endgültige Textinhalt, der dem Benutzer präsentiert wird.\n- **`logContextBefore`** (Array|Undefined): Ein Array von Nachrichtenprotokollen, die den gesamten Verlauf aufzeichnen, bevor der endgültige `content` generiert wurde, einschließlich Nachrichten mit der Rolle `tool` (Werkzeugausführungsergebnisse), `user` und `char`.\n\n### Hilfswerkzeuge\n\n- `CI.assert(condition, message)`: Führt eine Assertion durch.\n- `CI.char`: Eine Verknüpfung für den Zugriff auf das aktuell geladene Rolleninstanzobjekt.\n- `CI.sleep(ms)`: Hält die Ausführung für die angegebene Anzahl von Millisekunden an.\n- `CI.wait(fn, timeout)`: Ruft die `fn`-Funktion ab, bis sie einen wahrheitsgemäßen Wert zurückgibt oder ein Timeout auftritt.\n\n## 💡 Erweiterte Nutzung\n\n### Testen von Dateioperationsfunktionen\n\nSie können Funktionen, die Dateien lesen und schreiben, sicher mit `CI.context.workSpace` testen.\n\n**Beispiel:** Testen der Funktion `\u003crun-bash\u003e`.\n\n```javascript\nimport fs from 'node:fs';\nimport path from 'node:path';\nconst CI = fountCharCI;\n\nCI.beforeEach(async () =\u003e {\n\tawait CI.char.interfaces.config.SetData({ AIsource: 'CI' });\n});\n\nCI.test('Function: \u003crun-bash\u003e', async () =\u003e {\n\t// Verwenden Sie den isolierten Arbeitsbereichspfad\n\tconst testDir = path.join(CI.context.workSpace.path, 'bash_test_dir');\n\n\tconst result = await CI.runOutput([\n\t\t`\u003crun-bash\u003emkdir ${testDir}\u003c/run-bash\u003e`,\n\t\t'Verzeichnis erstellt.'\n\t]);\n\n\tCI.assert(fs.existsSync(testDir), '\u003crun-bash\u003e konnte Verzeichnis nicht erstellen.');\n\tCI.assert(result.content === 'Verzeichnis erstellt.', 'Endgültige Nachricht ist falsch.');\n});\n```\n\n### Testen des Webbrowsings (mit Assertions für Zwischenschritte)\n\nSie können komplexe Netzwerkinteraktionstests mit `CI.context.http` und dem Funktionsargument von `runOutput` erstellen.\n\n**Beispiel:** Testen der Funktion `\u003cweb-browse\u003e` und Validieren ihres Prompt-Inhalts.\n\n```javascript\nconst CI = fountCharCI;\n\nCI.beforeEach(async () =\u003e {\n\tawait CI.char.interfaces.config.SetData({ AIsource: 'CI' });\n});\n\nCI.test('Function: \u003cweb-browse\u003e', async () =\u003e {\n\tconst { router, url, root } = CI.context.http;\n\tconst webContent = '\u003chtml\u003e\u003cbody\u003e\u003cp\u003eDies ist ein Testabsatz.\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e';\n\n\trouter.get(root, (req, res) =\u003e res.send(webContent));\n\n\tconst result = await CI.runOutput([\n\t\t// 1. Die KI beschließt, die Seite zu durchsuchen\n\t\t`\u003cweb-browse\u003e\u003curl\u003e${url}\u003c/url\u003e\u003c/web-browse\u003e`,\n\n\t\t// 2. Verwenden Sie eine Funktion, um den Zwischenschritt zu validieren und die nächste Antwort der KI bereitzustellen\n\t\tasync (midResult) =\u003e {\n\t\t\t// Assertion: Überprüfen Sie, ob der an die KI gesendete Prompt den Webseiteninhalt enthält\n\t\t\tconst systemLog = midResult.prompt_struct.find(log =\u003e log.role === 'tool');\n\t\t\tCI.assert(systemLog.content.includes('Dies ist ein Testabsatz'), 'Webinhalt war nicht im Prompt.');\n\n\t\t\t// Geben Sie die endgültige Antwort der KI zurück\n\t\t\treturn 'Der Absatz lautet: Dies ist ein Testabsatz.';\n\t\t}\n\t]);\n\n\t// Assertion: Überprüfen Sie, ob der dem Benutzer gegebene endgültige Inhalt korrekt ist\n\tCI.assert(result.content.includes('Der Absatz lautet'), 'Endgültige Antwort ist falsch.');\n});\n```\n\n## Immer noch verwirrt?\n\nSchauen Sie sich an, wie die weltweit erste fount-Rolle, [`Gentian`, es macht](https://github.com/steve02081504/GentianAphrodite/blob/master/.github/workflows/CI.mjs)!\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsteve02081504%2Ffount-charci","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsteve02081504%2Ffount-charci","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsteve02081504%2Ffount-charci/lists"}