Kĩ năng mềm

Tự Xây VS Code Extension Cho AI Agent PR: Hướng Dẫn 14 Bước Chuẩn 2026

Bước sang năm 2026, bức tranh phát triển phần mềm toàn cầu đã chứng kiến một bước ngoặt lịch sử: sự trỗi dậy ồ ạt của các lập trình viên trí tuệ nhân tạo tự hành (Autonomous Coding Agents). Không còn dừng lại ở việc gợi ý vài dòng code autocomplete như GitHub Copilot thuở sơ khai, các agent ngày nay có thể tự phân tích issue, tự tạo branch trên đám mây, tự sinh test case, và tự động mở hàng loạt Pull Request (PR) vào kho mã nguồn của dự án.

Bản phát hành VS Code 1.139.1 (tháng 9/2026) đã phải khẩn cấp bổ sung cơ chế tối ưu hóa danh sách phiên làm việc của Agent (large agent session lists) vì lập trình viên đang chạy quá nhiều bot cùng lúc trong các sandbox từ xa. Đồng thời, trình soạn thảo Cursor cũng tung ra hai siêu bot tự động là Rollouts (giám sát môi trường triển khai) và Security Review (tự động gắn cờ các lỗi bảo mật có thể bị khai thác). Tuy nhiên, một lỗ hổng trải nghiệm nghiêm trọng đã xuất hiện: chưa hề có một bảng điều khiển tập trung nào ngay trên thanh bên (sidebar) của trình soạn thảo để quản lý đồng bộ các phiên Agent, duyệt PR và cảnh báo rủi ro bảo mật.

Màn hình lập trình TypeScript xây dựng VS Code Extension

Dự Án Mã Nguồn Mở: `agent-pr-control-center`

Bộ tiện ích mở rộng chuẩn hóa cho cả hai nền tảng VS Code Extension và Cursor Extension. Tích hợp thanh Activity Bar tùy biến, 3 luồng Tree View trực quan, bảo mật mã khóa thông qua API SecretStorage và bảng điều khiển Webview có Content Security Policy nghiêm ngặt.

Chi phí xây dựng: 0₫ (100% Công Nghệ Chuẩn Microsoft & GitHub API)


📚 Tìm mua sách Lập Trình TypeScript Chuyên Sâu chính hãng trên Shopee

Góc nhìn kiến trúc sư phần mềm: Vì sao bạn phải làm chủ kỹ thuật này?

Dữ liệu khảo sát từ Stack Overflow Developer Survey chỉ ra rằng: 84% kỹ sư đã tích hợp AI vào quy trình, 31% chạy agent tự hành, nhưng có tới 46% kỹ sư không tin tưởng độ chính xác của mã do AI sinh ra, và 45% thừa nhận việc gỡ lỗi (debug) cho AI còn tốn thời gian hơn tự viết mã từ đầu! Việc làm chủ kỹ thuật AI Agent PR Review thông qua tiện ích mở rộng agent-pr-control-center sẽ trao lại cho bạn quyền kiểm soát tuyệt đối luồng code, bắt thóp các lỗ hổng SSRF, SQL Injection, rò rỉ token bí mật ngay trước khi mã được merge vào nhánh chính.

1. Kiến Trúc Dự Án: Bộ Điều Khiển Trung Tâm `agent-pr-control-center`

Trong các phiên bản trước đây, một VS Code Extension chỉ cần lắng nghe sự thay đổi của các tệp tin cục bộ trong thư mục làm việc (workspace). Nhưng với Autonomous Agent, mã nguồn có thể được chỉnh sửa trong một Dev Container trên đám mây, đẩy thẳng lên GitHub repository mà cửa sổ editor của bạn thậm chí còn không mở. Do đó, tiện ích mở rộng của chúng ta phải kết hợp dữ liệu runtime nội bộ và GitHub REST API từ xa:

Activity Bar Container (Robot Icon: "Agent PR Control")
├── [Tree View 1] Active Agent Sessions --> Quản lý trạng thái các phiên bot đang chạy
├── [Tree View 2] Open Pull Requests --> Lấy danh sách PR do Agent tạo qua GitHub API
└── [Tree View 3] Security Review --> Danh sách cảnh báo rủi ro bảo mật (SSRF, Token Leak)
└── Details Webview Panel --> Chi tiết dòng code dính lỗi với CSP cô lập
Thành phần cốt lõi Giải pháp kỹ thuật lựa chọn Lý do kiến trúc & Tối ưu hiệu năng
Truy vấn GitHub API Native `fetch` (Node 20+) Loại bỏ gói SDK cồng kềnh Octokit, giảm bundle size xuống 85%, thời gian nạp extension tức thì.
Sự kiện kích hoạt (Activation) `onStartupFinished` Tránh dùng wildcard (`*`) gây nghẽn tiến trình khởi động của VS Code và Cursor.
Lưu trữ khóa bí mật (PAT) `vscode.SecretStorage` Mã hóa qua hệ thống Keychain của OS, chống rò rỉ khi đồng bộ tài khoản hoặc vô tình commit code.
Môi trường hỗ trợ VS Code $ge$ 1.139.1 & Cursor (mới nhất) Tận dụng khả năng tương thích ngược của Cursor với VS Code Extension API.

2. Bảng Yêu Cầu Môi Trường Kỹ Thuật Đã Xác Thực (Prerequisites)

Trước khi bắt đầu gõ dòng lệnh đầu tiên, bạn cần đảm bảo môi trường runtime trên máy tính thỏa mãn các mốc phiên bản sau để tránh xung đột API:

Công cụ / Runtime Phiên bản tối thiểu Lệnh kiểm tra trên Terminal Mục đích sử dụng
VS Code / Cursor `1.139.1` / Bản mới nhất `code –version` Hỗ trợ tối ưu hóa danh sách phiên agent phiên bản mới
Node.js `20.x LTS` hoặc mới hơn `node –version` Cung cấp runtime native fetch và ES modules
npm `10.x` trở lên `npm –version` Trình quản lý gói phụ thuộc
generator-code `1.9.x` (Yeoman) `yo –version` Bộ khung scaffold extension chính thức từ Microsoft
vsce CLI `3.x` `vsce –version` Công cụ đóng gói file `.vsix` để phân phối
TypeScript `5.6+` `tsc –version` Trình biên dịch mã nguồn tĩnh an toàn

3. Hướng Dẫn Thực Chiến: 14 Bước Xây Dựng Extension Từ Số 0

Bước 1: Khởi tạo khung dự án với Yeoman Generator

Sử dụng bộ công cụ chính thức từ Microsoft để tạo khung dự án TypeScript tuân thủ chuẩn mới nhất. Mở Terminal và thực thi:

npm install -g yo generator-code
yo code

# Chọn các tùy chọn theo hướng dẫn sau:
# ? What type of extension do you want to create? New Extension (TypeScript)
# ? What's the name of your extension? agent-pr-control-center
# ? What's the identifier of your extension? agent-pr-control-center
# ? Bundle the source code with webpack? Yes (hoặc esbuild)
# ? Initialize a git repository? Yes
# ? Which package manager to use? npm

Sau khi quá trình tạo kết thúc, mở thư mục trong VS Code và nhấn phím F5 để khởi chạy Extension Development Host. Nếu nhìn thấy thông báo chào mừng mặc định, chuỗi công cụ phát triển của bạn đã sẵn sàng.

🎬 Video Thực Hành: Toàn Bộ Quy Trình Xây Dựng VS Code Extension Từ Số 0
Mở YouTube ↗

Bước 2: Định nghĩa Manifest và Đăng ký Sidebar (`package.json`)

Mở tệp `package.json` và cấu hình phần mở rộng đóng góp (contributes) để thêm biểu tượng robot vào thanh Activity Bar cùng 3 cây thư mục (Tree View):

{
"name": "agent-pr-control-center",
"displayName": "Agent PR Control Center",
"description": "Giám sát phiên làm việc của AI Agent, Pull Requests và lỗ hổng bảo mật tập trung",
"version": "0.1.0",
"engines": {
"vscode": "^1.139.0"
},
"activationEvents": [
"onStartupFinished"
],
"main": "./dist/extension.js",
"contributes": {
"viewsContainers": {
"activitybar": [
{
"id": "agentPrControlCenter",
"title": "Agent PR Control",
"icon": "media/robot.svg"
}
] },
"views": {
"agentPrControlCenter": [
{
"id": "agentSessions",
"name": "Active Agent Sessions"
},
{
"id": "pullRequests",
"name": "Open Pull Requests"
},
{
"id": "securityFindings",
"name": "Security Review Findings"
}
] },
"commands": [
{
"command": "agentPrControlCenter.refresh",
"title": "Làm mới dữ liệu Agent & PR",
"icon": "$(refresh)"
},
{
"command": "agentPrControlCenter.setToken",
"title": "Cấu hình GitHub Access Token"
}
] }
}
⚠️ Lưu ý về hiệu năng khởi động: Tuyệt đối không dùng `”activationEvents”: [“*”]`. Việc dùng wildcard sẽ ép extension phải tải vào bộ nhớ mỗi khi mở cửa sổ soạn thảo, gây giật lag trình biên mã. Khai báo `”onStartupFinished”` đảm bảo tiện ích chỉ nạp sau khi giao diện chính đã sẵn sàng.

Bước 3: Xây dựng Tree Data Provider cho Phiên Làm Việc Của Agent

Tạo tệp `src/providers/agentSessionProvider.ts` triển khai giao diện TreeDataProvider của VS Code để hiển thị danh sách các bot đang chạy:

import * as vscode from 'vscode';

export interface AgentSession {
id: string;
label: string;
branch: string;
status: 'running' | 'awaiting-review' | 'merged' | 'failed';
startedAt: number;
}

export class AgentSessionProvider implements vscode.TreeDataProvider<AgentSession> {
private _onDidChangeTreeData = new vscode.EventEmitter<AgentSession | undefined | void>();
readonly onDidChangeTreeData = this._onDidChangeTreeData.event;
private sessions: AgentSession[] = [];

refresh(sessions: AgentSession[]): void {
this.sessions = sessions;
this._onDidChangeTreeData.fire();
}

getTreeItem(element: AgentSession): vscode.TreeItem {
const item = new vscode.TreeItem(
`${element.label} [${element.branch}]`,
vscode.TreeItemCollapsibleState.None
);
item.description = element.status.toUpperCase();
item.iconPath = new vscode.ThemeIcon(
element.status === 'failed'
? 'error'
: element.status === 'merged'
? 'check'
: 'sync~spin'
);
item.tooltip = `Khởi tạo lúc: ${new Date(element.startedAt).toLocaleTimeString()}`;
return item;
}

getChildren(): AgentSession[] {
return this.sessions;
}
}

Bước 4: Kết nối GitHub REST API Bằng Native Fetch

Thay vì sử dụng bộ thư viện Octokit nặng nề, chúng ta tận dụng native `fetch` của Node.js để tối ưu hóa bộ nhớ:

export interface PullRequestItem {
id: number;
title: string;
author: string;
branch: string;
url: string;
draft: boolean;
}

export async function fetchOpenPullRequests(
owner: string,
repo: string,
token: string
): Promise<PullRequestItem[]> {
const response = await fetch(
`https://api.github.com/repos/${owner}/${repo}/pulls?state=open&per_page=30`,
{
headers: {
Authorization: `Bearer ${token}`,
Accept: 'application/vnd.github+json',
'X-GitHub-Api-Version': '2022-11-28'
}
}
);

if (!response.ok) {
throw new Error(`Lỗi GitHub API: ${response.status} ${response.statusText}`);
}

const pulls = (await response.json()) as any[];
return pulls.map((pr: any) => ({
id: pr.number,
title: pr.title,
author: pr.user.login,
branch: pr.head.ref,
url: pr.html_url,
draft: Boolean(pr.draft)
}));
}

Bước 5: Thiết lập Vòng Lặp Polling Tự Động & Nút Làm Mới Thủ Công

Trong hàm `activate` của `src/extension.ts`, chúng ta khởi tạo bộ đếm thời gian `setInterval` với tần suất mặc định 60 giây một lần, đồng thời đăng ký lệnh `agentPrControlCenter.refresh` để lập trình viên có thể click vào icon làm mới trên thanh tiêu đề sidebar bất kỳ lúc nào.

Bước 6 & 7: Xây dựng Webview Hiển Thị Chi Tiết & Khóa Chặt Bảo Mật CSP

Khi xem nội dung phản biện của AI Agent hoặc thông báo rủi ro bảo mật (như lỗ hổng SSRF, SQL Injection), việc render mã HTML bên ngoài mà không bảo vệ sẽ khiến tiện ích đối mặt nguy cơ Cross-Site Scripting (XSS). Ta bắt buộc phải áp dụng thẻ Content Security Policy nghiêm ngặt:

<!-- Thiết lập Content-Security-Policy cô lập hoàn toàn môi trường Webview -->
<meta http-equiv="Content-Security-Policy"
content="default-src 'none'; style-src ${webview.cspSource} 'unsafe-inline'; script-src 'nonce-${nonce}';">

Bước 8: Quản Trị Khóa Bí Mật Tuyệt Đối Với `SecretStorage`

Một sai lầm kinh điển của các lập trình viên mới viết extension là lưu GitHub Personal Access Token (PAT) trong file `settings.json`. Điều này cực kỳ nguy hiểm vì cài đặt có thể bị đồng bộ lên đám mây hoặc vô tình lộ trong video chia sẻ màn hình. Giải pháp chuẩn mực là sử dụng API SecretStorage của VS Code:

export class AuthManager {
private secretStorage: vscode.SecretStorage;
private readonly TOKEN_KEY = 'agent_pr_github_token';

constructor(context: vscode.ExtensionContext) {
this.secretStorage = context.secrets;
}

async setToken(token: string): Promise<void> {
await this.secretStorage.store(this.TOKEN_KEY, token);
}

async getToken(): Promise<string | undefined> {
return await this.secretStorage.get(this.TOKEN_KEY);
}

async promptUserForToken(): Promise<void> {
const token = await vscode.window.showInputBox({
prompt: 'Nhập GitHub Personal Access Token (PAT) có quyền đọc Pull Request',
password: true,
ignoreFocusOut: true
});
if (token) {
await this.setToken(token);
vscode.window.showInformationMessage('Đã lưu GitHub Token vào SecretStorage an toàn!');
}
}
}

💡 Cơ chế hoạt động của SecretStorage: Dưới tầng hệ điều hành, SecretStorage sẽ gọi thẳng tới macOS Keychain, Windows Credential Manager, hoặc GNOME Keyring/KWallet trên Linux. Toàn bộ chuỗi mã khóa được mã hóa bất đối xứng ở mức phần cứng và không bao giờ lưu trữ dưới dạng văn bản thô trên ổ cứng.

Bước 9: Tích Hợp Mô-đun Tùy Chọn Cursor Rollouts & Security Review

Nếu nhóm kỹ sư của bạn sử dụng phiên bản Cursor Teams/Enterprise, tiện ích sẽ tự động truy vấn endpoint trạng thái bot của Cursor để hiển thị trực quan các kiểm tra lỗ hổng tự động:

  • Injection Flaws: Quét các lệnh shell không an toàn được AI Agent đưa vào script CI/CD.
  • Committed Secrets: Cảnh báo tức thì nếu Agent vô tình nhúng API Key của OpenAI hoặc Anthropic vào file code.
  • Degrade Gracefully: Trong trường hợp dự án chạy trên VS Code thuần túy hoặc tài khoản Cursor cá nhân miễn phí, tiện ích sẽ tự động fallback về danh sách kiểm tra GitHub PR Check-runs chuẩn mà không nảy sinh bất kỳ lỗi crash nào.

Bước 10 – 14: Thử Nghiệm, Đóng Gói Và Phát Hành Lên Marketplace

Bước Thao tác thực hiện Lệnh thực thi & Công cụ Kết quả đạt được
Bước 10 Kiểm thử cục bộ Phím `F5` (Extension Development Host) Chạy thử nghiệm trên một GitHub repo thực tế có PR mở.
Bước 11 Đóng gói tệp cài đặt `vsce package` Sinh ra tệp đóng gói `agent-pr-control-center-0.1.0.vsix`.
Bước 12 Tự động hóa CI/CD GitHub Actions (`.github/workflows/build.yml`) Tự động chạy typecheck, linter và build file `.vsix` khi đẩy git tag.
Bước 13 Phát hành toàn cầu `vsce publish` & `ovsx publish` Xuất bản lên Visual Studio Marketplace và Open VSX Registry (cho VSCodium).
Bước 14 Kiểm thử đơn vị (Unit Test) `@vscode/test-electron` + Mocha Kiểm tra tính chính xác của hàm render cây thư mục TreeItem.


⌨ Nâng cấp Bàn Phím Cơ Chuyên Lập Trình Giúp Tăng Tốc Độ Gõ Code Trên Shopee

4. Lưu Ý Sống Còn Cho Môi Trường Production

Kiểm soát hạn mức GitHub API Rate Limiting

Khi xác thực bằng Personal Access Token, GitHub chỉ cấp cho bạn hạn ngạch 5.000 requests/giờ. Nếu đội ngũ của bạn theo dõi một repository có hàng trăm PR và đặt thời gian polling quá ngắn (ví dụ 5 giây), hạn ngạch sẽ bị cạn kiệt chỉ sau vài chục phút. Bạn luôn phải đọc hai header phản hồi:

  • x-ratelimit-remaining: Số lượt request còn lại trong khung giờ.
  • x-ratelimit-reset: Dấu thời gian Unix thời điểm hạn ngạch được làm mới.

Khi bắt gặp mã lỗi `403 Forbidden`, tiện ích cần kích hoạt thuật toán Exponential Backoff (tự động nhân đôi thời gian chờ) thay vì liên tục dội request làm nghẽn mạng.

Mở rộng năng lực qua Language Model Tools API

Trong các phiên bản VS Code 1.138+ và 2026, Microsoft đã chính thức cung cấp API `vscode.lm.registerTool`. Điều này mở ra khả năng cực kỳ ấn tượng: Bạn có thể đăng ký các hàm của `agent-pr-control-center` làm công cụ cho GitHub Copilot Chat hoặc Claude. Nhờ đó, kỹ sư chỉ cần gõ vào khung chat tự nhiên: “@pr-center hãy kiểm tra xem có PR nào của Agent đang dính lỗi bảo mật không?” và mô hình ngôn ngữ lớn sẽ tự động gọi extension để trả lời!

5. Câu Hỏi Thường Gặp Của Lập Trình Viên (FAQ)

Hỏi: Extension này có theo dõi được nhiều repository cùng lúc không?

Kỹ sư trả lời: Hoàn toàn được. Trong schema cài đặt `package.json`, bạn có thể đổi trường `agentPrControlCenter.repository` từ kiểu `string` sang mảng chuỗi `string[]`. Vòng lặp truy vấn sẽ thực thi song song qua `Promise.allSettled` để gom toàn bộ PR từ các repo vào một cây hiển thị duy nhất.

Hỏi: Tiện ích này có gây nguy hiểm khi đọc dữ liệu từ kho mã nguồn riêng tư (Private Repo) không?

Kỹ sư trả lời: Rất an toàn, bởi vì mã nguồn extension hoàn toàn do bạn kiểm soát và chạy 100% ở phía client máy trạm. Token được lưu trữ bằng SecretStorage mã hóa phần cứng và chỉ thực hiện request HTTPS trực tiếp tới domain `api.github.com`, không hề gửi dữ liệu qua bất kỳ máy chủ trung gian nào của bên thứ ba.

Hỏi: Mất bao nhiêu thời gian để một lập trình viên hoàn thành toàn bộ 14 bước này?

Kỹ sư trả lời: Với một kỹ sư đã có nền tảng TypeScript cơ bản, bạn chỉ mất từ 3 đến 5 tiếng để hoàn thành từ khâu dựng dự án đến khi chạy mượt mà trong Extension Host. Việc cấu hình GitHub Actions CI/CD và đăng ký tài khoản Publisher trên Marketplace sẽ mất thêm khoảng 1 đến 2 ngày chờ Microsoft duyệt tài khoản.

6. Lời Kết: Định Hình Tương Lai Kỹ Thuật Lập Trình 2026

Làn sóng AI Agent đang thay đổi tận gốc phương thức viết phần mềm. Từ vị thế của người trực tiếp gõ từng phím code, người lập trình viên đang nhanh chóng chuyển mình thành người chỉ huy và giám sát chất lượng hệ thống (AI Code Orchestrator). Việc tự tay xây dựng một VS Code Extension và Cursor Extension mang tên agent-pr-control-center không chỉ giúp bạn làm chủ quy trình kiểm duyệt AI Agent PR Review, mà còn là bước tiến vững chắc đưa kỹ năng kỹ thuật của bạn dẫn đầu xu thế công nghệ kỷ nguyên mới.

Nguồn dữ liệu & tài liệu kỹ thuật tham khảo:

  • Tech Insider: Build a VS Code Extension for AI Agent PRs: 14 Steps [2026] by Nadia Dubois (September 27, 2026) https://tech-insider.org/vscode-extension-ai-agent-pr-review-tutorial-2026/
  • Microsoft Visual Studio Code API Reference: TreeView API, Webview Guidelines and SecretStorage Specifications (v1.139.1).
  • Cursor AI Documentation: Rollouts Bot deployment telemetry and Automated Security Review endpoint schemas for enterprise environments.
  • Stack Overflow Annual Developer Survey: Statistical report on AI tool adoption, trust gaps, and autonomous coding agents debugging benchmarks.
  • GitHub REST API Documentation: Pull Requests endpoints, Fine-grained Personal Access Tokens and Rate Limit headers guideline.
  • OpenVSX Registry & vsce CLI: Community packaging standards and multi-marketplace continuous deployment workflows.
Back to top button