Files
common-skills/skills/gitea-deploy/assets/gitea-deploy-workflow.svg
T
Team f20bc770f5 feat: add gitea-deploy skill, tools, and sdlc foreground service rule
- skills/gitea-deploy/: new skill for Gitea deployment automation
- tools/: shared utility scripts
- skills/sdlc/SKILL.md: add Foreground Service Rule for long-running
  processes (background start + readiness polling pattern)
2026-04-25 14:11:58 +08:00

1 line
14 KiB
XML

<?xml version="1.0" encoding="us-ascii" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentStyleType="text/css" height="844px" preserveAspectRatio="none" style="width:864px;height:844px;background:#FAFAFA;" version="1.1" viewBox="0 0 864 844" width="864px" zoomAndPan="magnify"><defs/><g><rect fill="#FAFAFA" height="844" style="stroke:none;stroke-width:1.0;" width="864" x="0" y="0"/><rect fill="none" height="75.3984" style="stroke:#000000;stroke-width:1.5;" width="601.5" x="10" y="185.6953"/><rect fill="none" height="46.2656" style="stroke:#000000;stroke-width:1.5;" width="411" x="10" y="304.2266"/><rect fill="none" height="59.2656" style="stroke:#000000;stroke-width:1.5;" width="224.5" x="601.5" y="393.625"/><rect fill="none" height="46.2656" style="stroke:#000000;stroke-width:1.5;" width="402.5" x="302" y="525.1563"/><line style="stroke:#181818;stroke-width:0.5;stroke-dasharray:5.0,5.0;" x1="58" x2="58" y1="81.2969" y2="763.2188"/><line style="stroke:#181818;stroke-width:0.5;stroke-dasharray:5.0,5.0;" x1="361" x2="361" y1="81.2969" y2="763.2188"/><line style="stroke:#181818;stroke-width:0.5;stroke-dasharray:5.0,5.0;" x1="566.5" x2="566.5" y1="81.2969" y2="763.2188"/><line style="stroke:#181818;stroke-width:0.5;stroke-dasharray:5.0,5.0;" x1="652.5" x2="652.5" y1="81.2969" y2="763.2188"/><line style="stroke:#181818;stroke-width:0.5;stroke-dasharray:5.0,5.0;" x1="820.5" x2="820.5" y1="81.2969" y2="763.2188"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="71" x="20" y="77.9951">Developer</text><ellipse cx="58.5" cy="13.5" fill="#E2E2F0" rx="8" ry="8" style="stroke:#181818;stroke-width:0.5;"/><path d="M58.5,21.5 L58.5,48.5 M45.5,29.5 L71.5,29.5 M58.5,48.5 L45.5,63.5 M58.5,48.5 L71.5,63.5 " fill="none" style="stroke:#181818;stroke-width:0.5;"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="71" x="20" y="775.2139">Developer</text><ellipse cx="58.5" cy="787.0156" fill="#E2E2F0" rx="8" ry="8" style="stroke:#181818;stroke-width:0.5;"/><path d="M58.5,795.0156 L58.5,822.0156 M45.5,803.0156 L71.5,803.0156 M58.5,822.0156 L45.5,837.0156 M58.5,822.0156 L71.5,837.0156 " fill="none" style="stroke:#181818;stroke-width:0.5;"/><rect fill="#E2E2F0" height="46.5938" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="99" x="312" y="33.7031"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="85" x="319" y="53.6982">gitea-deploy</text><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="26" x="348.5" y="69.9951">Skill</text><rect fill="#E2E2F0" height="46.5938" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="99" x="312" y="762.2188"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="85" x="319" y="782.2139">gitea-deploy</text><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="26" x="348.5" y="798.5107">Skill</text><rect fill="#E2E2F0" height="30.2969" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="70" x="531.5" y="50"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="56" x="538.5" y="69.9951">Local git</text><rect fill="#E2E2F0" height="30.2969" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="70" x="531.5" y="762.2188"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="56" x="538.5" y="782.2139">Local git</text><rect fill="#E2E2F0" height="30.2969" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="83" x="611.5" y="50"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="69" x="618.5" y="69.9951">VPS (SSH)</text><rect fill="#E2E2F0" height="30.2969" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="83" x="611.5" y="762.2188"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="69" x="618.5" y="782.2139">VPS (SSH)</text><rect fill="#E2E2F0" height="30.2969" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="75" x="783.5" y="50"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="61" x="790.5" y="69.9951">Gitea API</text><rect fill="#E2E2F0" height="30.2969" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="75" x="783.5" y="762.2188"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="61" x="790.5" y="782.2139">Gitea API</text><polygon fill="#181818" points="349.5,108.4297,359.5,112.4297,349.5,116.4297,353.5,112.4297" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="58.5" x2="355.5" y1="112.4297" y2="112.4297"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="176" x="65.5" y="107.3638">deploy gitea + push project</text><polygon fill="#181818" points="69.5,137.5625,59.5,141.5625,69.5,145.5625,65.5,141.5625" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="63.5" x2="360.5" y1="141.5625" y2="141.5625"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="279" x="75.5" y="136.4966">collect VPS host, SSH user, key, credentials</text><polygon fill="#181818" points="554.5,166.6953,564.5,170.6953,554.5,174.6953,558.5,170.6953" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="361.5" x2="560.5" y1="170.6953" y2="170.6953"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="165" x="368.5" y="165.6294">git rev-parse (check repo)</text><path d="M10,185.6953 L74,185.6953 L74,192.8281 L64,202.8281 L10,202.8281 L10,185.6953 " fill="#EEEEEE" style="stroke:#000000;stroke-width:1.5;"/><rect fill="none" height="75.3984" style="stroke:#000000;stroke-width:1.5;" width="601.5" x="10" y="185.6953"/><text fill="#000000" font-family="Arial" font-size="13" font-weight="bold" lengthAdjust="spacing" textLength="19" x="25" y="198.7622">alt</text><text fill="#000000" font-family="Arial" font-size="11" font-weight="bold" lengthAdjust="spacing" textLength="97" x="89" y="197.9058">[not a git repo]</text><polygon fill="#181818" points="69.5,219.9609,59.5,223.9609,69.5,227.9609,65.5,223.9609" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="63.5" x2="360.5" y1="223.9609" y2="223.9609"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="72" x="75.5" y="218.895">offer git init</text><polygon fill="#181818" points="554.5,249.0938,564.5,253.0938,554.5,257.0938,558.5,253.0938" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="58.5" x2="560.5" y1="253.0938" y2="253.0938"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="211" x="65.5" y="248.0278">confirm &#8594; git init + initial commit</text><polygon fill="#181818" points="641,285.2266,651,289.2266,641,293.2266,645,289.2266" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="361.5" x2="647" y1="289.2266" y2="289.2266"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="198" x="368.5" y="284.1606">ssh echo OK (connectivity test)</text><path d="M10,304.2266 L74,304.2266 L74,311.3594 L64,321.3594 L10,321.3594 L10,304.2266 " fill="#EEEEEE" style="stroke:#000000;stroke-width:1.5;"/><rect fill="none" height="46.2656" style="stroke:#000000;stroke-width:1.5;" width="411" x="10" y="304.2266"/><text fill="#000000" font-family="Arial" font-size="13" font-weight="bold" lengthAdjust="spacing" textLength="19" x="25" y="317.2935">alt</text><text fill="#000000" font-family="Arial" font-size="11" font-weight="bold" lengthAdjust="spacing" textLength="67" x="89" y="316.437">[SSH fails]</text><polygon fill="#181818" points="69.5,338.4922,59.5,342.4922,69.5,346.4922,65.5,342.4922" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="63.5" x2="360.5" y1="342.4922" y2="342.4922"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="110" x="75.5" y="337.4263">report error, stop</text><polygon fill="#181818" points="641,374.625,651,378.625,641,382.625,645,378.625" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="361.5" x2="647" y1="378.625" y2="378.625"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="103" x="368.5" y="373.5591">docker --version</text><path d="M601.5,393.625 L665.5,393.625 L665.5,400.7578 L655.5,410.7578 L601.5,410.7578 L601.5,393.625 " fill="#EEEEEE" style="stroke:#000000;stroke-width:1.5;"/><rect fill="none" height="59.2656" style="stroke:#000000;stroke-width:1.5;" width="224.5" x="601.5" y="393.625"/><text fill="#000000" font-family="Arial" font-size="13" font-weight="bold" lengthAdjust="spacing" textLength="19" x="616.5" y="406.6919">alt</text><text fill="#000000" font-family="Arial" font-size="11" font-weight="bold" lengthAdjust="spacing" textLength="139" x="680.5" y="405.8354">[Docker not installed]</text><line style="stroke:#181818;stroke-width:1.0;" x1="653" x2="695" y1="431.8906" y2="431.8906"/><line style="stroke:#181818;stroke-width:1.0;" x1="695" x2="695" y1="431.8906" y2="444.8906"/><line style="stroke:#181818;stroke-width:1.0;" x1="654" x2="695" y1="444.8906" y2="444.8906"/><polygon fill="#181818" points="664,440.8906,654,444.8906,664,448.8906,660,444.8906" style="stroke:#181818;stroke-width:1.0;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="154" x="660" y="426.8247">curl get.docker.com | sh</text><polygon fill="#181818" points="641,477.0234,651,481.0234,641,485.0234,645,481.0234" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="361.5" x2="647" y1="481.0234" y2="481.0234"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="181" x="368.5" y="475.9575">upload docker-compose.yml</text><polygon fill="#181818" points="641,506.1563,651,510.1563,641,514.1563,645,510.1563" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="361.5" x2="647" y1="510.1563" y2="510.1563"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="143" x="368.5" y="505.0903">docker compose up -d</text><path d="M302,525.1563 L379,525.1563 L379,532.2891 L369,542.2891 L302,542.2891 L302,525.1563 " fill="#EEEEEE" style="stroke:#000000;stroke-width:1.5;"/><rect fill="none" height="46.2656" style="stroke:#000000;stroke-width:1.5;" width="402.5" x="302" y="525.1563"/><text fill="#000000" font-family="Arial" font-size="13" font-weight="bold" lengthAdjust="spacing" textLength="32" x="317" y="538.2231">loop</text><text fill="#000000" font-family="Arial" font-size="11" font-weight="bold" lengthAdjust="spacing" textLength="159" x="394" y="537.3667">[poll every 5s (max 60s)]</text><polygon fill="#181818" points="641,559.4219,651,563.4219,641,567.4219,645,563.4219" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="361.5" x2="647" y1="563.4219" y2="563.4219"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="101" x="368.5" y="558.356">curl /api/healthz</text><polygon fill="#181818" points="641,595.5547,651,599.5547,641,603.5547,645,599.5547" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="361.5" x2="647" y1="599.5547" y2="599.5547"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="153" x="368.5" y="594.4888">gitea admin user create</text><polygon fill="#181818" points="809,624.6875,819,628.6875,809,632.6875,813,628.6875" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="361.5" x2="815" y1="628.6875" y2="628.6875"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="152" x="368.5" y="623.6216">POST /api/v1/user/repos</text><polygon fill="#181818" points="554.5,653.8203,564.5,657.8203,554.5,661.8203,558.5,657.8203" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="361.5" x2="560.5" y1="657.8203" y2="657.8203"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="181" x="368.5" y="652.7544">git remote add gitea ssh://...</text><polygon fill="#181818" points="554.5,682.9531,564.5,686.9531,554.5,690.9531,558.5,686.9531" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="361.5" x2="560.5" y1="686.9531" y2="686.9531"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="132" x="368.5" y="681.8872">git push -u gitea --all</text><polygon fill="#181818" points="809,712.0859,819,716.0859,809,720.0859,813,716.0859" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="361.5" x2="815" y1="716.0859" y2="716.0859"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="175" x="368.5" y="711.02">GET /api/v1/repos/... (verify)</text><polygon fill="#181818" points="69.5,741.2188,59.5,745.2188,69.5,749.2188,65.5,745.2188" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="63.5" x2="360.5" y1="745.2188" y2="745.2188"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="179" x="75.5" y="740.1528">report web URL + clone URL</text><!--SRC=[VL9DZzCm4BtxLuoMIokQ10vmw06fOjbIRSMkwCA9YzUPR4mSZsKxXI3E_01-8h-4SLBr0xKe1yUUD_FUcvdGQEkabosKMCdEn1koyODi4HPUIoF2FlueLVFagRFbMpBauTdD8dr2I1NvUerRDEJG2uP7hRIJDiBLauueinATeVwBtJJQc2kG0JQtg_Nw5Bec9GrmmW1OhXvEmv_lDp3PRDvFXp3VJiFBH0IB-zKGvbE8lIJ8teo4C8TH2Wowu3cuBjJWF7r55SM8OV0XSmwAZE5WOeIQGfm1Yu0ke9z1W_qCbCSIRUHk1N4emVevcMd0upPZgG5XecfK3JyucWff8bYA87SWHmBWh0AgAZuJIbiT6NLYR2HIP2ljM_Zpw_SUoVRImS8utBQSYhOyafWSpI5m0r3L17UtB92iPRDwgsCF4KCSTIR7bTHiy8B49Dz7GE-9sn8YkRDS9QacgSwsw8CcEnI_7XzJBxGDKNAxI-P96Vj4rNbU3OpvM25dF_0JGdsMfUC9ot97bZ7KKS2yRyq5EJi4vq76rGoH0yTJ1pReUtWLODBAx_3wHPWU-pzILaYdYnhPJVtZhAHntMJPQZkiJbeQ6V40uuLbsFtTvc4ijdrP95oH6djfhLgAo3NBNNKUvBmeyZm_XnxsFEjsq2pZBej_sPVl3kG3Roe64sw2hlgf-D_Wl-4ZVFguverJXYoc_xy0]--></g></svg>