shipwright-cli 2.0.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.
- package/README.md +160 -72
- package/completions/_shipwright +59 -7
- package/completions/shipwright.bash +24 -4
- package/completions/shipwright.fish +80 -2
- package/dashboard/server.ts +208 -0
- package/docs/tmux-research/TMUX-ARCHITECTURE.md +567 -0
- package/docs/tmux-research/TMUX-AUDIT.md +925 -0
- package/docs/tmux-research/TMUX-BEST-PRACTICES-2025-2026.md +829 -0
- package/docs/tmux-research/TMUX-QUICK-REFERENCE.md +543 -0
- package/docs/tmux-research/TMUX-RESEARCH-INDEX.md +438 -0
- package/package.json +2 -2
- package/scripts/lib/helpers.sh +7 -0
- package/scripts/sw +116 -2
- package/scripts/sw-activity.sh +1 -1
- package/scripts/sw-adaptive.sh +1 -1
- package/scripts/sw-adversarial.sh +1 -1
- package/scripts/sw-architecture-enforcer.sh +1 -1
- package/scripts/sw-auth.sh +1 -1
- package/scripts/sw-autonomous.sh +128 -38
- package/scripts/sw-changelog.sh +1 -1
- package/scripts/sw-checkpoint.sh +1 -1
- package/scripts/sw-ci.sh +1 -1
- package/scripts/sw-cleanup.sh +1 -1
- package/scripts/sw-code-review.sh +62 -1
- package/scripts/sw-connect.sh +1 -1
- package/scripts/sw-context.sh +1 -1
- package/scripts/sw-cost.sh +44 -3
- package/scripts/sw-daemon.sh +155 -27
- package/scripts/sw-dashboard.sh +1 -1
- package/scripts/sw-db.sh +958 -118
- package/scripts/sw-decompose.sh +1 -1
- package/scripts/sw-deps.sh +1 -1
- package/scripts/sw-developer-simulation.sh +1 -1
- package/scripts/sw-discovery.sh +1 -1
- package/scripts/sw-docs-agent.sh +1 -1
- package/scripts/sw-docs.sh +1 -1
- package/scripts/sw-doctor.sh +49 -1
- package/scripts/sw-dora.sh +1 -1
- package/scripts/sw-durable.sh +1 -1
- package/scripts/sw-e2e-orchestrator.sh +1 -1
- package/scripts/sw-eventbus.sh +1 -1
- package/scripts/sw-feedback.sh +23 -15
- package/scripts/sw-fix.sh +1 -1
- package/scripts/sw-fleet-discover.sh +1 -1
- package/scripts/sw-fleet-viz.sh +1 -1
- package/scripts/sw-fleet.sh +1 -1
- package/scripts/sw-github-app.sh +1 -1
- package/scripts/sw-github-checks.sh +4 -4
- package/scripts/sw-github-deploy.sh +1 -1
- package/scripts/sw-github-graphql.sh +1 -1
- package/scripts/sw-guild.sh +1 -1
- package/scripts/sw-heartbeat.sh +1 -1
- package/scripts/sw-hygiene.sh +1 -1
- package/scripts/sw-incident.sh +45 -6
- package/scripts/sw-init.sh +150 -24
- package/scripts/sw-instrument.sh +1 -1
- package/scripts/sw-intelligence.sh +1 -1
- package/scripts/sw-jira.sh +1 -1
- package/scripts/sw-launchd.sh +1 -1
- package/scripts/sw-linear.sh +1 -1
- package/scripts/sw-logs.sh +1 -1
- package/scripts/sw-loop.sh +204 -19
- package/scripts/sw-memory.sh +18 -1
- package/scripts/sw-mission-control.sh +1 -1
- package/scripts/sw-model-router.sh +1 -1
- package/scripts/sw-otel.sh +1 -1
- package/scripts/sw-oversight.sh +76 -1
- package/scripts/sw-pipeline-composer.sh +1 -1
- package/scripts/sw-pipeline-vitals.sh +1 -1
- package/scripts/sw-pipeline.sh +302 -18
- package/scripts/sw-pm.sh +70 -5
- package/scripts/sw-pr-lifecycle.sh +1 -1
- package/scripts/sw-predictive.sh +8 -1
- package/scripts/sw-prep.sh +1 -1
- package/scripts/sw-ps.sh +1 -1
- package/scripts/sw-public-dashboard.sh +1 -1
- package/scripts/sw-quality.sh +1 -1
- package/scripts/sw-reaper.sh +1 -1
- package/scripts/sw-recruit.sh +1853 -178
- package/scripts/sw-regression.sh +1 -1
- package/scripts/sw-release-manager.sh +1 -1
- package/scripts/sw-release.sh +1 -1
- package/scripts/sw-remote.sh +1 -1
- package/scripts/sw-replay.sh +1 -1
- package/scripts/sw-retro.sh +1 -1
- package/scripts/sw-scale.sh +1 -1
- package/scripts/sw-security-audit.sh +1 -1
- package/scripts/sw-self-optimize.sh +1 -1
- package/scripts/sw-session.sh +1 -1
- package/scripts/sw-setup.sh +263 -127
- package/scripts/sw-standup.sh +1 -1
- package/scripts/sw-status.sh +44 -2
- package/scripts/sw-strategic.sh +189 -41
- package/scripts/sw-stream.sh +1 -1
- package/scripts/sw-swarm.sh +42 -5
- package/scripts/sw-team-stages.sh +1 -1
- package/scripts/sw-templates.sh +4 -4
- package/scripts/sw-testgen.sh +66 -15
- package/scripts/sw-tmux-pipeline.sh +1 -1
- package/scripts/sw-tmux-role-color.sh +58 -0
- package/scripts/sw-tmux-status.sh +128 -0
- package/scripts/sw-tmux.sh +1 -1
- package/scripts/sw-trace.sh +1 -1
- package/scripts/sw-tracker.sh +1 -1
- package/scripts/sw-triage.sh +61 -37
- package/scripts/sw-upgrade.sh +1 -1
- package/scripts/sw-ux.sh +30 -2
- package/scripts/sw-webhook.sh +1 -1
- package/scripts/sw-widgets.sh +1 -1
- package/scripts/sw-worktree.sh +1 -1
- package/tmux/shipwright-overlay.conf +35 -17
- package/tmux/tmux.conf +26 -21
package/scripts/sw-regression.sh
CHANGED
package/scripts/sw-release.sh
CHANGED
package/scripts/sw-remote.sh
CHANGED
package/scripts/sw-replay.sh
CHANGED
package/scripts/sw-retro.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.
|
|
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) ─────────────────────────────────────
|
package/scripts/sw-scale.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.
|
|
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) ─────────────────────────────────────
|
package/scripts/sw-session.sh
CHANGED
|
@@ -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.
|
|
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
|
|
package/scripts/sw-setup.sh
CHANGED
|
@@ -1,17 +1,19 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
2
|
# ╔═══════════════════════════════════════════════════════════════════════════╗
|
|
3
|
-
# ║ shipwright setup —
|
|
3
|
+
# ║ shipwright setup — Comprehensive onboarding wizard ║
|
|
4
4
|
# ║ ║
|
|
5
|
-
# ║
|
|
6
|
-
# ║
|
|
7
|
-
# ║
|
|
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.
|
|
13
|
+
VERSION="2.1.1"
|
|
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 "
|
|
50
|
-
echo "
|
|
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
|
|
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
|
-
#
|
|
74
|
-
|
|
75
|
-
|
|
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
|
-
#
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
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
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
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
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
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
|
-
|
|
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
|
-
#
|
|
120
|
-
if
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
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
|
-
#
|
|
128
|
-
if
|
|
129
|
-
|
|
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
|
-
|
|
137
|
-
|
|
138
|
-
|
|
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
|
-
#
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
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
|
-
|
|
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
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
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
|
-
#
|
|
293
|
+
# PHASE 3: Configuration Generation
|
|
166
294
|
# ═════════════════════════════════════════════════════════════════════════════
|
|
167
|
-
echo -e "${PURPLE}${BOLD}
|
|
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
|
-
#
|
|
302
|
+
# Ask about daemon auto-processing
|
|
175
303
|
# ═════════════════════════════════════════════════════════════════════════════
|
|
176
|
-
|
|
177
|
-
echo
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
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
|
-
|
|
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
|
-
|
|
201
|
-
info "No ~/.tmux.conf found — init should have created one"
|
|
315
|
+
echo ""
|
|
202
316
|
fi
|
|
203
|
-
echo ""
|
|
204
317
|
|
|
205
318
|
# ═════════════════════════════════════════════════════════════════════════════
|
|
206
|
-
# 4
|
|
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
|
-
#
|
|
328
|
+
# Quick Start Guide
|
|
216
329
|
# ═════════════════════════════════════════════════════════════════════════════
|
|
217
330
|
echo ""
|
|
218
|
-
echo -e "${CYAN}${BOLD}
|
|
219
|
-
echo -e "${CYAN}${BOLD} ║ Quick Start
|
|
220
|
-
echo -e "${CYAN}${BOLD}
|
|
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}
|
|
223
|
-
echo -e "${CYAN}${BOLD}
|
|
224
|
-
echo -e "${CYAN}${BOLD}
|
|
225
|
-
|
|
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}
|
|
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}
|
|
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 "
|
|
369
|
+
success "Shipwright v${VERSION} setup complete — you're ready to orchestrate!"
|
|
234
370
|
echo ""
|
package/scripts/sw-standup.sh
CHANGED