docs: add architecture and veins documentation
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
- System overview, artery hierarchy, build flow, room config diagrams - Veins docs: Jira, Slack, Google OAuth - Shunts docs: MercadoPago mock - DOT source files with generated SVGs - HTML viewers with navigation and full-screen mode Solves: - Freelance work standardization - Missing infrastructure replication (shunts) - Reliable testing environment (BDD -> Gherkin -> Tests)
102
docs/architecture/01-system-overview.dot
Normal file
@@ -0,0 +1,102 @@
|
|||||||
|
digraph SystemOverview {
|
||||||
|
// Graph settings
|
||||||
|
rankdir=TB;
|
||||||
|
compound=true;
|
||||||
|
fontname="Helvetica";
|
||||||
|
node [fontname="Helvetica", fontsize=11];
|
||||||
|
edge [fontname="Helvetica", fontsize=10];
|
||||||
|
|
||||||
|
// Title
|
||||||
|
labelloc="t";
|
||||||
|
label="Soleprint - System Overview";
|
||||||
|
fontsize=16;
|
||||||
|
|
||||||
|
// Styling
|
||||||
|
node [shape=box, style="rounded,filled"];
|
||||||
|
|
||||||
|
// Core Hub
|
||||||
|
subgraph cluster_soleprint {
|
||||||
|
label="Soleprint Hub (port 12000)";
|
||||||
|
style=filled;
|
||||||
|
color="#E8F5E9";
|
||||||
|
fillcolor="#E8F5E9";
|
||||||
|
|
||||||
|
hub [label="Soleprint\nCore Coordinator", fillcolor="#C8E6C9", shape=box];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Artery System
|
||||||
|
subgraph cluster_artery {
|
||||||
|
label="Artery - Todo lo vital";
|
||||||
|
style=filled;
|
||||||
|
color="#FFEBEE";
|
||||||
|
fillcolor="#FFEBEE";
|
||||||
|
|
||||||
|
veins [label="Veins\n(Stateless Connectors)", fillcolor="#FFCDD2"];
|
||||||
|
shunts [label="Shunts\n(Mock Connectors)", fillcolor="#FFCDD2"];
|
||||||
|
pulses [label="Pulses\n(Composed Flows)", fillcolor="#EF9A9A"];
|
||||||
|
plexus [label="Plexus\n(Full Apps)", fillcolor="#E57373"];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Atlas System
|
||||||
|
subgraph cluster_atlas {
|
||||||
|
label="Atlas - Documentacion accionable";
|
||||||
|
style=filled;
|
||||||
|
color="#E3F2FD";
|
||||||
|
fillcolor="#E3F2FD";
|
||||||
|
|
||||||
|
books [label="Books\n(Documentation)", fillcolor="#BBDEFB"];
|
||||||
|
templates [label="Templates\n(Patterns)", fillcolor="#BBDEFB"];
|
||||||
|
depots [label="Depots\n(External Docs)", fillcolor="#90CAF9"];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Station System
|
||||||
|
subgraph cluster_station {
|
||||||
|
label="Station - Centro de control";
|
||||||
|
style=filled;
|
||||||
|
color="#FFF8E1";
|
||||||
|
fillcolor="#FFF8E1";
|
||||||
|
|
||||||
|
tools [label="Tools\n(modelgen, tester, datagen)", fillcolor="#FFECB3"];
|
||||||
|
monitors [label="Monitors\n(databrowse)", fillcolor="#FFECB3"];
|
||||||
|
}
|
||||||
|
|
||||||
|
// External
|
||||||
|
subgraph cluster_external {
|
||||||
|
label="External Services";
|
||||||
|
style=dashed;
|
||||||
|
color=gray;
|
||||||
|
|
||||||
|
jira [label="Jira", fillcolor="#E8EAF6"];
|
||||||
|
slack [label="Slack", fillcolor="#E8EAF6"];
|
||||||
|
google [label="Google", fillcolor="#E8EAF6"];
|
||||||
|
mercadopago [label="MercadoPago", fillcolor="#E8EAF6"];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Managed Room
|
||||||
|
subgraph cluster_room {
|
||||||
|
label="Managed Room (e.g., AMAR)";
|
||||||
|
style=dashed;
|
||||||
|
color="#7B1FA2";
|
||||||
|
|
||||||
|
room_backend [label="Backend\n(Django/FastAPI)", fillcolor="#E1BEE7"];
|
||||||
|
room_frontend [label="Frontend\n(Next.js)", fillcolor="#E1BEE7"];
|
||||||
|
room_db [label="Database\n(PostgreSQL)", fillcolor="#CE93D8", shape=cylinder];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Connections
|
||||||
|
hub -> veins [label="routes"];
|
||||||
|
hub -> books [label="routes"];
|
||||||
|
hub -> tools [label="routes"];
|
||||||
|
|
||||||
|
veins -> jira [label="API"];
|
||||||
|
veins -> slack [label="API"];
|
||||||
|
veins -> google [label="OAuth"];
|
||||||
|
shunts -> mercadopago [label="mock", style=dashed];
|
||||||
|
|
||||||
|
veins -> pulses [label="compose"];
|
||||||
|
pulses -> plexus [label="extend"];
|
||||||
|
|
||||||
|
tools -> room_backend [label="test", style=dashed];
|
||||||
|
monitors -> room_db [label="browse", style=dashed];
|
||||||
|
depots -> room_backend [label="docs", style=dashed];
|
||||||
|
}
|
||||||
244
docs/architecture/01-system-overview.svg
Normal file
@@ -0,0 +1,244 @@
|
|||||||
|
<?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.1 (0)
|
||||||
|
-->
|
||||||
|
<!-- Title: SystemOverview Pages: 1 -->
|
||||||
|
<svg width="968pt" height="448pt"
|
||||||
|
viewBox="0.00 0.00 968.00 448.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 444.38)">
|
||||||
|
<title>SystemOverview</title>
|
||||||
|
<polygon fill="white" stroke="none" points="-4,4 -4,-444.38 964,-444.38 964,4 -4,4"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="480" y="-421.18" font-family="Helvetica,sans-Serif" font-size="16.00">Soleprint - System Overview</text>
|
||||||
|
<g id="clust1" class="cluster">
|
||||||
|
<title>cluster_soleprint</title>
|
||||||
|
<polygon fill="#e8f5e9" stroke="#e8f5e9" points="258,-325.38 258,-404.88 493,-404.88 493,-325.38 258,-325.38"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="375.5" y="-385.68" font-family="Helvetica,sans-Serif" font-size="16.00">Soleprint Hub (port 12000)</text>
|
||||||
|
</g>
|
||||||
|
<g id="clust2" class="cluster">
|
||||||
|
<title>cluster_artery</title>
|
||||||
|
<polygon fill="#ffebee" stroke="#ffebee" points="8,-8 8,-294.62 304,-294.62 304,-8 8,-8"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="156" y="-275.43" font-family="Helvetica,sans-Serif" font-size="16.00">Artery - Todo lo vital</text>
|
||||||
|
</g>
|
||||||
|
<g id="clust3" class="cluster">
|
||||||
|
<title>cluster_atlas</title>
|
||||||
|
<polygon fill="#e3f2fd" stroke="#e3f2fd" points="312,-215.12 312,-294.62 647,-294.62 647,-215.12 312,-215.12"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="479.5" y="-275.43" font-family="Helvetica,sans-Serif" font-size="16.00">Atlas - Documentacion accionable</text>
|
||||||
|
</g>
|
||||||
|
<g id="clust4" class="cluster">
|
||||||
|
<title>cluster_station</title>
|
||||||
|
<polygon fill="#fff8e1" stroke="#fff8e1" points="655,-215.12 655,-294.62 951,-294.62 951,-215.12 655,-215.12"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="803" y="-275.43" font-family="Helvetica,sans-Serif" font-size="16.00">Station - Centro de control</text>
|
||||||
|
</g>
|
||||||
|
<g id="clust5" class="cluster">
|
||||||
|
<title>cluster_external</title>
|
||||||
|
<polygon fill="none" stroke="gray" stroke-dasharray="5,2" points="312,-98.81 312,-178.31 634,-178.31 634,-98.81 312,-98.81"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="473" y="-159.11" font-family="Helvetica,sans-Serif" font-size="16.00">External Services</text>
|
||||||
|
</g>
|
||||||
|
<g id="clust6" class="cluster">
|
||||||
|
<title>cluster_room</title>
|
||||||
|
<polygon fill="none" stroke="#7b1fa2" stroke-dasharray="5,2" points="642,-92.75 642,-184.38 952,-184.38 952,-92.75 642,-92.75"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="797" y="-165.18" font-family="Helvetica,sans-Serif" font-size="16.00">Managed Room (e.g., AMAR)</text>
|
||||||
|
</g>
|
||||||
|
<!-- hub -->
|
||||||
|
<g id="node1" class="node">
|
||||||
|
<title>hub</title>
|
||||||
|
<path fill="#c8e6c9" stroke="black" d="M417.88,-369.38C417.88,-369.38 332.12,-369.38 332.12,-369.38 326.12,-369.38 320.12,-363.38 320.12,-357.38 320.12,-357.38 320.12,-345.38 320.12,-345.38 320.12,-339.38 326.12,-333.38 332.12,-333.38 332.12,-333.38 417.88,-333.38 417.88,-333.38 423.88,-333.38 429.88,-339.38 429.88,-345.38 429.88,-345.38 429.88,-357.38 429.88,-357.38 429.88,-363.38 423.88,-369.38 417.88,-369.38"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="375" y="-354.43" font-family="Helvetica,sans-Serif" font-size="11.00">Soleprint</text>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="375" y="-340.93" font-family="Helvetica,sans-Serif" font-size="11.00">Core Coordinator</text>
|
||||||
|
</g>
|
||||||
|
<!-- veins -->
|
||||||
|
<g id="node2" class="node">
|
||||||
|
<title>veins</title>
|
||||||
|
<path fill="#ffcdd2" stroke="black" d="M146,-259.12C146,-259.12 28,-259.12 28,-259.12 22,-259.12 16,-253.12 16,-247.12 16,-247.12 16,-235.12 16,-235.12 16,-229.12 22,-223.12 28,-223.12 28,-223.12 146,-223.12 146,-223.12 152,-223.12 158,-229.12 158,-235.12 158,-235.12 158,-247.12 158,-247.12 158,-253.12 152,-259.12 146,-259.12"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="87" y="-244.18" font-family="Helvetica,sans-Serif" font-size="11.00">Veins</text>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="87" y="-230.68" font-family="Helvetica,sans-Serif" font-size="11.00">(Stateless Connectors)</text>
|
||||||
|
</g>
|
||||||
|
<!-- hub->veins -->
|
||||||
|
<g id="edge1" class="edge">
|
||||||
|
<title>hub->veins</title>
|
||||||
|
<path fill="none" stroke="black" d="M319.94,-340.62C277.04,-331.84 216.64,-316.87 167,-294.62 150.13,-287.06 132.8,-276.15 118.61,-266.23"/>
|
||||||
|
<polygon fill="black" stroke="black" points="120.72,-263.44 110.56,-260.46 116.64,-269.13 120.72,-263.44"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="231.88" y="-305.88" font-family="Helvetica,sans-Serif" font-size="10.00">routes</text>
|
||||||
|
</g>
|
||||||
|
<!-- books -->
|
||||||
|
<g id="node6" class="node">
|
||||||
|
<title>books</title>
|
||||||
|
<path fill="#bbdefb" stroke="black" d="M417.5,-259.12C417.5,-259.12 332.5,-259.12 332.5,-259.12 326.5,-259.12 320.5,-253.12 320.5,-247.12 320.5,-247.12 320.5,-235.12 320.5,-235.12 320.5,-229.12 326.5,-223.12 332.5,-223.12 332.5,-223.12 417.5,-223.12 417.5,-223.12 423.5,-223.12 429.5,-229.12 429.5,-235.12 429.5,-235.12 429.5,-247.12 429.5,-247.12 429.5,-253.12 423.5,-259.12 417.5,-259.12"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="375" y="-244.18" font-family="Helvetica,sans-Serif" font-size="11.00">Books</text>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="375" y="-230.68" font-family="Helvetica,sans-Serif" font-size="11.00">(Documentation)</text>
|
||||||
|
</g>
|
||||||
|
<!-- hub->books -->
|
||||||
|
<g id="edge2" class="edge">
|
||||||
|
<title>hub->books</title>
|
||||||
|
<path fill="none" stroke="black" d="M375,-332.98C375,-316.25 375,-290.66 375,-270.9"/>
|
||||||
|
<polygon fill="black" stroke="black" points="378.5,-270.99 375,-260.99 371.5,-270.99 378.5,-270.99"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="390.38" y="-305.88" font-family="Helvetica,sans-Serif" font-size="10.00">routes</text>
|
||||||
|
</g>
|
||||||
|
<!-- tools -->
|
||||||
|
<g id="node9" class="node">
|
||||||
|
<title>tools</title>
|
||||||
|
<path fill="#ffecb3" stroke="black" d="M823,-259.12C823,-259.12 675,-259.12 675,-259.12 669,-259.12 663,-253.12 663,-247.12 663,-247.12 663,-235.12 663,-235.12 663,-229.12 669,-223.12 675,-223.12 675,-223.12 823,-223.12 823,-223.12 829,-223.12 835,-229.12 835,-235.12 835,-235.12 835,-247.12 835,-247.12 835,-253.12 829,-259.12 823,-259.12"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="749" y="-244.18" font-family="Helvetica,sans-Serif" font-size="11.00">Tools</text>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="749" y="-230.68" font-family="Helvetica,sans-Serif" font-size="11.00">(modelgen, tester, datagen)</text>
|
||||||
|
</g>
|
||||||
|
<!-- hub->tools -->
|
||||||
|
<g id="edge3" class="edge">
|
||||||
|
<title>hub->tools</title>
|
||||||
|
<path fill="none" stroke="black" d="M430.22,-344.05C486.88,-336.46 576.95,-321.28 651,-294.62 672.05,-287.05 694.12,-275.57 711.98,-265.28"/>
|
||||||
|
<polygon fill="black" stroke="black" points="713.56,-268.41 720.4,-260.32 710.01,-262.38 713.56,-268.41"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="637.44" y="-305.88" font-family="Helvetica,sans-Serif" font-size="10.00">routes</text>
|
||||||
|
</g>
|
||||||
|
<!-- pulses -->
|
||||||
|
<g id="node4" class="node">
|
||||||
|
<title>pulses</title>
|
||||||
|
<path fill="#ef9a9a" stroke="black" d="M133.62,-142.81C133.62,-142.81 40.38,-142.81 40.38,-142.81 34.38,-142.81 28.38,-136.81 28.38,-130.81 28.38,-130.81 28.38,-118.81 28.38,-118.81 28.38,-112.81 34.38,-106.81 40.38,-106.81 40.38,-106.81 133.62,-106.81 133.62,-106.81 139.62,-106.81 145.62,-112.81 145.62,-118.81 145.62,-118.81 145.62,-130.81 145.62,-130.81 145.62,-136.81 139.62,-142.81 133.62,-142.81"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="87" y="-127.86" font-family="Helvetica,sans-Serif" font-size="11.00">Pulses</text>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="87" y="-114.36" font-family="Helvetica,sans-Serif" font-size="11.00">(Composed Flows)</text>
|
||||||
|
</g>
|
||||||
|
<!-- veins->pulses -->
|
||||||
|
<g id="edge8" class="edge">
|
||||||
|
<title>veins->pulses</title>
|
||||||
|
<path fill="none" stroke="black" d="M87,-222.76C87,-204.61 87,-175.84 87,-154.34"/>
|
||||||
|
<polygon fill="black" stroke="black" points="90.5,-154.48 87,-144.48 83.5,-154.48 90.5,-154.48"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="109.12" y="-195.62" font-family="Helvetica,sans-Serif" font-size="10.00">compose</text>
|
||||||
|
</g>
|
||||||
|
<!-- jira -->
|
||||||
|
<g id="node11" class="node">
|
||||||
|
<title>jira</title>
|
||||||
|
<path fill="#e8eaf6" stroke="black" d="M362,-142.81C362,-142.81 332,-142.81 332,-142.81 326,-142.81 320,-136.81 320,-130.81 320,-130.81 320,-118.81 320,-118.81 320,-112.81 326,-106.81 332,-106.81 332,-106.81 362,-106.81 362,-106.81 368,-106.81 374,-112.81 374,-118.81 374,-118.81 374,-130.81 374,-130.81 374,-136.81 368,-142.81 362,-142.81"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="347" y="-121.11" font-family="Helvetica,sans-Serif" font-size="11.00">Jira</text>
|
||||||
|
</g>
|
||||||
|
<!-- veins->jira -->
|
||||||
|
<g id="edge4" class="edge">
|
||||||
|
<title>veins->jira</title>
|
||||||
|
<path fill="none" stroke="black" d="M140.6,-222.66C149.39,-220.01 158.42,-217.4 167,-215.12 229,-198.71 255.03,-220.54 308,-184.38 319.35,-176.62 328.26,-164.37 334.68,-153.07"/>
|
||||||
|
<polygon fill="black" stroke="black" points="337.65,-154.94 339.18,-144.46 331.45,-151.7 337.65,-154.94"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="300.73" y="-195.62" font-family="Helvetica,sans-Serif" font-size="10.00">API</text>
|
||||||
|
</g>
|
||||||
|
<!-- slack -->
|
||||||
|
<g id="node12" class="node">
|
||||||
|
<title>slack</title>
|
||||||
|
<path fill="#e8eaf6" stroke="black" d="M434,-142.81C434,-142.81 404,-142.81 404,-142.81 398,-142.81 392,-136.81 392,-130.81 392,-130.81 392,-118.81 392,-118.81 392,-112.81 398,-106.81 404,-106.81 404,-106.81 434,-106.81 434,-106.81 440,-106.81 446,-112.81 446,-118.81 446,-118.81 446,-130.81 446,-130.81 446,-136.81 440,-142.81 434,-142.81"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="419" y="-121.11" font-family="Helvetica,sans-Serif" font-size="11.00">Slack</text>
|
||||||
|
</g>
|
||||||
|
<!-- veins->slack -->
|
||||||
|
<g id="edge5" class="edge">
|
||||||
|
<title>veins->slack</title>
|
||||||
|
<path fill="none" stroke="black" d="M136.47,-222.69C146.47,-219.73 156.99,-217.01 167,-215.12 230.92,-203.12 248.99,-216.66 313,-205.12 344.93,-199.37 357.24,-204.11 383,-184.38 393.48,-176.34 401.63,-164.31 407.5,-153.25"/>
|
||||||
|
<polygon fill="black" stroke="black" points="410.55,-154.97 411.77,-144.45 404.25,-151.91 410.55,-154.97"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="378.08" y="-195.62" font-family="Helvetica,sans-Serif" font-size="10.00">API</text>
|
||||||
|
</g>
|
||||||
|
<!-- google -->
|
||||||
|
<g id="node13" class="node">
|
||||||
|
<title>google</title>
|
||||||
|
<path fill="#e8eaf6" stroke="black" d="M506.12,-142.81C506.12,-142.81 475.88,-142.81 475.88,-142.81 469.88,-142.81 463.88,-136.81 463.88,-130.81 463.88,-130.81 463.88,-118.81 463.88,-118.81 463.88,-112.81 469.88,-106.81 475.88,-106.81 475.88,-106.81 506.12,-106.81 506.12,-106.81 512.12,-106.81 518.12,-112.81 518.12,-118.81 518.12,-118.81 518.12,-130.81 518.12,-130.81 518.12,-136.81 512.12,-142.81 506.12,-142.81"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="491" y="-121.11" font-family="Helvetica,sans-Serif" font-size="11.00">Google</text>
|
||||||
|
</g>
|
||||||
|
<!-- veins->google -->
|
||||||
|
<g id="edge6" class="edge">
|
||||||
|
<title>veins->google</title>
|
||||||
|
<path fill="none" stroke="black" d="M136.01,-222.63C146.14,-219.63 156.82,-216.91 167,-215.12 264.72,-197.96 292.34,-222.58 390,-205.12 419.85,-199.79 431.12,-203.07 455,-184.38 465.33,-176.29 473.42,-164.36 479.3,-153.37"/>
|
||||||
|
<polygon fill="black" stroke="black" points="482.32,-155.15 483.58,-144.64 476.03,-152.07 482.32,-155.15"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="458.15" y="-195.62" font-family="Helvetica,sans-Serif" font-size="10.00">OAuth</text>
|
||||||
|
</g>
|
||||||
|
<!-- shunts -->
|
||||||
|
<g id="node3" class="node">
|
||||||
|
<title>shunts</title>
|
||||||
|
<path fill="#ffcdd2" stroke="black" d="M283.75,-259.12C283.75,-259.12 188.25,-259.12 188.25,-259.12 182.25,-259.12 176.25,-253.12 176.25,-247.12 176.25,-247.12 176.25,-235.12 176.25,-235.12 176.25,-229.12 182.25,-223.12 188.25,-223.12 188.25,-223.12 283.75,-223.12 283.75,-223.12 289.75,-223.12 295.75,-229.12 295.75,-235.12 295.75,-235.12 295.75,-247.12 295.75,-247.12 295.75,-253.12 289.75,-259.12 283.75,-259.12"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="236" y="-244.18" font-family="Helvetica,sans-Serif" font-size="11.00">Shunts</text>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="236" y="-230.68" font-family="Helvetica,sans-Serif" font-size="11.00">(Mock Connectors)</text>
|
||||||
|
</g>
|
||||||
|
<!-- mercadopago -->
|
||||||
|
<g id="node14" class="node">
|
||||||
|
<title>mercadopago</title>
|
||||||
|
<path fill="#e8eaf6" stroke="black" d="M613.75,-142.81C613.75,-142.81 548.25,-142.81 548.25,-142.81 542.25,-142.81 536.25,-136.81 536.25,-130.81 536.25,-130.81 536.25,-118.81 536.25,-118.81 536.25,-112.81 542.25,-106.81 548.25,-106.81 548.25,-106.81 613.75,-106.81 613.75,-106.81 619.75,-106.81 625.75,-112.81 625.75,-118.81 625.75,-118.81 625.75,-130.81 625.75,-130.81 625.75,-136.81 619.75,-142.81 613.75,-142.81"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="581" y="-121.11" font-family="Helvetica,sans-Serif" font-size="11.00">MercadoPago</text>
|
||||||
|
</g>
|
||||||
|
<!-- shunts->mercadopago -->
|
||||||
|
<g id="edge7" class="edge">
|
||||||
|
<title>shunts->mercadopago</title>
|
||||||
|
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M280.02,-222.71C289.15,-219.71 298.79,-216.97 308,-215.12 404.38,-195.85 445.68,-239.58 527,-184.38 539.87,-175.64 551.86,-163.27 561.25,-152.15"/>
|
||||||
|
<polygon fill="black" stroke="black" points="563.97,-154.36 567.54,-144.39 558.53,-149.95 563.97,-154.36"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="526.27" y="-195.62" font-family="Helvetica,sans-Serif" font-size="10.00">mock</text>
|
||||||
|
</g>
|
||||||
|
<!-- plexus -->
|
||||||
|
<g id="node5" class="node">
|
||||||
|
<title>plexus</title>
|
||||||
|
<path fill="#e57373" stroke="black" d="M112.25,-52C112.25,-52 61.75,-52 61.75,-52 55.75,-52 49.75,-46 49.75,-40 49.75,-40 49.75,-28 49.75,-28 49.75,-22 55.75,-16 61.75,-16 61.75,-16 112.25,-16 112.25,-16 118.25,-16 124.25,-22 124.25,-28 124.25,-28 124.25,-40 124.25,-40 124.25,-46 118.25,-52 112.25,-52"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="87" y="-37.05" font-family="Helvetica,sans-Serif" font-size="11.00">Plexus</text>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="87" y="-23.55" font-family="Helvetica,sans-Serif" font-size="11.00">(Full Apps)</text>
|
||||||
|
</g>
|
||||||
|
<!-- pulses->plexus -->
|
||||||
|
<g id="edge9" class="edge">
|
||||||
|
<title>pulses->plexus</title>
|
||||||
|
<path fill="none" stroke="black" d="M87,-106.69C87,-94.48 87,-77.78 87,-63.57"/>
|
||||||
|
<polygon fill="black" stroke="black" points="90.5,-63.89 87,-53.89 83.5,-63.89 90.5,-63.89"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="103.88" y="-73.25" font-family="Helvetica,sans-Serif" font-size="10.00">extend</text>
|
||||||
|
</g>
|
||||||
|
<!-- templates -->
|
||||||
|
<g id="node7" class="node">
|
||||||
|
<title>templates</title>
|
||||||
|
<path fill="#bbdefb" stroke="black" d="M506.75,-259.12C506.75,-259.12 459.25,-259.12 459.25,-259.12 453.25,-259.12 447.25,-253.12 447.25,-247.12 447.25,-247.12 447.25,-235.12 447.25,-235.12 447.25,-229.12 453.25,-223.12 459.25,-223.12 459.25,-223.12 506.75,-223.12 506.75,-223.12 512.75,-223.12 518.75,-229.12 518.75,-235.12 518.75,-235.12 518.75,-247.12 518.75,-247.12 518.75,-253.12 512.75,-259.12 506.75,-259.12"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="483" y="-244.18" font-family="Helvetica,sans-Serif" font-size="11.00">Templates</text>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="483" y="-230.68" font-family="Helvetica,sans-Serif" font-size="11.00">(Patterns)</text>
|
||||||
|
</g>
|
||||||
|
<!-- depots -->
|
||||||
|
<g id="node8" class="node">
|
||||||
|
<title>depots</title>
|
||||||
|
<path fill="#90caf9" stroke="black" d="M626.75,-259.12C626.75,-259.12 549.25,-259.12 549.25,-259.12 543.25,-259.12 537.25,-253.12 537.25,-247.12 537.25,-247.12 537.25,-235.12 537.25,-235.12 537.25,-229.12 543.25,-223.12 549.25,-223.12 549.25,-223.12 626.75,-223.12 626.75,-223.12 632.75,-223.12 638.75,-229.12 638.75,-235.12 638.75,-235.12 638.75,-247.12 638.75,-247.12 638.75,-253.12 632.75,-259.12 626.75,-259.12"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="588" y="-244.18" font-family="Helvetica,sans-Serif" font-size="11.00">Depots</text>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="588" y="-230.68" font-family="Helvetica,sans-Serif" font-size="11.00">(External Docs)</text>
|
||||||
|
</g>
|
||||||
|
<!-- room_backend -->
|
||||||
|
<g id="node15" class="node">
|
||||||
|
<title>room_backend</title>
|
||||||
|
<path fill="#e1bee7" stroke="black" d="M744.38,-142.81C744.38,-142.81 661.62,-142.81 661.62,-142.81 655.62,-142.81 649.62,-136.81 649.62,-130.81 649.62,-130.81 649.62,-118.81 649.62,-118.81 649.62,-112.81 655.62,-106.81 661.62,-106.81 661.62,-106.81 744.38,-106.81 744.38,-106.81 750.38,-106.81 756.38,-112.81 756.38,-118.81 756.38,-118.81 756.38,-130.81 756.38,-130.81 756.38,-136.81 750.38,-142.81 744.38,-142.81"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="703" y="-127.86" font-family="Helvetica,sans-Serif" font-size="11.00">Backend</text>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="703" y="-114.36" font-family="Helvetica,sans-Serif" font-size="11.00">(Django/FastAPI)</text>
|
||||||
|
</g>
|
||||||
|
<!-- depots->room_backend -->
|
||||||
|
<g id="edge12" class="edge">
|
||||||
|
<title>depots->room_backend</title>
|
||||||
|
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M605.47,-222.76C624.74,-203.6 655.94,-172.59 677.85,-150.81"/>
|
||||||
|
<polygon fill="black" stroke="black" points="680.05,-153.56 684.67,-144.03 675.11,-148.6 680.05,-153.56"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="646.45" y="-195.62" font-family="Helvetica,sans-Serif" font-size="10.00">docs</text>
|
||||||
|
</g>
|
||||||
|
<!-- tools->room_backend -->
|
||||||
|
<g id="edge10" class="edge">
|
||||||
|
<title>tools->room_backend</title>
|
||||||
|
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M742.01,-222.76C734.61,-204.36 722.81,-175.03 714.12,-153.45"/>
|
||||||
|
<polygon fill="black" stroke="black" points="717.45,-152.34 710.47,-144.37 710.95,-154.95 717.45,-152.34"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="743.5" y="-195.62" font-family="Helvetica,sans-Serif" font-size="10.00">test</text>
|
||||||
|
</g>
|
||||||
|
<!-- monitors -->
|
||||||
|
<g id="node10" class="node">
|
||||||
|
<title>monitors</title>
|
||||||
|
<path fill="#ffecb3" stroke="black" d="M930.75,-259.12C930.75,-259.12 865.25,-259.12 865.25,-259.12 859.25,-259.12 853.25,-253.12 853.25,-247.12 853.25,-247.12 853.25,-235.12 853.25,-235.12 853.25,-229.12 859.25,-223.12 865.25,-223.12 865.25,-223.12 930.75,-223.12 930.75,-223.12 936.75,-223.12 942.75,-229.12 942.75,-235.12 942.75,-235.12 942.75,-247.12 942.75,-247.12 942.75,-253.12 936.75,-259.12 930.75,-259.12"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="898" y="-244.18" font-family="Helvetica,sans-Serif" font-size="11.00">Monitors</text>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="898" y="-230.68" font-family="Helvetica,sans-Serif" font-size="11.00">(databrowse)</text>
|
||||||
|
</g>
|
||||||
|
<!-- room_db -->
|
||||||
|
<g id="node17" class="node">
|
||||||
|
<title>room_db</title>
|
||||||
|
<path fill="#ce93d8" stroke="black" d="M944,-144.5C944,-146.91 924.28,-148.88 900,-148.88 875.72,-148.88 856,-146.91 856,-144.5 856,-144.5 856,-105.12 856,-105.12 856,-102.71 875.72,-100.75 900,-100.75 924.28,-100.75 944,-102.71 944,-105.12 944,-105.12 944,-144.5 944,-144.5"/>
|
||||||
|
<path fill="none" stroke="black" d="M944,-144.5C944,-142.09 924.28,-140.12 900,-140.12 875.72,-140.12 856,-142.09 856,-144.5"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="900" y="-127.86" font-family="Helvetica,sans-Serif" font-size="11.00">Database</text>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="900" y="-114.36" font-family="Helvetica,sans-Serif" font-size="11.00">(PostgreSQL)</text>
|
||||||
|
</g>
|
||||||
|
<!-- monitors->room_db -->
|
||||||
|
<g id="edge11" class="edge">
|
||||||
|
<title>monitors->room_db</title>
|
||||||
|
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M898.3,-222.76C898.59,-206.37 899.03,-181.3 899.39,-160.77"/>
|
||||||
|
<polygon fill="black" stroke="black" points="902.89,-160.87 899.56,-150.81 895.89,-160.75 902.89,-160.87"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="916.45" y="-195.62" font-family="Helvetica,sans-Serif" font-size="10.00">browse</text>
|
||||||
|
</g>
|
||||||
|
<!-- room_frontend -->
|
||||||
|
<g id="node16" class="node">
|
||||||
|
<title>room_frontend</title>
|
||||||
|
<path fill="#e1bee7" stroke="black" d="M826,-142.81C826,-142.81 786,-142.81 786,-142.81 780,-142.81 774,-136.81 774,-130.81 774,-130.81 774,-118.81 774,-118.81 774,-112.81 780,-106.81 786,-106.81 786,-106.81 826,-106.81 826,-106.81 832,-106.81 838,-112.81 838,-118.81 838,-118.81 838,-130.81 838,-130.81 838,-136.81 832,-142.81 826,-142.81"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="806" y="-127.86" font-family="Helvetica,sans-Serif" font-size="11.00">Frontend</text>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="806" y="-114.36" font-family="Helvetica,sans-Serif" font-size="11.00">(Next.js)</text>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 20 KiB |
86
docs/architecture/02-artery-hierarchy.dot
Normal file
@@ -0,0 +1,86 @@
|
|||||||
|
digraph ArteryHierarchy {
|
||||||
|
// Graph settings
|
||||||
|
rankdir=LR;
|
||||||
|
compound=true;
|
||||||
|
fontname="Helvetica";
|
||||||
|
node [fontname="Helvetica", fontsize=11];
|
||||||
|
edge [fontname="Helvetica", fontsize=10];
|
||||||
|
|
||||||
|
// Title
|
||||||
|
labelloc="t";
|
||||||
|
label="Artery - Connector Hierarchy";
|
||||||
|
fontsize=16;
|
||||||
|
|
||||||
|
// Styling
|
||||||
|
node [shape=box, style="rounded,filled"];
|
||||||
|
|
||||||
|
// Main hierarchy
|
||||||
|
subgraph cluster_main {
|
||||||
|
label="Evolution Path";
|
||||||
|
style=filled;
|
||||||
|
color="#E8F5E9";
|
||||||
|
fillcolor="#E8F5E9";
|
||||||
|
|
||||||
|
vein [label="Vein\n\nStateless API connector\ne.g., Jira, Slack, Google", fillcolor="#C8E6C9", width=2.5];
|
||||||
|
pulse [label="Pulse\n\nVein + Room + Depot\ne.g., Jira for AMAR project", fillcolor="#A5D6A7", width=2.5];
|
||||||
|
plexus [label="Plexus\n\nFull app: backend + frontend + DB\ne.g., WhatsApp with chat UI", fillcolor="#81C784", width=2.5];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Mock path
|
||||||
|
subgraph cluster_mock {
|
||||||
|
label="Testing Path";
|
||||||
|
style=filled;
|
||||||
|
color="#FFF3E0";
|
||||||
|
fillcolor="#FFF3E0";
|
||||||
|
|
||||||
|
shunt [label="Shunt\n\nFake connector for testing\ne.g., mercadopago mock", fillcolor="#FFCC80", width=2.5];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Connections
|
||||||
|
vein -> pulse [label="+ Room\n+ Depot"];
|
||||||
|
pulse -> plexus [label="+ Backend\n+ Frontend\n+ DB"];
|
||||||
|
vein -> shunt [label="mock", style=dashed, constraint=false];
|
||||||
|
|
||||||
|
// Properties table
|
||||||
|
subgraph cluster_props {
|
||||||
|
label="Properties";
|
||||||
|
style=filled;
|
||||||
|
color="#F5F5F5";
|
||||||
|
fillcolor="#F5F5F5";
|
||||||
|
|
||||||
|
props [shape=plaintext, label=<
|
||||||
|
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0" CELLPADDING="8">
|
||||||
|
<TR>
|
||||||
|
<TD BGCOLOR="#EEEEEE"><B>Type</B></TD>
|
||||||
|
<TD BGCOLOR="#EEEEEE"><B>State</B></TD>
|
||||||
|
<TD BGCOLOR="#EEEEEE"><B>Frontend</B></TD>
|
||||||
|
<TD BGCOLOR="#EEEEEE"><B>Deploy</B></TD>
|
||||||
|
</TR>
|
||||||
|
<TR>
|
||||||
|
<TD>Vein</TD>
|
||||||
|
<TD>None (or OAuth)</TD>
|
||||||
|
<TD>Optional test UI</TD>
|
||||||
|
<TD>With soleprint</TD>
|
||||||
|
</TR>
|
||||||
|
<TR>
|
||||||
|
<TD>Shunt</TD>
|
||||||
|
<TD>Configurable</TD>
|
||||||
|
<TD>Config UI</TD>
|
||||||
|
<TD>With soleprint</TD>
|
||||||
|
</TR>
|
||||||
|
<TR>
|
||||||
|
<TD>Pulse</TD>
|
||||||
|
<TD>Vein + config</TD>
|
||||||
|
<TD>Uses vein's</TD>
|
||||||
|
<TD>With soleprint</TD>
|
||||||
|
</TR>
|
||||||
|
<TR>
|
||||||
|
<TD>Plexus</TD>
|
||||||
|
<TD>Full app state</TD>
|
||||||
|
<TD>Required</TD>
|
||||||
|
<TD>Self-contained</TD>
|
||||||
|
</TR>
|
||||||
|
</TABLE>
|
||||||
|
>];
|
||||||
|
}
|
||||||
|
}
|
||||||
134
docs/architecture/02-artery-hierarchy.svg
Normal file
@@ -0,0 +1,134 @@
|
|||||||
|
<?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.1 (0)
|
||||||
|
-->
|
||||||
|
<!-- Title: ArteryHierarchy Pages: 1 -->
|
||||||
|
<svg width="972pt" height="487pt"
|
||||||
|
viewBox="0.00 0.00 972.00 487.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 482.5)">
|
||||||
|
<title>ArteryHierarchy</title>
|
||||||
|
<polygon fill="white" stroke="none" points="-4,4 -4,-482.5 968,-482.5 968,4 -4,4"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="482" y="-459.3" font-family="Helvetica,sans-Serif" font-size="16.00">Artery - Connector Hierarchy</text>
|
||||||
|
<g id="clust1" class="cluster">
|
||||||
|
<title>cluster_main</title>
|
||||||
|
<polygon fill="#e8f5e9" stroke="#e8f5e9" points="107.12,-8 107.12,-113 956,-113 956,-8 107.12,-8"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="531.56" y="-93.8" font-family="Helvetica,sans-Serif" font-size="16.00">Evolution Path</text>
|
||||||
|
</g>
|
||||||
|
<g id="clust2" class="cluster">
|
||||||
|
<title>cluster_mock</title>
|
||||||
|
<polygon fill="#fff3e0" stroke="#fff3e0" points="107.12,-121 107.12,-226 303.12,-226 303.12,-121 107.12,-121"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="205.12" y="-206.8" font-family="Helvetica,sans-Serif" font-size="16.00">Testing Path</text>
|
||||||
|
</g>
|
||||||
|
<g id="clust3" class="cluster">
|
||||||
|
<title>cluster_props</title>
|
||||||
|
<polygon fill="#f5f5f5" stroke="#f5f5f5" points="8,-234 8,-443 402.25,-443 402.25,-234 8,-234"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="205.12" y="-423.8" font-family="Helvetica,sans-Serif" font-size="16.00">Properties</text>
|
||||||
|
</g>
|
||||||
|
<!-- vein -->
|
||||||
|
<g id="node1" class="node">
|
||||||
|
<title>vein</title>
|
||||||
|
<path fill="#c8e6c9" stroke="black" d="M283.12,-77.75C283.12,-77.75 127.12,-77.75 127.12,-77.75 121.12,-77.75 115.12,-71.75 115.12,-65.75 115.12,-65.75 115.12,-28.25 115.12,-28.25 115.12,-22.25 121.12,-16.25 127.12,-16.25 127.12,-16.25 283.12,-16.25 283.12,-16.25 289.12,-16.25 295.12,-22.25 295.12,-28.25 295.12,-28.25 295.12,-65.75 295.12,-65.75 295.12,-71.75 289.12,-77.75 283.12,-77.75"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="205.12" y="-63.3" font-family="Helvetica,sans-Serif" font-size="11.00">Vein</text>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="205.12" y="-36.8" font-family="Helvetica,sans-Serif" font-size="11.00">Stateless API connector</text>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="205.12" y="-23.3" font-family="Helvetica,sans-Serif" font-size="11.00">e.g., Jira, Slack, Google</text>
|
||||||
|
</g>
|
||||||
|
<!-- pulse -->
|
||||||
|
<g id="node2" class="node">
|
||||||
|
<title>pulse</title>
|
||||||
|
<path fill="#a5d6a7" stroke="black" d="M638.75,-77.75C638.75,-77.75 482.75,-77.75 482.75,-77.75 476.75,-77.75 470.75,-71.75 470.75,-65.75 470.75,-65.75 470.75,-28.25 470.75,-28.25 470.75,-22.25 476.75,-16.25 482.75,-16.25 482.75,-16.25 638.75,-16.25 638.75,-16.25 644.75,-16.25 650.75,-22.25 650.75,-28.25 650.75,-28.25 650.75,-65.75 650.75,-65.75 650.75,-71.75 644.75,-77.75 638.75,-77.75"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="560.75" y="-63.3" font-family="Helvetica,sans-Serif" font-size="11.00">Pulse</text>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="560.75" y="-36.8" font-family="Helvetica,sans-Serif" font-size="11.00">Vein + Room + Depot</text>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="560.75" y="-23.3" font-family="Helvetica,sans-Serif" font-size="11.00">e.g., Jira for AMAR project</text>
|
||||||
|
</g>
|
||||||
|
<!-- vein->pulse -->
|
||||||
|
<g id="edge1" class="edge">
|
||||||
|
<title>vein->pulse</title>
|
||||||
|
<path fill="none" stroke="black" d="M295.36,-47C345.2,-47 407.45,-47 459.03,-47"/>
|
||||||
|
<polygon fill="black" stroke="black" points="459.03,-50.5 469.03,-47 459.03,-43.5 459.03,-50.5"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="432.5" y="-63" font-family="Helvetica,sans-Serif" font-size="10.00">+ Room</text>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="432.5" y="-50.25" font-family="Helvetica,sans-Serif" font-size="10.00">+ Depot</text>
|
||||||
|
</g>
|
||||||
|
<!-- shunt -->
|
||||||
|
<g id="node4" class="node">
|
||||||
|
<title>shunt</title>
|
||||||
|
<path fill="#ffcc80" stroke="black" d="M283.12,-190.75C283.12,-190.75 127.12,-190.75 127.12,-190.75 121.12,-190.75 115.12,-184.75 115.12,-178.75 115.12,-178.75 115.12,-141.25 115.12,-141.25 115.12,-135.25 121.12,-129.25 127.12,-129.25 127.12,-129.25 283.12,-129.25 283.12,-129.25 289.12,-129.25 295.12,-135.25 295.12,-141.25 295.12,-141.25 295.12,-178.75 295.12,-178.75 295.12,-184.75 289.12,-190.75 283.12,-190.75"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="205.12" y="-176.3" font-family="Helvetica,sans-Serif" font-size="11.00">Shunt</text>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="205.12" y="-149.8" font-family="Helvetica,sans-Serif" font-size="11.00">Fake connector for testing</text>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="205.12" y="-136.3" font-family="Helvetica,sans-Serif" font-size="11.00">e.g., mercadopago mock</text>
|
||||||
|
</g>
|
||||||
|
<!-- vein->shunt -->
|
||||||
|
<g id="edge3" class="edge">
|
||||||
|
<title>vein->shunt</title>
|
||||||
|
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M205.12,-78.18C205.12,-90.4 205.12,-104.63 205.12,-117.75"/>
|
||||||
|
<polygon fill="black" stroke="black" points="201.63,-117.41 205.13,-127.41 208.63,-117.41 201.63,-117.41"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="195.75" y="-100.38" font-family="Helvetica,sans-Serif" font-size="10.00">mock</text>
|
||||||
|
</g>
|
||||||
|
<!-- plexus -->
|
||||||
|
<g id="node3" class="node">
|
||||||
|
<title>plexus</title>
|
||||||
|
<path fill="#81c784" stroke="black" d="M936,-77.75C936,-77.75 752.75,-77.75 752.75,-77.75 746.75,-77.75 740.75,-71.75 740.75,-65.75 740.75,-65.75 740.75,-28.25 740.75,-28.25 740.75,-22.25 746.75,-16.25 752.75,-16.25 752.75,-16.25 936,-16.25 936,-16.25 942,-16.25 948,-22.25 948,-28.25 948,-28.25 948,-65.75 948,-65.75 948,-71.75 942,-77.75 936,-77.75"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="844.38" y="-63.3" font-family="Helvetica,sans-Serif" font-size="11.00">Plexus</text>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="844.38" y="-36.8" font-family="Helvetica,sans-Serif" font-size="11.00">Full app: backend + frontend + DB</text>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="844.38" y="-23.3" font-family="Helvetica,sans-Serif" font-size="11.00">e.g., WhatsApp with chat UI</text>
|
||||||
|
</g>
|
||||||
|
<!-- pulse->plexus -->
|
||||||
|
<g id="edge2" class="edge">
|
||||||
|
<title>pulse->plexus</title>
|
||||||
|
<path fill="none" stroke="black" d="M651.24,-47C675.94,-47 703.07,-47 728.97,-47"/>
|
||||||
|
<polygon fill="black" stroke="black" points="728.86,-50.5 738.86,-47 728.86,-43.5 728.86,-50.5"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="695.75" y="-75.75" font-family="Helvetica,sans-Serif" font-size="10.00">+ Backend</text>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="695.75" y="-63" font-family="Helvetica,sans-Serif" font-size="10.00">+ Frontend</text>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="695.75" y="-50.25" font-family="Helvetica,sans-Serif" font-size="10.00">+ DB</text>
|
||||||
|
</g>
|
||||||
|
<!-- props -->
|
||||||
|
<g id="node5" class="node">
|
||||||
|
<title>props</title>
|
||||||
|
<path fill="lightgrey" stroke="none" d="M382.25,-407.75C382.25,-407.75 28,-407.75 28,-407.75 22,-407.75 16,-401.75 16,-395.75 16,-395.75 16,-254.25 16,-254.25 16,-248.25 22,-242.25 28,-242.25 28,-242.25 382.25,-242.25 382.25,-242.25 388.25,-242.25 394.25,-248.25 394.25,-254.25 394.25,-254.25 394.25,-395.75 394.25,-395.75 394.25,-401.75 388.25,-407.75 382.25,-407.75"/>
|
||||||
|
<polygon fill="#eeeeee" stroke="none" points="24,-372.25 24,-403.75 78,-403.75 78,-372.25 24,-372.25"/>
|
||||||
|
<polygon fill="none" stroke="black" points="24,-372.25 24,-403.75 78,-403.75 78,-372.25 24,-372.25"/>
|
||||||
|
<text xml:space="preserve" text-anchor="start" x="36.75" y="-385.3" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="11.00">Type</text>
|
||||||
|
<polygon fill="#eeeeee" stroke="none" points="78,-372.25 78,-403.75 186,-403.75 186,-372.25 78,-372.25"/>
|
||||||
|
<polygon fill="none" stroke="black" points="78,-372.25 78,-403.75 186,-403.75 186,-372.25 78,-372.25"/>
|
||||||
|
<text xml:space="preserve" text-anchor="start" x="115.12" y="-385.3" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="11.00">State</text>
|
||||||
|
<polygon fill="#eeeeee" stroke="none" points="186,-372.25 186,-403.75 291,-403.75 291,-372.25 186,-372.25"/>
|
||||||
|
<polygon fill="none" stroke="black" points="186,-372.25 186,-403.75 291,-403.75 291,-372.25 186,-372.25"/>
|
||||||
|
<text xml:space="preserve" text-anchor="start" x="211.12" y="-385.3" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="11.00">Frontend</text>
|
||||||
|
<polygon fill="#eeeeee" stroke="none" points="291,-372.25 291,-403.75 386.25,-403.75 386.25,-372.25 291,-372.25"/>
|
||||||
|
<polygon fill="none" stroke="black" points="291,-372.25 291,-403.75 386.25,-403.75 386.25,-372.25 291,-372.25"/>
|
||||||
|
<text xml:space="preserve" text-anchor="start" x="317.25" y="-385.3" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="11.00">Deploy</text>
|
||||||
|
<polygon fill="none" stroke="black" points="24,-340.75 24,-372.25 78,-372.25 78,-340.75 24,-340.75"/>
|
||||||
|
<text xml:space="preserve" text-anchor="start" x="39.38" y="-352.8" font-family="Helvetica,sans-Serif" font-size="11.00">Vein</text>
|
||||||
|
<polygon fill="none" stroke="black" points="78,-340.75 78,-372.25 186,-372.25 186,-340.75 78,-340.75"/>
|
||||||
|
<text xml:space="preserve" text-anchor="start" x="87" y="-352.8" font-family="Helvetica,sans-Serif" font-size="11.00">None (or OAuth)</text>
|
||||||
|
<polygon fill="none" stroke="black" points="186,-340.75 186,-372.25 291,-372.25 291,-340.75 186,-340.75"/>
|
||||||
|
<text xml:space="preserve" text-anchor="start" x="195" y="-352.8" font-family="Helvetica,sans-Serif" font-size="11.00">Optional test UI</text>
|
||||||
|
<polygon fill="none" stroke="black" points="291,-340.75 291,-372.25 386.25,-372.25 386.25,-340.75 291,-340.75"/>
|
||||||
|
<text xml:space="preserve" text-anchor="start" x="300.38" y="-352.8" font-family="Helvetica,sans-Serif" font-size="11.00">With soleprint</text>
|
||||||
|
<polygon fill="none" stroke="black" points="24,-309.25 24,-340.75 78,-340.75 78,-309.25 24,-309.25"/>
|
||||||
|
<text xml:space="preserve" text-anchor="start" x="35.25" y="-321.3" font-family="Helvetica,sans-Serif" font-size="11.00">Shunt</text>
|
||||||
|
<polygon fill="none" stroke="black" points="78,-309.25 78,-340.75 186,-340.75 186,-309.25 78,-309.25"/>
|
||||||
|
<text xml:space="preserve" text-anchor="start" x="97.5" y="-321.3" font-family="Helvetica,sans-Serif" font-size="11.00">Configurable</text>
|
||||||
|
<polygon fill="none" stroke="black" points="186,-309.25 186,-340.75 291,-340.75 291,-309.25 186,-309.25"/>
|
||||||
|
<text xml:space="preserve" text-anchor="start" x="213.75" y="-321.3" font-family="Helvetica,sans-Serif" font-size="11.00">Config UI</text>
|
||||||
|
<polygon fill="none" stroke="black" points="291,-309.25 291,-340.75 386.25,-340.75 386.25,-309.25 291,-309.25"/>
|
||||||
|
<text xml:space="preserve" text-anchor="start" x="300.38" y="-321.3" font-family="Helvetica,sans-Serif" font-size="11.00">With soleprint</text>
|
||||||
|
<polygon fill="none" stroke="black" points="24,-277.75 24,-309.25 78,-309.25 78,-277.75 24,-277.75"/>
|
||||||
|
<text xml:space="preserve" text-anchor="start" x="36.38" y="-289.8" font-family="Helvetica,sans-Serif" font-size="11.00">Pulse</text>
|
||||||
|
<polygon fill="none" stroke="black" points="78,-277.75 78,-309.25 186,-309.25 186,-277.75 78,-277.75"/>
|
||||||
|
<text xml:space="preserve" text-anchor="start" x="95.62" y="-289.8" font-family="Helvetica,sans-Serif" font-size="11.00">Vein + config</text>
|
||||||
|
<polygon fill="none" stroke="black" points="186,-277.75 186,-309.25 291,-309.25 291,-277.75 186,-277.75"/>
|
||||||
|
<text xml:space="preserve" text-anchor="start" x="207" y="-289.8" font-family="Helvetica,sans-Serif" font-size="11.00">Uses vein's</text>
|
||||||
|
<polygon fill="none" stroke="black" points="291,-277.75 291,-309.25 386.25,-309.25 386.25,-277.75 291,-277.75"/>
|
||||||
|
<text xml:space="preserve" text-anchor="start" x="300.38" y="-289.8" font-family="Helvetica,sans-Serif" font-size="11.00">With soleprint</text>
|
||||||
|
<polygon fill="none" stroke="black" points="24,-246.25 24,-277.75 78,-277.75 78,-246.25 24,-246.25"/>
|
||||||
|
<text xml:space="preserve" text-anchor="start" x="33" y="-258.3" font-family="Helvetica,sans-Serif" font-size="11.00">Plexus</text>
|
||||||
|
<polygon fill="none" stroke="black" points="78,-246.25 78,-277.75 186,-277.75 186,-246.25 78,-246.25"/>
|
||||||
|
<text xml:space="preserve" text-anchor="start" x="94.5" y="-258.3" font-family="Helvetica,sans-Serif" font-size="11.00">Full app state</text>
|
||||||
|
<polygon fill="none" stroke="black" points="186,-246.25 186,-277.75 291,-277.75 291,-246.25 186,-246.25"/>
|
||||||
|
<text xml:space="preserve" text-anchor="start" x="214.12" y="-258.3" font-family="Helvetica,sans-Serif" font-size="11.00">Required</text>
|
||||||
|
<polygon fill="none" stroke="black" points="291,-246.25 291,-277.75 386.25,-277.75 386.25,-246.25 291,-246.25"/>
|
||||||
|
<text xml:space="preserve" text-anchor="start" x="300" y="-258.3" font-family="Helvetica,sans-Serif" font-size="11.00">Self-contained</text>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 13 KiB |
85
docs/architecture/03-build-flow.dot
Normal file
@@ -0,0 +1,85 @@
|
|||||||
|
digraph BuildFlow {
|
||||||
|
// Graph settings
|
||||||
|
rankdir=TB;
|
||||||
|
compound=true;
|
||||||
|
fontname="Helvetica";
|
||||||
|
node [fontname="Helvetica", fontsize=11];
|
||||||
|
edge [fontname="Helvetica", fontsize=10];
|
||||||
|
|
||||||
|
// Title
|
||||||
|
labelloc="t";
|
||||||
|
label="Soleprint - Build Flow";
|
||||||
|
fontsize=16;
|
||||||
|
|
||||||
|
// Styling
|
||||||
|
node [shape=box, style="rounded,filled"];
|
||||||
|
|
||||||
|
// Source
|
||||||
|
subgraph cluster_source {
|
||||||
|
label="Source (spr/)";
|
||||||
|
style=filled;
|
||||||
|
color="#E3F2FD";
|
||||||
|
fillcolor="#E3F2FD";
|
||||||
|
|
||||||
|
soleprint_src [label="soleprint/\n(core entry points)", fillcolor="#BBDEFB"];
|
||||||
|
artery_src [label="artery/\n(veins, shunts)", fillcolor="#BBDEFB"];
|
||||||
|
atlas_src [label="atlas/\n(books)", fillcolor="#BBDEFB"];
|
||||||
|
station_src [label="station/\n(tools, monitors)", fillcolor="#BBDEFB"];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Config
|
||||||
|
subgraph cluster_cfg {
|
||||||
|
label="Room Configs (cfg/)";
|
||||||
|
style=filled;
|
||||||
|
color="#FFF8E1";
|
||||||
|
fillcolor="#FFF8E1";
|
||||||
|
|
||||||
|
cfg_standalone [label="cfg/standalone/\nconfig.json\ndata/", fillcolor="#FFECB3"];
|
||||||
|
cfg_amar [label="cfg/amar/\nconfig.json\ndata/\ndocker-compose.yml\n...", fillcolor="#FFECB3"];
|
||||||
|
cfg_other [label="cfg/<room>/\n...", fillcolor="#FFE082", style="rounded,filled,dashed"];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Build tool
|
||||||
|
build [label="build.py", fillcolor="#E1BEE7", shape=hexagon];
|
||||||
|
|
||||||
|
// Commands
|
||||||
|
subgraph cluster_cmds {
|
||||||
|
label="Commands";
|
||||||
|
style=filled;
|
||||||
|
color="#F3E5F5";
|
||||||
|
fillcolor="#F3E5F5";
|
||||||
|
|
||||||
|
cmd1 [label="python build.py dev", fillcolor="#CE93D8"];
|
||||||
|
cmd2 [label="python build.py dev --cfg amar", fillcolor="#CE93D8"];
|
||||||
|
cmd3 [label="python build.py dev --all", fillcolor="#CE93D8"];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Output
|
||||||
|
subgraph cluster_gen {
|
||||||
|
label="Generated Output (gen/)";
|
||||||
|
style=filled;
|
||||||
|
color="#E8F5E9";
|
||||||
|
fillcolor="#E8F5E9";
|
||||||
|
|
||||||
|
gen_standalone [label="gen/standalone/\n(base soleprint)", fillcolor="#C8E6C9"];
|
||||||
|
gen_amar [label="gen/amar/\n(with amar config)", fillcolor="#C8E6C9"];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Connections
|
||||||
|
soleprint_src -> build;
|
||||||
|
artery_src -> build;
|
||||||
|
atlas_src -> build;
|
||||||
|
station_src -> build;
|
||||||
|
|
||||||
|
cfg_standalone -> build [style=dashed];
|
||||||
|
cfg_amar -> build [style=dashed];
|
||||||
|
|
||||||
|
build -> cmd1 [style=invis];
|
||||||
|
build -> cmd2 [style=invis];
|
||||||
|
build -> cmd3 [style=invis];
|
||||||
|
|
||||||
|
cmd1 -> gen_standalone [label="copies + standalone config"];
|
||||||
|
cmd2 -> gen_amar [label="copies + amar config"];
|
||||||
|
cmd3 -> gen_standalone [style=dashed];
|
||||||
|
cmd3 -> gen_amar [style=dashed];
|
||||||
|
}
|
||||||
190
docs/architecture/03-build-flow.svg
Normal file
@@ -0,0 +1,190 @@
|
|||||||
|
<?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.1 (0)
|
||||||
|
-->
|
||||||
|
<!-- Title: BuildFlow Pages: 1 -->
|
||||||
|
<svg width="854pt" height="452pt"
|
||||||
|
viewBox="0.00 0.00 854.00 452.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 448.25)">
|
||||||
|
<title>BuildFlow</title>
|
||||||
|
<polygon fill="white" stroke="none" points="-4,4 -4,-448.25 850,-448.25 850,4 -4,4"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="423" y="-425.05" font-family="Helvetica,sans-Serif" font-size="16.00">Soleprint - Build Flow</text>
|
||||||
|
<g id="clust1" class="cluster">
|
||||||
|
<title>cluster_source</title>
|
||||||
|
<polygon fill="#e3f2fd" stroke="#e3f2fd" points="8,-309.5 8,-389 462,-389 462,-309.5 8,-309.5"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="235" y="-369.8" font-family="Helvetica,sans-Serif" font-size="16.00">Source (spr/)</text>
|
||||||
|
</g>
|
||||||
|
<g id="clust2" class="cluster">
|
||||||
|
<title>cluster_cfg</title>
|
||||||
|
<polygon fill="#fff8e1" stroke="#fff8e1" points="470,-289.75 470,-408.75 838,-408.75 838,-289.75 470,-289.75"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="654" y="-389.55" font-family="Helvetica,sans-Serif" font-size="16.00">Room Configs (cfg/)</text>
|
||||||
|
</g>
|
||||||
|
<g id="clust3" class="cluster">
|
||||||
|
<title>cluster_cmds</title>
|
||||||
|
<polygon fill="#f3e5f5" stroke="#f3e5f5" points="122,-118.25 122,-197.75 636,-197.75 636,-118.25 122,-118.25"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="379" y="-178.55" font-family="Helvetica,sans-Serif" font-size="16.00">Commands</text>
|
||||||
|
</g>
|
||||||
|
<g id="clust4" class="cluster">
|
||||||
|
<title>cluster_gen</title>
|
||||||
|
<polygon fill="#e8f5e9" stroke="#e8f5e9" points="243,-8 243,-87.5 499,-87.5 499,-8 243,-8"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="371" y="-68.3" font-family="Helvetica,sans-Serif" font-size="16.00">Generated Output (gen/)</text>
|
||||||
|
</g>
|
||||||
|
<!-- soleprint_src -->
|
||||||
|
<g id="node1" class="node">
|
||||||
|
<title>soleprint_src</title>
|
||||||
|
<path fill="#bbdefb" stroke="black" d="M123.75,-353.5C123.75,-353.5 28.25,-353.5 28.25,-353.5 22.25,-353.5 16.25,-347.5 16.25,-341.5 16.25,-341.5 16.25,-329.5 16.25,-329.5 16.25,-323.5 22.25,-317.5 28.25,-317.5 28.25,-317.5 123.75,-317.5 123.75,-317.5 129.75,-317.5 135.75,-323.5 135.75,-329.5 135.75,-329.5 135.75,-341.5 135.75,-341.5 135.75,-347.5 129.75,-353.5 123.75,-353.5"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="76" y="-338.55" font-family="Helvetica,sans-Serif" font-size="11.00">soleprint/</text>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="76" y="-325.05" font-family="Helvetica,sans-Serif" font-size="11.00">(core entry points)</text>
|
||||||
|
</g>
|
||||||
|
<!-- build -->
|
||||||
|
<g id="node8" class="node">
|
||||||
|
<title>build</title>
|
||||||
|
<path fill="#e1bee7" stroke="black" d="M384.69,-248.75C384.69,-248.75 377.55,-254.75 377.55,-254.75 373.98,-257.75 365.75,-260.75 361.09,-260.75 361.09,-260.75 336.91,-260.75 336.91,-260.75 332.25,-260.75 324.02,-257.75 320.45,-254.75 320.45,-254.75 313.31,-248.75 313.31,-248.75 309.74,-245.75 309.74,-239.75 313.31,-236.75 313.31,-236.75 320.45,-230.75 320.45,-230.75 324.02,-227.75 332.25,-224.75 336.91,-224.75 336.91,-224.75 361.09,-224.75 361.09,-224.75 365.75,-224.75 373.98,-227.75 377.55,-230.75 377.55,-230.75 384.69,-236.75 384.69,-236.75 388.26,-239.75 388.26,-245.75 384.69,-248.75"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="349" y="-239.05" font-family="Helvetica,sans-Serif" font-size="11.00">build.py</text>
|
||||||
|
</g>
|
||||||
|
<!-- soleprint_src->build -->
|
||||||
|
<g id="edge1" class="edge">
|
||||||
|
<title>soleprint_src->build</title>
|
||||||
|
<path fill="none" stroke="black" d="M98.48,-317C111.45,-307.68 128.42,-296.73 145,-289.75 195.92,-268.31 258.4,-256.1 300.69,-249.73"/>
|
||||||
|
<polygon fill="black" stroke="black" points="301.17,-253.2 310.56,-248.3 300.16,-246.27 301.17,-253.2"/>
|
||||||
|
</g>
|
||||||
|
<!-- artery_src -->
|
||||||
|
<g id="node2" class="node">
|
||||||
|
<title>artery_src</title>
|
||||||
|
<path fill="#bbdefb" stroke="black" d="M240.25,-353.5C240.25,-353.5 165.75,-353.5 165.75,-353.5 159.75,-353.5 153.75,-347.5 153.75,-341.5 153.75,-341.5 153.75,-329.5 153.75,-329.5 153.75,-323.5 159.75,-317.5 165.75,-317.5 165.75,-317.5 240.25,-317.5 240.25,-317.5 246.25,-317.5 252.25,-323.5 252.25,-329.5 252.25,-329.5 252.25,-341.5 252.25,-341.5 252.25,-347.5 246.25,-353.5 240.25,-353.5"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="203" y="-338.55" font-family="Helvetica,sans-Serif" font-size="11.00">artery/</text>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="203" y="-325.05" font-family="Helvetica,sans-Serif" font-size="11.00">(veins, shunts)</text>
|
||||||
|
</g>
|
||||||
|
<!-- artery_src->build -->
|
||||||
|
<g id="edge2" class="edge">
|
||||||
|
<title>artery_src->build</title>
|
||||||
|
<path fill="none" stroke="black" d="M223.56,-317.21C234.37,-308.5 248.04,-298.05 261,-289.75 277.08,-279.46 295.71,-269.46 311.69,-261.43"/>
|
||||||
|
<polygon fill="black" stroke="black" points="312.98,-264.7 320.39,-257.13 309.87,-258.42 312.98,-264.7"/>
|
||||||
|
</g>
|
||||||
|
<!-- atlas_src -->
|
||||||
|
<g id="node3" class="node">
|
||||||
|
<title>atlas_src</title>
|
||||||
|
<path fill="#bbdefb" stroke="black" d="M315.62,-353.5C315.62,-353.5 282.38,-353.5 282.38,-353.5 276.38,-353.5 270.38,-347.5 270.38,-341.5 270.38,-341.5 270.38,-329.5 270.38,-329.5 270.38,-323.5 276.38,-317.5 282.38,-317.5 282.38,-317.5 315.62,-317.5 315.62,-317.5 321.62,-317.5 327.62,-323.5 327.62,-329.5 327.62,-329.5 327.62,-341.5 327.62,-341.5 327.62,-347.5 321.62,-353.5 315.62,-353.5"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="299" y="-338.55" font-family="Helvetica,sans-Serif" font-size="11.00">atlas/</text>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="299" y="-325.05" font-family="Helvetica,sans-Serif" font-size="11.00">(books)</text>
|
||||||
|
</g>
|
||||||
|
<!-- atlas_src->build -->
|
||||||
|
<g id="edge3" class="edge">
|
||||||
|
<title>atlas_src->build</title>
|
||||||
|
<path fill="none" stroke="black" d="M308.64,-317C315.83,-303.95 325.8,-285.86 334.03,-270.93"/>
|
||||||
|
<polygon fill="black" stroke="black" points="336.9,-272.97 338.66,-262.52 330.77,-269.59 336.9,-272.97"/>
|
||||||
|
</g>
|
||||||
|
<!-- station_src -->
|
||||||
|
<g id="node4" class="node">
|
||||||
|
<title>station_src</title>
|
||||||
|
<path fill="#bbdefb" stroke="black" d="M442.12,-353.5C442.12,-353.5 357.88,-353.5 357.88,-353.5 351.88,-353.5 345.88,-347.5 345.88,-341.5 345.88,-341.5 345.88,-329.5 345.88,-329.5 345.88,-323.5 351.88,-317.5 357.88,-317.5 357.88,-317.5 442.12,-317.5 442.12,-317.5 448.12,-317.5 454.12,-323.5 454.12,-329.5 454.12,-329.5 454.12,-341.5 454.12,-341.5 454.12,-347.5 448.12,-353.5 442.12,-353.5"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="400" y="-338.55" font-family="Helvetica,sans-Serif" font-size="11.00">station/</text>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="400" y="-325.05" font-family="Helvetica,sans-Serif" font-size="11.00">(tools, monitors)</text>
|
||||||
|
</g>
|
||||||
|
<!-- station_src->build -->
|
||||||
|
<g id="edge4" class="edge">
|
||||||
|
<title>station_src->build</title>
|
||||||
|
<path fill="none" stroke="black" d="M390.17,-317C382.83,-303.95 372.67,-285.86 364.27,-270.93"/>
|
||||||
|
<polygon fill="black" stroke="black" points="367.5,-269.52 359.54,-262.51 361.39,-272.95 367.5,-269.52"/>
|
||||||
|
</g>
|
||||||
|
<!-- cfg_standalone -->
|
||||||
|
<g id="node5" class="node">
|
||||||
|
<title>cfg_standalone</title>
|
||||||
|
<path fill="#ffecb3" stroke="black" d="M566.38,-359.75C566.38,-359.75 489.62,-359.75 489.62,-359.75 483.62,-359.75 477.62,-353.75 477.62,-347.75 477.62,-347.75 477.62,-323.25 477.62,-323.25 477.62,-317.25 483.62,-311.25 489.62,-311.25 489.62,-311.25 566.38,-311.25 566.38,-311.25 572.38,-311.25 578.38,-317.25 578.38,-323.25 578.38,-323.25 578.38,-347.75 578.38,-347.75 578.38,-353.75 572.38,-359.75 566.38,-359.75"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="528" y="-345.3" font-family="Helvetica,sans-Serif" font-size="11.00">cfg/standalone/</text>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="528" y="-331.8" font-family="Helvetica,sans-Serif" font-size="11.00">config.json</text>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="528" y="-318.3" font-family="Helvetica,sans-Serif" font-size="11.00">data/</text>
|
||||||
|
</g>
|
||||||
|
<!-- cfg_standalone->build -->
|
||||||
|
<g id="edge5" class="edge">
|
||||||
|
<title>cfg_standalone->build</title>
|
||||||
|
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M498.41,-310.84C488.46,-303.52 477.07,-295.79 466,-289.75 441.97,-276.62 413.39,-265.31 390.49,-257.19"/>
|
||||||
|
<polygon fill="black" stroke="black" points="391.78,-253.94 381.18,-253.97 389.48,-260.55 391.78,-253.94"/>
|
||||||
|
</g>
|
||||||
|
<!-- cfg_amar -->
|
||||||
|
<g id="node6" class="node">
|
||||||
|
<title>cfg_amar</title>
|
||||||
|
<path fill="#ffecb3" stroke="black" d="M713.62,-373.25C713.62,-373.25 608.38,-373.25 608.38,-373.25 602.38,-373.25 596.38,-367.25 596.38,-361.25 596.38,-361.25 596.38,-309.75 596.38,-309.75 596.38,-303.75 602.38,-297.75 608.38,-297.75 608.38,-297.75 713.62,-297.75 713.62,-297.75 719.62,-297.75 725.62,-303.75 725.62,-309.75 725.62,-309.75 725.62,-361.25 725.62,-361.25 725.62,-367.25 719.62,-373.25 713.62,-373.25"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="661" y="-358.8" font-family="Helvetica,sans-Serif" font-size="11.00">cfg/amar/</text>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="661" y="-345.3" font-family="Helvetica,sans-Serif" font-size="11.00">config.json</text>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="661" y="-331.8" font-family="Helvetica,sans-Serif" font-size="11.00">data/</text>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="661" y="-318.3" font-family="Helvetica,sans-Serif" font-size="11.00">docker-compose.yml</text>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="661" y="-304.8" font-family="Helvetica,sans-Serif" font-size="11.00">...</text>
|
||||||
|
</g>
|
||||||
|
<!-- cfg_amar->build -->
|
||||||
|
<g id="edge6" class="edge">
|
||||||
|
<title>cfg_amar->build</title>
|
||||||
|
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M603.83,-297.29C598.26,-294.48 592.6,-291.91 587,-289.75 524.46,-265.68 447.64,-253.76 398.5,-248.18"/>
|
||||||
|
<polygon fill="black" stroke="black" points="399.06,-244.72 388.74,-247.12 398.31,-251.68 399.06,-244.72"/>
|
||||||
|
</g>
|
||||||
|
<!-- cfg_other -->
|
||||||
|
<g id="node7" class="node">
|
||||||
|
<title>cfg_other</title>
|
||||||
|
<path fill="#ffe082" stroke="black" stroke-dasharray="5,2" d="M818.25,-353.5C818.25,-353.5 755.75,-353.5 755.75,-353.5 749.75,-353.5 743.75,-347.5 743.75,-341.5 743.75,-341.5 743.75,-329.5 743.75,-329.5 743.75,-323.5 749.75,-317.5 755.75,-317.5 755.75,-317.5 818.25,-317.5 818.25,-317.5 824.25,-317.5 830.25,-323.5 830.25,-329.5 830.25,-329.5 830.25,-341.5 830.25,-341.5 830.25,-347.5 824.25,-353.5 818.25,-353.5"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="787" y="-338.55" font-family="Helvetica,sans-Serif" font-size="11.00">cfg/<room>/</text>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="787" y="-325.05" font-family="Helvetica,sans-Serif" font-size="11.00">...</text>
|
||||||
|
</g>
|
||||||
|
<!-- cmd1 -->
|
||||||
|
<g id="node9" class="node">
|
||||||
|
<title>cmd1</title>
|
||||||
|
<path fill="#ce93d8" stroke="black" d="M243.75,-162.25C243.75,-162.25 142.25,-162.25 142.25,-162.25 136.25,-162.25 130.25,-156.25 130.25,-150.25 130.25,-150.25 130.25,-138.25 130.25,-138.25 130.25,-132.25 136.25,-126.25 142.25,-126.25 142.25,-126.25 243.75,-126.25 243.75,-126.25 249.75,-126.25 255.75,-132.25 255.75,-138.25 255.75,-138.25 255.75,-150.25 255.75,-150.25 255.75,-156.25 249.75,-162.25 243.75,-162.25"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="193" y="-140.55" font-family="Helvetica,sans-Serif" font-size="11.00">python build.py dev</text>
|
||||||
|
</g>
|
||||||
|
<!-- build->cmd1 -->
|
||||||
|
<!-- cmd2 -->
|
||||||
|
<g id="node10" class="node">
|
||||||
|
<title>cmd2</title>
|
||||||
|
<path fill="#ce93d8" stroke="black" d="M615.75,-162.25C615.75,-162.25 454.25,-162.25 454.25,-162.25 448.25,-162.25 442.25,-156.25 442.25,-150.25 442.25,-150.25 442.25,-138.25 442.25,-138.25 442.25,-132.25 448.25,-126.25 454.25,-126.25 454.25,-126.25 615.75,-126.25 615.75,-126.25 621.75,-126.25 627.75,-132.25 627.75,-138.25 627.75,-138.25 627.75,-150.25 627.75,-150.25 627.75,-156.25 621.75,-162.25 615.75,-162.25"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="535" y="-140.55" font-family="Helvetica,sans-Serif" font-size="11.00">python build.py dev --cfg amar</text>
|
||||||
|
</g>
|
||||||
|
<!-- build->cmd2 -->
|
||||||
|
<!-- cmd3 -->
|
||||||
|
<g id="node11" class="node">
|
||||||
|
<title>cmd3</title>
|
||||||
|
<path fill="#ce93d8" stroke="black" d="M411.75,-162.25C411.75,-162.25 286.25,-162.25 286.25,-162.25 280.25,-162.25 274.25,-156.25 274.25,-150.25 274.25,-150.25 274.25,-138.25 274.25,-138.25 274.25,-132.25 280.25,-126.25 286.25,-126.25 286.25,-126.25 411.75,-126.25 411.75,-126.25 417.75,-126.25 423.75,-132.25 423.75,-138.25 423.75,-138.25 423.75,-150.25 423.75,-150.25 423.75,-156.25 417.75,-162.25 411.75,-162.25"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="349" y="-140.55" font-family="Helvetica,sans-Serif" font-size="11.00">python build.py dev --all</text>
|
||||||
|
</g>
|
||||||
|
<!-- build->cmd3 -->
|
||||||
|
<!-- gen_standalone -->
|
||||||
|
<g id="node12" class="node">
|
||||||
|
<title>gen_standalone</title>
|
||||||
|
<path fill="#c8e6c9" stroke="black" d="M343.25,-52C343.25,-52 262.75,-52 262.75,-52 256.75,-52 250.75,-46 250.75,-40 250.75,-40 250.75,-28 250.75,-28 250.75,-22 256.75,-16 262.75,-16 262.75,-16 343.25,-16 343.25,-16 349.25,-16 355.25,-22 355.25,-28 355.25,-28 355.25,-40 355.25,-40 355.25,-46 349.25,-52 343.25,-52"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="303" y="-37.05" font-family="Helvetica,sans-Serif" font-size="11.00">gen/standalone/</text>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="303" y="-23.55" font-family="Helvetica,sans-Serif" font-size="11.00">(base soleprint)</text>
|
||||||
|
</g>
|
||||||
|
<!-- cmd1->gen_standalone -->
|
||||||
|
<g id="edge10" class="edge">
|
||||||
|
<title>cmd1->gen_standalone</title>
|
||||||
|
<path fill="none" stroke="black" d="M190.27,-126.13C189.61,-116.45 190.36,-104.51 196,-95.5 206.41,-78.87 223.15,-66.38 240.33,-57.2"/>
|
||||||
|
<polygon fill="black" stroke="black" points="241.69,-60.43 249.09,-52.85 238.58,-54.16 241.69,-60.43"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="262" y="-98.75" font-family="Helvetica,sans-Serif" font-size="10.00">copies + standalone config</text>
|
||||||
|
</g>
|
||||||
|
<!-- gen_amar -->
|
||||||
|
<g id="node13" class="node">
|
||||||
|
<title>gen_amar</title>
|
||||||
|
<path fill="#c8e6c9" stroke="black" d="M478.62,-52C478.62,-52 385.38,-52 385.38,-52 379.38,-52 373.38,-46 373.38,-40 373.38,-40 373.38,-28 373.38,-28 373.38,-22 379.38,-16 385.38,-16 385.38,-16 478.62,-16 478.62,-16 484.62,-16 490.62,-22 490.62,-28 490.62,-28 490.62,-40 490.62,-40 490.62,-46 484.62,-52 478.62,-52"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="432" y="-37.05" font-family="Helvetica,sans-Serif" font-size="11.00">gen/amar/</text>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="432" y="-23.55" font-family="Helvetica,sans-Serif" font-size="11.00">(with amar config)</text>
|
||||||
|
</g>
|
||||||
|
<!-- cmd2->gen_amar -->
|
||||||
|
<g id="edge11" class="edge">
|
||||||
|
<title>cmd2->gen_amar</title>
|
||||||
|
<path fill="none" stroke="black" d="M518.45,-125.86C501.63,-108.18 475.4,-80.61 456.24,-60.47"/>
|
||||||
|
<polygon fill="black" stroke="black" points="458.98,-58.28 449.55,-53.45 453.91,-63.1 458.98,-58.28"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="553.43" y="-98.75" font-family="Helvetica,sans-Serif" font-size="10.00">copies + amar config</text>
|
||||||
|
</g>
|
||||||
|
<!-- cmd3->gen_standalone -->
|
||||||
|
<g id="edge12" class="edge">
|
||||||
|
<title>cmd3->gen_standalone</title>
|
||||||
|
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M343.29,-125.84C340.18,-116.72 336.13,-105.41 332,-95.5 327.41,-84.49 321.86,-72.6 316.84,-62.31"/>
|
||||||
|
<polygon fill="black" stroke="black" points="320.11,-61.02 312.54,-53.61 313.83,-64.13 320.11,-61.02"/>
|
||||||
|
</g>
|
||||||
|
<!-- cmd3->gen_amar -->
|
||||||
|
<g id="edge13" class="edge">
|
||||||
|
<title>cmd3->gen_amar</title>
|
||||||
|
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M362.34,-125.86C375.71,-108.42 396.46,-81.35 411.84,-61.29"/>
|
||||||
|
<polygon fill="black" stroke="black" points="414.47,-63.62 417.78,-53.55 408.91,-59.36 414.47,-63.62"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 16 KiB |
83
docs/architecture/04-room-config.dot
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
digraph RoomConfig {
|
||||||
|
// Graph settings
|
||||||
|
rankdir=TB;
|
||||||
|
compound=true;
|
||||||
|
fontname="Helvetica";
|
||||||
|
node [fontname="Helvetica", fontsize=11];
|
||||||
|
edge [fontname="Helvetica", fontsize=10];
|
||||||
|
|
||||||
|
// Title
|
||||||
|
labelloc="t";
|
||||||
|
label="Soleprint - Room Configuration Structure";
|
||||||
|
fontsize=16;
|
||||||
|
|
||||||
|
// Styling
|
||||||
|
node [shape=box, style="rounded,filled"];
|
||||||
|
|
||||||
|
// Room config structure
|
||||||
|
subgraph cluster_room {
|
||||||
|
label="cfg/<room>/";
|
||||||
|
style=filled;
|
||||||
|
color="#E8F5E9";
|
||||||
|
fillcolor="#E8F5E9";
|
||||||
|
|
||||||
|
config_json [label="config.json\n\nFramework branding\nTerminology customization\n(can rebrand soleprint)", fillcolor="#C8E6C9"];
|
||||||
|
|
||||||
|
subgraph cluster_data {
|
||||||
|
label="data/";
|
||||||
|
style=filled;
|
||||||
|
color="#DCEDC8";
|
||||||
|
fillcolor="#DCEDC8";
|
||||||
|
|
||||||
|
veins_json [label="veins.json", fillcolor="#AED581"];
|
||||||
|
shunts_json [label="shunts.json", fillcolor="#AED581"];
|
||||||
|
depots_json [label="depots.json", fillcolor="#AED581"];
|
||||||
|
rooms_json [label="rooms.json", fillcolor="#AED581"];
|
||||||
|
}
|
||||||
|
|
||||||
|
subgraph cluster_docker {
|
||||||
|
label="Docker";
|
||||||
|
style=filled;
|
||||||
|
color="#FFECB3";
|
||||||
|
fillcolor="#FFECB3";
|
||||||
|
|
||||||
|
docker_compose [label="docker-compose.yml", fillcolor="#FFE082"];
|
||||||
|
dockerfile_be [label="Dockerfile.backend", fillcolor="#FFE082"];
|
||||||
|
dockerfile_fe [label="Dockerfile.frontend", fillcolor="#FFE082"];
|
||||||
|
env_example [label=".env.example", fillcolor="#FFE082"];
|
||||||
|
}
|
||||||
|
|
||||||
|
subgraph cluster_soleprint {
|
||||||
|
label="soleprint/";
|
||||||
|
style=filled;
|
||||||
|
color="#E1BEE7";
|
||||||
|
fillcolor="#E1BEE7";
|
||||||
|
|
||||||
|
spr_compose [label="docker-compose.yml\n(soleprint for this room)", fillcolor="#CE93D8"];
|
||||||
|
spr_env [label=".env", fillcolor="#CE93D8"];
|
||||||
|
}
|
||||||
|
|
||||||
|
subgraph cluster_extras {
|
||||||
|
label="Room-specific";
|
||||||
|
style=filled;
|
||||||
|
color="#B2EBF2";
|
||||||
|
fillcolor="#B2EBF2";
|
||||||
|
|
||||||
|
databrowse [label="databrowse/depot/\n(DB schema)", fillcolor="#80DEEA"];
|
||||||
|
tester [label="tester/tests/\n(Room tests)", fillcolor="#80DEEA"];
|
||||||
|
monitors [label="monitors/\n(Room monitors)", fillcolor="#80DEEA"];
|
||||||
|
models [label="models/\n(Room models)", fillcolor="#80DEEA"];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Examples
|
||||||
|
subgraph cluster_examples {
|
||||||
|
label="Examples";
|
||||||
|
style=dashed;
|
||||||
|
color=gray;
|
||||||
|
|
||||||
|
standalone [label="cfg/standalone/\n\nBase soleprint\nGeneric veins\nNo docker-compose", fillcolor="#F5F5F5"];
|
||||||
|
|
||||||
|
amar [label="cfg/amar/\n\nAMAR veterinary app\namar + mercadopago shunts\nFull Docker setup\nCustom monitors (turnos)", fillcolor="#F5F5F5"];
|
||||||
|
}
|
||||||
|
}
|
||||||
161
docs/architecture/04-room-config.svg
Normal file
@@ -0,0 +1,161 @@
|
|||||||
|
<?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.1 (0)
|
||||||
|
-->
|
||||||
|
<!-- Title: RoomConfig Pages: 1 -->
|
||||||
|
<svg width="2212pt" height="193pt"
|
||||||
|
viewBox="0.00 0.00 2212.00 193.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 188.75)">
|
||||||
|
<title>RoomConfig</title>
|
||||||
|
<polygon fill="white" stroke="none" points="-4,4 -4,-188.75 2208,-188.75 2208,4 -4,4"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="1102" y="-165.55" font-family="Helvetica,sans-Serif" font-size="16.00">Soleprint - Room Configuration Structure</text>
|
||||||
|
<g id="clust1" class="cluster">
|
||||||
|
<title>cluster_room</title>
|
||||||
|
<polygon fill="#e8f5e9" stroke="#e8f5e9" points="8,-14.75 8,-149.25 1854,-149.25 1854,-14.75 8,-14.75"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="931" y="-130.05" font-family="Helvetica,sans-Serif" font-size="16.00">cfg/<room>/</text>
|
||||||
|
</g>
|
||||||
|
<g id="clust2" class="cluster">
|
||||||
|
<title>cluster_data</title>
|
||||||
|
<polygon fill="#dcedc8" stroke="#dcedc8" points="16,-34.25 16,-113.75 392,-113.75 392,-34.25 16,-34.25"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="204" y="-94.55" font-family="Helvetica,sans-Serif" font-size="16.00">data/</text>
|
||||||
|
</g>
|
||||||
|
<g id="clust3" class="cluster">
|
||||||
|
<title>cluster_docker</title>
|
||||||
|
<polygon fill="#ffecb3" stroke="#ffecb3" points="400,-34.25 400,-113.75 932,-113.75 932,-34.25 400,-34.25"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="666" y="-94.55" font-family="Helvetica,sans-Serif" font-size="16.00">Docker</text>
|
||||||
|
</g>
|
||||||
|
<g id="clust4" class="cluster">
|
||||||
|
<title>cluster_soleprint</title>
|
||||||
|
<polygon fill="#e1bee7" stroke="#e1bee7" points="940,-34.25 940,-113.75 1176,-113.75 1176,-34.25 940,-34.25"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="1058" y="-94.55" font-family="Helvetica,sans-Serif" font-size="16.00">soleprint/</text>
|
||||||
|
</g>
|
||||||
|
<g id="clust5" class="cluster">
|
||||||
|
<title>cluster_extras</title>
|
||||||
|
<polygon fill="#b2ebf2" stroke="#b2ebf2" points="1184,-34.25 1184,-113.75 1672,-113.75 1672,-34.25 1184,-34.25"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="1428" y="-94.55" font-family="Helvetica,sans-Serif" font-size="16.00">Room-specific</text>
|
||||||
|
</g>
|
||||||
|
<g id="clust6" class="cluster">
|
||||||
|
<title>cluster_examples</title>
|
||||||
|
<polygon fill="none" stroke="gray" stroke-dasharray="5,2" points="1862,-8 1862,-140 2196,-140 2196,-8 1862,-8"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="2029" y="-120.8" font-family="Helvetica,sans-Serif" font-size="16.00">Examples</text>
|
||||||
|
</g>
|
||||||
|
<!-- config_json -->
|
||||||
|
<g id="node1" class="node">
|
||||||
|
<title>config_json</title>
|
||||||
|
<path fill="#c8e6c9" stroke="black" d="M1833.5,-97.75C1833.5,-97.75 1694.5,-97.75 1694.5,-97.75 1688.5,-97.75 1682.5,-91.75 1682.5,-85.75 1682.5,-85.75 1682.5,-34.75 1682.5,-34.75 1682.5,-28.75 1688.5,-22.75 1694.5,-22.75 1694.5,-22.75 1833.5,-22.75 1833.5,-22.75 1839.5,-22.75 1845.5,-28.75 1845.5,-34.75 1845.5,-34.75 1845.5,-85.75 1845.5,-85.75 1845.5,-91.75 1839.5,-97.75 1833.5,-97.75"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="1764" y="-83.3" font-family="Helvetica,sans-Serif" font-size="11.00">config.json</text>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="1764" y="-56.8" font-family="Helvetica,sans-Serif" font-size="11.00">Framework branding</text>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="1764" y="-43.3" font-family="Helvetica,sans-Serif" font-size="11.00">Terminology customization</text>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="1764" y="-29.8" font-family="Helvetica,sans-Serif" font-size="11.00">(can rebrand soleprint)</text>
|
||||||
|
</g>
|
||||||
|
<!-- veins_json -->
|
||||||
|
<g id="node2" class="node">
|
||||||
|
<title>veins_json</title>
|
||||||
|
<path fill="#aed581" stroke="black" d="M83.75,-78.25C83.75,-78.25 36.25,-78.25 36.25,-78.25 30.25,-78.25 24.25,-72.25 24.25,-66.25 24.25,-66.25 24.25,-54.25 24.25,-54.25 24.25,-48.25 30.25,-42.25 36.25,-42.25 36.25,-42.25 83.75,-42.25 83.75,-42.25 89.75,-42.25 95.75,-48.25 95.75,-54.25 95.75,-54.25 95.75,-66.25 95.75,-66.25 95.75,-72.25 89.75,-78.25 83.75,-78.25"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="60" y="-56.55" font-family="Helvetica,sans-Serif" font-size="11.00">veins.json</text>
|
||||||
|
</g>
|
||||||
|
<!-- shunts_json -->
|
||||||
|
<g id="node3" class="node">
|
||||||
|
<title>shunts_json</title>
|
||||||
|
<path fill="#aed581" stroke="black" d="M180.5,-78.25C180.5,-78.25 125.5,-78.25 125.5,-78.25 119.5,-78.25 113.5,-72.25 113.5,-66.25 113.5,-66.25 113.5,-54.25 113.5,-54.25 113.5,-48.25 119.5,-42.25 125.5,-42.25 125.5,-42.25 180.5,-42.25 180.5,-42.25 186.5,-42.25 192.5,-48.25 192.5,-54.25 192.5,-54.25 192.5,-66.25 192.5,-66.25 192.5,-72.25 186.5,-78.25 180.5,-78.25"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="153" y="-56.55" font-family="Helvetica,sans-Serif" font-size="11.00">shunts.json</text>
|
||||||
|
</g>
|
||||||
|
<!-- depots_json -->
|
||||||
|
<g id="node4" class="node">
|
||||||
|
<title>depots_json</title>
|
||||||
|
<path fill="#aed581" stroke="black" d="M277.88,-78.25C277.88,-78.25 222.12,-78.25 222.12,-78.25 216.12,-78.25 210.12,-72.25 210.12,-66.25 210.12,-66.25 210.12,-54.25 210.12,-54.25 210.12,-48.25 216.12,-42.25 222.12,-42.25 222.12,-42.25 277.88,-42.25 277.88,-42.25 283.88,-42.25 289.88,-48.25 289.88,-54.25 289.88,-54.25 289.88,-66.25 289.88,-66.25 289.88,-72.25 283.88,-78.25 277.88,-78.25"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="250" y="-56.55" font-family="Helvetica,sans-Serif" font-size="11.00">depots.json</text>
|
||||||
|
</g>
|
||||||
|
<!-- rooms_json -->
|
||||||
|
<g id="node5" class="node">
|
||||||
|
<title>rooms_json</title>
|
||||||
|
<path fill="#aed581" stroke="black" d="M372.38,-78.25C372.38,-78.25 319.62,-78.25 319.62,-78.25 313.62,-78.25 307.62,-72.25 307.62,-66.25 307.62,-66.25 307.62,-54.25 307.62,-54.25 307.62,-48.25 313.62,-42.25 319.62,-42.25 319.62,-42.25 372.38,-42.25 372.38,-42.25 378.38,-42.25 384.38,-48.25 384.38,-54.25 384.38,-54.25 384.38,-66.25 384.38,-66.25 384.38,-72.25 378.38,-78.25 372.38,-78.25"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="346" y="-56.55" font-family="Helvetica,sans-Serif" font-size="11.00">rooms.json</text>
|
||||||
|
</g>
|
||||||
|
<!-- docker_compose -->
|
||||||
|
<g id="node6" class="node">
|
||||||
|
<title>docker_compose</title>
|
||||||
|
<path fill="#ffe082" stroke="black" d="M525.62,-78.25C525.62,-78.25 420.38,-78.25 420.38,-78.25 414.38,-78.25 408.38,-72.25 408.38,-66.25 408.38,-66.25 408.38,-54.25 408.38,-54.25 408.38,-48.25 414.38,-42.25 420.38,-42.25 420.38,-42.25 525.62,-42.25 525.62,-42.25 531.62,-42.25 537.62,-48.25 537.62,-54.25 537.62,-54.25 537.62,-66.25 537.62,-66.25 537.62,-72.25 531.62,-78.25 525.62,-78.25"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="473" y="-56.55" font-family="Helvetica,sans-Serif" font-size="11.00">docker-compose.yml</text>
|
||||||
|
</g>
|
||||||
|
<!-- dockerfile_be -->
|
||||||
|
<g id="node7" class="node">
|
||||||
|
<title>dockerfile_be</title>
|
||||||
|
<path fill="#ffe082" stroke="black" d="M664.12,-78.25C664.12,-78.25 567.88,-78.25 567.88,-78.25 561.88,-78.25 555.88,-72.25 555.88,-66.25 555.88,-66.25 555.88,-54.25 555.88,-54.25 555.88,-48.25 561.88,-42.25 567.88,-42.25 567.88,-42.25 664.12,-42.25 664.12,-42.25 670.12,-42.25 676.12,-48.25 676.12,-54.25 676.12,-54.25 676.12,-66.25 676.12,-66.25 676.12,-72.25 670.12,-78.25 664.12,-78.25"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="616" y="-56.55" font-family="Helvetica,sans-Serif" font-size="11.00">Dockerfile.backend</text>
|
||||||
|
</g>
|
||||||
|
<!-- dockerfile_fe -->
|
||||||
|
<g id="node8" class="node">
|
||||||
|
<title>dockerfile_fe</title>
|
||||||
|
<path fill="#ffe082" stroke="black" d="M803.5,-78.25C803.5,-78.25 706.5,-78.25 706.5,-78.25 700.5,-78.25 694.5,-72.25 694.5,-66.25 694.5,-66.25 694.5,-54.25 694.5,-54.25 694.5,-48.25 700.5,-42.25 706.5,-42.25 706.5,-42.25 803.5,-42.25 803.5,-42.25 809.5,-42.25 815.5,-48.25 815.5,-54.25 815.5,-54.25 815.5,-66.25 815.5,-66.25 815.5,-72.25 809.5,-78.25 803.5,-78.25"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="755" y="-56.55" font-family="Helvetica,sans-Serif" font-size="11.00">Dockerfile.frontend</text>
|
||||||
|
</g>
|
||||||
|
<!-- env_example -->
|
||||||
|
<g id="node9" class="node">
|
||||||
|
<title>env_example</title>
|
||||||
|
<path fill="#ffe082" stroke="black" d="M912.12,-78.25C912.12,-78.25 845.88,-78.25 845.88,-78.25 839.88,-78.25 833.88,-72.25 833.88,-66.25 833.88,-66.25 833.88,-54.25 833.88,-54.25 833.88,-48.25 839.88,-42.25 845.88,-42.25 845.88,-42.25 912.12,-42.25 912.12,-42.25 918.12,-42.25 924.12,-48.25 924.12,-54.25 924.12,-54.25 924.12,-66.25 924.12,-66.25 924.12,-72.25 918.12,-78.25 912.12,-78.25"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="879" y="-56.55" font-family="Helvetica,sans-Serif" font-size="11.00">.env.example</text>
|
||||||
|
</g>
|
||||||
|
<!-- spr_compose -->
|
||||||
|
<g id="node10" class="node">
|
||||||
|
<title>spr_compose</title>
|
||||||
|
<path fill="#ce93d8" stroke="black" d="M1084,-78.25C1084,-78.25 960,-78.25 960,-78.25 954,-78.25 948,-72.25 948,-66.25 948,-66.25 948,-54.25 948,-54.25 948,-48.25 954,-42.25 960,-42.25 960,-42.25 1084,-42.25 1084,-42.25 1090,-42.25 1096,-48.25 1096,-54.25 1096,-54.25 1096,-66.25 1096,-66.25 1096,-72.25 1090,-78.25 1084,-78.25"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="1022" y="-63.3" font-family="Helvetica,sans-Serif" font-size="11.00">docker-compose.yml</text>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="1022" y="-49.8" font-family="Helvetica,sans-Serif" font-size="11.00">(soleprint for this room)</text>
|
||||||
|
</g>
|
||||||
|
<!-- spr_env -->
|
||||||
|
<g id="node11" class="node">
|
||||||
|
<title>spr_env</title>
|
||||||
|
<path fill="#ce93d8" stroke="black" d="M1156,-78.25C1156,-78.25 1126,-78.25 1126,-78.25 1120,-78.25 1114,-72.25 1114,-66.25 1114,-66.25 1114,-54.25 1114,-54.25 1114,-48.25 1120,-42.25 1126,-42.25 1126,-42.25 1156,-42.25 1156,-42.25 1162,-42.25 1168,-48.25 1168,-54.25 1168,-54.25 1168,-66.25 1168,-66.25 1168,-72.25 1162,-78.25 1156,-78.25"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="1141" y="-56.55" font-family="Helvetica,sans-Serif" font-size="11.00">.env</text>
|
||||||
|
</g>
|
||||||
|
<!-- databrowse -->
|
||||||
|
<g id="node12" class="node">
|
||||||
|
<title>databrowse</title>
|
||||||
|
<path fill="#80deea" stroke="black" d="M1299.75,-78.25C1299.75,-78.25 1204.25,-78.25 1204.25,-78.25 1198.25,-78.25 1192.25,-72.25 1192.25,-66.25 1192.25,-66.25 1192.25,-54.25 1192.25,-54.25 1192.25,-48.25 1198.25,-42.25 1204.25,-42.25 1204.25,-42.25 1299.75,-42.25 1299.75,-42.25 1305.75,-42.25 1311.75,-48.25 1311.75,-54.25 1311.75,-54.25 1311.75,-66.25 1311.75,-66.25 1311.75,-72.25 1305.75,-78.25 1299.75,-78.25"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="1252" y="-63.3" font-family="Helvetica,sans-Serif" font-size="11.00">databrowse/depot/</text>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="1252" y="-49.8" font-family="Helvetica,sans-Serif" font-size="11.00">(DB schema)</text>
|
||||||
|
</g>
|
||||||
|
<!-- tester -->
|
||||||
|
<g id="node13" class="node">
|
||||||
|
<title>tester</title>
|
||||||
|
<path fill="#80deea" stroke="black" d="M1406,-78.25C1406,-78.25 1342,-78.25 1342,-78.25 1336,-78.25 1330,-72.25 1330,-66.25 1330,-66.25 1330,-54.25 1330,-54.25 1330,-48.25 1336,-42.25 1342,-42.25 1342,-42.25 1406,-42.25 1406,-42.25 1412,-42.25 1418,-48.25 1418,-54.25 1418,-54.25 1418,-66.25 1418,-66.25 1418,-72.25 1412,-78.25 1406,-78.25"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="1374" y="-63.3" font-family="Helvetica,sans-Serif" font-size="11.00">tester/tests/</text>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="1374" y="-49.8" font-family="Helvetica,sans-Serif" font-size="11.00">(Room tests)</text>
|
||||||
|
</g>
|
||||||
|
<!-- monitors -->
|
||||||
|
<g id="node14" class="node">
|
||||||
|
<title>monitors</title>
|
||||||
|
<path fill="#80deea" stroke="black" d="M1533.5,-78.25C1533.5,-78.25 1448.5,-78.25 1448.5,-78.25 1442.5,-78.25 1436.5,-72.25 1436.5,-66.25 1436.5,-66.25 1436.5,-54.25 1436.5,-54.25 1436.5,-48.25 1442.5,-42.25 1448.5,-42.25 1448.5,-42.25 1533.5,-42.25 1533.5,-42.25 1539.5,-42.25 1545.5,-48.25 1545.5,-54.25 1545.5,-54.25 1545.5,-66.25 1545.5,-66.25 1545.5,-72.25 1539.5,-78.25 1533.5,-78.25"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="1491" y="-63.3" font-family="Helvetica,sans-Serif" font-size="11.00">monitors/</text>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="1491" y="-49.8" font-family="Helvetica,sans-Serif" font-size="11.00">(Room monitors)</text>
|
||||||
|
</g>
|
||||||
|
<!-- models -->
|
||||||
|
<g id="node15" class="node">
|
||||||
|
<title>models</title>
|
||||||
|
<path fill="#80deea" stroke="black" d="M1652,-78.25C1652,-78.25 1576,-78.25 1576,-78.25 1570,-78.25 1564,-72.25 1564,-66.25 1564,-66.25 1564,-54.25 1564,-54.25 1564,-48.25 1570,-42.25 1576,-42.25 1576,-42.25 1652,-42.25 1652,-42.25 1658,-42.25 1664,-48.25 1664,-54.25 1664,-54.25 1664,-66.25 1664,-66.25 1664,-72.25 1658,-78.25 1652,-78.25"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="1614" y="-63.3" font-family="Helvetica,sans-Serif" font-size="11.00">models/</text>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="1614" y="-49.8" font-family="Helvetica,sans-Serif" font-size="11.00">(Room models)</text>
|
||||||
|
</g>
|
||||||
|
<!-- standalone -->
|
||||||
|
<g id="node16" class="node">
|
||||||
|
<title>standalone</title>
|
||||||
|
<path fill="#f5f5f5" stroke="black" d="M1982,-97.75C1982,-97.75 1882,-97.75 1882,-97.75 1876,-97.75 1870,-91.75 1870,-85.75 1870,-85.75 1870,-34.75 1870,-34.75 1870,-28.75 1876,-22.75 1882,-22.75 1882,-22.75 1982,-22.75 1982,-22.75 1988,-22.75 1994,-28.75 1994,-34.75 1994,-34.75 1994,-85.75 1994,-85.75 1994,-91.75 1988,-97.75 1982,-97.75"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="1932" y="-83.3" font-family="Helvetica,sans-Serif" font-size="11.00">cfg/standalone/</text>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="1932" y="-56.8" font-family="Helvetica,sans-Serif" font-size="11.00">Base soleprint</text>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="1932" y="-43.3" font-family="Helvetica,sans-Serif" font-size="11.00">Generic veins</text>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="1932" y="-29.8" font-family="Helvetica,sans-Serif" font-size="11.00">No docker-compose</text>
|
||||||
|
</g>
|
||||||
|
<!-- amar -->
|
||||||
|
<g id="node17" class="node">
|
||||||
|
<title>amar</title>
|
||||||
|
<path fill="#f5f5f5" stroke="black" d="M2176.25,-104.5C2176.25,-104.5 2023.75,-104.5 2023.75,-104.5 2017.75,-104.5 2011.75,-98.5 2011.75,-92.5 2011.75,-92.5 2011.75,-28 2011.75,-28 2011.75,-22 2017.75,-16 2023.75,-16 2023.75,-16 2176.25,-16 2176.25,-16 2182.25,-16 2188.25,-22 2188.25,-28 2188.25,-28 2188.25,-92.5 2188.25,-92.5 2188.25,-98.5 2182.25,-104.5 2176.25,-104.5"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="2100" y="-90.05" font-family="Helvetica,sans-Serif" font-size="11.00">cfg/amar/</text>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="2100" y="-63.55" font-family="Helvetica,sans-Serif" font-size="11.00">AMAR veterinary app</text>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="2100" y="-50.05" font-family="Helvetica,sans-Serif" font-size="11.00">amar + mercadopago shunts</text>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="2100" y="-36.55" font-family="Helvetica,sans-Serif" font-size="11.00">Full Docker setup</text>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="2100" y="-23.05" font-family="Helvetica,sans-Serif" font-size="11.00">Custom monitors (turnos)</text>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 15 KiB |
115
docs/architecture/graph.html
Normal file
@@ -0,0 +1,115 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8" />
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
|
<title>Graph Viewer - Soleprint</title>
|
||||||
|
<link rel="stylesheet" href="styles.css" />
|
||||||
|
</head>
|
||||||
|
<body class="graph-viewer">
|
||||||
|
<header class="graph-header">
|
||||||
|
<a href="index.html" class="back-link">← Back</a>
|
||||||
|
<div class="nav-controls">
|
||||||
|
<button onclick="navigate(-1)" id="btn-prev" title="Previous">◀</button>
|
||||||
|
<span id="nav-position">1 / 4</span>
|
||||||
|
<button onclick="navigate(1)" id="btn-next" title="Next">▶</button>
|
||||||
|
</div>
|
||||||
|
<h1 id="graph-title">Loading...</h1>
|
||||||
|
<div class="graph-controls">
|
||||||
|
<button onclick="setMode('fit')">Fit</button>
|
||||||
|
<button onclick="setMode('fit-width')">Width</button>
|
||||||
|
<button onclick="setMode('fit-height')">Height</button>
|
||||||
|
<button onclick="setMode('actual-size')">100%</button>
|
||||||
|
<button onclick="downloadSvg()">↓ SVG</button>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<div class="graph-container" id="graph-container">
|
||||||
|
<img id="graph-img" src="" alt="Graph" />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
const graphOrder = [
|
||||||
|
"01-system-overview",
|
||||||
|
"02-artery-hierarchy",
|
||||||
|
"03-build-flow",
|
||||||
|
"04-room-config",
|
||||||
|
];
|
||||||
|
|
||||||
|
const graphs = {
|
||||||
|
"01-system-overview": {
|
||||||
|
title: "System Overview",
|
||||||
|
file: "01-system-overview.svg",
|
||||||
|
},
|
||||||
|
"02-artery-hierarchy": {
|
||||||
|
title: "Artery Hierarchy",
|
||||||
|
file: "02-artery-hierarchy.svg",
|
||||||
|
},
|
||||||
|
"03-build-flow": {
|
||||||
|
title: "Build Flow",
|
||||||
|
file: "03-build-flow.svg",
|
||||||
|
},
|
||||||
|
"04-room-config": {
|
||||||
|
title: "Room Configuration",
|
||||||
|
file: "04-room-config.svg",
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
const params = new URLSearchParams(window.location.search);
|
||||||
|
let graphKey = params.get("g") || "01-system-overview";
|
||||||
|
let currentIndex = graphOrder.indexOf(graphKey);
|
||||||
|
if (currentIndex === -1) currentIndex = 0;
|
||||||
|
|
||||||
|
function loadGraph(key) {
|
||||||
|
const graph = graphs[key];
|
||||||
|
document.getElementById("graph-title").textContent = graph.title;
|
||||||
|
document.getElementById("graph-img").src = graph.file;
|
||||||
|
document.title = graph.title + " - Soleprint";
|
||||||
|
history.replaceState(null, "", "?g=" + key);
|
||||||
|
graphKey = key;
|
||||||
|
updateNavHints();
|
||||||
|
}
|
||||||
|
|
||||||
|
function updateNavHints() {
|
||||||
|
const idx = graphOrder.indexOf(graphKey);
|
||||||
|
const prevBtn = document.getElementById("btn-prev");
|
||||||
|
const nextBtn = document.getElementById("btn-next");
|
||||||
|
prevBtn.disabled = idx === 0;
|
||||||
|
nextBtn.disabled = idx === graphOrder.length - 1;
|
||||||
|
document.getElementById("nav-position").textContent =
|
||||||
|
idx + 1 + " / " + graphOrder.length;
|
||||||
|
}
|
||||||
|
|
||||||
|
function navigate(direction) {
|
||||||
|
const idx = graphOrder.indexOf(graphKey);
|
||||||
|
const newIdx = idx + direction;
|
||||||
|
if (newIdx >= 0 && newIdx < graphOrder.length) {
|
||||||
|
currentIndex = newIdx;
|
||||||
|
loadGraph(graphOrder[newIdx]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function setMode(mode) {
|
||||||
|
const container = document.getElementById("graph-container");
|
||||||
|
container.className = "graph-container " + mode;
|
||||||
|
}
|
||||||
|
|
||||||
|
function downloadSvg() {
|
||||||
|
const graph = graphs[graphKey];
|
||||||
|
const link = document.createElement("a");
|
||||||
|
link.href = graph.file;
|
||||||
|
link.download = graph.file;
|
||||||
|
link.click();
|
||||||
|
}
|
||||||
|
|
||||||
|
document.addEventListener("keydown", (e) => {
|
||||||
|
if (e.key === "ArrowLeft") navigate(-1);
|
||||||
|
else if (e.key === "ArrowRight") navigate(1);
|
||||||
|
else if (e.key === "Escape") window.location.href = "index.html";
|
||||||
|
});
|
||||||
|
|
||||||
|
loadGraph(graphOrder[currentIndex]);
|
||||||
|
setMode("fit");
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
206
docs/architecture/index.html
Normal file
@@ -0,0 +1,206 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8" />
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
|
<title>Soleprint - Architecture</title>
|
||||||
|
<link rel="stylesheet" href="styles.css" />
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<header>
|
||||||
|
<h1>Soleprint</h1>
|
||||||
|
<p class="subtitle">Cada paso deja huella / Each step leaves a mark</p>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<main>
|
||||||
|
<!-- What it solves -->
|
||||||
|
<section class="findings-section">
|
||||||
|
<h2>What Soleprint Solves</h2>
|
||||||
|
<div class="findings-grid">
|
||||||
|
<article class="finding-card">
|
||||||
|
<h3>Freelance Work Standardization</h3>
|
||||||
|
<p>Generalizing and homogenizing freelance work across projects. Instead of setting up different environments, testing approaches, and connector patterns for each client, Soleprint provides a consistent framework. Build once, reuse everywhere.</p>
|
||||||
|
</article>
|
||||||
|
<article class="finding-card">
|
||||||
|
<h3>Missing Infrastructure Replication</h3>
|
||||||
|
<p>When working with large corps where you can't access their Jira, Slack, payment systems, or internal APIs directly - Soleprint's shunts let you mock those systems locally. Test against fake MercadoPago, fake Jira tickets, fake webhooks without needing real credentials.</p>
|
||||||
|
</article>
|
||||||
|
<article class="finding-card">
|
||||||
|
<h3>Reliable Testing Environment</h3>
|
||||||
|
<p>Figure out what tests to write by actually running flows in a controlled environment. BDD -> Gherkin -> Tests workflow. Instead of guessing what to test, you explore the actual behavior first, document it, then generate tests from that documentation.</p>
|
||||||
|
</article>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<!-- System Overview -->
|
||||||
|
<section class="graph-section" id="overview">
|
||||||
|
<div class="graph-header-row">
|
||||||
|
<h2>System Overview</h2>
|
||||||
|
<a href="graph.html?g=01-system-overview" class="view-btn">View Full</a>
|
||||||
|
</div>
|
||||||
|
<a href="graph.html?g=01-system-overview" class="graph-preview">
|
||||||
|
<img src="01-system-overview.svg" alt="System Overview" />
|
||||||
|
</a>
|
||||||
|
<div class="graph-details">
|
||||||
|
<p>The four systems that make up Soleprint.</p>
|
||||||
|
<h4>Systems</h4>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Soleprint</strong>: Core coordinator hub (port 12000)</li>
|
||||||
|
<li><strong>Artery</strong>: Connectors to external services - "Todo lo vital"</li>
|
||||||
|
<li><strong>Atlas</strong>: Actionable documentation - "Documentacion accionable"</li>
|
||||||
|
<li><strong>Station</strong>: Tools and monitors - "Centro de control"</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<!-- Artery Hierarchy -->
|
||||||
|
<section class="graph-section" id="artery">
|
||||||
|
<div class="graph-header-row">
|
||||||
|
<h2>Artery Hierarchy</h2>
|
||||||
|
<a href="graph.html?g=02-artery-hierarchy" class="view-btn">View Full</a>
|
||||||
|
</div>
|
||||||
|
<a href="graph.html?g=02-artery-hierarchy" class="graph-preview">
|
||||||
|
<img src="02-artery-hierarchy.svg" alt="Artery Hierarchy" />
|
||||||
|
</a>
|
||||||
|
<div class="graph-details">
|
||||||
|
<p>How connectors evolve from simple to complex.</p>
|
||||||
|
<h4>Connector Types</h4>
|
||||||
|
<table class="details-table">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Type</th>
|
||||||
|
<th>Description</th>
|
||||||
|
<th>Example</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>Vein</td>
|
||||||
|
<td>Stateless API connector</td>
|
||||||
|
<td>Jira, Slack, Google</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Shunt</td>
|
||||||
|
<td>Fake connector for testing</td>
|
||||||
|
<td>MercadoPago mock</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Pulse</td>
|
||||||
|
<td>Vein + Room + Depot</td>
|
||||||
|
<td>Jira for AMAR project</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Plexus</td>
|
||||||
|
<td>Full app (backend + frontend + DB)</td>
|
||||||
|
<td>WhatsApp with chat UI</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<!-- Build Flow -->
|
||||||
|
<section class="graph-section" id="build">
|
||||||
|
<div class="graph-header-row">
|
||||||
|
<h2>Build Flow</h2>
|
||||||
|
<a href="graph.html?g=03-build-flow" class="view-btn">View Full</a>
|
||||||
|
</div>
|
||||||
|
<a href="graph.html?g=03-build-flow" class="graph-preview">
|
||||||
|
<img src="03-build-flow.svg" alt="Build Flow" />
|
||||||
|
</a>
|
||||||
|
<div class="graph-details">
|
||||||
|
<p>How source is built into runnable instances.</p>
|
||||||
|
<h4>Commands</h4>
|
||||||
|
<table class="details-table">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Command</th>
|
||||||
|
<th>Output</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td><code>python build.py dev</code></td>
|
||||||
|
<td>gen/standalone/</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><code>python build.py dev --cfg amar</code></td>
|
||||||
|
<td>gen/amar/</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><code>python build.py dev --all</code></td>
|
||||||
|
<td>both</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<!-- Room Config -->
|
||||||
|
<section class="graph-section" id="room">
|
||||||
|
<div class="graph-header-row">
|
||||||
|
<h2>Room Configuration</h2>
|
||||||
|
<a href="graph.html?g=04-room-config" class="view-btn">View Full</a>
|
||||||
|
</div>
|
||||||
|
<a href="graph.html?g=04-room-config" class="graph-preview">
|
||||||
|
<img src="04-room-config.svg" alt="Room Configuration" />
|
||||||
|
</a>
|
||||||
|
<div class="graph-details">
|
||||||
|
<p>How rooms are configured in cfg/.</p>
|
||||||
|
<h4>Room Structure</h4>
|
||||||
|
<ul>
|
||||||
|
<li><strong>config.json</strong>: Framework branding, terminology</li>
|
||||||
|
<li><strong>data/</strong>: veins.json, shunts.json, depots.json</li>
|
||||||
|
<li><strong>soleprint/</strong>: Docker config for this room</li>
|
||||||
|
<li><strong>databrowse/, tester/, monitors/, models/</strong>: Room-specific extensions</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<!-- Tech Stack -->
|
||||||
|
<section class="tech-section">
|
||||||
|
<h2>Technology Stack</h2>
|
||||||
|
<div class="tech-grid">
|
||||||
|
<div class="tech-column">
|
||||||
|
<h3>Core</h3>
|
||||||
|
<ul>
|
||||||
|
<li>Python 3.11+</li>
|
||||||
|
<li>FastAPI</li>
|
||||||
|
<li>Jinja2</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="tech-column">
|
||||||
|
<h3>Tools</h3>
|
||||||
|
<ul>
|
||||||
|
<li>modelgen</li>
|
||||||
|
<li>tester (Playwright)</li>
|
||||||
|
<li>datagen</li>
|
||||||
|
<li>databrowse</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="tech-column">
|
||||||
|
<h3>Veins</h3>
|
||||||
|
<ul>
|
||||||
|
<li>Jira</li>
|
||||||
|
<li>Slack</li>
|
||||||
|
<li>Google (OAuth)</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="tech-column">
|
||||||
|
<h3>Infrastructure</h3>
|
||||||
|
<ul>
|
||||||
|
<li>Docker</li>
|
||||||
|
<li>Woodpecker CI</li>
|
||||||
|
<li>Nginx</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</main>
|
||||||
|
|
||||||
|
<footer>
|
||||||
|
<p>Soleprint - Development Workflow Platform</p>
|
||||||
|
<p class="date">Generated: <time datetime="2025-01">January 2025</time></p>
|
||||||
|
</footer>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
343
docs/architecture/styles.css
Normal file
@@ -0,0 +1,343 @@
|
|||||||
|
:root {
|
||||||
|
--bg-primary: #1a1a2e;
|
||||||
|
--bg-secondary: #16213e;
|
||||||
|
--bg-card: #0f3460;
|
||||||
|
--text-primary: #eee;
|
||||||
|
--text-secondary: #a0a0a0;
|
||||||
|
--accent: #e94560;
|
||||||
|
--accent-secondary: #533483;
|
||||||
|
--border: #2a2a4a;
|
||||||
|
}
|
||||||
|
|
||||||
|
* {
|
||||||
|
box-sizing: border-box;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
font-family: 'Segoe UI', system-ui, -apple-system, sans-serif;
|
||||||
|
background: var(--bg-primary);
|
||||||
|
color: var(--text-primary);
|
||||||
|
line-height: 1.6;
|
||||||
|
}
|
||||||
|
|
||||||
|
header {
|
||||||
|
background: linear-gradient(135deg, var(--bg-secondary), var(--accent-secondary));
|
||||||
|
padding: 2rem;
|
||||||
|
text-align: center;
|
||||||
|
border-bottom: 2px solid var(--accent);
|
||||||
|
}
|
||||||
|
|
||||||
|
header h1 {
|
||||||
|
font-size: 2rem;
|
||||||
|
margin-bottom: 0.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
header .subtitle {
|
||||||
|
color: var(--text-secondary);
|
||||||
|
font-size: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
main {
|
||||||
|
max-width: 1400px;
|
||||||
|
margin: 0 auto;
|
||||||
|
padding: 2rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Graph sections */
|
||||||
|
.graph-section {
|
||||||
|
background: var(--bg-secondary);
|
||||||
|
border-radius: 8px;
|
||||||
|
padding: 1.5rem;
|
||||||
|
margin-bottom: 2rem;
|
||||||
|
border: 1px solid var(--border);
|
||||||
|
}
|
||||||
|
|
||||||
|
.graph-header-row {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: center;
|
||||||
|
margin-bottom: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.graph-header-row h2 {
|
||||||
|
font-size: 1.25rem;
|
||||||
|
color: var(--accent);
|
||||||
|
}
|
||||||
|
|
||||||
|
.view-btn {
|
||||||
|
background: var(--accent);
|
||||||
|
color: white;
|
||||||
|
padding: 0.5rem 1rem;
|
||||||
|
border-radius: 4px;
|
||||||
|
text-decoration: none;
|
||||||
|
font-size: 0.875rem;
|
||||||
|
transition: opacity 0.2s;
|
||||||
|
}
|
||||||
|
|
||||||
|
.view-btn:hover {
|
||||||
|
opacity: 0.8;
|
||||||
|
}
|
||||||
|
|
||||||
|
.graph-preview {
|
||||||
|
display: block;
|
||||||
|
background: white;
|
||||||
|
border-radius: 4px;
|
||||||
|
padding: 1rem;
|
||||||
|
margin-bottom: 1rem;
|
||||||
|
overflow: auto;
|
||||||
|
max-height: 400px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.graph-preview img {
|
||||||
|
max-width: 100%;
|
||||||
|
height: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.graph-details {
|
||||||
|
color: var(--text-secondary);
|
||||||
|
font-size: 0.9rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.graph-details h4 {
|
||||||
|
color: var(--text-primary);
|
||||||
|
margin: 1rem 0 0.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.graph-details ul {
|
||||||
|
margin-left: 1.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.graph-details li {
|
||||||
|
margin-bottom: 0.25rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Tech section */
|
||||||
|
.tech-section {
|
||||||
|
background: var(--bg-secondary);
|
||||||
|
border-radius: 8px;
|
||||||
|
padding: 1.5rem;
|
||||||
|
margin-bottom: 2rem;
|
||||||
|
border: 1px solid var(--border);
|
||||||
|
}
|
||||||
|
|
||||||
|
.tech-section h2 {
|
||||||
|
color: var(--accent);
|
||||||
|
margin-bottom: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tech-grid {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
|
||||||
|
gap: 1.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tech-column h3 {
|
||||||
|
color: var(--text-primary);
|
||||||
|
font-size: 1rem;
|
||||||
|
margin-bottom: 0.75rem;
|
||||||
|
padding-bottom: 0.5rem;
|
||||||
|
border-bottom: 1px solid var(--border);
|
||||||
|
}
|
||||||
|
|
||||||
|
.tech-column ul {
|
||||||
|
list-style: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tech-column li {
|
||||||
|
padding: 0.25rem 0;
|
||||||
|
color: var(--text-secondary);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Findings */
|
||||||
|
.findings-section {
|
||||||
|
margin-bottom: 2rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.findings-section h2 {
|
||||||
|
color: var(--accent);
|
||||||
|
margin-bottom: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.findings-grid {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
|
||||||
|
gap: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.finding-card {
|
||||||
|
background: var(--bg-secondary);
|
||||||
|
border-radius: 8px;
|
||||||
|
padding: 1.25rem;
|
||||||
|
border: 1px solid var(--border);
|
||||||
|
}
|
||||||
|
|
||||||
|
.finding-card h3 {
|
||||||
|
color: var(--accent);
|
||||||
|
font-size: 1rem;
|
||||||
|
margin-bottom: 0.75rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.finding-card ul {
|
||||||
|
margin-left: 1rem;
|
||||||
|
color: var(--text-secondary);
|
||||||
|
}
|
||||||
|
|
||||||
|
.finding-card code {
|
||||||
|
background: var(--bg-primary);
|
||||||
|
padding: 0.125rem 0.375rem;
|
||||||
|
border-radius: 3px;
|
||||||
|
font-size: 0.85em;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Footer */
|
||||||
|
footer {
|
||||||
|
text-align: center;
|
||||||
|
padding: 2rem;
|
||||||
|
color: var(--text-secondary);
|
||||||
|
border-top: 1px solid var(--border);
|
||||||
|
}
|
||||||
|
|
||||||
|
footer .date {
|
||||||
|
font-size: 0.85rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Graph viewer page */
|
||||||
|
body.graph-viewer {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
height: 100vh;
|
||||||
|
}
|
||||||
|
|
||||||
|
.graph-header {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 1rem;
|
||||||
|
padding: 0.75rem 1rem;
|
||||||
|
background: var(--bg-secondary);
|
||||||
|
border-bottom: 1px solid var(--border);
|
||||||
|
flex-wrap: wrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
.back-link {
|
||||||
|
color: var(--accent);
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-controls {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 0.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-controls button {
|
||||||
|
background: var(--bg-card);
|
||||||
|
color: var(--text-primary);
|
||||||
|
border: 1px solid var(--border);
|
||||||
|
padding: 0.25rem 0.75rem;
|
||||||
|
border-radius: 4px;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-controls button:disabled {
|
||||||
|
opacity: 0.3;
|
||||||
|
cursor: not-allowed;
|
||||||
|
}
|
||||||
|
|
||||||
|
#nav-position {
|
||||||
|
color: var(--text-secondary);
|
||||||
|
font-size: 0.85rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.graph-header h1 {
|
||||||
|
flex: 1;
|
||||||
|
font-size: 1rem;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.graph-controls {
|
||||||
|
display: flex;
|
||||||
|
gap: 0.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.graph-controls button {
|
||||||
|
background: var(--bg-card);
|
||||||
|
color: var(--text-primary);
|
||||||
|
border: 1px solid var(--border);
|
||||||
|
padding: 0.375rem 0.75rem;
|
||||||
|
border-radius: 4px;
|
||||||
|
cursor: pointer;
|
||||||
|
font-size: 0.85rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.graph-controls button:hover {
|
||||||
|
background: var(--accent);
|
||||||
|
}
|
||||||
|
|
||||||
|
.graph-container {
|
||||||
|
flex: 1;
|
||||||
|
overflow: auto;
|
||||||
|
background: white;
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: flex-start;
|
||||||
|
padding: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.graph-container.fit img {
|
||||||
|
max-width: 100%;
|
||||||
|
max-height: calc(100vh - 60px);
|
||||||
|
object-fit: contain;
|
||||||
|
}
|
||||||
|
|
||||||
|
.graph-container.fit-width img {
|
||||||
|
width: 100%;
|
||||||
|
height: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.graph-container.fit-height img {
|
||||||
|
height: calc(100vh - 60px);
|
||||||
|
width: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.graph-container.actual-size img {
|
||||||
|
/* No constraints */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Tables */
|
||||||
|
.details-table {
|
||||||
|
width: 100%;
|
||||||
|
border-collapse: collapse;
|
||||||
|
margin: 1rem 0;
|
||||||
|
font-size: 0.85rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.details-table th,
|
||||||
|
.details-table td {
|
||||||
|
padding: 0.5rem;
|
||||||
|
text-align: left;
|
||||||
|
border-bottom: 1px solid var(--border);
|
||||||
|
}
|
||||||
|
|
||||||
|
.details-table th {
|
||||||
|
color: var(--text-primary);
|
||||||
|
background: var(--bg-primary);
|
||||||
|
}
|
||||||
|
|
||||||
|
.details-table td {
|
||||||
|
color: var(--text-secondary);
|
||||||
|
}
|
||||||
|
|
||||||
|
.details-table code {
|
||||||
|
background: var(--bg-primary);
|
||||||
|
padding: 0.125rem 0.375rem;
|
||||||
|
border-radius: 3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.note {
|
||||||
|
font-style: italic;
|
||||||
|
font-size: 0.85rem;
|
||||||
|
color: var(--text-secondary);
|
||||||
|
margin-top: 0.5rem;
|
||||||
|
}
|
||||||
70
docs/index.html
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8" />
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
|
<title>Soleprint - Documentation</title>
|
||||||
|
<link rel="stylesheet" href="architecture/styles.css" />
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<header>
|
||||||
|
<h1>Soleprint</h1>
|
||||||
|
<p class="subtitle">Cada paso deja huella / Each step leaves a mark</p>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<main>
|
||||||
|
<section class="findings-section">
|
||||||
|
<h2>Documentation</h2>
|
||||||
|
<div class="findings-grid">
|
||||||
|
<a href="architecture/index.html" class="finding-card" style="text-decoration: none;">
|
||||||
|
<h3>Architecture</h3>
|
||||||
|
<p>System overview, connector hierarchy, build flow, and room configuration diagrams.</p>
|
||||||
|
</a>
|
||||||
|
<a href="veins/index.html" class="finding-card" style="text-decoration: none;">
|
||||||
|
<h3>Veins & Shunts</h3>
|
||||||
|
<p>API connectors (Jira, Slack, Google) and mock connectors for testing.</p>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="findings-section">
|
||||||
|
<h2>Quick Start</h2>
|
||||||
|
<div class="finding-card">
|
||||||
|
<h3>Build & Run</h3>
|
||||||
|
<pre style="background: var(--bg-primary); padding: 1rem; border-radius: 4px; overflow-x: auto; margin-top: 0.5rem;">
|
||||||
|
# Build standalone
|
||||||
|
python build.py dev
|
||||||
|
cd gen/standalone && .venv/bin/python run.py
|
||||||
|
|
||||||
|
# Build with room config
|
||||||
|
python build.py dev --cfg amar
|
||||||
|
cd gen/amar && .venv/bin/python run.py
|
||||||
|
|
||||||
|
# Visit http://localhost:12000</pre>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="findings-section">
|
||||||
|
<h2>What Soleprint Solves</h2>
|
||||||
|
<div class="findings-grid">
|
||||||
|
<article class="finding-card">
|
||||||
|
<h3>Freelance Work Standardization</h3>
|
||||||
|
<p>Consistent framework across projects. Build once, reuse everywhere.</p>
|
||||||
|
</article>
|
||||||
|
<article class="finding-card">
|
||||||
|
<h3>Missing Infrastructure</h3>
|
||||||
|
<p>Mock external systems locally when you can't access client infrastructure.</p>
|
||||||
|
</article>
|
||||||
|
<article class="finding-card">
|
||||||
|
<h3>Testing Environment</h3>
|
||||||
|
<p>BDD -> Gherkin -> Tests. Explore behavior first, then generate tests.</p>
|
||||||
|
</article>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</main>
|
||||||
|
|
||||||
|
<footer>
|
||||||
|
<p>Soleprint - Development Workflow Platform</p>
|
||||||
|
</footer>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
61
docs/veins/google.dot
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
digraph GoogleVein {
|
||||||
|
rankdir=LR;
|
||||||
|
compound=true;
|
||||||
|
fontname="Helvetica";
|
||||||
|
node [fontname="Helvetica", fontsize=11, shape=box, style="rounded,filled"];
|
||||||
|
edge [fontname="Helvetica", fontsize=10];
|
||||||
|
|
||||||
|
labelloc="t";
|
||||||
|
label="Google Vein - OAuth Flow";
|
||||||
|
fontsize=16;
|
||||||
|
|
||||||
|
// Client
|
||||||
|
subgraph cluster_client {
|
||||||
|
label="Soleprint";
|
||||||
|
style=filled;
|
||||||
|
color="#E8F5E9";
|
||||||
|
fillcolor="#E8F5E9";
|
||||||
|
|
||||||
|
app [label="Application", fillcolor="#C8E6C9"];
|
||||||
|
vein [label="Google Vein\n(artery/veins/google)", fillcolor="#A5D6A7"];
|
||||||
|
oauth [label="OAuth Handler\n(artery/oauth.py)", fillcolor="#81C784"];
|
||||||
|
}
|
||||||
|
|
||||||
|
// OAuth Flow
|
||||||
|
subgraph cluster_oauth {
|
||||||
|
label="OAuth 2.0";
|
||||||
|
style=filled;
|
||||||
|
color="#FFF8E1";
|
||||||
|
fillcolor="#FFF8E1";
|
||||||
|
|
||||||
|
auth_url [label="1. Authorization URL", fillcolor="#FFECB3"];
|
||||||
|
consent [label="2. User Consent", fillcolor="#FFE082"];
|
||||||
|
callback [label="3. Callback + Code", fillcolor="#FFD54F"];
|
||||||
|
tokens [label="4. Access + Refresh\nTokens", fillcolor="#FFCA28"];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Google APIs
|
||||||
|
subgraph cluster_google {
|
||||||
|
label="Google APIs";
|
||||||
|
style=filled;
|
||||||
|
color="#E3F2FD";
|
||||||
|
fillcolor="#E3F2FD";
|
||||||
|
|
||||||
|
sheets [label="Sheets API", fillcolor="#BBDEFB"];
|
||||||
|
calendar [label="Calendar API", fillcolor="#BBDEFB"];
|
||||||
|
drive [label="Drive API", fillcolor="#BBDEFB"];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Flow
|
||||||
|
app -> vein [label="get_sheets()"];
|
||||||
|
vein -> oauth [label="ensure_auth"];
|
||||||
|
oauth -> auth_url;
|
||||||
|
auth_url -> consent;
|
||||||
|
consent -> callback;
|
||||||
|
callback -> tokens;
|
||||||
|
tokens -> oauth [label="store"];
|
||||||
|
|
||||||
|
oauth -> sheets [label="Bearer token"];
|
||||||
|
oauth -> calendar [label="Bearer token"];
|
||||||
|
oauth -> drive [label="Bearer token"];
|
||||||
|
}
|
||||||
158
docs/veins/google.svg
Normal file
@@ -0,0 +1,158 @@
|
|||||||
|
<?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.1 (0)
|
||||||
|
-->
|
||||||
|
<!-- Title: GoogleVein Pages: 1 -->
|
||||||
|
<svg width="1243pt" height="340pt"
|
||||||
|
viewBox="0.00 0.00 1243.00 340.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 335.5)">
|
||||||
|
<title>GoogleVein</title>
|
||||||
|
<polygon fill="white" stroke="none" points="-4,4 -4,-335.5 1239.25,-335.5 1239.25,4 -4,4"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="617.62" y="-312.3" font-family="Helvetica,sans-Serif" font-size="16.00">Google Vein - OAuth Flow</text>
|
||||||
|
<g id="clust1" class="cluster">
|
||||||
|
<title>cluster_client</title>
|
||||||
|
<polygon fill="#e8f5e9" stroke="#e8f5e9" points="8,-74 8,-154 537,-154 537,-74 8,-74"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="272.5" y="-134.8" font-family="Helvetica,sans-Serif" font-size="16.00">Soleprint</text>
|
||||||
|
</g>
|
||||||
|
<g id="clust2" class="cluster">
|
||||||
|
<title>cluster_oauth</title>
|
||||||
|
<polygon fill="#fff8e1" stroke="#fff8e1" points="619.25,-216 619.25,-296 1227.25,-296 1227.25,-216 619.25,-216"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="923.25" y="-276.8" font-family="Helvetica,sans-Serif" font-size="16.00">OAuth 2.0</text>
|
||||||
|
</g>
|
||||||
|
<g id="clust3" class="cluster">
|
||||||
|
<title>cluster_google</title>
|
||||||
|
<polygon fill="#e3f2fd" stroke="#e3f2fd" points="636.38,-20 636.38,-208 748.38,-208 748.38,-20 636.38,-20"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="692.38" y="-188.8" font-family="Helvetica,sans-Serif" font-size="16.00">Google APIs</text>
|
||||||
|
</g>
|
||||||
|
<!-- app -->
|
||||||
|
<g id="node1" class="node">
|
||||||
|
<title>app</title>
|
||||||
|
<path fill="#c8e6c9" stroke="black" d="M80.75,-118C80.75,-118 28,-118 28,-118 22,-118 16,-112 16,-106 16,-106 16,-94 16,-94 16,-88 22,-82 28,-82 28,-82 80.75,-82 80.75,-82 86.75,-82 92.75,-88 92.75,-94 92.75,-94 92.75,-106 92.75,-106 92.75,-112 86.75,-118 80.75,-118"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="54.38" y="-96.3" font-family="Helvetica,sans-Serif" font-size="11.00">Application</text>
|
||||||
|
</g>
|
||||||
|
<!-- vein -->
|
||||||
|
<g id="node2" class="node">
|
||||||
|
<title>vein</title>
|
||||||
|
<path fill="#a5d6a7" stroke="black" d="M309.75,-118C309.75,-118 201.5,-118 201.5,-118 195.5,-118 189.5,-112 189.5,-106 189.5,-106 189.5,-94 189.5,-94 189.5,-88 195.5,-82 201.5,-82 201.5,-82 309.75,-82 309.75,-82 315.75,-82 321.75,-88 321.75,-94 321.75,-94 321.75,-106 321.75,-106 321.75,-112 315.75,-118 309.75,-118"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="255.62" y="-103.05" font-family="Helvetica,sans-Serif" font-size="11.00">Google Vein</text>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="255.62" y="-89.55" font-family="Helvetica,sans-Serif" font-size="11.00">(artery/veins/google)</text>
|
||||||
|
</g>
|
||||||
|
<!-- app->vein -->
|
||||||
|
<g id="edge1" class="edge">
|
||||||
|
<title>app->vein</title>
|
||||||
|
<path fill="none" stroke="black" d="M92.85,-100C116.74,-100 148.56,-100 177.65,-100"/>
|
||||||
|
<polygon fill="black" stroke="black" points="177.56,-103.5 187.56,-100 177.56,-96.5 177.56,-103.5"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="141.12" y="-103.25" font-family="Helvetica,sans-Serif" font-size="10.00">get_sheets()</text>
|
||||||
|
</g>
|
||||||
|
<!-- oauth -->
|
||||||
|
<g id="node3" class="node">
|
||||||
|
<title>oauth</title>
|
||||||
|
<path fill="#81c784" stroke="black" d="M517,-118C517,-118 429.75,-118 429.75,-118 423.75,-118 417.75,-112 417.75,-106 417.75,-106 417.75,-94 417.75,-94 417.75,-88 423.75,-82 429.75,-82 429.75,-82 517,-82 517,-82 523,-82 529,-88 529,-94 529,-94 529,-106 529,-106 529,-112 523,-118 517,-118"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="473.38" y="-103.05" font-family="Helvetica,sans-Serif" font-size="11.00">OAuth Handler</text>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="473.38" y="-89.55" font-family="Helvetica,sans-Serif" font-size="11.00">(artery/oauth.py)</text>
|
||||||
|
</g>
|
||||||
|
<!-- vein->oauth -->
|
||||||
|
<g id="edge2" class="edge">
|
||||||
|
<title>vein->oauth</title>
|
||||||
|
<path fill="none" stroke="black" d="M322.24,-100C348.92,-100 379.71,-100 406.43,-100"/>
|
||||||
|
<polygon fill="black" stroke="black" points="406.09,-103.5 416.09,-100 406.09,-96.5 406.09,-103.5"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="369.75" y="-103.25" font-family="Helvetica,sans-Serif" font-size="10.00">ensure_auth</text>
|
||||||
|
</g>
|
||||||
|
<!-- auth_url -->
|
||||||
|
<g id="node4" class="node">
|
||||||
|
<title>auth_url</title>
|
||||||
|
<path fill="#ffecb3" stroke="black" d="M744.5,-260C744.5,-260 639.25,-260 639.25,-260 633.25,-260 627.25,-254 627.25,-248 627.25,-248 627.25,-236 627.25,-236 627.25,-230 633.25,-224 639.25,-224 639.25,-224 744.5,-224 744.5,-224 750.5,-224 756.5,-230 756.5,-236 756.5,-236 756.5,-248 756.5,-248 756.5,-254 750.5,-260 744.5,-260"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="691.88" y="-238.3" font-family="Helvetica,sans-Serif" font-size="11.00">1. Authorization URL</text>
|
||||||
|
</g>
|
||||||
|
<!-- oauth->auth_url -->
|
||||||
|
<g id="edge3" class="edge">
|
||||||
|
<title>oauth->auth_url</title>
|
||||||
|
<path fill="none" stroke="black" d="M494.27,-118.13C521.13,-141.94 571.17,-184 619.25,-212 623.25,-214.33 627.46,-216.57 631.76,-218.71"/>
|
||||||
|
<polygon fill="black" stroke="black" points="629.98,-221.74 640.51,-222.85 632.97,-215.41 629.98,-221.74"/>
|
||||||
|
</g>
|
||||||
|
<!-- sheets -->
|
||||||
|
<g id="node8" class="node">
|
||||||
|
<title>sheets</title>
|
||||||
|
<path fill="#bbdefb" stroke="black" d="M717.12,-172C717.12,-172 666.62,-172 666.62,-172 660.62,-172 654.62,-166 654.62,-160 654.62,-160 654.62,-148 654.62,-148 654.62,-142 660.62,-136 666.62,-136 666.62,-136 717.12,-136 717.12,-136 723.12,-136 729.12,-142 729.12,-148 729.12,-148 729.12,-160 729.12,-160 729.12,-166 723.12,-172 717.12,-172"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="691.88" y="-150.3" font-family="Helvetica,sans-Serif" font-size="11.00">Sheets API</text>
|
||||||
|
</g>
|
||||||
|
<!-- oauth->sheets -->
|
||||||
|
<g id="edge8" class="edge">
|
||||||
|
<title>oauth->sheets</title>
|
||||||
|
<path fill="none" stroke="black" d="M529.29,-113.7C564.52,-122.48 609.79,-133.78 643.45,-142.17"/>
|
||||||
|
<polygon fill="black" stroke="black" points="642.37,-145.51 652.92,-144.53 644.07,-138.72 642.37,-145.51"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="578.12" y="-136.67" font-family="Helvetica,sans-Serif" font-size="10.00">Bearer token</text>
|
||||||
|
</g>
|
||||||
|
<!-- calendar -->
|
||||||
|
<g id="node9" class="node">
|
||||||
|
<title>calendar</title>
|
||||||
|
<path fill="#bbdefb" stroke="black" d="M722.75,-118C722.75,-118 661,-118 661,-118 655,-118 649,-112 649,-106 649,-106 649,-94 649,-94 649,-88 655,-82 661,-82 661,-82 722.75,-82 722.75,-82 728.75,-82 734.75,-88 734.75,-94 734.75,-94 734.75,-106 734.75,-106 734.75,-112 728.75,-118 722.75,-118"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="691.88" y="-96.3" font-family="Helvetica,sans-Serif" font-size="11.00">Calendar API</text>
|
||||||
|
</g>
|
||||||
|
<!-- oauth->calendar -->
|
||||||
|
<g id="edge9" class="edge">
|
||||||
|
<title>oauth->calendar</title>
|
||||||
|
<path fill="none" stroke="black" d="M529.29,-100C562.46,-100 604.54,-100 637.44,-100"/>
|
||||||
|
<polygon fill="black" stroke="black" points="637.15,-103.5 647.15,-100 637.15,-96.5 637.15,-103.5"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="578.12" y="-103.25" font-family="Helvetica,sans-Serif" font-size="10.00">Bearer token</text>
|
||||||
|
</g>
|
||||||
|
<!-- drive -->
|
||||||
|
<g id="node10" class="node">
|
||||||
|
<title>drive</title>
|
||||||
|
<path fill="#bbdefb" stroke="black" d="M713,-64C713,-64 670.75,-64 670.75,-64 664.75,-64 658.75,-58 658.75,-52 658.75,-52 658.75,-40 658.75,-40 658.75,-34 664.75,-28 670.75,-28 670.75,-28 713,-28 713,-28 719,-28 725,-34 725,-40 725,-40 725,-52 725,-52 725,-58 719,-64 713,-64"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="691.88" y="-42.3" font-family="Helvetica,sans-Serif" font-size="11.00">Drive API</text>
|
||||||
|
</g>
|
||||||
|
<!-- oauth->drive -->
|
||||||
|
<g id="edge10" class="edge">
|
||||||
|
<title>oauth->drive</title>
|
||||||
|
<path fill="none" stroke="black" d="M529.29,-86.3C565.98,-77.15 613.57,-65.28 647.58,-56.8"/>
|
||||||
|
<polygon fill="black" stroke="black" points="648.24,-60.24 657.09,-54.43 646.54,-53.45 648.24,-60.24"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="578.12" y="-84.24" font-family="Helvetica,sans-Serif" font-size="10.00">Bearer token</text>
|
||||||
|
</g>
|
||||||
|
<!-- consent -->
|
||||||
|
<g id="node5" class="node">
|
||||||
|
<title>consent</title>
|
||||||
|
<path fill="#ffe082" stroke="black" d="M886,-260C886,-260 805.5,-260 805.5,-260 799.5,-260 793.5,-254 793.5,-248 793.5,-248 793.5,-236 793.5,-236 793.5,-230 799.5,-224 805.5,-224 805.5,-224 886,-224 886,-224 892,-224 898,-230 898,-236 898,-236 898,-248 898,-248 898,-254 892,-260 886,-260"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="845.75" y="-238.3" font-family="Helvetica,sans-Serif" font-size="11.00">2. User Consent</text>
|
||||||
|
</g>
|
||||||
|
<!-- auth_url->consent -->
|
||||||
|
<g id="edge4" class="edge">
|
||||||
|
<title>auth_url->consent</title>
|
||||||
|
<path fill="none" stroke="black" d="M756.84,-242C765.11,-242 773.57,-242 781.82,-242"/>
|
||||||
|
<polygon fill="black" stroke="black" points="781.78,-245.5 791.78,-242 781.78,-238.5 781.78,-245.5"/>
|
||||||
|
</g>
|
||||||
|
<!-- callback -->
|
||||||
|
<g id="node6" class="node">
|
||||||
|
<title>callback</title>
|
||||||
|
<path fill="#ffd54f" stroke="black" d="M1043.25,-260C1043.25,-260 947,-260 947,-260 941,-260 935,-254 935,-248 935,-248 935,-236 935,-236 935,-230 941,-224 947,-224 947,-224 1043.25,-224 1043.25,-224 1049.25,-224 1055.25,-230 1055.25,-236 1055.25,-236 1055.25,-248 1055.25,-248 1055.25,-254 1049.25,-260 1043.25,-260"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="995.12" y="-238.3" font-family="Helvetica,sans-Serif" font-size="11.00">3. Callback + Code</text>
|
||||||
|
</g>
|
||||||
|
<!-- consent->callback -->
|
||||||
|
<g id="edge5" class="edge">
|
||||||
|
<title>consent->callback</title>
|
||||||
|
<path fill="none" stroke="black" d="M898.29,-242C906.34,-242 914.78,-242 923.16,-242"/>
|
||||||
|
<polygon fill="black" stroke="black" points="923.02,-245.5 933.02,-242 923.02,-238.5 923.02,-245.5"/>
|
||||||
|
</g>
|
||||||
|
<!-- tokens -->
|
||||||
|
<g id="node7" class="node">
|
||||||
|
<title>tokens</title>
|
||||||
|
<path fill="#ffca28" stroke="black" d="M1207.25,-260C1207.25,-260 1104.25,-260 1104.25,-260 1098.25,-260 1092.25,-254 1092.25,-248 1092.25,-248 1092.25,-236 1092.25,-236 1092.25,-230 1098.25,-224 1104.25,-224 1104.25,-224 1207.25,-224 1207.25,-224 1213.25,-224 1219.25,-230 1219.25,-236 1219.25,-236 1219.25,-248 1219.25,-248 1219.25,-254 1213.25,-260 1207.25,-260"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="1155.75" y="-245.05" font-family="Helvetica,sans-Serif" font-size="11.00">4. Access + Refresh</text>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="1155.75" y="-231.55" font-family="Helvetica,sans-Serif" font-size="11.00">Tokens</text>
|
||||||
|
</g>
|
||||||
|
<!-- callback->tokens -->
|
||||||
|
<g id="edge6" class="edge">
|
||||||
|
<title>callback->tokens</title>
|
||||||
|
<path fill="none" stroke="black" d="M1055.64,-242C1063.8,-242 1072.26,-242 1080.64,-242"/>
|
||||||
|
<polygon fill="black" stroke="black" points="1080.47,-245.5 1090.47,-242 1080.47,-238.5 1080.47,-245.5"/>
|
||||||
|
</g>
|
||||||
|
<!-- tokens->oauth -->
|
||||||
|
<g id="edge7" class="edge">
|
||||||
|
<title>tokens->oauth</title>
|
||||||
|
<path fill="none" stroke="black" d="M1151.88,-223.81C1141.88,-167.53 1103.13,0 996.12,0 690.88,0 690.88,0 690.88,0 619.58,0 546.24,-45.24 505.87,-74.87"/>
|
||||||
|
<polygon fill="black" stroke="black" points="503.92,-71.95 498.02,-80.75 508.12,-77.55 503.92,-71.95"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="845.75" y="-3.25" font-family="Helvetica,sans-Serif" font-size="10.00">store</text>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 11 KiB |
115
docs/veins/graph.html
Normal file
@@ -0,0 +1,115 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8" />
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
|
<title>Graph Viewer - Veins</title>
|
||||||
|
<link rel="stylesheet" href="../architecture/styles.css" />
|
||||||
|
</head>
|
||||||
|
<body class="graph-viewer">
|
||||||
|
<header class="graph-header">
|
||||||
|
<a href="index.html" class="back-link">← Back</a>
|
||||||
|
<div class="nav-controls">
|
||||||
|
<button onclick="navigate(-1)" id="btn-prev" title="Previous">◀</button>
|
||||||
|
<span id="nav-position">1 / 4</span>
|
||||||
|
<button onclick="navigate(1)" id="btn-next" title="Next">▶</button>
|
||||||
|
</div>
|
||||||
|
<h1 id="graph-title">Loading...</h1>
|
||||||
|
<div class="graph-controls">
|
||||||
|
<button onclick="setMode('fit')">Fit</button>
|
||||||
|
<button onclick="setMode('fit-width')">Width</button>
|
||||||
|
<button onclick="setMode('fit-height')">Height</button>
|
||||||
|
<button onclick="setMode('actual-size')">100%</button>
|
||||||
|
<button onclick="downloadSvg()">↓ SVG</button>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<div class="graph-container" id="graph-container">
|
||||||
|
<img id="graph-img" src="" alt="Graph" />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
const graphOrder = [
|
||||||
|
"jira",
|
||||||
|
"slack",
|
||||||
|
"google",
|
||||||
|
"mercadopago-shunt",
|
||||||
|
];
|
||||||
|
|
||||||
|
const graphs = {
|
||||||
|
"jira": {
|
||||||
|
title: "Jira Vein",
|
||||||
|
file: "jira.svg",
|
||||||
|
},
|
||||||
|
"slack": {
|
||||||
|
title: "Slack Vein",
|
||||||
|
file: "slack.svg",
|
||||||
|
},
|
||||||
|
"google": {
|
||||||
|
title: "Google Vein (OAuth)",
|
||||||
|
file: "google.svg",
|
||||||
|
},
|
||||||
|
"mercadopago-shunt": {
|
||||||
|
title: "MercadoPago Shunt",
|
||||||
|
file: "mercadopago-shunt.svg",
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
const params = new URLSearchParams(window.location.search);
|
||||||
|
let graphKey = params.get("g") || "jira";
|
||||||
|
let currentIndex = graphOrder.indexOf(graphKey);
|
||||||
|
if (currentIndex === -1) currentIndex = 0;
|
||||||
|
|
||||||
|
function loadGraph(key) {
|
||||||
|
const graph = graphs[key];
|
||||||
|
document.getElementById("graph-title").textContent = graph.title;
|
||||||
|
document.getElementById("graph-img").src = graph.file;
|
||||||
|
document.title = graph.title + " - Soleprint";
|
||||||
|
history.replaceState(null, "", "?g=" + key);
|
||||||
|
graphKey = key;
|
||||||
|
updateNavHints();
|
||||||
|
}
|
||||||
|
|
||||||
|
function updateNavHints() {
|
||||||
|
const idx = graphOrder.indexOf(graphKey);
|
||||||
|
const prevBtn = document.getElementById("btn-prev");
|
||||||
|
const nextBtn = document.getElementById("btn-next");
|
||||||
|
prevBtn.disabled = idx === 0;
|
||||||
|
nextBtn.disabled = idx === graphOrder.length - 1;
|
||||||
|
document.getElementById("nav-position").textContent =
|
||||||
|
idx + 1 + " / " + graphOrder.length;
|
||||||
|
}
|
||||||
|
|
||||||
|
function navigate(direction) {
|
||||||
|
const idx = graphOrder.indexOf(graphKey);
|
||||||
|
const newIdx = idx + direction;
|
||||||
|
if (newIdx >= 0 && newIdx < graphOrder.length) {
|
||||||
|
currentIndex = newIdx;
|
||||||
|
loadGraph(graphOrder[newIdx]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function setMode(mode) {
|
||||||
|
const container = document.getElementById("graph-container");
|
||||||
|
container.className = "graph-container " + mode;
|
||||||
|
}
|
||||||
|
|
||||||
|
function downloadSvg() {
|
||||||
|
const graph = graphs[graphKey];
|
||||||
|
const link = document.createElement("a");
|
||||||
|
link.href = graph.file;
|
||||||
|
link.download = graph.file;
|
||||||
|
link.click();
|
||||||
|
}
|
||||||
|
|
||||||
|
document.addEventListener("keydown", (e) => {
|
||||||
|
if (e.key === "ArrowLeft") navigate(-1);
|
||||||
|
else if (e.key === "ArrowRight") navigate(1);
|
||||||
|
else if (e.key === "Escape") window.location.href = "index.html";
|
||||||
|
});
|
||||||
|
|
||||||
|
loadGraph(graphOrder[currentIndex]);
|
||||||
|
setMode("fit");
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
172
docs/veins/index.html
Normal file
@@ -0,0 +1,172 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8" />
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
|
<title>Veins & Shunts - Soleprint</title>
|
||||||
|
<link rel="stylesheet" href="../architecture/styles.css" />
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<header>
|
||||||
|
<h1>Veins & Shunts</h1>
|
||||||
|
<p class="subtitle">API Connectors & Mock Services</p>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<main>
|
||||||
|
<section class="findings-section">
|
||||||
|
<p style="margin-bottom: 1rem;"><a href="../index.html" style="color: var(--accent);">← Back to Docs</a></p>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<!-- Veins -->
|
||||||
|
<section class="graph-section">
|
||||||
|
<h2 style="color: var(--accent); margin-bottom: 1rem;">Veins (Stateless API Connectors)</h2>
|
||||||
|
<p style="color: var(--text-secondary); margin-bottom: 1.5rem;">
|
||||||
|
Veins are stateless connectors to external APIs. They handle authentication and provide a clean interface for the rest of the application.
|
||||||
|
</p>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="graph-section" id="jira">
|
||||||
|
<div class="graph-header-row">
|
||||||
|
<h2>Jira</h2>
|
||||||
|
<a href="graph.html?g=jira" class="view-btn">View Full</a>
|
||||||
|
</div>
|
||||||
|
<a href="graph.html?g=jira" class="graph-preview">
|
||||||
|
<img src="jira.svg" alt="Jira Vein" />
|
||||||
|
</a>
|
||||||
|
<div class="graph-details">
|
||||||
|
<p>Connect to Jira Cloud for issue tracking.</p>
|
||||||
|
<h4>Capabilities</h4>
|
||||||
|
<ul>
|
||||||
|
<li>Get/create/update issues</li>
|
||||||
|
<li>JQL search</li>
|
||||||
|
<li>Transition issues between statuses</li>
|
||||||
|
<li>List projects</li>
|
||||||
|
</ul>
|
||||||
|
<h4>Auth</h4>
|
||||||
|
<p>API Token (Basic Auth with email + token)</p>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="graph-section" id="slack">
|
||||||
|
<div class="graph-header-row">
|
||||||
|
<h2>Slack</h2>
|
||||||
|
<a href="graph.html?g=slack" class="view-btn">View Full</a>
|
||||||
|
</div>
|
||||||
|
<a href="graph.html?g=slack" class="graph-preview">
|
||||||
|
<img src="slack.svg" alt="Slack Vein" />
|
||||||
|
</a>
|
||||||
|
<div class="graph-details">
|
||||||
|
<p>Send messages and interact with Slack workspaces.</p>
|
||||||
|
<h4>Capabilities</h4>
|
||||||
|
<ul>
|
||||||
|
<li>Post messages to channels</li>
|
||||||
|
<li>List channels and users</li>
|
||||||
|
<li>Upload files</li>
|
||||||
|
<li>Webhook integration</li>
|
||||||
|
</ul>
|
||||||
|
<h4>Auth</h4>
|
||||||
|
<p>Bot Token (Bearer)</p>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="graph-section" id="google">
|
||||||
|
<div class="graph-header-row">
|
||||||
|
<h2>Google</h2>
|
||||||
|
<a href="graph.html?g=google" class="view-btn">View Full</a>
|
||||||
|
</div>
|
||||||
|
<a href="graph.html?g=google" class="graph-preview">
|
||||||
|
<img src="google.svg" alt="Google Vein" />
|
||||||
|
</a>
|
||||||
|
<div class="graph-details">
|
||||||
|
<p>Access Google Sheets, Calendar, Drive via OAuth 2.0.</p>
|
||||||
|
<h4>Capabilities</h4>
|
||||||
|
<ul>
|
||||||
|
<li>Read/write Sheets</li>
|
||||||
|
<li>Calendar events</li>
|
||||||
|
<li>Drive file access</li>
|
||||||
|
</ul>
|
||||||
|
<h4>Auth</h4>
|
||||||
|
<p>OAuth 2.0 with refresh tokens</p>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<!-- Shunts -->
|
||||||
|
<section class="graph-section" style="margin-top: 3rem;">
|
||||||
|
<h2 style="color: var(--accent); margin-bottom: 1rem;">Shunts (Mock Connectors)</h2>
|
||||||
|
<p style="color: var(--text-secondary); margin-bottom: 1.5rem;">
|
||||||
|
Shunts are fake connectors for testing. They mimic real APIs but let you control the responses.
|
||||||
|
Perfect for testing payment flows, webhook handling, and integration scenarios without needing real credentials.
|
||||||
|
</p>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="graph-section" id="mercadopago">
|
||||||
|
<div class="graph-header-row">
|
||||||
|
<h2>MercadoPago Shunt</h2>
|
||||||
|
<a href="graph.html?g=mercadopago-shunt" class="view-btn">View Full</a>
|
||||||
|
</div>
|
||||||
|
<a href="graph.html?g=mercadopago-shunt" class="graph-preview">
|
||||||
|
<img src="mercadopago-shunt.svg" alt="MercadoPago Shunt" />
|
||||||
|
</a>
|
||||||
|
<div class="graph-details">
|
||||||
|
<p>Mock MercadoPago payment API for testing payment flows.</p>
|
||||||
|
<h4>Features</h4>
|
||||||
|
<ul>
|
||||||
|
<li>Fake payment creation</li>
|
||||||
|
<li>Configurable responses (approved/pending/rejected)</li>
|
||||||
|
<li>Webhook callbacks</li>
|
||||||
|
<li>Config UI to set next response</li>
|
||||||
|
</ul>
|
||||||
|
<h4>Use Case</h4>
|
||||||
|
<p>Test checkout flows without real payments. Set the shunt to return "approved" or "rejected" and verify your app handles each case.</p>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<!-- Pattern -->
|
||||||
|
<section class="tech-section">
|
||||||
|
<h2>Vein Pattern</h2>
|
||||||
|
<div class="tech-grid">
|
||||||
|
<div class="tech-column">
|
||||||
|
<h3>Structure</h3>
|
||||||
|
<ul>
|
||||||
|
<li>artery/veins/{name}/</li>
|
||||||
|
<li>__init__.py (exports)</li>
|
||||||
|
<li>client.py (API client)</li>
|
||||||
|
<li>models.py (types)</li>
|
||||||
|
<li>templates/ (test UI)</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="tech-column">
|
||||||
|
<h3>Base Class</h3>
|
||||||
|
<ul>
|
||||||
|
<li>Extends artery/veins/base.py</li>
|
||||||
|
<li>Common auth handling</li>
|
||||||
|
<li>Request/response logging</li>
|
||||||
|
<li>Error handling</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="tech-column">
|
||||||
|
<h3>OAuth</h3>
|
||||||
|
<ul>
|
||||||
|
<li>artery/oauth.py</li>
|
||||||
|
<li>Token storage</li>
|
||||||
|
<li>Refresh flow</li>
|
||||||
|
<li>Callback handling</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="tech-column">
|
||||||
|
<h3>Config</h3>
|
||||||
|
<ul>
|
||||||
|
<li>cfg/{room}/data/veins.json</li>
|
||||||
|
<li>Per-room credentials</li>
|
||||||
|
<li>Enable/disable veins</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</main>
|
||||||
|
|
||||||
|
<footer>
|
||||||
|
<p>Soleprint - Veins & Shunts Documentation</p>
|
||||||
|
</footer>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
53
docs/veins/jira.dot
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
digraph JiraVein {
|
||||||
|
rankdir=LR;
|
||||||
|
compound=true;
|
||||||
|
fontname="Helvetica";
|
||||||
|
node [fontname="Helvetica", fontsize=11, shape=box, style="rounded,filled"];
|
||||||
|
edge [fontname="Helvetica", fontsize=10];
|
||||||
|
|
||||||
|
labelloc="t";
|
||||||
|
label="Jira Vein - API Flow";
|
||||||
|
fontsize=16;
|
||||||
|
|
||||||
|
// Client
|
||||||
|
subgraph cluster_client {
|
||||||
|
label="Soleprint";
|
||||||
|
style=filled;
|
||||||
|
color="#E8F5E9";
|
||||||
|
fillcolor="#E8F5E9";
|
||||||
|
|
||||||
|
app [label="Application", fillcolor="#C8E6C9"];
|
||||||
|
vein [label="Jira Vein\n(artery/veins/jira)", fillcolor="#A5D6A7"];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Auth
|
||||||
|
subgraph cluster_auth {
|
||||||
|
label="Authentication";
|
||||||
|
style=filled;
|
||||||
|
color="#FFF8E1";
|
||||||
|
fillcolor="#FFF8E1";
|
||||||
|
|
||||||
|
token [label="API Token\n(Basic Auth)", fillcolor="#FFECB3"];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Jira API
|
||||||
|
subgraph cluster_jira {
|
||||||
|
label="Jira Cloud API";
|
||||||
|
style=filled;
|
||||||
|
color="#E3F2FD";
|
||||||
|
fillcolor="#E3F2FD";
|
||||||
|
|
||||||
|
issues [label="/rest/api/3/issue", fillcolor="#BBDEFB"];
|
||||||
|
search [label="/rest/api/3/search", fillcolor="#BBDEFB"];
|
||||||
|
projects [label="/rest/api/3/project", fillcolor="#BBDEFB"];
|
||||||
|
transitions [label="/rest/api/3/issue/{id}/transitions", fillcolor="#BBDEFB"];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Flow
|
||||||
|
app -> vein [label="get_issue()"];
|
||||||
|
vein -> token [label="auth"];
|
||||||
|
token -> issues [label="GET/POST"];
|
||||||
|
token -> search [label="JQL"];
|
||||||
|
token -> projects [label="list"];
|
||||||
|
token -> transitions [label="update status"];
|
||||||
|
}
|
||||||
115
docs/veins/jira.svg
Normal file
@@ -0,0 +1,115 @@
|
|||||||
|
<?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.1 (0)
|
||||||
|
-->
|
||||||
|
<!-- Title: JiraVein Pages: 1 -->
|
||||||
|
<svg width="792pt" height="294pt"
|
||||||
|
viewBox="0.00 0.00 792.00 294.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 289.5)">
|
||||||
|
<title>JiraVein</title>
|
||||||
|
<polygon fill="white" stroke="none" points="-4,4 -4,-289.5 788.25,-289.5 788.25,4 -4,4"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="392.12" y="-266.3" font-family="Helvetica,sans-Serif" font-size="16.00">Jira Vein - API Flow</text>
|
||||||
|
<g id="clust1" class="cluster">
|
||||||
|
<title>cluster_client</title>
|
||||||
|
<polygon fill="#e8f5e9" stroke="#e8f5e9" points="8,-88 8,-168 303.5,-168 303.5,-88 8,-88"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="155.75" y="-148.8" font-family="Helvetica,sans-Serif" font-size="16.00">Soleprint</text>
|
||||||
|
</g>
|
||||||
|
<g id="clust2" class="cluster">
|
||||||
|
<title>cluster_auth</title>
|
||||||
|
<polygon fill="#fff8e1" stroke="#fff8e1" points="345.25,-88 345.25,-168 479.75,-168 479.75,-88 345.25,-88"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="412.5" y="-148.8" font-family="Helvetica,sans-Serif" font-size="16.00">Authentication</text>
|
||||||
|
</g>
|
||||||
|
<g id="clust3" class="cluster">
|
||||||
|
<title>cluster_jira</title>
|
||||||
|
<polygon fill="#e3f2fd" stroke="#e3f2fd" points="566.5,-8 566.5,-250 776.25,-250 776.25,-8 566.5,-8"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="671.38" y="-230.8" font-family="Helvetica,sans-Serif" font-size="16.00">Jira Cloud API</text>
|
||||||
|
</g>
|
||||||
|
<!-- app -->
|
||||||
|
<g id="node1" class="node">
|
||||||
|
<title>app</title>
|
||||||
|
<path fill="#c8e6c9" stroke="black" d="M80.75,-132C80.75,-132 28,-132 28,-132 22,-132 16,-126 16,-120 16,-120 16,-108 16,-108 16,-102 22,-96 28,-96 28,-96 80.75,-96 80.75,-96 86.75,-96 92.75,-102 92.75,-108 92.75,-108 92.75,-120 92.75,-120 92.75,-126 86.75,-132 80.75,-132"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="54.38" y="-110.3" font-family="Helvetica,sans-Serif" font-size="11.00">Application</text>
|
||||||
|
</g>
|
||||||
|
<!-- vein -->
|
||||||
|
<g id="node2" class="node">
|
||||||
|
<title>vein</title>
|
||||||
|
<path fill="#a5d6a7" stroke="black" d="M283.5,-132C283.5,-132 194.75,-132 194.75,-132 188.75,-132 182.75,-126 182.75,-120 182.75,-120 182.75,-108 182.75,-108 182.75,-102 188.75,-96 194.75,-96 194.75,-96 283.5,-96 283.5,-96 289.5,-96 295.5,-102 295.5,-108 295.5,-108 295.5,-120 295.5,-120 295.5,-126 289.5,-132 283.5,-132"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="239.12" y="-117.05" font-family="Helvetica,sans-Serif" font-size="11.00">Jira Vein</text>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="239.12" y="-103.55" font-family="Helvetica,sans-Serif" font-size="11.00">(artery/veins/jira)</text>
|
||||||
|
</g>
|
||||||
|
<!-- app->vein -->
|
||||||
|
<g id="edge1" class="edge">
|
||||||
|
<title>app->vein</title>
|
||||||
|
<path fill="none" stroke="black" d="M93.24,-114C115.64,-114 144.67,-114 170.86,-114"/>
|
||||||
|
<polygon fill="black" stroke="black" points="170.75,-117.5 180.75,-114 170.75,-110.5 170.75,-117.5"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="137.75" y="-117.25" font-family="Helvetica,sans-Serif" font-size="10.00">get_issue()</text>
|
||||||
|
</g>
|
||||||
|
<!-- token -->
|
||||||
|
<g id="node3" class="node">
|
||||||
|
<title>token</title>
|
||||||
|
<path fill="#ffecb3" stroke="black" d="M441.75,-132C441.75,-132 382.25,-132 382.25,-132 376.25,-132 370.25,-126 370.25,-120 370.25,-120 370.25,-108 370.25,-108 370.25,-102 376.25,-96 382.25,-96 382.25,-96 441.75,-96 441.75,-96 447.75,-96 453.75,-102 453.75,-108 453.75,-108 453.75,-120 453.75,-120 453.75,-126 447.75,-132 441.75,-132"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="412" y="-117.05" font-family="Helvetica,sans-Serif" font-size="11.00">API Token</text>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="412" y="-103.55" font-family="Helvetica,sans-Serif" font-size="11.00">(Basic Auth)</text>
|
||||||
|
</g>
|
||||||
|
<!-- vein->token -->
|
||||||
|
<g id="edge2" class="edge">
|
||||||
|
<title>vein->token</title>
|
||||||
|
<path fill="none" stroke="black" d="M295.6,-114C315.81,-114 338.57,-114 358.5,-114"/>
|
||||||
|
<polygon fill="black" stroke="black" points="358.36,-117.5 368.36,-114 358.36,-110.5 358.36,-117.5"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="324.38" y="-117.25" font-family="Helvetica,sans-Serif" font-size="10.00">auth</text>
|
||||||
|
</g>
|
||||||
|
<!-- issues -->
|
||||||
|
<g id="node4" class="node">
|
||||||
|
<title>issues</title>
|
||||||
|
<path fill="#bbdefb" stroke="black" d="M711.62,-214C711.62,-214 631.12,-214 631.12,-214 625.12,-214 619.12,-208 619.12,-202 619.12,-202 619.12,-190 619.12,-190 619.12,-184 625.12,-178 631.12,-178 631.12,-178 711.62,-178 711.62,-178 717.62,-178 723.62,-184 723.62,-190 723.62,-190 723.62,-202 723.62,-202 723.62,-208 717.62,-214 711.62,-214"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="671.38" y="-192.3" font-family="Helvetica,sans-Serif" font-size="11.00">/rest/api/3/issue</text>
|
||||||
|
</g>
|
||||||
|
<!-- token->issues -->
|
||||||
|
<g id="edge3" class="edge">
|
||||||
|
<title>token->issues</title>
|
||||||
|
<path fill="none" stroke="black" d="M454.12,-132.07C465.56,-136.84 478.06,-141.82 489.75,-146 528.32,-159.78 572.63,-172.1 607.71,-181.06"/>
|
||||||
|
<polygon fill="black" stroke="black" points="606.74,-184.42 617.29,-183.48 608.45,-177.63 606.74,-184.42"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="523.12" y="-169.6" font-family="Helvetica,sans-Serif" font-size="10.00">GET/POST</text>
|
||||||
|
</g>
|
||||||
|
<!-- search -->
|
||||||
|
<g id="node5" class="node">
|
||||||
|
<title>search</title>
|
||||||
|
<path fill="#bbdefb" stroke="black" d="M715.75,-160C715.75,-160 627,-160 627,-160 621,-160 615,-154 615,-148 615,-148 615,-136 615,-136 615,-130 621,-124 627,-124 627,-124 715.75,-124 715.75,-124 721.75,-124 727.75,-130 727.75,-136 727.75,-136 727.75,-148 727.75,-148 727.75,-154 721.75,-160 715.75,-160"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="671.38" y="-138.3" font-family="Helvetica,sans-Serif" font-size="11.00">/rest/api/3/search</text>
|
||||||
|
</g>
|
||||||
|
<!-- token->search -->
|
||||||
|
<g id="edge4" class="edge">
|
||||||
|
<title>token->search</title>
|
||||||
|
<path fill="none" stroke="black" d="M454.07,-118.47C494.19,-122.83 555.94,-129.55 603.22,-134.69"/>
|
||||||
|
<polygon fill="black" stroke="black" points="602.77,-138.17 613.09,-135.77 603.53,-131.21 602.77,-138.17"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="523.12" y="-132.09" font-family="Helvetica,sans-Serif" font-size="10.00">JQL</text>
|
||||||
|
</g>
|
||||||
|
<!-- projects -->
|
||||||
|
<g id="node6" class="node">
|
||||||
|
<title>projects</title>
|
||||||
|
<path fill="#bbdefb" stroke="black" d="M716.5,-106C716.5,-106 626.25,-106 626.25,-106 620.25,-106 614.25,-100 614.25,-94 614.25,-94 614.25,-82 614.25,-82 614.25,-76 620.25,-70 626.25,-70 626.25,-70 716.5,-70 716.5,-70 722.5,-70 728.5,-76 728.5,-82 728.5,-82 728.5,-94 728.5,-94 728.5,-100 722.5,-106 716.5,-106"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="671.38" y="-84.3" font-family="Helvetica,sans-Serif" font-size="11.00">/rest/api/3/project</text>
|
||||||
|
</g>
|
||||||
|
<!-- token->projects -->
|
||||||
|
<g id="edge5" class="edge">
|
||||||
|
<title>token->projects</title>
|
||||||
|
<path fill="none" stroke="black" d="M453.95,-107.16C465.5,-105.39 478.1,-103.6 489.75,-102.25 527.09,-97.92 568.92,-94.53 602.92,-92.14"/>
|
||||||
|
<polygon fill="black" stroke="black" points="602.89,-95.66 612.62,-91.48 602.41,-88.67 602.89,-95.66"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="523.12" y="-105.5" font-family="Helvetica,sans-Serif" font-size="10.00">list</text>
|
||||||
|
</g>
|
||||||
|
<!-- transitions -->
|
||||||
|
<g id="node7" class="node">
|
||||||
|
<title>transitions</title>
|
||||||
|
<path fill="#bbdefb" stroke="black" d="M756.25,-52C756.25,-52 586.5,-52 586.5,-52 580.5,-52 574.5,-46 574.5,-40 574.5,-40 574.5,-28 574.5,-28 574.5,-22 580.5,-16 586.5,-16 586.5,-16 756.25,-16 756.25,-16 762.25,-16 768.25,-22 768.25,-28 768.25,-28 768.25,-40 768.25,-40 768.25,-46 762.25,-52 756.25,-52"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="671.38" y="-30.3" font-family="Helvetica,sans-Serif" font-size="11.00">/rest/api/3/issue/{id}/transitions</text>
|
||||||
|
</g>
|
||||||
|
<!-- token->transitions -->
|
||||||
|
<g id="edge6" class="edge">
|
||||||
|
<title>token->transitions</title>
|
||||||
|
<path fill="none" stroke="black" d="M449.93,-95.66C462.38,-89.91 476.49,-83.87 489.75,-79.25 516.18,-70.04 545.39,-61.89 572.48,-55.12"/>
|
||||||
|
<polygon fill="black" stroke="black" points="573.19,-58.55 582.07,-52.77 571.52,-51.75 573.19,-58.55"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="523.12" y="-82.5" font-family="Helvetica,sans-Serif" font-size="10.00">update status</text>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 8.3 KiB |
64
docs/veins/mercadopago-shunt.dot
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
digraph MercadoPagoShunt {
|
||||||
|
rankdir=LR;
|
||||||
|
compound=true;
|
||||||
|
fontname="Helvetica";
|
||||||
|
node [fontname="Helvetica", fontsize=11, shape=box, style="rounded,filled"];
|
||||||
|
edge [fontname="Helvetica", fontsize=10];
|
||||||
|
|
||||||
|
labelloc="t";
|
||||||
|
label="MercadoPago Shunt - Mock Payment Flow";
|
||||||
|
fontsize=16;
|
||||||
|
|
||||||
|
// Client App
|
||||||
|
subgraph cluster_client {
|
||||||
|
label="Managed Room (e.g., AMAR)";
|
||||||
|
style=filled;
|
||||||
|
color="#E8F5E9";
|
||||||
|
fillcolor="#E8F5E9";
|
||||||
|
|
||||||
|
backend [label="Backend\n(Django/FastAPI)", fillcolor="#C8E6C9"];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Shunt
|
||||||
|
subgraph cluster_shunt {
|
||||||
|
label="Shunt (artery/shunts/mercadopago)";
|
||||||
|
style=filled;
|
||||||
|
color="#FFF3E0";
|
||||||
|
fillcolor="#FFF3E0";
|
||||||
|
|
||||||
|
mock_api [label="Mock API\n/payments\n/preferences", fillcolor="#FFCC80"];
|
||||||
|
config_ui [label="Config UI\n(set responses)", fillcolor="#FFB74D"];
|
||||||
|
state [label="State\n(pending payments)", fillcolor="#FFA726"];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fake responses
|
||||||
|
subgraph cluster_responses {
|
||||||
|
label="Configurable Responses";
|
||||||
|
style=dashed;
|
||||||
|
color=gray;
|
||||||
|
|
||||||
|
approved [label="approved", fillcolor="#C8E6C9"];
|
||||||
|
pending [label="pending", fillcolor="#FFF9C4"];
|
||||||
|
rejected [label="rejected", fillcolor="#FFCDD2"];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Real (bypassed)
|
||||||
|
subgraph cluster_real {
|
||||||
|
label="Real MercadoPago (bypassed)";
|
||||||
|
style=dashed;
|
||||||
|
color="#BDBDBD";
|
||||||
|
|
||||||
|
real_api [label="api.mercadopago.com", fillcolor="#E0E0E0", fontcolor="#9E9E9E"];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Flow
|
||||||
|
backend -> mock_api [label="POST /payments"];
|
||||||
|
mock_api -> state [label="store"];
|
||||||
|
config_ui -> state [label="configure"];
|
||||||
|
|
||||||
|
state -> approved [style=dashed];
|
||||||
|
state -> pending [style=dashed];
|
||||||
|
state -> rejected [style=dashed];
|
||||||
|
|
||||||
|
mock_api -> backend [label="webhook callback", style=dashed];
|
||||||
|
}
|
||||||
133
docs/veins/mercadopago-shunt.svg
Normal 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.1 (0)
|
||||||
|
-->
|
||||||
|
<!-- Title: MercadoPagoShunt Pages: 1 -->
|
||||||
|
<svg width="931pt" height="240pt"
|
||||||
|
viewBox="0.00 0.00 931.00 240.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 235.5)">
|
||||||
|
<title>MercadoPagoShunt</title>
|
||||||
|
<polygon fill="white" stroke="none" points="-4,4 -4,-235.5 926.75,-235.5 926.75,4 -4,4"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="461.38" y="-212.3" font-family="Helvetica,sans-Serif" font-size="16.00">MercadoPago Shunt - Mock Payment Flow</text>
|
||||||
|
<g id="clust1" class="cluster">
|
||||||
|
<title>cluster_client</title>
|
||||||
|
<polygon fill="#e8f5e9" stroke="#e8f5e9" points="5.25,-16 5.25,-96 252.25,-96 252.25,-16 5.25,-16"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="128.75" y="-76.8" font-family="Helvetica,sans-Serif" font-size="16.00">Managed Room (e.g., AMAR)</text>
|
||||||
|
</g>
|
||||||
|
<g id="clust2" class="cluster">
|
||||||
|
<title>cluster_shunt</title>
|
||||||
|
<polygon fill="#fff3e0" stroke="#fff3e0" points="365.25,-13 365.25,-159 691.5,-159 691.5,-13 365.25,-13"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="528.38" y="-139.8" font-family="Helvetica,sans-Serif" font-size="16.00">Shunt (artery/shunts/mercadopago)</text>
|
||||||
|
</g>
|
||||||
|
<g id="clust3" class="cluster">
|
||||||
|
<title>cluster_responses</title>
|
||||||
|
<polygon fill="none" stroke="gray" stroke-dasharray="5,2" points="712.5,-8 712.5,-196 922.75,-196 922.75,-8 712.5,-8"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="817.62" y="-176.8" font-family="Helvetica,sans-Serif" font-size="16.00">Configurable Responses</text>
|
||||||
|
</g>
|
||||||
|
<g id="clust4" class="cluster">
|
||||||
|
<title>cluster_real</title>
|
||||||
|
<polygon fill="none" stroke="#bdbdbd" stroke-dasharray="5,2" points="0,-105 0,-185 257.5,-185 257.5,-105 0,-105"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="128.75" y="-165.8" font-family="Helvetica,sans-Serif" font-size="16.00">Real MercadoPago (bypassed)</text>
|
||||||
|
</g>
|
||||||
|
<!-- backend -->
|
||||||
|
<g id="node1" class="node">
|
||||||
|
<title>backend</title>
|
||||||
|
<path fill="#c8e6c9" stroke="black" d="M169.62,-60C169.62,-60 86.88,-60 86.88,-60 80.88,-60 74.88,-54 74.88,-48 74.88,-48 74.88,-36 74.88,-36 74.88,-30 80.88,-24 86.88,-24 86.88,-24 169.62,-24 169.62,-24 175.62,-24 181.62,-30 181.62,-36 181.62,-36 181.62,-48 181.62,-48 181.62,-54 175.62,-60 169.62,-60"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="128.25" y="-45.05" font-family="Helvetica,sans-Serif" font-size="11.00">Backend</text>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="128.25" y="-31.55" font-family="Helvetica,sans-Serif" font-size="11.00">(Django/FastAPI)</text>
|
||||||
|
</g>
|
||||||
|
<!-- mock_api -->
|
||||||
|
<g id="node2" class="node">
|
||||||
|
<title>mock_api</title>
|
||||||
|
<path fill="#ffcc80" stroke="black" d="M454.88,-69.25C454.88,-69.25 393.88,-69.25 393.88,-69.25 387.88,-69.25 381.88,-63.25 381.88,-57.25 381.88,-57.25 381.88,-32.75 381.88,-32.75 381.88,-26.75 387.88,-20.75 393.88,-20.75 393.88,-20.75 454.88,-20.75 454.88,-20.75 460.88,-20.75 466.88,-26.75 466.88,-32.75 466.88,-32.75 466.88,-57.25 466.88,-57.25 466.88,-63.25 460.88,-69.25 454.88,-69.25"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="424.38" y="-54.8" font-family="Helvetica,sans-Serif" font-size="11.00">Mock API</text>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="424.38" y="-41.3" font-family="Helvetica,sans-Serif" font-size="11.00">/payments</text>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="424.38" y="-27.8" font-family="Helvetica,sans-Serif" font-size="11.00">/preferences</text>
|
||||||
|
</g>
|
||||||
|
<!-- backend->mock_api -->
|
||||||
|
<g id="edge1" class="edge">
|
||||||
|
<title>backend->mock_api</title>
|
||||||
|
<path fill="none" stroke="black" d="M181.83,-42.54C235.1,-43.08 317.03,-43.92 370.43,-44.46"/>
|
||||||
|
<polygon fill="black" stroke="black" points="370.15,-47.96 380.18,-44.56 370.22,-40.96 370.15,-47.96"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="311.38" y="-47.53" font-family="Helvetica,sans-Serif" font-size="10.00">POST /payments</text>
|
||||||
|
</g>
|
||||||
|
<!-- mock_api->backend -->
|
||||||
|
<g id="edge7" class="edge">
|
||||||
|
<title>mock_api->backend</title>
|
||||||
|
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M381.55,-32.32C372.93,-30.21 363.86,-28.35 355.25,-27.25 300.78,-20.27 238.48,-25.3 193.1,-31.31"/>
|
||||||
|
<polygon fill="black" stroke="black" points="192.87,-27.8 183.44,-32.64 193.83,-34.74 192.87,-27.8"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="311.38" y="-30.5" font-family="Helvetica,sans-Serif" font-size="10.00">webhook callback</text>
|
||||||
|
</g>
|
||||||
|
<!-- state -->
|
||||||
|
<g id="node4" class="node">
|
||||||
|
<title>state</title>
|
||||||
|
<path fill="#ffa726" stroke="black" d="M671.5,-106C671.5,-106 568.5,-106 568.5,-106 562.5,-106 556.5,-100 556.5,-94 556.5,-94 556.5,-82 556.5,-82 556.5,-76 562.5,-70 568.5,-70 568.5,-70 671.5,-70 671.5,-70 677.5,-70 683.5,-76 683.5,-82 683.5,-82 683.5,-94 683.5,-94 683.5,-100 677.5,-106 671.5,-106"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="620" y="-91.05" font-family="Helvetica,sans-Serif" font-size="11.00">State</text>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="620" y="-77.55" font-family="Helvetica,sans-Serif" font-size="11.00">(pending payments)</text>
|
||||||
|
</g>
|
||||||
|
<!-- mock_api->state -->
|
||||||
|
<g id="edge2" class="edge">
|
||||||
|
<title>mock_api->state</title>
|
||||||
|
<path fill="none" stroke="black" d="M466.91,-54.22C489.66,-59.28 518.54,-65.69 545.01,-71.57"/>
|
||||||
|
<polygon fill="black" stroke="black" points="544.18,-74.97 554.7,-73.72 545.69,-68.14 544.18,-74.97"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="516" y="-72.32" font-family="Helvetica,sans-Serif" font-size="10.00">store</text>
|
||||||
|
</g>
|
||||||
|
<!-- config_ui -->
|
||||||
|
<g id="node3" class="node">
|
||||||
|
<title>config_ui</title>
|
||||||
|
<path fill="#ffb74d" stroke="black" d="M463.5,-123C463.5,-123 385.25,-123 385.25,-123 379.25,-123 373.25,-117 373.25,-111 373.25,-111 373.25,-99 373.25,-99 373.25,-93 379.25,-87 385.25,-87 385.25,-87 463.5,-87 463.5,-87 469.5,-87 475.5,-93 475.5,-99 475.5,-99 475.5,-111 475.5,-111 475.5,-117 469.5,-123 463.5,-123"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="424.38" y="-108.05" font-family="Helvetica,sans-Serif" font-size="11.00">Config UI</text>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="424.38" y="-94.55" font-family="Helvetica,sans-Serif" font-size="11.00">(set responses)</text>
|
||||||
|
</g>
|
||||||
|
<!-- config_ui->state -->
|
||||||
|
<g id="edge3" class="edge">
|
||||||
|
<title>config_ui->state</title>
|
||||||
|
<path fill="none" stroke="black" d="M475.99,-100.56C496.99,-98.71 521.76,-96.54 544.75,-94.52"/>
|
||||||
|
<polygon fill="black" stroke="black" points="545.05,-98.01 554.7,-93.65 544.44,-91.03 545.05,-98.01"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="516" y="-102.27" font-family="Helvetica,sans-Serif" font-size="10.00">configure</text>
|
||||||
|
</g>
|
||||||
|
<!-- approved -->
|
||||||
|
<g id="node5" class="node">
|
||||||
|
<title>approved</title>
|
||||||
|
<path fill="#c8e6c9" stroke="black" d="M839,-160C839,-160 795.25,-160 795.25,-160 789.25,-160 783.25,-154 783.25,-148 783.25,-148 783.25,-136 783.25,-136 783.25,-130 789.25,-124 795.25,-124 795.25,-124 839,-124 839,-124 845,-124 851,-130 851,-136 851,-136 851,-148 851,-148 851,-154 845,-160 839,-160"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="817.12" y="-138.3" font-family="Helvetica,sans-Serif" font-size="11.00">approved</text>
|
||||||
|
</g>
|
||||||
|
<!-- state->approved -->
|
||||||
|
<g id="edge4" class="edge">
|
||||||
|
<title>state->approved</title>
|
||||||
|
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M682.45,-106.43C692.47,-109.35 702.77,-112.3 712.5,-115 731.93,-120.4 753.5,-126.07 771.91,-130.81"/>
|
||||||
|
<polygon fill="black" stroke="black" points="770.9,-134.17 781.45,-133.26 772.64,-127.38 770.9,-134.17"/>
|
||||||
|
</g>
|
||||||
|
<!-- pending -->
|
||||||
|
<g id="node6" class="node">
|
||||||
|
<title>pending</title>
|
||||||
|
<path fill="#fff9c4" stroke="black" d="M834.88,-106C834.88,-106 799.38,-106 799.38,-106 793.38,-106 787.38,-100 787.38,-94 787.38,-94 787.38,-82 787.38,-82 787.38,-76 793.38,-70 799.38,-70 799.38,-70 834.88,-70 834.88,-70 840.88,-70 846.88,-76 846.88,-82 846.88,-82 846.88,-94 846.88,-94 846.88,-100 840.88,-106 834.88,-106"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="817.12" y="-84.3" font-family="Helvetica,sans-Serif" font-size="11.00">pending</text>
|
||||||
|
</g>
|
||||||
|
<!-- state->pending -->
|
||||||
|
<g id="edge5" class="edge">
|
||||||
|
<title>state->pending</title>
|
||||||
|
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M683.81,-88C713.99,-88 749.28,-88 775.82,-88"/>
|
||||||
|
<polygon fill="black" stroke="black" points="775.47,-91.5 785.47,-88 775.47,-84.5 775.47,-91.5"/>
|
||||||
|
</g>
|
||||||
|
<!-- rejected -->
|
||||||
|
<g id="node7" class="node">
|
||||||
|
<title>rejected</title>
|
||||||
|
<path fill="#ffcdd2" stroke="black" d="M835.62,-52C835.62,-52 798.62,-52 798.62,-52 792.62,-52 786.62,-46 786.62,-40 786.62,-40 786.62,-28 786.62,-28 786.62,-22 792.62,-16 798.62,-16 798.62,-16 835.62,-16 835.62,-16 841.62,-16 847.62,-22 847.62,-28 847.62,-28 847.62,-40 847.62,-40 847.62,-46 841.62,-52 835.62,-52"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="817.12" y="-30.3" font-family="Helvetica,sans-Serif" font-size="11.00">rejected</text>
|
||||||
|
</g>
|
||||||
|
<!-- state->rejected -->
|
||||||
|
<g id="edge6" class="edge">
|
||||||
|
<title>state->rejected</title>
|
||||||
|
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M682.45,-69.57C692.47,-66.65 702.77,-63.7 712.5,-61 733.07,-55.29 756.03,-49.27 775.1,-44.37"/>
|
||||||
|
<polygon fill="black" stroke="black" points="775.84,-47.79 784.66,-41.92 774.11,-41.01 775.84,-47.79"/>
|
||||||
|
</g>
|
||||||
|
<!-- real_api -->
|
||||||
|
<g id="node8" class="node">
|
||||||
|
<title>real_api</title>
|
||||||
|
<path fill="#e0e0e0" stroke="black" d="M185.38,-149C185.38,-149 71.12,-149 71.12,-149 65.12,-149 59.12,-143 59.12,-137 59.12,-137 59.12,-125 59.12,-125 59.12,-119 65.12,-113 71.12,-113 71.12,-113 185.38,-113 185.38,-113 191.38,-113 197.38,-119 197.38,-125 197.38,-125 197.38,-137 197.38,-137 197.38,-143 191.38,-149 185.38,-149"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="128.25" y="-127.3" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#9e9e9e">api.mercadopago.com</text>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 9.8 KiB |
64
docs/veins/slack.dot
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
digraph SlackVein {
|
||||||
|
rankdir=LR;
|
||||||
|
compound=true;
|
||||||
|
fontname="Helvetica";
|
||||||
|
node [fontname="Helvetica", fontsize=11, shape=box, style="rounded,filled"];
|
||||||
|
edge [fontname="Helvetica", fontsize=10];
|
||||||
|
|
||||||
|
labelloc="t";
|
||||||
|
label="Slack Vein - API Flow";
|
||||||
|
fontsize=16;
|
||||||
|
|
||||||
|
// Client
|
||||||
|
subgraph cluster_client {
|
||||||
|
label="Soleprint";
|
||||||
|
style=filled;
|
||||||
|
color="#E8F5E9";
|
||||||
|
fillcolor="#E8F5E9";
|
||||||
|
|
||||||
|
app [label="Application", fillcolor="#C8E6C9"];
|
||||||
|
vein [label="Slack Vein\n(artery/veins/slack)", fillcolor="#A5D6A7"];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Auth
|
||||||
|
subgraph cluster_auth {
|
||||||
|
label="Authentication";
|
||||||
|
style=filled;
|
||||||
|
color="#FFF8E1";
|
||||||
|
fillcolor="#FFF8E1";
|
||||||
|
|
||||||
|
token [label="Bot Token\n(Bearer)", fillcolor="#FFECB3"];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Slack API
|
||||||
|
subgraph cluster_slack {
|
||||||
|
label="Slack API";
|
||||||
|
style=filled;
|
||||||
|
color="#E3F2FD";
|
||||||
|
fillcolor="#E3F2FD";
|
||||||
|
|
||||||
|
chat [label="chat.postMessage", fillcolor="#BBDEFB"];
|
||||||
|
channels [label="conversations.list", fillcolor="#BBDEFB"];
|
||||||
|
users [label="users.list", fillcolor="#BBDEFB"];
|
||||||
|
files [label="files.upload", fillcolor="#BBDEFB"];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Webhooks
|
||||||
|
subgraph cluster_webhooks {
|
||||||
|
label="Incoming";
|
||||||
|
style=dashed;
|
||||||
|
color=gray;
|
||||||
|
|
||||||
|
webhook [label="Webhook URL", fillcolor="#F5F5F5"];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Flow
|
||||||
|
app -> vein [label="send_message()"];
|
||||||
|
vein -> token [label="auth"];
|
||||||
|
token -> chat [label="POST"];
|
||||||
|
token -> channels [label="GET"];
|
||||||
|
token -> users [label="GET"];
|
||||||
|
token -> files [label="POST"];
|
||||||
|
|
||||||
|
vein -> webhook [label="simple post", style=dashed];
|
||||||
|
}
|
||||||
133
docs/veins/slack.svg
Normal 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.1 (0)
|
||||||
|
-->
|
||||||
|
<!-- Title: SlackVein Pages: 1 -->
|
||||||
|
<svg width="746pt" height="294pt"
|
||||||
|
viewBox="0.00 0.00 746.00 294.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 289.5)">
|
||||||
|
<title>SlackVein</title>
|
||||||
|
<polygon fill="white" stroke="none" points="-4,4 -4,-289.5 741.75,-289.5 741.75,4 -4,4"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="368.88" y="-266.3" font-family="Helvetica,sans-Serif" font-size="16.00">Slack Vein - API Flow</text>
|
||||||
|
<g id="clust1" class="cluster">
|
||||||
|
<title>cluster_client</title>
|
||||||
|
<polygon fill="#e8f5e9" stroke="#e8f5e9" points="8,-67 8,-147 340.25,-147 340.25,-67 8,-67"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="174.12" y="-127.8" font-family="Helvetica,sans-Serif" font-size="16.00">Soleprint</text>
|
||||||
|
</g>
|
||||||
|
<g id="clust2" class="cluster">
|
||||||
|
<title>cluster_auth</title>
|
||||||
|
<polygon fill="#fff8e1" stroke="#fff8e1" points="417.25,-104 417.25,-184 551.75,-184 551.75,-104 417.25,-104"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="484.5" y="-164.8" font-family="Helvetica,sans-Serif" font-size="16.00">Authentication</text>
|
||||||
|
</g>
|
||||||
|
<g id="clust3" class="cluster">
|
||||||
|
<title>cluster_slack</title>
|
||||||
|
<polygon fill="#e3f2fd" stroke="#e3f2fd" points="597.25,-8 597.25,-250 729.75,-250 729.75,-8 597.25,-8"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="663.5" y="-230.8" font-family="Helvetica,sans-Serif" font-size="16.00">Slack API</text>
|
||||||
|
</g>
|
||||||
|
<g id="clust4" class="cluster">
|
||||||
|
<title>cluster_webhooks</title>
|
||||||
|
<polygon fill="none" stroke="gray" stroke-dasharray="5,2" points="430.12,-16 430.12,-96 537.88,-96 537.88,-16 430.12,-16"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="484" y="-76.8" font-family="Helvetica,sans-Serif" font-size="16.00">Incoming</text>
|
||||||
|
</g>
|
||||||
|
<!-- app -->
|
||||||
|
<g id="node1" class="node">
|
||||||
|
<title>app</title>
|
||||||
|
<path fill="#c8e6c9" stroke="black" d="M80.75,-111C80.75,-111 28,-111 28,-111 22,-111 16,-105 16,-99 16,-99 16,-87 16,-87 16,-81 22,-75 28,-75 28,-75 80.75,-75 80.75,-75 86.75,-75 92.75,-81 92.75,-87 92.75,-87 92.75,-99 92.75,-99 92.75,-105 86.75,-111 80.75,-111"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="54.38" y="-89.3" font-family="Helvetica,sans-Serif" font-size="11.00">Application</text>
|
||||||
|
</g>
|
||||||
|
<!-- vein -->
|
||||||
|
<g id="node2" class="node">
|
||||||
|
<title>vein</title>
|
||||||
|
<path fill="#a5d6a7" stroke="black" d="M320.25,-111C320.25,-111 221,-111 221,-111 215,-111 209,-105 209,-99 209,-99 209,-87 209,-87 209,-81 215,-75 221,-75 221,-75 320.25,-75 320.25,-75 326.25,-75 332.25,-81 332.25,-87 332.25,-87 332.25,-99 332.25,-99 332.25,-105 326.25,-111 320.25,-111"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="270.62" y="-96.05" font-family="Helvetica,sans-Serif" font-size="11.00">Slack Vein</text>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="270.62" y="-82.55" font-family="Helvetica,sans-Serif" font-size="11.00">(artery/veins/slack)</text>
|
||||||
|
</g>
|
||||||
|
<!-- app->vein -->
|
||||||
|
<g id="edge1" class="edge">
|
||||||
|
<title>app->vein</title>
|
||||||
|
<path fill="none" stroke="black" d="M93.19,-93C122.02,-93 162.6,-93 197.57,-93"/>
|
||||||
|
<polygon fill="black" stroke="black" points="197.19,-96.5 207.19,-93 197.19,-89.5 197.19,-96.5"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="150.88" y="-96.25" font-family="Helvetica,sans-Serif" font-size="10.00">send_message()</text>
|
||||||
|
</g>
|
||||||
|
<!-- token -->
|
||||||
|
<g id="node3" class="node">
|
||||||
|
<title>token</title>
|
||||||
|
<path fill="#ffecb3" stroke="black" d="M506.62,-148C506.62,-148 461.38,-148 461.38,-148 455.38,-148 449.38,-142 449.38,-136 449.38,-136 449.38,-124 449.38,-124 449.38,-118 455.38,-112 461.38,-112 461.38,-112 506.62,-112 506.62,-112 512.62,-112 518.62,-118 518.62,-124 518.62,-124 518.62,-136 518.62,-136 518.62,-142 512.62,-148 506.62,-148"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="484" y="-133.05" font-family="Helvetica,sans-Serif" font-size="11.00">Bot Token</text>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="484" y="-119.55" font-family="Helvetica,sans-Serif" font-size="11.00">(Bearer)</text>
|
||||||
|
</g>
|
||||||
|
<!-- vein->token -->
|
||||||
|
<g id="edge2" class="edge">
|
||||||
|
<title>vein->token</title>
|
||||||
|
<path fill="none" stroke="black" d="M332.48,-103.65C366.11,-109.54 407.18,-116.73 437.92,-122.11"/>
|
||||||
|
<polygon fill="black" stroke="black" points="437.21,-125.54 447.67,-123.82 438.42,-118.64 437.21,-125.54"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="378.75" y="-119.15" font-family="Helvetica,sans-Serif" font-size="10.00">auth</text>
|
||||||
|
</g>
|
||||||
|
<!-- webhook -->
|
||||||
|
<g id="node8" class="node">
|
||||||
|
<title>webhook</title>
|
||||||
|
<path fill="#f5f5f5" stroke="black" d="M517.88,-60C517.88,-60 450.12,-60 450.12,-60 444.12,-60 438.12,-54 438.12,-48 438.12,-48 438.12,-36 438.12,-36 438.12,-30 444.12,-24 450.12,-24 450.12,-24 517.88,-24 517.88,-24 523.88,-24 529.88,-30 529.88,-36 529.88,-36 529.88,-48 529.88,-48 529.88,-54 523.88,-60 517.88,-60"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="484" y="-38.3" font-family="Helvetica,sans-Serif" font-size="11.00">Webhook URL</text>
|
||||||
|
</g>
|
||||||
|
<!-- vein->webhook -->
|
||||||
|
<g id="edge7" class="edge">
|
||||||
|
<title>vein->webhook</title>
|
||||||
|
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M332.48,-78.32C362.09,-71.17 397.46,-62.64 426.47,-55.64"/>
|
||||||
|
<polygon fill="black" stroke="black" points="427.29,-59.04 436.19,-53.29 425.65,-52.24 427.29,-59.04"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="378.75" y="-76.82" font-family="Helvetica,sans-Serif" font-size="10.00">simple post</text>
|
||||||
|
</g>
|
||||||
|
<!-- chat -->
|
||||||
|
<g id="node4" class="node">
|
||||||
|
<title>chat</title>
|
||||||
|
<path fill="#bbdefb" stroke="black" d="M709.75,-214C709.75,-214 617.25,-214 617.25,-214 611.25,-214 605.25,-208 605.25,-202 605.25,-202 605.25,-190 605.25,-190 605.25,-184 611.25,-178 617.25,-178 617.25,-178 709.75,-178 709.75,-178 715.75,-178 721.75,-184 721.75,-190 721.75,-190 721.75,-202 721.75,-202 721.75,-208 715.75,-214 709.75,-214"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="663.5" y="-192.3" font-family="Helvetica,sans-Serif" font-size="11.00">chat.postMessage</text>
|
||||||
|
</g>
|
||||||
|
<!-- token->chat -->
|
||||||
|
<g id="edge3" class="edge">
|
||||||
|
<title>token->chat</title>
|
||||||
|
<path fill="none" stroke="black" d="M518.8,-142.57C542.44,-151.36 574.65,-163.33 602.58,-173.72"/>
|
||||||
|
<polygon fill="black" stroke="black" points="601.04,-176.88 611.63,-177.09 603.48,-170.32 601.04,-176.88"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="574.5" y="-170.2" font-family="Helvetica,sans-Serif" font-size="10.00">POST</text>
|
||||||
|
</g>
|
||||||
|
<!-- channels -->
|
||||||
|
<g id="node5" class="node">
|
||||||
|
<title>channels</title>
|
||||||
|
<path fill="#bbdefb" stroke="black" d="M708.25,-160C708.25,-160 618.75,-160 618.75,-160 612.75,-160 606.75,-154 606.75,-148 606.75,-148 606.75,-136 606.75,-136 606.75,-130 612.75,-124 618.75,-124 618.75,-124 708.25,-124 708.25,-124 714.25,-124 720.25,-130 720.25,-136 720.25,-136 720.25,-148 720.25,-148 720.25,-154 714.25,-160 708.25,-160"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="663.5" y="-138.3" font-family="Helvetica,sans-Serif" font-size="11.00">conversations.list</text>
|
||||||
|
</g>
|
||||||
|
<!-- token->channels -->
|
||||||
|
<g id="edge4" class="edge">
|
||||||
|
<title>token->channels</title>
|
||||||
|
<path fill="none" stroke="black" d="M518.8,-132.29C540.36,-133.74 569.04,-135.68 595.11,-137.44"/>
|
||||||
|
<polygon fill="black" stroke="black" points="594.76,-140.93 604.97,-138.11 595.23,-133.94 594.76,-140.93"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="574.5" y="-139.97" font-family="Helvetica,sans-Serif" font-size="10.00">GET</text>
|
||||||
|
</g>
|
||||||
|
<!-- users -->
|
||||||
|
<g id="node6" class="node">
|
||||||
|
<title>users</title>
|
||||||
|
<path fill="#bbdefb" stroke="black" d="M684.62,-106C684.62,-106 642.38,-106 642.38,-106 636.38,-106 630.38,-100 630.38,-94 630.38,-94 630.38,-82 630.38,-82 630.38,-76 636.38,-70 642.38,-70 642.38,-70 684.62,-70 684.62,-70 690.62,-70 696.62,-76 696.62,-82 696.62,-82 696.62,-94 696.62,-94 696.62,-100 690.62,-106 684.62,-106"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="663.5" y="-84.3" font-family="Helvetica,sans-Serif" font-size="11.00">users.list</text>
|
||||||
|
</g>
|
||||||
|
<!-- token->users -->
|
||||||
|
<g id="edge5" class="edge">
|
||||||
|
<title>token->users</title>
|
||||||
|
<path fill="none" stroke="black" d="M518.8,-122C547.29,-115.26 588.23,-105.57 619.13,-98.26"/>
|
||||||
|
<polygon fill="black" stroke="black" points="619.62,-101.74 628.55,-96.03 618.01,-94.93 619.62,-101.74"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="574.5" y="-114.76" font-family="Helvetica,sans-Serif" font-size="10.00">GET</text>
|
||||||
|
</g>
|
||||||
|
<!-- files -->
|
||||||
|
<g id="node7" class="node">
|
||||||
|
<title>files</title>
|
||||||
|
<path fill="#bbdefb" stroke="black" d="M691,-52C691,-52 636,-52 636,-52 630,-52 624,-46 624,-40 624,-40 624,-28 624,-28 624,-22 630,-16 636,-16 636,-16 691,-16 691,-16 697,-16 703,-22 703,-28 703,-28 703,-40 703,-40 703,-46 697,-52 691,-52"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="663.5" y="-30.3" font-family="Helvetica,sans-Serif" font-size="11.00">files.upload</text>
|
||||||
|
</g>
|
||||||
|
<!-- token->files -->
|
||||||
|
<g id="edge6" class="edge">
|
||||||
|
<title>token->files</title>
|
||||||
|
<path fill="none" stroke="black" d="M519.01,-117.82C529.97,-113.1 541.84,-107.11 551.75,-100 557.05,-96.2 556.96,-93.68 561.75,-89.25 576.55,-75.55 579.88,-71.23 597.25,-61 602.4,-57.97 607.95,-55.11 613.57,-52.47"/>
|
||||||
|
<polygon fill="black" stroke="black" points="614.59,-55.85 622.3,-48.59 611.74,-49.46 614.59,-55.85"/>
|
||||||
|
<text xml:space="preserve" text-anchor="middle" x="574.5" y="-92.5" font-family="Helvetica,sans-Serif" font-size="10.00">POST</text>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 9.4 KiB |