updated docs

This commit is contained in:
2026-04-14 10:32:05 -03:00
parent 2e5a304181
commit a80b72a9b1
67 changed files with 3260 additions and 5005 deletions

View File

@@ -0,0 +1,45 @@
digraph artery_hierarchy {
bgcolor="#0a0a0a"
rankdir=LR
fontname="Helvetica"
node [fontname="Helvetica" fontsize=11 style=filled color="#333" fontcolor="#e5e5e5" shape=box]
edge [fontname="Helvetica" fontsize=9 fontcolor="#a3a3a3" color="#b91c1c"]
label="Artery — Component Hierarchy"
labelloc=t
fontsize=14
fontcolor="#fca5a5"
vein [label="Vein\nstateless API connector" fillcolor="#1a1a1a"]
pulse [label="Pulse\nVein + Room + Depot" fillcolor="#1a1a1a"]
plexus [label="Plexus\nfull app: backend\n+ frontend + DB" fillcolor="#1a1a1a"]
shunt [label="Shunt\nfake connector\nfor testing" fillcolor="#1a1a1a" color="#d4a574"]
vein -> pulse [label="compose"]
pulse -> plexus [label="extend"]
shunt -> vein [label="replaces" style=dashed color="#d4a574" fontcolor="#d4a574"]
// Examples
subgraph cluster_examples {
label="Live Veins"
style=dashed
color="#333"
fontcolor="#666"
jira [label="Jira" fillcolor="#1a1a1a" fontcolor="#15803d" fontsize=9]
google [label="Google" fillcolor="#1a1a1a" fontcolor="#d4a574" fontsize=9]
ia [label="IA" fillcolor="#1a1a1a" fontcolor="#15803d" fontsize=9]
}
subgraph cluster_shunts {
label="Shunts"
style=dashed
color="#333"
fontcolor="#666"
mp [label="MercadoPago" fillcolor="#1a1a1a" fontcolor="#d4a574" fontsize=9]
}
jira -> vein [style=invis]
mp -> shunt [style=invis]
}

View File

@@ -0,0 +1,101 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 14.1.2 (0)
-->
<!-- Title: artery_hierarchy Pages: 1 -->
<svg width="845pt" height="317pt"
viewBox="0.00 0.00 845.00 317.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 313.25)">
<title>artery_hierarchy</title>
<polygon fill="#0a0a0a" stroke="none" points="-4,4 -4,-313.25 840.5,-313.25 840.5,4 -4,4"/>
<text xml:space="preserve" text-anchor="middle" x="418.25" y="-291.95" font-family="Helvetica,sans-Serif" font-size="14.00" fill="#fca5a5">Artery — Component Hierarchy</text>
<g id="clust1" class="cluster">
<title>cluster_examples</title>
<polygon fill="#0a0a0a" stroke="#333333" stroke-dasharray="5,2" points="135.88,-8 135.88,-193 220.88,-193 220.88,-8 135.88,-8"/>
<text xml:space="preserve" text-anchor="middle" x="178.38" y="-175.7" font-family="Helvetica,sans-Serif" font-size="14.00" fill="#666666">Live Veins</text>
</g>
<g id="clust2" class="cluster">
<title>cluster_shunts</title>
<polygon fill="#0a0a0a" stroke="#333333" stroke-dasharray="5,2" points="8,-199 8,-276 100,-276 100,-199 8,-199"/>
<text xml:space="preserve" text-anchor="middle" x="54" y="-258.7" font-family="Helvetica,sans-Serif" font-size="14.00" fill="#666666">Shunts</text>
</g>
<!-- vein -->
<g id="node1" class="node">
<title>vein</title>
<polygon fill="#1a1a1a" stroke="#333333" points="446,-167 300.25,-167 300.25,-131 446,-131 446,-167"/>
<text xml:space="preserve" text-anchor="middle" x="373.12" y="-152.05" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#e5e5e5">Vein</text>
<text xml:space="preserve" text-anchor="middle" x="373.12" y="-138.55" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#e5e5e5">stateless API connector</text>
</g>
<!-- pulse -->
<g id="node2" class="node">
<title>pulse</title>
<polygon fill="#1a1a1a" stroke="#333333" points="659.25,-167 522.5,-167 522.5,-131 659.25,-131 659.25,-167"/>
<text xml:space="preserve" text-anchor="middle" x="590.88" y="-152.05" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#e5e5e5">Pulse</text>
<text xml:space="preserve" text-anchor="middle" x="590.88" y="-138.55" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#e5e5e5">Vein + Room + Depot</text>
</g>
<!-- vein&#45;&gt;pulse -->
<g id="edge1" class="edge">
<title>vein&#45;&gt;pulse</title>
<path fill="none" stroke="#b91c1c" d="M446.27,-149C467.03,-149 489.79,-149 510.95,-149"/>
<polygon fill="#b91c1c" stroke="#b91c1c" points="510.67,-152.5 520.67,-149 510.67,-145.5 510.67,-152.5"/>
<text xml:space="preserve" text-anchor="middle" x="484.25" y="-151.7" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#a3a3a3">compose</text>
</g>
<!-- plexus -->
<g id="node3" class="node">
<title>plexus</title>
<polygon fill="#1a1a1a" stroke="#333333" points="836.5,-173.25 726.75,-173.25 726.75,-124.75 836.5,-124.75 836.5,-173.25"/>
<text xml:space="preserve" text-anchor="middle" x="781.62" y="-158.8" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#e5e5e5">Plexus</text>
<text xml:space="preserve" text-anchor="middle" x="781.62" y="-145.3" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#e5e5e5">full app: backend</text>
<text xml:space="preserve" text-anchor="middle" x="781.62" y="-131.8" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#e5e5e5">+ frontend + DB</text>
</g>
<!-- pulse&#45;&gt;plexus -->
<g id="edge2" class="edge">
<title>pulse&#45;&gt;plexus</title>
<path fill="none" stroke="#b91c1c" d="M659.48,-149C677.62,-149 697.19,-149 715.21,-149"/>
<polygon fill="#b91c1c" stroke="#b91c1c" points="714.98,-152.5 724.98,-149 714.98,-145.5 714.98,-152.5"/>
<text xml:space="preserve" text-anchor="middle" x="693" y="-151.7" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#a3a3a3">extend</text>
</g>
<!-- shunt -->
<g id="node4" class="node">
<title>shunt</title>
<polygon fill="#1a1a1a" stroke="#d4a574" points="226.75,-249.25 129,-249.25 129,-200.75 226.75,-200.75 226.75,-249.25"/>
<text xml:space="preserve" text-anchor="middle" x="177.88" y="-234.8" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#e5e5e5">Shunt</text>
<text xml:space="preserve" text-anchor="middle" x="177.88" y="-221.3" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#e5e5e5">fake connector</text>
<text xml:space="preserve" text-anchor="middle" x="177.88" y="-207.8" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#e5e5e5">for testing</text>
</g>
<!-- shunt&#45;&gt;vein -->
<g id="edge3" class="edge">
<title>shunt&#45;&gt;vein</title>
<path fill="none" stroke="#d4a574" stroke-dasharray="5,2" d="M227.14,-206.02C253.71,-195.57 286.85,-182.54 314.73,-171.57"/>
<polygon fill="#d4a574" stroke="#d4a574" points="315.71,-174.95 323.73,-168.03 313.14,-168.43 315.71,-174.95"/>
<text xml:space="preserve" text-anchor="middle" x="263.5" y="-200.95" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#d4a574">replaces</text>
</g>
<!-- jira -->
<g id="node5" class="node">
<title>jira</title>
<polygon fill="#1a1a1a" stroke="#333333" points="204.88,-52 150.88,-52 150.88,-16 204.88,-16 204.88,-52"/>
<text xml:space="preserve" text-anchor="middle" x="177.88" y="-31.07" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#15803d">Jira</text>
</g>
<!-- jira&#45;&gt;vein -->
<!-- google -->
<g id="node6" class="node">
<title>google</title>
<polygon fill="#1a1a1a" stroke="#333333" points="204.88,-106 150.88,-106 150.88,-70 204.88,-70 204.88,-106"/>
<text xml:space="preserve" text-anchor="middle" x="177.88" y="-85.08" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#d4a574">Google</text>
</g>
<!-- ia -->
<g id="node7" class="node">
<title>ia</title>
<polygon fill="#1a1a1a" stroke="#333333" points="204.88,-160 150.88,-160 150.88,-124 204.88,-124 204.88,-160"/>
<text xml:space="preserve" text-anchor="middle" x="177.88" y="-139.07" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#15803d">IA</text>
</g>
<!-- mp -->
<g id="node8" class="node">
<title>mp</title>
<polygon fill="#1a1a1a" stroke="#333333" points="92,-243 16,-243 16,-207 92,-207 92,-243"/>
<text xml:space="preserve" text-anchor="middle" x="54" y="-222.07" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#d4a574">MercadoPago</text>
</g>
<!-- mp&#45;&gt;shunt -->
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.3 KiB

View File

@@ -0,0 +1,49 @@
digraph cfg_gen_flow {
bgcolor="#0a0a0a"
rankdir=LR
fontname="Helvetica"
node [fontname="Helvetica" fontsize=11 style=filled color="#333" fontcolor="#e5e5e5" shape=box]
edge [fontname="Helvetica" fontsize=9 fontcolor="#a3a3a3" color="#d4a574"]
label="Build Flow — cfg/ to gen/"
labelloc=t
fontsize=14
fontcolor="#d4a574"
// Source
subgraph cluster_source {
label="Source (committed)"
style=dashed
color="#333"
fontcolor="#666"
core [label="soleprint/\ncore framework" fillcolor="#1a1a1a"]
cfg [label="cfg/<room>/\nroom config" fillcolor="#1a1a1a"]
}
// Build
build [label="build.py\n--cfg <room>" fillcolor="#1a1a1a" color="#d4a574" shape=component]
// Output
subgraph cluster_output {
label="Output (generated, gitignored)"
style=dashed
color="#333"
fontcolor="#666"
gen_spr [label="gen/<room>/soleprint/\ncore + room merged" fillcolor="#1a1a1a"]
gen_app [label="gen/<room>/<app>/\ncloned repos" fillcolor="#1a1a1a"]
gen_link [label="gen/<room>/link/\nDB bridge" fillcolor="#1a1a1a"]
}
// Run
docker [label="docker compose up" fillcolor="#1a1a1a" shape=component]
// Flow
core -> build
cfg -> build
build -> gen_spr
build -> gen_app [style=dashed label="if managed"]
build -> gen_link [style=dashed label="if managed"]
gen_spr -> docker
}

View File

@@ -0,0 +1,114 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 14.1.2 (0)
-->
<!-- Title: cfg_gen_flow Pages: 1 -->
<svg width="742pt" height="234pt"
viewBox="0.00 0.00 742.00 234.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 230.25)">
<title>cfg_gen_flow</title>
<polygon fill="#0a0a0a" stroke="none" points="-4,4 -4,-230.25 737.5,-230.25 737.5,4 -4,4"/>
<text xml:space="preserve" text-anchor="middle" x="366.75" y="-208.95" font-family="Helvetica,sans-Serif" font-size="14.00" fill="#d4a574">Build Flow — cfg/ to gen/</text>
<g id="clust1" class="cluster">
<title>cluster_source</title>
<polygon fill="#0a0a0a" stroke="#333333" stroke-dasharray="5,2" points="0,-62 0,-193 152.5,-193 152.5,-62 0,-62"/>
<text xml:space="preserve" text-anchor="middle" x="76.25" y="-175.7" font-family="Helvetica,sans-Serif" font-size="14.00" fill="#666666">Source (committed)</text>
</g>
<g id="clust2" class="cluster">
<title>cluster_output</title>
<polygon fill="#0a0a0a" stroke="#333333" stroke-dasharray="5,2" points="350.75,-8 350.75,-193 581.25,-193 581.25,-8 350.75,-8"/>
<text xml:space="preserve" text-anchor="middle" x="466" y="-175.7" font-family="Helvetica,sans-Serif" font-size="14.00" fill="#666666">Output (generated, gitignored)</text>
</g>
<!-- core -->
<g id="node1" class="node">
<title>core</title>
<polygon fill="#1a1a1a" stroke="#333333" points="126.88,-160 24.63,-160 24.63,-124 126.88,-124 126.88,-160"/>
<text xml:space="preserve" text-anchor="middle" x="75.75" y="-145.05" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#e5e5e5">soleprint/</text>
<text xml:space="preserve" text-anchor="middle" x="75.75" y="-131.55" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#e5e5e5">core framework</text>
</g>
<!-- build -->
<g id="node3" class="node">
<title>build</title>
<polygon fill="#1a1a1a" stroke="#d4a574" points="271.75,-106 181.5,-106 181.5,-102 177.5,-102 177.5,-98 181.5,-98 181.5,-78 177.5,-78 177.5,-74 181.5,-74 181.5,-70 271.75,-70 271.75,-106"/>
<polyline fill="none" stroke="#d4a574" points="181.5,-102 185.5,-102 185.5,-98 181.5,-98"/>
<polyline fill="none" stroke="#d4a574" points="181.5,-78 185.5,-78 185.5,-74 181.5,-74"/>
<text xml:space="preserve" text-anchor="middle" x="226.62" y="-91.05" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#e5e5e5">build.py</text>
<text xml:space="preserve" text-anchor="middle" x="226.62" y="-77.55" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#e5e5e5">&#45;&#45;cfg &lt;room&gt;</text>
</g>
<!-- core&#45;&gt;build -->
<g id="edge1" class="edge">
<title>core&#45;&gt;build</title>
<path fill="none" stroke="#d4a574" d="M127.3,-124.07C135.72,-121.06 144.36,-117.95 152.5,-115 158.3,-112.89 164.36,-110.68 170.4,-108.47"/>
<polygon fill="#d4a574" stroke="#d4a574" points="171.59,-111.76 179.76,-105.02 169.17,-105.19 171.59,-111.76"/>
</g>
<!-- cfg -->
<g id="node2" class="node">
<title>cfg</title>
<polygon fill="#1a1a1a" stroke="#333333" points="119,-106 32.5,-106 32.5,-70 119,-70 119,-106"/>
<text xml:space="preserve" text-anchor="middle" x="75.75" y="-91.05" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#e5e5e5">cfg/&lt;room&gt;/</text>
<text xml:space="preserve" text-anchor="middle" x="75.75" y="-77.55" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#e5e5e5">room config</text>
</g>
<!-- cfg&#45;&gt;build -->
<g id="edge2" class="edge">
<title>cfg&#45;&gt;build</title>
<path fill="none" stroke="#d4a574" d="M119.41,-88C135.12,-88 153.15,-88 169.84,-88"/>
<polygon fill="#d4a574" stroke="#d4a574" points="169.63,-91.5 179.63,-88 169.63,-84.5 169.63,-91.5"/>
</g>
<!-- gen_spr -->
<g id="node4" class="node">
<title>gen_spr</title>
<polygon fill="#1a1a1a" stroke="#333333" points="536.5,-160 394.5,-160 394.5,-124 536.5,-124 536.5,-160"/>
<text xml:space="preserve" text-anchor="middle" x="465.5" y="-145.05" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#e5e5e5">gen/&lt;room&gt;/soleprint/</text>
<text xml:space="preserve" text-anchor="middle" x="465.5" y="-131.55" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#e5e5e5">core + room merged</text>
</g>
<!-- build&#45;&gt;gen_spr -->
<g id="edge3" class="edge">
<title>build&#45;&gt;gen_spr</title>
<path fill="none" stroke="#d4a574" d="M272.06,-98.83C278,-100.25 284.02,-101.67 289.75,-103 320.22,-110.08 353.74,-117.62 383.21,-124.16"/>
<polygon fill="#d4a574" stroke="#d4a574" points="382.29,-127.55 392.81,-126.29 383.8,-120.71 382.29,-127.55"/>
</g>
<!-- gen_app -->
<g id="node5" class="node">
<title>gen_app</title>
<polygon fill="#1a1a1a" stroke="#333333" points="531.62,-106 399.38,-106 399.38,-70 531.62,-70 531.62,-106"/>
<text xml:space="preserve" text-anchor="middle" x="465.5" y="-91.05" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#e5e5e5">gen/&lt;room&gt;/&lt;app&gt;/</text>
<text xml:space="preserve" text-anchor="middle" x="465.5" y="-77.55" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#e5e5e5">cloned repos</text>
</g>
<!-- build&#45;&gt;gen_app -->
<g id="edge4" class="edge">
<title>build&#45;&gt;gen_app</title>
<path fill="none" stroke="#d4a574" stroke-dasharray="5,2" d="M272.18,-88C304.75,-88 349.72,-88 388,-88"/>
<polygon fill="#d4a574" stroke="#d4a574" points="387.6,-91.5 397.6,-88 387.6,-84.5 387.6,-91.5"/>
<text xml:space="preserve" text-anchor="middle" x="315.25" y="-90.7" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#a3a3a3">if managed</text>
</g>
<!-- gen_link -->
<g id="node6" class="node">
<title>gen_link</title>
<polygon fill="#1a1a1a" stroke="#333333" points="521.88,-52 409.12,-52 409.12,-16 521.88,-16 521.88,-52"/>
<text xml:space="preserve" text-anchor="middle" x="465.5" y="-37.05" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#e5e5e5">gen/&lt;room&gt;/link/</text>
<text xml:space="preserve" text-anchor="middle" x="465.5" y="-23.55" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#e5e5e5">DB bridge</text>
</g>
<!-- build&#45;&gt;gen_link -->
<g id="edge5" class="edge">
<title>build&#45;&gt;gen_link</title>
<path fill="none" stroke="#d4a574" stroke-dasharray="5,2" d="M272.05,-76.97C278,-75.53 284.02,-74.09 289.75,-72.75 325.35,-64.44 365.13,-55.58 397.73,-48.44"/>
<polygon fill="#d4a574" stroke="#d4a574" points="398.44,-51.86 407.46,-46.31 396.95,-45.03 398.44,-51.86"/>
<text xml:space="preserve" text-anchor="middle" x="315.25" y="-75.45" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#a3a3a3">if managed</text>
</g>
<!-- docker -->
<g id="node7" class="node">
<title>docker</title>
<polygon fill="#1a1a1a" stroke="#333333" points="733.5,-160 610.25,-160 610.25,-156 606.25,-156 606.25,-152 610.25,-152 610.25,-132 606.25,-132 606.25,-128 610.25,-128 610.25,-124 733.5,-124 733.5,-160"/>
<polyline fill="none" stroke="#333333" points="610.25,-156 614.25,-156 614.25,-152 610.25,-152"/>
<polyline fill="none" stroke="#333333" points="610.25,-132 614.25,-132 614.25,-128 610.25,-128"/>
<text xml:space="preserve" text-anchor="middle" x="671.88" y="-138.3" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#e5e5e5">docker compose up</text>
</g>
<!-- gen_spr&#45;&gt;docker -->
<g id="edge6" class="edge">
<title>gen_spr&#45;&gt;docker</title>
<path fill="none" stroke="#d4a574" d="M536.83,-142C556.81,-142 578.59,-142 598.68,-142"/>
<polygon fill="#d4a574" stroke="#d4a574" points="598.44,-145.5 608.44,-142 598.44,-138.5 598.44,-145.5"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 7.5 KiB

View File

@@ -0,0 +1,31 @@
digraph room_layers {
bgcolor="#0a0a0a"
rankdir=TB
fontname="Helvetica"
node [fontname="Helvetica" fontsize=10 style=filled color="#333" fontcolor="#e5e5e5" shape=record]
edge [fontname="Helvetica" fontsize=9 fontcolor="#a3a3a3" color="#666"]
label="Room Layers — init wizard"
labelloc=t
fontsize=14
fontcolor="#d4a574"
l0 [label="{Layer 0 | Config + Data | config.json · data/*.json}" fillcolor="#1a1a1a" color="#d4a574"]
l1 [label="{Layer 1 | Docker | soleprint/docker-compose.yml · .env}" fillcolor="#1a1a1a"]
l2 [label="{Layer 2 | Managed App | docker-compose.yml · Dockerfiles · .env}" fillcolor="#1a1a1a"]
l3 [label="{Layer 3 | Link | link/main.py · adapters/ · Dockerfile}" fillcolor="#1a1a1a"]
l4 [label="{Layer 4 | Scripts | ctrl/start.sh · stop.sh · status.sh · logs.sh}" fillcolor="#1a1a1a"]
l5 [label="{Layer 5 | Systems | tester/environments.json · tests/}" fillcolor="#1a1a1a"]
l6 [label="{Layer 6 | Nginx | nginx/local.conf · docker-compose.nginx.yml}" fillcolor="#1a1a1a"]
l0 -> l1 [label="required"]
l1 -> l2 [label="if managed"]
l2 -> l3 [label="optional"]
l1 -> l4 [label="optional"]
l4 -> l5 [label="optional"]
l5 -> l6 [label="if frontend"]
// Annotations
note_req [label="every room" fillcolor="#0a0a0a" fontcolor="#d4a574" color="#0a0a0a" shape=plaintext fontsize=9]
note_req -> l0 [style=invis]
}

133
docs/graphs/room_layers.svg Normal file
View File

@@ -0,0 +1,133 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 14.1.2 (0)
-->
<!-- Title: room_layers Pages: 1 -->
<svg width="461pt" height="612pt"
viewBox="0.00 0.00 461.00 612.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 607.5)">
<title>room_layers</title>
<polygon fill="#0a0a0a" stroke="none" points="-4,4 -4,-607.5 456.62,-607.5 456.62,4 -4,4"/>
<text xml:space="preserve" text-anchor="middle" x="226.31" y="-586.2" font-family="Helvetica,sans-Serif" font-size="14.00" fill="#d4a574">Room Layers — init wizard</text>
<!-- l0 -->
<g id="node1" class="node">
<title>l0</title>
<polygon fill="#1a1a1a" stroke="#d4a574" points="155.12,-442.5 155.12,-504.75 285.88,-504.75 285.88,-442.5 155.12,-442.5"/>
<text xml:space="preserve" text-anchor="middle" x="220.5" y="-491.25" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e5e5e5">Layer 0</text>
<polyline fill="none" stroke="#d4a574" points="155.12,-484 285.88,-484"/>
<text xml:space="preserve" text-anchor="middle" x="220.5" y="-470.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e5e5e5">Config + Data</text>
<polyline fill="none" stroke="#d4a574" points="155.12,-463.25 285.88,-463.25"/>
<text xml:space="preserve" text-anchor="middle" x="220.5" y="-449.75" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e5e5e5">config.json · data/*.json</text>
</g>
<!-- l1 -->
<g id="node2" class="node">
<title>l1</title>
<polygon fill="#1a1a1a" stroke="#333333" points="123.62,-332 123.62,-394.25 317.38,-394.25 317.38,-332 123.62,-332"/>
<text xml:space="preserve" text-anchor="middle" x="220.5" y="-380.75" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e5e5e5">Layer 1</text>
<polyline fill="none" stroke="#333333" points="123.62,-373.5 317.38,-373.5"/>
<text xml:space="preserve" text-anchor="middle" x="220.5" y="-360" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e5e5e5">Docker</text>
<polyline fill="none" stroke="#333333" points="123.62,-352.75 317.38,-352.75"/>
<text xml:space="preserve" text-anchor="middle" x="220.5" y="-339.25" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e5e5e5">soleprint/docker&#45;compose.yml · .env</text>
</g>
<!-- l0&#45;&gt;l1 -->
<g id="edge1" class="edge">
<title>l0&#45;&gt;l1</title>
<path fill="none" stroke="#666666" d="M220.5,-442.11C220.5,-430.81 220.5,-417.79 220.5,-405.67"/>
<polygon fill="#666666" stroke="#666666" points="224,-405.92 220.5,-395.92 217,-405.92 224,-405.92"/>
<text xml:space="preserve" text-anchor="middle" x="239.62" y="-415.45" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#a3a3a3">required</text>
</g>
<!-- l2 -->
<g id="node3" class="node">
<title>l2</title>
<polygon fill="#1a1a1a" stroke="#333333" points="0,-221.5 0,-283.75 211,-283.75 211,-221.5 0,-221.5"/>
<text xml:space="preserve" text-anchor="middle" x="105.5" y="-270.25" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e5e5e5">Layer 2</text>
<polyline fill="none" stroke="#333333" points="0,-263 211,-263"/>
<text xml:space="preserve" text-anchor="middle" x="105.5" y="-249.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e5e5e5">Managed App</text>
<polyline fill="none" stroke="#333333" points="0,-242.25 211,-242.25"/>
<text xml:space="preserve" text-anchor="middle" x="105.5" y="-228.75" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e5e5e5">docker&#45;compose.yml · Dockerfiles · .env</text>
</g>
<!-- l1&#45;&gt;l2 -->
<g id="edge2" class="edge">
<title>l1&#45;&gt;l2</title>
<path fill="none" stroke="#666666" d="M188.16,-331.61C174.94,-319.14 159.52,-304.59 145.59,-291.45"/>
<polygon fill="#666666" stroke="#666666" points="148.37,-289.26 138.7,-284.95 143.57,-294.36 148.37,-289.26"/>
<text xml:space="preserve" text-anchor="middle" x="191.95" y="-304.95" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#a3a3a3">if managed</text>
</g>
<!-- l4 -->
<g id="node5" class="node">
<title>l4</title>
<polygon fill="#1a1a1a" stroke="#333333" points="229.25,-221.5 229.25,-283.75 441.75,-283.75 441.75,-221.5 229.25,-221.5"/>
<text xml:space="preserve" text-anchor="middle" x="335.5" y="-270.25" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e5e5e5">Layer 4</text>
<polyline fill="none" stroke="#333333" points="229.25,-263 441.75,-263"/>
<text xml:space="preserve" text-anchor="middle" x="335.5" y="-249.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e5e5e5">Scripts</text>
<polyline fill="none" stroke="#333333" points="229.25,-242.25 441.75,-242.25"/>
<text xml:space="preserve" text-anchor="middle" x="335.5" y="-228.75" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e5e5e5">ctrl/start.sh · stop.sh · status.sh · logs.sh</text>
</g>
<!-- l1&#45;&gt;l4 -->
<g id="edge4" class="edge">
<title>l1&#45;&gt;l4</title>
<path fill="none" stroke="#666666" d="M252.84,-331.61C266.06,-319.14 281.48,-304.59 295.41,-291.45"/>
<polygon fill="#666666" stroke="#666666" points="297.43,-294.36 302.3,-284.95 292.63,-289.26 297.43,-294.36"/>
<text xml:space="preserve" text-anchor="middle" x="299.45" y="-304.95" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#a3a3a3">optional</text>
</g>
<!-- l3 -->
<g id="node4" class="node">
<title>l3</title>
<polygon fill="#1a1a1a" stroke="#333333" points="10.88,-111 10.88,-173.25 200.12,-173.25 200.12,-111 10.88,-111"/>
<text xml:space="preserve" text-anchor="middle" x="105.5" y="-159.75" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e5e5e5">Layer 3</text>
<polyline fill="none" stroke="#333333" points="10.88,-152.5 200.12,-152.5"/>
<text xml:space="preserve" text-anchor="middle" x="105.5" y="-139" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e5e5e5">Link</text>
<polyline fill="none" stroke="#333333" points="10.88,-131.75 200.12,-131.75"/>
<text xml:space="preserve" text-anchor="middle" x="105.5" y="-118.25" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e5e5e5">link/main.py · adapters/ · Dockerfile</text>
</g>
<!-- l2&#45;&gt;l3 -->
<g id="edge3" class="edge">
<title>l2&#45;&gt;l3</title>
<path fill="none" stroke="#666666" d="M105.5,-221.11C105.5,-209.81 105.5,-196.79 105.5,-184.67"/>
<polygon fill="#666666" stroke="#666666" points="109,-184.92 105.5,-174.92 102,-184.92 109,-184.92"/>
<text xml:space="preserve" text-anchor="middle" x="123.5" y="-194.45" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#a3a3a3">optional</text>
</g>
<!-- l5 -->
<g id="node6" class="node">
<title>l5</title>
<polygon fill="#1a1a1a" stroke="#333333" points="248.38,-111 248.38,-173.25 422.62,-173.25 422.62,-111 248.38,-111"/>
<text xml:space="preserve" text-anchor="middle" x="335.5" y="-159.75" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e5e5e5">Layer 5</text>
<polyline fill="none" stroke="#333333" points="248.38,-152.5 422.62,-152.5"/>
<text xml:space="preserve" text-anchor="middle" x="335.5" y="-139" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e5e5e5">Systems</text>
<polyline fill="none" stroke="#333333" points="248.38,-131.75 422.62,-131.75"/>
<text xml:space="preserve" text-anchor="middle" x="335.5" y="-118.25" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e5e5e5">tester/environments.json · tests/</text>
</g>
<!-- l4&#45;&gt;l5 -->
<g id="edge5" class="edge">
<title>l4&#45;&gt;l5</title>
<path fill="none" stroke="#666666" d="M335.5,-221.11C335.5,-209.81 335.5,-196.79 335.5,-184.67"/>
<polygon fill="#666666" stroke="#666666" points="339,-184.92 335.5,-174.92 332,-184.92 339,-184.92"/>
<text xml:space="preserve" text-anchor="middle" x="353.5" y="-194.45" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#a3a3a3">optional</text>
</g>
<!-- l6 -->
<g id="node7" class="node">
<title>l6</title>
<polygon fill="#1a1a1a" stroke="#333333" points="218.38,-0.5 218.38,-62.75 452.62,-62.75 452.62,-0.5 218.38,-0.5"/>
<text xml:space="preserve" text-anchor="middle" x="335.5" y="-49.25" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e5e5e5">Layer 6</text>
<polyline fill="none" stroke="#333333" points="218.38,-42 452.62,-42"/>
<text xml:space="preserve" text-anchor="middle" x="335.5" y="-28.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e5e5e5">Nginx</text>
<polyline fill="none" stroke="#333333" points="218.38,-21.25 452.62,-21.25"/>
<text xml:space="preserve" text-anchor="middle" x="335.5" y="-7.75" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e5e5e5">nginx/local.conf · docker&#45;compose.nginx.yml</text>
</g>
<!-- l5&#45;&gt;l6 -->
<g id="edge6" class="edge">
<title>l5&#45;&gt;l6</title>
<path fill="none" stroke="#666666" d="M335.5,-110.61C335.5,-99.31 335.5,-86.29 335.5,-74.17"/>
<polygon fill="#666666" stroke="#666666" points="339,-74.42 335.5,-64.42 332,-74.42 339,-74.42"/>
<text xml:space="preserve" text-anchor="middle" x="359.12" y="-83.95" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#a3a3a3">if frontend</text>
</g>
<!-- note_req -->
<g id="node8" class="node">
<title>note_req</title>
<polygon fill="#0a0a0a" stroke="none" points="254,-578.25 187,-578.25 187,-542.25 254,-542.25 254,-578.25"/>
<text xml:space="preserve" text-anchor="middle" x="220.5" y="-557.33" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#d4a574">every room</text>
</g>
<!-- note_req&#45;&gt;l0 -->
</g>
</svg>

After

Width:  |  Height:  |  Size: 9.3 KiB

View File

@@ -0,0 +1,97 @@
digraph system_overview {
bgcolor="#0a0a0a"
rankdir=TB
compound=true
fontname="Helvetica"
node [fontname="Helvetica" fontsize=11 style=filled color="#333" fontcolor="#e5e5e5"]
edge [fontname="Helvetica" fontsize=9 fontcolor="#a3a3a3" color="#666"]
label="Soleprint — System Overview"
labelloc=t
fontsize=14
fontcolor="#d4a574"
// Core
subgraph cluster_core {
label="Soleprint Hub"
style=dashed
color="#d4a574"
fontcolor="#d4a574"
hub [label="soleprint\ncore coordinator\nport 12000" fillcolor="#1a1a1a" shape=box]
}
// Artery
subgraph cluster_artery {
label="Artery — Todo lo vital"
style=dashed
color="#b91c1c"
fontcolor="#fca5a5"
veins [label="Veins\nstateless connectors" fillcolor="#1a1a1a"]
shunts [label="Shunts\nmock connectors" fillcolor="#1a1a1a"]
pulses [label="Pulses\ncomposed flows" fillcolor="#1a1a1a"]
}
// Atlas
subgraph cluster_atlas {
label="Atlas — Documentacion accionable"
style=dashed
color="#15803d"
fontcolor="#86efac"
books [label="Books\ndocumentation" fillcolor="#1a1a1a"]
templates [label="Templates\npatterns" fillcolor="#1a1a1a"]
}
// Station
subgraph cluster_station {
label="Station — Centro de control"
style=dashed
color="#1d4ed8"
fontcolor="#93c5fd"
tools [label="Tools\ntester · datagen · modelgen" fillcolor="#1a1a1a"]
monitors [label="Monitors\ndatabrowse" fillcolor="#1a1a1a"]
}
// External
subgraph cluster_external {
label="External APIs"
style=dashed
color="#333"
fontcolor="#666"
jira [label="Jira" fillcolor="#1a1a1a" fontcolor="#a3a3a3"]
google [label="Google" fillcolor="#1a1a1a" fontcolor="#a3a3a3"]
slack [label="Slack" fillcolor="#1a1a1a" fontcolor="#a3a3a3"]
}
// Managed app
subgraph cluster_managed {
label="Managed App"
style=dashed
color="#333"
fontcolor="#666"
app_fe [label="Frontend" fillcolor="#1a1a1a" fontcolor="#a3a3a3"]
app_be [label="Backend" fillcolor="#1a1a1a" fontcolor="#a3a3a3"]
app_db [label="Database" fillcolor="#1a1a1a" fontcolor="#a3a3a3" shape=cylinder]
}
// Connections
hub -> veins [label="routes" color="#b91c1c"]
hub -> books [label="routes" color="#15803d"]
hub -> tools [label="routes" color="#1d4ed8"]
veins -> jira [label="API"]
veins -> google [label="OAuth"]
veins -> slack [label="API"]
veins -> pulses [label="compose"]
tools -> app_be [label="test" style=dashed]
monitors -> app_db [label="browse" style=dashed]
// Sidebar injection
hub -> app_fe [label="sidebar\ninjection" color="#d4a574" style=dashed]
}

View File

@@ -0,0 +1,209 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 14.1.2 (0)
-->
<!-- Title: system_overview Pages: 1 -->
<svg width="1153pt" height="372pt"
viewBox="0.00 0.00 1153.00 372.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 368.25)">
<title>system_overview</title>
<polygon fill="#0a0a0a" stroke="none" points="-4,4 -4,-368.25 1149,-368.25 1149,4 -4,4"/>
<text xml:space="preserve" text-anchor="middle" x="572.5" y="-346.95" font-family="Helvetica,sans-Serif" font-size="14.00" fill="#d4a574">Soleprint — System Overview</text>
<g id="clust1" class="cluster">
<title>cluster_core</title>
<polygon fill="#0a0a0a" stroke="#d4a574" stroke-dasharray="5,2" points="538,-241.25 538,-331 660,-331 660,-241.25 538,-241.25"/>
<text xml:space="preserve" text-anchor="middle" x="599" y="-313.7" font-family="Helvetica,sans-Serif" font-size="14.00" fill="#d4a574">Soleprint Hub</text>
</g>
<g id="clust2" class="cluster">
<title>cluster_artery</title>
<polygon fill="#0a0a0a" stroke="#b91c1c" stroke-dasharray="5,2" points="8,-8 8,-212 382,-212 382,-8 8,-8"/>
<text xml:space="preserve" text-anchor="middle" x="195" y="-194.7" font-family="Helvetica,sans-Serif" font-size="14.00" fill="#fca5a5">Artery — Todo lo vital</text>
</g>
<g id="clust3" class="cluster">
<title>cluster_atlas</title>
<polygon fill="#0a0a0a" stroke="#15803d" stroke-dasharray="5,2" points="390,-121.25 390,-212 665,-212 665,-121.25 390,-121.25"/>
<text xml:space="preserve" text-anchor="middle" x="527.5" y="-194.7" font-family="Helvetica,sans-Serif" font-size="14.00" fill="#86efac">Atlas — Documentacion accionable</text>
</g>
<g id="clust4" class="cluster">
<title>cluster_station</title>
<polygon fill="#0a0a0a" stroke="#1d4ed8" stroke-dasharray="5,2" points="673,-121.25 673,-212 1062,-212 1062,-121.25 673,-121.25"/>
<text xml:space="preserve" text-anchor="middle" x="867.5" y="-194.7" font-family="Helvetica,sans-Serif" font-size="14.00" fill="#93c5fd">Station — Centro de control</text>
</g>
<g id="clust5" class="cluster">
<title>cluster_external</title>
<polygon fill="#0a0a0a" stroke="#333333" stroke-dasharray="5,2" points="390,-14.75 390,-92 620,-92 620,-14.75 390,-14.75"/>
<text xml:space="preserve" text-anchor="middle" x="505" y="-74.7" font-family="Helvetica,sans-Serif" font-size="14.00" fill="#666666">External APIs</text>
</g>
<g id="clust6" class="cluster">
<title>cluster_managed</title>
<polygon fill="#0a0a0a" stroke="#333333" stroke-dasharray="5,2" points="859,-14.75 859,-92 1137,-92 1137,-14.75 859,-14.75"/>
<text xml:space="preserve" text-anchor="middle" x="998" y="-74.7" font-family="Helvetica,sans-Serif" font-size="14.00" fill="#666666">Managed App</text>
</g>
<!-- hub -->
<g id="node1" class="node">
<title>hub</title>
<polygon fill="#1a1a1a" stroke="#333333" points="652.38,-297.75 545.62,-297.75 545.62,-249.25 652.38,-249.25 652.38,-297.75"/>
<text xml:space="preserve" text-anchor="middle" x="599" y="-283.3" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#e5e5e5">soleprint</text>
<text xml:space="preserve" text-anchor="middle" x="599" y="-269.8" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#e5e5e5">core coordinator</text>
<text xml:space="preserve" text-anchor="middle" x="599" y="-256.3" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#e5e5e5">port 12000</text>
</g>
<!-- veins -->
<g id="node2" class="node">
<title>veins</title>
<ellipse fill="#1a1a1a" stroke="#333333" cx="108" cy="-154" rx="92.45" ry="24.75"/>
<text xml:space="preserve" text-anchor="middle" x="108" y="-157.05" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#e5e5e5">Veins</text>
<text xml:space="preserve" text-anchor="middle" x="108" y="-143.55" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#e5e5e5">stateless connectors</text>
</g>
<!-- hub&#45;&gt;veins -->
<g id="edge1" class="edge">
<title>hub&#45;&gt;veins</title>
<path fill="none" stroke="#b91c1c" d="M545.18,-270.24C468.57,-265.68 324.55,-252.07 209,-212 188.62,-204.93 167.6,-193.79 150.05,-183.23"/>
<polygon fill="#b91c1c" stroke="#b91c1c" points="152.32,-180.52 141.98,-178.24 148.65,-186.47 152.32,-180.52"/>
<text xml:space="preserve" text-anchor="middle" x="284.95" y="-222.7" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#a3a3a3">routes</text>
</g>
<!-- books -->
<g id="node5" class="node">
<title>books</title>
<ellipse fill="#1a1a1a" stroke="#333333" cx="468" cy="-154" rx="69.65" ry="24.75"/>
<text xml:space="preserve" text-anchor="middle" x="468" y="-157.05" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#e5e5e5">Books</text>
<text xml:space="preserve" text-anchor="middle" x="468" y="-143.55" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#e5e5e5">documentation</text>
</g>
<!-- hub&#45;&gt;books -->
<g id="edge2" class="edge">
<title>hub&#45;&gt;books</title>
<path fill="none" stroke="#15803d" d="M572.81,-249C552.24,-230.55 523.47,-204.75 501.27,-184.84"/>
<polygon fill="#15803d" stroke="#15803d" points="503.73,-182.34 493.94,-178.27 499.05,-187.55 503.73,-182.34"/>
<text xml:space="preserve" text-anchor="middle" x="567.14" y="-222.7" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#a3a3a3">routes</text>
</g>
<!-- tools -->
<g id="node7" class="node">
<title>tools</title>
<ellipse fill="#1a1a1a" stroke="#333333" cx="802" cy="-154" rx="120.56" ry="24.75"/>
<text xml:space="preserve" text-anchor="middle" x="802" y="-157.05" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#e5e5e5">Tools</text>
<text xml:space="preserve" text-anchor="middle" x="802" y="-143.55" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#e5e5e5">tester · datagen · modelgen</text>
</g>
<!-- hub&#45;&gt;tools -->
<g id="edge3" class="edge">
<title>hub&#45;&gt;tools</title>
<path fill="none" stroke="#1d4ed8" d="M639.59,-249C672.13,-230.17 717.93,-203.66 752.6,-183.59"/>
<polygon fill="#1d4ed8" stroke="#1d4ed8" points="754.3,-186.65 761.2,-178.61 750.8,-180.59 754.3,-186.65"/>
<text xml:space="preserve" text-anchor="middle" x="702.6" y="-222.7" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#a3a3a3">routes</text>
</g>
<!-- app_fe -->
<g id="node12" class="node">
<title>app_fe</title>
<ellipse fill="#1a1a1a" stroke="#333333" cx="1089" cy="-40.75" rx="39.9" ry="18"/>
<text xml:space="preserve" text-anchor="middle" x="1089" y="-37.05" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#a3a3a3">Frontend</text>
</g>
<!-- hub&#45;&gt;app_fe -->
<g id="edge10" class="edge">
<title>hub&#45;&gt;app_fe</title>
<path fill="none" stroke="#d4a574" stroke-dasharray="5,2" d="M652.46,-273.38C762.51,-274.01 1008.83,-268.85 1066,-212 1103.21,-174.99 1100.13,-108.42 1094.57,-70.42"/>
<polygon fill="#d4a574" stroke="#d4a574" points="1098.04,-69.95 1092.97,-60.65 1091.14,-71.08 1098.04,-69.95"/>
<text xml:space="preserve" text-anchor="middle" x="1116.94" y="-156.7" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#a3a3a3">sidebar</text>
<text xml:space="preserve" text-anchor="middle" x="1116.94" y="-145.45" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#a3a3a3">injection</text>
</g>
<!-- pulses -->
<g id="node4" class="node">
<title>pulses</title>
<ellipse fill="#1a1a1a" stroke="#333333" cx="108" cy="-40.75" rx="73.89" ry="24.75"/>
<text xml:space="preserve" text-anchor="middle" x="108" y="-43.8" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#e5e5e5">Pulses</text>
<text xml:space="preserve" text-anchor="middle" x="108" y="-30.3" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#e5e5e5">composed flows</text>
</g>
<!-- veins&#45;&gt;pulses -->
<g id="edge7" class="edge">
<title>veins&#45;&gt;pulses</title>
<path fill="none" stroke="#666666" d="M108,-128.86C108,-113.7 108,-93.88 108,-76.98"/>
<polygon fill="#666666" stroke="#666666" points="111.5,-77.35 108,-67.35 104.5,-77.35 111.5,-77.35"/>
<text xml:space="preserve" text-anchor="middle" x="128.25" y="-102.7" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#a3a3a3">compose</text>
</g>
<!-- jira -->
<g id="node9" class="node">
<title>jira</title>
<ellipse fill="#1a1a1a" stroke="#333333" cx="425" cy="-40.75" rx="27" ry="18"/>
<text xml:space="preserve" text-anchor="middle" x="425" y="-37.05" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#a3a3a3">Jira</text>
</g>
<!-- veins&#45;&gt;jira -->
<g id="edge4" class="edge">
<title>veins&#45;&gt;jira</title>
<path fill="none" stroke="#666666" d="M163.97,-133.86C178.52,-129.32 194.25,-124.77 209,-121.25 286.56,-102.75 317.5,-132.81 386,-92 395.89,-86.1 404.2,-76.67 410.57,-67.57"/>
<polygon fill="#666666" stroke="#666666" points="413.44,-69.58 415.88,-59.27 407.54,-65.8 413.44,-69.58"/>
<text xml:space="preserve" text-anchor="middle" x="377.36" y="-102.7" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#a3a3a3">API</text>
</g>
<!-- google -->
<g id="node10" class="node">
<title>google</title>
<ellipse fill="#1a1a1a" stroke="#333333" cx="504" cy="-40.75" rx="33.82" ry="18"/>
<text xml:space="preserve" text-anchor="middle" x="504" y="-37.05" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#a3a3a3">Google</text>
</g>
<!-- veins&#45;&gt;google -->
<g id="edge5" class="edge">
<title>veins&#45;&gt;google</title>
<path fill="none" stroke="#666666" d="M161.63,-133.42C176.76,-128.65 193.36,-124.1 209,-121.25 287.39,-106.97 309.3,-123.69 388,-111.25 421.14,-106.01 432.58,-109.83 461,-92 471.11,-85.66 480.09,-76.19 487.2,-67.17"/>
<polygon fill="#666666" stroke="#666666" points="489.88,-69.43 493,-59.31 484.25,-65.28 489.88,-69.43"/>
<text xml:space="preserve" text-anchor="middle" x="459.93" y="-102.7" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#a3a3a3">OAuth</text>
</g>
<!-- slack -->
<g id="node11" class="node">
<title>slack</title>
<ellipse fill="#1a1a1a" stroke="#333333" cx="584" cy="-40.75" rx="27.74" ry="18"/>
<text xml:space="preserve" text-anchor="middle" x="584" y="-37.05" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#a3a3a3">Slack</text>
</g>
<!-- veins&#45;&gt;slack -->
<g id="edge6" class="edge">
<title>veins&#45;&gt;slack</title>
<path fill="none" stroke="#666666" d="M161.07,-133.39C176.34,-128.56 193.15,-123.98 209,-121.25 326.9,-100.91 359.79,-129.67 478,-111.25 509.46,-106.35 520.8,-110.08 547,-92 556.07,-85.74 563.77,-76.52 569.76,-67.68"/>
<polygon fill="#666666" stroke="#666666" points="572.65,-69.66 574.98,-59.33 566.72,-65.96 572.65,-69.66"/>
<text xml:space="preserve" text-anchor="middle" x="539.91" y="-102.7" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#a3a3a3">API</text>
</g>
<!-- shunts -->
<g id="node3" class="node">
<title>shunts</title>
<ellipse fill="#1a1a1a" stroke="#333333" cx="296" cy="-154" rx="77.6" ry="24.75"/>
<text xml:space="preserve" text-anchor="middle" x="296" y="-157.05" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#e5e5e5">Shunts</text>
<text xml:space="preserve" text-anchor="middle" x="296" y="-143.55" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#e5e5e5">mock connectors</text>
</g>
<!-- templates -->
<g id="node6" class="node">
<title>templates</title>
<ellipse fill="#1a1a1a" stroke="#333333" cx="606" cy="-154" rx="50.56" ry="24.75"/>
<text xml:space="preserve" text-anchor="middle" x="606" y="-157.05" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#e5e5e5">Templates</text>
<text xml:space="preserve" text-anchor="middle" x="606" y="-143.55" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#e5e5e5">patterns</text>
</g>
<!-- app_be -->
<g id="node13" class="node">
<title>app_be</title>
<ellipse fill="#1a1a1a" stroke="#333333" cx="906" cy="-40.75" rx="38.96" ry="18"/>
<text xml:space="preserve" text-anchor="middle" x="906" y="-37.05" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#a3a3a3">Backend</text>
</g>
<!-- tools&#45;&gt;app_be -->
<g id="edge8" class="edge">
<title>tools&#45;&gt;app_be</title>
<path fill="none" stroke="#666666" stroke-dasharray="5,2" d="M824.06,-129.4C841.45,-110.79 865.64,-84.93 883.22,-66.12"/>
<polygon fill="#666666" stroke="#666666" points="885.72,-68.57 889.99,-58.88 880.6,-63.79 885.72,-68.57"/>
<text xml:space="preserve" text-anchor="middle" x="859.51" y="-102.7" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#a3a3a3">test</text>
</g>
<!-- monitors -->
<g id="node8" class="node">
<title>monitors</title>
<ellipse fill="#1a1a1a" stroke="#333333" cx="997" cy="-154" rx="56.92" ry="24.75"/>
<text xml:space="preserve" text-anchor="middle" x="997" y="-157.05" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#e5e5e5">Monitors</text>
<text xml:space="preserve" text-anchor="middle" x="997" y="-143.55" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#e5e5e5">databrowse</text>
</g>
<!-- app_db -->
<g id="node14" class="node">
<title>app_db</title>
<path fill="#1a1a1a" stroke="#333333" d="M1031.25,-55.48C1031.25,-57.28 1015.9,-58.75 997,-58.75 978.1,-58.75 962.75,-57.28 962.75,-55.48 962.75,-55.48 962.75,-26.02 962.75,-26.02 962.75,-24.22 978.1,-22.75 997,-22.75 1015.9,-22.75 1031.25,-24.22 1031.25,-26.02 1031.25,-26.02 1031.25,-55.48 1031.25,-55.48"/>
<path fill="none" stroke="#333333" d="M1031.25,-55.48C1031.25,-53.67 1015.9,-52.2 997,-52.2 978.1,-52.2 962.75,-53.67 962.75,-55.48"/>
<text xml:space="preserve" text-anchor="middle" x="997" y="-37.05" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#a3a3a3">Database</text>
</g>
<!-- monitors&#45;&gt;app_db -->
<g id="edge9" class="edge">
<title>monitors&#45;&gt;app_db</title>
<path fill="none" stroke="#666666" stroke-dasharray="5,2" d="M997,-128.86C997,-111.64 997,-88.42 997,-70.29"/>
<polygon fill="#666666" stroke="#666666" points="1000.5,-70.46 997,-60.46 993.5,-70.46 1000.5,-70.46"/>
<text xml:space="preserve" text-anchor="middle" x="1013.12" y="-102.7" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#a3a3a3">browse</text>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 14 KiB

54
docs/graphs/wrapping.dot Normal file
View File

@@ -0,0 +1,54 @@
digraph wrapping {
bgcolor="#0a0a0a"
rankdir=LR
fontname="Helvetica"
node [fontname="Helvetica" fontsize=11 style=filled color="#333" fontcolor="#e5e5e5" shape=box]
edge [fontname="Helvetica" fontsize=9 fontcolor="#a3a3a3" color="#666"]
label="Sidebar Injection — How Wrapping Works"
labelloc=t
fontsize=14
fontcolor="#d4a574"
browser [label="Browser" fillcolor="#1a1a1a" shape=oval]
subgraph cluster_nginx {
label="Nginx (reverse proxy)"
style=dashed
color="#d4a574"
fontcolor="#d4a574"
proxy [label="proxy_pass\n+\nsub_filter\ninjects sidebar" fillcolor="#1a1a1a" shape=component]
}
subgraph cluster_app {
label="Managed App"
style=dashed
color="#333"
fontcolor="#666"
frontend [label="Frontend\n(React/Next/Vue)" fillcolor="#1a1a1a"]
backend [label="Backend API" fillcolor="#1a1a1a"]
}
subgraph cluster_spr {
label="Soleprint"
style=dashed
color="#d4a574"
fontcolor="#d4a574"
sidebar_css [label="sidebar.css" fillcolor="#1a1a1a"]
sidebar_js [label="sidebar.js" fillcolor="#1a1a1a"]
hub [label="Hub API\n/api/sidebar/config" fillcolor="#1a1a1a"]
}
browser -> proxy [label="myroom.spr.local.ar"]
proxy -> frontend [label="/ → app"]
proxy -> hub [label="/spr/ → soleprint"]
// The injection
proxy -> sidebar_css [label="injects into </head>" color="#d4a574" style=dashed]
proxy -> sidebar_js [color="#d4a574" style=dashed]
sidebar_js -> hub [label="loads config" color="#d4a574"]
}

119
docs/graphs/wrapping.svg Normal file
View File

@@ -0,0 +1,119 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 14.1.2 (0)
-->
<!-- Title: wrapping Pages: 1 -->
<svg width="824pt" height="329pt"
viewBox="0.00 0.00 824.00 329.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 325.41)">
<title>wrapping</title>
<polygon fill="#0a0a0a" stroke="none" points="-4,4 -4,-325.41 819.55,-325.41 819.55,4 -4,4"/>
<text xml:space="preserve" text-anchor="middle" x="407.78" y="-304.11" font-family="Helvetica,sans-Serif" font-size="14.00" fill="#d4a574">Sidebar Injection — How Wrapping Works</text>
<g id="clust1" class="cluster">
<title>cluster_nginx</title>
<polygon fill="#0a0a0a" stroke="#d4a574" stroke-dasharray="5,2" points="193.3,-25.16 193.3,-128.16 360.05,-128.16 360.05,-25.16 193.3,-25.16"/>
<text xml:space="preserve" text-anchor="middle" x="276.68" y="-110.86" font-family="Helvetica,sans-Serif" font-size="14.00" fill="#d4a574">Nginx (reverse proxy)</text>
</g>
<g id="clust2" class="cluster">
<title>cluster_app</title>
<polygon fill="#0a0a0a" stroke="#333333" stroke-dasharray="5,2" points="473.05,-157.16 473.05,-288.16 599.55,-288.16 599.55,-157.16 473.05,-157.16"/>
<text xml:space="preserve" text-anchor="middle" x="536.3" y="-270.86" font-family="Helvetica,sans-Serif" font-size="14.00" fill="#666666">Managed App</text>
</g>
<g id="clust3" class="cluster">
<title>cluster_spr</title>
<polygon fill="#0a0a0a" stroke="#d4a574" stroke-dasharray="5,2" points="489.55,-18.16 489.55,-149.16 807.55,-149.16 807.55,-18.16 489.55,-18.16"/>
<text xml:space="preserve" text-anchor="middle" x="648.55" y="-131.86" font-family="Helvetica,sans-Serif" font-size="14.00" fill="#d4a574">Soleprint</text>
</g>
<!-- browser -->
<g id="node1" class="node">
<title>browser</title>
<ellipse fill="#1a1a1a" stroke="#333333" cx="38.03" cy="-64.16" rx="38.03" ry="18"/>
<text xml:space="preserve" text-anchor="middle" x="38.03" y="-60.46" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#e5e5e5">Browser</text>
</g>
<!-- proxy -->
<g id="node2" class="node">
<title>proxy</title>
<polygon fill="#1a1a1a" stroke="#333333" points="324.3,-95.16 228.05,-95.16 228.05,-91.16 224.05,-91.16 224.05,-87.16 228.05,-87.16 228.05,-41.16 224.05,-41.16 224.05,-37.16 228.05,-37.16 228.05,-33.16 324.3,-33.16 324.3,-95.16"/>
<polyline fill="none" stroke="#333333" points="228.05,-91.16 232.05,-91.16 232.05,-87.16 228.05,-87.16"/>
<polyline fill="none" stroke="#333333" points="228.05,-41.16 232.05,-41.16 232.05,-37.16 228.05,-37.16"/>
<text xml:space="preserve" text-anchor="middle" x="276.18" y="-80.71" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#e5e5e5">proxy_pass</text>
<text xml:space="preserve" text-anchor="middle" x="276.18" y="-67.21" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#e5e5e5">+</text>
<text xml:space="preserve" text-anchor="middle" x="276.18" y="-53.71" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#e5e5e5">sub_filter</text>
<text xml:space="preserve" text-anchor="middle" x="276.18" y="-40.21" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#e5e5e5">injects sidebar</text>
</g>
<!-- browser&#45;&gt;proxy -->
<g id="edge1" class="edge">
<title>browser&#45;&gt;proxy</title>
<path fill="none" stroke="#666666" d="M76.45,-64.16C114.05,-64.16 172.57,-64.16 216.38,-64.16"/>
<polygon fill="#666666" stroke="#666666" points="216.24,-67.66 226.24,-64.16 216.24,-60.66 216.24,-67.66"/>
<text xml:space="preserve" text-anchor="middle" x="138.68" y="-66.86" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#a3a3a3">myroom.spr.local.ar</text>
</g>
<!-- frontend -->
<g id="node3" class="node">
<title>frontend</title>
<polygon fill="#1a1a1a" stroke="#333333" points="591.55,-201.16 481.05,-201.16 481.05,-165.16 591.55,-165.16 591.55,-201.16"/>
<text xml:space="preserve" text-anchor="middle" x="536.3" y="-186.21" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#e5e5e5">Frontend</text>
<text xml:space="preserve" text-anchor="middle" x="536.3" y="-172.71" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#e5e5e5">(React/Next/Vue)</text>
</g>
<!-- proxy&#45;&gt;frontend -->
<g id="edge2" class="edge">
<title>proxy&#45;&gt;frontend</title>
<path fill="none" stroke="#666666" d="M324.52,-85.99C370.03,-106.97 438.55,-138.56 485.02,-159.98"/>
<polygon fill="#666666" stroke="#666666" points="483.53,-163.15 494.08,-164.16 486.46,-156.79 483.53,-163.15"/>
<text xml:space="preserve" text-anchor="middle" x="416.55" y="-150.7" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#a3a3a3">/ → app</text>
</g>
<!-- sidebar_css -->
<g id="node5" class="node">
<title>sidebar_css</title>
<polygon fill="#1a1a1a" stroke="#333333" points="575.05,-116.16 497.55,-116.16 497.55,-80.16 575.05,-80.16 575.05,-116.16"/>
<text xml:space="preserve" text-anchor="middle" x="536.3" y="-94.46" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#e5e5e5">sidebar.css</text>
</g>
<!-- proxy&#45;&gt;sidebar_css -->
<g id="edge4" class="edge">
<title>proxy&#45;&gt;sidebar_css</title>
<path fill="none" stroke="#d4a574" stroke-dasharray="5,2" d="M324.52,-70.4C370.27,-76.43 439.3,-85.52 485.78,-91.64"/>
<polygon fill="#d4a574" stroke="#d4a574" points="485.21,-95.09 495.58,-92.93 486.12,-88.15 485.21,-95.09"/>
<text xml:space="preserve" text-anchor="middle" x="416.55" y="-90.82" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#a3a3a3">injects into &lt;/head&gt;</text>
</g>
<!-- sidebar_js -->
<g id="node6" class="node">
<title>sidebar_js</title>
<polygon fill="#1a1a1a" stroke="#333333" points="570.55,-62.16 502.05,-62.16 502.05,-26.16 570.55,-26.16 570.55,-62.16"/>
<text xml:space="preserve" text-anchor="middle" x="536.3" y="-40.46" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#e5e5e5">sidebar.js</text>
</g>
<!-- proxy&#45;&gt;sidebar_js -->
<g id="edge5" class="edge">
<title>proxy&#45;&gt;sidebar_js</title>
<path fill="none" stroke="#d4a574" stroke-dasharray="5,2" d="M324.52,-60.49C371.88,-56.82 444.19,-51.22 490.6,-47.63"/>
<polygon fill="#d4a574" stroke="#d4a574" points="490.6,-51.14 500.3,-46.87 490.06,-44.16 490.6,-51.14"/>
</g>
<!-- hub -->
<g id="node7" class="node">
<title>hub</title>
<polygon fill="#1a1a1a" stroke="#333333" points="799.55,-62.16 682.3,-62.16 682.3,-26.16 799.55,-26.16 799.55,-62.16"/>
<text xml:space="preserve" text-anchor="middle" x="740.93" y="-47.21" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#e5e5e5">Hub API</text>
<text xml:space="preserve" text-anchor="middle" x="740.93" y="-33.71" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#e5e5e5">/api/sidebar/config</text>
</g>
<!-- proxy&#45;&gt;hub -->
<g id="edge3" class="edge">
<title>proxy&#45;&gt;hub</title>
<path fill="none" stroke="#666666" d="M324.6,-45.85C363.74,-31.76 421.09,-13.48 473.05,-5.91 528.69,2.18 543.83,1.54 599.55,-5.91 624.52,-9.25 651.33,-15.79 674.76,-22.54"/>
<polygon fill="#666666" stroke="#666666" points="673.59,-25.84 684.17,-25.31 675.57,-19.12 673.59,-25.84"/>
<text xml:space="preserve" text-anchor="middle" x="536.3" y="-8.61" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#a3a3a3">/spr/ → soleprint</text>
</g>
<!-- backend -->
<g id="node4" class="node">
<title>backend</title>
<polygon fill="#1a1a1a" stroke="#333333" points="578.05,-255.16 494.55,-255.16 494.55,-219.16 578.05,-219.16 578.05,-255.16"/>
<text xml:space="preserve" text-anchor="middle" x="536.3" y="-233.46" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#e5e5e5">Backend API</text>
</g>
<!-- sidebar_js&#45;&gt;hub -->
<g id="edge6" class="edge">
<title>sidebar_js&#45;&gt;hub</title>
<path fill="none" stroke="#d4a574" d="M570.76,-44.16C597.83,-44.16 636.85,-44.16 670.6,-44.16"/>
<polygon fill="#d4a574" stroke="#d4a574" points="670.3,-47.66 680.3,-44.16 670.3,-40.66 670.3,-47.66"/>
<text xml:space="preserve" text-anchor="middle" x="636.93" y="-46.86" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#a3a3a3">loads config</text>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 8.0 KiB