Guider

Sett opp cplt i et repo

Første gang agenten skal jobbe i et repo, trenger sandkassen ofte litt mer enn standard. Legg det i .cplt.toml, så får hele teamet det samme.

brew update
brew upgrade navikt/tap/nav-pilot navikt/tap/cplt
copilot update    # Copilot CLI
opencode upgrade  # hvis du bruker opencode

Første gang i et repo

Uten egen konfig slipper cplt agenten til prosjektkatalogen og de offentlige pakkeregistrene. Docker og filene med tokenene dine er stengt, og på macOS også localhost. Det repoet trenger i tillegg, skriver teamet i .cplt.toml i roten av repoet.

Start med å se hva cplt init foreslår. Uten flagg skriver den ingenting:

cplt init

Se over forslaget. Under [propose] står det som åpner sandkassen. Linjer som er kommentert ut, peker på filer i hjemmekatalogen din og hører hjemme i din egen konfig, ~/.config/cplt/config.toml, ikke i repoet. cplt init finner ikke alt: for Go foreslår den ingenting, og for Gradle mangler localhost. Sammenlign med tabellen under.

Er forslaget riktig, skriv fila, sjekk den inn og godkjenn den:

cplt init --write
git add .cplt.toml
git commit -m "chore: add cplt sandbox config"
cplt trust accept --all

cplt leser fila slik den er i siste commit, så agenten kan ikke gi seg selv mer midt i en økt. Hver utvikler godkjenner forslaget på sin egen maskin med cplt trust accept. cplt trust show viser hva som er godkjent, og hva som venter.

Har repoet allerede en .cplt.toml, legg til én nøkkel om gangen, eller ta med det init finner nå:

cplt config set --repo allow.localhost 5432   # legger forslaget i .cplt.toml     
cplt init --write --merge                     # legger til nye funn, fjerner ingenting

Det stakken din trenger

Feilen du ser i sandkassen på macOS, og hva du skriver i .cplt.toml. localhost står under [propose.allow], de andre nøklene under [propose]. Feilmeldingene lenker til oppslaget i Feil i sandkassen.

StakkFeilenI .cplt.toml
Go, tester med httptestdial tcp 127.0.0.1:…: connect: operation not permittedallow_localhost_any = true
GradleCould not connect to the Gradle daemon.allow_localhost_any = true
MockK, Mockito inlineCould not self-attach to current VMallow_jvm_attach = true
Next.js dev-server med Turbopacknode process exited before we could connect to itallow_localhost_any = true
Database eller Docker Compose på egen maskinconnect EPERM 127.0.0.1:5432localhost = [5432]
@navikt-pakker fra GitHub Packages401 Unauthorized … authentication token not providedIngenting. Se Pakker fra GitHub Packages.

En Kotlin-app med Gradle, MockK og PostgreSQL i Docker Compose får denne fila:

.cplt.toml
[propose]
allow_localhost_any = true   # Gradle-daemonen, httptest og Turbopack bruker tilfeldige porter
allow_jvm_attach = true      # MockK

[propose.allow]
localhost = [5432]           # PostgreSQL fra docker compose

Go-tester med httptest, Gradle-daemonen og Turbopacks arbeidsprosesser lytter på tilfeldige porter, så én port er ikke nok. Med bare port 3000 åpen starter Next.js, men første side feiler. Databasen har fast port, og da holder det å åpne den.

Bruk localhost, ikke ports, for tjenester på din egen maskin. ports åpner porten mot alle maskiner på nettet, og på macOS gir den ikke tilgang til localhost. Det gjelder også når cplt init foreslår ports eller cplt check net foreslår --allow-port: bruk localhost eller --allow-localhost.

Pakker fra GitHub Packages

@navikt-pakker på npm og Maven ligger i GitHub Packages, og der må du logge inn. Tokenet ligger i ~/.npmrc, ~/.gradle/gradle.properties eller ~/.m2/settings.xml. cplt stenger disse filene, så npm install svarer 401 Unauthorized og Gradle finner ikke pakken. På Linux er bare ~/.npmrc stengt. De to andre ligger i mapper agenten har tilgang til.

For npm og pnpm er det enklest å installere utenfor cplt før du starter agenten:

pnpm install        # i terminalen, utenfor cplt
nav-pilot

Må agenten hente pakker selv, gi den lesetilgang til de tre filene:

cplt config set sandbox.allow_build_credentials true --force

Da kan agenten lese alle tokenene i filene, ikke bare det prosjektet trenger. Derfor krever cplt --force, og derfor kan ikke nøkkelen stå i .cplt.toml. Bruk et token som bare kan lese pakker (read:packages). Trenger du bare én av filene, gi lesetilgang til den, for eksempel cplt config set allow.read ~/.gradle/gradle.properties.

pnpm

I sandkassen legger pnpm lageret i repoet, i .pnpm-store/ eller node_modules/.pnpm-store/, og laster ned alle pakkene på nytt i hvert repo og hvert worktree. Årsaken er at pnpm vil lage en mappe i $PNPM_HOME, der agenten ikke får skrive (cplt#637). Pek pnpm på det felles lageret, her på macOS:

export pnpm_config_store_dir=$HOME/Library/pnpm/store   # i skallet, for eksempel ~/.zshrc
cplt config set sandbox.pass_env pnpm_config_store_dir   # send den inn i sandkassen

Ellers legger du lageret i .gitignore:

echo ".pnpm-store/" >> .gitignore

Skript som kjører når en pakke installeres, er slått av i sandkassen. Trenger en pakke dem, installer utenfor cplt.

mise

Verktøy mise allerede har installert, kan agenten bruke, og mise run virker. Mangler en versjon, stopper mise med denne feilen:

failed create_dir_all ~/.local/share/mise/installs/…: Operation not permitted

Det er med vilje. Et program agenten laster ned og kjører selv, kan gjøre det sandkassen ellers stopper. Installer utenfor cplt før du starter agenten:

mise install

Docker

Docker er stengt i sandkassen. Den som kan snakke med Docker-daemonen, kan starte en container som monterer hele disken, og da er sandkassen borte. Det gjelder også Testcontainers, se Testcontainers og Docker.

cplt init foreslår allow_docker når repoet har en Dockerfile. Ta den ut av forslaget. I Nav bygger CI-en imagene, så agenten trenger ikke Docker. Start tjenestene selv i en egen terminal, og åpne portene agenten skal nå:

docker compose up -d                         # i en terminal utenfor cplt
cplt config set --repo allow.localhost 5432   # agenten når databasen på localhost

Brytere for hele maskinen

Det som gjelder alle repoene dine, hører hjemme i din egen konfig, ~/.config/cplt/config.toml. nav-pilot config sandbox viser bryterne for hele maskinen, for eksempel localhost og Docker, og skriver dit. Det samme gjør cplt config set:

nav-pilot config sandbox
cplt config set sandbox.allow_localhost_any true

Sikkerhetsnivået setter du med nav-pilot config, se Sandkassen. Får du en feil du ikke finner her, slå den opp i Feil i sandkassen.