TL;DR
從實際代碼自動提取「規範(AGENTS.md)」(編碼),再從該規範生成代碼(解碼),並通過差異和測試進行評估——將這一往返(Round-Trip)整合進CI中,可以持續最小化需求與實作之間的差距。實務上結合如Spec Kit等的需求驅動工具、Docs-as-Code、OpenAPI代碼生成、ADR(MADR)是可行的。 (The GitHub Blog)
┌─────────────┐ 編碼 ┌─────────────┐
│ 代碼庫 │ ─────────────▶ │ AGENTS.md │
└─────────────┘ └─────────────┘
▲ │
│ 解碼 │
└─────────────◀────────────────┘
(通過測試&差異評估生成代碼)
git diff
的行數、Linter/類型檢查錯誤數、單元/契約測試失敗數等總和作為重構誤差來最小化。# AGENTS.md
## 專案概述
- 目的:將圖片在專輯中進行整理的Web應用
- 非功能性:優先考量本地運行,啟動在10秒內,必須有E2E測試
## 設置 & 執行
- 依賴:`pnpm install`
- 開發伺服器:`pnpm dev`
- 正式建置:`pnpm build`
- 測試:`pnpm test`
## 代碼規範
- TypeScript + ESLint + Prettier
- 未使用React的Server Components
## 重要命令
- Lint:`pnpm lint`
- 類型檢查:`pnpm typecheck`
## 生成任務的期待
- 新功能必須首先添加單元測試
- 現有API需遵循OpenAPI架構
規範的重點不在於「面向人類的README」,而是面向代理的步驟與限制。建議將AGENTS.md放在庫的根目錄下。 (Agents)
package.json
/ pyproject.toml
/ Makefile
/ docker-compose.yml
/ README
/ CI設置(如GitHub Actions),提取啟動、建置、測試、Lint的步驟。// scripts/encode-to-agents.ts
import fs from "node:fs";
import path from "node:path";
function readIf(p: string) { try { return fs.readFileSync(p, "utf8"); } catch { return ""; } }
const pkg = JSON.parse(readIf("package.json") || "{}");
const scripts = pkg.scripts ?? {};
const template = `# AGENTS.md
## 設置 & 執行
${scripts.install ? `- 依賴:\`${scripts.install}\`` : "- 依賴:`npm ci`"}
${scripts.dev ? `- 開發伺服器:\`${scripts.dev}\`` : ""}
${scripts.build ? `- 正式建置:\`${scripts.build}\`` : ""}
${scripts.test ? `- 測試:\`${scripts.test}\`` : ""}
${scripts.lint ? `- Lint:\`${scripts.lint}\`` : ""}
${scripts.typecheck ? `- 類型檢查:\`${scripts.typecheck}\`` : ""}
## API/契約
- OpenAPI: ${fs.existsSync("openapi.yaml") ? "openapi.yaml" : "未定義(要生成)"}
## ADR
${fs.existsSync("docs/adr") ? "- MADR 存在(docs/adr 下)" : "- ADR 未整備"}
## 代碼規範
- ${fs.existsSync(".eslintrc") ? "ESLint" : "ESLint 未設定"}
- ${fs.existsSync(".prettierrc") ? "Prettier" : "Prettier 未設定"}
`;
fs.writeFileSync("AGENTS.md", template);
console.log("AGENTS.md 已生成。");
# 初始化專案(可選擇代理)
uvx --from git+https://github.com/github/spec-kit.git specify init my-app --ai claude
# 撰寫規範(/specify, /plan, /tasks 是代理的擴展命令)
# 在/specify中提出功能需求,/plan中確定技術方針,/tasks中同意實作任務
Spec Kit強調「規範→計畫→任務→實作」的階段性精緻化。 (GitHub)
# 例:利用OpenAPI Generator生成TypeScript客戶端
npx @openapitools/openapi-generator-cli generate \
-i openapi.yaml -g typescript-fetch -o ./generated/api-client
可從OpenAPI自動生成客戶端/伺服器存根/文檔,以抑制契約與實作之間的漂移。 (GitHub)
在CI中執行編碼→解碼,並匯總以下內容以最小化「損失」:
git diff --shortstat
的變更行數(需求與實作之間的差距)例:GitHub Actions(擬似)
name: roundtrip
on: [push, pull_request]
jobs:
roundtrip:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: 編碼 (代碼 -> AGENTS.md)
run: node scripts/encode-to-agents.ts
- name: 解碼 (AGENTS.md -> 代碼)
run: |
uvx --from git+https://github.com/github/spec-kit.git specify check
# 將AGENTS.md傳遞給生成器以更新實作(具體依賴于工具)
- name: 測試 & 契約檢查
run: |
pnpm i
pnpm lint || true
pnpm typecheck || true
pnpm test -- --reporter=junit || true
npx openapi-diff ./openapi.yaml ./generated/openapi.yaml || true
- name: 計算重構損失
run: |
CHANGES=$(git diff --shortstat | awk '{print $4}')
LINT=$(jq '.summary.errorCount' ./eslint-report.json 2>/dev/null || echo 0)
FAIL=$(grep -c "<failure" junit.xml 2>/dev/null || echo 0)
LOSS=$(( CHANGES + LINT + FAIL ))
echo "LOSS=$LOSS" >> $GITHUB_OUTPUT
- name: 損失過高時失敗
run: test "${{ steps.roundtrip.outputs.LOSS }}" -le 20
CLAUDE.md
等進行 導向至AGENTS.md的重定向以合併。 (Builder.io).
├─ AGENTS.md
├─ README.md
├─ openapi.yaml
├─ docs/
│ └─ adr/ # MADR模板的ADR
├─ src/
├─ tests/
├─ scripts/
│ └─ encode-to-agents.ts
└─ .github/workflows/roundtrip.yml
希望這篇文章能對您團隊導入以需求為中心的“往返可行”開發流程有所幫助。