skillpull 0.4.2 → 0.4.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/package.json +1 -1
- package/skillpull +38 -49
package/package.json
CHANGED
package/skillpull
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
2
|
set -euo pipefail
|
|
3
3
|
|
|
4
|
-
VERSION="0.4.
|
|
4
|
+
VERSION="0.4.4"
|
|
5
5
|
MANIFEST_FILE=".skillpull.json"
|
|
6
6
|
TMPDIR_PREFIX="skillpull"
|
|
7
7
|
CONFIG_DIR="$HOME/.config/skillpull"
|
|
@@ -60,6 +60,20 @@ sedi() {
|
|
|
60
60
|
# Sets SELECTED_ITEMS=("item1" "item3") with user's choices
|
|
61
61
|
SELECTED_ITEMS=()
|
|
62
62
|
|
|
63
|
+
_read_key() {
|
|
64
|
+
local old_settings; old_settings="$(stty -g 2>/dev/null)" || true
|
|
65
|
+
stty -icanon -echo min 1 time 0 2>/dev/null || true
|
|
66
|
+
local char; char="$(dd bs=1 count=1 2>/dev/null)"
|
|
67
|
+
# Check for escape sequence
|
|
68
|
+
if [[ "$char" == $'\033' ]]; then
|
|
69
|
+
stty -icanon -echo min 0 time 1 2>/dev/null || true
|
|
70
|
+
local seq; seq="$(dd bs=2 count=1 2>/dev/null)"
|
|
71
|
+
char="${char}${seq}"
|
|
72
|
+
fi
|
|
73
|
+
[[ -n "$old_settings" ]] && stty "$old_settings" 2>/dev/null || true
|
|
74
|
+
printf '%s' "$char"
|
|
75
|
+
}
|
|
76
|
+
|
|
63
77
|
select_menu() {
|
|
64
78
|
local prompt="$1"; shift
|
|
65
79
|
local items=("$@")
|
|
@@ -75,15 +89,12 @@ select_menu() {
|
|
|
75
89
|
|
|
76
90
|
SELECTED_ITEMS=()
|
|
77
91
|
|
|
78
|
-
# Save terminal state
|
|
79
|
-
local old_stty; old_stty="$(stty -g 2>/dev/null)" || true
|
|
80
|
-
|
|
81
92
|
# Hide cursor
|
|
82
93
|
printf '\033[?25l' >&2
|
|
83
94
|
|
|
84
95
|
# Print prompt
|
|
85
96
|
printf "\n ${CYAN}%s${RESET}\n" "$prompt" >&2
|
|
86
|
-
printf " ${DIM}
|
|
97
|
+
printf " ${DIM}j/k move Space select Enter confirm${RESET}\n\n" >&2
|
|
87
98
|
|
|
88
99
|
# Draw initial list
|
|
89
100
|
for ((i=0; i<count; i++)); do
|
|
@@ -98,17 +109,7 @@ select_menu() {
|
|
|
98
109
|
|
|
99
110
|
# Input loop
|
|
100
111
|
while true; do
|
|
101
|
-
|
|
102
|
-
local key=""
|
|
103
|
-
IFS= read -rsn1 key 2>/dev/null || true
|
|
104
|
-
|
|
105
|
-
# Handle escape sequences (arrow keys)
|
|
106
|
-
if [[ "$key" == $'\033' ]]; then
|
|
107
|
-
local seq1="" seq2=""
|
|
108
|
-
IFS= read -rsn1 -t 0.1 seq1 2>/dev/null || true
|
|
109
|
-
IFS= read -rsn1 -t 0.1 seq2 2>/dev/null || true
|
|
110
|
-
key="${key}${seq1}${seq2}"
|
|
111
|
-
fi
|
|
112
|
+
local key; key="$(_read_key)"
|
|
112
113
|
|
|
113
114
|
case "$key" in
|
|
114
115
|
$'\033[A'|k) # Up
|
|
@@ -124,7 +125,7 @@ select_menu() {
|
|
|
124
125
|
selected="${selected:0:$cursor}0${selected:$((cursor+1))}"
|
|
125
126
|
fi
|
|
126
127
|
;;
|
|
127
|
-
'') # Enter - confirm
|
|
128
|
+
''|$'\n'|$'\r') # Enter - confirm
|
|
128
129
|
break
|
|
129
130
|
;;
|
|
130
131
|
esac
|
|
@@ -147,9 +148,6 @@ select_menu() {
|
|
|
147
148
|
# Show cursor
|
|
148
149
|
printf '\033[?25h' >&2
|
|
149
150
|
|
|
150
|
-
# Restore terminal
|
|
151
|
-
[[ -n "$old_stty" ]] && stty "$old_stty" 2>/dev/null || true
|
|
152
|
-
|
|
153
151
|
# Collect selected items
|
|
154
152
|
for ((i=0; i<count; i++)); do
|
|
155
153
|
if [[ "${selected:$i:1}" == "1" ]]; then
|
|
@@ -479,28 +477,6 @@ cmd_pull() {
|
|
|
479
477
|
return 1
|
|
480
478
|
fi
|
|
481
479
|
skills=("${matched[@]}")
|
|
482
|
-
elif [[ ${#skills[@]} -gt 1 && -t 0 ]]; then
|
|
483
|
-
# Multiple skills, no filter, interactive terminal -> let user choose
|
|
484
|
-
local names=()
|
|
485
|
-
for sd in "${skills[@]}"; do
|
|
486
|
-
names+=("$(skill_display_name "$sd")")
|
|
487
|
-
done
|
|
488
|
-
select_menu "Select skills to install:" "${names[@]}"
|
|
489
|
-
if [[ ${#SELECTED_ITEMS[@]} -eq 0 ]]; then
|
|
490
|
-
warn "No skills selected"
|
|
491
|
-
return 0
|
|
492
|
-
fi
|
|
493
|
-
local matched=()
|
|
494
|
-
for sd in "${skills[@]}"; do
|
|
495
|
-
local sn; sn="$(skill_display_name "$sd")"
|
|
496
|
-
for sel in "${SELECTED_ITEMS[@]}"; do
|
|
497
|
-
if [[ "$sn" == "$sel" ]]; then
|
|
498
|
-
matched+=("$sd")
|
|
499
|
-
break
|
|
500
|
-
fi
|
|
501
|
-
done
|
|
502
|
-
done
|
|
503
|
-
skills=("${matched[@]}")
|
|
504
480
|
fi
|
|
505
481
|
|
|
506
482
|
mkdir -p "$target_dir"
|
|
@@ -1053,7 +1029,7 @@ HELP
|
|
|
1053
1029
|
# ── Argument parsing & dispatch ──
|
|
1054
1030
|
main() {
|
|
1055
1031
|
local cmd="" repo_url="" skill_name="" custom_path=""
|
|
1056
|
-
local force=0 dry_run=0 is_global=0 use_all=0
|
|
1032
|
+
local force=0 dry_run=0 is_global=0 use_all=0 agent_explicit=0
|
|
1057
1033
|
local agents=()
|
|
1058
1034
|
local alias_args=()
|
|
1059
1035
|
QUIET=0; BRANCH=""
|
|
@@ -1091,11 +1067,11 @@ main() {
|
|
|
1091
1067
|
--force|-f) force=1; shift ;;
|
|
1092
1068
|
--dry-run) dry_run=1; shift ;;
|
|
1093
1069
|
--quiet|-q) QUIET=1; shift ;;
|
|
1094
|
-
--claude) agents+=("claude"); shift ;;
|
|
1095
|
-
--codex) agents+=("codex"); shift ;;
|
|
1096
|
-
--kiro) agents+=("kiro"); shift ;;
|
|
1097
|
-
--cursor) agents+=("cursor"); shift ;;
|
|
1098
|
-
--all) use_all=1; shift ;;
|
|
1070
|
+
--claude) agents+=("claude"); agent_explicit=1; shift ;;
|
|
1071
|
+
--codex) agents+=("codex"); agent_explicit=1; shift ;;
|
|
1072
|
+
--kiro) agents+=("kiro"); agent_explicit=1; shift ;;
|
|
1073
|
+
--cursor) agents+=("cursor"); agent_explicit=1; shift ;;
|
|
1074
|
+
--all) use_all=1; agent_explicit=1; shift ;;
|
|
1099
1075
|
list) cmd="list"; shift ;;
|
|
1100
1076
|
installed) cmd="installed"; shift ;;
|
|
1101
1077
|
remove) cmd="remove"; shift ;;
|
|
@@ -1136,7 +1112,20 @@ main() {
|
|
|
1136
1112
|
if [[ "$use_all" == "1" ]]; then
|
|
1137
1113
|
agents=("claude" "codex" "kiro" "cursor")
|
|
1138
1114
|
elif [[ ${#agents[@]} -eq 0 ]]; then
|
|
1139
|
-
|
|
1115
|
+
if [[ "$agent_explicit" == "0" && -t 0 && "$cmd" != "installed" && "$cmd" != "update" ]]; then
|
|
1116
|
+
# Interactive terminal, no agent flag -> let user choose
|
|
1117
|
+
select_menu "Install to which tools?" "claude (.claude/skills)" "codex (.codex/skills)" "kiro (.kiro/skills)" "cursor (.cursor/rules)"
|
|
1118
|
+
if [[ ${#SELECTED_ITEMS[@]} -eq 0 ]]; then
|
|
1119
|
+
warn "No tools selected"
|
|
1120
|
+
exit 0
|
|
1121
|
+
fi
|
|
1122
|
+
for sel in "${SELECTED_ITEMS[@]}"; do
|
|
1123
|
+
local agent_name; agent_name="$(echo "$sel" | awk '{print $1}')"
|
|
1124
|
+
agents+=("$agent_name")
|
|
1125
|
+
done
|
|
1126
|
+
else
|
|
1127
|
+
agents=("$DEFAULT_AGENT")
|
|
1128
|
+
fi
|
|
1140
1129
|
fi
|
|
1141
1130
|
|
|
1142
1131
|
case "${cmd:-}" in
|