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.
Files changed (2) hide show
  1. package/package.json +1 -1
  2. package/skillpull +38 -49
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "skillpull",
3
- "version": "0.4.2",
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.2"
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"
@@ -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
- 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
1140
1129
  fi
1141
1130
 
1142
1131
  case "${cmd:-}" in