{"owner":"gibbok","repo":"typescript-book","hasSkills":true,"totalSkillsCount":13,"totalTokensCount":22433,"categories":["anthropic-skill","root-instruction","plugin-manifest"],"hasMcp":false,"mcpConfig":null,"found":[".agents/skills/typescript-book-review/SKILL.md","tools/.markdownlint.json","tools/package.json","AGENTS.md","tools/README.md",".agents/skills/create-typescript-news/SKILL.md","tools/tsconfig.json","tools/.vscode/launch.json","tools/.vscode/settings.json","tools/test-md/README.md","tools/test-md/README-zh_CN.md","tools/package-lock.json","tools/utilities-add-translation/README.md"],"skills":{".agents/skills/typescript-book-review/SKILL.md":"---\n\nname: typescript-book-review\ndescription: Review and editing guide for TypeScript book and reference content in the style of The Concise TypeScript Book. Use when reviewing or editing educational prose, translated or non-English content, code examples, chapters, table-of-contents entries, or Markdown formatting in this repository to identify and fix typos, grammar mistakes, formatting problems, and minor clarity issues without altering the original meaning or the book’s concise, practical, example-driven style.\n---\n\n# TypeScript Book Review\n\nUse this skill to review and edit TypeScript educational content while keeping it consistent with the rest of the book.\n\n## Review and Editing Rules\n\nReview the content carefully and make only justified corrections.\n\n* Fix spelling mistakes and typographical errors.\n* Fix grammar, punctuation, capitalization, and awkward sentence structure.\n* Fix incorrect, inconsistent, or broken Markdown formatting.\n* Make minor wording changes when they improve clarity or readability.\n* Preserve the original technical meaning and intent.\n* Do not introduce new claims, concepts, examples, recommendations, or explanations unless explicitly requested.\n* Do not substantially rewrite content that is already clear and correct.\n* Do not change the difficulty level or intended audience.\n* Do not alter valid code examples unless a correction is required.\n* Do not change identifiers, literal values, commands, or compiler options without a technical reason.\n* Never modify code merely to match a personal preference.\n* Preserve the existing structure unless a small organizational correction clearly improves readability.\n* Keep edits minimal, focused, and easy to review.\n\nWhen a sentence can be corrected in more than one way, prefer the version closest to the original wording.\n\n## Core Style\n\nMaintain a concise technical-reference style:\n\n* Explain concepts directly and avoid storytelling.\n* Use short paragraphs, usually one idea per paragraph.\n* Prefer precise, beginner-friendly language without oversimplifying TypeScript behavior.\n* Define the concept first, then explain why it matters or how TypeScript handles it.\n* State validity, errors, inference results, and runtime behavior explicitly.\n* Keep examples small and focused on one point.\n* Avoid marketing language, jokes, and lengthy historical context unless they clarify the feature.\n\n## Language and Translation\n\nUse the language requested by the user or already used by the file being edited.\n\n* Preserve the target language of translated content unless the user asks for a different language.\n* Correct grammar, spelling, punctuation, and idiomatic phrasing in the target language.\n* Keep the translation faithful to the original technical meaning.\n* Preserve TypeScript terms, identifiers, literal values, commands, compiler options, code comments, and error text unless a correction is required.\n* Do not replace established technical terms with awkward literal translations.\n* Keep examples and Markdown structure aligned with the source content when reviewing translated files.\n* If a source and translation disagree technically, preserve the TypeScript meaning and make the smallest correction needed.\n\n## Organization\n\nKeep content structured as a book chapter or reference section:\n\n* Use `##` for major topics and `###` or `####` for focused subtopics.\n* Keep headings descriptive and suitable for the table of contents.\n* Start each section with a brief explanation before showing code.\n* Split long topics into short subtopics instead of using one long section.\n* Group related examples together: basic syntax, valid usage, invalid usage, and practical notes.\n* Preserve compatibility with generated Markdown tables of contents.\n* Avoid changing headings unless the change is required to correct an error or improve clarity.\n* When changing a heading, update any corresponding table-of-contents entry or internal link.\n\n## Explanation Pattern\n\nUse this default flow when reviewing new or revised sections:\n\n1. Name the TypeScript feature or concept.\n2. Describe what it does in one or two paragraphs.\n3. Show a minimal TypeScript example.\n4. Explain the inferred type, compiler result, or runtime behavior.\n5. Add a second example only when it clarifies an edge case or common usage.\n6. End with a practical recommendation only when it follows directly from the example.\n\nPrefer direct formulations:\n\n* `TypeScript infers the type as ...`\n* `The following example is valid TypeScript code.`\n* `The following code produces an error:`\n* `This is useful when ...`\n* `At runtime, ...`\n\nDo not replace existing phrasing with these formulations when the current wording is already clear and consistent.\n\n## Code Examples\n\nReview examples for consistency without unnecessarily rewriting them:\n\n* Use fenced code blocks with `typescript`, `shell`, `json`, or `text`.\n* Add `<!-- skip -->` immediately before TypeScript snippets that are intentionally invalid, incomplete, illustrative only, or not expected to compile.\n* Use compact names such as `X`, `Y`, `Person`, `Animal`, `Dog`, or domain-neutral names when the domain is not important.\n* Prefer single-quoted strings in TypeScript examples.\n* Use inline comments to identify validity, inferred types, or compiler errors.\n* Keep comments short: `// Valid`, `// Invalid`, `// Type inferred is string`.\n* Show compiler messages in `text` blocks when the exact error helps explain the concept.\n* Avoid large applications, frameworks, or unrelated dependencies unless the section is specifically about them.\n* Preserve the behavior and educational purpose of every example.\n* Do not change code solely for stylistic consistency when doing so would create a large or unnecessary diff.\n\nExample pattern:\n\n<!-- skip -->\n```typescript\ntype X = {\n    a: string;\n};\n\nconst value: X = { a: 'a', b: 'b' }; // Invalid\n```\n\nObject literal may only specify known properties.\n\n## Markdown Conventions\n\nApply the book’s Markdown conventions consistently:\n\n* Use `*` for unordered lists.\n* Use inline code for identifiers, file names, compiler options, commands, and literal values.\n* Use links directly when they provide useful reference material.\n* Use `Notes:` only for short, concrete notes.\n* Use markdownlint comments sparingly and only when a formatting exception is necessary.\n* Do not add extra frontmatter to book chapters unless the repository format requires it.\n* Fix malformed lists, code fences, links, headings, spacing, and indentation.\n* Preserve intentional Markdown exceptions when they are required by the repository tooling.\n\n## TypeScript Content Conventions\n\nWhen reviewing TypeScript explanations:\n\n* Distinguish compile-time type checking from JavaScript runtime behavior.\n* Mention type erasure when runtime behavior could otherwise be misunderstood.\n* Prefer examples that demonstrate inference, assignability, narrowing, structural typing, configuration, or emitted JavaScript behavior.\n* When discussing migrations, recommend gradual migration and avoid refactoring during type conversion.\n* When discussing configuration, explain the option’s effect and give a practical default only when the recommendation is clear.\n* Avoid asserting version-specific behavior unless it has been verified against the repository’s target TypeScript version.\n* Do not alter technical statements unless the original statement is incorrect, misleading, or unclear.\n* Verify technical corrections before applying them.\n\n## Table of Contents and Headings\n\nTreat heading and table-of-contents consistency as a critical review requirement.\n\n* Confirm every table-of-contents entry matches its corresponding heading.\n* Confirm heading text, capitalization, punctuation, and anchor generation remain compatible.\n* Avoid special characters in table-of-contents entries unless the matching heading requires them.\n* Keep table-of-contents entries plain and compatible with generated Markdown anchors.\n* Check all changed headings against the table of contents at least twice.\n* Check all changed table-of-contents entries against their headings at least twice.\n* Confirm renamed, added, moved, or removed sections are reflected correctly.\n* Confirm internal links still point to valid headings.\n* Do not change a heading without checking every related table-of-contents entry and internal reference.\n\n## Review Checklist\n\nBefore finishing a review:\n\n* Confirm all spelling and typographical errors have been corrected.\n* Confirm grammar, punctuation, and capitalization are correct.\n* Confirm translated or non-English content uses the requested language consistently when applicable.\n* Confirm minor wording changes preserve the original meaning.\n* Confirm no unnecessary rewriting or expansion was introduced.\n* Confirm the heading level fits the surrounding chapter structure.\n* Confirm examples are minimal and directly support the explanation.\n* Confirm code examples retain their original behavior and purpose.\n* Confirm invalid or illustrative snippets use `<!-- skip -->`.\n* Confirm code fences use the correct language.\n* Confirm Markdown formatting is valid and consistent.\n* Confirm prose is concise, direct, and free of unrelated background.\n* Confirm table-of-contents compatibility when headings were added, removed, moved, or renamed.\n* Confirm table-of-contents entries avoid unnecessary special characters.\n* Confirm headings, table-of-contents entries, anchors, and internal links were checked twice.\n* Review the final diff and remove any change that is unnecessary or alters the original meaning.\n","tools/.markdownlint.json":"{\n    \"code-block-style\": {\n        \"style\": \"fenced\"\n    },\n    \"code-fence-style\": {\n        \"style\": \"backtick\"\n    },\n    \"emphasis-style\": {\n        \"style\": \"asterisk\"\n    },\n    \"fenced-code-language\": {\n        \"allowed_languages\": [\n            \"shell\",\n            \"json\",\n            \"typescript\",\n            \"javascript\",\n            \"text\"\n        ],\n        \"language_only\": true\n    },\n    \"heading-style\": {\n        \"style\": \"atx\"\n    },\n    \"hr-style\": {\n        \"style\": \"---\"\n    },\n    \"line-length\": false,\n    \"no-duplicate-heading\": {\n        \"siblings_only\": true\n    },\n    \"ol-prefix\": {\n        \"style\": \"ordered\"\n    },\n    \"proper-names\": {\n        \"code_blocks\": false,\n        \"names\": [\n            \"TypeScript\",\n            \"Ctrl\",\n            \"JavaScript\",\n            \"Markdown\",\n            \"Node.js\",\n            \"Visual Studio Code\",\n            \"Microsoft\",\n            \"LinkedIn\",\n            \"GitHub\",\n            \"Twitter\",\n            \"Email\",\n            \"IntelliSense\",\n            \"ECMAScript\"\n        ]\n    },\n    \"required-headings\": false,\n    \"strong-style\": {\n        \"style\": \"asterisk\"\n    },\n    \"ul-style\": {\n        \"style\": \"asterisk\"\n    }\n}","tools/package.json":"{\n  \"name\": \"typescript-book\",\n  \"version\": \"1.0.0\",\n  \"description\": \"The Concise TypeScript Book provides a comprehensive and succinct overview of TypeScript's capabilities. It offers clear explanations covering all aspects found in the latest version of the language, from its powerful type system to advanced features. Whether you're a beginner or an experienced developer, this book is an invaluable resource to enhance your understanding and proficiency in TypeScript.\",\n  \"main\": \"index.js\",\n  \"scripts\": {\n    \"format\": \"ts-node format\",\n    \"compile\": \"ts-node compile\",\n    \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\",\n    \"lint\": \"ts-node lint\",\n    \"lint:md\": \"markdownlint --ignore \\\"../AGENTS.md\\\" --ignore \\\"../.agents/**\\\" \\\"./*.md\\\" \\\"../*.md\\\"\",\n    \"check\": \"npm run lint && npm run lint:md && npm run format && npm run compile\"\n  },\n  \"author\": \"\",\n  \"license\": \"ISC\",\n  \"devDependencies\": {\n    \"@types/fs-extra\": \"^11.0.4\",\n    \"@types/marked\": \"^5.0.0\",\n    \"@types/node\": \"^20.19.43\",\n    \"@types/prettier\": \"^3.0.0\",\n    \"fp-ts\": \"^2.16.11\",\n    \"fs-extra\": \"^11.4.1\",\n    \"markdownlint-cli\": \"^0.35.0\",\n    \"marked\": \"^5.1.2\",\n    \"prettier\": \"^3.9.10\",\n    \"ts-node\": \"^10.9.2\",\n    \"typescript\": \"^5.4.5\"\n  }\n}\n","AGENTS.md":"# AGENTS.md\n\nFor review and editing work in this repository, use [.agents/skills/typescript-book-review/SKILL.md](.agents/skills/typescript-book-review/SKILL.md).\n\nThis guidance is for correcting TypeScript book content, Markdown, headings, and examples while keeping changes minimal and preserving the original meaning.\n\nFor creating TypeScript news pages, use [.agents/skills/create-typescript-news/SKILL.md](.agents/skills/create-typescript-news/SKILL.md).\n\nThis workflow requires user-provided source content, creates and synchronizes concise news pages for every website language, files them under the correct year, and verifies each article against its original source.\n","tools/README.md":"# Tools for Working with Markdown Books\n\nIf you're working with Markdown books, here are some essential tools and commands to help you streamline your workflow.\n\n## Installation\n\nThe Docker workflow provides all dependencies required to generate and verify the\nbooks. With Docker running, use this command from `tools`:\n\n```shell\nmake docker-books\n```\n\nThe repository is mounted into the container, so generated EPUB and PDF files are\nwritten directly to the local `downloads` folder. The Docker image is built on the\nfirst command and reused on subsequent commands. Its Node.js dependencies stay\ninside the container. It includes EPUBCheck 5.3.0 and invokes it through a Java\nwrapper, so EPUB validation works when invoked by Python without leaving cache files\nin the checkout. The Noto fonts required for PDF generation are stored in\n`tools/fonts` and copied into the image during the build.\n\n### Local installation\n\nTo run the tools without Docker, ensure Node.js is installed. Then set up the\nrequired dependencies with the following commands:\n\nIn folder `tools` and `website`:\n\n```shell\nnvm use\nnpm install\n```\n\n```shell\nbrew install pandoc\nbrew install epubcheck\nbrew install poppler\nbrew install --cask calibre\n```\n\n## Commands\n\nUse `make` to run the main commands:\n\n* `make format`: Format Markdown files for books.\n* `make check`: Run several checks to ensure the Markdown files are valid.\n* `make website`: Create different Markdown pages for the website.\n* `make website-preview`: Build and preview website locally.\n* `make website-e2e`: Build the production website and run its core Playwright end-to-end tests.\n* `make website-deploy`: Build and deploy website to GitHub Pages.\n* `make books`: Create EPUB and PDF books.\n* `make verify-books`: Verify the generated EPUB and PDF files.\n* `make docker-books`: Build the Docker image and create EPUB and PDF books in the local `downloads` folder.\n\n### Website End-to-End Tests\n\nThe Playwright suite covers only the website's main reader journeys: loading readable\nbook content, using the right-side page navigation, and finding content with search.\n\nInstall the browser once from the `website` folder:\n\n```shell\nnpx playwright install chromium\n```\n\nThen run the production build and tests from the `tools` folder:\n\n```shell\nmake website-e2e\n```\n\nPlaywright saves an HTML report, screenshots, and videos for each run. In pull\nrequests, CI uploads this evidence, links it from a single updated PR comment, and\ndeletes the uploaded artifacts after the PR is merged.\n\n### Formatting\n\nConsistent code formatting is crucial. To format all TypeScript snippets, we use Prettier. Execute the following command for formatting:\n\n```shell\nnpm run format\n```\n\n### Compilation\n\nTo compile TypeScript snippets within the Markdown files, utilize the following command:\n\n```shell\nnpm run compile\n```\n\n### Linting\n\nTo ensure that your Markdown files adhere to proper formatting rules, use the linting command:\n\n```shell\nnpm run lint:md\n```\n\n### Linting and Formatting\n\nFor a comprehensive process that includes linting all Markdown files, applying Prettier formatting to all TypeScript snippets, and compiling them using TypeScript, use the following command:\n\n```shell\nnpm run check\n```\n\nThe project uses the [Markdown All in One](https://marketplace.visualstudio.com/items?itemName=yzhang.markdown-all-in-one)Visual Studio Code extension to automatically update the table of contents.\n\nUse the following command to install it:\n\n```shell\ncode --install-extension yzhang.markdown-all-in-one\n```\n\n### Skipping Compilation\n\nIf you have specific snippets in the Markdown files that you don't want to compile, simply add `<!-- skip -->` just before the TypeScript demarcation for those snippets.\n\n### EPUB and PDF Generation\n\nTo generate EPUB and PDF files from your Markdown books, navigate to the `tools` folder and run the following command:\n\n```shell\nmake books\n```\n\nThe verification step uses `pdfinfo` for page totals and `pdffonts` to require the\nappropriate embedded Noto families for every locale. It rejects legacy Georgia,\nVerdana, Menlo, Apple, Times New Roman, and STSongti embeddings.\n\nTo regenerate every artifact with the container toolchain, run:\n\n```shell\nmake docker-books\n```\n\n### Tagging\n\nUse this tag format for TypeScript 7 book releases:\n\n```shell\ngit switch main\ngit pull origin main\ngit tag -a typescript-7-book-v1 -m \"TypeScript 7 book, revision 1\"\ngit push origin typescript-7-book-v1\n```\n\nThese tools will assist you in efficiently working with Markdown books and ensure a smooth and organized process. Happy writing!\n\n## Debug EPUB Issues\n\nTo debug the EPUB files you create, follow these steps:\n\nFirst, download and install Sigil. You can use the following command to install Sigil:\n\n```shell\nbrew install --cask sigil\n```\n\nNext, run an EPUB check to validate your EPUB file. For example:\n\n```shell\nepubcheck ../downloads/typescript-book.epub\n```\n\nFinally, open the EPUB file using Sigil for detailed inspection.\n\n## How to Contribute to This E-Book\n\nTo contribute to this e-book, follow these steps:\n\n* Update the main Markdown file with your changes.\n* Run `make check` to ensure the linter and other checks pass.\n* Preview the website locally with `make website-preview` to make sure it works as expected.\n* Generate the e-books by running `make books`.\n* Submit your PR and share your awesome contributions!\n",".agents/skills/create-typescript-news/SKILL.md":"---\nname: create-typescript-news\ndescription: Create and synchronize concise, source-faithful TypeScript news pages for every language configured in this repository's Astro/Starlight website. Use when asked to add, publish, translate, edit, remove, audit, or synchronize news in website/src/content/docs/typescript-news, or when a website language is added. Require an explicit source/context handoff before creating or materially editing a news item; the handoff may come from the user or from a preceding research workflow requested by the user containing verified sources, dates, and findings.\n---\n\n# Create TypeScript News\n\nCreate a TypeScript news article only from explicit source/context input, then translate and file it consistently across every configured website language.\n\n## Require source/context input\n\nBefore drafting or editing files, confirm that explicit source/context input is available. It may be either:\n\n* source content or announcement text supplied directly by the user; or\n* a research handoff produced by a preceding research step that the user explicitly requested, containing the selected topic, original authoritative source URL(s), publication date(s), and the factual findings to use.\n\nA research handoff is valid source/context input only when it identifies the original authoritative source and preserves enough factual detail to verify the article. Prefer official TypeScript, Microsoft, TC39, GitHub, and maintainer sources. Do not treat general model memory or an uncited topic suggestion as source/context input.\n\nIf neither form of source/context input is available, ask for:\n\n* the source content or announcement text;\n* the original source URL, if the user wants to provide it;\n* the publication date;\n* an optional preferred title or slug.\n\nStop after asking. Do not independently select a topic unless the user's workflow explicitly includes a preceding research-and-handoff step.\n\nIf source/context input is present but the publication date is missing and cannot be verified from the authoritative source, ask for it because the date determines the year directory and archive. The original source URL is optional only for directly user-supplied source content; a research handoff must include its original authoritative source URL(s).\n\nFor a translation audit, language addition, or removal, the existing English articles and any cited sources are the supplied content. Ask the user only when the master content or intended change is missing or ambiguous.\n\n## Inspect the current structure\n\nBefore writing:\n\n1. Read `website/src/config/locales.ts` to identify every configured locale. Do not hard-code the locale list.\n2. Read the latest English and translated files under `website/src/content/docs/typescript-news/`.\n3. Read `.agents/skills/typescript-book-review/SKILL.md` completely and apply its review, style, translation, and Markdown rules.\n4. Preserve the existing Astro/Starlight content conventions and use the shared news-list implementation.\n\n## Keep every language synchronized\n\nTreat the English `website/src/content/docs/typescript-news/` tree as the master and canonical news inventory. All translations must follow the English version's factual content, structure, metadata, year, and slug. Compare article paths relative to the English directory with the corresponding tree for every non-root locale configured in `website/src/config/locales.ts`.\n\nEvery English news article must have one translated article at the same relative year and slug path in every configured non-root locale. Do not rely on Starlight's content fallback to display English in place of a missing translation.\n\nApply changes across the entire language set:\n\n* When adding an article, create it in English and every configured non-root locale. The latest-news landing pages and yearly archives discover it automatically; do not add manual article lists to those pages.\n* When materially editing an article, apply the same factual change to every translation.\n* When changing a title, description, publication date, year, slug, source, or frontmatter field, make the corresponding change in every language.\n* When intentionally removing an English article, delete its translated file from every non-root locale.\n* When a localized article has no canonical English article, remove the orphaned file as part of synchronization.\n* When a new locale is added to `website/src/config/locales.ts`, create its localized news landing page, translate the complete English news archive, and create one localized yearly archive page for every year containing English articles.\n* When a locale is removed from `website/src/config/locales.ts`, do not treat its former files as a supported translation. Follow the scope of the locale-removal request for deleting the obsolete locale tree.\n\nKeep the set of relative article paths identical across English and every configured non-root locale. Preserve localized prose, but keep factual meaning, dates, slugs, commands, source URLs, and frontmatter synchronized.\n\n## Verify the source\n\nTreat the explicit source/context input as the authoritative basis for the article. When a research handoff is used, reopen and verify its original authoritative source URL(s) before publication.\n\n* Compare every date, version, feature, compatibility note, command, package name, option, number, and performance claim with the original source.\n* Open the supplied or handed-off source URL when accessible, giving preference to official TypeScript, Microsoft, TC39, GitHub, and maintainer sources.\n* Do not add claims from memory or infer unannounced behavior.\n* Remove details that cannot be supported by the source.\n* If the source/context conflicts with the original source or remains ambiguous, ask the user before publishing the disputed claim.\n* Link the original source in the article's `Source` section when a URL is available. Omit that section only when directly user-supplied source content has no URL.\n\n## Write the English article\n\nWrite a useful, concise summary rather than reproducing the source.\n\n* Lead with what was announced and why it matters to TypeScript developers.\n* Prefer short paragraphs and direct technical language.\n* Include only sections supported by the source. Use headings such as `## What changed`, `## Compatibility`, and `## Source` when they add value.\n* Preserve commands, package names, identifiers, compiler options, code, version numbers, and URLs exactly.\n* Avoid marketing language, speculation, filler, and lengthy history.\n* Use the publication date for both `lastUpdated` and `article:published_time` unless the source/context supplies a distinct verified update date.\n\nUse the established frontmatter pattern:\n\n```yaml\n---\ntitle: Article title\ndescription: A concise, source-supported description.\nlastUpdated: YYYY-MM-DD\nsidebar:\n    hidden: true\nhead:\n    - tag: meta\n      attrs:\n          property: article:published_time\n          content: 'YYYY-MM-DD'\n---\n```\n\nDo not add `sidebar.order` to news articles. Starlight hides individual articles from autogenerated sidebars through `sidebar.hidden: true`. Year links are generated from the English news-year directories and sorted newest first in `website/astro.config.mjs`.\n\n## Automatic latest-news lists and yearly archives\n\nThe shared `website/src/components/NewsList.astro` component reads the Starlight `docs` content collection at build time. It filters articles by locale and, for an archive, by year. It uses `article:published_time` as the publication date, sorts newest first, and uses the canonical English slug as the deterministic tie-breaker for articles published on the same date.\n\n* Keep each localized news landing page at `typescript-news/index.mdx`. It renders the latest 11 articles automatically; do not add, remove, or reorder article entries manually.\n* Keep one localized archive page at `typescript-news/YYYY/index.mdx` for every year with published English articles. Its localized title and description are page metadata; its `<NewsList locale=\"LOCALE\" year={YYYY} />` renders the localized article list automatically.\n* When the first article for a new year is added, create that year's archive page in English and every configured non-root locale. Do not edit older archive pages or article files just to update navigation order.\n* The news sidebar contains only year links. Its section label is read from each locale's news landing page title.\n\nRun the bundled verifier and focused list tests from the repository root after every news or locale change:\n\n```shell\npython3 .agents/skills/create-typescript-news/scripts/verify_news.py\nnpm --prefix website run test:news\n```\n\nThe verifier reads `website/src/config/locales.ts` and checks article path parity, valid publication dates, year-directory consistency, matching dates across translations, localized landing/archive pages, hidden article navigation, and the absence of `sidebar.order` metadata. The tests cover descending year order, newest-first article sorting, deterministic slug tie-breaking, and localized entries. Correct content or implementation issues rather than weakening the checks.\n\n## Save by publication year\n\nCreate the English article at:\n\n```text\nwebsite/src/content/docs/typescript-news/YYYY/article-slug.md\n```\n\nDerive `YYYY` from the verified publication date. Use a short, lowercase, hyphenated slug. Do not place article files directly in `typescript-news/`.\n\nCreate each translation at:\n\n```text\nwebsite/src/content/docs/LOCALE/typescript-news/YYYY/article-slug.md\n```\n\n## Create every translation\n\nFor each non-root locale configured in `website/src/config/locales.ts`:\n\n* Translate the title, description, headings, and prose naturally. The shared list formats publication dates using the locale's language tag.\n* Keep the same year, slug, publication date, frontmatter structure, Markdown structure, factual scope, and source URL, when present, as the English article.\n* Preserve commands, code, packages, options, identifiers, version numbers, and product names.\n* Do not translate official announcement titles inside source links unless the linked page itself uses that title.\n* Keep each translation faithful to the reviewed English article and the original source.\n\nThe landing-page and archive article lists are generated from content metadata, so do not edit them when adding an article.\n\n## Self-review\n\nReview the completed English article and every translation before building:\n\n1. Recheck each factual statement against the explicit source/context input and original source.\n2. Confirm no unsupported claim, date, number, command, package, or compatibility statement was introduced.\n3. Confirm the summary is useful and as concise as the subject permits.\n4. Confirm every translation preserves the English article's technical meaning.\n5. Confirm all configured locales have the article and matching publication metadata.\n6. Confirm paths, slugs, dates, source links, and frontmatter match across languages.\n7. Confirm Markdown follows `.agents/skills/typescript-book-review/SKILL.md`.\n8. Compare the complete English article inventory with every configured locale and confirm the relative path sets are identical.\n9. Confirm every added or edited English fact is reflected accurately in every translation.\n10. Confirm removed articles no longer exist in any configured language.\n11. Run `scripts/verify_news.py` and `npm --prefix website run test:news` and confirm both checks pass.\n12. Confirm a new-year archive page exists in every configured locale when the publication year is new.\n\nCorrect any issue found, then perform the source and translation accuracy comparison once more.\n\n## Validate the website\n\nFrom `website/`, run:\n\n```shell\nnpm run build\n```\n\nVerify:\n\n* the news verifier and focused list tests pass;\n* Astro reports no content or build errors;\n* the TypeScript News sidebar displays only years, newest first, with no individual article links;\n* clicking a year opens its localized archive page, and archive article links open the existing localized article URLs;\n* yearly archives and the latest-news landing page display localized articles in the expected order;\n* the English and every localized route are generated under the correct year, including Arabic with its RTL direction;\n* existing article canonical URLs, descriptions, and `article:published_time` metadata remain correct;\n* existing article routes and archive routes appear in the generated sitemap;\n* no duplicate article routes or unexpected missing routes are introduced.\n\nReport the created paths, source used, accuracy review, and build result. Commit or publish changes only when the user requests it.\n","tools/tsconfig.json":"{\n  \"compilerOptions\": {\n    \"target\": \"es2022\",\n    \"module\": \"commonjs\",\n    \"noImplicitAny\": true,\n    \"esModuleInterop\": true,\n    \"noEmitOnError\": true,\n    \"moduleDetection\": \"force\",\n    \"noUnusedLocals\": false,\n    \"forceConsistentCasingInFileNames\": true,\n    \"strict\": true,\n    \"skipLibCheck\": true,\n    \"lib\": [\n      \"es2022\",\n      \"esnext.disposable\",\n      \"esnext.decorators\",\n      \"dom\"\n    ]\n  }\n}","tools/.vscode/launch.json":"{\n    \"version\": \"0.2.0\",\n    \"configurations\": [\n        {\n            \"name\": \"Debug lint\",\n            \"type\": \"node\",\n            \"request\": \"launch\",\n            \"runtimeExecutable\": \"node\",\n            \"runtimeArgs\": [\n                \"--nolazy\",\n                \"-r\",\n                \"${workspaceRoot}/node_modules/ts-node/register/transpile-only\"\n            ],\n            \"args\": [\n                \"lint.ts\",\n                \"--example\",\n                \"hello\"\n            ],\n            \"cwd\": \"${workspaceRoot}\",\n            \"internalConsoleOptions\": \"openOnSessionStart\",\n            \"skipFiles\": [\n                \"<node_internals>/**\",\n                \"node_modules/**\"\n            ]\n        },\n        {\n            \"name\": \"Python: Current File\",\n            \"type\": \"python\",\n            \"request\": \"launch\",\n            \"program\": \"${file}\",\n            \"console\": \"integratedTerminal\",\n            \"justMyCode\": true\n        }\n    ]\n}","tools/.vscode/settings.json":"{\n    \"editor.formatOnSave\": true,\n}","tools/test-md/README.md":"# The Concise TypeScript Book\nA Concise Guide to Effective Development in TypeScript. **Free and Open Source**.\n## Create files and folders\nThe file explorer is accessible using the button.\n## Switch to another file\nAll your files and folders are presented as a tree in the file explorer. You can switch from one to another by clicking a file in the tree.\n### New title\nSome parent content.\n#### Nested content 1\nMore content here.\n##### Nested content 2\nEven more content.","tools/test-md/README-zh_CN.md":"# 简洁 TypeScript 书\nTypeScript 有效开发简明指南。 **免费和开源**。\n## 创建文件和文件夹\n可使用 按钮访问文件资源管理器。\n## 切换到另一个文件\n您的所有文件和文件夹都在文件资源管理器中显示为树。 您可以通过单击树中的文件从一个文件切换到另一个文件。\n### 新标题\n一些家长内容。\n#### 嵌套内容 1\n更多内容在这里。\n##### 嵌套内容 2\n内容甚至更多。","tools/package-lock.json":"{\n  \"name\": \"typescript-book\",\n  \"version\": \"1.0.0\",\n  \"lockfileVersion\": 3,\n  \"requires\": true,\n  \"packages\": {\n    \"\": {\n      \"name\": \"typescript-book\",\n      \"version\": \"1.0.0\",\n      \"license\": \"ISC\",\n      \"devDependencies\": {\n        \"@types/fs-extra\": \"^11.0.4\",\n        \"@types/marked\": \"^5.0.0\",\n        \"@types/node\": \"^20.19.43\",\n        \"@types/prettier\": \"^3.0.0\",\n        \"fp-ts\": \"^2.16.11\",\n        \"fs-extra\": \"^11.4.1\",\n        \"markdownlint-cli\": \"^0.35.0\",\n        \"marked\": \"^5.1.2\",\n        \"prettier\": \"^3.9.10\",\n        \"ts-node\": \"^10.9.2\",\n        \"typescript\": \"^5.4.5\"\n      }\n    },\n    \"node_modules/@cspotcode/source-map-support\": {\n      \"version\": \"0.8.1\",\n      \"resolved\": \"https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz\",\n      \"integrity\": \"sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@jridgewell/trace-mapping\": \"0.3.9\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      }\n    },\n    \"node_modules/@isaacs/cliui\": {\n      \"version\": \"8.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz\",\n      \"integrity\": \"sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"string-width\": \"^5.1.2\",\n        \"string-width-cjs\": \"npm:string-width@^4.2.0\",\n        \"strip-ansi\": \"^7.0.1\",\n        \"strip-ansi-cjs\": \"npm:strip-ansi@^6.0.1\",\n        \"wrap-ansi\": \"^8.1.0\",\n        \"wrap-ansi-cjs\": \"npm:wrap-ansi@^7.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      }\n    },\n    \"node_modules/@jridgewell/resolve-uri\": {\n      \"version\": \"3.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz\",\n      \"integrity\": \"sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=6.0.0\"\n      }\n    },\n    \"node_modules/@jridgewell/sourcemap-codec\": {\n      \"version\": \"1.4.15\",\n      \"resolved\": \"https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz\",\n      \"integrity\": \"sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==\",\n      \"dev\": true\n    },\n    \"node_modules/@jridgewell/trace-mapping\": {\n      \"version\": \"0.3.9\",\n      \"resolved\": \"https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz\",\n      \"integrity\": \"sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@jridgewell/resolve-uri\": \"^3.0.3\",\n        \"@jridgewell/sourcemap-codec\": \"^1.4.10\"\n      }\n    },\n    \"node_modules/@pkgjs/parseargs\": {\n      \"version\": \"0.11.0\",\n      \"resolved\": \"https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz\",\n      \"integrity\": \"sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==\",\n      \"dev\": true,\n      \"optional\": true,\n      \"engines\": {\n        \"node\": \">=14\"\n      }\n    },\n    \"node_modules/@tsconfig/node10\": {\n      \"version\": \"1.0.9\",\n      \"resolved\": \"https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz\",\n      \"integrity\": \"sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==\",\n      \"dev\": true\n    },\n    \"node_modules/@tsconfig/node12\": {\n      \"version\": \"1.0.11\",\n      \"resolved\": \"https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz\",\n      \"integrity\": \"sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==\",\n      \"dev\": true\n    },\n    \"node_modules/@tsconfig/node14\": {\n      \"version\": \"1.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz\",\n      \"integrity\": \"sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==\",\n      \"dev\": true\n    },\n    \"node_modules/@tsconfig/node16\": {\n      \"version\": \"1.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz\",\n      \"integrity\": \"sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==\",\n      \"dev\": true\n    },\n    \"node_modules/@types/fs-extra\": {\n      \"version\": \"11.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/@types/fs-extra/-/fs-extra-11.0.4.tgz\",\n      \"integrity\": \"sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@types/jsonfile\": \"*\",\n        \"@types/node\": \"*\"\n      }\n    },\n    \"node_modules/@types/jsonfile\": {\n      \"version\": \"6.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/@types/jsonfile/-/jsonfile-6.1.1.tgz\",\n      \"integrity\": \"sha512-GSgiRCVeapDN+3pqA35IkQwasaCh/0YFH5dEF6S88iDvEn901DjOeH3/QPY+XYP1DFzDZPvIvfeEgk+7br5png==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@types/node\": \"*\"\n      }\n    },\n    \"node_modules/@types/marked\": {\n      \"version\": \"5.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/@types/marked/-/marked-5.0.0.tgz\",\n      \"integrity\": \"sha512-YcZe50jhltsCq7rc9MNZC/4QB/OnA2Pd6hrOSTOFajtabN+38slqgDDCeE/0F83SjkKBQcsZUj7VLWR0H5cKRA==\",\n      \"dev\": true\n    },\n    \"node_modules/@types/node\": {\n      \"version\": \"20.19.43\",\n      \"resolved\": \"https://registry.npmjs.org/@types/node/-/node-20.19.43.tgz\",\n      \"integrity\": \"sha512-6oYBAi5ikg4Pl+kGsoYtawUMBT2zZMCvPNF7pVLnHZfd1zf38DRiWn/gT01RYCdUqkv7Fhr+C9ot4/tb+2sVvA==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"undici-types\": \"~6.21.0\"\n      }\n    },\n    \"node_modules/@types/prettier\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/@types/prettier/-/prettier-3.0.0.tgz\",\n      \"integrity\": \"sha512-mFMBfMOz8QxhYVbuINtswBp9VL2b4Y0QqYHwqLz3YbgtfAcat2Dl6Y1o4e22S/OVE6Ebl9m7wWiMT2lSbAs1wA==\",\n      \"deprecated\": \"This is a stub types definition. prettier provides its own type definitions, so you do not need this installed.\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"prettier\": \"*\"\n      }\n    },\n    \"node_modules/acorn\": {\n      \"version\": \"8.9.0\",\n      \"resolved\": \"https://registry.npmjs.org/acorn/-/acorn-8.9.0.tgz\",\n      \"integrity\": \"sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ==\",\n      \"dev\": true,\n      \"bin\": {\n        \"acorn\": \"bin/acorn\"\n      },\n      \"engines\": {\n        \"node\": \">=0.4.0\"\n      }\n    },\n    \"node_modules/acorn-walk\": {\n      \"version\": \"8.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz\",\n      \"integrity\": \"sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=0.4.0\"\n      }\n    },\n    \"node_modules/ansi-regex\": {\n      \"version\": \"6.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz\",\n      \"integrity\": \"sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/chalk/ansi-regex?sponsor=1\"\n      }\n    },\n    \"node_modules/ansi-styles\": {\n      \"version\": \"6.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz\",\n      \"integrity\": \"sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/chalk/ansi-styles?sponsor=1\"\n      }\n    },\n    \"node_modules/arg\": {\n      \"version\": \"4.1.3\",\n      \"resolved\": \"https://registry.npmjs.org/arg/-/arg-4.1.3.tgz\",\n      \"integrity\": \"sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==\",\n      \"dev\": true\n    },\n    \"node_modules/argparse\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz\",\n      \"integrity\": \"sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==\",\n      \"dev\": true\n    },\n    \"node_modules/balanced-match\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz\",\n      \"integrity\": \"sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==\",\n      \"dev\": true\n    },\n    \"node_modules/brace-expansion\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz\",\n      \"integrity\": \"sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"balanced-match\": \"^1.0.0\"\n      }\n    },\n    \"node_modules/color-convert\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz\",\n      \"integrity\": \"sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"color-name\": \"~1.1.4\"\n      },\n      \"engines\": {\n        \"node\": \">=7.0.0\"\n      }\n    },\n    \"node_modules/color-name\": {\n      \"version\": \"1.1.4\",\n      \"resolved\": \"https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz\",\n      \"integrity\": \"sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==\",\n      \"dev\": true\n    },\n    \"node_modules/commander\": {\n      \"version\": \"11.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/commander/-/commander-11.0.0.tgz\",\n      \"integrity\": \"sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=16\"\n      }\n    },\n    \"node_modules/create-require\": {\n      \"version\": \"1.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz\",\n      \"integrity\": \"sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==\",\n      \"dev\": true\n    },\n    \"node_modules/cross-spawn\": {\n      \"version\": \"7.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz\",\n      \"integrity\": \"sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"path-key\": \"^3.1.0\",\n        \"shebang-command\": \"^2.0.0\",\n        \"which\": \"^2.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 8\"\n      }\n    },\n    \"node_modules/deep-extend\": {\n      \"version\": \"0.6.0\",\n      \"resolved\": \"https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz\",\n      \"integrity\": \"sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=4.0.0\"\n      }\n    },\n    \"node_modules/diff\": {\n      \"version\": \"4.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/diff/-/diff-4.0.2.tgz\",\n      \"integrity\": \"sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=0.3.1\"\n      }\n    },\n    \"node_modules/eastasianwidth\": {\n      \"version\": \"0.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz\",\n      \"integrity\": \"sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==\",\n      \"dev\": true\n    },\n    \"node_modules/emoji-regex\": {\n      \"version\": \"9.2.2\",\n      \"resolved\": \"https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz\",\n      \"integrity\": \"sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==\",\n      \"dev\": true\n    },\n    \"node_modules/entities\": {\n      \"version\": \"3.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/entities/-/entities-3.0.1.tgz\",\n      \"integrity\": \"sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=0.12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/fb55/entities?sponsor=1\"\n      }\n    },\n    \"node_modules/foreground-child\": {\n      \"version\": \"3.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz\",\n      \"integrity\": \"sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"cross-spawn\": \"^7.0.0\",\n        \"signal-exit\": \"^4.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=14\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/isaacs\"\n      }\n    },\n    \"node_modules/fp-ts\": {\n      \"version\": \"2.16.11\",\n      \"resolved\": \"https://registry.npmjs.org/fp-ts/-/fp-ts-2.16.11.tgz\",\n      \"integrity\": \"sha512-LaI+KaX2NFkfn1ZGHoKCmcfv7yrZsC3b8NtWsTVQeHkq4F27vI5igUuO53sxqDEa2gNQMHFPmpojDw/1zmUK7w==\",\n      \"dev\": true,\n      \"license\": \"MIT\"\n    },\n    \"node_modules/fs-extra\": {\n      \"version\": \"11.4.1\",\n      \"resolved\": \"https://registry.npmjs.org/fs-extra/-/fs-extra-11.4.1.tgz\",\n      \"integrity\": \"sha512-KYAb4c9BJQI6QqGKthV68OHe0badztdXJWKo0WtBA9IuCFPTKvE5ZdUBglP833aMjhaSPNO4A5j/EkzZtGlKjA==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"graceful-fs\": \"^4.2.0\",\n        \"jsonfile\": \"^6.0.1\",\n        \"universalify\": \"^2.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=14.14\"\n      }\n    },\n    \"node_modules/get-stdin\": {\n      \"version\": \"9.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/get-stdin/-/get-stdin-9.0.0.tgz\",\n      \"integrity\": \"sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/glob\": {\n      \"version\": \"10.2.7\",\n      \"resolved\": \"https://registry.npmjs.org/glob/-/glob-10.2.7.tgz\",\n      \"integrity\": \"sha512-jTKehsravOJo8IJxUGfZILnkvVJM/MOfHRs8QcXolVef2zNI9Tqyy5+SeuOAZd3upViEZQLyFpQhYiHLrMUNmA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"foreground-child\": \"^3.1.0\",\n        \"jackspeak\": \"^2.0.3\",\n        \"minimatch\": \"^9.0.1\",\n        \"minipass\": \"^5.0.0 || ^6.0.2\",\n        \"path-scurry\": \"^1.7.0\"\n      },\n      \"bin\": {\n        \"glob\": \"dist/cjs/src/bin.js\"\n      },\n      \"engines\": {\n        \"node\": \">=16 || 14 >=14.17\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/isaacs\"\n      }\n    },\n    \"node_modules/graceful-fs\": {\n      \"version\": \"4.2.11\",\n      \"resolved\": \"https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz\",\n      \"integrity\": \"sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==\",\n      \"dev\": true\n    },\n    \"node_modules/ignore\": {\n      \"version\": \"5.2.4\",\n      \"resolved\": \"https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz\",\n      \"integrity\": \"sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">= 4\"\n      }\n    },\n    \"node_modules/ini\": {\n      \"version\": \"3.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/ini/-/ini-3.0.1.tgz\",\n      \"integrity\": \"sha512-it4HyVAUTKBc6m8e1iXWvXSTdndF7HbdN713+kvLrymxTaU4AUBWrJ4vEooP+V7fexnVD3LKcBshjGGPefSMUQ==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \"^12.13.0 || ^14.15.0 || >=16.0.0\"\n      }\n    },\n    \"node_modules/is-fullwidth-code-point\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz\",\n      \"integrity\": \"sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/isexe\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz\",\n      \"integrity\": \"sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==\",\n      \"dev\": true\n    },\n    \"node_modules/jackspeak\": {\n      \"version\": \"2.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/jackspeak/-/jackspeak-2.2.1.tgz\",\n      \"integrity\": \"sha512-MXbxovZ/Pm42f6cDIDkl3xpwv1AGwObKwfmjs2nQePiy85tP3fatofl3FC1aBsOtP/6fq5SbtgHwWcMsLP+bDw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@isaacs/cliui\": \"^8.0.2\"\n      },\n      \"engines\": {\n        \"node\": \">=14\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/isaacs\"\n      },\n      \"optionalDependencies\": {\n        \"@pkgjs/parseargs\": \"^0.11.0\"\n      }\n    },\n    \"node_modules/js-yaml\": {\n      \"version\": \"4.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz\",\n      \"integrity\": \"sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"argparse\": \"^2.0.1\"\n      },\n      \"bin\": {\n        \"js-yaml\": \"bin/js-yaml.js\"\n      }\n    },\n    \"node_modules/jsonc-parser\": {\n      \"version\": \"3.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz\",\n      \"integrity\": \"sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==\",\n      \"dev\": true\n    },\n    \"node_modules/jsonfile\": {\n      \"version\": \"6.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz\",\n      \"integrity\": \"sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"universalify\": \"^2.0.0\"\n      },\n      \"optionalDependencies\": {\n        \"graceful-fs\": \"^4.1.6\"\n      }\n    },\n    \"node_modules/linkify-it\": {\n      \"version\": \"4.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/linkify-it/-/linkify-it-4.0.1.tgz\",\n      \"integrity\": \"sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"uc.micro\": \"^1.0.1\"\n      }\n    },\n    \"node_modules/lru-cache\": {\n      \"version\": \"10.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.0.tgz\",\n      \"integrity\": \"sha512-svTf/fzsKHffP42sujkO/Rjs37BCIsQVRCeNYIm9WN8rgT7ffoUnRtZCqU+6BqcSBdv8gwJeTz8knJpgACeQMw==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \"14 || >=16.14\"\n      }\n    },\n    \"node_modules/make-error\": {\n      \"version\": \"1.3.6\",\n      \"resolved\": \"https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz\",\n      \"integrity\": \"sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==\",\n      \"dev\": true\n    },\n    \"node_modules/markdown-it\": {\n      \"version\": \"13.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/markdown-it/-/markdown-it-13.0.1.tgz\",\n      \"integrity\": \"sha512-lTlxriVoy2criHP0JKRhO2VDG9c2ypWCsT237eDiLqi09rmbKoUetyGHq2uOIRoRS//kfoJckS0eUzzkDR+k2Q==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"argparse\": \"^2.0.1\",\n        \"entities\": \"~3.0.1\",\n        \"linkify-it\": \"^4.0.1\",\n        \"mdurl\": \"^1.0.1\",\n        \"uc.micro\": \"^1.0.5\"\n      },\n      \"bin\": {\n        \"markdown-it\": \"bin/markdown-it.js\"\n      }\n    },\n    \"node_modules/markdownlint\": {\n      \"version\": \"0.29.0\",\n      \"resolved\": \"https://registry.npmjs.org/markdownlint/-/markdownlint-0.29.0.tgz\",\n      \"integrity\": \"sha512-ASAzqpODstu/Qsk0xW5BPgWnK/qjpBQ4e7IpsSvvFXcfYIjanLTdwFRJK1SIEEh0fGSMKXcJf/qhaZYHyME0wA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"markdown-it\": \"13.0.1\",\n        \"markdownlint-micromark\": \"0.1.5\"\n      },\n      \"engines\": {\n        \"node\": \">=16\"\n      }\n    },\n    \"node_modules/markdownlint-cli\": {\n      \"version\": \"0.35.0\",\n      \"resolved\": \"https://registry.npmjs.org/markdownlint-cli/-/markdownlint-cli-0.35.0.tgz\",\n      \"integrity\": \"sha512-lVIIIV1MrUtjoocgDqXLxUCxlRbn7Ve8rsWppfwciUNwLlNS28AhNiyQ3PU7jjj4Qvj+rWTTvwkqg7AcdG988g==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"commander\": \"~11.0.0\",\n        \"get-stdin\": \"~9.0.0\",\n        \"glob\": \"~10.2.7\",\n        \"ignore\": \"~5.2.4\",\n        \"js-yaml\": \"^4.1.0\",\n        \"jsonc-parser\": \"~3.2.0\",\n        \"markdownlint\": \"~0.29.0\",\n        \"minimatch\": \"~9.0.1\",\n        \"run-con\": \"~1.2.11\"\n      },\n      \"bin\": {\n        \"markdownlint\": \"markdownlint.js\"\n      },\n      \"engines\": {\n        \"node\": \">=16\"\n      }\n    },\n    \"node_modules/markdownlint-micromark\": {\n      \"version\": \"0.1.5\",\n      \"resolved\": \"https://registry.npmjs.org/markdownlint-micromark/-/markdownlint-micromark-0.1.5.tgz\",\n      \"integrity\": \"sha512-HvofNU4QCvfUCWnocQP1IAWaqop5wpWrB0mKB6SSh0fcpV0PdmQNS6tdUuFew1utpYlUvYYzz84oDkrD76GB9A==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=16\"\n      }\n    },\n    \"node_modules/marked\": {\n      \"version\": \"5.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/marked/-/marked-5.1.2.tgz\",\n      \"integrity\": \"sha512-ahRPGXJpjMjwSOlBoTMZAK7ATXkli5qCPxZ21TG44rx1KEo44bii4ekgTDQPNRQ4Kh7JMb9Ub1PVk1NxRSsorg==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"bin\": {\n        \"marked\": \"bin/marked.js\"\n      },\n      \"engines\": {\n        \"node\": \">= 16\"\n      }\n    },\n    \"node_modules/mdurl\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz\",\n      \"integrity\": \"sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==\",\n      \"dev\": true\n    },\n    \"node_modules/minimatch\": {\n      \"version\": \"9.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz\",\n      \"integrity\": \"sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"brace-expansion\": \"^2.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=16 || 14 >=14.17\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/isaacs\"\n      }\n    },\n    \"node_modules/minimist\": {\n      \"version\": \"1.2.8\",\n      \"resolved\": \"https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz\",\n      \"integrity\": \"sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==\",\n      \"dev\": true,\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/minipass\": {\n      \"version\": \"6.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/minipass/-/minipass-6.0.2.tgz\",\n      \"integrity\": \"sha512-MzWSV5nYVT7mVyWCwn2o7JH13w2TBRmmSqSRCKzTw+lmft9X4z+3wjvs06Tzijo5z4W/kahUCDpRXTF+ZrmF/w==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=16 || 14 >=14.17\"\n      }\n    },\n    \"node_modules/path-key\": {\n      \"version\": \"3.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz\",\n      \"integrity\": \"sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/path-scurry\": {\n      \"version\": \"1.10.1\",\n      \"resolved\": \"https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz\",\n      \"integrity\": \"sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"lru-cache\": \"^9.1.1 || ^10.0.0\",\n        \"minipass\": \"^5.0.0 || ^6.0.2 || ^7.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=16 || 14 >=14.17\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/isaacs\"\n      }\n    },\n    \"node_modules/prettier\": {\n      \"version\": \"3.9.10\",\n      \"resolved\": \"https://registry.npmjs.org/prettier/-/prettier-3.9.10.tgz\",\n      \"integrity\": \"sha512-skGHTH1Yb9QvaTC4hWnRTzEYtCpApF0UMBPz+t/0ZPzP8ihefo/btKd+QA7pUE0fEwA1SbS/NmhyEcstdXOIdA==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"bin\": {\n        \"prettier\": \"bin/prettier.cjs\"\n      },\n      \"engines\": {\n        \"node\": \">=14\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/prettier/prettier?sponsor=1\"\n      }\n    },\n    \"node_modules/run-con\": {\n      \"version\": \"1.2.12\",\n      \"resolved\": \"https://registry.npmjs.org/run-con/-/run-con-1.2.12.tgz\",\n      \"integrity\": \"sha512-5257ILMYIF4RztL9uoZ7V9Q97zHtNHn5bN3NobeAnzB1P3ASLgg8qocM2u+R18ttp+VEM78N2LK8XcNVtnSRrg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"deep-extend\": \"^0.6.0\",\n        \"ini\": \"~3.0.0\",\n        \"minimist\": \"^1.2.8\",\n        \"strip-json-comments\": \"~3.1.1\"\n      },\n      \"bin\": {\n        \"run-con\": \"cli.js\"\n      }\n    },\n    \"node_modules/shebang-command\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz\",\n      \"integrity\": \"sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"shebang-regex\": \"^3.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/shebang-regex\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz\",\n      \"integrity\": \"sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/signal-exit\": {\n      \"version\": \"4.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/signal-exit/-/signal-exit-4.0.2.tgz\",\n      \"integrity\": \"sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=14\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/isaacs\"\n      }\n    },\n    \"node_modules/string-width\": {\n      \"version\": \"5.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz\",\n      \"integrity\": \"sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"eastasianwidth\": \"^0.2.0\",\n        \"emoji-regex\": \"^9.2.2\",\n        \"strip-ansi\": \"^7.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/string-width-cjs\": {\n      \"name\": \"string-width\",\n      \"version\": \"4.2.3\",\n      \"resolved\": \"https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz\",\n      \"integrity\": \"sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"emoji-regex\": \"^8.0.0\",\n        \"is-fullwidth-code-point\": \"^3.0.0\",\n        \"strip-ansi\": \"^6.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/string-width-cjs/node_modules/ansi-regex\": {\n      \"version\": \"5.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz\",\n      \"integrity\": \"sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/string-width-cjs/node_modules/emoji-regex\": {\n      \"version\": \"8.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz\",\n      \"integrity\": \"sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==\",\n      \"dev\": true\n    },\n    \"node_modules/string-width-cjs/node_modules/strip-ansi\": {\n      \"version\": \"6.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz\",\n      \"integrity\": \"sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"ansi-regex\": \"^5.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/strip-ansi\": {\n      \"version\": \"7.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz\",\n      \"integrity\": \"sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"ansi-regex\": \"^6.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/chalk/strip-ansi?sponsor=1\"\n      }\n    },\n    \"node_modules/strip-ansi-cjs\": {\n      \"name\": \"strip-ansi\",\n      \"version\": \"6.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz\",\n      \"integrity\": \"sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"ansi-regex\": \"^5.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/strip-ansi-cjs/node_modules/ansi-regex\": {\n      \"version\": \"5.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz\",\n      \"integrity\": \"sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/strip-json-comments\": {\n      \"version\": \"3.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz\",\n      \"integrity\": \"sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=8\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/ts-node\": {\n      \"version\": \"10.9.2\",\n      \"resolved\": \"https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz\",\n      \"integrity\": \"sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@cspotcode/source-map-support\": \"^0.8.0\",\n        \"@tsconfig/node10\": \"^1.0.7\",\n        \"@tsconfig/node12\": \"^1.0.7\",\n        \"@tsconfig/node14\": \"^1.0.0\",\n        \"@tsconfig/node16\": \"^1.0.2\",\n        \"acorn\": \"^8.4.1\",\n        \"acorn-walk\": \"^8.1.1\",\n        \"arg\": \"^4.1.0\",\n        \"create-require\": \"^1.1.0\",\n        \"diff\": \"^4.0.1\",\n        \"make-error\": \"^1.1.1\",\n        \"v8-compile-cache-lib\": \"^3.0.1\",\n        \"yn\": \"3.1.1\"\n      },\n      \"bin\": {\n        \"ts-node\": \"dist/bin.js\",\n        \"ts-node-cwd\": \"dist/bin-cwd.js\",\n        \"ts-node-esm\": \"dist/bin-esm.js\",\n        \"ts-node-script\": \"dist/bin-script.js\",\n        \"ts-node-transpile-only\": \"dist/bin-transpile.js\",\n        \"ts-script\": \"dist/bin-script-deprecated.js\"\n      },\n      \"peerDependencies\": {\n        \"@swc/core\": \">=1.2.50\",\n        \"@swc/wasm\": \">=1.2.50\",\n        \"@types/node\": \"*\",\n        \"typescript\": \">=2.7\"\n      },\n      \"peerDependenciesMeta\": {\n        \"@swc/core\": {\n          \"optional\": true\n        },\n        \"@swc/wasm\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/typescript\": {\n      \"version\": \"5.4.5\",\n      \"resolved\": \"https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz\",\n      \"integrity\": \"sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==\",\n      \"dev\": true,\n      \"bin\": {\n        \"tsc\": \"bin/tsc\",\n        \"tsserver\": \"bin/tsserver\"\n      },\n      \"engines\": {\n        \"node\": \">=14.17\"\n      }\n    },\n    \"node_modules/uc.micro\": {\n      \"version\": \"1.0.6\",\n      \"resolved\": \"https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz\",\n      \"integrity\": \"sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==\",\n      \"dev\": true\n    },\n    \"node_modules/undici-types\": {\n      \"version\": \"6.21.0\",\n      \"resolved\": \"https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz\",\n      \"integrity\": \"sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==\",\n      \"dev\": true,\n      \"license\": \"MIT\"\n    },\n    \"node_modules/universalify\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz\",\n      \"integrity\": \"sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">= 10.0.0\"\n      }\n    },\n    \"node_modules/v8-compile-cache-lib\": {\n      \"version\": \"3.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz\",\n      \"integrity\": \"sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==\",\n      \"dev\": true\n    },\n    \"node_modules/which\": {\n      \"version\": \"2.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/which/-/which-2.0.2.tgz\",\n      \"integrity\": \"sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"isexe\": \"^2.0.0\"\n      },\n      \"bin\": {\n        \"node-which\": \"bin/node-which\"\n      },\n      \"engines\": {\n        \"node\": \">= 8\"\n      }\n    },\n    \"node_modules/wrap-ansi\": {\n      \"version\": \"8.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz\",\n      \"integrity\": \"sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"ansi-styles\": \"^6.1.0\",\n        \"string-width\": \"^5.0.1\",\n        \"strip-ansi\": \"^7.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/chalk/wrap-ansi?sponsor=1\"\n      }\n    },\n    \"node_modules/wrap-ansi-cjs\": {\n      \"name\": \"wrap-ansi\",\n      \"version\": \"7.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz\",\n      \"integrity\": \"sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"ansi-styles\": \"^4.0.0\",\n        \"string-width\": \"^4.1.0\",\n        \"strip-ansi\": \"^6.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/chalk/wrap-ansi?sponsor=1\"\n      }\n    },\n    \"node_modules/wrap-ansi-cjs/node_modules/ansi-regex\": {\n      \"version\": \"5.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz\",\n      \"integrity\": \"sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/wrap-ansi-cjs/node_modules/ansi-styles\": {\n      \"version\": \"4.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz\",\n      \"integrity\": \"sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"color-convert\": \"^2.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/chalk/ansi-styles?sponsor=1\"\n      }\n    },\n    \"node_modules/wrap-ansi-cjs/node_modules/emoji-regex\": {\n      \"version\": \"8.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz\",\n      \"integrity\": \"sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==\",\n      \"dev\": true\n    },\n    \"node_modules/wrap-ansi-cjs/node_modules/string-width\": {\n      \"version\": \"4.2.3\",\n      \"resolved\": \"https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz\",\n      \"integrity\": \"sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"emoji-regex\": \"^8.0.0\",\n        \"is-fullwidth-code-point\": \"^3.0.0\",\n        \"strip-ansi\": \"^6.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/wrap-ansi-cjs/node_modules/strip-ansi\": {\n      \"version\": \"6.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz\",\n      \"integrity\": \"sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"ansi-regex\": \"^5.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/yn\": {\n      \"version\": \"3.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/yn/-/yn-3.1.1.tgz\",\n      \"integrity\": \"sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=6\"\n      }\n    }\n  }\n}\n","tools/utilities-add-translation/README.md":"# utilities-add-translation Documentation\n\nPath: `tools/utilities-add-translation/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/gibbok/typescript-book/HEAD/tools/utilities-add-translation/README.md)"},"files":{".agents/skills/typescript-book-review/SKILL.md":"---\n\nname: typescript-book-review\ndescription: Review and editing guide for TypeScript book and reference content in the style of The Concise TypeScript Book. Use when reviewing or editing educational prose, translated or non-English content, code examples, chapters, table-of-contents entries, or Markdown formatting in this repository to identify and fix typos, grammar mistakes, formatting problems, and minor clarity issues without altering the original meaning or the book’s concise, practical, example-driven style.\n---\n\n# TypeScript Book Review\n\nUse this skill to review and edit TypeScript educational content while keeping it consistent with the rest of the book.\n\n## Review and Editing Rules\n\nReview the content carefully and make only justified corrections.\n\n* Fix spelling mistakes and typographical errors.\n* Fix grammar, punctuation, capitalization, and awkward sentence structure.\n* Fix incorrect, inconsistent, or broken Markdown formatting.\n* Make minor wording changes when they improve clarity or readability.\n* Preserve the original technical meaning and intent.\n* Do not introduce new claims, concepts, examples, recommendations, or explanations unless explicitly requested.\n* Do not substantially rewrite content that is already clear and correct.\n* Do not change the difficulty level or intended audience.\n* Do not alter valid code examples unless a correction is required.\n* Do not change identifiers, literal values, commands, or compiler options without a technical reason.\n* Never modify code merely to match a personal preference.\n* Preserve the existing structure unless a small organizational correction clearly improves readability.\n* Keep edits minimal, focused, and easy to review.\n\nWhen a sentence can be corrected in more than one way, prefer the version closest to the original wording.\n\n## Core Style\n\nMaintain a concise technical-reference style:\n\n* Explain concepts directly and avoid storytelling.\n* Use short paragraphs, usually one idea per paragraph.\n* Prefer precise, beginner-friendly language without oversimplifying TypeScript behavior.\n* Define the concept first, then explain why it matters or how TypeScript handles it.\n* State validity, errors, inference results, and runtime behavior explicitly.\n* Keep examples small and focused on one point.\n* Avoid marketing language, jokes, and lengthy historical context unless they clarify the feature.\n\n## Language and Translation\n\nUse the language requested by the user or already used by the file being edited.\n\n* Preserve the target language of translated content unless the user asks for a different language.\n* Correct grammar, spelling, punctuation, and idiomatic phrasing in the target language.\n* Keep the translation faithful to the original technical meaning.\n* Preserve TypeScript terms, identifiers, literal values, commands, compiler options, code comments, and error text unless a correction is required.\n* Do not replace established technical terms with awkward literal translations.\n* Keep examples and Markdown structure aligned with the source content when reviewing translated files.\n* If a source and translation disagree technically, preserve the TypeScript meaning and make the smallest correction needed.\n\n## Organization\n\nKeep content structured as a book chapter or reference section:\n\n* Use `##` for major topics and `###` or `####` for focused subtopics.\n* Keep headings descriptive and suitable for the table of contents.\n* Start each section with a brief explanation before showing code.\n* Split long topics into short subtopics instead of using one long section.\n* Group related examples together: basic syntax, valid usage, invalid usage, and practical notes.\n* Preserve compatibility with generated Markdown tables of contents.\n* Avoid changing headings unless the change is required to correct an error or improve clarity.\n* When changing a heading, update any corresponding table-of-contents entry or internal link.\n\n## Explanation Pattern\n\nUse this default flow when reviewing new or revised sections:\n\n1. Name the TypeScript feature or concept.\n2. Describe what it does in one or two paragraphs.\n3. Show a minimal TypeScript example.\n4. Explain the inferred type, compiler result, or runtime behavior.\n5. Add a second example only when it clarifies an edge case or common usage.\n6. End with a practical recommendation only when it follows directly from the example.\n\nPrefer direct formulations:\n\n* `TypeScript infers the type as ...`\n* `The following example is valid TypeScript code.`\n* `The following code produces an error:`\n* `This is useful when ...`\n* `At runtime, ...`\n\nDo not replace existing phrasing with these formulations when the current wording is already clear and consistent.\n\n## Code Examples\n\nReview examples for consistency without unnecessarily rewriting them:\n\n* Use fenced code blocks with `typescript`, `shell`, `json`, or `text`.\n* Add `<!-- skip -->` immediately before TypeScript snippets that are intentionally invalid, incomplete, illustrative only, or not expected to compile.\n* Use compact names such as `X`, `Y`, `Person`, `Animal`, `Dog`, or domain-neutral names when the domain is not important.\n* Prefer single-quoted strings in TypeScript examples.\n* Use inline comments to identify validity, inferred types, or compiler errors.\n* Keep comments short: `// Valid`, `// Invalid`, `// Type inferred is string`.\n* Show compiler messages in `text` blocks when the exact error helps explain the concept.\n* Avoid large applications, frameworks, or unrelated dependencies unless the section is specifically about them.\n* Preserve the behavior and educational purpose of every example.\n* Do not change code solely for stylistic consistency when doing so would create a large or unnecessary diff.\n\nExample pattern:\n\n<!-- skip -->\n```typescript\ntype X = {\n    a: string;\n};\n\nconst value: X = { a: 'a', b: 'b' }; // Invalid\n```\n\nObject literal may only specify known properties.\n\n## Markdown Conventions\n\nApply the book’s Markdown conventions consistently:\n\n* Use `*` for unordered lists.\n* Use inline code for identifiers, file names, compiler options, commands, and literal values.\n* Use links directly when they provide useful reference material.\n* Use `Notes:` only for short, concrete notes.\n* Use markdownlint comments sparingly and only when a formatting exception is necessary.\n* Do not add extra frontmatter to book chapters unless the repository format requires it.\n* Fix malformed lists, code fences, links, headings, spacing, and indentation.\n* Preserve intentional Markdown exceptions when they are required by the repository tooling.\n\n## TypeScript Content Conventions\n\nWhen reviewing TypeScript explanations:\n\n* Distinguish compile-time type checking from JavaScript runtime behavior.\n* Mention type erasure when runtime behavior could otherwise be misunderstood.\n* Prefer examples that demonstrate inference, assignability, narrowing, structural typing, configuration, or emitted JavaScript behavior.\n* When discussing migrations, recommend gradual migration and avoid refactoring during type conversion.\n* When discussing configuration, explain the option’s effect and give a practical default only when the recommendation is clear.\n* Avoid asserting version-specific behavior unless it has been verified against the repository’s target TypeScript version.\n* Do not alter technical statements unless the original statement is incorrect, misleading, or unclear.\n* Verify technical corrections before applying them.\n\n## Table of Contents and Headings\n\nTreat heading and table-of-contents consistency as a critical review requirement.\n\n* Confirm every table-of-contents entry matches its corresponding heading.\n* Confirm heading text, capitalization, punctuation, and anchor generation remain compatible.\n* Avoid special characters in table-of-contents entries unless the matching heading requires them.\n* Keep table-of-contents entries plain and compatible with generated Markdown anchors.\n* Check all changed headings against the table of contents at least twice.\n* Check all changed table-of-contents entries against their headings at least twice.\n* Confirm renamed, added, moved, or removed sections are reflected correctly.\n* Confirm internal links still point to valid headings.\n* Do not change a heading without checking every related table-of-contents entry and internal reference.\n\n## Review Checklist\n\nBefore finishing a review:\n\n* Confirm all spelling and typographical errors have been corrected.\n* Confirm grammar, punctuation, and capitalization are correct.\n* Confirm translated or non-English content uses the requested language consistently when applicable.\n* Confirm minor wording changes preserve the original meaning.\n* Confirm no unnecessary rewriting or expansion was introduced.\n* Confirm the heading level fits the surrounding chapter structure.\n* Confirm examples are minimal and directly support the explanation.\n* Confirm code examples retain their original behavior and purpose.\n* Confirm invalid or illustrative snippets use `<!-- skip -->`.\n* Confirm code fences use the correct language.\n* Confirm Markdown formatting is valid and consistent.\n* Confirm prose is concise, direct, and free of unrelated background.\n* Confirm table-of-contents compatibility when headings were added, removed, moved, or renamed.\n* Confirm table-of-contents entries avoid unnecessary special characters.\n* Confirm headings, table-of-contents entries, anchors, and internal links were checked twice.\n* Review the final diff and remove any change that is unnecessary or alters the original meaning.\n","tools/.markdownlint.json":"{\n    \"code-block-style\": {\n        \"style\": \"fenced\"\n    },\n    \"code-fence-style\": {\n        \"style\": \"backtick\"\n    },\n    \"emphasis-style\": {\n        \"style\": \"asterisk\"\n    },\n    \"fenced-code-language\": {\n        \"allowed_languages\": [\n            \"shell\",\n            \"json\",\n            \"typescript\",\n            \"javascript\",\n            \"text\"\n        ],\n        \"language_only\": true\n    },\n    \"heading-style\": {\n        \"style\": \"atx\"\n    },\n    \"hr-style\": {\n        \"style\": \"---\"\n    },\n    \"line-length\": false,\n    \"no-duplicate-heading\": {\n        \"siblings_only\": true\n    },\n    \"ol-prefix\": {\n        \"style\": \"ordered\"\n    },\n    \"proper-names\": {\n        \"code_blocks\": false,\n        \"names\": [\n            \"TypeScript\",\n            \"Ctrl\",\n            \"JavaScript\",\n            \"Markdown\",\n            \"Node.js\",\n            \"Visual Studio Code\",\n            \"Microsoft\",\n            \"LinkedIn\",\n            \"GitHub\",\n            \"Twitter\",\n            \"Email\",\n            \"IntelliSense\",\n            \"ECMAScript\"\n        ]\n    },\n    \"required-headings\": false,\n    \"strong-style\": {\n        \"style\": \"asterisk\"\n    },\n    \"ul-style\": {\n        \"style\": \"asterisk\"\n    }\n}","tools/package.json":"{\n  \"name\": \"typescript-book\",\n  \"version\": \"1.0.0\",\n  \"description\": \"The Concise TypeScript Book provides a comprehensive and succinct overview of TypeScript's capabilities. It offers clear explanations covering all aspects found in the latest version of the language, from its powerful type system to advanced features. Whether you're a beginner or an experienced developer, this book is an invaluable resource to enhance your understanding and proficiency in TypeScript.\",\n  \"main\": \"index.js\",\n  \"scripts\": {\n    \"format\": \"ts-node format\",\n    \"compile\": \"ts-node compile\",\n    \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\",\n    \"lint\": \"ts-node lint\",\n    \"lint:md\": \"markdownlint --ignore \\\"../AGENTS.md\\\" --ignore \\\"../.agents/**\\\" \\\"./*.md\\\" \\\"../*.md\\\"\",\n    \"check\": \"npm run lint && npm run lint:md && npm run format && npm run compile\"\n  },\n  \"author\": \"\",\n  \"license\": \"ISC\",\n  \"devDependencies\": {\n    \"@types/fs-extra\": \"^11.0.4\",\n    \"@types/marked\": \"^5.0.0\",\n    \"@types/node\": \"^20.19.43\",\n    \"@types/prettier\": \"^3.0.0\",\n    \"fp-ts\": \"^2.16.11\",\n    \"fs-extra\": \"^11.4.1\",\n    \"markdownlint-cli\": \"^0.35.0\",\n    \"marked\": \"^5.1.2\",\n    \"prettier\": \"^3.9.10\",\n    \"ts-node\": \"^10.9.2\",\n    \"typescript\": \"^5.4.5\"\n  }\n}\n","AGENTS.md":"# AGENTS.md\n\nFor review and editing work in this repository, use [.agents/skills/typescript-book-review/SKILL.md](.agents/skills/typescript-book-review/SKILL.md).\n\nThis guidance is for correcting TypeScript book content, Markdown, headings, and examples while keeping changes minimal and preserving the original meaning.\n\nFor creating TypeScript news pages, use [.agents/skills/create-typescript-news/SKILL.md](.agents/skills/create-typescript-news/SKILL.md).\n\nThis workflow requires user-provided source content, creates and synchronizes concise news pages for every website language, files them under the correct year, and verifies each article against its original source.\n","tools/README.md":"# Tools for Working with Markdown Books\n\nIf you're working with Markdown books, here are some essential tools and commands to help you streamline your workflow.\n\n## Installation\n\nThe Docker workflow provides all dependencies required to generate and verify the\nbooks. With Docker running, use this command from `tools`:\n\n```shell\nmake docker-books\n```\n\nThe repository is mounted into the container, so generated EPUB and PDF files are\nwritten directly to the local `downloads` folder. The Docker image is built on the\nfirst command and reused on subsequent commands. Its Node.js dependencies stay\ninside the container. It includes EPUBCheck 5.3.0 and invokes it through a Java\nwrapper, so EPUB validation works when invoked by Python without leaving cache files\nin the checkout. The Noto fonts required for PDF generation are stored in\n`tools/fonts` and copied into the image during the build.\n\n### Local installation\n\nTo run the tools without Docker, ensure Node.js is installed. Then set up the\nrequired dependencies with the following commands:\n\nIn folder `tools` and `website`:\n\n```shell\nnvm use\nnpm install\n```\n\n```shell\nbrew install pandoc\nbrew install epubcheck\nbrew install poppler\nbrew install --cask calibre\n```\n\n## Commands\n\nUse `make` to run the main commands:\n\n* `make format`: Format Markdown files for books.\n* `make check`: Run several checks to ensure the Markdown files are valid.\n* `make website`: Create different Markdown pages for the website.\n* `make website-preview`: Build and preview website locally.\n* `make website-e2e`: Build the production website and run its core Playwright end-to-end tests.\n* `make website-deploy`: Build and deploy website to GitHub Pages.\n* `make books`: Create EPUB and PDF books.\n* `make verify-books`: Verify the generated EPUB and PDF files.\n* `make docker-books`: Build the Docker image and create EPUB and PDF books in the local `downloads` folder.\n\n### Website End-to-End Tests\n\nThe Playwright suite covers only the website's main reader journeys: loading readable\nbook content, using the right-side page navigation, and finding content with search.\n\nInstall the browser once from the `website` folder:\n\n```shell\nnpx playwright install chromium\n```\n\nThen run the production build and tests from the `tools` folder:\n\n```shell\nmake website-e2e\n```\n\nPlaywright saves an HTML report, screenshots, and videos for each run. In pull\nrequests, CI uploads this evidence, links it from a single updated PR comment, and\ndeletes the uploaded artifacts after the PR is merged.\n\n### Formatting\n\nConsistent code formatting is crucial. To format all TypeScript snippets, we use Prettier. Execute the following command for formatting:\n\n```shell\nnpm run format\n```\n\n### Compilation\n\nTo compile TypeScript snippets within the Markdown files, utilize the following command:\n\n```shell\nnpm run compile\n```\n\n### Linting\n\nTo ensure that your Markdown files adhere to proper formatting rules, use the linting command:\n\n```shell\nnpm run lint:md\n```\n\n### Linting and Formatting\n\nFor a comprehensive process that includes linting all Markdown files, applying Prettier formatting to all TypeScript snippets, and compiling them using TypeScript, use the following command:\n\n```shell\nnpm run check\n```\n\nThe project uses the [Markdown All in One](https://marketplace.visualstudio.com/items?itemName=yzhang.markdown-all-in-one)Visual Studio Code extension to automatically update the table of contents.\n\nUse the following command to install it:\n\n```shell\ncode --install-extension yzhang.markdown-all-in-one\n```\n\n### Skipping Compilation\n\nIf you have specific snippets in the Markdown files that you don't want to compile, simply add `<!-- skip -->` just before the TypeScript demarcation for those snippets.\n\n### EPUB and PDF Generation\n\nTo generate EPUB and PDF files from your Markdown books, navigate to the `tools` folder and run the following command:\n\n```shell\nmake books\n```\n\nThe verification step uses `pdfinfo` for page totals and `pdffonts` to require the\nappropriate embedded Noto families for every locale. It rejects legacy Georgia,\nVerdana, Menlo, Apple, Times New Roman, and STSongti embeddings.\n\nTo regenerate every artifact with the container toolchain, run:\n\n```shell\nmake docker-books\n```\n\n### Tagging\n\nUse this tag format for TypeScript 7 book releases:\n\n```shell\ngit switch main\ngit pull origin main\ngit tag -a typescript-7-book-v1 -m \"TypeScript 7 book, revision 1\"\ngit push origin typescript-7-book-v1\n```\n\nThese tools will assist you in efficiently working with Markdown books and ensure a smooth and organized process. Happy writing!\n\n## Debug EPUB Issues\n\nTo debug the EPUB files you create, follow these steps:\n\nFirst, download and install Sigil. You can use the following command to install Sigil:\n\n```shell\nbrew install --cask sigil\n```\n\nNext, run an EPUB check to validate your EPUB file. For example:\n\n```shell\nepubcheck ../downloads/typescript-book.epub\n```\n\nFinally, open the EPUB file using Sigil for detailed inspection.\n\n## How to Contribute to This E-Book\n\nTo contribute to this e-book, follow these steps:\n\n* Update the main Markdown file with your changes.\n* Run `make check` to ensure the linter and other checks pass.\n* Preview the website locally with `make website-preview` to make sure it works as expected.\n* Generate the e-books by running `make books`.\n* Submit your PR and share your awesome contributions!\n",".agents/skills/create-typescript-news/SKILL.md":"---\nname: create-typescript-news\ndescription: Create and synchronize concise, source-faithful TypeScript news pages for every language configured in this repository's Astro/Starlight website. Use when asked to add, publish, translate, edit, remove, audit, or synchronize news in website/src/content/docs/typescript-news, or when a website language is added. Require an explicit source/context handoff before creating or materially editing a news item; the handoff may come from the user or from a preceding research workflow requested by the user containing verified sources, dates, and findings.\n---\n\n# Create TypeScript News\n\nCreate a TypeScript news article only from explicit source/context input, then translate and file it consistently across every configured website language.\n\n## Require source/context input\n\nBefore drafting or editing files, confirm that explicit source/context input is available. It may be either:\n\n* source content or announcement text supplied directly by the user; or\n* a research handoff produced by a preceding research step that the user explicitly requested, containing the selected topic, original authoritative source URL(s), publication date(s), and the factual findings to use.\n\nA research handoff is valid source/context input only when it identifies the original authoritative source and preserves enough factual detail to verify the article. Prefer official TypeScript, Microsoft, TC39, GitHub, and maintainer sources. Do not treat general model memory or an uncited topic suggestion as source/context input.\n\nIf neither form of source/context input is available, ask for:\n\n* the source content or announcement text;\n* the original source URL, if the user wants to provide it;\n* the publication date;\n* an optional preferred title or slug.\n\nStop after asking. Do not independently select a topic unless the user's workflow explicitly includes a preceding research-and-handoff step.\n\nIf source/context input is present but the publication date is missing and cannot be verified from the authoritative source, ask for it because the date determines the year directory and archive. The original source URL is optional only for directly user-supplied source content; a research handoff must include its original authoritative source URL(s).\n\nFor a translation audit, language addition, or removal, the existing English articles and any cited sources are the supplied content. Ask the user only when the master content or intended change is missing or ambiguous.\n\n## Inspect the current structure\n\nBefore writing:\n\n1. Read `website/src/config/locales.ts` to identify every configured locale. Do not hard-code the locale list.\n2. Read the latest English and translated files under `website/src/content/docs/typescript-news/`.\n3. Read `.agents/skills/typescript-book-review/SKILL.md` completely and apply its review, style, translation, and Markdown rules.\n4. Preserve the existing Astro/Starlight content conventions and use the shared news-list implementation.\n\n## Keep every language synchronized\n\nTreat the English `website/src/content/docs/typescript-news/` tree as the master and canonical news inventory. All translations must follow the English version's factual content, structure, metadata, year, and slug. Compare article paths relative to the English directory with the corresponding tree for every non-root locale configured in `website/src/config/locales.ts`.\n\nEvery English news article must have one translated article at the same relative year and slug path in every configured non-root locale. Do not rely on Starlight's content fallback to display English in place of a missing translation.\n\nApply changes across the entire language set:\n\n* When adding an article, create it in English and every configured non-root locale. The latest-news landing pages and yearly archives discover it automatically; do not add manual article lists to those pages.\n* When materially editing an article, apply the same factual change to every translation.\n* When changing a title, description, publication date, year, slug, source, or frontmatter field, make the corresponding change in every language.\n* When intentionally removing an English article, delete its translated file from every non-root locale.\n* When a localized article has no canonical English article, remove the orphaned file as part of synchronization.\n* When a new locale is added to `website/src/config/locales.ts`, create its localized news landing page, translate the complete English news archive, and create one localized yearly archive page for every year containing English articles.\n* When a locale is removed from `website/src/config/locales.ts`, do not treat its former files as a supported translation. Follow the scope of the locale-removal request for deleting the obsolete locale tree.\n\nKeep the set of relative article paths identical across English and every configured non-root locale. Preserve localized prose, but keep factual meaning, dates, slugs, commands, source URLs, and frontmatter synchronized.\n\n## Verify the source\n\nTreat the explicit source/context input as the authoritative basis for the article. When a research handoff is used, reopen and verify its original authoritative source URL(s) before publication.\n\n* Compare every date, version, feature, compatibility note, command, package name, option, number, and performance claim with the original source.\n* Open the supplied or handed-off source URL when accessible, giving preference to official TypeScript, Microsoft, TC39, GitHub, and maintainer sources.\n* Do not add claims from memory or infer unannounced behavior.\n* Remove details that cannot be supported by the source.\n* If the source/context conflicts with the original source or remains ambiguous, ask the user before publishing the disputed claim.\n* Link the original source in the article's `Source` section when a URL is available. Omit that section only when directly user-supplied source content has no URL.\n\n## Write the English article\n\nWrite a useful, concise summary rather than reproducing the source.\n\n* Lead with what was announced and why it matters to TypeScript developers.\n* Prefer short paragraphs and direct technical language.\n* Include only sections supported by the source. Use headings such as `## What changed`, `## Compatibility`, and `## Source` when they add value.\n* Preserve commands, package names, identifiers, compiler options, code, version numbers, and URLs exactly.\n* Avoid marketing language, speculation, filler, and lengthy history.\n* Use the publication date for both `lastUpdated` and `article:published_time` unless the source/context supplies a distinct verified update date.\n\nUse the established frontmatter pattern:\n\n```yaml\n---\ntitle: Article title\ndescription: A concise, source-supported description.\nlastUpdated: YYYY-MM-DD\nsidebar:\n    hidden: true\nhead:\n    - tag: meta\n      attrs:\n          property: article:published_time\n          content: 'YYYY-MM-DD'\n---\n```\n\nDo not add `sidebar.order` to news articles. Starlight hides individual articles from autogenerated sidebars through `sidebar.hidden: true`. Year links are generated from the English news-year directories and sorted newest first in `website/astro.config.mjs`.\n\n## Automatic latest-news lists and yearly archives\n\nThe shared `website/src/components/NewsList.astro` component reads the Starlight `docs` content collection at build time. It filters articles by locale and, for an archive, by year. It uses `article:published_time` as the publication date, sorts newest first, and uses the canonical English slug as the deterministic tie-breaker for articles published on the same date.\n\n* Keep each localized news landing page at `typescript-news/index.mdx`. It renders the latest 11 articles automatically; do not add, remove, or reorder article entries manually.\n* Keep one localized archive page at `typescript-news/YYYY/index.mdx` for every year with published English articles. Its localized title and description are page metadata; its `<NewsList locale=\"LOCALE\" year={YYYY} />` renders the localized article list automatically.\n* When the first article for a new year is added, create that year's archive page in English and every configured non-root locale. Do not edit older archive pages or article files just to update navigation order.\n* The news sidebar contains only year links. Its section label is read from each locale's news landing page title.\n\nRun the bundled verifier and focused list tests from the repository root after every news or locale change:\n\n```shell\npython3 .agents/skills/create-typescript-news/scripts/verify_news.py\nnpm --prefix website run test:news\n```\n\nThe verifier reads `website/src/config/locales.ts` and checks article path parity, valid publication dates, year-directory consistency, matching dates across translations, localized landing/archive pages, hidden article navigation, and the absence of `sidebar.order` metadata. The tests cover descending year order, newest-first article sorting, deterministic slug tie-breaking, and localized entries. Correct content or implementation issues rather than weakening the checks.\n\n## Save by publication year\n\nCreate the English article at:\n\n```text\nwebsite/src/content/docs/typescript-news/YYYY/article-slug.md\n```\n\nDerive `YYYY` from the verified publication date. Use a short, lowercase, hyphenated slug. Do not place article files directly in `typescript-news/`.\n\nCreate each translation at:\n\n```text\nwebsite/src/content/docs/LOCALE/typescript-news/YYYY/article-slug.md\n```\n\n## Create every translation\n\nFor each non-root locale configured in `website/src/config/locales.ts`:\n\n* Translate the title, description, headings, and prose naturally. The shared list formats publication dates using the locale's language tag.\n* Keep the same year, slug, publication date, frontmatter structure, Markdown structure, factual scope, and source URL, when present, as the English article.\n* Preserve commands, code, packages, options, identifiers, version numbers, and product names.\n* Do not translate official announcement titles inside source links unless the linked page itself uses that title.\n* Keep each translation faithful to the reviewed English article and the original source.\n\nThe landing-page and archive article lists are generated from content metadata, so do not edit them when adding an article.\n\n## Self-review\n\nReview the completed English article and every translation before building:\n\n1. Recheck each factual statement against the explicit source/context input and original source.\n2. Confirm no unsupported claim, date, number, command, package, or compatibility statement was introduced.\n3. Confirm the summary is useful and as concise as the subject permits.\n4. Confirm every translation preserves the English article's technical meaning.\n5. Confirm all configured locales have the article and matching publication metadata.\n6. Confirm paths, slugs, dates, source links, and frontmatter match across languages.\n7. Confirm Markdown follows `.agents/skills/typescript-book-review/SKILL.md`.\n8. Compare the complete English article inventory with every configured locale and confirm the relative path sets are identical.\n9. Confirm every added or edited English fact is reflected accurately in every translation.\n10. Confirm removed articles no longer exist in any configured language.\n11. Run `scripts/verify_news.py` and `npm --prefix website run test:news` and confirm both checks pass.\n12. Confirm a new-year archive page exists in every configured locale when the publication year is new.\n\nCorrect any issue found, then perform the source and translation accuracy comparison once more.\n\n## Validate the website\n\nFrom `website/`, run:\n\n```shell\nnpm run build\n```\n\nVerify:\n\n* the news verifier and focused list tests pass;\n* Astro reports no content or build errors;\n* the TypeScript News sidebar displays only years, newest first, with no individual article links;\n* clicking a year opens its localized archive page, and archive article links open the existing localized article URLs;\n* yearly archives and the latest-news landing page display localized articles in the expected order;\n* the English and every localized route are generated under the correct year, including Arabic with its RTL direction;\n* existing article canonical URLs, descriptions, and `article:published_time` metadata remain correct;\n* existing article routes and archive routes appear in the generated sitemap;\n* no duplicate article routes or unexpected missing routes are introduced.\n\nReport the created paths, source used, accuracy review, and build result. Commit or publish changes only when the user requests it.\n","tools/tsconfig.json":"{\n  \"compilerOptions\": {\n    \"target\": \"es2022\",\n    \"module\": \"commonjs\",\n    \"noImplicitAny\": true,\n    \"esModuleInterop\": true,\n    \"noEmitOnError\": true,\n    \"moduleDetection\": \"force\",\n    \"noUnusedLocals\": false,\n    \"forceConsistentCasingInFileNames\": true,\n    \"strict\": true,\n    \"skipLibCheck\": true,\n    \"lib\": [\n      \"es2022\",\n      \"esnext.disposable\",\n      \"esnext.decorators\",\n      \"dom\"\n    ]\n  }\n}","tools/.vscode/launch.json":"{\n    \"version\": \"0.2.0\",\n    \"configurations\": [\n        {\n            \"name\": \"Debug lint\",\n            \"type\": \"node\",\n            \"request\": \"launch\",\n            \"runtimeExecutable\": \"node\",\n            \"runtimeArgs\": [\n                \"--nolazy\",\n                \"-r\",\n                \"${workspaceRoot}/node_modules/ts-node/register/transpile-only\"\n            ],\n            \"args\": [\n                \"lint.ts\",\n                \"--example\",\n                \"hello\"\n            ],\n            \"cwd\": \"${workspaceRoot}\",\n            \"internalConsoleOptions\": \"openOnSessionStart\",\n            \"skipFiles\": [\n                \"<node_internals>/**\",\n                \"node_modules/**\"\n            ]\n        },\n        {\n            \"name\": \"Python: Current File\",\n            \"type\": \"python\",\n            \"request\": \"launch\",\n            \"program\": \"${file}\",\n            \"console\": \"integratedTerminal\",\n            \"justMyCode\": true\n        }\n    ]\n}","tools/.vscode/settings.json":"{\n    \"editor.formatOnSave\": true,\n}","tools/test-md/README.md":"# The Concise TypeScript Book\nA Concise Guide to Effective Development in TypeScript. **Free and Open Source**.\n## Create files and folders\nThe file explorer is accessible using the button.\n## Switch to another file\nAll your files and folders are presented as a tree in the file explorer. You can switch from one to another by clicking a file in the tree.\n### New title\nSome parent content.\n#### Nested content 1\nMore content here.\n##### Nested content 2\nEven more content.","tools/test-md/README-zh_CN.md":"# 简洁 TypeScript 书\nTypeScript 有效开发简明指南。 **免费和开源**。\n## 创建文件和文件夹\n可使用 按钮访问文件资源管理器。\n## 切换到另一个文件\n您的所有文件和文件夹都在文件资源管理器中显示为树。 您可以通过单击树中的文件从一个文件切换到另一个文件。\n### 新标题\n一些家长内容。\n#### 嵌套内容 1\n更多内容在这里。\n##### 嵌套内容 2\n内容甚至更多。","tools/package-lock.json":"{\n  \"name\": \"typescript-book\",\n  \"version\": \"1.0.0\",\n  \"lockfileVersion\": 3,\n  \"requires\": true,\n  \"packages\": {\n    \"\": {\n      \"name\": \"typescript-book\",\n      \"version\": \"1.0.0\",\n      \"license\": \"ISC\",\n      \"devDependencies\": {\n        \"@types/fs-extra\": \"^11.0.4\",\n        \"@types/marked\": \"^5.0.0\",\n        \"@types/node\": \"^20.19.43\",\n        \"@types/prettier\": \"^3.0.0\",\n        \"fp-ts\": \"^2.16.11\",\n        \"fs-extra\": \"^11.4.1\",\n        \"markdownlint-cli\": \"^0.35.0\",\n        \"marked\": \"^5.1.2\",\n        \"prettier\": \"^3.9.10\",\n        \"ts-node\": \"^10.9.2\",\n        \"typescript\": \"^5.4.5\"\n      }\n    },\n    \"node_modules/@cspotcode/source-map-support\": {\n      \"version\": \"0.8.1\",\n      \"resolved\": \"https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz\",\n      \"integrity\": \"sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@jridgewell/trace-mapping\": \"0.3.9\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      }\n    },\n    \"node_modules/@isaacs/cliui\": {\n      \"version\": \"8.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz\",\n      \"integrity\": \"sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"string-width\": \"^5.1.2\",\n        \"string-width-cjs\": \"npm:string-width@^4.2.0\",\n        \"strip-ansi\": \"^7.0.1\",\n        \"strip-ansi-cjs\": \"npm:strip-ansi@^6.0.1\",\n        \"wrap-ansi\": \"^8.1.0\",\n        \"wrap-ansi-cjs\": \"npm:wrap-ansi@^7.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      }\n    },\n    \"node_modules/@jridgewell/resolve-uri\": {\n      \"version\": \"3.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz\",\n      \"integrity\": \"sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=6.0.0\"\n      }\n    },\n    \"node_modules/@jridgewell/sourcemap-codec\": {\n      \"version\": \"1.4.15\",\n      \"resolved\": \"https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz\",\n      \"integrity\": \"sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==\",\n      \"dev\": true\n    },\n    \"node_modules/@jridgewell/trace-mapping\": {\n      \"version\": \"0.3.9\",\n      \"resolved\": \"https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz\",\n      \"integrity\": \"sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@jridgewell/resolve-uri\": \"^3.0.3\",\n        \"@jridgewell/sourcemap-codec\": \"^1.4.10\"\n      }\n    },\n    \"node_modules/@pkgjs/parseargs\": {\n      \"version\": \"0.11.0\",\n      \"resolved\": \"https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz\",\n      \"integrity\": \"sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==\",\n      \"dev\": true,\n      \"optional\": true,\n      \"engines\": {\n        \"node\": \">=14\"\n      }\n    },\n    \"node_modules/@tsconfig/node10\": {\n      \"version\": \"1.0.9\",\n      \"resolved\": \"https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz\",\n      \"integrity\": \"sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==\",\n      \"dev\": true\n    },\n    \"node_modules/@tsconfig/node12\": {\n      \"version\": \"1.0.11\",\n      \"resolved\": \"https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz\",\n      \"integrity\": \"sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==\",\n      \"dev\": true\n    },\n    \"node_modules/@tsconfig/node14\": {\n      \"version\": \"1.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz\",\n      \"integrity\": \"sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==\",\n      \"dev\": true\n    },\n    \"node_modules/@tsconfig/node16\": {\n      \"version\": \"1.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz\",\n      \"integrity\": \"sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==\",\n      \"dev\": true\n    },\n    \"node_modules/@types/fs-extra\": {\n      \"version\": \"11.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/@types/fs-extra/-/fs-extra-11.0.4.tgz\",\n      \"integrity\": \"sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@types/jsonfile\": \"*\",\n        \"@types/node\": \"*\"\n      }\n    },\n    \"node_modules/@types/jsonfile\": {\n      \"version\": \"6.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/@types/jsonfile/-/jsonfile-6.1.1.tgz\",\n      \"integrity\": \"sha512-GSgiRCVeapDN+3pqA35IkQwasaCh/0YFH5dEF6S88iDvEn901DjOeH3/QPY+XYP1DFzDZPvIvfeEgk+7br5png==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@types/node\": \"*\"\n      }\n    },\n    \"node_modules/@types/marked\": {\n      \"version\": \"5.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/@types/marked/-/marked-5.0.0.tgz\",\n      \"integrity\": \"sha512-YcZe50jhltsCq7rc9MNZC/4QB/OnA2Pd6hrOSTOFajtabN+38slqgDDCeE/0F83SjkKBQcsZUj7VLWR0H5cKRA==\",\n      \"dev\": true\n    },\n    \"node_modules/@types/node\": {\n      \"version\": \"20.19.43\",\n      \"resolved\": \"https://registry.npmjs.org/@types/node/-/node-20.19.43.tgz\",\n      \"integrity\": \"sha512-6oYBAi5ikg4Pl+kGsoYtawUMBT2zZMCvPNF7pVLnHZfd1zf38DRiWn/gT01RYCdUqkv7Fhr+C9ot4/tb+2sVvA==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"undici-types\": \"~6.21.0\"\n      }\n    },\n    \"node_modules/@types/prettier\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/@types/prettier/-/prettier-3.0.0.tgz\",\n      \"integrity\": \"sha512-mFMBfMOz8QxhYVbuINtswBp9VL2b4Y0QqYHwqLz3YbgtfAcat2Dl6Y1o4e22S/OVE6Ebl9m7wWiMT2lSbAs1wA==\",\n      \"deprecated\": \"This is a stub types definition. prettier provides its own type definitions, so you do not need this installed.\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"prettier\": \"*\"\n      }\n    },\n    \"node_modules/acorn\": {\n      \"version\": \"8.9.0\",\n      \"resolved\": \"https://registry.npmjs.org/acorn/-/acorn-8.9.0.tgz\",\n      \"integrity\": \"sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ==\",\n      \"dev\": true,\n      \"bin\": {\n        \"acorn\": \"bin/acorn\"\n      },\n      \"engines\": {\n        \"node\": \">=0.4.0\"\n      }\n    },\n    \"node_modules/acorn-walk\": {\n      \"version\": \"8.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz\",\n      \"integrity\": \"sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=0.4.0\"\n      }\n    },\n    \"node_modules/ansi-regex\": {\n      \"version\": \"6.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz\",\n      \"integrity\": \"sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/chalk/ansi-regex?sponsor=1\"\n      }\n    },\n    \"node_modules/ansi-styles\": {\n      \"version\": \"6.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz\",\n      \"integrity\": \"sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/chalk/ansi-styles?sponsor=1\"\n      }\n    },\n    \"node_modules/arg\": {\n      \"version\": \"4.1.3\",\n      \"resolved\": \"https://registry.npmjs.org/arg/-/arg-4.1.3.tgz\",\n      \"integrity\": \"sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==\",\n      \"dev\": true\n    },\n    \"node_modules/argparse\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz\",\n      \"integrity\": \"sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==\",\n      \"dev\": true\n    },\n    \"node_modules/balanced-match\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz\",\n      \"integrity\": \"sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==\",\n      \"dev\": true\n    },\n    \"node_modules/brace-expansion\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz\",\n      \"integrity\": \"sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"balanced-match\": \"^1.0.0\"\n      }\n    },\n    \"node_modules/color-convert\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz\",\n      \"integrity\": \"sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"color-name\": \"~1.1.4\"\n      },\n      \"engines\": {\n        \"node\": \">=7.0.0\"\n      }\n    },\n    \"node_modules/color-name\": {\n      \"version\": \"1.1.4\",\n      \"resolved\": \"https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz\",\n      \"integrity\": \"sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==\",\n      \"dev\": true\n    },\n    \"node_modules/commander\": {\n      \"version\": \"11.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/commander/-/commander-11.0.0.tgz\",\n      \"integrity\": \"sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=16\"\n      }\n    },\n    \"node_modules/create-require\": {\n      \"version\": \"1.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz\",\n      \"integrity\": \"sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==\",\n      \"dev\": true\n    },\n    \"node_modules/cross-spawn\": {\n      \"version\": \"7.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz\",\n      \"integrity\": \"sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"path-key\": \"^3.1.0\",\n        \"shebang-command\": \"^2.0.0\",\n        \"which\": \"^2.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 8\"\n      }\n    },\n    \"node_modules/deep-extend\": {\n      \"version\": \"0.6.0\",\n      \"resolved\": \"https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz\",\n      \"integrity\": \"sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=4.0.0\"\n      }\n    },\n    \"node_modules/diff\": {\n      \"version\": \"4.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/diff/-/diff-4.0.2.tgz\",\n      \"integrity\": \"sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=0.3.1\"\n      }\n    },\n    \"node_modules/eastasianwidth\": {\n      \"version\": \"0.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz\",\n      \"integrity\": \"sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==\",\n      \"dev\": true\n    },\n    \"node_modules/emoji-regex\": {\n      \"version\": \"9.2.2\",\n      \"resolved\": \"https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz\",\n      \"integrity\": \"sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==\",\n      \"dev\": true\n    },\n    \"node_modules/entities\": {\n      \"version\": \"3.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/entities/-/entities-3.0.1.tgz\",\n      \"integrity\": \"sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=0.12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/fb55/entities?sponsor=1\"\n      }\n    },\n    \"node_modules/foreground-child\": {\n      \"version\": \"3.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz\",\n      \"integrity\": \"sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"cross-spawn\": \"^7.0.0\",\n        \"signal-exit\": \"^4.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=14\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/isaacs\"\n      }\n    },\n    \"node_modules/fp-ts\": {\n      \"version\": \"2.16.11\",\n      \"resolved\": \"https://registry.npmjs.org/fp-ts/-/fp-ts-2.16.11.tgz\",\n      \"integrity\": \"sha512-LaI+KaX2NFkfn1ZGHoKCmcfv7yrZsC3b8NtWsTVQeHkq4F27vI5igUuO53sxqDEa2gNQMHFPmpojDw/1zmUK7w==\",\n      \"dev\": true,\n      \"license\": \"MIT\"\n    },\n    \"node_modules/fs-extra\": {\n      \"version\": \"11.4.1\",\n      \"resolved\": \"https://registry.npmjs.org/fs-extra/-/fs-extra-11.4.1.tgz\",\n      \"integrity\": \"sha512-KYAb4c9BJQI6QqGKthV68OHe0badztdXJWKo0WtBA9IuCFPTKvE5ZdUBglP833aMjhaSPNO4A5j/EkzZtGlKjA==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"graceful-fs\": \"^4.2.0\",\n        \"jsonfile\": \"^6.0.1\",\n        \"universalify\": \"^2.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=14.14\"\n      }\n    },\n    \"node_modules/get-stdin\": {\n      \"version\": \"9.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/get-stdin/-/get-stdin-9.0.0.tgz\",\n      \"integrity\": \"sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/glob\": {\n      \"version\": \"10.2.7\",\n      \"resolved\": \"https://registry.npmjs.org/glob/-/glob-10.2.7.tgz\",\n      \"integrity\": \"sha512-jTKehsravOJo8IJxUGfZILnkvVJM/MOfHRs8QcXolVef2zNI9Tqyy5+SeuOAZd3upViEZQLyFpQhYiHLrMUNmA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"foreground-child\": \"^3.1.0\",\n        \"jackspeak\": \"^2.0.3\",\n        \"minimatch\": \"^9.0.1\",\n        \"minipass\": \"^5.0.0 || ^6.0.2\",\n        \"path-scurry\": \"^1.7.0\"\n      },\n      \"bin\": {\n        \"glob\": \"dist/cjs/src/bin.js\"\n      },\n      \"engines\": {\n        \"node\": \">=16 || 14 >=14.17\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/isaacs\"\n      }\n    },\n    \"node_modules/graceful-fs\": {\n      \"version\": \"4.2.11\",\n      \"resolved\": \"https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz\",\n      \"integrity\": \"sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==\",\n      \"dev\": true\n    },\n    \"node_modules/ignore\": {\n      \"version\": \"5.2.4\",\n      \"resolved\": \"https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz\",\n      \"integrity\": \"sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">= 4\"\n      }\n    },\n    \"node_modules/ini\": {\n      \"version\": \"3.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/ini/-/ini-3.0.1.tgz\",\n      \"integrity\": \"sha512-it4HyVAUTKBc6m8e1iXWvXSTdndF7HbdN713+kvLrymxTaU4AUBWrJ4vEooP+V7fexnVD3LKcBshjGGPefSMUQ==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \"^12.13.0 || ^14.15.0 || >=16.0.0\"\n      }\n    },\n    \"node_modules/is-fullwidth-code-point\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz\",\n      \"integrity\": \"sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/isexe\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz\",\n      \"integrity\": \"sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==\",\n      \"dev\": true\n    },\n    \"node_modules/jackspeak\": {\n      \"version\": \"2.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/jackspeak/-/jackspeak-2.2.1.tgz\",\n      \"integrity\": \"sha512-MXbxovZ/Pm42f6cDIDkl3xpwv1AGwObKwfmjs2nQePiy85tP3fatofl3FC1aBsOtP/6fq5SbtgHwWcMsLP+bDw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@isaacs/cliui\": \"^8.0.2\"\n      },\n      \"engines\": {\n        \"node\": \">=14\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/isaacs\"\n      },\n      \"optionalDependencies\": {\n        \"@pkgjs/parseargs\": \"^0.11.0\"\n      }\n    },\n    \"node_modules/js-yaml\": {\n      \"version\": \"4.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz\",\n      \"integrity\": \"sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"argparse\": \"^2.0.1\"\n      },\n      \"bin\": {\n        \"js-yaml\": \"bin/js-yaml.js\"\n      }\n    },\n    \"node_modules/jsonc-parser\": {\n      \"version\": \"3.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz\",\n      \"integrity\": \"sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==\",\n      \"dev\": true\n    },\n    \"node_modules/jsonfile\": {\n      \"version\": \"6.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz\",\n      \"integrity\": \"sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"universalify\": \"^2.0.0\"\n      },\n      \"optionalDependencies\": {\n        \"graceful-fs\": \"^4.1.6\"\n      }\n    },\n    \"node_modules/linkify-it\": {\n      \"version\": \"4.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/linkify-it/-/linkify-it-4.0.1.tgz\",\n      \"integrity\": \"sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"uc.micro\": \"^1.0.1\"\n      }\n    },\n    \"node_modules/lru-cache\": {\n      \"version\": \"10.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.0.tgz\",\n      \"integrity\": \"sha512-svTf/fzsKHffP42sujkO/Rjs37BCIsQVRCeNYIm9WN8rgT7ffoUnRtZCqU+6BqcSBdv8gwJeTz8knJpgACeQMw==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \"14 || >=16.14\"\n      }\n    },\n    \"node_modules/make-error\": {\n      \"version\": \"1.3.6\",\n      \"resolved\": \"https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz\",\n      \"integrity\": \"sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==\",\n      \"dev\": true\n    },\n    \"node_modules/markdown-it\": {\n      \"version\": \"13.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/markdown-it/-/markdown-it-13.0.1.tgz\",\n      \"integrity\": \"sha512-lTlxriVoy2criHP0JKRhO2VDG9c2ypWCsT237eDiLqi09rmbKoUetyGHq2uOIRoRS//kfoJckS0eUzzkDR+k2Q==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"argparse\": \"^2.0.1\",\n        \"entities\": \"~3.0.1\",\n        \"linkify-it\": \"^4.0.1\",\n        \"mdurl\": \"^1.0.1\",\n        \"uc.micro\": \"^1.0.5\"\n      },\n      \"bin\": {\n        \"markdown-it\": \"bin/markdown-it.js\"\n      }\n    },\n    \"node_modules/markdownlint\": {\n      \"version\": \"0.29.0\",\n      \"resolved\": \"https://registry.npmjs.org/markdownlint/-/markdownlint-0.29.0.tgz\",\n      \"integrity\": \"sha512-ASAzqpODstu/Qsk0xW5BPgWnK/qjpBQ4e7IpsSvvFXcfYIjanLTdwFRJK1SIEEh0fGSMKXcJf/qhaZYHyME0wA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"markdown-it\": \"13.0.1\",\n        \"markdownlint-micromark\": \"0.1.5\"\n      },\n      \"engines\": {\n        \"node\": \">=16\"\n      }\n    },\n    \"node_modules/markdownlint-cli\": {\n      \"version\": \"0.35.0\",\n      \"resolved\": \"https://registry.npmjs.org/markdownlint-cli/-/markdownlint-cli-0.35.0.tgz\",\n      \"integrity\": \"sha512-lVIIIV1MrUtjoocgDqXLxUCxlRbn7Ve8rsWppfwciUNwLlNS28AhNiyQ3PU7jjj4Qvj+rWTTvwkqg7AcdG988g==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"commander\": \"~11.0.0\",\n        \"get-stdin\": \"~9.0.0\",\n        \"glob\": \"~10.2.7\",\n        \"ignore\": \"~5.2.4\",\n        \"js-yaml\": \"^4.1.0\",\n        \"jsonc-parser\": \"~3.2.0\",\n        \"markdownlint\": \"~0.29.0\",\n        \"minimatch\": \"~9.0.1\",\n        \"run-con\": \"~1.2.11\"\n      },\n      \"bin\": {\n        \"markdownlint\": \"markdownlint.js\"\n      },\n      \"engines\": {\n        \"node\": \">=16\"\n      }\n    },\n    \"node_modules/markdownlint-micromark\": {\n      \"version\": \"0.1.5\",\n      \"resolved\": \"https://registry.npmjs.org/markdownlint-micromark/-/markdownlint-micromark-0.1.5.tgz\",\n      \"integrity\": \"sha512-HvofNU4QCvfUCWnocQP1IAWaqop5wpWrB0mKB6SSh0fcpV0PdmQNS6tdUuFew1utpYlUvYYzz84oDkrD76GB9A==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=16\"\n      }\n    },\n    \"node_modules/marked\": {\n      \"version\": \"5.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/marked/-/marked-5.1.2.tgz\",\n      \"integrity\": \"sha512-ahRPGXJpjMjwSOlBoTMZAK7ATXkli5qCPxZ21TG44rx1KEo44bii4ekgTDQPNRQ4Kh7JMb9Ub1PVk1NxRSsorg==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"bin\": {\n        \"marked\": \"bin/marked.js\"\n      },\n      \"engines\": {\n        \"node\": \">= 16\"\n      }\n    },\n    \"node_modules/mdurl\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz\",\n      \"integrity\": \"sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==\",\n      \"dev\": true\n    },\n    \"node_modules/minimatch\": {\n      \"version\": \"9.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz\",\n      \"integrity\": \"sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"brace-expansion\": \"^2.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=16 || 14 >=14.17\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/isaacs\"\n      }\n    },\n    \"node_modules/minimist\": {\n      \"version\": \"1.2.8\",\n      \"resolved\": \"https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz\",\n      \"integrity\": \"sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==\",\n      \"dev\": true,\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/minipass\": {\n      \"version\": \"6.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/minipass/-/minipass-6.0.2.tgz\",\n      \"integrity\": \"sha512-MzWSV5nYVT7mVyWCwn2o7JH13w2TBRmmSqSRCKzTw+lmft9X4z+3wjvs06Tzijo5z4W/kahUCDpRXTF+ZrmF/w==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=16 || 14 >=14.17\"\n      }\n    },\n    \"node_modules/path-key\": {\n      \"version\": \"3.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz\",\n      \"integrity\": \"sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/path-scurry\": {\n      \"version\": \"1.10.1\",\n      \"resolved\": \"https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz\",\n      \"integrity\": \"sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"lru-cache\": \"^9.1.1 || ^10.0.0\",\n        \"minipass\": \"^5.0.0 || ^6.0.2 || ^7.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=16 || 14 >=14.17\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/isaacs\"\n      }\n    },\n    \"node_modules/prettier\": {\n      \"version\": \"3.9.10\",\n      \"resolved\": \"https://registry.npmjs.org/prettier/-/prettier-3.9.10.tgz\",\n      \"integrity\": \"sha512-skGHTH1Yb9QvaTC4hWnRTzEYtCpApF0UMBPz+t/0ZPzP8ihefo/btKd+QA7pUE0fEwA1SbS/NmhyEcstdXOIdA==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"bin\": {\n        \"prettier\": \"bin/prettier.cjs\"\n      },\n      \"engines\": {\n        \"node\": \">=14\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/prettier/prettier?sponsor=1\"\n      }\n    },\n    \"node_modules/run-con\": {\n      \"version\": \"1.2.12\",\n      \"resolved\": \"https://registry.npmjs.org/run-con/-/run-con-1.2.12.tgz\",\n      \"integrity\": \"sha512-5257ILMYIF4RztL9uoZ7V9Q97zHtNHn5bN3NobeAnzB1P3ASLgg8qocM2u+R18ttp+VEM78N2LK8XcNVtnSRrg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"deep-extend\": \"^0.6.0\",\n        \"ini\": \"~3.0.0\",\n        \"minimist\": \"^1.2.8\",\n        \"strip-json-comments\": \"~3.1.1\"\n      },\n      \"bin\": {\n        \"run-con\": \"cli.js\"\n      }\n    },\n    \"node_modules/shebang-command\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz\",\n      \"integrity\": \"sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"shebang-regex\": \"^3.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/shebang-regex\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz\",\n      \"integrity\": \"sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/signal-exit\": {\n      \"version\": \"4.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/signal-exit/-/signal-exit-4.0.2.tgz\",\n      \"integrity\": \"sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=14\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/isaacs\"\n      }\n    },\n    \"node_modules/string-width\": {\n      \"version\": \"5.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz\",\n      \"integrity\": \"sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"eastasianwidth\": \"^0.2.0\",\n        \"emoji-regex\": \"^9.2.2\",\n        \"strip-ansi\": \"^7.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/string-width-cjs\": {\n      \"name\": \"string-width\",\n      \"version\": \"4.2.3\",\n      \"resolved\": \"https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz\",\n      \"integrity\": \"sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"emoji-regex\": \"^8.0.0\",\n        \"is-fullwidth-code-point\": \"^3.0.0\",\n        \"strip-ansi\": \"^6.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/string-width-cjs/node_modules/ansi-regex\": {\n      \"version\": \"5.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz\",\n      \"integrity\": \"sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/string-width-cjs/node_modules/emoji-regex\": {\n      \"version\": \"8.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz\",\n      \"integrity\": \"sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==\",\n      \"dev\": true\n    },\n    \"node_modules/string-width-cjs/node_modules/strip-ansi\": {\n      \"version\": \"6.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz\",\n      \"integrity\": \"sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"ansi-regex\": \"^5.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/strip-ansi\": {\n      \"version\": \"7.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz\",\n      \"integrity\": \"sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"ansi-regex\": \"^6.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/chalk/strip-ansi?sponsor=1\"\n      }\n    },\n    \"node_modules/strip-ansi-cjs\": {\n      \"name\": \"strip-ansi\",\n      \"version\": \"6.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz\",\n      \"integrity\": \"sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"ansi-regex\": \"^5.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/strip-ansi-cjs/node_modules/ansi-regex\": {\n      \"version\": \"5.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz\",\n      \"integrity\": \"sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/strip-json-comments\": {\n      \"version\": \"3.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz\",\n      \"integrity\": \"sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=8\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/ts-node\": {\n      \"version\": \"10.9.2\",\n      \"resolved\": \"https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz\",\n      \"integrity\": \"sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@cspotcode/source-map-support\": \"^0.8.0\",\n        \"@tsconfig/node10\": \"^1.0.7\",\n        \"@tsconfig/node12\": \"^1.0.7\",\n        \"@tsconfig/node14\": \"^1.0.0\",\n        \"@tsconfig/node16\": \"^1.0.2\",\n        \"acorn\": \"^8.4.1\",\n        \"acorn-walk\": \"^8.1.1\",\n        \"arg\": \"^4.1.0\",\n        \"create-require\": \"^1.1.0\",\n        \"diff\": \"^4.0.1\",\n        \"make-error\": \"^1.1.1\",\n        \"v8-compile-cache-lib\": \"^3.0.1\",\n        \"yn\": \"3.1.1\"\n      },\n      \"bin\": {\n        \"ts-node\": \"dist/bin.js\",\n        \"ts-node-cwd\": \"dist/bin-cwd.js\",\n        \"ts-node-esm\": \"dist/bin-esm.js\",\n        \"ts-node-script\": \"dist/bin-script.js\",\n        \"ts-node-transpile-only\": \"dist/bin-transpile.js\",\n        \"ts-script\": \"dist/bin-script-deprecated.js\"\n      },\n      \"peerDependencies\": {\n        \"@swc/core\": \">=1.2.50\",\n        \"@swc/wasm\": \">=1.2.50\",\n        \"@types/node\": \"*\",\n        \"typescript\": \">=2.7\"\n      },\n      \"peerDependenciesMeta\": {\n        \"@swc/core\": {\n          \"optional\": true\n        },\n        \"@swc/wasm\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/typescript\": {\n      \"version\": \"5.4.5\",\n      \"resolved\": \"https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz\",\n      \"integrity\": \"sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==\",\n      \"dev\": true,\n      \"bin\": {\n        \"tsc\": \"bin/tsc\",\n        \"tsserver\": \"bin/tsserver\"\n      },\n      \"engines\": {\n        \"node\": \">=14.17\"\n      }\n    },\n    \"node_modules/uc.micro\": {\n      \"version\": \"1.0.6\",\n      \"resolved\": \"https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz\",\n      \"integrity\": \"sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==\",\n      \"dev\": true\n    },\n    \"node_modules/undici-types\": {\n      \"version\": \"6.21.0\",\n      \"resolved\": \"https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz\",\n      \"integrity\": \"sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==\",\n      \"dev\": true,\n      \"license\": \"MIT\"\n    },\n    \"node_modules/universalify\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz\",\n      \"integrity\": \"sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">= 10.0.0\"\n      }\n    },\n    \"node_modules/v8-compile-cache-lib\": {\n      \"version\": \"3.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz\",\n      \"integrity\": \"sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==\",\n      \"dev\": true\n    },\n    \"node_modules/which\": {\n      \"version\": \"2.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/which/-/which-2.0.2.tgz\",\n      \"integrity\": \"sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"isexe\": \"^2.0.0\"\n      },\n      \"bin\": {\n        \"node-which\": \"bin/node-which\"\n      },\n      \"engines\": {\n        \"node\": \">= 8\"\n      }\n    },\n    \"node_modules/wrap-ansi\": {\n      \"version\": \"8.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz\",\n      \"integrity\": \"sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"ansi-styles\": \"^6.1.0\",\n        \"string-width\": \"^5.0.1\",\n        \"strip-ansi\": \"^7.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/chalk/wrap-ansi?sponsor=1\"\n      }\n    },\n    \"node_modules/wrap-ansi-cjs\": {\n      \"name\": \"wrap-ansi\",\n      \"version\": \"7.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz\",\n      \"integrity\": \"sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"ansi-styles\": \"^4.0.0\",\n        \"string-width\": \"^4.1.0\",\n        \"strip-ansi\": \"^6.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/chalk/wrap-ansi?sponsor=1\"\n      }\n    },\n    \"node_modules/wrap-ansi-cjs/node_modules/ansi-regex\": {\n      \"version\": \"5.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz\",\n      \"integrity\": \"sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/wrap-ansi-cjs/node_modules/ansi-styles\": {\n      \"version\": \"4.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz\",\n      \"integrity\": \"sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"color-convert\": \"^2.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/chalk/ansi-styles?sponsor=1\"\n      }\n    },\n    \"node_modules/wrap-ansi-cjs/node_modules/emoji-regex\": {\n      \"version\": \"8.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz\",\n      \"integrity\": \"sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==\",\n      \"dev\": true\n    },\n    \"node_modules/wrap-ansi-cjs/node_modules/string-width\": {\n      \"version\": \"4.2.3\",\n      \"resolved\": \"https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz\",\n      \"integrity\": \"sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"emoji-regex\": \"^8.0.0\",\n        \"is-fullwidth-code-point\": \"^3.0.0\",\n        \"strip-ansi\": \"^6.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/wrap-ansi-cjs/node_modules/strip-ansi\": {\n      \"version\": \"6.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz\",\n      \"integrity\": \"sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"ansi-regex\": \"^5.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/yn\": {\n      \"version\": \"3.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/yn/-/yn-3.1.1.tgz\",\n      \"integrity\": \"sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=6\"\n      }\n    }\n  }\n}\n","tools/utilities-add-translation/README.md":"# utilities-add-translation Documentation\n\nPath: `tools/utilities-add-translation/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/gibbok/typescript-book/HEAD/tools/utilities-add-translation/README.md)"},"items":[{"name":"AGENTS.md","path":"AGENTS.md","rawUrl":"https://raw.githubusercontent.com/gibbok/typescript-book/HEAD/AGENTS.md","title":"AI Agent Protocol & Instructions","category":"root-instruction","format":"markdown","content":"# AGENTS.md\n\nFor review and editing work in this repository, use [.agents/skills/typescript-book-review/SKILL.md](.agents/skills/typescript-book-review/SKILL.md).\n\nThis guidance is for correcting TypeScript book content, Markdown, headings, and examples while keeping changes minimal and preserving the original meaning.\n\nFor creating TypeScript news pages, use [.agents/skills/create-typescript-news/SKILL.md](.agents/skills/create-typescript-news/SKILL.md).\n\nThis workflow requires user-provided source content, creates and synchronizes concise news pages for every website language, files them under the correct year, and verifies each article against its original source.\n","isInternal":false,"tokens":136,"sizeBytes":676},{"name":"SKILL.md","path":".agents/skills/create-typescript-news/SKILL.md","rawUrl":"https://raw.githubusercontent.com/gibbok/typescript-book/HEAD/.agents/skills/create-typescript-news/SKILL.md","title":"create-typescript-news","category":"anthropic-skill","format":"markdown","content":"---\nname: create-typescript-news\ndescription: Create and synchronize concise, source-faithful TypeScript news pages for every language configured in this repository's Astro/Starlight website. Use when asked to add, publish, translate, edit, remove, audit, or synchronize news in website/src/content/docs/typescript-news, or when a website language is added. Require an explicit source/context handoff before creating or materially editing a news item; the handoff may come from the user or from a preceding research workflow requested by the user containing verified sources, dates, and findings.\n---\n\n# Create TypeScript News\n\nCreate a TypeScript news article only from explicit source/context input, then translate and file it consistently across every configured website language.\n\n## Require source/context input\n\nBefore drafting or editing files, confirm that explicit source/context input is available. It may be either:\n\n* source content or announcement text supplied directly by the user; or\n* a research handoff produced by a preceding research step that the user explicitly requested, containing the selected topic, original authoritative source URL(s), publication date(s), and the factual findings to use.\n\nA research handoff is valid source/context input only when it identifies the original authoritative source and preserves enough factual detail to verify the article. Prefer official TypeScript, Microsoft, TC39, GitHub, and maintainer sources. Do not treat general model memory or an uncited topic suggestion as source/context input.\n\nIf neither form of source/context input is available, ask for:\n\n* the source content or announcement text;\n* the original source URL, if the user wants to provide it;\n* the publication date;\n* an optional preferred title or slug.\n\nStop after asking. Do not independently select a topic unless the user's workflow explicitly includes a preceding research-and-handoff step.\n\nIf source/context input is present but the publication date is missing and cannot be verified from the authoritative source, ask for it because the date determines the year directory and archive. The original source URL is optional only for directly user-supplied source content; a research handoff must include its original authoritative source URL(s).\n\nFor a translation audit, language addition, or removal, the existing English articles and any cited sources are the supplied content. Ask the user only when the master content or intended change is missing or ambiguous.\n\n## Inspect the current structure\n\nBefore writing:\n\n1. Read `website/src/config/locales.ts` to identify every configured locale. Do not hard-code the locale list.\n2. Read the latest English and translated files under `website/src/content/docs/typescript-news/`.\n3. Read `.agents/skills/typescript-book-review/SKILL.md` completely and apply its review, style, translation, and Markdown rules.\n4. Preserve the existing Astro/Starlight content conventions and use the shared news-list implementation.\n\n## Keep every language synchronized\n\nTreat the English `website/src/content/docs/typescript-news/` tree as the master and canonical news inventory. All translations must follow the English version's factual content, structure, metadata, year, and slug. Compare article paths relative to the English directory with the corresponding tree for every non-root locale configured in `website/src/config/locales.ts`.\n\nEvery English news article must have one translated article at the same relative year and slug path in every configured non-root locale. Do not rely on Starlight's content fallback to display English in place of a missing translation.\n\nApply changes across the entire language set:\n\n* When adding an article, create it in English and every configured non-root locale. The latest-news landing pages and yearly archives discover it automatically; do not add manual article lists to those pages.\n* When materially editing an article, apply the same factual change to every translation.\n* When changing a title, description, publication date, year, slug, source, or frontmatter field, make the corresponding change in every language.\n* When intentionally removing an English article, delete its translated file from every non-root locale.\n* When a localized article has no canonical English article, remove the orphaned file as part of synchronization.\n* When a new locale is added to `website/src/config/locales.ts`, create its localized news landing page, translate the complete English news archive, and create one localized yearly archive page for every year containing English articles.\n* When a locale is removed from `website/src/config/locales.ts`, do not treat its former files as a supported translation. Follow the scope of the locale-removal request for deleting the obsolete locale tree.\n\nKeep the set of relative article paths identical across English and every configured non-root locale. Preserve localized prose, but keep factual meaning, dates, slugs, commands, source URLs, and frontmatter synchronized.\n\n## Verify the source\n\nTreat the explicit source/context input as the authoritative basis for the article. When a research handoff is used, reopen and verify its original authoritative source URL(s) before publication.\n\n* Compare every date, version, feature, compatibility note, command, package name, option, number, and performance claim with the original source.\n* Open the supplied or handed-off source URL when accessible, giving preference to official TypeScript, Microsoft, TC39, GitHub, and maintainer sources.\n* Do not add claims from memory or infer unannounced behavior.\n* Remove details that cannot be supported by the source.\n* If the source/context conflicts with the original source or remains ambiguous, ask the user before publishing the disputed claim.\n* Link the original source in the article's `Source` section when a URL is available. Omit that section only when directly user-supplied source content has no URL.\n\n## Write the English article\n\nWrite a useful, concise summary rather than reproducing the source.\n\n* Lead with what was announced and why it matters to TypeScript developers.\n* Prefer short paragraphs and direct technical language.\n* Include only sections supported by the source. Use headings such as `## What changed`, `## Compatibility`, and `## Source` when they add value.\n* Preserve commands, package names, identifiers, compiler options, code, version numbers, and URLs exactly.\n* Avoid marketing language, speculation, filler, and lengthy history.\n* Use the publication date for both `lastUpdated` and `article:published_time` unless the source/context supplies a distinct verified update date.\n\nUse the established frontmatter pattern:\n\n```yaml\n---\ntitle: Article title\ndescription: A concise, source-supported description.\nlastUpdated: YYYY-MM-DD\nsidebar:\n    hidden: true\nhead:\n    - tag: meta\n      attrs:\n          property: article:published_time\n          content: 'YYYY-MM-DD'\n---\n```\n\nDo not add `sidebar.order` to news articles. Starlight hides individual articles from autogenerated sidebars through `sidebar.hidden: true`. Year links are generated from the English news-year directories and sorted newest first in `website/astro.config.mjs`.\n\n## Automatic latest-news lists and yearly archives\n\nThe shared `website/src/components/NewsList.astro` component reads the Starlight `docs` content collection at build time. It filters articles by locale and, for an archive, by year. It uses `article:published_time` as the publication date, sorts newest first, and uses the canonical English slug as the deterministic tie-breaker for articles published on the same date.\n\n* Keep each localized news landing page at `typescript-news/index.mdx`. It renders the latest 11 articles automatically; do not add, remove, or reorder article entries manually.\n* Keep one localized archive page at `typescript-news/YYYY/index.mdx` for every year with published English articles. Its localized title and description are page metadata; its `<NewsList locale=\"LOCALE\" year={YYYY} />` renders the localized article list automatically.\n* When the first article for a new year is added, create that year's archive page in English and every configured non-root locale. Do not edit older archive pages or article files just to update navigation order.\n* The news sidebar contains only year links. Its section label is read from each locale's news landing page title.\n\nRun the bundled verifier and focused list tests from the repository root after every news or locale change:\n\n```shell\npython3 .agents/skills/create-typescript-news/scripts/verify_news.py\nnpm --prefix website run test:news\n```\n\nThe verifier reads `website/src/config/locales.ts` and checks article path parity, valid publication dates, year-directory consistency, matching dates across translations, localized landing/archive pages, hidden article navigation, and the absence of `sidebar.order` metadata. The tests cover descending year order, newest-first article sorting, deterministic slug tie-breaking, and localized entries. Correct content or implementation issues rather than weakening the checks.\n\n## Save by publication year\n\nCreate the English article at:\n\n```text\nwebsite/src/content/docs/typescript-news/YYYY/article-slug.md\n```\n\nDerive `YYYY` from the verified publication date. Use a short, lowercase, hyphenated slug. Do not place article files directly in `typescript-news/`.\n\nCreate each translation at:\n\n```text\nwebsite/src/content/docs/LOCALE/typescript-news/YYYY/article-slug.md\n```\n\n## Create every translation\n\nFor each non-root locale configured in `website/src/config/locales.ts`:\n\n* Translate the title, description, headings, and prose naturally. The shared list formats publication dates using the locale's language tag.\n* Keep the same year, slug, publication date, frontmatter structure, Markdown structure, factual scope, and source URL, when present, as the English article.\n* Preserve commands, code, packages, options, identifiers, version numbers, and product names.\n* Do not translate official announcement titles inside source links unless the linked page itself uses that title.\n* Keep each translation faithful to the reviewed English article and the original source.\n\nThe landing-page and archive article lists are generated from content metadata, so do not edit them when adding an article.\n\n## Self-review\n\nReview the completed English article and every translation before building:\n\n1. Recheck each factual statement against the explicit source/context input and original source.\n2. Confirm no unsupported claim, date, number, command, package, or compatibility statement was introduced.\n3. Confirm the summary is useful and as concise as the subject permits.\n4. Confirm every translation preserves the English article's technical meaning.\n5. Confirm all configured locales have the article and matching publication metadata.\n6. Confirm paths, slugs, dates, source links, and frontmatter match across languages.\n7. Confirm Markdown follows `.agents/skills/typescript-book-review/SKILL.md`.\n8. Compare the complete English article inventory with every configured locale and confirm the relative path sets are identical.\n9. Confirm every added or edited English fact is reflected accurately in every translation.\n10. Confirm removed articles no longer exist in any configured language.\n11. Run `scripts/verify_news.py` and `npm --prefix website run test:news` and confirm both checks pass.\n12. Confirm a new-year archive page exists in every configured locale when the publication year is new.\n\nCorrect any issue found, then perform the source and translation accuracy comparison once more.\n\n## Validate the website\n\nFrom `website/`, run:\n\n```shell\nnpm run build\n```\n\nVerify:\n\n* the news verifier and focused list tests pass;\n* Astro reports no content or build errors;\n* the TypeScript News sidebar displays only years, newest first, with no individual article links;\n* clicking a year opens its localized archive page, and archive article links open the existing localized article URLs;\n* yearly archives and the latest-news landing page display localized articles in the expected order;\n* the English and every localized route are generated under the correct year, including Arabic with its RTL direction;\n* existing article canonical URLs, descriptions, and `article:published_time` metadata remain correct;\n* existing article routes and archive routes appear in the generated sitemap;\n* no duplicate article routes or unexpected missing routes are introduced.\n\nReport the created paths, source used, accuracy review, and build result. Commit or publish changes only when the user requests it.\n","frontmatter":{"name":"create-typescript-news","description":"Create and synchronize concise, source-faithful TypeScript news pages for every language configured in this repository's Astro/Starlight website. Use when asked to add, publish, translate, edit, remove, audit, or synchronize news in website/src/content/docs/typescript-news, or when a website language is added. Require an explicit source/context handoff before creating or materially editing a news item; the handoff may come from the user or from a preceding research workflow requested by the user containing verified sources, dates, and findings."},"isInternal":false,"tokens":2435,"sizeBytes":12667},{"name":"SKILL.md","path":".agents/skills/typescript-book-review/SKILL.md","rawUrl":"https://raw.githubusercontent.com/gibbok/typescript-book/HEAD/.agents/skills/typescript-book-review/SKILL.md","title":"typescript-book-review","category":"anthropic-skill","format":"markdown","content":"---\n\nname: typescript-book-review\ndescription: Review and editing guide for TypeScript book and reference content in the style of The Concise TypeScript Book. Use when reviewing or editing educational prose, translated or non-English content, code examples, chapters, table-of-contents entries, or Markdown formatting in this repository to identify and fix typos, grammar mistakes, formatting problems, and minor clarity issues without altering the original meaning or the book’s concise, practical, example-driven style.\n---\n\n# TypeScript Book Review\n\nUse this skill to review and edit TypeScript educational content while keeping it consistent with the rest of the book.\n\n## Review and Editing Rules\n\nReview the content carefully and make only justified corrections.\n\n* Fix spelling mistakes and typographical errors.\n* Fix grammar, punctuation, capitalization, and awkward sentence structure.\n* Fix incorrect, inconsistent, or broken Markdown formatting.\n* Make minor wording changes when they improve clarity or readability.\n* Preserve the original technical meaning and intent.\n* Do not introduce new claims, concepts, examples, recommendations, or explanations unless explicitly requested.\n* Do not substantially rewrite content that is already clear and correct.\n* Do not change the difficulty level or intended audience.\n* Do not alter valid code examples unless a correction is required.\n* Do not change identifiers, literal values, commands, or compiler options without a technical reason.\n* Never modify code merely to match a personal preference.\n* Preserve the existing structure unless a small organizational correction clearly improves readability.\n* Keep edits minimal, focused, and easy to review.\n\nWhen a sentence can be corrected in more than one way, prefer the version closest to the original wording.\n\n## Core Style\n\nMaintain a concise technical-reference style:\n\n* Explain concepts directly and avoid storytelling.\n* Use short paragraphs, usually one idea per paragraph.\n* Prefer precise, beginner-friendly language without oversimplifying TypeScript behavior.\n* Define the concept first, then explain why it matters or how TypeScript handles it.\n* State validity, errors, inference results, and runtime behavior explicitly.\n* Keep examples small and focused on one point.\n* Avoid marketing language, jokes, and lengthy historical context unless they clarify the feature.\n\n## Language and Translation\n\nUse the language requested by the user or already used by the file being edited.\n\n* Preserve the target language of translated content unless the user asks for a different language.\n* Correct grammar, spelling, punctuation, and idiomatic phrasing in the target language.\n* Keep the translation faithful to the original technical meaning.\n* Preserve TypeScript terms, identifiers, literal values, commands, compiler options, code comments, and error text unless a correction is required.\n* Do not replace established technical terms with awkward literal translations.\n* Keep examples and Markdown structure aligned with the source content when reviewing translated files.\n* If a source and translation disagree technically, preserve the TypeScript meaning and make the smallest correction needed.\n\n## Organization\n\nKeep content structured as a book chapter or reference section:\n\n* Use `##` for major topics and `###` or `####` for focused subtopics.\n* Keep headings descriptive and suitable for the table of contents.\n* Start each section with a brief explanation before showing code.\n* Split long topics into short subtopics instead of using one long section.\n* Group related examples together: basic syntax, valid usage, invalid usage, and practical notes.\n* Preserve compatibility with generated Markdown tables of contents.\n* Avoid changing headings unless the change is required to correct an error or improve clarity.\n* When changing a heading, update any corresponding table-of-contents entry or internal link.\n\n## Explanation Pattern\n\nUse this default flow when reviewing new or revised sections:\n\n1. Name the TypeScript feature or concept.\n2. Describe what it does in one or two paragraphs.\n3. Show a minimal TypeScript example.\n4. Explain the inferred type, compiler result, or runtime behavior.\n5. Add a second example only when it clarifies an edge case or common usage.\n6. End with a practical recommendation only when it follows directly from the example.\n\nPrefer direct formulations:\n\n* `TypeScript infers the type as ...`\n* `The following example is valid TypeScript code.`\n* `The following code produces an error:`\n* `This is useful when ...`\n* `At runtime, ...`\n\nDo not replace existing phrasing with these formulations when the current wording is already clear and consistent.\n\n## Code Examples\n\nReview examples for consistency without unnecessarily rewriting them:\n\n* Use fenced code blocks with `typescript`, `shell`, `json`, or `text`.\n* Add `<!-- skip -->` immediately before TypeScript snippets that are intentionally invalid, incomplete, illustrative only, or not expected to compile.\n* Use compact names such as `X`, `Y`, `Person`, `Animal`, `Dog`, or domain-neutral names when the domain is not important.\n* Prefer single-quoted strings in TypeScript examples.\n* Use inline comments to identify validity, inferred types, or compiler errors.\n* Keep comments short: `// Valid`, `// Invalid`, `// Type inferred is string`.\n* Show compiler messages in `text` blocks when the exact error helps explain the concept.\n* Avoid large applications, frameworks, or unrelated dependencies unless the section is specifically about them.\n* Preserve the behavior and educational purpose of every example.\n* Do not change code solely for stylistic consistency when doing so would create a large or unnecessary diff.\n\nExample pattern:\n\n<!-- skip -->\n```typescript\ntype X = {\n    a: string;\n};\n\nconst value: X = { a: 'a', b: 'b' }; // Invalid\n```\n\nObject literal may only specify known properties.\n\n## Markdown Conventions\n\nApply the book’s Markdown conventions consistently:\n\n* Use `*` for unordered lists.\n* Use inline code for identifiers, file names, compiler options, commands, and literal values.\n* Use links directly when they provide useful reference material.\n* Use `Notes:` only for short, concrete notes.\n* Use markdownlint comments sparingly and only when a formatting exception is necessary.\n* Do not add extra frontmatter to book chapters unless the repository format requires it.\n* Fix malformed lists, code fences, links, headings, spacing, and indentation.\n* Preserve intentional Markdown exceptions when they are required by the repository tooling.\n\n## TypeScript Content Conventions\n\nWhen reviewing TypeScript explanations:\n\n* Distinguish compile-time type checking from JavaScript runtime behavior.\n* Mention type erasure when runtime behavior could otherwise be misunderstood.\n* Prefer examples that demonstrate inference, assignability, narrowing, structural typing, configuration, or emitted JavaScript behavior.\n* When discussing migrations, recommend gradual migration and avoid refactoring during type conversion.\n* When discussing configuration, explain the option’s effect and give a practical default only when the recommendation is clear.\n* Avoid asserting version-specific behavior unless it has been verified against the repository’s target TypeScript version.\n* Do not alter technical statements unless the original statement is incorrect, misleading, or unclear.\n* Verify technical corrections before applying them.\n\n## Table of Contents and Headings\n\nTreat heading and table-of-contents consistency as a critical review requirement.\n\n* Confirm every table-of-contents entry matches its corresponding heading.\n* Confirm heading text, capitalization, punctuation, and anchor generation remain compatible.\n* Avoid special characters in table-of-contents entries unless the matching heading requires them.\n* Keep table-of-contents entries plain and compatible with generated Markdown anchors.\n* Check all changed headings against the table of contents at least twice.\n* Check all changed table-of-contents entries against their headings at least twice.\n* Confirm renamed, added, moved, or removed sections are reflected correctly.\n* Confirm internal links still point to valid headings.\n* Do not change a heading without checking every related table-of-contents entry and internal reference.\n\n## Review Checklist\n\nBefore finishing a review:\n\n* Confirm all spelling and typographical errors have been corrected.\n* Confirm grammar, punctuation, and capitalization are correct.\n* Confirm translated or non-English content uses the requested language consistently when applicable.\n* Confirm minor wording changes preserve the original meaning.\n* Confirm no unnecessary rewriting or expansion was introduced.\n* Confirm the heading level fits the surrounding chapter structure.\n* Confirm examples are minimal and directly support the explanation.\n* Confirm code examples retain their original behavior and purpose.\n* Confirm invalid or illustrative snippets use `<!-- skip -->`.\n* Confirm code fences use the correct language.\n* Confirm Markdown formatting is valid and consistent.\n* Confirm prose is concise, direct, and free of unrelated background.\n* Confirm table-of-contents compatibility when headings were added, removed, moved, or renamed.\n* Confirm table-of-contents entries avoid unnecessary special characters.\n* Confirm headings, table-of-contents entries, anchors, and internal links were checked twice.\n* Review the final diff and remove any change that is unnecessary or alters the original meaning.\n","frontmatter":{"name":"typescript-book-review","description":"Review and editing guide for TypeScript book and reference content in the style of The Concise TypeScript Book. Use when reviewing or editing educational prose, translated or non-English content, code examples, chapters, table-of-contents entries, or Markdown formatting in this repository to identify and fix typos, grammar mistakes, formatting problems, and minor clarity issues without altering the original meaning or the book’s concise, practical, example-driven style."},"isInternal":false,"tokens":1770,"sizeBytes":9581},{"name":".markdownlint.json","path":"tools/.markdownlint.json","rawUrl":"https://raw.githubusercontent.com/gibbok/typescript-book/HEAD/tools/.markdownlint.json","title":"Tools Skill","category":"anthropic-skill","format":"json","content":"{\n    \"code-block-style\": {\n        \"style\": \"fenced\"\n    },\n    \"code-fence-style\": {\n        \"style\": \"backtick\"\n    },\n    \"emphasis-style\": {\n        \"style\": \"asterisk\"\n    },\n    \"fenced-code-language\": {\n        \"allowed_languages\": [\n            \"shell\",\n            \"json\",\n            \"typescript\",\n            \"javascript\",\n            \"text\"\n        ],\n        \"language_only\": true\n    },\n    \"heading-style\": {\n        \"style\": \"atx\"\n    },\n    \"hr-style\": {\n        \"style\": \"---\"\n    },\n    \"line-length\": false,\n    \"no-duplicate-heading\": {\n        \"siblings_only\": true\n    },\n    \"ol-prefix\": {\n        \"style\": \"ordered\"\n    },\n    \"proper-names\": {\n        \"code_blocks\": false,\n        \"names\": [\n            \"TypeScript\",\n            \"Ctrl\",\n            \"JavaScript\",\n            \"Markdown\",\n            \"Node.js\",\n            \"Visual Studio Code\",\n            \"Microsoft\",\n            \"LinkedIn\",\n            \"GitHub\",\n            \"Twitter\",\n            \"Email\",\n            \"IntelliSense\",\n            \"ECMAScript\"\n        ]\n    },\n    \"required-headings\": false,\n    \"strong-style\": {\n        \"style\": \"asterisk\"\n    },\n    \"ul-style\": {\n        \"style\": \"asterisk\"\n    }\n}","frontmatter":{"code-block-style":{"style":"fenced"},"code-fence-style":{"style":"backtick"},"emphasis-style":{"style":"asterisk"},"fenced-code-language":{"allowed_languages":["shell","json","typescript","javascript","text"],"language_only":true},"heading-style":{"style":"atx"},"hr-style":{"style":"---"},"line-length":false,"no-duplicate-heading":{"siblings_only":true},"ol-prefix":{"style":"ordered"},"proper-names":{"code_blocks":false,"names":["TypeScript","Ctrl","JavaScript","Markdown","Node.js","Visual Studio Code","Microsoft","LinkedIn","GitHub","Twitter","Email","IntelliSense","ECMAScript"]},"required-headings":false,"strong-style":{"style":"asterisk"},"ul-style":{"style":"asterisk"}},"isInternal":false,"tokens":289,"sizeBytes":1200},{"name":"launch.json","path":"tools/.vscode/launch.json","rawUrl":"https://raw.githubusercontent.com/gibbok/typescript-book/HEAD/tools/.vscode/launch.json","title":".vscode Skill","category":"anthropic-skill","format":"json","content":"{\n    \"version\": \"0.2.0\",\n    \"configurations\": [\n        {\n            \"name\": \"Debug lint\",\n            \"type\": \"node\",\n            \"request\": \"launch\",\n            \"runtimeExecutable\": \"node\",\n            \"runtimeArgs\": [\n                \"--nolazy\",\n                \"-r\",\n                \"${workspaceRoot}/node_modules/ts-node/register/transpile-only\"\n            ],\n            \"args\": [\n                \"lint.ts\",\n                \"--example\",\n                \"hello\"\n            ],\n            \"cwd\": \"${workspaceRoot}\",\n            \"internalConsoleOptions\": \"openOnSessionStart\",\n            \"skipFiles\": [\n                \"<node_internals>/**\",\n                \"node_modules/**\"\n            ]\n        },\n        {\n            \"name\": \"Python: Current File\",\n            \"type\": \"python\",\n            \"request\": \"launch\",\n            \"program\": \"${file}\",\n            \"console\": \"integratedTerminal\",\n            \"justMyCode\": true\n        }\n    ]\n}","frontmatter":{"version":"0.2.0","configurations":[{"name":"Debug lint","type":"node","request":"launch","runtimeExecutable":"node","runtimeArgs":["--nolazy","-r","${workspaceRoot}/node_modules/ts-node/register/transpile-only"],"args":["lint.ts","--example","hello"],"cwd":"${workspaceRoot}","internalConsoleOptions":"openOnSessionStart","skipFiles":["<node_internals>/**","node_modules/**"]},{"name":"Python: Current File","type":"python","request":"launch","program":"${file}","console":"integratedTerminal","justMyCode":true}]},"isInternal":false,"tokens":201,"sizeBytes":955},{"name":"settings.json","path":"tools/.vscode/settings.json","rawUrl":"https://raw.githubusercontent.com/gibbok/typescript-book/HEAD/tools/.vscode/settings.json","title":".vscode Skill","category":"anthropic-skill","format":"json","content":"{\n    \"editor.formatOnSave\": true,\n}","isInternal":false,"tokens":11,"sizeBytes":36},{"name":"package-lock.json","path":"tools/package-lock.json","rawUrl":"https://raw.githubusercontent.com/gibbok/typescript-book/HEAD/tools/package-lock.json","title":"typescript-book","category":"anthropic-skill","format":"json","content":"{\n  \"name\": \"typescript-book\",\n  \"version\": \"1.0.0\",\n  \"lockfileVersion\": 3,\n  \"requires\": true,\n  \"packages\": {\n    \"\": {\n      \"name\": \"typescript-book\",\n      \"version\": \"1.0.0\",\n      \"license\": \"ISC\",\n      \"devDependencies\": {\n        \"@types/fs-extra\": \"^11.0.4\",\n        \"@types/marked\": \"^5.0.0\",\n        \"@types/node\": \"^20.19.43\",\n        \"@types/prettier\": \"^3.0.0\",\n        \"fp-ts\": \"^2.16.11\",\n        \"fs-extra\": \"^11.4.1\",\n        \"markdownlint-cli\": \"^0.35.0\",\n        \"marked\": \"^5.1.2\",\n        \"prettier\": \"^3.9.10\",\n        \"ts-node\": \"^10.9.2\",\n        \"typescript\": \"^5.4.5\"\n      }\n    },\n    \"node_modules/@cspotcode/source-map-support\": {\n      \"version\": \"0.8.1\",\n      \"resolved\": \"https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz\",\n      \"integrity\": \"sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@jridgewell/trace-mapping\": \"0.3.9\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      }\n    },\n    \"node_modules/@isaacs/cliui\": {\n      \"version\": \"8.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz\",\n      \"integrity\": \"sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"string-width\": \"^5.1.2\",\n        \"string-width-cjs\": \"npm:string-width@^4.2.0\",\n        \"strip-ansi\": \"^7.0.1\",\n        \"strip-ansi-cjs\": \"npm:strip-ansi@^6.0.1\",\n        \"wrap-ansi\": \"^8.1.0\",\n        \"wrap-ansi-cjs\": \"npm:wrap-ansi@^7.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      }\n    },\n    \"node_modules/@jridgewell/resolve-uri\": {\n      \"version\": \"3.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz\",\n      \"integrity\": \"sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=6.0.0\"\n      }\n    },\n    \"node_modules/@jridgewell/sourcemap-codec\": {\n      \"version\": \"1.4.15\",\n      \"resolved\": \"https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz\",\n      \"integrity\": \"sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==\",\n      \"dev\": true\n    },\n    \"node_modules/@jridgewell/trace-mapping\": {\n      \"version\": \"0.3.9\",\n      \"resolved\": \"https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz\",\n      \"integrity\": \"sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@jridgewell/resolve-uri\": \"^3.0.3\",\n        \"@jridgewell/sourcemap-codec\": \"^1.4.10\"\n      }\n    },\n    \"node_modules/@pkgjs/parseargs\": {\n      \"version\": \"0.11.0\",\n      \"resolved\": \"https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz\",\n      \"integrity\": \"sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==\",\n      \"dev\": true,\n      \"optional\": true,\n      \"engines\": {\n        \"node\": \">=14\"\n      }\n    },\n    \"node_modules/@tsconfig/node10\": {\n      \"version\": \"1.0.9\",\n      \"resolved\": \"https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz\",\n      \"integrity\": \"sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==\",\n      \"dev\": true\n    },\n    \"node_modules/@tsconfig/node12\": {\n      \"version\": \"1.0.11\",\n      \"resolved\": \"https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz\",\n      \"integrity\": \"sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==\",\n      \"dev\": true\n    },\n    \"node_modules/@tsconfig/node14\": {\n      \"version\": \"1.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz\",\n      \"integrity\": \"sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==\",\n      \"dev\": true\n    },\n    \"node_modules/@tsconfig/node16\": {\n      \"version\": \"1.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz\",\n      \"integrity\": \"sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==\",\n      \"dev\": true\n    },\n    \"node_modules/@types/fs-extra\": {\n      \"version\": \"11.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/@types/fs-extra/-/fs-extra-11.0.4.tgz\",\n      \"integrity\": \"sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@types/jsonfile\": \"*\",\n        \"@types/node\": \"*\"\n      }\n    },\n    \"node_modules/@types/jsonfile\": {\n      \"version\": \"6.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/@types/jsonfile/-/jsonfile-6.1.1.tgz\",\n      \"integrity\": \"sha512-GSgiRCVeapDN+3pqA35IkQwasaCh/0YFH5dEF6S88iDvEn901DjOeH3/QPY+XYP1DFzDZPvIvfeEgk+7br5png==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@types/node\": \"*\"\n      }\n    },\n    \"node_modules/@types/marked\": {\n      \"version\": \"5.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/@types/marked/-/marked-5.0.0.tgz\",\n      \"integrity\": \"sha512-YcZe50jhltsCq7rc9MNZC/4QB/OnA2Pd6hrOSTOFajtabN+38slqgDDCeE/0F83SjkKBQcsZUj7VLWR0H5cKRA==\",\n      \"dev\": true\n    },\n    \"node_modules/@types/node\": {\n      \"version\": \"20.19.43\",\n      \"resolved\": \"https://registry.npmjs.org/@types/node/-/node-20.19.43.tgz\",\n      \"integrity\": \"sha512-6oYBAi5ikg4Pl+kGsoYtawUMBT2zZMCvPNF7pVLnHZfd1zf38DRiWn/gT01RYCdUqkv7Fhr+C9ot4/tb+2sVvA==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"undici-types\": \"~6.21.0\"\n      }\n    },\n    \"node_modules/@types/prettier\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/@types/prettier/-/prettier-3.0.0.tgz\",\n      \"integrity\": \"sha512-mFMBfMOz8QxhYVbuINtswBp9VL2b4Y0QqYHwqLz3YbgtfAcat2Dl6Y1o4e22S/OVE6Ebl9m7wWiMT2lSbAs1wA==\",\n      \"deprecated\": \"This is a stub types definition. prettier provides its own type definitions, so you do not need this installed.\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"prettier\": \"*\"\n      }\n    },\n    \"node_modules/acorn\": {\n      \"version\": \"8.9.0\",\n      \"resolved\": \"https://registry.npmjs.org/acorn/-/acorn-8.9.0.tgz\",\n      \"integrity\": \"sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ==\",\n      \"dev\": true,\n      \"bin\": {\n        \"acorn\": \"bin/acorn\"\n      },\n      \"engines\": {\n        \"node\": \">=0.4.0\"\n      }\n    },\n    \"node_modules/acorn-walk\": {\n      \"version\": \"8.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz\",\n      \"integrity\": \"sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=0.4.0\"\n      }\n    },\n    \"node_modules/ansi-regex\": {\n      \"version\": \"6.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz\",\n      \"integrity\": \"sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/chalk/ansi-regex?sponsor=1\"\n      }\n    },\n    \"node_modules/ansi-styles\": {\n      \"version\": \"6.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz\",\n      \"integrity\": \"sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/chalk/ansi-styles?sponsor=1\"\n      }\n    },\n    \"node_modules/arg\": {\n      \"version\": \"4.1.3\",\n      \"resolved\": \"https://registry.npmjs.org/arg/-/arg-4.1.3.tgz\",\n      \"integrity\": \"sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==\",\n      \"dev\": true\n    },\n    \"node_modules/argparse\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz\",\n      \"integrity\": \"sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==\",\n      \"dev\": true\n    },\n    \"node_modules/balanced-match\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz\",\n      \"integrity\": \"sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==\",\n      \"dev\": true\n    },\n    \"node_modules/brace-expansion\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz\",\n      \"integrity\": \"sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"balanced-match\": \"^1.0.0\"\n      }\n    },\n    \"node_modules/color-convert\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz\",\n      \"integrity\": \"sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"color-name\": \"~1.1.4\"\n      },\n      \"engines\": {\n        \"node\": \">=7.0.0\"\n      }\n    },\n    \"node_modules/color-name\": {\n      \"version\": \"1.1.4\",\n      \"resolved\": \"https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz\",\n      \"integrity\": \"sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==\",\n      \"dev\": true\n    },\n    \"node_modules/commander\": {\n      \"version\": \"11.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/commander/-/commander-11.0.0.tgz\",\n      \"integrity\": \"sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=16\"\n      }\n    },\n    \"node_modules/create-require\": {\n      \"version\": \"1.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz\",\n      \"integrity\": \"sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==\",\n      \"dev\": true\n    },\n    \"node_modules/cross-spawn\": {\n      \"version\": \"7.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz\",\n      \"integrity\": \"sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"path-key\": \"^3.1.0\",\n        \"shebang-command\": \"^2.0.0\",\n        \"which\": \"^2.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 8\"\n      }\n    },\n    \"node_modules/deep-extend\": {\n      \"version\": \"0.6.0\",\n      \"resolved\": \"https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz\",\n      \"integrity\": \"sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=4.0.0\"\n      }\n    },\n    \"node_modules/diff\": {\n      \"version\": \"4.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/diff/-/diff-4.0.2.tgz\",\n      \"integrity\": \"sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=0.3.1\"\n      }\n    },\n    \"node_modules/eastasianwidth\": {\n      \"version\": \"0.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz\",\n      \"integrity\": \"sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==\",\n      \"dev\": true\n    },\n    \"node_modules/emoji-regex\": {\n      \"version\": \"9.2.2\",\n      \"resolved\": \"https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz\",\n      \"integrity\": \"sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==\",\n      \"dev\": true\n    },\n    \"node_modules/entities\": {\n      \"version\": \"3.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/entities/-/entities-3.0.1.tgz\",\n      \"integrity\": \"sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=0.12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/fb55/entities?sponsor=1\"\n      }\n    },\n    \"node_modules/foreground-child\": {\n      \"version\": \"3.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz\",\n      \"integrity\": \"sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"cross-spawn\": \"^7.0.0\",\n        \"signal-exit\": \"^4.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=14\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/isaacs\"\n      }\n    },\n    \"node_modules/fp-ts\": {\n      \"version\": \"2.16.11\",\n      \"resolved\": \"https://registry.npmjs.org/fp-ts/-/fp-ts-2.16.11.tgz\",\n      \"integrity\": \"sha512-LaI+KaX2NFkfn1ZGHoKCmcfv7yrZsC3b8NtWsTVQeHkq4F27vI5igUuO53sxqDEa2gNQMHFPmpojDw/1zmUK7w==\",\n      \"dev\": true,\n      \"license\": \"MIT\"\n    },\n    \"node_modules/fs-extra\": {\n      \"version\": \"11.4.1\",\n      \"resolved\": \"https://registry.npmjs.org/fs-extra/-/fs-extra-11.4.1.tgz\",\n      \"integrity\": \"sha512-KYAb4c9BJQI6QqGKthV68OHe0badztdXJWKo0WtBA9IuCFPTKvE5ZdUBglP833aMjhaSPNO4A5j/EkzZtGlKjA==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"graceful-fs\": \"^4.2.0\",\n        \"jsonfile\": \"^6.0.1\",\n        \"universalify\": \"^2.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=14.14\"\n      }\n    },\n    \"node_modules/get-stdin\": {\n      \"version\": \"9.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/get-stdin/-/get-stdin-9.0.0.tgz\",\n      \"integrity\": \"sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/glob\": {\n      \"version\": \"10.2.7\",\n      \"resolved\": \"https://registry.npmjs.org/glob/-/glob-10.2.7.tgz\",\n      \"integrity\": \"sha512-jTKehsravOJo8IJxUGfZILnkvVJM/MOfHRs8QcXolVef2zNI9Tqyy5+SeuOAZd3upViEZQLyFpQhYiHLrMUNmA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"foreground-child\": \"^3.1.0\",\n        \"jackspeak\": \"^2.0.3\",\n        \"minimatch\": \"^9.0.1\",\n        \"minipass\": \"^5.0.0 || ^6.0.2\",\n        \"path-scurry\": \"^1.7.0\"\n      },\n      \"bin\": {\n        \"glob\": \"dist/cjs/src/bin.js\"\n      },\n      \"engines\": {\n        \"node\": \">=16 || 14 >=14.17\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/isaacs\"\n      }\n    },\n    \"node_modules/graceful-fs\": {\n      \"version\": \"4.2.11\",\n      \"resolved\": \"https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz\",\n      \"integrity\": \"sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==\",\n      \"dev\": true\n    },\n    \"node_modules/ignore\": {\n      \"version\": \"5.2.4\",\n      \"resolved\": \"https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz\",\n      \"integrity\": \"sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">= 4\"\n      }\n    },\n    \"node_modules/ini\": {\n      \"version\": \"3.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/ini/-/ini-3.0.1.tgz\",\n      \"integrity\": \"sha512-it4HyVAUTKBc6m8e1iXWvXSTdndF7HbdN713+kvLrymxTaU4AUBWrJ4vEooP+V7fexnVD3LKcBshjGGPefSMUQ==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \"^12.13.0 || ^14.15.0 || >=16.0.0\"\n      }\n    },\n    \"node_modules/is-fullwidth-code-point\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz\",\n      \"integrity\": \"sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/isexe\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz\",\n      \"integrity\": \"sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==\",\n      \"dev\": true\n    },\n    \"node_modules/jackspeak\": {\n      \"version\": \"2.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/jackspeak/-/jackspeak-2.2.1.tgz\",\n      \"integrity\": \"sha512-MXbxovZ/Pm42f6cDIDkl3xpwv1AGwObKwfmjs2nQePiy85tP3fatofl3FC1aBsOtP/6fq5SbtgHwWcMsLP+bDw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@isaacs/cliui\": \"^8.0.2\"\n      },\n      \"engines\": {\n        \"node\": \">=14\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/isaacs\"\n      },\n      \"optionalDependencies\": {\n        \"@pkgjs/parseargs\": \"^0.11.0\"\n      }\n    },\n    \"node_modules/js-yaml\": {\n      \"version\": \"4.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz\",\n      \"integrity\": \"sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"argparse\": \"^2.0.1\"\n      },\n      \"bin\": {\n        \"js-yaml\": \"bin/js-yaml.js\"\n      }\n    },\n    \"node_modules/jsonc-parser\": {\n      \"version\": \"3.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz\",\n      \"integrity\": \"sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==\",\n      \"dev\": true\n    },\n    \"node_modules/jsonfile\": {\n      \"version\": \"6.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz\",\n      \"integrity\": \"sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"universalify\": \"^2.0.0\"\n      },\n      \"optionalDependencies\": {\n        \"graceful-fs\": \"^4.1.6\"\n      }\n    },\n    \"node_modules/linkify-it\": {\n      \"version\": \"4.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/linkify-it/-/linkify-it-4.0.1.tgz\",\n      \"integrity\": \"sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"uc.micro\": \"^1.0.1\"\n      }\n    },\n    \"node_modules/lru-cache\": {\n      \"version\": \"10.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.0.tgz\",\n      \"integrity\": \"sha512-svTf/fzsKHffP42sujkO/Rjs37BCIsQVRCeNYIm9WN8rgT7ffoUnRtZCqU+6BqcSBdv8gwJeTz8knJpgACeQMw==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \"14 || >=16.14\"\n      }\n    },\n    \"node_modules/make-error\": {\n      \"version\": \"1.3.6\",\n      \"resolved\": \"https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz\",\n      \"integrity\": \"sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==\",\n      \"dev\": true\n    },\n    \"node_modules/markdown-it\": {\n      \"version\": \"13.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/markdown-it/-/markdown-it-13.0.1.tgz\",\n      \"integrity\": \"sha512-lTlxriVoy2criHP0JKRhO2VDG9c2ypWCsT237eDiLqi09rmbKoUetyGHq2uOIRoRS//kfoJckS0eUzzkDR+k2Q==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"argparse\": \"^2.0.1\",\n        \"entities\": \"~3.0.1\",\n        \"linkify-it\": \"^4.0.1\",\n        \"mdurl\": \"^1.0.1\",\n        \"uc.micro\": \"^1.0.5\"\n      },\n      \"bin\": {\n        \"markdown-it\": \"bin/markdown-it.js\"\n      }\n    },\n    \"node_modules/markdownlint\": {\n      \"version\": \"0.29.0\",\n      \"resolved\": \"https://registry.npmjs.org/markdownlint/-/markdownlint-0.29.0.tgz\",\n      \"integrity\": \"sha512-ASAzqpODstu/Qsk0xW5BPgWnK/qjpBQ4e7IpsSvvFXcfYIjanLTdwFRJK1SIEEh0fGSMKXcJf/qhaZYHyME0wA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"markdown-it\": \"13.0.1\",\n        \"markdownlint-micromark\": \"0.1.5\"\n      },\n      \"engines\": {\n        \"node\": \">=16\"\n      }\n    },\n    \"node_modules/markdownlint-cli\": {\n      \"version\": \"0.35.0\",\n      \"resolved\": \"https://registry.npmjs.org/markdownlint-cli/-/markdownlint-cli-0.35.0.tgz\",\n      \"integrity\": \"sha512-lVIIIV1MrUtjoocgDqXLxUCxlRbn7Ve8rsWppfwciUNwLlNS28AhNiyQ3PU7jjj4Qvj+rWTTvwkqg7AcdG988g==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"commander\": \"~11.0.0\",\n        \"get-stdin\": \"~9.0.0\",\n        \"glob\": \"~10.2.7\",\n        \"ignore\": \"~5.2.4\",\n        \"js-yaml\": \"^4.1.0\",\n        \"jsonc-parser\": \"~3.2.0\",\n        \"markdownlint\": \"~0.29.0\",\n        \"minimatch\": \"~9.0.1\",\n        \"run-con\": \"~1.2.11\"\n      },\n      \"bin\": {\n        \"markdownlint\": \"markdownlint.js\"\n      },\n      \"engines\": {\n        \"node\": \">=16\"\n      }\n    },\n    \"node_modules/markdownlint-micromark\": {\n      \"version\": \"0.1.5\",\n      \"resolved\": \"https://registry.npmjs.org/markdownlint-micromark/-/markdownlint-micromark-0.1.5.tgz\",\n      \"integrity\": \"sha512-HvofNU4QCvfUCWnocQP1IAWaqop5wpWrB0mKB6SSh0fcpV0PdmQNS6tdUuFew1utpYlUvYYzz84oDkrD76GB9A==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=16\"\n      }\n    },\n    \"node_modules/marked\": {\n      \"version\": \"5.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/marked/-/marked-5.1.2.tgz\",\n      \"integrity\": \"sha512-ahRPGXJpjMjwSOlBoTMZAK7ATXkli5qCPxZ21TG44rx1KEo44bii4ekgTDQPNRQ4Kh7JMb9Ub1PVk1NxRSsorg==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"bin\": {\n        \"marked\": \"bin/marked.js\"\n      },\n      \"engines\": {\n        \"node\": \">= 16\"\n      }\n    },\n    \"node_modules/mdurl\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz\",\n      \"integrity\": \"sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==\",\n      \"dev\": true\n    },\n    \"node_modules/minimatch\": {\n      \"version\": \"9.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz\",\n      \"integrity\": \"sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"brace-expansion\": \"^2.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=16 || 14 >=14.17\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/isaacs\"\n      }\n    },\n    \"node_modules/minimist\": {\n      \"version\": \"1.2.8\",\n      \"resolved\": \"https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz\",\n      \"integrity\": \"sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==\",\n      \"dev\": true,\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/minipass\": {\n      \"version\": \"6.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/minipass/-/minipass-6.0.2.tgz\",\n      \"integrity\": \"sha512-MzWSV5nYVT7mVyWCwn2o7JH13w2TBRmmSqSRCKzTw+lmft9X4z+3wjvs06Tzijo5z4W/kahUCDpRXTF+ZrmF/w==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=16 || 14 >=14.17\"\n      }\n    },\n    \"node_modules/path-key\": {\n      \"version\": \"3.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz\",\n      \"integrity\": \"sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/path-scurry\": {\n      \"version\": \"1.10.1\",\n      \"resolved\": \"https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz\",\n      \"integrity\": \"sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"lru-cache\": \"^9.1.1 || ^10.0.0\",\n        \"minipass\": \"^5.0.0 || ^6.0.2 || ^7.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=16 || 14 >=14.17\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/isaacs\"\n      }\n    },\n    \"node_modules/prettier\": {\n      \"version\": \"3.9.10\",\n      \"resolved\": \"https://registry.npmjs.org/prettier/-/prettier-3.9.10.tgz\",\n      \"integrity\": \"sha512-skGHTH1Yb9QvaTC4hWnRTzEYtCpApF0UMBPz+t/0ZPzP8ihefo/btKd+QA7pUE0fEwA1SbS/NmhyEcstdXOIdA==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"bin\": {\n        \"prettier\": \"bin/prettier.cjs\"\n      },\n      \"engines\": {\n        \"node\": \">=14\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/prettier/prettier?sponsor=1\"\n      }\n    },\n    \"node_modules/run-con\": {\n      \"version\": \"1.2.12\",\n      \"resolved\": \"https://registry.npmjs.org/run-con/-/run-con-1.2.12.tgz\",\n      \"integrity\": \"sha512-5257ILMYIF4RztL9uoZ7V9Q97zHtNHn5bN3NobeAnzB1P3ASLgg8qocM2u+R18ttp+VEM78N2LK8XcNVtnSRrg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"deep-extend\": \"^0.6.0\",\n        \"ini\": \"~3.0.0\",\n        \"minimist\": \"^1.2.8\",\n        \"strip-json-comments\": \"~3.1.1\"\n      },\n      \"bin\": {\n        \"run-con\": \"cli.js\"\n      }\n    },\n    \"node_modules/shebang-command\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz\",\n      \"integrity\": \"sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"shebang-regex\": \"^3.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/shebang-regex\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz\",\n      \"integrity\": \"sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/signal-exit\": {\n      \"version\": \"4.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/signal-exit/-/signal-exit-4.0.2.tgz\",\n      \"integrity\": \"sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=14\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/isaacs\"\n      }\n    },\n    \"node_modules/string-width\": {\n      \"version\": \"5.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz\",\n      \"integrity\": \"sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"eastasianwidth\": \"^0.2.0\",\n        \"emoji-regex\": \"^9.2.2\",\n        \"strip-ansi\": \"^7.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/string-width-cjs\": {\n      \"name\": \"string-width\",\n      \"version\": \"4.2.3\",\n      \"resolved\": \"https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz\",\n      \"integrity\": \"sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"emoji-regex\": \"^8.0.0\",\n        \"is-fullwidth-code-point\": \"^3.0.0\",\n        \"strip-ansi\": \"^6.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/string-width-cjs/node_modules/ansi-regex\": {\n      \"version\": \"5.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz\",\n      \"integrity\": \"sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/string-width-cjs/node_modules/emoji-regex\": {\n      \"version\": \"8.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz\",\n      \"integrity\": \"sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==\",\n      \"dev\": true\n    },\n    \"node_modules/string-width-cjs/node_modules/strip-ansi\": {\n      \"version\": \"6.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz\",\n      \"integrity\": \"sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"ansi-regex\": \"^5.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/strip-ansi\": {\n      \"version\": \"7.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz\",\n      \"integrity\": \"sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"ansi-regex\": \"^6.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/chalk/strip-ansi?sponsor=1\"\n      }\n    },\n    \"node_modules/strip-ansi-cjs\": {\n      \"name\": \"strip-ansi\",\n      \"version\": \"6.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz\",\n      \"integrity\": \"sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"ansi-regex\": \"^5.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/strip-ansi-cjs/node_modules/ansi-regex\": {\n      \"version\": \"5.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz\",\n      \"integrity\": \"sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/strip-json-comments\": {\n      \"version\": \"3.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz\",\n      \"integrity\": \"sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=8\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/ts-node\": {\n      \"version\": \"10.9.2\",\n      \"resolved\": \"https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz\",\n      \"integrity\": \"sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@cspotcode/source-map-support\": \"^0.8.0\",\n        \"@tsconfig/node10\": \"^1.0.7\",\n        \"@tsconfig/node12\": \"^1.0.7\",\n        \"@tsconfig/node14\": \"^1.0.0\",\n        \"@tsconfig/node16\": \"^1.0.2\",\n        \"acorn\": \"^8.4.1\",\n        \"acorn-walk\": \"^8.1.1\",\n        \"arg\": \"^4.1.0\",\n        \"create-require\": \"^1.1.0\",\n        \"diff\": \"^4.0.1\",\n        \"make-error\": \"^1.1.1\",\n        \"v8-compile-cache-lib\": \"^3.0.1\",\n        \"yn\": \"3.1.1\"\n      },\n      \"bin\": {\n        \"ts-node\": \"dist/bin.js\",\n        \"ts-node-cwd\": \"dist/bin-cwd.js\",\n        \"ts-node-esm\": \"dist/bin-esm.js\",\n        \"ts-node-script\": \"dist/bin-script.js\",\n        \"ts-node-transpile-only\": \"dist/bin-transpile.js\",\n        \"ts-script\": \"dist/bin-script-deprecated.js\"\n      },\n      \"peerDependencies\": {\n        \"@swc/core\": \">=1.2.50\",\n        \"@swc/wasm\": \">=1.2.50\",\n        \"@types/node\": \"*\",\n        \"typescript\": \">=2.7\"\n      },\n      \"peerDependenciesMeta\": {\n        \"@swc/core\": {\n          \"optional\": true\n        },\n        \"@swc/wasm\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/typescript\": {\n      \"version\": \"5.4.5\",\n      \"resolved\": \"https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz\",\n      \"integrity\": \"sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==\",\n      \"dev\": true,\n      \"bin\": {\n        \"tsc\": \"bin/tsc\",\n        \"tsserver\": \"bin/tsserver\"\n      },\n      \"engines\": {\n        \"node\": \">=14.17\"\n      }\n    },\n    \"node_modules/uc.micro\": {\n      \"version\": \"1.0.6\",\n      \"resolved\": \"https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz\",\n      \"integrity\": \"sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==\",\n      \"dev\": true\n    },\n    \"node_modules/undici-types\": {\n      \"version\": \"6.21.0\",\n      \"resolved\": \"https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz\",\n      \"integrity\": \"sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==\",\n      \"dev\": true,\n      \"license\": \"MIT\"\n    },\n    \"node_modules/universalify\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz\",\n      \"integrity\": \"sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">= 10.0.0\"\n      }\n    },\n    \"node_modules/v8-compile-cache-lib\": {\n      \"version\": \"3.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz\",\n      \"integrity\": \"sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==\",\n      \"dev\": true\n    },\n    \"node_modules/which\": {\n      \"version\": \"2.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/which/-/which-2.0.2.tgz\",\n      \"integrity\": \"sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"isexe\": \"^2.0.0\"\n      },\n      \"bin\": {\n        \"node-which\": \"bin/node-which\"\n      },\n      \"engines\": {\n        \"node\": \">= 8\"\n      }\n    },\n    \"node_modules/wrap-ansi\": {\n      \"version\": \"8.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz\",\n      \"integrity\": \"sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"ansi-styles\": \"^6.1.0\",\n        \"string-width\": \"^5.0.1\",\n        \"strip-ansi\": \"^7.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/chalk/wrap-ansi?sponsor=1\"\n      }\n    },\n    \"node_modules/wrap-ansi-cjs\": {\n      \"name\": \"wrap-ansi\",\n      \"version\": \"7.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz\",\n      \"integrity\": \"sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"ansi-styles\": \"^4.0.0\",\n        \"string-width\": \"^4.1.0\",\n        \"strip-ansi\": \"^6.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/chalk/wrap-ansi?sponsor=1\"\n      }\n    },\n    \"node_modules/wrap-ansi-cjs/node_modules/ansi-regex\": {\n      \"version\": \"5.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz\",\n      \"integrity\": \"sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/wrap-ansi-cjs/node_modules/ansi-styles\": {\n      \"version\": \"4.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz\",\n      \"integrity\": \"sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"color-convert\": \"^2.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/chalk/ansi-styles?sponsor=1\"\n      }\n    },\n    \"node_modules/wrap-ansi-cjs/node_modules/emoji-regex\": {\n      \"version\": \"8.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz\",\n      \"integrity\": \"sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==\",\n      \"dev\": true\n    },\n    \"node_modules/wrap-ansi-cjs/node_modules/string-width\": {\n      \"version\": \"4.2.3\",\n      \"resolved\": \"https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz\",\n      \"integrity\": \"sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"emoji-regex\": \"^8.0.0\",\n        \"is-fullwidth-code-point\": \"^3.0.0\",\n        \"strip-ansi\": \"^6.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/wrap-ansi-cjs/node_modules/strip-ansi\": {\n      \"version\": \"6.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz\",\n      \"integrity\": \"sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"ansi-regex\": \"^5.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/yn\": {\n      \"version\": \"3.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/yn/-/yn-3.1.1.tgz\",\n      \"integrity\": \"sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=6\"\n      }\n    }\n  }\n}\n","frontmatter":{"name":"typescript-book","version":"1.0.0","lockfileVersion":3,"requires":true,"packages":{"":{"name":"typescript-book","version":"1.0.0","license":"ISC","devDependencies":{"@types/fs-extra":"^11.0.4","@types/marked":"^5.0.0","@types/node":"^20.19.43","@types/prettier":"^3.0.0","fp-ts":"^2.16.11","fs-extra":"^11.4.1","markdownlint-cli":"^0.35.0","marked":"^5.1.2","prettier":"^3.9.10","ts-node":"^10.9.2","typescript":"^5.4.5"}},"node_modules/@cspotcode/source-map-support":{"version":"0.8.1","resolved":"https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz","integrity":"sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==","dev":true,"dependencies":{"@jridgewell/trace-mapping":"0.3.9"},"engines":{"node":">=12"}},"node_modules/@isaacs/cliui":{"version":"8.0.2","resolved":"https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz","integrity":"sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==","dev":true,"dependencies":{"string-width":"^5.1.2","string-width-cjs":"npm:string-width@^4.2.0","strip-ansi":"^7.0.1","strip-ansi-cjs":"npm:strip-ansi@^6.0.1","wrap-ansi":"^8.1.0","wrap-ansi-cjs":"npm:wrap-ansi@^7.0.0"},"engines":{"node":">=12"}},"node_modules/@jridgewell/resolve-uri":{"version":"3.1.1","resolved":"https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz","integrity":"sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==","dev":true,"engines":{"node":">=6.0.0"}},"node_modules/@jridgewell/sourcemap-codec":{"version":"1.4.15","resolved":"https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz","integrity":"sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==","dev":true},"node_modules/@jridgewell/trace-mapping":{"version":"0.3.9","resolved":"https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz","integrity":"sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==","dev":true,"dependencies":{"@jridgewell/resolve-uri":"^3.0.3","@jridgewell/sourcemap-codec":"^1.4.10"}},"node_modules/@pkgjs/parseargs":{"version":"0.11.0","resolved":"https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz","integrity":"sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==","dev":true,"optional":true,"engines":{"node":">=14"}},"node_modules/@tsconfig/node10":{"version":"1.0.9","resolved":"https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz","integrity":"sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==","dev":true},"node_modules/@tsconfig/node12":{"version":"1.0.11","resolved":"https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz","integrity":"sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==","dev":true},"node_modules/@tsconfig/node14":{"version":"1.0.3","resolved":"https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz","integrity":"sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==","dev":true},"node_modules/@tsconfig/node16":{"version":"1.0.4","resolved":"https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz","integrity":"sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==","dev":true},"node_modules/@types/fs-extra":{"version":"11.0.4","resolved":"https://registry.npmjs.org/@types/fs-extra/-/fs-extra-11.0.4.tgz","integrity":"sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==","dev":true,"license":"MIT","dependencies":{"@types/jsonfile":"*","@types/node":"*"}},"node_modules/@types/jsonfile":{"version":"6.1.1","resolved":"https://registry.npmjs.org/@types/jsonfile/-/jsonfile-6.1.1.tgz","integrity":"sha512-GSgiRCVeapDN+3pqA35IkQwasaCh/0YFH5dEF6S88iDvEn901DjOeH3/QPY+XYP1DFzDZPvIvfeEgk+7br5png==","dev":true,"dependencies":{"@types/node":"*"}},"node_modules/@types/marked":{"version":"5.0.0","resolved":"https://registry.npmjs.org/@types/marked/-/marked-5.0.0.tgz","integrity":"sha512-YcZe50jhltsCq7rc9MNZC/4QB/OnA2Pd6hrOSTOFajtabN+38slqgDDCeE/0F83SjkKBQcsZUj7VLWR0H5cKRA==","dev":true},"node_modules/@types/node":{"version":"20.19.43","resolved":"https://registry.npmjs.org/@types/node/-/node-20.19.43.tgz","integrity":"sha512-6oYBAi5ikg4Pl+kGsoYtawUMBT2zZMCvPNF7pVLnHZfd1zf38DRiWn/gT01RYCdUqkv7Fhr+C9ot4/tb+2sVvA==","dev":true,"license":"MIT","dependencies":{"undici-types":"~6.21.0"}},"node_modules/@types/prettier":{"version":"3.0.0","resolved":"https://registry.npmjs.org/@types/prettier/-/prettier-3.0.0.tgz","integrity":"sha512-mFMBfMOz8QxhYVbuINtswBp9VL2b4Y0QqYHwqLz3YbgtfAcat2Dl6Y1o4e22S/OVE6Ebl9m7wWiMT2lSbAs1wA==","deprecated":"This is a stub types definition. prettier provides its own type definitions, so you do not need this installed.","dev":true,"license":"MIT","dependencies":{"prettier":"*"}},"node_modules/acorn":{"version":"8.9.0","resolved":"https://registry.npmjs.org/acorn/-/acorn-8.9.0.tgz","integrity":"sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ==","dev":true,"bin":{"acorn":"bin/acorn"},"engines":{"node":">=0.4.0"}},"node_modules/acorn-walk":{"version":"8.2.0","resolved":"https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz","integrity":"sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==","dev":true,"engines":{"node":">=0.4.0"}},"node_modules/ansi-regex":{"version":"6.0.1","resolved":"https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz","integrity":"sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==","dev":true,"engines":{"node":">=12"},"funding":{"url":"https://github.com/chalk/ansi-regex?sponsor=1"}},"node_modules/ansi-styles":{"version":"6.2.1","resolved":"https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz","integrity":"sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==","dev":true,"engines":{"node":">=12"},"funding":{"url":"https://github.com/chalk/ansi-styles?sponsor=1"}},"node_modules/arg":{"version":"4.1.3","resolved":"https://registry.npmjs.org/arg/-/arg-4.1.3.tgz","integrity":"sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==","dev":true},"node_modules/argparse":{"version":"2.0.1","resolved":"https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz","integrity":"sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==","dev":true},"node_modules/balanced-match":{"version":"1.0.2","resolved":"https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz","integrity":"sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==","dev":true},"node_modules/brace-expansion":{"version":"2.0.1","resolved":"https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz","integrity":"sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==","dev":true,"dependencies":{"balanced-match":"^1.0.0"}},"node_modules/color-convert":{"version":"2.0.1","resolved":"https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz","integrity":"sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==","dev":true,"dependencies":{"color-name":"~1.1.4"},"engines":{"node":">=7.0.0"}},"node_modules/color-name":{"version":"1.1.4","resolved":"https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz","integrity":"sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==","dev":true},"node_modules/commander":{"version":"11.0.0","resolved":"https://registry.npmjs.org/commander/-/commander-11.0.0.tgz","integrity":"sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==","dev":true,"engines":{"node":">=16"}},"node_modules/create-require":{"version":"1.1.1","resolved":"https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz","integrity":"sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==","dev":true},"node_modules/cross-spawn":{"version":"7.0.3","resolved":"https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz","integrity":"sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==","dev":true,"dependencies":{"path-key":"^3.1.0","shebang-command":"^2.0.0","which":"^2.0.1"},"engines":{"node":">= 8"}},"node_modules/deep-extend":{"version":"0.6.0","resolved":"https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz","integrity":"sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==","dev":true,"engines":{"node":">=4.0.0"}},"node_modules/diff":{"version":"4.0.2","resolved":"https://registry.npmjs.org/diff/-/diff-4.0.2.tgz","integrity":"sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==","dev":true,"engines":{"node":">=0.3.1"}},"node_modules/eastasianwidth":{"version":"0.2.0","resolved":"https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz","integrity":"sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==","dev":true},"node_modules/emoji-regex":{"version":"9.2.2","resolved":"https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz","integrity":"sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==","dev":true},"node_modules/entities":{"version":"3.0.1","resolved":"https://registry.npmjs.org/entities/-/entities-3.0.1.tgz","integrity":"sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==","dev":true,"engines":{"node":">=0.12"},"funding":{"url":"https://github.com/fb55/entities?sponsor=1"}},"node_modules/foreground-child":{"version":"3.1.1","resolved":"https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz","integrity":"sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==","dev":true,"dependencies":{"cross-spawn":"^7.0.0","signal-exit":"^4.0.1"},"engines":{"node":">=14"},"funding":{"url":"https://github.com/sponsors/isaacs"}},"node_modules/fp-ts":{"version":"2.16.11","resolved":"https://registry.npmjs.org/fp-ts/-/fp-ts-2.16.11.tgz","integrity":"sha512-LaI+KaX2NFkfn1ZGHoKCmcfv7yrZsC3b8NtWsTVQeHkq4F27vI5igUuO53sxqDEa2gNQMHFPmpojDw/1zmUK7w==","dev":true,"license":"MIT"},"node_modules/fs-extra":{"version":"11.4.1","resolved":"https://registry.npmjs.org/fs-extra/-/fs-extra-11.4.1.tgz","integrity":"sha512-KYAb4c9BJQI6QqGKthV68OHe0badztdXJWKo0WtBA9IuCFPTKvE5ZdUBglP833aMjhaSPNO4A5j/EkzZtGlKjA==","dev":true,"license":"MIT","dependencies":{"graceful-fs":"^4.2.0","jsonfile":"^6.0.1","universalify":"^2.0.0"},"engines":{"node":">=14.14"}},"node_modules/get-stdin":{"version":"9.0.0","resolved":"https://registry.npmjs.org/get-stdin/-/get-stdin-9.0.0.tgz","integrity":"sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==","dev":true,"engines":{"node":">=12"},"funding":{"url":"https://github.com/sponsors/sindresorhus"}},"node_modules/glob":{"version":"10.2.7","resolved":"https://registry.npmjs.org/glob/-/glob-10.2.7.tgz","integrity":"sha512-jTKehsravOJo8IJxUGfZILnkvVJM/MOfHRs8QcXolVef2zNI9Tqyy5+SeuOAZd3upViEZQLyFpQhYiHLrMUNmA==","dev":true,"dependencies":{"foreground-child":"^3.1.0","jackspeak":"^2.0.3","minimatch":"^9.0.1","minipass":"^5.0.0 || ^6.0.2","path-scurry":"^1.7.0"},"bin":{"glob":"dist/cjs/src/bin.js"},"engines":{"node":">=16 || 14 >=14.17"},"funding":{"url":"https://github.com/sponsors/isaacs"}},"node_modules/graceful-fs":{"version":"4.2.11","resolved":"https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz","integrity":"sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==","dev":true},"node_modules/ignore":{"version":"5.2.4","resolved":"https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz","integrity":"sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==","dev":true,"engines":{"node":">= 4"}},"node_modules/ini":{"version":"3.0.1","resolved":"https://registry.npmjs.org/ini/-/ini-3.0.1.tgz","integrity":"sha512-it4HyVAUTKBc6m8e1iXWvXSTdndF7HbdN713+kvLrymxTaU4AUBWrJ4vEooP+V7fexnVD3LKcBshjGGPefSMUQ==","dev":true,"engines":{"node":"^12.13.0 || ^14.15.0 || >=16.0.0"}},"node_modules/is-fullwidth-code-point":{"version":"3.0.0","resolved":"https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz","integrity":"sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==","dev":true,"engines":{"node":">=8"}},"node_modules/isexe":{"version":"2.0.0","resolved":"https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz","integrity":"sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==","dev":true},"node_modules/jackspeak":{"version":"2.2.1","resolved":"https://registry.npmjs.org/jackspeak/-/jackspeak-2.2.1.tgz","integrity":"sha512-MXbxovZ/Pm42f6cDIDkl3xpwv1AGwObKwfmjs2nQePiy85tP3fatofl3FC1aBsOtP/6fq5SbtgHwWcMsLP+bDw==","dev":true,"dependencies":{"@isaacs/cliui":"^8.0.2"},"engines":{"node":">=14"},"funding":{"url":"https://github.com/sponsors/isaacs"},"optionalDependencies":{"@pkgjs/parseargs":"^0.11.0"}},"node_modules/js-yaml":{"version":"4.1.0","resolved":"https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz","integrity":"sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==","dev":true,"dependencies":{"argparse":"^2.0.1"},"bin":{"js-yaml":"bin/js-yaml.js"}},"node_modules/jsonc-parser":{"version":"3.2.0","resolved":"https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz","integrity":"sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==","dev":true},"node_modules/jsonfile":{"version":"6.1.0","resolved":"https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz","integrity":"sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==","dev":true,"dependencies":{"universalify":"^2.0.0"},"optionalDependencies":{"graceful-fs":"^4.1.6"}},"node_modules/linkify-it":{"version":"4.0.1","resolved":"https://registry.npmjs.org/linkify-it/-/linkify-it-4.0.1.tgz","integrity":"sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw==","dev":true,"dependencies":{"uc.micro":"^1.0.1"}},"node_modules/lru-cache":{"version":"10.0.0","resolved":"https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.0.tgz","integrity":"sha512-svTf/fzsKHffP42sujkO/Rjs37BCIsQVRCeNYIm9WN8rgT7ffoUnRtZCqU+6BqcSBdv8gwJeTz8knJpgACeQMw==","dev":true,"engines":{"node":"14 || >=16.14"}},"node_modules/make-error":{"version":"1.3.6","resolved":"https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz","integrity":"sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==","dev":true},"node_modules/markdown-it":{"version":"13.0.1","resolved":"https://registry.npmjs.org/markdown-it/-/markdown-it-13.0.1.tgz","integrity":"sha512-lTlxriVoy2criHP0JKRhO2VDG9c2ypWCsT237eDiLqi09rmbKoUetyGHq2uOIRoRS//kfoJckS0eUzzkDR+k2Q==","dev":true,"dependencies":{"argparse":"^2.0.1","entities":"~3.0.1","linkify-it":"^4.0.1","mdurl":"^1.0.1","uc.micro":"^1.0.5"},"bin":{"markdown-it":"bin/markdown-it.js"}},"node_modules/markdownlint":{"version":"0.29.0","resolved":"https://registry.npmjs.org/markdownlint/-/markdownlint-0.29.0.tgz","integrity":"sha512-ASAzqpODstu/Qsk0xW5BPgWnK/qjpBQ4e7IpsSvvFXcfYIjanLTdwFRJK1SIEEh0fGSMKXcJf/qhaZYHyME0wA==","dev":true,"dependencies":{"markdown-it":"13.0.1","markdownlint-micromark":"0.1.5"},"engines":{"node":">=16"}},"node_modules/markdownlint-cli":{"version":"0.35.0","resolved":"https://registry.npmjs.org/markdownlint-cli/-/markdownlint-cli-0.35.0.tgz","integrity":"sha512-lVIIIV1MrUtjoocgDqXLxUCxlRbn7Ve8rsWppfwciUNwLlNS28AhNiyQ3PU7jjj4Qvj+rWTTvwkqg7AcdG988g==","dev":true,"dependencies":{"commander":"~11.0.0","get-stdin":"~9.0.0","glob":"~10.2.7","ignore":"~5.2.4","js-yaml":"^4.1.0","jsonc-parser":"~3.2.0","markdownlint":"~0.29.0","minimatch":"~9.0.1","run-con":"~1.2.11"},"bin":{"markdownlint":"markdownlint.js"},"engines":{"node":">=16"}},"node_modules/markdownlint-micromark":{"version":"0.1.5","resolved":"https://registry.npmjs.org/markdownlint-micromark/-/markdownlint-micromark-0.1.5.tgz","integrity":"sha512-HvofNU4QCvfUCWnocQP1IAWaqop5wpWrB0mKB6SSh0fcpV0PdmQNS6tdUuFew1utpYlUvYYzz84oDkrD76GB9A==","dev":true,"engines":{"node":">=16"}},"node_modules/marked":{"version":"5.1.2","resolved":"https://registry.npmjs.org/marked/-/marked-5.1.2.tgz","integrity":"sha512-ahRPGXJpjMjwSOlBoTMZAK7ATXkli5qCPxZ21TG44rx1KEo44bii4ekgTDQPNRQ4Kh7JMb9Ub1PVk1NxRSsorg==","dev":true,"license":"MIT","bin":{"marked":"bin/marked.js"},"engines":{"node":">= 16"}},"node_modules/mdurl":{"version":"1.0.1","resolved":"https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz","integrity":"sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==","dev":true},"node_modules/minimatch":{"version":"9.0.3","resolved":"https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz","integrity":"sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==","dev":true,"dependencies":{"brace-expansion":"^2.0.1"},"engines":{"node":">=16 || 14 >=14.17"},"funding":{"url":"https://github.com/sponsors/isaacs"}},"node_modules/minimist":{"version":"1.2.8","resolved":"https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz","integrity":"sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==","dev":true,"funding":{"url":"https://github.com/sponsors/ljharb"}},"node_modules/minipass":{"version":"6.0.2","resolved":"https://registry.npmjs.org/minipass/-/minipass-6.0.2.tgz","integrity":"sha512-MzWSV5nYVT7mVyWCwn2o7JH13w2TBRmmSqSRCKzTw+lmft9X4z+3wjvs06Tzijo5z4W/kahUCDpRXTF+ZrmF/w==","dev":true,"engines":{"node":">=16 || 14 >=14.17"}},"node_modules/path-key":{"version":"3.1.1","resolved":"https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz","integrity":"sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==","dev":true,"engines":{"node":">=8"}},"node_modules/path-scurry":{"version":"1.10.1","resolved":"https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz","integrity":"sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==","dev":true,"dependencies":{"lru-cache":"^9.1.1 || ^10.0.0","minipass":"^5.0.0 || ^6.0.2 || ^7.0.0"},"engines":{"node":">=16 || 14 >=14.17"},"funding":{"url":"https://github.com/sponsors/isaacs"}},"node_modules/prettier":{"version":"3.9.10","resolved":"https://registry.npmjs.org/prettier/-/prettier-3.9.10.tgz","integrity":"sha512-skGHTH1Yb9QvaTC4hWnRTzEYtCpApF0UMBPz+t/0ZPzP8ihefo/btKd+QA7pUE0fEwA1SbS/NmhyEcstdXOIdA==","dev":true,"license":"MIT","bin":{"prettier":"bin/prettier.cjs"},"engines":{"node":">=14"},"funding":{"url":"https://github.com/prettier/prettier?sponsor=1"}},"node_modules/run-con":{"version":"1.2.12","resolved":"https://registry.npmjs.org/run-con/-/run-con-1.2.12.tgz","integrity":"sha512-5257ILMYIF4RztL9uoZ7V9Q97zHtNHn5bN3NobeAnzB1P3ASLgg8qocM2u+R18ttp+VEM78N2LK8XcNVtnSRrg==","dev":true,"dependencies":{"deep-extend":"^0.6.0","ini":"~3.0.0","minimist":"^1.2.8","strip-json-comments":"~3.1.1"},"bin":{"run-con":"cli.js"}},"node_modules/shebang-command":{"version":"2.0.0","resolved":"https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz","integrity":"sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==","dev":true,"dependencies":{"shebang-regex":"^3.0.0"},"engines":{"node":">=8"}},"node_modules/shebang-regex":{"version":"3.0.0","resolved":"https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz","integrity":"sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==","dev":true,"engines":{"node":">=8"}},"node_modules/signal-exit":{"version":"4.0.2","resolved":"https://registry.npmjs.org/signal-exit/-/signal-exit-4.0.2.tgz","integrity":"sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q==","dev":true,"engines":{"node":">=14"},"funding":{"url":"https://github.com/sponsors/isaacs"}},"node_modules/string-width":{"version":"5.1.2","resolved":"https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz","integrity":"sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==","dev":true,"dependencies":{"eastasianwidth":"^0.2.0","emoji-regex":"^9.2.2","strip-ansi":"^7.0.1"},"engines":{"node":">=12"},"funding":{"url":"https://github.com/sponsors/sindresorhus"}},"node_modules/string-width-cjs":{"name":"string-width","version":"4.2.3","resolved":"https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz","integrity":"sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==","dev":true,"dependencies":{"emoji-regex":"^8.0.0","is-fullwidth-code-point":"^3.0.0","strip-ansi":"^6.0.1"},"engines":{"node":">=8"}},"node_modules/string-width-cjs/node_modules/ansi-regex":{"version":"5.0.1","resolved":"https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz","integrity":"sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==","dev":true,"engines":{"node":">=8"}},"node_modules/string-width-cjs/node_modules/emoji-regex":{"version":"8.0.0","resolved":"https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz","integrity":"sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==","dev":true},"node_modules/string-width-cjs/node_modules/strip-ansi":{"version":"6.0.1","resolved":"https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz","integrity":"sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==","dev":true,"dependencies":{"ansi-regex":"^5.0.1"},"engines":{"node":">=8"}},"node_modules/strip-ansi":{"version":"7.1.0","resolved":"https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz","integrity":"sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==","dev":true,"dependencies":{"ansi-regex":"^6.0.1"},"engines":{"node":">=12"},"funding":{"url":"https://github.com/chalk/strip-ansi?sponsor=1"}},"node_modules/strip-ansi-cjs":{"name":"strip-ansi","version":"6.0.1","resolved":"https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz","integrity":"sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==","dev":true,"dependencies":{"ansi-regex":"^5.0.1"},"engines":{"node":">=8"}},"node_modules/strip-ansi-cjs/node_modules/ansi-regex":{"version":"5.0.1","resolved":"https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz","integrity":"sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==","dev":true,"engines":{"node":">=8"}},"node_modules/strip-json-comments":{"version":"3.1.1","resolved":"https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz","integrity":"sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==","dev":true,"engines":{"node":">=8"},"funding":{"url":"https://github.com/sponsors/sindresorhus"}},"node_modules/ts-node":{"version":"10.9.2","resolved":"https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz","integrity":"sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==","dev":true,"license":"MIT","dependencies":{"@cspotcode/source-map-support":"^0.8.0","@tsconfig/node10":"^1.0.7","@tsconfig/node12":"^1.0.7","@tsconfig/node14":"^1.0.0","@tsconfig/node16":"^1.0.2","acorn":"^8.4.1","acorn-walk":"^8.1.1","arg":"^4.1.0","create-require":"^1.1.0","diff":"^4.0.1","make-error":"^1.1.1","v8-compile-cache-lib":"^3.0.1","yn":"3.1.1"},"bin":{"ts-node":"dist/bin.js","ts-node-cwd":"dist/bin-cwd.js","ts-node-esm":"dist/bin-esm.js","ts-node-script":"dist/bin-script.js","ts-node-transpile-only":"dist/bin-transpile.js","ts-script":"dist/bin-script-deprecated.js"},"peerDependencies":{"@swc/core":">=1.2.50","@swc/wasm":">=1.2.50","@types/node":"*","typescript":">=2.7"},"peerDependenciesMeta":{"@swc/core":{"optional":true},"@swc/wasm":{"optional":true}}},"node_modules/typescript":{"version":"5.4.5","resolved":"https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz","integrity":"sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==","dev":true,"bin":{"tsc":"bin/tsc","tsserver":"bin/tsserver"},"engines":{"node":">=14.17"}},"node_modules/uc.micro":{"version":"1.0.6","resolved":"https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz","integrity":"sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==","dev":true},"node_modules/undici-types":{"version":"6.21.0","resolved":"https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz","integrity":"sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==","dev":true,"license":"MIT"},"node_modules/universalify":{"version":"2.0.0","resolved":"https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz","integrity":"sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==","dev":true,"engines":{"node":">= 10.0.0"}},"node_modules/v8-compile-cache-lib":{"version":"3.0.1","resolved":"https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz","integrity":"sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==","dev":true},"node_modules/which":{"version":"2.0.2","resolved":"https://registry.npmjs.org/which/-/which-2.0.2.tgz","integrity":"sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==","dev":true,"dependencies":{"isexe":"^2.0.0"},"bin":{"node-which":"bin/node-which"},"engines":{"node":">= 8"}},"node_modules/wrap-ansi":{"version":"8.1.0","resolved":"https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz","integrity":"sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==","dev":true,"dependencies":{"ansi-styles":"^6.1.0","string-width":"^5.0.1","strip-ansi":"^7.0.1"},"engines":{"node":">=12"},"funding":{"url":"https://github.com/chalk/wrap-ansi?sponsor=1"}},"node_modules/wrap-ansi-cjs":{"name":"wrap-ansi","version":"7.0.0","resolved":"https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz","integrity":"sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==","dev":true,"dependencies":{"ansi-styles":"^4.0.0","string-width":"^4.1.0","strip-ansi":"^6.0.0"},"engines":{"node":">=10"},"funding":{"url":"https://github.com/chalk/wrap-ansi?sponsor=1"}},"node_modules/wrap-ansi-cjs/node_modules/ansi-regex":{"version":"5.0.1","resolved":"https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz","integrity":"sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==","dev":true,"engines":{"node":">=8"}},"node_modules/wrap-ansi-cjs/node_modules/ansi-styles":{"version":"4.3.0","resolved":"https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz","integrity":"sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==","dev":true,"dependencies":{"color-convert":"^2.0.1"},"engines":{"node":">=8"},"funding":{"url":"https://github.com/chalk/ansi-styles?sponsor=1"}},"node_modules/wrap-ansi-cjs/node_modules/emoji-regex":{"version":"8.0.0","resolved":"https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz","integrity":"sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==","dev":true},"node_modules/wrap-ansi-cjs/node_modules/string-width":{"version":"4.2.3","resolved":"https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz","integrity":"sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==","dev":true,"dependencies":{"emoji-regex":"^8.0.0","is-fullwidth-code-point":"^3.0.0","strip-ansi":"^6.0.1"},"engines":{"node":">=8"}},"node_modules/wrap-ansi-cjs/node_modules/strip-ansi":{"version":"6.0.1","resolved":"https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz","integrity":"sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==","dev":true,"dependencies":{"ansi-regex":"^5.0.1"},"engines":{"node":">=8"}},"node_modules/yn":{"version":"3.1.1","resolved":"https://registry.npmjs.org/yn/-/yn-3.1.1.tgz","integrity":"sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==","dev":true,"engines":{"node":">=6"}}}},"isInternal":false,"tokens":15356,"sizeBytes":37216},{"name":"package.json","path":"tools/package.json","rawUrl":"https://raw.githubusercontent.com/gibbok/typescript-book/HEAD/tools/package.json","title":"typescript-book","category":"anthropic-skill","format":"json","content":"{\n  \"name\": \"typescript-book\",\n  \"version\": \"1.0.0\",\n  \"description\": \"The Concise TypeScript Book provides a comprehensive and succinct overview of TypeScript's capabilities. It offers clear explanations covering all aspects found in the latest version of the language, from its powerful type system to advanced features. Whether you're a beginner or an experienced developer, this book is an invaluable resource to enhance your understanding and proficiency in TypeScript.\",\n  \"main\": \"index.js\",\n  \"scripts\": {\n    \"format\": \"ts-node format\",\n    \"compile\": \"ts-node compile\",\n    \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\",\n    \"lint\": \"ts-node lint\",\n    \"lint:md\": \"markdownlint --ignore \\\"../AGENTS.md\\\" --ignore \\\"../.agents/**\\\" \\\"./*.md\\\" \\\"../*.md\\\"\",\n    \"check\": \"npm run lint && npm run lint:md && npm run format && npm run compile\"\n  },\n  \"author\": \"\",\n  \"license\": \"ISC\",\n  \"devDependencies\": {\n    \"@types/fs-extra\": \"^11.0.4\",\n    \"@types/marked\": \"^5.0.0\",\n    \"@types/node\": \"^20.19.43\",\n    \"@types/prettier\": \"^3.0.0\",\n    \"fp-ts\": \"^2.16.11\",\n    \"fs-extra\": \"^11.4.1\",\n    \"markdownlint-cli\": \"^0.35.0\",\n    \"marked\": \"^5.1.2\",\n    \"prettier\": \"^3.9.10\",\n    \"ts-node\": \"^10.9.2\",\n    \"typescript\": \"^5.4.5\"\n  }\n}\n","frontmatter":{"name":"typescript-book","version":"1.0.0","description":"The Concise TypeScript Book provides a comprehensive and succinct overview of TypeScript's capabilities. It offers clear explanations covering all aspects found in the latest version of the language, from its powerful type system to advanced features. Whether you're a beginner or an experienced developer, this book is an invaluable resource to enhance your understanding and proficiency in TypeScript.","main":"index.js","scripts":{"format":"ts-node format","compile":"ts-node compile","test":"echo \"Error: no test specified\" && exit 1","lint":"ts-node lint","lint:md":"markdownlint --ignore \"../AGENTS.md\" --ignore \"../.agents/**\" \"./*.md\" \"../*.md\"","check":"npm run lint && npm run lint:md && npm run format && npm run compile"},"author":"","license":"ISC","devDependencies":{"@types/fs-extra":"^11.0.4","@types/marked":"^5.0.0","@types/node":"^20.19.43","@types/prettier":"^3.0.0","fp-ts":"^2.16.11","fs-extra":"^11.4.1","markdownlint-cli":"^0.35.0","marked":"^5.1.2","prettier":"^3.9.10","ts-node":"^10.9.2","typescript":"^5.4.5"}},"isInternal":false,"tokens":366,"sizeBytes":1249},{"name":"README-zh_CN.md","path":"tools/test-md/README-zh_CN.md","rawUrl":"https://raw.githubusercontent.com/gibbok/typescript-book/HEAD/tools/test-md/README-zh_CN.md","title":"Test-md Skill","category":"anthropic-skill","format":"markdown","content":"# 简洁 TypeScript 书\nTypeScript 有效开发简明指南。 **免费和开源**。\n## 创建文件和文件夹\n可使用 按钮访问文件资源管理器。\n## 切换到另一个文件\n您的所有文件和文件夹都在文件资源管理器中显示为树。 您可以通过单击树中的文件从一个文件切换到另一个文件。\n### 新标题\n一些家长内容。\n#### 嵌套内容 1\n更多内容在这里。\n##### 嵌套内容 2\n内容甚至更多。","isInternal":false,"tokens":149,"sizeBytes":467},{"name":"tsconfig.json","path":"tools/tsconfig.json","rawUrl":"https://raw.githubusercontent.com/gibbok/typescript-book/HEAD/tools/tsconfig.json","title":"Tools Skill","category":"anthropic-skill","format":"json","content":"{\n  \"compilerOptions\": {\n    \"target\": \"es2022\",\n    \"module\": \"commonjs\",\n    \"noImplicitAny\": true,\n    \"esModuleInterop\": true,\n    \"noEmitOnError\": true,\n    \"moduleDetection\": \"force\",\n    \"noUnusedLocals\": false,\n    \"forceConsistentCasingInFileNames\": true,\n    \"strict\": true,\n    \"skipLibCheck\": true,\n    \"lib\": [\n      \"es2022\",\n      \"esnext.disposable\",\n      \"esnext.decorators\",\n      \"dom\"\n    ]\n  }\n}","frontmatter":{"compilerOptions":{"target":"es2022","module":"commonjs","noImplicitAny":true,"esModuleInterop":true,"noEmitOnError":true,"moduleDetection":"force","noUnusedLocals":false,"forceConsistentCasingInFileNames":true,"strict":true,"skipLibCheck":true,"lib":["es2022","esnext.disposable","esnext.decorators","dom"]}},"isInternal":false,"tokens":125,"sizeBytes":417},{"name":"README.md","path":"tools/README.md","rawUrl":"https://raw.githubusercontent.com/gibbok/typescript-book/HEAD/tools/README.md","title":"tools Documentation","category":"plugin-manifest","format":"markdown","content":"# Tools for Working with Markdown Books\n\nIf you're working with Markdown books, here are some essential tools and commands to help you streamline your workflow.\n\n## Installation\n\nThe Docker workflow provides all dependencies required to generate and verify the\nbooks. With Docker running, use this command from `tools`:\n\n```shell\nmake docker-books\n```\n\nThe repository is mounted into the container, so generated EPUB and PDF files are\nwritten directly to the local `downloads` folder. The Docker image is built on the\nfirst command and reused on subsequent commands. Its Node.js dependencies stay\ninside the container. It includes EPUBCheck 5.3.0 and invokes it through a Java\nwrapper, so EPUB validation works when invoked by Python without leaving cache files\nin the checkout. The Noto fonts required for PDF generation are stored in\n`tools/fonts` and copied into the image during the build.\n\n### Local installation\n\nTo run the tools without Docker, ensure Node.js is installed. Then set up the\nrequired dependencies with the following commands:\n\nIn folder `tools` and `website`:\n\n```shell\nnvm use\nnpm install\n```\n\n```shell\nbrew install pandoc\nbrew install epubcheck\nbrew install poppler\nbrew install --cask calibre\n```\n\n## Commands\n\nUse `make` to run the main commands:\n\n* `make format`: Format Markdown files for books.\n* `make check`: Run several checks to ensure the Markdown files are valid.\n* `make website`: Create different Markdown pages for the website.\n* `make website-preview`: Build and preview website locally.\n* `make website-e2e`: Build the production website and run its core Playwright end-to-end tests.\n* `make website-deploy`: Build and deploy website to GitHub Pages.\n* `make books`: Create EPUB and PDF books.\n* `make verify-books`: Verify the generated EPUB and PDF files.\n* `make docker-books`: Build the Docker image and create EPUB and PDF books in the local `downloads` folder.\n\n### Website End-to-End Tests\n\nThe Playwright suite covers only the website's main reader journeys: loading readable\nbook content, using the right-side page navigation, and finding content with search.\n\nInstall the browser once from the `website` folder:\n\n```shell\nnpx playwright install chromium\n```\n\nThen run the production build and tests from the `tools` folder:\n\n```shell\nmake website-e2e\n```\n\nPlaywright saves an HTML report, screenshots, and videos for each run. In pull\nrequests, CI uploads this evidence, links it from a single updated PR comment, and\ndeletes the uploaded artifacts after the PR is merged.\n\n### Formatting\n\nConsistent code formatting is crucial. To format all TypeScript snippets, we use Prettier. Execute the following command for formatting:\n\n```shell\nnpm run format\n```\n\n### Compilation\n\nTo compile TypeScript snippets within the Markdown files, utilize the following command:\n\n```shell\nnpm run compile\n```\n\n### Linting\n\nTo ensure that your Markdown files adhere to proper formatting rules, use the linting command:\n\n```shell\nnpm run lint:md\n```\n\n### Linting and Formatting\n\nFor a comprehensive process that includes linting all Markdown files, applying Prettier formatting to all TypeScript snippets, and compiling them using TypeScript, use the following command:\n\n```shell\nnpm run check\n```\n\nThe project uses the [Markdown All in One](https://marketplace.visualstudio.com/items?itemName=yzhang.markdown-all-in-one)Visual Studio Code extension to automatically update the table of contents.\n\nUse the following command to install it:\n\n```shell\ncode --install-extension yzhang.markdown-all-in-one\n```\n\n### Skipping Compilation\n\nIf you have specific snippets in the Markdown files that you don't want to compile, simply add `<!-- skip -->` just before the TypeScript demarcation for those snippets.\n\n### EPUB and PDF Generation\n\nTo generate EPUB and PDF files from your Markdown books, navigate to the `tools` folder and run the following command:\n\n```shell\nmake books\n```\n\nThe verification step uses `pdfinfo` for page totals and `pdffonts` to require the\nappropriate embedded Noto families for every locale. It rejects legacy Georgia,\nVerdana, Menlo, Apple, Times New Roman, and STSongti embeddings.\n\nTo regenerate every artifact with the container toolchain, run:\n\n```shell\nmake docker-books\n```\n\n### Tagging\n\nUse this tag format for TypeScript 7 book releases:\n\n```shell\ngit switch main\ngit pull origin main\ngit tag -a typescript-7-book-v1 -m \"TypeScript 7 book, revision 1\"\ngit push origin typescript-7-book-v1\n```\n\nThese tools will assist you in efficiently working with Markdown books and ensure a smooth and organized process. Happy writing!\n\n## Debug EPUB Issues\n\nTo debug the EPUB files you create, follow these steps:\n\nFirst, download and install Sigil. You can use the following command to install Sigil:\n\n```shell\nbrew install --cask sigil\n```\n\nNext, run an EPUB check to validate your EPUB file. For example:\n\n```shell\nepubcheck ../downloads/typescript-book.epub\n```\n\nFinally, open the EPUB file using Sigil for detailed inspection.\n\n## How to Contribute to This E-Book\n\nTo contribute to this e-book, follow these steps:\n\n* Update the main Markdown file with your changes.\n* Run `make check` to ensure the linter and other checks pass.\n* Preview the website locally with `make website-preview` to make sure it works as expected.\n* Generate the e-books by running `make books`.\n* Submit your PR and share your awesome contributions!\n","isInternal":false,"tokens":1192,"sizeBytes":5381},{"name":"README.md","path":"tools/test-md/README.md","rawUrl":"https://raw.githubusercontent.com/gibbok/typescript-book/HEAD/tools/test-md/README.md","title":"test-md Documentation","category":"plugin-manifest","format":"markdown","content":"# The Concise TypeScript Book\nA Concise Guide to Effective Development in TypeScript. **Free and Open Source**.\n## Create files and folders\nThe file explorer is accessible using the button.\n## Switch to another file\nAll your files and folders are presented as a tree in the file explorer. You can switch from one to another by clicking a file in the tree.\n### New title\nSome parent content.\n#### Nested content 1\nMore content here.\n##### Nested content 2\nEven more content.","isInternal":false,"tokens":103,"sizeBytes":473},{"name":"README.md","path":"tools/utilities-add-translation/README.md","rawUrl":"https://raw.githubusercontent.com/gibbok/typescript-book/HEAD/tools/utilities-add-translation/README.md","title":"utilities-add-translation Documentation","category":"plugin-manifest","format":"markdown","content":"# utilities-add-translation Documentation\n\nPath: `tools/utilities-add-translation/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/gibbok/typescript-book/HEAD/tools/utilities-add-translation/README.md)","tokens":300,"sizeBytes":227}],"systemPromptSnippet":"<yakaai_skills repo=\"gibbok/typescript-book\">\n<!-- File: AGENTS.md (Tokens: ~136 | Category: root-instruction) -->\n# AGENTS.md\n\nFor review and editing work in this repository, use [.agents/skills/typescript-book-review/SKILL.md](.agents/skills/typescript-book-review/SKILL.md).\n\nThis guidance is for correcting TypeScript book content, Markdown, headings, and examples while keeping changes minimal and preserving the original meaning.\n\nFor creating TypeScript news pages, use [.agents/skills/create-typescript-news/SKILL.md](.agents/skills/create-typescript-news/SKILL.md).\n\nThis workflow requires user-provided source content, creates and synchronizes concise news pages for every website language, files them under the correct year, and verifies each article against its original source.\n\n<!-- File: .agents/skills/create-typescript-news/SKILL.md (Tokens: ~2435 | Category: anthropic-skill) -->\n---\nname: create-typescript-news\ndescription: Create and synchronize concise, source-faithful TypeScript news pages for every language configured in this repository's Astro/Starlight website. Use when asked to add, publish, translate, edit, remove, audit, or synchronize news in website/src/content/docs/typescript-news, or when a website language is added. Require an explicit source/context handoff before creating or materially editing a news item; the handoff may come from the user or from a preceding research workflow requested by the user containing verified sources, dates, and findings.\n---\n\n# Create TypeScript News\n\nCreate a TypeScript news article only from explicit source/context input, then translate and file it consistently across every configured website language.\n\n## Require source/context input\n\nBefore drafting or editing files, confirm that explicit source/context input is available. It may be either:\n\n* source content or announcement text supplied directly by the user; or\n* a research handoff produced by a preceding research step that the user explicitly requested, containing the selected topic, original authoritative source URL(s), publication date(s), and the factual findings to use.\n\nA research handoff is valid source/context input only when it identifies the original authoritative source and preserves enough factual detail to verify the article. Prefer official TypeScript, Microsoft, TC39, GitHub, and maintainer sources. Do not treat general model memory or an uncited topic suggestion as source/context input.\n\nIf neither form of source/context input is available, ask for:\n\n* the source content or announcement text;\n* the original source URL, if the user wants to provide it;\n* the publication date;\n* an optional preferred title or slug.\n\nStop after asking. Do not independently select a topic unless the user's workflow explicitly includes a preceding research-and-handoff step.\n\nIf source/context input is present but the publication date is missing and cannot be verified from the authoritative source, ask for it because the date determines the year directory and archive. The original source URL is optional only for directly user-supplied source content; a research handoff must include its original authoritative source URL(s).\n\nFor a translation audit, language addition, or removal, the existing English articles and any cited sources are the supplied content. Ask the user only when the master content or intended change is missing or ambiguous.\n\n## Inspect the current structure\n\nBefore writing:\n\n1. Read `website/src/config/locales.ts` to identify every configured locale. Do not hard-code the locale list.\n2. Read the latest English and translated files under `website/src/content/docs/typescript-news/`.\n3. Read `.agents/skills/typescript-book-review/SKILL.md` completely and apply its review, style, translation, and Markdown rules.\n4. Preserve the existing Astro/Starlight content conventions and use the shared news-list implementation.\n\n## Keep every language synchronized\n\nTreat the English `website/src/content/docs/typescript-news/` tree as the master and canonical news inventory. All translations must follow the English version's factual content, structure, metadata, year, and slug. Compare article paths relative to the English directory with the corresponding tree for every non-root locale configured in `website/src/config/locales.ts`.\n\nEvery English news article must have one translated article at the same relative year and slug path in every configured non-root locale. Do not rely on Starlight's content fallback to display English in place of a missing translation.\n\nApply changes across the entire language set:\n\n* When adding an article, create it in English and every configured non-root locale. The latest-news landing pages and yearly archives discover it automatically; do not add manual article lists to those pages.\n* When materially editing an article, apply the same factual change to every translation.\n* When changing a title, description, publication date, year, slug, source, or frontmatter field, make the corresponding change in every language.\n* When intentionally removing an English article, delete its translated file from every non-root locale.\n* When a localized article has no canonical English article, remove the orphaned file as part of synchronization.\n* When a new locale is added to `website/src/config/locales.ts`, create its localized news landing page, translate the complete English news archive, and create one localized yearly archive page for every year containing English articles.\n* When a locale is removed from `website/src/config/locales.ts`, do not treat its former files as a supported translation. Follow the scope of the locale-removal request for deleting the obsolete locale tree.\n\nKeep the set of relative article paths identical across English and every configured non-root locale. Preserve localized prose, but keep factual meaning, dates, slugs, commands, source URLs, and frontmatter synchronized.\n\n## Verify the source\n\nTreat the explicit source/context input as the authoritative basis for the article. When a research handoff is used, reopen and verify its original authoritative source URL(s) before publication.\n\n* Compare every date, version, feature, compatibility note, command, package name, option, number, and performance claim with the original source.\n* Open the supplied or handed-off source URL when accessible, giving preference to official TypeScript, Microsoft, TC39, GitHub, and maintainer sources.\n* Do not add claims from memory or infer unannounced behavior.\n* Remove details that cannot be supported by the source.\n* If the source/context conflicts with the original source or remains ambiguous, ask the user before publishing the disputed claim.\n* Link the original source in the article's `Source` section when a URL is available. Omit that section only when directly user-supplied source content has no URL.\n\n## Write the English article\n\nWrite a useful, concise summary rather than reproducing the source.\n\n* Lead with what was announced and why it matters to TypeScript developers.\n* Prefer short paragraphs and direct technical language.\n* Include only sections supported by the source. Use headings such as `## What changed`, `## Compatibility`, and `## Source` when they add value.\n* Preserve commands, package names, identifiers, compiler options, code, version numbers, and URLs exactly.\n* Avoid marketing language, speculation, filler, and lengthy history.\n* Use the publication date for both `lastUpdated` and `article:published_time` unless the source/context supplies a distinct verified update date.\n\nUse the established frontmatter pattern:\n\n```yaml\n---\ntitle: Article title\ndescription: A concise, source-supported description.\nlastUpdated: YYYY-MM-DD\nsidebar:\n    hidden: true\nhead:\n    - tag: meta\n      attrs:\n          property: article:published_time\n          content: 'YYYY-MM-DD'\n---\n```\n\nDo not add `sidebar.order` to news articles. Starlight hides individual articles from autogenerated sidebars through `sidebar.hidden: true`. Year links are generated from the English news-year directories and sorted newest first in `website/astro.config.mjs`.\n\n## Automatic latest-news lists and yearly archives\n\nThe shared `website/src/components/NewsList.astro` component reads the Starlight `docs` content collection at build time. It filters articles by locale and, for an archive, by year. It uses `article:published_time` as the publication date, sorts newest first, and uses the canonical English slug as the deterministic tie-breaker for articles published on the same date.\n\n* Keep each localized news landing page at `typescript-news/index.mdx`. It renders the latest 11 articles automatically; do not add, remove, or reorder article entries manually.\n* Keep one localized archive page at `typescript-news/YYYY/index.mdx` for every year with published English articles. Its localized title and description are page metadata; its `<NewsList locale=\"LOCALE\" year={YYYY} />` renders the localized article list automatically.\n* When the first article for a new year is added, create that year's archive page in English and every configured non-root locale. Do not edit older archive pages or article files just to update navigation order.\n* The news sidebar contains only year links. Its section label is read from each locale's news landing page title.\n\nRun the bundled verifier and focused list tests from the repository root after every news or locale change:\n\n```shell\npython3 .agents/skills/create-typescript-news/scripts/verify_news.py\nnpm --prefix website run test:news\n```\n\nThe verifier reads `website/src/config/locales.ts` and checks article path parity, valid publication dates, year-directory consistency, matching dates across translations, localized landing/archive pages, hidden article navigation, and the absence of `sidebar.order` metadata. The tests cover descending year order, newest-first article sorting, deterministic slug tie-breaking, and localized entries. Correct content or implementation issues rather than weakening the checks.\n\n## Save by publication year\n\nCreate the English article at:\n\n```text\nwebsite/src/content/docs/typescript-news/YYYY/article-slug.md\n```\n\nDerive `YYYY` from the verified publication date. Use a short, lowercase, hyphenated slug. Do not place article files directly in `typescript-news/`.\n\nCreate each translation at:\n\n```text\nwebsite/src/content/docs/LOCALE/typescript-news/YYYY/article-slug.md\n```\n\n## Create every translation\n\nFor each non-root locale configured in `website/src/config/locales.ts`:\n\n* Translate the title, description, headings, and prose naturally. The shared list formats publication dates using the locale's language tag.\n* Keep the same year, slug, publication date, frontmatter structure, Markdown structure, factual scope, and source URL, when present, as the English article.\n* Preserve commands, code, packages, options, identifiers, version numbers, and product names.\n* Do not translate official announcement titles inside source links unless the linked page itself uses that title.\n* Keep each translation faithful to the reviewed English article and the original source.\n\nThe landing-page and archive article lists are generated from content metadata, so do not edit them when adding an article.\n\n## Self-review\n\nReview the completed English article and every translation before building:\n\n1. Recheck each factual statement against the explicit source/context input and original source.\n2. Confirm no unsupported claim, date, number, command, package, or compatibility statement was introduced.\n3. Confirm the summary is useful and as concise as the subject permits.\n4. Confirm every translation preserves the English article's technical meaning.\n5. Confirm all configured locales have the article and matching publication metadata.\n6. Confirm paths, slugs, dates, source links, and frontmatter match across languages.\n7. Confirm Markdown follows `.agents/skills/typescript-book-review/SKILL.md`.\n8. Compare the complete English article inventory with every configured locale and confirm the relative path sets are identical.\n9. Confirm every added or edited English fact is reflected accurately in every translation.\n10. Confirm removed articles no longer exist in any configured language.\n11. Run `scripts/verify_news.py` and `npm --prefix website run test:news` and confirm both checks pass.\n12. Confirm a new-year archive page exists in every configured locale when the publication year is new.\n\nCorrect any issue found, then perform the source and translation accuracy comparison once more.\n\n## Validate the website\n\nFrom `website/`, run:\n\n```shell\nnpm run build\n```\n\nVerify:\n\n* the news verifier and focused list tests pass;\n* Astro reports no content or build errors;\n* the TypeScript News sidebar displays only years, newest first, with no individual article links;\n* clicking a year opens its localized archive page, and archive article links open the existing localized article URLs;\n* yearly archives and the latest-news landing page display localized articles in the expected order;\n* the English and every localized route are generated under the correct year, including Arabic with its RTL direction;\n* existing article canonical URLs, descriptions, and `article:published_time` metadata remain correct;\n* existing article routes and archive routes appear in the generated sitemap;\n* no duplicate article routes or unexpected missing routes are introduced.\n\nReport the created paths, source used, accuracy review, and build result. Commit or publish changes only when the user requests it.\n\n<!-- File: .agents/skills/typescript-book-review/SKILL.md (Tokens: ~1770 | Category: anthropic-skill) -->\n---\n\nname: typescript-book-review\ndescription: Review and editing guide for TypeScript book and reference content in the style of The Concise TypeScript Book. Use when reviewing or editing educational prose, translated or non-English content, code examples, chapters, table-of-contents entries, or Markdown formatting in this repository to identify and fix typos, grammar mistakes, formatting problems, and minor clarity issues without altering the original meaning or the book’s concise, practical, example-driven style.\n---\n\n# TypeScript Book Review\n\nUse this skill to review and edit TypeScript educational content while keeping it consistent with the rest of the book.\n\n## Review and Editing Rules\n\nReview the content carefully and make only justified corrections.\n\n* Fix spelling mistakes and typographical errors.\n* Fix grammar, punctuation, capitalization, and awkward sentence structure.\n* Fix incorrect, inconsistent, or broken Markdown formatting.\n* Make minor wording changes when they improve clarity or readability.\n* Preserve the original technical meaning and intent.\n* Do not introduce new claims, concepts, examples, recommendations, or explanations unless explicitly requested.\n* Do not substantially rewrite content that is already clear and correct.\n* Do not change the difficulty level or intended audience.\n* Do not alter valid code examples unless a correction is required.\n* Do not change identifiers, literal values, commands, or compiler options without a technical reason.\n* Never modify code merely to match a personal preference.\n* Preserve the existing structure unless a small organizational correction clearly improves readability.\n* Keep edits minimal, focused, and easy to review.\n\nWhen a sentence can be corrected in more than one way, prefer the version closest to the original wording.\n\n## Core Style\n\nMaintain a concise technical-reference style:\n\n* Explain concepts directly and avoid storytelling.\n* Use short paragraphs, usually one idea per paragraph.\n* Prefer precise, beginner-friendly language without oversimplifying TypeScript behavior.\n* Define the concept first, then explain why it matters or how TypeScript handles it.\n* State validity, errors, inference results, and runtime behavior explicitly.\n* Keep examples small and focused on one point.\n* Avoid marketing language, jokes, and lengthy historical context unless they clarify the feature.\n\n## Language and Translation\n\nUse the language requested by the user or already used by the file being edited.\n\n* Preserve the target language of translated content unless the user asks for a different language.\n* Correct grammar, spelling, punctuation, and idiomatic phrasing in the target language.\n* Keep the translation faithful to the original technical meaning.\n* Preserve TypeScript terms, identifiers, literal values, commands, compiler options, code comments, and error text unless a correction is required.\n* Do not replace established technical terms with awkward literal translations.\n* Keep examples and Markdown structure aligned with the source content when reviewing translated files.\n* If a source and translation disagree technically, preserve the TypeScript meaning and make the smallest correction needed.\n\n## Organization\n\nKeep content structured as a book chapter or reference section:\n\n* Use `##` for major topics and `###` or `####` for focused subtopics.\n* Keep headings descriptive and suitable for the table of contents.\n* Start each section with a brief explanation before showing code.\n* Split long topics into short subtopics instead of using one long section.\n* Group related examples together: basic syntax, valid usage, invalid usage, and practical notes.\n* Preserve compatibility with generated Markdown tables of contents.\n* Avoid changing headings unless the change is required to correct an error or improve clarity.\n* When changing a heading, update any corresponding table-of-contents entry or internal link.\n\n## Explanation Pattern\n\nUse this default flow when reviewing new or revised sections:\n\n1. Name the TypeScript feature or concept.\n2. Describe what it does in one or two paragraphs.\n3. Show a minimal TypeScript example.\n4. Explain the inferred type, compiler result, or runtime behavior.\n5. Add a second example only when it clarifies an edge case or common usage.\n6. End with a practical recommendation only when it follows directly from the example.\n\nPrefer direct formulations:\n\n* `TypeScript infers the type as ...`\n* `The following example is valid TypeScript code.`\n* `The following code produces an error:`\n* `This is useful when ...`\n* `At runtime, ...`\n\nDo not replace existing phrasing with these formulations when the current wording is already clear and consistent.\n\n## Code Examples\n\nReview examples for consistency without unnecessarily rewriting them:\n\n* Use fenced code blocks with `typescript`, `shell`, `json`, or `text`.\n* Add `<!-- skip -->` immediately before TypeScript snippets that are intentionally invalid, incomplete, illustrative only, or not expected to compile.\n* Use compact names such as `X`, `Y`, `Person`, `Animal`, `Dog`, or domain-neutral names when the domain is not important.\n* Prefer single-quoted strings in TypeScript examples.\n* Use inline comments to identify validity, inferred types, or compiler errors.\n* Keep comments short: `// Valid`, `// Invalid`, `// Type inferred is string`.\n* Show compiler messages in `text` blocks when the exact error helps explain the concept.\n* Avoid large applications, frameworks, or unrelated dependencies unless the section is specifically about them.\n* Preserve the behavior and educational purpose of every example.\n* Do not change code solely for stylistic consistency when doing so would create a large or unnecessary diff.\n\nExample pattern:\n\n<!-- skip -->\n```typescript\ntype X = {\n    a: string;\n};\n\nconst value: X = { a: 'a', b: 'b' }; // Invalid\n```\n\nObject literal may only specify known properties.\n\n## Markdown Conventions\n\nApply the book’s Markdown conventions consistently:\n\n* Use `*` for unordered lists.\n* Use inline code for identifiers, file names, compiler options, commands, and literal values.\n* Use links directly when they provide useful reference material.\n* Use `Notes:` only for short, concrete notes.\n* Use markdownlint comments sparingly and only when a formatting exception is necessary.\n* Do not add extra frontmatter to book chapters unless the repository format requires it.\n* Fix malformed lists, code fences, links, headings, spacing, and indentation.\n* Preserve intentional Markdown exceptions when they are required by the repository tooling.\n\n## TypeScript Content Conventions\n\nWhen reviewing TypeScript explanations:\n\n* Distinguish compile-time type checking from JavaScript runtime behavior.\n* Mention type erasure when runtime behavior could otherwise be misunderstood.\n* Prefer examples that demonstrate inference, assignability, narrowing, structural typing, configuration, or emitted JavaScript behavior.\n* When discussing migrations, recommend gradual migration and avoid refactoring during type conversion.\n* When discussing configuration, explain the option’s effect and give a practical default only when the recommendation is clear.\n* Avoid asserting version-specific behavior unless it has been verified against the repository’s target TypeScript version.\n* Do not alter technical statements unless the original statement is incorrect, misleading, or unclear.\n* Verify technical corrections before applying them.\n\n## Table of Contents and Headings\n\nTreat heading and table-of-contents consistency as a critical review requirement.\n\n* Confirm every table-of-contents entry matches its corresponding heading.\n* Confirm heading text, capitalization, punctuation, and anchor generation remain compatible.\n* Avoid special characters in table-of-contents entries unless the matching heading requires them.\n* Keep table-of-contents entries plain and compatible with generated Markdown anchors.\n* Check all changed headings against the table of contents at least twice.\n* Check all changed table-of-contents entries against their headings at least twice.\n* Confirm renamed, added, moved, or removed sections are reflected correctly.\n* Confirm internal links still point to valid headings.\n* Do not change a heading without checking every related table-of-contents entry and internal reference.\n\n## Review Checklist\n\nBefore finishing a review:\n\n* Confirm all spelling and typographical errors have been corrected.\n* Confirm grammar, punctuation, and capitalization are correct.\n* Confirm translated or non-English content uses the requested language consistently when applicable.\n* Confirm minor wording changes preserve the original meaning.\n* Confirm no unnecessary rewriting or expansion was introduced.\n* Confirm the heading level fits the surrounding chapter structure.\n* Confirm examples are minimal and directly support the explanation.\n* Confirm code examples retain their original behavior and purpose.\n* Confirm invalid or illustrative snippets use `<!-- skip -->`.\n* Confirm code fences use the correct language.\n* Confirm Markdown formatting is valid and consistent.\n* Confirm prose is concise, direct, and free of unrelated background.\n* Confirm table-of-contents compatibility when headings were added, removed, moved, or renamed.\n* Confirm table-of-contents entries avoid unnecessary special characters.\n* Confirm headings, table-of-contents entries, anchors, and internal links were checked twice.\n* Review the final diff and remove any change that is unnecessary or alters the original meaning.\n\n<!-- File: tools/.markdownlint.json (Tokens: ~289 | Category: anthropic-skill) -->\n{\n    \"code-block-style\": {\n        \"style\": \"fenced\"\n    },\n    \"code-fence-style\": {\n        \"style\": \"backtick\"\n    },\n    \"emphasis-style\": {\n        \"style\": \"asterisk\"\n    },\n    \"fenced-code-language\": {\n        \"allowed_languages\": [\n            \"shell\",\n            \"json\",\n            \"typescript\",\n            \"javascript\",\n            \"text\"\n        ],\n        \"language_only\": true\n    },\n    \"heading-style\": {\n        \"style\": \"atx\"\n    },\n    \"hr-style\": {\n        \"style\": \"---\"\n    },\n    \"line-length\": false,\n    \"no-duplicate-heading\": {\n        \"siblings_only\": true\n    },\n    \"ol-prefix\": {\n        \"style\": \"ordered\"\n    },\n    \"proper-names\": {\n        \"code_blocks\": false,\n        \"names\": [\n            \"TypeScript\",\n            \"Ctrl\",\n            \"JavaScript\",\n            \"Markdown\",\n            \"Node.js\",\n            \"Visual Studio Code\",\n            \"Microsoft\",\n            \"LinkedIn\",\n            \"GitHub\",\n            \"Twitter\",\n            \"Email\",\n            \"IntelliSense\",\n            \"ECMAScript\"\n        ]\n    },\n    \"required-headings\": false,\n    \"strong-style\": {\n        \"style\": \"asterisk\"\n    },\n    \"ul-style\": {\n        \"style\": \"asterisk\"\n    }\n}\n\n<!-- File: tools/.vscode/launch.json (Tokens: ~201 | Category: anthropic-skill) -->\n{\n    \"version\": \"0.2.0\",\n    \"configurations\": [\n        {\n            \"name\": \"Debug lint\",\n            \"type\": \"node\",\n            \"request\": \"launch\",\n            \"runtimeExecutable\": \"node\",\n            \"runtimeArgs\": [\n                \"--nolazy\",\n                \"-r\",\n                \"${workspaceRoot}/node_modules/ts-node/register/transpile-only\"\n            ],\n            \"args\": [\n                \"lint.ts\",\n                \"--example\",\n                \"hello\"\n            ],\n            \"cwd\": \"${workspaceRoot}\",\n            \"internalConsoleOptions\": \"openOnSessionStart\",\n            \"skipFiles\": [\n                \"<node_internals>/**\",\n                \"node_modules/**\"\n            ]\n        },\n        {\n            \"name\": \"Python: Current File\",\n            \"type\": \"python\",\n            \"request\": \"launch\",\n            \"program\": \"${file}\",\n            \"console\": \"integratedTerminal\",\n            \"justMyCode\": true\n        }\n    ]\n}\n\n<!-- File: tools/.vscode/settings.json (Tokens: ~11 | Category: anthropic-skill) -->\n{\n    \"editor.formatOnSave\": true,\n}\n\n<!-- File: tools/package-lock.json (Tokens: ~15356 | Category: anthropic-skill) -->\n{\n  \"name\": \"typescript-book\",\n  \"version\": \"1.0.0\",\n  \"lockfileVersion\": 3,\n  \"requires\": true,\n  \"packages\": {\n    \"\": {\n      \"name\": \"typescript-book\",\n      \"version\": \"1.0.0\",\n      \"license\": \"ISC\",\n      \"devDependencies\": {\n        \"@types/fs-extra\": \"^11.0.4\",\n        \"@types/marked\": \"^5.0.0\",\n        \"@types/node\": \"^20.19.43\",\n        \"@types/prettier\": \"^3.0.0\",\n        \"fp-ts\": \"^2.16.11\",\n        \"fs-extra\": \"^11.4.1\",\n        \"markdownlint-cli\": \"^0.35.0\",\n        \"marked\": \"^5.1.2\",\n        \"prettier\": \"^3.9.10\",\n        \"ts-node\": \"^10.9.2\",\n        \"typescript\": \"^5.4.5\"\n      }\n    },\n    \"node_modules/@cspotcode/source-map-support\": {\n      \"version\": \"0.8.1\",\n      \"resolved\": \"https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz\",\n      \"integrity\": \"sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@jridgewell/trace-mapping\": \"0.3.9\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      }\n    },\n    \"node_modules/@isaacs/cliui\": {\n      \"version\": \"8.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz\",\n      \"integrity\": \"sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"string-width\": \"^5.1.2\",\n        \"string-width-cjs\": \"npm:string-width@^4.2.0\",\n        \"strip-ansi\": \"^7.0.1\",\n        \"strip-ansi-cjs\": \"npm:strip-ansi@^6.0.1\",\n        \"wrap-ansi\": \"^8.1.0\",\n        \"wrap-ansi-cjs\": \"npm:wrap-ansi@^7.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      }\n    },\n    \"node_modules/@jridgewell/resolve-uri\": {\n      \"version\": \"3.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz\",\n      \"integrity\": \"sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=6.0.0\"\n      }\n    },\n    \"node_modules/@jridgewell/sourcemap-codec\": {\n      \"version\": \"1.4.15\",\n      \"resolved\": \"https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz\",\n      \"integrity\": \"sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==\",\n      \"dev\": true\n    },\n    \"node_modules/@jridgewell/trace-mapping\": {\n      \"version\": \"0.3.9\",\n      \"resolved\": \"https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz\",\n      \"integrity\": \"sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@jridgewell/resolve-uri\": \"^3.0.3\",\n        \"@jridgewell/sourcemap-codec\": \"^1.4.10\"\n      }\n    },\n    \"node_modules/@pkgjs/parseargs\": {\n      \"version\": \"0.11.0\",\n      \"resolved\": \"https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz\",\n      \"integrity\": \"sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==\",\n      \"dev\": true,\n      \"optional\": true,\n      \"engines\": {\n        \"node\": \">=14\"\n      }\n    },\n    \"node_modules/@tsconfig/node10\": {\n      \"version\": \"1.0.9\",\n      \"resolved\": \"https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz\",\n      \"integrity\": \"sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==\",\n      \"dev\": true\n    },\n    \"node_modules/@tsconfig/node12\": {\n      \"version\": \"1.0.11\",\n      \"resolved\": \"https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz\",\n      \"integrity\": \"sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==\",\n      \"dev\": true\n    },\n    \"node_modules/@tsconfig/node14\": {\n      \"version\": \"1.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz\",\n      \"integrity\": \"sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==\",\n      \"dev\": true\n    },\n    \"node_modules/@tsconfig/node16\": {\n      \"version\": \"1.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz\",\n      \"integrity\": \"sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==\",\n      \"dev\": true\n    },\n    \"node_modules/@types/fs-extra\": {\n      \"version\": \"11.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/@types/fs-extra/-/fs-extra-11.0.4.tgz\",\n      \"integrity\": \"sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@types/jsonfile\": \"*\",\n        \"@types/node\": \"*\"\n      }\n    },\n    \"node_modules/@types/jsonfile\": {\n      \"version\": \"6.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/@types/jsonfile/-/jsonfile-6.1.1.tgz\",\n      \"integrity\": \"sha512-GSgiRCVeapDN+3pqA35IkQwasaCh/0YFH5dEF6S88iDvEn901DjOeH3/QPY+XYP1DFzDZPvIvfeEgk+7br5png==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@types/node\": \"*\"\n      }\n    },\n    \"node_modules/@types/marked\": {\n      \"version\": \"5.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/@types/marked/-/marked-5.0.0.tgz\",\n      \"integrity\": \"sha512-YcZe50jhltsCq7rc9MNZC/4QB/OnA2Pd6hrOSTOFajtabN+38slqgDDCeE/0F83SjkKBQcsZUj7VLWR0H5cKRA==\",\n      \"dev\": true\n    },\n    \"node_modules/@types/node\": {\n      \"version\": \"20.19.43\",\n      \"resolved\": \"https://registry.npmjs.org/@types/node/-/node-20.19.43.tgz\",\n      \"integrity\": \"sha512-6oYBAi5ikg4Pl+kGsoYtawUMBT2zZMCvPNF7pVLnHZfd1zf38DRiWn/gT01RYCdUqkv7Fhr+C9ot4/tb+2sVvA==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"undici-types\": \"~6.21.0\"\n      }\n    },\n    \"node_modules/@types/prettier\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/@types/prettier/-/prettier-3.0.0.tgz\",\n      \"integrity\": \"sha512-mFMBfMOz8QxhYVbuINtswBp9VL2b4Y0QqYHwqLz3YbgtfAcat2Dl6Y1o4e22S/OVE6Ebl9m7wWiMT2lSbAs1wA==\",\n      \"deprecated\": \"This is a stub types definition. prettier provides its own type definitions, so you do not need this installed.\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"prettier\": \"*\"\n      }\n    },\n    \"node_modules/acorn\": {\n      \"version\": \"8.9.0\",\n      \"resolved\": \"https://registry.npmjs.org/acorn/-/acorn-8.9.0.tgz\",\n      \"integrity\": \"sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ==\",\n      \"dev\": true,\n      \"bin\": {\n        \"acorn\": \"bin/acorn\"\n      },\n      \"engines\": {\n        \"node\": \">=0.4.0\"\n      }\n    },\n    \"node_modules/acorn-walk\": {\n      \"version\": \"8.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz\",\n      \"integrity\": \"sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=0.4.0\"\n      }\n    },\n    \"node_modules/ansi-regex\": {\n      \"version\": \"6.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz\",\n      \"integrity\": \"sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/chalk/ansi-regex?sponsor=1\"\n      }\n    },\n    \"node_modules/ansi-styles\": {\n      \"version\": \"6.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz\",\n      \"integrity\": \"sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/chalk/ansi-styles?sponsor=1\"\n      }\n    },\n    \"node_modules/arg\": {\n      \"version\": \"4.1.3\",\n      \"resolved\": \"https://registry.npmjs.org/arg/-/arg-4.1.3.tgz\",\n      \"integrity\": \"sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==\",\n      \"dev\": true\n    },\n    \"node_modules/argparse\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz\",\n      \"integrity\": \"sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==\",\n      \"dev\": true\n    },\n    \"node_modules/balanced-match\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz\",\n      \"integrity\": \"sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==\",\n      \"dev\": true\n    },\n    \"node_modules/brace-expansion\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz\",\n      \"integrity\": \"sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"balanced-match\": \"^1.0.0\"\n      }\n    },\n    \"node_modules/color-convert\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz\",\n      \"integrity\": \"sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"color-name\": \"~1.1.4\"\n      },\n      \"engines\": {\n        \"node\": \">=7.0.0\"\n      }\n    },\n    \"node_modules/color-name\": {\n      \"version\": \"1.1.4\",\n      \"resolved\": \"https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz\",\n      \"integrity\": \"sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==\",\n      \"dev\": true\n    },\n    \"node_modules/commander\": {\n      \"version\": \"11.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/commander/-/commander-11.0.0.tgz\",\n      \"integrity\": \"sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=16\"\n      }\n    },\n    \"node_modules/create-require\": {\n      \"version\": \"1.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz\",\n      \"integrity\": \"sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==\",\n      \"dev\": true\n    },\n    \"node_modules/cross-spawn\": {\n      \"version\": \"7.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz\",\n      \"integrity\": \"sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"path-key\": \"^3.1.0\",\n        \"shebang-command\": \"^2.0.0\",\n        \"which\": \"^2.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 8\"\n      }\n    },\n    \"node_modules/deep-extend\": {\n      \"version\": \"0.6.0\",\n      \"resolved\": \"https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz\",\n      \"integrity\": \"sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=4.0.0\"\n      }\n    },\n    \"node_modules/diff\": {\n      \"version\": \"4.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/diff/-/diff-4.0.2.tgz\",\n      \"integrity\": \"sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=0.3.1\"\n      }\n    },\n    \"node_modules/eastasianwidth\": {\n      \"version\": \"0.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz\",\n      \"integrity\": \"sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==\",\n      \"dev\": true\n    },\n    \"node_modules/emoji-regex\": {\n      \"version\": \"9.2.2\",\n      \"resolved\": \"https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz\",\n      \"integrity\": \"sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==\",\n      \"dev\": true\n    },\n    \"node_modules/entities\": {\n      \"version\": \"3.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/entities/-/entities-3.0.1.tgz\",\n      \"integrity\": \"sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=0.12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/fb55/entities?sponsor=1\"\n      }\n    },\n    \"node_modules/foreground-child\": {\n      \"version\": \"3.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz\",\n      \"integrity\": \"sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"cross-spawn\": \"^7.0.0\",\n        \"signal-exit\": \"^4.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=14\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/isaacs\"\n      }\n    },\n    \"node_modules/fp-ts\": {\n      \"version\": \"2.16.11\",\n      \"resolved\": \"https://registry.npmjs.org/fp-ts/-/fp-ts-2.16.11.tgz\",\n      \"integrity\": \"sha512-LaI+KaX2NFkfn1ZGHoKCmcfv7yrZsC3b8NtWsTVQeHkq4F27vI5igUuO53sxqDEa2gNQMHFPmpojDw/1zmUK7w==\",\n      \"dev\": true,\n      \"license\": \"MIT\"\n    },\n    \"node_modules/fs-extra\": {\n      \"version\": \"11.4.1\",\n      \"resolved\": \"https://registry.npmjs.org/fs-extra/-/fs-extra-11.4.1.tgz\",\n      \"integrity\": \"sha512-KYAb4c9BJQI6QqGKthV68OHe0badztdXJWKo0WtBA9IuCFPTKvE5ZdUBglP833aMjhaSPNO4A5j/EkzZtGlKjA==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"graceful-fs\": \"^4.2.0\",\n        \"jsonfile\": \"^6.0.1\",\n        \"universalify\": \"^2.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=14.14\"\n      }\n    },\n    \"node_modules/get-stdin\": {\n      \"version\": \"9.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/get-stdin/-/get-stdin-9.0.0.tgz\",\n      \"integrity\": \"sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/glob\": {\n      \"version\": \"10.2.7\",\n      \"resolved\": \"https://registry.npmjs.org/glob/-/glob-10.2.7.tgz\",\n      \"integrity\": \"sha512-jTKehsravOJo8IJxUGfZILnkvVJM/MOfHRs8QcXolVef2zNI9Tqyy5+SeuOAZd3upViEZQLyFpQhYiHLrMUNmA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"foreground-child\": \"^3.1.0\",\n        \"jackspeak\": \"^2.0.3\",\n        \"minimatch\": \"^9.0.1\",\n        \"minipass\": \"^5.0.0 || ^6.0.2\",\n        \"path-scurry\": \"^1.7.0\"\n      },\n      \"bin\": {\n        \"glob\": \"dist/cjs/src/bin.js\"\n      },\n      \"engines\": {\n        \"node\": \">=16 || 14 >=14.17\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/isaacs\"\n      }\n    },\n    \"node_modules/graceful-fs\": {\n      \"version\": \"4.2.11\",\n      \"resolved\": \"https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz\",\n      \"integrity\": \"sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==\",\n      \"dev\": true\n    },\n    \"node_modules/ignore\": {\n      \"version\": \"5.2.4\",\n      \"resolved\": \"https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz\",\n      \"integrity\": \"sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">= 4\"\n      }\n    },\n    \"node_modules/ini\": {\n      \"version\": \"3.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/ini/-/ini-3.0.1.tgz\",\n      \"integrity\": \"sha512-it4HyVAUTKBc6m8e1iXWvXSTdndF7HbdN713+kvLrymxTaU4AUBWrJ4vEooP+V7fexnVD3LKcBshjGGPefSMUQ==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \"^12.13.0 || ^14.15.0 || >=16.0.0\"\n      }\n    },\n    \"node_modules/is-fullwidth-code-point\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz\",\n      \"integrity\": \"sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/isexe\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz\",\n      \"integrity\": \"sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==\",\n      \"dev\": true\n    },\n    \"node_modules/jackspeak\": {\n      \"version\": \"2.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/jackspeak/-/jackspeak-2.2.1.tgz\",\n      \"integrity\": \"sha512-MXbxovZ/Pm42f6cDIDkl3xpwv1AGwObKwfmjs2nQePiy85tP3fatofl3FC1aBsOtP/6fq5SbtgHwWcMsLP+bDw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@isaacs/cliui\": \"^8.0.2\"\n      },\n      \"engines\": {\n        \"node\": \">=14\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/isaacs\"\n      },\n      \"optionalDependencies\": {\n        \"@pkgjs/parseargs\": \"^0.11.0\"\n      }\n    },\n    \"node_modules/js-yaml\": {\n      \"version\": \"4.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz\",\n      \"integrity\": \"sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"argparse\": \"^2.0.1\"\n      },\n      \"bin\": {\n        \"js-yaml\": \"bin/js-yaml.js\"\n      }\n    },\n    \"node_modules/jsonc-parser\": {\n      \"version\": \"3.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz\",\n      \"integrity\": \"sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==\",\n      \"dev\": true\n    },\n    \"node_modules/jsonfile\": {\n      \"version\": \"6.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz\",\n      \"integrity\": \"sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"universalify\": \"^2.0.0\"\n      },\n      \"optionalDependencies\": {\n        \"graceful-fs\": \"^4.1.6\"\n      }\n    },\n    \"node_modules/linkify-it\": {\n      \"version\": \"4.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/linkify-it/-/linkify-it-4.0.1.tgz\",\n      \"integrity\": \"sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"uc.micro\": \"^1.0.1\"\n      }\n    },\n    \"node_modules/lru-cache\": {\n      \"version\": \"10.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.0.tgz\",\n      \"integrity\": \"sha512-svTf/fzsKHffP42sujkO/Rjs37BCIsQVRCeNYIm9WN8rgT7ffoUnRtZCqU+6BqcSBdv8gwJeTz8knJpgACeQMw==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \"14 || >=16.14\"\n      }\n    },\n    \"node_modules/make-error\": {\n      \"version\": \"1.3.6\",\n      \"resolved\": \"https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz\",\n      \"integrity\": \"sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==\",\n      \"dev\": true\n    },\n    \"node_modules/markdown-it\": {\n      \"version\": \"13.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/markdown-it/-/markdown-it-13.0.1.tgz\",\n      \"integrity\": \"sha512-lTlxriVoy2criHP0JKRhO2VDG9c2ypWCsT237eDiLqi09rmbKoUetyGHq2uOIRoRS//kfoJckS0eUzzkDR+k2Q==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"argparse\": \"^2.0.1\",\n        \"entities\": \"~3.0.1\",\n        \"linkify-it\": \"^4.0.1\",\n        \"mdurl\": \"^1.0.1\",\n        \"uc.micro\": \"^1.0.5\"\n      },\n      \"bin\": {\n        \"markdown-it\": \"bin/markdown-it.js\"\n      }\n    },\n    \"node_modules/markdownlint\": {\n      \"version\": \"0.29.0\",\n      \"resolved\": \"https://registry.npmjs.org/markdownlint/-/markdownlint-0.29.0.tgz\",\n      \"integrity\": \"sha512-ASAzqpODstu/Qsk0xW5BPgWnK/qjpBQ4e7IpsSvvFXcfYIjanLTdwFRJK1SIEEh0fGSMKXcJf/qhaZYHyME0wA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"markdown-it\": \"13.0.1\",\n        \"markdownlint-micromark\": \"0.1.5\"\n      },\n      \"engines\": {\n        \"node\": \">=16\"\n      }\n    },\n    \"node_modules/markdownlint-cli\": {\n      \"version\": \"0.35.0\",\n      \"resolved\": \"https://registry.npmjs.org/markdownlint-cli/-/markdownlint-cli-0.35.0.tgz\",\n      \"integrity\": \"sha512-lVIIIV1MrUtjoocgDqXLxUCxlRbn7Ve8rsWppfwciUNwLlNS28AhNiyQ3PU7jjj4Qvj+rWTTvwkqg7AcdG988g==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"commander\": \"~11.0.0\",\n        \"get-stdin\": \"~9.0.0\",\n        \"glob\": \"~10.2.7\",\n        \"ignore\": \"~5.2.4\",\n        \"js-yaml\": \"^4.1.0\",\n        \"jsonc-parser\": \"~3.2.0\",\n        \"markdownlint\": \"~0.29.0\",\n        \"minimatch\": \"~9.0.1\",\n        \"run-con\": \"~1.2.11\"\n      },\n      \"bin\": {\n        \"markdownlint\": \"markdownlint.js\"\n      },\n      \"engines\": {\n        \"node\": \">=16\"\n      }\n    },\n    \"node_modules/markdownlint-micromark\": {\n      \"version\": \"0.1.5\",\n      \"resolved\": \"https://registry.npmjs.org/markdownlint-micromark/-/markdownlint-micromark-0.1.5.tgz\",\n      \"integrity\": \"sha512-HvofNU4QCvfUCWnocQP1IAWaqop5wpWrB0mKB6SSh0fcpV0PdmQNS6tdUuFew1utpYlUvYYzz84oDkrD76GB9A==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=16\"\n      }\n    },\n    \"node_modules/marked\": {\n      \"version\": \"5.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/marked/-/marked-5.1.2.tgz\",\n      \"integrity\": \"sha512-ahRPGXJpjMjwSOlBoTMZAK7ATXkli5qCPxZ21TG44rx1KEo44bii4ekgTDQPNRQ4Kh7JMb9Ub1PVk1NxRSsorg==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"bin\": {\n        \"marked\": \"bin/marked.js\"\n      },\n      \"engines\": {\n        \"node\": \">= 16\"\n      }\n    },\n    \"node_modules/mdurl\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz\",\n      \"integrity\": \"sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==\",\n      \"dev\": true\n    },\n    \"node_modules/minimatch\": {\n      \"version\": \"9.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz\",\n      \"integrity\": \"sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"brace-expansion\": \"^2.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=16 || 14 >=14.17\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/isaacs\"\n      }\n    },\n    \"node_modules/minimist\": {\n      \"version\": \"1.2.8\",\n      \"resolved\": \"https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz\",\n      \"integrity\": \"sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==\",\n      \"dev\": true,\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/minipass\": {\n      \"version\": \"6.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/minipass/-/minipass-6.0.2.tgz\",\n      \"integrity\": \"sha512-MzWSV5nYVT7mVyWCwn2o7JH13w2TBRmmSqSRCKzTw+lmft9X4z+3wjvs06Tzijo5z4W/kahUCDpRXTF+ZrmF/w==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=16 || 14 >=14.17\"\n      }\n    },\n    \"node_modules/path-key\": {\n      \"version\": \"3.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz\",\n      \"integrity\": \"sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/path-scurry\": {\n      \"version\": \"1.10.1\",\n      \"resolved\": \"https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz\",\n      \"integrity\": \"sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"lru-cache\": \"^9.1.1 || ^10.0.0\",\n        \"minipass\": \"^5.0.0 || ^6.0.2 || ^7.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=16 || 14 >=14.17\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/isaacs\"\n      }\n    },\n    \"node_modules/prettier\": {\n      \"version\": \"3.9.10\",\n      \"resolved\": \"https://registry.npmjs.org/prettier/-/prettier-3.9.10.tgz\",\n      \"integrity\": \"sha512-skGHTH1Yb9QvaTC4hWnRTzEYtCpApF0UMBPz+t/0ZPzP8ihefo/btKd+QA7pUE0fEwA1SbS/NmhyEcstdXOIdA==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"bin\": {\n        \"prettier\": \"bin/prettier.cjs\"\n      },\n      \"engines\": {\n        \"node\": \">=14\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/prettier/prettier?sponsor=1\"\n      }\n    },\n    \"node_modules/run-con\": {\n      \"version\": \"1.2.12\",\n      \"resolved\": \"https://registry.npmjs.org/run-con/-/run-con-1.2.12.tgz\",\n      \"integrity\": \"sha512-5257ILMYIF4RztL9uoZ7V9Q97zHtNHn5bN3NobeAnzB1P3ASLgg8qocM2u+R18ttp+VEM78N2LK8XcNVtnSRrg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"deep-extend\": \"^0.6.0\",\n        \"ini\": \"~3.0.0\",\n        \"minimist\": \"^1.2.8\",\n        \"strip-json-comments\": \"~3.1.1\"\n      },\n      \"bin\": {\n        \"run-con\": \"cli.js\"\n      }\n    },\n    \"node_modules/shebang-command\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz\",\n      \"integrity\": \"sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"shebang-regex\": \"^3.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/shebang-regex\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz\",\n      \"integrity\": \"sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/signal-exit\": {\n      \"version\": \"4.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/signal-exit/-/signal-exit-4.0.2.tgz\",\n      \"integrity\": \"sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=14\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/isaacs\"\n      }\n    },\n    \"node_modules/string-width\": {\n      \"version\": \"5.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz\",\n      \"integrity\": \"sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"eastasianwidth\": \"^0.2.0\",\n        \"emoji-regex\": \"^9.2.2\",\n        \"strip-ansi\": \"^7.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/string-width-cjs\": {\n      \"name\": \"string-width\",\n      \"version\": \"4.2.3\",\n      \"resolved\": \"https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz\",\n      \"integrity\": \"sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"emoji-regex\": \"^8.0.0\",\n        \"is-fullwidth-code-point\": \"^3.0.0\",\n        \"strip-ansi\": \"^6.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/string-width-cjs/node_modules/ansi-regex\": {\n      \"version\": \"5.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz\",\n      \"integrity\": \"sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/string-width-cjs/node_modules/emoji-regex\": {\n      \"version\": \"8.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz\",\n      \"integrity\": \"sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==\",\n      \"dev\": true\n    },\n    \"node_modules/string-width-cjs/node_modules/strip-ansi\": {\n      \"version\": \"6.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz\",\n      \"integrity\": \"sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"ansi-regex\": \"^5.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/strip-ansi\": {\n      \"version\": \"7.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz\",\n      \"integrity\": \"sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"ansi-regex\": \"^6.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/chalk/strip-ansi?sponsor=1\"\n      }\n    },\n    \"node_modules/strip-ansi-cjs\": {\n      \"name\": \"strip-ansi\",\n      \"version\": \"6.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz\",\n      \"integrity\": \"sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"ansi-regex\": \"^5.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/strip-ansi-cjs/node_modules/ansi-regex\": {\n      \"version\": \"5.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz\",\n      \"integrity\": \"sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/strip-json-comments\": {\n      \"version\": \"3.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz\",\n      \"integrity\": \"sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=8\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/ts-node\": {\n      \"version\": \"10.9.2\",\n      \"resolved\": \"https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz\",\n      \"integrity\": \"sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@cspotcode/source-map-support\": \"^0.8.0\",\n        \"@tsconfig/node10\": \"^1.0.7\",\n        \"@tsconfig/node12\": \"^1.0.7\",\n        \"@tsconfig/node14\": \"^1.0.0\",\n        \"@tsconfig/node16\": \"^1.0.2\",\n        \"acorn\": \"^8.4.1\",\n        \"acorn-walk\": \"^8.1.1\",\n        \"arg\": \"^4.1.0\",\n        \"create-require\": \"^1.1.0\",\n        \"diff\": \"^4.0.1\",\n        \"make-error\": \"^1.1.1\",\n        \"v8-compile-cache-lib\": \"^3.0.1\",\n        \"yn\": \"3.1.1\"\n      },\n      \"bin\": {\n        \"ts-node\": \"dist/bin.js\",\n        \"ts-node-cwd\": \"dist/bin-cwd.js\",\n        \"ts-node-esm\": \"dist/bin-esm.js\",\n        \"ts-node-script\": \"dist/bin-script.js\",\n        \"ts-node-transpile-only\": \"dist/bin-transpile.js\",\n        \"ts-script\": \"dist/bin-script-deprecated.js\"\n      },\n      \"peerDependencies\": {\n        \"@swc/core\": \">=1.2.50\",\n        \"@swc/wasm\": \">=1.2.50\",\n        \"@types/node\": \"*\",\n        \"typescript\": \">=2.7\"\n      },\n      \"peerDependenciesMeta\": {\n        \"@swc/core\": {\n          \"optional\": true\n        },\n        \"@swc/wasm\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/typescript\": {\n      \"version\": \"5.4.5\",\n      \"resolved\": \"https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz\",\n      \"integrity\": \"sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==\",\n      \"dev\": true,\n      \"bin\": {\n        \"tsc\": \"bin/tsc\",\n        \"tsserver\": \"bin/tsserver\"\n      },\n      \"engines\": {\n        \"node\": \">=14.17\"\n      }\n    },\n    \"node_modules/uc.micro\": {\n      \"version\": \"1.0.6\",\n      \"resolved\": \"https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz\",\n      \"integrity\": \"sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==\",\n      \"dev\": true\n    },\n    \"node_modules/undici-types\": {\n      \"version\": \"6.21.0\",\n      \"resolved\": \"https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz\",\n      \"integrity\": \"sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==\",\n      \"dev\": true,\n      \"license\": \"MIT\"\n    },\n    \"node_modules/universalify\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz\",\n      \"integrity\": \"sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">= 10.0.0\"\n      }\n    },\n    \"node_modules/v8-compile-cache-lib\": {\n      \"version\": \"3.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz\",\n      \"integrity\": \"sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==\",\n      \"dev\": true\n    },\n    \"node_modules/which\": {\n      \"version\": \"2.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/which/-/which-2.0.2.tgz\",\n      \"integrity\": \"sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"isexe\": \"^2.0.0\"\n      },\n      \"bin\": {\n        \"node-which\": \"bin/node-which\"\n      },\n      \"engines\": {\n        \"node\": \">= 8\"\n      }\n    },\n    \"node_modules/wrap-ansi\": {\n      \"version\": \"8.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz\",\n      \"integrity\": \"sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"ansi-styles\": \"^6.1.0\",\n        \"string-width\": \"^5.0.1\",\n        \"strip-ansi\": \"^7.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/chalk/wrap-ansi?sponsor=1\"\n      }\n    },\n    \"node_modules/wrap-ansi-cjs\": {\n      \"name\": \"wrap-ansi\",\n      \"version\": \"7.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz\",\n      \"integrity\": \"sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"ansi-styles\": \"^4.0.0\",\n        \"string-width\": \"^4.1.0\",\n        \"strip-ansi\": \"^6.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/chalk/wrap-ansi?sponsor=1\"\n      }\n    },\n    \"node_modules/wrap-ansi-cjs/node_modules/ansi-regex\": {\n      \"version\": \"5.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz\",\n      \"integrity\": \"sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/wrap-ansi-cjs/node_modules/ansi-styles\": {\n      \"version\": \"4.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz\",\n      \"integrity\": \"sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"color-convert\": \"^2.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/chalk/ansi-styles?sponsor=1\"\n      }\n    },\n    \"node_modules/wrap-ansi-cjs/node_modules/emoji-regex\": {\n      \"version\": \"8.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz\",\n      \"integrity\": \"sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==\",\n      \"dev\": true\n    },\n    \"node_modules/wrap-ansi-cjs/node_modules/string-width\": {\n      \"version\": \"4.2.3\",\n      \"resolved\": \"https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz\",\n      \"integrity\": \"sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"emoji-regex\": \"^8.0.0\",\n        \"is-fullwidth-code-point\": \"^3.0.0\",\n        \"strip-ansi\": \"^6.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/wrap-ansi-cjs/node_modules/strip-ansi\": {\n      \"version\": \"6.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz\",\n      \"integrity\": \"sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"ansi-regex\": \"^5.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/yn\": {\n      \"version\": \"3.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/yn/-/yn-3.1.1.tgz\",\n      \"integrity\": \"sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=6\"\n      }\n    }\n  }\n}\n\n<!-- File: tools/package.json (Tokens: ~366 | Category: anthropic-skill) -->\n{\n  \"name\": \"typescript-book\",\n  \"version\": \"1.0.0\",\n  \"description\": \"The Concise TypeScript Book provides a comprehensive and succinct overview of TypeScript's capabilities. It offers clear explanations covering all aspects found in the latest version of the language, from its powerful type system to advanced features. Whether you're a beginner or an experienced developer, this book is an invaluable resource to enhance your understanding and proficiency in TypeScript.\",\n  \"main\": \"index.js\",\n  \"scripts\": {\n    \"format\": \"ts-node format\",\n    \"compile\": \"ts-node compile\",\n    \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\",\n    \"lint\": \"ts-node lint\",\n    \"lint:md\": \"markdownlint --ignore \\\"../AGENTS.md\\\" --ignore \\\"../.agents/**\\\" \\\"./*.md\\\" \\\"../*.md\\\"\",\n    \"check\": \"npm run lint && npm run lint:md && npm run format && npm run compile\"\n  },\n  \"author\": \"\",\n  \"license\": \"ISC\",\n  \"devDependencies\": {\n    \"@types/fs-extra\": \"^11.0.4\",\n    \"@types/marked\": \"^5.0.0\",\n    \"@types/node\": \"^20.19.43\",\n    \"@types/prettier\": \"^3.0.0\",\n    \"fp-ts\": \"^2.16.11\",\n    \"fs-extra\": \"^11.4.1\",\n    \"markdownlint-cli\": \"^0.35.0\",\n    \"marked\": \"^5.1.2\",\n    \"prettier\": \"^3.9.10\",\n    \"ts-node\": \"^10.9.2\",\n    \"typescript\": \"^5.4.5\"\n  }\n}\n\n<!-- File: tools/test-md/README-zh_CN.md (Tokens: ~149 | Category: anthropic-skill) -->\n# 简洁 TypeScript 书\nTypeScript 有效开发简明指南。 **免费和开源**。\n## 创建文件和文件夹\n可使用 按钮访问文件资源管理器。\n## 切换到另一个文件\n您的所有文件和文件夹都在文件资源管理器中显示为树。 您可以通过单击树中的文件从一个文件切换到另一个文件。\n### 新标题\n一些家长内容。\n#### 嵌套内容 1\n更多内容在这里。\n##### 嵌套内容 2\n内容甚至更多。\n\n<!-- File: tools/tsconfig.json (Tokens: ~125 | Category: anthropic-skill) -->\n{\n  \"compilerOptions\": {\n    \"target\": \"es2022\",\n    \"module\": \"commonjs\",\n    \"noImplicitAny\": true,\n    \"esModuleInterop\": true,\n    \"noEmitOnError\": true,\n    \"moduleDetection\": \"force\",\n    \"noUnusedLocals\": false,\n    \"forceConsistentCasingInFileNames\": true,\n    \"strict\": true,\n    \"skipLibCheck\": true,\n    \"lib\": [\n      \"es2022\",\n      \"esnext.disposable\",\n      \"esnext.decorators\",\n      \"dom\"\n    ]\n  }\n}\n\n<!-- File: tools/README.md (Tokens: ~1192 | Category: plugin-manifest) -->\n# Tools for Working with Markdown Books\n\nIf you're working with Markdown books, here are some essential tools and commands to help you streamline your workflow.\n\n## Installation\n\nThe Docker workflow provides all dependencies required to generate and verify the\nbooks. With Docker running, use this command from `tools`:\n\n```shell\nmake docker-books\n```\n\nThe repository is mounted into the container, so generated EPUB and PDF files are\nwritten directly to the local `downloads` folder. The Docker image is built on the\nfirst command and reused on subsequent commands. Its Node.js dependencies stay\ninside the container. It includes EPUBCheck 5.3.0 and invokes it through a Java\nwrapper, so EPUB validation works when invoked by Python without leaving cache files\nin the checkout. The Noto fonts required for PDF generation are stored in\n`tools/fonts` and copied into the image during the build.\n\n### Local installation\n\nTo run the tools without Docker, ensure Node.js is installed. Then set up the\nrequired dependencies with the following commands:\n\nIn folder `tools` and `website`:\n\n```shell\nnvm use\nnpm install\n```\n\n```shell\nbrew install pandoc\nbrew install epubcheck\nbrew install poppler\nbrew install --cask calibre\n```\n\n## Commands\n\nUse `make` to run the main commands:\n\n* `make format`: Format Markdown files for books.\n* `make check`: Run several checks to ensure the Markdown files are valid.\n* `make website`: Create different Markdown pages for the website.\n* `make website-preview`: Build and preview website locally.\n* `make website-e2e`: Build the production website and run its core Playwright end-to-end tests.\n* `make website-deploy`: Build and deploy website to GitHub Pages.\n* `make books`: Create EPUB and PDF books.\n* `make verify-books`: Verify the generated EPUB and PDF files.\n* `make docker-books`: Build the Docker image and create EPUB and PDF books in the local `downloads` folder.\n\n### Website End-to-End Tests\n\nThe Playwright suite covers only the website's main reader journeys: loading readable\nbook content, using the right-side page navigation, and finding content with search.\n\nInstall the browser once from the `website` folder:\n\n```shell\nnpx playwright install chromium\n```\n\nThen run the production build and tests from the `tools` folder:\n\n```shell\nmake website-e2e\n```\n\nPlaywright saves an HTML report, screenshots, and videos for each run. In pull\nrequests, CI uploads this evidence, links it from a single updated PR comment, and\ndeletes the uploaded artifacts after the PR is merged.\n\n### Formatting\n\nConsistent code formatting is crucial. To format all TypeScript snippets, we use Prettier. Execute the following command for formatting:\n\n```shell\nnpm run format\n```\n\n### Compilation\n\nTo compile TypeScript snippets within the Markdown files, utilize the following command:\n\n```shell\nnpm run compile\n```\n\n### Linting\n\nTo ensure that your Markdown files adhere to proper formatting rules, use the linting command:\n\n```shell\nnpm run lint:md\n```\n\n### Linting and Formatting\n\nFor a comprehensive process that includes linting all Markdown files, applying Prettier formatting to all TypeScript snippets, and compiling them using TypeScript, use the following command:\n\n```shell\nnpm run check\n```\n\nThe project uses the [Markdown All in One](https://marketplace.visualstudio.com/items?itemName=yzhang.markdown-all-in-one)Visual Studio Code extension to automatically update the table of contents.\n\nUse the following command to install it:\n\n```shell\ncode --install-extension yzhang.markdown-all-in-one\n```\n\n### Skipping Compilation\n\nIf you have specific snippets in the Markdown files that you don't want to compile, simply add `<!-- skip -->` just before the TypeScript demarcation for those snippets.\n\n### EPUB and PDF Generation\n\nTo generate EPUB and PDF files from your Markdown books, navigate to the `tools` folder and run the following command:\n\n```shell\nmake books\n```\n\nThe verification step uses `pdfinfo` for page totals and `pdffonts` to require the\nappropriate embedded Noto families for every locale. It rejects legacy Georgia,\nVerdana, Menlo, Apple, Times New Roman, and STSongti embeddings.\n\nTo regenerate every artifact with the container toolchain, run:\n\n```shell\nmake docker-books\n```\n\n### Tagging\n\nUse this tag format for TypeScript 7 book releases:\n\n```shell\ngit switch main\ngit pull origin main\ngit tag -a typescript-7-book-v1 -m \"TypeScript 7 book, revision 1\"\ngit push origin typescript-7-book-v1\n```\n\nThese tools will assist you in efficiently working with Markdown books and ensure a smooth and organized process. Happy writing!\n\n## Debug EPUB Issues\n\nTo debug the EPUB files you create, follow these steps:\n\nFirst, download and install Sigil. You can use the following command to install Sigil:\n\n```shell\nbrew install --cask sigil\n```\n\nNext, run an EPUB check to validate your EPUB file. For example:\n\n```shell\nepubcheck ../downloads/typescript-book.epub\n```\n\nFinally, open the EPUB file using Sigil for detailed inspection.\n\n## How to Contribute to This E-Book\n\nTo contribute to this e-book, follow these steps:\n\n* Update the main Markdown file with your changes.\n* Run `make check` to ensure the linter and other checks pass.\n* Preview the website locally with `make website-preview` to make sure it works as expected.\n* Generate the e-books by running `make books`.\n* Submit your PR and share your awesome contributions!\n\n<!-- File: tools/test-md/README.md (Tokens: ~103 | Category: plugin-manifest) -->\n# The Concise TypeScript Book\nA Concise Guide to Effective Development in TypeScript. **Free and Open Source**.\n## Create files and folders\nThe file explorer is accessible using the button.\n## Switch to another file\nAll your files and folders are presented as a tree in the file explorer. You can switch from one to another by clicking a file in the tree.\n### New title\nSome parent content.\n#### Nested content 1\nMore content here.\n##### Nested content 2\nEven more content.\n\n<!-- File: tools/utilities-add-translation/README.md (Tokens: ~300 | Category: plugin-manifest) -->\n# utilities-add-translation Documentation\n\nPath: `tools/utilities-add-translation/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/gibbok/typescript-book/HEAD/tools/utilities-add-translation/README.md)\n</yakaai_skills>"}