shipwright-cli 1.7.0 → 1.9.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 (106) hide show
  1. package/.claude/agents/code-reviewer.md +90 -0
  2. package/.claude/agents/devops-engineer.md +142 -0
  3. package/.claude/agents/pipeline-agent.md +80 -0
  4. package/.claude/agents/shell-script-specialist.md +150 -0
  5. package/.claude/agents/test-specialist.md +196 -0
  6. package/.claude/hooks/post-tool-use.sh +38 -0
  7. package/.claude/hooks/pre-tool-use.sh +25 -0
  8. package/.claude/hooks/session-started.sh +37 -0
  9. package/README.md +212 -814
  10. package/claude-code/CLAUDE.md.shipwright +54 -0
  11. package/claude-code/hooks/notify-idle.sh +2 -2
  12. package/claude-code/hooks/session-start.sh +24 -0
  13. package/claude-code/hooks/task-completed.sh +6 -2
  14. package/claude-code/settings.json.template +12 -0
  15. package/dashboard/public/app.js +4422 -0
  16. package/dashboard/public/index.html +816 -0
  17. package/dashboard/public/styles.css +4755 -0
  18. package/dashboard/server.ts +4315 -0
  19. package/docs/KNOWN-ISSUES.md +18 -10
  20. package/docs/TIPS.md +38 -26
  21. package/docs/patterns/README.md +33 -23
  22. package/package.json +9 -5
  23. package/scripts/adapters/iterm2-adapter.sh +1 -1
  24. package/scripts/adapters/tmux-adapter.sh +52 -23
  25. package/scripts/adapters/wezterm-adapter.sh +26 -14
  26. package/scripts/lib/compat.sh +200 -0
  27. package/scripts/lib/helpers.sh +72 -0
  28. package/scripts/postinstall.mjs +72 -13
  29. package/scripts/{cct → sw} +109 -21
  30. package/scripts/sw-adversarial.sh +274 -0
  31. package/scripts/sw-architecture-enforcer.sh +330 -0
  32. package/scripts/sw-checkpoint.sh +390 -0
  33. package/scripts/{cct-cleanup.sh → sw-cleanup.sh} +3 -1
  34. package/scripts/sw-connect.sh +619 -0
  35. package/scripts/{cct-cost.sh → sw-cost.sh} +368 -34
  36. package/scripts/{cct-daemon.sh → sw-daemon.sh} +2217 -204
  37. package/scripts/sw-dashboard.sh +477 -0
  38. package/scripts/sw-developer-simulation.sh +252 -0
  39. package/scripts/sw-docs.sh +635 -0
  40. package/scripts/sw-doctor.sh +907 -0
  41. package/scripts/{cct-fix.sh → sw-fix.sh} +10 -6
  42. package/scripts/{cct-fleet.sh → sw-fleet.sh} +498 -22
  43. package/scripts/sw-github-checks.sh +521 -0
  44. package/scripts/sw-github-deploy.sh +533 -0
  45. package/scripts/sw-github-graphql.sh +972 -0
  46. package/scripts/sw-heartbeat.sh +293 -0
  47. package/scripts/sw-init.sh +522 -0
  48. package/scripts/sw-intelligence.sh +1196 -0
  49. package/scripts/sw-jira.sh +643 -0
  50. package/scripts/sw-launchd.sh +364 -0
  51. package/scripts/sw-linear.sh +648 -0
  52. package/scripts/{cct-logs.sh → sw-logs.sh} +72 -2
  53. package/scripts/{cct-loop.sh → sw-loop.sh} +534 -44
  54. package/scripts/{cct-memory.sh → sw-memory.sh} +321 -38
  55. package/scripts/sw-patrol-meta.sh +417 -0
  56. package/scripts/sw-pipeline-composer.sh +455 -0
  57. package/scripts/{cct-pipeline.sh → sw-pipeline.sh} +2319 -178
  58. package/scripts/sw-predictive.sh +820 -0
  59. package/scripts/{cct-prep.sh → sw-prep.sh} +339 -49
  60. package/scripts/{cct-ps.sh → sw-ps.sh} +6 -4
  61. package/scripts/{cct-reaper.sh → sw-reaper.sh} +6 -4
  62. package/scripts/sw-remote.sh +687 -0
  63. package/scripts/sw-self-optimize.sh +947 -0
  64. package/scripts/sw-session.sh +519 -0
  65. package/scripts/sw-setup.sh +234 -0
  66. package/scripts/sw-status.sh +605 -0
  67. package/scripts/{cct-templates.sh → sw-templates.sh} +9 -4
  68. package/scripts/sw-tmux.sh +591 -0
  69. package/scripts/sw-tracker-jira.sh +277 -0
  70. package/scripts/sw-tracker-linear.sh +292 -0
  71. package/scripts/sw-tracker.sh +409 -0
  72. package/scripts/{cct-upgrade.sh → sw-upgrade.sh} +103 -46
  73. package/scripts/{cct-worktree.sh → sw-worktree.sh} +3 -0
  74. package/templates/pipelines/autonomous.json +27 -5
  75. package/templates/pipelines/full.json +12 -0
  76. package/templates/pipelines/standard.json +12 -0
  77. package/tmux/{claude-teams-overlay.conf → shipwright-overlay.conf} +27 -9
  78. package/tmux/templates/accessibility.json +34 -0
  79. package/tmux/templates/api-design.json +35 -0
  80. package/tmux/templates/architecture.json +1 -0
  81. package/tmux/templates/bug-fix.json +9 -0
  82. package/tmux/templates/code-review.json +1 -0
  83. package/tmux/templates/compliance.json +36 -0
  84. package/tmux/templates/data-pipeline.json +36 -0
  85. package/tmux/templates/debt-paydown.json +34 -0
  86. package/tmux/templates/devops.json +1 -0
  87. package/tmux/templates/documentation.json +1 -0
  88. package/tmux/templates/exploration.json +1 -0
  89. package/tmux/templates/feature-dev.json +1 -0
  90. package/tmux/templates/full-stack.json +8 -0
  91. package/tmux/templates/i18n.json +34 -0
  92. package/tmux/templates/incident-response.json +36 -0
  93. package/tmux/templates/migration.json +1 -0
  94. package/tmux/templates/observability.json +35 -0
  95. package/tmux/templates/onboarding.json +33 -0
  96. package/tmux/templates/performance.json +35 -0
  97. package/tmux/templates/refactor.json +1 -0
  98. package/tmux/templates/release.json +35 -0
  99. package/tmux/templates/security-audit.json +8 -0
  100. package/tmux/templates/spike.json +34 -0
  101. package/tmux/templates/testing.json +1 -0
  102. package/tmux/tmux.conf +98 -9
  103. package/scripts/cct-doctor.sh +0 -328
  104. package/scripts/cct-init.sh +0 -282
  105. package/scripts/cct-session.sh +0 -284
  106. package/scripts/cct-status.sh +0 -169
@@ -1,169 +0,0 @@
1
- #!/usr/bin/env bash
2
- # ╔═══════════════════════════════════════════════════════════════════════════╗
3
- # ║ cct-status.sh — Dashboard showing Claude Code team status ║
4
- # ║ ║
5
- # ║ Shows running teams, agent windows, and task progress. ║
6
- # ╚═══════════════════════════════════════════════════════════════════════════╝
7
- set -euo pipefail
8
-
9
- # ─── Colors ──────────────────────────────────────────────────────────────────
10
- CYAN='\033[38;2;0;212;255m'
11
- PURPLE='\033[38;2;124;58;237m'
12
- BLUE='\033[38;2;0;102;255m'
13
- GREEN='\033[38;2;74;222;128m'
14
- YELLOW='\033[38;2;250;204;21m'
15
- RED='\033[38;2;248;113;113m'
16
- DIM='\033[2m'
17
- BOLD='\033[1m'
18
- RESET='\033[0m'
19
-
20
- # ─── Header ──────────────────────────────────────────────────────────────────
21
-
22
- echo ""
23
- echo -e "${CYAN}${BOLD} Claude Code Teams — Status Dashboard${RESET}"
24
- echo -e "${DIM} $(date '+%Y-%m-%d %H:%M:%S')${RESET}"
25
- echo -e "${DIM} ══════════════════════════════════════════${RESET}"
26
- echo ""
27
-
28
- # ─── 1. Tmux Windows ────────────────────────────────────────────────────────
29
-
30
- echo -e "${PURPLE}${BOLD} TMUX WINDOWS${RESET}"
31
- echo -e "${DIM} ──────────────────────────────────────────${RESET}"
32
-
33
- # Get all windows, highlight Claude-related ones
34
- HAS_CLAUDE_WINDOWS=false
35
- while IFS= read -r line; do
36
- session_window="$(echo "$line" | cut -d'|' -f1)"
37
- window_name="$(echo "$line" | cut -d'|' -f2)"
38
- pane_count="$(echo "$line" | cut -d'|' -f3)"
39
- active="$(echo "$line" | cut -d'|' -f4)"
40
-
41
- if echo "$window_name" | grep -qi "claude"; then
42
- HAS_CLAUDE_WINDOWS=true
43
- if [[ "$active" == "1" ]]; then
44
- status_icon="${GREEN}●${RESET}"
45
- status_label="${GREEN}active${RESET}"
46
- else
47
- status_icon="${YELLOW}●${RESET}"
48
- status_label="${YELLOW}idle${RESET}"
49
- fi
50
- echo -e " ${status_icon} ${BOLD}${window_name}${RESET} ${DIM}${session_window}${RESET} panes:${pane_count} ${status_label}"
51
- fi
52
- done < <(tmux list-windows -a -F '#{session_name}:#{window_index}|#{window_name}|#{window_panes}|#{window_active}' 2>/dev/null || true)
53
-
54
- if ! $HAS_CLAUDE_WINDOWS; then
55
- echo -e " ${DIM}No Claude team windows found.${RESET}"
56
- echo -e " ${DIM}Start one with: ${CYAN}shipwright session <name>${RESET}"
57
- fi
58
-
59
- # ─── 2. Team Configurations ─────────────────────────────────────────────────
60
-
61
- echo ""
62
- echo -e "${PURPLE}${BOLD} TEAM CONFIGS${RESET} ${DIM}~/.claude/teams/${RESET}"
63
- echo -e "${DIM} ──────────────────────────────────────────${RESET}"
64
-
65
- TEAMS_DIR="${HOME}/.claude/teams"
66
- HAS_TEAMS=false
67
-
68
- if [[ -d "$TEAMS_DIR" ]]; then
69
- while IFS= read -r team_dir; do
70
- [[ -z "$team_dir" ]] && continue
71
- HAS_TEAMS=true
72
- team_name="$(basename "$team_dir")"
73
-
74
- # Try to read config.json for member info
75
- config_file="${team_dir}/config.json"
76
- if [[ -f "$config_file" ]]; then
77
- # Count members from JSON (look for "name" keys in members array)
78
- member_count=$(grep -c '"name"' "$config_file" 2>/dev/null || true)
79
- member_count="${member_count:-0}"
80
- # Extract member names
81
- member_names=$(grep '"name"' "$config_file" 2>/dev/null | sed 's/.*"name"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/' | tr '\n' ', ' | sed 's/,$//' | sed 's/,/, /g')
82
-
83
- echo -e " ${GREEN}●${RESET} ${BOLD}${team_name}${RESET} ${DIM}members:${member_count}${RESET}"
84
- if [[ -n "$member_names" ]]; then
85
- echo -e " ${DIM}└─ ${member_names}${RESET}"
86
- fi
87
- else
88
- # Directory exists but no config — possibly orphaned
89
- echo -e " ${RED}●${RESET} ${BOLD}${team_name}${RESET} ${DIM}(no config — possibly orphaned)${RESET}"
90
- fi
91
- done < <(find "$TEAMS_DIR" -mindepth 1 -maxdepth 1 -type d 2>/dev/null | sort)
92
- fi
93
-
94
- if ! $HAS_TEAMS; then
95
- echo -e " ${DIM}No team configs found.${RESET}"
96
- fi
97
-
98
- # ─── 3. Task Lists ──────────────────────────────────────────────────────────
99
-
100
- echo ""
101
- echo -e "${PURPLE}${BOLD} TASK LISTS${RESET} ${DIM}~/.claude/tasks/${RESET}"
102
- echo -e "${DIM} ──────────────────────────────────────────${RESET}"
103
-
104
- TASKS_DIR="${HOME}/.claude/tasks"
105
- HAS_TASKS=false
106
-
107
- if [[ -d "$TASKS_DIR" ]]; then
108
- while IFS= read -r task_dir; do
109
- [[ -z "$task_dir" ]] && continue
110
- HAS_TASKS=true
111
- task_team="$(basename "$task_dir")"
112
-
113
- # Count tasks by status
114
- total=0
115
- completed=0
116
- in_progress=0
117
- pending=0
118
-
119
- while IFS= read -r task_file; do
120
- [[ -z "$task_file" ]] && continue
121
- total=$((total + 1))
122
- status=$(grep -o '"status"[[:space:]]*:[[:space:]]*"[^"]*"' "$task_file" 2>/dev/null | head -1 | sed 's/.*"\([^"]*\)"$/\1/')
123
- case "$status" in
124
- completed) completed=$((completed + 1)) ;;
125
- in_progress) in_progress=$((in_progress + 1)) ;;
126
- pending) pending=$((pending + 1)) ;;
127
- esac
128
- done < <(find "$task_dir" -type f -name '*.json' 2>/dev/null)
129
-
130
- # Build progress bar
131
- if [[ $total -gt 0 ]]; then
132
- pct=$((completed * 100 / total))
133
- bar_width=20
134
- filled=$((pct * bar_width / 100))
135
- empty=$((bar_width - filled))
136
- bar="${GREEN}"
137
- for ((i=0; i<filled; i++)); do bar+="█"; done
138
- bar+="${DIM}"
139
- for ((i=0; i<empty; i++)); do bar+="░"; done
140
- bar+="${RESET}"
141
-
142
- echo -e " ${BLUE}●${RESET} ${BOLD}${task_team}${RESET} ${bar} ${pct}% ${DIM}(${completed}/${total} done)${RESET}"
143
-
144
- # Show breakdown if there are active tasks
145
- details=""
146
- [[ $in_progress -gt 0 ]] && details+="${GREEN}${in_progress} active${RESET} "
147
- [[ $pending -gt 0 ]] && details+="${YELLOW}${pending} pending${RESET} "
148
- [[ $completed -gt 0 ]] && details+="${DIM}${completed} done${RESET}"
149
- [[ -n "$details" ]] && echo -e " ${DIM}└─${RESET} ${details}"
150
- else
151
- echo -e " ${DIM}●${RESET} ${BOLD}${task_team}${RESET} ${DIM}(no tasks)${RESET}"
152
- fi
153
- done < <(find "$TASKS_DIR" -mindepth 1 -maxdepth 1 -type d 2>/dev/null | sort)
154
- fi
155
-
156
- if ! $HAS_TASKS; then
157
- echo -e " ${DIM}No task lists found.${RESET}"
158
- fi
159
-
160
- # ─── Footer ──────────────────────────────────────────────────────────────────
161
-
162
- echo ""
163
- echo -e "${DIM} ──────────────────────────────────────────${RESET}"
164
- if $HAS_CLAUDE_WINDOWS || $HAS_TEAMS || $HAS_TASKS; then
165
- echo -e " ${DIM}Clean up:${RESET} ${CYAN}shipwright cleanup${RESET} ${DIM}|${RESET} ${DIM}New session:${RESET} ${CYAN}shipwright session <name>${RESET}"
166
- else
167
- echo -e " ${DIM}No active teams. Start one:${RESET} ${CYAN}shipwright session <name>${RESET}"
168
- fi
169
- echo ""