{"id":49412697,"url":"https://github.com/asteby/metacore-kernel","last_synced_at":"2026-06-02T07:00:24.639Z","repository":{"id":354024777,"uuid":"1211998216","full_name":"asteby/metacore-kernel","owner":"asteby","description":"Metacore kernel — WASM runtime, capabilities, installer (private)","archived":false,"fork":false,"pushed_at":"2026-05-29T05:13:35.000Z","size":1296,"stargazers_count":4,"open_issues_count":2,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-29T07:15:49.324Z","etag":null,"topics":["dynamic-crud","golang","kernel","metacore","multi-tenant","permissions","pgvector","webhooks"],"latest_commit_sha":null,"homepage":null,"language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/asteby.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"security/context.go","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-04-16T00:55:37.000Z","updated_at":"2026-05-29T03:57:05.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/asteby/metacore-kernel","commit_stats":null,"previous_names":["asteby/metacore-kernel"],"tags_count":36,"template":false,"template_full_name":null,"purl":"pkg:github/asteby/metacore-kernel","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/asteby%2Fmetacore-kernel","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/asteby%2Fmetacore-kernel/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/asteby%2Fmetacore-kernel/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/asteby%2Fmetacore-kernel/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/asteby","download_url":"https://codeload.github.com/asteby/metacore-kernel/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/asteby%2Fmetacore-kernel/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33810343,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-02T02:00:07.132Z","response_time":109,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["dynamic-crud","golang","kernel","metacore","multi-tenant","permissions","pgvector","webhooks"],"created_at":"2026-04-29T01:11:34.910Z","updated_at":"2026-06-02T07:00:24.621Z","avatar_url":"https://github.com/asteby.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"docs/assets/metacore.svg\" width=\"120\" alt=\"Metacore Kernel\" /\u003e\n\u003c/p\u003e\n\n\u003ch1 align=\"center\"\u003eMetacore Kernel\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cem\u003eSecure WASM runtime and substrate for declarative, multi-tenant Go applications.\u003c/em\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://go.dev/dl/\"\u003e\u003cimg alt=\"Go 1.25.7\" src=\"https://img.shields.io/badge/go-1.25.7-00ADD8?logo=go\u0026logoColor=white\" /\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/asteby/metacore-kernel/actions/workflows/ci.yml\"\u003e\u003cimg alt=\"CI\" src=\"https://github.com/asteby/metacore-kernel/actions/workflows/ci.yml/badge.svg?branch=main\" /\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/asteby/metacore-kernel/actions/workflows/release.yml\"\u003e\u003cimg alt=\"Release\" src=\"https://github.com/asteby/metacore-kernel/actions/workflows/release.yml/badge.svg\" /\u003e\u003c/a\u003e\n  \u003ca href=\"./LICENSE\"\u003e\u003cimg alt=\"License\" src=\"https://img.shields.io/badge/license-Apache_2.0-blue\" /\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n\u003e 📚 **Documentation:** Full docs live at **[asteby.github.io/metacore](https://asteby.github.io/metacore/)**. The `docs/` folder in this repo is kept for offline reference only.\n\n---\n\n## Table of contents\n\n- [What is `metacore-kernel`](#what-is-metacore-kernel)\n- [Dynamic CRUD framework](#dynamic-crud-framework)\n- [Architecture](#architecture)\n- [Embedding](#embedding)\n- [Subsystems](#subsystems)\n- [WebSocket protocol](#websocket-protocol)\n- [Addon contract](#addon-contract)\n- [Stability](#stability)\n- [Documentation](#documentation)\n- [Development](#development)\n- [Release process](#release-process)\n- [Module path](#module-path)\n- [License](#license)\n\n---\n\n## What is `metacore-kernel`\n\n`metacore-kernel` is the **runtime substrate** that every Metacore application\nembeds as a Go module. It owns the cross-cutting concerns no individual product\nshould re-implement:\n\n- **WASM addon runtime** — compiles and executes signed addons in a wazero\n  sandbox with memory caps, wall-clock timeouts, and a host module that gates\n  every privileged syscall through a capability enforcer.\n- **Capability-based security** — HMAC-signed install secrets, nonce-based\n  replay protection, and a global enforcer with `shadow`/`enforce` modes that\n  operators flip at runtime.\n- **Lifecycle orchestration** — install / enable / disable / uninstall hooks,\n  plus a `Boot()` phase that wires shared services (DB, event bus, …) into\n  every registered addon.\n- **Metadata-driven CRUD** — a registry of `TableMetadata` / `ModalMetadata`\n  feeds a generic dynamic CRUD service that every host shares; apps register\n  models, the kernel exposes the routes.\n- **Event bus, WebSocket hub, push, webhooks** — the technical communication\n  primitives every multi-tenant web application eventually needs, framework-\n  agnostic at the service layer and Fiber-native at the handler layer.\n\nThe kernel is **embeddable**, not a server. It compiles into the host\nbinary; there is no `metacore` daemon. All public contracts are behind\ninterfaces, so adding fields to base structs is a non-breaking change\n(see [`ARCHITECTURE.md`](./ARCHITECTURE.md) for the four-laws statement).\n\n`metacore-kernel` consumes the public [`metacore-sdk`](https://github.com/asteby/metacore-sdk)\nfor manifest, bundle and dynamic-table type definitions; it does **not**\npublish addons of its own. Addons are authored against the SDK CLI\n(`metacore build` / `compile-wasm`) and executed by this kernel.\n\n## Dynamic CRUD framework\n\n\u003e **Zero-glue CRUD.** Declare a model in `manifest.json`, install the\n\u003e addon, get a working API and admin UI. No handlers, no migrations, no\n\u003e per-model React.\n\nWhen an addon ships `model_definitions[]` in its manifest, `installer.Install`\ncreates the Postgres schema, runs DDL, registers metadata, and the kernel's\n`dynamic.Handler` starts serving live CRUD endpoints — all without addon code:\n\n```json\n{\n  \"key\": \"tickets\",\n  \"model_definitions\": [{\n    \"table_name\": \"tickets\",\n    \"org_scoped\": true,\n    \"soft_delete\": true,\n    \"columns\": [\n      { \"name\": \"subject\",  \"type\": \"string\", \"size\": 200, \"required\": true, \"index\": true },\n      { \"name\": \"status\",   \"type\": \"string\", \"size\": 24,  \"default\": \"'open'\" },\n      { \"name\": \"priority\", \"type\": \"string\", \"size\": 12 },\n      { \"name\": \"due_at\",   \"type\": \"timestamp\" }\n    ]\n  }],\n  \"capabilities\": [\n    { \"kind\": \"db:read\",  \"target\": \"addon_tickets.*\" },\n    { \"kind\": \"db:write\", \"target\": \"addon_tickets.*\" }\n  ]\n}\n```\n\nThat manifest is the **only** code needed to expose:\n\n| Endpoint                                | Behaviour                                            |\n| --------------------------------------- | ---------------------------------------------------- |\n| `GET/POST /api/dynamic/tickets`         | Paginated list, filters, sort, search · create        |\n| `GET/PUT/DELETE /api/dynamic/tickets/:id` | Get, update (load-merge-save), soft delete           |\n| `GET /api/options/tickets`              | Select/lookup options (with resolver)                |\n| `GET /api/search/tickets`               | Full-text search over searchable columns             |\n| `GET /api/metadata/table/tickets`       | TableMetadata for the runtime-react `DynamicTable`   |\n| `GET /api/metadata/modal/tickets`       | ModalMetadata for the runtime-react form generator   |\n\nPer-request user capabilities (`tickets.read`, `tickets.create`, …) are\ngated by `permission.Service`; addon-level capabilities (`db:write\naddon_tickets.*`) are gated by `security.Enforcer` in either shadow or\nenforce mode.\n\nRead [`docs/dynamic-system.md`](./docs/dynamic-system.md) for the full\nend-to-end walkthrough,\n[`docs/dynamic-api.md`](./docs/dynamic-api.md) for the HTTP reference, and\n[`docs/permissions.md`](./docs/permissions.md) for the capability model.\n\n## Architecture\n\n```\n                    ┌──────────────────────────────────────────────┐\n                    │                Host application              │\n                    │                                              │\n                    │  fiber.App  ──►  host.App.Mount(/api)        │\n                    └──────┬───────────────────────────────────────┘\n                           │ embeds via go.mod\n                           ▼\n                    ┌──────────────────────────────────────────────┐\n                    │            metacore-kernel (this repo)       │\n                    │                                              │\n                    │  ┌─────────────┐   ┌─────────────────────┐   │\n                    │  │   host/     │──►│   auth · permission │   │\n                    │  │ App + Host  │   │   metadata · dynamic│   │\n                    │  │  facades    │   │   query · obs       │   │\n                    │  └──────┬──────┘   └─────────────────────┘   │\n                    │         │                                    │\n                    │  ┌──────▼──────┐   ┌─────────────────────┐   │\n                    │  │ lifecycle/  │──►│    events/  (bus)   │   │\n                    │  │ installer/  │   │    eventlog/ (log)  │   │\n                    │  │ navigation/ │   │    ws/  push/       │   │\n                    │  │ manifest/   │   │    notifications/   │   │\n                    │  └──────┬──────┘   │    webhooks/        │   │\n                    │         │          └─────────────────────┘   │\n                    │  ┌──────▼──────┐   ┌─────────────────────┐   │\n                    │  │ runtime/    │──►│    security/        │   │\n                    │  │   wasm/     │   │  Enforcer · HMAC    │   │\n                    │  │  (wazero)   │   │  Capabilities       │   │\n                    │  └──────┬──────┘   └─────────────────────┘   │\n                    └─────────┼────────────────────────────────────┘\n                              │ host module imports (gated)\n                              ▼\n                    ┌──────────────────────────────────────────────┐\n                    │              Addon WASM module               │\n                    │   built with metacore-sdk CLI · sandboxed    │\n                    │   exports: alloc(i32) · \u003cfn\u003e(ptr,len) i64    │\n                    └──────────────────────────────────────────────┘\n```\n\n### Dynamic CRUD flow\n\n```\nmanifest.json (model_definitions[], capabilities[])\n        │\n        ▼\ninstaller.Install\n   ├──► dynamic.EnsureSchema       (CREATE SCHEMA addon_\u003ckey\u003e)\n   ├──► dynamic.Apply              (versioned SQL migrations)\n   ├──► dynamic.CreateTable        (CREATE TABLE + RLS policy)\n   ├──► dynamic.SyncSchema         (ADD COLUMN IF NOT EXISTS)\n   └──► lifecycle OnInstall/OnEnable\n        │\n        ▼\nmodelbase.Register(\"\u003cmodel\u003e\", factory)        ◄── host wires this\n        │\n        ▼\nhost.App.Mount\n   ├──► metadata.Handler  ──►  GET /metadata/{table,modal,all}/:model\n   └──► dynamic.Handler   ──►  GET/POST/PUT/DELETE /dynamic/:model\n                                GET /options/:model · /search/:model\n        │                       ▲\n        │                       │ permission.Service.Check (per request)\n        ▼\n@asteby/metacore-runtime-react renders the table + modal from metadata\n```\n\nTwo transports talk to the frontend at the same time:\n\n1. **WebSocket** (`ws/`) — bidirectional, primary channel for live updates,\n   notifications, addon events.\n2. **REST** — Fiber routes mounted under `/api/*` for auth, metadata, CRUD,\n   navigation, push subscriptions, webhooks, addon installs.\n\nEvery privileged operation an addon attempts (DB read, event publish, HTTP\nfetch, …) is brokered by the `security.Enforcer`. The enforcer can run in\n`shadow` mode (log only) during rollout and is flipped to `enforce` via the\n`METACORE_ENFORCE` environment variable without redeploys.\n\n## Embedding\n\nThe kernel exposes two facades. Pick the highest-level one that fits.\n\n### Option 1 — `host.App` (recommended)\n\n`host.App` wires `auth + metadata + dynamic CRUD + WebSocket hub` and,\noptionally, `permission`, `push`, `webhooks` and Prometheus metrics. It is the\nsingle call most apps need.\n\n```go\npackage main\n\nimport (\n    \"log\"\n    \"os\"\n\n    \"github.com/gofiber/fiber/v2\"\n    \"gorm.io/driver/postgres\"\n    \"gorm.io/gorm\"\n\n    \"github.com/asteby/metacore-kernel/host\"\n    \"github.com/asteby/metacore-kernel/modelbase\"\n)\n\nfunc main() {\n    db, err := gorm.Open(postgres.Open(os.Getenv(\"DATABASE_URL\")), \u0026gorm.Config{})\n    if err != nil {\n        log.Fatalf(\"db: %v\", err)\n    }\n\n    app := host.NewApp(host.AppConfig{\n        DB:             db,\n        JWTSecret:      []byte(os.Getenv(\"JWT_SECRET\")),\n        RunMigrations:  true,\n        EnableMetrics:  true,\n        EnableWebhooks: true,\n    }).RegisterModel(\"products\", func() modelbase.ModelDefiner {\n        return \u0026Product{}\n    })\n\n    fiberApp := fiber.New()\n    app.Mount(fiberApp.Group(\"/api\"))\n\n    log.Fatal(fiberApp.Listen(\":3000\"))\n}\n```\n\n`Mount` returns the authenticated sub-router, so the app can layer its own\ndomain handlers on top of the kernel-provided ones.\n\n### Option 2 — `host.Host` (addon-platform mode)\n\nWhen the binary needs to **host WASM addons** (install, enable, lifecycle\nhooks, navigation merge), construct a `host.Host` instead. This is the mode\nhost applications use to load addons such as conversational extensions or\nmarketplace integrations.\n\n```go\nh, err := host.New(host.Config{\n    DB:            db,\n    KernelVersion: \"0.20.0\",\n    Services: map[string]any{\n        \"eventbus\": bus,\n    },\n})\nif err != nil { log.Fatal(err) }\n\nh.RegisterCompiled(\"billing\", \u0026billing.Addon{})\n\nif err := h.Boot(); err != nil { log.Fatal(err) }\n```\n\nThe two facades compose: real apps build a `host.App` for HTTP plumbing and a\n`host.Host` for the addon plane, sharing the same `*gorm.DB`.\n\nFor a step-by-step walk-through see\n[`docs/CONSUMER_GUIDE.md`](./docs/CONSUMER_GUIDE.md).\n\n## Subsystems\n\n| Package           | Responsibility                                                                |\n| ----------------- | ----------------------------------------------------------------------------- |\n| `host/`           | `App` and `Host` facades — boot orchestration and Fiber mount                 |\n| `auth/`           | JWT issue/verify, password hashing, login/refresh handlers, Fiber middleware  |\n| `permission/`     | Role + capability checks; pluggable `PermissionStore`                         |\n| `metadata/`       | `TableMetadata` / `ModalMetadata` registry + cache + handler                  |\n| `dynamic/`        | Generic CRUD over registered models, options/search resolvers                 |\n| `query/`          | Filter/sort/paginate query builder                                            |\n| `modelbase/`      | Stable interfaces (`AuthUser`, `AuthOrg`, `ModelDefiner`) + base structs      |\n| `obs/`            | Structured `slog` logger with request-id propagation                          |\n| `ws/`             | WebSocket hub, per-user routing, broadcast helpers                            |\n| `push/`           | Web Push (VAPID) subscriptions and dispatch                                   |\n| `webhooks/`       | Outbound HMAC-signed webhooks with retry queue                                |\n| `notifications/`  | Delivery queue, dedup, retry, pluggable `ChannelHandler`                      |\n| `eventlog/`       | Org-scoped persisted event log with cursor pagination                         |\n| `events/`         | In-process pub/sub bus for addons (capability-checked, wildcard patterns)     |\n| `lifecycle/`      | Addon contract (`Manifest`, `OnInstall`, …) + registry + interceptors + hook runner |\n| `installer/`      | Install / enable / disable / uninstall / upgrade flow + frontend bundle materialization |\n| `marketplace/`    | Install / uninstall / upgrade / rollback / discovery HTTP endpoints           |\n| `preset/`         | Resolve + install `kind: \"Preset\"` verticals as an ordered addon unit          |\n| `navigation/`     | Merge core sidebar groups with addon contributions                            |\n| `manifest/`       | Declarative addon manifest schema (mirrored by SDK); `v3/` = Module Contract v3 + `FromV3` mapper |\n| `bundle/`         | Addon bundle I/O contracts (`bundle.tgz` reader/writer)                       |\n| `tool/`           | Addon tool runtime + dispatcher + registry                                    |\n| `guest/`          | TinyGo-compatible guest-side helpers for addon authors (`EmitEvent`, `DbQuery`, …) |\n| `bridge/`         | Adapters that map kernel actions/tools/webhooks to host integrations          |\n| `runtime/wasm/`   | wazero-based WASM runtime, ABI, capability-gated host imports                 |\n| `runtime/flow/`   | Generic workflow DAG engine (pluggable node registry, optional persistence)   |\n| `security/`       | `Enforcer`, `Capabilities`, HMAC, secretbox, nonce store, webhook dispatch    |\n| `hub/`            | Kernel-side Hub HTTP client (browse → fetch → install catalog/bundle contract) |\n| `config/`         | Org-scoped config getters (`OrgCurrencyGetter`) + Fiber-context helpers       |\n| `database/`       | GORM helpers incl. the `RegisterCurrencyDefaultCallback` BeforeCreate hook    |\n| `idempotency/`    | Idempotency-key middleware + store for replay-safe mutations                  |\n| `i18n/`           | String-bundle loading + locale resolution                                     |\n| `vector/`         | pgvector helpers for embedding columns                                        |\n| `metrics/`        | Prometheus registry, Fiber middleware, `/metrics` handler                    |\n| `migrations/`     | Versioned SQL migration runner (Goose) for kernel-owned tables                |\n| `httpx/`          | HTTP helpers reused across handlers                                           |\n| `log/`            | Builder-style logger (legacy; new code uses `obs/`)                           |\n\nA package-by-package contract — what belongs in the kernel versus the SDK\nversus an app — is documented in [`ARCHITECTURE.md`](./ARCHITECTURE.md).\n\n## WebSocket protocol\n\nClients connect to `wss://\u003chost\u003e/api/ws?token=\u003cjwt\u003e`. The hub propagates the\nauthenticated `user_id` from `Locals` into the connection and registers a\nper-user fan-out. Messages are JSON envelopes:\n\n```json\n{ \"type\": \"NOTIFICATION\", \"payload\": { /* … */ } }\n```\n\nStandard message types live in `ws/hub.go` (`MsgNotification`,\n`MsgStatusUpdate`, `MsgCustom`). Apps can declare their own constants — the\ntype is a plain string, no fork required.\n\nFor org-wide broadcasts, callers query their own DB for user IDs and call\n`hub.SendToUsers(ids, msg)`. Notification persistence is delegated to the\noptional `OnNotification` hook so the hub stays ORM-free.\n\n## Addon contract\n\nAddons are **authored against [`metacore-sdk`](https://github.com/asteby/metacore-sdk)**\nand **executed by this kernel**. The split is intentional:\n\n- **SDK** (public, npm + Go CLI) owns the developer experience: `metacore init`,\n  `metacore validate`, `metacore build`, `metacore sign`, `metacore compile-wasm`,\n  the manifest schema, the bundle layout, the TypeScript types for runtime\n  React.\n- **Kernel** (this repo) owns the runtime: parses the manifest,\n  verifies signatures, materialises bundles on disk, instantiates the WASM\n  module, brokers every host import, runs lifecycle hooks, merges navigation,\n  exposes installer endpoints.\n\nThe wire-level WASM ABI is defined in `runtime/wasm/abi.go` and is documented\non the SDK side at `docs/wasm-abi.md` (single source of truth — the kernel is\nthe implementer, the SDK is the reference).\n\n## Stability\n\n**ABI v1 is stable.** The contract that addons depend on — the manifest\nschema, the bundle format, the WASM guest ABI and the `metacore_host` import\nsurface — is frozen as of kernel `v0.10.1`. See\n[`docs/abi/v1.md`](./docs/abi/v1.md) for the full normative document and\n[`docs/abi/CHANGELOG.md`](./docs/abi/CHANGELOG.md) for the revision log.\n\nThe compatibility promise:\n\n- **Patch releases** (`v0.10.x`): bug fixes only.\n- **Minor releases** inside the v1 series: **additive only** — new host\n  imports, new manifest fields with meaningful zero defaults, new capability\n  kinds, new column types or widgets. Existing v1 addons keep working\n  unchanged.\n- **Breaking changes require v2.** A v2 cut ships with at least one minor\n  release of overlap during which the kernel honours both v1 and v2, giving\n  addon authors a deprecation window to migrate.\n\nAnything **not** documented in `docs/abi/v1.md` is implementation detail and\nmay change between minor releases without notice. The HTTP routes, the\nWebSocket protocol, Prometheus metric names and internal table layouts live\noutside the ABI freeze and follow the kernel's normal embedding semver.\n\n## Documentation\n\n| Document                                                         | Audience                                              |\n| ---------------------------------------------------------------- | ----------------------------------------------------- |\n| [`ARCHITECTURE.md`](./ARCHITECTURE.md)                           | Maintainers — the four laws of the kernel             |\n| [`docs/abi/v1.md`](./docs/abi/v1.md)                             | Addon authors + runtime implementers — frozen ABI v1.0 |\n| [`docs/abi/CHANGELOG.md`](./docs/abi/CHANGELOG.md)               | Revision log for the ABI v1 contract                  |\n| [`docs/dynamic-system.md`](./docs/dynamic-system.md)             | App teams using the dynamic CRUD framework            |\n| [`docs/dynamic-api.md`](./docs/dynamic-api.md)                   | Anyone calling the dynamic / metadata HTTP endpoints  |\n| [`docs/permissions.md`](./docs/permissions.md)                   | Auth / capability model — user gates and addon gates  |\n| [`docs/embedding-quickstart.md`](./docs/embedding-quickstart.md) | First-time hosts — 10-minute walkthrough              |\n| [`docs/CONSUMER_GUIDE.md`](./docs/CONSUMER_GUIDE.md)             | App teams embedding the kernel (long form)            |\n| [`docs/dev-setup.md`](./docs/dev-setup.md)                       | Contributors working on the kernel itself             |\n| [`docs/RELEASE.md`](./docs/RELEASE.md)                           | Release manager and consumers                         |\n| [`docs/consumer-renovate-template.json`](./docs/consumer-renovate-template.json) | Drop-in Renovate config for consumers     |\n| [`CHANGELOG.md`](./CHANGELOG.md)                                 | Anyone consuming a new tag                            |\n\n## Development\n\n```bash\ngit clone git@github.com:asteby/metacore-kernel.git\ncd metacore-kernel\n\n# Tests with the race detector — same flags CI runs.\ngo test -race ./...\n\n# Static analysis.\ngo vet ./...\n\n# Single package, verbose.\ngo test -race -v ./runtime/wasm/...\n```\n\nLocal development assumes the SDK is checked out as a sibling directory:\n\n```\n~/projects/metacore-sdk\n~/projects/metacore-kernel\n```\n\n`go.mod` carries a `replace github.com/asteby/metacore-sdk =\u003e ../metacore-sdk`\ndirective so SDK changes are picked up without publishing a tag. Drop the\nreplace before tagging a release — see [`docs/dev-setup.md`](./docs/dev-setup.md).\n\n## Release process\n\nReleases are tag-driven. `git push origin vX.Y.Z` triggers\n`.github/workflows/release.yml`, which runs the test suite, pings the Go\nproxy, publishes a GitHub Release via GoReleaser, and dispatches a\n`metacore-kernel-released` event to every consumer repository so Renovate runs\non demand instead of waiting for the next cron tick.\n\nThe full procedure — version selection, pre-releases, retract, troubleshooting\n— is in [`docs/RELEASE.md`](./docs/RELEASE.md).\n\n## Module path\n\n```\ngithub.com/asteby/metacore-kernel\n```\n\nResolves through the public Go module proxy. See\n[`docs/CONSUMER_GUIDE.md`](./docs/CONSUMER_GUIDE.md) for the step-by-step\nembedding walk-through.\n\n## License\n\nLicensed under the [Apache License, Version 2.0](./LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fasteby%2Fmetacore-kernel","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fasteby%2Fmetacore-kernel","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fasteby%2Fmetacore-kernel/lists"}