@sansynx/erroratlas 0.1.2 → 0.1.3
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 +30 -0
- package/dist/worker/ui.js +99 -51
- package/package.json +1 -2
package/README.md
CHANGED
|
@@ -4,6 +4,36 @@ ErrorAtlas is hosted debugging memory for coding agents.
|
|
|
4
4
|
|
|
5
5
|
Developers do not clone this repo, create Supabase projects, deploy Workers, or manage ErrorAtlas infrastructure. They install the npm MCP client, generate one hosted MCP key, run Supermemory locally, and let their coding agent search and publish verified fixes.
|
|
6
6
|
|
|
7
|
+
## Working flow
|
|
8
|
+
|
|
9
|
+
```mermaid
|
|
10
|
+
flowchart TD
|
|
11
|
+
Dev[Developer] --> Console[Hosted ErrorAtlas dashboard]
|
|
12
|
+
Console --> Key[Generate one MCP key]
|
|
13
|
+
|
|
14
|
+
Dev --> Agent[Codex / Cursor / Windsurf / OpenCode]
|
|
15
|
+
Agent --> MCP[Local ErrorAtlas MCP server]
|
|
16
|
+
|
|
17
|
+
MCP --> LocalMemory[Supermemory local]
|
|
18
|
+
MCP --> API[Hosted ErrorAtlas API]
|
|
19
|
+
|
|
20
|
+
LocalMemory --> PrivateContext[Private project memory stays on machine]
|
|
21
|
+
API --> Search[Search sanitized shared fixes]
|
|
22
|
+
API --> Store[Store sanitized incidents and verified playbooks]
|
|
23
|
+
|
|
24
|
+
Search --> Agent
|
|
25
|
+
PrivateContext --> Agent
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
```txt
|
|
29
|
+
1. Developer signs in at the hosted dashboard.
|
|
30
|
+
2. Dashboard generates one MCP key.
|
|
31
|
+
3. Developer installs @sansynx/erroratlas in their project.
|
|
32
|
+
4. Coding agent connects to the local ErrorAtlas MCP server.
|
|
33
|
+
5. MCP searches Supermemory local plus hosted ErrorAtlas fixes.
|
|
34
|
+
6. After a verified fix, MCP stores sanitized incidents and playbooks remotely.
|
|
35
|
+
```
|
|
36
|
+
|
|
7
37
|
## End-user flow
|
|
8
38
|
|
|
9
39
|
1. Open the hosted dashboard:
|
package/dist/worker/ui.js
CHANGED
|
@@ -369,6 +369,9 @@ button { cursor: pointer; }
|
|
|
369
369
|
.nav-links { display: flex; align-items: center; gap: 10px; color: var(--body); }
|
|
370
370
|
.nav-links a,
|
|
371
371
|
.nav-links button { display: inline-flex; align-items: center; justify-content: center; }
|
|
372
|
+
.nav-actions {
|
|
373
|
+
display: contents;
|
|
374
|
+
}
|
|
372
375
|
.nav-menu {
|
|
373
376
|
display: none;
|
|
374
377
|
min-height: 38px;
|
|
@@ -674,7 +677,6 @@ ul, ol { margin: 0; padding-left: 20px; color: var(--body); }
|
|
|
674
677
|
}
|
|
675
678
|
.nav-menu {
|
|
676
679
|
display: inline-flex;
|
|
677
|
-
justify-self: end;
|
|
678
680
|
width: 40px;
|
|
679
681
|
height: 40px;
|
|
680
682
|
padding: 0;
|
|
@@ -712,6 +714,21 @@ ul, ol { margin: 0; padding-left: 20px; color: var(--body); }
|
|
|
712
714
|
transform: translateY(-4px);
|
|
713
715
|
transition: max-height 240ms ease, opacity 180ms ease, transform 220ms ease, margin 220ms ease, padding 220ms ease, border-color 180ms ease;
|
|
714
716
|
}
|
|
717
|
+
.nav-actions {
|
|
718
|
+
display: flex;
|
|
719
|
+
justify-self: end;
|
|
720
|
+
align-items: center;
|
|
721
|
+
gap: 4px;
|
|
722
|
+
}
|
|
723
|
+
.nav-actions .theme-toggle {
|
|
724
|
+
display: inline-flex;
|
|
725
|
+
width: 38px;
|
|
726
|
+
min-width: 38px;
|
|
727
|
+
height: 38px;
|
|
728
|
+
min-height: 38px;
|
|
729
|
+
border: 0;
|
|
730
|
+
background: transparent;
|
|
731
|
+
}
|
|
715
732
|
.nav.open .nav-links {
|
|
716
733
|
max-height: 260px;
|
|
717
734
|
margin: 6px 0 0;
|
|
@@ -722,7 +739,6 @@ ul, ol { margin: 0; padding-left: 20px; color: var(--body); }
|
|
|
722
739
|
transform: translateY(0);
|
|
723
740
|
}
|
|
724
741
|
.nav-links .button,
|
|
725
|
-
.nav-links .theme-toggle,
|
|
726
742
|
.nav-links > a:not(.button) {
|
|
727
743
|
width: 100%;
|
|
728
744
|
min-height: 40px;
|
|
@@ -812,31 +828,6 @@ ul, ol { margin: 0; padding-left: 20px; color: var(--body); }
|
|
|
812
828
|
padding-left: 12px;
|
|
813
829
|
transform: none;
|
|
814
830
|
}
|
|
815
|
-
.nav.open .theme-toggle {
|
|
816
|
-
width: 100%;
|
|
817
|
-
height: 46px;
|
|
818
|
-
min-height: 46px;
|
|
819
|
-
min-width: 0;
|
|
820
|
-
justify-content: flex-start;
|
|
821
|
-
gap: 10px;
|
|
822
|
-
padding: 0 4px;
|
|
823
|
-
border: 0;
|
|
824
|
-
border-bottom: 1px solid var(--line);
|
|
825
|
-
border-radius: 0;
|
|
826
|
-
background: transparent;
|
|
827
|
-
color: var(--fg);
|
|
828
|
-
box-shadow: none;
|
|
829
|
-
}
|
|
830
|
-
.nav.open .theme-toggle:hover {
|
|
831
|
-
background: var(--surface-2);
|
|
832
|
-
padding-left: 12px;
|
|
833
|
-
transform: none;
|
|
834
|
-
}
|
|
835
|
-
.nav.open .theme-toggle::after {
|
|
836
|
-
content: "Theme";
|
|
837
|
-
font-size: 13px;
|
|
838
|
-
font-weight: 500;
|
|
839
|
-
}
|
|
840
831
|
.nav.open .nav-links > *:last-child {
|
|
841
832
|
border-bottom: 0;
|
|
842
833
|
}
|
|
@@ -857,19 +848,16 @@ ul, ol { margin: 0; padding-left: 20px; color: var(--body); }
|
|
|
857
848
|
padding-left: 4px;
|
|
858
849
|
}
|
|
859
850
|
.brand::before {
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
height: 9px;
|
|
863
|
-
border-radius: 999px;
|
|
864
|
-
background: var(--fg);
|
|
865
|
-
box-shadow: 0 0 0 4px var(--surface-2);
|
|
851
|
+
display: none;
|
|
852
|
+
content: none;
|
|
866
853
|
}
|
|
867
854
|
.nav-links {
|
|
868
855
|
gap: 6px;
|
|
869
856
|
}
|
|
870
857
|
.nav-links > a:not(.button),
|
|
871
858
|
.nav-links .button,
|
|
872
|
-
.nav-links .theme-toggle
|
|
859
|
+
.nav-links .theme-toggle,
|
|
860
|
+
.nav-actions .theme-toggle {
|
|
873
861
|
height: 38px;
|
|
874
862
|
min-height: 38px;
|
|
875
863
|
border-radius: 12px;
|
|
@@ -935,20 +923,27 @@ ul, ol { margin: 0; padding-left: 20px; color: var(--body); }
|
|
|
935
923
|
@media (max-width: 760px) {
|
|
936
924
|
.nav {
|
|
937
925
|
margin-top: 12px;
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
|
|
926
|
+
padding: 10px 0;
|
|
927
|
+
border-color: transparent;
|
|
928
|
+
border-radius: 0;
|
|
929
|
+
background: transparent;
|
|
930
|
+
box-shadow: none;
|
|
941
931
|
}
|
|
942
932
|
.nav.open {
|
|
943
|
-
|
|
944
|
-
|
|
933
|
+
padding: 10px 0 0;
|
|
934
|
+
border-radius: 0;
|
|
935
|
+
background: transparent;
|
|
936
|
+
border-color: transparent;
|
|
937
|
+
box-shadow: none;
|
|
945
938
|
}
|
|
946
939
|
.nav.open .nav-links {
|
|
947
|
-
|
|
940
|
+
margin-top: 14px;
|
|
941
|
+
padding: 12px 0 0;
|
|
942
|
+
border-top: 1px solid var(--line);
|
|
943
|
+
background: transparent;
|
|
948
944
|
}
|
|
949
945
|
.nav.open .nav-links .button,
|
|
950
|
-
.nav.open .nav-links > a:not(.button)
|
|
951
|
-
.nav.open .theme-toggle {
|
|
946
|
+
.nav.open .nav-links > a:not(.button) {
|
|
952
947
|
justify-content: flex-start;
|
|
953
948
|
height: 44px;
|
|
954
949
|
min-height: 44px;
|
|
@@ -956,6 +951,7 @@ ul, ol { margin: 0; padding-left: 20px; color: var(--body); }
|
|
|
956
951
|
border-radius: 12px;
|
|
957
952
|
border: 0;
|
|
958
953
|
border-bottom: 0;
|
|
954
|
+
background: transparent;
|
|
959
955
|
}
|
|
960
956
|
.secret-copy-row {
|
|
961
957
|
grid-template-columns: 1fr;
|
|
@@ -964,6 +960,48 @@ ul, ol { margin: 0; padding-left: 20px; color: var(--body); }
|
|
|
964
960
|
width: 100%;
|
|
965
961
|
}
|
|
966
962
|
}
|
|
963
|
+
.nav-menu {
|
|
964
|
+
background: transparent;
|
|
965
|
+
}
|
|
966
|
+
@media (max-width: 760px) {
|
|
967
|
+
.brand {
|
|
968
|
+
padding-left: 0;
|
|
969
|
+
font-size: 14px;
|
|
970
|
+
height: 40px;
|
|
971
|
+
align-items: center;
|
|
972
|
+
}
|
|
973
|
+
.nav-menu {
|
|
974
|
+
justify-self: end;
|
|
975
|
+
width: 38px;
|
|
976
|
+
min-width: 38px;
|
|
977
|
+
height: 38px;
|
|
978
|
+
background: transparent;
|
|
979
|
+
}
|
|
980
|
+
.nav.open .nav-links {
|
|
981
|
+
gap: 8px;
|
|
982
|
+
}
|
|
983
|
+
.nav.open .nav-menu {
|
|
984
|
+
background: transparent;
|
|
985
|
+
}
|
|
986
|
+
.nav.open .nav-links .button,
|
|
987
|
+
.nav.open .nav-links > a:not(.button) {
|
|
988
|
+
align-items: center;
|
|
989
|
+
justify-content: center;
|
|
990
|
+
padding-left: 0;
|
|
991
|
+
padding-right: 0;
|
|
992
|
+
font-size: 14px;
|
|
993
|
+
line-height: 1;
|
|
994
|
+
text-align: center;
|
|
995
|
+
}
|
|
996
|
+
.landing-page .hero,
|
|
997
|
+
.setup-page .hero {
|
|
998
|
+
justify-items: center;
|
|
999
|
+
text-align: center;
|
|
1000
|
+
}
|
|
1001
|
+
.landing-page .hero {
|
|
1002
|
+
padding-top: 64px;
|
|
1003
|
+
}
|
|
1004
|
+
}
|
|
967
1005
|
</style>`;
|
|
968
1006
|
}
|
|
969
1007
|
export function renderLandingUi(env) {
|
|
@@ -974,6 +1012,7 @@ export function renderLandingUi(env) {
|
|
|
974
1012
|
<meta charset="utf-8">
|
|
975
1013
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
976
1014
|
<title>${appName}</title>
|
|
1015
|
+
<link rel="icon" href="/favicon.svg" type="image/svg+xml">
|
|
977
1016
|
${themeBootScript()}
|
|
978
1017
|
${sharedCss()}
|
|
979
1018
|
<style>
|
|
@@ -1140,6 +1179,10 @@ ${sharedCss()}
|
|
|
1140
1179
|
}
|
|
1141
1180
|
.footer {
|
|
1142
1181
|
flex-direction: column;
|
|
1182
|
+
align-items: center;
|
|
1183
|
+
justify-content: center;
|
|
1184
|
+
text-align: center;
|
|
1185
|
+
width: 100%;
|
|
1143
1186
|
}
|
|
1144
1187
|
}
|
|
1145
1188
|
</style>
|
|
@@ -1148,10 +1191,12 @@ ${sharedCss()}
|
|
|
1148
1191
|
<div class="shell narrow">
|
|
1149
1192
|
<nav class="nav">
|
|
1150
1193
|
<a href="/" class="brand">ErrorAtlas</a>
|
|
1151
|
-
<
|
|
1194
|
+
<div class="nav-actions">
|
|
1195
|
+
<button class="theme-toggle" id="themeToggle" type="button" aria-label="Switch theme" title="Switch theme"><span class="theme-toggle-icon" aria-hidden="true"></span></button>
|
|
1196
|
+
<button class="nav-menu" id="navMenu" type="button" aria-expanded="false" aria-controls="navLinks" aria-label="Open navigation"><span class="nav-menu-lines" aria-hidden="true"><span class="nav-menu-line"></span><span class="nav-menu-line"></span><span class="nav-menu-line"></span></span></button>
|
|
1197
|
+
</div>
|
|
1152
1198
|
<div class="nav-links" id="navLinks">
|
|
1153
1199
|
<a href="/setup">Setup</a>
|
|
1154
|
-
<button class="theme-toggle" id="themeToggle" type="button" aria-label="Switch theme" title="Switch theme"><span class="theme-toggle-icon" aria-hidden="true"></span></button>
|
|
1155
1200
|
<a class="button primary" href="/dashboard">Dashboard</a>
|
|
1156
1201
|
</div>
|
|
1157
1202
|
</nav>
|
|
@@ -1210,6 +1255,7 @@ export function renderSetupGuideUi(env, requestOrigin) {
|
|
|
1210
1255
|
<meta charset="utf-8">
|
|
1211
1256
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
1212
1257
|
<title>${appName} Setup</title>
|
|
1258
|
+
<link rel="icon" href="/favicon.svg" type="image/svg+xml">
|
|
1213
1259
|
${themeBootScript()}
|
|
1214
1260
|
${sharedCss()}
|
|
1215
1261
|
<style>
|
|
@@ -1318,9 +1364,6 @@ ${sharedCss()}
|
|
|
1318
1364
|
font-weight: 600;
|
|
1319
1365
|
}
|
|
1320
1366
|
@media (max-width: 760px) {
|
|
1321
|
-
.setup-page .nav {
|
|
1322
|
-
border-radius: 999px;
|
|
1323
|
-
}
|
|
1324
1367
|
.setup-page .nav-links {
|
|
1325
1368
|
border-top: 1px solid var(--line);
|
|
1326
1369
|
}
|
|
@@ -1350,10 +1393,12 @@ ${sharedCss()}
|
|
|
1350
1393
|
<div class="shell narrow">
|
|
1351
1394
|
<nav class="nav">
|
|
1352
1395
|
<a href="/" class="brand">ErrorAtlas</a>
|
|
1353
|
-
<
|
|
1396
|
+
<div class="nav-actions">
|
|
1397
|
+
<button class="theme-toggle" id="themeToggle" type="button" aria-label="Switch theme" title="Switch theme"><span class="theme-toggle-icon" aria-hidden="true"></span></button>
|
|
1398
|
+
<button class="nav-menu" id="navMenu" type="button" aria-expanded="false" aria-controls="navLinks" aria-label="Open navigation"><span class="nav-menu-lines" aria-hidden="true"><span class="nav-menu-line"></span><span class="nav-menu-line"></span><span class="nav-menu-line"></span></span></button>
|
|
1399
|
+
</div>
|
|
1354
1400
|
<div class="nav-links" id="navLinks">
|
|
1355
1401
|
<a href="/dashboard">Dashboard</a>
|
|
1356
|
-
<button class="theme-toggle" id="themeToggle" type="button" aria-label="Switch theme" title="Switch theme"><span class="theme-toggle-icon" aria-hidden="true"></span></button>
|
|
1357
1402
|
<a class="button primary" href="/">Home</a>
|
|
1358
1403
|
</div>
|
|
1359
1404
|
</nav>
|
|
@@ -1495,6 +1540,7 @@ export function renderDashboardUi(env) {
|
|
|
1495
1540
|
<meta charset="utf-8">
|
|
1496
1541
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
1497
1542
|
<title>${appName} Dashboard</title>
|
|
1543
|
+
<link rel="icon" href="/favicon.svg" type="image/svg+xml">
|
|
1498
1544
|
${themeBootScript()}
|
|
1499
1545
|
${sharedCss()}
|
|
1500
1546
|
<style>
|
|
@@ -1843,10 +1889,12 @@ ${sharedCss()}
|
|
|
1843
1889
|
<div class="shell">
|
|
1844
1890
|
<nav class="nav">
|
|
1845
1891
|
<a href="/" class="brand">ErrorAtlas</a>
|
|
1846
|
-
<
|
|
1892
|
+
<div class="nav-actions">
|
|
1893
|
+
<button class="theme-toggle" id="themeToggle" type="button" aria-label="Switch theme" title="Switch theme"><span class="theme-toggle-icon" aria-hidden="true"></span></button>
|
|
1894
|
+
<button class="nav-menu" id="navMenu" type="button" aria-expanded="false" aria-controls="navLinks" aria-label="Open navigation"><span class="nav-menu-lines" aria-hidden="true"><span class="nav-menu-line"></span><span class="nav-menu-line"></span><span class="nav-menu-line"></span></span></button>
|
|
1895
|
+
</div>
|
|
1847
1896
|
<div class="nav-links" id="navLinks">
|
|
1848
1897
|
<a href="/setup">Setup</a>
|
|
1849
|
-
<button class="theme-toggle" id="themeToggle" type="button" aria-label="Switch theme" title="Switch theme"><span class="theme-toggle-icon" aria-hidden="true"></span></button>
|
|
1850
1898
|
<a class="button primary" href="/">Home</a>
|
|
1851
1899
|
</div>
|
|
1852
1900
|
</nav>
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sansynx/erroratlas",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.3",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"description": "Hosted ErrorAtlas MCP client and local debugging memory tools for coding agents.",
|
|
@@ -27,7 +27,6 @@
|
|
|
27
27
|
"deploy": "wrangler deploy",
|
|
28
28
|
"build": "npm run sync:assets && tsc -p tsconfig.json",
|
|
29
29
|
"typecheck": "tsc --noEmit",
|
|
30
|
-
"test:e2e": "npm run build && node scripts/e2e-smoke.mjs",
|
|
31
30
|
"prepack": "npm run build",
|
|
32
31
|
"mcp": "tsx src/mcp/server.ts",
|
|
33
32
|
"cli": "tsx src/cli/index.ts"
|