claude-plugin-viban 1.2.1 → 1.3.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/.claude-plugin/plugin.json +1 -1
- package/bin/viban +21 -10
- package/commands/assign.md +8 -211
- package/commands/parallel-assign.md +9 -3
- package/commands/setup.md +1 -1
- package/docs/CLAUDE.md +3 -3
- package/package.json +1 -1
- package/skills/assign/SKILL.md +47 -152
- package/skills/parallel-assign/SKILL.md +12 -18
- package/skills/setup/SKILL.md +1 -1
- package/commands/sync.md +0 -99
- package/skills/sync/SKILL.md +0 -100
package/bin/viban
CHANGED
|
@@ -906,7 +906,7 @@ draw_board() {
|
|
|
906
906
|
|
|
907
907
|
draw_footer() {
|
|
908
908
|
printf '\033[K\n'
|
|
909
|
-
print_center "←→ Column │ ↑↓ Card │ Shift+↑↓ Reorder │ Shift+←→ Move │ Enter Edit │ ⌫ Del │ A Add │ Q Quit" "${A_DIM}"
|
|
909
|
+
print_center "←→ Column │ ↑↓ Card │ Shift+↑↓ Reorder │ Shift+←→ Move │ Enter Edit/PR │ ⌫ Del │ A Add │ Q Quit" "${A_DIM}"
|
|
910
910
|
}
|
|
911
911
|
|
|
912
912
|
read_key() {
|
|
@@ -1047,8 +1047,7 @@ delete_issue() {
|
|
|
1047
1047
|
local repo_root=$(git rev-parse --show-toplevel 2>/dev/null)
|
|
1048
1048
|
local wt_dir="$VIBAN_DATA_DIR/worktrees/$id"
|
|
1049
1049
|
|
|
1050
|
-
|
|
1051
|
-
local branch="viban-$id"
|
|
1050
|
+
local branch="issue-$id"
|
|
1052
1051
|
local _ext_id=$(get_ext_id "$id")
|
|
1053
1052
|
if [[ -n "$_ext_id" && "$_ext_id" != "null" ]]; then
|
|
1054
1053
|
local _issue_num="${_ext_id##*:}"
|
|
@@ -1174,11 +1173,24 @@ level1_columns() {
|
|
|
1174
1173
|
if (( cnt > 0 )); then
|
|
1175
1174
|
local id=$(get_issue_id_at_index "$st" "$card" "$json_data")
|
|
1176
1175
|
[[ -n "$id" ]] && {
|
|
1177
|
-
|
|
1178
|
-
|
|
1179
|
-
|
|
1180
|
-
|
|
1181
|
-
|
|
1176
|
+
if [[ "$st" == "review" ]]; then
|
|
1177
|
+
# Open associated PR in browser
|
|
1178
|
+
local _branch="issue-${id}"
|
|
1179
|
+
local _ext_id=$(get_ext_id "$id")
|
|
1180
|
+
if [[ -n "$_ext_id" && "$_ext_id" != "null" ]]; then
|
|
1181
|
+
local _num="${_ext_id##*:}"
|
|
1182
|
+
gh pr view "$_num" --web 2>/dev/null || \
|
|
1183
|
+
gh pr list --head "$_branch" --web 2>/dev/null
|
|
1184
|
+
else
|
|
1185
|
+
gh pr list --head "$_branch" --web 2>/dev/null
|
|
1186
|
+
fi
|
|
1187
|
+
else
|
|
1188
|
+
printf '\033[?25h'
|
|
1189
|
+
stty echo 2>/dev/null
|
|
1190
|
+
edit_issue "$id"
|
|
1191
|
+
stty -echo 2>/dev/null
|
|
1192
|
+
printf '\033[?25l\033[2J\033[H'
|
|
1193
|
+
fi
|
|
1182
1194
|
}
|
|
1183
1195
|
fi
|
|
1184
1196
|
;;
|
|
@@ -1519,8 +1531,7 @@ cmd_done() {
|
|
|
1519
1531
|
local repo_root=$(git rev-parse --show-toplevel 2>/dev/null)
|
|
1520
1532
|
local wt_dir="$VIBAN_DATA_DIR/worktrees/$1"
|
|
1521
1533
|
|
|
1522
|
-
|
|
1523
|
-
local branch="viban-$1"
|
|
1534
|
+
local branch="issue-$1"
|
|
1524
1535
|
local _ext_id=$(get_ext_id "$1")
|
|
1525
1536
|
if [[ -n "$_ext_id" && "$_ext_id" != "null" ]]; then
|
|
1526
1537
|
local _issue_num="${_ext_id##*:}"
|
package/commands/assign.md
CHANGED
|
@@ -1,217 +1,14 @@
|
|
|
1
1
|
---
|
|
2
|
-
description: "Assign
|
|
2
|
+
description: "Assign first backlog issue — clarify if unclear, then finish"
|
|
3
3
|
---
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
Run `/viban:assign` to pick up the next backlog issue.
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
Usage: `/viban:assign`
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
What it does:
|
|
10
|
+
1. Assigns the first backlog issue (by priority) to the current session
|
|
11
|
+
2. If the issue description is unclear or lacks context, interviews you to gather missing information and updates the issue
|
|
12
|
+
3. That's it — no implementation, no branch creation
|
|
10
13
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
## Phase 0: SETUP
|
|
14
|
-
|
|
15
|
-
### 0.1 Read Workflow (CRITICAL)
|
|
16
|
-
|
|
17
|
-
Check in priority order — first match wins, follow it exactly:
|
|
18
|
-
|
|
19
|
-
1. `.viban/workflow.md` → `[ -f ".viban/workflow.md" ] && cat ".viban/workflow.md"`
|
|
20
|
-
2. CLAUDE.md (legacy, only if no workflow.md):
|
|
21
|
-
```bash
|
|
22
|
-
for path in "./CLAUDE.md" "./.claude/CLAUDE.md" "../CLAUDE.md"; do
|
|
23
|
-
[ -f "$path" ] && cat "$path"
|
|
24
|
-
done
|
|
25
|
-
```
|
|
26
|
-
Look for `Issue Resolution Workflow` or `Workflow` section.
|
|
27
|
-
3. Default workflow (Phase 1 below)
|
|
28
|
-
|
|
29
|
-
### 0.2 Git Setup & Assign
|
|
30
|
-
|
|
31
|
-
```bash
|
|
32
|
-
# Check uncommitted changes → AskUserQuestion if dirty
|
|
33
|
-
[ -n "$(git status --porcelain)" ] && echo "Warning: Uncommitted changes"
|
|
34
|
-
|
|
35
|
-
git checkout main && git fetch origin main && git reset --hard origin/main
|
|
36
|
-
|
|
37
|
-
ISSUE_ID=$(viban assign 2>&1 | tail -1)
|
|
38
|
-
[[ -z "$ISSUE_ID" || "$ISSUE_ID" == "No backlog" ]] && echo "No issues in backlog" && exit 0
|
|
39
|
-
```
|
|
40
|
-
|
|
41
|
-
### 0.3 Detect Sync & Create Branch
|
|
42
|
-
|
|
43
|
-
```bash
|
|
44
|
-
ISSUE_JSON=$(viban get $ISSUE_ID)
|
|
45
|
-
EXT_ID=$(echo "$ISSUE_JSON" | jq -r '.external_id // ""')
|
|
46
|
-
SYNC_ACTIVE=false; EXTERNAL_NUM=""
|
|
47
|
-
|
|
48
|
-
if [ -n "$EXT_ID" ] && [ "$EXT_ID" != "null" ]; then
|
|
49
|
-
SYNC_ACTIVE=true
|
|
50
|
-
EXTERNAL_NUM="${EXT_ID##*:}" # "github:42" -> "42"
|
|
51
|
-
TITLE=$(echo "$ISSUE_JSON" | jq -r '.title' | tr '[:upper:]' '[:lower:]' | sed 's/[^a-z0-9]/-/g' | head -c 40)
|
|
52
|
-
git checkout -b "issue-${EXTERNAL_NUM}-${TITLE}"
|
|
53
|
-
else
|
|
54
|
-
git checkout -b issue-$ISSUE_ID
|
|
55
|
-
fi
|
|
56
|
-
```
|
|
57
|
-
|
|
58
|
-
### 0.4 Load Plan (if available)
|
|
59
|
-
|
|
60
|
-
```bash
|
|
61
|
-
[ -f ".viban/plans/${ISSUE_ID}.md" ] && cat ".viban/plans/${ISSUE_ID}.md"
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
If plan exists: use as primary guide for Phase 1, skip redundant analysis, but verify plan is still current.
|
|
65
|
-
|
|
66
|
-
---
|
|
67
|
-
|
|
68
|
-
## Phase 1: ANALYZE & IMPLEMENT
|
|
69
|
-
|
|
70
|
-
```bash
|
|
71
|
-
viban get $ISSUE_ID
|
|
72
|
-
```
|
|
73
|
-
|
|
74
|
-
**With project workflow**: follow its exact steps.
|
|
75
|
-
**Default** (no workflow): Understand → Locate → Analyze root cause → Implement minimal changes.
|
|
76
|
-
|
|
77
|
-
---
|
|
78
|
-
|
|
79
|
-
## Phase 2: VERIFY
|
|
80
|
-
|
|
81
|
-
Manual verification — do NOT run build/test here (Phase 3).
|
|
82
|
-
|
|
83
|
-
| Type | Tool |
|
|
84
|
-
|------|------|
|
|
85
|
-
| Web UI | Playwright MCP (`browser_navigate`, `browser_snapshot`, `browser_click`) |
|
|
86
|
-
| API | WebFetch |
|
|
87
|
-
| CLI | Bash |
|
|
88
|
-
| Visual | Read (screenshot files) |
|
|
89
|
-
| Browser | Chrome DevTools MCP |
|
|
90
|
-
|
|
91
|
-
Steps: identify what proves the fix → execute → confirm behavior → document evidence.
|
|
92
|
-
|
|
93
|
-
Examples:
|
|
94
|
-
- Web feature: navigate to page, take snapshot, verify element exists
|
|
95
|
-
- API fix: fetch endpoint, check response status and body
|
|
96
|
-
- CLI change: run command, verify output format
|
|
97
|
-
- UI bug: navigate, interact, confirm no error
|
|
98
|
-
|
|
99
|
-
If verification fails: return to Phase 1.
|
|
100
|
-
|
|
101
|
-
---
|
|
102
|
-
|
|
103
|
-
## Phase 3: SHIP
|
|
104
|
-
|
|
105
|
-
### 3.1 Build & Test
|
|
106
|
-
|
|
107
|
-
Run project's build/test commands. If fail: fix → return to Phase 2.
|
|
108
|
-
|
|
109
|
-
### 3.2 Rebase
|
|
110
|
-
|
|
111
|
-
```bash
|
|
112
|
-
git fetch origin main && git rebase origin/main
|
|
113
|
-
# On conflict: resolve -> git add -> git rebase --continue
|
|
114
|
-
```
|
|
115
|
-
|
|
116
|
-
### 3.3 Commit & Push
|
|
117
|
-
|
|
118
|
-
```bash
|
|
119
|
-
BRANCH=$(git branch --show-current)
|
|
120
|
-
git add -A
|
|
121
|
-
|
|
122
|
-
# Sync mode: "Closes #NUM" | Default: "Resolves: viban-ID"
|
|
123
|
-
if [ "$SYNC_ACTIVE" = true ]; then
|
|
124
|
-
git commit -m "fix: issue title summary
|
|
125
|
-
|
|
126
|
-
- Root cause: ...
|
|
127
|
-
- Solution: ...
|
|
128
|
-
|
|
129
|
-
Closes #$EXTERNAL_NUM"
|
|
130
|
-
else
|
|
131
|
-
git commit -m "fix: issue title summary
|
|
132
|
-
|
|
133
|
-
- Root cause: ...
|
|
134
|
-
- Solution: ...
|
|
135
|
-
|
|
136
|
-
Resolves: #$ISSUE_ID"
|
|
137
|
-
fi
|
|
138
|
-
|
|
139
|
-
git push -u origin "$BRANCH"
|
|
140
|
-
```
|
|
141
|
-
|
|
142
|
-
### 3.4 Create PR
|
|
143
|
-
|
|
144
|
-
```bash
|
|
145
|
-
EXISTING_PR=$(gh pr list --head "$BRANCH" --json number -q '.[0].number')
|
|
146
|
-
|
|
147
|
-
if [ -z "$EXISTING_PR" ]; then
|
|
148
|
-
if [ "$SYNC_ACTIVE" = true ]; then
|
|
149
|
-
gh pr create --title "fix: title" \
|
|
150
|
-
--body "## Changes
|
|
151
|
-
- ...
|
|
152
|
-
|
|
153
|
-
Closes #$EXTERNAL_NUM
|
|
154
|
-
|
|
155
|
-
## Verification
|
|
156
|
-
- [ ] Manual verification completed
|
|
157
|
-
- [ ] Build passing
|
|
158
|
-
- [ ] Tests passing (if applicable)" --base main
|
|
159
|
-
else
|
|
160
|
-
gh pr create --title "fix: title" \
|
|
161
|
-
--body "## Changes
|
|
162
|
-
- ...
|
|
163
|
-
|
|
164
|
-
## Verification
|
|
165
|
-
- [ ] Manual verification completed
|
|
166
|
-
- [ ] Build passing
|
|
167
|
-
- [ ] Tests passing (if applicable)" --base main
|
|
168
|
-
fi
|
|
169
|
-
fi
|
|
170
|
-
```
|
|
171
|
-
|
|
172
|
-
### 3.5 Move to Review
|
|
173
|
-
|
|
174
|
-
```bash
|
|
175
|
-
viban review $ISSUE_ID
|
|
176
|
-
```
|
|
177
|
-
|
|
178
|
-
---
|
|
179
|
-
|
|
180
|
-
## Phase 4: HANDOFF
|
|
181
|
-
|
|
182
|
-
```
|
|
183
|
-
Issue #$ISSUE_ID → review | PR: gh pr view --web
|
|
184
|
-
Verification: manual + build + workflow followed
|
|
185
|
-
After approval: delete issue from viban TUI
|
|
186
|
-
```
|
|
187
|
-
|
|
188
|
-
---
|
|
189
|
-
|
|
190
|
-
## Checklist
|
|
191
|
-
|
|
192
|
-
```
|
|
193
|
-
[ ] Read .viban/workflow.md (or CLAUDE.md fallback) for project workflow
|
|
194
|
-
[ ] Working on issue-$ISSUE_ID branch
|
|
195
|
-
[ ] Implementation complete
|
|
196
|
-
[ ] Manual verification passed (using appropriate tools)
|
|
197
|
-
[ ] Build & tests passing
|
|
198
|
-
[ ] Rebase complete
|
|
199
|
-
[ ] PR created
|
|
200
|
-
[ ] viban review executed
|
|
201
|
-
```
|
|
202
|
-
|
|
203
|
-
---
|
|
204
|
-
|
|
205
|
-
## CRITICAL: Status Transition Rule
|
|
206
|
-
|
|
207
|
-
> **NEVER exit with issue still in `in_progress`.** Always run `viban review $ISSUE_ID` before exiting — whether completed or stopped early.
|
|
208
|
-
|
|
209
|
-
## CLI Reference
|
|
210
|
-
|
|
211
|
-
| Command | Description |
|
|
212
|
-
|---------|-------------|
|
|
213
|
-
| `viban` | Open TUI |
|
|
214
|
-
| `viban list` | Print board |
|
|
215
|
-
| `viban assign [session]` | Assign issue |
|
|
216
|
-
| `viban get <id>` | View issue |
|
|
217
|
-
| `viban review <id>` | Move to review |
|
|
14
|
+
This command is for **assignment and clarification only**. Use other tools to start working on the assigned issue.
|
|
@@ -1,15 +1,21 @@
|
|
|
1
1
|
---
|
|
2
|
-
description: "Assign and resolve multiple independent backlog issues in parallel
|
|
2
|
+
description: "Assign and resolve multiple independent backlog issues in parallel — each agent works in its own isolated git worktree"
|
|
3
3
|
---
|
|
4
4
|
|
|
5
5
|
Run `/viban:parallel-assign` to process multiple backlog issues simultaneously.
|
|
6
6
|
|
|
7
|
+
Each issue is resolved in a **separate git worktree**, so agents never interfere with each other's work. Worktrees are automatically cleaned up after PRs are created.
|
|
8
|
+
|
|
7
9
|
Usage: `/viban:parallel-assign [count]`
|
|
8
10
|
|
|
9
11
|
- `count`: Number of issues to process in parallel (default: 3, max: 5)
|
|
10
12
|
|
|
11
13
|
Examples:
|
|
12
|
-
- `/viban:parallel-assign` — resolve up to 3 backlog issues in parallel
|
|
14
|
+
- `/viban:parallel-assign` — resolve up to 3 backlog issues in parallel (each in its own worktree)
|
|
13
15
|
- `/viban:parallel-assign 5` — resolve up to 5 backlog issues in parallel
|
|
14
16
|
|
|
15
|
-
|
|
17
|
+
How it works:
|
|
18
|
+
1. Assigns N backlog issues and creates isolated git worktrees (`.viban/worktrees/{id}`)
|
|
19
|
+
2. Spawns one opus agent per issue — each agent works exclusively in its own worktree
|
|
20
|
+
3. Agents analyze, implement, commit, push, and create PRs independently
|
|
21
|
+
4. Coordinator collects results, runs tests, and cleans up worktrees
|
package/commands/setup.md
CHANGED
|
@@ -370,7 +370,7 @@ If build/test fails: fix errors, return to Phase 3.
|
|
|
370
370
|
{AUTO_DETECTED from git history — infer format from existing commits. If Q3 overrides, use that instead.}
|
|
371
371
|
|
|
372
372
|
### Branch Convention
|
|
373
|
-
{AUTO_DETECTED from existing patterns, or `
|
|
373
|
+
{AUTO_DETECTED from existing patterns, or `issue-{id}` as default}
|
|
374
374
|
|
|
375
375
|
### Pull Request
|
|
376
376
|
{FROM Q1:}
|
package/docs/CLAUDE.md
CHANGED
|
@@ -60,16 +60,16 @@ EOF
|
|
|
60
60
|
### 🔴 Worktree 사용 금지
|
|
61
61
|
- **main repo에서 feature branch로 직접 작업**
|
|
62
62
|
- worktree 생성/사용 금지 (사용자 명시적 요청)
|
|
63
|
-
- 브랜치 네이밍: `
|
|
63
|
+
- 브랜치 네이밍: `issue-{ISSUE_ID}` (예: `issue-78`)
|
|
64
64
|
|
|
65
65
|
### Branch-Based Workflow
|
|
66
66
|
```bash
|
|
67
67
|
# 1. main에서 분기
|
|
68
68
|
git checkout main && git pull
|
|
69
|
-
git checkout -b
|
|
69
|
+
git checkout -b issue-{ISSUE_ID}
|
|
70
70
|
|
|
71
71
|
# 2. 작업 후 push
|
|
72
|
-
git push -u origin
|
|
72
|
+
git push -u origin issue-{ISSUE_ID}
|
|
73
73
|
|
|
74
74
|
# 3. PR 생성
|
|
75
75
|
gh pr create --title "..." --body "..."
|
package/package.json
CHANGED
package/skills/assign/SKILL.md
CHANGED
|
@@ -1,21 +1,19 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: assign
|
|
3
|
-
description: "Assign
|
|
3
|
+
description: "Assign first backlog issue — clarify if unclear, then finish"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# /assign
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
Assign the first backlog issue. If the description is unclear or lacks context, interview the user and enrich the issue. **Do NOT start implementation.**
|
|
9
9
|
|
|
10
|
-
> **CLI only** (no direct viban.json access)
|
|
10
|
+
> **CLI only** (no direct viban.json access)
|
|
11
11
|
|
|
12
12
|
---
|
|
13
13
|
|
|
14
|
-
##
|
|
14
|
+
## Step 0: Read Workflow (CRITICAL)
|
|
15
15
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
Check in priority order — first match wins, follow it exactly:
|
|
16
|
+
Check in priority order — first match wins:
|
|
19
17
|
|
|
20
18
|
1. `.viban/workflow.md` → `[ -f ".viban/workflow.md" ] && cat ".viban/workflow.md"`
|
|
21
19
|
2. CLAUDE.md (legacy, only if no workflow.md):
|
|
@@ -25,194 +23,91 @@ for path in "./CLAUDE.md" "./.claude/CLAUDE.md" "../CLAUDE.md"; do
|
|
|
25
23
|
done
|
|
26
24
|
```
|
|
27
25
|
Look for `Issue Resolution Workflow` or `Workflow` section.
|
|
28
|
-
3. Default workflow (Phase 1 below)
|
|
29
26
|
|
|
30
|
-
|
|
27
|
+
If a workflow exists, follow its conventions for issue handling.
|
|
31
28
|
|
|
32
|
-
|
|
33
|
-
# Check uncommitted changes → AskUserQuestion if dirty
|
|
34
|
-
[ -n "$(git status --porcelain)" ] && echo "Warning: Uncommitted changes"
|
|
29
|
+
---
|
|
35
30
|
|
|
36
|
-
|
|
31
|
+
## Step 1: Assign
|
|
37
32
|
|
|
33
|
+
```bash
|
|
38
34
|
ISSUE_ID=$(viban assign 2>&1 | tail -1)
|
|
39
35
|
[[ -z "$ISSUE_ID" || "$ISSUE_ID" == "No backlog" ]] && echo "No issues in backlog" && exit 0
|
|
40
36
|
```
|
|
41
37
|
|
|
42
|
-
|
|
38
|
+
If backlog is empty: notify user and exit.
|
|
43
39
|
|
|
44
|
-
|
|
45
|
-
ISSUE_JSON=$(viban get $ISSUE_ID)
|
|
46
|
-
EXT_ID=$(echo "$ISSUE_JSON" | jq -r '.external_id // ""')
|
|
47
|
-
SYNC_ACTIVE=false; EXTERNAL_NUM=""
|
|
48
|
-
|
|
49
|
-
if [ -n "$EXT_ID" ] && [ "$EXT_ID" != "null" ]; then
|
|
50
|
-
SYNC_ACTIVE=true
|
|
51
|
-
EXTERNAL_NUM="${EXT_ID##*:}" # "github:42" -> "42"
|
|
52
|
-
TITLE=$(echo "$ISSUE_JSON" | jq -r '.title' | tr '[:upper:]' '[:lower:]' | sed 's/[^a-z0-9]/-/g' | head -c 40)
|
|
53
|
-
git checkout -b "issue-${EXTERNAL_NUM}-${TITLE}"
|
|
54
|
-
else
|
|
55
|
-
git checkout -b issue-$ISSUE_ID
|
|
56
|
-
fi
|
|
57
|
-
```
|
|
58
|
-
|
|
59
|
-
### 0.4 Load Plan (if available)
|
|
60
|
-
|
|
61
|
-
```bash
|
|
62
|
-
[ -f ".viban/plans/${ISSUE_ID}.md" ] && cat ".viban/plans/${ISSUE_ID}.md"
|
|
63
|
-
```
|
|
64
|
-
|
|
65
|
-
If plan exists: use as primary guide for Phase 1, skip redundant analysis, but verify plan is still current.
|
|
66
|
-
|
|
67
|
-
---
|
|
68
|
-
|
|
69
|
-
## Phase 1: ANALYZE & IMPLEMENT
|
|
40
|
+
## Step 2: Read Issue
|
|
70
41
|
|
|
71
42
|
```bash
|
|
72
43
|
viban get $ISSUE_ID
|
|
73
44
|
```
|
|
74
45
|
|
|
75
|
-
|
|
76
|
-
**Default** (no workflow): Understand → Locate → Analyze root cause → Implement minimal changes.
|
|
77
|
-
|
|
78
|
-
---
|
|
79
|
-
|
|
80
|
-
## Phase 2: VERIFY
|
|
81
|
-
|
|
82
|
-
Manual verification — do NOT run build/test here (Phase 3).
|
|
83
|
-
|
|
84
|
-
| Type | Tool |
|
|
85
|
-
|------|------|
|
|
86
|
-
| Web UI | Playwright MCP (`browser_navigate`, `browser_snapshot`, `browser_click`) |
|
|
87
|
-
| API | WebFetch |
|
|
88
|
-
| CLI | Bash |
|
|
89
|
-
| Visual | Read (screenshot files) |
|
|
90
|
-
| Browser | Chrome DevTools MCP |
|
|
46
|
+
Display the issue title, description, priority, and type to the user.
|
|
91
47
|
|
|
92
|
-
|
|
48
|
+
## Step 3: Evaluate Clarity
|
|
93
49
|
|
|
94
|
-
|
|
95
|
-
- Web feature: navigate to page, take snapshot, verify element exists
|
|
96
|
-
- API fix: fetch endpoint, check response status and body
|
|
97
|
-
- CLI change: run command, verify output format
|
|
98
|
-
- UI bug: navigate, interact, confirm no error
|
|
50
|
+
Assess whether the issue description provides enough context for someone to start working on it:
|
|
99
51
|
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
---
|
|
52
|
+
- **Clear**: the symptom, affected area, and expected behavior are all understandable
|
|
53
|
+
- **Unclear**: vague description, missing context, ambiguous scope, or multiple possible interpretations
|
|
103
54
|
|
|
104
|
-
|
|
55
|
+
### If Clear
|
|
105
56
|
|
|
106
|
-
|
|
57
|
+
Report the assignment and finish:
|
|
107
58
|
|
|
108
|
-
Run project's build/test commands. If fail: fix → return to Phase 2.
|
|
109
|
-
|
|
110
|
-
### 3.2 Rebase
|
|
111
|
-
|
|
112
|
-
```bash
|
|
113
|
-
git fetch origin main && git rebase origin/main
|
|
114
|
-
# On conflict: resolve -> git add -> git rebase --continue
|
|
115
59
|
```
|
|
60
|
+
Issue #{id} assigned
|
|
61
|
+
Title: {title}
|
|
62
|
+
Priority: {priority} | Type: {type}
|
|
63
|
+
Status: in_progress
|
|
116
64
|
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
```bash
|
|
120
|
-
BRANCH=$(git branch --show-current)
|
|
121
|
-
git add -A
|
|
122
|
-
|
|
123
|
-
# Sync mode: "Closes #NUM" | Default: "Resolves: viban-ID"
|
|
124
|
-
if [ "$SYNC_ACTIVE" = true ]; then
|
|
125
|
-
git commit -m "fix: issue title summary
|
|
126
|
-
|
|
127
|
-
- Root cause: ...
|
|
128
|
-
- Solution: ...
|
|
129
|
-
|
|
130
|
-
Closes #$EXTERNAL_NUM"
|
|
131
|
-
else
|
|
132
|
-
git commit -m "fix: issue title summary
|
|
133
|
-
|
|
134
|
-
- Root cause: ...
|
|
135
|
-
- Solution: ...
|
|
136
|
-
|
|
137
|
-
Resolves: #$ISSUE_ID"
|
|
138
|
-
fi
|
|
139
|
-
|
|
140
|
-
git push -u origin "$BRANCH"
|
|
65
|
+
Ready for work.
|
|
141
66
|
```
|
|
142
67
|
|
|
143
|
-
###
|
|
68
|
+
### If Unclear
|
|
144
69
|
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
gh pr create --title "fix: title" \
|
|
151
|
-
--body "## Changes
|
|
152
|
-
- ...
|
|
153
|
-
|
|
154
|
-
Closes #$EXTERNAL_NUM
|
|
155
|
-
|
|
156
|
-
## Verification
|
|
157
|
-
- [ ] Manual verification completed
|
|
158
|
-
- [ ] Build passing
|
|
159
|
-
- [ ] Tests passing (if applicable)" --base main
|
|
160
|
-
else
|
|
161
|
-
gh pr create --title "fix: title" \
|
|
162
|
-
--body "## Changes
|
|
163
|
-
- ...
|
|
164
|
-
|
|
165
|
-
## Verification
|
|
166
|
-
- [ ] Manual verification completed
|
|
167
|
-
- [ ] Build passing
|
|
168
|
-
- [ ] Tests passing (if applicable)" --base main
|
|
169
|
-
fi
|
|
170
|
-
fi
|
|
171
|
-
```
|
|
70
|
+
Interview the user with AskUserQuestion to gather missing context. Ask about:
|
|
71
|
+
- What specifically is the problem? (symptom)
|
|
72
|
+
- Where does it happen? (location/trigger)
|
|
73
|
+
- What is the expected behavior?
|
|
74
|
+
- Any additional constraints or context?
|
|
172
75
|
|
|
173
|
-
|
|
76
|
+
After gathering answers, update the issue description:
|
|
174
77
|
|
|
175
78
|
```bash
|
|
176
|
-
viban
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
---
|
|
79
|
+
cat > /tmp/viban-desc-update.md <<'VIBAN_EOF'
|
|
80
|
+
{original description}
|
|
180
81
|
|
|
181
|
-
##
|
|
82
|
+
## Clarification
|
|
83
|
+
{gathered context from interview}
|
|
84
|
+
VIBAN_EOF
|
|
182
85
|
|
|
183
|
-
|
|
184
|
-
Issue #$ISSUE_ID → review | PR: gh pr view --web
|
|
185
|
-
Verification: manual + build + workflow followed
|
|
186
|
-
After approval: delete issue from viban TUI
|
|
86
|
+
# Re-add the issue with enriched description (edit via TUI or recreate)
|
|
187
87
|
```
|
|
188
88
|
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
## Checklist
|
|
89
|
+
Then report:
|
|
192
90
|
|
|
193
91
|
```
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
[ ] PR created
|
|
201
|
-
[ ] viban review executed
|
|
92
|
+
Issue #{id} assigned and clarified
|
|
93
|
+
Title: {title}
|
|
94
|
+
Priority: {priority} | Type: {type}
|
|
95
|
+
Status: in_progress
|
|
96
|
+
|
|
97
|
+
Clarification added to issue description.
|
|
202
98
|
```
|
|
203
99
|
|
|
204
100
|
---
|
|
205
101
|
|
|
206
|
-
## CRITICAL
|
|
102
|
+
## CRITICAL
|
|
207
103
|
|
|
208
|
-
>
|
|
104
|
+
> - This command **assigns only**. Do NOT create branches, write code, or start implementation.
|
|
105
|
+
> - Do NOT run `viban review` — the issue stays in `in_progress` for the next work session.
|
|
106
|
+
> - If the issue is clear, just report and finish immediately.
|
|
209
107
|
|
|
210
108
|
## CLI Reference
|
|
211
109
|
|
|
212
110
|
| Command | Description |
|
|
213
111
|
|---------|-------------|
|
|
214
|
-
| `viban` | Open TUI |
|
|
215
|
-
| `viban list` | Print board |
|
|
216
112
|
| `viban assign [session]` | Assign issue |
|
|
217
113
|
| `viban get <id>` | View issue |
|
|
218
|
-
| `viban review <id>` | Move to review |
|
|
@@ -55,16 +55,7 @@ for i in $(seq 1 $N); do
|
|
|
55
55
|
ID=$(viban assign "$SESSION" 2>&1 | tail -1)
|
|
56
56
|
[[ -z "$ID" || "$ID" == "No backlog" ]] && break
|
|
57
57
|
|
|
58
|
-
|
|
59
|
-
ISSUE_JSON=$(viban get "$ID")
|
|
60
|
-
EXT_ID=$(echo "$ISSUE_JSON" | jq -r '.external_id // ""')
|
|
61
|
-
if [ -n "$EXT_ID" ] && [ "$EXT_ID" != "null" ]; then
|
|
62
|
-
EXTERNAL_NUM="${EXT_ID##*:}"
|
|
63
|
-
TITLE=$(echo "$ISSUE_JSON" | jq -r '.title' | tr '[:upper:]' '[:lower:]' | sed 's/[^a-z0-9]/-/g' | head -c 40)
|
|
64
|
-
BRANCH="issue-${EXTERNAL_NUM}-${TITLE}"
|
|
65
|
-
else
|
|
66
|
-
BRANCH="issue-${ID}"
|
|
67
|
-
fi
|
|
58
|
+
BRANCH="issue-${ID}"
|
|
68
59
|
|
|
69
60
|
ISSUES+=("${ID}|${BRANCH}")
|
|
70
61
|
done
|
|
@@ -83,7 +74,8 @@ mkdir -p "$REPO_ROOT/.viban/worktrees"
|
|
|
83
74
|
for entry in "${ISSUES[@]}"; do
|
|
84
75
|
ID="${entry%%|*}"
|
|
85
76
|
BRANCH="${entry##*|}"
|
|
86
|
-
|
|
77
|
+
# Use issue ID as worktree dir name (matches cmd_done cleanup at .viban/worktrees/{ID})
|
|
78
|
+
WT_DIR="$REPO_ROOT/.viban/worktrees/$ID"
|
|
87
79
|
|
|
88
80
|
git worktree add -b "$BRANCH" "$WT_DIR" origin/main
|
|
89
81
|
done
|
|
@@ -107,13 +99,14 @@ Spawn one **opus** agent per issue using `Task` tool. All agents launch in a sin
|
|
|
107
99
|
You are resolving viban issue #{ID} in an isolated git worktree.
|
|
108
100
|
|
|
109
101
|
## Environment
|
|
110
|
-
- Worktree path: {REPO_ROOT}/.viban/worktrees/{
|
|
102
|
+
- Worktree path: {REPO_ROOT}/.viban/worktrees/{ID}
|
|
111
103
|
- Branch: {BRANCH}
|
|
112
104
|
- Main repo: {REPO_ROOT}
|
|
113
105
|
- ALL file operations must happen inside the worktree path
|
|
114
106
|
|
|
115
|
-
## Workflow
|
|
116
|
-
{paste workflow.md
|
|
107
|
+
## Workflow (Analyze + Implement + Verify only)
|
|
108
|
+
{paste workflow.md Phase 1 (Analyze), Phase 2 (Implement), and Phase 3 (Verify) sections ONLY}
|
|
109
|
+
{DO NOT include: Pipeline summary, GitHub Sync, Phase 4 (Build and Test), Phase 5 (Ship), Issue Management, Post-merge, or Additional Rules}
|
|
117
110
|
|
|
118
111
|
## Issue Details
|
|
119
112
|
{paste viban get output}
|
|
@@ -125,7 +118,7 @@ You are resolving viban issue #{ID} in an isolated git worktree.
|
|
|
125
118
|
|
|
126
119
|
You are one of {N} parallel agents working in isolated git worktrees.
|
|
127
120
|
|
|
128
|
-
1. Work ONLY inside your worktree: {REPO_ROOT}/.viban/worktrees/{
|
|
121
|
+
1. Work ONLY inside your worktree: {REPO_ROOT}/.viban/worktrees/{ID}
|
|
129
122
|
- cd to the worktree before any work
|
|
130
123
|
- All reads, edits, and writes must target files under this path
|
|
131
124
|
|
|
@@ -136,7 +129,7 @@ You are one of {N} parallel agents working in isolated git worktrees.
|
|
|
136
129
|
|
|
137
130
|
3. After implementation, commit on your branch:
|
|
138
131
|
```bash
|
|
139
|
-
cd {REPO_ROOT}/.viban/worktrees/{
|
|
132
|
+
cd {REPO_ROOT}/.viban/worktrees/{ID}
|
|
140
133
|
git add <specific files>
|
|
141
134
|
git commit -m "type: description
|
|
142
135
|
|
|
@@ -160,6 +153,7 @@ You are one of {N} parallel agents working in isolated git worktrees.
|
|
|
160
153
|
|
|
161
154
|
CRITICAL:
|
|
162
155
|
- Always run `viban review {ID}` before finishing, even on errors.
|
|
156
|
+
- Do NOT run `viban done` — the coordinator handles post-merge cleanup.
|
|
163
157
|
- Do NOT run the full test suite — the coordinator handles that.
|
|
164
158
|
- Do NOT remove the worktree — the coordinator handles cleanup.
|
|
165
159
|
```
|
|
@@ -214,8 +208,8 @@ PRs have been created — worktrees are no longer needed:
|
|
|
214
208
|
|
|
215
209
|
```bash
|
|
216
210
|
for entry in "${ISSUES[@]}"; do
|
|
217
|
-
|
|
218
|
-
WT_DIR="$REPO_ROOT/.viban/worktrees/$
|
|
211
|
+
ID="${entry%%|*}"
|
|
212
|
+
WT_DIR="$REPO_ROOT/.viban/worktrees/$ID"
|
|
219
213
|
git worktree remove "$WT_DIR" --force
|
|
220
214
|
done
|
|
221
215
|
```
|
package/skills/setup/SKILL.md
CHANGED
|
@@ -393,7 +393,7 @@ If build/test fails: fix errors, return to Phase 3.
|
|
|
393
393
|
{AUTO_DETECTED from git history — infer format from existing commits. If Q3 overrides, use that instead.}
|
|
394
394
|
|
|
395
395
|
### Branch Convention
|
|
396
|
-
{AUTO_DETECTED from existing patterns, or `
|
|
396
|
+
{AUTO_DETECTED from existing patterns, or `issue-{id}` as default}
|
|
397
397
|
|
|
398
398
|
### Pull Request
|
|
399
399
|
{FROM Q1:}
|
package/commands/sync.md
DELETED
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
description: "Sync viban board with external issue tracker (GitHub, Jira, etc.)"
|
|
3
|
-
---
|
|
4
|
-
|
|
5
|
-
# /sync - External Issue Tracker Sync
|
|
6
|
-
|
|
7
|
-
Sync the viban board with an external issue tracker. Currently supports GitHub Issues via `gh` CLI.
|
|
8
|
-
|
|
9
|
-
> **Principle**: Show what will happen before doing it. Never sync without user confirmation.
|
|
10
|
-
|
|
11
|
-
## Input
|
|
12
|
-
|
|
13
|
-
**User Input**: `$ARGUMENTS`
|
|
14
|
-
|
|
15
|
-
## Step 1: Check Sync Configuration
|
|
16
|
-
|
|
17
|
-
```bash
|
|
18
|
-
# Check if sync is already configured
|
|
19
|
-
if [ -f ".viban/sync.json" ]; then
|
|
20
|
-
echo "Sync configured"
|
|
21
|
-
viban sync --status
|
|
22
|
-
else
|
|
23
|
-
echo "Sync not configured"
|
|
24
|
-
fi
|
|
25
|
-
```
|
|
26
|
-
|
|
27
|
-
- If **not configured**, proceed to Step 2
|
|
28
|
-
- If **configured**, skip to Step 3
|
|
29
|
-
|
|
30
|
-
## Step 2: Initialize Sync
|
|
31
|
-
|
|
32
|
-
```bash
|
|
33
|
-
viban sync --init
|
|
34
|
-
```
|
|
35
|
-
|
|
36
|
-
This will:
|
|
37
|
-
- Auto-detect the provider from git remote (defaults to GitHub)
|
|
38
|
-
- Check that `gh` CLI is installed and authenticated
|
|
39
|
-
- Create required labels on the remote repo
|
|
40
|
-
- Initialize `sync.json` metadata
|
|
41
|
-
|
|
42
|
-
If initialization fails, report the error and suggest fixes (install `gh`, run `gh auth login`, etc.).
|
|
43
|
-
|
|
44
|
-
## Step 3: Preview Changes (Dry Run)
|
|
45
|
-
|
|
46
|
-
```bash
|
|
47
|
-
viban sync --dry-run
|
|
48
|
-
```
|
|
49
|
-
|
|
50
|
-
Show the user what will happen:
|
|
51
|
-
- `<-` Issues to pull from remote
|
|
52
|
-
- `->` Cards to push to remote
|
|
53
|
-
- `==` Unchanged items
|
|
54
|
-
- `!!` Conflicts (and resolution strategy)
|
|
55
|
-
|
|
56
|
-
## Step 4: Confirm and Sync
|
|
57
|
-
|
|
58
|
-
Ask the user for confirmation using AskUserQuestion:
|
|
59
|
-
|
|
60
|
-
- header: "Sync"
|
|
61
|
-
- question: "Apply these sync changes?"
|
|
62
|
-
- options:
|
|
63
|
-
- "Yes, sync now"
|
|
64
|
-
- "Sync and push new local cards too (--push-new)"
|
|
65
|
-
- "Pull only (remote -> local)"
|
|
66
|
-
- "Cancel"
|
|
67
|
-
- multiSelect: false
|
|
68
|
-
|
|
69
|
-
Based on the answer:
|
|
70
|
-
|
|
71
|
-
```bash
|
|
72
|
-
# Yes, sync now
|
|
73
|
-
viban sync
|
|
74
|
-
|
|
75
|
-
# With push-new
|
|
76
|
-
viban sync --push-new
|
|
77
|
-
|
|
78
|
-
# Pull only
|
|
79
|
-
viban sync --pull-only
|
|
80
|
-
```
|
|
81
|
-
|
|
82
|
-
## Step 5: Report Results
|
|
83
|
-
|
|
84
|
-
Show the sync summary:
|
|
85
|
-
```
|
|
86
|
-
Sync complete:
|
|
87
|
-
Pulled: N new/updated cards from remote
|
|
88
|
-
Pushed: N cards to remote
|
|
89
|
-
Conflicts: N (resolved by: remote wins)
|
|
90
|
-
Unchanged: N
|
|
91
|
-
```
|
|
92
|
-
|
|
93
|
-
## Notes
|
|
94
|
-
|
|
95
|
-
- **First sync imports all open issues** as backlog cards with `github:N` external IDs
|
|
96
|
-
- **Conflicts**: when both sides changed, remote wins by default (with warning)
|
|
97
|
-
- **Closed issues**: remote closed issues move viban card to `review` status
|
|
98
|
-
- **Done cards**: `viban done` then sync closes the remote issue
|
|
99
|
-
- **New local cards** are NOT pushed unless `--push-new` is specified (local-first default)
|
package/skills/sync/SKILL.md
DELETED
|
@@ -1,100 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: sync
|
|
3
|
-
description: "Sync viban board with external issue tracker (GitHub, Jira, etc.)"
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# /sync - External Issue Tracker Sync
|
|
7
|
-
|
|
8
|
-
Sync the viban board with an external issue tracker. Currently supports GitHub Issues via `gh` CLI.
|
|
9
|
-
|
|
10
|
-
> **Principle**: Show what will happen before doing it. Never sync without user confirmation.
|
|
11
|
-
|
|
12
|
-
## Input
|
|
13
|
-
|
|
14
|
-
**User Input**: `$ARGUMENTS`
|
|
15
|
-
|
|
16
|
-
## Step 1: Check Sync Configuration
|
|
17
|
-
|
|
18
|
-
```bash
|
|
19
|
-
# Check if sync is already configured
|
|
20
|
-
if [ -f ".viban/sync.json" ]; then
|
|
21
|
-
echo "Sync configured"
|
|
22
|
-
viban sync --status
|
|
23
|
-
else
|
|
24
|
-
echo "Sync not configured"
|
|
25
|
-
fi
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
- If **not configured**, proceed to Step 2
|
|
29
|
-
- If **configured**, skip to Step 3
|
|
30
|
-
|
|
31
|
-
## Step 2: Initialize Sync
|
|
32
|
-
|
|
33
|
-
```bash
|
|
34
|
-
viban sync --init
|
|
35
|
-
```
|
|
36
|
-
|
|
37
|
-
This will:
|
|
38
|
-
- Auto-detect the provider from git remote (defaults to GitHub)
|
|
39
|
-
- Check that `gh` CLI is installed and authenticated
|
|
40
|
-
- Create required labels on the remote repo
|
|
41
|
-
- Initialize `sync.json` metadata
|
|
42
|
-
|
|
43
|
-
If initialization fails, report the error and suggest fixes (install `gh`, run `gh auth login`, etc.).
|
|
44
|
-
|
|
45
|
-
## Step 3: Preview Changes (Dry Run)
|
|
46
|
-
|
|
47
|
-
```bash
|
|
48
|
-
viban sync --dry-run
|
|
49
|
-
```
|
|
50
|
-
|
|
51
|
-
Show the user what will happen:
|
|
52
|
-
- `<-` Issues to pull from remote
|
|
53
|
-
- `->` Cards to push to remote
|
|
54
|
-
- `==` Unchanged items
|
|
55
|
-
- `!!` Conflicts (and resolution strategy)
|
|
56
|
-
|
|
57
|
-
## Step 4: Confirm and Sync
|
|
58
|
-
|
|
59
|
-
Ask the user for confirmation using AskUserQuestion:
|
|
60
|
-
|
|
61
|
-
- header: "Sync"
|
|
62
|
-
- question: "Apply these sync changes?"
|
|
63
|
-
- options:
|
|
64
|
-
- "Yes, sync now"
|
|
65
|
-
- "Sync and push new local cards too (--push-new)"
|
|
66
|
-
- "Pull only (remote -> local)"
|
|
67
|
-
- "Cancel"
|
|
68
|
-
- multiSelect: false
|
|
69
|
-
|
|
70
|
-
Based on the answer:
|
|
71
|
-
|
|
72
|
-
```bash
|
|
73
|
-
# Yes, sync now
|
|
74
|
-
viban sync
|
|
75
|
-
|
|
76
|
-
# With push-new
|
|
77
|
-
viban sync --push-new
|
|
78
|
-
|
|
79
|
-
# Pull only
|
|
80
|
-
viban sync --pull-only
|
|
81
|
-
```
|
|
82
|
-
|
|
83
|
-
## Step 5: Report Results
|
|
84
|
-
|
|
85
|
-
Show the sync summary:
|
|
86
|
-
```
|
|
87
|
-
Sync complete:
|
|
88
|
-
Pulled: N new/updated cards from remote
|
|
89
|
-
Pushed: N cards to remote
|
|
90
|
-
Conflicts: N (resolved by: remote wins)
|
|
91
|
-
Unchanged: N
|
|
92
|
-
```
|
|
93
|
-
|
|
94
|
-
## Notes
|
|
95
|
-
|
|
96
|
-
- **First sync imports all open issues** as backlog cards with `github:N` external IDs
|
|
97
|
-
- **Conflicts**: when both sides changed, remote wins by default (with warning)
|
|
98
|
-
- **Closed issues**: remote closed issues move viban card to `review` status
|
|
99
|
-
- **Done cards**: `viban done` then sync closes the remote issue
|
|
100
|
-
- **New local cards** are NOT pushed unless `--push-new` is specified (local-first default)
|