skillpull 0.4.0 → 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 +52 -51
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"
|
|
@@ -951,7 +927,11 @@ cmd_alias() {
|
|
|
951
927
|
}
|
|
952
928
|
|
|
953
929
|
cmd_search() {
|
|
954
|
-
local keyword="$1"
|
|
930
|
+
local keyword="${1:-}"
|
|
931
|
+
if [[ -z "$keyword" && -t 0 ]]; then
|
|
932
|
+
printf " Search keyword: "
|
|
933
|
+
read -r keyword
|
|
934
|
+
fi
|
|
955
935
|
[[ -z "$keyword" ]] && { err "Usage: skillpull search <keyword>"; return 1; }
|
|
956
936
|
|
|
957
937
|
dim "Searching GitHub for '$keyword' ..."
|
|
@@ -1049,7 +1029,7 @@ HELP
|
|
|
1049
1029
|
# ── Argument parsing & dispatch ──
|
|
1050
1030
|
main() {
|
|
1051
1031
|
local cmd="" repo_url="" skill_name="" custom_path=""
|
|
1052
|
-
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
|
|
1053
1033
|
local agents=()
|
|
1054
1034
|
local alias_args=()
|
|
1055
1035
|
QUIET=0; BRANCH=""
|
|
@@ -1087,11 +1067,11 @@ main() {
|
|
|
1087
1067
|
--force|-f) force=1; shift ;;
|
|
1088
1068
|
--dry-run) dry_run=1; shift ;;
|
|
1089
1069
|
--quiet|-q) QUIET=1; shift ;;
|
|
1090
|
-
--claude) agents+=("claude"); shift ;;
|
|
1091
|
-
--codex) agents+=("codex"); shift ;;
|
|
1092
|
-
--kiro) agents+=("kiro"); shift ;;
|
|
1093
|
-
--cursor) agents+=("cursor"); shift ;;
|
|
1094
|
-
--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 ;;
|
|
1095
1075
|
list) cmd="list"; shift ;;
|
|
1096
1076
|
installed) cmd="installed"; shift ;;
|
|
1097
1077
|
remove) cmd="remove"; shift ;;
|
|
@@ -1132,7 +1112,20 @@ main() {
|
|
|
1132
1112
|
if [[ "$use_all" == "1" ]]; then
|
|
1133
1113
|
agents=("claude" "codex" "kiro" "cursor")
|
|
1134
1114
|
elif [[ ${#agents[@]} -eq 0 ]]; then
|
|
1135
|
-
|
|
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
|
|
1136
1129
|
fi
|
|
1137
1130
|
|
|
1138
1131
|
case "${cmd:-}" in
|
|
@@ -1160,7 +1153,15 @@ main() {
|
|
|
1160
1153
|
done
|
|
1161
1154
|
;;
|
|
1162
1155
|
list)
|
|
1163
|
-
[[ -z "$repo_url" ]]
|
|
1156
|
+
if [[ -z "$repo_url" ]]; then
|
|
1157
|
+
local reg; reg="$(read_config_key "registry")"
|
|
1158
|
+
if [[ -z "$reg" ]]; then
|
|
1159
|
+
err "No source specified and no registry set."
|
|
1160
|
+
err "Run 'skillpull init' to set a default skill repo."
|
|
1161
|
+
exit 1
|
|
1162
|
+
fi
|
|
1163
|
+
repo_url="$reg"
|
|
1164
|
+
fi
|
|
1164
1165
|
local resolved; resolved="$(resolve_repo_url "$repo_url")" || exit 1
|
|
1165
1166
|
cmd_list "$resolved"
|
|
1166
1167
|
;;
|