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.
Files changed (2) hide show
  1. package/package.json +1 -1
  2. package/skillpull +52 -51
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "skillpull",
3
- "version": "0.4.0",
3
+ "version": "0.4.4",
4
4
  "description": "Sync AI agent skills from Git repositories to Claude, Codex, Kiro, and Cursor",
5
5
  "bin": {
6
6
  "skillpull": "./skillpull"
package/skillpull CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env bash
2
2
  set -euo pipefail
3
3
 
4
- VERSION="0.4.0"
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}↑↓ move Space select Enter confirm${RESET}\n\n" >&2
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
- # Read single key
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
- agents=("$DEFAULT_AGENT")
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" ]] && { err "Missing source"; usage; exit 1; }
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
  ;;