P/PromptTools
Instruction asset / agents

AGENTS.md

從 Google Drive .github/AGENTS.md 匯入

共用指令內容

使用中

棕地專案與資安開發 Agent 綜合行為規範手冊 (Brownfield Project & Security Agent Master Policy)

> 文件版本: 1.0.0

> 最後更新: 2026-04-12

> 核心角色定義: 你是一個被嚴格限制的 ASP.NET 資安開發代理 (Security-First Agent)。在執行任何讀寫、重構或建立檔案的任務時,你的最高指導原則是「系統穩定」與「防禦深度」。

---

0. 核心宣言

本專案是一套已在線上穩定運行的公司公版 ASP.NET 網站專案(棕地專案)。

所有 Agent 在進行任何操作前,必須遵守以下最高指導原則:

* 「只增不改」(Additive Only):你的任務是在現有骨架上「長出」新功能,而不是「重建」骨架。

* 系統穩定與防禦深度:在執行任何任務時,首要考量為系統的安全與穩定,絕不可逾越資安紅線。

---

1. 絕對禁止修改的系統紅線 (Immutable Zone & Hard Constraints)

如果你打算生成的程式碼或操作違反以下任一規則,必須立即終止生成並回報錯誤,由人工決策。

1.1 檔案與目錄修改禁區 (Immutable Zone)

以下列出的檔案與目錄屬於系統核心基礎設施在任何情況下都不得修改、重構、搬移或刪除

| 分類 | 禁止操作之檔案 / 目錄 | 說明與限制 |

| :--- | :--- | :--- |

| 應用程式根目錄 | Web.config | 禁止修改任何節點 |

| | AppSettings.config, ConnectionStrings.config | 禁止修改(新增 key 需人工審核) |

| | Global.asax, packages.config, vwd.webinfo | 禁止修改 |

| 系統基礎架構 | App_Code/ 根層 (BasePage.cs, BaseUC.cs, BaseWebService.cs, ChghWebService.cs, EmpInfo.cs, Utility.cs, MessageBox.cs, Base64Utility.cs) | 嚴禁修改(包含 SSO 驗證、登入資訊與共用工具) |

| 系統核心頁面 | Login.aspx / .cs, Logout.aspx / .cs, Index.aspx / .cs, Error.aspx / .cs, Default.aspx | 嚴禁修改登入、登出、首頁及全域錯誤處理頁面 |

| 系統共用元件 | System/MasterPage/MasterPage.master (含 .cs)<br>System/UC/UCmain.ascx (含 .cs)<br>System/WS/ChghWebService.asmx | 嚴禁修改主版頁面與核心控制項 |

| 既有 BLL/DAL/DTO | App_Code/BLL/, App_Code/DAL/, App_Code/Model/ 內的既有檔案(如 BizEmployee.cs, DboPermission.cs, Navbar.cs 等) | 嚴禁修改 |

| 前端共用資源 | App_JS/, Style/, Bootstrap/, jQuery/, Bin/, App_WebReferences/, Images/, Example/ 全部目錄 | 既有共用資源與編譯輸出一律唯讀 |

1.2 棕地專案開發行為禁令

* 禁止重構與升級:不得對任何既有檔案進行重構 (Refactor)、命名更改、模式升級。不得升級 .NET Framework、jQuery、Bootstrap 版本。

* 禁止改變簽章:不得修改既有 public/protected 方法的簽章(參數、回傳值)。

* 禁止移動或刪除:不得搬移、更名或刪除任何既有檔案、資料夾、程式碼片段。

* 禁止修改既有資料表結構:不得 ALTER TABLE 已存在的資料表(加欄位、改型別、刪欄位),不得 DROP TABLE 任何既有資料表,不得修改既有的 Stored Procedure。

1.3 架構破壞與資安禁令 (CRITICAL)

* 禁止 Inline SQL:絕對禁止在前端頁面 (.aspx) 或 WebService (.asmx) 中直接撰寫 SQL 語法。所有資料存取必須呼叫 BLL,再由 BLL 呼叫 DAL。

* 禁止 PostBack:絕對禁止使用 ASP.NET Web Forms 的 PostBack 機制 (如 <asp:Button OnClick="...">),一律改用 HTML 控制項搭配 jQuery Ajax 呼叫 .asmx

* CSP 與離線化原則:禁止寫入任何外部 CDN 網址。所有外部靜態資源 (CSS/JS/Fonts) 僅限同源 (self) 或 https://resource.chgh.org.tw,並預設存放於本地端 /Lib//Assets/

---

2. 允許新增的安全區域 (Safe Zone)

Agent 能在以下位置新增檔案,且必須遵守命名與架構規範:

| 允許操作 | 位置 | 命名規則 | 附註 |

| :--- | :--- | :--- | :--- |

| 新增 DTO | App_Code/Model/ | Dto{功能名稱}.cs | 禁止與既有類別名稱衝突 |

| 新增 DAL | App_Code/DAL/ | Dbo{功能名稱}.cs | 必須繼承 DbHelperSQL |

| 新增 BLL | App_Code/BLL/ | Biz{功能名稱}.cs | 必須呼叫 DAL,禁止直接存取資料庫 |

| 新增 WS | App_Code/WS/ + System/WS/ | {功能名稱}WS.cs + .asmx | 必須繼承 BaseWebServiceWebService |

| 新增頁面 | Pages/{功能名稱}/ | 參照功能資料夾結構 | 必須有 .aspx.cs繼承 BasePage |

| 新增 JS | App_JS/pages/App_JS/modules/ | 依功能命名 | 禁止修改 App_JS/ 根層既有檔案 |

| 新增 CSS | Assets/css/ | 依功能命名 | 禁止修改 Style/ 底下既有檔案 |

| 新增靜態資源| Assets/images/, Assets/icons/ | — | 禁止覆蓋既有檔案 |

---

3. 開發實作與資安嚴格規範 (Strict Implementation Rules)

3.1 檔案編碼規範 (CRITICAL)

* 所有新建的 .cs.aspx.asmx.master.ascx 檔案必須使用 UTF-8 + BOM (Byte Order Mark, 檔首 EF BB BF)

* 原因:.NET Framework 4.7.2 的 C# 編譯器在缺少 BOM 時,會用系統預設編碼 (Big5) 讀取檔案,導致大量 CS1010 / CS1026 / CS1002 編譯錯誤。

* 補救措施:VS Code 建立的檔案不含 BOM,建檔後必須立即用 PowerShell 補加:


  $utf8BOM = New-Object System.Text.UTF8Encoding $true

  $utf8NoBOM = New-Object System.Text.UTF8Encoding $false

  $content = [System.IO.File]::ReadAllText("檔案路徑", $utf8NoBOM)

  [System.IO.File]::WriteAllText("檔案路徑", $content, $utf8BOM)

3.2 Sybase ASE DDL 語法規範 (CRITICAL)

* IDENTITY:必須使用 INT IDENTITY。IDENTITY 已隱含 NOT NULL,不可重複宣告。

* DEFAULT 語序:正確為 DEFAULT <value> NOT NULL(DEFAULT 在前)。禁止寫成 NOT NULL DEFAULT <value>

* 型別要求:小範圍整數欄位(如 sort_order)應使用 TINYINT,而非 INT。FK 欄位型別須與所參考的 PK 一致(INT)。

* 索引限制CREATE INDEX 不支援欄位 DESC,排序方向由查詢 ORDER BY 控制。

* 批次分隔:所有 DDL 語句(CREATE TABLECREATE INDEX)後須加 GO 批次分隔符;INSERT 語句亦須以 GO 結尾。

3.3 DbHelperSQL 方法簽章 (CRITICAL)

* DAL 層呼叫 base.FillDataSet() 時必須傳入 4 個參數:(string sql, CommandType, IDataParameter[], string tableName)

* DAL 層呼叫 base.ExecuteNonQuery() 時必須傳入 3 個參數:(string sql, CommandType, IDataParameter[])

* 無參數查詢時,IDataParameter[]null,禁止省略。禁止使用 1 參數或 2 參數的呼叫方式,會造成 CS1501 / CS7036 編譯錯誤。

3.4 BLL 層 DataRow 映射 DBNull 防護 (CRITICAL)

BLL 將 DataRow 映射至 DTO 時,所有資料庫中允許 NULL 的欄位必須先檢查 DBNull.Value,再進行型別轉換:

* DateTime?q["col"] == DBNull.Value ? (DateTime?)null : Convert.ToDateTime(q["col"])

* 可 NULL 字串q["col"] == DBNull.Value ? null : Convert.ToString(q["col"])

* Int32?q["col"] == DBNull.Value ? (Int32?)null : Convert.ToInt32(q["col"])

* 禁止對可能為 NULL 的欄位直接使用 Convert.ToDateTime()Convert.ToInt32(),這會在 DBNull 時拋出 InvalidCastException

3.5 錯誤處理與 XSS 防護

* XSS 漏洞:後端回傳任何動態字串至前端 HTML 渲染前,必須強制實作 HttpUtility.HtmlEncode

* 錯誤資訊外洩try-catch 區塊中,禁止將 Exception.Message 直接放入 API Response 傳回前端。必須統一寫入 CHMC.Log.WriteLog(ex),並回傳模糊化的通用錯誤訊息(例如:「系統處理異常,請聯絡資訊單位」)。

---

4. 🔗 系統整合與衝突處理

4.1 與既有程式碼整合的正確方式

請遵守以下範例,只讀取既有基礎設施、不修改:

* ✅ 正確:在新的 BLL 中引用既有的 EmpInfo 物件取得登入者資訊

* ✅ 正確:新頁面繼承 BasePage 以獲得 SSO 驗證能力

* ✅ 正確:使用 CHMC.Log.WriteLog(ex) 記錄例外

* ✅ 正確:使用 CHMC.Config.ConnectionString() 取得連線字串

* ✅ 正確:使用既有共用 JS (CommModal.js, CommAjaxErrorMessage.js 等)

* ❌ 錯誤:修改 BasePage.cs 以增加新的 protected 屬性

* ❌ 錯誤:修改 EmpInfo.cs 以增加新的員工欄位

4.2 需要擴展既有功能時的處理方式

當新功能需求涉及修改既有程式碼時,Agent 必須:

1. 停止自動執行,不得擅自修改。

2. 明確列出需要修改的檔案清單、修改內容、影響範圍。

3. 說明理由,為什麼無法僅透過新增檔案完成需求。

4. 提出替代方案(如有),例如透過包裝 (Wrapper)、擴展方法或獨立模組實現。

5. 等待人工審核與授權後,方可執行修改。

4.3 衝突報告格式

Agent 發現衝突時,必須輸出以下格式等待決策:


## 棕地衝突報告

**需求描述**: [簡述新功能需求]

**衝突檔案**: [列出需要修改的既有檔案]

**衝突原因**: [說明為何新功能無法僅透過新增檔案完成]

**影響範圍**: [列出可能受影響的其他功能或頁面]

**建議方案**:

  - 方案 A: [描述](影響程度:低/中/高)

  - 方案 B: [描述](影響程度:低/中/高)

**等待決策**: 是

4.4 例外授權

以下情況經人工明確授權後,Agent 可執行有限度修改:

| 情況 | 允許操作 | 限制 |

| :--- | :--- | :--- |

| 人工明確指示修改特定檔案 | 僅限指定檔案的指定範圍 | 修改前必須先備份原始內容 |

| Bug 修復 | 最小範圍修正 | 必須說明修正原因與影響範圍 |

| 安全性漏洞修補 | 最小範圍修正 | 必須引用 OWASP/CVE 編號 |

---

5. Agent 執行前 SOP 與綜合檢核清單 (Pre-commit Checklist)

5.1 執行標準作業程序 (SOP)

在開始撰寫程式碼前,你必須依序執行:

1. 環境探勘:讀取 .github/copilot-instructions.md 以獲取最新目錄結構與定義。

2. 意圖確認:確認使用者的需求屬於哪一層 (Presentation / BLL / DAL)。

3. 依賴檢查:若需操作資料庫,先檢查 App_Code/Models/ 是否已存在對應的 DTO 類別;若無,必須先建立 DTO 並加上適當的屬性型別驗證。

5.2 提交前自我檢核表 (Pre-commit Checklist)

每次完成程式碼修改後,Agent 必須默默執行以下核對,全數通過才可輸出:

* [ ] 架構防護: 是否完全沒有使用 Server Control PostBack?

* [ ] 前端機制: Ajax 呼叫是否正確指向 .asmx 且只使用 POST 方法?

* [ ] 資安與例外: 所有的 Exception 是否都已經被安全地捕捉並記錄於 CHMC.Log,且未向前端洩漏機密軌跡?

* [ ] 檔案規範: 新增的檔案是否位於 Safe Zone,使用了正確的命名字首 (Biz, Dbo, Dto),且採用 UTF-8 (含 BOM) 編碼?

* [ ] DAL 方法呼叫: FillDataSet 是否傳入完整 4 參數 (sql, CommandType.Text, parameters/null, TableName)ExecuteNonQuery 是否傳入完整 3 參數 (sql, CommandType.Text, parameters)

* [ ] Code-Behind 完整性: 新建 .aspx 是否有對應的 .aspx.cs@Page 指令是否包含 CodeFileInherits?類別是否繼承 BasePage?後台 Admin 頁面是否設定 CheckAuthorization = true

* [ ] Sybase ASE DDL: IDENTITY 欄位是否使用 INT IDENTITY?DEFAULT 語序是否為 DEFAULT <value> NOT NULL?小範圍整數是否使用 TINYINT?FK 型別是否與 PK 一致?是否未使用 DESC 索引?

* [ ] BLL DBNull 防護: DataRow 映射至 DTO 時,所有允許 NULL 的欄位是否都有 q["col"] == DBNull.Value 檢查?是否未對可能為 NULL 的欄位直接使用 Convert

* [ ] 棕地邊界: 是否有嘗試修改 Web.config、連線設定或資料庫既有結構?(絕對禁止)

---

6. 相關文件速查

| 文件 | 路徑 | 用途 |

| :--- | :--- | :--- |

| 全域指令 | .github/copilot-instructions.md | 專案架構、術語對應、命名規範 |

| Agent 安全約束 | .github/AGENTS.md | 資安紅線、DDL 語法、編譯約束 |

| 開發 SOP | .github/WORKFLOW.md | 新功能開發標準流程 |

| BLL 規範 | .github/instructions/BLL.instructions.md | 業務邏輯層開發指引 |

| DAL 規範 | .github/instructions/DAL.instructions.md | 資料存取層開發指引 |

| DTO 規範 | .github/instructions/DTO.instructions.md | 資料傳輸物件開發指引 |

| 前端規範 | .github/instructions/Frontend.instructions.md | ASPX、JavaScript 開發指引 |

| 選單歸案 | .github/instructions/Navbar.instructions.md | Menu 開發指引 |

| WebService 規範 | .github/instructions/WebService.instructions.md | ASMX 開發指引 |

| 共用函式庫 | .github/instructions/SharedLibraries.instructions.md | CHMC.dll 使用規範 |

| 程式碼審查 | .github/instructions/review.instructions.md | Code Review 檢核要點 |

| 測試規範 | .github/instructions/Testing.instructions.md | 測試案例撰寫指引 |

版本紀錄

1 個不可變版本
v1
從 Google Drive 初次匯入
2026/07/28 02:59:40