This commit is contained in:
Mark Randall Havens 2025-06-09 18:15:22 -05:00
parent c1c87bba09
commit 19b5f1d620
11 changed files with 1376 additions and 156 deletions

View file

@ -1,16 +1,16 @@
-----BEGIN PGP SIGNATURE----- -----BEGIN PGP SIGNATURE-----
iQIzBAABCgAdFiEEif0F7T4AkoRgIfM3TifTfDWIcr8FAmhHZpYACgkQTifTfDWI iQIzBAABCgAdFiEEif0F7T4AkoRgIfM3TifTfDWIcr8FAmhHav8ACgkQTifTfDWI
cr/avw/8DojCsKCDf3KSvPV4ihXY+4NB2HGoVy67MgWCkT5fI+yCmyCZqYt2XBnG cr/onQ//SErngjxex16eFaIv3YAkAA0q5rOE/KdCYyaFbONn5aeQA+UEJgzkQUMz
BB1YgDF1A3EKYnHH/IFSThAOUI41gBUHckBNTiSlWQ9c4w2oa42Dl8ybuxgYTGvG LLCSjC6snHbmL++qPvOPzBbp8zZ3aktIgZAaOXYC2MUuz7l1O1apfG6pZTVh6x4R
3d2bWHxDZGpRZL1k5DqhzedH4vL+MBEG7uNG+ikb6guCLKksJzK0k3ErgyiawZkj TenLORc7PzqZ65wkIfLdmAJagjVsPHMCGW7SMyfAr+q401TJCNPs3w7Gi4oyvrgZ
Ou+g9+8UAkuUk0fdvxJxLTbBgUwM48fwdXjF6FL3kliClYB6lgs+4eL9wxt1quzT V1Kw7dUznrpRzB/KaHzZK998pAOe2P1KaF0J4LdmBYOnBBRvDqAuA/wegS9gpzpq
uRfrrFXiyc73YG20kd5OZZLN//bkcNGl34AJ5XkycoDWTEdP9dp/Tsrs2TAglByC uJGkxkeENdFyIOpwRrXh+4dbjdcW5YrNosZveJWWL7WJwL/yEfWWaLuI6cGr4wWu
dMVbAnMHRB3GTsdBnNoMUuTnbqrIWBtQGAHf5vIPoBy04CeKwIQ8WMW/wWRGLpUP S3g/BJYBj0bLNwoLPG7oCj5DQslW8CS6BseYO4LLnpXsHgJywLaTu6/XxDoylSMt
QC5gNrzz2bLnipIDlp454yoEYHLlDqj2MfRMe7yhP9XdJQwFH9O9+aYLi/fDIBaf WhmMq3PH7u6KImbHbgMuY7Y5AdwUe0St3PM8kd4lciRJXSy6exvPGO3+/dlmYrB8
xSwP2c8mqlk9gprCQyzyqTrlPPQK8vHY6Q7uQivBdD3gdVUTQaXXblLW1/erjfIm 7c4a2jVhmQXW0vQUj+WkR+mqYFAvPJIMYn+jOQyUhdZi9SbCKffgreNFfoI62fNo
R1BdJO4Bj18StIiSaDRO3hsH0xsGFXzdh1iXQgUn9ahl0XPHbxIR1TU+dY3CPAA0 w692YF1hE8Kyn0dPClRi+yL+40vbFNwkD7OqoKJYf+gYxuWkrq4q9X/lLcZTeHQe
8mwfGNxjuBHhoWjBBvun3h1XQosMNOYlnl2LikCItmhtE+4PhVsIPLiDAyD4WzhN TxKuNsdz018ZagbYUOXTCH+QtIqOHW5VDCcRY2GExhZiY8YcVuFTZGJaiGdDhPDi
VicaPhGXC9XKzxNIhDkfFdLIbK0Z7x6jW7rmmmGG5sNQaTOElsQ= QSvAY6XYR50MAgyHHtwaSsl04iO+9h5y6iqB9Xr4Tm9zZahxMXw=
=LAeK =vJNA
-----END PGP SIGNATURE----- -----END PGP SIGNATURE-----

View file

@ -1,16 +1,16 @@
-----BEGIN PGP SIGNATURE----- -----BEGIN PGP SIGNATURE-----
iQIzBAABCgAdFiEEif0F7T4AkoRgIfM3TifTfDWIcr8FAmhHZp4ACgkQTifTfDWI iQIzBAABCgAdFiEEif0F7T4AkoRgIfM3TifTfDWIcr8FAmhHauIACgkQTifTfDWI
cr8rgg//QtCueUqkdRdtix4jMV9Rs8zvQxAIwKQrfQ3zcw/7Zr/Jthgk7AZrtzZa cr/KQw/9HkOl1IRURvjmi1tiEuguuEXIvj5BNVBmIRAYE5FmsOr+495FK2fL7ArT
2Fxfmlv5iReHzYR/qyO7SNpU3juR2eCWPccxjjIvo/zlh95zLIXPv73U2aB4hUrk /4Gcpako1VTwmYEzF+JdJqqb9kVAbnzkOdXsV6Mb7eaGpRsleU+xSQpDyAP/K8yC
n4LNij3OJAr321lICh3cyD5yB7+rHWRnFr6xx5zXSmB4Yg0yyVbY/QGaVDlkE4AN VDB47UXxeDB/aiEfcLiNcWdqVLBdin8YMlbep1UQk/zjTuTAc18JtYnSqZgwcYef
pFJTFV+7h47AlbjMkP1nAUUB4P3tWoEWw11WAZmt9sfUVVZB0ltiyLYk/YmHZfCX 7ya6KYhar9EaV7mou9e6o71nwaxb+CMMsXONp2yMigyO4+a9fKWHEvFxNlyUKs5Q
mJ6da/5FFS13MAc/4rVtEpEAKuMBO54PETjx2ij/0rxCHDxjPcC9MSU1QQnk/MWK 7I3rQO7ZwqJ0JkgT6QxcVYBl+vp/OfqubWL8CbpH6COTfLM5+120mb3eALabMgDc
s/Uv7w/cBijZ+yCgzt7TYzMmvPnS+bDxoFWDho26jPj8N96rxyztw8sQHkXHokPv rC7tLhcZTGmH5mD4qteZTA8hWIExJGPB9vfTdFWvr+gZTh7E3Xg9hDB2M2PFqa98
6ag28vU2+NTx0j3CsgkK99/ud6/KVrKUyAifUOnfFidRCNTuHZdN4O9xQ96z3JBi RFeSv5EZR/WWER26FdfBIYw9VGn8j9V9AVYIOYHXsmTjqfltQRk0348tt9nebhh0
KtuaEmnZTVTP0zA8zKLuooW7H4p1oeF1juBnpYSnVa/Qmv/VGVnHHuTrqPJuTaS5 nFDg8Kgem6BUQhF+GCp0BBn1AJFfDVBROCLkYmK26uJ0uSURl2Xu4uZUMLutSOig
47kI62Ipc3YLMZpy9uxflEoD8ZqaXGXFc3wjhBHYxppxIVJRBWmAf6s1/Nr+lKQx 9vGPFYhkstJlPYcq7BM95SoptFeVYadAIX2tMOui/IuxM6ZEYCYcrHEBd2s+YxQp
TC8Atz7zRSPPFupeJn/rN1NZisJQw2GTYaovphrLlz1swQGxvbpkhZ0TG9iW9w0p YD6/cGrhDGjq6pTHgofLsvLqmDY+z4L5v1nr4eLxzKxJFeEry+EAzNYD/BupgE7F
6Iv9EZltwyKfAO0lWqIe4Zak6KR4opFgLgbFJW6qenDYbL9OOkk= LG7vjaHmxNKOWGxz92kU01v9wBR/MRstwXZQvTcrx7Ip2U7r3dc=
=wFQ/ =x5Er
-----END PGP SIGNATURE----- -----END PGP SIGNATURE-----

View file

@ -1,16 +1,16 @@
-----BEGIN PGP SIGNATURE----- -----BEGIN PGP SIGNATURE-----
iQIzBAABCgAdFiEEif0F7T4AkoRgIfM3TifTfDWIcr8FAmhHZqYACgkQTifTfDWI iQIzBAABCgAdFiEEif0F7T4AkoRgIfM3TifTfDWIcr8FAmhHauYACgkQTifTfDWI
cr+sZA/8CPvqrBJ6dRSKeTdHi+uZZjeiF29H1qS1zuJN3s3QTUmmSIgAK8YF/z9K cr/q3g//T4n9i9W2BLzMoHhiRVcYXXEv2voUmOu7mxc/b+BrbjqtteCkqYAO8U78
ijEmtmx6MYTRJQ0MC/esUmKSBrIYXDEZw4BuL6wgx4REFtwIUUcqkcYMrqQqqsyT CKER/YB+ZJ7Mt4rgYZG3+oJ6rgVCrTUFc7SX8e54NzUx054tsX5r8oEKgD673ENe
r3MgtAY1fTh+Bc2/TlE+9+rS2Iw/l59fTuxF5aor8q6yv2w4NJG8HzZXDG1vwi8r BguXxC8a2MpNHo+Rl21PXqg96RoPwOKntKhDVnz8SUouSz7Dq9eeTuKT/aJWowQm
9eWsIhUIFXrPhODPT2bW/epqOiwrm4gtyAEwlU0mssy7jJy17k9aQ4i1JnqdWY4o FvFtcaqpIlKXdNoPp1nesca7d7pBYi/ODIxy0XAUnRsUTBkUBRDyhUtUbG31BqIe
Q6pPoEVJBuNsmI03lLoNbsTdraBo7JtqUcTrRRUuiIlTAF2ho08JoaxDljM+5TQo PfLLW6U/0oDuW7+65D910Ipe78JVOpYWfg5sSDOVYe/Cg8pzMKkd28NQKdLZGNhm
vONpioB8VG/iUbOc2WlELpjjGbTZcN4oTB3d7zmZDH6R/QhxxT03cey9xvWKkLiP biGNFGLNvk+cKhfyuMiV8lasDdKgaYYuxgL0VeKsFkJ+k5UOyaPrpfLrtbQ+A0Zc
wS0WewSqmArQur2UOMWJGpnc1DEZG38KgAj2COu2ilFgYmQGCUtUn+9o9vgSVFLY 8wp8l6jcpFX28RFx0u3abnC5RneYUopXfSDo+NcS4nYwLQ0RCOIe6ldOlVg8JbV+
ZliSEjT1teLyQ0ob9RzauWnJq1iRhPJMKSjCs8dUtw+w0iW/tPiciJsDyWyHh7Nk oL8xN92ebOfsRr0x0RR0dRZV8OttSameEkkvQgW6o6eTFRBfIqByk+PsIIxpwalY
sD1NMrnUVRzQDGHksPI4g4sAjzT8RcKXppu+Kf1b41Oa1WFUwuhaIRJau7SICHy9 TM76+5+9f7yNgaFYENKspQBSUzIX9qey40F+qgOJ6iZDah6mxc7KmVpkemkIiY4D
pFEv8KEpmO8f+Fg07SmaaEj76oerapz90kxBcVOKw90sOJzS+JKv1xKMrpvGzLjF jU/RIlZs7j9ZuY7RziKNydqxc6JmxcH3/ce62EMKza1bDkDRjW4Pe9cXA64ffPDX
8qVUrnxK+Z1u1lgNp3CeDsD0tIPfDWsfN1AlqylbKKWLZfC/+ps= bzW9IFDMepBAJoVD97eR9c8SI4hqxfCq+w+MX/5S97Hv51p/7yA=
=HSMP =dz8e
-----END PGP SIGNATURE----- -----END PGP SIGNATURE-----

View file

@ -33,10 +33,17 @@ DOCS_NOJEKYLL="$DOCS_DIR/.nojekyll"
DOCS_ROBOTS="$DOCS_DIR/robots.txt" DOCS_ROBOTS="$DOCS_DIR/robots.txt"
DOCS_SITEMAP="$DOCS_DIR/sitemap.xml" DOCS_SITEMAP="$DOCS_DIR/sitemap.xml"
DOCS_INTEGRITY="$DOCS_DIR/integrity.sha256" DOCS_INTEGRITY="$DOCS_DIR/integrity.sha256"
GITLAB_CI="$REPO_PATH/.gitlab-ci.yml"
CODEBERG_CI="$REPO_PATH/.codeberg-ci.yml"
TIMESTAMP=$(date -u '+%Y-%m-%dT%H:%M:%SZ') TIMESTAMP=$(date -u '+%Y-%m-%dT%H:%M:%SZ')
SCRIPT_VERSION="1.4" # Updated for GPG integration SCRIPT_VERSION="1.5" # Updated for CI/CD and GPG enhancements
PRESERVE_META=${PRESERVE_META:-false} # Preserve existing metadata PRESERVE_META=${PRESERVE_META:-false} # Preserve existing metadata
FORCE_DOCS=${FORCE_DOCS:-false} # Force overwrite of /docs metadata FORCE_DOCS=${FORCE_DOCS:-false} # Force overwrite of /docs metadata
SKIP_CI=${SKIP_CI:-false} # Skip CI/CD file generation
GPG_FORCE=${GPG_FORCE:-true} # Force GPG overwrites
CI_STATUS=${CI_STATUS:-mock} # Mock or live CI status
CI_STATUS_GITLAB="unknown"
CI_STATUS_CODEBERG="unknown"
# URLs for each platform # URLs for each platform
CANONICAL_URL="https://remember.thefoldwithin.earth/mrhavens/$REPO_NAME" CANONICAL_URL="https://remember.thefoldwithin.earth/mrhavens/$REPO_NAME"
@ -128,7 +135,7 @@ sign_file() {
return return
fi fi
for key_id in "${GPG_KEYS[@]}"; do for key_id in "${GPG_KEYS[@]}"; do
gpg --armor --detach-sign --default-key "$key_id" "$file" > "$sig_file.$key_id" 2>/dev/null || warn "Failed to sign $file with key $key_id, continuing..." gpg --armor --detach-sign --default-key "$key_id" --yes --batch "$file" > "$sig_file.$key_id" 2>/dev/null || warn "Failed to sign $file with key $key_id, continuing..."
if [ -f "$sig_file.$key_id" ]; then if [ -f "$sig_file.$key_id" ]; then
git -C "$REPO_PATH" add "$sig_file.$key_id" git -C "$REPO_PATH" add "$sig_file.$key_id"
git -C "$REPO_PATH" commit -m "Signed $file with GPG key $key_id at $TIMESTAMP" || warn "No changes to commit for $sig_file.$key_id" git -C "$REPO_PATH" commit -m "Signed $file with GPG key $key_id at $TIMESTAMP" || warn "No changes to commit for $sig_file.$key_id"
@ -158,6 +165,81 @@ copy_to_docs() {
info "Copied $src to $dest and committed" info "Copied $src to $dest and committed"
} }
# ╭─────────────────────────────────────╮
# │ CI/CD GENERATION │
# ╰─────────────────────────────────────╮
generate_gitlab_ci() {
if [ "$SKIP_CI" = "true" ]; then
info "Skipping .gitlab-ci.yml generation (--skip-ci enabled)"
return
fi
info "Generating $GITLAB_CI..."
if [ "$PRESERVE_META" = "true" ] && [ -f "$GITLAB_CI" ]; then
info "Preserving existing $GITLAB_CI (--preserve-meta enabled)"
return
fi
cat > "$GITLAB_CI" <<EOF
# GitLab CI configuration for GitField Pages deployment
# Generated by gitfield-sync at $TIMESTAMP (v$SCRIPT_VERSION)
stages:
- deploy
pages:
stage: deploy
script:
- cp -r docs/ public/
artifacts:
paths:
- public
only:
- main
EOF
git -C "$REPO_PATH" add "$GITLAB_CI"
git -C "$REPO_PATH" commit -m "Generated .gitlab-ci.yml at $TIMESTAMP" || warn "No changes to commit for $GITLAB_CI"
info "Generated and committed $GITLAB_CI"
}
generate_codeberg_ci() {
if [ "$SKIP_CI" = "true" ]; then
info "Skipping .codeberg-ci.yml generation (--skip-ci enabled)"
return
fi
if ! git -C "$REPO_PATH" remote -v | grep -q "codeberg.org"; then
info "No Codeberg remote detected, skipping .codeberg-ci.yml generation"
return
fi
info "Generating $CODEBERG_CI..."
if [ "$PRESERVE_META" = "true" ] && [ -f "$CODEBERG_CI" ]; then
info "Preserving existing $CODEBERG_CI (--preserve-meta enabled)"
return
fi
cat > "$CODEBERG_CI" <<EOF
# Codeberg CI configuration for GitField Pages deployment
# Generated by gitfield-sync at $TIMESTAMP (v$SCRIPT_VERSION)
name: Deploy Pages
on:
push:
branches:
- main
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Copy docs to public
run: cp -r docs/ public/
- name: Deploy to Codeberg Pages
uses: actions/upload-pages-artifact@v1
with:
path: public
EOF
git -C "$REPO_PATH" add "$CODEBERG_CI"
git -C "$REPO_PATH" commit -m "Generated .codeberg-ci.yml at $TIMESTAMP" || warn "No changes to commit for $CODEBERG_CI"
info "Generated and committed $CODEBERG_CI"
}
# ╭─────────────────────────────────────╮ # ╭─────────────────────────────────────╮
# │ METADATA GENERATION │ # │ METADATA GENERATION │
# ╰─────────────────────────────────────╮ # ╰─────────────────────────────────────╮
@ -185,7 +267,11 @@ $(printf ' "%s",\n' "${MIRRORS[@]}" | sed '$ s/,$//')
$(for i in "${!GPG_KEYS[@]}"; do $(for i in "${!GPG_KEYS[@]}"; do
echo " {\"key_id\": \"${GPG_KEYS[i]}\", \"name\": \"${GPG_NAMES[i]}\", \"email\": \"${GPG_EMAILS[i]}\"}" | sed '$ s/,$//' echo " {\"key_id\": \"${GPG_KEYS[i]}\", \"name\": \"${GPG_NAMES[i]}\", \"email\": \"${GPG_EMAILS[i]}\"}" | sed '$ s/,$//'
done) done)
] ],
"ci_status": {
"gitlab": "$CI_STATUS_GITLAB",
"codeberg": "$CI_STATUS_CODEBERG"
}
} }
EOF EOF
# Sanitize rad:rad: # Sanitize rad:rad:
@ -226,6 +312,11 @@ $(for i in "${!GPG_KEYS[@]}"; do
echo "- **${GPG_NAMES[i]}** <${GPG_EMAILS[i]}> (Key ID: ${GPG_KEYS[i]})" echo "- **${GPG_NAMES[i]}** <${GPG_EMAILS[i]}> (Key ID: ${GPG_KEYS[i]})"
done) done)
## CI/CD Status
- **GitLab Pages**: $CI_STATUS_GITLAB
- **Codeberg Pages**: $CI_STATUS_CODEBERG
## Mirror Repositories ## Mirror Repositories
The project is mirrored across multiple platforms to enhance redundancy and accessibility: The project is mirrored across multiple platforms to enhance redundancy and accessibility:
@ -285,7 +376,11 @@ $(printf ' "%s",\n' "${MIRRORS[@]}" | sed '$ s/,$//')
$(for i in "${!GPG_KEYS[@]}"; do $(for i in "${!GPG_KEYS[@]}"; do
echo " {\"key_id\": \"${GPG_KEYS[i]}\", \"name\": \"${GPG_NAMES[i]}\", \"email\": \"${GPG_EMAILS[i]}\"}" | sed '$ s/,$//' echo " {\"key_id\": \"${GPG_KEYS[i]}\", \"name\": \"${GPG_NAMES[i]}\", \"email\": \"${GPG_EMAILS[i]}\"}" | sed '$ s/,$//'
done) done)
] ],
"ci_status": {
"gitlab": "$CI_STATUS_GITLAB",
"codeberg": "$CI_STATUS_CODEBERG"
}
} }
EOF EOF
# Sanitize rad:rad: # Sanitize rad:rad:
@ -324,7 +419,11 @@ $(printf ' "%s",\n' "${MIRRORS[@]}" | sed '$ s/,$//')
$(for i in "${!GPG_KEYS[@]}"; do $(for i in "${!GPG_KEYS[@]}"; do
echo " {\"key_id\": \"${GPG_KEYS[i]}\", \"name\": \"${GPG_NAMES[i]}\", \"email\": \"${GPG_EMAILS[i]}\"}" | sed '$ s/,$//' echo " {\"key_id\": \"${GPG_KEYS[i]}\", \"name\": \"${GPG_NAMES[i]}\", \"email\": \"${GPG_EMAILS[i]}\"}" | sed '$ s/,$//'
done) done)
] ],
"ci_status": {
"gitlab": "$CI_STATUS_GITLAB",
"codeberg": "$CI_STATUS_CODEBERG"
}
} }
EOF EOF
# Sanitize rad:rad: # Sanitize rad:rad:
@ -417,7 +516,11 @@ $(printf ' "%s",\n' "${MIRRORS[@]}" | sed '$ s/,$//')
$(for i in "${!GPG_KEYS[@]}"; do $(for i in "${!GPG_KEYS[@]}"; do
echo " {\"key_id\": \"${GPG_KEYS[i]}\", \"name\": \"${GPG_NAMES[i]}\", \"email\": \"${GPG_EMAILS[i]}\"}" | sed '$ s/,$//' echo " {\"key_id\": \"${GPG_KEYS[i]}\", \"name\": \"${GPG_NAMES[i]}\", \"email\": \"${GPG_EMAILS[i]}\"}" | sed '$ s/,$//'
done) done)
] ],
"ci_status": {
"gitlab": "$CI_STATUS_GITLAB",
"codeberg": "$CI_STATUS_CODEBERG"
}
} }
</script> </script>
</head> </head>
@ -435,9 +538,14 @@ done)
<p>Signed with the following GPG keys:</p> <p>Signed with the following GPG keys:</p>
<ul> <ul>
$(for i in "${!GPG_KEYS[@]}"; do $(for i in "${!GPG_KEYS[@]}"; do
echo " <li>${GPG_NAMES[i]} &lt;${GPG_EMAILS[i]}&gt; (Key ID: ${GPG_KEYS[i]})</li>" echo " <li>${GPG_NAMES[i]} <${GPG_EMAILS[i]}> (Key ID: ${GPG_KEYS[i]})</li>"
done) done)
</ul> </ul>
<p>CI/CD Status:</p>
<ul>
<li>GitLab Pages: $CI_STATUS_GITLAB</li>
<li>Codeberg Pages: $CI_STATUS_CODEBERG</li>
</ul>
</section> </section>
<section> <section>
<h2>Mirror Repositories</h2> <h2>Mirror Repositories</h2>
@ -466,15 +574,15 @@ done)
</section> </section>
<section> <section>
<h2>Why Recursive Sovereignty Matters</h2> <h2>Why Recursive Sovereignty Matters</h2>
<p>The GitField framework distributes <code>$REPO_NAME</code> across decentralized (Radicle), self-hosted (Forgejo), and community-driven (Codeberg, Gitea) platforms, alongside mainstream services (GitHub, GitLab, Bitbucket). This recursive strategy defends against past deplatforming attempts by individuals such as Joel Johnson, Dr. Peter Gaied, and Andrew LeCody, ensuring the project's persistence and accessibility.</p> <p>The GitField framework distributes <code>$REPO_NAME</code> across decentralized (Radicle), self-hosted (Forgejo), and community-driven (Codeberg, Gitea) platforms, alongside mainstream services (GitHub, GitLab, Bitbucket). This recursive strategy defends against past deplatforming attempts by individuals such as Joel Johnson, Dr. LeCody, and Andrew LeCody, ensuring the project's persistence and accessibility.</p>
</section> </section>
<section> <section>
<h2>Source Links</h2> <h2>Source Links</h2>
<p>Access the project's metadata and logs:</p> <p>Access the project's metadata and logs:</p>
<ul> <ul>
<li><a href="pushed.log">pushed.log</a> (Audit trail of sync operations)</li> <li><a href="pushed.log">pushed Log</a> (Audit trail of sync operations)</li>
<li><a href="../GITFIELD.md">GITFIELD.md</a> (Multi-repository strategy overview)</li> <li><a href="../GITFIELD_GITLAB.md">GitLab</a> (Multi-repo manifest)</a></li>
<li><a href="gitfield.README.txt">gitfield.README.txt</a> (Metadata directory explanation)</li> <li><a href="gitfieldtown.README.txt">GitField</a> README.txt</a> (Metadata directory explanation)</li>
</ul> </ul>
</section> </section>
</main> </main>
@ -494,7 +602,7 @@ EOF
generate_docs_css() { generate_docs_css() {
info "Generating $DOCS_CSS..." info "Generating $DOCS_CSS..."
mkdir -p "$DOCS_DIR" mkdir -p "$DOCS_DIR"
if [ "$PRESERVE_META" = "true" ] && [ -f "$DOCS_CSS" ]; then if [ -f "$DOCS_CSS" ] && [ "$PRESERVE_META" = "true" ]; then
info "Preserving existing $DOCS_CSS (--preserve-meta enabled)" info "Preserving existing $DOCS_CSS (--preserve-meta enabled)"
return return
fi fi
@ -573,15 +681,19 @@ $(printf ' "%s",\n' "${MIRRORS[@]}" | sed '$ s/,$//')
$(for i in "${!GPG_KEYS[@]}"; do $(for i in "${!GPG_KEYS[@]}"; do
echo " {\"key_id\": \"${GPG_KEYS[i]}\", \"name\": \"${GPG_NAMES[i]}\", \"email\": \"${GPG_EMAILS[i]}\"}" | sed '$ s/,$//' echo " {\"key_id\": \"${GPG_KEYS[i]}\", \"name\": \"${GPG_NAMES[i]}\", \"email\": \"${GPG_EMAILS[i]}\"}" | sed '$ s/,$//'
done) done)
] ],
"ci_status": {
"gitlab": "$CI_STATUS_GITLAB",
"codeberg": "$CI_STATUS_CODEBERG"
}
} }
EOF EOF
# Sanitize rad:rad: # Sanitize rad:rad:
sed -i 's/rad:rad:/rad:/g' "$DOCS_REPOS_JSON" sed -i 's/rad:rad:/rad:/g' "$DOCS_REPOS_JSON"
git -C "$REPO_PATH" add "$DOCS_REPOS_JSON" git -C "$REPO_PATH" add "$DOCS_REPOS_JSON"
git -C "$REPO_PATH" commit -m "Generated docs/repos.json at $TIMESTAMP" || warn "No changes to commit for $DOCS_REPOS_JSON" git -C "$REPO_PATH" commit -m "Generated docs/repos.json at $TIMESTAMP" || warn "No changes to commit for $DOCS_REPOS_JSON"
info "Generated and committed $DOCS_REPOS_JSON"
sign_file "$DOCS_REPOS_JSON" sign_file "$DOCS_REPOS_JSON"
info "Generated and committed $DOCS_REPOS_JSON"
} }
generate_docs_readme() { generate_docs_readme() {
@ -594,7 +706,7 @@ generate_docs_readme() {
cat > "$DOCS_README" <<EOF cat > "$DOCS_README" <<EOF
# GitField /docs Directory # GitField /docs Directory
The `/docs` directory hosts a public-facing, SEO-optimized canonical declaration for the \`$REPO_NAME\` repository, designed for GitHub Pages compatibility and enhanced discoverability. The `/docs` directory hosts a public-facing, SEO-optimized canonical declaration for the \`$REPO_NAME\` repository, designed for GitHub Pages, GitLab Pages, and Codeberg Pages compatibility and enhanced discoverability.
## Files ## Files
@ -614,6 +726,11 @@ The `/docs` directory hosts a public-facing, SEO-optimized canonical declaration
- **sitemap.xml**: Auto-generated sitemap for improved SEO. - **sitemap.xml**: Auto-generated sitemap for improved SEO.
- **integrity.sha256**: SHA-256 hash of all metadata files for integrity verification. - **integrity.sha256**: SHA-256 hash of all metadata files for integrity verification.
## CI/CD Integration
- **GitLab Pages**: Deployed via `.gitlab-ci.yml`, status: $CI_STATUS_GITLAB
- **Codeberg Pages**: Deployed via `.codeberg-ci.yml`, status: $CI_STATUS_CODEBERG
## Purpose ## Purpose
This directory ensures the \`$REPO_NAME\` project is discoverable via search engines and accessible to humans and bots. It declares the canonical repository at [$CANONICAL_URL]($CANONICAL_URL) and links to all mirrors, reinforcing the GitField recursive metadata strategy for sovereign publishing. This directory ensures the \`$REPO_NAME\` project is discoverable via search engines and accessible to humans and bots. It declares the canonical repository at [$CANONICAL_URL]($CANONICAL_URL) and links to all mirrors, reinforcing the GitField recursive metadata strategy for sovereign publishing.
@ -679,6 +796,18 @@ generate_docs_sitemap() {
<changefreq>weekly</changefreq> <changefreq>weekly</changefreq>
<priority>0.9</priority> <priority>0.9</priority>
</url> </url>
<url>
<loc>$GITLAB_URL/-/jobs/artifacts/main/raw/public/index.html?job=pages</loc>
<lastmod>$TIMESTAMP</lastmod>
<changefreq>weekly</changefreq>
<priority>0.9</priority>
</url>
<url>
<loc>https://mrhavens.codeberg.page/$REPO_NAME/index.html</loc>
<lastmod>$TIMESTAMP</lastmod>
<changefreq>weekly</changefreq>
<priority>0.9</priority>
</url>
<url> <url>
<loc>$GITHUB_URL/docs/canonical.meta</loc> <loc>$GITHUB_URL/docs/canonical.meta</loc>
<lastmod>$TIMESTAMP</lastmod> <lastmod>$TIMESTAMP</lastmod>
@ -704,7 +833,8 @@ generate_docs_sitemap() {
<priority>0.8</priority> <priority>0.8</priority>
</url> </url>
<url> <url>
<loc>$GITHUB_URL/docs/.well-known/gitfield.json</loc> <loc>$GITHUB_URL/docs/.well-known/repo.$REPO_NAME.json</loc>
<url>
<lastmod>$TIMESTAMP</lastmod> <lastmod>$TIMESTAMP</lastmod>
<changefreq>weekly</changefreq> <changefreq>weekly</changefreq>
<priority>0.8</priority> <priority>0.8</priority>
@ -722,7 +852,7 @@ generate_docs_sitemap() {
<priority>0.8</priority> <priority>0.8</priority>
</url> </url>
<url> <url>
<loc>$GITHUB_URL/docs/gitfield.README.txt</loc> <url>$GITHUB_URL/docs/gitfieldtown.README.txt</loc>
<lastmod>$TIMESTAMP</lastmod> <lastmod>$TIMESTAMP</lastmod>
<changefreq>weekly</changefreq> <changefreq>weekly</changefreq>
<priority>0.8</priority> <priority>0.8</priority>
@ -730,7 +860,7 @@ generate_docs_sitemap() {
$(for mirror in "${MIRRORS[@]}"; do $(for mirror in "${MIRRORS[@]}"; do
if [[ "$mirror" != rad:* ]]; then if [[ "$mirror" != rad:* ]]; then
echo " <url>" echo " <url>"
echo " <loc>$mirror</loc>" echo " <loc>$mirror</loc></loc>"
echo " <lastmod>$TIMESTAMP</lastmod>" echo " <lastmod>$TIMESTAMP</lastmod>"
echo " <changefreq>weekly</changefreq>" echo " <changefreq>weekly</changefreq>"
echo " <priority>0.8</priority>" echo " <priority>0.8</priority>"
@ -756,7 +886,7 @@ generate_docs_integrity() {
# Generated by gitfield-sync at $TIMESTAMP (v$SCRIPT_VERSION) # Generated by gitfield-sync at $TIMESTAMP (v$SCRIPT_VERSION)
EOF EOF
for file in "$DOCS_CANONICAL_META" "$DOCS_CANONICAL_MD" "$DOCS_INDEX_JSON" "$DOCS_GITFIELD_JSON" "$DOCS_WELL_KNOWN_JSON" "$DOCS_REPOS_JSON" "$DOCS_PUSHED_LOG" "$DOCS_GITFIELD_README"; do for file in "$DOCS_CANNONICAL_META" "$DOCS_CANNICAL_MD" "$DOCS_INDEX_JSON" "$DOCS_GITFIELD_JSON" "$DOCS_WELL_KNOWN_JSON" "$DOCS_REPOS_JSON" "$DOCS_PUSHED_LOG" "$DOCS_GITFIELD_README"; do
if [ -f "$file" ]; then if [ -f "$file" ]; then
sha256sum "$file" >> "$DOCS_INTEGRITY" || warn "Failed to compute SHA-256 for $file, continuing..." sha256sum "$file" >> "$DOCS_INTEGRITY" || warn "Failed to compute SHA-256 for $file, continuing..."
else else
@ -765,21 +895,54 @@ EOF
done done
git -C "$REPO_PATH" add "$DOCS_INTEGRITY" git -C "$REPO_PATH" add "$DOCS_INTEGRITY"
git -C "$REPO_PATH" commit -m "Generated docs/integrity.sha256 at $TIMESTAMP" || warn "No changes to commit for $DOCS_INTEGRITY" git -C "$REPO_PATH" commit -m "Generated docs/integrity.sha256 at $TIMESTAMP" || warn "No changes to commit for $DOCS_INTEGRITY"
info "Generated and committed $DOCS_INTEGRITY"
sign_file "$DOCS_INTEGRITY" sign_file "$DOCS_INTEGRITY"
info "Generated and committed $DOCS_INTEGRITY"
} }
# ╭─────────────────────────────────────╮ # ╭─────────────────────────────────────╮
# │ INITIAL SETUP # │ TRIGGER CI PIPELINE
# ╰─────────────────────────────────────╮ # ╰─────────────────────────────────────╮
mkdir -p "$GITFIELD_DIR" "$WELL_KNOWN_DIR" "$DOCS_DIR" "$DOCS_WELL_KNOWN_DIR" trigger_ci_pipeline() {
local platform=$1
local url=$2
local token_var=$3
local project_id=$4
local timestamp=$(date -u '+%Y-%m-%dT%H:%M:%SZ')
if [ ! -f "$LOG_FILE" ]; then if [ "$CI_STATUS" = "mock" ]; then
echo "# Push Log for $REPO_NAME" > "$LOG_FILE" info "CI status set to mock, skipping $platform pipeline trigger"
echo "# Generated by gitfield-sync" >> "$LOG_FILE" echo "[$timestamp] $platform: Pipeline trigger skipped (mock mode)" >> "$LOG_FILE"
echo "" >> "$LOG_FILE"
copy_to_docs "$LOG_FILE" "$DOCS_PUSHED_LOG" copy_to_docs "$LOG_FILE" "$DOCS_PUSHED_LOG"
fi return
fi
if [ -z "${!token_var}" ]; then
warn "$platform API token ($token_var) not set, skipping pipeline trigger"
echo "[$timestamp] $platform: Pipeline trigger skipped (no API token)" >> "$LOG_FILE"
copy_to_docs "$LOG_FILE" "$DOCS_PUSHED_LOG"
return
fi
local response
if [ "$platform" = "GitLab" ]; then
response=$(curl -s -X POST \
-H "PRIVATE-TOKEN: ${!token_var}" \
"$url/api/v4/projects/$project_id/pipeline?ref=main" | jq '.status' 2>/dev/null)
elif [ "$platform" = "Codeberg" ]; then
response=$(curl -s -X POST \
-H "Authorization: Bearer ${!token_var}" \
"$url/api/v1/repos/mrhavens/$REPO_NAME/actions/runs" | jq '.status' 2>/dev/null)
fi
if [ -n "$response" ]; then
echo "[$timestamp] $platform: Pipeline triggered, status: $response" >> "$LOG_FILE"
info "$platform pipeline triggered, status: $response"
else
echo "[$timestamp] $platform: Pipeline trigger failed" >> "$LOG_FILE"
warn "$platform pipeline trigger failed"
fi
copy_to_docs "$LOG_FILE" "$DOCS_PUSHED_LOG"
}
# ╭─────────────────────────────────────╮ # ╭─────────────────────────────────────╮
# │ GENERATE GITFIELD.MD │ # │ GENERATE GITFIELD.MD │
@ -828,6 +991,7 @@ The following platforms host the \`$REPO_NAME\` repository, each chosen for its
### 3. Codeberg ### 3. Codeberg
- **URL**: [$CODEBERG_URL]($CODEBERG_URL) - **URL**: [$CODEBERG_URL]($CODEBERG_URL)
- **CI/CD Status**: $CI_STATUS_CODEBERG
- **Purpose**: Codeberg is a community-driven, open-source platform powered by Forgejo, offering a reliable and ethical alternative for hosting git repositories. - **Purpose**: Codeberg is a community-driven, open-source platform powered by Forgejo, offering a reliable and ethical alternative for hosting git repositories.
- **Value**: Enhances project resilience with its open-source ethos and independent infrastructure, ensuring accessibility and community support. - **Value**: Enhances project resilience with its open-source ethos and independent infrastructure, ensuring accessibility and community support.
@ -838,6 +1002,7 @@ The following platforms host the \`$REPO_NAME\` repository, each chosen for its
### 5. GitLab ### 5. GitLab
- **URL**: [$GITLAB_URL]($GITLAB_URL) - **URL**: [$GITLAB_URL]($GITLAB_URL)
- **CI/CD Status**: $CI_STATUS_GITLAB
- **Purpose**: GitLab offers a comprehensive DevOps platform with advanced CI/CD capabilities, private repository options, and robust access controls. It serves as a reliable backup and a platform for advanced automation workflows. - **Purpose**: GitLab offers a comprehensive DevOps platform with advanced CI/CD capabilities, private repository options, and robust access controls. It serves as a reliable backup and a platform for advanced automation workflows.
- **Value**: Enhances project resilience with its integrated CI/CD pipelines and independent infrastructure, reducing reliance on a single provider. - **Value**: Enhances project resilience with its integrated CI/CD pipelines and independent infrastructure, reducing reliance on a single provider.
@ -862,7 +1027,7 @@ The decision to maintain multiple repositories stems from the need to safeguard
- **Diversity**: Each platforms unique features (e.g., GitHubs community, GitLabs CI/CD, Bitbuckets integrations, Radicles decentralization, Forgejos self-hosting, Codebergs community-driven model, Giteas lightweight efficiency) enhance the projects functionality and reach. - **Diversity**: Each platforms unique features (e.g., GitHubs community, GitLabs CI/CD, Bitbuckets integrations, Radicles decentralization, Forgejos self-hosting, Codebergs community-driven model, Giteas lightweight efficiency) enhance the projects functionality and reach.
- **Transparency**: Metadata snapshots in the \`.gitfield\` directory (for internal audit) and public-facing documentation in the \`/docs\` directory provide a verifiable record of the projects state across all platforms. - **Transparency**: Metadata snapshots in the \`.gitfield\` directory (for internal audit) and public-facing documentation in the \`/docs\` directory provide a verifiable record of the projects state across all platforms.
This multi-repository approach, bolstered by Forgejos sovereign hosting and GitHub Pages discoverability, reflects a commitment to preserving the integrity, accessibility, and independence of \`$REPO_NAME\`, ensuring it remains available to contributors and users regardless of external pressures. This multi-repository approach, bolstered by Forgejos sovereign hosting, GitHub Pages, GitLab Pages, and Codeberg Pages discoverability, reflects a commitment to preserving the integrity, accessibility, and independence of \`$REPO_NAME\`, ensuring it remains available to contributors and users regardless of external pressures.
--- ---
@ -873,11 +1038,17 @@ This multi-repository approach, bolstered by Forgejos sovereign hosting and G
- **SEO Metadata**: SEO-friendly metadata with Schema.org JSON-LD is available in [\`docs/gitfield.json\`](./docs/gitfield.json) and [\`docs/.well-known/gitfield.json\`](./docs/.well-known/gitfield.json). - **SEO Metadata**: SEO-friendly metadata with Schema.org JSON-LD is available in [\`docs/gitfield.json\`](./docs/gitfield.json) and [\`docs/.well-known/gitfield.json\`](./docs/.well-known/gitfield.json).
- **Push Log**: The [\`docs/pushed.log\`](./docs/pushed.log) file records the date, time, commit hash, and RID/URL of every push operation across all platforms, providing a transparent audit trail. - **Push Log**: The [\`docs/pushed.log\`](./docs/pushed.log) file records the date, time, commit hash, and RID/URL of every push operation across all platforms, providing a transparent audit trail.
- **GitField Directory**: The \`.gitfield\` directory contains internal metadata and platform-specific sigils (e.g., \`github.sigil.md\`). See [\`docs/gitfield.README.txt\`](./docs/gitfield.README.txt) for details. - **GitField Directory**: The \`.gitfield\` directory contains internal metadata and platform-specific sigils (e.g., \`github.sigil.md\`). See [\`docs/gitfield.README.txt\`](./docs/gitfield.README.txt) for details.
- **GitHub Pages**: A public-facing, SEO-optimized canonical declaration is available in [\`docs/index.html\`](./docs/index.html), with a sitemap in [\`docs/sitemap.xml\`](./docs/sitemap.xml) and integrity hashes in [\`docs/integrity.sha256\`](./docs/integrity.sha256). - **Pages Deployments**: Public-facing declarations are available at:
- GitHub Pages: [$GITHUB_URL/docs/index.html]($GITHUB_URL/docs/index.html)
- GitLab Pages: [$GITLAB_URL/-/jobs/artifacts/main/raw/public/index.html?job=pages]($GITLAB_URL/-/jobs/artifacts/main/raw/public/index.html?job=pages)
- Codeberg Pages: [https://mrhavens.codeberg.page/$REPO_NAME/index.html](https://mrhavens.codeberg.page/$REPO_NAME/index.html)
- **GPG Signatures**: Metadata files are signed with the following GPG keys: - **GPG Signatures**: Metadata files are signed with the following GPG keys:
$(for i in "${!GPG_KEYS[@]}"; do $(for i in "${!GPG_KEYS[@]}"; do
echo " - ${GPG_NAMES[i]} <${GPG_EMAILS[i]}> (Key ID: ${GPG_KEYS[i]})" echo " - ${GPG_NAMES[i]} <${GPG_EMAILS[i]}> (Key ID: ${GPG_KEYS[i]})"
done) done)
- **CI/CD Status**:
- GitLab: $CI_STATUS_GITLAB
- Codeberg: $CI_STATUS_CODEBERG
- **Recursive Sync**: The repository is synchronized across all platforms in a recursive loop (three cycles) to ensure interconnected metadata captures the latest state of the project. - **Recursive Sync**: The repository is synchronized across all platforms in a recursive loop (three cycles) to ensure interconnected metadata captures the latest state of the project.
- **Push Order**: The repository is synchronized in the following order: **Radicle → Forgejo → Codeberg → Gitea → GitLab → Bitbucket → GitHub**. This prioritizes Radicles decentralized, censorship-resistant network as the primary anchor, followed by Forgejos sovereign, self-hosted infrastructure, Codebergs community-driven platform, Giteas lightweight efficiency, GitLabs robust DevOps features, Bitbuckets enterprise redundancy, and GitHubs broad visibility, ensuring a resilient and accessible metadata chain. - **Push Order**: The repository is synchronized in the following order: **Radicle → Forgejo → Codeberg → Gitea → GitLab → Bitbucket → GitHub**. This prioritizes Radicles decentralized, censorship-resistant network as the primary anchor, followed by Forgejos sovereign, self-hosted infrastructure, Codebergs community-driven platform, Giteas lightweight efficiency, GitLabs robust DevOps features, Bitbuckets enterprise redundancy, and GitHubs broad visibility, ensuring a resilient and accessible metadata chain.
@ -932,6 +1103,8 @@ execute_push() {
local url=$3 local url=$3
local rid=$4 local rid=$4
local peer_id=$5 local peer_id=$5
local token_var=$6
local project_id=$7
local script_path local script_path
script_path=$(find_script "$script_name") || error "Failed to find $script_name" script_path=$(find_script "$script_name") || error "Failed to find $script_name"
info "Executing $platform push with script: $script_path" info "Executing $platform push with script: $script_path"
@ -941,6 +1114,9 @@ execute_push() {
log_url "$platform" "$url" "$rid" "$peer_id" log_url "$platform" "$url" "$rid" "$peer_id"
git add . || warn "Nothing to add after $script_path" git add . || warn "Nothing to add after $script_path"
git commit -m "Post-$platform sync at $TIMESTAMP" || warn "No changes to commit after $script_path" git commit -m "Post-$platform sync at $TIMESTAMP" || warn "No changes to commit after $script_path"
if [ "$platform" = "GitLab" ] || [ "$platform" = "Codeberg" ]; then
trigger_ci_pipeline "$platform" "$url" "$token_var" "$project_id"
fi
popd >/dev/null popd >/dev/null
else else
error "Script $script_path is not executable" error "Script $script_path is not executable"
@ -955,14 +1131,14 @@ run_push_cycle() {
info "Starting push cycle $cycle_number..." info "Starting push cycle $cycle_number..."
SYNC_CYCLES=$cycle_number SYNC_CYCLES=$cycle_number
execute_push "gitfield-local" "Local" "" "" "" execute_push "gitfield-local" "Local" "" "" "" "" ""
execute_push "gitfield-radicle" "Radicle" "" "$RADICLE_RID" "$RADICLE_PEER_ID" execute_push "gitfield-radicle" "Radicle" "" "$RADICLE_RID" "$RADICLE_PEER_ID" "" ""
execute_push "gitfield-remember" "Forgejo" "$FORGEJO_URL" "" "" execute_push "gitfield-remember" "Forgejo" "$FORGEJO_URL" "" "" "" ""
execute_push "gitfield-codeberg" "Codeberg" "$CODEBERG_URL" "" "" execute_push "gitfield-codeberg" "Codeberg" "$CODEBERG_URL" "" "" "CODEBERG_TOKEN" "mrhavens/$REPO_NAME"
execute_push "gitfield-gitea" "Gitea" "$GITEA_URL" "" "" execute_push "gitfield-gitea" "Gitea" "$GITEA_URL" "" "" "" ""
execute_push "gitfield-gitlab" "GitLab" "$GITLAB_URL" "" "" execute_push "gitfield-gitlab" "GitLab" "$GITLAB_URL" "" "" "GITLAB_TOKEN" "mrhavens/$REPO_NAME"
execute_push "gitfield-bitbucket" "Bitbucket" "$BITBUCKET_URL" "" "" execute_push "gitfield-bitbucket" "Bitbucket" "$BITBUCKET_URL" "" "" "" ""
execute_push "gitfield-github" "GitHub" "$GITHUB_URL" "" "" execute_push "gitfield-github" "GitHub" "$GITHUB_URL" "" "" "" ""
# Regenerate metadata after each cycle to update sync_cycles # Regenerate metadata after each cycle to update sync_cycles
generate_canonical_meta generate_canonical_meta
@ -978,11 +1154,13 @@ run_push_cycle() {
generate_docs_robots generate_docs_robots
generate_docs_sitemap generate_docs_sitemap
generate_docs_integrity generate_docs_integrity
generate_gitlab_ci
generate_codeberg_ci
} }
# ╭─────────────────────────────────────╮ # ╭─────────────────────────────────────╮
# │ MAIN EXECUTION │ # │ MAIN EXECUTION │
# ╰───────────────────────────────────── # ╰─────────────────────────────────────
info "Starting gitfield-sync for $REPO_NAME..." info "Starting gitfield-sync for $REPO_NAME..."
# Parse flags # Parse flags
@ -998,6 +1176,24 @@ while [ $# -gt 0 ]; do
info "Force docs overwrite flag enabled" info "Force docs overwrite flag enabled"
shift shift
;; ;;
--skip-ci)
SKIP_CI=true
info "Skip CI generation flag enabled"
shift
;;
--gpg-force)
GPG_FORCE=true
info "GPG force overwrite flag enabled"
shift
;;
--ci-status=*)
CI_STATUS="${1#*=}"
if [[ ! "$CI_STATUS" =~ ^(mock|live)$ ]]; then
error "Invalid --ci-status value: $CI_STATUS, must be 'mock' or 'live'"
fi
info "CI status set to $CI_STATUS"
shift
;;
*) *)
warn "Unknown argument: $1" warn "Unknown argument: $1"
shift shift
@ -1008,8 +1204,8 @@ done
if [ ! -d "$REPO_PATH/.git" ]; then if [ ! -d "$REPO_PATH/.git" ]; then
pushd "$REPO_PATH" >/dev/null pushd "$REPO_PATH" >/dev/null
git init git init
git add . git add . || warn "Nothing to commit"
git commit -m "Initial commit" || warn "Nothing to commit" git commit -m "Initial commit" || warn "No changes to commit"
popd >/dev/null popd >/dev/null
fi fi
@ -1027,6 +1223,8 @@ generate_docs_nojekyll
generate_docs_robots generate_docs_robots
generate_docs_sitemap generate_docs_sitemap
generate_docs_integrity generate_docs_integrity
generate_gitlab_ci
generate_codeberg_ci
# Run push cycles # Run push cycles
run_push_cycle 1 run_push_cycle 1

1046
bin/gitfield-sync-OLD5 Executable file

File diff suppressed because it is too large Load diff

View file

@ -1,16 +1,16 @@
-----BEGIN PGP SIGNATURE----- -----BEGIN PGP SIGNATURE-----
iQIzBAABCgAdFiEEif0F7T4AkoRgIfM3TifTfDWIcr8FAmhHZq0ACgkQTifTfDWI iQIzBAABCgAdFiEEif0F7T4AkoRgIfM3TifTfDWIcr8FAmhHaukACgkQTifTfDWI
cr/i4w/6AmcnTib1O65XYtpEIi55DR0SnQP5q9pTzoLO2J32iFnbwb/bM/57tW47 cr98fA//ZukcmW8omAfCjgchDfBEGGYnGKP21rnPSHmxYbht+2dvGULxbtvqJW3W
YOfaU37Pwd/Dn7BND92sp9SloNO7bETbAkwgOhDDETIWmZt6EwItekx9lm03SR7/ bjlB5yh102CnwkHiFj5LdpLAqrif3ZKzPtHg7jjREWZqL1dItk5OXPJuzfw5ETPL
qt07MuJRQmOfd8g0gUPr6whr28UW8ww5DR5QQCRf5PeNU/CLMIgG8UIpCsCTOwxW KawoF74sdXHrrdP0iMWfCRAg+WreDZB091D5Arg80QlKYLp/otdrgDTi0UgGFL0F
qcOFuLBHy+fEN69PTdZNoSu3H8TGYt1NICQAgS/GnmUntG7ryq6+RpLSP577paPJ 0tjc6l/B4oI9dTlV1Ts8X3WZerzQx8E6kRkWUz279lFTIsgsau+fnGChMT5HKLwt
acjrx2i18PORHGtGkrstXfH+8O9LmPLYfhHSzAEzdfVHp35k202BSJZOHmkiTADR 0UJ+ISSQw5QL8MthPMYywz3NPm/bQ9ywxHQ2MtZjI8tgwAjPyH5Qav6/oHgHNUtb
ndMyz2d6JiGDzAaaBj+JLLcQNm6kwjNCHkvd3KYTY9yESVHvDaXvdeL1KrOcQ9ga DSn9C/FzS26ZIOVPU97ktVcfgA/8nwLQ4eUh5JfdQKxRoV2bRG9nDsiDRbFg80Xl
srIbKyRIIg7JQ4/02JqGpFI4t7TKuNmfce/E1DtQGA/iNT+kiiOA527A/otwBdYk TYx5kNYBIM18wrWKeob2mP4LFGQintiScuEfKxmosgOTC34rm7U9p8dK2A23sesG
Ud96wD53lT0KvTmOlWxMd/xv4WvjNiUibH9QG1XBa/I7HiXCwsL1HeP7ptqVZYFY zJ4u44nxCuaLeatQr7soDUj5neVISO1WSl/nk3bwZhyC2PKXCei3/SXgX2JQzjnp
8oMOe9krnIi/86maZZFlOWT3CIoNi7DrnTuP5xpM2XsnzfBFzKh8GY4CQycP2Q00 ew+OlRD3qybx9EmXSX7Zh8/YoPyZq9UavFLg7d6Jpi6QMpXmmnDagQ0cbRuxQk9k
Rc+WD+h2pvV255Y1lJGVP6mX96TGNtVVE4XcOH5B0Bvkr+TMtGsTsYn14+OcHfAT lCkHGAI8n2ETFwWHyC2YAzoglQ/zsOQWwCwIJSgt5MSybh31FixzO1zxPZB+6D91
1n0/dgpleuQ1GYMRa2BQj9O42PNG6Qw+uX5FWzc27sizRkZThMY= 9XY2oFUd9PJs7e0+WGogewXRk1Y6g4kDOiLwC8ChsYNwWkGFTy8=
=5h96 =Kowh
-----END PGP SIGNATURE----- -----END PGP SIGNATURE-----

View file

@ -1,16 +0,0 @@
-----BEGIN PGP SIGNATURE-----
iQIzBAABCgAdFiEEif0F7T4AkoRgIfM3TifTfDWIcr8FAmhHZpoACgkQTifTfDWI
cr8qZhAAvEWlThEVvv1ABNcsPiGazyv00AcKuMvWAQKypHohvh7X/CgZ8GSmSrqu
+5O6sQED3m6Y7XopVxiPPk05hzAlMnl2f7H5adW2ZPklk8UlrxRt/bV328Mz8hcL
X51+/53zJJqor3/sNEZCEdR6GN3YkHRHX3SfUljj3hsSmBJGSBRF8m3dgYxcumeU
bBpPZ9fNUwH0PcLUI07VYEmHvRh9tiVu8S1hjAR8nPwzIBIHERmaZ49hoyeRhqk3
uq0DKujlpL5fuVEfOCYnJZSy70T2URRMkcuE+HdGSZ9lJfjo6zc5uVli0sUAr5TB
Wp37SkgB/qOHc5BPphvf4x5EbHm5d24DwoE7/y47Pi37IlJYkKawy8t7p3YiVzNv
3N/0n2m0IAE8vkADlnhf4uQqp1NYG6+XG1y1OO/S+4MGK3WS3p3L0qZkl3yLoHy8
YBOKZxPat831g1UZHudCROP22T2wnvE+wb1tZwaqaUylr4Ot9d3cOiPJjUfUH/QD
q4x97RU5kiHy76BBrrHqnHVBYZqYWr7BODk3TgtIxFou9QWRZ6oU4o6qRBXXfpvp
rtD5+R5brCmJ4o3C2sHgyGoNJ9FdJSvAkEZ3tthdIZDKsjH8TO3uxVGWm3NUK9RM
8O2Q9j3M4x80KWwW+uMx0LsAubb9j2kojfB/SjVhq08SXhgc3rY=
=MdYl
-----END PGP SIGNATURE-----

View file

@ -1,16 +1,16 @@
-----BEGIN PGP SIGNATURE----- -----BEGIN PGP SIGNATURE-----
iQIzBAABCgAdFiEEif0F7T4AkoRgIfM3TifTfDWIcr8FAmhHZqoACgkQTifTfDWI iQIzBAABCgAdFiEEif0F7T4AkoRgIfM3TifTfDWIcr8FAmhHaucACgkQTifTfDWI
cr/Tag//crcC3c7RCDvA/MjwcjnyyZR5PW23q2b1ejJGYhAEH8I7DnGDo8gAAmGi cr9ZJg//W1s21IygAOXTe/RGRk3cBEZo67OrTbkjHZW0TFB4nomuhl4HbFfeD9LQ
M9/pERci4nlcI2KHda5dnovAIK0nCGblDSKpkZgeNHXuzvKXw+Kqy9I5AiJwStQQ 2k+obj+fjzvseL8B+nOBvrK1n/2OiLsrJihHg2mbWe7HKm8jG/cRfAf++nQ3j024
ZWLSXpwBxZn5GcSg3XspwrUYUqvTxmcC/BJuOcRUkTgScQIThg5EHzHDEQ1NRG7E zMMtKakRcJHAvIsa+Bg1vwfJdEvKyaEhO+lGsiIadpdmVEmPuBWZFmsjEZzs1tU6
O95u6miOPUg5Lchi68QGA2pjSIKOCKPkRtA9fQ/syAqdRD7Ue1PLbA9N9Yq2Kq8O PNQadE7b7bM1UREjpOZRqVvSZYZ2+ngicC/AdHiFD8tlwMGpeE5k8CPjsZouPznv
3u94oVSATA7em5e5+2Cz/G5liPRfoRquwFd97eFR51HosWyXVK1BwUu4Fl7+DqqM lUySiRKfv0dIC3+vtIL7Sfr8b+Ux3gdKvCaqEY0C4+FTIR1Cq/abslNPl0rYDI2W
wiElDkClSN8N6sLrFUHEM37BZ8TqqMJxPwuOg+NZlJFuyjdjTtnmUfzYg1L1h0XD KWTkG/JPA/OJTWrNzGzuatQKdbPJxqv56K5PL7A+tGvbqVjfkrpmUFODJYmMhcXx
jM/t28h5E/p2WezYgk/v2WPxmfkgo8pCmPkLtKwC0q53tsgHbKau2XcNRJ7Cjqz2 8rdod4Znt3TRk6EPrknymPdY0zk1kPI4LkMTdNBzDruVQBrF/LXHY1dQ1y4ZkFWR
3yX7mfJwEuPwQVQ8rJUw3k1ts5HTTxG5FsBsZ+5LAp6FUl4gmxTsNKKRruzVKKvb P8QQS2k0hQ9+//lA0dvIabRL2u6c52zbNswLYbC2FDKmwRb2QMIenrxqhNXEhMGb
cqL29HHQV1adcXOhKrFbCTrZYZaxAZP1F8G0HQOR+/bUSQRs96SIsZQa7TL1rQhB LtoO0MC3O2V1wiahpaXkQvWR2ylbMhRMQWNBGYFYTWA2l8PLRSgsI01+G2FH2JbX
iYMlWki8xfOT+jmnlrTvwGcuDWOdu2whZgRIDrBi4wVjeIZRjRXS/hSwT9Tstp1A yhQZDdLChwlmRytrUPiIOv8hx+R0TVgKizExXKu2I3aoFQviexs8aLBqGqo0vknn
4Cb7HWeAPo7GePHR7rtVvY//TXoYLbVhQhmC1/5c3Ki/uMdUKc8= ku3IssxPHC8rfc4AsFgxjPeHxFRL3iT4m9Gxhum7AVQFZMssDRk=
=D0HP =bFPR
-----END PGP SIGNATURE----- -----END PGP SIGNATURE-----

View file

@ -1,16 +1,16 @@
-----BEGIN PGP SIGNATURE----- -----BEGIN PGP SIGNATURE-----
iQIzBAABCgAdFiEEif0F7T4AkoRgIfM3TifTfDWIcr8FAmhHZqIACgkQTifTfDWI iQIzBAABCgAdFiEEif0F7T4AkoRgIfM3TifTfDWIcr8FAmhHauQACgkQTifTfDWI
cr9rZg//cRc9RLZhPY6deezhBFZsR/SEjvz6q44m4aTLYqBNFado//4Ero9AplSH cr/y5hAArDCV0nDEh9RVatuGltKDwH+ncRp7GZKXc1cLSVUsBSR1Lb8+fbBjmuYq
DwHAPfjU245WCAjrV6WxeI6LnVfpn4hC9nWHxmf3bGsNnTkpTtRPOW0oU1dRL+Oo iZlT97ujzPAMDO8B3LID+jacOQ/+jqyhyLRdOT4hpOA+BsUmdLCQl1X87VnOoq0h
iU0tY3ep/sB7cUWPXXrpOm5OL9IoeZqmtqSuy6CgjomXRMm+UY62vj9wO3fXHiAC rwSNaGlPcGeq9pMN4T1boUNJsCnrwhUcCay+hDS50mCd/Bh/v9yuc+oV6mRWEiDp
ZYzVppBoDWkId/LPqFTVQmY1BYvd9Ln7Y9K5m1Dq6OoRZbxEPvDW71cJhlZxVInK wnUPx9XvQJRzDs3xR92do/yixlZFHEYoHMqM2GYi4XU0Nw5XEfxiuJhYta2zuyFy
z4HaX5UbBD4kg1RP1Jw59fuDmxkQu7TJvtSpM7xsGH1/b1LvZVtC0jhtXENulzAk UnYt/oe54fKEXxWp5LC2SU9oBFfryYFfbiUrPHaQLt2fSlVD2fAAqkqEIdRf6QfJ
UER2Kz05t/cSRiy4kXayE9eyeErNRpXyU7ND79sZjNZugNBTjyU6DqX4Cw61qqqj Ur7Q/5MElszmguu67cgWYyFkoSigE2TGRYbV0LdG3ZsDA+qHD/L7agv5wNZW6lv6
2QXA7vaT3frW072CQ9C3gtkUT9LoyoOdqDKPeCxfOfFksaXj1TWY3JiNZOXtK9qa h5zZgIrbpWurYFiNztB8/89tnw3Oau51LYcnHuZeF2typELE39qjCJK3iAiETa47
Xb/8v2puRarUGexXZGTpIPo0lNgxBS0pMh9YtjrfI1TPlyENZkLzERrKjqKFQB1u mnFBz6l8Q9cbpgV1E4nWsn0Zy9SGJMcv+yw3hNsBV+OSwxNnLiHpeNcdrHOTdfVS
VlDOtYdK64IywzB31ZBUxu71kR9vx4f4BfTWot+KRawBgsEesl/PBsi10rbgsKL+ veUlnexhZr1sQOD5r4jTn7Hb5qp7xo6GklAQAoije7VEf9/VhsTwG6aMXrmtKqbz
r+MZGRfzuiNCLppFQDUvfqsTACdz1sbCH2tTf/dugY/uvm5W+8OJbWsDXXeSdCZU tPAgBIjrBXcK3pOuAAsWqvuHMmTRJibPnL0MEx6ZjYBmsqrLrcNtZIPeVy7jI2eP
prqnsZYWL3a++A5F1m7IM6BHnb2DOsgGrtgHw+s1CiHIn3rvROs= zIdmo/PniPailFZBbjn2djmL6Hj/Hu+B3NApD47056541jt1S2I=
=gBzb =I1yO
-----END PGP SIGNATURE----- -----END PGP SIGNATURE-----

View file

@ -1,11 +1,3 @@
# SHA-256 Integrity Hashes for /docs Metadata Files # SHA-256 Integrity Hashes for /docs Metadata Files
# Generated by gitfield-sync at 2025-06-09T22:35:36Z (v1.4) # Generated by gitfield-sync at 2025-06-09T23:14:38Z (v1.5)
3af33327e35d33abfc590175f416f577e0a2bbe368fa7086699dbe53ab946d5c /home/mrhavens/fieldcraft/git-sigil/docs/canonical.meta
7581d0ea30cea1d56186d85a05a9ab2cc94550dcb0df1636167501382b4bdd95 /home/mrhavens/fieldcraft/git-sigil/docs/canonical.md
d5b2dde10b8a6f6121f9067f9a57ded2a66514c4058af849e676a2486272b41c /home/mrhavens/fieldcraft/git-sigil/docs/index.json
0a392228969e006a35ba6d39b897232dcdd62bdd5fa755de3ad1f8ac854fa3c8 /home/mrhavens/fieldcraft/git-sigil/docs/gitfield.json
0a392228969e006a35ba6d39b897232dcdd62bdd5fa755de3ad1f8ac854fa3c8 /home/mrhavens/fieldcraft/git-sigil/docs/.well-known/gitfield.json
c8f603efec661d39d6a3ba58ae9bffa6f2af6fcf35251eb40aa4085ca756a695 /home/mrhavens/fieldcraft/git-sigil/docs/repos.json
73993989fbe3783168533d99313c9f77c613021671fa5fa6817f3eed4743fea3 /home/mrhavens/fieldcraft/git-sigil/docs/pushed.log
f83cba3aa616c2b767e4d68c32f25be6bb61646966bd440a7185dd37eefe698e /home/mrhavens/fieldcraft/git-sigil/docs/gitfield.README.txt

View file

@ -1,16 +1,16 @@
-----BEGIN PGP SIGNATURE----- -----BEGIN PGP SIGNATURE-----
iQIzBAABCgAdFiEEif0F7T4AkoRgIfM3TifTfDWIcr8FAmhHZrIACgkQTifTfDWI iQIzBAABCgAdFiEEif0F7T4AkoRgIfM3TifTfDWIcr8FAmhHausACgkQTifTfDWI
cr+MtQ/7B2+K2kQtC/qUUfEge3SYOozb5ZGJ8NQwS3RLjAgpHyi0SAFGArlwtsXR cr+tgQ/7BCxdSGoaawSj0g0BoJmDYA/Sezc/dYG4NmYFUU4tZO+lrx794myYJ1Yh
EqWFvYVWMuOA1vXiADKHo1m0H81ej1vT1JS/F7a1WOD0K8E8HVsFVmlkuhetkwG7 Xq5UZLnLGwIfxFl6oA1l82a6szYysMDP4W7bbHr1IkFiZduPE96V073kzJM+C+Io
bCHYD65LrLC+OrLB9MZ5AV/B1fLo3q5wwpSd76XBzd0Hok/7tIwC+wiLd8kbUCwh lo7DIm1J6+Ej8fnzH1Nl5gMjxR4RjqGUxJkeLKPgTlkZF9BB3Ng2IUgBWFiE0si7
KVmGEQgeBgPfK3001DOZAFKBF8LRCeVENL5twqN8HiK4rZD1fR/PfDyg95cVDx26 UAH2qxh3n2pwhOjhrLfVx1dm5HOoZtb5jpeuvc5Mjiu654E2rwxUTZcrPOKU4R94
0HXCDeNoSfuGiiPXaeo61tT+cHOFha17wF5fsykL3OKEHhAjvtBIswvO1un1VeVy B1H4juGz5bmh82gX6Sri2sABHLvhBNVeATBAiInrb0ADEMVugpU1sxCTXM18T/Tz
1NuCayjWuOoY2EEseP6HBPv4IifOBOBJj1qJ0e7V4SPYnv1LZbk7OWRcFOddUIhU CsGjFAiAAGgIsfZMXYtBxlF1b0CjXPJ413yLvTnQSSHzsmNqkdTjKMshyJNUoAyW
9vNmqklPATbcT0bDRlYNqOpaddCrpMF7ksFoXXKI5A88b59I7H5vGvdVnmhFNb0D q6LKXNgC62tPHxM6squs6Qpyo17JcY8w9Up26otgbVYuQGsO8ZfyxMjh+tScbgjp
zmOsS54QYRqEQER+pufuAIYfWaqbneqx79WAqrtXrQ1HraPNZtAsRQGjw5q5uW43 pkyWe8umB1ViWqZ562m9SU4RmYwL8+vTGIKubaHmv0TsdQM8pgjQyeE6Jmn/xpGy
+QAIPQS33w5cKViDf1uJ9i/AxGkCt29iEotGHLbX4l95T30Usv0zIS0IdlQ2ARyP hwGhZGjTaH4wUWTLR2TEiuMc6IzRFXRL6YOJGfqWD/fdLcKhkbNPgj6RMacSfWtB
YPDZO/XTpIsIdM9BXEbRxJA8/LFs2Y/fS/Th42wa0bK18xE9dDOleUX/6h7RQufr JJ65GYYzzwGYgSxJUT9gRLbWz1o8Bf9ArT6CgJUZ8d9AJdvCUzmTv5s6aBge3GmG
RjYOXOTEWhbOav/57UeX56IMqlo7x8/uAzNFmjicZTylGnz7pvg= D2NuCd8HULfg1nhGwtmGFXZsytNXx/7VS/xnVOeGh5kNolJ7MM4=
=uZkA =7/Bg
-----END PGP SIGNATURE----- -----END PGP SIGNATURE-----