Skip to content

Sync with base#5

Open
LeeGathercole wants to merge 457 commits intoNHSDigital:mainfrom
event-catalog:main
Open

Sync with base#5
LeeGathercole wants to merge 457 commits intoNHSDigital:mainfrom
event-catalog:main

Conversation

@LeeGathercole
Copy link
Copy Markdown
Collaborator

Motivation

(Write your motivation here.)

boyney123 and others added 29 commits February 15, 2026 22:15
…2131)

* fix(visualiser): improve icon and label spacing in nodes

Add conditional bottom margins to node icons (mb-2 in full mode, mb-1 in simple mode) and increase label margins from mb-4 to mb-6 for longer labels (Channel, Command, Service, Data Product) to prevent overlap with rotated text in full mode.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>

* chore: setup language-server and playground packages for beta release

- Rename @eventcatalog/ec-language-server to @eventcatalog/language-server
- Add language-server and visualiser to CI/CD packaging workflow
- Configure changesets to ignore dsl-playground (private package)
- Create beta changeset for language-server 0.1.0

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>

* fix(language-server): add vitest config to resolve .js to .ts imports

The Langium-generated module.ts imports grammar.js (ESM convention),
but vitest needs explicit extension resolution to find the .ts source.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(language-server): use vite plugin to resolve .js to .ts imports

Replace naive resolve.extensions with a proper Vite plugin that rewrites
.js imports to .ts for all files in the language-server package. Handles
all Langium-generated ESM imports without needing explicit aliases.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* chore: add changeset for visualiser node redesign

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(playground): remove build scripts from private package

The playground is private and doesn't need to build in CI. Removing
build:bin prevents Turbo from trying to build it during test:ci, which
was failing because the visualiser dist/styles.css wasn't available yet.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(sdk): use separate test fixture dir for resources test

resources.test.ts and users.test.ts both used catalog-users/ as their
test fixture directory, causing a race condition when vitest runs them
in parallel - one test's beforeEach would delete the other's fixtures.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(language-server): resolve .js to .ts paths relative to importer

The plugin was returning relative paths which Vite resolved from root /
instead of from the importing file. Use path.resolve with the importer's
directory to produce correct absolute paths.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Create fuzzy-ghosts-chew.md

* Create proud-crabs-know.md

* fix(visualiser): restore Tailwind utilities in built CSS

Re-add tailwindcss/utilities import that was removed in 7d0203c.
The removal stripped all utility classes (flex, rounded, shadow, etc.)
from the built CSS, leaving visualiser nodes unstyled in core.

To prevent the original .hidden class conflict with the Astro header,
a PostCSS plugin now strips the bare .hidden rule from output and the
DownloadButton uses a custom ec-download-btn class instead.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* feat(visualiser, playground, language-server): node redesign, DSL examples, and completion improvements

Redesign visualiser node components with improved icon/label spacing, consistent padding, and better visual hierarchy. Add DSL example templates to playground and enhance language-server completions.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(language-server): resolve visualizer refs by version and use versioned output paths

- Key topLevelDefs by name@version for exact version lookups in graph builder
- Use versioned paths (name/versioned/x.y.z/index.md) in compiler to prevent
  multi-version collisions
- Remove invalid CommonJS require export from ESM-only package

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(language-server): resolve bare refs to latest version using semver

Per the DSL spec, unversioned references resolve to the latest version.
Previously, resolveNodeId and topLevelDefs used insertion order which
could bind bare refs to older versions. Now uses semver.compare to
deterministically pick the highest version.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(language-server): infer flow ref types from nested domain definitions

inferTypeFromCatalog now uses topLevelDefs (which includes nested
services/containers/channels inside domains) instead of scanning only
program.definitions. Previously, flow refs to nested resources would
fall back to "step" type instead of the correct type.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(language-server): preserve declared message type for data-product edges

Data-product inputs/outputs have an explicit type (event/command/query)
in the DSL, but fallback node creation was hardcoding "event". Now uses
inp.type and out.type so command/query inputs/outputs get the correct
node type in the graph.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(language-server): add routes-to edges for all receive channels

The dedupe check for message→channel routes-to edges was checking if
the message had any routes-to edge, causing only the first channel in
a multi-channel receives clause to get an edge. Now checks against the
specific channel ID so all channels get their routes-to edges.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(language-server): avoid langium generate race in CI build

The `build` script ran `langium generate && tsc` redundantly since
`build:bin` (which runs first via turbo) already does the same. When
turbo ran both `build` and `test:ci` concurrently, the second
`langium generate` overwrote src/generated files while vitest was
loading them, causing ERR_MODULE_NOT_FOUND for grammar.ts.

Changed `build` to just `tsc` since `build:bin` already handles
code generation.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
* perf(ui): defer search/sidebar hydration on initial load

* Create brown-mirrors-teach.md

---------

Co-authored-by: Thor <thor@Thors-MacBook-Pro.local>
Co-authored-by: David Boyne <boyneyy123@gmail.com>
* perf(search): load search index on first open

* Create good-laws-burn.md

---------

Co-authored-by: Thor <thor@Thors-MacBook-Pro.local>
Co-authored-by: David Boyne <boyneyy123@gmail.com>
* perf(search): compact search index payload for faster transfers

* Create serious-years-sin.md

---------

Co-authored-by: Thor <thor@Thors-MacBook-Pro.local>
Co-authored-by: David Boyne <boyneyy123@gmail.com>
* fix(core): resolve astro check type errors

- Unify CatalogConfig with canonical Config type instead of maintaining
  a separate incomplete definition missing logo, landingPage, etc.
- Add missing allowAnyEnvInSpecHeaders to Config asyncAPI field
- Fix SearchModal favorite fallback object to include summary property
- Fix SearchDataLoader window.setTimeout narrowing to never

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Create many-actors-jump.md

* chore: disable Vercel preview deployments

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
…erns (#2152)

Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
* fix(ui): prevent theme toggle hydration mismatch

* Create sharp-coins-promise.md

---------

Co-authored-by: Thor <thor@Thors-MacBook-Pro.local>
Co-authored-by: David Boyne <boyneyy123@gmail.com>
* feat(core): inject full catalog api route only when enabled

* Create tall-donkeys-rule.md

---------

Co-authored-by: Thor <thor@Thors-MacBook-Pro.local>
Co-authored-by: David Boyne <boyneyy123@gmail.com>
Co-authored-by: Thor <thor@Thors-MacBook-Pro.local>
* perf(visualiser): skip visualiser route generation when disabled

* Create witty-vans-cry.md

---------

Co-authored-by: Thor <thor@Thors-MacBook-Pro.local>
Co-authored-by: David Boyne <boyneyy123@gmail.com>
* perf(dev): prewarm first request after astro startup

* Create brave-falcons-march.md

---------

Co-authored-by: Thor <thor@Thors-MacBook-Pro.local>
Co-authored-by: David Boyne <boyneyy123@gmail.com>
* fix(visualiser): make focus mode modal self-styled

* Create clever-lions-occur.md

---------

Co-authored-by: Thor <thor@Thors-MacBook-Pro.local>
Co-authored-by: David Boyne <boyneyy123@gmail.com>
* updated asto versions

* Create afraid-mirrors-enjoy.md
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* fix(core): remove negated glob patterns from content.config.ts

Negated glob entries (!**/dist/**) in Astro's glob loader pattern arrays
break content collection resolution, causing InvalidContentEntryDataError
on fresh catalogs. This was introduced in 3.14.0.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>

* fix: format language-server CHANGELOG.md

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* feat(cli): add export command for DSL (.ec) format

Add CLI export command supporting single resource, bulk, and full catalog
export to EventCatalog DSL. Features include hydration of dependencies,
grouped output with section comments, visualizer blocks, plural resource
names, and playground integration. Fix getServices to ignore nested
channels, containers, data-products, data-stores, and flows.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>

* Create six-dancers-yell.md

---------

Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* perf(sdk): add in-memory file index cache for faster catalog lookups

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>

* Update fast-clouds-race.md

* fix(sdk): preserve message-type precedence and fix windows path parsing

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
…dges (#2168)

Remove direct message → channel edges when an indirect path already exists
through channel routing chains. Simplify user/team DSL spec by removing
owns statement.

Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: thorthelegend99 <thorthelegend99@users.noreply.github.com>
boyney123 and others added 30 commits March 24, 2026 07:44
Remove CSS import that breaks server-side rendering, add proper type
assertion for lazy-loaded component, and export NodeGraphProps type.

Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* fix(core): replace better-sqlite3 with sql.js to remove native compilation dependency

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>

* fix(core): escape LIKE wildcards in field search queries

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* fix(core): handle array type values in JSON Schema field extraction

JSON Schema allows array syntax for nullable fields (e.g. "type": ["string", "null"]).
The field extractor passed these arrays through as-is, which SQLite stored as blobs.
sql.js then returned Uint8Array values that React cannot render, crashing the fields
explorer page. Array types are now joined as pipe-separated strings (e.g. "string | null").

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>

* fix(core): recurse into nullable object and array types in field extractor

JSON Schema nullable objects ("type": ["object", "null"]) and nullable arrays
("type": ["array", "null"]) were not recursing into nested properties or items
because the recursion checks compared prop.type directly with === which fails
for array values. Now normalises the type to a list before checking.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>

* fix(core): sort array type values before joining to avoid false conflicts

Schemas with equivalent nullable types in different order (e.g. ["string", "null"]
vs ["null", "string"]) were stored as different strings, causing false type conflict
detection. Sorting the array alphabetically before joining ensures consistent output.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>

* fix(core): cap field path column width and add hover tooltip

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* chore(core): clarify licensing boundaries and protect enterprise code

- Add root MIT LICENSE file with enterprise carve-out
- Add EventCatalog Commercial License to enterprise directory
- Move paid feature flags from utils/feature.ts to enterprise/feature.ts
- Move schema API routes, custom docs routes, and resource-docs into enterprise
- Move eventcatalog-features integration into enterprise
- Add license headers to all enterprise source files
- Fix package.json license fields across all packages
- Add title attribute to sidebar items for long text hover
- Add example ADR resource docs for E-Commerce domain

Closes #2387

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix(core): update schema API test imports to new enterprise paths

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* feat(sdk): add entities, containers, and flows to dumpCatalog

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>

* update README

---------

Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* fix(core): handle circular refs in asyncapi spec rendering

The AsyncAPI parser resolves $ref pointers creating circular object
references with oneOf/allOf discriminator patterns. Astro's define:vars
calls JSON.stringify internally which crashes on these cycles. Add
safeStringify to break circular refs before serialization.

Refs: event-catalog/generators#364

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>

* fix(core): track ancestors not all-seen objects for cycle detection

Use a recursive deep-copy with ancestor tracking instead of a WeakSet
of all-ever-seen objects. This preserves shared (non-circular) refs
while still breaking true cycles from oneOf/allOf discriminator patterns.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
- Add flows to Service and Domain interfaces
- Add deliveryGuarantee, detailsPanel.parameters, and detailsPanel.attachments to Channel
- Align SDK types with content.config.ts schema definitions

Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* docs: add breaking schema change detection implementation plan

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* chore: add .worktrees/ to .gitignore

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* feat(breaking-changes): scaffold package

* feat(breaking-changes): json schema differ with tests

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* feat(breaking-changes): breaking change rules per strategy with tests

* feat(breaking-changes): integration tests for public API

* feat(cli): add schema_breaking_change trigger type and BreakingSchemaChange

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* feat(cli): parse compatibility strategy from governance.yaml

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* feat(cli): evaluate schema_breaking_change governance rules

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* feat(cli): enrich breaking schema changes with actual diff results

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* feat(cli): schema_breaking_change webhook payload with CloudEvents envelope

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* chore: format code

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix(breaking-changes): detect root type changes and implicit nested objects

- Detect root-level type changes (e.g., object → array)
- Recurse into nested schemas that have properties/required but no explicit type

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix(cli): validate compatibility strategy and narrow catch scope

- Validate strategy against BACKWARD/FORWARD/FULL/NONE on config load
- Narrow try/catch to only JSON.parse so detectBreakingChanges errors propagate

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* chore: remove implementation plan from repo

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* chore: add changeset for breaking schema change detection

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants