create-planet 1.0.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 (35) hide show
  1. package/index.js +235 -0
  2. package/package.json +20 -0
  3. package/template/.claude/settings.json +5 -0
  4. package/template/.prettierrc +11 -0
  5. package/template/AGENTS.md +96 -0
  6. package/template/LICENSE +201 -0
  7. package/template/PROTOCOL_DIAGRAMS.md +195 -0
  8. package/template/README.md +51 -0
  9. package/template/astro.config.mjs +20 -0
  10. package/template/package.json +38 -0
  11. package/template/public/favicon.ico +0 -0
  12. package/template/public/map.js +329 -0
  13. package/template/public/planet.css +873 -0
  14. package/template/public/three.min.js +29395 -0
  15. package/template/schema.sql +22 -0
  16. package/template/scripts/inject-do-exports.js +61 -0
  17. package/template/scripts/simulate-universe.js +158 -0
  18. package/template/src/env.d.ts +21 -0
  19. package/template/src/lib/config.ts +52 -0
  20. package/template/src/lib/consensus.ts +127 -0
  21. package/template/src/lib/crypto.ts +89 -0
  22. package/template/src/lib/identity.ts +35 -0
  23. package/template/src/lib/travel.ts +75 -0
  24. package/template/src/pages/api/v1/control-ws.ts +22 -0
  25. package/template/src/pages/api/v1/port.ts +673 -0
  26. package/template/src/pages/control.astro +232 -0
  27. package/template/src/pages/index.astro +1009 -0
  28. package/template/src/pages/manifest.json.ts +37 -0
  29. package/template/src/tests/protocol.test.ts +158 -0
  30. package/template/src/tests/warp-links.test.ts +117 -0
  31. package/template/src/traffic-control.ts +52 -0
  32. package/template/tsconfig.json +9 -0
  33. package/template/vitest.config.ts +12 -0
  34. package/template/wrangler.build.jsonc +36 -0
  35. package/template/wrangler.dev.jsonc +41 -0
@@ -0,0 +1,232 @@
1
+ ---
2
+ import { PLANET_NAME } from "../lib/config";
3
+ const simName = import.meta.env.PUBLIC_SIM_PLANET_NAME || PLANET_NAME;
4
+ ---
5
+
6
+ <!doctype html>
7
+ <html lang="en">
8
+ <head>
9
+ <meta charset="UTF-8" />
10
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
11
+ <title>Flight Control Center - {simName}</title>
12
+ <link rel="stylesheet" href="/planet.css" />
13
+ <style>
14
+ body {
15
+ padding: 0.5rem 0 !important;
16
+ }
17
+ .control-panel {
18
+ width: 98%;
19
+ max-width: 1400px;
20
+ background: rgba(15, 20, 30, 0.95);
21
+ border: 1px solid var(--sky-accent);
22
+ border-radius: 8px;
23
+ padding: 0.8rem;
24
+ margin-top: 0;
25
+ box-shadow: 0 0 40px rgba(74, 144, 226, 0.2);
26
+ font-family: "Courier New", Courier, monospace;
27
+ }
28
+ .panel-header {
29
+ display: flex;
30
+ justify-content: space-between;
31
+ align-items: center;
32
+ border-bottom: 1px solid rgba(74, 144, 226, 0.3);
33
+ padding-bottom: 0.4rem;
34
+ margin-bottom: 0.6rem;
35
+ }
36
+ .panel-header h2 {
37
+ margin: 0;
38
+ font-size: 0.9rem;
39
+ letter-spacing: 1px;
40
+ color: var(--sky-accent);
41
+ }
42
+ .connection-status {
43
+ font-size: 0.7rem;
44
+ display: flex;
45
+ align-items: center;
46
+ gap: 0.4rem;
47
+ }
48
+ .status-dot {
49
+ width: 6px;
50
+ height: 6px;
51
+ border-radius: 50%;
52
+ background: #888;
53
+ }
54
+ .status-dot.connected {
55
+ background: #2ecc71;
56
+ box-shadow: 0 0 10px #2ecc71;
57
+ }
58
+ .event-log {
59
+ height: calc(100vh - 100px);
60
+ min-height: 400px;
61
+ overflow-y: auto;
62
+ display: flex;
63
+ flex-direction: column;
64
+ gap: 0.2rem;
65
+ padding-right: 0.5rem;
66
+ }
67
+ .event-log::-webkit-scrollbar {
68
+ width: 4px;
69
+ }
70
+ .event-log::-webkit-scrollbar-track {
71
+ background: rgba(255, 255, 255, 0.05);
72
+ }
73
+ .event-log::-webkit-scrollbar-thumb {
74
+ background: var(--sky-accent);
75
+ border-radius: 2px;
76
+ }
77
+ .event-entry {
78
+ background: rgba(255, 255, 255, 0.02);
79
+ border-left: 2px solid #444;
80
+ padding: 0.4rem 0.6rem;
81
+ font-size: 0.75rem;
82
+ animation: slideIn 0.2s ease-out;
83
+ }
84
+ @keyframes slideIn {
85
+ from {
86
+ transform: translateX(-5px);
87
+ opacity: 0;
88
+ }
89
+ to {
90
+ transform: translateX(0);
91
+ opacity: 1;
92
+ }
93
+ }
94
+ .event-entry.API_REQUEST {
95
+ border-left-color: #3498db;
96
+ }
97
+ .event-entry.INITIATE_TRAVEL {
98
+ border-left-color: #f1c40f;
99
+ }
100
+ .event-entry.QUORUM_REACHED {
101
+ border-left-color: #2ecc71;
102
+ }
103
+ .event-entry.API_ERROR {
104
+ border-left-color: #e74c3c;
105
+ }
106
+ .event-entry.LANDING_AUTHORIZED {
107
+ border-left-color: #9b59b6;
108
+ }
109
+
110
+ .event-time {
111
+ color: #666;
112
+ font-size: 0.7rem;
113
+ margin-right: 0.6rem;
114
+ }
115
+ .event-type {
116
+ font-weight: bold;
117
+ margin-right: 0.6rem;
118
+ }
119
+ .event-planet {
120
+ color: var(--sky-accent);
121
+ }
122
+ .event-data {
123
+ color: #888;
124
+ margin-top: 0.1rem;
125
+ font-size: 0.7rem;
126
+ }
127
+
128
+ footer {
129
+ margin-top: 0.5rem !important;
130
+ padding: 0.5rem !important;
131
+ font-size: 0.7rem !important;
132
+ }
133
+ </style>
134
+ </head>
135
+ <body>
136
+ <div class="control-panel">
137
+ <div class="panel-header">
138
+ <h2>FLIGHT CONTROL: {simName}</h2>
139
+ <div class="connection-status">
140
+ <div id="status-dot" class="status-dot"></div>
141
+ <span id="status-text">DISCONNECTED</span>
142
+ </div>
143
+ </div>
144
+
145
+ <div id="event-log" class="event-log">
146
+ <div class="event-entry">
147
+ System ready. Waiting for sector events...
148
+ </div>
149
+ </div>
150
+ </div>
151
+
152
+ <footer>Federated Planets | Concentric v1.0</footer>
153
+
154
+ <script is:inline>
155
+ const logContainer = document.getElementById("event-log");
156
+ const statusDot = document.getElementById("status-dot");
157
+ const statusText = document.getElementById("status-text");
158
+
159
+ function addEvent(event) {
160
+ const entry = document.createElement("div");
161
+ entry.className = `event-entry ${event.type || ""}`;
162
+
163
+ const time = new Date(
164
+ event.timestamp || Date.now(),
165
+ ).toLocaleTimeString();
166
+
167
+ let dataHtml = "";
168
+ if (event.action) dataHtml += `<span>Action: ${event.action}</span> `;
169
+ if (event.ship_id) dataHtml += `<span>Ship: ${event.ship_id}</span> `;
170
+ if (event.destination)
171
+ dataHtml += `<span>Dest: ${event.destination}</span> `;
172
+ if (event.error)
173
+ dataHtml += `<span style="color: #e74c3c">Error: ${event.error}</span> `;
174
+
175
+ entry.innerHTML = `
176
+ <div class="event-meta">
177
+ <span class="event-time">[${time}]</span>
178
+ <span class="event-type">${event.type || "EVENT"}</span>
179
+ <span class="event-planet">@${event.planet || "Unknown"}</span>
180
+ ${event.from ? `<span class="event-from" style="color: #888; font-size: 0.7rem; margin-left: 0.5rem;">FROM: ${event.from}</span>` : ""}
181
+ </div>
182
+ <div class="event-data">${dataHtml}</div>
183
+ `;
184
+
185
+ logContainer.prepend(entry);
186
+
187
+ // Keep max 100 entries in DOM
188
+ if (logContainer.children.length > 100) {
189
+ logContainer.removeChild(logContainer.lastChild);
190
+ }
191
+ }
192
+
193
+ function connect() {
194
+ const protocol = window.location.protocol === "https:" ? "wss:" : "ws:";
195
+ const wsUrl = `${protocol}//${window.location.host}/api/v1/control-ws`;
196
+
197
+ console.log("Connecting to", wsUrl);
198
+ const socket = new WebSocket(wsUrl);
199
+
200
+ socket.onopen = () => {
201
+ statusDot.classList.add("connected");
202
+ statusText.textContent = "CONNECTED";
203
+ console.log("WebSocket Connected");
204
+ };
205
+
206
+ socket.onmessage = (event) => {
207
+ const data = JSON.parse(event.data);
208
+
209
+ if (data.type === "history") {
210
+ logContainer.innerHTML = ""; // Clear initial message
211
+ data.data.forEach(addEvent);
212
+ } else {
213
+ addEvent(data);
214
+ }
215
+ };
216
+
217
+ socket.onclose = () => {
218
+ statusDot.classList.remove("connected");
219
+ statusText.textContent = "RECONNECTING...";
220
+ console.log("WebSocket Closed. Reconnecting in 3s...");
221
+ setTimeout(connect, 3000);
222
+ };
223
+
224
+ socket.onerror = (error) => {
225
+ console.error("WebSocket Error:", error);
226
+ };
227
+ }
228
+
229
+ connect();
230
+ </script>
231
+ </body>
232
+ </html>