shipwright-cli 2.0.0 → 2.1.0

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 (113) hide show
  1. package/README.md +160 -72
  2. package/completions/_shipwright +59 -7
  3. package/completions/shipwright.bash +24 -4
  4. package/completions/shipwright.fish +80 -2
  5. package/dashboard/server.ts +208 -0
  6. package/docs/tmux-research/TMUX-ARCHITECTURE.md +567 -0
  7. package/docs/tmux-research/TMUX-AUDIT.md +925 -0
  8. package/docs/tmux-research/TMUX-BEST-PRACTICES-2025-2026.md +829 -0
  9. package/docs/tmux-research/TMUX-QUICK-REFERENCE.md +543 -0
  10. package/docs/tmux-research/TMUX-RESEARCH-INDEX.md +438 -0
  11. package/package.json +2 -2
  12. package/scripts/lib/helpers.sh +7 -0
  13. package/scripts/sw +116 -2
  14. package/scripts/sw-activity.sh +1 -1
  15. package/scripts/sw-adaptive.sh +1 -1
  16. package/scripts/sw-adversarial.sh +1 -1
  17. package/scripts/sw-architecture-enforcer.sh +1 -1
  18. package/scripts/sw-auth.sh +1 -1
  19. package/scripts/sw-autonomous.sh +128 -38
  20. package/scripts/sw-changelog.sh +1 -1
  21. package/scripts/sw-checkpoint.sh +1 -1
  22. package/scripts/sw-ci.sh +1 -1
  23. package/scripts/sw-cleanup.sh +1 -1
  24. package/scripts/sw-code-review.sh +62 -1
  25. package/scripts/sw-connect.sh +1 -1
  26. package/scripts/sw-context.sh +1 -1
  27. package/scripts/sw-cost.sh +44 -3
  28. package/scripts/sw-daemon.sh +155 -27
  29. package/scripts/sw-dashboard.sh +1 -1
  30. package/scripts/sw-db.sh +958 -118
  31. package/scripts/sw-decompose.sh +1 -1
  32. package/scripts/sw-deps.sh +1 -1
  33. package/scripts/sw-developer-simulation.sh +1 -1
  34. package/scripts/sw-discovery.sh +1 -1
  35. package/scripts/sw-docs-agent.sh +1 -1
  36. package/scripts/sw-docs.sh +1 -1
  37. package/scripts/sw-doctor.sh +49 -1
  38. package/scripts/sw-dora.sh +1 -1
  39. package/scripts/sw-durable.sh +1 -1
  40. package/scripts/sw-e2e-orchestrator.sh +1 -1
  41. package/scripts/sw-eventbus.sh +1 -1
  42. package/scripts/sw-feedback.sh +23 -15
  43. package/scripts/sw-fix.sh +1 -1
  44. package/scripts/sw-fleet-discover.sh +1 -1
  45. package/scripts/sw-fleet-viz.sh +1 -1
  46. package/scripts/sw-fleet.sh +1 -1
  47. package/scripts/sw-github-app.sh +1 -1
  48. package/scripts/sw-github-checks.sh +4 -4
  49. package/scripts/sw-github-deploy.sh +1 -1
  50. package/scripts/sw-github-graphql.sh +1 -1
  51. package/scripts/sw-guild.sh +1 -1
  52. package/scripts/sw-heartbeat.sh +1 -1
  53. package/scripts/sw-hygiene.sh +1 -1
  54. package/scripts/sw-incident.sh +45 -6
  55. package/scripts/sw-init.sh +150 -24
  56. package/scripts/sw-instrument.sh +1 -1
  57. package/scripts/sw-intelligence.sh +1 -1
  58. package/scripts/sw-jira.sh +1 -1
  59. package/scripts/sw-launchd.sh +1 -1
  60. package/scripts/sw-linear.sh +1 -1
  61. package/scripts/sw-logs.sh +1 -1
  62. package/scripts/sw-loop.sh +204 -19
  63. package/scripts/sw-memory.sh +18 -1
  64. package/scripts/sw-mission-control.sh +1 -1
  65. package/scripts/sw-model-router.sh +1 -1
  66. package/scripts/sw-otel.sh +1 -1
  67. package/scripts/sw-oversight.sh +76 -1
  68. package/scripts/sw-pipeline-composer.sh +1 -1
  69. package/scripts/sw-pipeline-vitals.sh +1 -1
  70. package/scripts/sw-pipeline.sh +261 -12
  71. package/scripts/sw-pm.sh +70 -5
  72. package/scripts/sw-pr-lifecycle.sh +1 -1
  73. package/scripts/sw-predictive.sh +8 -1
  74. package/scripts/sw-prep.sh +1 -1
  75. package/scripts/sw-ps.sh +1 -1
  76. package/scripts/sw-public-dashboard.sh +1 -1
  77. package/scripts/sw-quality.sh +1 -1
  78. package/scripts/sw-reaper.sh +1 -1
  79. package/scripts/sw-recruit.sh +1853 -178
  80. package/scripts/sw-regression.sh +1 -1
  81. package/scripts/sw-release-manager.sh +1 -1
  82. package/scripts/sw-release.sh +1 -1
  83. package/scripts/sw-remote.sh +1 -1
  84. package/scripts/sw-replay.sh +1 -1
  85. package/scripts/sw-retro.sh +1 -1
  86. package/scripts/sw-scale.sh +1 -1
  87. package/scripts/sw-security-audit.sh +1 -1
  88. package/scripts/sw-self-optimize.sh +1 -1
  89. package/scripts/sw-session.sh +1 -1
  90. package/scripts/sw-setup.sh +263 -127
  91. package/scripts/sw-standup.sh +1 -1
  92. package/scripts/sw-status.sh +44 -2
  93. package/scripts/sw-strategic.sh +189 -41
  94. package/scripts/sw-stream.sh +1 -1
  95. package/scripts/sw-swarm.sh +42 -5
  96. package/scripts/sw-team-stages.sh +1 -1
  97. package/scripts/sw-templates.sh +4 -4
  98. package/scripts/sw-testgen.sh +66 -15
  99. package/scripts/sw-tmux-pipeline.sh +1 -1
  100. package/scripts/sw-tmux-role-color.sh +58 -0
  101. package/scripts/sw-tmux-status.sh +128 -0
  102. package/scripts/sw-tmux.sh +1 -1
  103. package/scripts/sw-trace.sh +1 -1
  104. package/scripts/sw-tracker.sh +1 -1
  105. package/scripts/sw-triage.sh +61 -37
  106. package/scripts/sw-upgrade.sh +1 -1
  107. package/scripts/sw-ux.sh +1 -1
  108. package/scripts/sw-webhook.sh +1 -1
  109. package/scripts/sw-widgets.sh +1 -1
  110. package/scripts/sw-worktree.sh +1 -1
  111. package/templates/pipelines/autonomous.json +2 -2
  112. package/tmux/shipwright-overlay.conf +35 -17
  113. package/tmux/tmux.conf +23 -21
@@ -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.0.0"
9
+ VERSION="2.1.0"
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.0.0"
9
+ VERSION="2.1.0"
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.0.0"
9
+ VERSION="2.1.0"
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.0.0"
9
+ VERSION="2.1.0"
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.0.0"
9
+ VERSION="2.1.0"
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.0.0"
9
+ VERSION="2.1.0"
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.0.0"
9
+ VERSION="2.1.0"
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.0.0"
9
+ VERSION="2.1.0"
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.0.0"
9
+ VERSION="2.1.0"
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.0.0"
11
+ VERSION="2.1.0"
12
12
  set -euo pipefail
13
13
  trap 'echo "ERROR: $BASH_SOURCE:$LINENO exited with status $?" >&2' ERR
14
14
 
@@ -1,17 +1,19 @@
1
1
  #!/usr/bin/env bash
2
2
  # ╔═══════════════════════════════════════════════════════════════════════════╗
3
- # ║ shipwright setup — One-shot setup: check prerequisites, init, doctor
3
+ # ║ shipwright setup — Comprehensive onboarding wizard
4
4
  # ║ ║
5
- # ║ Guides new users from zero to running: checks tools, installs configs,
6
- # ║ injects the tmux overlay, validates everything, and prints a quick
7
- # ║ start guide.
5
+ # ║ Phase 1: Prerequisites Check validate required tools
6
+ # ║ Phase 2: Repo Analysis detect language, tests, build
7
+ # ║ Phase 3: Configuration Generation — create .claude/ configs
8
+ # ║ Phase 4: Validation — run doctor & show quick start ║
8
9
  # ╚═══════════════════════════════════════════════════════════════════════════╝
9
10
  set -euo pipefail
10
11
  trap 'echo "ERROR: $BASH_SOURCE:$LINENO exited with status $?" >&2' ERR
11
12
 
12
- VERSION="2.0.0"
13
+ VERSION="2.1.0"
13
14
 
14
15
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
16
+ REPO_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
15
17
 
16
18
  # ─── Colors ──────────────────────────────────────────────────────────────────
17
19
  CYAN='\033[38;2;0;212;255m'
@@ -26,6 +28,7 @@ RESET='\033[0m'
26
28
  # ─── Cross-platform compatibility ──────────────────────────────────────────
27
29
  # shellcheck source=lib/compat.sh
28
30
  [[ -f "$SCRIPT_DIR/lib/compat.sh" ]] && source "$SCRIPT_DIR/lib/compat.sh"
31
+
29
32
  # ─── Helpers ─────────────────────────────────────────────────────────────────
30
33
  info() { echo -e "${CYAN}${BOLD}▸${RESET} $*"; }
31
34
  success() { echo -e "${GREEN}${BOLD}✓${RESET} $*"; }
@@ -40,20 +43,52 @@ check_pass() { success "$*"; PASS=$((PASS + 1)); }
40
43
  check_warn() { warn "$*"; WARN=$((WARN + 1)); }
41
44
  check_fail() { error "$*"; FAIL=$((FAIL + 1)); }
42
45
 
46
+ # Detect OS for install instructions
47
+ detect_os() {
48
+ if [[ "$(uname)" == "Darwin" ]]; then
49
+ echo "macOS"
50
+ else
51
+ echo "Linux"
52
+ fi
53
+ }
54
+
55
+ get_install_cmd() {
56
+ local os="$1"
57
+ local pkg="$2"
58
+ if [[ "$os" == "macOS" ]]; then
59
+ echo "brew install $pkg"
60
+ else
61
+ echo "sudo apt install $pkg"
62
+ fi
63
+ }
64
+
43
65
  # ─── Flag parsing ────────────────────────────────────────────────────────────
66
+ SKIP_DAEMON_PROMPT=false
44
67
  for arg in "$@"; do
45
68
  case "$arg" in
46
69
  --help|-h)
47
- echo "Usage: shipwright setup"
70
+ echo "Usage: shipwright setup [--skip-daemon-prompt]"
71
+ echo ""
72
+ echo "Comprehensive onboarding wizard with four phases:"
73
+ echo ""
74
+ echo " Phase 1: Check prerequisites (tmux, bash, jq, gh, claude)"
75
+ echo " Phase 2: Analyze repo (language, framework, tests, build)"
76
+ echo " Phase 3: Generate .claude/ configuration"
77
+ echo " Phase 4: Validate setup and show quick start guide"
48
78
  echo ""
49
- echo "One-shot guided setup: checks prerequisites, runs init,"
50
- echo "injects the tmux overlay, validates with doctor, and prints"
51
- echo "a quick-start guide."
79
+ echo "Options:"
80
+ echo " --skip-daemon-prompt Don't ask about daemon auto-processing"
52
81
  exit 0
53
82
  ;;
83
+ --skip-daemon-prompt)
84
+ SKIP_DAEMON_PROMPT=true
85
+ ;;
54
86
  esac
55
87
  done
56
88
 
89
+ # Detect OS once at startup
90
+ OS="$(detect_os)"
91
+
57
92
  # ═════════════════════════════════════════════════════════════════════════════
58
93
  # Welcome Banner
59
94
  # ═════════════════════════════════════════════════════════════════════════════
@@ -65,170 +100,271 @@ echo -e "${CYAN}${BOLD} ╚═════════════════
65
100
  echo ""
66
101
 
67
102
  # ═════════════════════════════════════════════════════════════════════════════
68
- # 1. Check Prerequisites
103
+ # PHASE 1: Prerequisites Check
69
104
  # ═════════════════════════════════════════════════════════════════════════════
70
- echo -e "${PURPLE}${BOLD} PREREQUISITES${RESET}"
105
+ echo -e "${PURPLE}${BOLD} PHASE 1: PREREQUISITES${RESET}"
71
106
  echo -e "${DIM} ──────────────────────────────────────────${RESET}"
107
+ echo ""
72
108
 
73
- # Detect OS for install instructions
74
- if [[ "$(uname)" == "Darwin" ]]; then
75
- PKG_MGR="brew install"
76
- else
77
- PKG_MGR="sudo apt install"
78
- fi
109
+ # Required tools
110
+ REQUIRED_TOOLS=("tmux" "bash" "git" "jq" "gh" "claude")
111
+ OPTIONAL_TOOLS=("bun")
79
112
 
80
- # tmux (>= 3.2)
81
- if command -v tmux &>/dev/null; then
82
- TMUX_VERSION="$(tmux -V | grep -oE '[0-9]+\.[0-9a-z]+')"
83
- TMUX_MAJOR="$(echo "$TMUX_VERSION" | cut -d. -f1)"
84
- TMUX_MINOR="$(echo "$TMUX_VERSION" | cut -d. -f2 | tr -dc '0-9')"
85
- if [[ "$TMUX_MAJOR" -ge 4 ]] || [[ "$TMUX_MAJOR" -ge 3 && "$TMUX_MINOR" -ge 2 ]]; then
86
- check_pass "tmux ${TMUX_VERSION}"
87
- else
88
- check_warn "tmux ${TMUX_VERSION} 3.2+ required for pane-border-format"
89
- echo -e " ${DIM}${PKG_MGR} tmux${RESET}"
90
- fi
91
- else
92
- check_fail "tmux not installed"
93
- echo -e " ${DIM}${PKG_MGR} tmux${RESET}"
94
- fi
113
+ # Check required tools
114
+ for tool in "${REQUIRED_TOOLS[@]}"; do
115
+ case "$tool" in
116
+ tmux)
117
+ if command -v tmux &>/dev/null; then
118
+ TMUX_VERSION="$(tmux -V | grep -oE '[0-9]+\.[0-9a-z]+')"
119
+ TMUX_MAJOR="$(echo "$TMUX_VERSION" | cut -d. -f1)"
120
+ TMUX_MINOR="$(echo "$TMUX_VERSION" | cut -d. -f2 | tr -dc '0-9')"
121
+ if [[ "$TMUX_MAJOR" -ge 4 ]] || [[ "$TMUX_MAJOR" -ge 3 && "$TMUX_MINOR" -ge 2 ]]; then
122
+ check_pass "tmux ${TMUX_VERSION}"
123
+ else
124
+ check_warn "tmux ${TMUX_VERSION} — 3.2+ required"
125
+ echo -e " ${DIM}$(get_install_cmd "$OS" tmux)${RESET}"
126
+ fi
127
+ else
128
+ check_fail "tmux not installed"
129
+ echo -e " ${DIM}$(get_install_cmd "$OS" tmux)${RESET}"
130
+ fi
131
+ ;;
132
+ bash)
133
+ BASH_MAJOR="${BASH_VERSINFO[0]:-0}"
134
+ if [[ "$BASH_MAJOR" -ge 3 ]]; then
135
+ check_pass "bash $BASH_VERSION"
136
+ else
137
+ check_fail "bash $BASH_VERSION — 3.2+ required"
138
+ echo -e " ${DIM}$(get_install_cmd "$OS" bash)${RESET}"
139
+ fi
140
+ ;;
141
+ git)
142
+ if command -v git &>/dev/null; then
143
+ check_pass "git $(git --version | awk '{print $3}')"
144
+ else
145
+ check_fail "git not installed"
146
+ echo -e " ${DIM}$(get_install_cmd "$OS" git)${RESET}"
147
+ fi
148
+ ;;
149
+ jq)
150
+ if command -v jq &>/dev/null; then
151
+ check_pass "jq $(jq --version 2>&1 | tr -d 'jq-')"
152
+ else
153
+ check_fail "jq not installed"
154
+ echo -e " ${DIM}$(get_install_cmd "$OS" jq)${RESET}"
155
+ fi
156
+ ;;
157
+ gh)
158
+ if command -v gh &>/dev/null; then
159
+ if gh auth status &>/dev/null 2>&1; then
160
+ GH_USER="$(gh api user -q .login 2>/dev/null || echo "authenticated")"
161
+ check_pass "GitHub CLI: ${GH_USER}"
162
+ else
163
+ check_warn "GitHub CLI installed but not authenticated"
164
+ echo -e " ${DIM}gh auth login${RESET}"
165
+ fi
166
+ else
167
+ check_warn "GitHub CLI (gh) not installed"
168
+ echo -e " ${DIM}$(get_install_cmd "$OS" gh)${RESET}"
169
+ fi
170
+ ;;
171
+ claude)
172
+ if command -v claude &>/dev/null; then
173
+ check_pass "Claude Code CLI"
174
+ else
175
+ check_fail "Claude Code CLI not found"
176
+ echo -e " ${DIM}npm install -g @anthropic-ai/claude-code${RESET}"
177
+ fi
178
+ ;;
179
+ esac
180
+ done
95
181
 
96
- # jq
97
- if command -v jq &>/dev/null; then
98
- check_pass "jq $(jq --version 2>&1 | tr -d 'jq-')"
99
- else
100
- check_fail "jq not installed — required for template parsing"
101
- echo -e " ${DIM}${PKG_MGR} jq${RESET}"
182
+ echo ""
183
+
184
+ # Check optional tools
185
+ for tool in "${OPTIONAL_TOOLS[@]}"; do
186
+ case "$tool" in
187
+ bun)
188
+ if command -v bun &>/dev/null; then
189
+ check_pass "Bun (dashboard server)"
190
+ else
191
+ check_warn "Bun not installed (optional — for dashboard)"
192
+ echo -e " ${DIM}curl -fsSL https://bun.sh/install | bash${RESET}"
193
+ fi
194
+ ;;
195
+ esac
196
+ done
197
+
198
+ echo ""
199
+
200
+ # Bail early if critical prereqs are missing
201
+ if [[ $FAIL -gt 0 ]]; then
202
+ echo -e " Summary: ${GREEN}${BOLD}${PASS}${RESET} passed ${YELLOW}${BOLD}${WARN}${RESET} warnings ${RED}${BOLD}${FAIL}${RESET} failed"
203
+ echo ""
204
+ error "Fix the failed prerequisites above before continuing."
205
+ echo -e " ${DIM}Re-run: shipwright setup${RESET}"
206
+ exit 1
102
207
  fi
103
208
 
104
- # Node.js (>= 20)
105
- if command -v node &>/dev/null; then
106
- NODE_VERSION="$(node -v | tr -d 'v')"
107
- NODE_MAJOR="$(echo "$NODE_VERSION" | cut -d. -f1)"
108
- if [[ "$NODE_MAJOR" -ge 20 ]]; then
109
- check_pass "Node.js ${NODE_VERSION}"
209
+ echo -e " Summary: ${GREEN}${BOLD}${PASS}${RESET} passed ${YELLOW}${BOLD}${WARN}${RESET} warnings ${RED}${BOLD}${FAIL}${RESET} failed"
210
+ echo ""
211
+
212
+ # ═════════════════════════════════════════════════════════════════════════════
213
+ # PHASE 2: Repo Analysis
214
+ # ═════════════════════════════════════════════════════════════════════════════
215
+ echo -e "${PURPLE}${BOLD} PHASE 2: REPO ANALYSIS${RESET}"
216
+ echo -e "${DIM} ──────────────────────────────────────────${RESET}"
217
+ echo ""
218
+
219
+ DETECTED_LANGUAGE=""
220
+ DETECTED_FRAMEWORK=""
221
+ DETECTED_TEST_CMD=""
222
+ DETECTED_BUILD_CMD=""
223
+
224
+ # Detect language and framework
225
+ if [[ -f "package.json" ]]; then
226
+ DETECTED_LANGUAGE="Node.js"
227
+ if grep -q '"next"' package.json 2>/dev/null; then
228
+ DETECTED_FRAMEWORK="Next.js"
229
+ elif grep -q '"react"' package.json 2>/dev/null; then
230
+ DETECTED_FRAMEWORK="React"
231
+ elif grep -q '"express"' package.json 2>/dev/null; then
232
+ DETECTED_FRAMEWORK="Express.js"
233
+ elif grep -q '"vue"' package.json 2>/dev/null; then
234
+ DETECTED_FRAMEWORK="Vue.js"
110
235
  else
111
- check_warn "Node.js ${NODE_VERSION} — 20+ required"
112
- echo -e " ${DIM}${PKG_MGR} node${RESET}"
236
+ DETECTED_FRAMEWORK="Node.js (generic)"
113
237
  fi
114
- else
115
- check_fail "Node.js not found"
116
- echo -e " ${DIM}${PKG_MGR} node${RESET}"
117
- fi
118
238
 
119
- # Claude Code CLI
120
- if command -v claude &>/dev/null; then
121
- check_pass "Claude Code CLI"
122
- else
123
- check_fail "Claude Code CLI not found"
124
- echo -e " ${DIM}npm install -g @anthropic-ai/claude-code${RESET}"
125
- fi
239
+ # Detect test command
240
+ if grep -q '"jest"' package.json 2>/dev/null; then
241
+ DETECTED_TEST_CMD="npm test"
242
+ elif grep -q '"mocha"' package.json 2>/dev/null; then
243
+ DETECTED_TEST_CMD="npm test"
244
+ elif grep -q '"vitest"' package.json 2>/dev/null; then
245
+ DETECTED_TEST_CMD="npm run test"
246
+ fi
126
247
 
127
- # GitHub CLI + auth
128
- if command -v gh &>/dev/null; then
129
- if gh auth status &>/dev/null; then
130
- GH_USER="$(gh api user -q .login 2>/dev/null || echo "authenticated")"
131
- check_pass "GitHub CLI: ${GH_USER}"
132
- else
133
- check_warn "GitHub CLI installed but not authenticated"
134
- echo -e " ${DIM}gh auth login${RESET}"
248
+ # Detect build command
249
+ if [[ -n "$(grep -o '"build":' package.json 2>/dev/null || true)" ]]; then
250
+ DETECTED_BUILD_CMD="npm run build"
135
251
  fi
136
- else
137
- check_warn "GitHub CLI (gh) not installed — needed for daemon/pipeline"
138
- echo -e " ${DIM}${PKG_MGR} gh${RESET}"
252
+ elif [[ -f "Cargo.toml" ]]; then
253
+ DETECTED_LANGUAGE="Rust"
254
+ DETECTED_FRAMEWORK="Cargo"
255
+ DETECTED_TEST_CMD="cargo test"
256
+ DETECTED_BUILD_CMD="cargo build"
257
+ elif [[ -f "go.mod" ]]; then
258
+ DETECTED_LANGUAGE="Go"
259
+ DETECTED_FRAMEWORK="Go"
260
+ DETECTED_TEST_CMD="go test ./..."
261
+ DETECTED_BUILD_CMD="go build"
262
+ elif [[ -f "pyproject.toml" ]] || [[ -f "setup.py" ]]; then
263
+ DETECTED_LANGUAGE="Python"
264
+ DETECTED_FRAMEWORK="Python"
265
+ if [[ -f "pyproject.toml" ]] && grep -q 'pytest' pyproject.toml 2>/dev/null; then
266
+ DETECTED_TEST_CMD="pytest"
267
+ elif [[ -f "setup.py" ]]; then
268
+ DETECTED_TEST_CMD="python -m pytest"
269
+ fi
270
+ DETECTED_BUILD_CMD="python setup.py build"
139
271
  fi
140
272
 
141
- # Bash (>= 4)
142
- BASH_MAJOR="${BASH_VERSINFO[0]:-0}"
143
- if [[ "$BASH_MAJOR" -ge 4 ]]; then
144
- check_pass "bash ${BASH_VERSION}"
273
+ # Display detected info
274
+ if [[ -n "$DETECTED_LANGUAGE" ]]; then
275
+ info "Detected ${BOLD}${DETECTED_LANGUAGE}${RESET} project"
276
+ [[ -n "$DETECTED_FRAMEWORK" ]] && echo -e " ${DIM}Framework: ${DETECTED_FRAMEWORK}${RESET}"
277
+ [[ -n "$DETECTED_TEST_CMD" ]] && echo -e " ${DIM}Test: ${DETECTED_TEST_CMD}${RESET}"
278
+ [[ -n "$DETECTED_BUILD_CMD" ]] && echo -e " ${DIM}Build: ${DETECTED_BUILD_CMD}${RESET}"
145
279
  else
146
- check_warn "bash ${BASH_VERSION} 4.0+ required for associative arrays"
147
- echo -e " ${DIM}brew install bash (macOS ships 3.2)${RESET}"
280
+ info "Could not auto-detect language (no package.json, Cargo.toml, go.mod, pyproject.toml, or setup.py found)"
148
281
  fi
149
282
 
150
- echo ""
151
-
152
- # Bail early if critical prereqs are missing
153
- if [[ $FAIL -gt 0 ]]; then
154
- echo -e " ${GREEN}${BOLD}${PASS}${RESET} passed ${YELLOW}${BOLD}${WARN}${RESET} warnings ${RED}${BOLD}${FAIL}${RESET} failed"
155
- echo ""
156
- error "Fix the failed prerequisites above before continuing."
157
- echo -e " ${DIM}Re-run: shipwright setup${RESET}"
158
- exit 1
283
+ # Check for .claude directory
284
+ if [[ -d ".claude" ]]; then
285
+ info "Found existing .claude/ directory will preserve and enhance"
286
+ else
287
+ info "Will create .claude/ directory with agent configuration"
159
288
  fi
160
289
 
161
- echo -e " ${GREEN}${BOLD}${PASS}${RESET} passed ${YELLOW}${BOLD}${WARN}${RESET} warnings ${RED}${BOLD}${FAIL}${RESET} failed"
162
290
  echo ""
163
291
 
164
292
  # ═════════════════════════════════════════════════════════════════════════════
165
- # 2. Run init
293
+ # PHASE 3: Configuration Generation
166
294
  # ═════════════════════════════════════════════════════════════════════════════
167
- echo -e "${PURPLE}${BOLD} INITIALIZING${RESET}"
295
+ echo -e "${PURPLE}${BOLD} PHASE 3: CONFIGURATION GENERATION${RESET}"
168
296
  echo -e "${DIM} ──────────────────────────────────────────${RESET}"
169
297
  echo ""
170
298
 
171
299
  "$SCRIPT_DIR/sw-init.sh"
172
300
 
173
301
  # ═════════════════════════════════════════════════════════════════════════════
174
- # 3. Inject tmux overlay (if not already sourced)
302
+ # Ask about daemon auto-processing
175
303
  # ═════════════════════════════════════════════════════════════════════════════
176
- echo -e "${PURPLE}${BOLD} TMUX OVERLAY${RESET}"
177
- echo -e "${DIM} ──────────────────────────────────────────${RESET}"
178
-
179
- if [[ -f "$HOME/.tmux.conf" ]]; then
180
- if grep -q "shipwright-overlay" "$HOME/.tmux.conf" 2>/dev/null; then
181
- success "Overlay already sourced in ~/.tmux.conf"
304
+ if [[ "$SKIP_DAEMON_PROMPT" == "false" ]]; then
305
+ echo ""
306
+ echo -e " ${CYAN}${BOLD}Daemon Auto-Processing${RESET}"
307
+ echo -e " ${DIM}──────────────────────────────────────────${RESET}"
308
+ read -rp "$(echo -e " ${CYAN}${BOLD}▸${RESET} Enable daemon to watch for labeled GitHub issues? [y/N] ")" daemon_confirm
309
+ if [[ "$(echo "$daemon_confirm" | tr '[:upper:]' '[:lower:]')" == "y" ]]; then
310
+ success "Daemon auto-processing enabled"
311
+ info "Start with: ${DIM}shipwright daemon start${RESET}"
182
312
  else
183
- echo ""
184
- echo -e " Your ${BOLD}~/.tmux.conf${RESET} does not source the Shipwright overlay."
185
- echo -e " This adds: pane borders, color hooks, agent keybindings."
186
- echo ""
187
- read -rp "$(echo -e " ${CYAN}${BOLD}▸${RESET} Append overlay source to ~/.tmux.conf? [Y/n] ")" confirm
188
- if [[ -z "$confirm" || "$(echo "$confirm" | tr '[:upper:]' '[:lower:]')" != "n" ]]; then
189
- {
190
- echo ""
191
- echo "# Shipwright agent overlay"
192
- echo "source-file -q ~/.tmux/shipwright-overlay.conf"
193
- } >> "$HOME/.tmux.conf"
194
- success "Appended overlay source to ~/.tmux.conf"
195
- else
196
- info "Skipped. Add manually if you want overlay features:"
197
- echo -e " ${DIM}source-file -q ~/.tmux/shipwright-overlay.conf${RESET}"
198
- fi
313
+ info "Daemon auto-processing disabled"
199
314
  fi
200
- else
201
- info "No ~/.tmux.conf found — init should have created one"
315
+ echo ""
202
316
  fi
203
- echo ""
204
317
 
205
318
  # ═════════════════════════════════════════════════════════════════════════════
206
- # 4. Run doctor
319
+ # PHASE 4: Validation & Quick Start
207
320
  # ═════════════════════════════════════════════════════════════════════════════
208
- echo -e "${PURPLE}${BOLD} VALIDATION${RESET}"
321
+ echo -e "${PURPLE}${BOLD} PHASE 4: VALIDATION${RESET}"
209
322
  echo -e "${DIM} ──────────────────────────────────────────${RESET}"
210
323
  echo ""
211
324
 
212
325
  "$SCRIPT_DIR/sw-doctor.sh" || true
213
326
 
214
327
  # ═════════════════════════════════════════════════════════════════════════════
215
- # 5. Quick-start guide
328
+ # Quick Start Guide
216
329
  # ═════════════════════════════════════════════════════════════════════════════
217
330
  echo ""
218
- echo -e "${CYAN}${BOLD} ╔══════════════════════════════════════════════════════════════╗${RESET}"
219
- echo -e "${CYAN}${BOLD} ║ Quick Start ║${RESET}"
220
- echo -e "${CYAN}${BOLD} ╠══════════════════════════════════════════════════════════════╣${RESET}"
331
+ echo -e "${CYAN}${BOLD} ╔════════════════════════════════════════════════════════════════╗${RESET}"
332
+ echo -e "${CYAN}${BOLD} ║ Setup Complete! Quick Start Guide ║${RESET}"
333
+ echo -e "${CYAN}${BOLD} ╠════════════════════════════════════════════════════════════════╣${RESET}"
334
+ echo -e "${CYAN}${BOLD} ║${RESET}"
335
+ echo -e "${CYAN}${BOLD} ║ ${GREEN}✓${RESET} Prerequisites checked and tools configured"
336
+ echo -e "${CYAN}${BOLD} ║ ${GREEN}✓${RESET} .claude/ directory with agent config created"
337
+ echo -e "${CYAN}${BOLD} ║ ${GREEN}✓${RESET} tmux integration ready"
338
+ echo -e "${CYAN}${BOLD} ║${RESET}"
339
+ echo -e "${CYAN}${BOLD} ║ ${CYAN}${BOLD}→ Try these commands next:${RESET}"
340
+ echo -e "${CYAN}${BOLD} ║${RESET}"
221
341
  if [[ -z "${TMUX:-}" ]]; then
222
- echo -e "${CYAN}${BOLD} ║${RESET} 1. Start tmux: ${DIM}tmux new -s work${RESET} ${CYAN}${BOLD}║${RESET}"
223
- echo -e "${CYAN}${BOLD} ║${RESET} 2. Create team: ${DIM}shipwright session my-feat --template feature-dev${RESET} ${CYAN}${BOLD}║${RESET}"
224
- echo -e "${CYAN}${BOLD} ║${RESET} 3. Launch Claude: ${DIM}claude${RESET} ${CYAN}${BOLD}║${RESET}"
225
- echo -e "${CYAN}${BOLD} ║${RESET} 4. Use teams: ${DIM}\"Create a team with 3 agents for this feature\"${RESET} ${CYAN}${BOLD}║${RESET}"
342
+ echo -e "${CYAN}${BOLD} ║ ${DIM}1. tmux new -s dev # Start tmux session${RESET} ${CYAN}${BOLD}║${RESET}"
343
+ echo -e "${CYAN}${BOLD} ║ ${DIM}2. shipwright session work # Create team session${RESET} ${CYAN}${BOLD}║${RESET}"
344
+ echo -e "${CYAN}${BOLD} ║ ${DIM}3. claude # Launch Claude Code${RESET} ${CYAN}${BOLD}║${RESET}"
345
+ else
346
+ echo -e "${CYAN}${BOLD} ║ ${DIM}1. shipwright session work # Create team session${RESET} ${CYAN}${BOLD}║${RESET}"
347
+ echo -e "${CYAN}${BOLD} ║ ${DIM}2. claude # Launch Claude Code${RESET} ${CYAN}${BOLD}║${RESET}"
348
+ fi
349
+ echo -e "${CYAN}${BOLD} ║${RESET}"
350
+ echo -e "${CYAN}${BOLD} ║ ${CYAN}${BOLD}→ Or use the autonomous loop:${RESET}"
351
+ echo -e "${CYAN}${BOLD} ║${RESET}"
352
+ if [[ -n "$DETECTED_TEST_CMD" ]]; then
353
+ echo -e "${CYAN}${BOLD} ║ ${DIM}shipwright loop \"fix the failing tests\" --test-cmd \"${DETECTED_TEST_CMD}\"${RESET} ${CYAN}${BOLD}║${RESET}"
226
354
  else
227
- echo -e "${CYAN}${BOLD} ║${RESET} 1. Create team: ${DIM}shipwright session my-feat --template feature-dev${RESET} ${CYAN}${BOLD}║${RESET}"
228
- echo -e "${CYAN}${BOLD} ║${RESET} 2. Launch Claude: ${DIM}claude${RESET} ${CYAN}${BOLD}║${RESET}"
229
- echo -e "${CYAN}${BOLD} ║${RESET} 3. Use teams: ${DIM}\"Create a team with 3 agents for this feature\"${RESET} ${CYAN}${BOLD}║${RESET}"
355
+ echo -e "${CYAN}${BOLD} ${DIM}shipwright loop \"build authentication\" --test-cmd \"npm test\"${RESET} ${CYAN}${BOLD}║${RESET}"
230
356
  fi
231
- echo -e "${CYAN}${BOLD} ╚══════════════════════════════════════════════════════════════╝${RESET}"
357
+ echo -e "${CYAN}${BOLD} ║${RESET}"
358
+ echo -e "${CYAN}${BOLD} ║ ${CYAN}${BOLD}→ Or start the full delivery pipeline:${RESET}"
359
+ echo -e "${CYAN}${BOLD} ║${RESET}"
360
+ echo -e "${CYAN}${BOLD} ║ ${DIM}shipwright pipeline start --goal \"add user authentication\"${RESET} ${CYAN}${BOLD}║${RESET}"
361
+ echo -e "${CYAN}${BOLD} ║${RESET}"
362
+ echo -e "${CYAN}${BOLD} ║ ${CYAN}${BOLD}→ Or watch GitHub for labeled issues:${RESET}"
363
+ echo -e "${CYAN}${BOLD} ║${RESET}"
364
+ echo -e "${CYAN}${BOLD} ║ ${DIM}shipwright daemon start # Watch for GitHub issues${RESET} ${CYAN}${BOLD}║${RESET}"
365
+ echo -e "${CYAN}${BOLD} ║${RESET}"
366
+ echo -e "${CYAN}${BOLD} ║ See more: ${DIM}shipwright --help${RESET} ${CYAN}${BOLD}║${RESET}"
367
+ echo -e "${CYAN}${BOLD} ╚════════════════════════════════════════════════════════════════╝${RESET}"
232
368
  echo ""
233
- success "Setup complete! You're ready to go."
369
+ success "Shipwright v${VERSION} setup complete — you're ready to orchestrate!"
234
370
  echo ""
@@ -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.0.0"
9
+ VERSION="2.1.0"
10
10
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
11
11
  REPO_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
12
12