{"_id":"opencode-gitlab-auth","_rev":"6-9ecfb6a857f7fbbc048f942907f77ac2","name":"opencode-gitlab-auth","dist-tags":{"latest":"3.0.0"},"versions":{"1.3.3":{"name":"opencode-gitlab-auth","version":"1.3.3","keywords":["opencode","opencode-plugin","gitlab","gitlab-duo","oauth","oauth2","authentication","auth","login","pkce","security","plugin","personal-access-token","pat","developer-tools","devops","ai","typescript"],"author":{"url":"https://gitlab.com/vglafirov","name":"Vladimir Glafirov","email":"vglafirov@gitlab.com"},"license":"MIT","_id":"opencode-gitlab-auth@1.3.3","maintainers":[{"name":"vglafirov","email":"vglafirov@gmail.com"}],"homepage":"https://gitlab.com/vglafirov/opencode-gitlab-auth#readme","bugs":{"url":"https://gitlab.com/vglafirov/opencode-gitlab-auth/-/issues"},"dist":{"shasum":"5b9769ce1ef882fb12e6903ec60039aded53fc97","tarball":"https://registry.npmjs.org/opencode-gitlab-auth/-/opencode-gitlab-auth-1.3.3.tgz","fileCount":19,"integrity":"sha512-CgZ3Tk+UNYhKokeBfLrRGZUJtqoFW0fYj/7cCbXe4fRUEL6GZdKqOrjIQpmwRJFoAu9TuAnzxC/xjmQ5X7sZ9g==","signatures":[{"sig":"MEYCIQCjw90O7/v4wODWyQrdE8uEVh06RlmFBMtxklVI+1G/tQIhALlmdOA4beU2fpV6fjaRKeQJyL0U/52IbcKh56Kvm5Kc","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":91582},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"npm":">=9.0.0","node":">=18.0.0"},"gitHead":"376022cdf504573ddd65a52edf94feef615d39da","scripts":{"lint":"eslint src --ext .ts","test":"vitest run","build":"tsc","clean":"rm -rf dist","format":"prettier --write \"src/**/*.ts\"","prepare":"husky install","rebuild":"npm run clean && npm run build","lint:fix":"eslint src --ext .ts --fix","test:watch":"vitest","lint-staged":"lint-staged","format:check":"prettier --check \"src/**/*.ts\"","test:coverage":"vitest run --coverage","prepublishOnly":"npm run build","semantic-release":"semantic-release"},"_npmUser":{"name":"vglafirov","email":"vglafirov@gmail.com"},"repository":{"url":"git+https://gitlab.com/vglafirov/opencode-gitlab-auth.git","type":"git"},"_npmVersion":"11.6.2","description":"GitLab OAuth authentication plugin for OpenCode","directories":{},"_nodeVersion":"25.2.1","dependencies":{"open":"^10.0.0","fastify":"^5.2.0","@fastify/rate-limit":"^10.2.0","@opencode-ai/plugin":"*"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^8.0.3","eslint":"^8.56.0","vitest":"^4.0.17","prettier":"^3.1.1","typescript":"^5.0.0","@types/node":"^20.0.0","lint-staged":"^15.2.0","@commitlint/cli":"^18.4.3","semantic-release":"^22.0.12","@vitest/coverage-v8":"^4.0.17","@semantic-release/git":"^10.0.1","@semantic-release/npm":"^11.0.2","eslint-config-prettier":"^9.1.0","@semantic-release/gitlab":"^13.0.3","@typescript-eslint/parser":"^6.15.0","@semantic-release/changelog":"^6.0.3","@commitlint/config-conventional":"^18.4.3","@typescript-eslint/eslint-plugin":"^6.15.0"},"peerDependencies":{"@opencode-ai/plugin":"*"},"_npmOperationalInternal":{"tmp":"tmp/opencode-gitlab-auth_1.3.3_1772463523262_0.6689598615785035","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"opencode-gitlab-auth","version":"2.0.0","keywords":["opencode","opencode-plugin","gitlab","gitlab-duo","oauth","oauth2","authentication","auth","login","pkce","security","plugin","personal-access-token","pat","developer-tools","devops","ai","typescript"],"author":{"url":"https://gitlab.com/vglafirov","name":"Vladimir Glafirov","email":"vglafirov@gitlab.com"},"license":"MIT","_id":"opencode-gitlab-auth@2.0.0","maintainers":[{"name":"vglafirov","email":"vglafirov@gmail.com"}],"homepage":"https://gitlab.com/vglafirov/opencode-gitlab-auth#readme","bugs":{"url":"https://gitlab.com/vglafirov/opencode-gitlab-auth/-/issues"},"dist":{"shasum":"b523f2e45cc5187448a0db4f3357e9cc06926694","tarball":"https://registry.npmjs.org/opencode-gitlab-auth/-/opencode-gitlab-auth-2.0.0.tgz","fileCount":20,"integrity":"sha512-jmZOOvYIurRScQCtdBqIW5HbP1JbmIiq7UtI7NGgn2vjke46g9d4NVPBg5/ZmFFVIBwZcgyFgJ7b8kGEOR9ujA==","signatures":[{"sig":"MEUCIGfsR+DZ2OhKWAEqe8hyd3D5VeyCmrqUxjJggFonPTS0AiEAomoPN7jJ1Y9roFREM8OhRMteT7ZYmbTO8Nb8BXmlEBc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":115916},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"npm":">=9.0.0","node":">=18.0.0"},"gitHead":"376022cdf504573ddd65a52edf94feef615d39da","scripts":{"lint":"eslint src --ext .ts","test":"vitest run","build":"tsc","clean":"rm -rf dist","format":"prettier --write \"src/**/*.ts\"","prepare":"husky install","rebuild":"npm run clean && npm run build","lint:fix":"eslint src --ext .ts --fix","test:watch":"vitest","lint-staged":"lint-staged","format:check":"prettier --check \"src/**/*.ts\"","test:coverage":"vitest run --coverage","prepublishOnly":"npm run build","semantic-release":"semantic-release"},"_npmUser":{"name":"GitLab CI/CD","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"gitlab","oidcConfigId":"oidc:daef490e-2126-4548-82d7-a505f629e0a1"}},"repository":{"url":"git+https://gitlab.com/vglafirov/opencode-gitlab-auth.git","type":"git"},"_npmVersion":"11.6.2","description":"GitLab OAuth authentication plugin for OpenCode","directories":{},"_nodeVersion":"25.2.1","dependencies":{"open":"^10.0.0","fastify":"^5.2.0","@fastify/rate-limit":"^10.2.0","@opencode-ai/plugin":"*"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^8.0.3","eslint":"^8.56.0","vitest":"^4.0.17","prettier":"^3.1.1","typescript":"^5.0.0","@types/node":"^20.0.0","lint-staged":"^15.2.0","@commitlint/cli":"^18.4.3","semantic-release":"^22.0.12","@vitest/coverage-v8":"^4.0.17","@semantic-release/git":"^10.0.1","@semantic-release/npm":"^11.0.2","eslint-config-prettier":"^9.1.0","@semantic-release/gitlab":"^13.0.3","@typescript-eslint/parser":"^6.15.0","@semantic-release/changelog":"^6.0.3","@commitlint/config-conventional":"^18.4.3","@typescript-eslint/eslint-plugin":"^6.15.0"},"peerDependencies":{"@opencode-ai/plugin":"*"},"_npmOperationalInternal":{"tmp":"tmp/opencode-gitlab-auth_2.0.0_1772463656294_0.6189597624977314","host":"s3://npm-registry-packages-npm-production"}},"2.0.1":{"name":"opencode-gitlab-auth","version":"2.0.1","keywords":["opencode","opencode-plugin","gitlab","gitlab-duo","oauth","oauth2","authentication","auth","login","pkce","security","plugin","personal-access-token","pat","developer-tools","devops","ai","typescript"],"author":{"url":"https://gitlab.com/vglafirov","name":"Vladimir Glafirov","email":"vglafirov@gitlab.com"},"license":"MIT","_id":"opencode-gitlab-auth@2.0.1","maintainers":[{"name":"vglafirov","email":"vglafirov@gmail.com"}],"homepage":"https://gitlab.com/vglafirov/opencode-gitlab-auth#readme","bugs":{"url":"https://gitlab.com/vglafirov/opencode-gitlab-auth/-/issues"},"dist":{"shasum":"d5161f997494a48e3159dabe10f3470f1bf298af","tarball":"https://registry.npmjs.org/opencode-gitlab-auth/-/opencode-gitlab-auth-2.0.1.tgz","fileCount":20,"integrity":"sha512-1EMZHdbADLMVaTVLQ6C/V8uVMDr6MP++osj2lmOecowtn46AafP/w6ADkV4AN/ddjA1rob5cWpMuf/iME6DI6A==","signatures":[{"sig":"MEUCID1Xk/CuwUeUloBWCuSeUzKUjtkzuoseJjd7o5sY03I7AiEA94PVLjUGrUfakZb7jZ5rfRD3Z3srIFTUruUgeI5jknM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":112976},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"npm":">=9.0.0","node":">=18.0.0"},"gitHead":"fadf6c7c0251fa86229919dceb37a9d368ade9c8","scripts":{"lint":"eslint src --ext .ts","test":"vitest run","build":"tsc","clean":"rm -rf dist","format":"prettier --write \"src/**/*.ts\"","prepare":"husky install","rebuild":"npm run clean && npm run build","lint:fix":"eslint src --ext .ts --fix","test:watch":"vitest","lint-staged":"lint-staged","format:check":"prettier --check \"src/**/*.ts\"","test:coverage":"vitest run --coverage","prepublishOnly":"npm run build","semantic-release":"semantic-release"},"_npmUser":{"name":"GitLab CI/CD","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"gitlab","oidcConfigId":"oidc:daef490e-2126-4548-82d7-a505f629e0a1"}},"repository":{"url":"git+https://gitlab.com/vglafirov/opencode-gitlab-auth.git","type":"git"},"_npmVersion":"11.6.2","description":"GitLab OAuth authentication plugin for OpenCode","directories":{},"_nodeVersion":"25.2.1","dependencies":{"open":"^10.0.0","fastify":"^5.2.0","@fastify/rate-limit":"^10.2.0","@opencode-ai/plugin":"*"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^8.0.3","eslint":"^8.56.0","vitest":"^4.0.17","prettier":"^3.1.1","typescript":"^5.0.0","@types/node":"^20.0.0","lint-staged":"^15.2.0","@commitlint/cli":"^18.4.3","semantic-release":"^22.0.12","@vitest/coverage-v8":"^4.0.17","@semantic-release/git":"^10.0.1","@semantic-release/npm":"^11.0.2","eslint-config-prettier":"^9.1.0","@semantic-release/gitlab":"^13.0.3","@typescript-eslint/parser":"^6.15.0","@semantic-release/changelog":"^6.0.3","@commitlint/config-conventional":"^18.4.3","@typescript-eslint/eslint-plugin":"^6.15.0"},"peerDependencies":{"@opencode-ai/plugin":"*"},"_npmOperationalInternal":{"tmp":"tmp/opencode-gitlab-auth_2.0.1_1774715653291_0.7283106220463091","host":"s3://npm-registry-packages-npm-production"}},"2.0.2":{"name":"opencode-gitlab-auth","version":"2.0.2","keywords":["opencode","opencode-plugin","gitlab","gitlab-duo","oauth","oauth2","authentication","auth","login","pkce","security","plugin","personal-access-token","pat","developer-tools","devops","ai","typescript"],"author":{"url":"https://gitlab.com/vglafirov","name":"Vladimir Glafirov","email":"vglafirov@gitlab.com"},"license":"MIT","_id":"opencode-gitlab-auth@2.0.2","maintainers":[{"name":"vglafirov","email":"vglafirov@gmail.com"}],"homepage":"https://gitlab.com/vglafirov/opencode-gitlab-auth#readme","bugs":{"url":"https://gitlab.com/vglafirov/opencode-gitlab-auth/-/issues"},"dist":{"shasum":"3b1a51dfc7b157d82cc60c0d0142aa718e32ae2e","tarball":"https://registry.npmjs.org/opencode-gitlab-auth/-/opencode-gitlab-auth-2.0.2.tgz","fileCount":20,"integrity":"sha512-SXoWIMJUCYuYYmxpXdYt33nmDXMqGzccuodBpvE1H5zIboh4Fit6c2WVQN8YUMvwYVVNx36evEI7+2/JEt8hiw==","signatures":[{"sig":"MEQCICZlP+X9V7DXC9aV+V7xOTTL/yc9rtQXT8ks6DIjZXlNAiB85FwMJBv4w6z6ygYsaJg+vm38WFF8Vb1ljQ6zE5SM9g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":112848},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"npm":">=9.0.0","node":">=18.0.0"},"gitHead":"bbe973e182f49084f2f1222929118b044bacfd95","scripts":{"lint":"eslint src --ext .ts","test":"vitest run","build":"tsc","clean":"rm -rf dist","format":"prettier --write \"src/**/*.ts\"","prepare":"husky install","rebuild":"npm run clean && npm run build","lint:fix":"eslint src --ext .ts --fix","test:watch":"vitest","lint-staged":"lint-staged","format:check":"prettier --check \"src/**/*.ts\"","test:coverage":"vitest run --coverage","prepublishOnly":"npm run build","semantic-release":"semantic-release"},"_npmUser":{"name":"GitLab CI/CD","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"gitlab","oidcConfigId":"oidc:daef490e-2126-4548-82d7-a505f629e0a1"}},"repository":{"url":"git+https://gitlab.com/vglafirov/opencode-gitlab-auth.git","type":"git"},"_npmVersion":"11.6.2","description":"GitLab OAuth authentication plugin for OpenCode","directories":{},"_nodeVersion":"25.2.1","dependencies":{"open":"^10.0.0","fastify":"^5.2.0","@fastify/rate-limit":"^10.2.0","@opencode-ai/plugin":"*"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^8.0.3","eslint":"^8.56.0","vitest":"^4.0.17","prettier":"^3.1.1","typescript":"^5.0.0","@types/node":"^20.0.0","lint-staged":"^15.2.0","@commitlint/cli":"^18.4.3","semantic-release":"^22.0.12","@vitest/coverage-v8":"^4.0.17","@semantic-release/git":"^10.0.1","@semantic-release/npm":"^11.0.2","eslint-config-prettier":"^9.1.0","@semantic-release/gitlab":"^13.0.3","@typescript-eslint/parser":"^6.15.0","@semantic-release/changelog":"^6.0.3","@commitlint/config-conventional":"^18.4.3","@typescript-eslint/eslint-plugin":"^6.15.0"},"peerDependencies":{"@opencode-ai/plugin":"*"},"_npmOperationalInternal":{"tmp":"tmp/opencode-gitlab-auth_2.0.2_1777283848048_0.3535026057701247","host":"s3://npm-registry-packages-npm-production"}},"2.1.0":{"name":"opencode-gitlab-auth","version":"2.1.0","keywords":["opencode","opencode-plugin","gitlab","gitlab-duo","oauth","oauth2","authentication","auth","login","pkce","security","plugin","personal-access-token","pat","developer-tools","devops","ai","typescript"],"author":{"url":"https://gitlab.com/vglafirov","name":"Vladimir Glafirov","email":"vglafirov@gitlab.com"},"license":"MIT","_id":"opencode-gitlab-auth@2.1.0","maintainers":[{"name":"vglafirov","email":"vglafirov@gmail.com"}],"homepage":"https://gitlab.com/vglafirov/opencode-gitlab-auth#readme","bugs":{"url":"https://gitlab.com/vglafirov/opencode-gitlab-auth/-/issues"},"dist":{"shasum":"c06135ebfede7837255882c4f6af158e0228c1af","tarball":"https://registry.npmjs.org/opencode-gitlab-auth/-/opencode-gitlab-auth-2.1.0.tgz","fileCount":20,"integrity":"sha512-ZCDYaY0V8Se6hOH2tqZqqcskrd0xLTgfiGhU0J1igkUP52oFtN9eSwxOPLT0ctvNXUq8b+zOmJ4sskAQoC/IUA==","signatures":[{"sig":"MEYCIQCWHTYjMhpOiWrEiyY8Rt6j9nQYX9Vm2NFZsHn5Z62U8QIhAM8C+zjTe22lc64kkykZlXHo0iuqi7gbcpe+V+3tgDjx","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":120593},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"npm":">=9.0.0","node":">=18.0.0"},"gitHead":"ffd43e77ed57335466d0cefb9117082af230b7eb","scripts":{"lint":"eslint src --ext .ts","test":"vitest run","build":"tsc","clean":"rm -rf dist","format":"prettier --write \"src/**/*.ts\"","prepare":"husky install","rebuild":"npm run clean && npm run build","lint:fix":"eslint src --ext .ts --fix","test:watch":"vitest","lint-staged":"lint-staged","format:check":"prettier --check \"src/**/*.ts\"","test:coverage":"vitest run --coverage","prepublishOnly":"npm run build","semantic-release":"semantic-release"},"_npmUser":{"name":"GitLab CI/CD","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"gitlab","oidcConfigId":"oidc:daef490e-2126-4548-82d7-a505f629e0a1"}},"repository":{"url":"git+https://gitlab.com/vglafirov/opencode-gitlab-auth.git","type":"git"},"_npmVersion":"11.6.2","description":"GitLab OAuth authentication plugin for OpenCode","directories":{},"_nodeVersion":"25.2.1","dependencies":{"open":"^10.0.0","fastify":"^5.2.0","@fastify/rate-limit":"^10.2.0","@opencode-ai/plugin":"*"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^8.0.3","eslint":"^8.56.0","vitest":"^4.0.17","prettier":"^3.1.1","typescript":"^5.0.0","@types/node":"^20.0.0","lint-staged":"^15.2.0","@commitlint/cli":"^18.4.3","semantic-release":"^22.0.12","@vitest/coverage-v8":"^4.0.17","@semantic-release/git":"^10.0.1","@semantic-release/npm":"^11.0.2","eslint-config-prettier":"^9.1.0","@semantic-release/gitlab":"^13.0.3","@typescript-eslint/parser":"^6.15.0","@semantic-release/changelog":"^6.0.3","@commitlint/config-conventional":"^18.4.3","@typescript-eslint/eslint-plugin":"^6.15.0"},"peerDependencies":{"@opencode-ai/plugin":"*"},"_npmOperationalInternal":{"tmp":"tmp/opencode-gitlab-auth_2.1.0_1781189678386_0.2514364194465242","host":"s3://npm-registry-packages-npm-production"}},"3.0.0":{"_id":"opencode-gitlab-auth@3.0.0","bugs":{"url":"https://gitlab.com/vglafirov/opencode-gitlab-auth/-/issues"},"dist":{"shasum":"4b2e0bb3073e8ba032765d4b3787765bb9145c6a","tarball":"https://registry.npmjs.org/opencode-gitlab-auth/-/opencode-gitlab-auth-3.0.0.tgz","fileCount":24,"integrity":"sha512-Qoddk2yIBDB+3NVqpRmY6AM14SIK+QIBqOWORdsfMCxna0n5jf6AxTZZRlsXfsHIbBOnYU0b/dhMG/VInBcdVg==","signatures":[{"sig":"MEUCIQD0bpjNW/pDg6HuFQXMqveYlySNJ6QKg/X7vmDYkOA3egIgH05/jc9hkWvmeasfNLjzJVCd5/Xb+1pjogVWu8L3XM8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDCj5M7Y2+kzmxqMcSfuA+e45RJ9b2xqQHRgvR6dfZDnwIgM+X/bLH5XwJr3P1S+tcCzRzsYUfIRItChO+fhzxd7kQ="}],"unpackedSize":86755},"main":"dist/index.js","name":"opencode-gitlab-auth","type":"module","types":"dist/index.d.ts","author":{"url":"https://gitlab.com/vglafirov","name":"Vladimir Glafirov","email":"vglafirov@gitlab.com"},"engines":{"npm":">=9.0.0","node":">=20.0.0"},"gitHead":"4a3537b614467af6842f087687db3703b8a4a38d","license":"MIT","scripts":{"lint":"eslint src --ext .ts","test":"vitest run","build":"tsc","clean":"rm -rf dist","format":"prettier --write \"src/**/*.ts\"","prepare":"husky install","rebuild":"npm run clean && npm run build","lint:fix":"eslint src --ext .ts --fix","test:watch":"vitest","lint-staged":"lint-staged","format:check":"prettier --check \"src/**/*.ts\"","test:coverage":"vitest run --coverage","prepublishOnly":"npm run build","semantic-release":"semantic-release"},"version":"3.0.0","_npmUser":{"name":"GitLab CI/CD","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"gitlab","oidcConfigId":"oidc:daef490e-2126-4548-82d7-a505f629e0a1"}},"homepage":"https://gitlab.com/vglafirov/opencode-gitlab-auth#readme","keywords":["opencode","opencode-plugin","gitlab","gitlab-duo","oauth","oauth2","authentication","auth","login","pkce","security","plugin","personal-access-token","pat","developer-tools","devops","ai","typescript"],"repository":{"url":"git+https://gitlab.com/vglafirov/opencode-gitlab-auth.git","type":"git"},"_npmVersion":"11.6.2","description":"GitLab OAuth authentication plugin for OpenCode","directories":{},"maintainers":[{"name":"vglafirov","email":"vglafirov@gmail.com"}],"_nodeVersion":"25.2.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^8.0.3","eslint":"^8.56.0","vitest":"^4.0.17","prettier":"^3.1.1","typescript":"^5.0.0","@types/node":"^20.0.0","lint-staged":"^15.2.0","@commitlint/cli":"^18.4.3","@opencode/plugin":"^2.0.11","semantic-release":"^22.0.12","@vitest/coverage-v8":"^4.0.17","@semantic-release/git":"^10.0.1","@semantic-release/npm":"^11.0.2","eslint-config-prettier":"^9.1.0","@semantic-release/gitlab":"^13.0.3","@typescript-eslint/parser":"^6.15.0","@semantic-release/changelog":"^6.0.3","@commitlint/config-conventional":"^18.4.3","@typescript-eslint/eslint-plugin":"^6.15.0"},"peerDependencies":{"@opencode/plugin":"^2.0.0"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/opencode-gitlab-auth_3.0.0_1789986343853_0.9220262664183438"}}},"time":{"created":"2026-03-02T14:58:43.167Z","modified":"2026-09-21T10:25:44.138Z","1.3.3":"2026-03-02T14:58:43.394Z","2.0.0":"2026-03-02T15:00:56.486Z","2.0.1":"2026-03-28T16:34:13.418Z","2.0.2":"2026-04-27T09:57:28.209Z","2.1.0":"2026-06-11T14:54:38.642Z","3.0.0":"2026-09-21T10:25:43.970Z"},"bugs":{"url":"https://gitlab.com/vglafirov/opencode-gitlab-auth/-/issues"},"author":{"url":"https://gitlab.com/vglafirov","name":"Vladimir Glafirov","email":"vglafirov@gitlab.com"},"license":"MIT","homepage":"https://gitlab.com/vglafirov/opencode-gitlab-auth#readme","keywords":["opencode","opencode-plugin","gitlab","gitlab-duo","oauth","oauth2","authentication","auth","login","pkce","security","plugin","personal-access-token","pat","developer-tools","devops","ai","typescript"],"repository":{"url":"git+https://gitlab.com/vglafirov/opencode-gitlab-auth.git","type":"git"},"description":"GitLab OAuth authentication plugin for OpenCode","maintainers":[{"name":"vglafirov","email":"vglafirov@gmail.com"}],"readme":"# OpenCode GitLab Auth\n\nA GitLab authentication plugin for [OpenCode](https://opencode.ai) v2 that adds a PKCE OAuth 2.0 method and a\nself-managed instance URL prompt to OpenCode's built-in `gitlab` integration.\n\n[![npm version](https://img.shields.io/npm/v/opencode-gitlab-auth.svg)](https://www.npmjs.com/package/opencode-gitlab-auth)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n\n> **Upgrading from 2.x?** See [Upgrading from 2.x](#upgrading-from-2x) below. Version 3.0 targets OpenCode's plugin\n> SDK v2 and is a breaking change from the 2.x line, which targeted `@opencode-ai/plugin` (v1).\n\n## Why this plugin exists\n\nOpenCode v2 already ships a built-in `gitlab` provider (`gitlab-ai-provider`) and a `gitlab` integration with\n`env` (`GITLAB_TOKEN`) and manual API key methods out of the box. This plugin adds what core does not:\n\n- **PKCE OAuth 2.0** — browser-based authentication with automatic token refresh, so you don't need to create or\n  manage a Personal Access Token.\n- **Self-managed instance URL support** — a form field on both the OAuth and PAT methods lets you point at a\n  self-hosted GitLab instance instead of gitlab.com.\n\nEverything else — credential storage, scheduling token refresh, and wiring `instanceUrl`/`apiKey` into the\n`gitlab-ai-provider` SDK — is handled by OpenCode core once this plugin registers the method.\n\n## Features\n\n### 🔐 Two authentication methods on the `gitlab` integration\n\n- **OAuth 2.0 with PKCE** — secure browser-based authentication with automatic token refresh, no client secret\n  required.\n- **Personal Access Token (PAT)** — simple token-based authentication for automation, CI/CD, and headless\n  environments.\n\n### 🛡️ Security\n\n- **PKCE (Proof Key for Code Exchange)** — eliminates the need for a client secret in a desktop/CLI context.\n- **State parameter** — CSRF protection on the OAuth redirect.\n- **Local-only callback** — the OAuth redirect is handled by a loopback (`127.0.0.1`) HTTP server that closes as\n  soon as the callback is received or the flow times out.\n- **Credential storage and refresh** — owned entirely by OpenCode core; this plugin never reads or writes token\n  files itself.\n\n### 🌐 Flexible instance support\n\n- GitLab.com (default)\n- Self-managed GitLab instances, via an `instanceUrl` field on both auth methods\n\n## Table of Contents\n\n- [Requirements](#requirements)\n- [Installation](#installation)\n- [Quick Start](#quick-start)\n- [Authentication Methods](#authentication-methods)\n  - [OAuth 2.0 (Recommended)](#oauth-20-recommended)\n  - [Personal Access Token](#personal-access-token)\n- [Configuration](#configuration)\n- [Architecture](#architecture)\n- [Security](#security)\n- [Troubleshooting](#troubleshooting)\n- [Development](#development)\n- [Upgrading from 2.x](#upgrading-from-2x)\n- [Contributing](#contributing)\n- [FAQ](#faq)\n- [License](#license)\n\n## Requirements\n\n- OpenCode v2 (plugin SDK `@opencode/plugin` `^2.0.0`)\n- Node.js 20.0.0 or higher\n- npm 9.0.0 or higher\n\n## Installation\n\n### Via OpenCode's plugin manager\n\n```bash\nopencode plugin add opencode-gitlab-auth\n```\n\n### Via config\n\nAdd the package to `plugins` in `opencode.json`/`opencode.jsonc`:\n\n```jsonc\n{\n  \"$schema\": \"https://opencode.ai/config.json\",\n  \"plugins\": [\"opencode-gitlab-auth\"],\n}\n```\n\n> Note the config key is `plugins` (plural) in OpenCode v2, not `plugin`.\n\n### Local development install\n\n```bash\ngit clone https://gitlab.com/vglafirov/opencode-gitlab-auth.git\ncd opencode-gitlab-auth\nnpm install\nnpm run build\n```\n\nPoint a project's config at the local build instead of npm:\n\n```jsonc\n{\n  \"plugins\": [\"/absolute/path/to/opencode-gitlab-auth\"],\n}\n```\n\n## Quick Start\n\n### 1. Configure OpenCode\n\n```jsonc\n{\n  \"plugins\": [\"opencode-gitlab-auth\"],\n}\n```\n\n### 2. (Optional) Use your own OAuth application\n\nThe plugin ships with a default OAuth application registered as a public PKCE client with redirect URI\n`http://127.0.0.1:8080/callback`, so OAuth works out of the box on gitlab.com. You only need your own\napplication for a self-managed instance, or if you prefer not to rely on the default one.\n\n1. Go to your instance's **User Settings > Applications** (on gitlab.com:\n   [here](https://gitlab.com/-/user_settings/applications))\n2. Create a new application with:\n   - **Name**: `OpenCode GitLab Auth`\n   - **Redirect URI**: `http://127.0.0.1:8080/callback` (must match exactly)\n   - **Confidential**: ❌ **unchecked**\n   - **Scopes**: `api`\n3. Copy the **Application ID** (a 64-character hex string)\n4. Make it available to the OpenCode **server** process. The plugin reads `GITLAB_OAUTH_CLIENT_ID` from the\n   environment of the server, which in OpenCode v2 is normally a long-lived background service — so a plain\n   `export` in your shell will not reach it. Persist it on the service instead:\n\n```bash\nopencode service set env GITLAB_OAUTH_CLIENT_ID <your-application-id>\nopencode service restart\n```\n\nVerify it took effect:\n\n```bash\nopencode service get env GITLAB_OAUTH_CLIENT_ID\n```\n\n> **\"Confidential\" must be unchecked.** PKCE is designed for public clients and this plugin never sends a\n> `client_secret`. A confidential application makes GitLab require one, and the token exchange then fails.\n\n> A `.env` file in this repository is **not** read by the plugin or by OpenCode. Setting\n> `GITLAB_OAUTH_CLIENT_ID` there has no effect — use `opencode service set env` (above) or export the variable\n> before launching a foreground/`--standalone` server.\n\n### 3. Authenticate\n\n```bash\nopencode\n```\n\nThen run OpenCode's connect/auth command and choose the `gitlab` integration. Two methods will be listed:\n\n- **GitLab OAuth** — browser-based PKCE flow (this plugin)\n- **GitLab Personal Access Token** — token-based auth (this plugin adds the instance URL field; the base method\n  ships with OpenCode core)\n\n## Authentication Methods\n\n### OAuth 2.0 (Recommended)\n\n#### How it works\n\n1. You select **GitLab OAuth** and optionally enter a self-managed instance URL.\n2. The plugin starts a loopback HTTP server on `127.0.0.1:8080` and returns an authorization URL to OpenCode.\n3. OpenCode's UI presents the URL for you to open (or opens it for you, depending on the client).\n4. You approve the request on GitLab; GitLab redirects to the local callback server with an authorization code.\n5. The plugin verifies the `state` parameter, exchanges the code for tokens using the PKCE verifier, and returns the\n   credential to OpenCode core.\n6. OpenCode core stores the credential and refreshes it automatically before it expires, calling back into this\n   plugin's `refresh` handler.\n\n```mermaid\nsequenceDiagram\n    participant User\n    participant OpenCode as OpenCode Core\n    participant Plugin as This Plugin\n    participant Browser\n    participant GitLab\n    participant LocalServer as Local Callback Server (127.0.0.1:8080)\n\n    User->>OpenCode: Select \"GitLab OAuth\"\n    OpenCode->>Plugin: authorize(answer)\n    Plugin->>LocalServer: start()\n    Plugin->>OpenCode: { url, instructions }\n    OpenCode->>Browser: Open authorization URL\n    Browser->>GitLab: Authorization request (PKCE challenge)\n    GitLab->>Browser: User approves\n    Browser->>LocalServer: Redirect with code + state\n    Plugin->>GitLab: POST /oauth/token (code_verifier)\n    GitLab->>Plugin: access + refresh tokens\n    Plugin->>OpenCode: Credential.OAuth\n    OpenCode->>OpenCode: Store credential; schedule refresh\n```\n\n#### Advantages\n\n- ✅ No long-lived credential to manage yourself\n- ✅ Automatic token refresh, handled by OpenCode core\n- ✅ Revocable from GitLab settings\n- ✅ PKCE eliminates the need for a client secret\n\n#### Requirements\n\n- A GitLab OAuth application with redirect URI `http://127.0.0.1:8080/callback` (see [Quick Start](#quick-start))\n- `GITLAB_OAUTH_CLIENT_ID` environment variable set to that application's ID\n- A way to open a URL in a browser during authentication\n\n### Personal Access Token\n\n#### How to create a PAT\n\n1. Go to [GitLab User Settings > Access Tokens](https://gitlab.com/-/user_settings/personal_access_tokens)\n2. Create a token with the `api` scope and an expiration per your security policy\n3. Copy the token (starts with `glpat-`)\n4. Enter it, along with an optional self-managed instance URL, when prompted by OpenCode\n\n#### Advantages\n\n- ✅ No OAuth app registration needed\n- ✅ Works in headless environments and CI/CD\n- ✅ No browser required\n\n#### Disadvantages\n\n- ⚠️ Manual token rotation\n- ⚠️ Long-lived credential\n- ⚠️ **Not validated at entry time.** Unlike the previous (v1/2.x) implementation, OpenCode v2's `key` auth method\n  has no hook to test the token against GitLab before saving it. An invalid or expired PAT will only surface as a\n  failure on the first model call. Double-check the token before submitting it.\n\n## Configuration\n\n### Environment Variables\n\n| Variable                 | Description                                                                | Required  | Default                               |\n| ------------------------ | -------------------------------------------------------------------------- | --------- | ------------------------------------- |\n| `GITLAB_OAUTH_CLIENT_ID` | OAuth application ID                                                       | For OAuth | Bundled ID (does not work by default) |\n| `GITLAB_INSTANCE_URL`    | Default GitLab instance                                                    | No        | `https://gitlab.com`                  |\n| `GITLAB_TOKEN`           | Read by core's `env` auth method for `gitlab` (not managed by this plugin) | No        | —                                     |\n\n### Credential storage\n\nCredentials are stored and refreshed entirely by **OpenCode core**, not by this plugin. This plugin only supplies\nthe `authorize`, `refresh`, and `label` callbacks that core invokes; it does not read or write any files (no\n`auth.json`, no debug log — both were removed when the v1 auth-loader/token-refresh code was replaced by core's\nintegration/credential system).\n\n## Architecture\n\n### Project structure\n\n```\nopencode-gitlab-auth/\n├── src/\n│   ├── index.ts              # Plugin entry point (Plugin.define)\n│   ├── instance-url.ts       # Instance URL resolution/validation helpers\n│   ├── oauth-flow.ts         # GitLab OAuth token exchange (code + refresh grants)\n│   ├── callback-server.ts    # Local node:http server for the OAuth redirect\n│   └── pkce.ts                # PKCE utilities (verifier & challenge)\n├── dist/                      # Compiled JavaScript (generated)\n├── package.json\n├── tsconfig.json\n└── README.md\n```\n\n### Core components\n\n#### 1. Plugin entry point (`index.ts`)\n\nDefault-exports a `Plugin.define({ id, setup })` definition. During `setup`, it registers two methods on the\n`gitlab` integration via `ctx.integration.transform`:\n\n- An `oauth` method (`authorize`, `refresh`, `label`) implementing the PKCE flow described above.\n- A `key` method that adds the `instanceUrl` form field to the PAT flow OpenCode core already provides.\n\n```typescript\nexport default Plugin.define({\n  id: 'gitlab-auth',\n  async setup(ctx) {\n    await ctx.integration.transform((editor) => {\n      editor.method.update({\n        integrationID: 'gitlab',\n        method: {\n          /* oauth */\n        },\n        authorize,\n        refresh,\n        label,\n      });\n      editor.method.update({\n        integrationID: 'gitlab',\n        method: {\n          /* key */\n        },\n      });\n    });\n  },\n});\n```\n\nThere is no `loader`, no token-refresh mutex, and no filesystem access — OpenCode core's credential/integration\nsystem replaces all of it. See the [V1→V2 plugin migration guide](https://opencode.ai/v2/docs/build/plugins/migrate-v1)\nfor the general shape of this change.\n\n#### 2. OAuth flow (`oauth-flow.ts`)\n\n`GitLabOAuthFlow` performs the two GitLab OAuth token-exchange requests this plugin needs:\n\n```typescript\nclass GitLabOAuthFlow {\n  constructor(options: { instanceUrl: string; clientId: string });\n  async exchangeAuthorizationCode(\n    code: string,\n    codeVerifier: string,\n    redirectUri: string\n  ): Promise<OAuthTokens>;\n  async exchangeRefreshToken(refreshToken: string): Promise<OAuthTokens>;\n}\n```\n\n#### 3. Callback server (`callback-server.ts`)\n\nA minimal `node:http` server (no external dependencies) that listens on `127.0.0.1:8080` for the OAuth redirect,\nparses `code`/`state`/`error` query parameters, renders a success/failure HTML page, and closes itself once the\ncallback is received or the configured timeout elapses. Includes a simple request counter to bound the number of\nrequests it will process before refusing further ones.\n\n```typescript\nclass CallbackServer {\n  constructor(options?: { port?: number; host?: string; timeout?: number });\n  async start(): Promise<void>;\n  async waitForCallback(): Promise<{ code: string; state: string }>;\n  getPort(): number;\n  getCallbackUrl(): string;\n  async close(): Promise<void>;\n}\n```\n\n#### 4. PKCE utilities (`pkce.ts`)\n\n```typescript\nfunction generateSecret(length?: number): string; // random verifier/state\nfunction generateCodeChallengeFromVerifier(verifier: string): string; // SHA-256, base64url\n```\n\nUses Node's `crypto` module; no client secret is ever generated or required.\n\n### Data flow\n\n```mermaid\nflowchart TD\n    A[User selects GitLab OAuth] --> B[authorize receives instanceUrl answer]\n    B --> C[Generate PKCE verifier, challenge, state]\n    C --> D[Start local callback server on :8080]\n    D --> E[Return authorization URL + instructions to OpenCode]\n    E --> F[User approves on GitLab in browser]\n    F --> G[GitLab redirects to local callback server]\n    G --> H{state matches?}\n    H -->|No| X[Reject: possible CSRF]\n    H -->|Yes| I[POST /oauth/token with code_verifier]\n    I --> J[Return Credential.OAuth to OpenCode core]\n    J --> K[OpenCode core stores credential]\n    K --> L[Core calls refresh before expiry]\n```\n\n## Security\n\n### PKCE\n\nTraditional OAuth requires a client secret, which cannot be safely embedded in a CLI/desktop application. PKCE\navoids this: the client generates a random verifier, sends its SHA-256 hash (the \"challenge\") during authorization,\nand only reveals the verifier during token exchange — a value never transmitted during the browser redirect and\ntherefore not interceptable from it.\n\n### State parameter\n\nA random `state` value is generated per authorization attempt and checked against the value GitLab returns on\nredirect, rejecting the flow if they don't match (CSRF protection).\n\n### What this plugin does **not** do\n\n- It does not store, encrypt, or manage any files. Credential persistence, encryption at rest, and refresh\n  scheduling are entirely OpenCode core's responsibility.\n- It does not validate Personal Access Tokens before they're saved (see\n  [Personal Access Token](#personal-access-token) above).\n- It does not open a browser itself — OpenCode's client is responsible for presenting/opening the returned\n  authorization URL.\n\n### Reporting security issues\n\nPlease report security vulnerabilities to the maintainers privately. Do not open public issues for security\nconcerns.\n\n## Troubleshooting\n\n### OAuth: `invalid_grant` on token exchange\n\n> `The provided authorization grant is invalid, expired, revoked, does not match the redirection URI used in the\nauthorization request, or was issued to another client.`\n\nGitLab returns this one generic error for several distinct causes. Check them in this order:\n\n1. **A stale authorization code.** This is by far the most common cause. Codes are single-use and are bound to\n   the PKCE verifier of the login attempt that created them, so all of these fail:\n   - reloading the `127.0.0.1:8080/callback` success page\n   - opening an authorization URL from an earlier, abandoned attempt\n   - starting a second login while a first one is still pending\n\n   Close stray browser tabs pointing at `/oauth/authorize` or `/callback`, then start a completely fresh login.\n\n2. **A custom `GITLAB_OAUTH_CLIENT_ID` whose application is misconfigured.** Check which value the server has:\n   ```bash\n   opencode service get env GITLAB_OAUTH_CLIENT_ID\n   ```\n   That application must register `http://127.0.0.1:8080/callback` exactly (not `localhost`, no trailing slash,\n   no different port), grant the `api` scope, and have **Confidential** unchecked — PKCE requires a public\n   client and this plugin never sends a `client_secret`. Unset the variable to fall back to the default\n   application, then `opencode service restart`.\n\nThe plugin appends the `redirect_uri` it sent and the client ID actually in effect to this error message — use\nthat to confirm which cause applies.\n\n### OAuth: \"The redirect URI included is not valid\"\n\nShown by GitLab in the browser at the authorization step, before any code is issued. The application behind the\nclient ID in use does not register `http://127.0.0.1:8080/callback`. If you set `GITLAB_OAUTH_CLIENT_ID`, add\nthat exact redirect URI to your application, or unset the variable to use the default application.\n\n### OAuth: callback timeout / port 8080 unavailable\n\nThe callback server binds a fixed port (`8080`) to match the redirect URI registered on GitLab. If authentication\nnever completes:\n\n```bash\nlsof -i :8080          # macOS/Linux\nnetstat -ano | findstr :8080   # Windows\n```\n\nFree the port or stop whatever else is using it, then retry.\n\n### PAT authentication fails on first model call\n\nSince PATs are no longer validated when entered (see above), a bad token surfaces as a provider error on first use.\nConfirm the token is valid and scoped to `api`:\n\n```bash\ncurl -H \"Authorization: Bearer glpat-xxx\" https://gitlab.com/api/v4/user\n```\n\n### Self-managed GitLab issues\n\n- Enter the instance URL without a trailing slash or path, e.g. `https://gitlab.example.com`.\n- Verify TLS/connectivity independently:\n  ```bash\n  curl -v https://gitlab.example.com/api/v4/version\n  ```\n\n### General\n\n- `opencode plugin list` should show `gitlab-auth` as active.\n- Consult OpenCode's own logs/diagnostics for plugin load errors; this plugin no longer writes its own log file.\n\n## Development\n\n### Setup\n\n```bash\ngit clone https://gitlab.com/vglafirov/opencode-gitlab-auth.git\ncd opencode-gitlab-auth\nnpm install\nnpm run prepare   # install Git hooks\nnpm run build\n```\n\n### Available scripts\n\n| Script                 | Description                      |\n| ---------------------- | -------------------------------- |\n| `npm run build`        | Compile TypeScript to JavaScript |\n| `npm run clean`        | Remove `dist/`                   |\n| `npm run rebuild`      | Clean and build                  |\n| `npm test`             | Run unit tests (Vitest)          |\n| `npm run lint`         | Check code style (ESLint)        |\n| `npm run lint:fix`     | Fix code style issues            |\n| `npm run format`       | Format code with Prettier        |\n| `npm run format:check` | Check code formatting            |\n| `npm run prepare`      | Install Git hooks (Husky)        |\n\n### Manual verification\n\nAutomated tests only cover the pure `instance-url.ts` helpers. To exercise the plugin end to end:\n\n1. `npm run build`\n2. Point a project's `opencode.jsonc` `plugins` array at the local build directory (see\n   [Local development install](#local-development-install)).\n3. Confirm `opencode plugin list` shows `gitlab-auth`.\n4. Run the OAuth flow against gitlab.com, then against a self-managed instance.\n5. Force a credential refresh (wait for expiry, or shorten it locally) and confirm OpenCode calls back into\n   `refresh` successfully.\n6. Run the PAT flow with a self-managed instance URL and confirm the resulting provider call targets that instance.\n7. Remove/reload the plugin and confirm no listener is left on port 8080.\n\n### Commit messages\n\nFollows [Conventional Commits](https://www.conventionalcommits.org/), enforced by commitlint via a Husky pre-commit\nhook:\n\n```\nfeat(oauth): add support for custom redirect URIs\nfix(server): resolve callback timeout issue\nfeat!: migrate to opencode plugin SDK v2\n\nBREAKING CHANGE: requires OpenCode v2 and @opencode/plugin ^2.0.0\n```\n\n### Release process\n\nReleases are automated with semantic-release from the `main` branch: `feat:` → minor, `fix:`/`perf:`/`revert:`/\n`docs:` → patch, `feat!:`/`BREAKING CHANGE:` → major.\n\n## Upgrading from 2.x\n\nVersion 3.0 targets OpenCode's plugin SDK v2 (`@opencode/plugin`) and is **not compatible** with OpenCode v1 or the\n`@opencode-ai/plugin` package that 2.x depended on. If you're on OpenCode v1, stay on `opencode-gitlab-auth@^2`.\n\nWhat changed for users:\n\n- Config key: `\"plugin\": [...]` → `\"plugins\": [...]` in `opencode.json(c)`.\n- Existing v1 credentials in `~/.local/share/opencode/auth.json` are **not** migrated. OpenCode v2 stores\n  credentials in its own credential store; re-authenticate once after upgrading.\n- The debug log at `~/.local/share/opencode/log/gitlab-auth.log` no longer exists.\n- The plugin no longer opens your browser itself; OpenCode's client is responsible for that.\n- PATs are no longer validated against the GitLab API before being saved (see\n  [Personal Access Token](#personal-access-token)).\n- The `gitlab` provider itself (models, `gitlab-ai-provider` wiring) now ships with OpenCode core — this plugin only\n  adds the OAuth method and the instance-URL form field.\n\n## Contributing\n\nContributions are welcome! Please see [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines on code style, the\ndevelopment workflow, and submitting merge requests.\n\nQuick checklist before opening an MR:\n\n```bash\nnpm run lint\nnpm run format:check\nnpm run build\nnpm test\n```\n\n## FAQ\n\n### Do I need to register my own OAuth app?\n\nYes. The bundled client ID's redirect URI does not match OpenCode's local callback server, so OAuth will not work\nwithout setting `GITLAB_OAUTH_CLIENT_ID` to your own application. See [Quick Start](#quick-start).\n\n### Can I use this with self-managed GitLab?\n\nYes — enter your instance URL when prompted, for either OAuth or PAT.\n\n### Where are my credentials stored?\n\nIn OpenCode core's own credential store, not in a file this plugin manages. See\n[Credential storage](#credential-storage).\n\n### Can I use this in CI/CD?\n\nYes, via the Personal Access Token method — OAuth requires a browser.\n\n### How long do OAuth tokens last, and how are they refreshed?\n\nGitLab OAuth access tokens are short-lived; OpenCode core calls this plugin's `refresh` handler automatically before\nthey expire, exchanging the stored refresh token for a new access token.\n\n## Changelog\n\nSee [CHANGELOG.md](CHANGELOG.md) for version history and release notes.\n\n## License\n\nMIT License — see [LICENSE](LICENSE) file for details.\n\nCopyright (c) 2025 OpenCode GitLab Auth Contributors\n\n## Acknowledgments\n\n- Inspired by [gitlab-vscode-extension](https://gitlab.com/gitlab-org/gitlab-vscode-extension)\n- OAuth patterns from [gitlab-lsp](https://gitlab.com/gitlab-org/editor-extensions/gitlab-lsp)\n- Built for [OpenCode](https://opencode.ai)\n- [GitLab Duo](https://about.gitlab.com/gitlab-duo/)\n- [GitLab OAuth](https://docs.gitlab.com/ee/api/oauth2.html)\n\n## Links\n\n- [GitLab Repository](https://gitlab.com/vglafirov/opencode-gitlab-auth)\n- [npm Package](https://www.npmjs.com/package/opencode-gitlab-auth)\n- [Issue Tracker](https://gitlab.com/vglafirov/opencode-gitlab-auth/-/issues)\n- [Contributing Guide](https://gitlab.com/vglafirov/opencode-gitlab-auth/-/blob/main/CONTRIBUTING.md)\n- [Changelog](https://gitlab.com/vglafirov/opencode-gitlab-auth/-/blob/main/CHANGELOG.md)\n- [Agent Guidelines](https://gitlab.com/vglafirov/opencode-gitlab-auth/-/blob/main/AGENTS.md)\n- [OpenCode V1→V2 Plugin Migration Guide](https://opencode.ai/v2/docs/build/plugins/migrate-v1)\n\n---\n\n**Made with ❤️ for the OpenCode community**\n","readmeFilename":"README.md"}