@ibgib/space-gib 0.0.35 → 0.0.36
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/dist/client/bootstrap.mjs +1 -1
- package/dist/client/{chunk-FIAGRVBY.mjs → chunk-5DTAUY3E.mjs} +204 -101
- package/dist/client/{chunk-XLQ3UCQY.mjs → chunk-J7X3XTAI.mjs} +1 -1
- package/dist/client/css/tutorial.css +327 -0
- package/dist/client/index.mjs +1 -1
- package/dist/client/script.mjs +1 -1
- package/dist/client/style.css +1 -0
- package/package.json +4 -4
- package/src/client/AUTO-GENERATED-version.mts +1 -1
- package/src/client/css/tutorial.css +327 -0
- package/src/client/style.css +1 -0
- package/src/client/ui/component/cosmos-navigator/cosmos-navigator.mts +31 -0
- package/src/client/ui/component/tutorial/index.mts +9 -0
- package/src/client/ui/component/tutorial/scripts/pitch-tour-script.mts +265 -0
- package/src/client/ui/component/tutorial/tutorial-controller.mts +622 -0
- package/src/client/ui/component/tutorial/tutorial-types.mts +45 -0
- package/src/client/ui/component/tutorial/tutorial.css +260 -0
- package/src/client/ui/shell/space-gib-shell-service.mts +28 -24
|
@@ -0,0 +1,327 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* tutorial.css — Styles for the Space-Gib Interactive Tutorial & Spotlight Tour
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
.tutorial-overlay-container {
|
|
6
|
+
position: fixed;
|
|
7
|
+
inset: 0;
|
|
8
|
+
z-index: 10000;
|
|
9
|
+
pointer-events: none;
|
|
10
|
+
overflow: hidden;
|
|
11
|
+
transition: opacity 0.3s ease;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/* Semi-transparent dimmer backdrop (active only when no spotlight target) */
|
|
15
|
+
.tutorial-backdrop {
|
|
16
|
+
position: absolute;
|
|
17
|
+
inset: 0;
|
|
18
|
+
background: rgba(8, 10, 15, 0.82);
|
|
19
|
+
backdrop-filter: blur(4px);
|
|
20
|
+
-webkit-backdrop-filter: blur(4px);
|
|
21
|
+
pointer-events: auto;
|
|
22
|
+
opacity: 0;
|
|
23
|
+
transition: opacity 0.3s ease;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
.tutorial-backdrop.backdrop-active {
|
|
27
|
+
opacity: 1;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/* Glowing spotlight ring around the active target with 100% crystal-clear cutout */
|
|
31
|
+
.tutorial-spotlight-ring {
|
|
32
|
+
position: absolute;
|
|
33
|
+
border-radius: 8px;
|
|
34
|
+
background: transparent !important;
|
|
35
|
+
box-shadow: 0 0 0 9999px rgba(8, 10, 15, 0.82),
|
|
36
|
+
0 0 0 3px rgba(255, 204, 0, 0.85),
|
|
37
|
+
0 0 25px 6px rgba(255, 180, 0, 0.45);
|
|
38
|
+
pointer-events: none;
|
|
39
|
+
transition: top 0.35s cubic-bezier(0.2, 0.9, 0.3, 1),
|
|
40
|
+
left 0.35s cubic-bezier(0.2, 0.9, 0.3, 1),
|
|
41
|
+
width 0.35s cubic-bezier(0.2, 0.9, 0.3, 1),
|
|
42
|
+
height 0.35s cubic-bezier(0.2, 0.9, 0.3, 1),
|
|
43
|
+
opacity 0.25s ease;
|
|
44
|
+
z-index: 10001;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/* Animated Virtual Mouse Cursor */
|
|
48
|
+
.tutorial-cursor {
|
|
49
|
+
position: fixed;
|
|
50
|
+
top: 0;
|
|
51
|
+
left: 0;
|
|
52
|
+
width: 32px;
|
|
53
|
+
height: 32px;
|
|
54
|
+
z-index: 10006;
|
|
55
|
+
pointer-events: none;
|
|
56
|
+
opacity: 0;
|
|
57
|
+
transform: translate(-9999px, -9999px);
|
|
58
|
+
transition: opacity 0.25s ease;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
.tutorial-cursor.visible {
|
|
62
|
+
opacity: 1;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
.tutorial-cursor-pointer {
|
|
66
|
+
filter: drop-shadow(0 3px 8px rgba(0, 0, 0, 0.7));
|
|
67
|
+
transition: transform 0.12s ease;
|
|
68
|
+
transform-origin: 0 0;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
.tutorial-cursor.clicking .tutorial-cursor-pointer {
|
|
72
|
+
transform: scale(0.82);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
.tutorial-cursor-ripple {
|
|
76
|
+
position: absolute;
|
|
77
|
+
top: 0;
|
|
78
|
+
left: 0;
|
|
79
|
+
width: 36px;
|
|
80
|
+
height: 36px;
|
|
81
|
+
border-radius: 50%;
|
|
82
|
+
border: 2px solid #ffd700;
|
|
83
|
+
background: rgba(255, 215, 0, 0.25);
|
|
84
|
+
box-shadow: 0 0 16px rgba(255, 215, 0, 0.85);
|
|
85
|
+
transform: translate(-18px, -18px) scale(0);
|
|
86
|
+
opacity: 0;
|
|
87
|
+
pointer-events: none;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
.tutorial-cursor.clicking .tutorial-cursor-ripple {
|
|
91
|
+
animation: cursor-ripple-anim 0.55s cubic-bezier(0.1, 0.8, 0.3, 1) forwards;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
@keyframes cursor-ripple-anim {
|
|
95
|
+
0% {
|
|
96
|
+
transform: translate(-18px, -18px) scale(0.2);
|
|
97
|
+
opacity: 1;
|
|
98
|
+
}
|
|
99
|
+
100% {
|
|
100
|
+
transform: translate(-18px, -18px) scale(2.5);
|
|
101
|
+
opacity: 0;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/* Movable Golden Beacon Button */
|
|
106
|
+
.tutorial-beacon {
|
|
107
|
+
position: absolute;
|
|
108
|
+
display: flex;
|
|
109
|
+
align-items: center;
|
|
110
|
+
gap: 8px;
|
|
111
|
+
padding: 8px 18px;
|
|
112
|
+
background: linear-gradient(135deg, #ffd700 0%, #ff9900 100%);
|
|
113
|
+
color: #121212;
|
|
114
|
+
font-family: inherit;
|
|
115
|
+
font-size: 0.95rem;
|
|
116
|
+
font-weight: 700;
|
|
117
|
+
border: 2px solid rgba(255, 255, 255, 0.8);
|
|
118
|
+
border-radius: 9999px;
|
|
119
|
+
box-shadow: 0 4px 20px rgba(255, 180, 0, 0.65), 0 0 30px rgba(255, 215, 0, 0.4);
|
|
120
|
+
cursor: pointer;
|
|
121
|
+
pointer-events: auto;
|
|
122
|
+
z-index: 10002;
|
|
123
|
+
transition: top 0.35s cubic-bezier(0.2, 0.9, 0.3, 1),
|
|
124
|
+
left 0.35s cubic-bezier(0.2, 0.9, 0.3, 1),
|
|
125
|
+
transform 0.2s ease,
|
|
126
|
+
box-shadow 0.2s ease,
|
|
127
|
+
opacity 0.25s ease;
|
|
128
|
+
animation: beacon-pulse 2s infinite ease-in-out;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
.tutorial-beacon:hover {
|
|
132
|
+
transform: scale(1.06);
|
|
133
|
+
box-shadow: 0 6px 28px rgba(255, 190, 0, 0.85), 0 0 40px rgba(255, 230, 100, 0.6);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
.tutorial-beacon:active {
|
|
137
|
+
transform: scale(0.96);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
.tutorial-beacon-icon {
|
|
141
|
+
font-size: 1.15rem;
|
|
142
|
+
line-height: 1;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
.tutorial-beacon-text {
|
|
146
|
+
letter-spacing: 0.02em;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
@keyframes beacon-pulse {
|
|
150
|
+
0%, 100% {
|
|
151
|
+
box-shadow: 0 4px 20px rgba(255, 180, 0, 0.65), 0 0 15px rgba(255, 215, 0, 0.4);
|
|
152
|
+
}
|
|
153
|
+
50% {
|
|
154
|
+
box-shadow: 0 4px 30px rgba(255, 200, 0, 0.9), 0 0 35px rgba(255, 230, 50, 0.7);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/* Floating Glassmorphic Narration Card */
|
|
159
|
+
.tutorial-card {
|
|
160
|
+
position: absolute;
|
|
161
|
+
width: 440px;
|
|
162
|
+
max-width: calc(100vw - 32px);
|
|
163
|
+
background: rgba(18, 22, 34, 0.95);
|
|
164
|
+
backdrop-filter: blur(16px);
|
|
165
|
+
-webkit-backdrop-filter: blur(16px);
|
|
166
|
+
border: 1px solid rgba(255, 215, 0, 0.35);
|
|
167
|
+
border-radius: 14px;
|
|
168
|
+
box-shadow: 0 16px 40px rgba(0, 0, 0, 0.75), 0 0 20px rgba(255, 200, 0, 0.15);
|
|
169
|
+
padding: 22px 24px;
|
|
170
|
+
color: #e2e8f0;
|
|
171
|
+
pointer-events: auto;
|
|
172
|
+
z-index: 10002;
|
|
173
|
+
transition: top 0.35s cubic-bezier(0.2, 0.9, 0.3, 1),
|
|
174
|
+
left 0.35s cubic-bezier(0.2, 0.9, 0.3, 1),
|
|
175
|
+
opacity 0.25s ease;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
.tutorial-card.placement-center {
|
|
179
|
+
top: 50% !important;
|
|
180
|
+
left: 50% !important;
|
|
181
|
+
transform: translate(-50%, -50%);
|
|
182
|
+
width: 620px;
|
|
183
|
+
border-color: rgba(255, 215, 0, 0.45);
|
|
184
|
+
box-shadow: 0 20px 60px rgba(0, 0, 0, 0.85), 0 0 40px rgba(255, 200, 0, 0.25);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
.tutorial-card-header {
|
|
188
|
+
display: flex;
|
|
189
|
+
align-items: center;
|
|
190
|
+
justify-content: space-between;
|
|
191
|
+
margin-bottom: 12px;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
.tutorial-step-badge {
|
|
195
|
+
font-size: 0.75rem;
|
|
196
|
+
font-weight: 700;
|
|
197
|
+
text-transform: uppercase;
|
|
198
|
+
letter-spacing: 0.08em;
|
|
199
|
+
color: #ffd700;
|
|
200
|
+
background: rgba(255, 215, 0, 0.12);
|
|
201
|
+
padding: 4px 10px;
|
|
202
|
+
border-radius: 9999px;
|
|
203
|
+
border: 1px solid rgba(255, 215, 0, 0.3);
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
.tutorial-card-close {
|
|
207
|
+
background: none;
|
|
208
|
+
border: none;
|
|
209
|
+
color: #94a3b8;
|
|
210
|
+
font-size: 1.25rem;
|
|
211
|
+
cursor: pointer;
|
|
212
|
+
padding: 4px 8px;
|
|
213
|
+
border-radius: 6px;
|
|
214
|
+
transition: color 0.15s ease, background 0.15s ease;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
.tutorial-card-close:hover {
|
|
218
|
+
color: #ffffff;
|
|
219
|
+
background: rgba(255, 255, 255, 0.1);
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
.tutorial-card-title {
|
|
223
|
+
margin: 0 0 12px 0;
|
|
224
|
+
font-size: 1.25rem;
|
|
225
|
+
font-weight: 700;
|
|
226
|
+
color: #ffffff;
|
|
227
|
+
line-height: 1.35;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
.tutorial-card-body {
|
|
231
|
+
font-size: 0.92rem;
|
|
232
|
+
line-height: 1.6;
|
|
233
|
+
color: #cbd5e1;
|
|
234
|
+
margin-bottom: 20px;
|
|
235
|
+
max-height: 55vh;
|
|
236
|
+
overflow-y: auto;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
.tutorial-card-body p {
|
|
240
|
+
margin: 0 0 10px 0;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
.tutorial-card-body p:last-child {
|
|
244
|
+
margin-bottom: 0;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
.tutorial-card-body strong {
|
|
248
|
+
color: #f8fafc;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
.tutorial-card-body em {
|
|
252
|
+
color: #ffd700;
|
|
253
|
+
font-style: normal;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
.tutorial-card-footer {
|
|
257
|
+
display: flex;
|
|
258
|
+
align-items: center;
|
|
259
|
+
justify-content: space-between;
|
|
260
|
+
padding-top: 14px;
|
|
261
|
+
border-top: 1px solid rgba(255, 255, 255, 0.08);
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
.tutorial-progress-dots {
|
|
265
|
+
display: flex;
|
|
266
|
+
gap: 6px;
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
.tutorial-dot {
|
|
270
|
+
width: 8px;
|
|
271
|
+
height: 8px;
|
|
272
|
+
border-radius: 9999px;
|
|
273
|
+
background: rgba(255, 255, 255, 0.2);
|
|
274
|
+
transition: background 0.25s ease, transform 0.25s ease;
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
.tutorial-dot.active {
|
|
278
|
+
background: #ffd700;
|
|
279
|
+
transform: scale(1.25);
|
|
280
|
+
box-shadow: 0 0 8px #ffd700;
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
.tutorial-card-actions {
|
|
284
|
+
display: flex;
|
|
285
|
+
align-items: center;
|
|
286
|
+
gap: 10px;
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
.tutorial-btn-skip {
|
|
290
|
+
background: none;
|
|
291
|
+
border: none;
|
|
292
|
+
color: #94a3b8;
|
|
293
|
+
font-size: 0.85rem;
|
|
294
|
+
cursor: pointer;
|
|
295
|
+
padding: 6px 12px;
|
|
296
|
+
border-radius: 6px;
|
|
297
|
+
transition: color 0.15s ease;
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
.tutorial-btn-skip:hover {
|
|
301
|
+
color: #ffffff;
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
.tutorial-btn-next {
|
|
305
|
+
display: inline-flex;
|
|
306
|
+
align-items: center;
|
|
307
|
+
gap: 6px;
|
|
308
|
+
background: linear-gradient(135deg, #ffd700 0%, #ffaa00 100%);
|
|
309
|
+
color: #0f172a;
|
|
310
|
+
font-weight: 700;
|
|
311
|
+
font-size: 0.9rem;
|
|
312
|
+
padding: 8px 18px;
|
|
313
|
+
border: none;
|
|
314
|
+
border-radius: 8px;
|
|
315
|
+
cursor: pointer;
|
|
316
|
+
box-shadow: 0 4px 14px rgba(255, 180, 0, 0.4);
|
|
317
|
+
transition: transform 0.15s ease, box-shadow 0.15s ease;
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
.tutorial-btn-next:hover {
|
|
321
|
+
transform: translateY(-1px);
|
|
322
|
+
box-shadow: 0 6px 20px rgba(255, 180, 0, 0.6);
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
.tutorial-btn-next:active {
|
|
326
|
+
transform: translateY(1px);
|
|
327
|
+
}
|
package/src/client/style.css
CHANGED
|
@@ -578,6 +578,37 @@ export class CosmosNavigatorComponentInstance
|
|
|
578
578
|
}
|
|
579
579
|
}
|
|
580
580
|
|
|
581
|
+
/**
|
|
582
|
+
* Programmatically launches the Code Galaxy satellite without a prompt modal.
|
|
583
|
+
* Ideal for automated tutorials, tours, and scripted actions.
|
|
584
|
+
*/
|
|
585
|
+
public async launchCodeGalaxyProgrammatic(galaxyName: string = 'code-1'): Promise<AttachedSpace | null> {
|
|
586
|
+
let activeCosmos = this.getActiveCosmos();
|
|
587
|
+
if (!activeCosmos && this.cosmoses.length > 0) {
|
|
588
|
+
this.selectCosmos(this.cosmoses[0].id);
|
|
589
|
+
activeCosmos = this.getActiveCosmos();
|
|
590
|
+
}
|
|
591
|
+
if (!activeCosmos) return null;
|
|
592
|
+
|
|
593
|
+
const sourceBtn = this.el.btnSatCodeEl || this.el.btnNodeSuperspaceEl;
|
|
594
|
+
const sourceWrapper = (sourceBtn?.closest('.satellite-wrapper') as HTMLElement) || sourceBtn;
|
|
595
|
+
|
|
596
|
+
let space = activeCosmos.spaces.find(s => s.id === galaxyName || s.name === galaxyName);
|
|
597
|
+
if (!space) {
|
|
598
|
+
space = await this.createAndAttachGalaxy({
|
|
599
|
+
cosmosId: activeCosmos.id,
|
|
600
|
+
galaxyName,
|
|
601
|
+
discriminator: GalaxyPresetType.code,
|
|
602
|
+
skipEvent: true,
|
|
603
|
+
});
|
|
604
|
+
}
|
|
605
|
+
|
|
606
|
+
if (space) {
|
|
607
|
+
return this.handleSpaceClick(space, sourceBtn, sourceWrapper);
|
|
608
|
+
}
|
|
609
|
+
return null;
|
|
610
|
+
}
|
|
611
|
+
|
|
581
612
|
public async handleSatTextClick(): Promise<void> {
|
|
582
613
|
const activeCosmos = this.getActiveCosmos();
|
|
583
614
|
if (!activeCosmos) return;
|
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module pitch-tour-script
|
|
3
|
+
*
|
|
4
|
+
* The Founder Pitch Tour script for Space-Gib.
|
|
5
|
+
* Walks through the full ibgib cosmology contrasting each layer against the legacy
|
|
6
|
+
* Git/GitHub/GitLab stack, with automated in-between mouse click animations,
|
|
7
|
+
* culminating in a transparent founder investment thesis.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { TutorialScript } from '../tutorial-types.mjs';
|
|
11
|
+
import { findElementDeep } from '../tutorial-controller.mjs';
|
|
12
|
+
|
|
13
|
+
export const PITCH_TOUR_SCRIPT_ID = 'space-gib-founder-pitch-tour';
|
|
14
|
+
|
|
15
|
+
export const PITCH_TOUR_SCRIPT: TutorialScript = {
|
|
16
|
+
id: PITCH_TOUR_SCRIPT_ID,
|
|
17
|
+
title: 'The Post-Git Frontier: Founder Pitch Tour',
|
|
18
|
+
steps: [
|
|
19
|
+
// =====================================================================
|
|
20
|
+
// STEP 1: Introduction & The Post-Git Thesis
|
|
21
|
+
// =====================================================================
|
|
22
|
+
{
|
|
23
|
+
id: 'step-1-thesis',
|
|
24
|
+
title: 'The Post-Git Frontier: Unlocking Autonomous AI Agents',
|
|
25
|
+
narration: `
|
|
26
|
+
<p>The fundamental bottleneck for AI software engineering is <strong>not</strong> the models—it is <strong>Git</strong>.</p>
|
|
27
|
+
<p>Modern agent harnesses, coding assistants, and CI/CD pipelines are chained to a 2005 architecture designed for human developers emailing diff patches. When autonomous agents code concurrently, the Git stack collapses:</p>
|
|
28
|
+
<ul>
|
|
29
|
+
<li><strong>Git & Worktrees:</strong> Fragile locks, merge conflicts that stop the world, detached HEADs.</li>
|
|
30
|
+
<li><strong>Package Managers (npm, PyPI):</strong> External out-of-band registries vulnerable to supply chain hijacking.</li>
|
|
31
|
+
<li><strong>Asset Managers (Git LFS):</strong> Fragile pointer files pointing to separate, proprietary blob servers.</li>
|
|
32
|
+
<li><strong>External Comms (GitHub Issues, Slack, Discord):</strong> Trapped in centralized corporate silos separated from code history.</li>
|
|
33
|
+
</ul>
|
|
34
|
+
<p><strong>The Solution: A Unified Merkle Cosmology.</strong> Let us begin with the birth of our workspace.</p>
|
|
35
|
+
<p><em>Click [Ignite the Big Bang ➔] to witness the workspace creation.</em></p>
|
|
36
|
+
`,
|
|
37
|
+
targetElementId: undefined, // center placement
|
|
38
|
+
placement: 'center',
|
|
39
|
+
beaconLabel: 'Begin Pitch ✨',
|
|
40
|
+
buttonText: 'Ignite the Big Bang ➔',
|
|
41
|
+
action: async (ctx) => {
|
|
42
|
+
await ctx.shell?.showCosmos?.();
|
|
43
|
+
},
|
|
44
|
+
transitionAction: async (ctx, controller) => {
|
|
45
|
+
// Ensure Cosmos is showing
|
|
46
|
+
await ctx.shell?.showCosmos?.();
|
|
47
|
+
const cosmosNav = ctx.shell?.getCosmosNavigator?.();
|
|
48
|
+
const singularityBtn = findElementDeep('btn-singularity');
|
|
49
|
+
|
|
50
|
+
if (singularityBtn && (!cosmosNav || !cosmosNav.hasBigBangExploded)) {
|
|
51
|
+
// Glide virtual mouse to the Singularity button and click it
|
|
52
|
+
await controller.animateMouseClick(singularityBtn, { durationMs: 800 });
|
|
53
|
+
|
|
54
|
+
// Trigger the physical Big Bang sequence
|
|
55
|
+
await new Promise<void>((resolve) => {
|
|
56
|
+
if (cosmosNav?.triggerBigBangSequence) {
|
|
57
|
+
cosmosNav.triggerBigBangSequence(() => {
|
|
58
|
+
resolve();
|
|
59
|
+
});
|
|
60
|
+
} else {
|
|
61
|
+
singularityBtn.click();
|
|
62
|
+
setTimeout(resolve, 1400);
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
// Allow the Cosmos stage and revolving satellites to blossom
|
|
66
|
+
await new Promise((r) => setTimeout(r, 650));
|
|
67
|
+
} else {
|
|
68
|
+
// Already exploded, ensure Cosmos stage is visible
|
|
69
|
+
await ctx.shell?.showCosmos?.();
|
|
70
|
+
await new Promise((r) => setTimeout(r, 400));
|
|
71
|
+
}
|
|
72
|
+
},
|
|
73
|
+
},
|
|
74
|
+
|
|
75
|
+
// =====================================================================
|
|
76
|
+
// STEP 2: The Cosmos (Root Container)
|
|
77
|
+
// =====================================================================
|
|
78
|
+
{
|
|
79
|
+
id: 'step-2-cosmos-container',
|
|
80
|
+
title: '1. The Cosmos: Supercharged Monorepo Container',
|
|
81
|
+
narration: `
|
|
82
|
+
<p>Welcome to the <strong>Cosmos</strong>—the root container that replaces multi-repo sprawl and fractured monorepo tooling.</p>
|
|
83
|
+
<p>In traditional setups, coordinating multiple repositories, Git submodules, or Lerna/Turborepo workspaces requires fragile symlinks, separate CI configs, and constant sync friction.</p>
|
|
84
|
+
<p>In <code>ibgib</code>, a <strong>Cosmos</strong> is a unified, sovereign Merkle coordinate space. It hosts interconnected <strong>Galaxies</strong>—each with discrete cryptographic boundaries, bound together by inverted soft links.</p>
|
|
85
|
+
<p>Watch as we spawn our primary workspace: a <strong>Code Galaxy</strong>.</p>
|
|
86
|
+
`,
|
|
87
|
+
targetElementId: 'node-superspace-wrapper',
|
|
88
|
+
placement: 'bottom',
|
|
89
|
+
beaconLabel: 'Code Galaxy 🚀',
|
|
90
|
+
buttonText: 'Birth Code Galaxy ➔',
|
|
91
|
+
action: async (ctx) => {
|
|
92
|
+
await ctx.shell?.showCosmos?.();
|
|
93
|
+
},
|
|
94
|
+
transitionAction: async (ctx, controller) => {
|
|
95
|
+
const btnSatCode = findElementDeep('btn-sat-code');
|
|
96
|
+
const cosmosNav = ctx.shell?.getCosmosNavigator?.();
|
|
97
|
+
|
|
98
|
+
if (btnSatCode) {
|
|
99
|
+
// Move virtual mouse cursor to the revolving Code Galaxy satellite
|
|
100
|
+
await controller.animateMouseClick(btnSatCode, { durationMs: 800 });
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// Trigger programmatic launch of the Code Galaxy projectile
|
|
104
|
+
if (cosmosNav?.launchCodeGalaxyProgrammatic) {
|
|
105
|
+
await cosmosNav.launchCodeGalaxyProgrammatic('code-1');
|
|
106
|
+
// Wait for the projectile to fly across the screen, dock into the activity bar, and expand panels
|
|
107
|
+
await new Promise((r) => setTimeout(r, 1800));
|
|
108
|
+
} else {
|
|
109
|
+
ctx.shell?.expandActivityBar?.();
|
|
110
|
+
ctx.shell?.expandLeftPanel?.();
|
|
111
|
+
ctx.shell?.showLeftPanelView?.('code', 'code-1');
|
|
112
|
+
await new Promise((r) => setTimeout(r, 600));
|
|
113
|
+
}
|
|
114
|
+
},
|
|
115
|
+
},
|
|
116
|
+
|
|
117
|
+
// =====================================================================
|
|
118
|
+
// STEP 3: Class I: Code Galaxy (The Git Replacement)
|
|
119
|
+
// =====================================================================
|
|
120
|
+
{
|
|
121
|
+
id: 'step-3-code-galaxy',
|
|
122
|
+
title: '2. Code Galaxy: Accretive Merkle Branches & Zero Push Rejections',
|
|
123
|
+
narration: `
|
|
124
|
+
<p>The <strong>Code Galaxy</strong> is our native replacement for a Git repository.</p>
|
|
125
|
+
<p>Notice the File Explorer on the left. In <code>ibgib</code>, every file, folder, and branch is an immutable, content-addressed Merkle node.</p>
|
|
126
|
+
<p><strong>Why this defeats Git for AI Agents:</strong></p>
|
|
127
|
+
<ul>
|
|
128
|
+
<li><strong>Accretive 3-Way Graft Merging:</strong> In Git, concurrent agent pushes fail with non-fast-forward push rejections. In <code>ibgib</code>, concurrent agent commits graft accretively without blocking repository state.</li>
|
|
129
|
+
<li><strong>No Detached HEADs:</strong> Timelines are monotonic and cryptographically sovereign.</li>
|
|
130
|
+
<li><strong>Instant Worktrees:</strong> Multiple agents can branch and execute simultaneously in-memory without cloning gigabytes of files to disk.</li>
|
|
131
|
+
</ul>
|
|
132
|
+
`,
|
|
133
|
+
targetElementId: 'code-file-explorer-container',
|
|
134
|
+
placement: 'right',
|
|
135
|
+
beaconLabel: 'Code Substrate 📁',
|
|
136
|
+
buttonText: 'Inspect In-Band Discourse ➔',
|
|
137
|
+
action: async (ctx) => {
|
|
138
|
+
ctx.shell?.expandLeftPanel?.();
|
|
139
|
+
ctx.shell?.showLeftPanelView?.('code', ctx.galaxyName || 'code-1');
|
|
140
|
+
},
|
|
141
|
+
transitionAction: async (ctx, controller) => {
|
|
142
|
+
// Select a file in the explorer and open editor & right companion panel
|
|
143
|
+
const files = ['README.md', 'app.ts', 'index.ts'];
|
|
144
|
+
for (const f of files) {
|
|
145
|
+
try {
|
|
146
|
+
ctx.shell?.fileExplorerInstance?.selectFile?.(f);
|
|
147
|
+
break;
|
|
148
|
+
} catch { /* continue */ }
|
|
149
|
+
}
|
|
150
|
+
await ctx.shell?.showCode?.();
|
|
151
|
+
ctx.shell?.expandRightPanel?.();
|
|
152
|
+
await new Promise((r) => setTimeout(r, 650));
|
|
153
|
+
},
|
|
154
|
+
},
|
|
155
|
+
|
|
156
|
+
// =====================================================================
|
|
157
|
+
// STEP 4: Class IV: Metatext Galaxy (In-Band Discourse)
|
|
158
|
+
// =====================================================================
|
|
159
|
+
{
|
|
160
|
+
id: 'step-4-metatext-galaxy',
|
|
161
|
+
title: '3. Metatext Galaxy: In-Band Discourse & Reviews (.ib.*.md)',
|
|
162
|
+
narration: `
|
|
163
|
+
<p>Look at the right panel. In legacy software engineering, code lives in Git, but discussions, PR reviews, bug reports, and agent rationale are locked in proprietary third-party silos: <strong>GitHub Issues, Jira, Slack, or Discord</strong>.</p>
|
|
164
|
+
<p>When an AI agent writes code, its reasoning and discussion are lost from the repository's cryptographic history.</p>
|
|
165
|
+
<p>In <code>ibgib</code>, <strong>Metatext Galaxies</strong> embed discussions, companion reviews, and prompt rationale <strong>in-band in the exact same Merkle DAG</strong> using companion files (<code>.ib.*.md</code>).</p>
|
|
166
|
+
<p>Code and rationale evolve together. You own your code <em>and</em> the conversation that created it.</p>
|
|
167
|
+
`,
|
|
168
|
+
targetElementId: 'right-panel',
|
|
169
|
+
placement: 'left',
|
|
170
|
+
beaconLabel: 'In-Band State 💬',
|
|
171
|
+
buttonText: 'Explore Package Galaxy ➔',
|
|
172
|
+
action: async (ctx) => {
|
|
173
|
+
ctx.shell?.expandRightPanel?.();
|
|
174
|
+
},
|
|
175
|
+
transitionAction: async (ctx, controller) => {
|
|
176
|
+
ctx.shell?.collapseRightPanel?.();
|
|
177
|
+
ctx.shell?.expandLeftPanel?.();
|
|
178
|
+
await new Promise((r) => setTimeout(r, 500));
|
|
179
|
+
},
|
|
180
|
+
},
|
|
181
|
+
|
|
182
|
+
// =====================================================================
|
|
183
|
+
// STEP 5: Class II: Package Galaxy (Monotonic Releases)
|
|
184
|
+
// =====================================================================
|
|
185
|
+
{
|
|
186
|
+
id: 'step-5-package-galaxy',
|
|
187
|
+
title: '4. Package Galaxy: Monotonic Append-Only Releases',
|
|
188
|
+
narration: `
|
|
189
|
+
<p>Modern software supply chains rely on centralized registries (<strong>npm, PyPI, Cargo, Crates</strong>) that are vulnerable to token theft, registry outages, and malicious typosquatting.</p>
|
|
190
|
+
<p>A <strong>Package Galaxy</strong> provides monotonic, append-only cryptographic release checkpoints (<code>v1.0.0</code>, <code>v1.0.1</code>).</p>
|
|
191
|
+
<p>Each release is an immutable Merkle root signed by the creator's cryptographic Keystone identity.</p>
|
|
192
|
+
<p>Downstream consumers verify and pull the exact dependency graph directly from sovereign spaces—with zero middlemen, zero spoofing, and zero central points of failure.</p>
|
|
193
|
+
`,
|
|
194
|
+
targetElementId: 'code-changes-container',
|
|
195
|
+
placement: 'right',
|
|
196
|
+
beaconLabel: 'Package Integrity 📦',
|
|
197
|
+
buttonText: 'Explore Asset Galaxy ➔',
|
|
198
|
+
action: async (ctx) => {
|
|
199
|
+
ctx.shell?.expandLeftPanel?.();
|
|
200
|
+
},
|
|
201
|
+
transitionAction: async (ctx, controller) => {
|
|
202
|
+
const btnClone = findElementDeep('btn-header-clone');
|
|
203
|
+
if (btnClone) {
|
|
204
|
+
await controller.animateMouseClick(btnClone, { durationMs: 700 });
|
|
205
|
+
}
|
|
206
|
+
await new Promise((r) => setTimeout(r, 450));
|
|
207
|
+
},
|
|
208
|
+
},
|
|
209
|
+
|
|
210
|
+
// =====================================================================
|
|
211
|
+
// STEP 6: Asset Galaxy (Binary Content vs Git LFS)
|
|
212
|
+
// =====================================================================
|
|
213
|
+
{
|
|
214
|
+
id: 'step-6-asset-galaxy',
|
|
215
|
+
title: '5. Asset Galaxy: Content-Addressed Binary Sovereignty',
|
|
216
|
+
narration: `
|
|
217
|
+
<p>Git was never built for binary files. <strong>Git LFS</strong> is a fragile hack: text pointers in Git that point to separate cloud servers. If the LFS server goes down or credentials expire, builds fail completely.</p>
|
|
218
|
+
<p>In <code>ibgib</code>, <strong>Asset Galaxies</strong> treat large binaries, AI weights, model tensors, datasets, and media as first-class, content-addressed Merkle stones.</p>
|
|
219
|
+
<p>Deduplication is cryptographic and native.</p>
|
|
220
|
+
<p>And with <strong>Zero Platform Lock-In</strong>, clicking <strong>Clone</strong> allows you to export raw files, zip archives, or Git repositories directly to disk at any time.</p>
|
|
221
|
+
`,
|
|
222
|
+
targetElementId: 'btn-header-clone',
|
|
223
|
+
placement: 'bottom',
|
|
224
|
+
beaconLabel: 'Zero Lock-In ⤓',
|
|
225
|
+
buttonText: 'The Founder Ask ➔',
|
|
226
|
+
action: async (ctx) => {
|
|
227
|
+
ctx.shell?.expandLeftPanel?.();
|
|
228
|
+
},
|
|
229
|
+
transitionAction: async (ctx, controller) => {
|
|
230
|
+
await controller.animateMouseClick(
|
|
231
|
+
{ x: window.innerWidth / 2, y: window.innerHeight / 2 },
|
|
232
|
+
{ durationMs: 600 }
|
|
233
|
+
);
|
|
234
|
+
await new Promise((r) => setTimeout(r, 350));
|
|
235
|
+
},
|
|
236
|
+
},
|
|
237
|
+
|
|
238
|
+
// =====================================================================
|
|
239
|
+
// STEP 7: The Founder Ask & Investment Realities
|
|
240
|
+
// =====================================================================
|
|
241
|
+
{
|
|
242
|
+
id: 'step-7-founder-ask',
|
|
243
|
+
title: 'The Ask: Fueling the Solo Founder Behind the Protocol',
|
|
244
|
+
narration: `
|
|
245
|
+
<p>Currently, the live monorepo source code is not served directly through this web client because we are in the process of finalizing the MVP CLI sync pipeline.</p>
|
|
246
|
+
<p><strong>The Reality:</strong> I am building this entire protocol as a solo founder, currently coding at <strong>50% capacity</strong> due to everyday survival stresses and single-income family debt—competing against well-funded teams with $100Ks or $1Ms in venture investment.</p>
|
|
247
|
+
<p>A modest seed investment ($50k–$150k) takes me to <strong>100% full-time capacity</strong> to deliver the post-git infrastructure the agentic era urgently demands.</p>
|
|
248
|
+
<p><strong>Founder Expectations & Terms:</strong></p>
|
|
249
|
+
<ul>
|
|
250
|
+
<li><strong>Talk is cheap:</strong> I have no budget for travel and cannot afford a laptop capable of running Zoom reliably. If an investor wants in-person meetings or video calls, please fund the travel or hardware.</li>
|
|
251
|
+
<li><strong>Open-Source Core:</strong> The core protocol <em>must remain open-source</em> (dogfooded in its own decentralized repository).</li>
|
|
252
|
+
<li><strong>The Commercial Moat:</strong> The immense business upside lies in the hosted platform, the agentic supply chain infrastructure, and the downstream multi-app cosmology (educational LMS suites, knowledge graphs, and enterprise sync).</li>
|
|
253
|
+
</ul>
|
|
254
|
+
<p><em>If you believe that AI agents will do 90% of coding going forward, invest now in the protocol built from the ground up for that future.</em></p>
|
|
255
|
+
<p style="margin-top:16px; padding:12px; background:rgba(255,215,0,0.1); border-radius:8px; border:1px solid rgba(255,215,0,0.35); text-align:center;">
|
|
256
|
+
<strong>Direct Founder Contact:</strong> <a href="mailto:bill@ibgib.space" style="color:#ffd700; text-decoration:underline; font-weight:700;">bill@ibgib.space</a>
|
|
257
|
+
</p>
|
|
258
|
+
`,
|
|
259
|
+
targetElementId: undefined, // center placement
|
|
260
|
+
placement: 'center',
|
|
261
|
+
beaconLabel: 'Invest in ibgib 💰',
|
|
262
|
+
buttonText: 'Complete Tour ✨',
|
|
263
|
+
},
|
|
264
|
+
],
|
|
265
|
+
};
|