diff --git a/docs/circular-deps.txt b/docs/circular-deps.txt
index 6f7c4be..80668e0 100644
--- a/docs/circular-deps.txt
+++ b/docs/circular-deps.txt
@@ -1,11 +1,8 @@
# Circular Dependencies
-Generated: 2026-05-18T12:47:02.133Z
-Found: 4 circular chain(s) — these MUST be fixed before modifying involved files.
+Generated: 2026-05-18T12:51:42.611Z
+Found: 1 circular chain(s) — these MUST be fixed before modifying involved files.
-1. Processed 122 files (1.3s) (30 warnings)
-2. 1) stores/combatStore.ts > stores/gameStore.ts
-3. 2) stores/combatStore.ts > stores/gameStore.ts > stores/gameActions.ts
-4. 3) stores/combatStore.ts > stores/gameStore.ts > stores/gameLoopActions.ts
+1. Processed 122 files (1.2s) (30 warnings)
## How to fix
1. Identify which import in the chain can be extracted to a shared types/utils file.
diff --git a/docs/dependency-graph.json b/docs/dependency-graph.json
index 7ac7d22..b1d7f77 100644
--- a/docs/dependency-graph.json
+++ b/docs/dependency-graph.json
@@ -1,6 +1,6 @@
{
"_meta": {
- "generated": "2026-05-18T12:47:00.491Z",
+ "generated": "2026-05-18T12:51:41.151Z",
"description": "Import dependency graph for src/lib/game. Keys are files, values are arrays of files they import.",
"usage": "To find what a file affects, search for its path in the VALUES. To find what a file depends on, look at its KEY entry."
},
@@ -416,7 +416,6 @@
"stores/combatStore.ts": [
"stores/combat-actions.ts",
"stores/combat-state.types.ts",
- "stores/gameStore.ts",
"stores/prestigeStore.ts",
"types.ts",
"utils/activity-log.ts",
diff --git a/docs/project-structure.txt b/docs/project-structure.txt
index 1d8dee0..dae851f 100644
--- a/docs/project-structure.txt
+++ b/docs/project-structure.txt
@@ -108,6 +108,7 @@ Mana-Loop/
│ │ │ ├── shared/
│ │ │ │ └── MemorySlotPicker.tsx
│ │ │ ├── tabs/
+│ │ │ │ ├── ActivityLog.tsx
│ │ │ │ ├── DisciplinesTab.tsx
│ │ │ │ └── index.ts
│ │ │ ├── AchievementsDisplay.tsx
@@ -203,6 +204,7 @@ Mana-Loop/
│ │ │ │ ├── enchanter.ts
│ │ │ │ ├── fabricator-disciplines.ts
│ │ │ │ ├── fabricator.ts
+│ │ │ │ ├── index.ts
│ │ │ │ ├── invoker-disciplines.ts
│ │ │ │ └── invoker.ts
│ │ │ ├── enchantments/
diff --git a/src/components/game/tabs/ActivityLog.tsx b/src/components/game/tabs/ActivityLog.tsx
new file mode 100644
index 0000000..5b6d8dc
--- /dev/null
+++ b/src/components/game/tabs/ActivityLog.tsx
@@ -0,0 +1,34 @@
+import type { ActivityLogEntry } from '@/lib/game/types';
+
+interface ActivityLogProps {
+ activityLog: ActivityLogEntry[];
+ maxEntries?: number;
+}
+
+export function ActivityLog({ activityLog, maxEntries = 20 }: ActivityLogProps) {
+ const entries = activityLog.slice(0, maxEntries);
+
+ if (entries.length === 0) {
+ return (
+
+ No activity yet.
+
+ );
+ }
+
+ return (
+
+ {entries.map((entry) => (
+
+
+ [{entry.eventType}]
+
+ {entry.message}
+
+ ))}
+
+ );
+}
diff --git a/src/components/game/tabs/DisciplinesTab.tsx b/src/components/game/tabs/DisciplinesTab.tsx
index b4e5b94..3b634c2 100644
--- a/src/components/game/tabs/DisciplinesTab.tsx
+++ b/src/components/game/tabs/DisciplinesTab.tsx
@@ -1,10 +1,10 @@
import React, { useEffect, useState } from 'react';
import { useDisciplineStore } from '@/lib/game/stores/discipline-slice';
import type { DisciplineDefinition } from '@/types/disciplines';
-import baseDisciplines from '../data/disciplines/base';
-import enchanterDisciplines from '../data/disciplines/enchanter';
-import fabricatorDisciplines from '../data/disciplines/fabricator';
-import invokerDisciplines from '../data/disciplines/invoker';
+import { baseDisciplines } from '@/lib/game/data/disciplines/base';
+import { enchanterDisciplines } from '@/lib/game/data/disciplines/enchanter';
+import { fabricatorDisciplines } from '@/lib/game/data/disciplines/fabricator';
+import { invokerDisciplines } from '@/lib/game/data/disciplines/invoker';
import { calculateStatBonus, calculateManaDrain } from '@/lib/game/utils/discipline-math';
import { useRef } from 'react';
import clsx from 'clsx';
@@ -148,9 +148,11 @@ export const DisciplinesTab: React.FC = () => {
Perks:
- {unlockedPerks?.map((p) => (
- - {p.replace(/-([0-9]+)$/, ' $1')}
- )) : (
+ {unlockedPerks && unlockedPerks.length > 0 ? (
+ unlockedPerks.map((p) => (
+ - {p.replace(/-([0-9]+)$/, ' $1')}
+ ))
+ ) : (
- —locked—
)}
@@ -193,11 +195,11 @@ export const DisciplinesTab: React.FC = () => {
return (