shipwright-cli 2.2.1 → 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.
- package/README.md +19 -19
- package/dashboard/public/index.html +224 -8
- package/dashboard/public/styles.css +1078 -4
- package/dashboard/server.ts +1100 -15
- package/dashboard/src/canvas/interactions.ts +74 -0
- package/dashboard/src/canvas/layout.ts +85 -0
- package/dashboard/src/canvas/overlays.ts +117 -0
- package/dashboard/src/canvas/particles.ts +105 -0
- package/dashboard/src/canvas/renderer.ts +191 -0
- package/dashboard/src/components/charts/bar.ts +54 -0
- package/dashboard/src/components/charts/donut.ts +25 -0
- package/dashboard/src/components/charts/pipeline-rail.ts +105 -0
- package/dashboard/src/components/charts/sparkline.ts +82 -0
- package/dashboard/src/components/header.ts +616 -0
- package/dashboard/src/components/modal.ts +413 -0
- package/dashboard/src/components/terminal.ts +144 -0
- package/dashboard/src/core/api.ts +381 -0
- package/dashboard/src/core/helpers.ts +118 -0
- package/dashboard/src/core/router.ts +190 -0
- package/dashboard/src/core/sse.ts +38 -0
- package/dashboard/src/core/state.ts +150 -0
- package/dashboard/src/core/ws.ts +143 -0
- package/dashboard/src/design/icons.ts +131 -0
- package/dashboard/src/design/tokens.ts +160 -0
- package/dashboard/src/main.ts +68 -0
- package/dashboard/src/types/api.ts +337 -0
- package/dashboard/src/views/activity.ts +185 -0
- package/dashboard/src/views/agent-cockpit.ts +236 -0
- package/dashboard/src/views/agents.ts +72 -0
- package/dashboard/src/views/fleet-map.ts +299 -0
- package/dashboard/src/views/insights.ts +298 -0
- package/dashboard/src/views/machines.ts +162 -0
- package/dashboard/src/views/metrics.ts +420 -0
- package/dashboard/src/views/overview.ts +409 -0
- package/dashboard/src/views/pipeline-theater.ts +219 -0
- package/dashboard/src/views/pipelines.ts +595 -0
- package/dashboard/src/views/team.ts +362 -0
- package/dashboard/src/views/timeline.ts +389 -0
- package/dashboard/tsconfig.json +21 -0
- package/docs/AGI-PLATFORM-PLAN.md +5 -5
- package/docs/AGI-WHATS-NEXT.md +19 -16
- package/docs/README.md +2 -0
- package/package.json +8 -1
- package/scripts/check-version-consistency.sh +72 -0
- package/scripts/lib/daemon-adaptive.sh +610 -0
- package/scripts/lib/daemon-dispatch.sh +489 -0
- package/scripts/lib/daemon-failure.sh +387 -0
- package/scripts/lib/daemon-patrol.sh +1113 -0
- package/scripts/lib/daemon-poll.sh +1202 -0
- package/scripts/lib/daemon-state.sh +550 -0
- package/scripts/lib/daemon-triage.sh +490 -0
- package/scripts/lib/helpers.sh +81 -0
- package/scripts/lib/pipeline-intelligence.sh +0 -6
- package/scripts/lib/pipeline-quality-checks.sh +3 -1
- package/scripts/lib/pipeline-stages.sh +20 -0
- package/scripts/sw +109 -168
- package/scripts/sw-activity.sh +1 -1
- package/scripts/sw-adaptive.sh +2 -2
- package/scripts/sw-adversarial.sh +1 -1
- package/scripts/sw-architecture-enforcer.sh +1 -1
- package/scripts/sw-auth.sh +14 -6
- package/scripts/sw-autonomous.sh +1 -1
- package/scripts/sw-changelog.sh +2 -2
- 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 +1 -1
- package/scripts/sw-connect.sh +1 -1
- package/scripts/sw-context.sh +1 -1
- package/scripts/sw-cost.sh +1 -1
- package/scripts/sw-daemon.sh +53 -4817
- package/scripts/sw-dashboard.sh +1 -1
- package/scripts/sw-db.sh +1 -1
- 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-doc-fleet.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 +1 -1
- package/scripts/sw-fix.sh +6 -5
- package/scripts/sw-fleet-discover.sh +1 -1
- package/scripts/sw-fleet-viz.sh +3 -3
- package/scripts/sw-fleet.sh +1 -1
- package/scripts/sw-github-app.sh +5 -2
- package/scripts/sw-github-checks.sh +1 -1
- 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 +1 -1
- package/scripts/sw-init.sh +112 -9
- package/scripts/sw-instrument.sh +6 -1
- package/scripts/sw-intelligence.sh +5 -1
- package/scripts/sw-jira.sh +1 -1
- package/scripts/sw-launchd.sh +1 -1
- package/scripts/sw-linear.sh +20 -9
- package/scripts/sw-logs.sh +1 -1
- package/scripts/sw-loop.sh +2 -1
- package/scripts/sw-memory.sh +10 -1
- package/scripts/sw-mission-control.sh +1 -1
- package/scripts/sw-model-router.sh +4 -1
- package/scripts/sw-otel.sh +4 -4
- package/scripts/sw-oversight.sh +1 -1
- package/scripts/sw-pipeline-composer.sh +3 -1
- package/scripts/sw-pipeline-vitals.sh +4 -6
- package/scripts/sw-pipeline.sh +19 -56
- package/scripts/sw-pipeline.sh.mock +7 -0
- package/scripts/sw-pm.sh +5 -2
- package/scripts/sw-pr-lifecycle.sh +1 -1
- package/scripts/sw-predictive.sh +4 -1
- package/scripts/sw-prep.sh +3 -2
- package/scripts/sw-ps.sh +1 -1
- package/scripts/sw-public-dashboard.sh +10 -4
- package/scripts/sw-quality.sh +1 -1
- package/scripts/sw-reaper.sh +1 -1
- package/scripts/sw-recruit.sh +25 -1
- package/scripts/sw-regression.sh +2 -1
- package/scripts/sw-release-manager.sh +1 -1
- package/scripts/sw-release.sh +7 -5
- 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 +11 -5
- package/scripts/sw-security-audit.sh +1 -1
- package/scripts/sw-self-optimize.sh +172 -7
- package/scripts/sw-session.sh +1 -1
- package/scripts/sw-setup.sh +1 -1
- package/scripts/sw-standup.sh +4 -3
- package/scripts/sw-status.sh +1 -1
- package/scripts/sw-strategic.sh +2 -1
- package/scripts/sw-stream.sh +8 -2
- package/scripts/sw-swarm.sh +12 -10
- package/scripts/sw-team-stages.sh +1 -1
- package/scripts/sw-templates.sh +1 -1
- package/scripts/sw-testgen.sh +3 -2
- package/scripts/sw-tmux-pipeline.sh +2 -1
- package/scripts/sw-tmux.sh +1 -1
- package/scripts/sw-trace.sh +1 -1
- package/scripts/sw-tracker-jira.sh +1 -0
- package/scripts/sw-tracker-linear.sh +1 -0
- package/scripts/sw-tracker.sh +24 -6
- package/scripts/sw-triage.sh +1 -1
- package/scripts/sw-upgrade.sh +1 -1
- package/scripts/sw-ux.sh +1 -1
- package/scripts/sw-webhook.sh +1 -1
- package/scripts/sw-widgets.sh +2 -2
- package/scripts/sw-worktree.sh +1 -1
- package/dashboard/public/app.js +0 -4422
package/scripts/sw
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
# ╚═══════════════════════════════════════════════════════════════════════════╝
|
|
6
6
|
set -euo pipefail
|
|
7
7
|
|
|
8
|
-
VERSION="2.
|
|
8
|
+
VERSION="2.3.0"
|
|
9
9
|
|
|
10
10
|
# Resolve symlinks (required for npm global install where bin/ symlinks to node_modules/)
|
|
11
11
|
SOURCE="${BASH_SOURCE[0]}"
|
|
@@ -27,6 +27,19 @@ DIM='\033[2m'
|
|
|
27
27
|
BOLD='\033[1m'
|
|
28
28
|
RESET='\033[0m'
|
|
29
29
|
|
|
30
|
+
# ─── Project identity (auto-detect from git remote) ───────────────────────
|
|
31
|
+
_sw_github_repo() {
|
|
32
|
+
local url; url="$(git remote get-url origin 2>/dev/null || echo "")"
|
|
33
|
+
if [[ "$url" =~ github\.com[:/]([^/]+)/([^/.]+) ]]; then
|
|
34
|
+
echo "${BASH_REMATCH[1]}/${BASH_REMATCH[2]}"
|
|
35
|
+
else
|
|
36
|
+
echo "${SHIPWRIGHT_GITHUB_REPO:-sethdford/shipwright}"
|
|
37
|
+
fi
|
|
38
|
+
}
|
|
39
|
+
_sw_github_owner() { local r="$(_sw_github_repo)"; echo "${r%%/*}"; }
|
|
40
|
+
_sw_docs_url() { echo "${SHIPWRIGHT_DOCS_URL:-https://$(_sw_github_owner).github.io/shipwright}"; }
|
|
41
|
+
_sw_github_url() { echo "https://github.com/$(_sw_github_repo)"; }
|
|
42
|
+
|
|
30
43
|
# ─── Cross-platform compatibility ──────────────────────────────────────────
|
|
31
44
|
# shellcheck source=lib/compat.sh
|
|
32
45
|
[[ -f "$SCRIPT_DIR/lib/compat.sh" ]] && source "$SCRIPT_DIR/lib/compat.sh"
|
|
@@ -76,181 +89,85 @@ show_help() {
|
|
|
76
89
|
echo ""
|
|
77
90
|
echo -e "${BOLD}USAGE${RESET}"
|
|
78
91
|
echo -e " ${CYAN}shipwright${RESET} <command> [options] ${DIM}(also: sw, cct)${RESET}"
|
|
79
|
-
echo -e " ${CYAN}shipwright${RESET} <group> <subcommand> [options]"
|
|
80
92
|
echo ""
|
|
81
|
-
echo -e "${BOLD}
|
|
82
|
-
echo -e " ${CYAN}
|
|
83
|
-
echo -e " ${CYAN}
|
|
84
|
-
echo -e " ${CYAN}observe${RESET} <subcmd> ${DIM}Observability: vitals, dora, retro, stream, activity, replay${RESET}"
|
|
85
|
-
echo -e " ${CYAN}release${RESET} <subcmd> ${DIM}Release & deploy: release, release-manager, changelog, deploy${RESET}"
|
|
86
|
-
echo -e " ${CYAN}intel${RESET} <subcmd> ${DIM}Intelligence: predict, intelligence, strategic, optimize${RESET}"
|
|
87
|
-
echo ""
|
|
88
|
-
echo -e "${BOLD}CORE COMMANDS${RESET} ${DIM}(flat aliases for backwards compat)${RESET}"
|
|
89
|
-
echo -e " ${CYAN}session${RESET} [name] Create a new tmux window for a Claude team"
|
|
90
|
-
echo -e " ${CYAN}status${RESET} [--json] Show dashboard of running teams and agents"
|
|
91
|
-
echo -e " ${CYAN}mission-control|mc${RESET} Terminal-based pipeline mission control (drill-down, team tree, orchestration)"
|
|
92
|
-
echo -e " ${CYAN}ps${RESET} Show running agent processes and status"
|
|
93
|
-
echo -e " ${CYAN}logs${RESET} [team] [opts] View and search agent pane logs"
|
|
94
|
-
echo -e " ${CYAN}activity${RESET} [cmd] [opts] Live agent activity stream — watch Claude think"
|
|
95
|
-
echo -e " ${CYAN}templates${RESET} [list|show] Manage team composition templates"
|
|
93
|
+
echo -e "${BOLD}GETTING STARTED${RESET}"
|
|
94
|
+
echo -e " ${CYAN}init${RESET} One-command setup — tmux, CLI, templates, hooks"
|
|
95
|
+
echo -e " ${CYAN}setup${RESET} Guided interactive setup"
|
|
96
96
|
echo -e " ${CYAN}doctor${RESET} Validate your setup and check for issues"
|
|
97
|
-
echo -e " ${CYAN}cleanup${RESET} [--force] Clean up orphaned team sessions"
|
|
98
|
-
echo -e " ${CYAN}reaper${RESET} [--watch] Automatic pane cleanup when agents exit"
|
|
99
|
-
echo -e " ${CYAN}upgrade${RESET} [--apply] Check for updates from the repo (dry-run by default)"
|
|
100
|
-
echo -e " ${CYAN}loop${RESET} \"goal\" [opts] ${BOLD}Continuous agent loop${RESET} — run until goal is achieved"
|
|
101
|
-
echo -e " ${CYAN}pipeline${RESET} <cmd> ${BOLD}Full delivery pipeline${RESET} — idea to production"
|
|
102
|
-
echo -e " ${CYAN}worktree${RESET} <cmd> Manage git worktrees for agent isolation"
|
|
103
|
-
echo -e " ${CYAN}prep${RESET} [options] ${BOLD}Repo preparation${RESET} — generate .claude/ configs for agents"
|
|
104
|
-
echo -e " ${CYAN}hygiene${RESET} <cmd> ${BOLD}Repo hygiene${RESET} — dead code, structure, deps, cleanup"
|
|
105
|
-
echo -e " ${CYAN}daemon${RESET} <cmd> ${BOLD}Issue watcher${RESET} — auto-process GitHub issues"
|
|
106
|
-
echo -e " ${CYAN}autonomous|auto${RESET} <cmd> ${BOLD}Autonomous loop${RESET} — AI-building-AI: analyze, create, build, learn"
|
|
107
|
-
echo -e " ${CYAN}memory${RESET} <cmd> ${BOLD}Persistent memory${RESET} — learn from every pipeline run"
|
|
108
|
-
echo -e " ${CYAN}guild${RESET} <cmd> ${BOLD}Knowledge guilds${RESET} — cross-team learning, shared patterns"
|
|
109
|
-
echo -e " ${CYAN}instrument${RESET} <cmd> ${BOLD}Pipeline instrumentation${RESET} — record predicted vs actual metrics"
|
|
110
|
-
echo -e " ${CYAN}cost${RESET} <cmd> ${BOLD}Cost intelligence${RESET} — track tokens, budgets, model routing"
|
|
111
|
-
echo -e " ${CYAN}adaptive${RESET} <cmd> ${BOLD}Adaptive tuning${RESET} — data-driven pipeline defaults from historical runs"
|
|
112
|
-
echo -e " ${CYAN}regression${RESET} <cmd> ${BOLD}Regression detection${RESET} — detect regressions after merge"
|
|
113
|
-
echo -e " ${CYAN}incident${RESET} <cmd> ${BOLD}Incident commander${RESET} — detect failures, triage, remediate"
|
|
114
|
-
echo -e " ${CYAN}db${RESET} <cmd> ${BOLD}SQLite persistence${RESET} — events, runs, developers, metrics"
|
|
115
|
-
echo -e " ${CYAN}deps${RESET} <cmd> ${BOLD}Dependency updates${RESET} — scan, classify, test, merge Dependabot/Renovate PRs"
|
|
116
|
-
echo -e " ${CYAN}fleet${RESET} <cmd> ${BOLD}Multi-repo fleet${RESET} — orchestrate daemons across repos"
|
|
117
|
-
echo -e " ${CYAN}fleet-viz${RESET} <cmd> ${BOLD}Fleet visualization${RESET} — cross-repo insights and queue"
|
|
118
|
-
echo -e " ${CYAN}fix${RESET} \"goal\" [opts] ${BOLD}Bulk fix${RESET} — apply a fix across multiple repos"
|
|
119
|
-
echo -e " ${CYAN}dashboard${RESET} <cmd> ${BOLD}Fleet Command${RESET} — real-time WebSocket dashboard"
|
|
120
|
-
echo -e " ${CYAN}public-dashboard${RESET} <cmd> ${BOLD}Public dashboard${RESET} — shareable pipeline progress (static HTML)"
|
|
121
|
-
echo -e " ${CYAN}share${RESET} [...] ${BOLD}Share pipeline${RESET} — alias for ${DIM}public-dashboard share${RESET}"
|
|
122
|
-
echo -e " ${CYAN}jira${RESET} <cmd> ${BOLD}Jira sync${RESET} — bidirectional issue sync with Jira"
|
|
123
|
-
echo -e " ${CYAN}linear${RESET} <cmd> ${BOLD}Linear sync${RESET} — bidirectional issue sync with Linear"
|
|
124
|
-
echo -e " ${CYAN}model${RESET} <cmd> ${BOLD}Model router${RESET} — intelligent model routing and cost optimization"
|
|
125
|
-
echo -e " ${CYAN}tracker${RESET} <cmd> ${BOLD}Issue tracker${RESET} — configure Linear/Jira integration"
|
|
126
|
-
echo -e " ${CYAN}heartbeat${RESET} <cmd> ${BOLD}Agent heartbeat${RESET} — write/check/list/clear heartbeats"
|
|
127
|
-
echo -e " ${CYAN}standup${RESET} <cmd> ${BOLD}Daily standups${RESET} — gather status, summarize work, report blockers"
|
|
128
|
-
echo -e " ${CYAN}checkpoint${RESET} <cmd> ${BOLD}Checkpoints${RESET} — save/restore agent state mid-stage"
|
|
129
|
-
echo -e " ${CYAN}durable${RESET} <cmd> ${BOLD}Durable workflow${RESET} — event log, checkpoints, locks, exactly-once"
|
|
130
|
-
echo -e " ${CYAN}webhook${RESET} <cmd> ${BOLD}GitHub webhooks${RESET} — instant issue processing, no polling"
|
|
131
|
-
echo -e " ${CYAN}decompose${RESET} <cmd> ${BOLD}Issue decomposer${RESET} — analyze complexity, auto-create subtasks"
|
|
132
|
-
echo -e " ${CYAN}discovery${RESET} <cmd> ${BOLD}Cross-pipeline learning${RESET} — real-time knowledge sharing"
|
|
133
|
-
echo -e " ${CYAN}connect${RESET} <cmd> ${BOLD}Team connect${RESET} — sync local state to team dashboard"
|
|
134
|
-
echo -e " ${CYAN}remote${RESET} <cmd> ${BOLD}Remote machines${RESET} — register and manage distributed workers"
|
|
135
|
-
echo -e " ${CYAN}launchd${RESET} <cmd> ${BOLD}Process supervision${RESET} — auto-start daemon + dashboard on boot"
|
|
136
|
-
echo -e " ${CYAN}auth${RESET} <cmd> ${BOLD}GitHub authentication${RESET} — OAuth login, token management, multi-user"
|
|
137
|
-
echo -e " ${CYAN}docs${RESET} <cmd> ${BOLD}Documentation keeper${RESET} — auto-sync docs from source"
|
|
138
|
-
echo -e " ${CYAN}changelog${RESET} <cmd> ${BOLD}Changelog engine${RESET} — auto-generate release notes and migration guides"
|
|
139
|
-
echo -e " ${CYAN}docs-agent${RESET} <cmd> ${BOLD}Autonomous docs agent${RESET} — scan gaps, sync, coverage, API ref"
|
|
140
|
-
echo -e " ${CYAN}doc-fleet${RESET} <cmd> ${BOLD}Documentation fleet${RESET} — 5 specialized agents: audit, refactor, enhance docs"
|
|
141
|
-
echo -e " ${CYAN}release${RESET} <cmd> ${BOLD}Release automation${RESET} — bump versions, changelog, tags, releases"
|
|
142
|
-
echo -e " ${CYAN}release-manager|rm${RESET} ${BOLD}Autonomous release pipeline${RESET} — readiness checks, RC flow, rollback"
|
|
143
|
-
echo -e " ${CYAN}replay${RESET} <cmd> ${BOLD}Pipeline DVR${RESET} — list, show, narrative, diff, export, compare runs"
|
|
144
|
-
echo -e " ${CYAN}scale${RESET} <cmd> ${BOLD}Dynamic team scaling${RESET} — scale agents up/down during pipeline"
|
|
145
|
-
echo -e " ${CYAN}swarm${RESET} <cmd> ${BOLD}Agent swarm manager${RESET} — registry, spawning, scaling, health, topology"
|
|
146
|
-
echo -e " ${CYAN}dora${RESET} <cmd> ${BOLD}DORA metrics${RESET} — deploy frequency, lead time, CFR, MTTR dashboard"
|
|
147
|
-
echo -e " ${CYAN}retro${RESET} <cmd> ${BOLD}Sprint retrospective${RESET} — analyze sprints, identify improvements, create actions"
|
|
148
|
-
echo -e " ${CYAN}tmux${RESET} <cmd> ${BOLD}tmux health${RESET} — doctor, install plugins, fix issues"
|
|
149
|
-
echo -e " ${CYAN}vitals${RESET} ${BOLD}Pipeline vitals${RESET} — real-time health scoring and dashboard"
|
|
150
|
-
echo -e " ${CYAN}stream${RESET} ${BOLD}Terminal streaming${RESET} — live agent output to dashboard or CLI"
|
|
151
|
-
echo -e " ${CYAN}github${RESET} ${BOLD}GitHub context${RESET} — repo metadata, security, blame"
|
|
152
|
-
echo -e " ${CYAN}checks${RESET} ${BOLD}GitHub checks${RESET} — CI check runs and status"
|
|
153
|
-
echo -e " ${CYAN}ci${RESET} ${BOLD}CI/CD orchestration${RESET} — workflow generation, matrix, caching, secrets"
|
|
154
|
-
echo -e " ${CYAN}deploys${RESET} ${BOLD}Deployments${RESET} — deployment history and environments"
|
|
155
|
-
echo -e " ${CYAN}github-app${RESET} ${BOLD}GitHub App management${RESET} — JWT, tokens, webhooks, manifest"
|
|
156
|
-
echo -e " ${CYAN}pr${RESET} ${BOLD}PR lifecycle${RESET} — auto-review, merge, cleanup, feedback"
|
|
157
|
-
echo -e " ${CYAN}context${RESET} ${BOLD}Context engine${RESET} — gather context for pipeline stages"
|
|
158
|
-
echo -e " ${CYAN}trace${RESET} ${BOLD}E2E traceability${RESET} — issue to commit to PR to deploy"
|
|
159
|
-
echo -e " ${CYAN}widgets${RESET} ${BOLD}Status widgets${RESET} — embeddable badges, Slack messages, markdown"
|
|
160
|
-
echo -e " ${CYAN}eventbus${RESET} ${BOLD}Event bus${RESET} — real-time inter-component communication"
|
|
161
|
-
echo -e " ${CYAN}otel${RESET} ${BOLD}OpenTelemetry observability${RESET} — Prometheus metrics, traces, OTLP export"
|
|
162
|
-
echo -e " ${CYAN}triage${RESET} ${BOLD}Issue labeling & prioritization${RESET} — auto-analyze, label, score, team sizing"
|
|
163
|
-
echo -e " ${CYAN}quality${RESET} ${BOLD}Quality validation${RESET} — ruthless gates, adversarial audits, completion detection"
|
|
164
|
-
echo -e " ${CYAN}oversight${RESET} ${BOLD}Quality oversight board${RESET} — multi-agent review council, voting, architecture governance"
|
|
165
|
-
echo -e " ${CYAN}code-review${RESET} ${BOLD}Autonomous code review${RESET} — clean code, SOLID, architecture boundaries, complexity"
|
|
166
|
-
echo -e " ${CYAN}pm${RESET} ${BOLD}Autonomous PM agent${RESET} — intelligent team sizing, composition, orchestration"
|
|
167
|
-
echo -e " ${CYAN}strategic${RESET} ${BOLD}Strategic intelligence${RESET} — analyze strategy, metrics, create improvement issues"
|
|
168
|
-
echo -e " ${CYAN}team-stages${RESET} ${BOLD}Multi-agent stage execution${RESET} — compose teams, delegate tasks, tally votes"
|
|
169
|
-
echo -e " ${CYAN}ux${RESET} ${BOLD}Premium UX layer${RESET} — themes, animations, shortcuts, accessibility"
|
|
170
|
-
echo -e " ${CYAN}recruit${RESET} ${BOLD}Agent recruitment${RESET} — skill matching, role definitions, performance evaluation"
|
|
171
|
-
echo -e " ${CYAN}testgen${RESET} ${BOLD}Test generation${RESET} — analyze coverage, generate tests, maintain thresholds"
|
|
172
|
-
echo -e " ${CYAN}security-audit|audit${RESET} ${BOLD}Security auditing${RESET} — secrets, licenses, vulnerabilities, SBOM, compliance"
|
|
173
|
-
echo -e " ${CYAN}init${RESET} ${BOLD}Quick tmux setup${RESET} — one command, no prompts"
|
|
174
|
-
echo -e " ${CYAN}setup${RESET} ${BOLD}Guided setup${RESET} — prerequisites, init, doctor, quick start"
|
|
175
|
-
echo -e " ${CYAN}help${RESET} Show this help message"
|
|
176
|
-
echo -e " ${CYAN}version${RESET} Show version"
|
|
177
|
-
echo -e " ${CYAN}hello${RESET} Say hello world"
|
|
178
|
-
echo ""
|
|
179
|
-
echo -e "${BOLD}CONTINUOUS LOOP${RESET} ${DIM}(autonomous agent operation)${RESET}"
|
|
180
|
-
echo -e " ${DIM}shipwright loop \"Build auth\" --test-cmd \"npm test\"${RESET}"
|
|
181
|
-
echo -e " ${DIM}shipwright loop \"Fix bugs\" --max-iterations 10 --model sonnet${RESET}"
|
|
182
|
-
echo -e " ${DIM}shipwright loop \"Build API\" --agents 3 --skip-permissions${RESET}"
|
|
183
|
-
echo -e " ${DIM}shipwright loop --resume${RESET} # Resume interrupted loop"
|
|
184
97
|
echo ""
|
|
185
|
-
echo -e "${BOLD}
|
|
186
|
-
echo -e " ${
|
|
187
|
-
echo -e " ${
|
|
188
|
-
echo -e " ${
|
|
189
|
-
echo -e " ${
|
|
98
|
+
echo -e "${BOLD}EVERYDAY COMMANDS${RESET}"
|
|
99
|
+
echo -e " ${CYAN}session${RESET} [name] Create a tmux window for a Claude agent team"
|
|
100
|
+
echo -e " ${CYAN}loop${RESET} \"goal\" [opts] Continuous agent loop — run until goal achieved"
|
|
101
|
+
echo -e " ${CYAN}pipeline${RESET} <cmd> Full delivery pipeline — issue to merged PR"
|
|
102
|
+
echo -e " ${CYAN}daemon${RESET} <cmd> Issue watcher — auto-process GitHub issues"
|
|
103
|
+
echo -e " ${CYAN}status${RESET} [--json] Show running teams and agents"
|
|
104
|
+
echo -e " ${CYAN}ps${RESET} Show agent processes"
|
|
105
|
+
echo -e " ${CYAN}logs${RESET} [team] [opts] View and search agent pane logs"
|
|
106
|
+
echo -e " ${CYAN}prep${RESET} [options] Generate .claude/ configs for any repo"
|
|
190
107
|
echo ""
|
|
191
|
-
echo -e "${BOLD}
|
|
192
|
-
echo -e " ${
|
|
193
|
-
echo -e " ${DIM}
|
|
194
|
-
echo -e " ${
|
|
195
|
-
echo -e " ${DIM}
|
|
196
|
-
echo -e " ${DIM}
|
|
108
|
+
echo -e "${BOLD}COMMAND GROUPS${RESET} ${DIM}(use: shipwright <group> help)${RESET}"
|
|
109
|
+
echo -e " ${CYAN}agent${RESET} ${DIM}recruit, swarm, standup, guild, oversight${RESET}"
|
|
110
|
+
echo -e " ${CYAN}quality${RESET} ${DIM}code-review, security-audit, testgen, hygiene${RESET}"
|
|
111
|
+
echo -e " ${CYAN}observe${RESET} ${DIM}vitals, dora, retro, stream, activity, replay${RESET}"
|
|
112
|
+
echo -e " ${CYAN}release${RESET} ${DIM}release, release-manager, changelog, deploy${RESET}"
|
|
113
|
+
echo -e " ${CYAN}intel${RESET} ${DIM}predict, intelligence, strategic, optimize${RESET}"
|
|
197
114
|
echo ""
|
|
198
|
-
echo -e "${BOLD}
|
|
199
|
-
echo -e " ${
|
|
200
|
-
echo -e " ${
|
|
201
|
-
echo -e " ${
|
|
202
|
-
echo -e " ${
|
|
203
|
-
echo -e " ${
|
|
204
|
-
echo -e " ${DIM}shipwright cost show --period 30 --by-stage${RESET} # Detailed cost report"
|
|
115
|
+
echo -e "${BOLD}OPERATIONS${RESET}"
|
|
116
|
+
echo -e " ${CYAN}fleet${RESET} <cmd> Multi-repo orchestration"
|
|
117
|
+
echo -e " ${CYAN}fix${RESET} \"goal\" [opts] Bulk fix across multiple repos"
|
|
118
|
+
echo -e " ${CYAN}dashboard${RESET} <cmd> Real-time WebSocket dashboard"
|
|
119
|
+
echo -e " ${CYAN}cost${RESET} <cmd> Token usage, budgets, model routing"
|
|
120
|
+
echo -e " ${CYAN}memory${RESET} <cmd> Persistent learning from pipeline runs"
|
|
205
121
|
echo ""
|
|
206
|
-
echo -e "${BOLD}
|
|
207
|
-
echo -e " ${
|
|
208
|
-
echo -e " ${
|
|
209
|
-
echo -e " ${
|
|
210
|
-
echo -e " ${
|
|
122
|
+
echo -e "${BOLD}INTEGRATIONS${RESET}"
|
|
123
|
+
echo -e " ${CYAN}github${RESET} Repo context, security, blame"
|
|
124
|
+
echo -e " ${CYAN}jira${RESET} <cmd> Bidirectional Jira sync"
|
|
125
|
+
echo -e " ${CYAN}linear${RESET} <cmd> Bidirectional Linear sync"
|
|
126
|
+
echo -e " ${CYAN}ci${RESET} <cmd> CI/CD workflow generation"
|
|
211
127
|
echo ""
|
|
212
|
-
echo -e "${BOLD}
|
|
213
|
-
echo -e " ${
|
|
214
|
-
echo -e " ${
|
|
215
|
-
echo -e " ${
|
|
128
|
+
echo -e "${BOLD}MAINTENANCE${RESET}"
|
|
129
|
+
echo -e " ${CYAN}cleanup${RESET} [--force] Clean up orphaned sessions"
|
|
130
|
+
echo -e " ${CYAN}upgrade${RESET} [--apply] Check for and apply updates"
|
|
131
|
+
echo -e " ${CYAN}templates${RESET} [list|show] Manage team composition templates"
|
|
132
|
+
echo -e " ${CYAN}version${RESET} Show/bump/check version"
|
|
216
133
|
echo ""
|
|
217
|
-
echo -e "${BOLD}
|
|
218
|
-
echo -e " ${DIM}shipwright
|
|
219
|
-
echo -e " ${DIM}shipwright
|
|
220
|
-
echo -e " ${DIM}shipwright
|
|
221
|
-
echo -e " ${DIM}shipwright checks list${RESET} # Show check runs"
|
|
222
|
-
echo -e " ${DIM}shipwright deploys list${RESET} # Show deployment history"
|
|
223
|
-
echo ""
|
|
224
|
-
echo -e "${BOLD}TEST SUITES${RESET} ${DIM}(validate shipwright components)${RESET}"
|
|
225
|
-
echo -e " ${DIM}shipwright daemon test${RESET} # Run daemon test suite"
|
|
226
|
-
echo -e " ${DIM}shipwright prep test${RESET} # Run prep test suite"
|
|
227
|
-
echo -e " ${DIM}shipwright pipeline test${RESET} # Run pipeline test suite"
|
|
228
|
-
echo -e " ${DIM}shipwright e2e${RESET} <cmd> ${BOLD}Test orchestration${RESET} — smoke/integration/regression"
|
|
134
|
+
echo -e "${BOLD}QUICK START${RESET}"
|
|
135
|
+
echo -e " ${DIM}shipwright loop \"Build auth\" --test-cmd \"npm test\"${RESET}"
|
|
136
|
+
echo -e " ${DIM}shipwright pipeline start --issue 123${RESET}"
|
|
137
|
+
echo -e " ${DIM}shipwright daemon start --detach${RESET}"
|
|
229
138
|
echo ""
|
|
230
|
-
echo -e "${BOLD}
|
|
231
|
-
echo -e " ${
|
|
232
|
-
echo -e " ${
|
|
233
|
-
echo -e " ${DIM}shipwright loop \"goal\" --quality-gates${RESET} # Automated quality checks"
|
|
234
|
-
echo -e " ${DIM}shipwright loop \"goal\" --definition-of-done dod.md${RESET} # Custom completion checklist"
|
|
139
|
+
echo -e "${BOLD}TMUX KEYBINDINGS${RESET}"
|
|
140
|
+
echo -e " ${PURPLE}prefix + T${RESET} Launch a team session"
|
|
141
|
+
echo -e " ${PURPLE}prefix + Ctrl-t${RESET} Show team dashboard"
|
|
235
142
|
echo ""
|
|
236
|
-
echo -e "${
|
|
237
|
-
echo -e "
|
|
238
|
-
|
|
143
|
+
echo -e "${DIM}Run ${RESET}${CYAN}shipwright help --all${RESET}${DIM} for the full command list (80+ commands)${RESET}"
|
|
144
|
+
echo -e "${DIM}Docs: $(_sw_docs_url) | GitHub: $(_sw_github_url)${RESET}"
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
show_help_all() {
|
|
148
|
+
show_help
|
|
239
149
|
echo ""
|
|
240
|
-
echo -e "${BOLD}
|
|
241
|
-
echo -e " ${
|
|
242
|
-
echo -e " ${
|
|
243
|
-
echo -e " ${
|
|
244
|
-
echo -e " ${
|
|
245
|
-
echo -e " ${
|
|
246
|
-
echo -e " ${
|
|
247
|
-
echo -e " ${
|
|
248
|
-
echo -e " ${
|
|
249
|
-
echo -e " ${
|
|
250
|
-
echo -e " ${
|
|
251
|
-
echo -e " ${
|
|
150
|
+
echo -e "${BOLD}ALL COMMANDS${RESET} ${DIM}(complete reference)${RESET}"
|
|
151
|
+
echo -e " ${CYAN}session${RESET} ${CYAN}status${RESET} ${CYAN}ps${RESET} ${CYAN}logs${RESET} ${CYAN}activity${RESET}"
|
|
152
|
+
echo -e " ${CYAN}loop${RESET} ${CYAN}pipeline${RESET} ${CYAN}daemon${RESET} ${CYAN}prep${RESET} ${CYAN}worktree${RESET}"
|
|
153
|
+
echo -e " ${CYAN}fleet${RESET} ${CYAN}fleet-viz${RESET} ${CYAN}fix${RESET} ${CYAN}dashboard${RESET} ${CYAN}public-dashboard${RESET}"
|
|
154
|
+
echo -e " ${CYAN}memory${RESET} ${CYAN}cost${RESET} ${CYAN}model${RESET} ${CYAN}adaptive${RESET} ${CYAN}regression${RESET}"
|
|
155
|
+
echo -e " ${CYAN}incident${RESET} ${CYAN}db${RESET} ${CYAN}deps${RESET} ${CYAN}instrument${RESET} ${CYAN}scale${RESET}"
|
|
156
|
+
echo -e " ${CYAN}swarm${RESET} ${CYAN}recruit${RESET} ${CYAN}standup${RESET} ${CYAN}guild${RESET} ${CYAN}oversight${RESET}"
|
|
157
|
+
echo -e " ${CYAN}code-review${RESET} ${CYAN}testgen${RESET} ${CYAN}security-audit${RESET} ${CYAN}hygiene${RESET} ${CYAN}quality${RESET}"
|
|
158
|
+
echo -e " ${CYAN}vitals${RESET} ${CYAN}dora${RESET} ${CYAN}retro${RESET} ${CYAN}stream${RESET} ${CYAN}replay${RESET}"
|
|
159
|
+
echo -e " ${CYAN}release${RESET} ${CYAN}release-manager${RESET} ${CYAN}changelog${RESET} ${CYAN}docs${RESET} ${CYAN}docs-agent${RESET}"
|
|
160
|
+
echo -e " ${CYAN}doc-fleet${RESET} ${CYAN}pr${RESET} ${CYAN}triage${RESET} ${CYAN}decompose${RESET} ${CYAN}discovery${RESET}"
|
|
161
|
+
echo -e " ${CYAN}github${RESET} ${CYAN}github-app${RESET} ${CYAN}checks${RESET} ${CYAN}ci${RESET} ${CYAN}deploys${RESET}"
|
|
162
|
+
echo -e " ${CYAN}auth${RESET} ${CYAN}webhook${RESET} ${CYAN}eventbus${RESET} ${CYAN}otel${RESET} ${CYAN}context${RESET}"
|
|
163
|
+
echo -e " ${CYAN}trace${RESET} ${CYAN}widgets${RESET} ${CYAN}connect${RESET} ${CYAN}remote${RESET} ${CYAN}launchd${RESET}"
|
|
164
|
+
echo -e " ${CYAN}jira${RESET} ${CYAN}linear${RESET} ${CYAN}tracker${RESET} ${CYAN}heartbeat${RESET} ${CYAN}checkpoint${RESET}"
|
|
165
|
+
echo -e " ${CYAN}durable${RESET} ${CYAN}autonomous${RESET} ${CYAN}pm${RESET} ${CYAN}strategic${RESET} ${CYAN}team-stages${RESET}"
|
|
166
|
+
echo -e " ${CYAN}ux${RESET} ${CYAN}mission-control${RESET} ${CYAN}tmux${RESET} ${CYAN}reaper${RESET} ${CYAN}e2e${RESET}"
|
|
167
|
+
echo -e " ${CYAN}init${RESET} ${CYAN}setup${RESET} ${CYAN}doctor${RESET} ${CYAN}cleanup${RESET} ${CYAN}upgrade${RESET}"
|
|
168
|
+
echo -e " ${CYAN}templates${RESET} ${CYAN}version${RESET}"
|
|
252
169
|
echo ""
|
|
253
|
-
echo -e "${DIM}
|
|
170
|
+
echo -e "${DIM}Run ${RESET}${CYAN}shipwright <command> --help${RESET}${DIM} for details on any command${RESET}"
|
|
254
171
|
}
|
|
255
172
|
|
|
256
173
|
# ─── Command Group Routers ───────────────────────────────────────────────────
|
|
@@ -303,7 +220,8 @@ route_release() {
|
|
|
303
220
|
release-manager) exec "$SCRIPT_DIR/sw-release-manager.sh" "$@" ;;
|
|
304
221
|
changelog) exec "$SCRIPT_DIR/sw-changelog.sh" "$@" ;;
|
|
305
222
|
deploy|deploys) exec "$SCRIPT_DIR/sw-github-deploy.sh" "$@" ;;
|
|
306
|
-
|
|
223
|
+
build) exec "$SCRIPT_DIR/build-release.sh" "$@" ;;
|
|
224
|
+
help|*) echo "Usage: shipwright release {release|release-manager|changelog|deploy|build}"; exit 1 ;;
|
|
307
225
|
esac
|
|
308
226
|
}
|
|
309
227
|
|
|
@@ -643,9 +561,32 @@ main() {
|
|
|
643
561
|
exec "$SCRIPT_DIR/sw-security-audit.sh" "$@"
|
|
644
562
|
;;
|
|
645
563
|
help|--help|-h)
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
564
|
+
if [[ "${1:-}" == "--all" || "${1:-}" == "-a" ]]; then
|
|
565
|
+
show_help_all
|
|
566
|
+
else
|
|
567
|
+
show_help
|
|
568
|
+
fi
|
|
569
|
+
;;
|
|
570
|
+
version)
|
|
571
|
+
case "${1:-show}" in
|
|
572
|
+
bump)
|
|
573
|
+
shift
|
|
574
|
+
if [[ -z "${1:-}" ]]; then
|
|
575
|
+
error "Usage: shipwright version bump <x.y.z>"
|
|
576
|
+
echo -e " ${DIM}Example: shipwright version bump 2.3.0${RESET}"
|
|
577
|
+
exit 1
|
|
578
|
+
fi
|
|
579
|
+
exec "$SCRIPT_DIR/update-version.sh" "$@"
|
|
580
|
+
;;
|
|
581
|
+
check)
|
|
582
|
+
exec "$SCRIPT_DIR/check-version-consistency.sh" "$@"
|
|
583
|
+
;;
|
|
584
|
+
show|*)
|
|
585
|
+
show_version
|
|
586
|
+
;;
|
|
587
|
+
esac
|
|
588
|
+
;;
|
|
589
|
+
--version|-v)
|
|
649
590
|
show_version
|
|
650
591
|
;;
|
|
651
592
|
hello)
|
package/scripts/sw-activity.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.3.0"
|
|
10
10
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
11
11
|
|
|
12
12
|
# ─── Cross-platform compatibility ──────────────────────────────────────────
|
package/scripts/sw-adaptive.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.3.0"
|
|
10
10
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
11
11
|
|
|
12
12
|
# ─── Cross-platform compatibility ──────────────────────────────────────────
|
|
@@ -521,7 +521,7 @@ cmd_profile() {
|
|
|
521
521
|
local model_val
|
|
522
522
|
model_val=$(get_model "build" "opus")
|
|
523
523
|
local model_samples
|
|
524
|
-
model_samples=$(jq -s "map(select(.model != null and .type == \"
|
|
524
|
+
model_samples=$(jq -s "map(select(.model != null and .type == \"pipeline.completed\")) | length" "$EVENTS_FILE" 2>/dev/null || echo "0")
|
|
525
525
|
local model_conf
|
|
526
526
|
model_conf=$(confidence_level "$model_samples")
|
|
527
527
|
printf "%-25s %-15s %-15s %-12s %-10s\n" "model" "$model_val" "opus" "$model_samples" "$model_conf"
|
package/scripts/sw-auth.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.3.0"
|
|
10
10
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
11
11
|
REPO_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
|
|
12
12
|
|
|
@@ -348,11 +348,19 @@ cmd_login() {
|
|
|
348
348
|
info "Starting GitHub OAuth device flow..."
|
|
349
349
|
|
|
350
350
|
# Initiate device flow
|
|
351
|
-
local
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
#
|
|
355
|
-
|
|
351
|
+
local device_flow_response
|
|
352
|
+
device_flow_response=$(initiate_device_flow) || return 1
|
|
353
|
+
|
|
354
|
+
# Extract variables without eval (initiate_device_flow outputs key=value pairs)
|
|
355
|
+
local DEVICE_CODE USER_CODE INTERVAL EXPIRES_IN
|
|
356
|
+
while IFS='=' read -r key value; do
|
|
357
|
+
case "$key" in
|
|
358
|
+
DEVICE_CODE) DEVICE_CODE="$value" ;;
|
|
359
|
+
USER_CODE) USER_CODE="$value" ;;
|
|
360
|
+
INTERVAL) INTERVAL="$value" ;;
|
|
361
|
+
EXPIRES_IN) EXPIRES_IN="$value" ;;
|
|
362
|
+
esac
|
|
363
|
+
done <<< "$device_flow_response"
|
|
356
364
|
|
|
357
365
|
info "Visit: ${CYAN}${DEVICE_FLOW_ENDPOINT}${RESET}"
|
|
358
366
|
info "Enter code: ${BOLD}${USER_CODE}${RESET}"
|
package/scripts/sw-autonomous.sh
CHANGED
package/scripts/sw-changelog.sh
CHANGED
|
@@ -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.
|
|
10
|
+
VERSION="2.3.0"
|
|
11
11
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
12
12
|
REPO_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
|
|
13
13
|
|
|
@@ -138,7 +138,7 @@ parse_commits() {
|
|
|
138
138
|
# Build entry
|
|
139
139
|
local entry="$msg"
|
|
140
140
|
[[ -n "$scope" ]] && entry="**${scope}**: $entry"
|
|
141
|
-
[[ -n "$pr_num" ]] && entry="$entry ([\#$pr_num](
|
|
141
|
+
[[ -n "$pr_num" ]] && entry="$entry ([\#$pr_num]($(_sw_github_url)/pull/$pr_num))"
|
|
142
142
|
|
|
143
143
|
# Categorize
|
|
144
144
|
case "$type" in
|
package/scripts/sw-checkpoint.sh
CHANGED
|
@@ -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.
|
|
11
|
+
VERSION="2.3.0"
|
|
12
12
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
13
13
|
|
|
14
14
|
# ─── Cross-platform compatibility ──────────────────────────────────────────
|
package/scripts/sw-ci.sh
CHANGED
package/scripts/sw-cleanup.sh
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
# ║ Default: dry-run (shows what would be cleaned). ║
|
|
6
6
|
# ║ Use --force to actually kill sessions and remove files. ║
|
|
7
7
|
# ╚═══════════════════════════════════════════════════════════════════════════╝
|
|
8
|
-
VERSION="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
|
|
package/scripts/sw-connect.sh
CHANGED
|
@@ -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.
|
|
11
|
+
VERSION="2.3.0"
|
|
12
12
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
13
13
|
|
|
14
14
|
# ─── Cross-platform compatibility ──────────────────────────────────────────
|
package/scripts/sw-context.sh
CHANGED
package/scripts/sw-cost.sh
CHANGED