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.
Files changed (112) 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 +302 -18
  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 +30 -2
  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/tmux/shipwright-overlay.conf +35 -17
  112. package/tmux/tmux.conf +26 -21
@@ -27,9 +27,10 @@
27
27
  set -g pane-border-status top
28
28
 
29
29
  # Format: pane index, agent name, running command, zoom indicator
30
- # Active pane gets cyan accent; inactive stays muted
30
+ # Active pane: bold + bright Inactive: muted, recessed
31
31
  # Uses #{pane_title} which each agent sets via OSC 2 escape sequence
32
- set -g pane-border-format "#{?pane_active,#[fg=#00d4ff]#[bold],#[fg=#71717a]} #P #{pane_title} #[fg=#333355]│#[default] #{?pane_active,#[fg=#e4e4e7],#[fg=#52525b]}#{pane_current_command} #{?window_zoomed_flag,#[fg=#facc15]#[bold]🔍 ZOOMED ,}"
32
+ # The dot gives a visual "alive" indicator on the active pane
33
+ set -g pane-border-format "#{?pane_active,#[fg=#00d4ff]#[bold] ● #P │ #{pane_title} #[fg=#52525b]│#[fg=#a1a1aa] #{pane_current_command}#{?window_zoomed_flag, #[fg=#facc15]#[bold]⊞ FOCUS,},#[fg=#52525b] #P │ #[fg=#71717a]#{pane_title} #[fg=#333355]│ #[fg=#52525b]#{pane_current_command}}"
33
34
 
34
35
  # ═══════════════════════════════════════════════════════════════════════════
35
36
  # LAYOUT — Optimize for multi-agent pane layouts
@@ -40,19 +41,35 @@ set -g pane-border-format "#{?pane_active,#[fg=#00d4ff]#[bold],#[fg=#71717a]} #P
40
41
  setw -g aggressive-resize on
41
42
 
42
43
  # ═══════════════════════════════════════════════════════════════════════════
43
- # DARK THEME DEFAULTS Ensure all panes get the dark background
44
+ # DARK THEME — Active pane gets a subtle background lift
44
45
  # ═══════════════════════════════════════════════════════════════════════════
45
- # These session-level styles apply to ALL panes, even those created by
46
- # external tools (Claude Code agent spawning, scripts, etc.)
47
- set -g window-style 'bg=#1a1a2e,fg=#e4e4e7'
48
- set -g window-active-style 'bg=#1a1a2e,fg=#e4e4e7'
46
+ # Inactive panes: deep navy, dimmed text recedes visually
47
+ # Active pane: subtle bg lift, softer warm gray text — easy on the eyes
48
+ # NOTE: Claude Code renders its own colors for TUI elements. These fg values
49
+ # only affect plain terminal output (shell prompts, command output, etc.)
50
+ # The bg lift (#1a1a2e → #1e1e36) gives the active pane a "floating" feel.
51
+ set -g window-style 'bg=#1a1a2e,fg=#8888a0'
52
+ set -g window-active-style 'bg=#1e1e36,fg=#b4b4c8'
49
53
 
50
- # Hooks provide belt-and-suspenders coverage: explicitly set per-pane
51
- # colors whenever a pane is created, preventing white flash on creation.
52
- # Also re-enable allow-passthrough per-pane (some tmux versions reset it).
53
- set-hook -g after-split-window "select-pane -P 'bg=#1a1a2e,fg=#e4e4e7'"
54
- set-hook -g after-new-window "select-pane -P 'bg=#1a1a2e,fg=#e4e4e7'"
55
- set-hook -g after-new-session "select-pane -P 'bg=#1a1a2e,fg=#e4e4e7'"
54
+ # Hooks: set pane colors on creation to prevent white flash.
55
+ # New panes start with inactive colors; active pane lift applies automatically.
56
+ set-hook -g after-split-window "select-pane -P 'bg=#1a1a2e,fg=#8888a0'"
57
+ set-hook -g after-new-window "select-pane -P 'bg=#1a1a2e,fg=#8888a0'"
58
+ set-hook -g after-new-session "select-pane -P 'bg=#1a1a2e,fg=#8888a0'"
59
+
60
+ # ═══════════════════════════════════════════════════════════════════════════
61
+ # ROLE-COLORED BORDERS — Active pane border reflects agent role
62
+ # ═══════════════════════════════════════════════════════════════════════════
63
+ # When you switch panes, a hook reads the pane title and sets the active
64
+ # border color to match the agent's role:
65
+ # leader/pm → cyan (#00d4ff) builder/dev → blue (#0066ff)
66
+ # reviewer → orange (#f97316) tester → yellow (#facc15)
67
+ # security → red (#ef4444) docs → violet (#a78bfa)
68
+ # optimizer → green (#4ade80) researcher → purple (#7c3aed)
69
+ #
70
+ # The hook script must exist; -q makes source-file silent if missing.
71
+ # Falls back to cyan for non-agent panes (plain shell, vim, etc.)
72
+ set-hook -g pane-focus-in "run-shell -b 'bash ~/.shipwright/scripts/sw-tmux-role-color.sh 2>/dev/null || true'"
56
73
 
57
74
  # ═══════════════════════════════════════════════════════════════════════════
58
75
  # SAFETY — Confirm before killing agent panes
@@ -88,13 +105,14 @@ bind M-t setw synchronize-panes \; display-message "Team sync #{?synchronize-pan
88
105
  bind M-l next-layout
89
106
 
90
107
  # prefix + M-s → capture current pane's full scrollback to file
91
- bind M-s run-shell "tmux capture-pane -pS - > /tmp/claude-pane-#{pane_title}-$(date +%s).txt && tmux display-message 'Captured #{pane_title} to /tmp/'"
108
+ bind M-s run-shell "tmux capture-pane -pS - > /tmp/claude-pane-#{pane_title}-\$(date +%%s).txt && tmux display-message 'Captured #{pane_title} to /tmp/'"
92
109
 
93
110
  # prefix + M-a → capture ALL panes in current window (full scrollback each)
111
+ # NOTE: All $() must be escaped as \$() so they run at keypress time, not config load
94
112
  bind M-a run-shell "\
95
- for pane_id in $(tmux list-panes -F '##{pane_id}'); do \
96
- title=$(tmux display-message -t \$pane_id -p '##{pane_title}'); \
97
- tmux capture-pane -t \$pane_id -pS - > /tmp/claude-pane-\${title:-\$pane_id}-$(date +%s).txt; \
113
+ for pane_id in \$(tmux list-panes -F '#{pane_id}'); do \
114
+ title=\$(tmux display-message -t \$pane_id -p '#{pane_title}'); \
115
+ tmux capture-pane -t \$pane_id -pS - > /tmp/claude-pane-\${title:-\$pane_id}-\$(date +%%s).txt; \
98
116
  done && tmux display-message 'Captured all panes to /tmp/'"
99
117
 
100
118
  # ═══════════════════════════════════════════════════════════════════════════
package/tmux/tmux.conf CHANGED
@@ -36,6 +36,13 @@ set -g allow-passthrough on
36
36
  set -g extended-keys on
37
37
  set -as terminal-features 'xterm*:extkeys'
38
38
 
39
+ # Signal true color support to apps inside tmux.
40
+ # Without this, Claude Code falls back to 256-color ANSI palette (washed-out).
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
45
+
39
46
  # ─── Mouse ──────────────────────────────────────────────────────────────
40
47
  set -g mouse on
41
48
  # Fix: tmux 3.4+ defaults MouseDown1Status to switch-client (sessions),
@@ -46,7 +53,8 @@ bind -T root DoubleClick1Status command-prompt -I "#W" "rename-window -- '%%'"
46
53
 
47
54
  # ─── Core Behavior ─────────────────────────────────────────────────────
48
55
  set -g base-index 1
49
- setw -g pane-base-index 1
56
+ # Claude Code expects 0-based pane indexing for agent team pane routing
57
+ setw -g pane-base-index 0
50
58
  set -g renumber-windows on
51
59
  set -sg escape-time 0
52
60
  set -g focus-events on
@@ -71,9 +79,9 @@ set -g history-limit 250000
71
79
  # ═══════════════════════════════════════════════════════════════════════════
72
80
 
73
81
  set -g status-position bottom
74
- set -g status-interval 1
82
+ set -g status-interval 3
75
83
  set -g status-justify left
76
- set -g status-style "bg=#1a1a2e,fg=#e4e4e7"
84
+ set -g status-style "bg=#1a1a2e,fg=#a1a1aa"
77
85
  set -g status-left-length 100
78
86
  set -g status-right-length 150
79
87
 
@@ -86,15 +94,18 @@ setw -g window-status-format "#{?#{m:claude-*,#W},#[fg=#7c3aed]#[bg=#252538] λ
86
94
  # Active window; team windows get λ icon in cyan
87
95
  setw -g window-status-current-format "#{?#{m:claude-*,#W},#[fg=#1e1e32]#[bg=#00d4ff]#[bold] λ #I:#W ,#[fg=#1e1e32]#[bg=#00d4ff]#[bold] #I:#W }#[fg=#00d4ff]#[bg=#1a1a2e]"
88
96
 
89
- # Right side: key hints when prefix is active, otherwise clock + date
90
- set -g status-right "#{?client_prefix,#[fg=#1e1e32]#[bg=#0066ff]#[bold] T team | split - split hjkl nav G zoom S sync x kill F fzf #[fg=#1e1e32]#[bg=#00d4ff]#[bold] ^a ,#[fg=#71717a]#[bg=#252538] #(whoami)@#h #[fg=#1e1e32]#[bg=#7c3aed]#[bold] %H:%M #[fg=#e4e4e7]#[bg=#0066ff]#[bold] %b %d #[fg=#1e1e32]#[bg=#00d4ff]#[bold] %a }"
97
+ # Right side: key hints when prefix is active, otherwise pipeline + agents + clock
98
+ # Pipeline widget: shows current stage (BUILD, TEST, etc.) with stage-colored badge
99
+ # Agent widget: shows active agent count as λN in purple
100
+ # Rule: dark text (#1e1e32) on bright backgrounds, muted text on dark backgrounds
101
+ set -g status-right-length 200
102
+ set -g status-right "#{?client_prefix,#[fg=#1e1e32]#[bg=#0066ff]#[bold] T team | split - split hjkl nav G zoom S sync x kill F fzf #[fg=#1e1e32]#[bg=#00d4ff]#[bold] ^a ,#(~/.shipwright/scripts/sw-tmux-status.sh agents 2>/dev/null)#(~/.shipwright/scripts/sw-tmux-status.sh pipeline 2>/dev/null)#[fg=#71717a]#[bg=#252538] #(whoami)@#h #[fg=#1e1e32]#[bg=#7c3aed]#[bold] %H:%M #[fg=#1e1e32]#[bg=#0066ff]#[bold] %b %d #[fg=#1e1e32]#[bg=#00d4ff]#[bold] %a }"
91
103
 
92
104
  # ═══════════════════════════════════════════════════════════════════════════
93
105
  # PANE STYLING
94
106
  # ═══════════════════════════════════════════════════════════════════════════
95
107
 
96
- set -g window-style 'bg=#1a1a2e,fg=#e4e4e7'
97
- set -g window-active-style 'bg=#1a1a2e,fg=#e4e4e7'
108
+ # window-style/window-active-style defined in shipwright-overlay.conf (with hooks)
98
109
  set -g pane-border-style "fg=#333355,bg=#1a1a2e"
99
110
  set -g pane-active-border-style "fg=#00d4ff,bg=#1a1a2e"
100
111
  # Heavy pane border lines for better visibility (tmux 3.2+)
@@ -112,13 +123,13 @@ set -gq popup-border-lines rounded
112
123
  # ═══════════════════════════════════════════════════════════════════════════
113
124
 
114
125
  set -g message-style "bg=#00d4ff,fg=#1e1e32,bold"
115
- set -g message-command-style "bg=#7c3aed,fg=#e4e4e7,bold"
126
+ set -g message-command-style "bg=#7c3aed,fg=#1e1e32,bold"
116
127
 
117
128
  # ═══════════════════════════════════════════════════════════════════════════
118
129
  # MODE STYLING (copy mode, etc.)
119
130
  # ═══════════════════════════════════════════════════════════════════════════
120
131
 
121
- setw -g mode-style "bg=#0066ff,fg=#e4e4e7,bold"
132
+ setw -g mode-style "bg=#0066ff,fg=#1e1e32,bold"
122
133
  setw -g clock-mode-colour "#00d4ff"
123
134
  setw -g clock-mode-style 24
124
135
 
@@ -130,7 +141,7 @@ unbind C-b
130
141
  set -g prefix C-a
131
142
  bind C-a send-prefix
132
143
 
133
- bind r source-file ~/.tmux.conf \; display-message "Config reloaded!"
144
+ bind r source-file ~/.tmux.conf \; source-file -q ~/.tmux/shipwright-overlay.conf \; display-message "Config reloaded!"
134
145
 
135
146
  bind | split-window -h -c "#{pane_current_path}"
136
147
  bind - split-window -v -c "#{pane_current_path}"
@@ -152,23 +163,17 @@ bind -r C-l select-window -t :+
152
163
 
153
164
  bind c new-window -c "#{pane_current_path}"
154
165
 
155
- bind x kill-pane
156
- bind X kill-window
166
+ # x/X bindings defined in shipwright-overlay.conf with confirm-before safety
167
+ # bind x → confirm-before kill-pane
168
+ # bind X → confirm-before kill-window
157
169
 
158
170
  setw -g mode-keys vi
159
171
  bind -T copy-mode-vi v send-keys -X begin-selection
160
172
  bind -T copy-mode-vi r send-keys -X rectangle-toggle
161
173
  bind p paste-buffer
162
174
 
163
- # System clipboard integration (macOS pbcopy, Linux xclip/xsel fallback)
164
- if-shell "command -v pbcopy" \
165
- "bind -T copy-mode-vi y send-keys -X copy-pipe-and-cancel 'pbcopy'" \
166
- "bind -T copy-mode-vi y send-keys -X copy-pipe-and-cancel 'xclip -selection clipboard 2>/dev/null || xsel --clipboard 2>/dev/null'"
167
-
168
- # Mouse drag also copies to system clipboard
169
- if-shell "command -v pbcopy" \
170
- "bind -T copy-mode-vi MouseDragEnd1Pane send-keys -X copy-pipe-and-cancel 'pbcopy'" \
171
- "bind -T copy-mode-vi MouseDragEnd1Pane send-keys -X copy-pipe-and-cancel 'xclip -selection clipboard 2>/dev/null || xsel --clipboard 2>/dev/null'"
175
+ # Clipboard handled by tmux-yank plugin (loaded via TPM below)
176
+ # tmux-yank uses OSC 52 + pbcopy/xclip automatically
172
177
 
173
178
  bind S setw synchronize-panes \; display-message "Sync #{?synchronize-panes,ON,OFF}"
174
179