@seanyao/roll 2026.421.3 → 2026.421.5
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/README.md +2 -1
- package/bin/roll +8 -110
- package/package.json +1 -1
- package/skills/roll-notes/SKILL.md +62 -0
- package/skills/roll-research/SKILL.md +1 -1
- package/tools/roll-probe/SKILL.md +0 -84
package/README.md
CHANGED
|
@@ -70,7 +70,6 @@ Unified behavioral conventions for Claude Code / Gemini CLI / Cursor / Codex —
|
|
|
70
70
|
| `roll hook install` | Optional: global git hook for AI client auto-detection |
|
|
71
71
|
| `roll reset` | Force-rebuild local cache from repo source, then re-sync |
|
|
72
72
|
| `roll status` | Show sync state, skill links, and detected AI tools |
|
|
73
|
-
| `roll clean` | Remove legacy `~/.wukong/` or `~/.cybernetix/` remnants |
|
|
74
73
|
|
|
75
74
|
### Typical Flow
|
|
76
75
|
|
|
@@ -142,6 +141,7 @@ Research → Design → Build → Check → Fix → (loop)
|
|
|
142
141
|
| Deep research (product / company / tech) | `$roll-research "subject"` |
|
|
143
142
|
| Patrol production for regressions | `$roll-sentinel patrol` |
|
|
144
143
|
| Debug a broken page | `$roll-debug <URL>` |
|
|
144
|
+
| Record a dev moment / diary entry | `$roll-notes "just fixed that nasty bug"` |
|
|
145
145
|
|
|
146
146
|
### Full Skill List
|
|
147
147
|
|
|
@@ -161,6 +161,7 @@ Research → Design → Build → Check → Fix → (loop)
|
|
|
161
161
|
| `$roll-.changelog` | Support | Auto-generate CHANGELOG from BACKLOG |
|
|
162
162
|
| `$roll-.echo` | Support | Passive intent clarification |
|
|
163
163
|
| `$roll-.clarify` | Support | Passive scope clarification for vague build requests |
|
|
164
|
+
| `$roll-notes` | Support | Project diary — append dev moments to `notes/YYYY-MM-DD.md` |
|
|
164
165
|
|
|
165
166
|
---
|
|
166
167
|
|
package/bin/roll
CHANGED
|
@@ -4,7 +4,7 @@ set -euo pipefail
|
|
|
4
4
|
# Roll — AI Agent Convention Manager
|
|
5
5
|
# Single source of truth for how all AI coding agents behave.
|
|
6
6
|
|
|
7
|
-
VERSION="2026.421.
|
|
7
|
+
VERSION="2026.421.5"
|
|
8
8
|
ROLL_HOME="${ROLL_HOME:-${HOME}/.roll}"
|
|
9
9
|
ROLL_CONFIG="${ROLL_HOME}/config.yaml"
|
|
10
10
|
ROLL_GLOBAL="${ROLL_HOME}/conventions/global"
|
|
@@ -250,8 +250,8 @@ YAML
|
|
|
250
250
|
# ─── Internal: create or repair per-skill symlinks (non-destructive) ─────────
|
|
251
251
|
_link_skills() {
|
|
252
252
|
local force="${1:-false}"
|
|
253
|
-
local
|
|
254
|
-
|
|
253
|
+
local roll_skills_real pkg_skills_real
|
|
254
|
+
roll_skills_real="$(canonical_dir "$ROLL_HOME/skills" 2>/dev/null || true)"
|
|
255
255
|
pkg_skills_real="$(canonical_dir "$ROLL_PKG_DIR/skills" 2>/dev/null || true)"
|
|
256
256
|
|
|
257
257
|
while IFS= read -r entry; do
|
|
@@ -279,17 +279,15 @@ _link_skills() {
|
|
|
279
279
|
continue
|
|
280
280
|
fi
|
|
281
281
|
|
|
282
|
-
# Handle
|
|
282
|
+
# Handle whole-dir symlink (legacy or user-created)
|
|
283
283
|
if [[ -L "$skills_dir" ]]; then
|
|
284
284
|
local skills_target
|
|
285
285
|
skills_target="$(readlink "$skills_dir")"
|
|
286
|
-
if [[ -n "$skills_real" && "$skills_real" == "$
|
|
287
|
-
continue # Whole-dir symlink to
|
|
286
|
+
if [[ -n "$skills_real" && "$skills_real" == "$roll_skills_real" ]]; then
|
|
287
|
+
continue # Whole-dir symlink to ~/.roll/skills — still functional
|
|
288
288
|
fi
|
|
289
|
-
# Dangling
|
|
290
|
-
if [[ -z "$skills_real" ]]
|
|
291
|
-
[[ "$skills_target" == *"cybernetix"* ]] || \
|
|
292
|
-
[[ "$skills_target" == *"wukong"* ]]; then
|
|
289
|
+
# Dangling whole-dir symlink — remove and recreate as per-skill links
|
|
290
|
+
if [[ -z "$skills_real" ]]; then
|
|
293
291
|
info "Removing legacy symlink ~/${ai_name}/skills -> ${skills_target/#$HOME/~} 正在移除遗留软链接 ~/${ai_name}/skills -> ${skills_target/#$HOME/~}"
|
|
294
292
|
rm "$skills_dir"
|
|
295
293
|
else
|
|
@@ -1028,104 +1026,6 @@ cmd_update() {
|
|
|
1028
1026
|
cmd_sync
|
|
1029
1027
|
}
|
|
1030
1028
|
|
|
1031
|
-
# ═══════════════════════════════════════════════════════════════════════════════
|
|
1032
|
-
# COMMAND: clean
|
|
1033
|
-
# Remove legacy ~/.cybernetix/ and ~/.wukong/ remnants after migration
|
|
1034
|
-
# ═══════════════════════════════════════════════════════════════════════════════
|
|
1035
|
-
cmd_clean() {
|
|
1036
|
-
local found=false
|
|
1037
|
-
|
|
1038
|
-
echo -e "${BOLD}Roll Legacy Cleanup 清理旧版遗留文件${NC}"
|
|
1039
|
-
echo ""
|
|
1040
|
-
|
|
1041
|
-
# Detect what exists
|
|
1042
|
-
for legacy_dir in "$HOME/.cybernetix" "$HOME/.wukong"; do
|
|
1043
|
-
[[ -d "$legacy_dir" ]] && found=true
|
|
1044
|
-
done
|
|
1045
|
-
for legacy_bin in "$HOME/.local/bin/cybernetix" "$HOME/.local/bin/wukong"; do
|
|
1046
|
-
{ [[ -L "$legacy_bin" ]] || [[ -f "$legacy_bin" ]]; } && found=true
|
|
1047
|
-
done
|
|
1048
|
-
# Old skill symlinks
|
|
1049
|
-
local ai_dirs=("$HOME/.claude" "$HOME/.gemini" "$HOME/.kimi" "$HOME/.codex" "$HOME/.cursor")
|
|
1050
|
-
for ai_dir in "${ai_dirs[@]}"; do
|
|
1051
|
-
local skills_dir="$ai_dir/skills"
|
|
1052
|
-
[[ -d "$skills_dir" ]] || continue
|
|
1053
|
-
if find "$skills_dir" -maxdepth 1 -type l \( -name "wk-*" -o -name "cnx-*" \) 2>/dev/null | grep -q .; then
|
|
1054
|
-
found=true
|
|
1055
|
-
fi
|
|
1056
|
-
done
|
|
1057
|
-
|
|
1058
|
-
if [[ "$found" == "false" ]]; then
|
|
1059
|
-
ok "Nothing to clean — no legacy files found. 未发现遗留文件。"
|
|
1060
|
-
return
|
|
1061
|
-
fi
|
|
1062
|
-
|
|
1063
|
-
# Show what will be removed
|
|
1064
|
-
info "Found legacy items to remove: 发现以下遗留文件:"
|
|
1065
|
-
echo ""
|
|
1066
|
-
for d in "$HOME/.cybernetix" "$HOME/.wukong"; do
|
|
1067
|
-
[[ -d "$d" ]] && echo -e " ${RED}✕${NC} ${d/#$HOME/~}/"
|
|
1068
|
-
done
|
|
1069
|
-
for b in "$HOME/.local/bin/cybernetix" "$HOME/.local/bin/wukong"; do
|
|
1070
|
-
{ [[ -L "$b" ]] || [[ -f "$b" ]]; } && echo -e " ${RED}✕${NC} ${b/#$HOME/~}"
|
|
1071
|
-
done
|
|
1072
|
-
for ai_dir in "${ai_dirs[@]}"; do
|
|
1073
|
-
local skills_dir="$ai_dir/skills"
|
|
1074
|
-
[[ -d "$skills_dir" ]] || continue
|
|
1075
|
-
local old_links
|
|
1076
|
-
old_links=$(find "$skills_dir" -maxdepth 1 -type l \( -name "wk-*" -o -name "cnx-*" \) 2>/dev/null || true)
|
|
1077
|
-
if [[ -n "$old_links" ]]; then
|
|
1078
|
-
local count
|
|
1079
|
-
count=$(echo "$old_links" | wc -l | tr -d ' ')
|
|
1080
|
-
echo -e " ${RED}✕${NC} ${skills_dir/#$HOME/~}/ ($count legacy symlinks)"
|
|
1081
|
-
fi
|
|
1082
|
-
done
|
|
1083
|
-
|
|
1084
|
-
echo ""
|
|
1085
|
-
echo -n " Remove all of the above? [y/N] "
|
|
1086
|
-
read -r answer
|
|
1087
|
-
[[ "$answer" =~ ^[Yy]$ ]] || { info "Aborted. 已取消。"; return; }
|
|
1088
|
-
|
|
1089
|
-
echo ""
|
|
1090
|
-
local removed=0
|
|
1091
|
-
|
|
1092
|
-
# Remove legacy home dirs
|
|
1093
|
-
for d in "$HOME/.cybernetix" "$HOME/.wukong"; do
|
|
1094
|
-
if [[ -d "$d" ]]; then
|
|
1095
|
-
rm -rf "$d"
|
|
1096
|
-
ok "Removed: ${d/#$HOME/~} 已删除: ${d/#$HOME/~}"
|
|
1097
|
-
removed=$((removed + 1))
|
|
1098
|
-
fi
|
|
1099
|
-
done
|
|
1100
|
-
|
|
1101
|
-
# Remove legacy binaries
|
|
1102
|
-
for b in "$HOME/.local/bin/cybernetix" "$HOME/.local/bin/wukong"; do
|
|
1103
|
-
if [[ -L "$b" ]] || [[ -f "$b" ]]; then
|
|
1104
|
-
rm -f "$b"
|
|
1105
|
-
ok "Removed: ${b/#$HOME/~} 已删除: ${b/#$HOME/~}"
|
|
1106
|
-
removed=$((removed + 1))
|
|
1107
|
-
fi
|
|
1108
|
-
done
|
|
1109
|
-
|
|
1110
|
-
# Remove legacy skill symlinks
|
|
1111
|
-
for ai_dir in "${ai_dirs[@]}"; do
|
|
1112
|
-
local skills_dir="$ai_dir/skills"
|
|
1113
|
-
[[ -d "$skills_dir" ]] || continue
|
|
1114
|
-
local old_links
|
|
1115
|
-
old_links=$(find "$skills_dir" -maxdepth 1 -type l \( -name "wk-*" -o -name "cnx-*" \) 2>/dev/null || true)
|
|
1116
|
-
if [[ -n "$old_links" ]]; then
|
|
1117
|
-
while IFS= read -r link; do rm -f "$link"; done <<< "$old_links"
|
|
1118
|
-
local count
|
|
1119
|
-
count=$(echo "$old_links" | wc -l | tr -d ' ')
|
|
1120
|
-
ok "Removed $count legacy symlinks from ${skills_dir/#$HOME/~} 已删除 $count 个遗留软链接"
|
|
1121
|
-
removed=$((removed + count))
|
|
1122
|
-
fi
|
|
1123
|
-
done
|
|
1124
|
-
|
|
1125
|
-
echo ""
|
|
1126
|
-
ok "Cleaned $removed legacy items. 已清理 $removed 个遗留文件。"
|
|
1127
|
-
}
|
|
1128
|
-
|
|
1129
1029
|
# ═══════════════════════════════════════════════════════════════════════════════
|
|
1130
1030
|
# COMMAND: status
|
|
1131
1031
|
# Show current state of conventions
|
|
@@ -1308,7 +1208,6 @@ usage() {
|
|
|
1308
1208
|
echo " hook [install|remove] [Optional] Manage global git hook 管理全局 git hook"
|
|
1309
1209
|
echo " status [Diagnostic] Show current state 显示当前状态"
|
|
1310
1210
|
echo " reset [Recovery] Force-rebuild from package source 强制从包源重建"
|
|
1311
|
-
echo " clean [Legacy] Remove ~/.wukong/ ~/.cybernetix/ remnants 清理遗留文件"
|
|
1312
1211
|
echo ""
|
|
1313
1212
|
echo "Examples / 示例:"
|
|
1314
1213
|
echo " roll setup # New machine: first-time install 新机器:首次安装"
|
|
@@ -1328,7 +1227,6 @@ main() {
|
|
|
1328
1227
|
hook) cmd_hook "$@" ;;
|
|
1329
1228
|
update) cmd_update "$@" ;;
|
|
1330
1229
|
reset) cmd_reset "$@" ;;
|
|
1331
|
-
clean) cmd_clean "$@" ;;
|
|
1332
1230
|
status) cmd_status "$@" ;;
|
|
1333
1231
|
version|--version|-v) echo "roll v${VERSION}" ;;
|
|
1334
1232
|
help|--help|-h|"") usage ;;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@seanyao/roll",
|
|
3
|
-
"version": "2026.421.
|
|
3
|
+
"version": "2026.421.5",
|
|
4
4
|
"description": "Roll — Roll out features with AI agents",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"test": "find tests/unit tests/integration -name '*.bats' | sort | xargs ./tests/helpers/bats-core/bin/bats"
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: roll-notes
|
|
3
|
+
description: "Project diary skill. Records development moments — successes, failures, discoveries — appended chronologically to a daily notes file."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# roll-notes
|
|
7
|
+
|
|
8
|
+
> 项目日记技能。记录开发过程中的成功、失败、感受和任何值得记住的事情。
|
|
9
|
+
> Append-only, timeline-driven, no fixed format.
|
|
10
|
+
|
|
11
|
+
## Trigger
|
|
12
|
+
|
|
13
|
+
- User says "记一下"、"写进日记"、"append 到日记"
|
|
14
|
+
- User asks to record a feeling, finding, or moment
|
|
15
|
+
- A project milestone is reached and worth capturing
|
|
16
|
+
|
|
17
|
+
```
|
|
18
|
+
$roll-notes 终于搞定了那个 WebSocket 断线重连的 bug
|
|
19
|
+
$roll-notes 今天的 code review 给了很好的反馈
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## Behavior
|
|
23
|
+
|
|
24
|
+
1. **Determine file path**: `notes/YYYY-MM-DD.md` relative to project root
|
|
25
|
+
2. **Get current time**: Use `Asia/Shanghai` timezone (`TZ=Asia/Shanghai date`)
|
|
26
|
+
3. **Append**: Add new entry at end of file — never overwrite existing content
|
|
27
|
+
4. **Create if missing**: If file doesn't exist, create with a `# YYYY-MM-DD — <one-line summary>` header
|
|
28
|
+
5. **Free format**: Paragraph, list, code block — whatever fits the moment
|
|
29
|
+
|
|
30
|
+
## File format
|
|
31
|
+
|
|
32
|
+
```markdown
|
|
33
|
+
# YYYY-MM-DD — 一句话概括今天
|
|
34
|
+
|
|
35
|
+
> 时间:北京时间 HH:MM
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## HH:MM — 事件标题
|
|
40
|
+
|
|
41
|
+
发生了什么、怎么解决的、什么感受。
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
## HH:MM — 另一个事件
|
|
46
|
+
|
|
47
|
+
...
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## Rules
|
|
51
|
+
|
|
52
|
+
- **No planning**: Never write "明日待办" or "下一步"
|
|
53
|
+
- **No summaries**: Never write "今日收获" or "经验教训"
|
|
54
|
+
- **Pure record**: What happened, as-is — honest, immediate, rough is fine
|
|
55
|
+
- **Append freely**: Multiple entries per day is normal
|
|
56
|
+
|
|
57
|
+
## File location
|
|
58
|
+
|
|
59
|
+
```
|
|
60
|
+
notes/
|
|
61
|
+
└── YYYY-MM-DD.md
|
|
62
|
+
```
|
|
@@ -196,7 +196,7 @@ After the report is complete, use this skill's included `scripts/md_to_pdf.py` t
|
|
|
196
196
|
2. **Install dependencies** (if not installed): `pip install weasyprint markdown --break-system-packages`
|
|
197
197
|
3. **Run the conversion script**:
|
|
198
198
|
```bash
|
|
199
|
-
|
|
199
|
+
python [skill_directory]/scripts/md_to_pdf.py input.md output.pdf --title "Subject Name" --author "roll"
|
|
200
200
|
```
|
|
201
201
|
4. The script automatically generates an intermediate HTML file (for debugging) and the final PDF
|
|
202
202
|
|
|
@@ -1,84 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
hidden: true
|
|
3
|
-
name: roll-probe
|
|
4
|
-
description: Node discovery and health check for Roll environment. Find machines on LAN by name, check node health, verify OpenClaw Gateway status. Use when user asks to find a machine, check node status, diagnose gateway issues, or verify node connectivity.
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
# Roll Probe
|
|
8
|
-
|
|
9
|
-
**Node discovery and health check tool** - for node management and status diagnosis in Roll environments.
|
|
10
|
-
|
|
11
|
-
## Capabilities
|
|
12
|
-
|
|
13
|
-
1. **Node Discovery** - Discover machines on LAN
|
|
14
|
-
- Discover SSH services via Bonjour/mDNS
|
|
15
|
-
- Resolve `.local` hostnames
|
|
16
|
-
- Supports aliases: orin, seanclaw, apeclaw
|
|
17
|
-
|
|
18
|
-
2. **Node Health Check** - Check node health
|
|
19
|
-
- OpenClaw Gateway process status
|
|
20
|
-
- Port listening check
|
|
21
|
-
- Health endpoint verification
|
|
22
|
-
- Log viewing
|
|
23
|
-
|
|
24
|
-
## Usage
|
|
25
|
-
|
|
26
|
-
```bash
|
|
27
|
-
# Discover machines
|
|
28
|
-
$roll-checker find <machine-name>
|
|
29
|
-
|
|
30
|
-
# Check node health
|
|
31
|
-
$roll-checker health <hostname>
|
|
32
|
-
|
|
33
|
-
# Full diagnosis
|
|
34
|
-
$roll-checker diagnose <machine-name>
|
|
35
|
-
```
|
|
36
|
-
|
|
37
|
-
## Node Discovery
|
|
38
|
-
|
|
39
|
-
Uses Bonjour `_ssh._tcp` service discovery:
|
|
40
|
-
|
|
41
|
-
```bash
|
|
42
|
-
# Browse all SSH services
|
|
43
|
-
dns-sd -B _ssh._tcp local
|
|
44
|
-
|
|
45
|
-
# Resolve a specific service
|
|
46
|
-
dns-sd -L "Sean's Claw Machine" _ssh._tcp local
|
|
47
|
-
dns-sd -G v4v6 Seans-Claw-Machine.local
|
|
48
|
-
```
|
|
49
|
-
|
|
50
|
-
**Known aliases**:
|
|
51
|
-
- `orin` / `nv-orin` → nv-orin.local
|
|
52
|
-
- `seanclaw` → Seans-Claw-Machine.local
|
|
53
|
-
- `apeclaw` → Ape's Claw Machine
|
|
54
|
-
|
|
55
|
-
## Health Check
|
|
56
|
-
|
|
57
|
-
Check procedure for Orin/OpenClaw hosts:
|
|
58
|
-
|
|
59
|
-
```bash
|
|
60
|
-
# 1. Identity verification
|
|
61
|
-
ssh -o BatchMode=yes -o ConnectTimeout=10 nvidia@nv-orin.local 'hostname && whoami'
|
|
62
|
-
|
|
63
|
-
# 2. Process check
|
|
64
|
-
ps -ef | grep -i "openclaw\|gateway" | grep -v grep
|
|
65
|
-
|
|
66
|
-
# 3. Port check
|
|
67
|
-
ss -ltnp | grep -E "18789|18791|18792"
|
|
68
|
-
|
|
69
|
-
# 4. Health endpoint
|
|
70
|
-
for p in 18789 18791 18792; do
|
|
71
|
-
curl -fsS http://127.0.0.1:$p/health || true
|
|
72
|
-
done
|
|
73
|
-
```
|
|
74
|
-
|
|
75
|
-
## Dynamic Host Resolution
|
|
76
|
-
|
|
77
|
-
Priority order:
|
|
78
|
-
1. `nvidia@nv-orin.local` (Bonjour hostname)
|
|
79
|
-
2. Current `.local` hostname (via discovery)
|
|
80
|
-
3. Current IP (via discovery)
|
|
81
|
-
|
|
82
|
-
## References
|
|
83
|
-
|
|
84
|
-
- `scripts/find_ssh_machine.py` - SSH machine discovery script
|