shipwright-cli 2.2.2 → 2.3.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 (143) hide show
  1. package/README.md +12 -11
  2. package/dashboard/public/index.html +224 -8
  3. package/dashboard/public/styles.css +1078 -4
  4. package/dashboard/server.ts +1100 -15
  5. package/dashboard/src/canvas/interactions.ts +74 -0
  6. package/dashboard/src/canvas/layout.ts +85 -0
  7. package/dashboard/src/canvas/overlays.ts +117 -0
  8. package/dashboard/src/canvas/particles.ts +105 -0
  9. package/dashboard/src/canvas/renderer.ts +191 -0
  10. package/dashboard/src/components/charts/bar.ts +54 -0
  11. package/dashboard/src/components/charts/donut.ts +25 -0
  12. package/dashboard/src/components/charts/pipeline-rail.ts +105 -0
  13. package/dashboard/src/components/charts/sparkline.ts +82 -0
  14. package/dashboard/src/components/header.ts +616 -0
  15. package/dashboard/src/components/modal.ts +413 -0
  16. package/dashboard/src/components/terminal.ts +144 -0
  17. package/dashboard/src/core/api.ts +381 -0
  18. package/dashboard/src/core/helpers.ts +118 -0
  19. package/dashboard/src/core/router.ts +190 -0
  20. package/dashboard/src/core/sse.ts +38 -0
  21. package/dashboard/src/core/state.ts +150 -0
  22. package/dashboard/src/core/ws.ts +143 -0
  23. package/dashboard/src/design/icons.ts +131 -0
  24. package/dashboard/src/design/tokens.ts +160 -0
  25. package/dashboard/src/main.ts +68 -0
  26. package/dashboard/src/types/api.ts +337 -0
  27. package/dashboard/src/views/activity.ts +185 -0
  28. package/dashboard/src/views/agent-cockpit.ts +236 -0
  29. package/dashboard/src/views/agents.ts +72 -0
  30. package/dashboard/src/views/fleet-map.ts +299 -0
  31. package/dashboard/src/views/insights.ts +298 -0
  32. package/dashboard/src/views/machines.ts +162 -0
  33. package/dashboard/src/views/metrics.ts +420 -0
  34. package/dashboard/src/views/overview.ts +409 -0
  35. package/dashboard/src/views/pipeline-theater.ts +219 -0
  36. package/dashboard/src/views/pipelines.ts +595 -0
  37. package/dashboard/src/views/team.ts +362 -0
  38. package/dashboard/src/views/timeline.ts +389 -0
  39. package/dashboard/tsconfig.json +21 -0
  40. package/docs/AGI-WHATS-NEXT.md +15 -15
  41. package/package.json +8 -1
  42. package/scripts/lib/helpers.sh +30 -0
  43. package/scripts/lib/pipeline-quality-checks.sh +1 -1
  44. package/scripts/sw +86 -167
  45. package/scripts/sw-activity.sh +1 -1
  46. package/scripts/sw-adaptive.sh +1 -1
  47. package/scripts/sw-adversarial.sh +1 -1
  48. package/scripts/sw-architecture-enforcer.sh +1 -1
  49. package/scripts/sw-auth.sh +14 -6
  50. package/scripts/sw-autonomous.sh +1 -1
  51. package/scripts/sw-changelog.sh +2 -2
  52. package/scripts/sw-checkpoint.sh +1 -1
  53. package/scripts/sw-ci.sh +1 -1
  54. package/scripts/sw-cleanup.sh +1 -1
  55. package/scripts/sw-code-review.sh +1 -1
  56. package/scripts/sw-connect.sh +1 -1
  57. package/scripts/sw-context.sh +1 -1
  58. package/scripts/sw-cost.sh +1 -1
  59. package/scripts/sw-daemon.sh +2 -2
  60. package/scripts/sw-dashboard.sh +1 -1
  61. package/scripts/sw-db.sh +1 -1
  62. package/scripts/sw-decompose.sh +1 -1
  63. package/scripts/sw-deps.sh +1 -1
  64. package/scripts/sw-developer-simulation.sh +1 -1
  65. package/scripts/sw-discovery.sh +1 -1
  66. package/scripts/sw-doc-fleet.sh +1 -1
  67. package/scripts/sw-docs-agent.sh +1 -1
  68. package/scripts/sw-docs.sh +1 -1
  69. package/scripts/sw-doctor.sh +8 -1
  70. package/scripts/sw-dora.sh +1 -1
  71. package/scripts/sw-durable.sh +1 -1
  72. package/scripts/sw-e2e-orchestrator.sh +1 -1
  73. package/scripts/sw-eventbus.sh +1 -1
  74. package/scripts/sw-feedback.sh +1 -1
  75. package/scripts/sw-fix.sh +6 -5
  76. package/scripts/sw-fleet-discover.sh +1 -1
  77. package/scripts/sw-fleet-viz.sh +1 -1
  78. package/scripts/sw-fleet.sh +1 -1
  79. package/scripts/sw-github-app.sh +5 -2
  80. package/scripts/sw-github-checks.sh +1 -1
  81. package/scripts/sw-github-deploy.sh +1 -1
  82. package/scripts/sw-github-graphql.sh +1 -1
  83. package/scripts/sw-guild.sh +1 -1
  84. package/scripts/sw-heartbeat.sh +1 -1
  85. package/scripts/sw-hygiene.sh +1 -1
  86. package/scripts/sw-incident.sh +1 -1
  87. package/scripts/sw-init.sh +112 -9
  88. package/scripts/sw-instrument.sh +6 -1
  89. package/scripts/sw-intelligence.sh +5 -1
  90. package/scripts/sw-jira.sh +1 -1
  91. package/scripts/sw-launchd.sh +1 -1
  92. package/scripts/sw-linear.sh +20 -9
  93. package/scripts/sw-logs.sh +1 -1
  94. package/scripts/sw-loop.sh +2 -1
  95. package/scripts/sw-memory.sh +10 -1
  96. package/scripts/sw-mission-control.sh +1 -1
  97. package/scripts/sw-model-router.sh +4 -1
  98. package/scripts/sw-otel.sh +1 -1
  99. package/scripts/sw-oversight.sh +1 -1
  100. package/scripts/sw-pipeline-composer.sh +3 -1
  101. package/scripts/sw-pipeline-vitals.sh +4 -6
  102. package/scripts/sw-pipeline.sh +4 -1
  103. package/scripts/sw-pm.sh +5 -2
  104. package/scripts/sw-pr-lifecycle.sh +1 -1
  105. package/scripts/sw-predictive.sh +4 -1
  106. package/scripts/sw-prep.sh +3 -2
  107. package/scripts/sw-ps.sh +1 -1
  108. package/scripts/sw-public-dashboard.sh +10 -4
  109. package/scripts/sw-quality.sh +1 -1
  110. package/scripts/sw-reaper.sh +1 -1
  111. package/scripts/sw-recruit.sh +16 -0
  112. package/scripts/sw-regression.sh +2 -1
  113. package/scripts/sw-release-manager.sh +1 -1
  114. package/scripts/sw-release.sh +7 -5
  115. package/scripts/sw-remote.sh +1 -1
  116. package/scripts/sw-replay.sh +1 -1
  117. package/scripts/sw-retro.sh +1 -1
  118. package/scripts/sw-scale.sh +4 -1
  119. package/scripts/sw-security-audit.sh +1 -1
  120. package/scripts/sw-self-optimize.sh +15 -1
  121. package/scripts/sw-session.sh +1 -1
  122. package/scripts/sw-setup.sh +1 -1
  123. package/scripts/sw-standup.sh +2 -1
  124. package/scripts/sw-status.sh +1 -1
  125. package/scripts/sw-strategic.sh +2 -1
  126. package/scripts/sw-stream.sh +1 -1
  127. package/scripts/sw-swarm.sh +6 -1
  128. package/scripts/sw-team-stages.sh +1 -1
  129. package/scripts/sw-templates.sh +1 -1
  130. package/scripts/sw-testgen.sh +3 -2
  131. package/scripts/sw-tmux-pipeline.sh +2 -1
  132. package/scripts/sw-tmux.sh +1 -1
  133. package/scripts/sw-trace.sh +1 -1
  134. package/scripts/sw-tracker-jira.sh +1 -0
  135. package/scripts/sw-tracker-linear.sh +1 -0
  136. package/scripts/sw-tracker.sh +1 -1
  137. package/scripts/sw-triage.sh +1 -1
  138. package/scripts/sw-upgrade.sh +1 -1
  139. package/scripts/sw-ux.sh +1 -1
  140. package/scripts/sw-webhook.sh +1 -1
  141. package/scripts/sw-widgets.sh +2 -2
  142. package/scripts/sw-worktree.sh +1 -1
  143. package/dashboard/public/app.js +0 -4422
@@ -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.2.2"
9
+ VERSION="2.3.0"
10
10
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
11
11
 
12
12
  # ─── Dependency check ─────────────────────────────────────────────────────────
@@ -64,6 +64,7 @@ init_rules() {
64
64
  if [[ ! -f "$SCALE_RULES_FILE" ]]; then
65
65
  local tmp_file
66
66
  tmp_file=$(mktemp)
67
+ trap "rm -f '$tmp_file'" RETURN
67
68
  cat > "$tmp_file" << 'JSON'
68
69
  {
69
70
  "iteration_threshold": 3,
@@ -105,6 +106,7 @@ in_cooldown() {
105
106
  update_scale_state() {
106
107
  local tmp_file
107
108
  tmp_file=$(mktemp)
109
+ trap "rm -f '$tmp_file'" RETURN
108
110
 
109
111
  if [[ -f "$SCALE_STATE_FILE" ]]; then
110
112
  # Update existing state
@@ -241,6 +243,7 @@ cmd_rules() {
241
243
 
242
244
  local tmp_file
243
245
  tmp_file=$(mktemp)
246
+ trap "rm -f '$tmp_file'" RETURN
244
247
 
245
248
  jq --arg key "$key" --arg value "$value" \
246
249
  'if ($value | test("^[0-9]+$")) then
@@ -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.2.2"
9
+ VERSION="2.3.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.2.2"
9
+ VERSION="2.3.0"
10
10
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
11
11
  REPO_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
12
12
 
@@ -139,6 +139,7 @@ optimize_analyze_outcome() {
139
139
  # Build outcome record using jq for proper escaping
140
140
  local tmp_outcome
141
141
  tmp_outcome=$(mktemp)
142
+ trap "rm -f '$tmp_outcome'" RETURN
142
143
  jq -c -n \
143
144
  --arg ts "$(now_iso)" \
144
145
  --arg issue "${issue_number:-unknown}" \
@@ -228,6 +229,7 @@ optimize_tune_templates() {
228
229
  local tmp_stats tmp_weights
229
230
  tmp_stats=$(mktemp)
230
231
  tmp_weights=$(mktemp)
232
+ trap "rm -f '$tmp_stats' '$tmp_weights'" RETURN
231
233
 
232
234
  # Extract template, labels, result from each outcome line
233
235
  while IFS= read -r line; do
@@ -334,6 +336,7 @@ optimize_tune_templates() {
334
336
  # Atomic write
335
337
  local tmp_cw
336
338
  tmp_cw=$(mktemp "${TEMPLATE_WEIGHTS_FILE}.tmp.XXXXXX")
339
+ trap "rm -f '$tmp_cw'" RETURN
337
340
  echo "$consumer_weights" > "$tmp_cw" && mv "$tmp_cw" "$TEMPLATE_WEIGHTS_FILE" || rm -f "$tmp_cw"
338
341
  fi
339
342
 
@@ -380,6 +383,7 @@ optimize_learn_iterations() {
380
383
  tmp_med=$(mktemp)
381
384
  tmp_high=$(mktemp)
382
385
  tmp_all_pairs=$(mktemp)
386
+ trap "rm -f '$tmp_low' '$tmp_med' '$tmp_high' '$tmp_all_pairs'" RETURN
383
387
 
384
388
  while IFS= read -r line; do
385
389
  local complexity iterations
@@ -440,6 +444,7 @@ optimize_learn_iterations() {
440
444
  # Write boundaries back to config (atomic)
441
445
  local tmp_clusters
442
446
  tmp_clusters=$(mktemp "${TMPDIR:-/tmp}/sw-clusters.XXXXXX")
447
+ trap "rm -f '$tmp_clusters'" RETURN
443
448
  jq -n \
444
449
  --argjson low_max "$new_low" \
445
450
  --argjson med_max "$new_med" \
@@ -488,6 +493,7 @@ optimize_learn_iterations() {
488
493
  # Build iteration model (flat format for readers: .low, .medium, .high)
489
494
  local tmp_model
490
495
  tmp_model=$(mktemp "${ITERATION_MODEL_FILE}.tmp.XXXXXX")
496
+ trap "rm -f '$tmp_model'" RETURN
491
497
  jq -n \
492
498
  --argjson low "$low_stats" \
493
499
  --argjson medium "$med_stats" \
@@ -568,6 +574,7 @@ _optimize_apply_prediction_bias() {
568
574
  if [[ "$changed" == true ]]; then
569
575
  local tmp_model
570
576
  tmp_model=$(mktemp)
577
+ trap "rm -f '$tmp_model'" RETURN
571
578
  if echo "$updated_model" | jq '.' > "$tmp_model" 2>/dev/null && [[ -s "$tmp_model" ]]; then
572
579
  mv "$tmp_model" "$model_file"
573
580
  emit_event "optimize.prediction_bias_corrected"
@@ -609,6 +616,7 @@ optimize_route_models() {
609
616
  # Collect per-stage, per-model stats
610
617
  local tmp_stage_stats
611
618
  tmp_stage_stats=$(mktemp)
619
+ trap "rm -f '$tmp_stage_stats'" RETURN
612
620
 
613
621
  while IFS= read -r line; do
614
622
  local model result stages_arr
@@ -724,6 +732,7 @@ optimize_route_models() {
724
732
  # Atomic write
725
733
  local tmp_routing
726
734
  tmp_routing=$(mktemp "${MODEL_ROUTING_FILE}.tmp.XXXXXX")
735
+ trap "rm -f '$tmp_routing'" RETURN
727
736
  echo "$consumer_routing" > "$tmp_routing" && mv "$tmp_routing" "$MODEL_ROUTING_FILE" || rm -f "$tmp_routing"
728
737
 
729
738
  rm -f "$tmp_stage_stats" 2>/dev/null || true
@@ -798,6 +807,7 @@ optimize_learn_risk_keywords() {
798
807
  keywords=$(echo "$keywords" | jq 'to_entries | map(select(.value != 0)) | from_entries' 2>/dev/null || echo "$keywords")
799
808
  local tmp_risk
800
809
  tmp_risk=$(mktemp)
810
+ trap "rm -f '$tmp_risk'" RETURN
801
811
  if echo "$keywords" | jq '.' > "$tmp_risk" 2>/dev/null && [[ -s "$tmp_risk" ]]; then
802
812
  mv "$tmp_risk" "$risk_file"
803
813
  success "Risk keywords updated ($(echo "$keywords" | jq 'length' 2>/dev/null || echo '?') keywords)"
@@ -874,6 +884,7 @@ optimize_evolve_memory() {
874
884
 
875
885
  local tmp_file
876
886
  tmp_file=$(mktemp)
887
+ trap "rm -f '$tmp_file'" RETURN
877
888
 
878
889
  # Prune entries not seen within prune window
879
890
  local pruned_json
@@ -911,6 +922,7 @@ optimize_evolve_memory() {
911
922
  # Collect all patterns across repos
912
923
  local tmp_all_patterns
913
924
  tmp_all_patterns=$(mktemp)
925
+ trap "rm -f '$tmp_all_patterns'" RETURN
914
926
  for repo_dir in "$memory_root"/*/; do
915
927
  [[ -d "$repo_dir" ]] || continue
916
928
  local failures_file="${repo_dir}failures.json"
@@ -926,6 +938,7 @@ optimize_evolve_memory() {
926
938
  if [[ -n "$promoted_patterns" ]]; then
927
939
  local tmp_global
928
940
  tmp_global=$(mktemp)
941
+ trap "rm -f '$tmp_global'" RETURN
929
942
  local pcount=0
930
943
  while IFS= read -r pattern; do
931
944
  [[ -z "$pattern" ]] && continue
@@ -1132,6 +1145,7 @@ optimize_adjust_audit_intensity() {
1132
1145
  info "Quality trend: ${trend} (avg: ${avg_quality}) — increasing audit intensity"
1133
1146
  local tmp_dc
1134
1147
  tmp_dc=$(mktemp "${daemon_config}.tmp.XXXXXX")
1148
+ trap "rm -f '$tmp_dc'" RETURN
1135
1149
  jq '.intelligence.adversarial_enabled = true | .intelligence.architecture_enabled = true' \
1136
1150
  "$daemon_config" > "$tmp_dc" 2>/dev/null && mv "$tmp_dc" "$daemon_config" || rm -f "$tmp_dc"
1137
1151
  emit_event "optimize.audit_intensity" \
@@ -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.2.2"
11
+ VERSION="2.3.0"
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.2.2"
13
+ VERSION="2.3.0"
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.2.2"
9
+ VERSION="2.3.0"
10
10
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
11
11
  REPO_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
12
12
 
@@ -503,6 +503,7 @@ cmd_notify() {
503
503
  if [[ -z "$message_file" ]]; then
504
504
  # Generate a digest
505
505
  message_file=$(mktemp)
506
+ trap "rm -f '$message_file'" RETURN
506
507
  cmd_digest > "$message_file" 2>&1 || true
507
508
  fi
508
509
 
@@ -4,7 +4,7 @@
4
4
  # ║ ║
5
5
  # ║ Shows running teams, agent windows, and task progress. ║
6
6
  # ╚═══════════════════════════════════════════════════════════════════════════╝
7
- VERSION="2.2.2"
7
+ VERSION="2.3.0"
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.2.2"
10
+ VERSION="2.3.0"
11
11
 
12
12
  # ─── Paths (set defaults if not provided by parent) ──────────────────────────
13
13
  SCRIPT_DIR="${SCRIPT_DIR:-$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)}"
@@ -423,6 +423,7 @@ strategic_call_api() {
423
423
 
424
424
  local tmp_prompt
425
425
  tmp_prompt=$(mktemp)
426
+ trap "rm -f '$tmp_prompt'" RETURN
426
427
  printf '%s' "$prompt" > "$tmp_prompt"
427
428
 
428
429
  local response_text
@@ -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.2.2"
8
+ VERSION="2.3.0"
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.2.2"
9
+ VERSION="2.3.0"
10
10
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
11
11
  REPO_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
12
12
 
@@ -60,6 +60,7 @@ init_config() {
60
60
  if [[ ! -f "$CONFIG_FILE" ]]; then
61
61
  local tmp_file
62
62
  tmp_file=$(mktemp)
63
+ trap "rm -f '$tmp_file'" RETURN
63
64
  cat > "$tmp_file" << 'JSON'
64
65
  {
65
66
  "auto_scaling_enabled": false,
@@ -85,6 +86,7 @@ init_registry() {
85
86
  if [[ ! -f "$REGISTRY_FILE" ]]; then
86
87
  local tmp_file
87
88
  tmp_file=$(mktemp)
89
+ trap "rm -f '$tmp_file'" RETURN
88
90
  cat > "$tmp_file" << 'JSON'
89
91
  {
90
92
  "agents": [],
@@ -173,6 +175,7 @@ cmd_spawn() {
173
175
  # Add agent to registry
174
176
  local tmp_file
175
177
  tmp_file=$(mktemp)
178
+ trap "rm -f '$tmp_file'" RETURN
176
179
 
177
180
  jq --arg agent_id "$agent_id" \
178
181
  --arg agent_type "$agent_type" \
@@ -254,6 +257,7 @@ cmd_retire() {
254
257
  # Mark as retiring / remove from registry
255
258
  local tmp_file
256
259
  tmp_file=$(mktemp)
260
+ trap "rm -f '$tmp_file'" RETURN
257
261
 
258
262
  jq --arg aid "$agent_id" \
259
263
  '.agents |= map(select(.id != $aid)) | .active_count = ([.agents[] | select(.status == "active")] | length) | .last_updated = "'$(now_iso)'"' \
@@ -482,6 +486,7 @@ cmd_config() {
482
486
 
483
487
  local tmp_file
484
488
  tmp_file=$(mktemp)
489
+ trap "rm -f '$tmp_file'" RETURN
485
490
 
486
491
  jq --arg key "$key" --arg value "$value" \
487
492
  'if ($value | test("^[0-9]+$")) then
@@ -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.2.2"
9
+ VERSION="2.3.0"
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.2.2"
8
+ VERSION="2.3.0"
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.2.2"
9
+ VERSION="2.3.0"
10
10
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
11
11
 
12
12
  # ─── Handle subcommands ───────────────────────────────────────────────────────
@@ -87,7 +87,7 @@ show_help() {
87
87
  echo -e " ${DIM}shipwright testgen generate --threshold 75${RESET} # Generate with threshold"
88
88
  echo -e " ${DIM}shipwright testgen quality sw-pipeline-test.sh${RESET} # Score test quality"
89
89
  echo ""
90
- echo -e "${DIM}Docs: https://sethdford.github.io/shipwright${RESET}"
90
+ echo -e "${DIM}Docs: $(_sw_docs_url)${RESET}"
91
91
  }
92
92
 
93
93
  # ═══════════════════════════════════════════════════════════════════════════════
@@ -241,6 +241,7 @@ EOF
241
241
  func_snippet=$(awk "/^${func}\(\\)/,/^[a-zA-Z_][a-zA-Z0-9_]*\(\)|^$/" "$target_script" 2>/dev/null | head -40 || true)
242
242
  local prompt_file
243
243
  prompt_file=$(mktemp "${TMPDIR:-/tmp}/sw-testgen-prompt.XXXXXX")
244
+ trap "rm -f '$prompt_file'" RETURN
244
245
  {
245
246
  echo "Generate a bash test function for the following shell function. Use real assertions (assert_equal, assert_contains, or test exit code). Test happy path and at least one edge or error case. Output only the bash function body."
246
247
  echo "Function name: ${func}"
@@ -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.2.2"
9
+ VERSION="2.3.0"
10
10
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
11
11
  REPO_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
12
12
 
@@ -118,6 +118,7 @@ cmd_spawn() {
118
118
 
119
119
  local tmp_file
120
120
  tmp_file=$(mktemp)
121
+ trap "rm -f '$tmp_file'" RETURN
121
122
  cat > "$tmp_file" << EOF
122
123
  {
123
124
  "job_id": "pipeline-${issue_num}",
@@ -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.2.2"
14
+ VERSION="2.3.0"
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.2.2"
9
+ VERSION="2.3.0"
10
10
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
11
11
  REPO_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
12
12
 
@@ -105,6 +105,7 @@ provider_discover_statuses() {
105
105
  mkdir -p "$cache_dir"
106
106
  local tmp_cache
107
107
  tmp_cache=$(mktemp)
108
+ trap "rm -f '$tmp_cache'" RETURN
108
109
  jq -n \
109
110
  --arg ts "$(date +%s)" \
110
111
  --arg in_progress "${discovered_in_progress:-}" \
@@ -115,6 +115,7 @@ provider_discover_statuses() {
115
115
  mkdir -p "$cache_dir"
116
116
  local tmp_cache
117
117
  tmp_cache=$(mktemp)
118
+ trap "rm -f '$tmp_cache'" RETURN
118
119
  jq -n \
119
120
  --arg ts "$(date +%s)" \
120
121
  --arg backlog "${discovered_backlog:-}" \
@@ -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.2.2"
9
+ VERSION="2.3.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.2.2"
9
+ VERSION="2.3.0"
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.2.2"
5
+ VERSION="2.3.0"
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.2.2"
9
+ VERSION="2.3.0"
10
10
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
11
11
 
12
12
  # ─── Cross-platform compatibility ──────────────────────────────────────────
@@ -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.2.2"
9
+ VERSION="2.3.0"
10
10
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
11
11
 
12
12
  # ─── Cross-platform compatibility ──────────────────────────────────────────
@@ -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.2.2"
11
+ VERSION="2.3.0"
12
12
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
13
13
  REPO_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
14
14
 
@@ -357,7 +357,7 @@ To add these badges to your README.md:
357
357
  \`\`\`
358
358
 
359
359
  ---
360
- Generated by [Shipwright](https://github.com/sethdford/shipwright)
360
+ Generated by [Shipwright]($(_sw_github_url))
361
361
  EOF
362
362
  }
363
363
 
@@ -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.2.2"
8
+ VERSION="2.3.0"
9
9
  set -euo pipefail
10
10
  trap 'echo "ERROR: $BASH_SOURCE:$LINENO exited with status $?" >&2' ERR
11
11