aidevops 3.13.45 → 3.13.47

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/VERSION CHANGED
@@ -1 +1 @@
1
- 3.13.45
1
+ 3.13.47
package/aidevops.sh CHANGED
@@ -5,7 +5,7 @@
5
5
  # AI DevOps Framework CLI
6
6
  # Usage: aidevops <command> [options]
7
7
  #
8
- # Version: 3.13.45
8
+ # Version: 3.13.47
9
9
 
10
10
  set -euo pipefail
11
11
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "aidevops",
3
- "version": "3.13.45",
3
+ "version": "3.13.47",
4
4
  "description": "AI DevOps Framework - AI-assisted development workflows, code quality, and deployment automation",
5
5
  "type": "module",
6
6
  "bin": {
package/setup.sh CHANGED
@@ -12,7 +12,7 @@ shopt -s inherit_errexit 2>/dev/null || true
12
12
  # AI Assistant Server Access Framework Setup Script
13
13
  # Helps developers set up the framework for their infrastructure
14
14
  #
15
- # Version: 3.13.45
15
+ # Version: 3.13.47
16
16
  #
17
17
  # Quick Install:
18
18
  # npm install -g aidevops && aidevops update (recommended)
@@ -1124,6 +1124,107 @@ setup_cases_planes() {
1124
1124
  return 0
1125
1125
  }
1126
1126
 
1127
+ # Non-interactive setup singleton state. This lock only gates the deployment path;
1128
+ # interactive setup remains prompt-driven and can still be used for first-run init.
1129
+ SETUP_NONINTERACTIVE_LOCK_HELD=false
1130
+ SETUP_NONINTERACTIVE_LOCK_DIR=""
1131
+ SETUP_NONINTERACTIVE_CHILD_PIDS=""
1132
+ SETUP_NONINTERACTIVE_TERMINATING=false
1133
+
1134
+ _setup_lock_pid_alive() {
1135
+ local pid="$1"
1136
+ [[ "$pid" =~ ^[0-9]+$ ]] || return 1
1137
+ kill -0 "$pid" 2>/dev/null
1138
+ return $?
1139
+ }
1140
+
1141
+ _setup_register_child_pid() {
1142
+ local pid="$1"
1143
+ [[ -n "$pid" ]] || return 0
1144
+ SETUP_NONINTERACTIVE_CHILD_PIDS="${SETUP_NONINTERACTIVE_CHILD_PIDS}${SETUP_NONINTERACTIVE_CHILD_PIDS:+ }${pid}"
1145
+ return 0
1146
+ }
1147
+
1148
+ _setup_cleanup_noninteractive_children() {
1149
+ local pid=""
1150
+ [[ "${SETUP_NONINTERACTIVE_TERMINATING:-false}" == "true" ]] || return 0
1151
+ for pid in ${SETUP_NONINTERACTIVE_CHILD_PIDS:-}; do
1152
+ if _setup_lock_pid_alive "$pid"; then
1153
+ kill -TERM "$pid" 2>/dev/null || true
1154
+ fi
1155
+ done
1156
+ for pid in ${SETUP_NONINTERACTIVE_CHILD_PIDS:-}; do
1157
+ wait "$pid" 2>/dev/null || true
1158
+ done
1159
+ return 0
1160
+ }
1161
+
1162
+ _setup_release_noninteractive_setup_lock() {
1163
+ local lock_dir="${SETUP_NONINTERACTIVE_LOCK_DIR:-}"
1164
+ local owner_pid=""
1165
+ if [[ "${SETUP_NONINTERACTIVE_LOCK_HELD:-false}" != "true" || -z "$lock_dir" ]]; then
1166
+ return 0
1167
+ fi
1168
+ if [[ -r "$lock_dir/owner.pid" ]]; then
1169
+ owner_pid=$(tr -d '[:space:]' <"$lock_dir/owner.pid" 2>/dev/null || true)
1170
+ fi
1171
+ if [[ -z "$owner_pid" || "$owner_pid" == "$$" ]]; then
1172
+ rm -rf "$lock_dir" 2>/dev/null || true
1173
+ fi
1174
+ SETUP_NONINTERACTIVE_LOCK_HELD=false
1175
+ return 0
1176
+ }
1177
+
1178
+ _setup_noninteractive_signal_exit() {
1179
+ local signal_name="$1"
1180
+ local exit_code=143
1181
+ [[ "$signal_name" == "INT" ]] && exit_code=130
1182
+ SETUP_NONINTERACTIVE_TERMINATING=true
1183
+ print_warning "setup.sh --non-interactive received ${signal_name}; cleaning up child deployment processes"
1184
+ _setup_cleanup_noninteractive_children
1185
+ _setup_release_noninteractive_setup_lock
1186
+ exit "$exit_code"
1187
+ }
1188
+
1189
+ _setup_acquire_noninteractive_setup_lock() {
1190
+ local lock_dir="${AIDEVOPS_SETUP_LOCK_DIR:-$HOME/.aidevops/locks/setup-noninteractive.lock.d}"
1191
+ local owner_pid=""
1192
+ local owner_cmd=""
1193
+ local attempts=0
1194
+ mkdir -p "$(dirname "$lock_dir")" 2>/dev/null || true
1195
+ while [[ "$attempts" -lt 2 ]]; do
1196
+ if mkdir "$lock_dir" 2>/dev/null; then
1197
+ SETUP_NONINTERACTIVE_LOCK_DIR="$lock_dir"
1198
+ SETUP_NONINTERACTIVE_LOCK_HELD=true
1199
+ printf '%s\n' "$$" >"$lock_dir/owner.pid" 2>/dev/null || true
1200
+ printf '%s\n' "$(date -u +%Y-%m-%dT%H:%M:%SZ)" >"$lock_dir/started_at" 2>/dev/null || true
1201
+ printf '%s\n' "$0 $*" >"$lock_dir/command" 2>/dev/null || true
1202
+ trap _setup_release_noninteractive_setup_lock EXIT
1203
+ trap '_setup_noninteractive_signal_exit TERM' TERM
1204
+ trap '_setup_noninteractive_signal_exit INT' INT
1205
+ return 0
1206
+ fi
1207
+
1208
+ owner_pid=""
1209
+ owner_cmd=""
1210
+ if [[ -r "$lock_dir/owner.pid" ]]; then
1211
+ owner_pid=$(tr -d '[:space:]' <"$lock_dir/owner.pid" 2>/dev/null || true)
1212
+ fi
1213
+ if _setup_lock_pid_alive "$owner_pid"; then
1214
+ [[ -r "$lock_dir/command" ]] && owner_cmd=$(tr '\n' ' ' <"$lock_dir/command" 2>/dev/null || true)
1215
+ print_error "Another setup.sh --non-interactive process is already running (pid ${owner_pid}, lock ${lock_dir}). Exiting to avoid overlapping deployments. ${owner_cmd:+Command: ${owner_cmd}}"
1216
+ return 75
1217
+ fi
1218
+
1219
+ print_warning "Removing stale setup.sh --non-interactive lock at ${lock_dir}"
1220
+ rm -rf "$lock_dir" 2>/dev/null || true
1221
+ attempts=$((attempts + 1))
1222
+ done
1223
+
1224
+ print_error "Unable to acquire setup.sh --non-interactive lock at ${lock_dir}"
1225
+ return 75
1226
+ }
1227
+
1127
1228
  # Non-interactive path: deploy agents and run safe migrations only (no prompts).
1128
1229
  # GH#21060 / t2911: Every direct function call is wrapped with _time_step so
1129
1230
  # that a one-line-per-stage TSV timing record is appended to
@@ -1196,12 +1297,14 @@ _setup_run_non_interactive() {
1196
1297
  if _time_step "generate_agent_skills" generate_agent_skills; then
1197
1298
  _time_step "create_skill_symlinks" create_skill_symlinks &
1198
1299
  _pid_symlinks=$!
1300
+ _setup_register_child_pid "$_pid_symlinks"
1199
1301
  else
1200
1302
  print_warning "Agent skills generation failed — skipping skill symlinks"
1201
1303
  fi
1202
1304
 
1203
1305
  _time_step "scan_imported_skills" scan_imported_skills &
1204
1306
  local _pid_scan=$!
1307
+ _setup_register_child_pid "$_pid_scan"
1205
1308
 
1206
1309
  if [[ -n "$_pid_symlinks" ]]; then
1207
1310
  wait "$_pid_symlinks" 2>/dev/null || print_warning "Skill symlink creation encountered issues (non-critical)"
@@ -1543,6 +1646,10 @@ main() {
1543
1646
  exit 1
1544
1647
  fi
1545
1648
 
1649
+ if [[ "$NON_INTERACTIVE" == "true" ]]; then
1650
+ _setup_acquire_noninteractive_setup_lock "$@" || exit $?
1651
+ fi
1652
+
1546
1653
  _setup_print_header
1547
1654
 
1548
1655
  # GH#18950 (t2087): bash 3.2 → modern bash upgrade check. Runs before