Configura la toolchain dello sviluppatore
Il progetto utilizza Go per CLI e broker, oltre a toolchain di plug-in nativi e strumenti di qualità del sito. Su macOS,make configusa l'Homebrew; su Debian o Ubuntu usa apt. Installa Go, Node.js/npm, Python,uv, Rust/Cargo e gli strumenti di sicurezza e lanugine del progetto. Il modulo Go del repository specifica la versione Go prevista dalla build.
make config
Il pacchetto di installazione di macOS utilizza anche gli strumenti da riga di comando Xcode di Apple. Confezione di Linux.debE.rpmgli artefatti richiedono Ruby,fpme utilità di packaging RPM. Lo script di installazione installa i prerequisiti comuni, ma per le build di rilascio potrebbero essere comunque necessari strumenti di confezionamento specifici della piattaforma.
Per i dettagli sulla configurazione iniziale e le aspettative di contributo, vedereCONTRIBUIRE.md.
Flusso di lavoro di sviluppo quotidiano
Per una normale modifica del codice, esegui i test mirati durante l'iterazione, quindi esegui i lint richiesti e i test gate del repository prima di terminare:
go test ./internal/app -run 'TestName'
make check-static
make check-security
make test
La maggior parte degli obiettivi Make utilizzascripts/dev/run-quiet.sh: i passaggi riusciti ne stampano uno concisooklinea, mentre i passaggi falliti stampano l'output acquisito. Prefisso una destinazione conV=1per eseguire lo streaming dell'output completo durante l'esecuzione:
make V=1 lint
make V=1 test
make V=1 verify
V=1controlla il wrapper silenzioso di Make. È separato daASH_VERBOSE, che abilita la diagnostica di runtime inAshprogramma.
Fai riferimento al target
make pre-push- Esegue controlli statici, analisi di sicurezza e delle dipendenze, scansione dei segreti e test sui commit esatti in uscita.
make configinstalla l'hook del repository. Gli hook locali possono essere ignorati e non sono controlli imposti dal server. make lint- Controlla i cataloghi di localizzazione, la sintassi della shell per il programma di installazione del sito, il flusso di lavoro YAML, lint/formato Python, Markdown, plugin lint e Go lint.
make test- Crea e testa i plugin nativi, quindi viene eseguito
go test ./.... make verify-ci- Esegue il controllo pre-push prima della creazione del tag notturno. La CI degli artefatti attivata dal tag non ripete i controlli del codice sorgente.
make verify- Esegue l'intero controllo di qualità locale: lanugine, test, test di gara, copertura, veterinario, analisi statica, sicurezza, scansioni segrete, fuzzing e benchmark.
make test-race- Esegue i test Go con il rilevatore di gare.
make test-cover- Scrive
coverage.oute confronta il totaleCOVERAGE_MIN(60% per impostazione predefinita). make test-fuzz- Esegue i test fuzz dell'applicazione per
FUZZ_TIME(10 secondi per impostazione predefinita). make security- Esegue
gosec,govulnchecke gli audit delle dipendenze npm, Cargo e Python. make build- Esegue lint e testa, crea e installa plug-in nativi e crea
ashpiùash-brokerSotto~/.local/bin. make install- Esegue test, lanugine,
gosece plugin build/install, crea entrambi i file binari, quindi viene eseguitoash install --shell bash --shell-integration --overwrite. Usalo quando intendi aggiornare l'integrazione Bash locale. make plugins-build,plugins-test,plugins-lint- Costruisci, testa o esegui l'linting di ciascun plug-in di seguito
internal/app/ash_bootstrap/plugins_src.make plugins-cleanrimuove l'output di compilazione del plugin locale. make site-locales- Genera pagine tradotte e aggiorna la mappa del sito. Utilizzo
make site-locales SITE_LOCALES="zh-TW lb_LU"per selezionare le impostazioni locali.
make allcorreverifypoiinstall. Le ricette di destinazione complete e le variabili sovrascrivibili si trovano nel fileMakefile.
Costruttori di plugin
I plugin sono eseguibili autonomi con un contratto indipendente dalla lingua. I plugin Makefile selezionano la toolchain di ciascun plugin; le build locali prendono di mira l'host per impostazione predefinita. Il rilascio delle build passaPLUGIN_TARGET_GOOSEPLUGIN_TARGET_GOARCHquindi Rust e altri file binari dei plugin non Go corrispondono all'artefatto di rilascio.
Utilizzomake plugins-buildper costruirlibin/plugins,make plugins-testper eseguire i loro test, emake plugins-installper copiarli nella directory dei plugin dell'utente. Vedi ilcontratto di plugin nativoprima di aggiungere o modificare un plugin.
Rilascia builder e artefatti
Dopo i controlli di qualità, GitHub esegue make release-artifacts su Linux. Un job Ubuntu compila gli archivi macOS Intel e Apple Silicon per Homebrew, senza runner macOS né installer .pkg. I target macOS escludono tutti i plugin Rust, incluso flip_a_coin, anche nelle build locali. Linux e FreeBSD mantengono i plugin Rust.
La CI verifica contenuti degli archivi macOS e architetture Mach-O senza eseguirne i binari. Linux e FreeBSD mantengono i test di esecuzione degli archivi estratti; non vengono installati pacchetti o integrazioni della shell. Per compilare macOS su Linux: make release-artifacts RELEASE_TARGET_OSES=darwin RELEASE_TARGET_ARCHES="amd64 arm64" RELEASE_MACOS_PKG=0 RELEASE_VERSION=v1.2.3. make release crea ancora un .pkg locale su macOS senza trasferire i binari locali alla CI.
Per le build di artefatti locali, specificare esplicitamente il sistema operativo, l'architettura e la versione di destinazione:
make release-artifacts \
RELEASE_TARGET_OSES=linux \
RELEASE_TARGET_ARCHES="arm64 amd64" \
RELEASE_VERSION=v1.2.3
release-artifactscrea e convalida i formati supportati per quel target. Le impostazioni predefinite sono il sistema operativo host (auto) ed entrambiamd64 arm64; La pubblicazione di FreeBSD è limitata aamd64. I manufatti affondanodist/release. Per una singola build binaria/plugin, utilizzaremake release-build-one RELEASE_GOOS=linux RELEASE_ARCH=arm64 RELEASE_VERSION=v1.2.3.
make versionesegue i controlli di rilascio e crea gli artefatti senza pubblicarli. Al contrario,make releaseè un flusso di lavoro di pubblicazione: richiede macOS, un albero di lavoro pulito e un'identità Git configurata, genera note di rilascio, crea/invia riferimenti di rilascio e controlla il flusso di lavoro GitHub. Il suo canale predefinito è beta; seleziona stabile o notturno conCHANNEL=stableOCHANNEL=nightly. Le note di rilascio generate richiedonoASH_AI_ENDPOINTEASH_AI_MODEL, a meno che non siano fornite noteRELEASE_NOTES_INPUT.
Leggi ilflusso di lavoro di rilascioErilasciare la guida ai segretiprima della pubblicazione.
Registrazione dettagliata del runtime
ASH_VERBOSEabilita la registrazione strutturata del debug JSON e stampa prima un dashboard di esecuzioneAshesce. I valori accettati sono1,y,yes,true,on, Edebug, senza distinzione tra maiuscole e minuscole. Il dashboard riepiloga i tempi delle fasi, il conteggio delle chiamate allo strumento, i totali dei token quando disponibili e il tempo reale totale.
ASH_VERBOSE=1 ash "investigate this error"
ASH_VERBOSE=1 \
ASH_LOG_FILE="$HOME/.local/state/ash/debug.jsonl" \
ASH_LOG_MAX_BYTES=10485760 \
ash "investigate this error"
QuandoASH_LOG_FILEè impostato, i record di log JSON dettagliati vengono scritti su quel percorso; la directory principale viene creata secondo necessità.ASH_LOG_MAX_BYTEScontrolla la rotazione e il valore predefinito è1048576byte (1 MiB). Senza un file di registro esplicito, l'output di debug utilizza il writer della diagnostica del processo. Mantieni i registri privati e rivedili prima di condividerli.
Questo è diverso da quello di MakeV=1: utilizzoV=1per vedere l'output del comando build/test eASH_VERBOSE=1per diagnosticare unAshinvocazione in fase di esecuzione.
Trova l'origine di un record di registro
Ogni chiamata di registrazione Ash ha un campo EID univoco. Copia l'EID dal record JSON e cerca il suo valore letterale nell'origine Go per trovare il sito della chiamata:
rg '"EID", "EpbG2YtZ"' internal/
Ad esempio, una chiamata all'origine registra il messaggio e l'EID insieme al contesto strutturato. Gli EID sono identificatori stabili per le posizioni dei log: non tradurli, rinominarli o riutilizzarli. Il logger di debug e il relativo comportamento di rotazione sono implementati ininternal/app/debuglog.go.
Testa l'installazione del pacchetto nativo con vm.sh
scripts/vm.sh rileva il sistema operativo host e seleziona un backend VM: Tart su Apple Silicon macOS o QEMU/KVM su x86_64 Linux. Entrambi i backend possono testare APT su Ubuntu/Debian e DNF su Fedora/Rocky Linux. Tart su macOS può anche testare il pacchetto macOS Homebrew; Gli host Linux non possono eseguire guest macOS e pertanto non possono testare quel percorso.
Prerequisiti host macOS
Utilizza un Mac Apple Silicon con macOS 13 o versione successiva, con Tart installato, accesso di rete all'immagine VM e al repository Ash e spazio su disco sufficiente per la VM. Installa Tart con Homebrew se necessario:
brew install openai/tools/tart
Prerequisiti dell'host Linux
Utilizza un host Linux x86_64 con la virtualizzazione hardware abilitata e un account utente in grado di leggere e scrivere/dev/kvm(comunemente unendosi alkvmgruppo ed effettuare nuovamente l'accesso). Installa QEMU/KVM, cloud-image-utils percloud-localds, curl, strumenti client OpenSSH e Python 3. Comandi del pacchetto di esempio:
# Debian or Ubuntu
sudo apt-get install qemu-system-x86 qemu-utils cloud-image-utils curl openssh-client python3
# Fedora or Rocky Linux
sudo dnf install qemu-kvm qemu-img cloud-utils curl openssh-clients python3
Il backend Linux avvia immagini cloud x86_64 Ubuntu, Debian, Fedora o Rocky con QEMU/KVM e cloud-init. Utilizza la rete in modalità utente QEMU con SSH inoltrato a localhost; non è necessaria alcuna configurazione di rete libvirt. Non esegue guest macOS, non testa Homebrew su macOS e attualmente richiede un host Linux x86_64. Arch e FreeBSD non sono target supportati.
Esegui un test del pacchetto
La modalità automatizzata è l'impostazione predefinita e rimuove la VM dopo il test. La piattaforma predefinita segue l'host: seleziona macOSmacos, Linux selezionaubuntu. Scegli esplicitamente un'altra piattaforma e modalità supportate. Per impostazione predefinita, il canale del pacchetto èbeta; utilizzo--channel nightly,--channel beta, O--channel releaseper selezionarne uno.--channel stableè un alias perrelease.
scripts/vm.sh --platform macos --mode interactive
scripts/vm.sh --platform ubuntu --channel nightly --mode automated
scripts/vm.sh --platform debian --mode interactive
scripts/vm.sh --platform fedora --mode automated
scripts/vm.sh --platform rocky --mode interactive
La modalità interattiva lascia la VM installata in esecuzione per il test manuale. Su macOS, esegui il comando stampato tart exec -it in un terminale per aprire una shell guest. L'uscita da quella shell lascia la VM in esecuzione; spegnere l'ospite o interromperlo dall'host. Per arrestare ed eliminare una VM Tart conservata, utilizzare:
tart stop VM_NAME && tart delete VM_NAME
Su Linux, lo script stampa un comando SSH e un comando di arresto; arresta la VM e rimuovi il suo stato con:
scripts/vm.sh --stop VM_NAME
La modalità automatizzata esegue controlli di fumo di installazione e configurazione della shell, quindi arresta e rimuove la VM. Le immagini di base scaricate rimangono memorizzate nella cache. Le immagini crostate possono essere modificate conASH_TEST_VM_IMAGE; Gli URL delle immagini cloud Linux possono essere sovrascritti conASH_TEST_QEMU_IMAGE. Le immagini Linux sono memorizzate nella cache in${XDG_CACHE_HOME:-~/.cache}/ash/vm-imagese i dischi VM interattivi e le chiavi SSH vengono mantenuti${XDG_STATE_HOME:-~/.local/state}/ash/vm. ImpostatoASH_TEST_VM_CACHE_DIROASH_TEST_VM_STATE_DIRper cambiare quelle posizioni.
Per consentire all'ospite di connettersi allo stesso servizio AI dell'host, esporta il file necessarioASH_AI_*variabili prima di eseguire lo script, ad esempioASH_AI_ENDPOINT,ASH_AI_MODELe, quando necessario,ASH_AI_AUTH_TOKEN. I valori esportati vengono inoltrati al guest; le variabili di shell non esportate non lo sono. Le macchine virtuali interattive conservano queste credenziali nel profilo guest con modalità0600; I dischi delle VM Linux non sono crittografati, quindi proteggi la directory di stato e arresta/rimuovi la VM al termine.
Vederescripts/vm.sh --helpper gli attuali prerequisiti di backend, piattaforme supportate e opzioni.
Guide alle fonti del progetto
- Guida per contribuire— configurazione, test, aspettative di rilascio e note CI.
- Architettura— layout del progetto e sottosistemi di runtime.
- LEGGIMI— riferimento al prodotto, all'installazione, alla configurazione e all'ambiente.
- Makefile— ricette target autorevoli e variabili di creazione.
- Flussi di lavoro GitHub— CI, costruttori di piattaforme e automazione della pubblicazione.