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
package/README.md CHANGED
@@ -13,7 +13,7 @@
13
13
  <a href="https://github.com/sethdford/shipwright/actions/workflows/test.yml"><img src="https://github.com/sethdford/shipwright/actions/workflows/test.yml/badge.svg" alt="Tests"></a>
14
14
  <a href="https://github.com/sethdford/shipwright/actions/workflows/shipwright-pipeline.yml"><img src="https://github.com/sethdford/shipwright/actions/workflows/shipwright-pipeline.yml/badge.svg" alt="Pipeline"></a>
15
15
  <img src="https://img.shields.io/badge/tests-103_suites_passing-4ade80?style=flat-square" alt="103 suites">
16
- <img src="https://img.shields.io/badge/version-2.2.2-00d4ff?style=flat-square" alt="v2.2.2">
16
+ <img src="https://img.shields.io/badge/version-2.3.0-00d4ff?style=flat-square" alt="v2.3.0">
17
17
  <img src="https://img.shields.io/badge/license-MIT-green?style=flat-square" alt="MIT License">
18
18
  <img src="https://img.shields.io/badge/bash-3.2%2B-7c3aed?style=flat-square" alt="Bash 3.2+">
19
19
  </p>
@@ -23,7 +23,7 @@
23
23
  ## Table of Contents
24
24
 
25
25
  - [Shipwright Builds Itself](#shipwright-builds-itself)
26
- - [What's New in v2.2.2](#whats-new-in-v222)
26
+ - [What's New in v2.3.0](#whats-new-in-v230)
27
27
  - [How It Works](#how-it-works)
28
28
  - [Install](#install)
29
29
  - [Quick Start](#quick-start)
@@ -46,7 +46,7 @@ This repo uses Shipwright to process its own issues. Label a GitHub issue with `
46
46
 
47
47
  ---
48
48
 
49
- ## What's New in v2.2.2
49
+ ## What's New in v2.3.0
50
50
 
51
51
  **Docs & platform polish** — doc-fleet, shared libs, policy schema, release infra:
52
52
 
@@ -102,18 +102,19 @@ When tests fail, the pipeline re-enters the build loop with error context — se
102
102
 
103
103
  ## Install
104
104
 
105
+ **One-command install** (recommended):
106
+
105
107
  ```bash
106
- curl -fsSL https://raw.githubusercontent.com/sethdford/shipwright/main/scripts/install-remote.sh | bash
108
+ git clone https://github.com/sethdford/shipwright.git && cd shipwright && ./install.sh
107
109
  ```
108
110
 
109
111
  <details>
110
112
  <summary>Other methods</summary>
111
113
 
112
- **From source**
114
+ **curl**
113
115
 
114
116
  ```bash
115
- git clone https://github.com/sethdford/shipwright.git
116
- cd shipwright && ./install.sh
117
+ curl -fsSL https://raw.githubusercontent.com/sethdford/shipwright/main/scripts/install-remote.sh | bash
117
118
  ```
118
119
 
119
120
  **npm** (global)
@@ -162,7 +163,7 @@ shipwright fleet start
162
163
  shipwright fix "upgrade deps" --repos ~/a,~/b,~/c
163
164
 
164
165
  # Release automation
165
- shipwright release --version 2.2.2
166
+ shipwright version bump 2.2.2
166
167
  shipwright changelog generate
167
168
  ```
168
169
 
@@ -381,7 +382,7 @@ shipwright fix "feat: add auth" --repos ~/a,~/b,~/c
381
382
  shipwright fleet-viz
382
383
 
383
384
  # Release automation
384
- shipwright release --version 2.2.2
385
+ shipwright version bump 2.2.2
385
386
  shipwright changelog generate
386
387
  shipwright deploys list
387
388
 
@@ -395,11 +396,11 @@ shipwright upgrade --apply
395
396
  shipwright --help
396
397
  ```
397
398
 
398
- See [.claude/CLAUDE.md](.claude/CLAUDE.md) for the complete 100+ command reference organized by workflow. Full documentation: [docs/](docs/).
399
+ See [.claude/CLAUDE.md](.claude/CLAUDE.md) for the complete 100+ command reference organized by workflow. Full documentation: [https://sethdford.github.io/shipwright](https://sethdford.github.io/shipwright).
399
400
 
400
401
  ## Pipeline Templates for Teams
401
402
 
402
- 25 team templates covering the full SDLC:
403
+ 24 team templates covering the full SDLC:
403
404
 
404
405
  ```bash
405
406
  shipwright templates list
@@ -59,9 +59,12 @@
59
59
  <div class="header-center" id="connection">
60
60
  <span class="connection-dot offline" id="connection-dot"></span>
61
61
  <span class="connection-text" id="connection-text">OFFLINE</span>
62
- <span class="cost-ticker" id="cost-ticker"></span>
62
+ <span class="cost-ticker" id="cost-ticker">
63
+ <span id="cost-24h"></span>
64
+ <span id="cost-budget"></span>
65
+ </span>
63
66
  </div>
64
- <div class="header-right">
67
+ <div class="header-right header-actions">
65
68
  <button
66
69
  class="emergency-brake-btn"
67
70
  id="emergency-brake"
@@ -86,6 +89,9 @@
86
89
  </button>
87
90
  <div class="user-dropdown" id="user-dropdown">
88
91
  <div class="dropdown-username" id="dropdown-username">—</div>
92
+ <button class="dropdown-link" id="open-notifications">
93
+ Notifications
94
+ </button>
89
95
  <a class="dropdown-link" href="/auth/logout">Sign out</a>
90
96
  </div>
91
97
  </div>
@@ -104,6 +110,9 @@
104
110
  <button class="tab-btn" data-tab="machines">Machines</button>
105
111
  <button class="tab-btn" data-tab="insights">Insights</button>
106
112
  <button class="tab-btn" data-tab="team">Team</button>
113
+ <button class="tab-btn" data-tab="fleet-map">Map</button>
114
+ <button class="tab-btn" data-tab="pipeline-theater">Theater</button>
115
+ <button class="tab-btn" data-tab="agent-cockpit">Cockpit</button>
107
116
  <div class="tab-indicator" id="tab-indicator"></div>
108
117
  </div>
109
118
  </nav>
@@ -122,6 +131,15 @@
122
131
 
123
132
  <!-- Main Content -->
124
133
  <main class="main" id="main-content">
134
+ <!-- Stale Data Banner -->
135
+ <div
136
+ class="stale-data-banner"
137
+ id="stale-data-banner"
138
+ style="display: none"
139
+ >
140
+ <span class="stale-icon">\u23F1</span>
141
+ Data last updated <span id="stale-data-age">?</span> ago
142
+ </div>
125
143
  <!-- ═══ OVERVIEW TAB ═══ -->
126
144
  <div class="tab-panel active" id="panel-overview">
127
145
  <!-- Stats Row -->
@@ -164,7 +182,6 @@
164
182
  <button
165
183
  class="btn btn-sm btn-start"
166
184
  id="daemon-btn-start"
167
- onclick="daemonControl('start')"
168
185
  title="Start daemon"
169
186
  >
170
187
  Start
@@ -172,7 +189,6 @@
172
189
  <button
173
190
  class="btn btn-sm btn-stop"
174
191
  id="daemon-btn-stop"
175
- onclick="daemonControl('stop')"
176
192
  title="Stop daemon"
177
193
  >
178
194
  Stop
@@ -180,7 +196,6 @@
180
196
  <button
181
197
  class="btn btn-sm btn-pause"
182
198
  id="daemon-btn-pause"
183
- onclick="daemonControl('pause')"
184
199
  title="Pause/Resume daemon"
185
200
  >
186
201
  Pause
@@ -188,7 +203,6 @@
188
203
  <button
189
204
  class="btn btn-sm btn-patrol"
190
205
  id="daemon-btn-patrol"
191
- onclick="daemonControl('patrol')"
192
206
  title="Run patrol now"
193
207
  >
194
208
  Run Patrol
@@ -477,6 +491,48 @@
477
491
  >
478
492
  <span class="metric-label">DORA GRADES</span>
479
493
  </div>
494
+
495
+ <!-- Bottleneck alerts -->
496
+ <div
497
+ class="metric-card metric-card-wide"
498
+ id="bottleneck-alert-container"
499
+ ></div>
500
+
501
+ <!-- Stage performance -->
502
+ <div
503
+ class="metric-card metric-card-wide"
504
+ id="stage-performance-container"
505
+ ></div>
506
+
507
+ <!-- Cost breakdown -->
508
+ <div
509
+ class="metric-card metric-card-wide"
510
+ id="cost-breakdown-container"
511
+ ></div>
512
+
513
+ <!-- Cost trend -->
514
+ <div
515
+ class="metric-card metric-card-wide"
516
+ id="cost-trend-container"
517
+ ></div>
518
+
519
+ <!-- DORA trend -->
520
+ <div
521
+ class="metric-card metric-card-wide"
522
+ id="dora-trend-container"
523
+ ></div>
524
+
525
+ <!-- Throughput trend -->
526
+ <div
527
+ class="metric-card metric-card-wide"
528
+ id="throughput-trend-container"
529
+ ></div>
530
+
531
+ <!-- Capacity forecast -->
532
+ <div
533
+ class="metric-card metric-card-wide"
534
+ id="capacity-forecast-container"
535
+ ></div>
480
536
  </div>
481
537
  </div>
482
538
 
@@ -564,6 +620,21 @@
564
620
  </div>
565
621
  </section>
566
622
 
623
+ <!-- Team Actions -->
624
+ <div
625
+ class="team-actions"
626
+ style="margin: 1rem 0; display: flex; gap: 0.5rem"
627
+ >
628
+ <button class="btn-primary" id="btn-create-invite">
629
+ Create Invite Link
630
+ </button>
631
+ </div>
632
+ <div
633
+ id="team-invite-result"
634
+ style="display: none"
635
+ class="invite-result"
636
+ ></div>
637
+
567
638
  <!-- Developer Cards -->
568
639
  <section class="section-header">
569
640
  <h2 class="section-label">CONNECTED DEVELOPERS</h2>
@@ -582,12 +653,87 @@
582
653
  <div class="team-activity" id="team-activity">
583
654
  <div class="empty-state">No team activity yet.</div>
584
655
  </div>
656
+
657
+ <!-- Integrations Status -->
658
+ <section class="section-header" style="margin-top: 2rem">
659
+ <h2 class="section-label">INTEGRATIONS</h2>
660
+ </section>
661
+ <div id="integrations-status" class="integrations-panel">
662
+ <div class="empty-state"><p>Loading...</p></div>
663
+ </div>
664
+
665
+ <!-- Admin/Debug Panel (admin only) -->
666
+ <section class="section-header" style="margin-top: 2rem">
667
+ <h2 class="section-label">ADMIN / DEBUG</h2>
668
+ </section>
669
+ <div id="admin-debug-panel" class="admin-debug-panel">
670
+ <div
671
+ class="admin-debug-controls"
672
+ style="display: flex; gap: 0.5rem; margin-bottom: 1rem"
673
+ >
674
+ <button class="btn-secondary btn-sm" id="btn-db-health">
675
+ DB Health
676
+ </button>
677
+ <button class="btn-secondary btn-sm" id="btn-db-events">
678
+ Recent Events
679
+ </button>
680
+ <button class="btn-secondary btn-sm" id="btn-db-jobs">Jobs</button>
681
+ <button class="btn-secondary btn-sm" id="btn-db-heartbeats">
682
+ Heartbeats
683
+ </button>
684
+ <button class="btn-secondary btn-sm" id="btn-db-costs">
685
+ Today's Costs
686
+ </button>
687
+ </div>
688
+ <div id="admin-debug-output" class="admin-debug-output">
689
+ <div class="empty-state">
690
+ <p>Click a button above to inspect</p>
691
+ </div>
692
+ </div>
693
+ </div>
694
+
695
+ <!-- Machine Claim/Release -->
696
+ <section class="section-header" style="margin-top: 2rem">
697
+ <h2 class="section-label">ISSUE CLAIM</h2>
698
+ </section>
699
+ <div id="claim-panel" class="claim-panel">
700
+ <div class="form-row" style="gap: 0.5rem; align-items: end">
701
+ <div class="form-group">
702
+ <label class="form-label" for="claim-issue">Issue #</label>
703
+ <input
704
+ type="number"
705
+ id="claim-issue"
706
+ class="form-input"
707
+ placeholder="123"
708
+ style="width: 100px"
709
+ />
710
+ </div>
711
+ <div class="form-group">
712
+ <label class="form-label" for="claim-machine">Machine</label>
713
+ <input
714
+ type="text"
715
+ id="claim-machine"
716
+ class="form-input"
717
+ placeholder="build-01"
718
+ style="width: 150px"
719
+ />
720
+ </div>
721
+ <button class="btn-primary btn-sm" id="btn-claim">Claim</button>
722
+ <button class="btn-secondary btn-sm" id="btn-release">
723
+ Release
724
+ </button>
725
+ </div>
726
+ <div
727
+ id="claim-result"
728
+ style="margin-top: 0.5rem; font-size: 0.85rem"
729
+ ></div>
730
+ </div>
585
731
  </div>
586
732
  </main>
587
733
 
588
734
  <!-- Footer -->
589
735
  <footer class="footer">
590
- <span>Shipwright Fleet Command v1.7.1</span>
736
+ <span>Shipwright Fleet Command v2.3.0</span>
591
737
  <span>Dashboard refreshes via WebSocket</span>
592
738
  </footer>
593
739
 
@@ -642,6 +788,71 @@
642
788
  </div>
643
789
  </div>
644
790
 
791
+ <!-- Notifications Settings Modal -->
792
+ <div class="modal-overlay" id="notifications-modal" style="display: none">
793
+ <div class="modal-card modal-wide">
794
+ <div class="modal-header">
795
+ <h3 class="modal-title">Notification Settings</h3>
796
+ <button class="modal-close" id="notif-modal-close">&times;</button>
797
+ </div>
798
+ <div class="modal-body">
799
+ <p class="text-muted">
800
+ Configure webhooks to receive alerts when pipelines complete, fail,
801
+ or trigger alerts.
802
+ </p>
803
+ <div class="form-row" style="margin-top: 1rem">
804
+ <div class="form-group" style="flex: 3">
805
+ <label class="form-label" for="notif-webhook-url"
806
+ >Webhook URL</label
807
+ >
808
+ <input
809
+ type="url"
810
+ id="notif-webhook-url"
811
+ class="form-input"
812
+ placeholder="https://hooks.slack.com/services/..."
813
+ />
814
+ </div>
815
+ <div class="form-group" style="flex: 1">
816
+ <label class="form-label" for="notif-webhook-label">Label</label>
817
+ <input
818
+ type="text"
819
+ id="notif-webhook-label"
820
+ class="form-input"
821
+ placeholder="Slack"
822
+ />
823
+ </div>
824
+ </div>
825
+ <div class="form-row" style="margin-top: 0.5rem">
826
+ <label class="form-label" style="margin-right: 0.5rem"
827
+ >Events:</label
828
+ >
829
+ <label
830
+ ><input type="checkbox" id="notif-evt-all" checked /> All</label
831
+ >
832
+ <label
833
+ ><input type="checkbox" id="notif-evt-completed" />
834
+ Completed</label
835
+ >
836
+ <label
837
+ ><input type="checkbox" id="notif-evt-failed" /> Failed</label
838
+ >
839
+ <label><input type="checkbox" id="notif-evt-alert" /> Alerts</label>
840
+ </div>
841
+ <button
842
+ class="btn-primary"
843
+ id="notif-add-webhook"
844
+ style="margin-top: 0.75rem"
845
+ >
846
+ Add Webhook
847
+ </button>
848
+ <div id="notif-webhook-list" style="margin-top: 1rem"></div>
849
+ <div style="margin-top: 1rem; display: flex; gap: 0.5rem">
850
+ <button class="btn-secondary" id="notif-test-btn">Send Test</button>
851
+ </div>
852
+ </div>
853
+ </div>
854
+ </div>
855
+
645
856
  <!-- Add Machine Modal -->
646
857
  <div class="modal-overlay" id="add-machine-modal" style="display: none">
647
858
  <div class="modal-card modal-wide">
@@ -811,6 +1022,11 @@
811
1022
  </div>
812
1023
  </div>
813
1024
 
814
- <script src="app.js"></script>
1025
+ <!-- New visualization tab panels -->
1026
+ <div class="tab-panel" id="panel-fleet-map"></div>
1027
+ <div class="tab-panel" id="panel-pipeline-theater"></div>
1028
+ <div class="tab-panel" id="panel-agent-cockpit"></div>
1029
+
1030
+ <script src="dist/main.js"></script>
815
1031
  </body>
816
1032
  </html>