shipwright-cli 2.1.1 → 2.1.2

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 (96) hide show
  1. package/package.json +1 -1
  2. package/scripts/sw +1 -1
  3. package/scripts/sw-activity.sh +1 -1
  4. package/scripts/sw-adaptive.sh +1 -1
  5. package/scripts/sw-adversarial.sh +1 -1
  6. package/scripts/sw-architecture-enforcer.sh +1 -1
  7. package/scripts/sw-auth.sh +1 -1
  8. package/scripts/sw-autonomous.sh +1 -1
  9. package/scripts/sw-changelog.sh +1 -1
  10. package/scripts/sw-checkpoint.sh +1 -1
  11. package/scripts/sw-ci.sh +1 -1
  12. package/scripts/sw-cleanup.sh +1 -1
  13. package/scripts/sw-code-review.sh +1 -1
  14. package/scripts/sw-connect.sh +1 -1
  15. package/scripts/sw-context.sh +1 -1
  16. package/scripts/sw-cost.sh +1 -1
  17. package/scripts/sw-daemon.sh +85 -4
  18. package/scripts/sw-dashboard.sh +1 -1
  19. package/scripts/sw-db.sh +1 -1
  20. package/scripts/sw-decompose.sh +1 -1
  21. package/scripts/sw-deps.sh +1 -1
  22. package/scripts/sw-developer-simulation.sh +1 -1
  23. package/scripts/sw-discovery.sh +1 -1
  24. package/scripts/sw-docs-agent.sh +1 -1
  25. package/scripts/sw-docs.sh +1 -1
  26. package/scripts/sw-doctor.sh +1 -1
  27. package/scripts/sw-dora.sh +1 -1
  28. package/scripts/sw-durable.sh +1 -1
  29. package/scripts/sw-e2e-orchestrator.sh +1 -1
  30. package/scripts/sw-eventbus.sh +1 -1
  31. package/scripts/sw-feedback.sh +1 -1
  32. package/scripts/sw-fix.sh +1 -1
  33. package/scripts/sw-fleet-discover.sh +1 -1
  34. package/scripts/sw-fleet-viz.sh +1 -1
  35. package/scripts/sw-fleet.sh +1 -1
  36. package/scripts/sw-github-app.sh +1 -1
  37. package/scripts/sw-github-checks.sh +1 -1
  38. package/scripts/sw-github-deploy.sh +1 -1
  39. package/scripts/sw-github-graphql.sh +1 -1
  40. package/scripts/sw-guild.sh +1 -1
  41. package/scripts/sw-heartbeat.sh +1 -1
  42. package/scripts/sw-hygiene.sh +1 -1
  43. package/scripts/sw-incident.sh +1 -1
  44. package/scripts/sw-init.sh +1 -1
  45. package/scripts/sw-instrument.sh +1 -1
  46. package/scripts/sw-intelligence.sh +1 -1
  47. package/scripts/sw-jira.sh +1 -1
  48. package/scripts/sw-launchd.sh +1 -1
  49. package/scripts/sw-linear.sh +1 -1
  50. package/scripts/sw-logs.sh +1 -1
  51. package/scripts/sw-loop.sh +24 -8
  52. package/scripts/sw-memory.sh +59 -57
  53. package/scripts/sw-mission-control.sh +1 -1
  54. package/scripts/sw-model-router.sh +1 -1
  55. package/scripts/sw-otel.sh +1 -1
  56. package/scripts/sw-oversight.sh +1 -1
  57. package/scripts/sw-pipeline-composer.sh +1 -1
  58. package/scripts/sw-pipeline-vitals.sh +1 -1
  59. package/scripts/sw-pipeline.sh +41 -1
  60. package/scripts/sw-pm.sh +1 -1
  61. package/scripts/sw-pr-lifecycle.sh +1 -1
  62. package/scripts/sw-predictive.sh +1 -1
  63. package/scripts/sw-prep.sh +18 -14
  64. package/scripts/sw-ps.sh +1 -1
  65. package/scripts/sw-public-dashboard.sh +1 -1
  66. package/scripts/sw-quality.sh +1 -1
  67. package/scripts/sw-reaper.sh +1 -1
  68. package/scripts/sw-regression.sh +1 -1
  69. package/scripts/sw-release-manager.sh +1 -1
  70. package/scripts/sw-release.sh +1 -1
  71. package/scripts/sw-remote.sh +1 -1
  72. package/scripts/sw-replay.sh +1 -1
  73. package/scripts/sw-retro.sh +1 -1
  74. package/scripts/sw-scale.sh +1 -1
  75. package/scripts/sw-security-audit.sh +1 -1
  76. package/scripts/sw-self-optimize.sh +1 -1
  77. package/scripts/sw-session.sh +1 -1
  78. package/scripts/sw-setup.sh +1 -1
  79. package/scripts/sw-standup.sh +1 -1
  80. package/scripts/sw-status.sh +1 -1
  81. package/scripts/sw-strategic.sh +1 -1
  82. package/scripts/sw-stream.sh +1 -1
  83. package/scripts/sw-swarm.sh +1 -1
  84. package/scripts/sw-team-stages.sh +1 -1
  85. package/scripts/sw-templates.sh +1 -1
  86. package/scripts/sw-testgen.sh +1 -1
  87. package/scripts/sw-tmux-pipeline.sh +1 -1
  88. package/scripts/sw-tmux.sh +1 -1
  89. package/scripts/sw-trace.sh +1 -1
  90. package/scripts/sw-tracker.sh +1 -1
  91. package/scripts/sw-triage.sh +1 -1
  92. package/scripts/sw-upgrade.sh +1 -1
  93. package/scripts/sw-ux.sh +1 -1
  94. package/scripts/sw-webhook.sh +1 -1
  95. package/scripts/sw-widgets.sh +1 -1
  96. package/scripts/sw-worktree.sh +1 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "shipwright-cli",
3
- "version": "2.1.1",
3
+ "version": "2.1.2",
4
4
  "description": "Orchestrate autonomous Claude Code agent teams in tmux",
5
5
  "bin": {
6
6
  "shipwright": "./scripts/sw",
package/scripts/sw CHANGED
@@ -5,7 +5,7 @@
5
5
  # ╚═══════════════════════════════════════════════════════════════════════════╝
6
6
  set -euo pipefail
7
7
 
8
- VERSION="2.1.1"
8
+ VERSION="2.1.2"
9
9
 
10
10
  # Resolve symlinks (required for npm global install where bin/ symlinks to node_modules/)
11
11
  SOURCE="${BASH_SOURCE[0]}"
@@ -6,7 +6,7 @@
6
6
  set -euo pipefail
7
7
  trap 'echo "ERROR: $BASH_SOURCE:$LINENO exited with status $?" >&2' ERR
8
8
 
9
- VERSION="2.1.1"
9
+ VERSION="2.1.2"
10
10
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
11
11
 
12
12
  # ─── Colors (matches Seth's tmux theme) ─────────────────────────────────────
@@ -6,7 +6,7 @@
6
6
  set -euo pipefail
7
7
  trap 'echo "ERROR: $BASH_SOURCE:$LINENO exited with status $?" >&2' ERR
8
8
 
9
- VERSION="2.1.1"
9
+ VERSION="2.1.2"
10
10
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
11
11
 
12
12
  # ─── Colors (matches Seth's tmux theme) ─────────────────────────────────────
@@ -6,7 +6,7 @@
6
6
  set -euo pipefail
7
7
  trap 'echo "ERROR: $BASH_SOURCE:$LINENO exited with status $?" >&2' ERR
8
8
 
9
- VERSION="2.1.1"
9
+ VERSION="2.1.2"
10
10
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
11
11
  REPO_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
12
12
 
@@ -6,7 +6,7 @@
6
6
  set -euo pipefail
7
7
  trap 'echo "ERROR: $BASH_SOURCE:$LINENO exited with status $?" >&2' ERR
8
8
 
9
- VERSION="2.1.1"
9
+ VERSION="2.1.2"
10
10
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
11
11
  REPO_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
12
12
 
@@ -6,7 +6,7 @@
6
6
  set -euo pipefail
7
7
  trap 'echo "ERROR: $BASH_SOURCE:$LINENO exited with status $?" >&2' ERR
8
8
 
9
- VERSION="2.1.1"
9
+ VERSION="2.1.2"
10
10
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
11
11
  REPO_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
12
12
 
@@ -7,7 +7,7 @@
7
7
  set -euo pipefail
8
8
  trap 'echo "ERROR: $BASH_SOURCE:$LINENO exited with status $?" >&2' ERR
9
9
 
10
- VERSION="2.1.1"
10
+ VERSION="2.1.2"
11
11
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
12
12
  REPO_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
13
13
 
@@ -7,7 +7,7 @@
7
7
  set -euo pipefail
8
8
  trap 'echo "ERROR: $BASH_SOURCE:$LINENO exited with status $?" >&2' ERR
9
9
 
10
- VERSION="2.1.1"
10
+ VERSION="2.1.2"
11
11
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
12
12
  REPO_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
13
13
 
@@ -8,7 +8,7 @@
8
8
  set -euo pipefail
9
9
  trap 'echo "ERROR: $BASH_SOURCE:$LINENO exited with status $?" >&2' ERR
10
10
 
11
- VERSION="2.1.1"
11
+ VERSION="2.1.2"
12
12
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
13
13
 
14
14
  # ─── Colors (matches Seth's tmux theme) ─────────────────────────────────────
package/scripts/sw-ci.sh CHANGED
@@ -6,7 +6,7 @@
6
6
  set -euo pipefail
7
7
  trap 'echo "ERROR: $BASH_SOURCE:$LINENO exited with status $?" >&2' ERR
8
8
 
9
- VERSION="2.1.1"
9
+ VERSION="2.1.2"
10
10
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
11
11
  REPO_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
12
12
 
@@ -5,7 +5,7 @@
5
5
  # ║ Default: dry-run (shows what would be cleaned). ║
6
6
  # ║ Use --force to actually kill sessions and remove files. ║
7
7
  # ╚═══════════════════════════════════════════════════════════════════════════╝
8
- VERSION="2.1.1"
8
+ VERSION="2.1.2"
9
9
  set -euo pipefail
10
10
  trap 'echo "ERROR: $BASH_SOURCE:$LINENO exited with status $?" >&2' ERR
11
11
 
@@ -6,7 +6,7 @@
6
6
  set -euo pipefail
7
7
  trap 'echo "ERROR: $BASH_SOURCE:$LINENO exited with status $?" >&2' ERR
8
8
 
9
- VERSION="2.1.1"
9
+ VERSION="2.1.2"
10
10
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
11
11
  REPO_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
12
12
 
@@ -8,7 +8,7 @@
8
8
  set -euo pipefail
9
9
  trap 'echo "ERROR: $BASH_SOURCE:$LINENO exited with status $?" >&2' ERR
10
10
 
11
- VERSION="2.1.1"
11
+ VERSION="2.1.2"
12
12
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
13
13
 
14
14
  # ─── Colors (matches Seth's tmux theme) ─────────────────────────────────────
@@ -6,7 +6,7 @@
6
6
  set -euo pipefail
7
7
  trap 'echo "ERROR: $BASH_SOURCE:$LINENO exited with status $?" >&2' ERR
8
8
 
9
- VERSION="2.1.1"
9
+ VERSION="2.1.2"
10
10
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
11
11
  REPO_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
12
12
 
@@ -6,7 +6,7 @@
6
6
  set -euo pipefail
7
7
  trap 'echo "ERROR: $BASH_SOURCE:$LINENO exited with status $?" >&2' ERR
8
8
 
9
- VERSION="2.1.1"
9
+ VERSION="2.1.2"
10
10
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
11
11
  REPO_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
12
12
 
@@ -9,7 +9,7 @@ trap 'echo "ERROR: $BASH_SOURCE:$LINENO exited with status $?" >&2' ERR
9
9
  # Allow spawning Claude CLI from within a Claude Code session (daemon, fleet, etc.)
10
10
  unset CLAUDECODE 2>/dev/null || true
11
11
 
12
- VERSION="2.1.1"
12
+ VERSION="2.1.2"
13
13
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
14
14
  REPO_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
15
15
 
@@ -4049,6 +4049,27 @@ Auto-detected by \`shipwright daemon patrol\` on $(now_iso)." \
4049
4049
  fi
4050
4050
  echo ""
4051
4051
 
4052
+ echo -e " ${BOLD}Dead Pane Reaping${RESET}"
4053
+ pre_check_findings=$total_findings
4054
+ if [[ -x "$SCRIPT_DIR/sw-reaper.sh" ]] && [[ -n "${TMUX:-}" ]]; then
4055
+ local reaper_output
4056
+ reaper_output=$(bash "$SCRIPT_DIR/sw-reaper.sh" --once 2>/dev/null) || true
4057
+ local reaped_count=0
4058
+ reaped_count=$(echo "$reaper_output" | grep -c "Reaped" 2>/dev/null || true)
4059
+ if [[ "${reaped_count:-0}" -gt 0 ]]; then
4060
+ total_findings=$((total_findings + reaped_count))
4061
+ echo -e " ${CYAN}●${RESET} Reaped ${reaped_count} dead agent pane(s)"
4062
+ else
4063
+ echo -e " ${GREEN}●${RESET} No dead panes found"
4064
+ fi
4065
+ else
4066
+ echo -e " ${DIM}●${RESET} Skipped (no tmux session or reaper not found)"
4067
+ fi
4068
+ if [[ "$total_findings" -gt "$pre_check_findings" ]]; then
4069
+ patrol_findings_summary="${patrol_findings_summary}reaper: $((total_findings - pre_check_findings)) finding(s); "
4070
+ fi
4071
+ echo ""
4072
+
4052
4073
  # ── Stage 2: AI-Powered Confirmation (if enabled) ──
4053
4074
  if [[ "${PREDICTION_ENABLED:-false}" == "true" ]] && type patrol_ai_analyze &>/dev/null 2>&1; then
4054
4075
  daemon_log INFO "Intelligence: using AI patrol analysis (prediction enabled)"
@@ -4592,9 +4613,24 @@ NUDGE_EOF
4592
4613
  local stale_timeout
4593
4614
  stale_timeout=$(get_adaptive_stale_timeout "$PIPELINE_TEMPLATE")
4594
4615
  if [[ "$elapsed" -gt "$stale_timeout" ]]; then
4595
- daemon_log WARN "Stale job (legacy): issue #${issue_num} (${elapsed}s > ${stale_timeout}s, PID $pid)"
4596
- # Don't kill just log. Let the process run.
4597
- emit_event "daemon.stale_warning" "issue=$issue_num" "elapsed_s=$elapsed" "pid=$pid"
4616
+ # Check if process is still alive
4617
+ if kill -0 "$pid" 2>/dev/null; then
4618
+ # Kill at 2x stale timeout — the process is truly hung
4619
+ local kill_threshold=$(( stale_timeout * 2 ))
4620
+ if [[ "$elapsed" -gt "$kill_threshold" ]]; then
4621
+ daemon_log WARN "Killing stale job (legacy): issue #${issue_num} (${elapsed}s > ${kill_threshold}s kill threshold, PID $pid)"
4622
+ emit_event "daemon.stale_kill" "issue=$issue_num" "elapsed_s=$elapsed" "pid=$pid"
4623
+ kill "$pid" 2>/dev/null || true
4624
+ sleep 2
4625
+ kill -9 "$pid" 2>/dev/null || true
4626
+ else
4627
+ daemon_log WARN "Stale job (legacy): issue #${issue_num} (${elapsed}s > ${stale_timeout}s, PID $pid) — will kill at ${kill_threshold}s"
4628
+ emit_event "daemon.stale_warning" "issue=$issue_num" "elapsed_s=$elapsed" "pid=$pid"
4629
+ fi
4630
+ else
4631
+ daemon_log WARN "Stale job with dead process: issue #${issue_num} (PID $pid no longer exists)"
4632
+ emit_event "daemon.stale_dead" "issue=$issue_num" "pid=$pid"
4633
+ fi
4598
4634
  findings=$((findings + 1))
4599
4635
  fi
4600
4636
  fi
@@ -5167,6 +5203,51 @@ daemon_cleanup_stale() {
5167
5203
  fi
5168
5204
  fi
5169
5205
 
5206
+ # ── 6. Detect stale pipeline-state.md stuck in "running" ──
5207
+ local pipeline_state=".claude/pipeline-state.md"
5208
+ if [[ -f "$pipeline_state" ]]; then
5209
+ local ps_status=""
5210
+ ps_status=$(sed -n 's/^status: *//p' "$pipeline_state" 2>/dev/null | head -1 | tr -d ' ')
5211
+ if [[ "$ps_status" == "running" ]]; then
5212
+ local ps_mtime
5213
+ ps_mtime=$(stat -f '%m' "$pipeline_state" 2>/dev/null || stat -c '%Y' "$pipeline_state" 2>/dev/null || echo "0")
5214
+ local ps_age=$((now_e - ps_mtime))
5215
+ # If pipeline-state.md has been "running" for more than 2 hours and no active job
5216
+ if [[ "$ps_age" -gt 7200 ]]; then
5217
+ local has_active=false
5218
+ if [[ -f "$STATE_FILE" ]]; then
5219
+ local active_count
5220
+ active_count=$(jq '.active_jobs | length' "$STATE_FILE" 2>/dev/null || echo "0")
5221
+ [[ "${active_count:-0}" -gt 0 ]] && has_active=true
5222
+ fi
5223
+ if [[ "$has_active" == "false" ]]; then
5224
+ daemon_log WARN "Stale pipeline-state.md stuck in 'running' for ${ps_age}s with no active jobs — marking failed"
5225
+ # Atomically update status to failed
5226
+ local tmp_ps="${pipeline_state}.tmp.$$"
5227
+ sed 's/^status: *running/status: failed (stale — cleaned by daemon)/' "$pipeline_state" > "$tmp_ps" 2>/dev/null && mv "$tmp_ps" "$pipeline_state" || rm -f "$tmp_ps"
5228
+ emit_event "daemon.stale_pipeline_state" "age_s=$ps_age"
5229
+ cleaned=$((cleaned + 1))
5230
+ fi
5231
+ fi
5232
+ fi
5233
+ fi
5234
+
5235
+ # ── 7. Clean remote branches for merged pipeline/* branches ──
5236
+ if command -v git &>/dev/null && [[ "${NO_GITHUB:-}" != "true" ]]; then
5237
+ while IFS= read -r branch; do
5238
+ [[ -z "$branch" ]] && continue
5239
+ branch="${branch## }"
5240
+ [[ "$branch" == pipeline/* ]] || continue
5241
+ local br_issue="${branch#pipeline/pipeline-issue-}"
5242
+ if ! daemon_is_inflight "$br_issue" 2>/dev/null; then
5243
+ daemon_log INFO "Removing orphaned pipeline branch: ${branch}"
5244
+ git branch -D "$branch" 2>/dev/null || true
5245
+ git push origin --delete "$branch" 2>/dev/null || true
5246
+ cleaned=$((cleaned + 1))
5247
+ fi
5248
+ done < <(git branch --list 'pipeline/*' 2>/dev/null)
5249
+ fi
5250
+
5170
5251
  if [[ "$cleaned" -gt 0 ]]; then
5171
5252
  emit_event "daemon.cleanup" "cleaned=$cleaned" "age_days=$age_days"
5172
5253
  daemon_log SUCCESS "Stale reaper cleaned ${cleaned} item(s)"
@@ -6,7 +6,7 @@
6
6
  set -euo pipefail
7
7
  trap 'echo "ERROR: $BASH_SOURCE:$LINENO exited with status $?" >&2' ERR
8
8
 
9
- VERSION="2.1.1"
9
+ VERSION="2.1.2"
10
10
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
11
11
 
12
12
  # ─── Colors (matches Seth's tmux theme) ─────────────────────────────────────
package/scripts/sw-db.sh CHANGED
@@ -14,7 +14,7 @@ if [[ -n "${_SW_DB_LOADED:-}" ]] && [[ "${BASH_SOURCE[0]}" != "$0" ]]; then
14
14
  fi
15
15
  _SW_DB_LOADED=1
16
16
 
17
- VERSION="2.1.1"
17
+ VERSION="2.1.2"
18
18
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
19
19
  REPO_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
20
20
 
@@ -6,7 +6,7 @@
6
6
  set -euo pipefail
7
7
  trap 'echo "ERROR: $BASH_SOURCE:$LINENO exited with status $?" >&2' ERR
8
8
 
9
- VERSION="2.1.1"
9
+ VERSION="2.1.2"
10
10
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
11
11
  REPO_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
12
12
 
@@ -6,7 +6,7 @@
6
6
  set -euo pipefail
7
7
  trap 'echo "ERROR: $BASH_SOURCE:$LINENO exited with status $?" >&2' ERR
8
8
 
9
- VERSION="2.1.1"
9
+ VERSION="2.1.2"
10
10
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
11
11
 
12
12
  # ─── Colors (matches Seth's tmux theme) ─────────────────────────────────────
@@ -6,7 +6,7 @@
6
6
  set -euo pipefail
7
7
  trap 'echo "ERROR: $BASH_SOURCE:$LINENO exited with status $?" >&2' ERR
8
8
 
9
- VERSION="2.1.1"
9
+ VERSION="2.1.2"
10
10
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
11
11
  REPO_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
12
12
 
@@ -7,7 +7,7 @@
7
7
  set -euo pipefail
8
8
  trap 'echo "ERROR: $BASH_SOURCE:$LINENO exited with status $?" >&2' ERR
9
9
 
10
- VERSION="2.1.1"
10
+ VERSION="2.1.2"
11
11
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
12
12
  REPO_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
13
13
 
@@ -6,7 +6,7 @@
6
6
  set -euo pipefail
7
7
  trap 'echo "ERROR: $BASH_SOURCE:$LINENO exited with status $?" >&2' ERR
8
8
 
9
- VERSION="2.1.1"
9
+ VERSION="2.1.2"
10
10
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
11
11
  REPO_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
12
12
 
@@ -6,7 +6,7 @@
6
6
  set -euo pipefail
7
7
  trap 'echo "ERROR: $BASH_SOURCE:$LINENO exited with status $?" >&2' ERR
8
8
 
9
- VERSION="2.1.1"
9
+ VERSION="2.1.2"
10
10
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
11
11
  REPO_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
12
12
 
@@ -4,7 +4,7 @@
4
4
  # ║ ║
5
5
  # ║ Checks prerequisites, installed files, PATH, and common issues. ║
6
6
  # ╚═══════════════════════════════════════════════════════════════════════════╝
7
- VERSION="2.1.1"
7
+ VERSION="2.1.2"
8
8
  set -euo pipefail
9
9
  trap 'echo "ERROR: $BASH_SOURCE:$LINENO exited with status $?" >&2' ERR
10
10
 
@@ -8,7 +8,7 @@
8
8
  set -euo pipefail
9
9
  trap 'echo "ERROR: $BASH_SOURCE:$LINENO exited with status $?" >&2' ERR
10
10
 
11
- VERSION="2.1.1"
11
+ VERSION="2.1.2"
12
12
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
13
13
 
14
14
  # ─── Colors (matches Seth's tmux theme) ─────────────────────────────────────
@@ -7,7 +7,7 @@
7
7
  set -euo pipefail
8
8
  trap 'echo "ERROR: $BASH_SOURCE:$LINENO exited with status $?" >&2' ERR
9
9
 
10
- VERSION="2.1.1"
10
+ VERSION="2.1.2"
11
11
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
12
12
 
13
13
  # ─── Colors (matches Seth's tmux theme) ─────────────────────────────────────
@@ -5,7 +5,7 @@
5
5
  # ╚═══════════════════════════════════════════════════════════════════════════╝
6
6
  set -euo pipefail
7
7
 
8
- VERSION="2.1.1"
8
+ VERSION="2.1.2"
9
9
 
10
10
  # ─── Script directory resolution ────────────────────────────────────────────
11
11
  SOURCE="${BASH_SOURCE[0]}"
@@ -7,7 +7,7 @@
7
7
  set -euo pipefail
8
8
  trap 'echo "ERROR: $BASH_SOURCE:$LINENO exited with status $?" >&2' ERR
9
9
 
10
- VERSION="2.1.1"
10
+ VERSION="2.1.2"
11
11
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
12
12
 
13
13
  # ─── Colors (matches Seth's tmux theme) ─────────────────────────────────────
@@ -6,7 +6,7 @@
6
6
  set -euo pipefail
7
7
  trap 'echo "ERROR: $BASH_SOURCE:$LINENO exited with status $?" >&2' ERR
8
8
 
9
- VERSION="2.1.1"
9
+ VERSION="2.1.2"
10
10
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
11
11
  REPO_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
12
12
 
package/scripts/sw-fix.sh CHANGED
@@ -6,7 +6,7 @@
6
6
  set -euo pipefail
7
7
  trap 'echo "ERROR: $BASH_SOURCE:$LINENO exited with status $?" >&2' ERR
8
8
 
9
- VERSION="2.1.1"
9
+ VERSION="2.1.2"
10
10
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
11
11
 
12
12
  # ─── Colors (matches Seth's tmux theme) ─────────────────────────────────────
@@ -6,7 +6,7 @@
6
6
  set -euo pipefail
7
7
  trap 'echo "ERROR: $BASH_SOURCE:$LINENO exited with status $?" >&2' ERR
8
8
 
9
- VERSION="2.1.1"
9
+ VERSION="2.1.2"
10
10
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
11
11
  REPO_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
12
12
 
@@ -6,7 +6,7 @@
6
6
  set -euo pipefail
7
7
  trap 'echo "ERROR: $BASH_SOURCE:$LINENO exited with status $?" >&2' ERR
8
8
 
9
- VERSION="2.1.1"
9
+ VERSION="2.1.2"
10
10
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
11
11
  REPO_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
12
12
 
@@ -6,7 +6,7 @@
6
6
  set -euo pipefail
7
7
  trap 'echo "ERROR: $BASH_SOURCE:$LINENO exited with status $?" >&2' ERR
8
8
 
9
- VERSION="2.1.1"
9
+ VERSION="2.1.2"
10
10
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
11
11
  REPO_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
12
12
 
@@ -6,7 +6,7 @@
6
6
  set -euo pipefail
7
7
  trap 'echo "ERROR: $BASH_SOURCE:$LINENO exited with status $?" >&2' ERR
8
8
 
9
- VERSION="2.1.1"
9
+ VERSION="2.1.2"
10
10
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
11
11
  REPO_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
12
12
 
@@ -6,7 +6,7 @@
6
6
  set -euo pipefail
7
7
  trap 'echo "ERROR: $BASH_SOURCE:$LINENO exited with status $?" >&2' ERR
8
8
 
9
- VERSION="2.1.1"
9
+ VERSION="2.1.2"
10
10
  SCRIPT_DIR="${SCRIPT_DIR:-$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)}"
11
11
  REPO_DIR="${REPO_DIR:-$(cd "$SCRIPT_DIR/.." && pwd)}"
12
12
 
@@ -6,7 +6,7 @@
6
6
  set -euo pipefail
7
7
  trap 'echo "ERROR: $BASH_SOURCE:$LINENO exited with status $?" >&2' ERR
8
8
 
9
- VERSION="2.1.1"
9
+ VERSION="2.1.2"
10
10
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
11
11
  REPO_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
12
12
 
@@ -6,7 +6,7 @@
6
6
  set -euo pipefail
7
7
  trap 'echo "ERROR: $BASH_SOURCE:$LINENO exited with status $?" >&2' ERR
8
8
 
9
- VERSION="2.1.1"
9
+ VERSION="2.1.2"
10
10
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
11
11
  REPO_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
12
12
 
@@ -6,7 +6,7 @@
6
6
  set -euo pipefail
7
7
  trap 'echo "ERROR: $BASH_SOURCE:$LINENO exited with status $?" >&2' ERR
8
8
 
9
- VERSION="2.1.1"
9
+ VERSION="2.1.2"
10
10
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
11
11
 
12
12
  # ─── Colors (matches Seth's tmux theme) ─────────────────────────────────────
@@ -6,7 +6,7 @@
6
6
  set -euo pipefail
7
7
  trap 'echo "ERROR: $BASH_SOURCE:$LINENO exited with status $?" >&2' ERR
8
8
 
9
- VERSION="2.1.1"
9
+ VERSION="2.1.2"
10
10
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
11
11
 
12
12
  # ─── Colors (matches Seth's tmux theme) ─────────────────────────────────────
@@ -6,7 +6,7 @@
6
6
  set -euo pipefail
7
7
  trap 'echo "ERROR: $BASH_SOURCE:$LINENO exited with status $?" >&2' ERR
8
8
 
9
- VERSION="2.1.1"
9
+ VERSION="2.1.2"
10
10
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
11
11
  REPO_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
12
12
 
@@ -6,7 +6,7 @@
6
6
  set -euo pipefail
7
7
  trap 'echo "ERROR: $BASH_SOURCE:$LINENO exited with status $?" >&2' ERR
8
8
 
9
- VERSION="2.1.1"
9
+ VERSION="2.1.2"
10
10
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
11
11
  REPO_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
12
12
 
@@ -8,7 +8,7 @@
8
8
  # ║ ║
9
9
  # ║ --deploy Detect platform and generate deployed.json template ║
10
10
  # ╚═══════════════════════════════════════════════════════════════════════════╝
11
- VERSION="2.1.1"
11
+ VERSION="2.1.2"
12
12
  set -euo pipefail
13
13
  trap 'echo "ERROR: $BASH_SOURCE:$LINENO exited with status $?" >&2' ERR
14
14
 
@@ -6,7 +6,7 @@
6
6
  set -euo pipefail
7
7
  trap 'echo "ERROR: $BASH_SOURCE:$LINENO exited with status $?" >&2' ERR
8
8
 
9
- VERSION="2.1.1"
9
+ VERSION="2.1.2"
10
10
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
11
11
  REPO_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
12
12
 
@@ -6,7 +6,7 @@
6
6
  set -euo pipefail
7
7
  trap 'echo "ERROR: $BASH_SOURCE:$LINENO exited with status $?" >&2' ERR
8
8
 
9
- VERSION="2.1.1"
9
+ VERSION="2.1.2"
10
10
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
11
11
  REPO_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
12
12
 
@@ -6,7 +6,7 @@
6
6
  set -euo pipefail
7
7
  trap 'echo "ERROR: $BASH_SOURCE:$LINENO exited with status $?" >&2' ERR
8
8
 
9
- VERSION="2.1.1"
9
+ VERSION="2.1.2"
10
10
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
11
11
  REPO_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
12
12
 
@@ -6,7 +6,7 @@
6
6
  set -euo pipefail
7
7
  trap 'echo "ERROR: $BASH_SOURCE:$LINENO exited with status $?" >&2' ERR
8
8
 
9
- VERSION="2.1.1"
9
+ VERSION="2.1.2"
10
10
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
11
11
  REPO_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
12
12
 
@@ -6,7 +6,7 @@
6
6
  set -euo pipefail
7
7
  trap 'echo "ERROR: $BASH_SOURCE:$LINENO exited with status $?" >&2' ERR
8
8
 
9
- VERSION="2.1.1"
9
+ VERSION="2.1.2"
10
10
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
11
11
  REPO_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
12
12
 
@@ -4,7 +4,7 @@
4
4
  # ║ ║
5
5
  # ║ Captures tmux pane scrollback and provides log browsing/search. ║
6
6
  # ╚═══════════════════════════════════════════════════════════════════════════╝
7
- VERSION="2.1.1"
7
+ VERSION="2.1.2"
8
8
  set -euo pipefail
9
9
  trap 'echo "ERROR: $BASH_SOURCE:$LINENO exited with status $?" >&2' ERR
10
10