mirror of
https://github.com/R0m1k3/Loki.git
synced 2026-10-11 17:26:57 +02:00
Merge remote-tracking branch 'upstream/main' into claude/ajean-loki-container-fork-aep9r2
# Conflicts: # .gitignore # README.md
This commit is contained in:
167 files changed
+38628
-22
No files matched your search
@@ -0,0 +1,51 @@
|
||||
# CI : build + vet + gofmt + tests sur chaque push/PR.
|
||||
name: ci
|
||||
on:
|
||||
push:
|
||||
branches: ["**"]
|
||||
pull_request:
|
||||
|
||||
jobs:
|
||||
test:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/setup-go@v5
|
||||
with:
|
||||
go-version-file: go.mod
|
||||
- name: gofmt
|
||||
run: test -z "$(gofmt -l .)" || (gofmt -l . && exit 1)
|
||||
- run: go vet ./...
|
||||
- run: go build ./...
|
||||
- run: go test ./...
|
||||
# staticcheck : le projet est à zéro avertissement, et doit le rester.
|
||||
# Les règles écartées et leur raison vivent dans staticcheck.conf.
|
||||
- name: staticcheck
|
||||
run: go run honnef.co/go/tools/cmd/staticcheck@latest ./...
|
||||
- name: cross-compile (cibles release Linux + Windows)
|
||||
run: |
|
||||
# darwin n'est pas ici : depuis v0.5.4 l'icône de barre de menus passe
|
||||
# par Cocoa (CGO) → les cibles macOS se compilent sur un runner Apple
|
||||
# (job « macos » ci-dessous, comme dans release.yml).
|
||||
for t in linux/amd64 linux/arm64 windows/amd64 windows/arm64; do
|
||||
GOOS=${t%/*} GOARCH=${t#*/} CGO_ENABLED=0 go build -o /dev/null ./cmd/ajean
|
||||
done
|
||||
|
||||
macos:
|
||||
runs-on: macos-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/setup-go@v5
|
||||
with:
|
||||
go-version-file: go.mod
|
||||
- run: go vet ./...
|
||||
# Les tests tournent AUSSI ici : certains chemins ne s'exécutent que sur un
|
||||
# vrai système de fichiers Unix (extraction des liens symboliques des
|
||||
# archives llama.cpp, que Windows résout par une copie de repli).
|
||||
- run: go test ./...
|
||||
- name: build macOS (CGO, arm64 + amd64)
|
||||
run: |
|
||||
CGO_ENABLED=1 GOOS=darwin GOARCH=arm64 go build -o /dev/null ./cmd/ajean
|
||||
CGO_ENABLED=1 GOOS=darwin GOARCH=amd64 \
|
||||
CGO_CFLAGS="-arch x86_64" CGO_LDFLAGS="-arch x86_64" \
|
||||
go build -o /dev/null ./cmd/ajean
|
||||
@@ -0,0 +1,52 @@
|
||||
# Build macOS à la demande, SANS rien publier : produit AJEAN.app en artifact
|
||||
# téléchargeable depuis l'onglet Actions (visible seulement par le dépôt).
|
||||
# Sert à tester le bundle avant de décider d'une vraie release (release.yml).
|
||||
name: mac-build
|
||||
on:
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: macos-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/setup-go@v5
|
||||
with:
|
||||
go-version-file: go.mod
|
||||
- name: build + bundle AJEAN.app (arm64)
|
||||
run: |
|
||||
mkdir -p dist
|
||||
CGO_ENABLED=1 GOOS=darwin GOARCH=arm64 \
|
||||
go build -trimpath -ldflags="-s -w" -o dist/ajean-macos-arm ./cmd/ajean
|
||||
mkdir -p /tmp/ajean.iconset
|
||||
sips -s format png 'cmd/ajean/icon.ico' --out /tmp/icon.png >/dev/null 2>&1 || true
|
||||
for s in 16 32 128 256 512; do
|
||||
sips -z $s $s /tmp/icon.png --out "/tmp/ajean.iconset/icon_${s}x${s}.png" >/dev/null 2>&1 || true
|
||||
done
|
||||
iconutil -c icns /tmp/ajean.iconset -o /tmp/ajean.icns >/dev/null 2>&1 || true
|
||||
app="dist/AJEAN.app"
|
||||
mkdir -p "$app/Contents/MacOS" "$app/Contents/Resources"
|
||||
cp dist/ajean-macos-arm "$app/Contents/MacOS/ajean"
|
||||
chmod +x "$app/Contents/MacOS/ajean"
|
||||
cp /tmp/ajean.icns "$app/Contents/Resources/ajean.icns" 2>/dev/null || true
|
||||
printf '%s\n' \
|
||||
'<?xml version="1.0" encoding="UTF-8"?>' \
|
||||
'<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">' \
|
||||
'<plist version="1.0"><dict>' \
|
||||
'<key>CFBundleName</key><string>AJEAN</string>' \
|
||||
'<key>CFBundleDisplayName</key><string>AJEAN</string>' \
|
||||
'<key>CFBundleExecutable</key><string>ajean</string>' \
|
||||
'<key>CFBundleIdentifier</key><string>link.ajean.app</string>' \
|
||||
'<key>CFBundleIconFile</key><string>ajean</string>' \
|
||||
'<key>CFBundlePackageType</key><string>APPL</string>' \
|
||||
'<key>LSMinimumSystemVersion</key><string>11.0</string>' \
|
||||
'<key>LSUIElement</key><true/>' \
|
||||
'<key>NSHighResolutionCapable</key><true/>' \
|
||||
'</dict></plist>' > "$app/Contents/Info.plist"
|
||||
codesign --force --deep -s - "$app" || true
|
||||
(cd dist && zip -qry ajean-macos-arm.zip AJEAN.app && rm -rf AJEAN.app)
|
||||
ls -l dist
|
||||
- uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: ajean-macos-arm
|
||||
path: dist/ajean-macos-arm.zip
|
||||
@@ -0,0 +1,138 @@
|
||||
# Release : sur tag vX.Y.Z, compile les 6 cibles et publie la release GitHub
|
||||
# avec les binaires (ajean-linux, ajean-macos, ajean-windows.exe et leurs
|
||||
# variantes -arm) ET le fichier SHA256SUMS que `ajean update` vérifie avant
|
||||
# d'installer. Ces noms doivent rester en phase avec assetNameFor (sys_update.go),
|
||||
# sinon plus aucune machine ne se met à jour.
|
||||
# ⚠️ NE PAS uploader de binaires à la main en plus : ce workflow écrase les
|
||||
# assets du même nom (softprops remplace), et des sommes qui ne correspondent
|
||||
# plus aux binaires font échouer `ajean update` (vécu sur v0.4.7).
|
||||
#
|
||||
# Deux jobs de build : macOS a besoin d'un vrai runner Apple (l'icône de barre de
|
||||
# menus passe par Cocoa → CGO, pas cross-compilable depuis Linux) ; Linux et
|
||||
# Windows restent CGO_ENABLED=0 sur ubuntu.
|
||||
name: release
|
||||
on:
|
||||
push:
|
||||
tags: ["v*"]
|
||||
|
||||
permissions:
|
||||
contents: write
|
||||
|
||||
jobs:
|
||||
macos:
|
||||
runs-on: macos-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/setup-go@v5
|
||||
with:
|
||||
go-version-file: go.mod
|
||||
- name: build macOS (CGO, arm64 + amd64)
|
||||
run: |
|
||||
mkdir -p dist
|
||||
# arm64 = natif ; amd64 = cross avec le SDK universel (-arch x86_64).
|
||||
CGO_ENABLED=1 GOOS=darwin GOARCH=arm64 \
|
||||
go build -trimpath -ldflags="-s -w" -o dist/ajean-macos-arm ./cmd/ajean
|
||||
CGO_ENABLED=1 GOOS=darwin GOARCH=amd64 \
|
||||
CGO_CFLAGS="-arch x86_64" CGO_LDFLAGS="-arch x86_64" \
|
||||
go build -trimpath -ldflags="-s -w" -o dist/ajean-macos ./cmd/ajean
|
||||
file dist/ajean-macos*
|
||||
- name: bundles AJEAN.app
|
||||
run: |
|
||||
# Un binaire nu double-cliqué ouvrirait le Terminal. On publie donc
|
||||
# aussi un vrai bundle AJEAN.app (zippé pour garder le bit exécutable) :
|
||||
# au clic, le Finder lance Contents/MacOS/ajean, qui détecte le bundle
|
||||
# et bascule en mode « application » (UI web + navigateur + icône dans
|
||||
# la barre de menus), comme le double-clic sur ajean.exe sous Windows.
|
||||
# LSUIElement : app de barre de menus, aucune icône dans le Dock.
|
||||
# L'icône part du PNG 1024 généré avec le reste de la marque
|
||||
# (cmd/ajean/icon.png, voir tools/gen-icon) : plus de conversion depuis
|
||||
# le .ico, dont l'échec silencieux donnait une app sans icône.
|
||||
mkdir -p /tmp/ajean.iconset
|
||||
for s in 16 32 128 256 512; do
|
||||
sips -z $s $s 'cmd/ajean/icon.png' --out "/tmp/ajean.iconset/icon_${s}x${s}.png" >/dev/null
|
||||
done
|
||||
iconutil -c icns /tmp/ajean.iconset -o /tmp/ajean.icns
|
||||
v="${GITHUB_REF_NAME#v}"
|
||||
for bin in ajean-macos ajean-macos-arm; do
|
||||
app="dist/bundle-$bin/AJEAN.app"
|
||||
mkdir -p "$app/Contents/MacOS" "$app/Contents/Resources"
|
||||
cp "dist/$bin" "$app/Contents/MacOS/ajean"
|
||||
chmod +x "$app/Contents/MacOS/ajean"
|
||||
cp /tmp/ajean.icns "$app/Contents/Resources/ajean.icns" 2>/dev/null || true
|
||||
printf '%s\n' \
|
||||
'<?xml version="1.0" encoding="UTF-8"?>' \
|
||||
'<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">' \
|
||||
'<plist version="1.0"><dict>' \
|
||||
'<key>CFBundleName</key><string>AJEAN</string>' \
|
||||
'<key>CFBundleDisplayName</key><string>AJEAN</string>' \
|
||||
'<key>CFBundleExecutable</key><string>ajean</string>' \
|
||||
'<key>CFBundleIdentifier</key><string>link.ajean.app</string>' \
|
||||
'<key>CFBundleIconFile</key><string>ajean</string>' \
|
||||
'<key>CFBundlePackageType</key><string>APPL</string>' \
|
||||
"<key>CFBundleShortVersionString</key><string>$v</string>" \
|
||||
"<key>CFBundleVersion</key><string>$v</string>" \
|
||||
'<key>LSMinimumSystemVersion</key><string>11.0</string>' \
|
||||
'<key>LSUIElement</key><true/>' \
|
||||
'<key>NSHighResolutionCapable</key><true/>' \
|
||||
'</dict></plist>' > "$app/Contents/Info.plist"
|
||||
# Signature ad-hoc : sans elle, macOS refuse purement et simplement
|
||||
# de lancer un binaire arm64 non signé (pas juste un avertissement).
|
||||
codesign --force --deep -s - "$app" || true
|
||||
(cd "dist/bundle-$bin" && zip -qry "../$bin.zip" AJEAN.app)
|
||||
rm -rf "dist/bundle-$bin"
|
||||
done
|
||||
ls -l dist
|
||||
- uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: macos
|
||||
path: dist/*
|
||||
|
||||
release:
|
||||
needs: macos
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/setup-go@v5
|
||||
with:
|
||||
go-version-file: go.mod
|
||||
- name: build Linux + Windows
|
||||
run: |
|
||||
mkdir -p dist
|
||||
# Noms d'asset : ajean-<os>[-arm][.exe]. Volontairement lisibles, et
|
||||
# volontairement DIFFÉRENTS du schéma ajean-<GOOS>-<GOARCH> des 0.7 :
|
||||
# leur mise à jour automatique ne trouve alors aucun asset et échoue
|
||||
# sans rien remplacer, au lieu d'installer un binaire 0.8 sur une
|
||||
# machine encore agencée en 0.7 (voir updateAssetName, sys_update.go).
|
||||
for t in linux/amd64:ajean-linux linux/arm64:ajean-linux-arm \
|
||||
windows/amd64:ajean-windows.exe windows/arm64:ajean-windows-arm.exe; do
|
||||
target=${t%%:*}; name=${t#*:}
|
||||
os=${target%/*}; arch=${target#*/}; ldflags="-s -w"
|
||||
# Windows : sous-système CONSOLE, pour que `cmd` attende la fin du
|
||||
# programme et que redirections, tubes et commandes interactives
|
||||
# fonctionnent. La console créée au double-clic est refermée par le
|
||||
# programme lui-même (voir setupConsole, sys_console_windows.go).
|
||||
GOOS=$os GOARCH=$arch CGO_ENABLED=0 \
|
||||
go build -trimpath -ldflags="$ldflags" -o "dist/$name" ./cmd/ajean
|
||||
done
|
||||
- uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: macos
|
||||
path: dist
|
||||
- name: SHA256SUMS
|
||||
run: |
|
||||
chmod +x dist/ajean-macos dist/ajean-macos-arm
|
||||
# Tous les assets commencent par « ajean- », zips compris : un seul
|
||||
# motif suffit. Ajouter « *.zip » les compterait DEUX fois, et un
|
||||
# SHA256SUMS à doublons est exactement ce que `ajean update` vérifie.
|
||||
(cd dist && sha256sum ajean-* > SHA256SUMS)
|
||||
ls -l dist && cat dist/SHA256SUMS
|
||||
- name: publier la release
|
||||
uses: softprops/action-gh-release@v2
|
||||
with:
|
||||
files: dist/*
|
||||
# Notes rédigées à la main, versionnées avec le code : le tag emporte
|
||||
# donc ses notes, au lieu de publier une liste de commits auto-générée
|
||||
# qu'il fallait ensuite remplacer à la main dans l'interface GitHub.
|
||||
# ⚠️ Réécrire RELEASE_NOTES.md AVANT de poser le tag.
|
||||
body_path: RELEASE_NOTES.md
|
||||
generate_release_notes: false
|
||||
Reference in new issue
Block a user