@seanyao/roll 2026.421.2 → 2026.421.4
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 +0 -1
- package/bin/roll +9 -111
- package/package.json +1 -1
- 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
|
|
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.4"
|
|
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
|
|
@@ -1008,7 +1006,7 @@ cmd_reset() {
|
|
|
1008
1006
|
# Update roll to latest version (npm update or git pull), then re-sync
|
|
1009
1007
|
# ═══════════════════════════════════════════════════════════════════════════════
|
|
1010
1008
|
_is_git_install() {
|
|
1011
|
-
|
|
1009
|
+
[[ -d "$ROLL_PKG_DIR/.git" ]]
|
|
1012
1010
|
}
|
|
1013
1011
|
|
|
1014
1012
|
cmd_update() {
|
|
@@ -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.4",
|
|
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"
|
|
@@ -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
|