create-agentic-dev-env 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +79 -0
- package/bin/create.js +44 -0
- package/lib/runner.js +117 -0
- package/package.json +35 -0
- package/template/CLAUDE.md +15 -0
- package/template/README.md +72 -0
- package/template/claude-md/section.md +26 -0
- package/template/cli.js +2 -0
- package/template/dot-claude/skills/ade-create-prd/SKILL.md +23 -0
- package/template/dot-claude/skills/ade-feedback-upstream/SKILL.md +20 -0
- package/template/dot-claude/skills/ade-prd-to-spec/SKILL.md +23 -0
- package/template/gitignore +1 -0
- package/template/knowledge/README.md +27 -0
- package/template/knowledge/prd/README.md +7 -0
- package/template/knowledge/prd/_template.md +33 -0
- package/template/knowledge/process/README.md +5 -0
- package/template/knowledge/services/_template.yaml +21 -0
- package/template/knowledge/services/index.md +10 -0
- package/template/knowledge/specs/README.md +19 -0
- package/template/package.json +18 -0
- package/template/skills/ade-add-service/SKILL.md +13 -0
- package/template/skills/ade-align-spec/SKILL.md +21 -0
- package/template/skills/ade-contribute/SKILL.md +19 -0
- package/template/skills/ade-spec-audit/SKILL.md +17 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Frank Lin
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
# create-agentic-dev-env
|
|
2
|
+
|
|
3
|
+
為團隊打造 **Agentic Dev Environment(ADE)**:一個集中管理 domain 知識、流程知識、產品規格的知識庫 repo,讓 AI agent 在任何工作目錄都能取用團隊 knowhow、自主拉取服務進行開發,並把新知識持續回流——團隊的知識從「散落在成員腦中」變成「持久化、可迭代的資產」。
|
|
4
|
+
|
|
5
|
+
## 運作模式
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
┌──────────────────┐ pnpm dlx … init/update ┌──────────────────────┐
|
|
9
|
+
│ ADE repo (xxx) │ ──────────────────────────▶ │ 工作目錄 (hub) │
|
|
10
|
+
│ 你團隊的知識庫 │ │ CLAUDE.md + skills │
|
|
11
|
+
│ knowledge/ │ ◀────────────────────────── │ workspaces/服務A │
|
|
12
|
+
│ skills/ │ contribute PR 回流 │ workspaces/服務B │
|
|
13
|
+
└──────────────────┘ └──────────────────────┘
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
- **ADE repo**:每間公司/專案一個 private git repo,集中存放服務 registry、流程知識、規格與 PRD
|
|
17
|
+
- **工作目錄**:任意目錄跑 `init` 即成為 agent 工作站;agent 讀服務總覽 → clone 服務到 `workspaces/` → 開發
|
|
18
|
+
- **回流**:agent 發現知識過期或缺漏時,由內建 skill 引導開 PR 回 ADE repo,人只負責 review
|
|
19
|
+
|
|
20
|
+
## 快速開始
|
|
21
|
+
|
|
22
|
+
```sh
|
|
23
|
+
# 1. 建立你的 ADE repo
|
|
24
|
+
pnpm dlx create-agentic-dev-env my-ade
|
|
25
|
+
|
|
26
|
+
# 2. 填 my-ade/package.json 的 repository.url,開始填 knowledge/,push 到 GitHub/GitLab
|
|
27
|
+
|
|
28
|
+
# 3. 團隊成員在任一工作目錄安裝(SSH 設定見生成的 README)
|
|
29
|
+
pnpm dlx "git+ssh://git@github.com/ORG/my-ade.git" init
|
|
30
|
+
|
|
31
|
+
# 4. 之後拉取最新知識
|
|
32
|
+
pnpm dlx "git+ssh://git@github.com/ORG/my-ade.git" update
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
`init` 之後的工作目錄:
|
|
36
|
+
|
|
37
|
+
```
|
|
38
|
+
work-dir/
|
|
39
|
+
├── CLAUDE.md # 原有內容不動,插入 <!-- ADE:BEGIN/END --> managed 區段
|
|
40
|
+
├── .claude/
|
|
41
|
+
│ ├── skills/ade-*/ # managed,update 整目錄覆蓋
|
|
42
|
+
│ └── ade/knowledge/ # 知識庫副本
|
|
43
|
+
├── .ade.json # 來源 git url + commit(保鮮檢查用)
|
|
44
|
+
└── workspaces/ # agent clone 服務 repo 的作業區(自動 gitignore)
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## ADE repo 內容
|
|
48
|
+
|
|
49
|
+
```
|
|
50
|
+
knowledge/
|
|
51
|
+
├── README.md # 知識分層規則(canonical)
|
|
52
|
+
├── services/ # 服務 registry:index.md 總覽導航 + 一服務一份 YAML
|
|
53
|
+
├── process/ # 跨服務的團隊流程知識
|
|
54
|
+
├── specs/ # 當前功能規格,持續迭代的真相來源
|
|
55
|
+
└── prd/ # 一次開發一檔的需求文件,歷史文件不迭代
|
|
56
|
+
skills/ # init 時注入工作目錄(contribute / add-service / align-spec / spec-audit)
|
|
57
|
+
.claude/skills/ # 在 ADE repo 內工作用(create-prd / prd-to-spec / feedback-upstream)
|
|
58
|
+
claude-md/ # CLAUDE.md managed 區段的內容
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
### 設計重點
|
|
62
|
+
|
|
63
|
+
- **服務 registry 兩層結構**:`index.md` 是全服務概覽(模擬工程師「先總覽定位、再查細節」的認知路徑),每個服務一份 YAML 記錄 repo 位址、技術棧、依賴關係——agent 據此自主 clone 與開發
|
|
64
|
+
- **知識分層**:ADE 只收「跨服務知識、取得服務的最小資訊、產品規格」三類;bootstrap 流程與服務內部慣例歸服務 repo 自己的文件,不複製會過期的副本
|
|
65
|
+
- **PRD → Spec 生命週期**:PO 用 skill 建標準化 PRD(含盲點拷問)→ 轉入 spec 並標 `🚧 尚未實作` → RD 開發完成後由 skill 核對實作、移除標記、開 PR 收尾
|
|
66
|
+
- **Managed 區塊覆蓋**:工作目錄裡的 ADE 內容視同唯讀,`update` 無條件覆蓋——想改就回 ADE repo 開 PR,強迫知識回流中央
|
|
67
|
+
- **機制回饋上游**:各 ADE repo 演化出的 skill/模板改良,由 `ade-feedback-upstream` skill 開 PR 回本專案(只回饋機制,公司知識絕不外流)
|
|
68
|
+
|
|
69
|
+
## 開發
|
|
70
|
+
|
|
71
|
+
```sh
|
|
72
|
+
node test.js # 端到端自測:create → init → update
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
零依賴、純 Node(>= 20)。架構與維護紀律見 [AGENTS.md](./AGENTS.md)。
|
|
76
|
+
|
|
77
|
+
## License
|
|
78
|
+
|
|
79
|
+
[MIT](./LICENSE)
|
package/bin/create.js
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
const fs = require('fs')
|
|
3
|
+
const path = require('path')
|
|
4
|
+
const { execSync } = require('child_process')
|
|
5
|
+
|
|
6
|
+
const name = process.argv[2]
|
|
7
|
+
if (!name || !/^[a-z0-9][a-z0-9._-]*$/i.test(name)) {
|
|
8
|
+
console.error('用法: create-agentic-dev-env <repo-name>')
|
|
9
|
+
process.exit(1)
|
|
10
|
+
}
|
|
11
|
+
const dest = path.resolve(name)
|
|
12
|
+
if (fs.existsSync(dest)) {
|
|
13
|
+
console.error(`${name} 已存在`)
|
|
14
|
+
process.exit(1)
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
fs.cpSync(path.join(__dirname, '..', 'template'), dest, { recursive: true })
|
|
18
|
+
// npm publish 會剝掉 dot 開頭的檔案/目錄,template 內以無點名稱存放,複製後改名
|
|
19
|
+
fs.renameSync(path.join(dest, 'gitignore'), path.join(dest, '.gitignore'))
|
|
20
|
+
fs.renameSync(path.join(dest, 'dot-claude'), path.join(dest, '.claude'))
|
|
21
|
+
for (const rel of fs.readdirSync(dest, { recursive: true })) {
|
|
22
|
+
const p = path.join(dest, rel)
|
|
23
|
+
if (!fs.statSync(p).isFile()) continue
|
|
24
|
+
const s = fs.readFileSync(p, 'utf8')
|
|
25
|
+
if (s.includes('__ADE_NAME__')) fs.writeFileSync(p, s.replaceAll('__ADE_NAME__', name))
|
|
26
|
+
}
|
|
27
|
+
// 記錄上游位址,供 ade-feedback-upstream skill 回饋機制改良
|
|
28
|
+
let selfRepo = (require('../package.json').repository || {}).url || null
|
|
29
|
+
if (selfRepo && selfRepo.includes('FILL_ME')) selfRepo = null
|
|
30
|
+
const destPkgPath = path.join(dest, 'package.json')
|
|
31
|
+
const destPkg = JSON.parse(fs.readFileSync(destPkgPath, 'utf8'))
|
|
32
|
+
destPkg.ade.upstream = selfRepo ? selfRepo.replace(/^git\+/, '') : null
|
|
33
|
+
fs.writeFileSync(destPkgPath, JSON.stringify(destPkg, null, 2) + '\n')
|
|
34
|
+
|
|
35
|
+
execSync('git init', { cwd: dest, stdio: 'inherit' })
|
|
36
|
+
|
|
37
|
+
console.log(`
|
|
38
|
+
已建立 ADE repo: ${name}/
|
|
39
|
+
|
|
40
|
+
下一步:
|
|
41
|
+
1. 填 ${name}/package.json 的 repository.url
|
|
42
|
+
2. 開始填 knowledge/(服務格式見 knowledge/services/_template.md)
|
|
43
|
+
3. push 後團隊即可: pnpm dlx github:ORG/${name} init
|
|
44
|
+
`)
|
package/lib/runner.js
ADDED
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
const fs = require('fs')
|
|
2
|
+
const path = require('path')
|
|
3
|
+
const os = require('os')
|
|
4
|
+
const { execSync } = require('child_process')
|
|
5
|
+
|
|
6
|
+
const BEGIN = '<!-- ADE:BEGIN -->'
|
|
7
|
+
const END = '<!-- ADE:END -->'
|
|
8
|
+
|
|
9
|
+
function run(cmd, pkgDir) {
|
|
10
|
+
try {
|
|
11
|
+
if (cmd === 'init') init(process.cwd(), pkgDir)
|
|
12
|
+
else if (cmd === 'update') update(process.cwd())
|
|
13
|
+
else {
|
|
14
|
+
console.error('用法: init | update')
|
|
15
|
+
process.exit(1)
|
|
16
|
+
}
|
|
17
|
+
} catch (e) {
|
|
18
|
+
console.error(e.message)
|
|
19
|
+
process.exit(1)
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
function init(cwd, srcDir) {
|
|
24
|
+
if (fs.existsSync(path.join(cwd, '.ade.json'))) {
|
|
25
|
+
throw new Error('此目錄已 init 過,請改用 update')
|
|
26
|
+
}
|
|
27
|
+
install(cwd, srcDir)
|
|
28
|
+
console.log('ADE init 完成')
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function update(cwd) {
|
|
32
|
+
const cfgPath = path.join(cwd, '.ade.json')
|
|
33
|
+
if (!fs.existsSync(cfgPath)) throw new Error('此目錄尚未 init')
|
|
34
|
+
const cfg = JSON.parse(fs.readFileSync(cfgPath, 'utf8'))
|
|
35
|
+
if (!cfg.source) throw new Error('.ade.json 缺少 source(ADE repo 的 git url),請補上後重試')
|
|
36
|
+
|
|
37
|
+
// pnpm dlx 有快取(預設 ~24h),cli.js 所在的套件目錄可能是舊版內容;
|
|
38
|
+
// update 的任務是拿最新知識,因此一律無視 pkgDir、自行 clone source
|
|
39
|
+
const tmp = fs.mkdtempSync(path.join(os.tmpdir(), 'ade-'))
|
|
40
|
+
try {
|
|
41
|
+
execSync(`git clone --depth 1 "${cfg.source}" "${path.join(tmp, 'repo')}"`, { stdio: 'inherit' })
|
|
42
|
+
removeManaged(cwd)
|
|
43
|
+
install(cwd, path.join(tmp, 'repo'))
|
|
44
|
+
} finally {
|
|
45
|
+
fs.rmSync(tmp, { recursive: true, force: true })
|
|
46
|
+
}
|
|
47
|
+
console.log('ADE update 完成')
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function removeManaged(cwd) {
|
|
51
|
+
fs.rmSync(path.join(cwd, '.claude', 'ade'), { recursive: true, force: true })
|
|
52
|
+
const skillsDir = path.join(cwd, '.claude', 'skills')
|
|
53
|
+
if (fs.existsSync(skillsDir)) {
|
|
54
|
+
for (const d of fs.readdirSync(skillsDir)) {
|
|
55
|
+
if (d.startsWith('ade-')) fs.rmSync(path.join(skillsDir, d), { recursive: true, force: true })
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
function install(cwd, srcDir) {
|
|
61
|
+
fs.cpSync(path.join(srcDir, 'knowledge'), path.join(cwd, '.claude', 'ade', 'knowledge'), { recursive: true })
|
|
62
|
+
|
|
63
|
+
const srcSkills = path.join(srcDir, 'skills')
|
|
64
|
+
if (fs.existsSync(srcSkills)) {
|
|
65
|
+
for (const d of fs.readdirSync(srcSkills)) {
|
|
66
|
+
fs.cpSync(path.join(srcSkills, d), path.join(cwd, '.claude', 'skills', d), { recursive: true })
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
const section = fs.readFileSync(path.join(srcDir, 'claude-md', 'section.md'), 'utf8').trim()
|
|
71
|
+
const block = `${BEGIN}\n${section}\n${END}`
|
|
72
|
+
const claudePath = path.join(cwd, 'CLAUDE.md')
|
|
73
|
+
let md = fs.existsSync(claudePath) ? fs.readFileSync(claudePath, 'utf8') : ''
|
|
74
|
+
const b = md.indexOf(BEGIN)
|
|
75
|
+
const e = md.indexOf(END)
|
|
76
|
+
if (b !== -1 || e !== -1) {
|
|
77
|
+
if (b === -1 || e === -1 || e < b) {
|
|
78
|
+
throw new Error('CLAUDE.md 的 ADE 標記已損壞(BEGIN/END 不成對或順序顛倒),請手動修復後重試')
|
|
79
|
+
}
|
|
80
|
+
md = md.slice(0, b) + block + md.slice(e + END.length)
|
|
81
|
+
} else {
|
|
82
|
+
md = md ? md.trimEnd() + '\n\n' + block + '\n' : block + '\n'
|
|
83
|
+
}
|
|
84
|
+
fs.writeFileSync(claudePath, md)
|
|
85
|
+
|
|
86
|
+
fs.mkdirSync(path.join(cwd, 'workspaces'), { recursive: true })
|
|
87
|
+
const giPath = path.join(cwd, '.gitignore')
|
|
88
|
+
const gi = fs.existsSync(giPath) ? fs.readFileSync(giPath, 'utf8') : ''
|
|
89
|
+
if (!gi.split('\n').some((l) => l.trim().replace(/\/$/, '') === 'workspaces')) {
|
|
90
|
+
fs.writeFileSync(giPath, (gi ? gi.trimEnd() + '\n' : '') + 'workspaces/\n')
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
const prevPath = path.join(cwd, '.ade.json')
|
|
94
|
+
const prev = fs.existsSync(prevPath) ? JSON.parse(fs.readFileSync(prevPath, 'utf8')) : {}
|
|
95
|
+
let source = null
|
|
96
|
+
try {
|
|
97
|
+
const pkg = JSON.parse(fs.readFileSync(path.join(srcDir, 'package.json'), 'utf8'))
|
|
98
|
+
source = typeof pkg.repository === 'string' ? pkg.repository : (pkg.repository || {}).url || null
|
|
99
|
+
if (source) source = source.replace(/^git\+/, '')
|
|
100
|
+
if (source && source.includes('FILL_ME')) source = null
|
|
101
|
+
} catch {}
|
|
102
|
+
let commit = null
|
|
103
|
+
try {
|
|
104
|
+
commit = execSync('git rev-parse HEAD', { cwd: srcDir, stdio: ['ignore', 'pipe', 'ignore'] })
|
|
105
|
+
.toString()
|
|
106
|
+
.trim()
|
|
107
|
+
} catch {}
|
|
108
|
+
fs.writeFileSync(
|
|
109
|
+
prevPath,
|
|
110
|
+
JSON.stringify({ source: source || prev.source || null, commit }, null, 2) + '\n'
|
|
111
|
+
)
|
|
112
|
+
if (!source && !prev.source) {
|
|
113
|
+
console.warn('警告: ADE repo 的 package.json 未設定 repository.url,update 將無法運作,請手動補 .ade.json 的 source')
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
module.exports = { run, init, update }
|
package/package.json
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "create-agentic-dev-env",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Scaffold and manage team Agentic Dev Environment (ADE) knowledge repos",
|
|
5
|
+
"repository": {
|
|
6
|
+
"type": "git",
|
|
7
|
+
"url": "git+https://github.com/franKobayasi/agentic-dev-env.git"
|
|
8
|
+
},
|
|
9
|
+
"keywords": [
|
|
10
|
+
"agent",
|
|
11
|
+
"claude-code",
|
|
12
|
+
"knowledge-base",
|
|
13
|
+
"scaffold",
|
|
14
|
+
"ade"
|
|
15
|
+
],
|
|
16
|
+
"author": "Frank Lin",
|
|
17
|
+
"engines": {
|
|
18
|
+
"node": ">=20"
|
|
19
|
+
},
|
|
20
|
+
"bin": {
|
|
21
|
+
"create-agentic-dev-env": "bin/create.js"
|
|
22
|
+
},
|
|
23
|
+
"exports": {
|
|
24
|
+
"./runner": "./lib/runner.js"
|
|
25
|
+
},
|
|
26
|
+
"files": [
|
|
27
|
+
"bin",
|
|
28
|
+
"lib",
|
|
29
|
+
"template"
|
|
30
|
+
],
|
|
31
|
+
"scripts": {
|
|
32
|
+
"test": "node test.js"
|
|
33
|
+
},
|
|
34
|
+
"license": "MIT"
|
|
35
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# __ADE_NAME__(ADE 知識庫)
|
|
2
|
+
|
|
3
|
+
這是團隊的 Agentic Dev Environment 知識庫 repo。結構與維護原則見 README.md。
|
|
4
|
+
|
|
5
|
+
## PRD / Spec 生命週期
|
|
6
|
+
|
|
7
|
+
- `knowledge/prd/`:一次開發一檔的需求文件,歷史文件不迭代(草稿 → 已確認 → 已實作)
|
|
8
|
+
- `knowledge/specs/`:當前功能的真相來源,持續迭代;`🚧 尚未實作` 標記代表已定案未開發
|
|
9
|
+
|
|
10
|
+
流程:PO 用 `ade-create-prd` 建 PRD → 確認後用 `ade-prd-to-spec` 更新 spec(標 🚧)→ RD 於工作目錄開發 → 開發完成 RD 跑 `ade-align-spec`(注入工作目錄的 skill)開 PR 回本 repo 收尾。
|
|
11
|
+
|
|
12
|
+
## 編輯慣例
|
|
13
|
+
|
|
14
|
+
- 服務描述檔必須符合 `knowledge/services/_template.yaml` 欄位結構,並同步更新 `services/index.md` 總覽;收錄範圍遵守 `knowledge/README.md` 的分層規則
|
|
15
|
+
- 修改 spec 時沿用既有詞彙;PRD 只在「已實作」前可改
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
# __ADE_NAME__
|
|
2
|
+
|
|
3
|
+
由 [create-agentic-dev-env](https://github.com/franKobayasi/agentic-dev-env) 產生的 Agentic Dev Environment(ADE)知識庫:集中管理團隊的 domain 知識、流程知識與產品規格,讓 agent 在任何工作目錄都能取用並持續回流更新。
|
|
4
|
+
|
|
5
|
+
## 初始設定(建 repo 後做一次)
|
|
6
|
+
|
|
7
|
+
1. 填 `package.json` 的 `repository.url`(init 會記錄它作為 update 的來源)
|
|
8
|
+
2. Push 到 GitHub / GitLab
|
|
9
|
+
3. 開始填 `knowledge/`:服務用 `knowledge/services/_template.yaml` 格式,一服務一檔,並更新 `services/index.md` 總覽
|
|
10
|
+
|
|
11
|
+
## 使用(團隊成員)
|
|
12
|
+
|
|
13
|
+
### 首次使用前:設定 SSH
|
|
14
|
+
|
|
15
|
+
init/update 透過 SSH 存取本 repo。先驗證:
|
|
16
|
+
|
|
17
|
+
```sh
|
|
18
|
+
ssh -T git@github.com # GitLab 則為 git@gitlab.com;出現歡迎訊息即可跳過以下步驟
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
尚未設定金鑰:
|
|
22
|
+
|
|
23
|
+
```sh
|
|
24
|
+
ssh-keygen -t ed25519 -C "you@company.com" # 一路 Enter 即可
|
|
25
|
+
cat ~/.ssh/id_ed25519.pub # 複製輸出,貼到 GitHub/GitLab 帳號設定的 SSH Keys
|
|
26
|
+
ssh -T git@github.com # 再次驗證
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
### 安裝
|
|
30
|
+
|
|
31
|
+
在任一工作目錄執行:
|
|
32
|
+
|
|
33
|
+
```sh
|
|
34
|
+
pnpm dlx "git+ssh://git@github.com/ORG/__ADE_NAME__.git" init
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
(public repo 也可用短寫法 `pnpm dlx github:ORG/__ADE_NAME__ init`;private repo 走 `github:` 會因 tarball API 無認證而失敗,請一律用上方 git+ssh 形式)
|
|
38
|
+
|
|
39
|
+
init 會在當前目錄建立:
|
|
40
|
+
|
|
41
|
+
- `CLAUDE.md` 的 `<!-- ADE:BEGIN/END -->` managed 區段(原有內容不動)
|
|
42
|
+
- `.claude/ade/knowledge/` 知識庫副本、`.claude/skills/ade-*/` skills
|
|
43
|
+
- `workspaces/`(agent clone 服務 repo 的作業區,自動加入 .gitignore)
|
|
44
|
+
- `.ade.json`(記錄來源與版本)
|
|
45
|
+
|
|
46
|
+
之後同指令改跑 `update` 拉取最新知識(update 會直接 clone 最新版,不受 dlx 快取影響)。
|
|
47
|
+
|
|
48
|
+
## 結構
|
|
49
|
+
|
|
50
|
+
```
|
|
51
|
+
knowledge/
|
|
52
|
+
├── services/ # 服務 registry:index.md 總覽導航 + 一服務一檔
|
|
53
|
+
├── process/ # 團隊流程知識
|
|
54
|
+
├── specs/ # 當前功能規格,持續迭代的真相來源
|
|
55
|
+
└── prd/ # 一次開發一檔的需求文件,歷史文件不迭代
|
|
56
|
+
skills/ # init 時注入工作目錄的 .claude/skills/
|
|
57
|
+
.claude/skills/ # 在本 repo 內工作用的 skills(PO 建 PRD、轉 spec)
|
|
58
|
+
claude-md/ # CLAUDE.md managed 區段的內容
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## PRD / Spec 流程
|
|
62
|
+
|
|
63
|
+
1. PO 在本 repo 用 `ade-create-prd` 建立標準化 PRD(含盲點拷問),定案後標「已確認」
|
|
64
|
+
2. PO 用 `ade-prd-to-spec` 把 PRD 融入 `specs/`,新行為標 `🚧 尚未實作`,逐項確認對齊
|
|
65
|
+
3. RD 在工作目錄開發(`workspaces/`)
|
|
66
|
+
4. 開發完成 RD 跑 `ade-align-spec`:核對實作、移除 🚧、PRD 標「已實作」,開 PR 回本 repo
|
|
67
|
+
|
|
68
|
+
## 維護原則
|
|
69
|
+
|
|
70
|
+
- 工作目錄裡的 ADE 內容是唯讀副本,update 會覆蓋。所有修改都回到本 repo 走 PR——agent 端由 `ade-contribute` / `ade-add-service` skills 引導完成
|
|
71
|
+
- 知識分層:本 repo 只收跨服務知識、取得服務的最小資訊、產品規格三類——完整規則見 `knowledge/README.md`(canonical)
|
|
72
|
+
- 使用中演化出的**機制**改良(skill 寫法、模板、流程),用 `ade-feedback-upstream` skill 回饋給 create-agentic-dev-env 上游;公司知識內容絕不外流
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
<!-- 此區段由 ADE (__ADE_NAME__) 管理,update 時整段覆蓋。勿直接編輯;要修改請至 ADE repo 改,或使用 ade-contribute skill。 -->
|
|
2
|
+
## ADE 工作區指引
|
|
3
|
+
|
|
4
|
+
本目錄是 agent 工作站,知識庫位於 `.claude/ade/knowledge/`。
|
|
5
|
+
|
|
6
|
+
### Session 開始時
|
|
7
|
+
|
|
8
|
+
- **檢查知識新鮮度**:讀 `.ade.json`,執行 `git ls-remote <source> HEAD`,若 hash 與 `commit` 不符,提醒使用者執行 update 後再繼續(勿自行修改 managed 內容)
|
|
9
|
+
- Session 一律從本目錄(hub 根)開啟;在 `workspaces/<service>/` 內開啟會失去 ade skills
|
|
10
|
+
|
|
11
|
+
### 知識分層
|
|
12
|
+
|
|
13
|
+
完整規則見 `.claude/ade/knowledge/README.md`。摘要:ADE 只收跨服務知識、取得服務的最小資訊、產品規格;服務內部一切以服務 repo(CLAUDE.md/AGENTS.md/code)為準。發現 ADE 側資訊過期:以服務 repo 為準繼續工作,任務收尾時用 `ade-contribute` 開 PR 修正,無需先徵詢。
|
|
14
|
+
|
|
15
|
+
### 開發某個服務時
|
|
16
|
+
|
|
17
|
+
1. 讀 `.claude/ade/knowledge/services/index.md`(全服務總覽)定位目標服務
|
|
18
|
+
2. 讀 `.claude/ade/knowledge/services/<service>.yaml` 取得定位、repo、技術棧、依賴關係
|
|
19
|
+
3. 若 `workspaces/<service>/` 不存在,依 `repo.url` / `repo.branch` clone 到 `workspaces/<service>/`
|
|
20
|
+
4. 讀服務 repo 自身的 README/CLAUDE.md/AGENTS.md 完成安裝、啟動、測試;跨服務流程慣例見 `knowledge/process/`,功能規格見 `knowledge/specs/`
|
|
21
|
+
|
|
22
|
+
### 知識維護
|
|
23
|
+
|
|
24
|
+
- 發現知識過期、缺漏,或學到新慣例 → 用 `ade-contribute` skill 開 PR 回 ADE repo
|
|
25
|
+
- 要註冊新服務 → 用 `ade-add-service` skill
|
|
26
|
+
- `.claude/ade/` 與 `.claude/skills/ade-*/` 為 managed 區域,勿直接修改
|
package/template/cli.js
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ade-create-prd
|
|
3
|
+
description: 協助 PO 依統一範本建立標準化 PRD,並拷問規格盲點。使用者說「建 PRD」「寫需求文件」「新的開發需求」「create PRD」時使用。僅在 ADE repo 內使用。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# 建立 PRD
|
|
7
|
+
|
|
8
|
+
## 流程
|
|
9
|
+
|
|
10
|
+
1. 複製 `knowledge/prd/_template.md` 為 `knowledge/prd/YYYY-MM-DD-<slug>.md`,狀態設「草稿」
|
|
11
|
+
2. 與 PO 對話逐區塊填寫,**先讀 `knowledge/services/index.md` 與 `knowledge/specs/` 相關文件**,用既有詞彙、對照現有規格找出衝突
|
|
12
|
+
3. 填完後進行盲點拷問(見下),問到 PO 每題都有明確答案或明確說「不在範圍」
|
|
13
|
+
4. 拷問結果回填文件(範圍外的寫進「非目標」,未定的寫進「開放問題」)
|
|
14
|
+
5. PO 確認後把狀態改為「已確認」,提醒下一步:跑 `ade-prd-to-spec` 更新規格
|
|
15
|
+
|
|
16
|
+
## 盲點拷問清單
|
|
17
|
+
|
|
18
|
+
- **邊界與錯誤**:輸入不合法、資源不存在、操作中斷、併發衝突時各是什麼行為?
|
|
19
|
+
- **跨服務影響**:對照 services 總覽,有沒有漏列受影響的服務?服務間的呼叫順序與失敗處理?
|
|
20
|
+
- **權限與安全**:誰能用這功能?資料存取邊界?
|
|
21
|
+
- **相容性**:既有資料要遷移嗎?舊版本客戶端/既有 API 使用者會壞嗎?
|
|
22
|
+
- **驗收條件**:每一條都可測試嗎?「好用」「快」這類形容詞要換成可驗證的敘述
|
|
23
|
+
- **非目標**:最容易被誤以為包含在內的相鄰功能是什麼?明確排除
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ade-feedback-upstream
|
|
3
|
+
description: 將本 ADE repo 演化出的機制改良(skill 寫法、模板結構、流程設計)回饋給上游 create-agentic-dev-env 框架。使用者說「回饋上游」「這個改良應該進框架」「feedback upstream」時使用。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# 回饋上游
|
|
7
|
+
|
|
8
|
+
本 repo 由 create-agentic-dev-env 產生後即與上游脫鉤;在日常使用中演化出的好機制,透過 PR 回饋上游,讓所有 ADE repo 受益。
|
|
9
|
+
|
|
10
|
+
## 界線(最重要)
|
|
11
|
+
|
|
12
|
+
- 只回饋**機制**:skill 的寫法改良、模板結構、流程設計、runner 行為建議
|
|
13
|
+
- **絕不回饋內容**:`knowledge/` 下的公司知識、服務資訊、規格、PRD 全屬機密,一個字都不能出現在上游 PR。送出前逐行檢查 diff,公司名稱、服務名稱、內部詞彙都要抽換成通用範例
|
|
14
|
+
|
|
15
|
+
## 流程
|
|
16
|
+
|
|
17
|
+
1. 取得上游 repo 位址:`package.json` 的 `ade.upstream`(為 null 則詢問使用者)
|
|
18
|
+
2. Clone 上游、建立分支,找到對應檔案(機制多在 `template/` 下)
|
|
19
|
+
3. 把改良以通用形式套上:去除公司語彙,範例改用佔位內容
|
|
20
|
+
4. 開 PR,說明:這個改良解決什麼問題、在本 ADE repo 實際使用的效果如何
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ade-prd-to-spec
|
|
3
|
+
description: 將已確認的 PRD 融入 specs,標記尚未實作區塊,供 PO 確認 PRD 與 spec 對齊。使用者說「PRD 轉 spec」「更新規格」「把 PRD 落到 spec」時使用。僅在 ADE repo 內使用。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# PRD → Spec
|
|
7
|
+
|
|
8
|
+
前提:PRD 狀態必須是「已確認」,否則請 PO 先走完 `ade-create-prd`。
|
|
9
|
+
|
|
10
|
+
## 流程
|
|
11
|
+
|
|
12
|
+
1. 讀目標 PRD 與 `knowledge/specs/` 現況,找出受影響的 spec 檔(沒有對應檔就依 `specs/README.md` 慣例新建)
|
|
13
|
+
2. 將 PRD 需求融入 spec:描述「功能完成後應有的樣子」,並在每個新增/變更的行為區塊上方加標記行,**格式逐字照抄、只替換檔名**(align-spec 靠精確匹配移除,變體會漏抓):
|
|
14
|
+
```
|
|
15
|
+
> 🚧 尚未實作(PRD: ../prd/YYYY-MM-DD-slug.md)
|
|
16
|
+
```
|
|
17
|
+
同一區塊已有其他 PRD 的標記時,堆疊一行新標記,勿合併、勿改動他人標記行
|
|
18
|
+
3. 只動這次 PRD 涉及的內容,spec 其餘部分一字不改
|
|
19
|
+
4. 回填 PRD 的「Spec 異動摘要」:動了哪些檔、各自異動重點
|
|
20
|
+
5. 帶 PO 逐項確認 spec 與預期相符,不符就修到對齊為止
|
|
21
|
+
6. PO 確認後 commit(或依團隊慣例開 PR)
|
|
22
|
+
|
|
23
|
+
完成後提醒:RD 開發完成後在工作目錄跑 `ade-align-spec` 收尾。
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
node_modules/
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# 知識分層規則(canonical)
|
|
2
|
+
|
|
3
|
+
本檔是 ADE 知識分層的唯一權威定義;其他文件提到分層時一律指回這裡。
|
|
4
|
+
|
|
5
|
+
ADE 只收錄三類知識:
|
|
6
|
+
|
|
7
|
+
## 1. 跨服務知識
|
|
8
|
+
|
|
9
|
+
單一服務無法自述、只有跨服務視角才成立的:服務定位、服務間依賴與呼叫關係(`services/`)、跨服務流程與團隊級慣例(`process/`)。
|
|
10
|
+
|
|
11
|
+
## 2. 取得服務的最小資訊
|
|
12
|
+
|
|
13
|
+
agent 進入服務 repo 之前必需的:repo URL、預設分支、技術棧概要(`services/<name>.yaml`)。技術棧屬低頻變動、可接受的少量重複。
|
|
14
|
+
|
|
15
|
+
**Bootstrap 流程(安裝、啟動、測試)不在此列**——歸服務 repo 自己的文件,clone 之後即可取得,ADE 不複製一份會過期的副本。
|
|
16
|
+
|
|
17
|
+
## 3. 產品規格與需求
|
|
18
|
+
|
|
19
|
+
`specs/` 與 `prd/` 收**全部**產品規格,包含單一服務就能完成的功能。「服務可自述」的判準只適用於工程知識,不適用於產品視角——spec 的讀者是 PO,PRD 流程在 ADE repo 進行。
|
|
20
|
+
|
|
21
|
+
## 此外的一切
|
|
22
|
+
|
|
23
|
+
服務內部的規範、慣例、架構細節,歸服務 repo 自己的 CLAUDE.md 或 AGENTS.md(有哪個讀哪個,都有就都讀);都沒有就讀 code。服務內部慣例**不回流**到 ADE。
|
|
24
|
+
|
|
25
|
+
## 過期修正規則
|
|
26
|
+
|
|
27
|
+
ADE 側資訊(定位、repo 位址/分支、技術棧、依賴關係)與服務 repo 現實不符時:**以服務 repo 為準**繼續手頭工作,**任務收尾時**用 `ade-contribute` 開 PR 修正 ADE,無需先徵詢——PR 本身就是 review 閘門。
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# PRD: <標題>
|
|
2
|
+
|
|
3
|
+
- 日期: YYYY-MM-DD
|
|
4
|
+
- 提出者:
|
|
5
|
+
- 狀態: 草稿 <!-- 草稿 → 已確認 → 已實作 -->
|
|
6
|
+
|
|
7
|
+
## 背景與目標
|
|
8
|
+
|
|
9
|
+
為什麼要做這個、要達成什麼。
|
|
10
|
+
|
|
11
|
+
## 非目標
|
|
12
|
+
|
|
13
|
+
明確不做的事,避免範圍蔓延。
|
|
14
|
+
|
|
15
|
+
## 需求描述
|
|
16
|
+
|
|
17
|
+
使用者故事/操作流程,具體到能開發的程度。
|
|
18
|
+
|
|
19
|
+
## 影響服務
|
|
20
|
+
|
|
21
|
+
對照 `../services/index.md`,列出涉及的服務與各自要改什麼。
|
|
22
|
+
|
|
23
|
+
## 驗收條件
|
|
24
|
+
|
|
25
|
+
- [ ] 每條都要可測試、可驗證
|
|
26
|
+
|
|
27
|
+
## 開放問題
|
|
28
|
+
|
|
29
|
+
尚未定案的點,定案後移入上方對應區塊。
|
|
30
|
+
|
|
31
|
+
## Spec 異動摘要
|
|
32
|
+
|
|
33
|
+
<!-- ade-prd-to-spec 執行後填:動了哪些 spec 檔、各自的異動重點 -->
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# 服務描述檔模板:複製為 <service-name>.yaml 填寫,並同步更新 index.md 總覽
|
|
2
|
+
# 只記「取得服務的最小資訊」與跨服務關係;bootstrap 流程與內部慣例歸服務 repo 自己的文件
|
|
3
|
+
# (分層規則見 ../README.md)
|
|
4
|
+
name: <service-name>
|
|
5
|
+
description: |
|
|
6
|
+
定位:這個服務在整個產品中的角色、為什麼存在(一~兩句)。
|
|
7
|
+
repo:
|
|
8
|
+
url: git@github.com:ORG/<service-name>.git
|
|
9
|
+
branch: main
|
|
10
|
+
stack:
|
|
11
|
+
language: <例:TypeScript / NestJS>
|
|
12
|
+
package_manager: <例:pnpm>
|
|
13
|
+
runtime: <例:Node 22>
|
|
14
|
+
dependencies:
|
|
15
|
+
calls:
|
|
16
|
+
- service: <service-b>
|
|
17
|
+
reason: <為了什麼呼叫它>
|
|
18
|
+
called_by:
|
|
19
|
+
- <api-gateway>
|
|
20
|
+
specs:
|
|
21
|
+
- ../specs/<相關規格檔>.md
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
# 服務總覽
|
|
2
|
+
|
|
3
|
+
> 導航用文件。每個服務只放一~兩行定位與關係,細節見各服務描述檔(YAML)。
|
|
4
|
+
> Agent:開發前先在此定位目標服務,再讀對應的 `<service>.yaml`。
|
|
5
|
+
|
|
6
|
+
| 服務 | 定位 | 細節 |
|
|
7
|
+
|---|---|---|
|
|
8
|
+
| (範例) service-a | 訂單核心服務,處理下單、庫存扣減;被 api-gateway 呼叫 | [service-a.yaml](./service-a.yaml) |
|
|
9
|
+
|
|
10
|
+
新增服務請使用 `ade-add-service` skill,或依 [_template.yaml](./_template.yaml) 手動建立並更新本表。
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# 產品規格(spec)
|
|
2
|
+
|
|
3
|
+
描述**當前**功能服務的規格,是長期維護、持續迭代的真相來源。每個功能/產品領域一個 md 檔。
|
|
4
|
+
|
|
5
|
+
跨服務的功能請寫明由哪些服務構成,並連回 `../services/` 下的對應服務檔。
|
|
6
|
+
|
|
7
|
+
## 尚未實作標記
|
|
8
|
+
|
|
9
|
+
由 PRD 帶入、還沒開發完成的行為,在區塊上方標記,**格式必須逐字一致**(工具與 skill 靠精確匹配移除):
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
> 🚧 尚未實作(PRD: ../prd/YYYY-MM-DD-slug.md)
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
- 一行只標一個 PRD;同一區塊有多個進行中 PRD 時堆疊多行
|
|
16
|
+
- 標記行緊貼其描述的區塊(標題或段落)上方
|
|
17
|
+
- 開發完成後由 `ade-align-spec` skill 核對實作、依 PRD 檔名精準移除
|
|
18
|
+
|
|
19
|
+
讀 spec 時:無標記=已上線的現況,有標記=已定案但還沒做。
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "__ADE_NAME__",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"private": true,
|
|
5
|
+
"bin": {
|
|
6
|
+
"__ADE_NAME__": "./cli.js"
|
|
7
|
+
},
|
|
8
|
+
"repository": {
|
|
9
|
+
"type": "git",
|
|
10
|
+
"url": "FILL_ME: git@github.com:ORG/__ADE_NAME__.git"
|
|
11
|
+
},
|
|
12
|
+
"ade": {
|
|
13
|
+
"upstream": null
|
|
14
|
+
},
|
|
15
|
+
"dependencies": {
|
|
16
|
+
"create-agentic-dev-env": "^0.1.0"
|
|
17
|
+
}
|
|
18
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ade-add-service
|
|
3
|
+
description: 在 ADE 知識庫註冊新服務。使用者說「新增服務」「註冊服務」「把某某服務加進知識庫」時使用。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# 新增服務
|
|
7
|
+
|
|
8
|
+
1. 依 `ade-contribute` skill 的流程 clone ADE repo 並建立分支
|
|
9
|
+
2. 複製 `knowledge/services/_template.yaml` 為 `knowledge/services/<service-name>.yaml`
|
|
10
|
+
3. 逐欄位填寫。**`repo`(url、branch)為必填**——agent 之後要靠它自主 clone;bootstrap 流程不要寫進來,那歸服務 repo 自己的文件(分層規則見 `knowledge/README.md`)
|
|
11
|
+
- 資訊不足時詢問使用者,不要留空、不要猜測
|
|
12
|
+
4. 在 `knowledge/services/index.md` 的總覽表加入該服務(一~兩行:定位與關係)
|
|
13
|
+
5. 依 `ade-contribute` 流程開 PR 回 ADE repo
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ade-align-spec
|
|
3
|
+
description: 功能開發完成後,核對 spec 與實作是否一致,移除尚未實作標記並將 PRD 標為已實作。使用者說「開發完了更新 spec」「對齊 spec」「align spec」「收尾文件」時使用。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Spec 與實作對齊
|
|
7
|
+
|
|
8
|
+
開發完成後的文件收尾:讓 spec 回到「描述現況」的狀態。
|
|
9
|
+
|
|
10
|
+
## 流程
|
|
11
|
+
|
|
12
|
+
1. 確認這次開發對應的 PRD 與受影響 spec(從使用者、branch 或 PR 上下文取得;不確定就問)
|
|
13
|
+
2. 找出本次 PRD 的標記:先用 `grep -n "🚧" <spec>` 列出**全部**標記行(寬鬆匹配,連格式變體一起抓),再逐行看 PRD 檔名判斷歸屬——只處理含本次 PRD 檔名的行,其他 PRD 的標記與其描述的內容一律不碰
|
|
14
|
+
3. 逐項核對:對照 `workspaces/` 下的實際實作,檢查每個屬於本次 PRD 的 `🚧` 區塊
|
|
15
|
+
- 已實作且行為一致 → 移除該標記行(整行刪除,內容保留)
|
|
16
|
+
- 實作與 spec 不符 → 以**實作為準**修改 spec 內容,並記下差異
|
|
17
|
+
- 沒做的項目 → 保留標記,記下
|
|
18
|
+
4. 依 `ade-contribute` skill 的流程 clone ADE repo 並修改:
|
|
19
|
+
- 移除已實作區塊的 🚧 標記、套用與實作對齊的修改
|
|
20
|
+
- 全部驗收項完成時,把 PRD 狀態改為「已實作」
|
|
21
|
+
5. 開 PR,描述中列出:移除了哪些標記、spec 與原規劃的差異(給 PO 判斷是否接受)、未完成保留的項目
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ade-contribute
|
|
3
|
+
description: 將工作過程中發現的知識缺口、過期文件、新慣例回流到中央 ADE 知識庫。發現 .claude/ade/knowledge/ 內容與現實不符、缺少資訊,或使用者說「把這個記回知識庫」「更新 ADE」「回流」時使用。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# ADE 知識回流
|
|
7
|
+
|
|
8
|
+
本地 `.claude/ade/` 是 managed 區域,`update` 時會被整個覆蓋——**永遠不要直接修改本地副本**,把修正送回中央 ADE repo。
|
|
9
|
+
|
|
10
|
+
## 流程
|
|
11
|
+
|
|
12
|
+
1. 讀工作目錄的 `.ade.json` 取得 `source`(ADE repo 的 git url)
|
|
13
|
+
2. Clone 到暫存目錄:`git clone <source> <tmpdir>/ade`
|
|
14
|
+
3. 在 clone 中建立分支,修改 `knowledge/` 下對應文件
|
|
15
|
+
- 修改前先讀原文,沿用既有格式與詞彙
|
|
16
|
+
- 服務描述檔必須符合 `knowledge/services/_template.yaml` 的欄位結構;收錄範圍遵守 `knowledge/README.md` 的分層規則
|
|
17
|
+
4. Commit 並開 PR(GitHub 用 `gh pr create`,GitLab 用 `glab mr create`)
|
|
18
|
+
- PR 描述寫清楚:發現什麼缺口、在哪個工作情境發現的
|
|
19
|
+
5. 告知使用者 PR 連結;merge 後在工作目錄執行 update 即可取得新版
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ade-spec-audit
|
|
3
|
+
description: 巡檢 spec 與各服務實作的一致性,找出計畫外變更(hotfix、直接改 code)造成的規格漂移。使用者說「巡檢 spec」「檢查規格漂移」「spec audit」「規格還對嗎」時使用。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Spec 巡檢
|
|
7
|
+
|
|
8
|
+
spec 平時只靠 PRD 流程更新;hotfix 與計畫外變更會讓 spec 悄悄漂移。本 skill 補上這條偵測路徑。
|
|
9
|
+
|
|
10
|
+
## 流程
|
|
11
|
+
|
|
12
|
+
1. 列出 `.claude/ade/knowledge/specs/` 下的 spec;範圍大時請使用者指定優先巡檢的部分(建議:最近有 release 的服務相關)
|
|
13
|
+
2. 對每份 spec 找出涉及的服務(文內連結與 `services/index.md`),缺的 repo 依服務檔 clone 進 `workspaces/`
|
|
14
|
+
3. 逐項對照實作與 spec 敘述,記錄不一致:行為已變、功能已移除、實作有但 spec 未記載
|
|
15
|
+
- `🚧 尚未實作` 區塊屬「已定案未開發」,不算漂移,跳過
|
|
16
|
+
4. 向使用者報告漂移清單,確認哪些該修 spec(也可能是實作錯了該修 code)
|
|
17
|
+
5. 確認後依 `ade-contribute` skill 流程開 PR 修正 spec
|