@milehimikey/em 1.7.2 → 1.8.0

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.
Files changed (112) hide show
  1. package/.claude/skills/event-modeling/SKILL.md +92 -65
  2. package/.claude/skills/event-modeling/reference/conform.md +45 -20
  3. package/.claude/skills/event-modeling/reference/em-dsl.md +120 -55
  4. package/.claude/skills/event-modeling/reference/extract.md +5 -4
  5. package/.claude/skills/event-modeling/reference/implement.md +34 -22
  6. package/.claude/skills/event-modeling/templates/model-readme.md +8 -5
  7. package/.claude/skills/event-modeling/templates/slice.md +19 -5
  8. package/README.md +6 -4
  9. package/dist/catalog/docJoin.d.ts +28 -3
  10. package/dist/catalog/docJoin.js +82 -13
  11. package/dist/catalog/docJoin.js.map +1 -1
  12. package/dist/catalog/docModelConsistencyValidate.d.ts +8 -0
  13. package/dist/catalog/docModelConsistencyValidate.js +335 -0
  14. package/dist/catalog/docModelConsistencyValidate.js.map +1 -0
  15. package/dist/catalog/noteBindingValidate.d.ts +8 -0
  16. package/dist/catalog/noteBindingValidate.js +133 -0
  17. package/dist/catalog/noteBindingValidate.js.map +1 -0
  18. package/dist/catalog/pages.js +3 -3
  19. package/dist/catalog/pages.js.map +1 -1
  20. package/dist/catalog/sliceDoc.d.ts +14 -0
  21. package/dist/catalog/sliceDoc.js +22 -0
  22. package/dist/catalog/sliceDoc.js.map +1 -1
  23. package/dist/catalog/sliceReadyValidate.d.ts +18 -0
  24. package/dist/catalog/sliceReadyValidate.js +25 -1
  25. package/dist/catalog/sliceReadyValidate.js.map +1 -1
  26. package/dist/cli/agentsMd.d.ts +15 -0
  27. package/dist/cli/agentsMd.js +72 -0
  28. package/dist/cli/agentsMd.js.map +1 -0
  29. package/dist/cli/conformScope.d.ts +86 -0
  30. package/dist/cli/conformScope.js +156 -0
  31. package/dist/cli/conformScope.js.map +1 -0
  32. package/dist/cli/contract.d.ts +7 -0
  33. package/dist/cli/contract.js +27 -0
  34. package/dist/cli/contract.js.map +1 -0
  35. package/dist/cli/coverage.d.ts +69 -0
  36. package/dist/cli/coverage.js +157 -0
  37. package/dist/cli/coverage.js.map +1 -0
  38. package/dist/cli/markImplemented.d.ts +34 -0
  39. package/dist/cli/markImplemented.js +180 -0
  40. package/dist/cli/markImplemented.js.map +1 -0
  41. package/dist/cli/migrateReactionShape.d.ts +62 -0
  42. package/dist/cli/migrateReactionShape.js +283 -0
  43. package/dist/cli/migrateReactionShape.js.map +1 -0
  44. package/dist/cli/sliceIndex.d.ts +49 -0
  45. package/dist/cli/sliceIndex.js +115 -0
  46. package/dist/cli/sliceIndex.js.map +1 -0
  47. package/dist/cli/sliceNew.d.ts +18 -0
  48. package/dist/cli/sliceNew.js +53 -0
  49. package/dist/cli/sliceNew.js.map +1 -0
  50. package/dist/cli/stateFile.d.ts +74 -0
  51. package/dist/cli/stateFile.js +191 -0
  52. package/dist/cli/stateFile.js.map +1 -0
  53. package/dist/cli.js +535 -43
  54. package/dist/cli.js.map +1 -1
  55. package/dist/emit/coverageJson.d.ts +8 -0
  56. package/dist/emit/coverageJson.js +30 -0
  57. package/dist/emit/coverageJson.js.map +1 -0
  58. package/dist/emit/dot.js +41 -10
  59. package/dist/emit/dot.js.map +1 -1
  60. package/dist/emit/json.d.ts +72 -4
  61. package/dist/emit/json.js +73 -4
  62. package/dist/emit/json.js.map +1 -1
  63. package/dist/emit/validateJson.d.ts +52 -0
  64. package/dist/emit/validateJson.js +120 -0
  65. package/dist/emit/validateJson.js.map +1 -0
  66. package/dist/mcp/main.d.ts +2 -0
  67. package/dist/mcp/main.js +20 -0
  68. package/dist/mcp/main.js.map +1 -0
  69. package/dist/mcp/server.d.ts +11 -0
  70. package/dist/mcp/server.js +260 -0
  71. package/dist/mcp/server.js.map +1 -0
  72. package/dist/model/model.d.ts +30 -1
  73. package/dist/model/model.js +26 -0
  74. package/dist/model/model.js.map +1 -1
  75. package/dist/model/rules.d.ts +114 -0
  76. package/dist/model/rules.js +116 -4
  77. package/dist/model/rules.js.map +1 -1
  78. package/dist/model/validate.js +83 -7
  79. package/dist/model/validate.js.map +1 -1
  80. package/dist/parser/ast.d.ts +41 -0
  81. package/dist/parser/lexer.d.ts +16 -0
  82. package/dist/parser/lexer.js +44 -2
  83. package/dist/parser/lexer.js.map +1 -1
  84. package/dist/parser/parser.js +340 -20
  85. package/dist/parser/parser.js.map +1 -1
  86. package/dist/render/drawNotes.js +8 -1
  87. package/dist/render/drawNotes.js.map +1 -1
  88. package/dist/render/render.js +85 -17
  89. package/dist/render/render.js.map +1 -1
  90. package/dist/render/serve.d.ts +4 -0
  91. package/dist/render/serve.js +23 -239
  92. package/dist/render/serve.js.map +1 -1
  93. package/dist/render/sliceStatus.d.ts +1 -1
  94. package/dist/render/sliceStatus.js +35 -6
  95. package/dist/render/sliceStatus.js.map +1 -1
  96. package/dist/render/viewerHtml.d.ts +1 -0
  97. package/dist/render/viewerHtml.js +5 -0
  98. package/dist/render/viewerHtml.js.map +1 -0
  99. package/dist/render/watch.d.ts +10 -0
  100. package/dist/render/watch.js +29 -0
  101. package/dist/render/watch.js.map +1 -1
  102. package/dist/templates.d.ts +19 -0
  103. package/dist/templates.js +169 -0
  104. package/dist/templates.js.map +1 -1
  105. package/dist/util/markers.d.ts +13 -0
  106. package/dist/util/markers.js +30 -0
  107. package/dist/util/markers.js.map +1 -0
  108. package/dist/util/walkDir.d.ts +10 -1
  109. package/dist/util/walkDir.js +11 -7
  110. package/dist/util/walkDir.js.map +1 -1
  111. package/package.json +12 -3
  112. package/.claude/skills/event-modeling/templates/live.html +0 -117
@@ -1,117 +0,0 @@
1
- <!doctype html>
2
- <!--
3
- Live viewer for an em event model. Auto-reloads the rendered SVG so a team on a shared
4
- screen sees updates from `em watch` without manual refresh.
5
-
6
- Two ways to use it:
7
-
8
- A) Push (recommended, instant, no polling):
9
- em watch MODEL.em -o MODEL.svg --serve
10
- then open the URL it prints (http://localhost:5173/?svg=MODEL.svg). You don't need
11
- this file at all in that mode — the server serves its own push-based viewer.
12
-
13
- B) This file, over file:// (no server):
14
- 1) In one terminal: em watch MODEL.em -o MODEL.svg
15
- 2) Open this file with the SVG name in the query:
16
- open "live.html?svg=MODEL.svg" (macOS)
17
- No editing required — the ?svg= param picks the model.
18
-
19
- Under file:// the browser gives no reliable "did the file change?" signal (fetch/HEAD is
20
- blocked), so this fallback polls and reloads on a gentle interval. It double-buffers the
21
- swap so a shared screen never flashes. For zero idle work and instant updates, use --serve.
22
-
23
- The SVG is embedded via <object> so note "..." links inside it stay clickable.
24
- -->
25
- <html lang="en">
26
- <head>
27
- <meta charset="utf-8" />
28
- <title>Event Model — Live</title>
29
- <style>
30
- :root { color-scheme: light dark; }
31
- body { margin: 0; font-family: system-ui, sans-serif; background: #fafafa; }
32
- header {
33
- display: flex; align-items: center; gap: .75rem;
34
- padding: .5rem .9rem; background: #1f2933; color: #fff; font-size: 14px;
35
- }
36
- header .dot { width: 9px; height: 9px; border-radius: 50%; background: #34c759; }
37
- header .stamp { margin-left: auto; opacity: .7; font-variant-numeric: tabular-nums; }
38
- #stage { padding: 1rem; }
39
- object { width: 100%; height: calc(100vh - 60px); border: 0; }
40
- </style>
41
- </head>
42
- <body>
43
- <header>
44
- <span class="dot"></span>
45
- <span>Event Model — live (auto-refresh)</span>
46
- <span class="stamp" id="stamp">—</span>
47
- </header>
48
- <div id="stage">
49
- <object id="svg" type="image/svg+xml"></object>
50
- </div>
51
- <script>
52
- // SVG filename from ?svg=<name>.svg (defaults to model.svg) — one file serves any model.
53
- const SVG_FILE = new URLSearchParams(location.search).get("svg") || "model.svg";
54
- // Poll cadence for the file:// fallback. Tune freely; --serve makes polling unnecessary.
55
- const REFRESH_INTERVAL_MS = 2000;
56
-
57
- const stage = document.getElementById("stage");
58
- const stamp = document.getElementById("stamp");
59
- let current = document.getElementById("svg");
60
- let lastModified = null;
61
-
62
- // Best-effort change check — only meaningful when served over http(s). Under file://
63
- // fetch/HEAD is blocked, so this throws and we fall back to reloading every tick.
64
- async function changed() {
65
- if (!location.protocol.startsWith("http")) return true;
66
- try {
67
- const res = await fetch(SVG_FILE, { method: "HEAD", cache: "no-store" });
68
- const tag = res.headers.get("last-modified") || res.headers.get("etag");
69
- if (tag && tag === lastModified) return false;
70
- lastModified = tag;
71
- return true;
72
- } catch {
73
- return true; // can't tell — reload to be safe
74
- }
75
- }
76
-
77
- // Double-buffer: load into a hidden <object>, swap on load, so the shared screen
78
- // never flashes white during a reload. The buffer must be attached to the document
79
- // BEFORE data is set — a detached <object> never starts fetching its resource, so
80
- // its load event would never fire and the swap would never happen.
81
- let pending = null; // the in-flight buffer <object>, if a swap is loading
82
- function swap() {
83
- if (pending) pending.remove(); // superseded by this newer swap
84
- const next = document.createElement("object");
85
- next.type = "image/svg+xml";
86
- next.style.cssText = current.style.cssText;
87
- next.style.position = "absolute"; // out of flow + invisible while loading
88
- next.style.visibility = "hidden";
89
- next.addEventListener("load", () => {
90
- if (pending !== next) return; // a newer swap already replaced this one
91
- pending = null;
92
- next.style.position = "";
93
- next.style.visibility = "";
94
- stage.removeChild(current);
95
- current = next;
96
- stamp.textContent = new Date().toLocaleTimeString();
97
- }, { once: true });
98
- stage.appendChild(next);
99
- pending = next;
100
- next.setAttribute("data", SVG_FILE + "?t=" + Date.now());
101
- }
102
-
103
- // Self-scheduling loop: schedule the next tick only after this one resolves, so a slow
104
- // reload can never overlap the next tick.
105
- async function tick() {
106
- try {
107
- if (await changed()) swap();
108
- } finally {
109
- setTimeout(tick, REFRESH_INTERVAL_MS);
110
- }
111
- }
112
-
113
- swap();
114
- setTimeout(tick, REFRESH_INTERVAL_MS);
115
- </script>
116
- </body>
117
- </html>