ADR-0007: schema di una wiki interrogabile con immagini; documentazione generale

- Nuovo ADR-0007: convenzione in tre parti (indice con gli id delle figure,
  catalogo JSON con campi minimi, istruzioni solo-query) e ripartizione dei
  compiti tra wiki, motore e app. Nessuna cartella o formato imposti dall'app.
- ADR-0006, README, ROADMAP, PROJECT_STATE, TESTING: esempi resi generici
  (nessun riferimento a una wiki specifica) e nota sull'assenza di uno standard.
- Test delle immagini con struttura e testi neutri.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
davideandClaude Sonnet 5.5 committed 2026-10-15 16:11:00 +02:00
1 parent 5870de6fda
commit f2086de31d
8 files changed
+98 -27

No files matched your search

@@ -207,14 +207,14 @@ public sealed class MarkdownImageTests : IDisposable
Assert.Contains("[guasta]", Text(view));
}
// Struttura tipo wiki: <radice>/raw/immagini.json, <radice>/raw/immagini/<file>, exe in <radice>/agent-wiki-ui/
// Struttura tipo wiki: <radice>/catalogo.json, <radice>/figure/<file>, exe in <radice>/query/
string Wiki(string name, params string[] files)
{
var root = Path.Combine(dir, name);
Directory.CreateDirectory(Path.Combine(root, "raw", "immagini"));
Directory.CreateDirectory(Path.Combine(root, "agent-wiki-ui"));
foreach (var f in files) File.WriteAllBytes(Path.Combine(root, "raw", "immagini", f), PngFactory.Create(24, 12));
File.WriteAllText(Path.Combine(root, "raw", "immagini.json"), "{\"figures\":[]}");
Directory.CreateDirectory(Path.Combine(root, "figure"));
Directory.CreateDirectory(Path.Combine(root, "query"));
foreach (var f in files) File.WriteAllBytes(Path.Combine(root, "figure", f), PngFactory.Create(24, 12));
File.WriteAllText(Path.Combine(root, "catalogo.json"), "{\"figures\":[]}");
return root;
}
@@ -222,7 +222,7 @@ public sealed class MarkdownImageTests : IDisposable
public void Immagine_percorso_relativo_alla_radice()
{
var root = Wiki("wiki-a", "fig1.png");
var (_, view) = Show("![Figura 1](raw/immagini/fig1.png)", baseDir: Path.Combine(root, "agent-wiki-ui"));
var (_, view) = Show("![Figura 1](figure/fig1.png)", baseDir: Path.Combine(root, "query"));
Assert.Single(Images(view));
Assert.DoesNotContain("[Figura 1]", Text(view));
}
@@ -231,16 +231,16 @@ public sealed class MarkdownImageTests : IDisposable
public void Immagine_cartella_piu_vicina()
{
var root = Wiki("wiki-b");
File.WriteAllBytes(Path.Combine(root, "raw", "immagini", "x.png"), PngFactory.Create(30, 30));
var exeDir = Path.Combine(root, "agent-wiki-ui");
Directory.CreateDirectory(Path.Combine(exeDir, "raw", "immagini"));
File.WriteAllBytes(Path.Combine(exeDir, "raw", "immagini", "x.png"), PngFactory.Create(10, 10));
File.WriteAllBytes(Path.Combine(root, "figure", "x.png"), PngFactory.Create(30, 30));
var exeDir = Path.Combine(root, "query");
Directory.CreateDirectory(Path.Combine(exeDir, "figure"));
File.WriteAllBytes(Path.Combine(exeDir, "figure", "x.png"), PngFactory.Create(10, 10));
var (_, view) = Show("![x](raw/immagini/x.png)", baseDir: exeDir);
var (_, view) = Show("![x](figure/x.png)", baseDir: exeDir);
var bmp = Assert.IsAssignableFrom<Bitmap>(Assert.Single(Images(view)).Source);
Assert.Equal(new PixelSize(10, 10), bmp.PixelSize); // vince la cartella più vicina all'exe
var (_, nowhere) = Show("![y](raw/immagini/non-esiste.png)", baseDir: exeDir);
var (_, nowhere) = Show("![y](figure/non-esiste.png)", baseDir: exeDir);
Assert.Empty(Images(nowhere));
Assert.Contains("[y]", Text(nowhere));
}
@@ -248,18 +248,18 @@ public sealed class MarkdownImageTests : IDisposable
[AvaloniaFact]
public void Immagine_risposta_stile_wiki()
{
var root = Wiki("wiki-c", "455dd3d0.png");
var root = Wiki("wiki-c", "schema-a.png");
var risposta = """
La struttura generica è in Figura 1.
Lo schema è in Figura 1.
![Figura 1](raw/immagini/455dd3d0.png)
![Figura 1](figure/schema-a.png)
Figura 1 - struttura generica di un dichetopirrolopirrolo · §1.1 r.73 · [[fig-001]]
Figura 1 - schema generale del sistema · §2.1 r.40 · [[fig-001]]
""";
var (_, view) = Show(risposta, baseDir: Path.Combine(root, "agent-wiki-ui"));
var (_, view) = Show(risposta, baseDir: Path.Combine(root, "query"));
Assert.Single(Images(view));
var text = Text(view);
Assert.Contains("Figura 1 - struttura generica", text);
Assert.Contains("Figura 1 - schema generale", text);
Assert.Contains("[[fig-001]]", text); // il link alla nota resta testo: l'app non legge il catalogo JSON
}
}