{
"issueNumber": 548,
"branchName": "rc/atlassian-integration",
"generatedAt": "2026-04-23T17:11:46Z",
"stories": [
{
"id": "S1",
"title": "Create BitbucketService with all 18 public methods + private request/sleep helpers, base https://api.bitbucket.org/2.0, treat owner arg as workspace slug",
"priority": 1,
"dependsOn": [],
"acceptanceCriteria": [
"src/bitbucket/bitbucket.service.ts exists and compiles under strict TS",
"All 18 methods from issue acceptance criteria are implemented as public async methods",
"Private request() uses Bearer token from authProvider.getToken(), retries once on 429 honouring Retry-After, refreshes once on 401",
"enableAutoMerge throws NotImplementedException; updatePRBranch logs warn and returns",
"addLabel/removeLabel implement title-prefix fallback (PUT pullrequest with mutated title)"
],
"passes": false,
"completedAt": null
},
{
"id": "S2",
"title": "Create BitbucketModule with factory provider for PLATFORM_AUTH_PROVIDER injecting BitbucketOAuthAuthProvider, plus index.ts barrel",
"priority": 2,
"dependsOn": [
"S1"
],
"acceptanceCriteria": [
"src/bitbucket/bitbucket.module.ts exists, imports ConfigModule, exports BitbucketService and PLATFORM_AUTH_PROVIDER",
"Factory uses ConfigService and returns new BitbucketOAuthAuthProvider(config) (parallel to github.module.ts)",
"src/bitbucket/index.ts re-exports BitbucketModule and BitbucketService"
],
"passes": false,
"completedAt": null
},
{
"id": "S3",
"title": "Write bitbucket.service.spec.ts covering every public method plus 429-retry, 401-refresh, label round-trip, and enableAutoMerge throw",
"priority": 3,
"dependsOn": [
"S1",
"S2"
],
"acceptanceCriteria": [
"Spec file mocks PlatformAuthProvider and globalThis.fetch (mirrors github.service.spec.ts)",
"Each public method has at least one URL + method + body assertion",
"429 retry test asserts second fetch fires after Retry-After delay",
"401 refresh test asserts getToken called twice and request retried once",
"npm run test and npm run lint pass with zero warnings"
],
"passes": false,
"completedAt": null
}
]
}