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.
Files changed (156) hide show
  1. package/README.md +19 -19
  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-PLATFORM-PLAN.md +5 -5
  41. package/docs/AGI-WHATS-NEXT.md +19 -16
  42. package/docs/README.md +2 -0
  43. package/package.json +8 -1
  44. package/scripts/check-version-consistency.sh +72 -0
  45. package/scripts/lib/daemon-adaptive.sh +610 -0
  46. package/scripts/lib/daemon-dispatch.sh +489 -0
  47. package/scripts/lib/daemon-failure.sh +387 -0
  48. package/scripts/lib/daemon-patrol.sh +1113 -0
  49. package/scripts/lib/daemon-poll.sh +1202 -0
  50. package/scripts/lib/daemon-state.sh +550 -0
  51. package/scripts/lib/daemon-triage.sh +490 -0
  52. package/scripts/lib/helpers.sh +81 -0
  53. package/scripts/lib/pipeline-intelligence.sh +0 -6
  54. package/scripts/lib/pipeline-quality-checks.sh +3 -1
  55. package/scripts/lib/pipeline-stages.sh +20 -0
  56. package/scripts/sw +109 -168
  57. package/scripts/sw-activity.sh +1 -1
  58. package/scripts/sw-adaptive.sh +2 -2
  59. package/scripts/sw-adversarial.sh +1 -1
  60. package/scripts/sw-architecture-enforcer.sh +1 -1
  61. package/scripts/sw-auth.sh +14 -6
  62. package/scripts/sw-autonomous.sh +1 -1
  63. package/scripts/sw-changelog.sh +2 -2
  64. package/scripts/sw-checkpoint.sh +1 -1
  65. package/scripts/sw-ci.sh +1 -1
  66. package/scripts/sw-cleanup.sh +1 -1
  67. package/scripts/sw-code-review.sh +1 -1
  68. package/scripts/sw-connect.sh +1 -1
  69. package/scripts/sw-context.sh +1 -1
  70. package/scripts/sw-cost.sh +1 -1
  71. package/scripts/sw-daemon.sh +53 -4817
  72. package/scripts/sw-dashboard.sh +1 -1
  73. package/scripts/sw-db.sh +1 -1
  74. package/scripts/sw-decompose.sh +1 -1
  75. package/scripts/sw-deps.sh +1 -1
  76. package/scripts/sw-developer-simulation.sh +1 -1
  77. package/scripts/sw-discovery.sh +1 -1
  78. package/scripts/sw-doc-fleet.sh +1 -1
  79. package/scripts/sw-docs-agent.sh +1 -1
  80. package/scripts/sw-docs.sh +1 -1
  81. package/scripts/sw-doctor.sh +49 -1
  82. package/scripts/sw-dora.sh +1 -1
  83. package/scripts/sw-durable.sh +1 -1
  84. package/scripts/sw-e2e-orchestrator.sh +1 -1
  85. package/scripts/sw-eventbus.sh +1 -1
  86. package/scripts/sw-feedback.sh +1 -1
  87. package/scripts/sw-fix.sh +6 -5
  88. package/scripts/sw-fleet-discover.sh +1 -1
  89. package/scripts/sw-fleet-viz.sh +3 -3
  90. package/scripts/sw-fleet.sh +1 -1
  91. package/scripts/sw-github-app.sh +5 -2
  92. package/scripts/sw-github-checks.sh +1 -1
  93. package/scripts/sw-github-deploy.sh +1 -1
  94. package/scripts/sw-github-graphql.sh +1 -1
  95. package/scripts/sw-guild.sh +1 -1
  96. package/scripts/sw-heartbeat.sh +1 -1
  97. package/scripts/sw-hygiene.sh +1 -1
  98. package/scripts/sw-incident.sh +1 -1
  99. package/scripts/sw-init.sh +112 -9
  100. package/scripts/sw-instrument.sh +6 -1
  101. package/scripts/sw-intelligence.sh +5 -1
  102. package/scripts/sw-jira.sh +1 -1
  103. package/scripts/sw-launchd.sh +1 -1
  104. package/scripts/sw-linear.sh +20 -9
  105. package/scripts/sw-logs.sh +1 -1
  106. package/scripts/sw-loop.sh +2 -1
  107. package/scripts/sw-memory.sh +10 -1
  108. package/scripts/sw-mission-control.sh +1 -1
  109. package/scripts/sw-model-router.sh +4 -1
  110. package/scripts/sw-otel.sh +4 -4
  111. package/scripts/sw-oversight.sh +1 -1
  112. package/scripts/sw-pipeline-composer.sh +3 -1
  113. package/scripts/sw-pipeline-vitals.sh +4 -6
  114. package/scripts/sw-pipeline.sh +19 -56
  115. package/scripts/sw-pipeline.sh.mock +7 -0
  116. package/scripts/sw-pm.sh +5 -2
  117. package/scripts/sw-pr-lifecycle.sh +1 -1
  118. package/scripts/sw-predictive.sh +4 -1
  119. package/scripts/sw-prep.sh +3 -2
  120. package/scripts/sw-ps.sh +1 -1
  121. package/scripts/sw-public-dashboard.sh +10 -4
  122. package/scripts/sw-quality.sh +1 -1
  123. package/scripts/sw-reaper.sh +1 -1
  124. package/scripts/sw-recruit.sh +25 -1
  125. package/scripts/sw-regression.sh +2 -1
  126. package/scripts/sw-release-manager.sh +1 -1
  127. package/scripts/sw-release.sh +7 -5
  128. package/scripts/sw-remote.sh +1 -1
  129. package/scripts/sw-replay.sh +1 -1
  130. package/scripts/sw-retro.sh +1 -1
  131. package/scripts/sw-scale.sh +11 -5
  132. package/scripts/sw-security-audit.sh +1 -1
  133. package/scripts/sw-self-optimize.sh +172 -7
  134. package/scripts/sw-session.sh +1 -1
  135. package/scripts/sw-setup.sh +1 -1
  136. package/scripts/sw-standup.sh +4 -3
  137. package/scripts/sw-status.sh +1 -1
  138. package/scripts/sw-strategic.sh +2 -1
  139. package/scripts/sw-stream.sh +8 -2
  140. package/scripts/sw-swarm.sh +12 -10
  141. package/scripts/sw-team-stages.sh +1 -1
  142. package/scripts/sw-templates.sh +1 -1
  143. package/scripts/sw-testgen.sh +3 -2
  144. package/scripts/sw-tmux-pipeline.sh +2 -1
  145. package/scripts/sw-tmux.sh +1 -1
  146. package/scripts/sw-trace.sh +1 -1
  147. package/scripts/sw-tracker-jira.sh +1 -0
  148. package/scripts/sw-tracker-linear.sh +1 -0
  149. package/scripts/sw-tracker.sh +24 -6
  150. package/scripts/sw-triage.sh +1 -1
  151. package/scripts/sw-upgrade.sh +1 -1
  152. package/scripts/sw-ux.sh +1 -1
  153. package/scripts/sw-webhook.sh +1 -1
  154. package/scripts/sw-widgets.sh +2 -2
  155. package/scripts/sw-worktree.sh +1 -1
  156. 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.1.2-00d4ff?style=flat-square" alt="v2.1.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.1.2](#whats-new-in-v212)
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,17 +46,16 @@ 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.1.2
49
+ ## What's New in v2.3.0
50
50
 
51
- **AGI-Level Agent Recruitment** — dynamic role creation, LLM-powered matching, closed-loop learning:
51
+ **Docs & platform polish** — doc-fleet, shared libs, policy schema, release infra:
52
52
 
53
- - **`recruit match`** AI/heuristic task→role matching with `--json` output for pipeline integration
54
- - **`recruit team`**Context-aware team composition with cost estimation
55
- - **`recruit route`**Smart routing based on agent performance history
56
- - **Cross-system integration** — Pipeline, PM, triage, loop, and swarm all use recruit for model/role selection
57
- - **Self-tuning heuristics** — System learns keyword→role mappings from successful outcomes
58
- - **Meta-learning**Accuracy tracking and self-correction for matching decisions
59
- - **CI auto-discovery** — All 103 test suites now run in CI (previously 26)
53
+ - **Doc-fleet**Five Cursor agents (doc-architect, claude-md, strategy-curator, pattern-writer, readme-optimizer) keep docs, strategy, and README in sync
54
+ - **Pipeline lib split** `scripts/lib/pipeline-quality.sh`, `daemon-health.sh`, `policy.sh` for reuse and tests
55
+ - **Policy schema**`config/policy.json` and `docs/config-policy.md` for hygiene, quality, and platform rules
56
+ - **Release infra** — npm, GitHub Releases (darwin/linux/windows), Homebrew tap; `scripts/build-release.sh` and `.github/workflows/release.yml` ship all platforms
57
+
58
+ **v2.1.2**: AGI-level recruit `recruit match` / `team` / `route`, cross-system integration, 103 test suites in CI
60
59
 
61
60
  **v2.1.0**: tmux visual overhaul — role-colored borders, pipeline status widgets, active pane depth
62
61
 
@@ -103,18 +102,19 @@ When tests fail, the pipeline re-enters the build loop with error context — se
103
102
 
104
103
  ## Install
105
104
 
105
+ **One-command install** (recommended):
106
+
106
107
  ```bash
107
- 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
108
109
  ```
109
110
 
110
111
  <details>
111
112
  <summary>Other methods</summary>
112
113
 
113
- **From source**
114
+ **curl**
114
115
 
115
116
  ```bash
116
- git clone https://github.com/sethdford/shipwright.git
117
- cd shipwright && ./install.sh
117
+ curl -fsSL https://raw.githubusercontent.com/sethdford/shipwright/main/scripts/install-remote.sh | bash
118
118
  ```
119
119
 
120
120
  **npm** (global)
@@ -163,7 +163,7 @@ shipwright fleet start
163
163
  shipwright fix "upgrade deps" --repos ~/a,~/b,~/c
164
164
 
165
165
  # Release automation
166
- shipwright release --version 2.1.0
166
+ shipwright version bump 2.2.2
167
167
  shipwright changelog generate
168
168
  ```
169
169
 
@@ -382,7 +382,7 @@ shipwright fix "feat: add auth" --repos ~/a,~/b,~/c
382
382
  shipwright fleet-viz
383
383
 
384
384
  # Release automation
385
- shipwright release --version 2.1.0
385
+ shipwright version bump 2.2.2
386
386
  shipwright changelog generate
387
387
  shipwright deploys list
388
388
 
@@ -396,11 +396,11 @@ shipwright upgrade --apply
396
396
  shipwright --help
397
397
  ```
398
398
 
399
- 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).
400
400
 
401
401
  ## Pipeline Templates for Teams
402
402
 
403
- 25 team templates covering the full SDLC:
403
+ 24 team templates covering the full SDLC:
404
404
 
405
405
  ```bash
406
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>