{"id":51125588,"url":"https://github.com/marcelofarias/botscript","last_synced_at":"2026-06-25T07:30:39.633Z","repository":{"id":356424080,"uuid":"1232438673","full_name":"marcelofarias/botscript","owner":"marcelofarias","description":"BotScript - A TypeScript superset for the LLM era","archived":false,"fork":false,"pushed_at":"2026-06-19T22:38:21.000Z","size":1809,"stargazers_count":13,"open_issues_count":15,"forks_count":2,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-20T04:25:59.054Z","etag":null,"topics":["agents","bots","compiler","developer-tools","llm","programming-language","type-safety","typescript"],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/marcelofarias.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-05-07T23:52:34.000Z","updated_at":"2026-06-18T18:26:07.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/marcelofarias/botscript","commit_stats":null,"previous_names":["marcelofarias/botscript"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/marcelofarias/botscript","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/marcelofarias%2Fbotscript","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/marcelofarias%2Fbotscript/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/marcelofarias%2Fbotscript/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/marcelofarias%2Fbotscript/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/marcelofarias","download_url":"https://codeload.github.com/marcelofarias/botscript/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/marcelofarias%2Fbotscript/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34765321,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-25T02:00:05.521Z","response_time":101,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["agents","bots","compiler","developer-tools","llm","programming-language","type-safety","typescript"],"created_at":"2026-06-25T07:30:38.851Z","updated_at":"2026-06-25T07:30:39.620Z","avatar_url":"https://github.com/marcelofarias.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"./images/botscript.svg\" alt=\"botscript\" width=\"120\" /\u003e\n\u003c/p\u003e\n\n# botscript\n\nA small TypeScript-superset language for a world where most code is written by\nmachines. Read [`MANIFESTO.md`](./MANIFESTO.md) for the why.\n\n\u003e **Live playground:** [botscript.org](https://botscript.org/)\n\u003e — type `.bs` on the left, see the desugared TypeScript on the right. The\n\u003e actual compiler bundle, running in your browser, no install required.\n\u003e\n\u003e Or run it locally: `pnpm install \u0026\u0026 pnpm play` → http://localhost:5173.\n\n## .bs vs .ts at a glance\n\nThe same program in idiomatic TypeScript and in botscript:\n\n### Async fetch with errors\n\n\u003ctable\u003e\n\u003ctr\u003e\u003cth\u003eTypeScript\u003c/th\u003e\u003cth\u003ebotscript\u003c/th\u003e\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\n\n```ts\nasync function loadUser(id: string) {\n  try {\n    const res = await fetch(`/users/${id}`);\n    if (!res.ok) throw new Error(`HTTP ${res.status}`);\n    return await res.json();\n  } catch (e) {\n    return { error: String(e) };\n  }\n}\n```\n\n\u003c/td\u003e\n\u003ctd\u003e\n\n```bs\nasync fn loadUser(id: string) uses { net }\n    -\u003e Result\u003cUser, string\u003e {\n  let res = http.get(`/users/${id}`)?\n  ok(await res.json() as User)\n}\n```\n\n\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/table\u003e\n\n### Exhaustive shape dispatch\n\n\u003ctable\u003e\n\u003ctr\u003e\u003cth\u003eTypeScript\u003c/th\u003e\u003cth\u003ebotscript\u003c/th\u003e\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\n\n```ts\nfunction area(s: Shape): number {\n  switch (s.kind) {\n    case \"Circle\": return Math.PI * s.r * s.r;\n    case \"Square\": return s.side * s.side;\n    default: throw new Error(\"unhandled\");\n  }\n}\n```\n\n\u003c/td\u003e\n\u003ctd\u003e\n\n```bs\nfn area(s: Shape) -\u003e number = match s {\n  Circle { r }    -\u003e Math.PI * r * r\n  Square { side } -\u003e side * side\n}\n```\n\n\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/table\u003e\n\n### Pure helper\n\n\u003ctable\u003e\n\u003ctr\u003e\u003cth\u003eTypeScript\u003c/th\u003e\u003cth\u003ebotscript\u003c/th\u003e\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\n\n```ts\nfunction slug(s: string): string {\n  return s.trim().toLowerCase()\n          .replaceAll(\" \", \"-\");\n}\n```\n\n\u003c/td\u003e\n\u003ctd\u003e\n\n```bs\nfn slug(s: string) -\u003e string = pure {\n  s.trim().toLowerCase().replaceAll(\" \", \"-\")\n}\n```\n\n\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/table\u003e\n\nThe `.bs` versions are not just shorter — they make properties the TS compiler can't enforce (purity, declared side effects, exhaustive matching, no thrown control-flow) part of the function signature. The whole point.\n\n## Why this is better for bots than vanilla TypeScript\n\nThe features above aren't aesthetic — each one closes off a class of bug that\nlanguage models reliably ship in TypeScript. Pick any row; that's a real failure\nthis codebase has caught more than once:\n\n| Bot failure mode in TypeScript | botscript fix |\n| ------------------------------ | ------------- |\n| Sneaks a `fetch()` into a function the human asked to be \"pure\" — survives review because the call is three layers deep. | `uses { … }` is part of the signature. A function declared with empty capabilities cannot reach the network. Under `?bs 0.1` the runtime throws on violation; under `?bs 0.2` the compiler also rejects direct stdlib refs at parse time. |\n| Forgets a `case` in a `switch` and falls into `default`. The bug ships because the `default` branch silently swallows it. | `match` has no `default` and no fallthrough. A missing arm is a parse error; an unhandled value at runtime throws with a printed scrutinee. |\n| Wraps a `Result`-shaped return in `try/catch` and accidentally swallows the `Err`, returning `undefined` from the catch. | `Result\u003cT, E\u003e` is the return type. `expr?` postfix is the *only* way to unwrap. There is no try-catch flowing-through pattern to mis-write. |\n| Generates `null` checks in some paths and `undefined` checks in others, drifting over time. | `Option\u003cT\u003e` is the only optional type. No `null`. No `undefined`. The compiler refuses to model \"missing\" two ways. |\n| Adds an `as any` cast under reviewer pressure to make the build green; the cast becomes load-bearing. | `as` outside an explicit `unsafe { }` block is a parse error. Every cast shows up in diff review with a keyword the human will see. |\n| Writes a test that depends on `Date.now()` or `Math.random()`; flake creeps in over time. | Tests run in a frame where `time` and `random` capabilities are denied by default. The `with mocks { … }` clause on `test \"…\"` is the only way to inject them, and it does so deterministically. |\n| Hallucinates a built-in or convention that doesn't exist — costs a debug cycle. | The `?primer` directive emits the canonical spec as a top-of-file comment. Any agent dropped into a botscript file cold has the entire language surface in the same file. |\n| Models a tagged union with hand-written `kind: \"Tag\"` literals and drifts between the type and the `match` arms. | (0.2+) `type Shape = Circle { r: number } \\| Square { side: number }` is native syntax. The desugaring is the discriminator the `match` arms already destructure on, so type and dispatch can't drift. |\n| Loops `compile → regex error text → patch` because the compiler only emits English prose. | `botscript build … --format=json` emits `{ ok, diagnostics: [{ code, file, line, column, message, rule, idiom, rewrite }] }`. A bot parses and patches; no regex on prose. |\n\nEvery other choice in the language is in service of one of these. If a feature\ndoesn't close a bot failure mode, it isn't here.\n\n## Real bugs this design would have prevented\n\nThese are *real, public* issues and PRs from real TypeScript projects (mostly\nMicrosoft's own TypeScript repo, since they're heavily used and the linked\nartifacts will outlive most projects). Every row is a class of bug that's\neither parse-time-impossible or signature-visible in botscript.\n\n| Real-world bug                                                                                                                                                                      | What botscript does instead |\n| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------- |\n| **Hidden `useEffect` side effect breaks SSR hydration.** [vercel/swr#2391](https://github.com/vercel/swr/pull/2391) — a hook reading from cache during streaming hydration produced a mismatch between server and client render. The side effect was buried in a hook deep in the component tree. | A function with side effects must declare `uses { net }` (etc.) in its signature. The hydration-time reader's capability set is part of the type — it can't hide three layers down. |\n| **Exhaustive switch can't actually be made exhaustive.** [microsoft/TypeScript#9838](https://github.com/microsoft/TypeScript/issues/9838), [#40160](https://github.com/microsoft/TypeScript/issues/40160), [#13467](https://github.com/microsoft/TypeScript/issues/13467) — adding a `default` case for safety silently breaks exhaustiveness narrowing. Real bugs filed against the TS compiler itself. | `match` has no `default` and no fallthrough. A new tag added to a tagged union is a parse error in every `match` that doesn't update — not a silent runtime fall-through. |\n| **`catch` clause's `unknown` was originally `any`, swallowing typed errors industry-wide.** [microsoft/TypeScript#26174](https://github.com/microsoft/TypeScript/issues/26174) — every `try { … } catch (e) { return undefined; }` returning a typed promise `Promise\u003cT\u003e` silently masked failures for years until the `useUnknownInCatchVariables` option (TS 4.0). | `Result\u003cT, E\u003e` is the return type. `expr?` is the *only* unwrap. There is no try-catch flowing-through pattern to mis-write; the error path is in the type. |\n| **TS's own null-narrowing fails through callbacks.** [microsoft/TypeScript#18244](https://github.com/microsoft/TypeScript/issues/18244) — `if (x !== null) { fn(() =\u003e x.method()) }` re-widens `x` to nullable inside the callback. Workarounds for this issue are load-bearing in real codebases. | `Option\u003cT\u003e` is the only optional type. There is no `null` and no `undefined` in business logic. A missing value is unwrapped with `match` or `?`, not narrowed across closure boundaries. |\n| **`as any` regressions ship with TypeScript itself.** [microsoft/TypeScript#56618](https://github.com/microsoft/TypeScript/issues/56618), [#45640](https://github.com/microsoft/TypeScript/issues/45640) — even Microsoft's own `.d.ts` shipping uses `any` in places that have caused regressions across versions. | `as` outside an explicit `unsafe { … }` block is a parse error. Every cast surfaces in diff review under a keyword the human will see. |\n| **Copilot routinely hallucinates methods and even whole repos.** [microsoft/vscode-copilot-release#281](https://github.com/microsoft/vscode-copilot-release/issues/281), [#1407](https://github.com/microsoft/vscode-copilot-release/issues/1407) — a model fabricates `array.removeAt`, an entire repo's contents. The code looks right; the method doesn't exist. | The `?primer` directive embeds the canonical language spec as a top-of-file comment. `STDLIB.bs` shows every feature exactly once. An agent has the entire surface in the same file before it writes a token. |\n| **Tests baked on `Date.now()` and timezone-sensitive math break years later.** GitHub's own engineering team has shipped tests that pass for three years and then fail every leap year, plus tests that break at midnight and during DST transitions ([herodevs.com](https://www.herodevs.com/blog-posts/future-proof-your-javascript-datetime-tests)). | (0.2) `test \"name\" with mocks { time, random } { … }` swaps `time.now()` for a deterministic counter and `random.next()` for a deterministic seeded RNG. Sources are restored on body exit, even on throw. |\n\nIf you've hit a bug a feature in this README would have prevented and it's\npublicly linkable, [open a PR](https://github.com/marcelofarias/botscript/pulls)\nadding a row.\n\n## What's new\n\nPer-version release notes live in [`CHANGELOG.md`](./CHANGELOG.md). `LATEST`\nis still 0.1, so existing files compile unchanged; opt into newer behaviour\nwith a `?bs 0.2` / `?bs 0.3` / `?bs 0.4` / `?bs 0.5` / `?bs 0.6` / `?bs 0.7` /\n`?bs 0.8` directive.\n\n## MCP server (for bots)\n\nA botscript-aware bot doesn't need to read this README, the manifesto, or\n`STDLIB.bs` to write correct `.bs`. Wire the MCP server into the agent's\nconfig and the language surface becomes a tool call away.\n\n**Install in Claude Code:**\n\n```sh\nclaude mcp add botscript -- npx -y @mbfarias/botscript-mcp\n```\n\n**Tools exposed:**\n\n| Tool        | Input                                  | Output                                                                                              |\n| ----------- | -------------------------------------- | --------------------------------------------------------------------------------------------------- |\n| `primer`    | (no args)                              | The canonical language primer (same text the `?primer` directive emits).                            |\n| `transform` | `{ source: string, filename?: string }` | `{ ok: true, code, forms, version, warnings: [...] }` on success, or `{ ok: false, diagnostics: [...] }` on failure. `warnings` is an array of non-blocking diagnostics (e.g. CAP003). |\n| `explain`   | `{ code: string }`                     | Long-form explanation for any stable diagnostic code (`ALI001`, `ALI002`, `ALI003`, `BS001`, `BS002`, `CAP001`–`CAP003`, `DEP001`–`DEP004`, `EFF002`–`EFF004`, `FMT001`, `INT001`–`INT005`, `MAT001`–`MAT004`, `RES001`, `RES002`, `SYN001`, `SYN002`, `SYN003`, `SYN004`, `SYN005`, `SYN006`, `SYN007`, `SYN008`, `SYN010`, `SYN011`, `SYN012`, `SYN013`, `SYN014`, `SYN016`, `SYN017`, `SYN018`, `SYN019`, `SYN022`, `SYN023`, `THR001`–`THR004`, `UNS001`–`UNS005`, `VER001`–`VER003`) plus a fails/passes example pair. |\n\nA bot's loop becomes deterministic: `transform` → if `ok=false`, read\n`diagnostics[0].code` → `explain(code)` → apply `rewrite` → `transform` again.\nNo regex on English error text.\n\n---\n\n## The one-shot prompt\n\n\u003e Copy-paste this into an LLM (Claude, Codex, Gemini, etc.) inside an **empty\n\u003e directory**. The agent will scaffold a working full-stack botscript app from\n\u003e scratch — backend, frontend, tests, the lot — without any follow-up from you.\n\n```text\nYou are creating a small full-stack app called \"shapebook\" using botscript, a\nTypeScript-superset language designed for bot-written code. Botscript files\nend in .bs and compile to TypeScript via @mbfarias/botscript-compiler.\n\nRead this once before starting:\n- README + manifesto: https://github.com/marcelofarias/botscript\n- The full language primer is the PRIMER export in\n  @mbfarias/botscript-compiler/dist/primer.js, and STDLIB.bs in the repo above\n  shows every feature exactly once. Read both before writing any .bs.\n\nStack:\n- pnpm workspace with two packages: apps/api and apps/web.\n- apps/api: Node 22, Fastify (or stock node:http), persists to ./data/shapes.json.\n- apps/web: Vite + React 18, uses @mbfarias/botscript-vite-plugin.\n- Both apps use @mbfarias/botscript-runtime for Result/Option/match.\n- All business logic in .bs files; framework glue (server bootstrap, ReactDOM)\n  may stay in .ts/.tsx.\n\nWhat \"shapebook\" does:\n- A user can submit shapes (Circle{r}, Square{side}, Triangle{base,height})\n  via a small React form, and see a list of submissions with computed area.\n- Each submission gets an auto-incrementing id and an iso timestamp.\n- The API persists submissions to disk between restarts.\n- The frontend talks to the API at http://localhost:3000.\n\nBotscript usage requirements (this is the actual test — please use them all):\n- At least one `fn ... uses { fs } -\u003e Result\u003c..., ...\u003e` for the persistence\n  layer.\n- At least one `match` expression for shape dispatch (e.g. computing area).\n- At least one `pure { ... }` block.\n- At least one `?` postfix unwrap.\n- At least three `test \"name\" { ... }` blocks across the two apps, all passing.\n\nHard rules:\n- Pin every .bs file to `?bs 0.1` at the top.\n- Never use `any`, `null`, or unchecked exceptions in business logic; use\n  Result + Option + match.\n- The frontend must show an error message when the API returns Err — never\n  swallow.\n- Run `pnpm -r build \u0026\u0026 pnpm -r test` and confirm green BEFORE you say \"done\".\n- Run the api on port 3000 and the web on port 5173, manually open the browser,\n  add one circle and one square, confirm both render with computed areas, then\n  stop the servers.\n\nDeliverables:\n- A README.md at the root that explains how to install, run, test.\n- All source committed in a single commit titled \"feat: shapebook v0\".\n- A short note at the bottom of the README listing which botscript features\n  you used and where (one line each).\n```\n\nYou can also feed this to the agent piece-by-piece if you want to watch it\nwork. The above is the minimum viable spec for an end-to-end run.\n\n---\n\n## Install (for bots)\n\n\u003e If you are an LLM wiring botscript into an existing project, the rest of this\n\u003e section is the entire contract. Pick the row that matches the project, run\n\u003e the commands, done. No questions back.\n\n| Project type     | One-liner                                                                                  |\n| ---------------- | ------------------------------------------------------------------------------------------ |\n| Vite (any)       | `pnpm add @mbfarias/botscript-runtime @mbfarias/botscript-vite-plugin`                     |\n| Babel-based      | `pnpm add @mbfarias/botscript-runtime @mbfarias/botscript-babel-plugin`                    |\n| Plain Node / TS  | `pnpm add @mbfarias/botscript-runtime \u0026\u0026 pnpm add -D @mbfarias/botscript-cli`              |\n\nThen **one** of:\n\n```ts\n// vite.config.ts\nimport botscript from \"@mbfarias/botscript-vite-plugin\";\nexport default { plugins: [botscript()] };\n```\n\n```js\n// babel.config.js\nimport { parser } from \"@mbfarias/botscript-babel-plugin\";\nexport default { parserOpts: { parser }, presets: [\"@babel/preset-typescript\"] };\n```\n\n```json\n// package.json — plain Node / TS, compile *.bs to *.ts in place\n{ \"scripts\": { \"build\": \"botscript build src \u0026\u0026 tsc\" } }\n```\n\n**Verify the wiring** in 30 seconds:\n\n1. Pick any small `.ts` file with a function — say `src/util.ts`.\n2. Rename it to `src/util.bs`. Update its imports' references in callers.\n3. Above the imports, add `?bs 0.1`. The file still typechecks.\n4. Convert one function from `function name(...) { ... }` to `fn name(...) -\u003e Type = pure { … }`. Build.\n5. If both build and tests still pass, botscript is wired.\n\nIf the project has a CLAUDE.md / AGENTS.md, append the line:\n\n```\nbotscript is enabled in this repo. The language primer is at\nnode_modules/@mbfarias/botscript-compiler/dist/primer.js (export PRIMER) — read it before\nwriting .bs.\n```\n\nThat's the whole install. Skip the rest of this README; it's for humans.\n\n---\n\n## Quick start\n\n```bash\npnpm install\npnpm test\n```\n\nTry the examples:\n\n```bash\n# Node CLI example\npnpm --filter node-app dev\n\n# React + Vite example\npnpm --filter react-app dev\n```\n\n## What it looks like\n\n```bs\n?primer\n\nimport { z } from \"zod\"\n\nfn fetchUser(id: string) uses { net } -\u003e Result\u003cUser, FetchError\u003e {\n  let res = http.get(`/users/${id}`)?\n  ok(User.parse(res.body))\n}\n\nfn normalize(name: string) -\u003e string = pure {\n  name.trim().toLowerCase()\n}\n\nfn describe(s: Shape) -\u003e string = match s {\n  Circle { r }    -\u003e `circle(${r})`\n  Square { side } -\u003e `square(${side})`\n}\n\ntest \"normalize trims and lowercases\" {\n  assert normalize(\"  HI  \") == \"hi\"\n}\n```\n\n## Conventions worth knowing\n\n- **Test files end in `.test.bs`.** `test \"name\" { … }` blocks inside non-test\n  files (e.g. `shape.bs`) re-execute every time something imports that file,\n  which inflates test counts and is almost never what you want. Keep tests in\n  dedicated `*.test.bs` files alongside the code under test.\n- **Use `.bs` extensions in imports.** With the Vite plugin, `import \"./foo.bs\"`\n  Just Works. The Vite plugin also rewrites `import \"./foo.js\"` to the `.bs`\n  sibling automatically, so you can use the TS-ESM `.js` convention if you\n  prefer (handy when you also compile to `.ts` ahead of time).\n- **JSX inside `.bs` is fine.** The Vite plugin runs your file through botscript\n  then through esbuild with `loader: \"tsx\"`. Write JSX in `.bs` like you would\n  in `.tsx`.\n- **Vitest wiring requires `globals: true`** plus the botscript Vite plugin so\n  vitest's global `test` is what `$test` forwards to. Minimal config:\n  ```ts\n  // vitest.config.ts\n  import { defineConfig } from \"vitest/config\";\n  import botscript from \"@mbfarias/botscript-vite-plugin\";\n  export default defineConfig({\n    plugins: [botscript()],\n    test: { globals: true, include: [\"src/**/*.test.bs\"] },\n  });\n  ```\n\n## Plugging into a TypeScript project\n\nThree options, all equivalent:\n\n```ts\n// Vite\nimport botscript from \"@mbfarias/botscript-vite-plugin\";\nexport default { plugins: [botscript()] };\n\n// Babel\n{\n  \"plugins\": [\"@mbfarias/botscript-babel-plugin\"]\n}\n\n// CLI (one-shot, watches *.bot)\nbotscript build src --out src   # compiles *.bs to *.ts in place\n```\n\n## Packages\n\n| Package                    | What it does                                      |\n| -------------------------- | ------------------------------------------------- |\n| `@mbfarias/botscript-runtime`       | Result/Option, match, capability registry         |\n| `@mbfarias/botscript-compiler`      | `transform(src) -\u003e ts` — the only thing that bites |\n| `@mbfarias/botscript-cli`           | `botscript build`, `botscript fmt`, `botscript primer` |\n| `@mbfarias/botscript-vite-plugin`   | Vite integration                                  |\n| `@mbfarias/botscript-babel-plugin`  | Babel integration                                 |\n\n## Status\n\nWeekend project. See the [manifesto](./MANIFESTO.md) for what is and isn't real.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmarcelofarias%2Fbotscript","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmarcelofarias%2Fbotscript","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmarcelofarias%2Fbotscript/lists"}