# NARSYMAS: išmokyk savo AI asistentą valdyti naršyklę
Versija: 1.5 (2026-11-02), suderinta su pagrindine asistento instrukcija v3

================================================================================
KAS ČIA?
================================================================================

Šis failas yra pilnos instrukcijos, pagal kurias tavo AI asistentas (Claude Code)
PATS įsidiegia naršyklės valdymo gebėjimą. Po įdiegimo asistentas galės:

- atsidaryti tikrą naršyklę ir naršyti bet kokį puslapį
- skaityti puslapių turinį, pildyti formas, spausti mygtukus
- daryti ekrano nuotraukas
- naudotis TAVO prisijungimais (sesijos išlieka tarp paleidimų, nes
  naudojamas pastovus naršyklės profilis)

Asistentas naudoja savo atskirą naršyklę ir niekada nespaudinėja tavo
kasdienės naršyklės lange.

Žmogui daryti nieko nereikia. Tiesiog duok savo asistentui šią žinutę:

    Perskaityk Read įrankiu failą diegimo-rinkinys/instrukcijos/narsymas.txt
    ir pagal jį pats įdiek man naršymo gebėjimą. Daryk viską
    savarankiškai, klausk tik kai būtina.

Visa kita žemiau skirta AI asistentui.

================================================================================
INSTRUKCIJOS AI ASISTENTUI
================================================================================

Tu skaitai šį failą, nes vartotojas paprašė įdiegti naršyklės valdymą.
Tavo užduotis: atlikti VISUS žingsnius savarankiškai. Vartotojo klausk tik
4-ame žingsnyje (prisijungimų perkėlimas) ir jei kažkas nepataisomai lūžta.

Architektūra, kurią diegsi:

1. Atskira asistento naršyklė (Chrome / Brave / Edge / Chromium)
   paleidžiama su --remote-debugging-port=9223 ir atskiru PASTOVIU
   profiliu (~/.agent-browser-profile), todėl prisijungimai išlieka tarp
   sesijų. Paleidimo skriptas prieš kiekvieną jungimąsi patikrina, kad
   prievade 9223 veikia naršyklė būtent su šiuo profiliu. Jei ten veikia
   kita naršyklė, pavyzdžiui, vartotojo kasdienė, skriptas nesijungia ir
   parodo klaidą. Nenaudok --headless: asistento naršyklė yra įprastas
   atskiras langas, nes kai kurie puslapiai naršyklę be lango blokuoja.
2. Playwright MCP serveris vardu `playwright` jungiasi prie tos naršyklės
   per CDP (http://127.0.0.1:9223) ir suteikia tau įrankius: navigate,
   snapshot, click, type, fill_form, screenshot ir kt. Jis registruojamas
   asistento aplanko `.mcp.json` faile.
3. PreToolUse hook automatiškai paleidžia naršyklę prieš bet kurį
   playwright įrankio kvietimą, todėl vartotojui nieko rankomis startuoti nereikia.

Viskas diegiama į asistento aplanką (projekto `.claude/` ir `.mcp.json`), ne
į `~/.claude/`. Tai tie patys keliai ir tas pats serverio vardas, kuriuos
naudoja pagrindinė asistento instrukcija (v3), todėl antra, lygiagreti
instaliacija neatsiranda. Visi keliai žemiau skaičiuojami nuo asistento
aplanko šaknies.

Pagrindinė taisyklė, kurią įrašysi į įgūdį ir `CLAUDE.md` (ŽINGSNIS 5):
„Naršyklę valdau TIK atskirame asistento naršyklės profilyje
(`~/.agent-browser-profile`, prievadas 9223). NIEKADA nesijungiu prie
naudotojo kasdienės naršyklės ir NIEKADA nespaudinėju jos lange, net jei
naudotojo naršyklė leidžia prie savęs prisijungti.“

--------------------------------------------------------------------------------
ŽINGSNIS 0. Aplinkos patikra
--------------------------------------------------------------------------------

Patikrink ir užsirašyk:

a) Operacinę sistemą (macOS / Linux / Windows). Žingsniuose, kur
   komandos skiriasi, yra du variantai: „macOS ir Linux“ ir „Windows“.
   Daryk tik šio kompiuterio variantą ir nieko neperrašinėk pats.
   Naršyklės adresas visada 127.0.0.1, ne localhost: Windows kompiuteryje
   localhost pirma bando kitą adresą, ir kiekvienas atsakymas užtrunka
   apie 2 s. Windows kompiuteryje vietoj `curl` rašyk `curl.exe`.

b) Ar yra `claude` CLI: paleisk `claude --version`. Jei nėra, šios
   instrukcijos skirtos Claude Code: praneši vartotojui ir sustok.

c) Ar yra `npx`: paleisk `npx --version` (Windows PowerShell lange
   `npx.cmd --version`, nes `npx` ten gali būti užblokuotas). Jei nėra,
   įdiek Node.js (macOS: `brew install node`; arba nurodyk vartotojui
   nodejs.org).

d) Ar įdiegta bent viena Chromium tipo naršyklė. Tikrink šiuos kelius
   (pirmas rastas laimi). Tą pačią logiką naudoja ir launcher scriptas:

   macOS:
     /Applications/Brave Browser.app/Contents/MacOS/Brave Browser
     /Applications/Google Chrome.app/Contents/MacOS/Google Chrome
     /Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge
   Linux:
     /usr/bin/brave-browser, /usr/bin/google-chrome, /usr/bin/chromium-browser
   Windows:
     %ProgramFiles%\Google\Chrome\Application\chrome.exe
     %ProgramFiles(x86)%\Google\Chrome\Application\chrome.exe
     %LOCALAPPDATA%\Google\Chrome\Application\chrome.exe
     %ProgramFiles%\BraveSoftware\Brave-Browser\Application\brave.exe
     %LOCALAPPDATA%\BraveSoftware\Brave-Browser\Application\brave.exe
     %ProgramFiles(x86)%\Microsoft\Edge\Application\msedge.exe
     %ProgramFiles%\Microsoft\Edge\Application\msedge.exe

   Jei nė vienos nėra, pasiūlyk vartotojui įsidiegti Chrome ir palauk.

e) Ar naršyklės serveris jau yra: paleisk jungčių sąrašą su paslėptais
   adresais, nes kai kurių jungčių adresuose yra raktas.
   macOS ir Linux:
     claude mcp list 2>&1 | sed -E 's#https?://[^ ]+#<adresas paslėptas>#g'
   Windows PowerShell:
     claude mcp list 2>&1 | ForEach-Object { $_ -replace 'https?://\S+','<adresas paslėptas>' }
   Kiekvienam rastam naršyklės serveriui (`playwright`, `playwright-mcp`,
   `chrome-devtools`) paleisk
     claude mcp get <vardas> 2>&1 | grep -E 'Scope|Command'
   (Windows PowerShell: `| Select-String 'Scope|Command'`): eilutė
   `Scope` parodo, kur jis registruotas. Eilutės `Args` nerodyk: joje gali
   būti raktas. Niekada nepaleisk `claude mcp list`
   be filtro ir `claude mcp get` be šio `grep`, o failo `~/.claude.json`
   neskaityk: juose matyti ir kitų jungčių raktai.
   Prie kurio prievado serveris jungiasi, parodo
     claude mcp get <vardas> 2>&1 | grep -oE '(localhost|127\.0\.0\.1):[0-9]+'
   (ji išrašo tik šio kompiuterio adresus).
   Jei naršyklės serveris jau užregistruotas vartotojo lygyje
   (eilutėje `Scope` yra `User`), nedubliuok jo projekte: pasakyk vartotojui, ką
   radai, ir palauk atsakymo. Jei jis jungiasi ne prie 9223, pasiūlyk jį
   pašalinti komanda `claude mcp remove <vardas> -s user` ir vykdyk tik
   gavęs leidimą. Jei yra serveris `chrome-devtools`, jo `--browserUrl`
   nustatyk `http://127.0.0.1:9223`. Jei asistento aplanko `.mcp.json` jau
   turi serverį `playwright` tiksliai kaip ŽINGSNYJE 2 (adresas
   `http://127.0.0.1:9223`, Windows kompiuteryje ir `"command": "cmd"`),
   ŽINGSNĮ 2 praleisk. Jei ten `localhost`, kitas prievadas arba Windows
   kompiuteryje `"command": "npx"`, pataisyk pagal ŽINGSNĮ 2. Kitas
   prievadas reiškia senesnį diegimą: tada ŽINGSNYJE 5 pataisyk ir įgūdį
   `narsymas` bei `CLAUDE.md`, kad juose neliktų seno prievado ir profilio.

--------------------------------------------------------------------------------
ŽINGSNIS 1. Sukurk naršyklės launcher scriptą
--------------------------------------------------------------------------------

Asistento aplanke sukurk katalogą `.claude/skills/narsymas/scripts/`.

macOS ir Linux: įrašyk failą `.claude/skills/narsymas/scripts/browser_launcher.sh`
su šiuo turiniu (pritaikyk naršyklių kelius pagal Žingsnio 0 radinius, jei reikia):

#!/bin/bash
# Paleidžia atskirą asistento naršyklę su CDP prievadu 9223 ir atskiru pastoviu profiliu.
# Prie naršyklės, kuri šiame prievade veikia su kitu profiliu (pvz. savininko kasdienės), nesijungia.
# Kviečiamas automatiškai (PreToolUse hook) prieš kiekvieną playwright įrankį.
# Klaidos atveju baigiasi kodu 2: tada Claude Code naršyklės įrankio nepaleidžia ir parodo priežastį.

PROFILE_DIR="${HOME}/.agent-browser-profile"
CDP_PORT=9223
LOG_FILE="/tmp/agent-browser-cdp.log"

cdp_atsako() {
    curl -s --max-time 2 "http://127.0.0.1:${CDP_PORT}/json/version" >/dev/null 2>&1
}

# Ar eilutėje yra visas asistento profilio parametras? Tarpai iš abiejų pusių, kad netiktų
# profilis „.agent-browser-profile-kitas“ ar tas pats tekstas kito parametro viduje.
su_asistento_profiliu() {
    sed 's/^/ /;s/$/ /' | grep -qF -e " --user-data-dir=${PROFILE_DIR} " -e " --user-data-dir=\"${PROFILE_DIR}\" "
}

# Ar naršyklė, kuri klauso prievado, paleista su asistento profiliu?
profilis_tinka() {
    if command -v lsof >/dev/null 2>&1; then
        local pids pid
        pids=$(lsof -nP -iTCP:"${CDP_PORT}" -sTCP:LISTEN -t 2>/dev/null)
        if [ -n "$pids" ]; then
            for pid in $pids; do
                if ps -ww -p "$pid" -o command= 2>/dev/null | su_asistento_profiliu; then
                    return 0
                fi
            done
            return 1
        fi
    fi
    # Be lsof: ieškom proceso, paleisto su abiem visais parametrais (prievadas 92230 netinka)
    ps axww -o command= 2>/dev/null | sed 's/^/ /;s/$/ /' | grep -F -- " --remote-debugging-port=${CDP_PORT} " | su_asistento_profiliu
}

kitas_profilis() {
    echo "ERROR: prievade ${CDP_PORT} veikia narsykle su kitu profiliu, ne ${PROFILE_DIR}. Nesijungiu." >&2
    exit 2
}

# Prievadas jau atsako: jungiamės tik prie naršyklės su asistento profiliu
if cdp_atsako; then
    profilis_tinka && exit 0
    kitas_profilis
fi

# Pašalink pasenusius lock failus (jie blokuoja pakartotinį paleidimą)
# Išimtis: guardrails.md draudžia rm, bet naršyklės užrakto failų valymas yra
# vienintelė leidžiama rm išimtis. Valomi tik šie trys failai, ne naudotojo duomenys.
rm -f "${PROFILE_DIR}/SingletonLock" "${PROFILE_DIR}/SingletonSocket" "${PROFILE_DIR}/SingletonCookie"

# Surask naršyklės binarą
BROWSER_BINARY=""
for path in \
    "/Applications/Brave Browser.app/Contents/MacOS/Brave Browser" \
    "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" \
    "/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge" \
    "/usr/bin/brave-browser" \
    "/usr/bin/google-chrome" \
    "/usr/bin/chromium-browser"; do
    if [ -x "$path" ]; then
        BROWSER_BINARY="$path"
        break
    fi
done

if [ -z "$BROWSER_BINARY" ]; then
    echo "ERROR: nerasta Chromium tipo narsykle" >&2
    exit 2
fi

"$BROWSER_BINARY" \
    --remote-debugging-port="${CDP_PORT}" \
    --user-data-dir="${PROFILE_DIR}" \
    --no-first-run \
    --no-default-browser-check \
    --disable-sync \
    --disable-infobars \
    --disable-search-engine-choice-screen \
    about:blank \
    >> "${LOG_FILE}" 2>&1 &

# Palauk iki 30 s, kol naršyklė pakils (pirmas paleidimas su nauju profiliu lėtesnis)
for i in $(seq 1 60); do
    sleep 0.5
    if cdp_atsako; then
        profilis_tinka && exit 0
        kitas_profilis
    fi
done

echo "ERROR: narsykle nepasileido per 30 sekundziu" >&2
exit 2

Po įrašymo: `chmod +x .claude/skills/narsymas/scripts/browser_launcher.sh`

Windows: įrašyk failą `.claude/skills/narsymas/scripts/browser_launcher.ps1`
tiksliai su šiuo turiniu. Jame tyčia nėra lietuviškų raidžių: Windows
PowerShell failą be BOM skaito ne kaip UTF-8. `.sh` failo Windows
kompiuteryje nekurk.

# Launches the assistant's own Chromium browser with CDP port 9223 and its own persistent profile (Windows).
# Called by the PreToolUse hook before every playwright tool.
# Never connects to a browser on this port that runs with another profile, for example the owner's everyday browser.
# Errors exit with code 2: Claude Code then stops the browser tool and shows the reason.

$ProfileDir = Join-Path $env:USERPROFILE ".agent-browser-profile"
$CdpPort = 9223
$CdpUrl = "http://127.0.0.1:$CdpPort/json/version"

function Test-Cdp {
    try {
        $null = Invoke-WebRequest -Uri $CdpUrl -UseBasicParsing -TimeoutSec 1
        return $true
    } catch {
        return $false
    }
}

# True only if the browser that listens on the port was started with the assistant profile
function Test-Profile {
    # Whole arguments only: a profile such as .agent-browser-profile-other, text inside another
    # argument or port 92230 does not match
    $ProfileArg = '(?:^|\s)--user-data-dir=(?:"' + [regex]::Escape($ProfileDir) + '"|' + [regex]::Escape($ProfileDir) + ')(?=\s|$)'
    $PortArg = '(?:^|\s)--remote-debugging-port=' + $CdpPort + '(?=\s|$)'
    $Ids = @()
    try {
        $Ids = @(Get-NetTCPConnection -LocalPort $CdpPort -State Listen -ErrorAction Stop | Select-Object -ExpandProperty OwningProcess -Unique)
    } catch {
        $Ids = @()
    }
    if ($Ids.Count -gt 0) {
        $Lines = foreach ($Id in $Ids) { (Get-CimInstance Win32_Process -Filter "ProcessId=$Id").CommandLine }
    } else {
        $Lines = Get-CimInstance Win32_Process | Where-Object { $_.CommandLine -match $PortArg } | Select-Object -ExpandProperty CommandLine
    }
    foreach ($Line in $Lines) {
        if ($Line -and $Line -match $ProfileArg) { return $true }
    }
    return $false
}

function Stop-OtherProfile {
    [Console]::Error.WriteLine("ERROR: prievade $CdpPort veikia narsykle su kitu profiliu, ne $ProfileDir. Nesijungiu.")
    exit 2
}

# Port already answers: connect only to the browser with the assistant profile
if (Test-Cdp) {
    if (Test-Profile) { exit 0 }
    Stop-OtherProfile
}

$Candidates = @(
    "$env:ProgramFiles\Google\Chrome\Application\chrome.exe",
    "${env:ProgramFiles(x86)}\Google\Chrome\Application\chrome.exe",
    "$env:LOCALAPPDATA\Google\Chrome\Application\chrome.exe",
    "$env:ProgramFiles\BraveSoftware\Brave-Browser\Application\brave.exe",
    "$env:LOCALAPPDATA\BraveSoftware\Brave-Browser\Application\brave.exe",
    "${env:ProgramFiles(x86)}\Microsoft\Edge\Application\msedge.exe",
    "$env:ProgramFiles\Microsoft\Edge\Application\msedge.exe"
)
$Browser = $Candidates | Where-Object { Test-Path -LiteralPath $_ } | Select-Object -First 1
if (-not $Browser) {
    [Console]::Error.WriteLine("ERROR: nerasta Chromium tipo narsykle")
    exit 2
}

Start-Process -FilePath $Browser -ArgumentList @(
    "--remote-debugging-port=$CdpPort",
    "--user-data-dir=`"$ProfileDir`"",
    "--no-first-run",
    "--no-default-browser-check",
    "--disable-sync",
    "--disable-search-engine-choice-screen",
    "about:blank"
)

# First start with a new profile is slow on Windows: wait up to 25 s.
# A deadline, not a count: each failed check can take ~2 s, and the hook stops at 60 s.
$Timer = [Diagnostics.Stopwatch]::StartNew()
while ($Timer.Elapsed.TotalSeconds -lt 25) {
    Start-Sleep -Milliseconds 500
    if (Test-Cdp) {
        if (Test-Profile) { exit 0 }
        Stop-OtherProfile
    }
}
[Console]::Error.WriteLine("ERROR: narsykle nepasileido per 25 sekundes")
exit 2

Patikrink, kad veikia.
macOS ir Linux:
  bash .claude/skills/narsymas/scripts/browser_launcher.sh
  curl -s http://127.0.0.1:9223/json/version
  ps axww -o command= | grep -F -- "--user-data-dir=$HOME/.agent-browser-profile" | grep -F -- "--remote-debugging-port=9223"
Windows (tinka ir Git Bash, ir PowerShell):
  powershell.exe -NoProfile -ExecutionPolicy Bypass -File .claude/skills/narsymas/scripts/browser_launcher.ps1
  curl.exe -s http://127.0.0.1:9223/json/version
Windows PowerShell proceso eilutė:
  Get-CimInstance Win32_Process | Where-Object { $_.CommandLine -like "*remote-debugging-port=9223*" } | Select-Object -ExpandProperty CommandLine
`-ExecutionPolicy Bypass` galioja tik šiam paleidimui, kompiuterio
nustatymų nekeičia. Pirmas paleidimas gali užtrukti iki 30 s.

Skriptas turi baigtis be klaidos, `curl` turi grąžinti JSON su "Browser"
lauku, o proceso eilutėje turi būti `--user-data-dir=` su
`.agent-browser-profile`. Turi atsidaryti atskiras naršyklės langas (tai
NE vartotojo kasdienė naršyklė, o atskiras profilis). Jei skriptas
baigiasi klaida, kad prievade veikia naršyklė su kitu profiliu, prie jos
nesijunk ir jos neuždaryk: parodyk vartotojui proceso eilutę ir paprašyk,
kad tą naršyklę uždarytų pats.

Patikrink ir tai, kad vartotojo kasdienė naršyklė nepaleista su debug
prievadu. Komanda neturi parodyti nė vienos naršyklės eilutės:
macOS ir Linux:
  ps axww -o command= | grep -E -- "--remote-debugging-por[t]" | grep -vF -- "--user-data-dir=$HOME/.agent-browser-profile"
Windows PowerShell:
  Get-CimInstance Win32_Process | Where-Object { $_.CommandLine -like "*remote-debugging-port*" -and $_.CommandLine -notlike "*.agent-browser-profile*" } | Select-Object -ExpandProperty CommandLine
Jei parodo, pasakyk vartotojui, kokia naršyklė paleista su debug
prievadu, ir paklausk, iš kur ji paleidžiama (Dock ar darbalaukio
nuoroda, `LaunchAgents`, skriptas). Parametrą `--remote-debugging-port` šalink tik gavęs
vartotojo leidimą.

SVARBU: jei vartotojo kasdienė naršyklė yra TA PATI (pvz. Chrome) ir jau
veikia, scriptas vis tiek pasileis, nes naudoja kitą --user-data-dir.
Tai normalu: bus du Chrome procesai.

--------------------------------------------------------------------------------
ŽINGSNIS 2. Pridėk Playwright MCP serverį
--------------------------------------------------------------------------------

Pridėk projekto lygiu: į asistento aplanko šaknies failą `.mcp.json`. Jei
faile jau yra kitų serverių, palik juos, tik pridėk šį.

macOS ir Linux:

{
  "mcpServers": {
    "playwright": {
      "command": "npx",
      "args": ["-y", "@playwright/mcp@latest", "--cdp-endpoint", "http://127.0.0.1:9223", "--caps", "vision"]
    }
  }
}

Windows (`npx` paleidžiamas per `cmd /c`, kitaip Claude Code serverio
nepaleidžia):

{
  "mcpServers": {
    "playwright": {
      "command": "cmd",
      "args": ["/c", "npx", "-y", "@playwright/mcp@latest", "--cdp-endpoint", "http://127.0.0.1:9223", "--caps", "vision"]
    }
  }
}

Tada paleisk `npx -y @playwright/mcp@latest --help` (Windows PowerShell
lange `npx.cmd`), kad paketas būtų atsisiųstas iš anksto. Patikrink, kad JSON galioja (veikia visuose
kompiuteriuose, nes Node.js jau yra):
`node -e "JSON.parse(require('fs').readFileSync('.mcp.json','utf8'));console.log('OK')"`

Serverio vardas visada `playwright`. Vardo `playwright-mcp` nenaudok:
hook'as, įgūdis ir pagrindinė instrukcija tikisi būtent `playwright`.

Jei asistento aplanke jau yra `playwright` serveris be --cdp-endpoint
(izoliuota naršyklė be pastovaus profilio), pasiūlyk pakeisti į šį
variantą, nes kitaip prisijungimai neišliks: `.mcp.json` faile pataisyk
to serverio `args`. Jei senas naršyklės serveris užregistruotas
vartotojo lygyje, jo pats nešalink ir nedubliuok: pasakyk vartotojui, ką
radai, ir palauk atsakymo.

--------------------------------------------------------------------------------
ŽINGSNIS 3. Pridėk PreToolUse hook (auto-paleidimas)
--------------------------------------------------------------------------------

Atidaryk asistento aplanko `.claude/settings.json` (jei nėra, sukurk su `{}`).
ATSARGIAI: failas gali turėti kitų nustatymų. PAPILDYK, ne perrašyk.
Į "hooks" sekciją įterpk (sulieję su esamais hooks, jei tokių yra).

macOS ir Linux:

{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "mcp__playwright__.*",
        "hooks": [
          {
            "type": "command",
            "command": "bash \"${CLAUDE_PROJECT_DIR:-.}/.claude/skills/narsymas/scripts/browser_launcher.sh\"",
            "timeout": 60
          }
        ]
      }
    ]
  }
}

Windows (komanda su atskirais argumentais, be apvalkalo, kad veiktų ir be
Git Bash):

{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "mcp__playwright__.*",
        "hooks": [
          {
            "type": "command",
            "command": "powershell.exe",
            "args": ["-NoProfile", "-ExecutionPolicy", "Bypass", "-File", "${CLAUDE_PROJECT_DIR}/.claude/skills/narsymas/scripts/browser_launcher.ps1"],
            "timeout": 60
          }
        ]
      }
    ]
  }
}

Pastabos:
- Jei paleidimo skriptas baigiasi kodu 2, Claude Code naršyklės įrankio
  nepaleidžia ir parodo klaidą. Taip asistentas niekada neprisijungia
  prie naršyklės su kitu profiliu.
- Galas `.*` matcher'yje būtinas. Be jo "mcp__playwright" lyginamas kaip
  tikslus įrankio vardas, neatitinka nė vieno įrankio, ir hook'as
  niekada nesuveikia. Su juo suveikia kiekvienam naršyklės įrankiui
  (pvz. mcp__playwright__browser_navigate).
- Jei faile jau yra kitų raktų (pvz. "env", "permissions"), palik juos,
  tik pridėk/papildyk "hooks" raktą. Jei "PreToolUse" masyvas jau
  egzistuoja, pridėk šį matcher objektą į jį, neliesdamas esamų.
- Po redagavimo patikrink, kad JSON validus:
  `node -e "JSON.parse(require('fs').readFileSync('.claude/settings.json','utf8'));console.log('OK')"`

--------------------------------------------------------------------------------
ŽINGSNIS 4. (PASIRINKTINAI) Perkelk vartotojo prisijungimus
--------------------------------------------------------------------------------

ČIA VIENINTELĖ VIETA, KUR KLAUSI VARTOTOJO. Paklausk:

  „Ar nori, kad AI naršyklė turėtų tavo esamus prisijungimus (Gmail,
  Facebook ir t.t.)? Galiu nukopijuoti tavo naršyklės profilį, tada
  nereikės iš naujo jungtis prie paskyrų. Tam reikės trumpam uždaryti
  tavo naršyklę.“

Jei NE, praleisk šį žingsnį. Profilis bus švarus; prie paskyrų bus
jungiamasi po vieną, kai prireiks (sesijos vis tiek išliks ateičiai).

Jei TAIP:
1. Paprašyk vartotojo uždaryti kasdienę naršyklę (kopijuoti veikiančios
   naršyklės profilį nesaugu). Uždaryk ir AI naršyklę, kurią paleidai
   ŽINGSNYJE 1, kitaip ji užsidarydama perrašys nukopijuotus failus.
   Windows komandos šiame žingsnyje yra PowerShell. Jei jas leidi per
   Bash, apgaubk VIENGUBOMIS kabutėmis, kad Bash nesugadintų `$` ženklų:
   powershell -NoProfile -Command '<komanda>'
   macOS ir Linux: pkill -f "user-data-dir=$HOME/.agent-browser-profil[e]( |$)"
   Windows: Get-CimInstance Win32_Process | Where-Object { $_.Name -match "^(chrome|msedge|brave)\.exe$" -and $_.CommandLine -match "\.agent-browser-profile(\x22|\s|\z)" } | ForEach-Object { Stop-Process -Id $_.ProcessId -Force }
2. Kopijuok tos naršyklės profilį, kurią paleidžia launcher scriptas
   (pirmoji rasta iš jo sąrašo). Kitos naršyklės profilis neveiks:
   kiekviena naršyklė prisijungimus užrakina savo raktu. Jei vartotojas
   kasdien naudoja kitą naršyklę, pasakyk jam tai: prie paskyrų jis
   prisijungs pats AI naršyklės lange, po vieną, kai prireiks.
   Nukopijuok profilio TURINĮ į jau esamą `.agent-browser-profile`
   aplanką (užima keletą GB, užtrunka kelias minutes, leisk komandą su
   ilgesniu laukimu). Galas `/.` reikalingas: be jo `cp` įdėtų profilį
   į poaplankį, ir naršyklė jo nerastų.
   Chrome (macOS):  cp -R "$HOME/Library/Application Support/Google/Chrome/." "$HOME/.agent-browser-profile/"
   Brave (macOS):   cp -R "$HOME/Library/Application Support/BraveSoftware/Brave-Browser/." "$HOME/.agent-browser-profile/"
   Edge (macOS):    cp -R "$HOME/Library/Application Support/Microsoft Edge/." "$HOME/.agent-browser-profile/"
   Chrome (Linux):  cp -R "$HOME/.config/google-chrome/." "$HOME/.agent-browser-profile/"
   Brave (Linux):   cp -R "$HOME/.config/BraveSoftware/Brave-Browser/." "$HOME/.agent-browser-profile/"
   Windows (`robocopy` baigęs grąžina kodą nuo 0 iki 7, tai sėkmė;
   klaida tik nuo 8; `/R:1 /W:1` neleidžia jam valandų valandas laukti
   užrakinto failo, o `exit $LASTEXITCODE` perduoda tikrą kodą per Bash):
   Chrome:  robocopy "$env:LOCALAPPDATA\Google\Chrome\User Data" "$env:USERPROFILE\.agent-browser-profile" /E /R:1 /W:1 /XD Cache "Code Cache" GPUCache; exit $LASTEXITCODE
   Edge:    robocopy "$env:LOCALAPPDATA\Microsoft\Edge\User Data" "$env:USERPROFILE\.agent-browser-profile" /E /R:1 /W:1 /XD Cache "Code Cache" GPUCache; exit $LASTEXITCODE
   Brave:   robocopy "$env:LOCALAPPDATA\BraveSoftware\Brave-Browser\User Data" "$env:USERPROFILE\.agent-browser-profile" /E /R:1 /W:1 /XD Cache "Code Cache" GPUCache; exit $LASTEXITCODE
   Jei kodas 8 ar didesnis, naršyklė dar veikia fone: paprašyk vartotojo
   ją uždaryti ir per užduočių juostos ikonėlę, tada kartok.
3. macOS ir Linux: po kopijavimo ištrink lock failus (tai ta pati
   leidžiama rm išimtis, kaip paleidimo skripte: valomi tik naršyklės
   užrakto failai):
   rm -f "$HOME/.agent-browser-profile/SingletonLock" "$HOME/.agent-browser-profile/SingletonSocket" "$HOME/.agent-browser-profile/SingletonCookie"
   Windows kompiuteryje šių failų nėra, nieko netrink.
4. PASTABA: dalis svetainių (ypač Google) gali paprašyti prisijungti iš
   naujo dėl saugumo. Tai normalu, sesija išliks toliau.

--------------------------------------------------------------------------------
ŽINGSNIS 5. Sukurk skill failą
--------------------------------------------------------------------------------

Jei asistento aplanke failas `.claude/skills/narsymas/SKILL.md` jau yra
(jį įrašo pagrindinė asistento instrukcija), jo neperrašyk: tik patikrink,
kad jame keliai ir serverio vardas sutampa su šiais. Jei jame kitas
prievadas ar profilis, pakeisk juos į 9223 ir `~/.agent-browser-profile`.
Jei jame nėra taisyklės apie atskirą naršyklės profilį (žemiau, skyriuje
„Kaip veikia“), pridėk ją pažodžiui. Jei asistento aplanke jau yra
`CLAUDE.md`, patikrink ir jį: seną prievadą ir profilį pakeisk taip pat,
o taisyklę apie atskirą profilį įrašyk, jei jos ten nėra. Kitų `CLAUDE.md`
eilučių neliesk. Jei failo `SKILL.md` nėra, įrašyk
`.claude/skills/narsymas/SKILL.md` su šiuo turiniu:

---
name: narsymas
description: Use when the user asks to browse a website, open a page, check something online, log into a service, fill a web form, take a screenshot of a page, or any task requiring a real browser. Triggers on "atsidaryk", "panaršyk", "patikrink puslapį", "prisijunk prie", "užpildyk formą", "padaryk screenshot", "browse", "open site".
---

# Narsymas: naršyklės valdymas

## Kaip veikia

Playwright MCP įrankiai (mcp__playwright__*) valdo atskirą asistento
naršyklę, prijungtą per CDP (127.0.0.1:9223). Naršyklė pasileidžia
automatiškai (PreToolUse hook). Profilis atskiras ir pastovus
(~/.agent-browser-profile), todėl visi prisijungimai išlieka tarp sesijų.

Naršyklę valdau TIK atskirame asistento naršyklės profilyje (`~/.agent-browser-profile`, prievadas 9223). NIEKADA nesijungiu prie naudotojo kasdienės naršyklės ir NIEKADA nespaudinėju jos lange, net jei naudotojo naršyklė leidžia prie savęs prisijungti.

## Darbo eiga

1. `browser_navigate`: nueik į URL
2. `browser_snapshot`: gauk puslapio struktūrą (accessibility tree).
   VISADA pirmiau snapshot, tik tada click/type: elementų ref'ai
   gaunami iš snapshot.
3. `browser_click` / `browser_type` / `browser_fill_form`: veiksmai
4. `browser_take_screenshot`: vizuali patikra
5. `browser_wait_for`: palauk, kol pasikeis turinys po veiksmo

## Taisyklės

- Prisijungimo formose NIEKADA nespėliok slaptažodžių ir neprašyk jų
  parašyti pokalbyje. Paprašyk vartotojo prisijungti pačiam atidarytame
  lange: sesija išliks, antrą kartą jungtis nereikės. Valstybės
  portaluose (VMI, „Sodra“, e. valdžios vartai) ir banke vartotojas
  prisijungimą patvirtina Smart-ID ar mobiliuoju parašu savo telefone,
  o tu atidarai puslapį ir lauki. Kai vartotojas prisijungė, jo
  paskyroje dirbk taip, kaip jis paprašė, o banke tik peržiūrėk duomenis.
- Prieš pirkimą, mokėjimą, žinutės/el. laiško išsiuntimą ar bet kokį
  negrįžtamą veiksmą VISADA paklausk vartotojo patvirtinimo.
- Jei puslapis neužsikrauna, paleisk
  `bash .claude/skills/narsymas/scripts/browser_launcher.sh`
  (Windows: `powershell.exe -NoProfile -ExecutionPolicy Bypass -File .claude/skills/narsymas/scripts/browser_launcher.ps1`).
  Jis patikrina, kad prievade 9223 veikia naršyklė su profiliu
  `~/.agent-browser-profile`, ir prireikus ją paleidžia. Jei skriptas
  baigiasi klaida, naršyklės įrankio nenaudok ir parodyk klaidą vartotojui.

## Trikčių šalinimas

- „Browser is already in use“ / nepavyksta prisijungti prie 9223:
  uždaryk tik savo naršyklę, paleistą su profiliu ~/.agent-browser-profile:
  `pkill -f "user-data-dir=$HOME/.agent-browser-profil[e]( |$)"` (Windows
  PowerShell: `Get-CimInstance Win32_Process | Where-Object { $_.Name -match "^(chrome|msedge|brave)\.exe$" -and $_.CommandLine -match "\.agent-browser-profile(\x22|\s|\z)" } | ForEach-Object { Stop-Process -Id $_.ProcessId -Force }`;
  per Bash apgaubk `powershell -NoProfile -Command '<komanda>'`),
  macOS ir Linux kompiuteryje ištrink lock failus (žr. launcher scriptą)
  ir paleisk launcher iš naujo.
- Paleidimo skriptas praneša, kad prievade 9223 veikia naršyklė su kitu profiliu:
  prie jos nesijunk ir jos neuždaryk. Parodyk vartotojui jos paleidimo
  eilutę (macOS ir Linux: `ps axww -o pid=,command= | grep -E -- "--remote-debugging-port=922[3]"`,
  Windows PowerShell: `Get-CimInstance Win32_Process | Where-Object { $_.CommandLine -like "*remote-debugging-port=9223*" } | Select-Object -ExpandProperty CommandLine`)
  ir paprašyk, kad ją uždarytų pats. Tada skriptą paleisk iš naujo.
- MCP įrankių nesimato: vartotojas turi perkrauti Claude Code sesiją
  (MCP serveriai kraunami sesijos pradžioje).

--------------------------------------------------------------------------------
ŽINGSNIS 6. Verifikacija
--------------------------------------------------------------------------------

1. Paleisk šio kompiuterio launcher scriptą: jis turi baigtis be
   klaidos. Patikrink `curl -s http://127.0.0.1:9223/json/version`
   (Windows: `curl.exe`) ir proceso eilutę iš ŽINGSNIO 1: joje turi būti
   `--user-data-dir=` su `.agent-browser-profile`. Patikrink, kad
   `.claude/skills/narsymas/SKILL.md` ir `CLAUDE.md` (jei jis yra) turi
   taisyklę apie atskirą naršyklės profilį.
2. Pasakyk vartotojui PERKRAUTI Claude Code, nes MCP serveriai
   prisijungia sesijos pradžioje. VS Code: Cmd+Shift+P (Windows:
   Ctrl+Shift+P) → „Developer: Reload Window“, tada atsidaryti TĄ PATĮ
   pokalbį, ne naują: jei jis negrįžo pats, Claude Code panelės viršuje
   spausti „Session history“, jį pasirinkti ir parašyti „tęsk“.
   Terminale: parašyti `/exit` ir paleisti `claude --continue`. Kai
   Claude paklaus, ar leisti projekto MCP serverį iš `.mcp.json`,
   patvirtinti. Tas pats pokalbis svarbus, kai šis failas vykdomas
   pagrindinio diegimo viduryje: naujame pokalbyje dingtų diegimo
   instrukcija su visomis papildomomis taisyklėmis.
3. Po perkrovimo pirmas testas: paprašyk asistento
   „atsidaryk https://krei-ea-windows.vercel.app/testas ir pasakyk, kas parašyta antraštėje“.
   Jei asistentas grąžina antraštę „Naršyklė veikia“, viskas veikia.
   Jei tas puslapis neatsidaro, pabandyk bet kurį kitą veikiantį puslapį
   ir tik tada spręsk, kad naršyklė neveikia: tikrinama naršyklė, ne
   svetainė.

--------------------------------------------------------------------------------
SAUGUMO PASTABOS (perduok vartotojui po įdiegimo)
--------------------------------------------------------------------------------

- ~/.agent-browser-profile saugo prisijungimų sesijas. Tai tavo kompiuteryje,
  niekur nesiunčiama, bet elkis kaip su naršyklės profiliu: neperdavinėk
  kitiems.
- AI asistentas naršyklėje veikia TAVO vardu. Negrįžtamiems veiksmams
  (pirkimai, žinutės, trynimai) jis privalo klausti patvirtinimo. Tai
  įrašyta skill taisyklėse.
- Asistentas jungiasi tik prie savo atskiros naršyklės ir niekada
  nespaudinėja tavo kasdienės naršyklės lange.
- Jei nori atšaukti prieigą: ištrink ~/.agent-browser-profile katalogą ir
  pašalink MCP (`claude mcp remove playwright -s project`).

================================================================================
PABAIGA. Sėkmės naršant!
================================================================================
