@eric0117/agentforge 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 +275 -0
- package/dist/add-agent.js +145 -0
- package/dist/add-skill.js +185 -0
- package/dist/agent-prompt.js +211 -0
- package/dist/agentforge-config.js +106 -0
- package/dist/agents/claude.js +46 -0
- package/dist/agents/codex.js +67 -0
- package/dist/agents/cursor.js +54 -0
- package/dist/agents/index.js +15 -0
- package/dist/agents/io.js +252 -0
- package/dist/agents/types.js +1 -0
- package/dist/cli.js +374 -0
- package/dist/confirm.js +20 -0
- package/dist/doctor.js +223 -0
- package/dist/enter.js +85 -0
- package/dist/init.js +272 -0
- package/dist/lang-prompt.js +88 -0
- package/dist/list-skills.js +120 -0
- package/dist/logo.js +181 -0
- package/dist/path-prompt.js +148 -0
- package/dist/remove-agent.js +63 -0
- package/dist/remove-skill.js +88 -0
- package/dist/rename.js +222 -0
- package/dist/skill-prompt.js +199 -0
- package/dist/skills-data.js +727 -0
- package/dist/sync-skills.js +59 -0
- package/dist/templates/CLAUDE.md.tpl +141 -0
- package/dist/templates/context-handoff.SKILL.md.tpl +222 -0
- package/dist/templates/cross-repo-impact.SKILL.md.tpl +241 -0
- package/dist/templates/feature-retro.SKILL.md.tpl +312 -0
- package/dist/templates/feature-start.SKILL.md.tpl +631 -0
- package/dist/templates/history.SKILL.md.tpl +165 -0
- package/dist/templates/incident-context.SKILL.md.tpl +260 -0
- package/dist/templates/pr-create.SKILL.md.tpl +403 -0
- package/dist/templates/pr-review-analyze.SKILL.md.tpl +303 -0
- package/dist/templates/pre-deploy-check.SKILL.md.tpl +350 -0
- package/dist/templates/project-router.SKILL.md.tpl +55 -0
- package/dist/templates/release-coordinate.SKILL.md.tpl +209 -0
- package/package.json +54 -0
|
@@ -0,0 +1,727 @@
|
|
|
1
|
+
export const LANG_INSTRUCTIONS = {
|
|
2
|
+
en: "Respond in English. Keep code, commands, file paths, and English proper nouns (gh, Claude Code, Kafka, Redis, etc.) as-is.",
|
|
3
|
+
ko: "사용자에게 응답할 때는 한국어로 작성하세요. 단, 코드, 명령어, 파일 경로, 영문 고유명사(gh, Claude Code, Kafka, Redis 등)는 영어로 그대로 유지하세요.",
|
|
4
|
+
ja: "ユーザーへの応答は日本語で記述してください。ただし、コード、コマンド、ファイルパス、英語の固有名詞 (gh、Claude Code、Kafka、Redis など) は英語のまま残してください。",
|
|
5
|
+
};
|
|
6
|
+
export const LANG_LABEL = {
|
|
7
|
+
en: "English",
|
|
8
|
+
ko: "한국어",
|
|
9
|
+
ja: "日本語",
|
|
10
|
+
};
|
|
11
|
+
export const SKILLS = [
|
|
12
|
+
{
|
|
13
|
+
id: "agentforge-project-router",
|
|
14
|
+
title: "agentforge-project-router",
|
|
15
|
+
description: {
|
|
16
|
+
en: "Find the right repo to answer your question.",
|
|
17
|
+
ko: "코드 질문이 어느 레포 얘기인지 찾아줍니다.",
|
|
18
|
+
ja: "コードの質問がどのリポジトリの話か見つけます。",
|
|
19
|
+
},
|
|
20
|
+
details: {
|
|
21
|
+
en: [
|
|
22
|
+
"When you ask a question from the workspace root, this skill figures out which repos/<name>/ you mean and works there — so you don't have to cd around manually.",
|
|
23
|
+
"",
|
|
24
|
+
"How it works:",
|
|
25
|
+
" • Runs `ls repos/` every time (no metadata file to drift).",
|
|
26
|
+
" • Matches natural-language aliases: \"the backend API\" → backend-api, \"the admin\" → admin-web, \"the mobile app\" → mobile-app, \"the worker\" → worker-service.",
|
|
27
|
+
" • Single match → enters that repo. Ambiguous → shows candidates and asks. No match → lists everything.",
|
|
28
|
+
" • Cross-repo questions (\"where API and admin connect\") are handled across multiple repos at once instead of routing into one.",
|
|
29
|
+
" • If a feature's CLAUDE.md lists a repo whose worktree directory is missing, flags it as stale instead of silently routing into a non-existent path.",
|
|
30
|
+
"",
|
|
31
|
+
"Rules:",
|
|
32
|
+
" • repos/<name>/ is read-only — for code changes, use agentforge-feature-start.",
|
|
33
|
+
" • If you're already in anvil/<slug>/, the skill stays in that worktree instead of routing.",
|
|
34
|
+
].join("\n"),
|
|
35
|
+
ko: [
|
|
36
|
+
"워크스페이스 루트에서 질문하면, 이 스킬이 어떤 repos/<name>/ 을 의미하는지 파악해 해당 위치에서 작업합니다 — 수동으로 cd 할 필요가 없습니다.",
|
|
37
|
+
"",
|
|
38
|
+
"동작 방식:",
|
|
39
|
+
" • 매번 `ls repos/` 를 실행합니다 (별도 메타데이터 파일이 없어 drift 가 발생하지 않음).",
|
|
40
|
+
" • 자연어 별칭을 매칭합니다: \"백엔드 API\" → backend-api, \"어드민\" → admin-web, \"모바일 앱\" → mobile-app, \"워커\" → worker-service.",
|
|
41
|
+
" • 단일 매치 → 해당 리포지토리로 진입. 모호하면 → 후보를 보여주고 질문. 매치 없음 → 전체 목록 표시.",
|
|
42
|
+
" • 리포지토리에 걸친 질문 (\"API 와 admin 이 연결되는 지점\") 은 한 곳으로 라우팅하지 않고 여러 리포지토리에 걸쳐 처리합니다.",
|
|
43
|
+
" • 피쳐의 CLAUDE.md 에 적힌 리포지토리의 워크트리가 실제로 없으면, 조용히 라우팅하지 않고 stale 로 표시합니다.",
|
|
44
|
+
"",
|
|
45
|
+
"규칙:",
|
|
46
|
+
" • repos/<name>/ 은 읽기 전용입니다 — 코드 변경은 agentforge-feature-start 를 사용하세요.",
|
|
47
|
+
" • 이미 anvil/<slug>/ 안에 있다면, 라우팅하지 않고 그 워크트리에 머무릅니다.",
|
|
48
|
+
].join("\n"),
|
|
49
|
+
ja: [
|
|
50
|
+
"ワークスペースのルートから質問すると、このスキルがどの repos/<name>/ を指しているかを判断し、その中で作業します — 手動で cd して回る必要はありません。",
|
|
51
|
+
"",
|
|
52
|
+
"動作の仕組み:",
|
|
53
|
+
" • 毎回 `ls repos/` を実行します(ドリフトするメタデータファイルはありません)。",
|
|
54
|
+
" • 自然言語のエイリアスにマッチします: 「バックエンド API」→ backend-api、「管理画面」→ admin-web、「モバイルアプリ」→ mobile-app、「ワーカー」→ worker-service。",
|
|
55
|
+
" • 一致が 1 件 → そのリポジトリに入ります。曖昧 → 候補を表示して尋ねます。一致なし → 全件を一覧表示します。",
|
|
56
|
+
" • リポジトリ横断の質問(「API と admin の接続箇所」など)は、1 つにルーティングせず複数リポジトリを横断して処理します。",
|
|
57
|
+
" • 機能の CLAUDE.md に記載されたリポジトリのワークツリーが実在しない場合、黙ってルーティングせず stale として通知します。",
|
|
58
|
+
"",
|
|
59
|
+
"ルール:",
|
|
60
|
+
" • repos/<name>/ は読み取り専用です — コード変更には agentforge-feature-start を使ってください。",
|
|
61
|
+
" • すでに anvil/<slug>/ にいる場合、ルーティングせずそのワークツリーに留まります。",
|
|
62
|
+
].join("\n"),
|
|
63
|
+
},
|
|
64
|
+
template: "project-router.SKILL.md.tpl",
|
|
65
|
+
destDir: ".claude/skills/agentforge-project-router",
|
|
66
|
+
destFile: ".claude/skills/agentforge-project-router/SKILL.md",
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
id: "agentforge-feature-start",
|
|
70
|
+
title: "agentforge-feature-start",
|
|
71
|
+
description: {
|
|
72
|
+
en: "Start a new feature with a fresh worktree.",
|
|
73
|
+
ko: "새 작업을 위한 워크트리를 만들어 줍니다.",
|
|
74
|
+
ja: "新しい作業のためのワークツリーを用意します。",
|
|
75
|
+
},
|
|
76
|
+
details: {
|
|
77
|
+
en: [
|
|
78
|
+
"Bootstraps a new feature, or extends an existing one with more repos.",
|
|
79
|
+
"",
|
|
80
|
+
"Flow:",
|
|
81
|
+
" 1. Greps `repos/*` for keywords from your description, then pre-checks matching repos in the selector (suggestion only — every repo is still shown).",
|
|
82
|
+
" 2. Distills your description into a `YYMMDD-feat-…` slug (today's date prefixes the kebab-case core, so `ls anvil/` sorts by start date). You confirm or correct.",
|
|
83
|
+
" 3. Multi-select which repos this feature touches.",
|
|
84
|
+
" 4. Pre-flight per repo: detects the base branch (`origin/HEAD` → fallbacks), reports current branch + uncommitted state, and asks for explicit confirmation if anything looks risky.",
|
|
85
|
+
" 5. For each chosen repo, runs `git fetch origin <base>` then `git worktree add ../../anvil/<slug>/<repo> -b <slug> origin/<base>` — never trusts the current HEAD of repos/<repo>. If fetch fails it stops and asks rather than silently using a stale base.",
|
|
86
|
+
" 6. Writes (or updates) `anvil/<slug>/CLAUDE.md` recording the description + repos in scope. Only repos that actually succeeded land in the metadata.",
|
|
87
|
+
"",
|
|
88
|
+
"Safety:",
|
|
89
|
+
" • Concurrency lock via `anvil/<slug>/.agentforge.lock` so two sessions don't fight.",
|
|
90
|
+
" • Activity log appended to `<workspace>/agentforge/log.jsonl` for the retro timeline.",
|
|
91
|
+
" • repos/<repo>'s working tree is never touched — uncommitted work there stays put.",
|
|
92
|
+
"",
|
|
93
|
+
"Re-runnable: calling it again with an existing slug enters additive mode — already-added repos are shown as locked, only newly chosen repos get a worktree, CLAUDE.md is updated in place, and the metadata is reconciled against worktrees that actually exist on disk.",
|
|
94
|
+
].join("\n"),
|
|
95
|
+
ko: [
|
|
96
|
+
"새 기능을 부트스트랩하거나, 진행 중인 기능에 레포지토리를 추가합니다.",
|
|
97
|
+
"",
|
|
98
|
+
"흐름:",
|
|
99
|
+
" 1. 설명에서 키워드를 뽑아 `repos/*` 를 grep, 매칭된 레포지토리를 선택지에 미리 체크해 제안 (제안일 뿐 모든 레포지토리 표시).",
|
|
100
|
+
" 2. 설명을 `YYMMDD-feat-…` slug 로 정제 (오늘 날짜 prefix 로 `ls anvil/` 가 시간순 정렬). 확인 또는 수정.",
|
|
101
|
+
" 3. 이 기능이 건드릴 레포지토리를 다중 선택.",
|
|
102
|
+
" 4. 레포지토리별 pre-flight: base 브랜치 자동 탐지(`origin/HEAD` → fallback), 현재 브랜치/미커밋 상태 보고, 위험 항목 있으면 명시적 확인.",
|
|
103
|
+
" 5. 각 레포지토리에서 `git fetch origin <base>` 후 `git worktree add ../../anvil/<slug>/<repo> -b <slug> origin/<base>` — 절대 repos/<repo> 의 현재 HEAD 에 의존하지 않음. fetch 실패 시 silent 진행하지 않고 사용자에게 확인.",
|
|
104
|
+
" 6. `anvil/<slug>/CLAUDE.md` 에 설명 + 범위 기록 (실제 성공한 레포지토리만 메타에 반영).",
|
|
105
|
+
"",
|
|
106
|
+
"안전장치:",
|
|
107
|
+
" • `anvil/<slug>/.agentforge.lock` 으로 동시 세션 충돌 방지.",
|
|
108
|
+
" • `<workspace>/agentforge/log.jsonl` 에 활동 로그 append (retro 타임라인용).",
|
|
109
|
+
" • repos/<repo> 의 working tree 는 절대 건드리지 않음 — 거기 미커밋 변경은 그대로.",
|
|
110
|
+
"",
|
|
111
|
+
"재실행 가능: 동일 slug 로 다시 호출하면 additive 모드 — 이미 있는 레포지토리는 잠겨 표시, 새로 고른 것만 워크트리 생성, CLAUDE.md in-place 갱신, 실제 디스크의 워크트리 상태와 메타 일치 검증.",
|
|
112
|
+
].join("\n"),
|
|
113
|
+
ja: [
|
|
114
|
+
"新しい機能をブートストラップする、または既存の機能にリポジトリを追加します。",
|
|
115
|
+
"",
|
|
116
|
+
"フロー:",
|
|
117
|
+
" 1. 説明からキーワードを抽出し `repos/*` を grep、マッチしたリポジトリを選択肢で事前にチェック表示 (提案であり、全リポジトリは表示)。",
|
|
118
|
+
" 2. 説明を `YYMMDD-feat-…` スラッグに凝縮 (本日の日付プレフィックスで `ls anvil/` が時系列順に並ぶ)。確認または修正。",
|
|
119
|
+
" 3. この機能が触れるリポジトリを複数選択。",
|
|
120
|
+
" 4. リポジトリ別の pre-flight: base ブランチを自動検出 (`origin/HEAD` → フォールバック)、現在のブランチ/未コミット状態を報告、リスクがあれば明示的に確認。",
|
|
121
|
+
" 5. 各リポジトリで `git fetch origin <base>` 後に `git worktree add ../../anvil/<slug>/<repo> -b <slug> origin/<base>` — repos/<repo> の現在 HEAD には決して依存しません。fetch 失敗時は黙って進めず確認します。",
|
|
122
|
+
" 6. `anvil/<slug>/CLAUDE.md` に説明とスコープを記録 (実際に成功したリポジトリのみメタに反映)。",
|
|
123
|
+
"",
|
|
124
|
+
"安全機構:",
|
|
125
|
+
" • `anvil/<slug>/.agentforge.lock` で同時セッションの衝突を防止。",
|
|
126
|
+
" • `<workspace>/agentforge/log.jsonl` にアクティビティログを追記 (レトロのタイムラインに使用)。",
|
|
127
|
+
" • repos/<repo> のワーキングツリーには決して触れません — そこにある未コミット変更はそのまま。",
|
|
128
|
+
"",
|
|
129
|
+
"再実行可能: 同じスラッグで再度呼び出すと additive モード — 既にあるリポジトリはロック表示、新しく選んだものだけワークツリーを作成、CLAUDE.md を in-place で更新、実際のディスク上のワークツリーとメタの整合を確認。",
|
|
130
|
+
].join("\n"),
|
|
131
|
+
},
|
|
132
|
+
template: "feature-start.SKILL.md.tpl",
|
|
133
|
+
destDir: ".claude/skills/agentforge-feature-start",
|
|
134
|
+
destFile: ".claude/skills/agentforge-feature-start/SKILL.md",
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
id: "agentforge-feature-retro",
|
|
138
|
+
title: "agentforge-feature-retro",
|
|
139
|
+
description: {
|
|
140
|
+
en: "Wrap up a feature: save logs and write a recap.",
|
|
141
|
+
ko: "작업을 마치며 기록과 회고를 남깁니다.",
|
|
142
|
+
ja: "作業の締めくくりに記録と振り返りを残します。",
|
|
143
|
+
},
|
|
144
|
+
details: {
|
|
145
|
+
en: [
|
|
146
|
+
"When you say \"we're done with this feature\", this skill closes the loop: it captures everything worth keeping into artifacts/<YYYYMMDD>/<slug>/ and removes the worktrees so anvil/ only contains in-progress work.",
|
|
147
|
+
"",
|
|
148
|
+
"Captured into artifacts/<YYYYMMDD>/<slug>/:",
|
|
149
|
+
" • CLAUDE.md — feature metadata, moved from anvil/<slug>/CLAUDE.md",
|
|
150
|
+
" • RETRO.md — what was asked, decisions, what was built (diff stat per repo), follow-ups, lessons. Includes a Timeline from agentforge/log.jsonl.",
|
|
151
|
+
" • sessions/ — every Claude Code transcript JSONL from ~/.claude/projects/<encoded-cwd>/",
|
|
152
|
+
" • plans/ — plan files from ~/.claude/plans/ that you confirm belong to this feature",
|
|
153
|
+
" • refs.json — per-repo {branch, head, merged_into, pr} — pointers, not source. Code lives in each repo's git history.",
|
|
154
|
+
"",
|
|
155
|
+
"Worktree teardown (offered, never automatic):",
|
|
156
|
+
" • Safety-checks per repo: uncommitted changes, unpushed commits, unmerged branch.",
|
|
157
|
+
" • `git worktree remove` each worktree once it passes.",
|
|
158
|
+
" • Optionally deletes the local branch (explicit confirmation only).",
|
|
159
|
+
" • Finally `rmdir anvil/<slug>/` — never `rm -rf`. If anything unexpected is still inside, stops and asks.",
|
|
160
|
+
"",
|
|
161
|
+
"Safety: concurrency lock via `anvil/<slug>/.agentforge.lock`; activity log appended for every archive / removal / branch deletion. artifacts/ is the permanent record and is never modified afterwards.",
|
|
162
|
+
].join("\n"),
|
|
163
|
+
ko: [
|
|
164
|
+
"\"이 기능 작업이 끝났다\" 라고 말하면, 이 스킬이 마무리를 합니다 — 모든 보존할 가치 있는 내용을 artifacts/<YYYYMMDD>/<slug>/ 에 캡처하고, 워크트리를 정리해 anvil/ 에는 진행 중 작업만 남도록.",
|
|
165
|
+
"",
|
|
166
|
+
"artifacts/<YYYYMMDD>/<slug>/ 에 캡처되는 항목:",
|
|
167
|
+
" • CLAUDE.md — 기능 메타. anvil/<slug>/CLAUDE.md 에서 이관됨",
|
|
168
|
+
" • RETRO.md — 요청·결정·산출물(레포지토리별 diff stat)·후속·교훈. agentforge/log.jsonl 기반 Timeline 포함",
|
|
169
|
+
" • sessions/ — ~/.claude/projects/<encoded-cwd>/ 의 모든 Claude Code 트랜스크립트 JSONL",
|
|
170
|
+
" • plans/ — ~/.claude/plans/ 중 이 기능 속이라고 확인된 plan 파일",
|
|
171
|
+
" • refs.json — 레포지토리별 {branch, head, merged_into, pr} 포인터 (소스 X, 코드는 git history 에)",
|
|
172
|
+
"",
|
|
173
|
+
"워크트리 정리 (제안만, 자동 실행 아님):",
|
|
174
|
+
" • 레포지토리별 안전 점검: 미커밋·미푸시·미머지.",
|
|
175
|
+
" • 통과한 워크트리는 `git worktree remove`.",
|
|
176
|
+
" • 선택적으로 로컬 브랜치 삭제 (명시적 확인 시에만).",
|
|
177
|
+
" • 마지막으로 `rmdir anvil/<slug>/` — 절대 `rm -rf` 아님. 예상치 못한 파일이 남아있으면 멈추고 사용자에게 보고.",
|
|
178
|
+
"",
|
|
179
|
+
"안전장치: `anvil/<slug>/.agentforge.lock` 으로 동시 세션 충돌 방지; 모든 아카이브·제거·브랜치 삭제마다 활동 로그 append. artifacts/ 는 영구 기록이며 이후 수정되지 않음.",
|
|
180
|
+
].join("\n"),
|
|
181
|
+
ja: [
|
|
182
|
+
"「この機能はもう完了」と言うと、このスキルが締めくくります — 保存すべき内容を artifacts/<YYYYMMDD>/<slug>/ にキャプチャし、ワークツリーを片付けて anvil/ には進行中の作業のみが残るようにします。",
|
|
183
|
+
"",
|
|
184
|
+
"artifacts/<YYYYMMDD>/<slug>/ にキャプチャされる内容:",
|
|
185
|
+
" • CLAUDE.md — 機能のメタ。anvil/<slug>/CLAUDE.md から移動",
|
|
186
|
+
" • RETRO.md — 要求・決定・成果物 (リポジトリごとの diff stat)・フォローアップ・学び。agentforge/log.jsonl からの Timeline セクションを含む",
|
|
187
|
+
" • sessions/ — ~/.claude/projects/<encoded-cwd>/ のすべての Claude Code トランスクリプト JSONL",
|
|
188
|
+
" • plans/ — ~/.claude/plans/ のうち、この機能に属すると確認されたプランファイル",
|
|
189
|
+
" • refs.json — リポジトリごとの {branch, head, merged_into, pr} ポインタ (ソースは含まず、コードは各リポジトリの git history に)",
|
|
190
|
+
"",
|
|
191
|
+
"ワークツリーの片付け (提示のみ、自動実行はしません):",
|
|
192
|
+
" • リポジトリごとの安全チェック: 未コミット・未プッシュ・未マージ。",
|
|
193
|
+
" • 通過したワークツリーを `git worktree remove`。",
|
|
194
|
+
" • 任意でローカルブランチを削除 (明示的な確認時のみ)。",
|
|
195
|
+
" • 最後に `rmdir anvil/<slug>/` — `rm -rf` は決して使いません。予期しないファイルが残っていれば停止して報告。",
|
|
196
|
+
"",
|
|
197
|
+
"安全機構: `anvil/<slug>/.agentforge.lock` で同時セッションの衝突を防止; アーカイブ・削除・ブランチ削除のたびにアクティビティログを追記。artifacts/ は恒久的な記録であり、その後は変更されません。",
|
|
198
|
+
].join("\n"),
|
|
199
|
+
},
|
|
200
|
+
template: "feature-retro.SKILL.md.tpl",
|
|
201
|
+
destDir: ".claude/skills/agentforge-feature-retro",
|
|
202
|
+
destFile: ".claude/skills/agentforge-feature-retro/SKILL.md",
|
|
203
|
+
},
|
|
204
|
+
{
|
|
205
|
+
id: "agentforge-pr-review-analyze",
|
|
206
|
+
title: "agentforge-pr-review-analyze",
|
|
207
|
+
description: {
|
|
208
|
+
en: "Tell you what to fix from PR review comments.",
|
|
209
|
+
ko: "PR 리뷰에서 무엇부터 고쳐야 할지 알려줍니다.",
|
|
210
|
+
ja: "PR レビューで何を直すべきか教えます。",
|
|
211
|
+
},
|
|
212
|
+
details: {
|
|
213
|
+
en: [
|
|
214
|
+
"When you say \"audit the PR comments\" or \"summarize the review feedback\", this skill turns a noisy review thread into a prioritized action list.",
|
|
215
|
+
"",
|
|
216
|
+
"Inputs:",
|
|
217
|
+
" • Current branch's PR (auto-detected via `gh pr view`) or a PR number you pass in.",
|
|
218
|
+
" • Pulls inline comments, review bodies, and general PR comments — all paginated. Marks Resolved / Outdated via GraphQL.",
|
|
219
|
+
"",
|
|
220
|
+
"Per-comment analysis (4 axes):",
|
|
221
|
+
" 1. Verify against live code — opens path:line and confirms the issue still exists.",
|
|
222
|
+
" 2. Impact — 🔴 Critical / 🟠 High / 🟡 Medium / 🟢 Low / 💬 Discussion.",
|
|
223
|
+
" 3. Call path — locates callers (language-aware) and flags async entry points (Kafka, @Scheduled, webhooks).",
|
|
224
|
+
" 4. Resolution — concrete fix with before/after when possible.",
|
|
225
|
+
"",
|
|
226
|
+
"Bonus: test coverage check; cross-thread grouping when reviewers flag the same function.",
|
|
227
|
+
"",
|
|
228
|
+
"Handles gh API rate limits gracefully — reports partial results with a clear note when the limit cuts analysis short.",
|
|
229
|
+
"",
|
|
230
|
+
"Read-only. Output ends with a priority table + \"Next actions\" (fix here / split into follow-up / reply only).",
|
|
231
|
+
].join("\n"),
|
|
232
|
+
ko: [
|
|
233
|
+
"\"PR 코멘트 분석해줘\" 또는 \"리뷰 피드백 정리해줘\" 라고 말하면, 이 스킬이 노이즈가 많은 리뷰 스레드를 우선순위가 매겨진 액션 리스트로 바꿔줍니다.",
|
|
234
|
+
"",
|
|
235
|
+
"입력:",
|
|
236
|
+
" • 현재 브랜치의 PR (`gh pr view` 로 자동 감지) 또는 사용자가 전달한 PR 번호.",
|
|
237
|
+
" • 인라인 코멘트, 리뷰 본문, 일반 PR 코멘트를 모두 — 페이지네이션 포함 — 가져옵니다. GraphQL 로 Resolved / Outdated 를 표시합니다.",
|
|
238
|
+
"",
|
|
239
|
+
"코멘트별 분석 (4가지 축):",
|
|
240
|
+
" 1. 실제 코드 검증 — path:line 을 열어 이슈가 여전히 존재하는지 확인.",
|
|
241
|
+
" 2. 영향도 — 🔴 Critical / 🟠 High / 🟡 Medium / 🟢 Low / 💬 Discussion.",
|
|
242
|
+
" 3. 호출 경로 — 호출 지점을 찾고 (언어 인지), 비동기 엔트리포인트 (Kafka, @Scheduled, webhook) 를 표시.",
|
|
243
|
+
" 4. 해결 방안 — 가능하면 before/after 를 포함한 구체적 수정안.",
|
|
244
|
+
"",
|
|
245
|
+
"부가 기능: 테스트 커버리지 점검; 리뷰어들이 같은 함수를 지적하면 스레드 간 그룹화.",
|
|
246
|
+
"",
|
|
247
|
+
"gh API rate limit 처리 — 한계에 걸려 분석이 잘리면 부분 결과를 명확한 안내와 함께 보고합니다.",
|
|
248
|
+
"",
|
|
249
|
+
"읽기 전용. 출력 끝에 우선순위 표 + \"다음 액션\" (여기서 수정 / 후속 작업으로 분리 / 답변만) 이 따릅니다.",
|
|
250
|
+
].join("\n"),
|
|
251
|
+
ja: [
|
|
252
|
+
"「PR コメントを精査して」「レビューフィードバックを要約して」と言うと、このスキルがノイズの多いレビュースレッドを優先度付きのアクションリストに変換します。",
|
|
253
|
+
"",
|
|
254
|
+
"入力:",
|
|
255
|
+
" • 現在のブランチの PR (`gh pr view` で自動検出) または PR 番号を渡すこともできます。",
|
|
256
|
+
" • インラインコメント、レビュー本文、PR の通常コメントをすべてページング取得します。GraphQL 経由で Resolved / Outdated を判別します。",
|
|
257
|
+
"",
|
|
258
|
+
"コメントごとの分析 (4 つの軸):",
|
|
259
|
+
" 1. 実コードと突き合わせて検証 — path:line を開き、指摘が今も存在するか確認します。",
|
|
260
|
+
" 2. 影響度 — 🔴 Critical / 🟠 High / 🟡 Medium / 🟢 Low / 💬 Discussion。",
|
|
261
|
+
" 3. 呼び出し経路 — 呼び出し元を特定し (言語対応)、非同期エントリポイント (Kafka、@Scheduled、Webhook) にフラグを立てます。",
|
|
262
|
+
" 4. 解決策 — 可能な限り before/after 付きの具体的な修正案。",
|
|
263
|
+
"",
|
|
264
|
+
"ボーナス: テストカバレッジチェック、複数のレビュアーが同じ関数を指摘している場合のスレッド横断グルーピング。",
|
|
265
|
+
"",
|
|
266
|
+
"gh API のレート制限を考慮 — 制限により分析が途中で止まった場合は、明示的な注記付きで部分結果を報告します。",
|
|
267
|
+
"",
|
|
268
|
+
"読み取り専用。出力の末尾は優先度テーブルと「Next actions」 (ここで修正 / フォローアップに分割 / 返信のみ) で締めます。",
|
|
269
|
+
].join("\n"),
|
|
270
|
+
},
|
|
271
|
+
template: "pr-review-analyze.SKILL.md.tpl",
|
|
272
|
+
destDir: ".claude/skills/agentforge-pr-review-analyze",
|
|
273
|
+
destFile: ".claude/skills/agentforge-pr-review-analyze/SKILL.md",
|
|
274
|
+
},
|
|
275
|
+
{
|
|
276
|
+
id: "agentforge-cross-repo-impact",
|
|
277
|
+
title: "agentforge-cross-repo-impact",
|
|
278
|
+
description: {
|
|
279
|
+
en: "See what else breaks if you change this code.",
|
|
280
|
+
ko: "이 코드를 바꾸면 다른 레포 어디가 깨지는지 봐줍니다.",
|
|
281
|
+
ja: "このコードを変えると他のリポジトリのどこが壊れるか調べます。",
|
|
282
|
+
},
|
|
283
|
+
details: {
|
|
284
|
+
en: [
|
|
285
|
+
"Before changing shared code, ask \"where else is this used?\" and this skill answers across every repo in the workspace.",
|
|
286
|
+
"",
|
|
287
|
+
"Targets you can analyze:",
|
|
288
|
+
" • A symbol (function, class, type)",
|
|
289
|
+
" • An HTTP endpoint (`POST /v1/things`)",
|
|
290
|
+
" • An env var or config key",
|
|
291
|
+
" • An event / queue name",
|
|
292
|
+
" • Or auto-extracted from the current worktree's diff (renames, signature changes, removed exports, route changes).",
|
|
293
|
+
"",
|
|
294
|
+
"How it searches:",
|
|
295
|
+
" • Detects each target repo's language(s) from changed files, then uses the right caller idiom (TS, Kotlin/Java, Python, Go, Rust, Ruby, PHP).",
|
|
296
|
+
" • Classifies each hit: 📞 call site · 📥 import · 🌐 HTTP caller · 🧩 type usage · 🔤 string ref · 📜 schema · 🧪 test.",
|
|
297
|
+
"",
|
|
298
|
+
"Reports breaking-change risk by change kind (renamed / removed / signature / behavior-only / endpoint / config) and explicitly flags same-signature behavior changes the compiler won't catch.",
|
|
299
|
+
"",
|
|
300
|
+
"Standard noise dirs (node_modules, dist, build, target, .next, .venv, vendor, *.lock) are excluded from every search so big repos stay fast and signal stays clean.",
|
|
301
|
+
"",
|
|
302
|
+
"Read-only. Output is grouped per repo with suggested rollout ordering.",
|
|
303
|
+
].join("\n"),
|
|
304
|
+
ko: [
|
|
305
|
+
"공유 코드를 변경하기 전에 \"어디서 또 쓰이고 있지?\" 라고 물으면, 이 스킬이 워크스페이스 내 모든 리포지토리에 걸쳐 답해줍니다.",
|
|
306
|
+
"",
|
|
307
|
+
"분석 가능한 대상:",
|
|
308
|
+
" • 심볼 (함수, 클래스, 타입)",
|
|
309
|
+
" • HTTP 엔드포인트 (`POST /v1/things`)",
|
|
310
|
+
" • 환경변수 또는 config 키",
|
|
311
|
+
" • 이벤트 / 큐 이름",
|
|
312
|
+
" • 또는 현재 워크트리의 diff 에서 자동 추출 (rename, 시그니처 변경, export 제거, route 변경).",
|
|
313
|
+
"",
|
|
314
|
+
"검색 방식:",
|
|
315
|
+
" • 변경된 파일들에서 각 대상 리포지토리의 언어를 감지한 뒤, 해당 언어에 맞는 호출 관용구를 사용 (TS, Kotlin/Java, Python, Go, Rust, Ruby, PHP).",
|
|
316
|
+
" • 각 매치를 분류: 📞 호출 지점 · 📥 import · 🌐 HTTP 호출자 · 🧩 타입 사용 · 🔤 문자열 참조 · 📜 스키마 · 🧪 테스트.",
|
|
317
|
+
"",
|
|
318
|
+
"변경 종류별 (rename / 제거 / 시그니처 / 동작만 변경 / 엔드포인트 / config) 로 호환성 깨짐 위험을 보고하며, 컴파일러가 잡지 못하는 동일 시그니처 동작 변경을 명시적으로 표시합니다.",
|
|
319
|
+
"",
|
|
320
|
+
"node_modules·dist·build·target·.next·.venv·vendor·*.lock 등 표준 노이즈 디렉토리는 모든 검색에서 제외 — 큰 리포지토리도 빠르고 신호 깨끗.",
|
|
321
|
+
"",
|
|
322
|
+
"읽기 전용. 출력은 리포지토리별로 그룹화되며 권장 롤아웃 순서를 포함합니다.",
|
|
323
|
+
].join("\n"),
|
|
324
|
+
ja: [
|
|
325
|
+
"共有コードを変更する前に「他にどこで使われている?」を問うと、このスキルがワークスペース内のすべてのリポジトリで答えます。",
|
|
326
|
+
"",
|
|
327
|
+
"分析対象:",
|
|
328
|
+
" • シンボル (関数、クラス、型)",
|
|
329
|
+
" • HTTP エンドポイント (`POST /v1/things`)",
|
|
330
|
+
" • 環境変数や設定キー",
|
|
331
|
+
" • イベント/キュー名",
|
|
332
|
+
" • あるいは現在のワークツリーの diff から自動抽出 (リネーム、シグネチャ変更、削除されたエクスポート、ルート変更)。",
|
|
333
|
+
"",
|
|
334
|
+
"検索方法:",
|
|
335
|
+
" • 変更ファイルから各ターゲットリポジトリの言語を検出し、適切な呼び出しイディオム (TS、Kotlin/Java、Python、Go、Rust、Ruby、PHP) を使います。",
|
|
336
|
+
" • 各ヒットを分類: 📞 呼び出し箇所 · 📥 import · 🌐 HTTP 呼び出し元 · 🧩 型の使用 · 🔤 文字列参照 · 📜 スキーマ · 🧪 テスト。",
|
|
337
|
+
"",
|
|
338
|
+
"変更種別ごとに破壊的変更リスクを報告 (リネーム / 削除 / シグネチャ / 振る舞いのみ / エンドポイント / 設定) し、コンパイラが捕捉できない同一シグネチャの振る舞い変更を明示的にフラグします。",
|
|
339
|
+
"",
|
|
340
|
+
"node_modules・dist・build・target・.next・.venv・vendor・*.lock などの標準ノイズディレクトリはすべての検索から除外 — 大きなリポジトリでも高速で、シグナルがきれい。",
|
|
341
|
+
"",
|
|
342
|
+
"読み取り専用。出力はリポジトリごとにグルーピングされ、推奨ロールアウト順を提示します。",
|
|
343
|
+
].join("\n"),
|
|
344
|
+
},
|
|
345
|
+
template: "cross-repo-impact.SKILL.md.tpl",
|
|
346
|
+
destDir: ".claude/skills/agentforge-cross-repo-impact",
|
|
347
|
+
destFile: ".claude/skills/agentforge-cross-repo-impact/SKILL.md",
|
|
348
|
+
},
|
|
349
|
+
{
|
|
350
|
+
id: "agentforge-pre-deploy-check",
|
|
351
|
+
title: "agentforge-pre-deploy-check",
|
|
352
|
+
description: {
|
|
353
|
+
en: "Catch missing migrations or env vars before deploy.",
|
|
354
|
+
ko: "배포 전, 빠진 마이그레이션·환경변수·설정을 찾아줍니다.",
|
|
355
|
+
ja: "デプロイ前に抜けたマイグレーションや環境変数を見つけます。",
|
|
356
|
+
},
|
|
357
|
+
details: {
|
|
358
|
+
en: [
|
|
359
|
+
"The last sanity gate before merging or deploying. Code gets reviewed, but the stuff next to it (migrations, env vars, cache keys) is what causes the 4am page.",
|
|
360
|
+
"",
|
|
361
|
+
"Scans the worktree's diff (against the base branch) for 9 categories:",
|
|
362
|
+
" A. DB schema — ORM entity changes ↔ migration files (Flyway, Liquibase, Prisma, Alembic, etc.). Flags unsafe DDL.",
|
|
363
|
+
" B. Env vars — every new `process.env.X` / `getenv` / `@Value` cross-referenced against .env.example / Helm values / ConfigMap / Secret.",
|
|
364
|
+
" C. Cache keys — Redis/Memcached key format, TTL, or stored value changes (orphaned entries).",
|
|
365
|
+
" D. Message queues — topic / queue / event payload changes. Schema registry.",
|
|
366
|
+
" E. Dependencies — lock file sync, major bumps, removed deps still imported.",
|
|
367
|
+
" F. Infra — Dockerfile, k8s manifests, Helm, Terraform, CI workflows.",
|
|
368
|
+
" G. Feature flags — new flag refs that need to exist in LD / Unleash / GrowthBook before rollout.",
|
|
369
|
+
" H. HTTP API surface — new/removed endpoints, response shape, auth changes.",
|
|
370
|
+
" I. Cron / scheduled jobs.",
|
|
371
|
+
"",
|
|
372
|
+
"Filters out dev-only / test-only env var references (inside `NODE_ENV === 'development'`, `if dev:`, `@Profile(\"local\")` branches, test files) so they don't show up as missing-in-prod-template false positives.",
|
|
373
|
+
"",
|
|
374
|
+
"Output: ❌ action required / ⚠️ heads-up / ✅ clean per category, plus a suggested deploy order and rollback notes.",
|
|
375
|
+
].join("\n"),
|
|
376
|
+
ko: [
|
|
377
|
+
"머지 또는 디플로이 직전의 마지막 sanity 게이트. 코드는 리뷰되지만, 그 옆에 있는 것들 (마이그레이션, 환경변수, 캐시 키) 이 새벽 4시 호출을 부릅니다.",
|
|
378
|
+
"",
|
|
379
|
+
"워크트리의 diff (base 브랜치 대비) 를 9개 카테고리로 스캔합니다:",
|
|
380
|
+
" A. DB 스키마 — ORM 엔티티 변경 ↔ 마이그레이션 파일 (Flyway, Liquibase, Prisma, Alembic 등). 위험한 DDL 표시.",
|
|
381
|
+
" B. 환경변수 — 새로 추가된 모든 `process.env.X` / `getenv` / `@Value` 를 .env.example / Helm values / ConfigMap / Secret 과 교차 검증.",
|
|
382
|
+
" C. 캐시 키 — Redis/Memcached 키 포맷, TTL, 또는 저장 값 변경 (고아 엔트리).",
|
|
383
|
+
" D. 메시지 큐 — topic / queue / event payload 변경. 스키마 레지스트리.",
|
|
384
|
+
" E. 의존성 — lock 파일 동기화, 메이저 버전 업, 제거되었는데 여전히 import 되는 의존성.",
|
|
385
|
+
" F. 인프라 — Dockerfile, k8s manifest, Helm, Terraform, CI 워크플로우.",
|
|
386
|
+
" G. Feature flag — 롤아웃 전에 LD / Unleash / GrowthBook 에 존재해야 하는 신규 플래그 참조.",
|
|
387
|
+
" H. HTTP API 표면 — 추가/제거된 엔드포인트, 응답 형태, 인증 변경.",
|
|
388
|
+
" I. Cron / 스케줄 잡.",
|
|
389
|
+
"",
|
|
390
|
+
"dev/test 전용 env var 참조 (NODE_ENV === 'development' 가지, `if dev:` 가지, @Profile(\"local\"), test 파일 안) 는 자동 필터링되어 거짓 양성으로 뜨지 않음.",
|
|
391
|
+
"",
|
|
392
|
+
"출력: 카테고리별로 ❌ 조치 필요 / ⚠️ 주의 / ✅ 깨끗함, 그리고 권장 디플로이 순서와 롤백 노트.",
|
|
393
|
+
].join("\n"),
|
|
394
|
+
ja: [
|
|
395
|
+
"マージやデプロイ前の最終サニティゲート。コードはレビューされますが、その周辺のもの (マイグレーション、環境変数、キャッシュキー) こそが午前 4 時の呼び出しを引き起こします。",
|
|
396
|
+
"",
|
|
397
|
+
"ワークツリーの diff (ベースブランチとの差分) を 9 カテゴリでスキャンします:",
|
|
398
|
+
" A. DB スキーマ — ORM エンティティの変更 ↔ マイグレーションファイル (Flyway、Liquibase、Prisma、Alembic など)。安全でない DDL にフラグ。",
|
|
399
|
+
" B. 環境変数 — 新規の `process.env.X` / `getenv` / `@Value` を .env.example / Helm values / ConfigMap / Secret と突き合わせます。",
|
|
400
|
+
" C. キャッシュキー — Redis/Memcached のキー形式、TTL、保存値の変更 (孤児エントリ)。",
|
|
401
|
+
" D. メッセージキュー — トピック/キュー/イベントペイロードの変更。スキーマレジストリ。",
|
|
402
|
+
" E. 依存関係 — ロックファイル同期、メジャーバンプ、削除されたが未だ import されている依存。",
|
|
403
|
+
" F. インフラ — Dockerfile、k8s マニフェスト、Helm、Terraform、CI ワークフロー。",
|
|
404
|
+
" G. フィーチャーフラグ — ロールアウト前に LD / Unleash / GrowthBook に存在する必要がある新規フラグ参照。",
|
|
405
|
+
" H. HTTP API サーフェス — 追加/削除エンドポイント、レスポンス形状、認証変更。",
|
|
406
|
+
" I. cron / スケジュールジョブ。",
|
|
407
|
+
"",
|
|
408
|
+
"dev/test 限定の環境変数参照 (NODE_ENV === 'development' ブランチ、`if dev:`、@Profile(\"local\")、test ファイル内) は自動的にフィルタされ、偽陽性として表示されません。",
|
|
409
|
+
"",
|
|
410
|
+
"出力: カテゴリごとに ❌ 対応必須 / ⚠️ 注意 / ✅ クリーン、加えて推奨デプロイ順とロールバックメモ。",
|
|
411
|
+
].join("\n"),
|
|
412
|
+
},
|
|
413
|
+
template: "pre-deploy-check.SKILL.md.tpl",
|
|
414
|
+
destDir: ".claude/skills/agentforge-pre-deploy-check",
|
|
415
|
+
destFile: ".claude/skills/agentforge-pre-deploy-check/SKILL.md",
|
|
416
|
+
},
|
|
417
|
+
{
|
|
418
|
+
id: "agentforge-incident-context",
|
|
419
|
+
title: "agentforge-incident-context",
|
|
420
|
+
description: {
|
|
421
|
+
en: "On an alert: find what changed and who knows the code.",
|
|
422
|
+
ko: "장애 알람이 왔을 때, 최근 변경과 담당자를 모아줍니다.",
|
|
423
|
+
ja: "アラート時、最近の変更と詳しい人をまとめて見つけます。",
|
|
424
|
+
},
|
|
425
|
+
details: {
|
|
426
|
+
en: [
|
|
427
|
+
"You just got paged at 4am. Paste the alert clue (error message, stack trace line, HTTP path, metric name, exception class) and this skill builds the first-responder briefing in one shot.",
|
|
428
|
+
"",
|
|
429
|
+
"What it does:",
|
|
430
|
+
" • Normalizes the clue (extracts file:line from stack traces, picks unique tokens from error messages, keeps both literal and templated forms of HTTP paths).",
|
|
431
|
+
" • Searches every `repos/*` for matching code; reports zero-hit repos explicitly.",
|
|
432
|
+
" • Per matching file: last committer, top historical authors (the people who know it).",
|
|
433
|
+
" • Pulls recent merged PRs in your time window (default 7d) via `gh` that actually touched the matching files. Ranked: in-window first, most recent next, highest-signal file first.",
|
|
434
|
+
" • One-hop call-site search to show whether the suspect runs in a sync HTTP handler, a Kafka listener, a @Scheduled job, etc. — async entry points are flagged because they often hide incidents.",
|
|
435
|
+
"",
|
|
436
|
+
"Output is optimized for a 30-second read at 4am: 🎯 primary suspects first, then 📜 recent PRs, then 👥 contacts, then 📋 concrete next steps (3–5 actions).",
|
|
437
|
+
"",
|
|
438
|
+
"Read-only. Aggressive secret redaction runs *first* on the pasted clue (Bearer / Basic tokens, AWS keys, GitHub PATs, Slack tokens, JWTs, credit card-like numbers, emails, phones) before anything is echoed or logged.",
|
|
439
|
+
].join("\n"),
|
|
440
|
+
ko: [
|
|
441
|
+
"새벽 4시에 호출을 받았습니다. 알림 단서 (에러 메시지, 스택 트레이스 라인, HTTP 경로, 메트릭 이름, 예외 클래스) 를 붙여넣으면, 이 스킬이 1차 대응자용 브리핑을 한 번에 만들어 줍니다.",
|
|
442
|
+
"",
|
|
443
|
+
"수행하는 작업:",
|
|
444
|
+
" • 단서 정규화 (스택 트레이스에서 file:line 추출, 에러 메시지에서 고유 토큰 선별, HTTP 경로는 리터럴/템플릿 형태 모두 유지).",
|
|
445
|
+
" • 모든 `repos/*` 에서 매칭 코드를 검색; 매치가 0개인 리포지토리는 명시적으로 보고.",
|
|
446
|
+
" • 매칭된 파일별: 마지막 커미터, 상위 히스토리 작성자 (그 코드를 아는 사람들).",
|
|
447
|
+
" • 지정한 시간 범위 (기본 7일) 내에 매칭 파일을 실제로 건드린 최근 머지된 PR 들을 `gh` 로 조회. 정렬 기준: 범위 내가 먼저, 그다음 최신순, 그다음 시그널이 강한 파일순.",
|
|
448
|
+
" • 1-hop 호출 지점 검색으로 의심 코드가 동기 HTTP 핸들러, Kafka listener, @Scheduled 잡 등 어디서 실행되는지 표시 — 비동기 엔트리포인트는 인시던트를 자주 숨기므로 별도 표시.",
|
|
449
|
+
"",
|
|
450
|
+
"출력은 새벽 4시 30초 안에 읽을 수 있도록 최적화됨: 🎯 주요 용의자 먼저, 다음 📜 최근 PR, 다음 👥 담당자, 마지막으로 📋 구체적인 다음 단계 (3–5개 액션).",
|
|
451
|
+
"",
|
|
452
|
+
"읽기 전용. 붙여넣은 단서에 대해 강력한 시크릿 redaction 이 *먼저* 실행됨 (Bearer/Basic 토큰, AWS 키, GitHub PAT, Slack 토큰, JWT, 신용카드 형식, 이메일, 전화번호) — 어떤 출력·로그에도 원본이 남지 않게 차단.",
|
|
453
|
+
].join("\n"),
|
|
454
|
+
ja: [
|
|
455
|
+
"午前 4 時に呼び出された直後。アラートの手がかり (エラーメッセージ、スタックトレースの行、HTTP パス、メトリック名、例外クラス) を貼り付ければ、このスキルが初動対応用のブリーフィングを一発で組み立てます。",
|
|
456
|
+
"",
|
|
457
|
+
"何をするか:",
|
|
458
|
+
" • 手がかりを正規化 (スタックトレースから file:line を抽出、エラーメッセージから一意なトークンを選別、HTTP パスはリテラルとテンプレート両方の形式を保持)。",
|
|
459
|
+
" • すべての `repos/*` から該当コードを検索し、ヒット 0 のリポジトリも明示的に報告します。",
|
|
460
|
+
" • マッチしたファイルごとに、最終コミッターと歴代の主要オーサー (そのコードを知る人々) を表示します。",
|
|
461
|
+
" • 時間枠 (デフォルト 7d) 内にマージされた最近の PR を `gh` 経由で取得し、マッチしたファイルに実際に触れたものに絞ります。並び順は: 時間枠内優先、次に新しいもの、シグナル強度の高いファイル順。",
|
|
462
|
+
" • 1 ホップの呼び出し元検索で、疑わしいコードが同期 HTTP ハンドラ、Kafka リスナー、@Scheduled ジョブなどのどこで動くかを示します — 非同期エントリポイントはインシデントを隠しがちなのでフラグされます。",
|
|
463
|
+
"",
|
|
464
|
+
"出力は午前 4 時に 30 秒で読めるよう最適化されています: 🎯 主要な容疑者を最初に、続いて 📜 最近の PR、👥 連絡先、📋 具体的な次のアクション (3〜5 個)。",
|
|
465
|
+
"",
|
|
466
|
+
"読み取り専用。貼り付けられた手がかりに対して、強力な秘匿情報のリダクションを *最初に* 実行します (Bearer/Basic トークン、AWS キー、GitHub PAT、Slack トークン、JWT、クレジットカード形式、メール、電話番号) — 出力やログに原文が残らないようにします。",
|
|
467
|
+
].join("\n"),
|
|
468
|
+
},
|
|
469
|
+
template: "incident-context.SKILL.md.tpl",
|
|
470
|
+
destDir: ".claude/skills/agentforge-incident-context",
|
|
471
|
+
destFile: ".claude/skills/agentforge-incident-context/SKILL.md",
|
|
472
|
+
},
|
|
473
|
+
{
|
|
474
|
+
id: "agentforge-pr-create",
|
|
475
|
+
title: "agentforge-pr-create",
|
|
476
|
+
description: {
|
|
477
|
+
en: "Open one PR per repo for a feature, all at once.",
|
|
478
|
+
ko: "작업한 레포마다 PR을 한꺼번에 만들어 줍니다.",
|
|
479
|
+
ja: "作業した各リポジトリの PR を一度に作成します。",
|
|
480
|
+
},
|
|
481
|
+
details: {
|
|
482
|
+
en: [
|
|
483
|
+
"A feature that spans multiple repos needs one PR per repo (GitHub is repo-scoped). This skill opens that bundle in one go.",
|
|
484
|
+
"",
|
|
485
|
+
"Flow:",
|
|
486
|
+
" 1. Walks `anvil/<slug>/<repo>/` and figures out which worktrees have commits ahead of their base branch. Excludes ones with no changes; warns on uncommitted / unpushed / diverged states.",
|
|
487
|
+
" 2. Shows the candidate set as a table (✓ ready / ⚠ skipped with reason / ✗ no commits) and asks you to multi-select which to open. Default: all ready ones.",
|
|
488
|
+
" 3. Pushes each branch with `-u` (never `--force` — if the remote diverges, stops and asks).",
|
|
489
|
+
" 4. Drafts each PR's title (Conventional Commits style, type/scope inferred) and body from `anvil/<slug>/CLAUDE.md` + that repo's `git diff --stat` + commit log. Shows the drafts for your review before opening.",
|
|
490
|
+
" 5. Opens via `gh pr create`. If a PR already exists for the same head, edits instead of creating duplicates.",
|
|
491
|
+
" 6. After all PRs exist, patches each body's \"Cross-repo\" section with links to the sibling PRs.",
|
|
492
|
+
"",
|
|
493
|
+
"If a repo ships `.github/PULL_REQUEST_TEMPLATE.md`, it's used as the body skeleton (the generator fills matching sections without stripping the template's checklists). Partial failures are reported per repo with the exact gh error; successful PRs are not rolled back.",
|
|
494
|
+
"",
|
|
495
|
+
"After opening, prints a plain-text PR summary block (portable to any chat/doc tool) — purely the PRs, no greetings or review requests.",
|
|
496
|
+
"",
|
|
497
|
+
"Safety: concurrency lock via `anvil/<slug>/.agentforge.lock`; activity log appended to `<workspace>/agentforge/log.jsonl` for each created / edited / cross-linked PR.",
|
|
498
|
+
"",
|
|
499
|
+
"Externally visible action — always confirms before pushing or opening. Never auto-merges.",
|
|
500
|
+
].join("\n"),
|
|
501
|
+
ko: [
|
|
502
|
+
"여러 리포지토리에 걸친 기능은 리포지토리당 1개의 PR 이 필요합니다 (GitHub 은 리포지토리 단위). 이 스킬은 그 묶음을 한 번에 엽니다.",
|
|
503
|
+
"",
|
|
504
|
+
"흐름:",
|
|
505
|
+
" 1. `anvil/<slug>/<repo>/` 를 순회하며 base 브랜치보다 앞선 커밋이 있는 워크트리를 식별. 변경 없는 것은 제외하고, 미커밋 / 미푸시 / diverged 상태는 경고.",
|
|
506
|
+
" 2. 후보 집합을 표로 표시 (✓ 준비됨 / ⚠ 건너뜀(사유) / ✗ 커밋 없음) 하고, 어떤 것을 열지 다중 선택 요청. 기본값: 준비된 모든 것.",
|
|
507
|
+
" 3. 각 브랜치를 `-u` 와 함께 푸시 (절대 `--force` 사용 안 함 — 원격이 diverge 되면 멈추고 질문).",
|
|
508
|
+
" 4. 각 PR 의 제목 (Conventional Commits 스타일, type/scope 추론) 과 본문을 `anvil/<slug>/CLAUDE.md` + 해당 리포지토리의 `git diff --stat` + 커밋 로그로부터 초안 작성. 열기 전에 초안을 검토받음.",
|
|
509
|
+
" 5. `gh pr create` 로 생성. 동일 head 에 대해 이미 PR 이 있으면, 중복 생성 대신 수정.",
|
|
510
|
+
" 6. 모든 PR 이 생성된 후, 각 본문의 \"Cross-repo\" 섹션을 형제 PR 들의 링크로 패치.",
|
|
511
|
+
"",
|
|
512
|
+
"레포지토리에 `.github/PULL_REQUEST_TEMPLATE.md` 가 있으면 그걸 본문 골격으로 사용 (체크리스트 등 보존하며 매칭 섹션에만 채움). 부분 실패는 레포별로 gh 에러와 함께 보고하며, 성공한 PR 은 롤백하지 않음.",
|
|
513
|
+
"",
|
|
514
|
+
"PR 생성 후, plain text PR 요약 블록을 출력 (어디든 붙여넣기 가능) — 인사말이나 리뷰 요청 없이 순수 PR 내용만.",
|
|
515
|
+
"",
|
|
516
|
+
"안전장치: `anvil/<slug>/.agentforge.lock` 으로 동시 세션 충돌 방지; PR 생성·편집·cross-link patch 마다 `<workspace>/agentforge/log.jsonl` 에 활동 로그 append.",
|
|
517
|
+
"",
|
|
518
|
+
"외부에 노출되는 동작 — 푸시하거나 PR 을 열기 전에 항상 확인을 받습니다. 자동 머지는 절대 하지 않습니다.",
|
|
519
|
+
].join("\n"),
|
|
520
|
+
ja: [
|
|
521
|
+
"複数リポジトリにまたがる機能は、リポジトリごとに 1 つの PR が必要です (GitHub はリポジトリスコープ)。このスキルはそのバンドルを一度に開きます。",
|
|
522
|
+
"",
|
|
523
|
+
"フロー:",
|
|
524
|
+
" 1. `anvil/<slug>/<repo>/` を走査し、ベースブランチに対してコミットが進んでいるワークツリーを特定します。変更なしは除外、未コミット/未プッシュ/分岐状態は警告します。",
|
|
525
|
+
" 2. 候補セットを表 (✓ 準備完了 / ⚠ スキップ (理由付き) / ✗ コミットなし) で表示し、開くものを複数選択させます。デフォルト: 準備完了のすべて。",
|
|
526
|
+
" 3. 各ブランチを `-u` 付きでプッシュします (`--force` は決して使いません — リモートが分岐していれば停止して尋ねます)。",
|
|
527
|
+
" 4. 各 PR のタイトル (Conventional Commits スタイル、type/scope は推論) と本文を、`anvil/<slug>/CLAUDE.md` + そのリポジトリの `git diff --stat` + コミットログから下書きします。開く前にドラフトを確認できます。",
|
|
528
|
+
" 5. `gh pr create` で作成します。同じ head の PR がすでに存在する場合は、重複を作らず編集します。",
|
|
529
|
+
" 6. すべての PR が揃った後、各本文の「Cross-repo」セクションに兄弟 PR へのリンクを当てます。",
|
|
530
|
+
"",
|
|
531
|
+
"リポジトリに `.github/PULL_REQUEST_TEMPLATE.md` があればそれを本文のスケルトンとして使用 (チェックリストなどを残しつつ、対応するセクションのみを埋めます)。部分的な失敗はリポジトリごとに gh のエラーと共に報告し、成功した PR はロールバックしません。",
|
|
532
|
+
"",
|
|
533
|
+
"作成後、プレーンテキストの PR サマリーブロックを出力します (どこにでも貼り付け可能) — 挨拶やレビュー依頼なしで、純粋に PR の内容のみ。",
|
|
534
|
+
"",
|
|
535
|
+
"安全機構: `anvil/<slug>/.agentforge.lock` で同時セッションの衝突を防止; PR 作成・編集・cross-link パッチごとに `<workspace>/agentforge/log.jsonl` にアクティビティログを追記。",
|
|
536
|
+
"",
|
|
537
|
+
"外部に見えるアクション — プッシュや作成の前に必ず確認します。自動マージは決してしません。",
|
|
538
|
+
].join("\n"),
|
|
539
|
+
},
|
|
540
|
+
template: "pr-create.SKILL.md.tpl",
|
|
541
|
+
destDir: ".claude/skills/agentforge-pr-create",
|
|
542
|
+
destFile: ".claude/skills/agentforge-pr-create/SKILL.md",
|
|
543
|
+
},
|
|
544
|
+
{
|
|
545
|
+
id: "agentforge-history",
|
|
546
|
+
title: "agentforge-history",
|
|
547
|
+
description: {
|
|
548
|
+
en: "Look up decisions, PRs, and retros from past features.",
|
|
549
|
+
ko: "과거 피쳐의 결정·PR·회고를 찾아봅니다.",
|
|
550
|
+
ja: "過去の機能の決定・PR・レトロを調べます。",
|
|
551
|
+
},
|
|
552
|
+
details: {
|
|
553
|
+
en: [
|
|
554
|
+
"When you ask about earlier work — \"how did we handle X last time?\", \"which feature added Y?\", \"find that PR about Z\" — this skill queries the workspace's accumulated history and answers with grounded references (file paths, commit hashes, PR URLs).",
|
|
555
|
+
"",
|
|
556
|
+
"Data sources (closed features under artifacts/<YYYYMMDD>/<slug>/, plus in-progress under anvil/<slug>/):",
|
|
557
|
+
" • artifacts/<YYYYMMDD>/<slug>/CLAUDE.md — original description + repos in scope (moved here on retro)",
|
|
558
|
+
" • artifacts/<YYYYMMDD>/<slug>/RETRO.md — what was decided and what was built",
|
|
559
|
+
" • artifacts/<YYYYMMDD>/<slug>/refs.json — per-repo {branch, head, merged_into, pr}",
|
|
560
|
+
" • artifacts/<YYYYMMDD>/<slug>/plans/*.md — plan files captured during the work",
|
|
561
|
+
" • artifacts/<YYYYMMDD>/<slug>/sessions/*.jsonl — full Claude transcripts (queried only when needed)",
|
|
562
|
+
" • anvil/<slug>/CLAUDE.md — in-progress features",
|
|
563
|
+
" • agentforge/log.jsonl — append-only activity log",
|
|
564
|
+
"",
|
|
565
|
+
"Filters: by keyword (greps RETROs + plans), by repo (refs.json), by date window (YYMMDD prefix), or by PR number / partial commit hash.",
|
|
566
|
+
"",
|
|
567
|
+
"Cross-feature mode: surfaces recurring patterns across RETROs (e.g. \"cache invalidation has come up in 3 features — here's how each one resolved it\").",
|
|
568
|
+
"",
|
|
569
|
+
"Read-only. Every claim cites the file path so you can verify and dig deeper.",
|
|
570
|
+
].join("\n"),
|
|
571
|
+
ko: [
|
|
572
|
+
"예전 작업에 대한 질문 — \"지난번에 X 어떻게 했지?\", \"Y 추가한 게 어떤 피쳐였더라?\", \"그 Z 관련 PR 찾아줘\" — 이 스킬이 워크스페이스에 쌓인 히스토리를 질의하고 근거 있는 참조 (파일 경로·커밋 해시·PR URL) 와 함께 답합니다.",
|
|
573
|
+
"",
|
|
574
|
+
"데이터 소스 (종료된 피쳐는 artifacts/<YYYYMMDD>/<slug>/, 진행 중은 anvil/<slug>/):",
|
|
575
|
+
" • artifacts/<YYYYMMDD>/<slug>/CLAUDE.md — 원본 설명 + 범위 리포지토리 (retro 시 이관됨)",
|
|
576
|
+
" • artifacts/<YYYYMMDD>/<slug>/RETRO.md — 결정과 산출물",
|
|
577
|
+
" • artifacts/<YYYYMMDD>/<slug>/refs.json — 리포지토리별 {branch, head, merged_into, pr}",
|
|
578
|
+
" • artifacts/<YYYYMMDD>/<slug>/plans/*.md — 작업 중 캡처된 plan 파일",
|
|
579
|
+
" • artifacts/<YYYYMMDD>/<slug>/sessions/*.jsonl — Claude 트랜스크립트 전체 (필요시에만 조회)",
|
|
580
|
+
" • anvil/<slug>/CLAUDE.md — 진행 중 피쳐",
|
|
581
|
+
" • agentforge/log.jsonl — append-only 활동 로그",
|
|
582
|
+
"",
|
|
583
|
+
"필터: 키워드 (RETRO + plan grep), 리포지토리 (refs.json), 시간 범위 (YYMMDD prefix), 또는 PR 번호 / 부분 commit 해시.",
|
|
584
|
+
"",
|
|
585
|
+
"Cross-feature 모드: RETRO 들에 걸친 반복 패턴 부각 (예: \"캐시 무효화 가 3개 피쳐에 등장 — 각각 어떻게 해결했는지 비교\").",
|
|
586
|
+
"",
|
|
587
|
+
"읽기 전용. 모든 주장은 파일 경로를 인용해 검증 가능.",
|
|
588
|
+
].join("\n"),
|
|
589
|
+
ja: [
|
|
590
|
+
"過去の作業に関する質問 — 「前回 X はどう扱った?」「Y を追加したのはどの機能?」「Z についての PR を見つけて」 — に対し、ワークスペースに蓄積された履歴を照会し、根拠付きの参照 (ファイルパス・コミットハッシュ・PR URL) と共に回答します。",
|
|
591
|
+
"",
|
|
592
|
+
"データソース (完了済みは artifacts/<YYYYMMDD>/<slug>/、進行中は anvil/<slug>/):",
|
|
593
|
+
" • artifacts/<YYYYMMDD>/<slug>/CLAUDE.md — 元の説明 + スコープ内リポジトリ (retro 時に移動)",
|
|
594
|
+
" • artifacts/<YYYYMMDD>/<slug>/RETRO.md — 決定事項と成果物",
|
|
595
|
+
" • artifacts/<YYYYMMDD>/<slug>/refs.json — リポジトリ別 {branch, head, merged_into, pr}",
|
|
596
|
+
" • artifacts/<YYYYMMDD>/<slug>/plans/*.md — 作業中にキャプチャされたプランファイル",
|
|
597
|
+
" • artifacts/<YYYYMMDD>/<slug>/sessions/*.jsonl — Claude のフル文字起こし (必要時のみ参照)",
|
|
598
|
+
" • anvil/<slug>/CLAUDE.md — 進行中の機能",
|
|
599
|
+
" • agentforge/log.jsonl — 追記専用のアクティビティログ",
|
|
600
|
+
"",
|
|
601
|
+
"フィルタ: キーワード (RETRO + plan を grep)、リポジトリ (refs.json)、期間 (YYMMDD プレフィックス)、または PR 番号 / 部分コミットハッシュ。",
|
|
602
|
+
"",
|
|
603
|
+
"クロス機能モード: RETRO をまたいだ繰り返しパターンを浮かび上がらせます (例: 「キャッシュ無効化は 3 つの機能で発生 — 各回でどう解決したかを比較」)。",
|
|
604
|
+
"",
|
|
605
|
+
"読み取り専用。すべての主張はファイルパスを引用するため検証可能。",
|
|
606
|
+
].join("\n"),
|
|
607
|
+
},
|
|
608
|
+
template: "history.SKILL.md.tpl",
|
|
609
|
+
destDir: ".claude/skills/agentforge-history",
|
|
610
|
+
destFile: ".claude/skills/agentforge-history/SKILL.md",
|
|
611
|
+
},
|
|
612
|
+
{
|
|
613
|
+
id: "agentforge-release-coordinate",
|
|
614
|
+
title: "agentforge-release-coordinate",
|
|
615
|
+
description: {
|
|
616
|
+
en: "Plan the multi-repo merge / deploy order for a feature.",
|
|
617
|
+
ko: "여러 repo 에 걸친 피쳐의 머지·배포 순서를 계획해 줍니다.",
|
|
618
|
+
ja: "複数リポジトリにまたがる機能のマージ・デプロイ順序を計画します。",
|
|
619
|
+
},
|
|
620
|
+
details: {
|
|
621
|
+
en: [
|
|
622
|
+
"Where pre-deploy-check answers \"is this ready to ship?\", this skill answers \"once it's ready, in what order do I merge and deploy?\" for a feature that spans multiple repos.",
|
|
623
|
+
"",
|
|
624
|
+
"How it works:",
|
|
625
|
+
" • Identifies in-scope repos + branches from the worktrees under anvil/<slug>/ and pulls each open PR (CI status, reviews, draft state) via gh.",
|
|
626
|
+
" • Analyzes each worktree's diff for cross-repo dependencies: new HTTP endpoints, exported types / OpenAPI / protobuf / GraphQL contract changes, package version bumps that consume each other, message-queue producer/consumer pairs, shared DB schema changes, feature flags.",
|
|
627
|
+
" • Builds a directed graph, topologically sorts it, and groups steps into sequential vs parallel batches.",
|
|
628
|
+
" • Per step: preconditions (CI green, required approvals), post-merge wait conditions (deploy completion, downstream healthcheck), and estimated wait when known from past features.",
|
|
629
|
+
" • Always outputs a reverse-order rollback playbook, with irreversible operations (destructive migrations, deleted columns) clearly flagged.",
|
|
630
|
+
" • Surfaces dependency cycles to the user rather than guessing — those indicate a real coordination problem (e.g. mutual API dependency that needs a compatibility shim).",
|
|
631
|
+
"",
|
|
632
|
+
"Read-only: never runs `gh pr merge`, `git push`, or deploy commands. Outputs the plan; the user executes it.",
|
|
633
|
+
].join("\n"),
|
|
634
|
+
ko: [
|
|
635
|
+
"pre-deploy-check 가 \"출하 준비됐나?\" 라면, 이 스킬은 \"준비됐을 때 어떤 순서로 머지·배포하나?\" 에 답합니다 — 여러 repo 에 걸친 피쳐를 대상으로.",
|
|
636
|
+
"",
|
|
637
|
+
"동작 방식:",
|
|
638
|
+
" • anvil/<slug>/ 아래 워크트리들로부터 in-scope repo + 브랜치를 식별하고, gh 로 각 열린 PR (CI, 리뷰, draft 여부) 을 가져옵니다.",
|
|
639
|
+
" • 각 워크트리의 diff 를 분석해 cross-repo 의존성을 찾습니다: 새 HTTP 엔드포인트, 노출 타입 / OpenAPI / protobuf / GraphQL 변경, 서로 의존하는 패키지 버전 bump, 메시지 큐 producer/consumer 쌍, 공유 DB 스키마 변경, 피쳐 플래그.",
|
|
640
|
+
" • 방향 그래프를 만들어 위상 정렬하고, 단계를 sequential / parallel 묶음으로 분류합니다.",
|
|
641
|
+
" • 각 단계마다: 선행 조건 (CI green, 필수 승인), 머지 후 대기 조건 (배포 완료, downstream 헬스체크), 그리고 과거 피쳐로부터 예상 대기 시간을 함께 출력합니다.",
|
|
642
|
+
" • 역순 롤백 플레이북도 항상 출력 — 비가역 작업 (파괴적 마이그레이션, 삭제된 컬럼) 은 명확히 표시합니다.",
|
|
643
|
+
" • 의존성 사이클은 추측하지 않고 사용자에게 보고합니다 — 사이클은 실제 코디네이션 문제 (양방향 API 의존성 등 compat shim 필요) 의 신호입니다.",
|
|
644
|
+
"",
|
|
645
|
+
"읽기 전용: `gh pr merge`, `git push`, 배포 명령을 절대 실행하지 않습니다. 계획을 출력하고 — 실행은 사용자가 합니다.",
|
|
646
|
+
].join("\n"),
|
|
647
|
+
ja: [
|
|
648
|
+
"pre-deploy-check が「出荷準備はできているか?」に答えるのに対し、このスキルは「準備ができた後、どの順序でマージ・デプロイするか?」に答えます — 複数リポジトリにまたがる機能を対象に。",
|
|
649
|
+
"",
|
|
650
|
+
"動作の仕組み:",
|
|
651
|
+
" • anvil/<slug>/ 配下のワークツリーから対象リポジトリとブランチを特定し、gh で各オープン PR (CI 状態、レビュー、ドラフトかどうか) を取得します。",
|
|
652
|
+
" • 各ワークツリーの diff からリポジトリ間依存を分析します: 新規 HTTP エンドポイント、公開型 / OpenAPI / protobuf / GraphQL の契約変更、互いに依存するパッケージのバージョン bump、メッセージキューの producer/consumer ペア、共有 DB スキーマ変更、フィーチャーフラグ。",
|
|
653
|
+
" • 有向グラフを構築してトポロジカルソートし、ステップを sequential / parallel のグループに分類します。",
|
|
654
|
+
" • 各ステップごとに: 事前条件 (CI green、必要な承認)、マージ後の待機条件 (デプロイ完了、下流のヘルスチェック)、過去機能からの予想待ち時間を出力します。",
|
|
655
|
+
" • 逆順のロールバック手順も常に出力 — 不可逆な操作 (破壊的マイグレーション、削除されたカラム) は明示します。",
|
|
656
|
+
" • 依存サイクルは推測せずユーザーに報告します — サイクルは実際の調整問題 (双方向 API 依存に互換シムが必要、など) を示します。",
|
|
657
|
+
"",
|
|
658
|
+
"読み取り専用: `gh pr merge`、`git push`、デプロイコマンドは一切実行しません。プランを出力し、実行はユーザーが行います。",
|
|
659
|
+
].join("\n"),
|
|
660
|
+
},
|
|
661
|
+
template: "release-coordinate.SKILL.md.tpl",
|
|
662
|
+
destDir: ".claude/skills/agentforge-release-coordinate",
|
|
663
|
+
destFile: ".claude/skills/agentforge-release-coordinate/SKILL.md",
|
|
664
|
+
},
|
|
665
|
+
{
|
|
666
|
+
id: "agentforge-context-handoff",
|
|
667
|
+
title: "agentforge-context-handoff",
|
|
668
|
+
description: {
|
|
669
|
+
en: "Package a feature's current state into a single handoff doc.",
|
|
670
|
+
ko: "피쳐의 현재 상태를 한 장의 인계 문서로 정리해 줍니다.",
|
|
671
|
+
ja: "機能の現在の状態を 1 ページの引き継ぎドキュメントにまとめます。",
|
|
672
|
+
},
|
|
673
|
+
details: {
|
|
674
|
+
en: [
|
|
675
|
+
"Writes anvil/<slug>/HANDOFF.md so another developer (or future-you) can resume the feature without reconstructing context from git and PR threads.",
|
|
676
|
+
"",
|
|
677
|
+
"What it gathers:",
|
|
678
|
+
" • Feature description + repos in scope from CLAUDE.md (read-only — never modified).",
|
|
679
|
+
" • Per-worktree state: branch, commits ahead of base, **uncommitted changes** (the most important thing to flag — invisible to anyone else), unpushed commits, last commit message.",
|
|
680
|
+
" • Open PRs per repo: number, URL, CI state, review state, and **unaddressed review threads** (where the last reply is a reviewer's, not the author's).",
|
|
681
|
+
" • Pending plan items (from CLAUDE.md / PLAN.md), open questions, TODO/FIXME markers added in this feature's diff.",
|
|
682
|
+
" • \"Where you left off\" — most recently edited files + last commit message per repo.",
|
|
683
|
+
"",
|
|
684
|
+
"If anvil/<slug>/HANDOFF.md already exists, the previous version is backed up to HANDOFF.md.bak before overwriting.",
|
|
685
|
+
"",
|
|
686
|
+
"Optionally — only with explicit user confirmation — posts a short summary as a comment on each related PR so reviewers see the handoff. Never posts without asking.",
|
|
687
|
+
"",
|
|
688
|
+
"Never modifies CLAUDE.md, never pushes commits, never touches code.",
|
|
689
|
+
].join("\n"),
|
|
690
|
+
ko: [
|
|
691
|
+
"anvil/<slug>/HANDOFF.md 를 생성해, 다른 개발자 (또는 시간이 지난 미래의 나) 가 git 과 PR 스레드를 다시 재구성하지 않고도 피쳐를 이어받을 수 있게 합니다.",
|
|
692
|
+
"",
|
|
693
|
+
"수집 항목:",
|
|
694
|
+
" • CLAUDE.md 의 피쳐 설명 + in-scope repo (읽기 전용 — 수정하지 않음).",
|
|
695
|
+
" • 워크트리별 상태: 브랜치, base 대비 앞선 커밋 수, **커밋 안 된 변경사항** (가장 중요 — 원작자 외에는 보이지 않음), 푸시 안 된 커밋, 마지막 커밋 메시지.",
|
|
696
|
+
" • repo 별 열린 PR: 번호, URL, CI 상태, 리뷰 상태, 그리고 **미해결 리뷰 스레드** (마지막 답글이 리뷰어의 것이고 작성자가 응답하지 않은 것).",
|
|
697
|
+
" • 미완료 plan 항목 (CLAUDE.md / PLAN.md), 열린 질문, 이번 피쳐 diff 에 추가된 TODO/FIXME 마커.",
|
|
698
|
+
" • \"어디서 멈췄나\" — 가장 최근 수정 파일 + repo 별 마지막 커밋 메시지.",
|
|
699
|
+
"",
|
|
700
|
+
"이미 anvil/<slug>/HANDOFF.md 가 있으면, 덮어쓰기 전에 HANDOFF.md.bak 으로 백업합니다.",
|
|
701
|
+
"",
|
|
702
|
+
"선택적으로 — 사용자가 명시적으로 동의한 경우에만 — 짧은 요약을 각 관련 PR 에 코멘트로 게시해 리뷰어가 인계 사실을 알 수 있게 합니다. 동의 없이는 절대 게시하지 않습니다.",
|
|
703
|
+
"",
|
|
704
|
+
"CLAUDE.md 를 절대 수정하지 않고, 커밋을 push 하지 않으며, 코드를 건드리지 않습니다.",
|
|
705
|
+
].join("\n"),
|
|
706
|
+
ja: [
|
|
707
|
+
"anvil/<slug>/HANDOFF.md を生成し、別の開発者 (または時間が経った未来の自分) が git や PR スレッドからコンテキストを再構築せずに機能を引き継げるようにします。",
|
|
708
|
+
"",
|
|
709
|
+
"収集する情報:",
|
|
710
|
+
" • CLAUDE.md の機能説明と対象リポジトリ (読み取り専用 — 変更しません)。",
|
|
711
|
+
" • ワークツリーごとの状態: ブランチ、base に対する先行コミット数、**未コミットの変更** (最重要 — 原作者以外には見えない)、未プッシュコミット、最後のコミットメッセージ。",
|
|
712
|
+
" • リポジトリごとのオープン PR: 番号、URL、CI 状態、レビュー状態、そして **未対応のレビュースレッド** (最後の返信がレビュアーであり、作者がまだ応答していないもの)。",
|
|
713
|
+
" • 未完了の plan 項目 (CLAUDE.md / PLAN.md)、オープンな質問、今回の機能の diff で追加された TODO/FIXME マーカー。",
|
|
714
|
+
" • 「どこで止めたか」 — 直近編集ファイルとリポジトリごとの最後のコミットメッセージ。",
|
|
715
|
+
"",
|
|
716
|
+
"anvil/<slug>/HANDOFF.md がすでに存在する場合、上書きする前に HANDOFF.md.bak としてバックアップします。",
|
|
717
|
+
"",
|
|
718
|
+
"オプションとして — ユーザーが明示的に同意した場合のみ — 関連する各 PR に短い要約をコメントとして投稿し、レビュアーに引き継ぎを通知します。同意なしには絶対に投稿しません。",
|
|
719
|
+
"",
|
|
720
|
+
"CLAUDE.md を変更せず、コミットを push せず、コードに触れません。",
|
|
721
|
+
].join("\n"),
|
|
722
|
+
},
|
|
723
|
+
template: "context-handoff.SKILL.md.tpl",
|
|
724
|
+
destDir: ".claude/skills/agentforge-context-handoff",
|
|
725
|
+
destFile: ".claude/skills/agentforge-context-handoff/SKILL.md",
|
|
726
|
+
},
|
|
727
|
+
];
|