shipwright-cli 2.1.0 → 2.1.1

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 (98) 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 +1 -1
  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 +1 -1
  52. package/scripts/sw-memory.sh +1 -1
  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 +42 -7
  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 +1 -1
  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 +30 -2
  94. package/scripts/sw-webhook.sh +1 -1
  95. package/scripts/sw-widgets.sh +1 -1
  96. package/scripts/sw-worktree.sh +1 -1
  97. package/templates/pipelines/autonomous.json +2 -2
  98. package/tmux/tmux.conf +3 -0
@@ -11,7 +11,7 @@ unset CLAUDECODE 2>/dev/null || true
11
11
  # Ignore SIGHUP so tmux attach/detach doesn't kill long-running plan/design/review stages
12
12
  trap '' HUP
13
13
 
14
- VERSION="2.1.0"
14
+ VERSION="2.1.1"
15
15
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
16
16
  REPO_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
17
17
 
@@ -204,6 +204,7 @@ MODEL=""
204
204
  AGENTS=""
205
205
  PIPELINE_AGENT_ID="${PIPELINE_AGENT_ID:-pipeline-$$}"
206
206
  SKIP_GATES=false
207
+ HEADLESS=false
207
208
  GIT_BRANCH=""
208
209
  GITHUB_ISSUE=""
209
210
  TASK_TYPE=""
@@ -226,6 +227,7 @@ CLEANUP_WORKTREE=false
226
227
  ORIGINAL_REPO_DIR=""
227
228
  REPO_OVERRIDE=""
228
229
  _cleanup_done=""
230
+ PIPELINE_EXIT_CODE=1 # assume failure until run_pipeline succeeds
229
231
 
230
232
  # GitHub metadata (populated during intake)
231
233
  ISSUE_LABELS=""
@@ -273,6 +275,7 @@ show_help() {
273
275
  echo -e " ${DIM}--model <model>${RESET} Override AI model (opus, sonnet, haiku)"
274
276
  echo -e " ${DIM}--agents <n>${RESET} Override agent count"
275
277
  echo -e " ${DIM}--skip-gates${RESET} Auto-approve all gates (fully autonomous)"
278
+ echo -e " ${DIM}--headless${RESET} Full headless mode (skip gates, no prompts)"
276
279
  echo -e " ${DIM}--base <branch>${RESET} Base branch for PR (default: main)"
277
280
  echo -e " ${DIM}--reviewers \"a,b\"${RESET} Request PR reviewers (auto-detected if omitted)"
278
281
  echo -e " ${DIM}--labels \"a,b\"${RESET} Add labels to PR (inherited from issue if omitted)"
@@ -357,6 +360,7 @@ parse_args() {
357
360
  --model) MODEL="$2"; shift 2 ;;
358
361
  --agents) AGENTS="$2"; shift 2 ;;
359
362
  --skip-gates) SKIP_GATES=true; shift ;;
363
+ --headless) HEADLESS=true; SKIP_GATES=true; shift ;;
360
364
  --base) BASE_BRANCH="$2"; shift 2 ;;
361
365
  --reviewers) REVIEWERS="$2"; shift 2 ;;
362
366
  --labels) LABELS="$2"; shift 2 ;;
@@ -393,6 +397,20 @@ parse_args() {
393
397
  PIPELINE_NAME_ARG=""
394
398
  parse_args "$@"
395
399
 
400
+ # ─── Non-Interactive Detection ──────────────────────────────────────────────
401
+ # When stdin is not a terminal (background, pipe, nohup, tmux send-keys),
402
+ # auto-enable headless mode to prevent read prompts from killing the script.
403
+ if [[ ! -t 0 ]]; then
404
+ HEADLESS=true
405
+ if [[ "$SKIP_GATES" != "true" ]]; then
406
+ SKIP_GATES=true
407
+ fi
408
+ fi
409
+ # --worktree implies headless when stdin is not a terminal
410
+ if [[ "$AUTO_WORKTREE" == "true" && "$SKIP_GATES" != "true" && ! -t 0 ]]; then
411
+ SKIP_GATES=true
412
+ fi
413
+
396
414
  # ─── Directory Setup ────────────────────────────────────────────────────────
397
415
 
398
416
  setup_dirs() {
@@ -411,10 +429,11 @@ find_pipeline_config() {
411
429
  local name="$1"
412
430
  local locations=(
413
431
  "$REPO_DIR/templates/pipelines/${name}.json"
432
+ "${PROJECT_ROOT:-}/templates/pipelines/${name}.json"
414
433
  "$HOME/.shipwright/pipelines/${name}.json"
415
434
  )
416
435
  for loc in "${locations[@]}"; do
417
- if [[ -f "$loc" ]]; then
436
+ if [[ -n "$loc" && -f "$loc" ]]; then
418
437
  echo "$loc"
419
438
  return 0
420
439
  fi
@@ -7480,7 +7499,9 @@ run_pipeline() {
7480
7499
  if [[ "$build_gate" == "approve" && "$SKIP_GATES" != "true" ]]; then
7481
7500
  show_stage_preview "build"
7482
7501
  local answer=""
7483
- read -rp " Proceed with build+test (self-healing)? [Y/n] " answer
7502
+ if [[ -t 0 ]]; then
7503
+ read -rp " Proceed with build+test (self-healing)? [Y/n] " answer || true
7504
+ fi
7484
7505
  if [[ "$answer" =~ ^[Nn] ]]; then
7485
7506
  update_status "paused" "build"
7486
7507
  info "Pipeline paused. Resume with: ${DIM}shipwright pipeline resume${RESET}"
@@ -7518,7 +7539,12 @@ run_pipeline() {
7518
7539
  if [[ "$gate" == "approve" && "$SKIP_GATES" != "true" ]]; then
7519
7540
  show_stage_preview "$id"
7520
7541
  local answer=""
7521
- read -rp " Proceed with ${id}? [Y/n] " answer
7542
+ if [[ -t 0 ]]; then
7543
+ read -rp " Proceed with ${id}? [Y/n] " answer || true
7544
+ else
7545
+ # Non-interactive: auto-approve (shouldn't reach here if headless detection works)
7546
+ info "Non-interactive mode — auto-approving ${id}"
7547
+ fi
7522
7548
  if [[ "$answer" =~ ^[Nn] ]]; then
7523
7549
  update_status "paused" "$id"
7524
7550
  info "Pipeline paused at ${BOLD}$id${RESET}. Resume with: ${DIM}shipwright pipeline resume${RESET}"
@@ -7826,8 +7852,14 @@ pipeline_cleanup_worktree() {
7826
7852
 
7827
7853
  if [[ -n "${ORIGINAL_REPO_DIR:-}" && "$worktree_path" != "$ORIGINAL_REPO_DIR" ]]; then
7828
7854
  cd "$ORIGINAL_REPO_DIR" 2>/dev/null || cd /
7829
- info "Cleaning up worktree: ${DIM}${worktree_path}${RESET}"
7830
- git worktree remove --force "$worktree_path" 2>/dev/null || true
7855
+ # Only clean up worktree on success — preserve on failure for inspection
7856
+ if [[ "${PIPELINE_EXIT_CODE:-1}" -eq 0 ]]; then
7857
+ info "Cleaning up worktree: ${DIM}${worktree_path}${RESET}"
7858
+ git worktree remove --force "$worktree_path" 2>/dev/null || true
7859
+ else
7860
+ warn "Pipeline failed — worktree preserved for inspection: ${DIM}${worktree_path}${RESET}"
7861
+ warn "Clean up manually: ${DIM}git worktree remove --force ${worktree_path}${RESET}"
7862
+ fi
7831
7863
  fi
7832
7864
  }
7833
7865
 
@@ -8110,7 +8142,9 @@ pipeline_start() {
8110
8142
 
8111
8143
  local gate_count
8112
8144
  gate_count=$(jq '[.stages[] | select(.gate == "approve" and .enabled == true)] | length' "$PIPELINE_CONFIG")
8113
- if [[ "$SKIP_GATES" == "true" ]]; then
8145
+ if [[ "$HEADLESS" == "true" ]]; then
8146
+ echo -e " ${BOLD}Gates:${RESET} ${YELLOW}all auto (headless — non-interactive stdin detected)${RESET}"
8147
+ elif [[ "$SKIP_GATES" == "true" ]]; then
8114
8148
  echo -e " ${BOLD}Gates:${RESET} ${YELLOW}all auto (--skip-gates)${RESET}"
8115
8149
  else
8116
8150
  echo -e " ${BOLD}Gates:${RESET} ${gate_count} approval gate(s)"
@@ -8162,6 +8196,7 @@ pipeline_start() {
8162
8196
 
8163
8197
  run_pipeline
8164
8198
  local exit_code=$?
8199
+ PIPELINE_EXIT_CODE="$exit_code"
8165
8200
 
8166
8201
  # Send completion notification + event
8167
8202
  local total_dur_s=""
package/scripts/sw-pm.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.0"
9
+ VERSION="2.1.1"
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.0"
9
+ VERSION="2.1.1"
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.0"
9
+ VERSION="2.1.1"
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.0"
9
+ VERSION="2.1.1"
10
10
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
11
11
 
12
12
  # ─── Handle subcommands ───────────────────────────────────────────────────────
package/scripts/sw-ps.sh CHANGED
@@ -5,7 +5,7 @@
5
5
  # ║ Displays a table of agents running in claude-* tmux windows with ║
6
6
  # ║ PID, status, idle time, and pane references. ║
7
7
  # ╚═══════════════════════════════════════════════════════════════════════════╝
8
- VERSION="2.1.0"
8
+ VERSION="2.1.1"
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.0"
9
+ VERSION="2.1.1"
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.0"
9
+ VERSION="2.1.1"
10
10
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
11
11
  REPO_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
12
12
 
@@ -11,7 +11,7 @@
11
11
  # ║ shipwright reaper --watch Continuous loop (default: 5s) ║
12
12
  # ║ shipwright reaper --dry-run Preview what would be reaped ║
13
13
  # ╚═══════════════════════════════════════════════════════════════════════════╝
14
- VERSION="2.1.0"
14
+ VERSION="2.1.1"
15
15
  set -euo pipefail
16
16
  trap 'echo "ERROR: $BASH_SOURCE:$LINENO exited with status $?" >&2' ERR
17
17
 
@@ -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.0"
9
+ VERSION="2.1.1"
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.0"
9
+ VERSION="2.1.1"
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.0"
9
+ VERSION="2.1.1"
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.0"
9
+ VERSION="2.1.1"
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.0"
9
+ VERSION="2.1.1"
10
10
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
11
11
  EVENTS_FILE="${HOME}/.shipwright/events.jsonl"
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.0"
9
+ VERSION="2.1.1"
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.0"
9
+ VERSION="2.1.1"
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.0"
9
+ VERSION="2.1.1"
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.0"
9
+ VERSION="2.1.1"
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
  # ║ Supports --template to scaffold from a team template and --terminal ║
9
9
  # ║ to select a terminal adapter (tmux, iterm2, wezterm). ║
10
10
  # ╚═══════════════════════════════════════════════════════════════════════════╝
11
- VERSION="2.1.0"
11
+ VERSION="2.1.1"
12
12
  set -euo pipefail
13
13
  trap 'echo "ERROR: $BASH_SOURCE:$LINENO exited with status $?" >&2' ERR
14
14
 
@@ -10,7 +10,7 @@
10
10
  set -euo pipefail
11
11
  trap 'echo "ERROR: $BASH_SOURCE:$LINENO exited with status $?" >&2' ERR
12
12
 
13
- VERSION="2.1.0"
13
+ VERSION="2.1.1"
14
14
 
15
15
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
16
16
  REPO_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
@@ -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.0"
9
+ VERSION="2.1.1"
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
  # ║ Shows running teams, agent windows, and task progress. ║
6
6
  # ╚═══════════════════════════════════════════════════════════════════════════╝
7
- VERSION="2.1.0"
7
+ VERSION="2.1.1"
8
8
  set -euo pipefail
9
9
  trap 'echo "ERROR: $BASH_SOURCE:$LINENO exited with status $?" >&2' ERR
10
10
 
@@ -7,7 +7,7 @@
7
7
  # When sourced, do NOT add set -euo pipefail — the parent handles that.
8
8
  # When run directly, main() sets up the error handling.
9
9
 
10
- VERSION="2.1.0"
10
+ VERSION="2.1.1"
11
11
 
12
12
  # ─── Colors (matches Seth's tmux theme) ─────────────────────────────────────
13
13
  CYAN='\033[38;2;0;212;255m'
@@ -5,7 +5,7 @@
5
5
  # ║ Streams tmux pane output in real-time to the dashboard or CLI. ║
6
6
  # ║ Captures output periodically, tags by agent/team, supports replay. ║
7
7
  # ╚═══════════════════════════════════════════════════════════════════════════╝
8
- VERSION="2.1.0"
8
+ VERSION="2.1.1"
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.0"
9
+ VERSION="2.1.1"
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.0"
9
+ VERSION="2.1.1"
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
  # ║ Templates define reusable agent team configurations (roles, layout, ║
6
6
  # ║ focus areas) that shipwright session --template can use to scaffold teams. ║
7
7
  # ╚═══════════════════════════════════════════════════════════════════════════╝
8
- VERSION="2.1.0"
8
+ VERSION="2.1.1"
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.0"
9
+ VERSION="2.1.1"
10
10
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
11
11
 
12
12
  # ─── Handle subcommands ───────────────────────────────────────────────────────
@@ -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.0"
9
+ VERSION="2.1.1"
10
10
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
11
11
  REPO_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
12
12
 
@@ -11,7 +11,7 @@
11
11
  # ║ shipwright tmux fix — Auto-fix common issues ║
12
12
  # ║ shipwright tmux reload — Reload tmux config ║
13
13
  # ╚═══════════════════════════════════════════════════════════════════════════╝
14
- VERSION="2.1.0"
14
+ VERSION="2.1.1"
15
15
  set -euo pipefail
16
16
  trap 'echo "ERROR: $BASH_SOURCE:$LINENO exited with status $?" >&2' ERR
17
17
 
@@ -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.0"
9
+ VERSION="2.1.1"
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.0"
9
+ VERSION="2.1.1"
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.0"
9
+ VERSION="2.1.1"
10
10
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
11
11
  REPO_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
12
12
 
@@ -2,7 +2,7 @@
2
2
  # ╔═══════════════════════════════════════════════════════════════════════════╗
3
3
  # ║ sw upgrade — Detect and apply updates from the repo ║
4
4
  # ╚═══════════════════════════════════════════════════════════════════════════╝
5
- VERSION="2.1.0"
5
+ VERSION="2.1.1"
6
6
  set -euo pipefail
7
7
  trap 'echo "ERROR: $BASH_SOURCE:$LINENO exited with status $?" >&2' ERR
8
8
 
package/scripts/sw-ux.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.0"
9
+ VERSION="2.1.1"
10
10
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
11
11
 
12
12
  # ─── Colors (matches Seth's tmux theme) ─────────────────────────────────────
@@ -58,7 +58,7 @@ UX_CONFIG_REPO="./.claude/ux-config.json"
58
58
 
59
59
  # Detect accessibility modes
60
60
  should_disable_colors() {
61
- [[ -n "${NO_COLOR:-}" ]] || [[ -n "${CLICOLOR_FORCE:-}" && "$CLICOLOR_FORCE" == "0" ]]
61
+ [[ -n "${NO_COLOR:-}" ]] || [[ "${FORCE_COLOR:-}" == "0" ]] || [[ -n "${CLICOLOR_FORCE:-}" && "$CLICOLOR_FORCE" == "0" ]]
62
62
  }
63
63
 
64
64
  has_reduced_motion() {
@@ -408,11 +408,36 @@ set_reduced_motion() {
408
408
  enable_screen_reader_mode() {
409
409
  # Disable colors and animations for screen reader compatibility
410
410
  export NO_COLOR=1
411
+ export FORCE_COLOR=0
411
412
  export PREFERS_REDUCED_MOTION=1
413
+
414
+ # Propagate to tmux global environment so new panes inherit
415
+ if [[ -n "${TMUX:-}" ]]; then
416
+ tmux set-environment -g NO_COLOR 1
417
+ tmux set-environment -g FORCE_COLOR 0
418
+ tmux set-environment -g PREFERS_REDUCED_MOTION 1
419
+ fi
420
+
412
421
  success "Screen reader mode enabled (colors and animations disabled)"
413
422
  emit_event "ux_accessibility" "feature=screen_reader"
414
423
  }
415
424
 
425
+ disable_screen_reader_mode() {
426
+ unset NO_COLOR
427
+ unset FORCE_COLOR
428
+ unset PREFERS_REDUCED_MOTION
429
+
430
+ # Remove from tmux global environment
431
+ if [[ -n "${TMUX:-}" ]]; then
432
+ tmux set-environment -g -u NO_COLOR 2>/dev/null || true
433
+ tmux set-environment -g -u FORCE_COLOR 2>/dev/null || true
434
+ tmux set-environment -g -u PREFERS_REDUCED_MOTION 2>/dev/null || true
435
+ fi
436
+
437
+ success "Screen reader mode disabled (colors and animations restored)"
438
+ emit_event "ux_accessibility" "feature=screen_reader_disabled"
439
+ }
440
+
416
441
  # ─── Formatting Helpers ───────────────────────────────────────────────────
417
442
  format_diff_line() {
418
443
  local line="$1"
@@ -648,6 +673,9 @@ main() {
648
673
  --screen-reader)
649
674
  enable_screen_reader_mode
650
675
  ;;
676
+ --no-screen-reader)
677
+ disable_screen_reader_mode
678
+ ;;
651
679
  *)
652
680
  error "Unknown accessibility option: $1"
653
681
  exit 1
@@ -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.0"
9
+ VERSION="2.1.1"
10
10
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
11
11
 
12
12
  # ─── Colors (matches Seth's tmux theme) ─────────────────────────────────────
@@ -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.0"
11
+ VERSION="2.1.1"
12
12
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
13
13
  REPO_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
14
14
 
@@ -5,7 +5,7 @@
5
5
  # ║ Each agent gets its own worktree so parallel agents don't clobber ║
6
6
  # ║ each other's files. Worktrees live in .worktrees/ relative to root. ║
7
7
  # ╚═══════════════════════════════════════════════════════════════════════════╝
8
- VERSION="2.1.0"
8
+ VERSION="2.1.1"
9
9
  set -euo pipefail
10
10
  trap 'echo "ERROR: $BASH_SOURCE:$LINENO exited with status $?" >&2' ERR
11
11
 
@@ -66,8 +66,8 @@
66
66
  "merge_method": "squash",
67
67
  "wait_ci_timeout_s": 600,
68
68
  "auto_delete_branch": true,
69
- "auto_merge": false,
70
- "auto_approve": false
69
+ "auto_merge": true,
70
+ "auto_approve": true
71
71
  }
72
72
  },
73
73
  {
package/tmux/tmux.conf CHANGED
@@ -39,6 +39,9 @@ set -as terminal-features 'xterm*:extkeys'
39
39
  # Signal true color support to apps inside tmux.
40
40
  # Without this, Claude Code falls back to 256-color ANSI palette (washed-out).
41
41
  set-environment -g COLORTERM truecolor
42
+ # Ensure TERM is correct in the global environment.
43
+ # Prevents inherited TERM=dumb (from launchers/IDEs) from disabling colors.
44
+ set-environment -g TERM tmux-256color
42
45
 
43
46
  # ─── Mouse ──────────────────────────────────────────────────────────────
44
47
  set -g mouse on