Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
107 changes: 94 additions & 13 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,20 +1,101 @@
<div align="center">
<img width="1200" height="475" alt="GHBanner" src="https://ai.google.dev/static/site-assets/images/share-ais-513315318.png" />
</div>
<p align="center">
<img src="public/gitbot-logo.svg" alt="GitBot logo" width="112" height="112" />
</p>

# Run and deploy your AI Studio app
<h1 align="center">GitBot</h1>

This contains everything you need to run your app locally.
<p align="center">
Nền tảng tự động hóa Pull Request, CI/CD và tài liệu vận hành dành cho đội kỹ thuật hiện đại.
</p>

View your app in AI Studio: https://ai.studio/apps/a18fb367-cc88-4c45-ad81-3a3786f4f2ce
<p align="center">
<a href="#-tổng-quan">Tổng quan</a> ·
<a href="#-tính-năng-chính">Tính năng</a> ·
<a href="#-kiến-trúc">Kiến trúc</a> ·
<a href="#-chạy-cục-bộ">Chạy cục bộ</a> ·
<a href="#-triển-khai-vercel">Vercel</a>
</p>

## Run Locally
---

**Prerequisites:** Node.js
## ✨ Tổng quan

**GitBot** là giao diện quản trị giúp nhóm phát triển theo dõi toàn bộ vòng đời Pull Request trong một workspace thống nhất: review diff, bình luận theo dòng, quan sát pipeline, đọc wiki nội bộ và kiểm tra readiness trước khi deploy.

1. Install dependencies:
`npm install`
2. Set the `GEMINI_API_KEY` in [.env.local](.env.local) to your Gemini API key
3. Run the app:
`npm run dev`
Thiết kế dự án tập trung vào ba nguyên tắc:

- **Tối giản:** thông tin quan trọng được ưu tiên, ít nhiễu thị giác.
- **Hiện đại:** dark UI cho app vận hành, wiki sáng sạch theo phong cách documentation hub.
- **Thực dụng:** mọi màn hình đều phục vụ trực tiếp cho review, CI/CD, bảo mật và rollout.

## 🚀 Tính năng chính

| Khu vực | Mô tả |
| --- | --- |
| Wiki | Trang giới thiệu tài liệu, mục lục, hướng dẫn CI/CD và checklist release. |
| Dashboard | KPI repository, PR, pipeline, diff stats và tín hiệu hệ thống. |
| Code Review | Xem diff, chọn file, gửi bình luận theo ngữ cảnh PR. |
| Pipeline | Theo dõi stage lint/test/build/deploy và trạng thái workflow. |
| Mobile Simulator | Kiểm tra trải nghiệm GitBot trên khung di động mô phỏng. |
| Command Palette | Điều hướng nhanh bằng `⌘K` / `Ctrl K`. |

## 🧭 Kiến trúc

```mermaid
flowchart LR
GitHub[GitHub Webhook] --> API[GitBot API]
API --> Runner[GitBot Runner]
API --> DB[(PostgreSQL)]
Runner --> CI[CI/CD Jobs]
API --> UI[React Workspace]
UI --> Wiki[Wiki & Dashboard]
```

## 🧩 Logo

Logo GitBot sử dụng biểu tượng robot kết hợp nhánh Git để thể hiện vai trò trợ lý tự động hóa kỹ thuật. Bảng màu xanh `sky` và `emerald` đồng bộ với giao diện sản phẩm, gợi cảm giác đáng tin cậy, realtime và thân thiện với developer.

- File logo: [`public/gitbot-logo.svg`](public/gitbot-logo.svg)
- Có thể dùng trực tiếp cho GitHub README, header web app, favicon hoặc tài liệu nội bộ.

## 🛠 Chạy cục bộ

```bash
npm install
npm run dev
Comment thread
Huynhthuongg marked this conversation as resolved.
```

Ứng dụng mặc định chạy tại:

```txt
http://localhost:3000
```

## 📦 Build production

```bash
npm run build
npm run start
```

## ▲ Triển khai Vercel

Dự án đã chuẩn bị UI và build Vite phù hợp cho triển khai production. Khi môi trường có quyền registry và token Vercel, có thể deploy bằng:

```bash
npx vercel --prod --yes
Comment thread
Huynhthuongg marked this conversation as resolved.
```

## 📚 Tài liệu trong app

Mở ứng dụng và chọn tab **Wiki** để xem trang giới thiệu tài liệu được thiết kế riêng cho GitBot, bao gồm:

1. Tổng quan dự án.
2. Bắt đầu nhanh.
3. Cấu hình `.gitbot-ci.yml` mẫu.
4. Quy ước review và release.
5. Checklist triển khai Vercel.

## 📄 License

Apache-2.0
3 changes: 3 additions & 0 deletions gitbot/frontend/.next/app-build-manifest.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"pages": {}
}
17 changes: 17 additions & 0 deletions gitbot/frontend/.next/build-manifest.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
{
"polyfillFiles": [
"static/chunks/polyfills.js"
],
"devFiles": [],
"ampDevFiles": [],
"lowPriorityFiles": [
"static/development/_buildManifest.js",
"static/development/_ssgManifest.js"
],
"rootMainFiles": [],
"rootMainFilesTree": {},
"pages": {
"/_app": []
},
"ampFirstPages": []
}
7 changes: 7 additions & 0 deletions gitbot/frontend/.next/cache/config.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"telemetry": {
"notifiedAt": "1780419628126",
"anonymousId": "e7099743ac30723305ab7580aff2ba7889abefe13da55e52568592b84f34a454",
Comment thread
Huynhthuongg marked this conversation as resolved.
"salt": "ef9ed5909cda44dbc6e286701b02cfd1"
}
}
1 change: 1 addition & 0 deletions gitbot/frontend/.next/cache/next-devtools-config.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{}
Binary file not shown.
Binary file not shown.
1 change: 1 addition & 0 deletions gitbot/frontend/.next/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"type": "commonjs"}
11 changes: 11 additions & 0 deletions gitbot/frontend/.next/prerender-manifest.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"version": 4,
"routes": {},
"dynamicRoutes": {},
"notFoundRoutes": [],
"preview": {
"previewModeId": "f9d7bfd052347c73e26ce4431647d6a5",
"previewModeSigningKey": "8abcf7940b0bde95158cc373ae80d66a55f6637655d312f3fe1e12faba40722d",
"previewModeEncryptionKey": "b0da285720eed0e4ca0a86942878b1b88e75c16cad5a0130524342bb03f7bb7f"
}
}
1 change: 1 addition & 0 deletions gitbot/frontend/.next/react-loadable-manifest.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{}
1 change: 1 addition & 0 deletions gitbot/frontend/.next/routes-manifest.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"version":3,"caseSensitive":false,"basePath":"","rewrites":{"beforeFiles":[],"afterFiles":[],"fallback":[]},"redirects":[{"source":"/:path+/","destination":"/:path+","permanent":true,"internal":true,"regex":"^(?:\\/((?:[^\\/]+?)(?:\\/(?:[^\\/]+?))*))\\/$"}],"headers":[]}
1 change: 1 addition & 0 deletions gitbot/frontend/.next/server/app-paths-manifest.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
self.__INTERCEPTION_ROUTE_REWRITE_MANIFEST="[]"
19 changes: 19 additions & 0 deletions gitbot/frontend/.next/server/middleware-build-manifest.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
globalThis.__BUILD_MANIFEST = {
"polyfillFiles": [
"static/chunks/polyfills.js"
],
"devFiles": [],
"ampDevFiles": [],
"lowPriorityFiles": [],
"rootMainFiles": [],
"rootMainFilesTree": {},
"pages": {
"/_app": []
},
"ampFirstPages": []
};
globalThis.__BUILD_MANIFEST.lowPriorityFiles = [
"/static/" + process.env.__NEXT_BUILD_ID + "/_buildManifest.js",
,"/static/" + process.env.__NEXT_BUILD_ID + "/_ssgManifest.js",

];
6 changes: 6 additions & 0 deletions gitbot/frontend/.next/server/middleware-manifest.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"version": 3,
"middleware": {},
"functions": {},
"sortedMiddleware": []
}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
self.__REACT_LOADABLE_MANIFEST="{}"
1 change: 1 addition & 0 deletions gitbot/frontend/.next/server/next-font-manifest.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions gitbot/frontend/.next/server/next-font-manifest.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"pages":{},"app":{},"appUsingSizeAdjust":false,"pagesUsingSizeAdjust":false}
1 change: 1 addition & 0 deletions gitbot/frontend/.next/server/pages-manifest.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{}
1 change: 1 addition & 0 deletions gitbot/frontend/.next/server/server-reference-manifest.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions gitbot/frontend/.next/server/server-reference-manifest.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"node": {},
"edge": {},
"encryptionKey": "0nCAvMbN/z64a9O4AmkkByLQJ3dwpKAZQRw4vuCnmvM="
}
1 change: 1 addition & 0 deletions gitbot/frontend/.next/static/chunks/polyfills.js

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions gitbot/frontend/.next/static/development/_buildManifest.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions gitbot/frontend/.next/static/development/_ssgManifest.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
self.__SSG_MANIFEST=new Set;self.__SSG_MANIFEST_CB&&self.__SSG_MANIFEST_CB()
3 changes: 3 additions & 0 deletions gitbot/frontend/.next/trace

Large diffs are not rendered by default.

141 changes: 141 additions & 0 deletions gitbot/frontend/.next/types/cache-life.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,141 @@
// Type definitions for Next.js cacheLife configs

declare module 'next/cache' {
export { unstable_cache } from 'next/dist/server/web/spec-extension/unstable-cache'
export {
revalidateTag,
revalidatePath,
unstable_expireTag,
unstable_expirePath,
} from 'next/dist/server/web/spec-extension/revalidate'
export { unstable_noStore } from 'next/dist/server/web/spec-extension/unstable-no-store'


/**
* Cache this `"use cache"` for a timespan defined by the `"default"` profile.
* ```
* stale: 300 seconds (5 minutes)
* revalidate: 900 seconds (15 minutes)
* expire: never
* ```
*
* This cache may be stale on clients for 5 minutes before checking with the server.
* If the server receives a new request after 15 minutes, start revalidating new values in the background.
* It lives for the maximum age of the server cache. If this entry has no traffic for a while, it may serve an old value the next request.
*/
export function unstable_cacheLife(profile: "default"): void

/**
* Cache this `"use cache"` for a timespan defined by the `"seconds"` profile.
* ```
* stale: 30 seconds
* revalidate: 1 seconds
* expire: 60 seconds (1 minute)
* ```
*
* This cache may be stale on clients for 30 seconds before checking with the server.
* If the server receives a new request after 1 seconds, start revalidating new values in the background.
* If this entry has no traffic for 1 minute it will expire. The next request will recompute it.
*/
export function unstable_cacheLife(profile: "seconds"): void

/**
* Cache this `"use cache"` for a timespan defined by the `"minutes"` profile.
* ```
* stale: 300 seconds (5 minutes)
* revalidate: 60 seconds (1 minute)
* expire: 3600 seconds (1 hour)
* ```
*
* This cache may be stale on clients for 5 minutes before checking with the server.
* If the server receives a new request after 1 minute, start revalidating new values in the background.
* If this entry has no traffic for 1 hour it will expire. The next request will recompute it.
*/
export function unstable_cacheLife(profile: "minutes"): void

/**
* Cache this `"use cache"` for a timespan defined by the `"hours"` profile.
* ```
* stale: 300 seconds (5 minutes)
* revalidate: 3600 seconds (1 hour)
* expire: 86400 seconds (1 day)
* ```
*
* This cache may be stale on clients for 5 minutes before checking with the server.
* If the server receives a new request after 1 hour, start revalidating new values in the background.
* If this entry has no traffic for 1 day it will expire. The next request will recompute it.
*/
export function unstable_cacheLife(profile: "hours"): void

/**
* Cache this `"use cache"` for a timespan defined by the `"days"` profile.
* ```
* stale: 300 seconds (5 minutes)
* revalidate: 86400 seconds (1 day)
* expire: 604800 seconds (1 week)
* ```
*
* This cache may be stale on clients for 5 minutes before checking with the server.
* If the server receives a new request after 1 day, start revalidating new values in the background.
* If this entry has no traffic for 1 week it will expire. The next request will recompute it.
*/
export function unstable_cacheLife(profile: "days"): void

/**
* Cache this `"use cache"` for a timespan defined by the `"weeks"` profile.
* ```
* stale: 300 seconds (5 minutes)
* revalidate: 604800 seconds (1 week)
* expire: 2592000 seconds (30 days)
* ```
*
* This cache may be stale on clients for 5 minutes before checking with the server.
* If the server receives a new request after 1 week, start revalidating new values in the background.
* If this entry has no traffic for 30 days it will expire. The next request will recompute it.
*/
export function unstable_cacheLife(profile: "weeks"): void

/**
* Cache this `"use cache"` for a timespan defined by the `"max"` profile.
* ```
* stale: 300 seconds (5 minutes)
* revalidate: 2592000 seconds (30 days)
* expire: never
* ```
*
* This cache may be stale on clients for 5 minutes before checking with the server.
* If the server receives a new request after 30 days, start revalidating new values in the background.
* It lives for the maximum age of the server cache. If this entry has no traffic for a while, it may serve an old value the next request.
*/
export function unstable_cacheLife(profile: "max"): void

/**
* Cache this `"use cache"` using a custom timespan.
* ```
* stale: ... // seconds
* revalidate: ... // seconds
* expire: ... // seconds
* ```
*
* This is similar to Cache-Control: max-age=`stale`,s-max-age=`revalidate`,stale-while-revalidate=`expire-revalidate`
*
* If a value is left out, the lowest of other cacheLife() calls or the default, is used instead.
*/
export function unstable_cacheLife(profile: {
/**
* This cache may be stale on clients for ... seconds before checking with the server.
*/
stale?: number,
/**
* If the server receives a new request after ... seconds, start revalidating new values in the background.
*/
revalidate?: number,
/**
* If this entry has no traffic for ... seconds it will expire. The next request will recompute it.
*/
expire?: number
}): void


export { cacheTag as unstable_cacheTag } from 'next/dist/server/use-cache/cache-tag'
}
1 change: 1 addition & 0 deletions gitbot/frontend/.next/types/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"type": "module"}
Loading