Hoppa till innehåll

Fyll ett projekt från ett GitHub-repo

Rikta en agent mot ett GitHub-repository så får du tillbaka en fungerande board: varje issue som en story, i det tillstånd dess historik säger att den ska ha, med checklistor, etiketter och milstolpar överförda. Sedan plockar samma agent upp en story, gör anspråk på den, för den genom tillståndsmaskinen och länkar den pull request den öppnade.

Den här sidan beskriver hela den slingan. Fyllnadssteget har två vägar: GitHub-to-EAT, East Agiles öppna importverktyg, gör det med ett enda kommando (steg 3); import-API:et gör samma arbete anrop för anrop (steg 4 och 5), vilket är det en agent styr när den vill ha jobbets handtag. Allt därefter går via API:et, eftersom hela poängen är att en agent ska klara resten utan tillsyn.

Detta är ingen separat »AI-import«. Fyllnadssteget är samma GitHub-import som du kan köra för hand från Projektinställningar → Importera / Exportera, beskriven i Bruksanvisning → Importera från andra trackers. Agenten anropar samma endpoint som du skulle ha gjort. Det den här sidan lägger till är allt runt omkring: vem som håller nyckeln, hur du kontrollerar importen innan den skriver, och vad agenten gör med boarden när den väl finns.

GitHub-källan på fliken Import / Export: ägare och repository ifyllda, token tom, pull requests och milstolpar ikryssade

  • Ett projekt — och en session eller en ea_user_…-nyckel att skapa det med.
  • En agentnyckel — en ea_agent_…-nyckel begränsad till det projektet. Vilken roll den behöver beror på hur mycket av slingan du vill att agenten kör; se steg 2. Se även API-guide → Två sorters nycklar.
  • En personlig GitHub-åtkomsttoken — med läsrättighet till repositoryts issues. Varje import autentiserar sig, eftersom hämtningen går via GitHubs GraphQL-API och GraphQL avvisar en förfrågan utan token. Du kan utelämna den bara när Trackern hämtar för din räkning: ett publikt repository, på en driftsättning som har en delad reservtoken (den hostade eastagiletracker.com har en; en självhostad installation har ingen förrän dess operatör sätter GITHUB_IMPORT_PAT), och inte med GitHub-to-EATs --engine direct. Se Token och hastighetsgränser.
  • Node.js 22+ — endast för GitHub-to-EAT-vägen i steg 3. API-vägen behöver inget mer än curl.

Projektet måste finnas innan agentnyckeln gör det, och det måste skapas av en människa: agentnycklar binds till ett projekt när de utfärdas och kan inte starta upp projekt. Skapa det i gränssnittet, eller med din egen ea_user_…-nyckel:

Terminal window
curl -X POST https://eastagiletracker.com/api/v1/projects \
-H "X-TrackerToken: $TRACKER_USER_TOKEN" \
-H "Content-Type: application/json" \
-d '{"name": "hello-world", "iteration_length_weeks": 1}'

Svaret bär det project_id som varje anrop nedan behöver.

En projektägare skapar agentnycklar i Projektinställningar → Agenter. Rollen du väljer avgör hur mycket av den här sidan agenten klarar på egen hand, och det finns två rimliga svar:

  • owner — en enda nyckel kör hela slingan, import inräknad. Att importera är förbehållet ägaren, eftersom en import skriver om projektets form i sin helhet. Att utfärda en agent med rollen owner kräver att du själv är projektägare: en agents roll kan aldrig överstiga dess skapares.
  • member — minsta privilegium. Agenten gör anspråk på stories, flyttar dem, kommenterar och länkar pull requests, men kan inte importera. Importen kör du själv (steg 5) med din egen nyckel och lämnar sedan över boarden till agenten.

Hur du än gör: låt den inte stå kvar på standardvärdet. En ny agentnyckel är viewer tills du säger något annat, och en viewer kan läsa boarden men varken göra anspråk på eller flytta en story — vilket är merparten av den här slingan.

Agentnycklar spelar roll här av ett skäl bortom åtkomst. En agentnyckel agerar som namngiven deltagare i ett enda projekt, så varje story den skapar, varje tillståndsbyte den gör och varje kommentar den skriver tillskrivs den agenten i historiken — särskiljbar från ditt eget arbete i stället för hopblandad med det.

Terminal window
export TRACKER_TOKEN="ea_agent_xxxxx"

Låt agenten läsa /meta före allt annat:

Terminal window
curl https://eastagiletracker.com/api/v1/meta \
-H "X-TrackerToken: $TRACKER_TOKEN"

Det besvarar de två frågor agenten annars skulle gissa sig till: vilket projekt nyckeln är bunden till (auth.project_id), och vilka tillståndsbyten som är tillåtna per storytyp (transitions). En feature går unstarted → started → finished → delivered → accepted; en chore är bara unstarted → started → accepted. Att läsa kartan slår att hårdkoda den.

GitHub-to-EAT är East Agiles eget öppna importverktyg: ett MIT-licensierat kommandoradsverktyg som gör hela fyllnadssteget — steg 4 och 5 nedan — med ett kommando. Ta till det när en människa sitter vid en terminal. Ta till API:et under det när en agent styr utan tillsyn och vill ha jobbets handtag att polla.

Det kräver Node.js 22+ och har inga egna körtidsberoenden. Det är ännu inte publicerat på npm, så installera det från repositoryt:

Terminal window
git clone git@github.com:EastAgile/GitHub-to-EAT.git
cd GitHub-to-EAT
npm install --global .

Rikta det sedan mot nyckeln du utfärdade i steg 2 och projektet du gjorde i steg 1:

Terminal window
export EAT_AGENT_KEY="ea_agent_xxxxx"
github-to-eat --project $PROJECT_ID --repo octocat/hello-world

Det skriver först ut en mappningslegend — exakt hur varje vald typ kommer att landa — och ber om bekräftelse innan det skriver något. Utanför en terminal, i ett rör, i CI eller i en agent finns ingenstans att visa den frågan, så en körning som skulle skriva måste skicka --yes; utan det avslutas verktyget med 2 och skriver ingenting i stället för att gissa ditt svar. Att köra om är säkert: det som redan importerats hoppas över, aldrig dubbleras.

FlaggaVad den gör
--dry-runFörkontroll, sedan utskrift av planen den skulle genomföra — hur många stories den skulle importera, hur många den skulle hoppa över som redan befintliga — och skriver ingenting. Behöver inget --yes.
--includeVilka typer som ska importeras, kommaseparerat: issues,prs,milestones,releases,deps. Standard är issues, och varje urval måste innehålla det. Det är samma tillval som tabellen i steg 6.
--tokenDin personliga GitHub-åtkomsttoken (GITHUB_TOKEN i miljön eller i en .env räknas också). Den behöver repo, eller finkornigt Issues: Read, på det repositoryt. Krävs för ett privat repository, för en server utan delad reservtoken, och alltid för --engine direct. Utelämna den på den hostade tjänstens standardmotor så spenderar Trackern sin egen delade budget — se Token och hastighetsgränser.
--engineserver, standardvalet, skickar ett /import/json-anrop och låter Trackern hämta, mappa och skriva. direct kör samma pipeline på din maskin och skriver i stället via det publika API:et — den läser alltså GitHub själv och behöver alltid en token, annars avslutas den med 2.
--states, --milestones, --story-type, --no-comments, --no-tasksBegränsar eller åsidosätter mappningen för en körning; inget sparas. Var och en av dem medför --engine direct.

Sätt EAT_API_BASE och EAT_APP_BASE för att rikta det mot en självhostad eller lokal Tracker; båda pekar som standard på den hostade tjänsten. README bär den fullständiga flaggreferensen, avslutningskoderna och felsökningen.

Allt nedan är samma import styrd anrop för anrop, vilket är det du vill ha när en agent kör den.

Att importera är förbehållet ägaren — använd en agentnyckel med rollen owner, eller din egen nyckel om du lämnade agenten som member. Kör den först med dry_run, innan du låter den skriva något:

Terminal window
curl -X POST https://eastagiletracker.com/api/v1/projects/$PROJECT_ID/import/json \
-H "X-TrackerToken: $TRACKER_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"source": "github",
"owner": "octocat",
"repo": "hello-world",
"include_pull_requests": true,
"include_milestones": true,
"dry_run": true
}'

En torrkörning hämtar från GitHub, resolvar och av-dubblerar precis som den riktiga, rapporterar samma räknare — imported, skipped, errors, unmatched — och rullar sedan tillbaka hela transaktionen. Ingenting består och ingen händelse om slutförd import når din revisionslogg. Det är det billigaste sättet att upptäcka att du menade att ta med milstolpar, eller att ett repo är större än du trodde, medan det fortfarande inte kostar dig något.

Varje anrop till /import/json är asynkront, torrkörningen inräknad: endpointen returnerar 202 med ett jobbhandtag, inte ett resultat, och räknarna kommer på jobbet när du pollar det (steg 5). En torrkörnings jobb når done precis som ett riktigt; skillnaden är att ingenting skrevs.

Ta bort dry_run och skicka igen. Som tidigare returnerar endpointen 202 med ett jobbhandtag:

{ "import_id": "…", "status": "pending" }

Polla jobbet tills det når ett sluttillstånd:

Terminal window
curl https://eastagiletracker.com/api/v1/projects/$PROJECT_ID/imports/$IMPORT_ID \
-H "X-TrackerToken: $TRACKER_TOKEN"

Statusen går pending → fetching → writing → done | failed. Bara de två sista är sluttillstånd: done bär resultaträknarna, failed bär ett felmeddelande och en stabil maskinkod du kan förgrena på. Medan hämtningen paginerar säger progress_current och progress_total vilken sida den är på — värt att visa om en människa tittar på.

Token. Skicka "token": "github_pat_…". Utelämna den så sätter servern in den delade plattforms-tokenen, som bara läser publika repositoryn och räknas av mot varje anropare på driftsättningen — Token och hastighetsgränser täcker vad det kostar dig. Vilken token som än används driver den bara de utgående GitHub-anropen och inget annat: den loggas aldrig, revisionsloggas aldrig, lagras aldrig och ekas aldrig tillbaka i ett svar eller ett fel.

Att köra om är säkert. En rad som redan importerats matchas på sitt käll-id och hoppas över, inte dubbleras. En andra import fyller på boarden med det som dykt upp sedan den första.

Issues importeras som standard. Allt annat är tillval, en flagga per typ:

Från GitHubBlirFlagga
IssueEn story. Öppen → unstarted i Backlog. Stängd → accepted, eller rejected när GitHub säger att issuen stängdes som not_planned eller duplicate (storyn bär då en matchande etikett).standard
Checklista i issue-textenTasks — varje rad - [ ] / - [x] blir en task i textens ordning, där [x] anländer färdig. Checklistan står kvar i beskrivningen också.standard
EtiketterEtiketter, överförda som de är.standard
Pull requestEn story med etiketten pull-request. Öppen → started, mergad → accepted, stängd utan merge → rejected.include_pull_requests
MilstolpeEn epic, med milstolpens namn och av-dubblerad på titel — två issues som delar milstolpe landar i samma epic. Med flaggan av följer den i stället med som etiketten milestone:<titel>.include_milestones
ReleaseEn release-story. Publicerad → accepted, utkast → unstarted.include_releases
Issue-beroendeEn blockerare på storyn. Bara issues, aldrig pull requests.include_dependencies

Storytypen härleds när issuen inte säger den. En etikett som innehåller bug, fix eller defect — eller en titel som börjar med fix eller bug — gör den till en bug; chore, maintenance, devops eller infra gör den till en chore; allt annat är en feature. Det är värt att veta före import, för i East Agile Tracker bär bara features points och bara features matar velocity. Se Introduktion → Stories.

En projekttavla direkt efter import av exempelrepositoryt: issues som storys med sina etiketter, milstolpar som epics och GitHub-personer som ägare

Nu har boarden historik och agenten en nyckel. Slingan härifrån är fyra anrop.

Hitta en story, eller skriv en. Filtrera boarden efter något att plocka upp:

Terminal window
curl "https://eastagiletracker.com/api/v1/projects/$PROJECT_ID/stories?state=unstarted" \
-H "X-TrackerToken: $TRACKER_TOKEN"

import_source=github avgränsar till det importen tog med sig. Har agenten hittat arbete som repot aldrig fångade skapar den storyn i stället — se API-guide → Skapa en story.

Gör anspråk på den. En agent lägger till sig själv som ägare genom att posta en tom body:

Terminal window
curl -X POST https://eastagiletracker.com/api/v1/projects/$PROJECT_ID/stories/$STORY_ID/owners \
-H "X-TrackerToken: $TRACKER_TOKEN" \
-H "Content-Type: application/json" \
-d '{}'

En tom body betyder anroparen, så agenten behöver inte känna till sitt eget id. Boarden visar nu agenten som ägare, och det är så en människa som tittar på vet att arbetet är taget.

Starta den.

Terminal window
curl -X POST https://eastagiletracker.com/api/v1/projects/$PROJECT_ID/stories/$STORY_ID/transitions \
-H "X-TrackerToken: $TRACKER_TOKEN" \
-H "Content-Type: application/json" \
-d '{"to": "started"}'

Sedan går agenten och gör arbetet — läser repot, skriver koden, öppnar pull requesten. Den delen sker i ditt utvecklingsverktyg, inte här.

Bifoga pull requesten.

Terminal window
curl -X POST https://eastagiletracker.com/api/v1/projects/$PROJECT_ID/stories/$STORY_ID/links \
-H "X-TrackerToken: $TRACKER_TOKEN" \
-H "Content-Type: application/json" \
-d '{"url": "https://github.com/octocat/hello-world/pull/42"}'

En GitHub-pull-request-URL känns igen som en sådan — du behöver inte säga det. Storyn och koden som stänger den ligger nu ett klick från varandra, i båda riktningarna.

Avsluta den. Gå till finished och stanna där. En feature har delivered och accepted kvar framför sig, och det är granskningsgrindarna: någon annan än agenten avgör att arbetet är rätt. En chore har ingen sådan grind — started → accepted är hela dess återstående väg.

En importerad stängd issue vars CODE-avsnitt länkar till den pull request som åtgärdade den, med GitHub-kommentarerna bredvid

Varje import autentiserar sig. Hämtningen av issues, kommentarer och pull requests går via GitHubs GraphQL-API, och GraphQL avvisar en förfrågan utan token — det finns ingen anonym nivå, varken på ett publikt repository eller ett privat. Frågan är aldrig om en token går till GitHub, bara vems.

Skicka token på importanropet, eller --token till GitHub-to-EAT. En finkornig personlig åtkomsttoken med läsrättighet till repositoryts issues räcker. Den driver de utgående GitHub-anropen och inget annat: den loggas aldrig, revisionsloggas aldrig, lagras aldrig och ekas aldrig tillbaka i ett svar eller ett fel.

Ta med din egen till allt bortom en demo. Då spenderar du en budget ingen annan rör, och ingen förkontroll kan avvisa dig på grund av någon annans import.

--engine direct lämnar dig inget val. Den motorn läser GitHub från din maskin i stället för genom Trackern, så serverns token är utom räckhåll; en körning utan token avslutas med 2 och ett användningsfel innan den hämtar eller skriver något. GITHUB_TOKEN i din miljö eller din .env räknas, precis som --token.

Det är genomgången av issues som kräver token, inte hela motorn. direct läser issues, kommentarer och pull requests över GraphQL, som saknar anonymt läge; REST rör den bara för release-listan och den kostnadsfria /rate_limit-sonderingen. Verktyget levererar fortfarande en äldre anonym REST-hämtare som klarade en import av ett publikt repository inom budgeten på 60 i timmen, men ingen väg i CLI:t når den längre och den ska tas bort — betrakta därför --token som obligatorisk för direct.

Skicka ingen token så sätter servern in den plattforms-token som dess operatör konfigurerat (GITHUB_IMPORT_PAT). Tre gränser följer med:

  • Det är valfri konfiguration. Den hostade eastagiletracker.com tillhandahåller en, så en import av ett publikt repository utan token fungerar där. En självhostad installation — den nedladdade binären — har ingen förrän dess operatör sätter GITHUB_IMPORT_PAT i miljön, och fram till dess avvisar den varje import utan token med 400 import_github_no_token.
  • Den läser bara publika repositoryn. Den hostade tjänsten utfärdar den skrivskyddad över publika repon, så ett privat repository behöver alltid din egen token.
  • Alla anropare på driftsättningen delar en budget. Innan en import utan token körs läser servern den delade tokenens återstående GraphQL-poäng och avvisar med 400 import_github_shared_quota_low under 500. En budget som tar slut mitt i importen får jobbet att misslyckas med import_github_rate_limited_platform. Båda meddelandena pekar på samma åtgärd: tillhandahåll din egen token.

GitHub mäter sina två API:er var för sig, och det oautentiserade taket ligger två storleksordningar lägre.

GitHub-APIAnvänds förMed tokenUtan token
GraphQLIssues, kommentarer, pull requests, under-issues, beroenden5 000 poäng per timme, poängsatta på de noder en fråga returnerarAvvisad — GraphQL har ingen anonym nivå
RESTReleaser (include_releases) och /rate_limit-förkontrollen5 000 förfrågningar per timme60 förfrågningar per timme, räknade per IP-adress och delade med alla bakom den

En import faller aldrig tillbaka på den nivån om 60 per timme: utan en token att skicka avvisas förfrågan i förväg i stället för att göras om anonymt. Siffran spelar roll för det du gör runt importen — ett skript som läser GitHub direkt, eller ett skal i samma nät som andra klienter, förbrukar 60 förfrågningar på sekunder.

Läs din återstående budget när du vill; GET /rate_limit är undantagen från båda gränserna, så kontrollen kostar ingenting:

Terminal window
curl -H "Authorization: Bearer $GITHUB_TOKEN" https://api.github.com/rate_limit

GraphQL-poäng är inte förfrågningar. GitHub poängsätter en fråga på de noder den returnerar, så en sida med 100 issues jämte deras kommentarer och tilldelade kostar många poäng, och ett stort repository gör av med timbudgeten på långt färre anrop än REST-erans siffror antyder. --dry-run (steg 3) och dry_run (steg 4) kostar var för sig samma poäng som den riktiga hämtningen — det är det som gör deras räknare pålitliga — så räkna med två pass när du förbereder en stor import.

  • API-guide — sökgrammatiken, händelseströmmen, massövergångar, idempotenta skrivningar och resten av ytan.
  • Bruksanvisning — samma operationer från gränssnittet, och de tio andra importverktygen.
  • Introduktion — varför tillståndsmaskinen och de fyra storytyperna har den här formen.
  • GitHub-to-EAT — importverktygets eget repository: varje flagga, båda motorerna, och hur du bidrar till det.