shipwright-cli 2.3.0 → 2.3.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 (108) hide show
  1. package/README.md +3 -3
  2. package/dashboard/public/index.html +1 -1
  3. package/dashboard/src/core/api.test.ts +362 -0
  4. package/dashboard/src/core/router.test.ts +266 -0
  5. package/dashboard/src/core/state.test.ts +235 -0
  6. package/dashboard/src/core/ws.test.ts +216 -0
  7. package/dashboard/src/design/icons.test.ts +105 -0
  8. package/dashboard/src/design/tokens.test.ts +204 -0
  9. package/dashboard/tsconfig.json +1 -1
  10. package/dashboard/vitest.config.ts +27 -0
  11. package/package.json +10 -3
  12. package/scripts/lib/pipeline-stages.sh +59 -0
  13. package/scripts/sw +1 -1
  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 +230 -13
  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 +1 -1
  25. package/scripts/sw-connect.sh +1 -1
  26. package/scripts/sw-context.sh +1 -1
  27. package/scripts/sw-cost.sh +1 -1
  28. package/scripts/sw-daemon.sh +1 -1
  29. package/scripts/sw-dashboard.sh +1 -1
  30. package/scripts/sw-db.sh +1 -1
  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-doc-fleet.sh +1 -1
  36. package/scripts/sw-docs-agent.sh +1 -1
  37. package/scripts/sw-docs.sh +1 -1
  38. package/scripts/sw-doctor.sh +1 -1
  39. package/scripts/sw-dora.sh +1 -1
  40. package/scripts/sw-durable.sh +1 -1
  41. package/scripts/sw-e2e-orchestrator.sh +1 -1
  42. package/scripts/sw-eventbus.sh +1 -1
  43. package/scripts/sw-feedback.sh +1 -1
  44. package/scripts/sw-fix.sh +1 -1
  45. package/scripts/sw-fleet-discover.sh +1 -1
  46. package/scripts/sw-fleet-viz.sh +1 -1
  47. package/scripts/sw-fleet.sh +1 -1
  48. package/scripts/sw-github-app.sh +1 -1
  49. package/scripts/sw-github-checks.sh +1 -1
  50. package/scripts/sw-github-deploy.sh +1 -1
  51. package/scripts/sw-github-graphql.sh +1 -1
  52. package/scripts/sw-guild.sh +1 -1
  53. package/scripts/sw-heartbeat.sh +1 -1
  54. package/scripts/sw-hygiene.sh +1 -1
  55. package/scripts/sw-incident.sh +1 -1
  56. package/scripts/sw-init.sh +1 -1
  57. package/scripts/sw-instrument.sh +1 -1
  58. package/scripts/sw-intelligence.sh +1 -1
  59. package/scripts/sw-jira.sh +1 -1
  60. package/scripts/sw-launchd.sh +1 -1
  61. package/scripts/sw-linear.sh +1 -1
  62. package/scripts/sw-logs.sh +1 -1
  63. package/scripts/sw-loop.sh +1 -1
  64. package/scripts/sw-memory.sh +1 -1
  65. package/scripts/sw-mission-control.sh +1 -1
  66. package/scripts/sw-model-router.sh +1 -1
  67. package/scripts/sw-otel.sh +1 -1
  68. package/scripts/sw-oversight.sh +1 -1
  69. package/scripts/sw-pipeline-composer.sh +1 -1
  70. package/scripts/sw-pipeline-vitals.sh +1 -1
  71. package/scripts/sw-pipeline.sh +1 -1
  72. package/scripts/sw-pm.sh +1 -1
  73. package/scripts/sw-pr-lifecycle.sh +1 -1
  74. package/scripts/sw-predictive.sh +1 -1
  75. package/scripts/sw-prep.sh +1 -1
  76. package/scripts/sw-ps.sh +1 -1
  77. package/scripts/sw-public-dashboard.sh +1 -1
  78. package/scripts/sw-quality.sh +1 -1
  79. package/scripts/sw-reaper.sh +1 -1
  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 +4 -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 +99 -1
  89. package/scripts/sw-session.sh +1 -1
  90. package/scripts/sw-setup.sh +1 -1
  91. package/scripts/sw-standup.sh +1 -1
  92. package/scripts/sw-status.sh +1 -1
  93. package/scripts/sw-strategic.sh +1 -1
  94. package/scripts/sw-stream.sh +1 -1
  95. package/scripts/sw-swarm.sh +1 -1
  96. package/scripts/sw-team-stages.sh +1 -1
  97. package/scripts/sw-templates.sh +1 -1
  98. package/scripts/sw-testgen.sh +1 -1
  99. package/scripts/sw-tmux-pipeline.sh +1 -1
  100. package/scripts/sw-tmux.sh +1 -1
  101. package/scripts/sw-trace.sh +1 -1
  102. package/scripts/sw-tracker.sh +1 -1
  103. package/scripts/sw-triage.sh +198 -11
  104. package/scripts/sw-upgrade.sh +1 -1
  105. package/scripts/sw-ux.sh +1 -1
  106. package/scripts/sw-webhook.sh +1 -1
  107. package/scripts/sw-widgets.sh +1 -1
  108. package/scripts/sw-worktree.sh +1 -1
@@ -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.3.0"
9
+ VERSION="2.3.1"
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.3.0"
9
+ VERSION="2.3.1"
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.3.0"
9
+ VERSION="2.3.1"
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.3.0"
9
+ VERSION="2.3.1"
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.3.0"
9
+ VERSION="2.3.1"
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.3.0"
9
+ VERSION="2.3.1"
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
  # ║ ║
9
9
  # ║ --deploy Detect platform and generate deployed.json template ║
10
10
  # ╚═══════════════════════════════════════════════════════════════════════════╝
11
- VERSION="2.3.0"
11
+ VERSION="2.3.1"
12
12
  set -euo pipefail
13
13
  trap 'echo "ERROR: $BASH_SOURCE:$LINENO exited with status $?" >&2' ERR
14
14
  trap 'rm -f "${tmp:-}"' EXIT
@@ -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.3.0"
9
+ VERSION="2.3.1"
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.3.0"
9
+ VERSION="2.3.1"
10
10
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
11
11
  REPO_DIR="${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.3.0"
9
+ VERSION="2.3.1"
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.3.0"
9
+ VERSION="2.3.1"
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.3.0"
9
+ VERSION="2.3.1"
10
10
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
11
11
  REPO_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
12
12
 
@@ -4,7 +4,7 @@
4
4
  # ║ ║
5
5
  # ║ Captures tmux pane scrollback and provides log browsing/search. ║
6
6
  # ╚═══════════════════════════════════════════════════════════════════════════╝
7
- VERSION="2.3.0"
7
+ VERSION="2.3.1"
8
8
  set -euo pipefail
9
9
  trap 'echo "ERROR: $BASH_SOURCE:$LINENO exited with status $?" >&2' ERR
10
10
 
@@ -71,7 +71,7 @@ MAX_RESTARTS=0
71
71
  SESSION_RESTART=false
72
72
  RESTART_COUNT=0
73
73
  REPO_OVERRIDE=""
74
- VERSION="2.3.0"
74
+ VERSION="2.3.1"
75
75
 
76
76
  # ─── Token Tracking ─────────────────────────────────────────────────────────
77
77
  LOOP_INPUT_TOKENS=0
@@ -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.3.0"
9
+ VERSION="2.3.1"
10
10
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
11
11
  REPO_DIR="${REPO_DIR:-$(cd "$SCRIPT_DIR/.." && pwd)}"
12
12
 
@@ -7,7 +7,7 @@
7
7
  set -euo pipefail
8
8
  trap 'echo "ERROR: $BASH_SOURCE:$LINENO exited with status $?" >&2' ERR
9
9
 
10
- VERSION="2.3.0"
10
+ VERSION="2.3.1"
11
11
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
12
12
  REPO_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
13
13
 
@@ -7,7 +7,7 @@
7
7
  set -euo pipefail
8
8
  trap 'echo "ERROR: $BASH_SOURCE:$LINENO exited with status $?" >&2' ERR
9
9
 
10
- VERSION="2.3.0"
10
+ VERSION="2.3.1"
11
11
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
12
12
  REPO_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
13
13
 
@@ -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.3.0"
9
+ VERSION="2.3.1"
10
10
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
11
11
  REPO_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
12
12
 
@@ -7,7 +7,7 @@
7
7
  set -euo pipefail
8
8
  trap 'echo "ERROR: $BASH_SOURCE:$LINENO exited with status $?" >&2' ERR
9
9
 
10
- VERSION="2.3.0"
10
+ VERSION="2.3.1"
11
11
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
12
12
  REPO_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
13
13
 
@@ -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.3.0"
9
+ VERSION="2.3.1"
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.3.0"
9
+ VERSION="2.3.1"
10
10
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
11
11
  REPO_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
12
12
 
@@ -11,7 +11,7 @@ unset CLAUDECODE 2>/dev/null || true
11
11
  # Ignore SIGHUP so tmux attach/detach doesn't kill long-running plan/design/review stages
12
12
  trap '' HUP
13
13
 
14
- VERSION="2.3.0"
14
+ VERSION="2.3.1"
15
15
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
16
16
  REPO_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
17
17
 
package/scripts/sw-pm.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.3.0"
9
+ VERSION="2.3.1"
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.3.0"
9
+ VERSION="2.3.1"
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.3.0"
9
+ VERSION="2.3.1"
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.3.0"
9
+ VERSION="2.3.1"
10
10
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
11
11
 
12
12
  # ─── Handle subcommands ───────────────────────────────────────────────────────
package/scripts/sw-ps.sh CHANGED
@@ -5,7 +5,7 @@
5
5
  # ║ Displays a table of agents running in claude-* tmux windows with ║
6
6
  # ║ PID, status, idle time, and pane references. ║
7
7
  # ╚═══════════════════════════════════════════════════════════════════════════╝
8
- VERSION="2.3.0"
8
+ VERSION="2.3.1"
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.3.0"
9
+ VERSION="2.3.1"
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.3.0"
9
+ VERSION="2.3.1"
10
10
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
11
11
  REPO_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
12
12
 
@@ -11,7 +11,7 @@
11
11
  # ║ shipwright reaper --watch Continuous loop (default: 5s) ║
12
12
  # ║ shipwright reaper --dry-run Preview what would be reaped ║
13
13
  # ╚═══════════════════════════════════════════════════════════════════════════╝
14
- VERSION="2.3.0"
14
+ VERSION="2.3.1"
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.3.0"
9
+ VERSION="2.3.1"
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.3.0"
9
+ VERSION="2.3.1"
10
10
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
11
11
  REPO_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
12
12
 
@@ -7,7 +7,7 @@ set -euo pipefail
7
7
  trap 'echo "ERROR: $BASH_SOURCE:$LINENO exited with status $?" >&2' ERR
8
8
  trap 'rm -f "${tmp_file:-}"' EXIT
9
9
 
10
- VERSION="2.3.0"
10
+ VERSION="2.3.1"
11
11
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
12
12
  REPO_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
13
13
 
@@ -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.3.0"
9
+ VERSION="2.3.1"
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.3.0"
9
+ VERSION="2.3.1"
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.3.0"
9
+ VERSION="2.3.1"
10
10
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
11
11
 
12
12
  # ─── Cross-platform compatibility ──────────────────────────────────────────
@@ -465,6 +465,9 @@ cmd_run() {
465
465
  # Generate report
466
466
  generate_retro_report "$from_date" "$to_date" "$analysis" "$agent_perf" "$velocity"
467
467
 
468
+ # Feed retro into self-optimization loop (|| true to avoid breaking retro if optimization unavailable)
469
+ [[ -f "$SCRIPT_DIR/sw-self-optimize.sh" ]] && "$SCRIPT_DIR/sw-self-optimize.sh" ingest-retro || true
470
+
468
471
  # Offer to create issues
469
472
  if command -v gh &>/dev/null; then
470
473
  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.3.0"
9
+ VERSION="2.3.1"
10
10
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
11
11
 
12
12
  # ─── Dependency check ─────────────────────────────────────────────────────────
@@ -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.3.0"
9
+ VERSION="2.3.1"
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.3.0"
9
+ VERSION="2.3.1"
10
10
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
11
11
  REPO_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
12
12
 
@@ -206,6 +206,100 @@ optimize_analyze_outcome() {
206
206
  success "Outcome recorded for issue #${issue_number:-unknown} (${result:-unknown})"
207
207
  }
208
208
 
209
+ # ═════════════════════════════════════════════════════════════════════════════
210
+ # RETRO INGEST
211
+ # ═════════════════════════════════════════════════════════════════════════════
212
+
213
+ # optimize_ingest_retro
214
+ # Read most recent retro JSON, append summary to outcomes, adjust template weights
215
+ optimize_ingest_retro() {
216
+ local retros_dir="${HOME}/.shipwright/retros"
217
+
218
+ if [[ ! -d "$retros_dir" ]]; then
219
+ return 0
220
+ fi
221
+
222
+ local latest_retro
223
+ latest_retro=$(ls -t "$retros_dir"/retro-*.json 2>/dev/null | head -1)
224
+ [[ -z "$latest_retro" || ! -f "$latest_retro" ]] && return 0
225
+
226
+ if ! command -v jq &>/dev/null; then
227
+ warn "jq required for retro ingest — skipping"
228
+ return 0
229
+ fi
230
+
231
+ ensure_optimization_dir
232
+
233
+ # Extract metrics from retro JSON
234
+ local analysis_json
235
+ analysis_json=$(jq -r '.analysis // {}' "$latest_retro" 2>/dev/null || echo "{}")
236
+ [[ -z "$analysis_json" || "$analysis_json" == "null" ]] && return 0
237
+
238
+ local success_rate avg_duration slowest_stage quality_score retries from_date to_date
239
+ success_rate=$(echo "$analysis_json" | jq -r 'if .pipelines > 0 then ((.succeeded // 0) / .pipelines * 100) | floor else 0 end' 2>/dev/null || echo "0")
240
+ avg_duration=$(echo "$analysis_json" | jq -r '.avg_duration // 0' 2>/dev/null || echo "0")
241
+ slowest_stage=$(echo "$analysis_json" | jq -r '.slowest_stage // ""' 2>/dev/null || echo "")
242
+ quality_score=$(echo "$analysis_json" | jq -r '.quality_score // 0' 2>/dev/null || echo "0")
243
+ retries=$(echo "$analysis_json" | jq -r '.retries // 0' 2>/dev/null || echo "0")
244
+ from_date=$(jq -r '.from_date // ""' "$latest_retro" 2>/dev/null || echo "")
245
+ to_date=$(jq -r '.to_date // ""' "$latest_retro" 2>/dev/null || echo "")
246
+
247
+ # Append retro_summary to outcomes.jsonl
248
+ local retro_record
249
+ retro_record=$(jq -c -n \
250
+ --arg ts "$(now_iso)" \
251
+ --argjson success_rate "${success_rate:-0}" \
252
+ --argjson avg_duration "${avg_duration:-0}" \
253
+ --arg slowest_stage "${slowest_stage:-}" \
254
+ --argjson quality_score "${quality_score:-0}" \
255
+ --argjson retries "${retries:-0}" \
256
+ --arg from_date "${from_date:-}" \
257
+ --arg to_date "${to_date:-}" \
258
+ '{
259
+ ts: $ts,
260
+ type: "retro_summary",
261
+ success_rate: $success_rate,
262
+ avg_duration: $avg_duration,
263
+ slowest_stage: $slowest_stage,
264
+ quality_score: $quality_score,
265
+ retries: $retries,
266
+ from_date: $from_date,
267
+ to_date: $to_date
268
+ }')
269
+ echo "$retro_record" >> "$OUTCOMES_FILE"
270
+
271
+ # Adjust template weights when quality is low — boost templates with stronger performance
272
+ # (success_rate in .weights is avg weight; values > 1.0 indicate above-average success)
273
+ if [[ "${quality_score:-0}" -lt 70 ]] && [[ -f "$TEMPLATE_WEIGHTS_FILE" ]]; then
274
+ info "Quality score low (${quality_score}) — boosting templates with stronger quality gates"
275
+ local tmp_weights
276
+ tmp_weights=$(mktemp "${TEMPLATE_WEIGHTS_FILE}.tmp.XXXXXX")
277
+ trap "rm -f '$tmp_weights'" RETURN
278
+ if jq '
279
+ if .weights then
280
+ .weights |= with_entries(
281
+ if (.value.success_rate >= 1.2) and (.value.raw_weights != null) then
282
+ .value.raw_weights |= with_entries(.value = ((.value * 1.15) | if . > 2.0 then 2.0 else . end))
283
+ else . end
284
+ )
285
+ else . end
286
+ ' "$TEMPLATE_WEIGHTS_FILE" > "$tmp_weights" 2>/dev/null && [[ -s "$tmp_weights" ]]; then
287
+ mv "$tmp_weights" "$TEMPLATE_WEIGHTS_FILE"
288
+ else
289
+ rm -f "$tmp_weights"
290
+ fi
291
+ fi
292
+
293
+ type rotate_jsonl &>/dev/null 2>&1 && rotate_jsonl "$OUTCOMES_FILE" 10000
294
+
295
+ emit_event "optimize.retro_ingested" \
296
+ "success_rate=${success_rate:-0}" \
297
+ "quality_score=${quality_score:-0}" \
298
+ "slowest_stage=${slowest_stage:-}"
299
+
300
+ success "Retro ingested from $(basename "$latest_retro")"
301
+ }
302
+
209
303
  # ═════════════════════════════════════════════════════════════════════════════
210
304
  # TEMPLATE TUNING
211
305
  # ═════════════════════════════════════════════════════════════════════════════
@@ -233,6 +327,8 @@ optimize_tune_templates() {
233
327
 
234
328
  # Extract template, labels, result from each outcome line
235
329
  while IFS= read -r line; do
330
+ # Skip retro_summary and other non-pipeline outcome lines
331
+ [[ "$(echo "$line" | jq -r '.type // ""' 2>/dev/null)" == "retro_summary" ]] && continue
236
332
  local template result labels_str
237
333
  template=$(echo "$line" | jq -r '.template // "unknown"' 2>/dev/null) || continue
238
334
  result=$(echo "$line" | jq -r '.result // "unknown"' 2>/dev/null) || continue
@@ -1176,6 +1272,7 @@ show_help() {
1176
1272
  echo " analyze-outcome <state-file> Analyze a completed pipeline outcome"
1177
1273
  echo " tune Run full optimization analysis"
1178
1274
  echo " report Show optimization report (last 7 days)"
1275
+ echo " ingest-retro Ingest most recent retro into optimization loop"
1179
1276
  echo " evolve-memory Prune/strengthen/promote memory patterns"
1180
1277
  echo " help Show this help"
1181
1278
  echo ""
@@ -1197,6 +1294,7 @@ main() {
1197
1294
  case "$cmd" in
1198
1295
  analyze-outcome) optimize_analyze_outcome "$@" ;;
1199
1296
  tune) optimize_full_analysis ;;
1297
+ ingest-retro) optimize_ingest_retro ;;
1200
1298
  report) optimize_report ;;
1201
1299
  evolve-memory) optimize_evolve_memory ;;
1202
1300
  help|--help|-h) show_help ;;
@@ -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.3.0"
11
+ VERSION="2.3.1"
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.3.0"
13
+ VERSION="2.3.1"
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.3.0"
9
+ VERSION="2.3.1"
10
10
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
11
11
  REPO_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
12
12
 
@@ -4,7 +4,7 @@
4
4
  # ║ ║
5
5
  # ║ Shows running teams, agent windows, and task progress. ║
6
6
  # ╚═══════════════════════════════════════════════════════════════════════════╝
7
- VERSION="2.3.0"
7
+ VERSION="2.3.1"
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.3.0"
10
+ VERSION="2.3.1"
11
11
 
12
12
  # ─── Paths (set defaults if not provided by parent) ──────────────────────────
13
13
  SCRIPT_DIR="${SCRIPT_DIR:-$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)}"
@@ -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.3.0"
8
+ VERSION="2.3.1"
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.3.0"
9
+ VERSION="2.3.1"
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.3.0"
9
+ VERSION="2.3.1"
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.3.0"
8
+ VERSION="2.3.1"
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.3.0"
9
+ VERSION="2.3.1"
10
10
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
11
11
 
12
12
  # ─── Handle subcommands ───────────────────────────────────────────────────────