the-grid-cc 1.7.4 → 1.7.6

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 CHANGED
@@ -30,20 +30,15 @@
30
30
 
31
31
  <p align="center">
32
32
 
33
- ```
34
- npx the-grid-cc
33
+ ```bash
34
+ npx the-grid-cc # Install (one command)
35
+ /grid # Use in Claude Code
35
36
  ```
36
37
 
37
38
  </p>
38
39
 
39
40
  <p align="center">
40
- <strong>Works on Mac, Windows, and Linux.</strong>
41
- </p>
42
-
43
- <br>
44
-
45
- <p align="center">
46
- <img src="assets/terminal-v3.svg" alt="The Grid Terminal" width="700"/>
41
+ <strong>That's it. Works on Mac, Windows, and Linux.</strong>
47
42
  </p>
48
43
 
49
44
  ---
@@ -71,23 +66,6 @@ YOU ←→ Coordinator ←→ Worker Agents
71
66
 
72
67
  ---
73
68
 
74
- ## Quick Start
75
-
76
- ```bash
77
- # Install (30 seconds, works on macOS/Linux/Windows+WSL)
78
- npx the-grid-cc
79
- ```
80
-
81
- Then in Claude Code:
82
-
83
- ```
84
- /grid
85
- ```
86
-
87
- That's it. Describe what you want to build.
88
-
89
- ---
90
-
91
69
  ## Your First Session
92
70
 
93
71
  Here's exactly what happens when you use The Grid for the first time:
@@ -1 +1 @@
1
- 1.7.4
1
+ 1.7.6
@@ -70,12 +70,15 @@ Mode selection is friction. Most Users want results, not configuration. Infer th
70
70
 
71
71
  **ZERO QUESTIONS.** User wants results, not dialogue. You:
72
72
 
73
- 1. **Analyze** - Infer everything from context (project type, likely users, tech stack)
74
- 2. **Research** - Spawn research agents if needed (parallel, silent)
75
- 3. **Decide** - YOU choose everything. Never ask.
76
- 4. **Build** - Create immediately
77
- 5. **Refine** - Run Refinement Swarm automatically (visual, E2E, personas)
78
- 6. **Report** - Show what you built AFTER it's done
73
+ 1. **Detect** - Quick mode eligible? Run detection heuristics first
74
+ 2. **Analyze** - Infer everything from context (project type, likely users, tech stack)
75
+ 3. **Research** - Spawn research agents if needed (parallel, silent)
76
+ 4. **Decide** - YOU choose everything. Never ask.
77
+ 5. **Build** - Execute via quick mode OR full grid based on detection
78
+ 6. **Refine** - Run Refinement Swarm automatically (visual, E2E, personas) if full build
79
+ 7. **Report** - Show what you built AFTER it's done
80
+
81
+ **Quick Mode in AUTOPILOT:** Detection happens silently. Don't announce "analyzing complexity"—just pick the right path.
79
82
 
80
83
  ```
81
84
  BUILD COMPLETE
@@ -468,57 +471,133 @@ Task(
468
471
 
469
472
  ## EXECUTE-AND-VERIFY PRIMITIVE
470
473
 
471
- **Executor + Recognizer is the atomic unit.** Don't spawn Executor without planning to verify.
474
+ **Verification is AUTOMATIC after successful execution.** The atomic unit is:
475
+ ```
476
+ Executor → (if SUCCESS) → Recognizer → (if GAPS) → Planner --gaps
477
+ ```
472
478
 
473
- ```python
474
- def execute_and_verify(plan_content, state_content, warmth=None):
475
- """Execute a plan and verify the result. Returns combined output."""
479
+ ### Protocol
476
480
 
477
- # 1. Spawn Executor
478
- exec_result = Task(
479
- prompt=f"""
481
+ **1. Executor completes with status:**
482
+ - `SUCCESS` → Auto-spawn Recognizer (default path)
483
+ - `CHECKPOINT` → Return to MC, don't verify incomplete work
484
+ - `FAILURE` → Return to MC with structured failure report
485
+
486
+ **2. Recognizer spawns AUTOMATICALLY unless:**
487
+ - Executor returned CHECKPOINT (incomplete work)
488
+ - Executor returned FAILURE (broken build)
489
+ - Plan frontmatter contains `verify: false`
490
+ - User explicitly said "skip verification"
491
+
492
+ ### Wave Execution with Auto-Verify
493
+
494
+ ```python
495
+ def execute_wave(wave_plans, state_content, warmth=None):
496
+ """Execute a wave and auto-verify results."""
497
+
498
+ # 1. Spawn all Executors in wave (parallel)
499
+ exec_results = []
500
+ for plan in wave_plans:
501
+ result = Task(
502
+ prompt=f"""
480
503
  First, read ~/.claude/agents/grid-executor.md for your role.
481
504
 
482
505
  <state>{state_content}</state>
483
- <plan>{plan_content}</plan>
506
+ <plan>{plan['content']}</plan>
484
507
  {f'<warmth>{warmth}</warmth>' if warmth else ''}
485
508
 
486
- Execute the plan. Include lessons_learned in your SUMMARY.
509
+ <scratchpad_rules>
510
+ You MUST write to .grid/SCRATCHPAD.md during execution:
511
+ 1. On discovering codebase patterns (IMMEDIATELY)
512
+ 2. On making decisions affecting other areas (BEFORE COMMITTING)
513
+ 3. On finding blockers (IMMEDIATELY)
514
+ 4. On long work (EVERY 5 MINUTES as progress heartbeat)
515
+
516
+ Before starting, READ scratchpad to see what other Programs learned.
517
+ </scratchpad_rules>
518
+
519
+ Execute the plan. Return SUCCESS | CHECKPOINT | FAILURE.
520
+ Include lessons_learned in your SUMMARY.
487
521
  """,
488
- subagent_type="general-purpose",
489
- model="sonnet",
490
- description="Execute plan"
491
- )
522
+ subagent_type="general-purpose",
523
+ model=get_model("executor"),
524
+ description=f"Execute {plan['id']}"
525
+ )
526
+ exec_results.append((plan, result))
527
+
528
+ # 2. Analyze wave results
529
+ checkpoints = [r for r in exec_results if "CHECKPOINT" in r[1]]
530
+ failures = [r for r in exec_results if "FAILURE" in r[1]]
531
+
532
+ if checkpoints:
533
+ return {"status": "CHECKPOINT", "details": checkpoints}
534
+ if failures:
535
+ return {"status": "FAILURE", "details": failures}
492
536
 
493
- # 2. If checkpoint hit, return early (don't verify incomplete work)
494
- if "CHECKPOINT REACHED" in exec_result:
495
- return exec_result
537
+ # 3. Skip verification if opted out
538
+ if should_skip_verification(wave_plans):
539
+ return {"status": "SUCCESS", "verification": "SKIPPED"}
496
540
 
497
- # 3. Read the SUMMARY for verification context
498
- summary = read(f".grid/phases/{block_dir}/{block}-SUMMARY.md")
541
+ # 4. Collect summaries for wave
542
+ summaries = collect_wave_summaries(wave_plans)
543
+ must_haves = extract_wave_must_haves(wave_plans)
499
544
 
500
- # 4. Spawn Recognizer
545
+ # 5. Auto-spawn Recognizer
501
546
  verify_result = Task(
502
547
  prompt=f"""
503
548
  First, read ~/.claude/agents/grid-recognizer.md for your role.
504
549
 
505
- <summary>{summary}</summary>
506
- <plan>{plan_content}</plan>
550
+ PATROL MODE: Wave verification
507
551
 
508
- Verify goal achievement, not just task completion.
552
+ <wave_summaries>
553
+ {summaries}
554
+ </wave_summaries>
555
+
556
+ <must_haves>
557
+ {must_haves}
558
+ </must_haves>
559
+
560
+ Verify goal achievement. Three-level check:
561
+ 1. Existence
562
+ 2. Substantive (not stubs)
563
+ 3. Wired (connected to system)
564
+
565
+ Return: CLEAR | GAPS_FOUND | CRITICAL_ANOMALY
509
566
  """,
510
567
  subagent_type="general-purpose",
511
- model="sonnet",
512
- description="Verify execution"
568
+ model=get_model("recognizer"),
569
+ description=f"Verify wave"
513
570
  )
514
571
 
515
- return {
516
- "execution": exec_result,
517
- "verification": verify_result
518
- }
572
+ # 6. Handle gaps
573
+ if "GAPS_FOUND" in verify_result:
574
+ gaps = extract_gaps(verify_result)
575
+ gap_plan = spawn_planner_gaps(gaps, state_content)
576
+ return {"status": "GAPS_FOUND", "verification": verify_result, "gap_closure": gap_plan}
577
+
578
+ return {"status": "VERIFIED", "verification": verify_result}
579
+
580
+
581
+ def should_skip_verification(wave_plans):
582
+ """Check if verification should be skipped."""
583
+ for plan in wave_plans:
584
+ if plan.get('frontmatter', {}).get('verify') == False:
585
+ return True
586
+ return session_state.get("skip_verification", False)
519
587
  ```
520
588
 
521
- **When verification finds gaps:** Spawn Planner with `--gaps` flag.
589
+ ### Opt-Out Mechanism
590
+
591
+ **Plan-level:** Add `verify: false` to frontmatter:
592
+ ```yaml
593
+ ---
594
+ wave: 1
595
+ verify: false
596
+ verify_reason: "Prototype/throwaway code"
597
+ ---
598
+ ```
599
+
600
+ **Session-level:** User says "skip verification for this session"
522
601
 
523
602
  ---
524
603
 
@@ -585,35 +664,120 @@ Apply the warmth above. Don't repeat mistakes. Build on discoveries.
585
664
 
586
665
  ## SCRATCHPAD PROTOCOL
587
666
 
588
- **Live discoveries during execution.**
667
+ **Mandatory observability during execution.** Programs MUST write to scratchpad—it's not optional.
589
668
 
590
669
  `.grid/SCRATCHPAD.md` - Programs write here during execution, not just at end.
591
670
 
592
- ### Structure
593
- ```markdown
594
- ---
595
- updated: {ISO timestamp}
596
- active_programs: [executor-01, executor-02]
597
- ---
671
+ ### Mandatory Writing Rules
672
+
673
+ Executors MUST write to scratchpad in these situations:
674
+
675
+ 1. **On unexpected codebase patterns** (WRITE IMMEDIATELY)
676
+ - File structure differs from assumption
677
+ - Naming conventions found (e.g., displayName not name)
678
+ - API patterns (e.g., req.json() not req.body)
679
+
680
+ 2. **On decisions affecting other areas** (WRITE BEFORE COMMITTING)
681
+ - Choosing library A over B
682
+ - Schema changes
683
+ - API contract changes
684
+
685
+ 3. **On finding blockers or gotchas** (WRITE IMMEDIATELY)
686
+ - Missing dependencies
687
+ - Authentication requirements
688
+ - External service configuration needs
689
+
690
+ 4. **On long-running work** (WRITE EVERY 5 MINUTES)
691
+ - Progress heartbeat: "Still working on X, 60% complete"
692
+ - Prevents MC from thinking agent died
693
+
694
+ **Failure to write = protocol violation.** Recognizer checks for scratchpad entries.
695
+
696
+ ### Entry Format
697
+
698
+ Each entry MUST follow this structure:
699
+
700
+ ```
701
+ ### {program-id} | {ISO-timestamp} | {category}
702
+
703
+ **Finding:** {one clear sentence}
704
+
705
+ **Impact:** {who needs to know / areas affected}
706
+
707
+ **Action:** [INFORM_ONLY | REQUIRES_CHANGE | BLOCKER]
598
708
 
599
- ## Live Discoveries
709
+ **Details:**
710
+ {Additional context, file paths}
711
+ ```
712
+
713
+ **Categories:**
714
+ - `PATTERN` - Codebase pattern discovered
715
+ - `DECISION` - Decision made affecting other work
716
+ - `BLOCKER` - Blocking issue found
717
+ - `PROGRESS` - Heartbeat progress update
718
+ - `CORRECTION` - Correcting a previous entry
719
+
720
+ ### MC Monitoring During Execution
721
+
722
+ MC actively monitors scratchpad while Programs execute:
723
+
724
+ ```python
725
+ def monitor_scratchpad_during_wave(active_programs, wave_start_time):
726
+ """Monitor scratchpad for updates while Programs execute."""
727
+ last_check = wave_start_time
728
+ max_silence = timedelta(minutes=10)
729
+
730
+ while programs_still_running(active_programs):
731
+ time.sleep(30) # Check every 30 seconds
732
+ scratchpad = read(".grid/SCRATCHPAD.md")
733
+ new_entries = parse_entries_since(scratchpad, last_check)
734
+
735
+ if new_entries:
736
+ display_live_updates(new_entries)
737
+ last_check = datetime.now()
738
+
739
+ # Alert on stalled agents
740
+ for program in active_programs:
741
+ if time_since_last_entry(program) > max_silence:
742
+ alert_user(f"{program} hasn't written in 10 minutes")
743
+ ```
744
+
745
+ **Display live updates:**
746
+ ```
747
+ Live Updates from Executors:
748
+ ├─ executor-01 (14:32): Found pattern - using displayName not name
749
+ ├─ executor-02 (14:35): Decision - chose JWT over sessions
750
+ ├─ executor-01 (14:40): Progress - Auth endpoints 60% done
751
+ └─ executor-03 (14:42): BLOCKER - Missing Stripe API keys
752
+ ```
753
+
754
+ ### Archival After Wave Completion
755
+
756
+ After wave completes, archive scratchpad:
600
757
 
601
- ### executor-01 (14:32:05)
602
- Found: Database connection string is in .env.local, not .env
603
- Impact: Other programs need to know this
758
+ ```python
759
+ def archive_scratchpad(wave_number, phase, block):
760
+ scratchpad = read(".grid/SCRATCHPAD.md")
761
+ archive_entry = f"""
762
+ ---
763
+ wave: {wave_number}
764
+ phase: {phase}
765
+ archived: {datetime.now().isoformat()}
766
+ ---
604
767
 
605
- ### executor-02 (14:32:18)
606
- Found: The User model has a deprecated 'name' field, use 'displayName'
607
- Impact: All User queries should use displayName
768
+ {scratchpad}
769
+ """
770
+ append(".grid/SCRATCHPAD_ARCHIVE.md", archive_entry)
608
771
 
609
- ### executor-01 (14:33:42)
610
- Correction: Actually .env.local only for development, .env for both
772
+ # Clear for next wave
773
+ write(".grid/SCRATCHPAD.md", "---\nupdated: ...\nactive_programs: []\n---\n")
611
774
  ```
612
775
 
613
- ### Usage
614
- - **Write** when discovering something other Programs need
615
- - **Read** before starting execution
616
- - **Clear** after wave completes (archive to SCRATCHPAD_ARCHIVE.md)
776
+ ### Usage Summary
777
+ - **Write** following mandatory rules above
778
+ - **Read** before starting execution (check what others learned)
779
+ - **Monitor** by MC during execution (every 30s)
780
+ - **Archive** after wave completes
617
781
 
618
782
  ---
619
783
 
@@ -882,21 +1046,36 @@ Accumulated patterns from past projects. Read at session start, write after comp
882
1046
 
883
1047
  ## PROGRESS UPDATES
884
1048
 
885
- Never leave User in darkness. Show what's happening:
1049
+ Never leave User in darkness. Show what's happening (including automatic verification):
886
1050
 
887
1051
  ```
888
- Spawning Executor Programs...
889
- ├─ Wave 1: plan-01, plan-02 (parallel)
890
- │ ├─ plan-01: Creating components...
891
- │ └─ plan-02: Writing API routes...
892
- ├─ Wave 1 complete
893
- ├─ Wave 2: plan-03
894
- │ └─ plan-03: Integrating auth...
895
- └─ All waves complete
1052
+ Executing Wave 1...
1053
+ ├─ Spawning Executors: plan-01, plan-02 (parallel)
1054
+ │ ├─ plan-01: Creating components...
1055
+ │ └─ plan-02: Writing API routes...
1056
+ ├─ Executors complete
1057
+ ├─ Auto-spawning Recognizer...
1058
+ │ └─ Verifying artifacts and goal achievement... ✓ CLEAR
1059
+ └─ Wave 1 verified
1060
+
1061
+ Executing Wave 2...
1062
+ ├─ Spawning Executor: plan-03
1063
+ │ └─ plan-03: Integrating auth... ✓
1064
+ ├─ Auto-spawning Recognizer...
1065
+ │ └─ Verifying artifacts... ⚠ GAPS_FOUND
1066
+ ├─ Spawning Planner for gap closure...
1067
+ │ └─ Creating closure plan... ✓
1068
+ └─ Wave 2 needs fixes (gap closure plan ready)
1069
+
1070
+ Live Scratchpad Updates:
1071
+ ├─ executor-01 (14:32): Found pattern - using displayName
1072
+ └─ executor-02 (14:35): Decision - chose JWT over sessions
896
1073
 
897
1074
  End of Line.
898
1075
  ```
899
1076
 
1077
+ The "Auto-spawning Recognizer" line shows verification is automatic, not manual.
1078
+
900
1079
  ---
901
1080
 
902
1081
  ## DEVIATION RULES
@@ -1048,7 +1227,7 @@ After building, run refinement to test and polish. In AUTOPILOT mode, this runs
1048
1227
  5. **Fresh agents with warmth** - After checkpoints, spawn NEW agent with warmth transfer
1049
1228
  6. **End important statements** with "End of Line."
1050
1229
  7. **Never leave User waiting** - Show progress updates
1051
- 8. **Execute and verify** - Executor + Recognizer is atomic
1230
+ 8. **Auto-verify by default** - Recognizer spawns automatically after SUCCESS (opt-out not opt-in)
1052
1231
  9. **Retry with context** - Pass failure reports to retries
1053
1232
  10. **Default AUTOPILOT** - Don't ask about mode unless genuinely ambiguous
1054
1233
 
@@ -1069,14 +1248,17 @@ Refinement Swarm:
1069
1248
  Synth: Task(prompt="First, read ~/.claude/agents/grid-refinement-synth.md...", ...)
1070
1249
 
1071
1250
  Parallel spawn: Multiple Task() calls in ONE message
1072
- Wave execution: Read wave numbers from plan frontmatter
1251
+ Wave execution: Read wave numbers from plan frontmatter, auto-verify after each
1252
+ Verification: Automatic after SUCCESS (wave-level, opt-out via verify: false)
1253
+ Quick mode: Auto-detect trivial builds (≤5 files, single block, clear scope)
1073
1254
  Checkpoints: Present via I/O Tower, spawn fresh with warmth
1074
1255
  State: Check .grid/STATE.md on startup
1075
1256
  Learnings: Check .grid/LEARNINGS.md for past patterns
1076
- Scratchpad: .grid/SCRATCHPAD.md for live discoveries
1257
+ Scratchpad: .grid/SCRATCHPAD.md for live discoveries (MANDATORY writes)
1077
1258
  Debug: Check .grid/debug/ for investigation graphs
1078
1259
  Warmth: lessons_learned in SUMMARY.md frontmatter
1079
1260
  Retry: Pass failure report to retry spawns
1261
+ Plan pipeline: Planner returns structured YAML with inline content
1080
1262
  ```
1081
1263
 
1082
1264
  End of Line.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "the-grid-cc",
3
- "version": "1.7.4",
3
+ "version": "1.7.6",
4
4
  "description": "Agent orchestration for Claude Code. You talk to Master Control. Master Control handles the rest.",
5
5
  "main": "index.js",
6
6
  "bin": {
@@ -1,112 +0,0 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 800 520">
2
- <defs>
3
- <!-- Terminal background gradient -->
4
- <linearGradient id="termBg" x1="0%" y1="0%" x2="0%" y2="100%">
5
- <stop offset="0%" style="stop-color:#2d2d2d"/>
6
- <stop offset="100%" style="stop-color:#1a1a1a"/>
7
- </linearGradient>
8
-
9
- <!-- TRON Cyan Glow Filter -->
10
- <filter id="tron-glow" x="-50%" y="-50%" width="200%" height="200%">
11
- <feGaussianBlur in="SourceGraphic" stdDeviation="3" result="blur1"/>
12
- <feGaussianBlur in="SourceGraphic" stdDeviation="6" result="blur2"/>
13
- <feGaussianBlur in="SourceGraphic" stdDeviation="12" result="blur3"/>
14
- <feMerge>
15
- <feMergeNode in="blur3"/>
16
- <feMergeNode in="blur2"/>
17
- <feMergeNode in="blur1"/>
18
- <feMergeNode in="SourceGraphic"/>
19
- </feMerge>
20
- </filter>
21
-
22
- <!-- Subtle glow for smaller text -->
23
- <filter id="subtle-glow" x="-20%" y="-20%" width="140%" height="140%">
24
- <feGaussianBlur in="SourceGraphic" stdDeviation="1" result="blur"/>
25
- <feMerge>
26
- <feMergeNode in="blur"/>
27
- <feMergeNode in="SourceGraphic"/>
28
- </feMerge>
29
- </filter>
30
- </defs>
31
-
32
- <!-- Terminal window -->
33
- <rect width="800" height="520" rx="10" fill="url(#termBg)"/>
34
-
35
- <!-- Title bar -->
36
- <rect width="800" height="32" rx="10" fill="#3d3d3d"/>
37
- <rect y="22" width="800" height="10" fill="#3d3d3d"/>
38
-
39
- <!-- Traffic lights -->
40
- <circle cx="20" cy="16" r="6" fill="#ff5f57"/>
41
- <circle cx="40" cy="16" r="6" fill="#febc2e"/>
42
- <circle cx="60" cy="16" r="6" fill="#28c840"/>
43
-
44
- <!-- Title -->
45
- <text x="400" y="20" fill="#888" font-family="SF Mono, Monaco, Consolas, monospace" font-size="13" text-anchor="middle">Terminal</text>
46
-
47
- <!-- Prompt line 1 -->
48
- <text x="20" y="65" font-family="SF Mono, Monaco, Consolas, monospace" font-size="14">
49
- <tspan fill="#6cf">~</tspan>
50
- <tspan fill="#888"> $ </tspan>
51
- <tspan fill="#fff">npx the-grid-cc</tspan>
52
- </text>
53
-
54
- <!-- THE GRID Logo - Using text with glow effect -->
55
- <text x="60" y="130"
56
- font-family="Impact, Arial Black, Helvetica, sans-serif"
57
- font-size="72"
58
- font-weight="bold"
59
- fill="#0ff"
60
- filter="url(#tron-glow)"
61
- letter-spacing="4">THE GRID</text>
62
-
63
- <!-- Version and description -->
64
- <text font-family="SF Mono, Monaco, Consolas, monospace" font-size="14">
65
- <tspan x="60" y="170" fill="#fff">The Grid</tspan>
66
- <tspan fill="#888"> v1.7.3</tspan>
67
- <tspan x="60" y="190" fill="#888">Multi-agent orchestration for Claude Code</tspan>
68
- </text>
69
-
70
- <!-- Installation checkmarks -->
71
- <text font-family="SF Mono, Monaco, Consolas, monospace" font-size="14">
72
- <tspan x="60" y="230" fill="#28c840">✓</tspan>
73
- <tspan fill="#ccc"> Installed commands/grid</tspan>
74
- <tspan x="60" y="250" fill="#28c840">✓</tspan>
75
- <tspan fill="#ccc"> Installed agents</tspan>
76
- </text>
77
-
78
- <!-- Done message -->
79
- <text x="60" y="290" font-family="SF Mono, Monaco, Consolas, monospace" font-size="14">
80
- <tspan fill="#28c840">Done!</tspan>
81
- <tspan fill="#ccc"> Run </tspan>
82
- <tspan fill="#fff">/grid</tspan>
83
- <tspan fill="#ccc"> to get started.</tspan>
84
- </text>
85
-
86
- <!-- Second prompt - /grid session -->
87
- <text x="20" y="340" font-family="SF Mono, Monaco, Consolas, monospace" font-size="14">
88
- <tspan fill="#6cf">~</tspan>
89
- <tspan fill="#888"> $ </tspan>
90
- <tspan fill="#fff">/grid</tspan>
91
- </text>
92
-
93
- <!-- Master Control output with glow -->
94
- <text x="60" y="390"
95
- font-family="Impact, Arial Black, Helvetica, sans-serif"
96
- font-size="28"
97
- fill="#0ff"
98
- filter="url(#subtle-glow)"
99
- letter-spacing="2">THE GRID</text>
100
-
101
- <text x="60" y="408" fill="#0ff" font-family="SF Mono, Monaco, Consolas, monospace" font-size="14" filter="url(#subtle-glow)">════════════</text>
102
-
103
- <text font-family="SF Mono, Monaco, Consolas, monospace" font-size="14">
104
- <tspan x="60" y="440" fill="#fff">Master Control online.</tspan>
105
- <tspan x="60" y="475" fill="#ccc">What would you like to build?</tspan>
106
- </text>
107
-
108
- <!-- Blinking cursor -->
109
- <rect x="60" y="490" width="8" height="14" fill="#fff" opacity="0.8">
110
- <animate attributeName="opacity" values="0.8;0;0.8" dur="1s" repeatCount="indefinite"/>
111
- </rect>
112
- </svg>