From d567fce1542a2e7a3ef58f123cd283ef15365a7e Mon Sep 17 00:00:00 2001 From: Romain Lenzotti Date: Fri, 21 Aug 2026 20:40:50 +0200 Subject: [PATCH 1/3] fix(cli): preserve watcher ignored context --- packages/cli/src/bin/tsed-dev.spec.ts | 11 +++++++++++ packages/cli/src/bin/tsed-dev.ts | 4 ++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/packages/cli/src/bin/tsed-dev.spec.ts b/packages/cli/src/bin/tsed-dev.spec.ts index 5cb7c7beb..14b86122a 100644 --- a/packages/cli/src/bin/tsed-dev.spec.ts +++ b/packages/cli/src/bin/tsed-dev.spec.ts @@ -44,6 +44,17 @@ describe("tsed-dev", () => { ).toBe(true); }); + it("should preserve the Vite watcher context when checking ignored files", () => { + expect( + shouldIgnoreWatchFile("/project/.swp", { + options: {atomic: true}, + _isIgnored(this: {options: {atomic: boolean}}, file: string) { + return this.options.atomic && file.endsWith(".swp"); + } + }) + ).toBe(true); + }); + it("should keep non-ignored files watchable", () => { expect( shouldIgnoreWatchFile("/project/server/index.ts", { diff --git a/packages/cli/src/bin/tsed-dev.ts b/packages/cli/src/bin/tsed-dev.ts index 907348beb..286a882e1 100644 --- a/packages/cli/src/bin/tsed-dev.ts +++ b/packages/cli/src/bin/tsed-dev.ts @@ -75,9 +75,9 @@ export function shouldIgnoreWatchFile(file: string | undefined, watcher?: unknow return true; } - const isIgnored = (watcher as WatcherWithIgnored | undefined)?._isIgnored; + const watcherWithIgnored = watcher as WatcherWithIgnored | undefined; - return typeof isIgnored === "function" ? isIgnored(file) : false; + return typeof watcherWithIgnored?._isIgnored === "function" ? watcherWithIgnored._isIgnored(file) : false; } async function createViteDevServer() { From f08b34ca47528c7e525ce27d7144c081005e0527 Mon Sep 17 00:00:00 2001 From: Romain Lenzotti Date: Fri, 4 Sep 2026 08:18:56 +0200 Subject: [PATCH 2/3] feat(cli): add skills templates for runtime documentation --- .agents/skills/tsed/SKILL.md | 6 + .../test/init.integration.spec.ts | 22 +++ .../generate.controller.integration.spec.ts | 16 ++ .../test/generate.model.integration.spec.ts | 8 + .../test/generate.schema.integration.spec.ts | 8 + .../test/init.integration.spec.ts | 10 ++ .../init.integration.spec.ts.snap | 8 + .../test/init/init.integration.spec.ts | 8 + .../test/generate.integration.spec.ts | 48 ++++++ .../test/init.integration.spec.ts | 8 + .../tests/init.integration.spec.ts | 12 ++ .../test/init/init.integration.spec.ts | 8 + .../generate.controller.integration.spec.ts | 8 + .../init/init.integration.spec.ts | 20 +++ .../generate.controller.integration.spec.ts | 18 +++ packages/cli/src/commands/init/InitCmd.ts | 14 ++ .../src/commands/init/SkillsTemplate.spec.ts | 38 +++++ packages/cli/src/templates/index.ts | 1 + packages/cli/src/templates/skills.template.ts | 148 ++++++++++++++++++ ...generate.async-factory.integration.spec.ts | 8 + .../generate.controller.integration.spec.ts | 16 ++ ...nerate.decorator-class.integration.spec.ts | 8 + ...ate.decorator-endpoint.integration.spec.ts | 8 + ...rate.decorator-generic.integration.spec.ts | 8 + ...erate.decorator-method.integration.spec.ts | 8 + ...e.decorator-middleware.integration.spec.ts | 16 ++ ...erate.exception-filter.integration.spec.ts | 8 + ...nerate.response-filter.integration.spec.ts | 8 + .../create.template.integration.spec.ts | 32 ++++ 29 files changed, 529 insertions(+) create mode 100644 .agents/skills/tsed/SKILL.md create mode 100644 packages/cli/src/commands/init/SkillsTemplate.spec.ts create mode 100644 packages/cli/src/templates/skills.template.ts diff --git a/.agents/skills/tsed/SKILL.md b/.agents/skills/tsed/SKILL.md new file mode 100644 index 000000000..5285978cb --- /dev/null +++ b/.agents/skills/tsed/SKILL.md @@ -0,0 +1,6 @@ +--- +name: "tsed" +description: "Ts.ED documentation index — a compact overview of Ts.ED's docs. Consider consulting it, e.g. when using uncommon Ts.ED Framework" +--- + +See https://tsed.dev/llms.txt diff --git a/packages/cli-plugin-eslint/test/init.integration.spec.ts b/packages/cli-plugin-eslint/test/init.integration.spec.ts index e682db688..134bbcca8 100644 --- a/packages/cli-plugin-eslint/test/init.integration.spec.ts +++ b/packages/cli-plugin-eslint/test/init.integration.spec.ts @@ -32,6 +32,16 @@ describe("Eslint: Init cmd", () => { expect(FakeCliFs.getKeys()).toMatchInlineSnapshot(` [ "project-name", + "project-name/.agents/skills/docker", + "project-name/.agents/skills/docker/SKILL.md", + "project-name/.agents/skills/express", + "project-name/.agents/skills/express/SKILL.md", + "project-name/.agents/skills/node", + "project-name/.agents/skills/node/SKILL.md", + "project-name/.agents/skills/prettier", + "project-name/.agents/skills/prettier/SKILL.md", + "project-name/.agents/skills/tsed", + "project-name/.agents/skills/tsed/SKILL.md", "project-name/.barrels.json", "project-name/.dockerignore", "project-name/.gitignore", @@ -163,6 +173,18 @@ describe("Eslint: Init cmd", () => { expect(FakeCliFs.getKeys()).toMatchInlineSnapshot(` [ "project-name", + "project-name/.agents/skills/docker", + "project-name/.agents/skills/docker/SKILL.md", + "project-name/.agents/skills/express", + "project-name/.agents/skills/express/SKILL.md", + "project-name/.agents/skills/node", + "project-name/.agents/skills/node/SKILL.md", + "project-name/.agents/skills/prettier", + "project-name/.agents/skills/prettier/SKILL.md", + "project-name/.agents/skills/tsed", + "project-name/.agents/skills/tsed/SKILL.md", + "project-name/.agents/skills/vitest", + "project-name/.agents/skills/vitest/SKILL.md", "project-name/.barrels.json", "project-name/.dockerignore", "project-name/.gitignore", diff --git a/packages/cli-plugin-jest/test/generate.controller.integration.spec.ts b/packages/cli-plugin-jest/test/generate.controller.integration.spec.ts index 4c5fc17f2..1a7be127a 100644 --- a/packages/cli-plugin-jest/test/generate.controller.integration.spec.ts +++ b/packages/cli-plugin-jest/test/generate.controller.integration.spec.ts @@ -109,6 +109,14 @@ describe("Generate Controller", () => { expect(FakeCliFs.getKeys()).toMatchInlineSnapshot(` [ "project-name", + "project-name/.agents/skills/docker", + "project-name/.agents/skills/docker/SKILL.md", + "project-name/.agents/skills/express", + "project-name/.agents/skills/express/SKILL.md", + "project-name/.agents/skills/node", + "project-name/.agents/skills/node/SKILL.md", + "project-name/.agents/skills/tsed", + "project-name/.agents/skills/tsed/SKILL.md", "project-name/.barrels.json", "project-name/.dockerignore", "project-name/.gitignore", @@ -160,6 +168,14 @@ describe("Generate Controller", () => { expect(FakeCliFs.getKeys()).toMatchInlineSnapshot(` [ "project-name", + "project-name/.agents/skills/docker", + "project-name/.agents/skills/docker/SKILL.md", + "project-name/.agents/skills/express", + "project-name/.agents/skills/express/SKILL.md", + "project-name/.agents/skills/node", + "project-name/.agents/skills/node/SKILL.md", + "project-name/.agents/skills/tsed", + "project-name/.agents/skills/tsed/SKILL.md", "project-name/.barrels.json", "project-name/.dockerignore", "project-name/.gitignore", diff --git a/packages/cli-plugin-mongoose/test/generate.model.integration.spec.ts b/packages/cli-plugin-mongoose/test/generate.model.integration.spec.ts index 5011b8882..c970c7941 100644 --- a/packages/cli-plugin-mongoose/test/generate.model.integration.spec.ts +++ b/packages/cli-plugin-mongoose/test/generate.model.integration.spec.ts @@ -24,6 +24,14 @@ describe("Generate Model", () => { expect(FakeCliFs.getKeys()).toMatchInlineSnapshot(` [ "project-name", + "project-name/.agents/skills/docker", + "project-name/.agents/skills/docker/SKILL.md", + "project-name/.agents/skills/express", + "project-name/.agents/skills/express/SKILL.md", + "project-name/.agents/skills/node", + "project-name/.agents/skills/node/SKILL.md", + "project-name/.agents/skills/tsed", + "project-name/.agents/skills/tsed/SKILL.md", "project-name/.barrels.json", "project-name/.dockerignore", "project-name/.gitignore", diff --git a/packages/cli-plugin-mongoose/test/generate.schema.integration.spec.ts b/packages/cli-plugin-mongoose/test/generate.schema.integration.spec.ts index 6277e467e..15d10c6d3 100644 --- a/packages/cli-plugin-mongoose/test/generate.schema.integration.spec.ts +++ b/packages/cli-plugin-mongoose/test/generate.schema.integration.spec.ts @@ -25,6 +25,14 @@ describe("Generate Schema", () => { expect(FakeCliFs.getKeys()).toMatchInlineSnapshot(` [ "project-name", + "project-name/.agents/skills/docker", + "project-name/.agents/skills/docker/SKILL.md", + "project-name/.agents/skills/express", + "project-name/.agents/skills/express/SKILL.md", + "project-name/.agents/skills/node", + "project-name/.agents/skills/node/SKILL.md", + "project-name/.agents/skills/tsed", + "project-name/.agents/skills/tsed/SKILL.md", "project-name/.barrels.json", "project-name/.dockerignore", "project-name/.gitignore", diff --git a/packages/cli-plugin-mongoose/test/init.integration.spec.ts b/packages/cli-plugin-mongoose/test/init.integration.spec.ts index d43c1f48f..dd816725b 100644 --- a/packages/cli-plugin-mongoose/test/init.integration.spec.ts +++ b/packages/cli-plugin-mongoose/test/init.integration.spec.ts @@ -20,6 +20,16 @@ describe("Init integration", () => { expect(FakeCliFs.getKeys()).toMatchInlineSnapshot(` [ "project-name", + "project-name/.agents/skills/docker", + "project-name/.agents/skills/docker/SKILL.md", + "project-name/.agents/skills/express", + "project-name/.agents/skills/express/SKILL.md", + "project-name/.agents/skills/mongoose", + "project-name/.agents/skills/mongoose/SKILL.md", + "project-name/.agents/skills/node", + "project-name/.agents/skills/node/SKILL.md", + "project-name/.agents/skills/tsed", + "project-name/.agents/skills/tsed/SKILL.md", "project-name/.barrels.json", "project-name/.dockerignore", "project-name/.gitignore", diff --git a/packages/cli-plugin-oidc-provider/test/init/__snapshots__/init.integration.spec.ts.snap b/packages/cli-plugin-oidc-provider/test/init/__snapshots__/init.integration.spec.ts.snap index c18608f48..7cab32931 100644 --- a/packages/cli-plugin-oidc-provider/test/init/__snapshots__/init.integration.spec.ts.snap +++ b/packages/cli-plugin-oidc-provider/test/init/__snapshots__/init.integration.spec.ts.snap @@ -53,6 +53,14 @@ export class Server { exports[`Init OIDC Provider project > should generate a project with oidc and swagger 1`] = ` [ "project-name", + "project-name/.agents/skills/docker", + "project-name/.agents/skills/docker/SKILL.md", + "project-name/.agents/skills/express", + "project-name/.agents/skills/express/SKILL.md", + "project-name/.agents/skills/node", + "project-name/.agents/skills/node/SKILL.md", + "project-name/.agents/skills/tsed", + "project-name/.agents/skills/tsed/SKILL.md", "project-name/.barrels.json", "project-name/.dockerignore", "project-name/.gitignore", diff --git a/packages/cli-plugin-oidc-provider/test/init/init.integration.spec.ts b/packages/cli-plugin-oidc-provider/test/init/init.integration.spec.ts index 2f60b0694..8c0c408a8 100644 --- a/packages/cli-plugin-oidc-provider/test/init/init.integration.spec.ts +++ b/packages/cli-plugin-oidc-provider/test/init/init.integration.spec.ts @@ -37,6 +37,14 @@ describe( expect(FakeCliFs.getKeys()).toMatchInlineSnapshot(` [ "project-name", + "project-name/.agents/skills/docker", + "project-name/.agents/skills/docker/SKILL.md", + "project-name/.agents/skills/express", + "project-name/.agents/skills/express/SKILL.md", + "project-name/.agents/skills/node", + "project-name/.agents/skills/node/SKILL.md", + "project-name/.agents/skills/tsed", + "project-name/.agents/skills/tsed/SKILL.md", "project-name/.barrels.json", "project-name/.dockerignore", "project-name/.gitignore", diff --git a/packages/cli-plugin-passport/test/generate.integration.spec.ts b/packages/cli-plugin-passport/test/generate.integration.spec.ts index 2888ba5f8..ae2422a1e 100644 --- a/packages/cli-plugin-passport/test/generate.integration.spec.ts +++ b/packages/cli-plugin-passport/test/generate.integration.spec.ts @@ -73,6 +73,14 @@ describe("Generate protocols", () => { expect(FakeCliFs.getKeys()).toMatchInlineSnapshot(` [ "project-name", + "project-name/.agents/skills/docker", + "project-name/.agents/skills/docker/SKILL.md", + "project-name/.agents/skills/express", + "project-name/.agents/skills/express/SKILL.md", + "project-name/.agents/skills/node", + "project-name/.agents/skills/node/SKILL.md", + "project-name/.agents/skills/tsed", + "project-name/.agents/skills/tsed/SKILL.md", "project-name/.barrels.json", "project-name/.dockerignore", "project-name/.gitignore", @@ -198,6 +206,14 @@ describe("Generate protocols", () => { expect(FakeCliFs.getKeys()).toMatchInlineSnapshot(` [ "project-name", + "project-name/.agents/skills/docker", + "project-name/.agents/skills/docker/SKILL.md", + "project-name/.agents/skills/express", + "project-name/.agents/skills/express/SKILL.md", + "project-name/.agents/skills/node", + "project-name/.agents/skills/node/SKILL.md", + "project-name/.agents/skills/tsed", + "project-name/.agents/skills/tsed/SKILL.md", "project-name/.barrels.json", "project-name/.dockerignore", "project-name/.gitignore", @@ -264,6 +280,14 @@ describe("Generate protocols", () => { expect(FakeCliFs.getKeys()).toMatchInlineSnapshot(` [ "project-name", + "project-name/.agents/skills/docker", + "project-name/.agents/skills/docker/SKILL.md", + "project-name/.agents/skills/express", + "project-name/.agents/skills/express/SKILL.md", + "project-name/.agents/skills/node", + "project-name/.agents/skills/node/SKILL.md", + "project-name/.agents/skills/tsed", + "project-name/.agents/skills/tsed/SKILL.md", "project-name/.barrels.json", "project-name/.dockerignore", "project-name/.gitignore", @@ -330,6 +354,14 @@ describe("Generate protocols", () => { expect(FakeCliFs.getKeys()).toMatchInlineSnapshot(` [ "project-name", + "project-name/.agents/skills/docker", + "project-name/.agents/skills/docker/SKILL.md", + "project-name/.agents/skills/express", + "project-name/.agents/skills/express/SKILL.md", + "project-name/.agents/skills/node", + "project-name/.agents/skills/node/SKILL.md", + "project-name/.agents/skills/tsed", + "project-name/.agents/skills/tsed/SKILL.md", "project-name/.barrels.json", "project-name/.dockerignore", "project-name/.gitignore", @@ -403,6 +435,14 @@ describe("Generate protocols", () => { expect(FakeCliFs.getKeys()).toMatchInlineSnapshot(` [ "project-name", + "project-name/.agents/skills/docker", + "project-name/.agents/skills/docker/SKILL.md", + "project-name/.agents/skills/express", + "project-name/.agents/skills/express/SKILL.md", + "project-name/.agents/skills/node", + "project-name/.agents/skills/node/SKILL.md", + "project-name/.agents/skills/tsed", + "project-name/.agents/skills/tsed/SKILL.md", "project-name/.barrels.json", "project-name/.dockerignore", "project-name/.gitignore", @@ -473,6 +513,14 @@ describe("Generate protocols", () => { expect(FakeCliFs.getKeys()).toMatchInlineSnapshot(` [ "project-name", + "project-name/.agents/skills/docker", + "project-name/.agents/skills/docker/SKILL.md", + "project-name/.agents/skills/express", + "project-name/.agents/skills/express/SKILL.md", + "project-name/.agents/skills/node", + "project-name/.agents/skills/node/SKILL.md", + "project-name/.agents/skills/tsed", + "project-name/.agents/skills/tsed/SKILL.md", "project-name/.barrels.json", "project-name/.dockerignore", "project-name/.gitignore", diff --git a/packages/cli-plugin-passport/test/init.integration.spec.ts b/packages/cli-plugin-passport/test/init.integration.spec.ts index 4dcd6e521..747ead06e 100644 --- a/packages/cli-plugin-passport/test/init.integration.spec.ts +++ b/packages/cli-plugin-passport/test/init.integration.spec.ts @@ -22,6 +22,14 @@ describe("Init integration", () => { expect(FakeCliFs.getKeys()).toMatchInlineSnapshot(` [ "project-name", + "project-name/.agents/skills/docker", + "project-name/.agents/skills/docker/SKILL.md", + "project-name/.agents/skills/express", + "project-name/.agents/skills/express/SKILL.md", + "project-name/.agents/skills/node", + "project-name/.agents/skills/node/SKILL.md", + "project-name/.agents/skills/tsed", + "project-name/.agents/skills/tsed/SKILL.md", "project-name/.barrels.json", "project-name/.dockerignore", "project-name/.gitignore", diff --git a/packages/cli-plugin-prisma/tests/init.integration.spec.ts b/packages/cli-plugin-prisma/tests/init.integration.spec.ts index 0f4804ade..626903d90 100644 --- a/packages/cli-plugin-prisma/tests/init.integration.spec.ts +++ b/packages/cli-plugin-prisma/tests/init.integration.spec.ts @@ -61,6 +61,18 @@ describe("Prisma: Init cmd", () => { expect(FakeCliFs.getKeys()).toMatchInlineSnapshot(` [ "project-name", + "project-name/.agents/skills/docker", + "project-name/.agents/skills/docker/SKILL.md", + "project-name/.agents/skills/express", + "project-name/.agents/skills/express/SKILL.md", + "project-name/.agents/skills/node", + "project-name/.agents/skills/node/SKILL.md", + "project-name/.agents/skills/prisma", + "project-name/.agents/skills/prisma/SKILL.md", + "project-name/.agents/skills/tsed", + "project-name/.agents/skills/tsed/SKILL.md", + "project-name/.agents/skills/typeorm", + "project-name/.agents/skills/typeorm/SKILL.md", "project-name/.barrels.json", "project-name/.dockerignore", "project-name/.gitignore", diff --git a/packages/cli-plugin-typegraphql/test/init/init.integration.spec.ts b/packages/cli-plugin-typegraphql/test/init/init.integration.spec.ts index e863be0e8..58ecbb3f9 100644 --- a/packages/cli-plugin-typegraphql/test/init/init.integration.spec.ts +++ b/packages/cli-plugin-typegraphql/test/init/init.integration.spec.ts @@ -34,6 +34,14 @@ describe("Init TypeGraphQL project", () => { expect(FakeCliFs.getKeys()).toMatchInlineSnapshot(` [ "project-name", + "project-name/.agents/skills/docker", + "project-name/.agents/skills/docker/SKILL.md", + "project-name/.agents/skills/express", + "project-name/.agents/skills/express/SKILL.md", + "project-name/.agents/skills/node", + "project-name/.agents/skills/node/SKILL.md", + "project-name/.agents/skills/tsed", + "project-name/.agents/skills/tsed/SKILL.md", "project-name/.barrels.json", "project-name/.dockerignore", "project-name/.gitignore", diff --git a/packages/cli-plugin-typeorm/test/integrations/generate/generate.controller.integration.spec.ts b/packages/cli-plugin-typeorm/test/integrations/generate/generate.controller.integration.spec.ts index 1e0f08984..a01150a76 100644 --- a/packages/cli-plugin-typeorm/test/integrations/generate/generate.controller.integration.spec.ts +++ b/packages/cli-plugin-typeorm/test/integrations/generate/generate.controller.integration.spec.ts @@ -25,6 +25,14 @@ describe("Generate DataSource", () => { expect(FakeCliFs.getKeys()).toMatchInlineSnapshot(` [ "project-name", + "project-name/.agents/skills/docker", + "project-name/.agents/skills/docker/SKILL.md", + "project-name/.agents/skills/express", + "project-name/.agents/skills/express/SKILL.md", + "project-name/.agents/skills/node", + "project-name/.agents/skills/node/SKILL.md", + "project-name/.agents/skills/tsed", + "project-name/.agents/skills/tsed/SKILL.md", "project-name/.barrels.json", "project-name/.dockerignore", "project-name/.gitignore", diff --git a/packages/cli-plugin-typeorm/test/integrations/init/init.integration.spec.ts b/packages/cli-plugin-typeorm/test/integrations/init/init.integration.spec.ts index b3f502728..88edc46f0 100644 --- a/packages/cli-plugin-typeorm/test/integrations/init/init.integration.spec.ts +++ b/packages/cli-plugin-typeorm/test/integrations/init/init.integration.spec.ts @@ -53,6 +53,16 @@ describe("TypeORM: Init cmd", () => { expect(FakeCliFs.getKeys()).toMatchInlineSnapshot(` [ "project-name", + "project-name/.agents/skills/docker", + "project-name/.agents/skills/docker/SKILL.md", + "project-name/.agents/skills/express", + "project-name/.agents/skills/express/SKILL.md", + "project-name/.agents/skills/node", + "project-name/.agents/skills/node/SKILL.md", + "project-name/.agents/skills/tsed", + "project-name/.agents/skills/tsed/SKILL.md", + "project-name/.agents/skills/typeorm", + "project-name/.agents/skills/typeorm/SKILL.md", "project-name/.barrels.json", "project-name/.dockerignore", "project-name/.gitignore", @@ -129,6 +139,16 @@ describe("TypeORM: Init cmd", () => { expect(FakeCliFs.getKeys()).toMatchInlineSnapshot(` [ "project-name", + "project-name/.agents/skills/docker", + "project-name/.agents/skills/docker/SKILL.md", + "project-name/.agents/skills/express", + "project-name/.agents/skills/express/SKILL.md", + "project-name/.agents/skills/node", + "project-name/.agents/skills/node/SKILL.md", + "project-name/.agents/skills/tsed", + "project-name/.agents/skills/tsed/SKILL.md", + "project-name/.agents/skills/typeorm", + "project-name/.agents/skills/typeorm/SKILL.md", "project-name/.barrels.json", "project-name/.dockerignore", "project-name/.gitignore", diff --git a/packages/cli-plugin-vitest/test/generate.controller.integration.spec.ts b/packages/cli-plugin-vitest/test/generate.controller.integration.spec.ts index bb1481abb..92c68aef1 100644 --- a/packages/cli-plugin-vitest/test/generate.controller.integration.spec.ts +++ b/packages/cli-plugin-vitest/test/generate.controller.integration.spec.ts @@ -28,6 +28,16 @@ describe("cli-plugin-vitest", () => { expect(FakeCliFs.getKeys()).toMatchInlineSnapshot(` [ "project-name", + "project-name/.agents/skills/docker", + "project-name/.agents/skills/docker/SKILL.md", + "project-name/.agents/skills/express", + "project-name/.agents/skills/express/SKILL.md", + "project-name/.agents/skills/node", + "project-name/.agents/skills/node/SKILL.md", + "project-name/.agents/skills/tsed", + "project-name/.agents/skills/tsed/SKILL.md", + "project-name/.agents/skills/vitest", + "project-name/.agents/skills/vitest/SKILL.md", "project-name/.barrels.json", "project-name/.dockerignore", "project-name/.gitignore", @@ -78,6 +88,14 @@ describe("cli-plugin-vitest", () => { expect(FakeCliFs.getKeys()).toMatchInlineSnapshot(` [ "project-name", + "project-name/.agents/skills/docker", + "project-name/.agents/skills/docker/SKILL.md", + "project-name/.agents/skills/express", + "project-name/.agents/skills/express/SKILL.md", + "project-name/.agents/skills/node", + "project-name/.agents/skills/node/SKILL.md", + "project-name/.agents/skills/tsed", + "project-name/.agents/skills/tsed/SKILL.md", "project-name/.barrels.json", "project-name/.dockerignore", "project-name/.gitignore", diff --git a/packages/cli/src/commands/init/InitCmd.ts b/packages/cli/src/commands/init/InitCmd.ts index 1dd08da52..eeb4c3df7 100644 --- a/packages/cli/src/commands/init/InitCmd.ts +++ b/packages/cli/src/commands/init/InitCmd.ts @@ -384,6 +384,20 @@ export class InitCmd implements CommandProvider { "barrels", "readme", "agents", + "tsed-skill", + "docker-skill", + "express-skill", + "fastify-skill", + "scalar-skill", + "prisma-skill", + "mongoose-skill", + "typeorm-skill", + "vitest-skill", + "oxlint-skill", + "prettier-skill", + "node-skill", + "vite-skill", + "bun-skill", `pm2.${pm2}`, "/views/home.ejs", ...runtime.files() diff --git a/packages/cli/src/commands/init/SkillsTemplate.spec.ts b/packages/cli/src/commands/init/SkillsTemplate.spec.ts new file mode 100644 index 000000000..5421d2a28 --- /dev/null +++ b/packages/cli/src/commands/init/SkillsTemplate.spec.ts @@ -0,0 +1,38 @@ +// @ts-ignore +import {CliPlatformTest} from "@tsed/cli-testing"; + +import {CliTemplatesService} from "../../services/CliTemplatesService.js"; + +describe("skills templates", () => { + beforeEach(async () => { + await import("../../templates/skills.template.js"); + return CliPlatformTest.create(); + }); + + afterEach(() => CliPlatformTest.reset()); + + it("renders a skill only when its feature is selected", async () => { + const templates = await CliPlatformTest.invoke(CliTemplatesService); + const prisma = templates.get("prisma-skill")!; + + expect(prisma.render("", {prisma: true} as any)).toContain("See https://www.prisma.io/llms.txt"); + expect(prisma.render("", {prisma: false} as any)).toBeUndefined(); + }); + + it("renders the framework skill for the selected platform only", async () => { + const templates = await CliPlatformTest.invoke(CliTemplatesService); + const fastify = templates.get("fastify-skill")!; + + expect(fastify.render("", {platform: "fastify"} as any)).toContain('name: "fastify"'); + expect(fastify.render("", {platform: "express"} as any)).toBeUndefined(); + }); + + it("uses the default llms.txt skill description", async () => { + const templates = await CliPlatformTest.invoke(CliTemplatesService); + const docker = templates.get("docker-skill")!; + + expect(docker.render("", {} as any)).toContain( + "Docker documentation index — a compact overview of Docker's docs. Consider consulting it, e.g. when using uncommon Docker APIs or when stuck on a Docker problem." + ); + }); +}); diff --git a/packages/cli/src/templates/index.ts b/packages/cli/src/templates/index.ts index 8651616c7..e28fa1a4f 100644 --- a/packages/cli/src/templates/index.ts +++ b/packages/cli/src/templates/index.ts @@ -32,3 +32,4 @@ import "./dockerfile.template.js"; import "./pm2.template.js"; import "./readme.template.js"; import "./new-template.template.js"; +import "./skills.template.js"; diff --git a/packages/cli/src/templates/skills.template.ts b/packages/cli/src/templates/skills.template.ts new file mode 100644 index 000000000..c55c90f13 --- /dev/null +++ b/packages/cli/src/templates/skills.template.ts @@ -0,0 +1,148 @@ +import {PlatformType} from "../interfaces/PlatformType.js"; +import type {RenderDataContext} from "../interfaces/RenderDataContext.js"; +import {defineTemplate} from "../utils/defineTemplate.js"; + +type SkillTemplateOptions = { + id: string; + name: string; + description: string; + llmsUrl: string; + when: (context: Partial) => boolean; +}; + +const defineSkillTemplate = ({id, name, description, llmsUrl, when}: SkillTemplateOptions) => + defineTemplate({ + id, + label: `${name} skill`, + description: `Add the ${description} documentation skill`, + fileName: "SKILL", + ext: "md", + outputDir: `.agents/skills/${name}`, + hidden: true, + preserveCase: true, + render(_, context) { + if (!when(context)) { + return; + } + + return `--- +name: "${name}" +description: "${description} documentation index — a compact overview of ${description}'s docs. Consider consulting it, e.g. when using uncommon ${description} APIs or when stuck on a ${description} problem." +--- + +See ${llmsUrl} +`; + } + }); + +defineSkillTemplate({ + id: "tsed-skill", + name: "tsed", + description: "Ts.ED", + llmsUrl: "https://tsed.dev/llms.txt", + when: () => true +}); + +defineSkillTemplate({ + id: "docker-skill", + name: "docker", + description: "Docker", + llmsUrl: "https://docs.docker.com/llms.txt", + when: () => true +}); + +defineSkillTemplate({ + id: "express-skill", + name: "express", + description: "Express.js", + llmsUrl: "https://expressjs.com/llms.txt", + when: ({platform}) => platform === PlatformType.EXPRESS +}); + +defineSkillTemplate({ + id: "fastify-skill", + name: "fastify", + description: "Fastify", + llmsUrl: "https://fastify.dev/llms.txt", + when: ({platform}) => platform === PlatformType.FASTIFY +}); + +defineSkillTemplate({ + id: "scalar-skill", + name: "scalar", + description: "Scalar", + llmsUrl: "https://scalar.com/llms.txt", + when: ({scalar}) => Boolean(scalar) +}); + +defineSkillTemplate({ + id: "prisma-skill", + name: "prisma", + description: "Prisma", + llmsUrl: "https://www.prisma.io/llms.txt", + when: ({prisma}) => Boolean(prisma) +}); + +defineSkillTemplate({ + id: "mongoose-skill", + name: "mongoose", + description: "Mongoose", + llmsUrl: "https://mongoosejs.com/llms.txt", + when: ({mongoose}) => Boolean(mongoose) +}); + +defineSkillTemplate({ + id: "typeorm-skill", + name: "typeorm", + description: "TypeORM", + llmsUrl: "https://typeorm.io/llms.txt", + when: ({typeorm}) => Boolean(typeorm) +}); + +defineSkillTemplate({ + id: "vitest-skill", + name: "vitest", + description: "Vitest", + llmsUrl: "https://vitest.dev/llms.txt", + when: ({vitest}) => Boolean(vitest) +}); + +defineSkillTemplate({ + id: "oxlint-skill", + name: "oxlint", + description: "Oxlint", + llmsUrl: "https://oxc.rs/llms.txt", + when: ({oxlint}) => Boolean(oxlint) +}); + +defineSkillTemplate({ + id: "prettier-skill", + name: "prettier", + description: "Prettier", + llmsUrl: "https://prettier.io/llms.txt", + when: ({prettier}) => Boolean(prettier) +}); + +defineSkillTemplate({ + id: "node-skill", + name: "node", + description: "Node.js", + llmsUrl: "https://nodejs.org/llms.txt", + when: ({node}) => Boolean(node) +}); + +defineSkillTemplate({ + id: "vite-skill", + name: "vite", + description: "Vite", + llmsUrl: "https://vite.dev/llms.txt", + when: ({vite}) => Boolean(vite) +}); + +defineSkillTemplate({ + id: "bun-skill", + name: "bun", + description: "Bun", + llmsUrl: "https://bun.sh/llms.txt", + when: ({bun}) => Boolean(bun) +}); diff --git a/packages/cli/test/integrations/generate/generate.async-factory.integration.spec.ts b/packages/cli/test/integrations/generate/generate.async-factory.integration.spec.ts index 1c652aa84..71a3d0e3b 100644 --- a/packages/cli/test/integrations/generate/generate.async-factory.integration.spec.ts +++ b/packages/cli/test/integrations/generate/generate.async-factory.integration.spec.ts @@ -23,6 +23,14 @@ describe("Generate AsyncFactory", () => { expect(FakeCliFs.getKeys()).toMatchInlineSnapshot(` [ "project-name", + "project-name/.agents/skills/docker", + "project-name/.agents/skills/docker/SKILL.md", + "project-name/.agents/skills/express", + "project-name/.agents/skills/express/SKILL.md", + "project-name/.agents/skills/node", + "project-name/.agents/skills/node/SKILL.md", + "project-name/.agents/skills/tsed", + "project-name/.agents/skills/tsed/SKILL.md", "project-name/.barrels.json", "project-name/.dockerignore", "project-name/.gitignore", diff --git a/packages/cli/test/integrations/generate/generate.controller.integration.spec.ts b/packages/cli/test/integrations/generate/generate.controller.integration.spec.ts index 1610e7486..5cdcb89c9 100644 --- a/packages/cli/test/integrations/generate/generate.controller.integration.spec.ts +++ b/packages/cli/test/integrations/generate/generate.controller.integration.spec.ts @@ -24,6 +24,14 @@ describe("Generate Controller", () => { expect(FakeCliFs.getKeys()).toMatchInlineSnapshot(` [ "project-name", + "project-name/.agents/skills/docker", + "project-name/.agents/skills/docker/SKILL.md", + "project-name/.agents/skills/express", + "project-name/.agents/skills/express/SKILL.md", + "project-name/.agents/skills/node", + "project-name/.agents/skills/node/SKILL.md", + "project-name/.agents/skills/tsed", + "project-name/.agents/skills/tsed/SKILL.md", "project-name/.barrels.json", "project-name/.dockerignore", "project-name/.gitignore", @@ -80,6 +88,14 @@ describe("Generate Controller", () => { expect(FakeCliFs.getKeys()).toMatchInlineSnapshot(` [ "project-name", + "project-name/.agents/skills/docker", + "project-name/.agents/skills/docker/SKILL.md", + "project-name/.agents/skills/express", + "project-name/.agents/skills/express/SKILL.md", + "project-name/.agents/skills/node", + "project-name/.agents/skills/node/SKILL.md", + "project-name/.agents/skills/tsed", + "project-name/.agents/skills/tsed/SKILL.md", "project-name/.barrels.json", "project-name/.dockerignore", "project-name/.gitignore", diff --git a/packages/cli/test/integrations/generate/generate.decorator-class.integration.spec.ts b/packages/cli/test/integrations/generate/generate.decorator-class.integration.spec.ts index 9de90b9e4..2f2c06b57 100644 --- a/packages/cli/test/integrations/generate/generate.decorator-class.integration.spec.ts +++ b/packages/cli/test/integrations/generate/generate.decorator-class.integration.spec.ts @@ -24,6 +24,14 @@ describe("Generate class decorator", () => { expect(FakeCliFs.getKeys()).toMatchInlineSnapshot(` [ "project-name", + "project-name/.agents/skills/docker", + "project-name/.agents/skills/docker/SKILL.md", + "project-name/.agents/skills/express", + "project-name/.agents/skills/express/SKILL.md", + "project-name/.agents/skills/node", + "project-name/.agents/skills/node/SKILL.md", + "project-name/.agents/skills/tsed", + "project-name/.agents/skills/tsed/SKILL.md", "project-name/.barrels.json", "project-name/.dockerignore", "project-name/.gitignore", diff --git a/packages/cli/test/integrations/generate/generate.decorator-endpoint.integration.spec.ts b/packages/cli/test/integrations/generate/generate.decorator-endpoint.integration.spec.ts index 8a85ef692..9afeb50be 100644 --- a/packages/cli/test/integrations/generate/generate.decorator-endpoint.integration.spec.ts +++ b/packages/cli/test/integrations/generate/generate.decorator-endpoint.integration.spec.ts @@ -25,6 +25,14 @@ describe("Generate endpoint decorator", () => { expect(FakeCliFs.getKeys()).toMatchInlineSnapshot(` [ "project-name", + "project-name/.agents/skills/docker", + "project-name/.agents/skills/docker/SKILL.md", + "project-name/.agents/skills/express", + "project-name/.agents/skills/express/SKILL.md", + "project-name/.agents/skills/node", + "project-name/.agents/skills/node/SKILL.md", + "project-name/.agents/skills/tsed", + "project-name/.agents/skills/tsed/SKILL.md", "project-name/.barrels.json", "project-name/.dockerignore", "project-name/.gitignore", diff --git a/packages/cli/test/integrations/generate/generate.decorator-generic.integration.spec.ts b/packages/cli/test/integrations/generate/generate.decorator-generic.integration.spec.ts index d3da1cafa..d80bdab8a 100644 --- a/packages/cli/test/integrations/generate/generate.decorator-generic.integration.spec.ts +++ b/packages/cli/test/integrations/generate/generate.decorator-generic.integration.spec.ts @@ -25,6 +25,14 @@ describe("Generate generic decorator", () => { expect(FakeCliFs.getKeys()).toMatchInlineSnapshot(` [ "project-name", + "project-name/.agents/skills/docker", + "project-name/.agents/skills/docker/SKILL.md", + "project-name/.agents/skills/express", + "project-name/.agents/skills/express/SKILL.md", + "project-name/.agents/skills/node", + "project-name/.agents/skills/node/SKILL.md", + "project-name/.agents/skills/tsed", + "project-name/.agents/skills/tsed/SKILL.md", "project-name/.barrels.json", "project-name/.dockerignore", "project-name/.gitignore", diff --git a/packages/cli/test/integrations/generate/generate.decorator-method.integration.spec.ts b/packages/cli/test/integrations/generate/generate.decorator-method.integration.spec.ts index 0db24a646..aefa59e59 100644 --- a/packages/cli/test/integrations/generate/generate.decorator-method.integration.spec.ts +++ b/packages/cli/test/integrations/generate/generate.decorator-method.integration.spec.ts @@ -26,6 +26,14 @@ describe("Generate method decorator", () => { expect(FakeCliFs.getKeys()).toMatchInlineSnapshot(` [ "project-name", + "project-name/.agents/skills/docker", + "project-name/.agents/skills/docker/SKILL.md", + "project-name/.agents/skills/express", + "project-name/.agents/skills/express/SKILL.md", + "project-name/.agents/skills/node", + "project-name/.agents/skills/node/SKILL.md", + "project-name/.agents/skills/tsed", + "project-name/.agents/skills/tsed/SKILL.md", "project-name/.barrels.json", "project-name/.dockerignore", "project-name/.gitignore", diff --git a/packages/cli/test/integrations/generate/generate.decorator-middleware.integration.spec.ts b/packages/cli/test/integrations/generate/generate.decorator-middleware.integration.spec.ts index b497396f0..de5f3fd6e 100644 --- a/packages/cli/test/integrations/generate/generate.decorator-middleware.integration.spec.ts +++ b/packages/cli/test/integrations/generate/generate.decorator-middleware.integration.spec.ts @@ -26,6 +26,14 @@ describe("Generate middleware decorator", () => { expect(FakeCliFs.getKeys()).toMatchInlineSnapshot(` [ "project-name", + "project-name/.agents/skills/docker", + "project-name/.agents/skills/docker/SKILL.md", + "project-name/.agents/skills/express", + "project-name/.agents/skills/express/SKILL.md", + "project-name/.agents/skills/node", + "project-name/.agents/skills/node/SKILL.md", + "project-name/.agents/skills/tsed", + "project-name/.agents/skills/tsed/SKILL.md", "project-name/.barrels.json", "project-name/.dockerignore", "project-name/.gitignore", @@ -103,6 +111,14 @@ describe("Generate middleware decorator", () => { expect(FakeCliFs.getKeys()).toMatchInlineSnapshot(` [ "project-name", + "project-name/.agents/skills/docker", + "project-name/.agents/skills/docker/SKILL.md", + "project-name/.agents/skills/express", + "project-name/.agents/skills/express/SKILL.md", + "project-name/.agents/skills/node", + "project-name/.agents/skills/node/SKILL.md", + "project-name/.agents/skills/tsed", + "project-name/.agents/skills/tsed/SKILL.md", "project-name/.barrels.json", "project-name/.dockerignore", "project-name/.gitignore", diff --git a/packages/cli/test/integrations/generate/generate.exception-filter.integration.spec.ts b/packages/cli/test/integrations/generate/generate.exception-filter.integration.spec.ts index 89beb86aa..99e01e302 100644 --- a/packages/cli/test/integrations/generate/generate.exception-filter.integration.spec.ts +++ b/packages/cli/test/integrations/generate/generate.exception-filter.integration.spec.ts @@ -24,6 +24,14 @@ describe("Generate Exception Filter", () => { expect(FakeCliFs.getKeys()).toMatchInlineSnapshot(` [ "project-name", + "project-name/.agents/skills/docker", + "project-name/.agents/skills/docker/SKILL.md", + "project-name/.agents/skills/express", + "project-name/.agents/skills/express/SKILL.md", + "project-name/.agents/skills/node", + "project-name/.agents/skills/node/SKILL.md", + "project-name/.agents/skills/tsed", + "project-name/.agents/skills/tsed/SKILL.md", "project-name/.barrels.json", "project-name/.dockerignore", "project-name/.gitignore", diff --git a/packages/cli/test/integrations/generate/generate.response-filter.integration.spec.ts b/packages/cli/test/integrations/generate/generate.response-filter.integration.spec.ts index 1182271b5..ce844d5ac 100644 --- a/packages/cli/test/integrations/generate/generate.response-filter.integration.spec.ts +++ b/packages/cli/test/integrations/generate/generate.response-filter.integration.spec.ts @@ -24,6 +24,14 @@ describe("Generate Response Filter", () => { expect(FakeCliFs.getKeys()).toMatchInlineSnapshot(` [ "project-name", + "project-name/.agents/skills/docker", + "project-name/.agents/skills/docker/SKILL.md", + "project-name/.agents/skills/express", + "project-name/.agents/skills/express/SKILL.md", + "project-name/.agents/skills/node", + "project-name/.agents/skills/node/SKILL.md", + "project-name/.agents/skills/tsed", + "project-name/.agents/skills/tsed/SKILL.md", "project-name/.barrels.json", "project-name/.dockerignore", "project-name/.gitignore", diff --git a/packages/cli/test/integrations/template/create.template.integration.spec.ts b/packages/cli/test/integrations/template/create.template.integration.spec.ts index 03f37a05b..953d24253 100644 --- a/packages/cli/test/integrations/template/create.template.integration.spec.ts +++ b/packages/cli/test/integrations/template/create.template.integration.spec.ts @@ -23,6 +23,14 @@ describe("Generate AsyncFactory", () => { expect(FakeCliFs.getKeys()).toMatchInlineSnapshot(` [ "project-name", + "project-name/.agents/skills/docker", + "project-name/.agents/skills/docker/SKILL.md", + "project-name/.agents/skills/express", + "project-name/.agents/skills/express/SKILL.md", + "project-name/.agents/skills/node", + "project-name/.agents/skills/node/SKILL.md", + "project-name/.agents/skills/tsed", + "project-name/.agents/skills/tsed/SKILL.md", "project-name/.barrels.json", "project-name/.dockerignore", "project-name/.gitignore", @@ -81,6 +89,14 @@ describe("Generate AsyncFactory", () => { expect(FakeCliFs.getKeys()).toMatchInlineSnapshot(` [ "project-name", + "project-name/.agents/skills/docker", + "project-name/.agents/skills/docker/SKILL.md", + "project-name/.agents/skills/express", + "project-name/.agents/skills/express/SKILL.md", + "project-name/.agents/skills/node", + "project-name/.agents/skills/node/SKILL.md", + "project-name/.agents/skills/tsed", + "project-name/.agents/skills/tsed/SKILL.md", "project-name/.barrels.json", "project-name/.dockerignore", "project-name/.gitignore", @@ -176,6 +192,14 @@ describe("Generate AsyncFactory", () => { expect(FakeCliFs.getKeys()).toMatchInlineSnapshot(` [ "project-name", + "project-name/.agents/skills/docker", + "project-name/.agents/skills/docker/SKILL.md", + "project-name/.agents/skills/express", + "project-name/.agents/skills/express/SKILL.md", + "project-name/.agents/skills/node", + "project-name/.agents/skills/node/SKILL.md", + "project-name/.agents/skills/tsed", + "project-name/.agents/skills/tsed/SKILL.md", "project-name/.barrels.json", "project-name/.dockerignore", "project-name/.gitignore", @@ -267,6 +291,14 @@ describe("Generate AsyncFactory", () => { expect(FakeCliFs.getKeys()).toMatchInlineSnapshot(` [ "project-name", + "project-name/.agents/skills/docker", + "project-name/.agents/skills/docker/SKILL.md", + "project-name/.agents/skills/express", + "project-name/.agents/skills/express/SKILL.md", + "project-name/.agents/skills/node", + "project-name/.agents/skills/node/SKILL.md", + "project-name/.agents/skills/tsed", + "project-name/.agents/skills/tsed/SKILL.md", "project-name/.barrels.json", "project-name/.dockerignore", "project-name/.gitignore", From 834cb1e19f0549ba159545594b5459f9b1e8a5b2 Mon Sep 17 00:00:00 2001 From: Romain Lenzotti Date: Fri, 4 Sep 2026 11:07:21 +0200 Subject: [PATCH 3/3] refactor(docs): replace custom LLM scripts with vitepress-plugin-llms --- docs/.templates/page/page.ejs | 9 +- docs/.vitepress/config.mts | 42 +- docs/.vitepress/plugins/apiLllmLinks.ts | 13 + docs/.vitepress/plugins/buildLlmContents.ts | 74 ++ .../utils/copy-files.ts} | 19 +- .../markdown.js => plugins/utils/markdown.ts} | 78 +- docs/.vitepress/plugins/utils/sidebar.ts | 77 ++ docs/.vitepress/scripts/build-llm-contents.js | 64 -- docs/.vitepress/scripts/llm/sidebar.js | 49 -- docs/api.md | 15 +- docs/package.json | 10 +- docs/yarn.lock | 716 +++++++++++++++++- 12 files changed, 1004 insertions(+), 162 deletions(-) create mode 100644 docs/.vitepress/plugins/apiLllmLinks.ts create mode 100644 docs/.vitepress/plugins/buildLlmContents.ts rename docs/.vitepress/{scripts/llm/copy-files.js => plugins/utils/copy-files.ts} (82%) rename docs/.vitepress/{scripts/llm/markdown.js => plugins/utils/markdown.ts} (68%) create mode 100644 docs/.vitepress/plugins/utils/sidebar.ts delete mode 100644 docs/.vitepress/scripts/build-llm-contents.js delete mode 100644 docs/.vitepress/scripts/llm/sidebar.js diff --git a/docs/.templates/page/page.ejs b/docs/.templates/page/page.ejs index 0455e7946..e9afce4fd 100644 --- a/docs/.templates/page/page.ejs +++ b/docs/.templates/page/page.ejs @@ -1,16 +1,11 @@ --- -symbol: <%- symbol.symbolName %> -module: "<%- symbol.module.moduleName %>" -type: <%- symbol.symbolType %> +title: <%- symbol.symbolName %> from <%- symbol.module.moduleName %> +description: api documentation of <%- symbol.symbolName %> from <%- symbol.module.moduleName %> meta: - name: keywords description: api typescript node.js documentation <%- symbol.symbolName %> <%- symbol.symbolType %> --- - -
diff --git a/docs/.vitepress/config.mts b/docs/.vitepress/config.mts index 9be1e0cc3..a48baf385 100644 --- a/docs/.vitepress/config.mts +++ b/docs/.vitepress/config.mts @@ -1,9 +1,12 @@ // @ts-ignore import {apiAnchor} from "@tsed/vitepress-theme/markdown/api-anchor/api-anchor.js"; import {defineConfig} from "vitepress"; -import pkg from "../../package.json"; -import referenceSidebar from "../public/reference-sidebar.json"; -import team from "../team.json"; +import pkg from "../../package.json" with {type: "json"}; +import referenceSidebar from "../public/reference-sidebar.json" with {type: "json"}; +import team from "../team.json" with {type: "json"}; +import llmstxt from "vitepress-plugin-llms"; +import {apiLlmLinks} from "./plugins/apiLllmLinks.js"; +import {buildLlmContentsPlugin} from "./plugins/buildLlmContents.js"; const Introduction = [ { @@ -71,6 +74,39 @@ const Releases = [ // https://vitepress.dev/reference/site-config export default defineConfig({ title: "Ts.ED CLI a modern Node.js/Bun.js framework built with TypeScript to create interactive CLI applications", + vite: { + plugins: [ + buildLlmContentsPlugin({ + sections: [ + { + source: "guide", + destination: "public/ai/guides", + label: "Guides" + }, + { + source: "introduction", + destination: "public/ai/introduction", + label: "Introduction" + }, + { + source: "api", + destination: "public/ai/api", + label: "API references" + } + ], + sidebar: { + coreModulePattern: /cli-core|@tsed\/cli|cli-tasks|cli-prompts|cli-testing/, + coreModules: ["cli-core"] + } + }), + apiLlmLinks, + llmstxt({ + ignoreFilesPerOutput: { + llmsTxt: ["api/**"] + } + }) + ] + }, lastUpdated: true, description: "Ts.ED offers a flexible and easy-to-learn structure designed to enhance the developer experience. It provides decorators, guidelines, and supports Node.js, Bun.js, Express.js, Koa.js, Fastify.js, CLI, and serverless architectures (e.g., AWS).", diff --git a/docs/.vitepress/plugins/apiLllmLinks.ts b/docs/.vitepress/plugins/apiLllmLinks.ts new file mode 100644 index 000000000..2af68742d --- /dev/null +++ b/docs/.vitepress/plugins/apiLllmLinks.ts @@ -0,0 +1,13 @@ +import {getApiReferenceLinks} from "./utils/sidebar.js"; + +export const apiLlmLinks = { + enforce: "pre" as const, + name: "tsed-api-llm-links", + transform(content: string, id: string) { + if (!id.endsWith("/api.md")) { + return null; + } + + return content.replace("", getApiReferenceLinks()); + } +}; diff --git a/docs/.vitepress/plugins/buildLlmContents.ts b/docs/.vitepress/plugins/buildLlmContents.ts new file mode 100644 index 000000000..c0b6b6a06 --- /dev/null +++ b/docs/.vitepress/plugins/buildLlmContents.ts @@ -0,0 +1,74 @@ +import {join} from "node:path"; + +import {intro, log, outro, spinner} from "@clack/prompts"; + +import {copyFiles} from "./utils/copy-files.js"; +import {buildReferenceSidebar, type ApiSidebarOptions} from "./utils/sidebar.js"; + +export interface LlmContentSection { + destination: string; + label: string; + source: string; +} + +export interface BuildLlmContentsOptions { + docsRoot?: string; + sections?: LlmContentSection[]; + sidebar?: ApiSidebarOptions; +} + +const DEFAULT_DOCS_ROOT = join(import.meta.dirname, "..", ".."); +/** + * Each entry describes a docs directory to copy into /public/ai. + * Markdown is normalized (remark), snippet directives are inlined, + * and @@Symbol@@ tokens are rewritten to /ai/api links. + */ +const DEFAULT_DOC_SECTIONS: LlmContentSection[] = []; +let buildTask: Promise | undefined; + +export async function buildLlmContents({ + docsRoot = DEFAULT_DOCS_ROOT, + sections = DEFAULT_DOC_SECTIONS, + sidebar +}: BuildLlmContentsOptions = {}) { + intro("Building LLM references"); + + try { + for (const section of sections) { + const completed = await copyFiles({ + cwd: docsRoot, + src: section.source, + dest: section.destination, + label: section.label + }); + + if (!completed) { + log.warn(`${section.label} copy skipped`); + } + } + + const sidebarStep = spinner(); + sidebarStep.start("Generating API sidebar"); + await buildReferenceSidebar(docsRoot, sidebar); + sidebarStep.stop("Sidebar generated"); + + outro("LLM references ready"); + } catch (error) { + log.error(error instanceof Error ? error.message : String(error)); + outro("LLM references build failed"); + throw error; + } +} + +// Orchestration only; implementation lives in ./llm/* + +export function buildLlmContentsPlugin(options: BuildLlmContentsOptions = {}) { + return { + enforce: "pre" as const, + name: "tsed-build-llm-contents", + async configResolved() { + buildTask ??= buildLlmContents(options); + await buildTask; + } + }; +} diff --git a/docs/.vitepress/scripts/llm/copy-files.js b/docs/.vitepress/plugins/utils/copy-files.ts similarity index 82% rename from docs/.vitepress/scripts/llm/copy-files.js rename to docs/.vitepress/plugins/utils/copy-files.ts index 96d2d7147..c94ef56ae 100644 --- a/docs/.vitepress/scripts/llm/copy-files.js +++ b/docs/.vitepress/plugins/utils/copy-files.ts @@ -8,7 +8,22 @@ import {transformMarkdown} from "./markdown.js"; const {copy, ensureDir, pathExists, readFile, remove, writeFile} = fsExtra; -export async function copyFiles({cwd, src, dest, label}) { +export interface CopyFilesOptions { + cwd: string; + dest: string; + label: string; + src: string; +} + +interface CopyFileOptions { + cwd: string; + destinationRoot: string; + progressLogger: Pick, "advance" | "stop">; + relativePath: string; + sourceRoot: string; +} + +export async function copyFiles({cwd, src, dest, label}: CopyFilesOptions) { const sourceDir = join(cwd, src); const destinationDir = join(cwd, dest); @@ -50,7 +65,7 @@ export async function copyFiles({cwd, src, dest, label}) { return true; } -async function copyFile({cwd, sourceRoot, destinationRoot, relativePath, progressLogger}) { +async function copyFile({cwd, sourceRoot, destinationRoot, relativePath, progressLogger}: CopyFileOptions) { const sourcePath = join(sourceRoot, relativePath); const destinationPath = join(destinationRoot, relativePath); diff --git a/docs/.vitepress/scripts/llm/markdown.js b/docs/.vitepress/plugins/utils/markdown.ts similarity index 68% rename from docs/.vitepress/scripts/llm/markdown.js rename to docs/.vitepress/plugins/utils/markdown.ts index c43e0aff8..26c151887 100644 --- a/docs/.vitepress/scripts/llm/markdown.js +++ b/docs/.vitepress/plugins/utils/markdown.ts @@ -9,9 +9,40 @@ const {readFile} = fsExtra; const markdownProcessor = unified().use(remarkParse).use(remarkStringify, {fences: true, bullet: "-"}).use(remarkCleanApiMarkdown); const INLINE_SNIPPET_RE = /^<<<\s+@\/([^\s]+?)(?:\s+\[(.+?)\])?\s*$/gm; const SYMBOL_TOKEN_RE = /@@([A-Za-z0-9_.-]+)@@/g; -const symbolIndexCache = new Map(); -export async function transformMarkdown(content, options = {}) { +interface ApiData { + modules?: Record; +} + +interface ApiModule { + symbols?: ApiSymbol[]; +} + +interface ApiSymbol { + path?: string; + symbolName: string; +} + +interface ExampleBlock { + end: number; + label: string; + original: string; + relativePath: string; + start: number; +} + +interface HeadingInfo { + module: string; + title: string; +} + +const symbolIndexCache = new Map>(); + +export interface TransformMarkdownOptions { + docsRoot?: string; +} + +export async function transformMarkdown(content: string, options: TransformMarkdownOptions = {}) { const {docsRoot} = options; let nextContent = content; @@ -26,8 +57,8 @@ export async function transformMarkdown(content, options = {}) { return frontmatter ? `${frontmatter}\n${cleanedBody}` : cleanedBody; } -async function inlineExampleBlocks(content, docsRoot) { - const matches = []; +async function inlineExampleBlocks(content: string, docsRoot: string) { + const matches: ExampleBlock[] = []; let match; while ((match = INLINE_SNIPPET_RE.exec(content)) !== null) { @@ -57,9 +88,9 @@ async function inlineExampleBlocks(content, docsRoot) { return result; } -async function replaceSymbolLinks(content, docsRoot) { +async function replaceSymbolLinks(content: string, docsRoot: string) { const index = await loadSymbolIndex(docsRoot); - return content.replace(SYMBOL_TOKEN_RE, (match, symbolName) => { + return content.replace(SYMBOL_TOKEN_RE, (match: string, symbolName: string) => { const entry = index.get(symbolName); if (!entry) { @@ -71,17 +102,18 @@ async function replaceSymbolLinks(content, docsRoot) { }); } -async function loadSymbolIndex(docsRoot) { - if (symbolIndexCache.has(docsRoot)) { - return symbolIndexCache.get(docsRoot); +async function loadSymbolIndex(docsRoot: string) { + const cachedIndex = symbolIndexCache.get(docsRoot); + if (cachedIndex) { + return cachedIndex; } const apiPath = join(docsRoot, "public/api.json"); - const data = JSON.parse(await readFile(apiPath, "utf8")); - const map = new Map(); + const data = JSON.parse(await readFile(apiPath, "utf8")) as ApiData; + const map = new Map(); - Object.values(data.modules ?? {}).forEach((module) => { - module.symbols?.forEach((symbol) => { + Object.values(data.modules ?? {}).forEach((module: ApiModule) => { + module.symbols?.forEach((symbol: ApiSymbol) => { if (symbol.symbolName && symbol.path) { map.set(symbol.symbolName, symbol); } @@ -92,7 +124,7 @@ async function loadSymbolIndex(docsRoot) { return map; } -async function loadSnippetBlock(entry, docsRoot) { +async function loadSnippetBlock(entry: ExampleBlock, docsRoot: string) { const absolutePath = join(docsRoot, entry.relativePath); try { @@ -101,20 +133,22 @@ async function loadSnippetBlock(entry, docsRoot) { const labelSuffix = entry.label ? ` [${entry.label}]` : ""; return `\`\`\`${language}${labelSuffix}\n${code.trimEnd()}\n\`\`\``; } catch (error) { - console.warn(`[build-llm-contents] Unable to inline snippet ${absolutePath}: ${error.message}`); + console.warn( + `[build-llm-contents] Unable to inline snippet ${absolutePath}: ${error instanceof Error ? error.message : String(error)}` + ); return entry.original; } } -function getLanguageFromExtension(extension) { +function getLanguageFromExtension(extension: string) { return extension ? extension.replace(/^\./, "") : ""; } function remarkCleanApiMarkdown() { - return (tree) => { - let headingInfo; + return (tree: any) => { + let headingInfo: HeadingInfo | undefined; - tree.children = tree.children.filter((node) => { + tree.children = tree.children.filter((node: any) => { if (node.type === "html") { const trimmed = node.value.trim(); @@ -143,14 +177,14 @@ function remarkCleanApiMarkdown() { ] }; - const insertIndex = tree.children.findIndex((node) => node.type !== "yaml"); + const insertIndex = tree.children.findIndex((node: any) => node.type !== "yaml"); const targetIndex = insertIndex === -1 ? tree.children.length : insertIndex; tree.children.splice(targetIndex, 0, headingNode); } }; } -function extractFrontmatter(content) { +function extractFrontmatter(content: string) { if (!content.startsWith("---")) { return {frontmatter: "", body: content}; } @@ -167,7 +201,7 @@ function extractFrontmatter(content) { return {frontmatter, body}; } -function extractHeading(value) { +function extractHeading(value: string): HeadingInfo { const titleMatch = value.match(/

([\s\S]*?)<\/h1>/i); const moduleMatch = value.match(/
([\s\S]*?)<\/div>/i); diff --git a/docs/.vitepress/plugins/utils/sidebar.ts b/docs/.vitepress/plugins/utils/sidebar.ts new file mode 100644 index 000000000..77017f1bc --- /dev/null +++ b/docs/.vitepress/plugins/utils/sidebar.ts @@ -0,0 +1,77 @@ +import {join} from "node:path"; + +import {mapApiReferences} from "@tsed/vitepress-theme/composables/api/mappers/mapApiReferences.js"; +import type {ApiResponse, ApiSymbol} from "@tsed/vitepress-theme/composables/api/interfaces/Api.js"; +import fsExtra from "fs-extra"; + +import api from "../../../public/api.json" with {type: "json"}; + +const {writeFile} = fsExtra; +const apiReferences = mapApiReferences(api) as ApiResponse; + +export interface ApiSidebarOptions { + coreModulePattern?: RegExp; + coreModules?: string[]; +} + +interface SidebarItem { + collapsed?: boolean; + items?: SidebarItem[]; + link?: string; + text: string; +} + +export async function buildReferenceSidebar(docsRoot: string, options?: ApiSidebarOptions) { + const sidebarPath = join(docsRoot, "public/reference-sidebar.json"); + await writeFile(sidebarPath, JSON.stringify(getSidebar(options), null, 2)); +} + +export function getSidebar({coreModulePattern, coreModules = []}: ApiSidebarOptions = {}) { + const coreItems: SidebarItem[] = coreModules.map((text) => ({text})); + const plugins: SidebarItem[] = []; + + Object.entries(apiReferences.modules).forEach(([module, {symbols}]) => { + const item: SidebarItem = { + text: module, + collapsed: true, + items: symbols.map((symbol: ApiSymbol) => { + return { + text: symbol.symbolName, + link: symbol.path ?? "" + }; + }) + }; + + if (coreModulePattern?.test(module)) { + coreItems.push(item); + } else { + plugins.push(item); + } + }); + + return [ + { + text: "Core", + items: coreItems.sort((a, b) => a.text.localeCompare(b.text)) + }, + { + text: "Plugins", + items: plugins.sort((a, b) => a.text.localeCompare(b.text)) + } + ]; +} + +export function getApiReferenceLinks() { + return Object.entries(apiReferences.modules) + .sort(([moduleA], [moduleB]) => moduleA.localeCompare(moduleB)) + .map(([module, {symbols}]) => { + const links = symbols + .filter((symbol: ApiSymbol) => symbol.path) + .sort((symbolA: ApiSymbol, symbolB: ApiSymbol) => symbolA.symbolName.localeCompare(symbolB.symbolName)) + .map((symbol: ApiSymbol) => `- [${symbol.symbolName}](${symbol.path}.md)`) + .join("\n"); + + return `## ${module}\n\n${links}`; + }) + .join("\n\n"); +} diff --git a/docs/.vitepress/scripts/build-llm-contents.js b/docs/.vitepress/scripts/build-llm-contents.js deleted file mode 100644 index bb5f2a826..000000000 --- a/docs/.vitepress/scripts/build-llm-contents.js +++ /dev/null @@ -1,64 +0,0 @@ -import {join} from "node:path"; - -import {intro, log, outro, spinner} from "@clack/prompts"; - -import {copyFiles} from "./llm/copy-files.js"; -import {buildReferenceSidebar} from "./llm/sidebar.js"; - -const DOCS_ROOT = join(import.meta.dirname, "..", ".."); -/** - * Each entry describes a docs directory to copy into /public/ai. - * Markdown is normalized (remark), snippet directives are inlined, - * and @@Symbol@@ tokens are rewritten to /ai/api links. - */ -const DOC_SECTIONS = [ - { - source: "guide", - destination: "public/ai/guides", - label: "Guides" - }, - { - source: "introduction", - destination: "public/ai/introduction", - label: "Introduction" - }, - { - source: "api", - destination: "public/ai/api", - label: "API references" - } -]; - -await run(); - -async function run() { - intro("Building LLM references"); - - try { - for (const section of DOC_SECTIONS) { - const completed = await copyFiles({ - cwd: DOCS_ROOT, - src: section.source, - dest: section.destination, - label: section.label - }); - - if (!completed) { - log.warn(`${section.label} copy skipped`); - } - } - - const sidebarStep = spinner(); - sidebarStep.start("Generating API sidebar"); - await buildReferenceSidebar(DOCS_ROOT); - sidebarStep.stop("Sidebar generated"); - - outro("LLM references ready"); - } catch (error) { - log.error(error instanceof Error ? error.message : String(error)); - outro("LLM references build failed"); - process.exitCode = 1; - } -} - -// Orchestration only; implementation lives in ./llm/* diff --git a/docs/.vitepress/scripts/llm/sidebar.js b/docs/.vitepress/scripts/llm/sidebar.js deleted file mode 100644 index 6bf4cb0f0..000000000 --- a/docs/.vitepress/scripts/llm/sidebar.js +++ /dev/null @@ -1,49 +0,0 @@ -import {join} from "node:path"; - -import {mapApiReferences} from "@tsed/vitepress-theme/composables/api/mappers/mapApiReferences.js"; -import fsExtra from "fs-extra"; - -import api from "../../../public/api.json" with {type: "json"}; - -const IS_CORES = /cli-core|@tsed\/cli|cli-tasks|cli-prompts|cli-testing/; -const {writeFile} = fsExtra; - -export async function buildReferenceSidebar(docsRoot) { - const sidebarPath = join(docsRoot, "public/reference-sidebar.json"); - await writeFile(sidebarPath, JSON.stringify(getSidebar(), null, 2)); -} - -export function getSidebar() { - const coreModules = ["cli-core"]; - const plugins = []; - - Object.entries(mapApiReferences(api).modules).forEach(([module, {symbols}]) => { - const item = { - text: module, - collapsed: true, - items: symbols.map((symbol) => { - return { - text: symbol.symbolName, - link: symbol.path - }; - }) - }; - - if (IS_CORES.test(module)) { - coreModules.push(item); - } else { - plugins.push(item); - } - }); - - return [ - { - text: "Core", - items: coreModules.sort((a, b) => a.text.localeCompare(b.text)) - }, - { - text: "Plugins", - items: plugins.sort((a, b) => a.text.localeCompare(b.text)) - } - ]; -} diff --git a/docs/api.md b/docs/api.md index aad5a15c0..a5388b48d 100644 --- a/docs/api.md +++ b/docs/api.md @@ -1,10 +1,11 @@ --- layout: page sidebar: false +description: Api Reference of Ts.ED CLI head: - - meta - name: description - content: Api Reference of Ts.ED. Use decorator to build your model and map data. + content: Api Reference of Ts.ED CLI - - meta - name: keywords content: api reference model decorators ts.ed express typescript node.js javascript jsonschema json mapper serialization deserialization @@ -14,4 +15,16 @@ head: import {data} from './api.data'; + + + + + +# API reference + +Browse the API reference by package. Each link opens the corresponding API page. + + + + diff --git a/docs/package.json b/docs/package.json index f5a0e68a7..bf31f193b 100644 --- a/docs/package.json +++ b/docs/package.json @@ -3,15 +3,14 @@ "version": "8.17.0", "type": "module", "scripts": { - "docs:dev": "yarn docs:build:ai && vitepress dev .", - "docs:build": "yarn docs:build:ai && vitepress build .", + "docs:dev": "vitepress dev .", + "docs:build": "vitepress build .", "docs:preview": "vitepress preview .", - "docs:build:ai": "node ./.vitepress/scripts/build-llm-contents.js", "serve": "npx serve ./.vitepress/dist" }, "dependencies": { "@clack/prompts": "^1.0.0-alpha.10", - "@tsed/vitepress-theme": "1.7.2", + "@tsed/vitepress-theme": "^1.8.0", "@vueuse/core": "10.11.0", "axios": "1.12.0", "fs-extra": "^11.2.0", @@ -21,7 +20,8 @@ "remark-parse": "^9.0.0", "remark-stringify": "^9.0.1", "unified": "^9.2.2", - "vitepress": "1.6.4" + "vitepress": "1.6.4", + "vitepress-plugin-llms": "1.13.5" }, "devDependencies": { "autoprefixer": "^10.4.19", diff --git a/docs/yarn.lock b/docs/yarn.lock index 7f0db721e..fae9963e1 100644 --- a/docs/yarn.lock +++ b/docs/yarn.lock @@ -5,6 +5,16 @@ __metadata: version: 10 cacheKey: 10 +"@11ty/gray-matter@npm:^2.1.0": + version: 2.1.0 + resolution: "@11ty/gray-matter@npm:2.1.0" + dependencies: + js-yaml: "npm:^4.2.0" + section-matter: "npm:^1.0.0" + checksum: 10/ccda53b8d6594620ad07daf0d11dc0668e10aed997239e89ac43c0cab54885f1ee062066d507cda175c419a75ad873a4bd1014933b81041a557877af66c307c2 + languageName: node + linkType: hard + "@algolia/abtesting@npm:1.13.0": version: 1.13.0 resolution: "@algolia/abtesting@npm:1.13.0" @@ -808,7 +818,7 @@ __metadata: resolution: "@tsed/docs-new@workspace:." dependencies: "@clack/prompts": "npm:^1.0.0-alpha.10" - "@tsed/vitepress-theme": "npm:1.7.2" + "@tsed/vitepress-theme": "npm:^1.8.0" "@vueuse/core": "npm:10.11.0" autoprefixer: "npm:^10.4.19" axios: "npm:1.12.0" @@ -822,17 +832,27 @@ __metadata: tailwindcss: "npm:3.4.4" unified: "npm:^9.2.2" vitepress: "npm:1.6.4" + vitepress-plugin-llms: "npm:^1.13.5" languageName: unknown linkType: soft -"@tsed/vitepress-theme@npm:1.7.2": - version: 1.7.2 - resolution: "@tsed/vitepress-theme@npm:1.7.2" +"@tsed/vitepress-theme@npm:^1.8.0": + version: 1.8.0 + resolution: "@tsed/vitepress-theme@npm:1.8.0" dependencies: "@vueuse/core": "npm:10.11.0" axios: "npm:1.7.7" lucide-vue-next: "npm:0.577.0" - checksum: 10/65bfb8b508e065767b436f3883ebd97ceb4b68b737cb9628e26f4da2189fc7807a5be260daab67947f1c936393fdaa1ee700ae3054ae4bbc373159cf769b3ecd + checksum: 10/98461a83e116984a7b33223ac6421e1189e67701ea8355d115d6505b27994e8d0f630cdbd3adacf4d36002814c1d747be190d372246876ab09bfd4950c9bd861 + languageName: node + linkType: hard + +"@types/debug@npm:^4.0.0": + version: 4.1.13 + resolution: "@types/debug@npm:4.1.13" + dependencies: + "@types/ms": "npm:*" + checksum: 10/5091d4ebda85236e6f4a6ecea552860e521e11d1d388d3f6255b40726f5a4a7cf1baa0d09f60853838e4cac6c12a13b14114d5f422ccecaee4d1d07dab349900 languageName: node linkType: hard @@ -894,6 +914,13 @@ __metadata: languageName: node linkType: hard +"@types/ms@npm:*": + version: 2.1.0 + resolution: "@types/ms@npm:2.1.0" + checksum: 10/532d2ebb91937ccc4a89389715e5b47d4c66e708d15942fe6cc25add6dc37b2be058230a327dd50f43f89b8b6d5d52b74685a9e8f70516edfc9bdd6be910eff4 + languageName: node + linkType: hard + "@types/unist@npm:*, @types/unist@npm:^3.0.0": version: 3.0.3 resolution: "@types/unist@npm:3.0.3" @@ -1279,6 +1306,13 @@ __metadata: languageName: node linkType: hard +"argparse@npm:^2.0.1": + version: 2.0.1 + resolution: "argparse@npm:2.0.1" + checksum: 10/18640244e641a417ec75a9bd38b0b2b6b95af5199aa241b131d4b2fb206f334d7ecc600bd194861610a5579084978bfcbb02baa399dbe442d56d0ae5e60dbaef + languageName: node + linkType: hard + "asynckit@npm:^0.4.0": version: 0.4.0 resolution: "asynckit@npm:0.4.0" @@ -1333,6 +1367,13 @@ __metadata: languageName: node linkType: hard +"bail@npm:^2.0.0": + version: 2.0.2 + resolution: "bail@npm:2.0.2" + checksum: 10/aab4e8ccdc8d762bf3fdfce8e706601695620c0c2eda256dd85088dc0be3cfd7ff126f6e99c2bee1f24f5d418414aacf09d7f9702f16d6963df2fa488cda8824 + languageName: node + linkType: hard + "balanced-match@npm:^1.0.0": version: 1.0.2 resolution: "balanced-match@npm:1.0.2" @@ -1340,6 +1381,13 @@ __metadata: languageName: node linkType: hard +"balanced-match@npm:^4.0.2": + version: 4.0.4 + resolution: "balanced-match@npm:4.0.4" + checksum: 10/fb07bb66a0959c2843fc055838047e2a95ccebb837c519614afb067ebfdf2fa967ca8d712c35ced07f2cd26fc6f07964230b094891315ad74f11eba3d53178a0 + languageName: node + linkType: hard + "binary-extensions@npm:^2.0.0": version: 2.3.0 resolution: "binary-extensions@npm:2.3.0" @@ -1363,6 +1411,15 @@ __metadata: languageName: node linkType: hard +"brace-expansion@npm:^5.0.8": + version: 5.0.9 + resolution: "brace-expansion@npm:5.0.9" + dependencies: + balanced-match: "npm:^4.0.2" + checksum: 10/d8683d612919212c7cf298861acd1c15101e7e2ad186e7ae9747390e5b3fc9e9b55ce71107570d32985784d9d88fbbe438d725863aed7b0f3d08d5f080535eec + languageName: node + linkType: hard + "braces@npm:^3.0.3, braces@npm:~3.0.2": version: 3.0.3 resolution: "braces@npm:3.0.3" @@ -1465,6 +1522,13 @@ __metadata: languageName: node linkType: hard +"character-entities@npm:^2.0.0": + version: 2.0.2 + resolution: "character-entities@npm:2.0.2" + checksum: 10/c8dd1f4bf1a92fccf7d2fad9673660a88b37854557d30f6076c32fedfb92d1420208298829ff1d3b6b4fa1c7012e8326c45e7f5c3ed1e9a09ec177593c521b2f + languageName: node + linkType: hard + "character-reference-invalid@npm:^1.0.0": version: 1.1.4 resolution: "character-reference-invalid@npm:1.1.4" @@ -1505,6 +1569,17 @@ __metadata: languageName: node linkType: hard +"cliui@npm:^8.0.1": + version: 8.0.1 + resolution: "cliui@npm:8.0.1" + dependencies: + string-width: "npm:^4.2.0" + strip-ansi: "npm:^6.0.1" + wrap-ansi: "npm:^7.0.0" + checksum: 10/eaa5561aeb3135c2cddf7a3b3f562fc4238ff3b3fc666869ef2adf264be0f372136702f16add9299087fb1907c2e4ec5dbfe83bd24bce815c70a80c6c1a2e950 + languageName: node + linkType: hard + "color-convert@npm:^2.0.1": version: 2.0.1 resolution: "color-convert@npm:2.0.1" @@ -1604,6 +1679,15 @@ __metadata: languageName: node linkType: hard +"decode-named-character-reference@npm:^1.0.0": + version: 1.3.0 + resolution: "decode-named-character-reference@npm:1.3.0" + dependencies: + character-entities: "npm:^2.0.0" + checksum: 10/82eb1208abf59d1f1e368285b6880201a3c3f147a4d7ce74e44cd41374ef00c9a376e8595e38002031db63291f91f7f3ff56b9724f715befff8f5566593d6de0 + languageName: node + linkType: hard + "delayed-stream@npm:~1.0.0": version: 1.0.0 resolution: "delayed-stream@npm:1.0.0" @@ -1696,6 +1780,13 @@ __metadata: languageName: node linkType: hard +"entities@npm:^4.5.0": + version: 4.5.0 + resolution: "entities@npm:4.5.0" + checksum: 10/ede2a35c9bce1aeccd055a1b445d41c75a14a2bb1cd22e242f20cf04d236cdcd7f9c859eb83f76885327bfae0c25bf03303665ee1ce3d47c5927b98b0e3e3d48 + languageName: node + linkType: hard + "entities@npm:^7.0.1": version: 7.0.1 resolution: "entities@npm:7.0.1" @@ -1832,13 +1923,20 @@ __metadata: languageName: node linkType: hard -"escalade@npm:^3.2.0": +"escalade@npm:^3.1.1, escalade@npm:^3.2.0": version: 3.2.0 resolution: "escalade@npm:3.2.0" checksum: 10/9d7169e3965b2f9ae46971afa392f6e5a25545ea30f2e2dd99c9b0a95a3f52b5653681a84f5b2911a413ddad2d7a93d3514165072f349b5ffc59c75a899970d6 languageName: node linkType: hard +"escape-string-regexp@npm:^5.0.0": + version: 5.0.0 + resolution: "escape-string-regexp@npm:5.0.0" + checksum: 10/20daabe197f3cb198ec28546deebcf24b3dbb1a5a269184381b3116d12f0532e06007f4bc8da25669d6a7f8efb68db0758df4cd981f57bc5b57f521a3e12c59e + languageName: node + linkType: hard + "estree-walker@npm:^2.0.2": version: 2.0.2 resolution: "estree-walker@npm:2.0.2" @@ -1853,6 +1951,15 @@ __metadata: languageName: node linkType: hard +"extend-shallow@npm:^2.0.1": + version: 2.0.1 + resolution: "extend-shallow@npm:2.0.1" + dependencies: + is-extendable: "npm:^0.1.0" + checksum: 10/8fb58d9d7a511f4baf78d383e637bd7d2e80843bd9cd0853649108ea835208fb614da502a553acc30208e1325240bb7cc4a68473021612496bb89725483656d8 + languageName: node + linkType: hard + "extend@npm:^3.0.0": version: 3.0.2 resolution: "extend@npm:3.0.2" @@ -1895,6 +2002,15 @@ __metadata: languageName: node linkType: hard +"fault@npm:^2.0.0": + version: 2.0.1 + resolution: "fault@npm:2.0.1" + dependencies: + format: "npm:^0.2.0" + checksum: 10/c9b30f47d95769177130a9409976a899ed31eb598450fbad5b0d39f2f5f56d5f4a9ff9257e0bee8407cb0fc3ce37165657888c6aa6d78472e403893104329b72 + languageName: node + linkType: hard + "fill-range@npm:^7.1.1": version: 7.1.1 resolution: "fill-range@npm:7.1.1" @@ -1959,6 +2075,13 @@ __metadata: languageName: node linkType: hard +"format@npm:^0.2.0": + version: 0.2.2 + resolution: "format@npm:0.2.2" + checksum: 10/5f878b8fc1a672c8cbefa4f293bdd977c822862577d70d53456a48b4169ec9b51677c0c995bf62c633b4e5cd673624b7c273f57923b28735a6c0c0a72c382a4a + languageName: node + linkType: hard + "fraction.js@npm:^4.3.7": version: 4.3.7 resolution: "fraction.js@npm:4.3.7" @@ -2021,6 +2144,13 @@ __metadata: languageName: node linkType: hard +"get-caller-file@npm:^2.0.5": + version: 2.0.5 + resolution: "get-caller-file@npm:2.0.5" + checksum: 10/b9769a836d2a98c3ee734a88ba712e62703f1df31b94b784762c433c27a386dd6029ff55c2a920c392e33657d80191edbf18c61487e198844844516f843496b9 + languageName: node + linkType: hard + "get-intrinsic@npm:^1.2.6": version: 1.3.0 resolution: "get-intrinsic@npm:1.3.0" @@ -2294,6 +2424,13 @@ __metadata: languageName: node linkType: hard +"is-extendable@npm:^0.1.0": + version: 0.1.1 + resolution: "is-extendable@npm:0.1.1" + checksum: 10/3875571d20a7563772ecc7a5f36cb03167e9be31ad259041b4a8f73f33f885441f778cee1f1fe0085eb4bc71679b9d8c923690003a36a6a5fdf8023e6e3f0672 + languageName: node + linkType: hard + "is-extglob@npm:^2.1.1": version: 2.1.1 resolution: "is-extglob@npm:2.1.1" @@ -2345,6 +2482,13 @@ __metadata: languageName: node linkType: hard +"is-plain-obj@npm:^4.0.0": + version: 4.1.0 + resolution: "is-plain-obj@npm:4.1.0" + checksum: 10/6dc45da70d04a81f35c9310971e78a6a3c7a63547ef782e3a07ee3674695081b6ca4e977fbb8efc48dae3375e0b34558d2bcd722aec9bddfa2d7db5b041be8ce + languageName: node + linkType: hard + "is-what@npm:^5.2.0": version: 5.5.0 resolution: "is-what@npm:5.5.0" @@ -2388,6 +2532,17 @@ __metadata: languageName: node linkType: hard +"js-yaml@npm:^4.2.0": + version: 4.3.1 + resolution: "js-yaml@npm:4.3.1" + dependencies: + argparse: "npm:^2.0.1" + bin: + js-yaml: bin/js-yaml.js + checksum: 10/2ce71b5d632abbd77da80447bf860e8a0264e54bffe94840984887d58b023761495b523727547904517a6107a1ef189854b361e0fc44995ee13a84f222d7bd42 + languageName: node + linkType: hard + "jsbn@npm:1.1.0": version: 1.1.0 resolution: "jsbn@npm:1.1.0" @@ -2408,6 +2563,13 @@ __metadata: languageName: node linkType: hard +"kind-of@npm:^6.0.0": + version: 6.0.3 + resolution: "kind-of@npm:6.0.3" + checksum: 10/5873d303fb36aad875b7538798867da2ae5c9e328d67194b0162a3659a627d22f742fc9c4ae95cd1704132a24b00cae5041fc00c0f6ef937dc17080dc4dbb962 + languageName: node + linkType: hard + "lilconfig@npm:^2.1.0": version: 2.1.0 resolution: "lilconfig@npm:2.1.0" @@ -2429,6 +2591,15 @@ __metadata: languageName: node linkType: hard +"linkify-it@npm:^5.0.2": + version: 5.0.2 + resolution: "linkify-it@npm:5.0.2" + dependencies: + uc.micro: "npm:^2.0.0" + checksum: 10/1d23387319c15f2c3d41cdada0fc2edac73afb6083e967ee051afc826f7d8d9f920e287fb7c32679b4516f60e6450853dee2b4339d7d2f313222e4b9e5be1476 + languageName: node + linkType: hard + "lodash@npm:4.17.21": version: 4.17.21 resolution: "lodash@npm:4.17.21" @@ -2443,6 +2614,13 @@ __metadata: languageName: node linkType: hard +"longest-streak@npm:^3.0.0": + version: 3.1.0 + resolution: "longest-streak@npm:3.1.0" + checksum: 10/d7f952ed004cbdb5c8bcfc4f7f5c3d65449e6c5a9e9be4505a656e3df5a57ee125f284286b4bf8ecea0c21a7b3bf2b8f9001ad506c319b9815ad6a63a47d0fd0 + languageName: node + linkType: hard + "lru-cache@npm:^10.0.1, lru-cache@npm:^10.2.0": version: 10.4.3 resolution: "lru-cache@npm:10.4.3" @@ -2504,6 +2682,29 @@ __metadata: languageName: node linkType: hard +"markdown-it@npm:^14.1.0": + version: 14.3.0 + resolution: "markdown-it@npm:14.3.0" + dependencies: + argparse: "npm:^2.0.1" + entities: "npm:^4.5.0" + linkify-it: "npm:^5.0.2" + mdurl: "npm:^2.0.0" + punycode.js: "npm:^2.3.1" + uc.micro: "npm:^2.1.0" + bin: + markdown-it: bin/markdown-it.mjs + checksum: 10/16afbae804e7ea10474389918e31036c438d00bacabb340e57769a84d8a3068f37814736483a645b6ad69e138aa491c3cac83d261b630bd6d2f6af6139c5d18b + languageName: node + linkType: hard + +"markdown-title@npm:^1.0.2": + version: 1.0.2 + resolution: "markdown-title@npm:1.0.2" + checksum: 10/7904848eef0e06a8a242b3d026ad3c29da84ba46197650895a5577461bd2d4e55f944c96c6e0bb71add3d438d1a6b2ce978237eb34cd2db41c49977aa5a39172 + languageName: node + linkType: hard + "math-intrinsics@npm:^1.1.0": version: 1.1.0 resolution: "math-intrinsics@npm:1.1.0" @@ -2524,6 +2725,50 @@ __metadata: languageName: node linkType: hard +"mdast-util-from-markdown@npm:^2.0.0, mdast-util-from-markdown@npm:^2.0.3": + version: 2.0.3 + resolution: "mdast-util-from-markdown@npm:2.0.3" + dependencies: + "@types/mdast": "npm:^4.0.0" + "@types/unist": "npm:^3.0.0" + decode-named-character-reference: "npm:^1.0.0" + devlop: "npm:^1.0.0" + mdast-util-to-string: "npm:^4.0.0" + micromark: "npm:^4.0.0" + micromark-util-decode-numeric-character-reference: "npm:^2.0.0" + micromark-util-decode-string: "npm:^2.0.0" + micromark-util-normalize-identifier: "npm:^2.0.0" + micromark-util-symbol: "npm:^2.0.0" + micromark-util-types: "npm:^2.0.0" + unist-util-stringify-position: "npm:^4.0.0" + checksum: 10/96f2bfb3b240c3d20a57db5d215faed795abf495c65ca2a4d61c0cf796011bc980619aa032d7984b05b67c15edc0eccd12a004a848952d3a598d108cf14901ab + languageName: node + linkType: hard + +"mdast-util-frontmatter@npm:^2.0.0": + version: 2.0.1 + resolution: "mdast-util-frontmatter@npm:2.0.1" + dependencies: + "@types/mdast": "npm:^4.0.0" + devlop: "npm:^1.0.0" + escape-string-regexp: "npm:^5.0.0" + mdast-util-from-markdown: "npm:^2.0.0" + mdast-util-to-markdown: "npm:^2.0.0" + micromark-extension-frontmatter: "npm:^2.0.0" + checksum: 10/afd9486af6ea74a94d84a225c367ab810ad4439683ecafc1ce9fc7bb0ecacaafac82e0af529974489c145824b242509f9387f833fc01a14a83a978049772ef80 + languageName: node + linkType: hard + +"mdast-util-phrasing@npm:^4.0.0": + version: 4.1.0 + resolution: "mdast-util-phrasing@npm:4.1.0" + dependencies: + "@types/mdast": "npm:^4.0.0" + unist-util-is: "npm:^6.0.0" + checksum: 10/3a97533e8ad104a422f8bebb34b3dde4f17167b8ed3a721cf9263c7416bd3447d2364e6d012a594aada40cac9e949db28a060bb71a982231693609034ed5324e + languageName: node + linkType: hard + "mdast-util-to-hast@npm:^13.0.0": version: 13.2.1 resolution: "mdast-util-to-hast@npm:13.2.1" @@ -2555,6 +2800,23 @@ __metadata: languageName: node linkType: hard +"mdast-util-to-markdown@npm:^2.0.0": + version: 2.1.2 + resolution: "mdast-util-to-markdown@npm:2.1.2" + dependencies: + "@types/mdast": "npm:^4.0.0" + "@types/unist": "npm:^3.0.0" + longest-streak: "npm:^3.0.0" + mdast-util-phrasing: "npm:^4.0.0" + mdast-util-to-string: "npm:^4.0.0" + micromark-util-classify-character: "npm:^2.0.0" + micromark-util-decode-string: "npm:^2.0.0" + unist-util-visit: "npm:^5.0.0" + zwitch: "npm:^2.0.0" + checksum: 10/ab494a32f1ec90f0a502970b403b1847a10f3ba635adddb66ce70994cc47b4924c6c05078ddd29a8c2c5c9bc8c0bcc20e5fc1ef0fcb9b0cb9c0589a000817f1c + languageName: node + linkType: hard + "mdast-util-to-string@npm:^2.0.0": version: 2.0.0 resolution: "mdast-util-to-string@npm:2.0.0" @@ -2562,6 +2824,22 @@ __metadata: languageName: node linkType: hard +"mdast-util-to-string@npm:^4.0.0": + version: 4.0.0 + resolution: "mdast-util-to-string@npm:4.0.0" + dependencies: + "@types/mdast": "npm:^4.0.0" + checksum: 10/f4a5dbb9ea03521d7d3e26a9ba5652a1d6fbd55706dddd2155427517085688830e0ecd3f12418cfd40892640886eb39a4034c3c967d85e01e2fa64cfb53cff05 + languageName: node + linkType: hard + +"mdurl@npm:^2.0.0": + version: 2.1.0 + resolution: "mdurl@npm:2.1.0" + checksum: 10/b7db2c0aa0479e11c5454b8a6ae055326bd9180b83e58696f89e862b84a0f5c7c80e497be650f205c0807b4567f6ee3e09238a76c8f1217f1fd750a1f6f2146d + languageName: node + linkType: hard + "merge2@npm:^1.3.0": version: 1.4.1 resolution: "merge2@npm:1.4.1" @@ -2569,6 +2847,99 @@ __metadata: languageName: node linkType: hard +"micromark-core-commonmark@npm:^2.0.0": + version: 2.0.3 + resolution: "micromark-core-commonmark@npm:2.0.3" + dependencies: + decode-named-character-reference: "npm:^1.0.0" + devlop: "npm:^1.0.0" + micromark-factory-destination: "npm:^2.0.0" + micromark-factory-label: "npm:^2.0.0" + micromark-factory-space: "npm:^2.0.0" + micromark-factory-title: "npm:^2.0.0" + micromark-factory-whitespace: "npm:^2.0.0" + micromark-util-character: "npm:^2.0.0" + micromark-util-chunked: "npm:^2.0.0" + micromark-util-classify-character: "npm:^2.0.0" + micromark-util-html-tag-name: "npm:^2.0.0" + micromark-util-normalize-identifier: "npm:^2.0.0" + micromark-util-resolve-all: "npm:^2.0.0" + micromark-util-subtokenize: "npm:^2.0.0" + micromark-util-symbol: "npm:^2.0.0" + micromark-util-types: "npm:^2.0.0" + checksum: 10/2b98b9eba1463850ebd8f338f966bd2113dafe764b490ebee3dccab3764d3c48b53fe67673297530e56bf54f58de27dfd1952ed79c5b4e32047cb7f29bd807f2 + languageName: node + linkType: hard + +"micromark-extension-frontmatter@npm:^2.0.0": + version: 2.0.0 + resolution: "micromark-extension-frontmatter@npm:2.0.0" + dependencies: + fault: "npm:^2.0.0" + micromark-util-character: "npm:^2.0.0" + micromark-util-symbol: "npm:^2.0.0" + micromark-util-types: "npm:^2.0.0" + checksum: 10/55873937494e9bfe1cc8cba3c8710e14e85ad0c9f3bb859d367268fc2204f3fe2eb70f9f83e496de0d3ea79c468fe6df879f9d475c716644c2daa90056cc8374 + languageName: node + linkType: hard + +"micromark-factory-destination@npm:^2.0.0": + version: 2.0.1 + resolution: "micromark-factory-destination@npm:2.0.1" + dependencies: + micromark-util-character: "npm:^2.0.0" + micromark-util-symbol: "npm:^2.0.0" + micromark-util-types: "npm:^2.0.0" + checksum: 10/9c4baa9ca2ed43c061bbf40ddd3d85154c2a0f1f485de9dea41d7dd2ad994ebb02034a003b2c1dbe228ba83a0576d591f0e90e0bf978713f84ee7d7f3aa98320 + languageName: node + linkType: hard + +"micromark-factory-label@npm:^2.0.0": + version: 2.0.1 + resolution: "micromark-factory-label@npm:2.0.1" + dependencies: + devlop: "npm:^1.0.0" + micromark-util-character: "npm:^2.0.0" + micromark-util-symbol: "npm:^2.0.0" + micromark-util-types: "npm:^2.0.0" + checksum: 10/bd03f5a75f27cdbf03b894ddc5c4480fc0763061fecf9eb927d6429233c930394f223969a99472df142d570c831236134de3dc23245d23d9f046f9d0b623b5c2 + languageName: node + linkType: hard + +"micromark-factory-space@npm:^2.0.0": + version: 2.0.1 + resolution: "micromark-factory-space@npm:2.0.1" + dependencies: + micromark-util-character: "npm:^2.0.0" + micromark-util-types: "npm:^2.0.0" + checksum: 10/1bd68a017c1a66f4787506660c1e1c5019169aac3b1cb075d49ac5e360e0b2065e984d4e1d6e9e52a9d44000f2fa1c98e66a743d7aae78b4b05616bf3242ed71 + languageName: node + linkType: hard + +"micromark-factory-title@npm:^2.0.0": + version: 2.0.1 + resolution: "micromark-factory-title@npm:2.0.1" + dependencies: + micromark-factory-space: "npm:^2.0.0" + micromark-util-character: "npm:^2.0.0" + micromark-util-symbol: "npm:^2.0.0" + micromark-util-types: "npm:^2.0.0" + checksum: 10/b4d2e4850a8ba0dff25ce54e55a3eb0d43dda88a16293f53953153288f9d84bcdfa8ca4606b2cfbb4f132ea79587bbb478a73092a349f893f5264fbcdbce2ee1 + languageName: node + linkType: hard + +"micromark-factory-whitespace@npm:^2.0.0": + version: 2.0.1 + resolution: "micromark-factory-whitespace@npm:2.0.1" + dependencies: + micromark-factory-space: "npm:^2.0.0" + micromark-util-character: "npm:^2.0.0" + micromark-util-symbol: "npm:^2.0.0" + micromark-util-types: "npm:^2.0.0" + checksum: 10/67b3944d012a42fee9e10e99178254a04d48af762b54c10a50fcab988688799993efb038daf9f5dbc04001a97b9c1b673fc6f00e6a56997877ab25449f0c8650 + languageName: node + linkType: hard + "micromark-util-character@npm:^2.0.0": version: 2.1.0 resolution: "micromark-util-character@npm:2.1.0" @@ -2579,6 +2950,57 @@ __metadata: languageName: node linkType: hard +"micromark-util-chunked@npm:^2.0.0": + version: 2.0.1 + resolution: "micromark-util-chunked@npm:2.0.1" + dependencies: + micromark-util-symbol: "npm:^2.0.0" + checksum: 10/f8cb2a67bcefe4bd2846d838c97b777101f0043b9f1de4f69baf3e26bb1f9885948444e3c3aec66db7595cad8173bd4567a000eb933576c233d54631f6323fe4 + languageName: node + linkType: hard + +"micromark-util-classify-character@npm:^2.0.0": + version: 2.0.1 + resolution: "micromark-util-classify-character@npm:2.0.1" + dependencies: + micromark-util-character: "npm:^2.0.0" + micromark-util-symbol: "npm:^2.0.0" + micromark-util-types: "npm:^2.0.0" + checksum: 10/4d8bbe3a6dbf69ac0fc43516866b5bab019fe3f4568edc525d4feaaaf78423fa54e6b6732b5bccbeed924455279a3758ffc9556954aafb903982598a95a02704 + languageName: node + linkType: hard + +"micromark-util-combine-extensions@npm:^2.0.0": + version: 2.0.1 + resolution: "micromark-util-combine-extensions@npm:2.0.1" + dependencies: + micromark-util-chunked: "npm:^2.0.0" + micromark-util-types: "npm:^2.0.0" + checksum: 10/5d22fb9ee37e8143adfe128a72b50fa09568c2cc553b3c76160486c96dbbb298c5802a177a10a215144a604b381796071b5d35be1f2c2b2ee17995eda92f0c8e + languageName: node + linkType: hard + +"micromark-util-decode-numeric-character-reference@npm:^2.0.0": + version: 2.0.2 + resolution: "micromark-util-decode-numeric-character-reference@npm:2.0.2" + dependencies: + micromark-util-symbol: "npm:^2.0.0" + checksum: 10/ee11c8bde51e250e302050474c4a2adca094bca05c69f6cdd241af12df285c48c88d19ee6e022b9728281c280be16328904adca994605680c43af56019f4b0b6 + languageName: node + linkType: hard + +"micromark-util-decode-string@npm:^2.0.0": + version: 2.0.1 + resolution: "micromark-util-decode-string@npm:2.0.1" + dependencies: + decode-named-character-reference: "npm:^1.0.0" + micromark-util-character: "npm:^2.0.0" + micromark-util-decode-numeric-character-reference: "npm:^2.0.0" + micromark-util-symbol: "npm:^2.0.0" + checksum: 10/2f517e4c613609445db4b9a17f8c77832f55fb341620a8fd598f083c1227027485d601c2021c2f8f9883210b8671e7b3990f0c6feeecd49a136475465808c380 + languageName: node + linkType: hard + "micromark-util-encode@npm:^2.0.0": version: 2.0.0 resolution: "micromark-util-encode@npm:2.0.0" @@ -2586,6 +3008,31 @@ __metadata: languageName: node linkType: hard +"micromark-util-html-tag-name@npm:^2.0.0": + version: 2.0.1 + resolution: "micromark-util-html-tag-name@npm:2.0.1" + checksum: 10/dea365f5ad28ad74ff29fcb581f7b74fc1f80271c5141b3b2bc91c454cbb6dfca753f28ae03730d657874fcbd89d0494d0e3965dfdca06d9855f467c576afa9d + languageName: node + linkType: hard + +"micromark-util-normalize-identifier@npm:^2.0.0": + version: 2.0.1 + resolution: "micromark-util-normalize-identifier@npm:2.0.1" + dependencies: + micromark-util-symbol: "npm:^2.0.0" + checksum: 10/1eb9a289d7da067323df9fdc78bfa90ca3207ad8fd893ca02f3133e973adcb3743b233393d23d95c84ccaf5d220ae7f5a28402a644f135dcd4b8cfa60a7b5f84 + languageName: node + linkType: hard + +"micromark-util-resolve-all@npm:^2.0.0": + version: 2.0.1 + resolution: "micromark-util-resolve-all@npm:2.0.1" + dependencies: + micromark-util-types: "npm:^2.0.0" + checksum: 10/9275f3ddb6c26f254dd2158e66215d050454b279707a7d9ce5a3cd0eba23201021cedcb78ae1a746c1b23227dcc418ee40dd074ade195359506797a5493550cc + languageName: node + linkType: hard + "micromark-util-sanitize-uri@npm:^2.0.0": version: 2.0.0 resolution: "micromark-util-sanitize-uri@npm:2.0.0" @@ -2597,6 +3044,18 @@ __metadata: languageName: node linkType: hard +"micromark-util-subtokenize@npm:^2.0.0": + version: 2.1.0 + resolution: "micromark-util-subtokenize@npm:2.1.0" + dependencies: + devlop: "npm:^1.0.0" + micromark-util-chunked: "npm:^2.0.0" + micromark-util-symbol: "npm:^2.0.0" + micromark-util-types: "npm:^2.0.0" + checksum: 10/5f18c70cb952a414a4d161f5d6a5254d33c7dfcd56577e592ef2e172a0414058d3531a3554f43538f14e243592fffbc2e68ddaf6a41c54577b3ba7beb555d3dc + languageName: node + linkType: hard + "micromark-util-symbol@npm:^2.0.0": version: 2.0.0 resolution: "micromark-util-symbol@npm:2.0.0" @@ -2611,6 +3070,31 @@ __metadata: languageName: node linkType: hard +"micromark@npm:^4.0.0": + version: 4.0.2 + resolution: "micromark@npm:4.0.2" + dependencies: + "@types/debug": "npm:^4.0.0" + debug: "npm:^4.0.0" + decode-named-character-reference: "npm:^1.0.0" + devlop: "npm:^1.0.0" + micromark-core-commonmark: "npm:^2.0.0" + micromark-factory-space: "npm:^2.0.0" + micromark-util-character: "npm:^2.0.0" + micromark-util-chunked: "npm:^2.0.0" + micromark-util-combine-extensions: "npm:^2.0.0" + micromark-util-decode-numeric-character-reference: "npm:^2.0.0" + micromark-util-encode: "npm:^2.0.0" + micromark-util-normalize-identifier: "npm:^2.0.0" + micromark-util-resolve-all: "npm:^2.0.0" + micromark-util-sanitize-uri: "npm:^2.0.0" + micromark-util-subtokenize: "npm:^2.0.0" + micromark-util-symbol: "npm:^2.0.0" + micromark-util-types: "npm:^2.0.0" + checksum: 10/1b85e49c8f71013df2d07a59e477deb72cd325d41cc15f35b2aa52b8b7a93fed45498ce3e18ed34464a9afa9ba8a9210b2509454b2a2d16ac06c7429f562bfac + languageName: node + linkType: hard + "micromark@npm:~2.11.0": version: 2.11.4 resolution: "micromark@npm:2.11.4" @@ -2631,6 +3115,17 @@ __metadata: languageName: node linkType: hard +"millify@npm:^6.1.0": + version: 6.1.0 + resolution: "millify@npm:6.1.0" + dependencies: + yargs: "npm:^17.0.1" + bin: + millify: bin/millify + checksum: 10/50c43824bbe5cf4cccdfd3520c70d352a4e3beeced7b2134f4a4ef6f60b789b14eb63dd5de8dc5bbee14e4cfc6e423283732af4d698f32f952762a58ad1135f2 + languageName: node + linkType: hard + "mime-db@npm:1.52.0": version: 1.52.0 resolution: "mime-db@npm:1.52.0" @@ -2647,6 +3142,15 @@ __metadata: languageName: node linkType: hard +"minimatch@npm:^10.2.6": + version: 10.2.6 + resolution: "minimatch@npm:10.2.6" + dependencies: + brace-expansion: "npm:^5.0.8" + checksum: 10/a5e43f7c57d6061a77da320b42aa35ffff826030cf67c83c0eee47a26ede4d66486935881492b968c609bf27a7d48cc4b9f54b2806643cd8fb792fcf9240cc1b + languageName: node + linkType: hard + "minimatch@npm:^9.0.4": version: 9.0.5 resolution: "minimatch@npm:9.0.5" @@ -2937,6 +3441,13 @@ __metadata: languageName: node linkType: hard +"path-to-regexp@npm:^6.3.0": + version: 6.3.0 + resolution: "path-to-regexp@npm:6.3.0" + checksum: 10/6822f686f01556d99538b350722ef761541ec0ce95ca40ce4c29e20a5b492fe8361961f57993c71b2418de12e604478dcf7c430de34b2c31a688363a7a944d9c + languageName: node + linkType: hard + "path-type@npm:^6.0.0": version: 6.0.0 resolution: "path-type@npm:6.0.0" @@ -3078,6 +3589,13 @@ __metadata: languageName: node linkType: hard +"pretty-bytes@npm:^7.1.1": + version: 7.1.1 + resolution: "pretty-bytes@npm:7.1.1" + checksum: 10/44877bebbd90663c0a40eee17866ff1ec333dd0ce71ff2a84bca8e5f7a9c5a2405d7406abf177d9443912b1720fc59cd8cbd98262887d3d8eb6ef4485b62025a + languageName: node + linkType: hard + "proc-log@npm:^4.1.0, proc-log@npm:^4.2.0": version: 4.2.0 resolution: "proc-log@npm:4.2.0" @@ -3109,6 +3627,13 @@ __metadata: languageName: node linkType: hard +"punycode.js@npm:^2.3.1": + version: 2.3.1 + resolution: "punycode.js@npm:2.3.1" + checksum: 10/f0e946d1edf063f9e3d30a32ca86d8ff90ed13ca40dad9c75d37510a04473340cfc98db23a905cc1e517b1e9deb0f6021dce6f422ace235c60d3c9ac47c5a16a + languageName: node + linkType: hard + "queue-microtask@npm:^1.2.2": version: 1.2.3 resolution: "queue-microtask@npm:1.2.3" @@ -3159,6 +3684,30 @@ __metadata: languageName: node linkType: hard +"remark-frontmatter@npm:^5.0.0": + version: 5.0.0 + resolution: "remark-frontmatter@npm:5.0.0" + dependencies: + "@types/mdast": "npm:^4.0.0" + mdast-util-frontmatter: "npm:^2.0.0" + micromark-extension-frontmatter: "npm:^2.0.0" + unified: "npm:^11.0.0" + checksum: 10/5d859f336e9cd6f6ed02139a76781b35a8cabbbb240d30dd8048e1c74d7b8e8335b98f27290c9787baab3bc5eb935347a046fa85ad307cf0f7ea6c1ecfde8dc4 + languageName: node + linkType: hard + +"remark-parse@npm:^11.0.0": + version: 11.0.0 + resolution: "remark-parse@npm:11.0.0" + dependencies: + "@types/mdast": "npm:^4.0.0" + mdast-util-from-markdown: "npm:^2.0.0" + micromark-util-types: "npm:^2.0.0" + unified: "npm:^11.0.0" + checksum: 10/59d584be56ebc7c05524989c4ed86eb8a7b6e361942b705ca13a37349f60740a6073aedf7783af46ce920d09dd156148942d5e33e8be3dbcd47f818cb4bc410c + languageName: node + linkType: hard + "remark-parse@npm:^9.0.0": version: 9.0.0 resolution: "remark-parse@npm:9.0.0" @@ -3168,6 +3717,17 @@ __metadata: languageName: node linkType: hard +"remark-stringify@npm:^11.0.0": + version: 11.0.0 + resolution: "remark-stringify@npm:11.0.0" + dependencies: + "@types/mdast": "npm:^4.0.0" + mdast-util-to-markdown: "npm:^2.0.0" + unified: "npm:^11.0.0" + checksum: 10/32b2f6093ba08e713183629b37e633e0999b6981560eec41f04fe957f76fc6f56dcc14c87c6b45419863be844c6f1130eb2dc055085fc0adc0775b1df7340348 + languageName: node + linkType: hard + "remark-stringify@npm:^9.0.1": version: 9.0.1 resolution: "remark-stringify@npm:9.0.1" @@ -3177,6 +3737,18 @@ __metadata: languageName: node linkType: hard +"remark@npm:^15.0.1": + version: 15.0.1 + resolution: "remark@npm:15.0.1" + dependencies: + "@types/mdast": "npm:^4.0.0" + remark-parse: "npm:^11.0.0" + remark-stringify: "npm:^11.0.0" + unified: "npm:^11.0.0" + checksum: 10/671eae3a4482377373cbbae956e2dbc0f8c40df1c3e5e2e1e82efa248b310ef5989340e1a5a8ebe94ff14fcf9c72612f40a29d002ffc0a465e3d6d50de973839 + languageName: node + linkType: hard + "repeat-string@npm:^1.0.0": version: 1.6.1 resolution: "repeat-string@npm:1.6.1" @@ -3184,6 +3756,13 @@ __metadata: languageName: node linkType: hard +"require-directory@npm:^2.1.1": + version: 2.1.1 + resolution: "require-directory@npm:2.1.1" + checksum: 10/a72468e2589270d91f06c7d36ec97a88db53ae5d6fe3787fadc943f0b0276b10347f89b363b2a82285f650bdcc135ad4a257c61bdd4d00d6df1fa24875b0ddaf + languageName: node + linkType: hard + "resolve@npm:^1.1.7, resolve@npm:^1.22.2": version: 1.22.8 resolution: "resolve@npm:1.22.8" @@ -3310,6 +3889,16 @@ __metadata: languageName: node linkType: hard +"section-matter@npm:^1.0.0": + version: 1.0.0 + resolution: "section-matter@npm:1.0.0" + dependencies: + extend-shallow: "npm:^2.0.1" + kind-of: "npm:^6.0.0" + checksum: 10/cedfda3a9238f66942d92531fe043dd134702a462cdc9e254cd6aa418c66ca0d229900e4da78ffd1a07051e7b239251c4dc4748e9d1c76bf41a37bff7a478556 + languageName: node + linkType: hard + "semver@npm:^7.3.5": version: 7.6.3 resolution: "semver@npm:7.6.3" @@ -3437,7 +4026,7 @@ __metadata: languageName: node linkType: hard -"string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^4.1.0": +"string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^4.1.0, string-width@npm:^4.2.0, string-width@npm:^4.2.3": version: 4.2.3 resolution: "string-width@npm:4.2.3" dependencies: @@ -3602,6 +4191,13 @@ __metadata: languageName: node linkType: hard +"tokenx@npm:^1.6.0": + version: 1.6.0 + resolution: "tokenx@npm:1.6.0" + checksum: 10/9cc302749b4d2e320bc42d8f3fea10dca0e24acfe12d4886591fda61a581fd758417ee61366c603f2b4e6843a4c412384e19d6748e4462574e0b0712eefa96d0 + languageName: node + linkType: hard + "trim-lines@npm:^3.0.0": version: 3.0.1 resolution: "trim-lines@npm:3.0.1" @@ -3616,6 +4212,13 @@ __metadata: languageName: node linkType: hard +"trough@npm:^2.0.0": + version: 2.2.0 + resolution: "trough@npm:2.2.0" + checksum: 10/999c1cb3db6ec63e1663f911146a90125065da37f66ba342b031d53edb22a62f56c1f934bbc61a55b2b29dd74207544cfd78875b414665c1ffadcd9a9a009eeb + languageName: node + linkType: hard + "ts-interface-checker@npm:^0.1.9": version: 0.1.13 resolution: "ts-interface-checker@npm:0.1.13" @@ -3623,6 +4226,13 @@ __metadata: languageName: node linkType: hard +"uc.micro@npm:^2.0.0, uc.micro@npm:^2.1.0": + version: 2.1.0 + resolution: "uc.micro@npm:2.1.0" + checksum: 10/37197358242eb9afe367502d4638ac8c5838b78792ab218eafe48287b0ed28aaca268ec0392cc5729f6c90266744de32c06ae938549aee041fc93b0f9672d6b2 + languageName: node + linkType: hard + "unicorn-magic@npm:^0.3.0": version: 0.3.0 resolution: "unicorn-magic@npm:0.3.0" @@ -3630,6 +4240,21 @@ __metadata: languageName: node linkType: hard +"unified@npm:^11.0.0": + version: 11.0.5 + resolution: "unified@npm:11.0.5" + dependencies: + "@types/unist": "npm:^3.0.0" + bail: "npm:^2.0.0" + devlop: "npm:^1.0.0" + extend: "npm:^3.0.0" + is-plain-obj: "npm:^4.0.0" + trough: "npm:^2.0.0" + vfile: "npm:^6.0.0" + checksum: 10/d9e6e88900a075f391b6bbf06f34062d41fa6257798110d1647753cfc2c6a6e2c1d016434e8ee35706c50485f9fb9ae4707a6a4790bd8dc461ec7e7315ed908b + languageName: node + linkType: hard + "unified@npm:^9.2.2": version: 9.2.2 resolution: "unified@npm:9.2.2" @@ -3680,6 +4305,17 @@ __metadata: languageName: node linkType: hard +"unist-util-remove@npm:^4.0.0": + version: 4.0.0 + resolution: "unist-util-remove@npm:4.0.0" + dependencies: + "@types/unist": "npm:^3.0.0" + unist-util-is: "npm:^6.0.0" + unist-util-visit-parents: "npm:^6.0.0" + checksum: 10/24a84224720f4c2d2ffce1d570c00b83ef545de80ec32a246698feff880446af6c410fc94deec4b4daafe09851d59f17cd1770e20f66d68092e3cd60c2147fb8 + languageName: node + linkType: hard + "unist-util-stringify-position@npm:^2.0.0": version: 2.0.3 resolution: "unist-util-stringify-position@npm:2.0.3" @@ -3719,6 +4355,17 @@ __metadata: languageName: node linkType: hard +"unist-util-visit@npm:^5.1.0": + version: 5.1.0 + resolution: "unist-util-visit@npm:5.1.0" + dependencies: + "@types/unist": "npm:^3.0.0" + unist-util-is: "npm:^6.0.0" + unist-util-visit-parents: "npm:^6.0.0" + checksum: 10/340fc1929062d21156200284105caad79cc188bd98f285b60aba887492a70e6e6cadbc7e383a68909c7e0fdd83f855cb9f4184ad8e5aa153eb2d810445aea8e5 + languageName: node + linkType: hard + "universalify@npm:^2.0.0": version: 2.0.1 resolution: "universalify@npm:2.0.1" @@ -3832,6 +4479,28 @@ __metadata: languageName: node linkType: hard +"vitepress-plugin-llms@npm:^1.13.5": + version: 1.13.5 + resolution: "vitepress-plugin-llms@npm:1.13.5" + dependencies: + "@11ty/gray-matter": "npm:^2.1.0" + markdown-it: "npm:^14.1.0" + markdown-title: "npm:^1.0.2" + mdast-util-from-markdown: "npm:^2.0.3" + millify: "npm:^6.1.0" + minimatch: "npm:^10.2.6" + path-to-regexp: "npm:^6.3.0" + picocolors: "npm:^1.1.1" + pretty-bytes: "npm:^7.1.1" + remark: "npm:^15.0.1" + remark-frontmatter: "npm:^5.0.0" + tokenx: "npm:^1.6.0" + unist-util-remove: "npm:^4.0.0" + unist-util-visit: "npm:^5.1.0" + checksum: 10/e69661e9a2cc82dab74d288f30edebc8b99bc457d09c909c0eb5df72adc3119dd92a26a841edfad097d782d15d5eef07b4abe1df3eb2916910915522fdc8e619 + languageName: node + linkType: hard + "vitepress@npm:1.6.4": version: 1.6.4 resolution: "vitepress@npm:1.6.4" @@ -3924,7 +4593,7 @@ __metadata: languageName: node linkType: hard -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0, wrap-ansi@npm:^7.0.0": version: 7.0.0 resolution: "wrap-ansi@npm:7.0.0" dependencies: @@ -3946,6 +4615,13 @@ __metadata: languageName: node linkType: hard +"y18n@npm:^5.0.5": + version: 5.0.8 + resolution: "y18n@npm:5.0.8" + checksum: 10/5f1b5f95e3775de4514edbb142398a2c37849ccfaf04a015be5d75521e9629d3be29bd4432d23c57f37e5b61ade592fb0197022e9993f81a06a5afbdcda9346d + languageName: node + linkType: hard + "yallist@npm:^4.0.0": version: 4.0.0 resolution: "yallist@npm:4.0.0" @@ -3962,6 +4638,28 @@ __metadata: languageName: node linkType: hard +"yargs-parser@npm:^21.1.1": + version: 21.1.1 + resolution: "yargs-parser@npm:21.1.1" + checksum: 10/9dc2c217ea3bf8d858041252d43e074f7166b53f3d010a8c711275e09cd3d62a002969a39858b92bbda2a6a63a585c7127014534a560b9c69ed2d923d113406e + languageName: node + linkType: hard + +"yargs@npm:^17.0.1": + version: 17.7.3 + resolution: "yargs@npm:17.7.3" + dependencies: + cliui: "npm:^8.0.1" + escalade: "npm:^3.1.1" + get-caller-file: "npm:^2.0.5" + require-directory: "npm:^2.1.1" + string-width: "npm:^4.2.3" + y18n: "npm:^5.0.5" + yargs-parser: "npm:^21.1.1" + checksum: 10/a3826798c03b159e139d0580a3b2733953889a9a1bac8e4e1ca7a1a249b55315b213c323a6a1dbdb305f6e59496a9eaa810742c87e34abcf1a0584d8f59212a1 + languageName: node + linkType: hard + "zwitch@npm:^1.0.0": version: 1.0.5 resolution: "zwitch@npm:1.0.5" @@ -3969,7 +4667,7 @@ __metadata: languageName: node linkType: hard -"zwitch@npm:^2.0.4": +"zwitch@npm:^2.0.0, zwitch@npm:^2.0.4": version: 2.0.4 resolution: "zwitch@npm:2.0.4" checksum: 10/f22ec5fc2d5f02c423c93d35cdfa83573a3a3bd98c66b927c368ea4d0e7252a500df2a90a6b45522be536a96a73404393c958e945fdba95e6832c200791702b6