@eventmodelers/cli 2.0.36 → 2.0.38
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.
|
@@ -13,6 +13,7 @@ import { requestFetch, requestSync } from './stubs/chatSend'
|
|
|
13
13
|
import { phaseOf } from './stubs/useApplyStatus'
|
|
14
14
|
import { RebuildButton } from '@player/RebuildButton'
|
|
15
15
|
import { usePrototypeRebuild } from '@player/usePrototypeRebuild'
|
|
16
|
+
import { snapshotsKey, useSnapshots } from '@player/snapshots'
|
|
16
17
|
import '@player/feedback/FeedbackReplay' // registers the replay overlay
|
|
17
18
|
|
|
18
19
|
const SQUARE: React.CSSProperties = { margin: 0, width: 30, height: 30, padding: 0, display: 'inline-flex', alignItems: 'center', justifyContent: 'center' }
|
|
@@ -115,6 +116,7 @@ const LocalPlayer: React.FC = () => {
|
|
|
115
116
|
const name = (load && 'contextName' in load && load.contextName) || 'Prototype'
|
|
116
117
|
const reloadRef = useRef<() => void>(() => {})
|
|
117
118
|
const feedback = usePrototypeFeedback(frame, { timelineId: 'local', title: name, html, boardId: 'local' })
|
|
119
|
+
useSnapshots(frame, snapshotsKey('local', 'local', name), run) // the Event log panel's named snapshots, kept in this browser
|
|
118
120
|
const agentRebuild = usePrototypeRebuild({ timelineId: 'local', title: name, boardId: 'local', name, onRebuilt: () => reloadRef.current() })
|
|
119
121
|
|
|
120
122
|
const reload = useCallback(() => { setFrameReady(false); setRun(r => r + 1) }, [])
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@eventmodelers/cli",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.38",
|
|
4
4
|
"description": "Eventmodelers CLI — real-time Claude agent + skills for Claude Code, for any stack (Node, Supabase, Axon, OpenCQRS, UmaDB, Kurrent, or modeling-only)",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -93,6 +93,11 @@
|
|
|
93
93
|
.em-toast.em-error { background: #b91c1c; }
|
|
94
94
|
.em-banner { padding: 10px 16px; font: 14px system-ui; color: #fff; background: #b91c1c; }
|
|
95
95
|
.em-banner pre { margin: 6px 0 0; white-space: pre-wrap; font-size: 12px; }
|
|
96
|
+
.em-note { display: flex; align-items: flex-start; gap: 8px; padding: 4px 12px; font: 12px system-ui; color: #92400e; background: #fffbeb; border-bottom: 1px solid #fde68a; }
|
|
97
|
+
.em-note details { flex: 1; }
|
|
98
|
+
.em-note summary { cursor: pointer; }
|
|
99
|
+
.em-note pre { margin: 4px 0; white-space: pre-wrap; font-size: 11px; color: #451a03; }
|
|
100
|
+
.em-note button { border: 0; background: none; cursor: pointer; font-size: 14px; line-height: 1; color: inherit; }
|
|
96
101
|
/* Narrow (the small snippet in the chat): the page gets all the room — the event panel is for the wider views. */
|
|
97
102
|
@media (max-width: 720px) { .em-shell { grid-template-columns: 1fr; } .em-panel { display: none; } }
|
|
98
103
|
</style>
|
|
@@ -780,10 +785,21 @@ globalThis.emMount = () => {
|
|
|
780
785
|
}
|
|
781
786
|
const failed = EMRuntime.runSpecs(EMRuntime.domain).filter((r) => !r.pass);
|
|
782
787
|
if (failed.length) {
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
);
|
|
788
|
+
const note = document.createElement('div');
|
|
789
|
+
note.className = 'em-note';
|
|
790
|
+
const det = document.createElement('details');
|
|
791
|
+
const sum = document.createElement('summary');
|
|
792
|
+
sum.textContent = `${failed.length} scenario${failed.length === 1 ? '' : 's'} from the board fail — run /prototype again to regenerate`;
|
|
793
|
+
const pre = document.createElement('pre');
|
|
794
|
+
pre.textContent = failed.map((r) => `✗ [${r.spec.slice || '-'}] ${r.spec.title}\n ${r.detail}`).join('\n');
|
|
795
|
+
det.append(sum, pre);
|
|
796
|
+
const close = document.createElement('button');
|
|
797
|
+
close.type = 'button';
|
|
798
|
+
close.title = 'Dismiss';
|
|
799
|
+
close.textContent = '×';
|
|
800
|
+
close.onclick = () => note.remove();
|
|
801
|
+
note.append(det, close);
|
|
802
|
+
banner.appendChild(note);
|
|
787
803
|
}
|
|
788
804
|
emMount();
|
|
789
805
|
})();
|