@nyuchi/mzizi-mcp 0.9.0 → 0.10.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 (97) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +115 -85
  3. package/dist/access.d.ts +69 -0
  4. package/dist/access.d.ts.map +1 -0
  5. package/dist/access.js +72 -0
  6. package/dist/access.js.map +1 -0
  7. package/dist/auth/authkit-handler.d.ts +4 -3
  8. package/dist/auth/authkit-handler.d.ts.map +1 -1
  9. package/dist/auth/authkit-handler.js +52 -6
  10. package/dist/auth/authkit-handler.js.map +1 -1
  11. package/dist/auth/front.d.ts +17 -0
  12. package/dist/auth/front.d.ts.map +1 -0
  13. package/dist/auth/front.js +25 -0
  14. package/dist/auth/front.js.map +1 -0
  15. package/dist/auth/mcp-api-handler.d.ts +20 -7
  16. package/dist/auth/mcp-api-handler.d.ts.map +1 -1
  17. package/dist/auth/mcp-api-handler.js +43 -29
  18. package/dist/auth/mcp-api-handler.js.map +1 -1
  19. package/dist/desk-context.d.ts +33 -0
  20. package/dist/desk-context.d.ts.map +1 -0
  21. package/dist/desk-context.js +49 -0
  22. package/dist/desk-context.js.map +1 -0
  23. package/dist/docs-federation.d.ts +68 -0
  24. package/dist/docs-federation.d.ts.map +1 -0
  25. package/dist/docs-federation.js +282 -0
  26. package/dist/docs-federation.js.map +1 -0
  27. package/dist/env.d.ts +7 -8
  28. package/dist/env.d.ts.map +1 -1
  29. package/dist/env.js +5 -5
  30. package/dist/fundi-a2a.d.ts +1 -1
  31. package/dist/fundi-a2a.js +2 -2
  32. package/dist/fundi-a2a.js.map +1 -1
  33. package/dist/fundi-client.d.ts +24 -4
  34. package/dist/fundi-client.d.ts.map +1 -1
  35. package/dist/fundi-client.js +91 -4
  36. package/dist/fundi-client.js.map +1 -1
  37. package/dist/generated/registry-pin.d.ts +5 -0
  38. package/dist/generated/registry-pin.d.ts.map +1 -0
  39. package/dist/generated/registry-pin.js +3 -0
  40. package/dist/generated/registry-pin.js.map +1 -0
  41. package/dist/generated/registry.d.ts +23 -0
  42. package/dist/generated/registry.d.ts.map +1 -0
  43. package/dist/generated/registry.js +1204 -0
  44. package/dist/generated/registry.js.map +1 -0
  45. package/dist/generated/skills.d.ts +18 -0
  46. package/dist/generated/skills.d.ts.map +1 -0
  47. package/dist/generated/skills.js +67 -0
  48. package/dist/generated/skills.js.map +1 -0
  49. package/dist/http.d.ts +18 -9
  50. package/dist/http.d.ts.map +1 -1
  51. package/dist/http.js +16 -13
  52. package/dist/http.js.map +1 -1
  53. package/dist/issue-desk.d.ts +152 -0
  54. package/dist/issue-desk.d.ts.map +1 -0
  55. package/dist/issue-desk.js +392 -0
  56. package/dist/issue-desk.js.map +1 -0
  57. package/dist/issue-log.d.ts +80 -0
  58. package/dist/issue-log.d.ts.map +1 -0
  59. package/dist/issue-log.js +146 -0
  60. package/dist/issue-log.js.map +1 -0
  61. package/dist/issue-report.d.ts +138 -0
  62. package/dist/issue-report.d.ts.map +1 -0
  63. package/dist/issue-report.js +112 -0
  64. package/dist/issue-report.js.map +1 -0
  65. package/dist/rate-limit.d.ts +41 -0
  66. package/dist/rate-limit.d.ts.map +1 -0
  67. package/dist/rate-limit.js +58 -0
  68. package/dist/rate-limit.js.map +1 -0
  69. package/dist/registry.d.ts +126 -0
  70. package/dist/registry.d.ts.map +1 -0
  71. package/dist/registry.js +280 -0
  72. package/dist/registry.js.map +1 -0
  73. package/dist/server.d.ts +96 -22
  74. package/dist/server.d.ts.map +1 -1
  75. package/dist/server.js +76 -32
  76. package/dist/server.js.map +1 -1
  77. package/dist/stdio.d.ts +6 -13
  78. package/dist/stdio.d.ts.map +1 -1
  79. package/dist/stdio.js +6 -29
  80. package/dist/stdio.js.map +1 -1
  81. package/dist/tools.d.ts +45 -6
  82. package/dist/tools.d.ts.map +1 -1
  83. package/dist/tools.js +313 -82
  84. package/dist/tools.js.map +1 -1
  85. package/dist/worker.d.ts +26 -14
  86. package/dist/worker.d.ts.map +1 -1
  87. package/dist/worker.js +42 -14
  88. package/dist/worker.js.map +1 -1
  89. package/package.json +24 -19
  90. package/dist/api-client.d.ts +0 -101
  91. package/dist/api-client.d.ts.map +0 -1
  92. package/dist/api-client.js +0 -200
  93. package/dist/api-client.js.map +0 -1
  94. package/dist/defaults.d.ts +0 -29
  95. package/dist/defaults.d.ts.map +0 -1
  96. package/dist/defaults.js +0 -29
  97. package/dist/defaults.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/generated/registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * GENERATED by scripts/generate-skills.mjs — do not edit, do not commit.
3
+ *
4
+ * The skills this Worker serves, inlined at build time from the SKILL.md files
5
+ * in mzizi-skills/. There is no database copy and no sync step: a merge that
6
+ * changes a SKILL.md redeploys the Worker, and the Worker is what answers
7
+ * `mzizi_get_skills`.
8
+ */
9
+ export interface BundledSkill {
10
+ name: string;
11
+ description: string;
12
+ body_mdx: string;
13
+ source: string;
14
+ }
15
+ export declare const BUNDLED_SKILLS: readonly BundledSkill[];
16
+ /** Bundle version, from mzizi-skills/index.json. */
17
+ export declare const SKILLS_VERSION = "0.7.0";
18
+ //# sourceMappingURL=skills.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../src/generated/skills.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;CACf;AAED,eAAO,MAAM,cAAc,EAAE,SAAS,YAAY,EAuDxC,CAAA;AAEV,oDAAoD;AACpD,eAAO,MAAM,cAAc,UAAU,CAAA"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * GENERATED by scripts/generate-skills.mjs — do not edit, do not commit.
3
+ *
4
+ * The skills this Worker serves, inlined at build time from the SKILL.md files
5
+ * in mzizi-skills/. There is no database copy and no sync step: a merge that
6
+ * changes a SKILL.md redeploys the Worker, and the Worker is what answers
7
+ * `mzizi_get_skills`.
8
+ */
9
+ export const BUNDLED_SKILLS = [
10
+ {
11
+ "name": "simplify",
12
+ "description": "Simplify code and maximise reuse the Mzizi way — before adding a component, style, or page, and during any refactor: reuse before build (search the registry first), styles as N1 tokens, compose pages from N2/N3, collapse duplication into CVA variants, cn() composition, right-altitude imports, delete-first, and read counts/tokens/doctrine live. Companion to the get_simplify_guidance MCP tool.",
13
+ "body_mdx": "# Simplify — code that reads like the system\n\n**The simplest change is the one you don't write.** Reuse before you build, compose\nbefore you implement, and let one source own each decision. Use this before adding a\ncomponent, a style, or a page — and during any refactor.\n\n> This skill is the narrative form of the Mzizi MCP tool `get_simplify_guidance`, which\n> returns the same ruleset as structured data. Pull it live when you want the machine-readable\n> checklist; read this when you want the reasoning.\n\n## The rules\n\n1. **Reuse before build.** Search the registry first — `search_components` /\n `list_components` over the MCP, or `GET https://mzizi.dev/api/v1/ui`. Install via the\n shadcn CLI; never reimplement a primitive that already exists.\n2. **Styles are tokens.** Never hardcode a colour, radius, spacing, or motion value —\n consume `var(--…)`. N1 is the only layer allowed to define CSS values, so a rebrand is\n one edit. New tokens go in `:root` + `.dark` + the `@theme` block.\n3. **Compose, don't implement.** A page (N6) is a composition of N2 primitives and N3 brand\n components — never inline a `<button>`, a card, or an SVG. Pull spinners, skeletons, and\n badges from N2.\n4. **Variants over copies.** Collapse near-duplicate components into one CVA variants block.\n One `cva()` per primitive; express differences as `variant` / `size` props, not new files.\n5. **One composition path.** Compose class names through `cn()`; extract shared logic into\n `lib/` or a hook. No string-concatenated classes, no logic duplicated across files.\n6. **Right altitude.** Keep each component self-contained, importing only from the layer\n below on its strand. A primitive that reaches up into page code can't be installed on its\n own.\n7. **Delete first.** Prefer removing over adding — dead code, unused props, redundant\n wrappers, commented-out blocks. Less code is less to break, read, and keep true.\n8. **Live data, not copies.** Read counts, tokens, and doctrine live (`/api/v1/stats`, the\n generated palette, the MCP). A baked-in number or duplicated token guarantees drift.\n\n## Checklist\n\n- [ ] Searched the registry before building?\n- [ ] All styles are tokens (`var(--…)`), zero hardcoded values outside N1?\n- [ ] Page is pure composition of N2/N3, no inlined primitives?\n- [ ] Variation expressed as CVA variants, not near-duplicate files?\n- [ ] All class names through `cn()`, shared logic extracted once?\n- [ ] Each file self-contained and installable, importing only downward?\n- [ ] Deleted more than you added where you could?\n- [ ] Counts, tokens, and doctrine read live, not hardcoded?\n\n## See also\n\n- MCP tool `get_simplify_guidance` — the same ruleset as structured data.\n- `get_ubuntu_doctrine` — the philosophy the rules serve.\n- The `scaffold-component` skill — how to add a component the right way when reuse genuinely\n isn't possible.",
14
+ "source": "mzizi-tools/mzizi-skills/skills/simplify"
15
+ },
16
+ {
17
+ "name": "discoverability",
18
+ "description": "SEO + AIO for the Mzizi ecosystem: how to guarantee machines can find and render a site — social/messaging link previews (OpenGraph), search engines, and AI agents. Covers the 'if the machine can't see it, it doesn't exist' convention, the brand-agnostic Mzizi hive OG-image template (dynamic per page: title + description + site icon), Next.js + Astro/Starlight wiring, APCA-checked text colours, and a pre-ship checklist. Use when a shared link shows no preview or when adding a new route/site.",
19
+ "body_mdx": "# Discoverability — SEO + AIO for the Mzizi ecosystem\n\n> **Covenant:** _If the machine can't see it, it doesn't exist._\n\nDiscoverability is the machine-facing surface of every mzizi-ecosystem site — the\npart crawlers, social/messaging scrapers, and AI agents read. It is **cross-cutting**,\nnot a component you install: it is a genetic-code **convention** (\"every surface ships\na title, a description, a dynamic preview image, structured data, and an\nagent-readable index\") base-paired to the components that satisfy it (the OG template,\n`llms.txt`, JSON-LD helpers). A surface a machine can't parse may as well not exist —\nand a **missing social preview is the single biggest discoverability no-go**, because\nit's the first thing a human sees when a link is shared.\n\nAll values here are the current doctrine. The source of truth is the repo —\n`mzizi-dev/mzizi-registry` for doctrine and tokens, this package for the skills —\nserved read-only over the API at <https://api.mzizi.dev/v1> and the MCP at\n`mcp.mzizi.dev/mcp`. Supabase is not it: `mzizi-registry/docs/db-contents-rule.md`\n(2026-08-04) limits the database to version history, logging and the issue log.\nBrand colour specifically is `palette.canonical.json` in this package — 21 families,\ngenerated and gated, never retyped.\n\n## The number-one failure: a missing OG image\n\nThe most common — and most damaging — bug is a link that unfurls with **no preview\nimage at all**. The canonical cause is metadata that points at an image file that\ndoesn't exist:\n\n```ts\n// ❌ WRONG — points at a static file that isn't in /public, so every scraper 404s\nopenGraph: { images: [\"/og-image.png\"] }\ntwitter: { images: [\"/og-image.png\"] }\n```\n\nWorse, an explicit `images` array **overrides** a framework's dynamic OG route, so\nthe good image never gets a chance. **Rule: never hardcode `openGraph.images`.** Let\nthe framework's file-convention / endpoint serve a _generated_ image, and set an\nabsolute base URL so scrapers get an absolute URL.\n\n## The Mzizi \"hive\" OG card\n\nOne template, every route, every brand. The card is:\n\n- **Deep-night ground** (`#1B1A17`) with a faint flat-top **honeycomb hex lattice**\n (white at ~5% — texture, not noise) and a few solid **mineral accent cells**\n (cobalt / gold lead, plus tanzanite / malachite / copper for warmth).\n- The **site icon on top, above the title** (brand recognition first), then the\n title, an optional eyebrow, the SEO description, and the domain.\n- **Left-aligned** (reads better than centred at thumbnail size).\n- **Brand-agnostic:** the icon is a parameter, so the same template serves nyuchi\n (the bee), mukoko (the swarm), mzizi, shamwari — each with its own mark + domain.\n It picks up the _site's own icon_, never a hardcoded one.\n\n### Colours are APCA-checked\n\nOG text is read at thumbnail size, so contrast matters. Verified against the\n`#1B1A17` ground (APCA reverse polarity; design-system floor is **Lc 75 large /\nLc 90 body**):\n\n| Role | Hex | APCA Lc | Verdict |\n| -------------------------------- | --------- | ------- | ------- |\n| Title | `#F5F5F4` | 92 | ✓ body |\n| Secondary (eyebrow, description) | `#E5E3DE` | 81 | ✓ large |\n| Domain (gold) | `#FFD740` | 76 | ✓ large |\n\nDo **not** use dim greys like `#B2AFA8` (only Lc 50) for OG text — it looks fine on a\nmonitor and vanishes in a messaging thumbnail. Re-run APCA when changing any pair.\n\n## Implementation — Next.js (App Router)\n\n> Astro is the standard for new work — see the section below it, and the\n> `documentation-architecture-framework` doctrine. This section stays because\n> mzizi.dev still runs Next.js until that migration lands. Do not start a new\n> surface here.\n\nThe portal ships the reference template at `lib/og/mzizi-og.tsx`\n(`renderMziziOg({ title, eyebrow, description, iconPath, domain })`). Wire it via the\nfile convention so metadata stays dynamic:\n\n```tsx\n// app/opengraph-image.tsx (root) — and app/<section>/[slug]/opengraph-image.tsx\nimport { renderMziziOg, OG_SIZE, OG_CONTENT_TYPE } from \"@/lib/og/mzizi-og\"\nexport const runtime = \"nodejs\" // reads the icon PNG off disk\nexport const size = OG_SIZE\nexport const contentType = OG_CONTENT_TYPE\nexport default function Image() {\n return renderMziziOg({ title: \"mzizi\" }) // per-page: pass that page's title + description\n}\n```\n\n```ts\n// app/layout.tsx — set metadataBase, DO NOT set openGraph.images / twitter.images\nexport const metadata = {\n metadataBase: new URL(\"https://mzizi.dev\"),\n openGraph: { type: \"website\", siteName: \"Mzizi\", title: \"Mzizi\", description: \"…\" },\n twitter: { card: \"summary_large_image\", title: \"Mzizi\", description: \"…\" },\n // No `images` — the opengraph-image.tsx route supplies an absolute, hashed URL,\n // and the twitter card falls back to it.\n}\n```\n\nFor dynamic routes, add `opengraph-image.tsx` alongside `page.tsx` and pull the\nentity's title + description (e.g. from the registry) so the shared link unfurls with\n_that_ page's identity.\n\n## Implementation — Astro / Starlight (the standard)\n\nA statically-built site (deployed as static assets) generates OG images **at build\ntime**:\n\n1. A build-time image endpoint, `src/pages/og/[...slug].png.ts`, with\n `getStaticPaths()` over the docs collection; render each page's title +\n description with **satori** → SVG → rasterise with **sharp** → PNG.\n2. Override Starlight's `Head` component (`components.Head` in `astro.config`) to add\n `<meta property=\"og:image\" content={new URL(`/og/${slug}.png`, site)} >` per page.\n3. Use the same hive design: honeycomb + the site's icon + the brand mineral\n (nyuchi docs → **gold**).\n\nKeep the site's runtime dependency-light; satori + sharp are build-only.\n\n## Beyond the image — the rest of the convention\n\n- **Title + meta description** on every route (unique, page-specific).\n- **Structured data**: schema.org JSON-LD for the page's primary entity.\n- **`llms.txt`** at the site root — the machine-readable index for LLMs.\n- **`robots.txt` + `sitemap.xml`** — generated, not hand-maintained.\n- **Canonical URLs** absolute (a set `metadataBase` / `site`).\n- **Agent-readiness**: an MCP server-card at `/.well-known/mcp/server-card.json`\n where the surface exposes an MCP endpoint.\n\n## Pre-ship checklist\n\n- [ ] Sharing the URL in Slack / WhatsApp / iMessage / X renders a preview **image**.\n- [ ] The OG image is **generated** (dynamic), carries the page's title + description + the site icon, and its URL is **absolute**.\n- [ ] No hardcoded `openGraph.images` / `twitter.images`.\n- [ ] OG text colours pass APCA (Lc ≥ 75 large / ≥ 90 body).\n- [ ] `metadataBase` / `site` is set; canonical URL is absolute.\n- [ ] Title + meta description are unique per route.\n- [ ] `llms.txt`, `robots.txt`, `sitemap.xml` present; JSON-LD on primary entities.\n- [ ] Validate the card in a scraper (e.g. opengraph.xyz) after deploy.\n\n_The whole helix is Mzizi — and discoverability is the convention that makes each\nsurface legible to the machines that carry it. Ndiri nekuti tiri._",
20
+ "source": "mzizi-tools/mzizi-skills/skills/discoverability"
21
+ },
22
+ {
23
+ "name": "mzizi-design",
24
+ "description": "Ecosystem-level brand: the Mzizi parent identity (copper), the verified brand constellation (every brand's mineral, voice, meaning, URL), and the five Ubuntu pillars + five principles. Use for cross-brand materials and brand-voice decisions.",
25
+ "body_mdx": "# Mzizi — _The Ecosystem_\n\n**Mzizi** is the parent identity at the ecosystem level — the framework, the design language, the\ncomponent registry and the open doctrine every brand builds on. Everything revenue-generating (the\nMzizi console, fundi, paid plans, billing) is Nyuchi's. Three pillars: **mukoko** (consumer super app), **nyuchi** (infrastructure &\nenterprise), and the **sister brands** (specialist verticals) — one identity, one design system, one\nopen data commons.\n\nDoctrine **v4.1.0**. **The repo is the source of truth, not the database.** Colour comes from\n`palette.canonical.json` at the root of this package — 21 families, vendored from\n`mzizi-dev/mzizi-registry → lib/tokens/palette.source.ts` and gated against it. The ecosystem\nconstellation and the Ubuntu pillars/principles come from `mzizi-registry → content/doctrine/`,\nserved at <https://api.mzizi.dev/v1/brand> (`.ecosystem`, `.philosophy`). Supabase holds no brand\nor doctrine data: `mzizi-registry/docs/db-contents-rule.md` (2026-08-04) moved all of it into the\nrepo, so the three Supabase collections an earlier revision of this skill cited — for the\necosystem, the pillars and the principles — no longer exist. (Two notes survive the move:\nprinciples were renamed in v4.x, so use the set below and not older Shona-named lists; and the\nregistry still names its ecosystem-layer entry `bundu` (URL **bundu.org**) — that is registry data,\nrenamed in mzizi-registry, not here.)\n\nThe **five** pillars and **five** principles below are a count of Ubuntu doctrine, not of the\npalette, and they are correct — `/v1/brand` `.philosophy.ubuntuPillars` serves exactly these five.\nDo not \"fix\" them to seven to match the colour families.\n\n## The ecosystem-level identity\n\n- **Mineral:** `copper` — `#BF5A36` light / `#FF8A65` dark (`--color-copper`) · connection, foundation, stewardship\n- **Registry entry:** `bundu` in `/v1/brand` `.ecosystem` (meaning _wilderness_, Shona) · **URL:** <https://bundu.org>\n- **Voice:** visionary, grounded, inclusive\n- **Role:** the ecosystem — the layer that holds the whole, the commons, governance, philosophy\n- **Wordmark:** `mzizi`, lowercase always, Noto Serif 600 (per ecosystem rule)\n- **No standalone ecosystem-level logo mark is registered in the design DB yet** — that's an open identity\n item. Until one exists, ecosystem-level materials use the wordmark in copper, optionally with\n Mukoko's Swarm mark when the subject is the product family. Don't invent an ecosystem mark ad hoc.\n\n## The brand constellation (verified, v4.1.0)\n\nEvery brand owns a mineral and a voice. Theme each brand's surfaces and copy in **its own** mineral\nand register — never default everything to tanzanite.\n\n| Brand | Role | Mineral | Meaning | Voice |\n| ------------ | --------------------------- | ---------- | ---------- | -------------------------------------- |\n| **bundu** | The ecosystem | copper | Wilderness | visionary, grounded, inclusive |\n| **nyuchi** | Infrastructure & enterprise | gold | Bee | technical, reliable, industrious |\n| **mukoko** | Africa's super app | tanzanite | Beehive | welcoming, structured, protective |\n| **shamwari** | Sovereign AI companion | sodalite | Friend | helpful, warm, intelligent |\n| nhimbe | Events & gatherings | malachite | Gathering | celebratory, communal, vibrant |\n| bushtrade | Marketplace | gold | Bush trade | practical, trustworthy, local |\n| lingo | Language learning | cobalt | Language | encouraging, cultural, playful |\n| campfire | Platform messaging anchor | malachite | Campfire | direct, warm, always present |\n| bytes | Short-form creator video | tanzanite | Bytes | energetic, creative, youthful |\n| novels | Publishing platform | malachite | Novels | literary, thoughtful, immersive |\n| places | Geographic knowledge graph | gold | Places | authoritative, helpful, discoverable |\n| transport | Public transit & booking | gold | Transport | efficient, reliable, practical |\n| planner | Productivity hub | cobalt | Planner | organised, clear, supportive |\n| wallet | Payments & tokens | gold | Wallet | trustworthy, precise, secure |\n| pulse | Feed & Mukoko Home | tanzanite | Pulse | personal, adaptive, ambient |\n| health | Wellness & telemedicine | malachite | Health | caring, accurate, private |\n| circles | Community messaging | terracotta | Circles | inclusive, moderated, community-driven |\n\nThe `bundu` row is the ecosystem layer as `/v1/brand` serves it today; the table mirrors the\nregistry, so it changes when mzizi-registry renames the entry.\n\nThe narrative spine: **nyuchi is the bee, mukoko is the hive, mzizi is the root everything\ngrows from.** Use this when explaining the ecosystem — it is the one-sentence architecture.\n\n## Ubuntu as identity (live doctrine)\n\nMzizi carries the philosophy. _Ndiri nekuti tiri_ — I am because we are.\n\n**Five Pillars** (spheres of belonging): **family** (the household and kin, the primary web of\nbelonging) → **community** (neighbours, peers, chosen kin) → **society** (the broader human web —\nstrangers, institutions, the polity) → **environment** (the natural world that holds all\nrelationships; Ubuntu is ecological before it is social) → **spirituality** (the vertical\ndimension — meaning, purpose, ancestry, the sacred).\n\n**Five Principles** (operating rules): **survival** (collective endurance — no one survives alone) ·\n**solidarity** (firm, persevering commitment to the common good) · **compassion** (active care shown\nthrough helping, sharing, welcoming) · **respect** (unprejudiced consideration of another's\nprivileges, beliefs, norms — includes elder-respect) · **dignity** (inherent worth by virtue of\nexistence, irrespective of status or background).\n\nIn ecosystem materials, philosophy is **structural, not decorative**: name a pillar/principle only\nwhen the feature or message genuinely embodies it.\n\n## Rules for ecosystem-level work\n\n- **Lowercase wordmarks, always** — `mzizi`, `nyuchi`, `mukoko`, `shamwari`, and every sister brand.\n- **Copper accents** signal \"this is the ecosystem speaking\" (parent-level pages, governance,\n commons, manifesto-register material).\n- **Cross-brand layouts:** lead with the brand that owns the message; bring in the constellation\n table's minerals when showing the family together (each brand in its own mineral — this is what\n the Swarm mark's full palette expresses at logo scale).\n- **Voice shifts with the speaker.** An ecosystem-level page is visionary/grounded/inclusive; the same content\n on mukoko.com becomes welcoming/structured/protective. Don't copy-paste tone across brands.\n- Cultural specificity is non-negotiable: Shona vocabulary and Zimbabwean grounding are structural.\n- All UI tokens (radius, type, spacing, surfaces, status colors) come from **nyuchi-design**;\n Mukoko logo/assets come from **mukoko-design**. This skill governs _which brand speaks and how_.\n- **Every brand owns a mineral, but the palette is not only minerals.** A cross-brand piece has 21\n families to draw on — seven minerals, seven Heritage tones, the Experimental Seven. Use the\n minerals to say _who is speaking_; use Heritage for atmosphere and surface, and the Experimental\n Seven for categorical sets that would otherwise stretch a mineral past its meaning.\n\n## If invoked with no other guidance\n\nAsk whether the work is (a) parent-brand material (ecosystem-level page, manifesto, investor/ecosystem\ndeck), (b) a cross-brand piece (family overview, comparison, announcement spanning brands), or\n(c) a voice/mineral decision for a specific brand — then apply the constellation table and the\nvoice rules, pulling tokens and assets from the sibling skills.\n\n_Mzizi — the root everything grows from._",
26
+ "source": "mzizi-tools/mzizi-skills/skills/mzizi-design"
27
+ },
28
+ {
29
+ "name": "nyuchi-design",
30
+ "description": "UI + tokens for the nyuchi / mzizi / mukoko ecosystem: the canonical 21-family Mzizi palette (seven African Minerals + seven Heritage tones + the Experimental Seven), the named radius scale, Noto Sans/Serif + JetBrains Mono type, pill-button + dense control-scale rules, and a super-app UI kit. Use to generate well-branded interfaces.",
31
+ "body_mdx": "> **Doctrine v4.1.0. The canonical palette ships with this package.**\n> `palette.canonical.json` at the root of `@nyuchi/mzizi-skills` states all **21 colour\n> families** — seven African Minerals, seven Heritage tones, the Experimental Seven — and\n> every token file in this bundle is generated from it and gated against it. Read it, or the\n> stylesheets generated from it (`tokens-update.css` here, `tokens/palette.css` in\n> `mukoko-design`). Do not retype hex values out of this prose into a project.\n>\n> Canon upstream is `mzizi-dev/mzizi-registry → lib/tokens/palette.source.ts`, served publicly\n> at <https://api.mzizi.dev/v1/brand>. **Supabase is not the source of truth for any token or\n> brand value** — `mzizi-registry/docs/db-contents-rule.md` (2026-08-04) removed brand data from\n> the database, and the three Supabase collections that once held the palette are gone. Earlier\n> revisions of this skill told agents to pull them live; that instruction was wrong and is\n> withdrawn.\n>\n> **Colour is derived and gated. Everything else on this page is hand-maintained** —\n> typography, spacing, radius, motion, shadow, z-index and the semantic set were not\n> re-derived, so confirm them against the registry if precision matters.\n\nRead the `README.md` file within this skill, and explore the other available files. Key entry points:\n\n- `README.md` — brand context, content fundamentals, visual foundations, iconography.\n- `tokens-update.css` — **all 21 families**, generated from `palette.canonical.json`, light + dark + `.dark` class + `prefers-color-scheme`. Merge this into `colors_and_type.css`, or `@import` it directly. Never hard-code a hex.\n- `colors_and_type.css` — the older local mirror. It predates the heritage seven and the Experimental Seven; where the two disagree, `tokens-update.css` wins, because only it is generated from canon.\n- `assets/` — brand marks. **nyuchi** = the bee (worker / infrastructure). **mukoko** = the hive. Mukoko's current mark is **the Swarm** (seven-mineral Seed-of-Life cluster) — see the dedicated `mukoko-design` skill. Use the light mark on dark surfaces and vice versa.\n- `preview/` — reference cards for type, colors, spacing, components, brand.\n- `ui_kits/mukoko/` — React/JSX super-app UI kit with a working click-through prototype.\n\n## Rules that are non-negotiable\n\n- **Lowercase wordmarks** — `mukoko`, `nyuchi`, `bundu`, `shamwari`, `nhimbe`, `bushtrade` — always.\n- **The palette is 21 families: seven Minerals + seven Heritage + the Experimental Seven.** Any interface that uses only the minerals is using a third of the system. Do not describe it as \"the seven-colour palette\".\n- **Seven African Minerals** (geological, the core palette). The custom properties are `--color-<mineral>`, `--color-<mineral>-container`, `--color-<mineral>-on-container` — those are the names the design system defines. (`--container-<mineral>` / `--on-container-<mineral>` appeared in earlier revisions of this skill and are defined nowhere upstream; `tokens-update.css` now ships them as aliases so existing work keeps rendering, but do not reach for them in new code.)\n - `cobalt` — primary blue, links, CTAs · digital future, trust\n - `tanzanite` — **mukoko's brand mineral**, social features · premium, connection\n - `malachite` — success states, positive actions · growth\n - `gold` — achievements, rewards, highlights · honey, warmth\n - `terracotta` — community features · earth, grounding\n - `sodalite` — **AI / Shamwari surfaces, deep-reasoning states** · intelligence, depth _(added v4.1.0)_\n - `copper` — **Bundu ecosystem identity, the commons** · connection, stewardship _(added v4.1.0)_\n- **Seven Heritage tones** (atmospheric anchors — mini-app surfaces, backgrounds, moods; no family or role): `indigo` (dusk, the dyer's craft) · `savanna` (sun-dried grass, the dry season) · `baobab` (the tree of life, bark, shelter) · `sunset` (day's end, the gathering hour) · `river` (flow, the journey) · `hematite` (the neutral anchor, the substrate) · `kalahari` (the light anchor, openness). Reach for them via `--color-<name>` (aliasing `--heritage-<name>`); values are in `palette.canonical.json`. _(Two earlier framings are withdrawn: the ten-colour one from before the palette settled, and the two-anchor one that survived into v0.5.1 of this bundle. **There are seven.** A skill that named two produced two-tone output in projects that had never seen each other.)_\n- **The Experimental Seven** — a computed heptagon (hues offset 17°, prime saturations, foregrounds solved to P7), each tone carrying a `heptagonIndex` 0–6 that fixes its place on the wheel: `ember` · `acacia` · `fern` · `lagoon` · `storm` · `dusk` · `protea`. Four tiers each: `--exp-<name>`, `--exp-<name>-container`, `--exp-<name>-on`, `--exp-<name>-ui`. Use them for generated/wheel-derived surfaces and categorical sets where the minerals would have to be stretched past their meanings.\n- **Each brand owns a mineral** (the ecosystem map, verified v4.1.0 and served at `/v1/brand` as `.ecosystem`): bundu→**copper**, nyuchi→**gold**, mukoko→**tanzanite**, shamwari→**sodalite**, nhimbe/campfire/novels/health→malachite, lingo/planner→cobalt, bushtrade/places/transport/wallet→gold, bytes/pulse→tanzanite, circles→terracotta. Theme a surface in its brand's mineral — never default everything to tanzanite.\n- **Buttons are ALWAYS pill** (`rounded-full` → `--radius-full`, 9999px). Inputs match buttons visually.\n- **Controls are dense by default:** `h-8` (32px) small · `h-9` (36px) default · `h-10` (40px) large. **56px (`h-14`) is reserved for specific prominent surfaces — hero CTAs and the like — it is not the default.** An earlier revision of this skill said 56px default / 48px minimum; the shipped primitives never did that, so the rule described a system that did not exist. Because the default sits below the 44pt (Apple HIG) and 48dp (Material) guidance, a dense control that is a **touch** target must earn its hit area another way — surrounding spacing, or padding the interactive area beyond the visual box. Badges are 20px tall.\n- **Radius scale is named** (px): `none` 0 · `xs` 4 · `sm` 7 · `md` 12 · `lg` 14 (**DEFAULT** cards/panels) · `xl` 17 · `2xl` 24 · `full` 9999 (pills). Checkboxes use `sm`(7), inputs/small cards `md`(12), cards/panels `lg`(14), modals/sheets/dialogs/tabs `xl`(17), hero cards `2xl`(24). Reference via `--radius-<name>`.\n- **H1–H3 are Noto Serif. H4+ and body are Noto Sans. Code is JetBrains Mono.**\n- **Rings over shadows.** Cards get `ring-1` of `--border`, not a drop shadow.\n- **No gradients, no glassmorphism** except sticky chrome (`backdrop-blur`).\n- **Emoji only as mini-app identifiers**, never as chrome or body decoration.\n- **Status has its own names: `--status-success` / `--status-warning` / `--status-error` / `--status-info` / `--status-neutral`.** Use those names and do not hardcode a hex. Upstream they alias `--success` / `--warning` / `--destructive` / `--info` / `--neutral`, so there is one decision per status — which means the resolved values are mineral-derived in the shipped theme (success reads as malachite, info as cobalt), not the standalone #22C55E/#F59E0B/#EF4444/#3B82F6 set an earlier revision of this skill listed. Those hexes are the per-component `var(--token, #hex)` fallback for an app that has not defined the properties; they are not the theme. Severity scale (`--severity-low/moderate/high/severe/extreme/cold`) and connection (`--connection-online/syncing/cached/offline`) follow the same logic. Verification tiers are the only place minerals carry status meaning (community→malachite, otp→cobalt, government→tanzanite, licensed→gold).\n- **Surfaces (April 2026 AAA refresh):** light mode — `--background` warm paper, `--card` pure white, `--muted` cream, `--overlay` white. Dark mode — `--background` warm stone L10%, `--card` L6% (darker than bg), `--muted` L2% (deepest), `--overlay` L14% (lighter than bg, scrim creates pop).\n- **Mukoko's mark is the Swarm** — a seven-mineral Seed-of-Life cluster (tanzanite core, six minerals ringed around it). Full-palette at ≥32px; mono single-mineral version below that. Full kit + rules live in the `mukoko-design` skill.\n- **Lucide React** for UI icons (or the Lucide CDN JS build for HTML prototypes).\n- **APCA 3.0 AAA contrast** on both primary and secondary text on every surface.\n\n## When creating visual artifacts\n\nCopy assets out of this skill and create static HTML files for the user to view. `@import` `colors_and_type.css` at the top of every HTML file. For phone prototypes copy the structure from `ui_kits/mukoko/index.html`. For slide decks use the MineralStrip accent and serif display type.\n\n## When working on production code\n\nInstall upstream components with the shadcn CLI — never hand-roll copies:\n\n```bash\nnpx shadcn@latest add https://mzizi.dev/api/v1/ui/<name>\n```\n\nRead the rules in `README.md` to become an expert in designing with this brand. Take CSS variables from `tokens-update.css` in this skill — it is generated from `palette.canonical.json` and carries all 21 families. The upstream equivalent is `mzizi-registry/app/globals.css`, which is generated from the same canon. There is no live database to refresh from.\n\n## If invoked with no other guidance\n\nAsk what the user wants to build or design (marketing page? a new mini-app for mukoko? a deck? a component?), ask what surface (mobile / desktop / print / slide), ask which brand voice (mzizi / nyuchi / mukoko / shamwari / nhimbe), then act as an expert designer who outputs HTML artifacts _or_ production code, depending on the need.",
32
+ "source": "mzizi-tools/mzizi-skills/skills/nyuchi-design"
33
+ },
34
+ {
35
+ "name": "mukoko-design",
36
+ "description": "Mukoko brand identity: the seven-mineral Seed-of-Life Swarm mark, ready-made SVG/PNG assets (logos, app icons, favicons, lockups, honeycomb backgrounds), and design tokens generated from the canonical 21-family palette — seven minerals for the mark, plus the seven Heritage tones and the Experimental Seven for everything else. Use when creating or exporting Mukoko visual identity.",
37
+ "body_mdx": "# Mukoko — _The Swarm_\n\nThe visual identity for **Mukoko**, the hive at the centre of the Nyuchi ecosystem. Every asset\nhere is drawn from the canonical palette (doctrine **v4.1.0**), which this package states in\n`palette.canonical.json` at its root — 21 colour families, vendored from\n`mzizi-dev/mzizi-registry → lib/tokens/palette.source.ts` and served at\n<https://api.mzizi.dev/v1/brand>. The token files in `tokens/` are **generated** from it and\ngated against it (`node scripts/generate-tokens.mjs --check`), so they cannot quietly drift.\n\n**Supabase is not the source of truth** for any of this. The Supabase collections that once held\nthe palette were removed in 2026-08 (`mzizi-registry/docs/db-contents-rule.md`); an earlier\nrevision of this skill told agents to re-pull from them, and that instruction is withdrawn.\n\n## The idea (the meaning, say it right)\n\nThe mark is the **Seed of Life** — one centre cell ringed by six, the first complete ring of the\nhoneycomb — rendered in the **seven African Minerals**:\n\n> **Tanzanite at the core** (Mukoko, the brand), ringed by the six minerals of the ecosystem.\n> One hive holding the whole. **Ndiri nekuti tiri** — _I am because we are._\n\nIt is a _known_ geometric figure (like the Audi or Olympic rings), made ours through the mineral\npalette and the meaning. Symmetry of form; distinctiveness through colour and story. **nyuchi is the\nbee; mukoko is the hive** — so Mukoko's hero mark is the hive/cluster, never a bee (that's Nyuchi's).\n\n## The seven minerals\n\n| Mineral | Light | Dark | Meaning | Role |\n| ------------- | --------- | --------- | ----------------------- | --------------------- |\n| cobalt | `#0047AB` | `#00B0FF` | digital future, trust | CTAs, links |\n| **tanzanite** | `#4B0082` | `#B388FF` | premium, connection | **brand / core cell** |\n| malachite | `#004D40` | `#64FFDA` | growth, success | positive actions |\n| gold | `#5D4037` | `#FFD740` | honey, rewards | achievements |\n| terracotta | `#A0522D` | `#E1B07E` | earth, community | community |\n| sodalite | `#283593` | `#3D5AFE` | intelligence, depth | AI / Shamwari |\n| copper | `#BF5A36` | `#FF8A65` | connection, stewardship | Bundu / commons |\n\nUse `light` on light surfaces, `dark` on dark. Full machine-readable values (containers +\non-containers) are in `tokens/minerals.json`; drop-in CSS custom properties are in\n`tokens/minerals.css`. The custom properties are `--color-<mineral>`,\n`--color-<mineral>-container`, `--color-<mineral>-on-container`.\n\n**The seven minerals are the MARK, not the palette.** The Swarm is seven cells, so this skill is\nabout seven colours — but the Mzizi palette is **21 families**: these seven, plus seven Heritage\ntones (indigo, savanna, baobab, sunset, river, hematite, kalahari) and the Experimental Seven\n(ember, acacia, fern, lagoon, storm, dusk, protea). For anything beyond the mark — a page, a\ndeck, a mini-app surface — use `tokens/palette.css` / `tokens/palette.json` here, or the\n`nyuchi-design` skill. Building an interface from the mineral seven alone leaves two thirds of\nthe system on the floor.\n\n**Ring order** (clockwise from top): `cobalt → gold → malachite → copper → sodalite → terracotta`,\n**tanzanite** in the centre. This alternates cool/warm for visual balance — a design decision, not a\nlaw. If positions are ever assigned meaning, regenerate from the geometry script.\n\n## Assets in this skill\n\n```\nlogo/mark/ full-palette mark (light/dark, SVG + PNG) + mono/ (7 minerals × light|dark SVG)\nlogo/lockup/ mark + lowercase `mukoko` serif wordmark (light/dark, SVG + PNG)\napp-icon/ primary (full palette on deep tanzanite), paper, mono-tanzanite knockout (SVG + 1024 PNG)\nfavicon/ MONO tanzanite mark, legible small (SVG + 16/32/48/180 PNG)\nbackgrounds/ honeycomb grain (paper), tanzanite header band, stone splash 1080×1920, full-mineral pattern\ntokens/ palette.css + palette.json (ALL 21 families) and minerals.css + minerals.json\n (the mineral seven, for the mark). All four are generated from\n palette.canonical.json — never hand-edit them.\nBRAND-GUIDE.md the full written guide (meaning, manifest, usage, do/don't)\n```\n\n## Rules for using the mark\n\n- **Default to the full-palette mark at ≥32px** (headers, About screens, decks, profile images, merch).\n- **Below 32px use the mono favicon** — the seven hues fuse small; the single-mineral version stays crisp. This is why the favicon ships mono tanzanite.\n- **Mono variants** let one app/surface/sub-brand wear a single mineral (Shamwari→sodalite, community→terracotta, success→malachite). Shape constant; only colour changes.\n- **Clear space** = one cell-radius on all sides. **Min size:** 24px full mark, 16px mono favicon.\n- **App icon default** = `app-icon/mukoko-appicon-primary` (full palette on deep tanzanite `#1A0033`).\n- **Wordmark:** Noto Serif 600, **lowercase always** (`mukoko`, never `Mukoko`/`MUKOKO`). UI = Noto Sans; code/labels = JetBrains Mono.\n\n## Do / don't\n\n**Do** — use the supplied SVGs; flip light/dark mineral values to the surface; use mono variants to signal context; give the mark room.\n**Don't** — add gradients/shadows/glows/outlines; recolour petals off-palette or reorder the ring arbitrarily; rotate, stretch or rearrange cells; capitalise the wordmark; use the full-palette mark below 32px.\n\n## Regenerating\n\nAll assets are deterministic from the minerals tokens. Take the values from `tokens/minerals.json`\n(regenerate it with `node scripts/generate-tokens.mjs` if canon has moved) and rebuild the cluster (core + six petals at edge-normal angles `30 + 60·i`, distance `√3·r + gap`,\nsharing true edges) so geometry, ring order and exports stay reproducible.\n\n## If invoked with no other guidance\n\nAsk what's needed (logo export? app icon? social/launch asset? splash? a new surface wearing a\nmineral?), confirm light vs dark surface, then produce the asset using the files here — or regenerate\nfrom tokens for a size/format not already exported.\n\n_Mukoko — the hive that holds the whole._",
38
+ "source": "mzizi-tools/mzizi-skills/skills/mukoko-design"
39
+ },
40
+ {
41
+ "name": "scaffold-component",
42
+ "description": "How to scaffold a new Mzizi component correctly: choose the right node (N1-N11) — which decides the directory — write the component as a real file under components/registry/, declare it in registry.json with the meta that title/categories/docs/author are derived from, follow the per-node criteria checklist for N2/N3/N6/N8, and validate contrast before ship. Covers the node-from-directory rule, pill-shape rules, data-slot/data-portal requirements, harness integration, and the generators and drift gates that keep registry.json honest. Source is never stored in a database row.",
43
+ "body_mdx": "# Scaffolding a Mzizi component\n\nFollow this workflow whenever you are creating a new component in the Mzizi design system.\n\n**A component is a real file.** `components/registry/n<N>-<label>/<name>.<ext>`, in the\n`nyuchi/mzizi` repo, which the build compiles and typechecks. That is the whole point: an\nerror in a component fails `pnpm build`.\n\nTwo files, and only two:\n\n| File | What it is |\n| ----------------------------------------------- | ------------------------------------------------------------------ |\n| `components/registry/n<N>-<label>/<name>.<ext>` | the component itself |\n| `registry.json` | the shadcn manifest a consumer's `npx shadcn add` resolves against |\n\n`registry.json` carries the install contract — description, dependencies,\n`registryDependencies`, target paths — and **never the source**. The node is derived from the\ndirectory the component lives in, so it cannot disagree with where the file actually is.\n\n> **This skill previously told you to author source into a `component_documents` row and\n> called the system \"DB-first\". That is retired.** A database row and a JSON document are\n> _representations_ of a component rather than the component, and both can drift from the code\n> while still looking correct — which is exactly what happened: a `source_code` column served\n> stale copies for 571 components until it was cleared and the fallback deleted. Rows still\n> exist for lifecycle metadata; they do not hold source, and nothing reads source from them.\n> If you find instructions anywhere telling you to `INSERT` a component, they are stale.\n\n## Step 1 — Decide the node\n\nThe architecture is the **Mzizi DNA double helix**: nodes sit on one of two backbones\n(engineering / meaning), and rungs bridge both. The N-numbers are **labels, not a sequence**.\n\nThe node decides the **directory**, and the directory is what the build reads — so choosing\nthe node and choosing where the file goes are the same decision.\n\n| Node | Directory | What belongs there |\n| ----------------- | -------------------- | ----------------------------------------------------------------------------------------- |\n| N1 tokens | `n1-tokens/` | A CSS value — colour, spacing, motion, radius (a `styling-*` collection, not a component) |\n| N2 primitive | `n2-primitives/` | Generic UI — button, card, input, dialog, toolbar, bento-grid |\n| N3 brand | `n3-brand/` | A branded composition with the mineral palette and harness integration |\n| N4 safety | `n4-safety/` | A conditional-rendering gate — permission, geo, rate limit |\n| N5 resilience | `n5-resilience/` | Error boundary, skeleton, offline banner, fallback chain |\n| N6 pages | `n6-pages/` | Full-screen layout composition |\n| N7 shell | `n7-shell/` | App container — navigation, routing, lifecycle |\n| N8 assurance | `n8-assurance/` | Instrumentation, a11y audit, RTL conformity, probes |\n| N9 fundi | `n9-fundi/` | Automated healing (a rung — owned by `mzizi-tools`) |\n| N10 documentation | `n10-documentation/` | Docs, AI instructions, docs infrastructure (a rung) |\n| N11 discovery | `n11-discovery/` | SEO / AIO surfaces — if the machine can't see it, it doesn't exist (a rung) |\n\nIf you are unsure, query the MCP: `get_node_categories(N)` shows what already lives in each\nnode, and `get_node_documents` returns the live node/strand model. Never hardcode counts.\n\n## Step 2 — Write the file\n\nCreate it in the directory the node names. The extension follows the language: `.tsx` for a\nReact component, `.ts` for a non-rendering module, `.rs` for a Rust sibling.\n\n```\ncomponents/registry/n2-primitives/your-component-name.tsx\n```\n\nThat is the authoring step. There is no row to insert and no registration to perform before\nwriting code — the file _is_ the component, and `pnpm typecheck` and `pnpm build` are what tell\nyou it is real.\n\nNaming: N3 brand components take a `nyuchi-` prefix. Everything else is the bare name, matching\nwhat a consumer will type in `npx shadcn add`.\n\n## Step 3 — Declare it in `registry.json`\n\nOne item, carrying the install contract. `meta` is the part you author; four other fields are\n**derived from it** and must not be hand-written.\n\n```jsonc\n{\n \"name\": \"your-component-name\",\n \"type\": \"registry:ui\",\n \"description\": \"Short description of what it does.\",\n \"dependencies\": [],\n \"registryDependencies\": [],\n \"files\": [\n {\n \"path\": \"components/registry/n2-primitives/your-component-name.tsx\",\n \"target\": \"components/ui/your-component-name.tsx\",\n \"type\": \"registry:ui\"\n }\n ],\n \"meta\": {\n \"collection\": \"primitives\",\n \"owner\": \"mzizi\",\n \"useCases\": [\"Use case 1\", \"Use case 2\"],\n \"variants\": [\"default\", \"sm\", \"lg\"],\n \"sizes\": [\"default\", \"sm\", \"lg\"],\n \"features\": [\"cn() for className composition\", \"data-slot attribute\"],\n \"a11y\": [\"ARIA attributes\", \"Keyboard accessible\"],\n \"hasDemo\": true\n }\n}\n```\n\n**Do not write `title`, `categories`, `docs` or `author`.** `pnpm registry:metadata` derives all\nfour from `meta` and the repo. `docs` in particular is what the shadcn CLI prints _after_\ninstalling, so it is generated from your `useCases` / `variants` / `sizes` / `features` / `a11y`\nrather than duplicated by hand — and an item with no `meta` deliberately gets no `docs`, because\na stub reads as documentation and says nothing.\n\nThen run the generators and let the gates check you:\n\n```bash\npnpm registry:paths # fill file paths from what is on disk\npnpm registry:metadata # derive title, categories, docs, author\npnpm registry:normalize # canonical ordering\npnpm registry:validate # every item resolves on disk; every dependency addressable\npnpm registry:verify # the CI drift gate\npnpm typecheck && pnpm build\n```\n\nFollow the criteria for the chosen node.\n\n### N2 primitive checklist\n\n- No `useNyuchiHarness` import\n- `data-slot` attribute on the root element\n- `data-portal` attribute pointing at `mzizi.dev/components/{name}`\n- `cn()` for className composition\n- No raw Tailwind colours — use semantic tokens (`bg-primary`, `text-foreground`, …)\n- Icons from `@/lib/icons`, never `lucide-react` directly\n- **Control height and touch target are two different measurements — don't collapse them.** The visual box follows the dense scale (`h-8` 32px small · `h-9` 36px default · `h-10` 40px large); the hit area follows `styling-touch-targets` (`comfortable` 47 · `accessible` 43 · `minimum` 41, with spacing). A 36px-tall button reaches a 43–47px target through padding, not by growing. `generous` (56) is **hero CTAs only** — the collection says so in its own `usage` field\n- Pill-shaped categories (button, input, avatar, badge, toggle) use `rounded-full` (9999)\n\n### N3 brand checklist\n\n- `nyuchi-` prefix on the name\n- `useNyuchiHarness` with the full destructure `{ log, motion, LiveRegion }`\n- `animStyle` guarded by a `motion.prefersReduced` check\n- An ARIA role or `aria-label`\n- `data-slot` and `data-portal` attributes\n- `focus-visible` ring on interactive elements\n- A dense control that is a **touch** target earns its hit area through surrounding spacing or padding beyond the visual box — the 36px default sits below the 44pt/48dp guidance, so the spacing is what makes it tappable\n- I18N via `Intl` formatters for dates, numbers, currency\n- Semantic tokens for status-bearing colours\n\n### N6 page checklist\n\n- Pure composition — no inline buttons, cards, or SVGs\n- Accept children/slots for content\n- Semantic CSS vars only (`bg-card`, `text-foreground`, `bg-primary`)\n- A loading-state prop\n- `role=\"main\"` and an `aria-label`\n\n### N8 assurance checklist\n\n- A TypeScript module exporting typed functions and React hooks\n- A banner comment identifying the node and purpose\n- A configurable rules array\n- Optional `onViolation` / `onComplete` callbacks\n- A React hook variant for continuous monitoring\n\n## Step 4 — Docs and demos\n\nThere is nothing extra to write. Docs come from the `meta` you already authored in Step 3 —\n`useCases`, `variants`, `sizes`, `features`, `a11y` — and `pnpm registry:metadata` turns them\ninto the `docs` string the CLI prints after install. Set `meta.hasDemo` when a demo exists.\n\nIf a prop table is expected, `pnpm props:extract` derives it from the component's own types and\n`pnpm props:verify` is the gate. Props are read from the code, never restated beside it.\n\n## Step 5 — Lifecycle\n\nStatus and version history live in `component_documents` — that row still exists and is still\nthe right place for lifecycle metadata. It does **not** hold source, and nothing reads source\nfrom it.\n\nRead the current status through the MCP (`mzizi_get_component`) rather than assuming it. Promote\nalpha to stable only once the component has been dogfooded somewhere real; a status that\nadvances on a schedule rather than on evidence is worth nothing to the consumer reading it.\n\n## Step 6 — Validate accessibility\n\nIf your component introduces a new colour pair, validate before shipping. The MCP tool is the\ncheapest path and needs no database access:\n\n```\nmzizi_check_accessibility(foreground: \"#FFFFFF\", background: \"#0047AB\")\n```\n\nIt returns the WCAG 2.1 contrast ratio with AA/AAA verdicts and whether the pair clears the\nMzizi floor. For systematic pair tracking see `styling-accessibility-checks` — critical pairs\nhave a row with a computed ratio and colour-blindness safety flags.\n\n## Step 7 — Before you open the PR\n\nEvery gate that guards the registry, in the order CI runs them:\n\n```bash\npnpm registry:paths:check\npnpm registry:metadata:check\npnpm registry:verify\npnpm registry:validate\npnpm props:verify\npnpm typecheck\npnpm test\npnpm build\n```\n\nA green run means the item resolves to a real file, every dependency is addressable, and the\nderived fields match what `meta` says. That is the whole contract.\n\n## What to avoid\n\n- **Never put component source in a database row, a JSON document, or any second place.** The\n file under `components/registry/` is the component; everything else is a representation of\n it, and a representation can drift from the code while still looking correct. That is not\n hypothetical here — a `source_code` column served stale copies for 571 components before it\n was cleared.\n- Never hand-write `title`, `categories`, `docs` or `author` in `registry.json` — they are\n derived, and a hand-written value is a second source that the next generator run silently\n overwrites.\n- Never hardcode hex colour values (except documented third-party brands like Ethereum,\n Google, EcoCash).\n- Never use `lucide-react` directly — go through `@/lib/icons`.\n- Never use `margin-left` / `padding-right` / `left` — use logical properties\n (`margin-inline-start`, …) for RTL support.\n- Never bump a major version on your own initiative. The portal's code SemVer and the\n doctrine/IP line are independent tracks, and a major on either is a maintainers' call.",
44
+ "source": "mzizi-tools/mzizi-skills/skills/scaffold-component"
45
+ },
46
+ {
47
+ "name": "ecosystem-app-setup",
48
+ "description": "End-to-end setup for a new mzizi-ecosystem app: Astro bootstrap, Mzizi token wiring, components.json against the registry, theme-provider setup, installing the skills bundle and the fundi agent, and the Ubuntu constraints that decide what belongs in the ecosystem.",
49
+ "body_mdx": "# Setting up a new mzizi-ecosystem app\n\nFollow this skill when someone wants to start a new app that is part of the Mzizi ecosystem\n(mukoko, nyuchi, shamwari, nhimbe) or an app that consumes the Mzizi design system.\n\n## 1. Create the project\n\n```bash\npnpm create astro@latest my-app -- --template minimal --typescript strict\ncd my-app\npnpm astro add tailwind cloudflare\n```\n\nThe UI is Astro, and underneath it Rust first and TypeScript second — see the\n`documentation-architecture-framework` doctrine, served live by\n`mzizi_get_doctrine`. Astro renders HTML by default, which is what makes a new\napp indexable by N11 and paintable on a low-end device without opting in to\neither.\n\nThere is deliberately no component framework under Astro. Not Svelte, not React,\nnot Vue: a second way to build a component is a second convention to look up\nevery time.\n\n## 2. Install the Mzizi-compatible dependencies\n\n```bash\npnpm add class-variance-authority clsx tailwind-merge\npnpm add -D @tailwindcss/typography\n```\n\n## 3. Wire the tokens\n\nMzizi tokens are **theme-adaptive CSS custom properties**. Add the Seven African Minerals to\n`app/globals.css` in both `:root` and `.dark`, and register them in the Tailwind 4 `@theme`\nblock so utilities generate.\n\n```css\n:root {\n /* Seven minerals — light values. deep-earth family */\n --color-cobalt: #0047ab; /* Knowledge */\n --color-tanzanite: #4b0082; /* Identity */\n --color-malachite: #004d40; /* Growth */\n --color-sodalite: #283593; /* Intelligence */\n /* hand family */\n --color-gold: #5d4037; /* Value */\n --color-terracotta: #a0522d; /* Community */\n --color-copper: #bf5a36; /* Stewardship */\n}\n\n.dark {\n --color-cobalt: #00b0ff;\n --color-tanzanite: #b388ff;\n --color-malachite: #64ffda;\n --color-sodalite: #3d5afe;\n --color-gold: #ffd740;\n --color-terracotta: #e1b07e;\n --color-copper: #ff8a65;\n}\n```\n\n**These seven are a seed snapshot, not the palette and not the source of truth.** The palette\nis **21 families**: these seven minerals, seven Heritage tones (indigo, savanna, baobab, sunset,\nriver, hematite, kalahari) and the Experimental Seven (ember, acacia, fern, lagoon, storm, dusk,\nprotea). Wire an app from the seven above and two thirds of the system is missing.\n\nCanon ships with this bundle and needs no network: `palette.canonical.json` at the root of\n`@nyuchi/mzizi-skills`, with the ready-made stylesheet at\n`skills/mukoko-design/tokens/palette.css` (all 21 families, light + dark). Copy that in rather\nthan retyping hexes. The same values are served at <https://api.mzizi.dev/v1/brand>, or over the\nMCP as `get_brand_tokens` / `list_brand_token_categories`:\n\n```bash\ncurl -s https://api.mzizi.dev/v1/brand | jq '.minerals, .heritage, .experimental'\n```\n\nSee the `nyuchi-design` skill for how the families are meant to be used.\n\nPick the app's accent through `--brand-accent` rather than hardcoding a mineral hex: nyuchi =\ngold, mukoko = tanzanite.\n\n## 4. Point `components.json` at the Mzizi registry\n\n```json\n{\n \"$schema\": \"https://ui.shadcn.com/schema.json\",\n \"style\": \"new-york\",\n \"tailwind\": {\n \"config\": \"tailwind.config.ts\",\n \"css\": \"app/globals.css\",\n \"baseColor\": \"neutral\",\n \"cssVariables\": true\n },\n \"aliases\": {\n \"components\": \"@/components\",\n \"utils\": \"@/lib/utils\",\n \"ui\": \"@/components/ui\"\n },\n \"registries\": {\n \"mzizi\": {\n \"url\": \"https://mzizi.dev/api/v1/ui\"\n }\n }\n}\n```\n\n## 5. Install components to verify\n\n```bash\npnpm dlx shadcn@latest add https://mzizi.dev/api/v1/ui/mzizi-theme-provider\npnpm dlx shadcn@latest add https://mzizi.dev/api/v1/ui/button\n```\n\nNever copy-paste component source between apps — install from the registry so every app\ninherits fixes.\n\n## 6. Wire the theme provider\n\nIn `app/layout.tsx`:\n\n```tsx\nimport { MziziThemeProvider } from \"@/components/mzizi-theme-provider\"\n\nexport default function RootLayout({ children }) {\n return (\n <html lang=\"en\" suppressHydrationWarning>\n <body>\n <MziziThemeProvider>{children}</MziziThemeProvider>\n </body>\n </html>\n )\n}\n```\n\n## 7. Give the app's AI assistants the doctrine\n\nInstall the published skills bundle so any assistant working in the repo has the design system\non hand:\n\n```bash\nnpx skills add @nyuchi/mzizi-skills\n```\n\nOr install the whole toolchain as a Claude Code plugin — skills, the `fundi` agent, the\nregistry MCP, and the `/mzizi:*` commands in one step:\n\n```\n/plugin marketplace add mzizi-dev/agent-tools\n/plugin install mzizi@mzizi-tools\n```\n\nTo wire the registry MCP directly instead, add it to `.mcp.json` / your client config:\n\n```json\n{\n \"mcpServers\": {\n \"mzizi\": { \"type\": \"http\", \"url\": \"https://mcp.mzizi.dev/mcp\" }\n }\n}\n```\n\n## 8. Let fundi do the wiring for you\n\n`@nyuchi/mzizi-cli` ships the **fundi** agent, which reads the project off disk and plans the\nscaffolding against the live registry:\n\n```bash\npnpm add -D @nyuchi/mzizi-cli\nnpx fundi explore # offline — snapshot the project\nnpx fundi plan \"wire up Mzizi tokens and install the theme provider\"\n```\n\n`explore` runs without credentials; `plan` and `chat` need `ANTHROPIC_API_KEY`. A plan is\ninert until you apply it, so read it before letting it write.\n\n## 9. Verify\n\n```bash\npnpm dev\n```\n\nConfirm the theme toggle works, the button renders with mineral-based styling, and Tailwind\npicks up the CSS variables.\n\n## Ubuntu alignment\n\nThe ecosystem is built on Ubuntu — \"I am because we are.\" When you architect a new app:\n\n- Prefer open source over proprietary\n- Build for community, not extraction\n- Respect data sovereignty — African data stays on African infrastructure where possible\n- Accessibility is not an afterthought; it is the starting point\n- Every feature should contribute to collective wellbeing, not just individual efficiency\n\nThese aren't marketing claims, they're architectural constraints. If you find yourself\ndesigning something that only benefits a small subset of users at others' expense, question\nwhether it belongs in the ecosystem.\n\n## What is and isn't an ecosystem app\n\nThe ecosystem has two layers. **Mzizi** (the framework, the design language, the component\nregistry, the doctrine and the architecture — everything non-revenue) sits under every app, and\n**Nyuchi Africa** (the operating company) runs everything revenue-generating. Inside Nyuchi Africa\nsit three pillars and the platform:\n\n- **mukoko** — the consumer pillar: the super-app (social, commerce, payments, identity)\n- **nyuchi** — the commercial/infrastructure pillar and the platform (web services, developer\n tools, MCP, storage)\n- **shamwari ai** — the intelligence pillar, sovereign by nature (on-device inference,\n pod-resident context, no third-party AI vendor)\n- **nhimbe** — cooperative economic features\n\nMzizi is not an app and not a layer in a stack; it is the open, non-revenue foundation the\necosystem builds on and the doctrine that governs it. mukoko and shamwari ai are pillars inside Nyuchi Africa, not separate companies.\n\nNot ecosystem apps:\n\n- Any app that extracts value without giving back\n- Any app that requires surveillance for its business model\n- Any app that centralises what should be federated\n\nIf the app you're building doesn't fit, that's fine — consume the Mzizi design system, but\ndon't brand it as ecosystem.\n\n## Wordmarks\n\nAll brand wordmarks are lowercase: `mzizi`, `mukoko`, `nyuchi`, `shamwari`, `bundu`, `nhimbe`,\n`fundi`.",
50
+ "source": "mzizi-tools/mzizi-skills/skills/ecosystem-app-setup"
51
+ },
52
+ {
53
+ "name": "cloudflare-worker-rust",
54
+ "description": "Build a nyuchi Cloudflare Worker in Rust with workers-rs: project layout, wrangler config, cron triggers and queue consumers, the Supabase access pattern, WorkOS token validation by audience, logging conventions, and deploy. Covers when Rust is the right choice versus the TypeScript worker stack.",
55
+ "body_mdx": "# Cloudflare Worker in Rust — the nyuchi pattern\n\n`workers-rs` compiles Rust to WebAssembly and runs it on the Cloudflare Worker runtime. This\nskill is the house pattern for nyuchi services written that way.\n\n## Pick the language before you pick the pattern\n\nBoth stacks are in production, and the choice is not stylistic:\n\n- **Rust (`workers-rs`)** — CPU-bound work, strict correctness requirements, or a service that\n already shares Rust crates with its siblings. The Nyuchi Console (`nyuchi/mukoko-platform`)\n runs Rust workers.\n- **TypeScript** — anything that leans on the MCP SDK, `hono`, `agents`, Durable Objects, or\n the Supabase JS clients. Every Worker in `mzizi-dev/agent-tools` (`mzizi-mcp`, `fundi-tester`,\n `bushtrade-mcp`) is TypeScript for exactly this reason: the ecosystem's MCP and agent\n libraries are TS-first.\n\nIf you are adding an MCP server or an agent surface, you almost certainly want TypeScript —\nsee the `mcp-server-cloudflare` skill. Reach for Rust when the workload, not the taste,\njustifies it.\n\n## Project setup\n\n```bash\nnpm install -g wrangler\ncargo generate cloudflare/workers-rs\n```\n\n```\nservice-name/\n├── src/\n│ ├── lib.rs # Worker entry points\n│ ├── router.rs # Request routing\n│ ├── supabase.rs # Supabase access\n│ ├── auth.rs # WorkOS token validation\n│ └── handlers/ # One file per route\n├── wrangler.toml\n└── Cargo.toml\n```\n\n## wrangler.toml\n\n```toml\nname = \"nyuchi-example-service\"\nmain = \"build/worker/shim.mjs\"\ncompatibility_date = \"2026-01-01\"\n\n[build]\ncommand = \"cargo install -q worker-build && worker-build --release\"\n\n# Secrets — set out-of-band with `wrangler secret put <NAME>`, never committed:\n# SUPABASE_URL\n# SUPABASE_SECRET_KEY\n# WORKOS_M2M_CLIENT_ID\n# WORKOS_M2M_CLIENT_SECRET\n\n[[triggers.crons]]\ncron = \"*/5 * * * *\"\n\n[[queues.consumers]]\nqueue = \"nyuchi-example-signals\"\nmax_batch_size = 10\n```\n\nKeep `compatibility_date` current; a stale date silently pins you to old runtime behaviour.\n\n## Entry points\n\n```rust\n// src/lib.rs\nuse worker::*;\nmod router;\nmod supabase;\nmod auth;\n\n#[event(fetch)]\npub async fn main(req: Request, env: Env, _ctx: Context) -> Result<Response> {\n router::handle(req, env).await\n}\n\n// Cron trigger\n#[event(scheduled)]\npub async fn scheduled(_event: ScheduledEvent, env: Env, _ctx: ScheduleContext) {\n if let Err(e) = jobs::run_cycle(&env).await {\n console_error!(\"[nyuchi:example] cycle error: {:?}\", e);\n }\n}\n\n// Queue consumer\n#[event(queue)]\npub async fn queue(batch: MessageBatch<String>, env: Env, _ctx: Context) -> Result<()> {\n jobs::process_signals(batch, &env).await\n}\n```\n\n## Supabase access\n\nTwo routes, and the choice matters for latency:\n\n- **PostgREST over `fetch`** — no extra infrastructure, works from any Worker, and is what the\n snippet below does. Fine for a handful of reads per request.\n- **Hyperdrive** — globally-pooled native Postgres, so no TCP handshake per request and the\n full SQL function surface is available. Worth it once a service is chatty or needs RPCs.\n\n```rust\n// src/supabase.rs\npub struct SupabaseClient {\n url: String,\n secret_key: String,\n}\n\nimpl SupabaseClient {\n pub fn from_env(env: &Env) -> Result<Self> {\n Ok(Self {\n url: env.secret(\"SUPABASE_URL\")?.to_string(),\n secret_key: env.secret(\"SUPABASE_SECRET_KEY\")?.to_string(),\n })\n }\n\n pub async fn get(&self, table: &str, query: &str) -> Result<String> {\n let url = format!(\"{}/rest/v1/{}?{}\", self.url, table, query);\n let mut headers = Headers::new();\n headers.set(\"apikey\", &self.secret_key)?;\n headers.set(\"Authorization\", &format!(\"Bearer {}\", self.secret_key))?;\n headers.set(\"Content-Type\", \"application/json\")?;\n\n let req = Request::new_with_init(&url, RequestInit::new().with_headers(headers))?;\n let mut resp = Fetch::Request(req).send().await?;\n resp.text().await\n }\n}\n```\n\nA service-role key bypasses RLS. Only reach for it on a server-side write path; anything\nserving public reads should use the anon key and let RLS do the gating.\n\n## Auth — decide by audience\n\nAuthentication follows the ecosystem's auth-by-audience doctrine:\n\n- **Public / customer surfaces** → WorkOS **Connect OAuth PKCE** (public client, no secret).\n Entitlement is a commerce subscription, never a per-user tag.\n- **Internal staff / machine surfaces** → WorkOS **M2M** (client-credentials). Only the Worker\n holds the secret; CLIs and browsers never do. Per-route scopes come from the token claims.\n\nValidate the inbound token against the WorkOS JWKS before doing any privileged work, and cache\nthe JWKS — refetching per request is the classic latency bug:\n\n```rust\n// src/auth.rs\npub struct Claims { pub sub: String, pub scopes: Vec<String> }\n\npub async fn validate_token(req: &Request, env: &Env) -> Result<Option<Claims>> {\n let Some(header) = req.headers().get(\"Authorization\")? else {\n return Ok(None); // no token — the caller decides whether that is allowed\n };\n let token = header.strip_prefix(\"Bearer \").unwrap_or(&header);\n\n // 1. Fetch (and cache) the JWKS for the WorkOS environment.\n // 2. Verify signature, `exp`, `iss`, and `aud`.\n // 3. Map the verified claims onto `Claims`.\n verify_against_jwks(token, env).await\n}\n```\n\nReturn `401` on an invalid token and `403` on a valid token missing the required scope — never\ncollapse the two, or callers can't tell \"log in\" from \"you can't do this\".\n\nRoutes that are not user-triggered — cron, queue consumers, health — bypass the gate by design.\n\n## Logging convention\n\nEvery log line carries a `[nyuchi:service-name]` prefix so it is greppable across services:\n\n```rust\nconsole_log!(\"[nyuchi:example] cycle complete: {} records processed\", count);\nconsole_error!(\"[nyuchi:example] upstream error: {:?}\", e);\n```\n\nNever log a token, a secret, or a full request body.\n\n## Deploy\n\n```bash\nwrangler dev # local\nwrangler deploy # production\n\nwrangler secret put SUPABASE_URL\nwrangler secret put SUPABASE_SECRET_KEY\nwrangler secret put WORKOS_M2M_CLIENT_ID\nwrangler secret put WORKOS_M2M_CLIENT_SECRET\n```\n\nPrefer wiring deploys to CI (a workflow on push to `main`, or Cloudflare Workers Builds) over\ndeploying from a laptop, so what is live always matches what is merged.",
56
+ "source": "mzizi-tools/mzizi-skills/skills/cloudflare-worker-rust"
57
+ },
58
+ {
59
+ "name": "mcp-server-cloudflare",
60
+ "description": "Add or change an MCP server running as a Cloudflare Worker in the Mzizi ecosystem: the live endpoint map, one-factory/many-entrypoints layout, Streamable HTTP transport, registry-driven tool catalogues with drift gates, tool naming and annotations, the auth-by-audience gate (Connect OAuth PKCE vs M2M), and publishing to the MCP registry.",
61
+ "body_mdx": "# MCP server on Cloudflare Workers — the ecosystem pattern\n\n## The live endpoint map\n\nRead this before inventing a hostname — each MCP has its own host, and the umbrella\n`mcp.nyuchi.dev/{service}` path scheme is **not** how these are deployed:\n\n| Endpoint | Worker | Serves |\n| --------------------- | ----------------- | --------------------------------------------------------------- |\n| `mcp.mzizi.dev/mcp` | `mzizi-mcp` | The Mzizi registry — components, tokens, architecture, doctrine |\n| `docs.nyuchi.com/mcp` | `nyuchi-docs-mcp` | The docs corpus — search / ask / read / feedback |\n| (Worker) | `bushtrade-mcp` | Agentic commerce — task-driven UCP/AP2 verbs |\n\n`design.nyuchi.com` is a 308 permanent redirect to `mzizi.dev`. Never reference it in new code\nor docs.\n\n**One MCP per surface.** Mzizi previously ran a second, unauthenticated MCP at\n`mzizi.dev/mcp` inside the portal, serving a subset of the same registry. Two\nendpoints over one corpus is two tool catalogues to keep in step, two auth\nstories to explain, and a silent choice for every client author. `mzizi.dev/mcp`\nnow 308-redirects to `mcp.mzizi.dev/mcp` — method and body preserved, so an\nin-flight `POST` survives the hop. Point new clients at `mcp.mzizi.dev/mcp`\ndirectly; the gate there is a free WorkOS signup, not a paywall.\n\n## Transport\n\nMCP over HTTP is **Streamable HTTP**, JSON-RPC 2.0:\n\n- `POST /mcp` — JSON-RPC requests\n- `GET /mcp` — SSE stream\n- `DELETE /mcp` — session cleanup\n- `OPTIONS /mcp` — CORS preflight\n\nA server exposes `tools/list` + `tools/call`, and optionally `resources/list` and\n`prompts/list`.\n\nUse `@modelcontextprotocol/sdk` — TypeScript is the right choice here, because the SDK, `hono`,\nand `agents` are all TS-first. Pin the SDK version deliberately: `agents` hard-pins\n`@modelcontextprotocol/sdk`, and letting your own declaration drift produces two incompatible\n`McpServer` classes in the type graph and a private-field mismatch at typecheck.\n\n## One factory, many entrypoints\n\nKeep the server definition free of any runtime binding, then wrap it per surface. This is what\nlets the same catalogue ship as a Worker, a generic fetch handler, and a local stdio bin:\n\n```\nsrc/\n├── server.ts # createXMcpServer(deps) → McpServer ← the only place tools are defined\n├── http.ts # createXHttpHandler() — any fetch runtime\n├── worker.ts # Cloudflare Worker entry, bound to env\n└── stdio.ts # bin for local clients / the MCP registry\n```\n\n## Prefer a registry-driven tool catalogue\n\nHardcoding a tool list means every new tool is a code change and a deploy. Build the catalogue\nat startup from a table instead, and dispatch by the row's `kind`:\n\n- `sql_function` → `supabase.rpc(...)`\n- `edge_function` → `supabase.functions.invoke(...)`\n- `source_table` → `supabase.from(...).select(...)`\n\nKeep only genuinely code-shaped tools (health, collection listing) in source.\n\n**Registry-driven surfaces need two gates**, because a table edit changes what the server\nexposes with no code change:\n\n1. An **offline suite** that connects a real MCP `Client` to the factory over an in-memory\n transport and asserts the contract — the tool prefix, annotations, filtering, output schemas,\n and dispatch routing.\n2. A **live drift gate** that reconstructs the public surface from the live registry and diffs\n it against a committed manifest, failing when a tool was added, edited, or removed without\n updating it. Run it before deploy.\n\n## Tool naming and annotations\n\nTools are `snake_case` and named for the action: `list_components`, `get_component`,\n`search_components`, `get_node_documents`, `get_brand_tokens`, `get_skill`.\n\nEvery tool carries a `title`, an `outputSchema`, and honest behaviour hints:\n\n- `readOnlyHint` — true only if the tool cannot mutate anything. An action-kind tool that runs\n an audit is **not** read-only.\n- `destructiveHint` / `idempotentHint` / `openWorldHint` — set them deliberately; clients use\n them to decide what to auto-approve.\n\nReturn `structuredContent` matching the declared `outputSchema` (array results wrapped under\n`rows`, scalars under `result`).\n\nNote the RPC parameter convention: registry functions take `p_`-prefixed params. Call\n`get_component` with `{ p_name }`, `search_components` with `{ p_query, p_limit }`. Getting the\nprefix wrong surfaces as \"Could not find function public.get_component(name)\".\n\n## Auth — decide by audience\n\n- **Public / customer MCPs** (`mzizi-mcp`, `bushtrade-mcp`) → **WorkOS Connect OAuth PKCE**,\n a public client with no secret, each MCP with its own Connect app. Entitlement for paid\n surfaces is a commerce subscription, never a per-user tag.\n- **Internal staff / machine surfaces** → **WorkOS M2M** (client-credentials). Only the Worker\n holds the secret. A Worker that fronts an internal service mints the M2M token itself and\n proxies the call, so a CLI never has to hold it.\n\nWrite-kind tools stay off the anonymous surface. If a public write is genuinely needed, keep it\nto an append-only sink on an explicit allow-list, running `SECURITY DEFINER` or self-gating —\nand enumerate those exceptions in one place in the source.\n\nAuth happens **inline in the client**, never by punting the user to a browser tab.\n\n## Static assets\n\nIf the Worker also needs to serve `llms.txt` or `robots.txt`, put them behind an `[assets]`\nblock so they resolve ahead of the OAuth handler; everything else falls through to the server.\n\n## Instrumentation\n\nWrap tool dispatch and emit an observability event on any tool error, fire-and-forget via\n`ctx.waitUntil` so it never blocks the response. Errors feed the fundi self-healing loop;\ndeliberately injected faults go to the chaos stream instead.\n\n## Publishing to the MCP registry\n\n`server.json` next to `package.json` is the source of truth, and\n`package.json#mcpName` **must** equal `server.json#name` or the registry refuses the publish.\nRegistry names look like `io.github.nyuchi/<server>`.\n\nRelease checklist:\n\n1. Bump the version everywhere it is stated — the version constant the server reports in\n `serverInfo`, `package.json#version`, `server.json#version`, and\n `server.json#packages[0].version`. A mismatch here is the most common failed publish.\n2. Tag and push. CI publishes to npm with provenance, then runs\n `mcp-publisher login github-oidc` followed by `mcp-publisher publish` to reach the registry.\n The login uses OIDC, so no registry secret is needed.\n\n## Deploy\n\n```bash\nwrangler dev\nwrangler deploy\nwrangler secret put SUPABASE_URL\nwrangler secret put SUPABASE_PUBLISHABLE_KEY\n```\n\nWire the deploy to CI on push to `main` so what is live matches what is merged, and run the\ndrift gate + a live smoke pass of every read tool before `wrangler deploy`.",
62
+ "source": "mzizi-tools/mzizi-skills/skills/mcp-server-cloudflare"
63
+ }
64
+ ];
65
+ /** Bundle version, from mzizi-skills/index.json. */
66
+ export const SKILLS_VERSION = "0.7.0";
67
+ //# sourceMappingURL=skills.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/generated/skills.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AASH,MAAM,CAAC,MAAM,cAAc,GAA4B;IACrD;QACE,MAAM,EAAE,UAAU;QAClB,aAAa,EAAE,4YAA4Y;QAC3Z,UAAU,EAAE,w3FAAw3F;QACp4F,QAAQ,EAAE,0CAA0C;KACrD;IACD;QACE,MAAM,EAAE,iBAAiB;QACzB,aAAa,EAAE,kfAAkf;QACjgB,UAAU,EAAE,+kOAA+kO;QAC3lO,QAAQ,EAAE,iDAAiD;KAC5D;IACD;QACE,MAAM,EAAE,cAAc;QACtB,aAAa,EAAE,mPAAmP;QAClQ,UAAU,EAAE,omQAAomQ;QAChnQ,QAAQ,EAAE,8CAA8C;KACzD;IACD;QACE,MAAM,EAAE,eAAe;QACvB,aAAa,EAAE,iVAAiV;QAChW,UAAU,EAAE,07SAA07S;QACt8S,QAAQ,EAAE,+CAA+C;KAC1D;IACD;QACE,MAAM,EAAE,eAAe;QACvB,aAAa,EAAE,gYAAgY;QAC/Y,UAAU,EAAE,yqMAAyqM;QACrrM,QAAQ,EAAE,+CAA+C;KAC1D;IACD;QACE,MAAM,EAAE,oBAAoB;QAC5B,aAAa,EAAE,skBAAskB;QACrlB,UAAU,EAAE,8lXAA8lX;QAC1mX,QAAQ,EAAE,oDAAoD;KAC/D;IACD;QACE,MAAM,EAAE,qBAAqB;QAC7B,aAAa,EAAE,0QAA0Q;QACzR,UAAU,EAAE,mhPAAmhP;QAC/hP,QAAQ,EAAE,qDAAqD;KAChE;IACD;QACE,MAAM,EAAE,wBAAwB;QAChC,aAAa,EAAE,2SAA2S;QAC1T,UAAU,EAAE,q6MAAq6M;QACj7M,QAAQ,EAAE,wDAAwD;KACnE;IACD;QACE,MAAM,EAAE,uBAAuB;QAC/B,aAAa,EAAE,qVAAqV;QACpW,UAAU,EAAE,21NAA21N;QACv2N,QAAQ,EAAE,uDAAuD;KAClE;CACO,CAAA;AAEV,oDAAoD;AACpD,MAAM,CAAC,MAAM,cAAc,GAAG,OAAO,CAAA"}
package/dist/http.d.ts CHANGED
@@ -2,20 +2,29 @@
2
2
  * HTTP / fetch-handler entry — Cloudflare Workers + Next.js routes + any
3
3
  * Web-standard Request/Response runtime.
4
4
  *
5
- * Uses `@supabase/server`'s `createSupabaseContext(request, { auth: 'none' })`
6
- * to mint a per-request anon-scoped `SupabaseClient`. RLS on
7
- * `component_documents` enforces read-only.
5
+ * There is no database here. The registry tools answer from files bundled at
6
+ * build time (registry.ts), the docs tools forward to docs.mzizi.dev
7
+ * (docs-federation.ts). On the Worker, `worker.ts` decides whether a request is
8
+ * anonymous (the free tier) or signed in (WorkOS AuthKit via the OAuth provider)
9
+ * before it reaches this handler.
8
10
  */
9
- import { type WithSupabaseConfig } from "@supabase/server";
10
11
  import type { FundiToolContext } from "./fundi-client.js";
12
+ import type { IssueDeskContext } from "./tools.js";
13
+ import type { DocsFederationOptions } from "./docs-federation.js";
11
14
  export interface HttpHandlerOptions {
12
- /**
13
- * Override the default `@supabase/server` config. Defaults to
14
- * `{ auth: 'none', cors: false }` — public read via the anon client.
15
- */
16
- supabaseConfig?: WithSupabaseConfig;
17
15
  /** When set, expose the fundi trigger tool bound to the signed-in user. */
18
16
  fundi?: FundiToolContext;
17
+ /** The signed-in user's issue desk. See `tools.ts` — absent off the Worker. */
18
+ desk?: IssueDeskContext;
19
+ /**
20
+ * The caller is anonymous on the Worker's free tier: list the sign-in tools,
21
+ * and have them refuse with how to sign in. See `access.ts`.
22
+ */
23
+ anonymous?: {
24
+ fundi: boolean;
25
+ };
26
+ /** Docs federation settings, or `false` for none. Defaults to docs.mzizi.dev. */
27
+ docs?: DocsFederationOptions | false;
19
28
  }
20
29
  /**
21
30
  * Build a fetch handler that serves the Mzizi MCP over Streamable HTTP.
@@ -1 +1 @@
1
- {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAyB,KAAK,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AAEjF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAmCzD,MAAM,WAAW,kBAAkB;IACjC;;;OAGG;IACH,cAAc,CAAC,EAAE,kBAAkB,CAAA;IACnC,2EAA2E;IAC3E,KAAK,CAAC,EAAE,gBAAgB,CAAA;CACzB;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,GAAE,kBAAuB,IAGxC,SAAS,OAAO,KAAG,OAAO,CAAC,QAAQ,CAAC,CA8BlE"}
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AACzD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAClD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAA;AAqCjE,MAAM,WAAW,kBAAkB;IACjC,2EAA2E;IAC3E,KAAK,CAAC,EAAE,gBAAgB,CAAA;IACxB,+EAA+E;IAC/E,IAAI,CAAC,EAAE,gBAAgB,CAAA;IACvB;;;OAGG;IACH,SAAS,CAAC,EAAE;QAAE,KAAK,EAAE,OAAO,CAAA;KAAE,CAAA;IAC9B,iFAAiF;IACjF,IAAI,CAAC,EAAE,qBAAqB,GAAG,KAAK,CAAA;CACrC;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,GAAE,kBAAuB,IACxC,SAAS,OAAO,KAAG,OAAO,CAAC,QAAQ,CAAC,CA0BlE"}
package/dist/http.js CHANGED
@@ -2,12 +2,13 @@
2
2
  * HTTP / fetch-handler entry — Cloudflare Workers + Next.js routes + any
3
3
  * Web-standard Request/Response runtime.
4
4
  *
5
- * Uses `@supabase/server`'s `createSupabaseContext(request, { auth: 'none' })`
6
- * to mint a per-request anon-scoped `SupabaseClient`. RLS on
7
- * `component_documents` enforces read-only.
5
+ * There is no database here. The registry tools answer from files bundled at
6
+ * build time (registry.ts), the docs tools forward to docs.mzizi.dev
7
+ * (docs-federation.ts). On the Worker, `worker.ts` decides whether a request is
8
+ * anonymous (the free tier) or signed in (WorkOS AuthKit via the OAuth provider)
9
+ * before it reaches this handler.
8
10
  */
9
11
  import { WebStandardStreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/webStandardStreamableHttp.js";
10
- import { createSupabaseContext } from "@supabase/server";
11
12
  import { createMziziMcpServer } from "./server.js";
12
13
  const CORS_HEADERS = {
13
14
  "Access-Control-Allow-Origin": "*",
@@ -26,9 +27,11 @@ function withCors(response) {
26
27
  }
27
28
  // OAuth / OIDC discovery paths an MCP client probes to learn whether — and
28
29
  // how — it must authenticate (RFC 9728 / RFC 8414 + the MCP Authorization
29
- // spec). This server is public (`auth: "none"`); it advertises no auth
30
- // scheme. RFC 9728 §3.1 also allows the resource identifier to carry a path,
31
- // so the protected-resource probe can arrive with a trailing path segment.
30
+ // spec). This handler advertises no auth scheme of its own: off the Worker it
31
+ // is public, and on the Worker the OAuth provider in front of it has already
32
+ // validated the token before a request reaches here. RFC 9728 §3.1 also allows
33
+ // the resource identifier to carry a path, so the protected-resource probe can
34
+ // arrive with a trailing path segment.
32
35
  const OAUTH_DISCOVERY_PREFIXES = [
33
36
  "/.well-known/oauth-protected-resource",
34
37
  "/.well-known/oauth-authorization-server",
@@ -42,7 +45,6 @@ function isOAuthDiscoveryPath(pathname) {
42
45
  * Stateless — each request creates a fresh transport + server pair.
43
46
  */
44
47
  export function createMziziHttpHandler(options = {}) {
45
- const config = options.supabaseConfig ?? { auth: "none", cors: false };
46
48
  return async function handle(request) {
47
49
  if (request.method === "OPTIONS") {
48
50
  return new Response(null, { status: 204, headers: CORS_HEADERS });
@@ -55,15 +57,16 @@ export function createMziziHttpHandler(options = {}) {
55
57
  if (isOAuthDiscoveryPath(new URL(request.url).pathname)) {
56
58
  return withCors(new Response("Not Found", { status: 404 }));
57
59
  }
58
- const { data: ctx, error } = await createSupabaseContext(request, config);
59
- if (error || !ctx) {
60
- return withCors(Response.json({ error: error?.message ?? "Failed to create Supabase context" }, { status: error?.status ?? 500 }));
61
- }
62
60
  const transport = new WebStandardStreamableHTTPServerTransport({
63
61
  sessionIdGenerator: undefined,
64
62
  enableJsonResponse: true,
65
63
  });
66
- const server = await createMziziMcpServer({ fundi: options.fundi });
64
+ const server = await createMziziMcpServer({
65
+ fundi: options.fundi,
66
+ desk: options.desk,
67
+ anonymous: options.anonymous,
68
+ docs: options.docs,
69
+ });
67
70
  await server.connect(transport);
68
71
  const response = await transport.handleRequest(request);
69
72
  return withCors(response);
package/dist/http.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,wCAAwC,EAAE,MAAM,+DAA+D,CAAA;AACxH,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAKlD,MAAM,YAAY,GAAG;IACnB,6BAA6B,EAAE,GAAG;IAClC,8BAA8B,EAAE,4BAA4B;IAC5D,8BAA8B,EAAE,4DAA4D;CAC7F,CAAA;AAED,SAAS,QAAQ,CAAC,QAAkB;IAClC,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;IAC7C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC;QAAE,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;IAChF,OAAO,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE;QACjC,MAAM,EAAE,QAAQ,CAAC,MAAM;QACvB,UAAU,EAAE,QAAQ,CAAC,UAAU;QAC/B,OAAO;KACR,CAAC,CAAA;AACJ,CAAC;AAED,2EAA2E;AAC3E,0EAA0E;AAC1E,8EAA8E;AAC9E,6EAA6E;AAC7E,+EAA+E;AAC/E,+EAA+E;AAC/E,uCAAuC;AACvC,MAAM,wBAAwB,GAAG;IAC/B,uCAAuC;IACvC,yCAAyC;IACzC,mCAAmC;CACpC,CAAA;AAED,SAAS,oBAAoB,CAAC,QAAgB;IAC5C,OAAO,wBAAwB,CAAC,IAAI,CAClC,CAAC,MAAM,EAAE,EAAE,CAAC,QAAQ,KAAK,MAAM,IAAI,QAAQ,CAAC,UAAU,CAAC,GAAG,MAAM,GAAG,CAAC,CACrE,CAAA;AACH,CAAC;AAgBD;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CAAC,UAA8B,EAAE;IACrE,OAAO,KAAK,UAAU,MAAM,CAAC,OAAgB;QAC3C,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACjC,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,CAAA;QACnE,CAAC;QACD,2EAA2E;QAC3E,4EAA4E;QAC5E,2EAA2E;QAC3E,uEAAuE;QACvE,8DAA8D;QAC9D,IAAI,oBAAoB,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC;YACxD,OAAO,QAAQ,CAAC,IAAI,QAAQ,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAA;QAC7D,CAAC;QACD,MAAM,SAAS,GAAG,IAAI,wCAAwC,CAAC;YAC7D,kBAAkB,EAAE,SAAS;YAC7B,kBAAkB,EAAE,IAAI;SACzB,CAAC,CAAA;QACF,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC;YACxC,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,IAAI,EAAE,OAAO,CAAC,IAAI;SACnB,CAAC,CAAA;QACF,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;QAC/B,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,aAAa,CAAC,OAAO,CAAC,CAAA;QACvD,OAAO,QAAQ,CAAC,QAAQ,CAAC,CAAA;IAC3B,CAAC,CAAA;AACH,CAAC"}
@@ -0,0 +1,152 @@
1
+ /**
2
+ * `IssueDesk` — one Durable Object per signed-in user, holding that person's
3
+ * issue reports and driving each one from "something is wrong" to an issue
4
+ * logged with fundi, which files it on GitHub and tracks it from there.
5
+ *
6
+ * WHY A DURABLE OBJECT, AND WHY PER USER
7
+ *
8
+ * `mzizi_report_issue` used to be a stub that errored on every input (issue
9
+ * #78). Wiring it to a fire-and-forget write would have fixed the error and
10
+ * kept the real problem: a bug report is not a message, it is a small piece of
11
+ * work with stages — reproduce it, write the fix, file it — and each stage is
12
+ * slow, can fail on its own, and is worth keeping.
13
+ *
14
+ * A stateless Worker cannot hold that. Every call would start from nothing, so
15
+ * a user who reported a flaky button on Tuesday and again on Thursday would be
16
+ * two strangers, and the second report could not say "this is the third time".
17
+ *
18
+ * Per USER rather than per report is the deliberate part. A per-report object
19
+ * would be simpler and would lose exactly the thing that makes the history
20
+ * useful: reports cluster by person, not by incident. The people who report
21
+ * problems tend to report several, in the same area, in the same voice, and the
22
+ * pattern across them is often the actual bug. Keying on the WorkOS subject
23
+ * (`idFromName(userId)`) means a returning user's earlier reports are already
24
+ * loaded when the next one arrives — context, not a lookup.
25
+ *
26
+ * It also draws the privacy boundary in the right place. One person's reports
27
+ * live in one object; there is no shared table to accidentally select across,
28
+ * and "show me my history" is the natural query rather than a filtered one.
29
+ *
30
+ * THE THREE STAGES, AND WHAT ACTUALLY WORKS TODAY
31
+ *
32
+ * 1. reproduce — delegate a run to fundi over the existing Service Binding.
33
+ * 2. draft — turn the report plus whatever stage 1 learned into an issue
34
+ * body a maintainer can act on.
35
+ * 3. log — hand that draft to fundi, which records it in the platform
36
+ * database and files the GitHub issue.
37
+ *
38
+ * Stated honestly, because the alternative is a pipeline that looks like it
39
+ * works: **fundi records a submitted task and parks it.** Its executors are not
40
+ * built (`executionStatus: "accepted-not-executed"`, see `fundi-a2a.ts`), so
41
+ * stage 1 today produces a task id and fundi's own note that it did not run.
42
+ * The desk records exactly that and the drafted issue says so. It does not
43
+ * claim a reproduction it does not have — a report asserting "reproduced" when
44
+ * nothing ran is worse than one that says nothing, because a maintainer will
45
+ * believe it.
46
+ *
47
+ * THIS WORKER NO LONGER TOUCHES GITHUB, AND HOLDS NO PAT
48
+ *
49
+ * Stage 3 used to be `POST https://api.github.com/repos/…/issues` from here,
50
+ * authorised with `env.GITHUB_TOKEN`. That secret was never set on this Worker
51
+ * and was never going to be — it belongs on `mzizi-fundi`, a separate Worker
52
+ * with a separate secret store, which is exactly why the gap stayed invisible
53
+ * for so long. Every report therefore reproduced, drafted, and parked at
54
+ * `drafted` with a note suggesting the reporter paste the body into GitHub by
55
+ * hand. That is a write sink with extra steps.
56
+ *
57
+ * The division of labour now:
58
+ *
59
+ * this desk reproduce, draft, log (no GitHub, no PAT, no database)
60
+ * fundi record in D1, file the GitHub issue WITH the healing plan,
61
+ * and write that issue's lifecycle back onto the same row
62
+ *
63
+ * So the terminal stage is `logged`, not `filed`: at the instant this desk
64
+ * finishes, the issue is RECORDED — durably, where a maintainer and the console
65
+ * can both see it — and the GitHub issue follows on fundi's next heal pass. The
66
+ * desk learns the issue's number and URL when the report is next read, from
67
+ * fundi rather than from GitHub.
68
+ *
69
+ * An issue is never blocked on this Worker holding a credential again. The one
70
+ * remaining way stage 3 can fail is fundi being unreachable, and that failure
71
+ * parks the report at `drafted` with the body in hand and a `retry` that
72
+ * re-enters at exactly that stage.
73
+ */
74
+ import { DurableObject } from "cloudflare:workers";
75
+ import type { Env } from "./env.js";
76
+ import { type DeskCaller, type OpenInput, type Report } from "./issue-report.js";
77
+ export * from "./issue-report.js";
78
+ export declare class IssueDesk extends DurableObject<Env> {
79
+ constructor(ctx: DurableObjectState, env: Env);
80
+ /**
81
+ * Open a report and drive it as far as it will go in one call.
82
+ *
83
+ * Deliberately synchronous end-to-end rather than queued: an MCP tool call is
84
+ * a conversation turn, and returning "queued, ask again later" to an agent
85
+ * that has no reason to ask again is how a write sink becomes a black hole.
86
+ * The stages are bounded — one fundi submit, one fundi log — so the call
87
+ * stays inside a Worker's budget.
88
+ */
89
+ open(input: OpenInput, caller: DeskCaller): Promise<Report>;
90
+ /** One report, or null. Scoped to this user by construction. */
91
+ get(id: string): Promise<Report | null>;
92
+ /**
93
+ * One report, with its issue status refreshed from fundi first.
94
+ *
95
+ * The desk and fundi hold two halves of one story: the desk knows what the
96
+ * reporter said, fundi knows what happened to the issue afterwards. Without
97
+ * this, a report would sit at `logged` for ever and the only honest answer to
98
+ * "what happened to my bug?" would be "look somewhere else" — which is the
99
+ * dead end the old GitHub path had, one layer along.
100
+ *
101
+ * Only on a single `get`, never on `list`: refreshing a list would be one
102
+ * fundi round trip per row, on a read someone does casually. And never for a
103
+ * report whose issue is already closed — there is nothing left to learn.
104
+ */
105
+ getRefreshed(id: string, caller: DeskCaller): Promise<Report | null>;
106
+ /**
107
+ * This user's reports, newest first.
108
+ *
109
+ * The point of the whole design: an agent handling a new report can read what
110
+ * this person already said, and a maintainer can see whether a complaint is
111
+ * the first or the fourth.
112
+ */
113
+ list(limit?: number): Promise<Report[]>;
114
+ /** Re-enter the pipeline at the stage that failed. */
115
+ retry(id: string, caller: DeskCaller): Promise<Report | null>;
116
+ private advance;
117
+ /**
118
+ * Delegate the reproduction to fundi.
119
+ *
120
+ * Returns fundi's answer verbatim rather than a verdict of our own. Today
121
+ * that answer is "accepted, not executed", and passing it through unedited is
122
+ * what stops the drafted issue claiming a run that did not happen.
123
+ *
124
+ * Routed through `createFundiCaller` rather than `FUNDI_SERVICE.fetch`
125
+ * directly. This used to hand-roll the binding call with a lone
126
+ * `Content-Type` header, so it never sent `X-Fundi-User-Token` — and fundi,
127
+ * correctly, refused every one with `403 fundi only acts for an authenticated
128
+ * user` (AUTH.md §2). The caller is the only code that satisfies that
129
+ * contract, and it also covers the HTTP + M2M path this method previously
130
+ * ignored: without a binding it used to give up, even on a Worker configured
131
+ * to reach fundi over HTTP.
132
+ */
133
+ private reproduce;
134
+ /**
135
+ * Stage 3 — hand the drafted report to fundi.
136
+ *
137
+ * This is the only outbound call the desk makes besides the reproduction, and
138
+ * it goes over the SAME Service Binding: fundi is the Worker that holds the
139
+ * GitHub PAT and the platform D1 binding, and it already owns `fundi_issues`,
140
+ * the cron pass that files unfiled rows, and the webhook that tracks them
141
+ * afterwards. Sending the report there rather than writing D1 from here keeps
142
+ * one writer on that table and keeps this Worker free of credentials.
143
+ *
144
+ * It cannot throw. `logIssueToFundi` turns every failure — no binding, no
145
+ * user token, fundi 5xx, D1 refusing the insert — into a reason string, and
146
+ * the caller parks the report at `drafted` with it. The tool call that
147
+ * reported the issue survives every one of them.
148
+ */
149
+ private log;
150
+ private save;
151
+ }
152
+ //# sourceMappingURL=issue-desk.d.ts.map