[{"data":1,"prerenderedAt":1284},["ShallowReactive",2],{"/blog/refactoring-javascript-to-typescript-with-gitlab-duo-workflow":3,"navigation-en-us":500,"banner-en-us":927,"footer-en-us":937,"blog-post-authors-en-us-Frédéric Caplette":1180,"blog-related-posts-en-us-refactoring-javascript-to-typescript-with-gitlab-duo-workflow":1196,"blog-promotions-en-us":1221,"next-steps-en-us":1274},{"id":4,"title":5,"authors":6,"body":8,"category":477,"date":478,"description":479,"extension":480,"externalUrl":481,"faq":481,"featured":482,"heroImage":483,"meta":484,"navigation":482,"path":485,"seo":486,"slug":491,"stem":492,"tags":493,"template":498,"updatedDate":481,"__hash__":499},"blogPosts/en-us/blog/refactoring-javascript-to-typescript-with-gitlab-duo-workflow.md","Refactoring JavaScript to TypeScript with GitLab Duo Workflow",[7],"Frédéric Caplette",{"type":9,"value":10,"toc":461},"minimark",[11,22,25,36,40,45,48,67,70,74,83,97,100,103,114,119,122,142,145,151,202,207,240,245,264,267,284,287,305,308,312,315,390,394,397,401,404,408,411,415,418,422,425,436,440],[12,13,14,15,21],"p",{},"TypeScript adoption continues to grow, with over 88% of developers reporting they either use or want to use it. Yet, migrating existing JavaScript codebases to TypeScript is often a time-consuming process. Enter ",[16,17,20],"a",{"href":18,"rel":19},"https://about.gitlab.com/blog/gitlab-duo-workflow-enterprise-visibility-and-control-for-agentic-ai/",[],"GitLab Duo Workflow",": secure, agentic AI that sits right inside your development environment, helping transform high-level tasks into executable workflows. In this article, you'll learn how we used Duo Workflow to update Duo Workflow, converting a real-world JavaScript application to TypeScript. We'll also review the technical process and broader implications for development workflows.",[12,23,24],{},"This video walks through visually what you'll read below:",[26,27,28],"div",{},[29,30],"iframe",{"src":31,"frameBorder":32,"allow":33,"style":34,"title":35},"https://player.vimeo.com/video/1085078036?badge=0&autopause=0&player_id=0&app_id=58479","0","autoplay; fullscreen; picture-in-picture; clipboard-write; encrypted-media","position:absolute;top:0;left:0;width:100%;height:100%;","Refactor JavaScript to TypeScript with GitLab Duo Workflow",[37,38],"script",{"src":39},"https://player.vimeo.com/api/player.js",[41,42,44],"h2",{"id":43},"the-challenge-refactor-js-to-ts","The challenge: Refactor JS to TS",[12,46,47],{},"We decided to migrate Duo Workflow client-related logic to TypeScript for better type safety and auto-complete. A JavaScript-to-TypeScript migration involves more than just changing file extensions. It requires:",[49,50,51,55,58,61,64],"ol",{},[52,53,54],"li",{},"Analyzing existing code patterns to determine appropriate types",[52,56,57],{},"Handling edge cases where type inference is ambiguous",[52,59,60],{},"Ensuring consistency across the codebase",[52,62,63],{},"Managing dependencies and third-party libraries",[52,65,66],{},"Validating that runtime behavior remains unchanged",[12,68,69],{},"Doing all of this work manually can be very time consuming and not much fun. Thankfully, managing your projects is easier and more efficient with Duo Workflow – even when the project is Duo Workflow.",[41,71,73],{"id":72},"how-it-works","How it works",[12,75,76,77,82],{},"If you've used AI coding assistants before, you're likely familiar with their chat-based interfaces (like ",[16,78,81],{"href":79,"rel":80},"https://about.gitlab.com/blog/gitlab-duo-chat-now-generally-available/",[],"GitLab Duo Chat","). These chats can provide code snippets, suggested directory structures, and more. GitLab Duo Workflow fundamentally differs from these in several key ways:",[49,84,85,88,91,94],{},[52,86,87],{},"It's contextually aware of your entire codebase, not just open files or highlighted text. You can also add context from relevant GitLab issues or merge requests.",[52,89,90],{},"It develops and executes a multi-stage plan, allowing for more complete solutions.",[52,92,93],{},"It keeps a human in the loop, ensuring you understand and approve of what is happening at each step of the way.",[52,95,96],{},"It stages changes to your repository, giving you control over what to accept.",[12,98,99],{},"Duo Workflow uses an agentic AI approach, powered by Claude 3.5 Sonnet, to understand code semantics while maintaining a deep integration with GitLab's DevOps platform.",[12,101,102],{},"Let's walk through a real-world example of refactoring a JavaScript file using GitLab Duo Workflow. In our case, we started with the prompt:",[104,105,111],"pre",{"className":106,"code":108,"language":109,"meta":110},[107],"language-text","I need to refactor a JavaScript file packages/webview_duo_workflow/src/app/stores/workflow.js to TypeScript. Please analyze the code, identify any issues, and convert it to TypeScript with appropriate type definitions.\n","text","",[112,113,108],"code",{"__ignoreMap":110},[115,116,118],"h3",{"id":117},"analysis","Analysis",[12,120,121],{},"After prompting, Duo Workflow first analyzed the codebase structure:",[123,124,125,132,139],"ul",{},[52,126,127,128,131],{},"Identified that ",[112,129,130],{},"workflow.js"," is a Pinia store implementation",[52,133,134,135,138],{},"Noted it uses imports from various modules including ",[112,136,137],{},"constants.ts"," (which was already in TypeScript)",[52,140,141],{},"Recognized GraphQL queries import exists but the file wasn't accessible",[12,143,144],{},"Based on this analysis, Duo Workflow identified specific typing needs:",[12,146,147],{},[148,149,150],"strong",{},"Type definitions needed for:",[123,152,153],{},[52,154,155,156],{},"Store State interface with precise types:\n",[123,157,158,164,169,174,180,185,191,196],{},[52,159,160,163],{},[112,161,162],{},"areWorkflowsLoading",": boolean",[52,165,166,163],{},[112,167,168],{},"isLoadingWorkflow",[52,170,171,163],{},[112,172,173],{},"isLoadingRecentWorkflows",[52,175,176,179],{},[112,177,178],{},"recentWorkflows",": array",[52,181,182,179],{},[112,183,184],{},"workflows",[52,186,187,190],{},[112,188,189],{},"workflowsPageInfo",": object",[52,192,193,190],{},[112,194,195],{},"initialState",[52,197,198,201],{},[112,199,200],{},"activeWorkflow",": object with specific shape",[12,203,204],{},[148,205,206],{},"Interface definitions required:",[123,208,209],{},[52,210,211,212],{},"Workflow interface with properties:\n",[123,213,214,220,225,230,235],{},[52,215,216,219],{},[112,217,218],{},"id",": string",[52,221,222,219],{},[112,223,224],{},"goal",[52,226,227,219],{},[112,228,229],{},"status",[52,231,232,190],{},[112,233,234],{},"checkpoint",[52,236,237,219],{},[112,238,239],{},"type",[12,241,242],{},[148,243,244],{},"Parameter types needed for:",[123,246,247,250,253],{},[52,248,249],{},"GraphQL response types for workflows data",[52,251,252],{},"Event handler parameter types",[52,254,255,256,259,260,263],{},"Function parameter types for actions like ",[112,257,258],{},"getWorkflowById",", ",[112,261,262],{},"runWorkflow",", etc.",[12,265,266],{},"Duo Workflow identified several complex patterns requiring special handling:",[123,268,269,272,275,278,281],{},[52,270,271],{},"Uses optional chaining extensively",[52,273,274],{},"Has nested object destructuring",[52,276,277],{},"Contains GraphQL integration",[52,279,280],{},"Uses Pinia store patterns with state, getters, and actions",[52,282,283],{},"Implements an events mapping system",[12,285,286],{},"The system recognized external type dependencies:",[123,288,289,292,295],{},[52,290,291],{},"Pinia store types",[52,293,294],{},"GraphQL query response types",[52,296,297,298,259,301,304],{},"Functions from an internal Bridge module were also properly recognized (for ",[112,299,300],{},"sendRequest",[112,302,303],{},"sendGraphqlRequest",")",[12,306,307],{},"The final analysis concluded: \"The file will need to be renamed from .js to .ts and appropriate type definitions added while maintaining the existing functionality.\"",[115,309,311],{"id":310},"planning","Planning",[12,313,314],{},"Based on this thorough analysis, Duo Workflow created a structured plan consisting of specific tasks:",[49,316,317,327,347,370],{},[52,318,319,322,323,326],{},[148,320,321],{},"Create a new TypeScript file"," ",[112,324,325],{},"workflow.ts"," in the same directory as the original JS file.",[52,328,329,332,333],{},[148,330,331],{},"Create TypeScript interfaces"," for the store state and workflow types at the top of the new file, including:",[123,334,335,338,341,344],{},[52,336,337],{},"WorkflowState interface for store state",[52,339,340],{},"Workflow interface for workflow object structure",[52,342,343],{},"WorkflowPageInfo interface for pagination info",[52,345,346],{},"WorkflowCheckpoint interface for checkpoint data",[52,348,349,352,353,355,356],{},[148,350,351],{},"Copy and add type annotations"," to the store implementation from ",[112,354,130],{},", including:",[123,357,358,361,364,367],{},[52,359,360],{},"State return type",[52,362,363],{},"Getter return types",[52,365,366],{},"Action parameter types",[52,368,369],{},"Action return types",[52,371,372,375,376,378,379],{},[148,373,374],{},"Update all imports"," in ",[112,377,325],{}," to:",[123,380,381,384,387],{},[52,382,383],{},"Add type imports from Pinia",[52,385,386],{},"Update local imports to use .ts extensions where applicable",[52,388,389],{},"Import any required type definitions",[115,391,393],{"id":392},"execution","Execution",[12,395,396],{},"After the plan is complete, we were prompted to  “Approve plan.” Before clicking approve, we reviewed each step and ensured we were comfortable with the plan. After approval, Duo Workflow showed its progress through each step with visual indicators and explanations of what API operations were supporting each task (like \"Supported by: create_file_with_contents\" or \"Supported by: edit_file\"). When the work was done, we reviewed the changes before committing.",[41,398,400],{"id":399},"what-we-learned","What we learned",[12,402,403],{},"This JavaScript-to-TypeScript migration example showcases a significant evolution in AI-assisted development. What makes GitLab Duo Workflow particularly interesting is its approach to:",[115,405,407],{"id":406},"task-oriented-programming-vs-suggestion-only-assistance","Task-oriented programming vs. suggestion-only assistance",[12,409,410],{},"Unlike many AI assistants that simply offer code snippets or suggestions, Duo Workflow understands and executes complete tasks. The difference is significant — rather than saying \"here's some TypeScript code you might use,\" it says \"I'll convert this file for you, here's my plan, and here are the changes I'm making.\"",[115,412,414],{"id":413},"contextual-understanding-of-the-entire-codebase","Contextual understanding of the entire codebase",[12,416,417],{},"The tool demonstrates awareness of project structure, related files (like constants.ts and GraphQL queries), and the relationships between components. This contextual understanding allows for more sophisticated conversions than localized transformations.",[115,419,421],{"id":420},"step-by-step-execution-with-visibility","Step-by-step execution with visibility",[12,423,424],{},"The plan-based approach, with clear steps and progress indicators, provides transparency into what would otherwise be a black-box process. This allows developers to understand what the AI is doing and how it's approaching the problem.",[426,427,428],"blockquote",{},[12,429,430,431],{},"GitLab Duo Workflow is currently available in private beta for GitLab Ultimate customers. ",[16,432,435],{"href":433,"rel":434},"https://about.gitlab.com/gitlab-duo-agent-platform/",[],"Sign up for the waitlist today!",[41,437,439],{"id":438},"learn-more","Learn more",[123,441,442,449,454],{},[52,443,444],{},[16,445,448],{"href":446,"rel":447},"https://about.gitlab.com/blog/agentic-ai-guides-and-resources/",[],"Agentic AI guides and resources",[52,450,451],{},[16,452,20],{"href":18,"rel":453},[],[52,455,456],{},[16,457,460],{"href":458,"rel":459},"https://about.gitlab.com/topics/agentic-ai/",[],"What is agentic AI?",{"title":110,"searchDepth":462,"depth":462,"links":463},2,[464,465,471,476],{"id":43,"depth":462,"text":44},{"id":72,"depth":462,"text":73,"children":466},[467,469,470],{"id":117,"depth":468,"text":118},3,{"id":310,"depth":468,"text":311},{"id":392,"depth":468,"text":393},{"id":399,"depth":462,"text":400,"children":472},[473,474,475],{"id":406,"depth":468,"text":407},{"id":413,"depth":468,"text":414},{"id":420,"depth":468,"text":421},{"id":438,"depth":462,"text":439},"ai","2025-05-22","Learn how we used our autonomous AI agent, which sits in your development environment, to convert a real-world JavaScript application to TypeScript.","md",null,true,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749660174/Blog/Hero%20Images/Workflow_1800x945.png",{},"/en-us/blog/refactoring-javascript-to-typescript-with-gitlab-duo-workflow",{"title":5,"description":479,"ogTitle":5,"ogDescription":479,"noIndex":487,"ogImage":483,"ogUrl":488,"ogSiteName":489,"ogType":490,"canonicalUrls":488},false,"https://about.gitlab.com/blog/refactoring-javascript-to-typescript-with-gitlab-duo-workflow","https://about.gitlab.com","article","refactoring-javascript-to-typescript-with-gitlab-duo-workflow","en-us/blog/refactoring-javascript-to-typescript-with-gitlab-duo-workflow",[494,495,496,497],"AI","tutorial","DevSecOps platform","features","BlogPost","YhZKjBi-SQtjX68SMEnYVsaARGN4n_N7pZ39PgLXTSg",{"logo":501,"freeTrial":506,"sales":511,"login":516,"items":521,"search":847,"minimal":878,"duo":897,"switchNav":906,"pricingDeployment":917},{"config":502},{"href":503,"dataGaName":504,"dataGaLocation":505},"/","gitlab logo","header",{"text":507,"config":508},"Get free trial",{"href":509,"dataGaName":510,"dataGaLocation":505},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":512,"config":513},"Request a demo",{"href":514,"dataGaName":515,"dataGaLocation":505},"/sales/?contact-topic=request-demo","sales",{"text":517,"config":518},"Sign in",{"href":519,"dataGaName":520,"dataGaLocation":505},"https://gitlab.com/users/sign_in/","sign in",[522,550,650,655,769,825],{"text":523,"config":524,"menu":526},"Platform",{"dataNavLevelOne":525},"platform",{"type":527,"columns":528},"cards",[529,535,543],{"title":523,"description":530,"link":531},"The intelligent orchestration platform for DevSecOps",{"text":532,"config":533},"Explore our Platform",{"href":534,"dataGaName":525,"dataGaLocation":505},"/platform/",{"title":536,"description":537,"link":538},"GitLab Duo Agent Platform","Agentic AI for the entire software lifecycle",{"text":539,"config":540},"Meet GitLab Duo",{"href":541,"dataGaName":542,"dataGaLocation":505},"/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":544,"description":545,"link":546},"Why GitLab","See the top reasons enterprises choose GitLab",{"text":439,"config":547},{"href":548,"dataGaName":549,"dataGaLocation":505},"/why-gitlab/","why gitlab",{"text":551,"left":482,"config":552,"menu":554},"Product",{"dataNavLevelOne":553},"solutions",{"type":555,"link":556,"columns":560,"feature":629},"lists",{"text":557,"config":558},"View all Solutions",{"href":559,"dataGaName":553,"dataGaLocation":505},"/solutions/",[561,585,608],{"title":562,"description":563,"link":564,"items":569},"Automation","CI/CD and automation to accelerate deployment",{"config":565},{"icon":566,"href":567,"dataGaName":568,"dataGaLocation":505},"AutomatedCodeAlt","/solutions/delivery-automation/","automated software delivery",[570,574,577,581],{"text":571,"config":572},"CI/CD",{"href":573,"dataGaLocation":505,"dataGaName":571},"/solutions/continuous-integration/",{"text":536,"config":575},{"href":541,"dataGaLocation":505,"dataGaName":576},"gitlab duo agent platform - product menu",{"text":578,"config":579},"Source Code Management",{"href":580,"dataGaLocation":505,"dataGaName":578},"/solutions/source-code-management/",{"text":582,"config":583},"Automated Software Delivery",{"href":567,"dataGaLocation":505,"dataGaName":584},"Automated software delivery",{"title":586,"description":587,"link":588,"items":593},"Security","Deliver code faster without compromising security",{"config":589},{"href":590,"dataGaName":591,"dataGaLocation":505,"icon":592},"/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[594,598,603],{"text":595,"config":596},"Application Security Testing",{"href":590,"dataGaName":597,"dataGaLocation":505},"Application security testing",{"text":599,"config":600},"Software Supply Chain Security",{"href":601,"dataGaLocation":505,"dataGaName":602},"/solutions/supply-chain/","Software supply chain security",{"text":604,"config":605},"Software Compliance",{"href":606,"dataGaName":607,"dataGaLocation":505},"/solutions/software-compliance/","software compliance",{"title":609,"link":610,"items":615},"Measurement",{"config":611},{"icon":612,"href":613,"dataGaName":614,"dataGaLocation":505},"DigitalTransformation","/solutions/visibility-measurement/","visibility and measurement",[616,620,624],{"text":617,"config":618},"Visibility & Measurement",{"href":613,"dataGaLocation":505,"dataGaName":619},"Visibility and Measurement",{"text":621,"config":622},"Value Stream Management",{"href":623,"dataGaLocation":505,"dataGaName":621},"/solutions/value-stream-management/",{"text":625,"config":626},"Analytics & Insights",{"href":627,"dataGaLocation":505,"dataGaName":628},"/solutions/analytics-and-insights/","Analytics and insights",{"title":630,"type":555,"items":631},"GitLab for",[632,638,644],{"text":633,"config":634},"Enterprise",{"icon":635,"href":636,"dataGaLocation":505,"dataGaName":637},"Building","/enterprise/","enterprise",{"text":639,"config":640},"Small Business",{"icon":641,"href":642,"dataGaLocation":505,"dataGaName":643},"Work","/small-business/","small business",{"text":645,"config":646},"Public Sector",{"icon":647,"href":648,"dataGaLocation":505,"dataGaName":649},"Organization","/solutions/public-sector/","public sector",{"text":651,"config":652},"Pricing",{"href":653,"dataGaName":654,"dataGaLocation":505,"dataNavLevelOne":654},"/pricing/","pricing",{"text":656,"config":657,"menu":659},"Resources",{"dataNavLevelOne":658},"resources",{"type":555,"link":660,"columns":664,"feature":758},{"text":661,"config":662},"View all resources",{"href":663,"dataGaName":658,"dataGaLocation":505},"/resources/",[665,698,725],{"title":666,"items":667},"Getting started",[668,673,678,683,688,693],{"text":669,"config":670},"Install",{"href":671,"dataGaName":672,"dataGaLocation":505},"/install/","install",{"text":674,"config":675},"Quick start guides",{"href":676,"dataGaName":677,"dataGaLocation":505},"/get-started/","quick setup checklists",{"text":679,"config":680},"Learn",{"href":681,"dataGaLocation":505,"dataGaName":682},"https://university.gitlab.com/","learn",{"text":684,"config":685},"Product documentation",{"href":686,"dataGaName":687,"dataGaLocation":505},"https://docs.gitlab.com/","product documentation",{"text":689,"config":690},"Best practice videos",{"href":691,"dataGaName":692,"dataGaLocation":505},"/getting-started-videos/","best practice videos",{"text":694,"config":695},"Integrations",{"href":696,"dataGaName":697,"dataGaLocation":505},"/integrations/","integrations",{"title":699,"items":700},"Discover",[701,706,711,716,720],{"text":702,"config":703},"Customer success stories",{"href":704,"dataGaName":705,"dataGaLocation":505},"/customers/","customer success stories",{"text":707,"config":708},"Blog",{"href":709,"dataGaName":710,"dataGaLocation":505},"/blog/","blog",{"text":712,"config":713},"Demo Hub",{"href":714,"dataGaName":715,"dataGaLocation":505},"/demo-hub/","demo hub",{"text":717,"config":718},"The Source",{"href":719,"dataGaName":710,"dataGaLocation":505},"/the-source/",{"text":721,"config":722},"Remote",{"href":723,"dataGaName":724,"dataGaLocation":505},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":726,"items":727},"Connect",[728,733,738,743,748,753],{"text":729,"config":730},"GitLab Services",{"href":731,"dataGaName":732,"dataGaLocation":505},"/services/","services",{"text":734,"config":735},"Contribute",{"href":736,"dataGaName":737,"dataGaLocation":505},"https://contributors.gitlab.com","contribute",{"text":739,"config":740},"Community",{"href":741,"dataGaName":742,"dataGaLocation":505},"/community/","community",{"text":744,"config":745},"Forum",{"href":746,"dataGaName":747,"dataGaLocation":505},"https://forum.gitlab.com/","forum",{"text":749,"config":750},"Events",{"href":751,"dataGaName":752,"dataGaLocation":505},"/events/","events",{"text":754,"config":755},"Partners",{"href":756,"dataGaName":757,"dataGaLocation":505},"/partners/","partners",{"config":759,"title":762,"text":763,"link":764},{"background":760,"textColor":761},"url('https://res.cloudinary.com/about-gitlab-com/image/upload/v1777322348/qpq8yrgn8knii57omj0c.png')","#000","What’s new in GitLab","Stay updated with our latest features and improvements.",{"text":765,"config":766},"Read the latest",{"href":767,"dataGaName":768,"dataGaLocation":505},"/whats-new/","whats new",{"text":770,"config":771,"menu":773},"Company",{"dataNavLevelOne":772},"company",{"type":555,"columns":774},[775],{"items":776},[777,782,788,790,795,800,805,810,815,820],{"text":778,"config":779},"About",{"href":780,"dataGaName":781,"dataGaLocation":505},"/company/","about",{"text":783,"config":784,"footerGa":787},"Jobs",{"href":785,"dataGaName":786,"dataGaLocation":505},"/jobs/","jobs",{"dataGaName":786},{"text":749,"config":789},{"href":751,"dataGaName":752,"dataGaLocation":505},{"text":791,"config":792},"Leadership",{"href":793,"dataGaName":794,"dataGaLocation":505},"/company/team/e-group/","leadership",{"text":796,"config":797},"Handbook",{"href":798,"dataGaName":799,"dataGaLocation":505},"https://handbook.gitlab.com/","handbook",{"text":801,"config":802},"Investor relations",{"href":803,"dataGaName":804,"dataGaLocation":505},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":806,"config":807},"Trust Center",{"href":808,"dataGaName":809,"dataGaLocation":505},"/security/","trust center",{"text":811,"config":812},"AI Transparency Center",{"href":813,"dataGaName":814,"dataGaLocation":505},"/ai-transparency-center/","ai transparency center",{"text":816,"config":817},"Newsletter",{"href":818,"dataGaName":819,"dataGaLocation":505},"/company/contact/#contact-forms","newsletter",{"text":821,"config":822},"Press",{"href":823,"dataGaName":824,"dataGaLocation":505},"/press/","press",{"text":826,"config":827,"menu":828},"Contact us",{"dataNavLevelOne":772},{"type":555,"columns":829},[830],{"items":831},[832,837,842],{"text":833,"config":834},"Talk to sales",{"href":835,"dataGaName":836,"dataGaLocation":505},"/sales/","talk to sales",{"text":838,"config":839},"Support portal",{"href":840,"dataGaName":841,"dataGaLocation":505},"https://support.gitlab.com/hc/en-us","support portal",{"text":843,"config":844},"Customer portal",{"href":845,"dataGaName":846,"dataGaLocation":505},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":848,"login":849,"suggestions":856},"Close",{"text":850,"link":851},"To search repositories and projects, login to",{"text":852,"config":853},"gitlab.com",{"href":519,"dataGaName":854,"dataGaLocation":855},"search login","search",{"text":857,"default":858},"Suggestions",[859,861,865,867,871,875],{"text":536,"config":860},{"href":541,"dataGaName":536,"dataGaLocation":855},{"text":862,"config":863},"Code Suggestions (AI)",{"href":864,"dataGaName":862,"dataGaLocation":855},"/solutions/code-suggestions/",{"text":571,"config":866},{"href":573,"dataGaName":571,"dataGaLocation":855},{"text":868,"config":869},"GitLab on AWS",{"href":870,"dataGaName":868,"dataGaLocation":855},"/partners/technology-partners/aws/",{"text":872,"config":873},"GitLab on Google Cloud",{"href":874,"dataGaName":872,"dataGaLocation":855},"/partners/technology-partners/google-cloud-platform/",{"text":876,"config":877},"Why GitLab?",{"href":548,"dataGaName":876,"dataGaLocation":855},{"freeTrial":879,"mobileIcon":884,"desktopIcon":889,"secondaryButton":892},{"text":880,"config":881},"Start free trial",{"href":882,"dataGaName":510,"dataGaLocation":883},"https://gitlab.com/-/trials/new/","nav",{"altText":885,"config":886},"Gitlab Icon",{"src":887,"dataGaName":888,"dataGaLocation":883},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":885,"config":890},{"src":891,"dataGaName":888,"dataGaLocation":883},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":893,"config":894},"Get Started",{"href":895,"dataGaName":896,"dataGaLocation":883},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/get-started/","get started",{"freeTrial":898,"mobileIcon":902,"desktopIcon":904},{"text":899,"config":900},"Learn more about GitLab Duo",{"href":541,"dataGaName":901,"dataGaLocation":883},"gitlab duo",{"altText":885,"config":903},{"src":887,"dataGaName":888,"dataGaLocation":883},{"altText":885,"config":905},{"src":891,"dataGaName":888,"dataGaLocation":883},{"button":907,"mobileIcon":912,"desktopIcon":914},{"text":908,"config":909},"/switch",{"href":910,"dataGaName":911,"dataGaLocation":883},"#contact","switch",{"altText":885,"config":913},{"src":887,"dataGaName":888,"dataGaLocation":883},{"altText":885,"config":915},{"src":916,"dataGaName":888,"dataGaLocation":883},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":918,"mobileIcon":923,"desktopIcon":925},{"text":919,"config":920},"Back to pricing",{"href":653,"dataGaName":921,"dataGaLocation":883,"icon":922},"back to pricing","GoBack",{"altText":885,"config":924},{"src":887,"dataGaName":888,"dataGaLocation":883},{"altText":885,"config":926},{"src":891,"dataGaName":888,"dataGaLocation":883},{"title":928,"titleMobile":929,"button":930,"config":935},"Duo Agent Platform delivers 400% ROI, per new Forrester Consulting study.","400% ROI: Forrester TEI for GitLab Duo",{"text":439,"config":931},{"href":932,"dataGaName":933,"dataGaLocation":934},"https://about.gitlab.com/blog/gitlab-duo-agent-platform-delivers-400-percent-roi/","forrester-tei-dap-banner","global-banner",{"layout":936,"disabled":487},"release",{"data":938},{"text":939,"source":940,"edit":946,"contribute":951,"config":956,"items":961,"minimal":1169},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":941,"config":942},"View page source",{"href":943,"dataGaName":944,"dataGaLocation":945},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":947,"config":948},"Edit this page",{"href":949,"dataGaName":950,"dataGaLocation":945},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":952,"config":953},"Please contribute",{"href":954,"dataGaName":955,"dataGaLocation":945},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":957,"facebook":958,"youtube":959,"linkedin":960},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[962,1008,1061,1105,1137],{"title":651,"links":963,"subMenu":978},[964,968,973],{"text":965,"config":966},"View plans",{"href":653,"dataGaName":967,"dataGaLocation":945},"view plans",{"text":969,"config":970},"Why Premium?",{"href":971,"dataGaName":972,"dataGaLocation":945},"/pricing/premium/","why premium",{"text":974,"config":975},"Why Ultimate?",{"href":976,"dataGaName":977,"dataGaLocation":945},"/pricing/ultimate/","why ultimate",[979],{"title":980,"links":981},"Contact Us",[982,985,987,989,993,998,1003],{"text":983,"config":984},"Contact sales",{"href":835,"dataGaName":515,"dataGaLocation":945},{"text":838,"config":986},{"href":840,"dataGaName":841,"dataGaLocation":945},{"text":843,"config":988},{"href":845,"dataGaName":846,"dataGaLocation":945},{"text":990,"config":991},"Status",{"href":992,"dataGaName":229,"dataGaLocation":945},"https://status.gitlab.com/",{"text":994,"config":995},"Terms of use",{"href":996,"dataGaName":997,"dataGaLocation":945},"/terms/","terms of use",{"text":999,"config":1000},"Privacy statement",{"href":1001,"dataGaName":1002,"dataGaLocation":945},"/privacy/","privacy statement",{"text":1004,"config":1005},"Cookie preferences",{"dataGaName":1006,"dataGaLocation":945,"id":1007,"isOneTrustButton":482},"cookie preferences","ot-sdk-btn",{"title":551,"links":1009,"subMenu":1017},[1010,1013],{"text":496,"config":1011},{"href":534,"dataGaName":1012,"dataGaLocation":945},"devsecops platform",{"text":1014,"config":1015},"AI-Assisted Development",{"href":541,"dataGaName":1016,"dataGaLocation":945},"ai-assisted development",[1018],{"title":1019,"links":1020},"Topics",[1021,1026,1031,1036,1041,1046,1051,1056],{"text":1022,"config":1023},"CICD",{"href":1024,"dataGaName":1025,"dataGaLocation":945},"/topics/ci-cd/","cicd",{"text":1027,"config":1028},"GitOps",{"href":1029,"dataGaName":1030,"dataGaLocation":945},"/topics/gitops/","gitops",{"text":1032,"config":1033},"DevOps",{"href":1034,"dataGaName":1035,"dataGaLocation":945},"/topics/devops/","devops",{"text":1037,"config":1038},"Version Control",{"href":1039,"dataGaName":1040,"dataGaLocation":945},"/topics/version-control/","version control",{"text":1042,"config":1043},"DevSecOps",{"href":1044,"dataGaName":1045,"dataGaLocation":945},"/topics/devsecops/","devsecops",{"text":1047,"config":1048},"Cloud Native",{"href":1049,"dataGaName":1050,"dataGaLocation":945},"/topics/cloud-native/","cloud native",{"text":1052,"config":1053},"AI for Coding",{"href":1054,"dataGaName":1055,"dataGaLocation":945},"/topics/devops/ai-for-coding/","ai for coding",{"text":1057,"config":1058},"Agentic AI",{"href":1059,"dataGaName":1060,"dataGaLocation":945},"/topics/agentic-ai/","agentic ai",{"title":1062,"links":1063},"Solutions",[1064,1066,1068,1073,1077,1080,1084,1087,1089,1092,1095,1100],{"text":595,"config":1065},{"href":590,"dataGaName":595,"dataGaLocation":945},{"text":584,"config":1067},{"href":567,"dataGaName":568,"dataGaLocation":945},{"text":1069,"config":1070},"Agile development",{"href":1071,"dataGaName":1072,"dataGaLocation":945},"/solutions/agile-delivery/","agile delivery",{"text":1074,"config":1075},"SCM",{"href":580,"dataGaName":1076,"dataGaLocation":945},"source code management",{"text":1022,"config":1078},{"href":573,"dataGaName":1079,"dataGaLocation":945},"continuous integration & delivery",{"text":1081,"config":1082},"Value stream management",{"href":623,"dataGaName":1083,"dataGaLocation":945},"value stream management",{"text":1027,"config":1085},{"href":1086,"dataGaName":1030,"dataGaLocation":945},"/solutions/gitops/",{"text":633,"config":1088},{"href":636,"dataGaName":637,"dataGaLocation":945},{"text":1090,"config":1091},"Small business",{"href":642,"dataGaName":643,"dataGaLocation":945},{"text":1093,"config":1094},"Public sector",{"href":648,"dataGaName":649,"dataGaLocation":945},{"text":1096,"config":1097},"Education",{"href":1098,"dataGaName":1099,"dataGaLocation":945},"/solutions/education/","education",{"text":1101,"config":1102},"Financial services",{"href":1103,"dataGaName":1104,"dataGaLocation":945},"/solutions/finance/","financial services",{"title":656,"links":1106},[1107,1109,1111,1113,1116,1118,1121,1123,1125,1127,1129,1131,1133,1135],{"text":669,"config":1108},{"href":671,"dataGaName":672,"dataGaLocation":945},{"text":674,"config":1110},{"href":676,"dataGaName":677,"dataGaLocation":945},{"text":679,"config":1112},{"href":681,"dataGaName":682,"dataGaLocation":945},{"text":684,"config":1114},{"href":686,"dataGaName":1115,"dataGaLocation":945},"docs",{"text":707,"config":1117},{"href":709,"dataGaName":710,"dataGaLocation":945},{"text":1119,"config":1120},"What's new",{"href":767,"dataGaName":768,"dataGaLocation":945},{"text":702,"config":1122},{"href":704,"dataGaName":705,"dataGaLocation":945},{"text":721,"config":1124},{"href":723,"dataGaName":724,"dataGaLocation":945},{"text":729,"config":1126},{"href":731,"dataGaName":732,"dataGaLocation":945},{"text":734,"config":1128},{"href":736,"dataGaName":737,"dataGaLocation":945},{"text":739,"config":1130},{"href":741,"dataGaName":742,"dataGaLocation":945},{"text":744,"config":1132},{"href":746,"dataGaName":747,"dataGaLocation":945},{"text":749,"config":1134},{"href":751,"dataGaName":752,"dataGaLocation":945},{"text":754,"config":1136},{"href":756,"dataGaName":757,"dataGaLocation":945},{"title":770,"links":1138},[1139,1141,1143,1145,1147,1149,1153,1158,1160,1162,1164],{"text":778,"config":1140},{"href":780,"dataGaName":772,"dataGaLocation":945},{"text":783,"config":1142},{"href":785,"dataGaName":786,"dataGaLocation":945},{"text":791,"config":1144},{"href":793,"dataGaName":794,"dataGaLocation":945},{"text":796,"config":1146},{"href":798,"dataGaName":799,"dataGaLocation":945},{"text":801,"config":1148},{"href":803,"dataGaName":804,"dataGaLocation":945},{"text":1150,"config":1151},"Sustainability",{"href":1152,"dataGaName":1150,"dataGaLocation":945},"/sustainability/",{"text":1154,"config":1155},"Diversity, inclusion and belonging (DIB)",{"href":1156,"dataGaName":1157,"dataGaLocation":945},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":806,"config":1159},{"href":808,"dataGaName":809,"dataGaLocation":945},{"text":816,"config":1161},{"href":818,"dataGaName":819,"dataGaLocation":945},{"text":821,"config":1163},{"href":823,"dataGaName":824,"dataGaLocation":945},{"text":1165,"config":1166},"Modern Slavery Transparency Statement",{"href":1167,"dataGaName":1168,"dataGaLocation":945},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":1170},[1171,1174,1177],{"text":1172,"config":1173},"Terms",{"href":996,"dataGaName":997,"dataGaLocation":945},{"text":1175,"config":1176},"Cookies",{"dataGaName":1006,"dataGaLocation":945,"id":1007,"isOneTrustButton":482},{"text":1178,"config":1179},"Privacy",{"href":1001,"dataGaName":1002,"dataGaLocation":945},[1181],{"id":1182,"title":1183,"body":481,"config":1184,"content":1186,"description":481,"extension":1190,"meta":1191,"navigation":482,"path":1192,"seo":1193,"stem":1194,"__hash__":1195},"blogAuthors/en-us/blog/authors/frdric-caplette.yml","Frdric Caplette",{"template":1185},"BlogAuthor",{"name":7,"config":1187},{"headshot":1188,"ctfId":1189},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749661878/Blog/Author%20Headshots/frederic_caplette_headshot.png","6nMRwNMwciKSX03zmbBbPF","yml",{},"/en-us/blog/authors/frdric-caplette",{},"en-us/blog/authors/frdric-caplette","NEPBj8Df9qxX7gfZg8cbtTIl5NPLv0sjx38oqd4zg3E",[1197,1205,1213],{"title":1198,"description":1199,"heroImage":1200,"category":477,"date":1201,"authors":1202,"slug":1204,"externalUrl":481},"How I built a demo generator with GitLab Duo Agent Platform","Demos haven't always looked like this. Looking back over my career, here's how they have evolved. Follow the tutorial to build your own demo and agent.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1765809212/noh0mdfn9o94ry9ykura.png","2026-08-13",[1203],"Itzik Gan Baruch","agentic-click-through-demo",{"title":1206,"description":1207,"heroImage":1208,"category":477,"date":1209,"authors":1210,"slug":1212,"externalUrl":481},"How to govern agentic AI, MCPs, and AI code assistants","AI agents can write, push, and deploy without human review at each step. Learn a practical framework for controlling access, permissions, and audit trails.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1785337625/ifzlc2hyzaxhzmjgyymh.png","2026-07-31",[1211],"Julie Griffin","govern-agentic-ai-mcps-code-assistants",{"title":1214,"description":1215,"heroImage":1216,"category":477,"date":1217,"authors":1218,"slug":1220,"externalUrl":481},"Claude Opus 5 on GitLab: Reasoning built for the hard tasks","Anthropic’s Claude Opus 5 is now available on GitLab Duo Agent Platform, delivering deeper reasoning without sacrificing speed.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1750099203/Blog/Hero%20Images/Blog/Hero%20Images/blog-image-template-1800x945%20%2820%29_2bJGC5ZP3WheoqzlLT05C5_1750099203484.png","2026-07-27",[1219],"Brittany Lutz","claude-opus-5-on-gitlab-duo-agent-platform",{"promotions":1222},[1223,1236,1248,1260],{"id":1224,"categories":1225,"header":1226,"text":1227,"button":1228,"image":1233},"ai-modernization",[477],"Is AI achieving its promise at scale?","Quiz will take 5 minutes or less",{"text":1229,"config":1230},"Get your AI maturity score",{"href":1231,"dataGaName":1232,"dataGaLocation":710},"/assessments/ai-modernization-assessment/","modernization assessment",{"config":1234},{"src":1235},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":1237,"categories":1238,"header":1240,"text":1227,"button":1241,"image":1245},"devops-modernization",[1239,1045],"product","Are you just managing tools or shipping innovation?",{"text":1242,"config":1243},"Get your DevOps maturity score",{"href":1244,"dataGaName":1232,"dataGaLocation":710},"/assessments/devops-modernization-assessment/",{"config":1246},{"src":1247},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":1249,"categories":1250,"header":1252,"text":1227,"button":1253,"image":1257},"security-modernization",[1251],"security","Are you trading speed for security?",{"text":1254,"config":1255},"Get your security maturity score",{"href":1256,"dataGaName":1232,"dataGaLocation":710},"/assessments/security-modernization-assessment/",{"config":1258},{"src":1259},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":1261,"paths":1262,"header":1265,"text":1266,"button":1267,"image":1272},"github-azure-migration",[1263,1264],"migration-from-azure-devops-to-gitlab","integrating-azure-devops-scm-and-gitlab","Is your team ready for GitHub's Azure move?","GitHub is already rebuilding around Azure. Find out what it means for you.",{"text":1268,"config":1269},"See how GitLab compares to GitHub",{"href":1270,"dataGaName":1271,"dataGaLocation":710},"/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":1273},{"src":1247},{"header":1275,"blurb":1276,"button":1277,"secondaryButton":1282},"Start building faster today","See what your team can do with the intelligent orchestration platform for DevSecOps.\n",{"text":1278,"config":1279},"Get your free trial",{"href":1280,"dataGaName":510,"dataGaLocation":1281},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":983,"config":1283},{"href":835,"dataGaName":515,"dataGaLocation":1281},1786803774210]