{"owner":"dsherret","repo":"ts-morph","hasSkills":true,"totalSkillsCount":5,"totalTokensCount":2473,"categories":["plugin-manifest"],"hasMcp":false,"mcpConfig":null,"found":["packages/bootstrap/readme.md","packages/common/readme.md","packages/ts-morph/readme.md","packages/ts-morph/scripts/readme.md","packages/ts-morph/src/manipulation/readme.md"],"skills":{"packages/bootstrap/readme.md":"# @ts-morph/bootstrap\n\n[![npm version](https://badge.fury.io/js/%40ts-morph%2Fbootstrap.svg)](https://badge.fury.io/js/%40ts-morph%2Fbootstrap)\n[![CI](https://github.com/dsherret/ts-morph/workflows/CI/badge.svg)](https://github.com/dsherret/ts-morph/actions?query=workflow%3ACI)\n\nA library for quickly getting set up with the [TypeScript](https://github.com/Microsoft/TypeScript) Compiler API.\n\nThis library is separate from [ts-morph](https://github.com/dsherret/ts-morph/blob/latest/packages/ts-morph/), but uses some of its underlying infrastructure.\n\n- [Declarations](https://github.com/dsherret/ts-morph/blob/latest/packages/bootstrap/lib/ts-morph-bootstrap.d.ts)\n\n## Example\n\n```ts\nimport { createProject, ts } from \"@ts-morph/bootstrap\";\n\nconst project = await createProject(); // or createProjectSync\n\n// these are typed as ts.SourceFile\nconst myClassFile = project.createSourceFile(\n  \"MyClass.ts\",\n  \"export class MyClass { prop: string; }\",\n);\nconst mainFile = project.createSourceFile(\n  \"main.ts\",\n  \"import { MyClass } from './MyClass'\",\n);\n\n// ts.Program\nconst program = project.createProgram();\n// ts.TypeChecker\nconst typeChecker = program.getTypeChecker();\n// ts.LanguageService\nconst languageService = project.getLanguageService();\n// ts.ModuleResolutionHost\nconst moduleResolutionHost = project.getModuleResolutionHost();\n```\n\n## Setup\n\nGenerally:\n\n```ts\nconst project = await createProject({ tsConfigFilePath: \"tsconfig.json\" });\n```\n\nOr use the synchronous API:\n\n```ts\nconst project = createProjectSync({ tsConfigFilePath: \"tsconfig.json\" });\n```\n\n### File Systems\n\n```ts\n// will use a real file system\nconst project = await createProject();\n\n// in memory file system\nconst project2 = await createProject({ useInMemoryFileSystem: true });\n\n// custom file system\nconst fileSystem: FileSystemHost = { ...etc... };\nconst project = await createProject({ fileSystem });\n```\n\nTo access the file system after creating a project, you can use the `fileSystem` property:\n\n```ts\nproject.fileSystem.writeFileSync(\"MyClass.ts\", \"class MyClass {}\");\n```\n\n### Compiler options\n\n```ts\nconst project = await createProject({\n  compilerOptions: {\n    target: ts.ScriptTarget.ES3,\n  },\n});\n```\n\n### tsconfig.json:\n\nIf you would like to manually specify the path to a tsconfig.json file then specify that:\n\n```ts\nconst project = await createProject({\n  tsConfigFilePath: \"packages/my-library/tsconfig.json\",\n});\n\n// output all the source files that were added\nconsole.log(project.getSourceFiles().map(s => s.fileName));\n```\n\n_Note:_ You can override any tsconfig.json options by also providing a `compilerOptions` object.\n\nFor your convenience, this will automatically add all the associated source files from the tsconfig.json. If you don't wish to do that, then you will need to explicitly set `skipAddingFilesFromTsConfig` to `true`:\n\n```ts\nconst project = await createProject({\n  tsConfigFilePath: \"path/to/tsconfig.json\",\n  skipAddingFilesFromTsConfig: true,\n});\n```\n\n### Custom Module Resolution\n\nCustom module resolution can be specified by providing a resolution host factory function. This also supports providing custom type reference directive resolution.\n\nFor example:\n\n```ts\nimport { createProject, ts } from \"@ts-morph/bootstrap\";\n\n// This is deno style module resolution.\n// Ex. `import { MyClass } from \"./MyClass.ts\"`;\nconst project = await createProject({\n  resolutionHost: (moduleResolutionHost, getCompilerOptions) => {\n    return {\n      resolveModuleNames: (moduleNames, containingFile) => {\n        const compilerOptions = getCompilerOptions();\n        const resolvedModules: ts.ResolvedModule[] = [];\n\n        for (const moduleName of moduleNames.map(removeTsExtension)) {\n          const result = ts.resolveModuleName(\n            moduleName,\n            containingFile,\n            compilerOptions,\n            moduleResolutionHost,\n          );\n\n          if (result.resolvedModule)\n            resolvedModules.push(result.resolvedModule);\n        }\n\n        return resolvedModules;\n      },\n    };\n\n    function removeTsExtension(moduleName: string) {\n      if (moduleName.slice(-3).toLowerCase() === \".ts\")\n        return moduleName.slice(0, -3);\n      return moduleName;\n    }\n  },\n});\n```\n\n## Adding Source Files\n\nUse the following methods:\n\n- `const sourceFiles = await project.addSourceFilesByPaths(\"**/*.ts\");` or provide an array of file globs.\n- `const sourceFile = await project.addSourceFileAtPath(\"src/my-file.ts\");` or use `addSourceFileAtPathIfExists(filePath)`\n- `const sourceFiles = await project.addSourceFilesFromTsConfig(\"path/to/tsconfig.json\")`\n\nOr use the corresponding `-Sync` suffix methods for a synchronous API (though it will be much slower).\n\n## Creating Source Files\n\nUse the `Project#createSourceFile` method:\n\n```ts\nconst sourceFile = project.createSourceFile(\"MyClass.ts\", \"class MyClass {}\");\n```\n\n## Updating a Source File\n\nUse the `Project#updateSourceFile` method. This can be provided a file path and string for the text or a new `ts.SourceFile` object:\n\n```ts\nconst newSourceFile = project.updateSourceFile(\"MyClass.ts\", \"class MyClass {}\");\n// or\nproject.updateSourceFile(newSourceFileObj);\n```\n\n## Removing a Source File\n\nUse the `Project#removeSourceFile` method:\n\n```ts\nproject.removeSourceFile(\"MyClass.ts\");\n// or\nproject.removeSourceFile(sourceFile);\n```\n\n## Formatting Diagnostics\n\n```ts\nimport { createProject, ts } from \"@ts-morph/bootstrap\";\n\nconst project = await createProject({ useInMemoryFileSystem: true });\nproject.createSourceFile(\"test.ts\", \"const t: string = 5;\");\n\nconst program = project.createProgram();\nconst diagnostics = ts.getPreEmitDiagnostics(project.createProgram());\n\nconsole.log(project.formatDiagnosticsWithColorAndContext(diagnostics));\n```\n","packages/common/readme.md":"# @ts-morph/common\n\nCommon functionality for [ts-morph](../ts-morph) and [@ts-morph/bootstrap](../bootstrap).\n\nPlease do not depend on this library!\n","packages/ts-morph/readme.md":"# <img src=\"logo.svg\" alt=\"ts-morph\" height=\"58\" />\n\n[![npm version](https://badge.fury.io/js/ts-morph.svg)](https://badge.fury.io/js/ts-morph)\n[![CI](https://github.com/dsherret/ts-morph/workflows/CI/badge.svg)](https://github.com/dsherret/ts-morph/actions?query=workflow%3ACI)\n[![stable](http://badges.github.io/stability-badges/dist/stable.svg)](http://github.com/badges/stability-badges)\n\n[TypeScript](https://github.com/Microsoft/TypeScript) Compiler API wrapper. Provides an easier way to programmatically navigate and manipulate TypeScript and JavaScript code.\n\nFormerly `ts-simple-ast`.\n\n## Overview\n\n- [Documentation](https://ts-morph.com/)\n- [Declaration file](https://github.com/dsherret/ts-morph/blob/latest/packages/ts-morph/lib/ts-morph.d.ts)\n\n## Main Features\n\n1. Wraps the compiler API objects to provide helper methods for getting information and programmatically changing files.\n2. Allows falling back to the compiler API objects if necessary (ex. `classDeclaration.compilerNode` or `typeChecker.compilerObject`).\n3. All changes are kept in memory (including file and directory moves) until specifying to save to the underlying file system.\n4. Changes are made to the text and wrapped nodes can be held on to between manipulations.\n\n## Getting Started\n\n1. [Installing](https://ts-morph.com/)\n2. [Instantiating](https://ts-morph.com/setup/)\n3. [Adding source files](https://ts-morph.com/setup/adding-source-files)\n4. [Getting source files](https://ts-morph.com/navigation/getting-source-files)\n5. [Navigating](https://ts-morph.com/navigation/example)\n6. [Manipulating](https://ts-morph.com/manipulation/)\n\n## Library Progress\n\nThis library is still under active development. Most common code manipulation/generation use cases are implemented, but there's still a lot of work to do. Please open an issue if you find a feature missing, bug, or question that isn't in the issue tracker.\n\n- [Breaking changes](https://github.com/dsherret/ts-morph/blob/latest/packages/ts-morph/breaking-changes.md)\n- [Change log](https://github.com/dsherret/ts-morph/blob/latest/packages/ts-morph/CHANGELOG.md)\n- [Wrapped nodes progress report](https://github.com/dsherret/ts-morph/blob/latest/packages/ts-morph/wrapped-nodes.md)\n\n## Example\n\n<!-- dprint-ignore -->\n```ts\nimport { Project, StructureKind } from \"ts-morph\";\n\n// initialize\nconst project = new Project({\n    // Optionally specify compiler options, tsconfig.json, in-memory file system, and more here.\n    // If you initialize with a tsconfig.json, then it will automatically populate the project\n    // with the associated source files.\n    // Read more: https://ts-morph.com/setup/\n});\n\n// add source files\nproject.addSourceFilesAtPaths(\"src/**/*.ts\");\nconst myClassFile = project.createSourceFile(\"src/MyClass.ts\", \"export class MyClass {}\");\nconst myEnumFile = project.createSourceFile(\"src/MyEnum.ts\", {\n    statements: [{\n        kind: StructureKind.Enum,\n        name: \"MyEnum\",\n        isExported: true,\n        members: [{ name: \"member\" }],\n    }],\n});\n\n// get information\nconst myClass = myClassFile.getClassOrThrow(\"MyClass\");\nmyClass.getName();          // returns: \"MyClass\"\nmyClass.hasExportKeyword(); // returns: true\nmyClass.isDefaultExport();  // returns: false\n\n// manipulate\nconst myInterface = myClassFile.addInterface({\n    name: \"IMyInterface\",\n    isExported: true,\n    properties: [{\n        name: \"myProp\",\n        type: \"number\",\n    }],\n});\n\nmyClass.rename(\"NewName\");\nmyClass.addImplements(myInterface.getName());\nmyClass.addProperty({\n    name: \"myProp\",\n    initializer: \"5\",\n});\n\nproject.getSourceFileOrThrow(\"src/ExistingFile.ts\").delete();\n\n// asynchronously save all the changes above\nawait project.save();\n\n// get underlying compiler node from the typescript AST from any node\nconst compilerNode = myClassFile.compilerNode;\n```\n\nOr navigate existing compiler nodes created with the TypeScript compiler (the `ts` named export is the TypeScript compiler):\n\n```ts ignore-error: 1109\nimport { createWrappedNode, ClassDeclaration, ts } from \"ts-morph\";\n\n// some code that creates a class declaration using the ts object\nconst classNode: ts.ClassDeclaration = ...;\n\n// create and use a wrapped node\nconst classDec = createWrappedNode(classNode) as ClassDeclaration;\nconst firstProperty = classDec.getProperties()[0];\n\n// ... do more stuff here ...\n```\n","packages/ts-morph/scripts/readme.md":"# Scripts\n\nThis folder contains the code that verifies, manipulates, and generates code for ts-morph.\n","packages/ts-morph/src/manipulation/readme.md":"# Manipulation\n\nIn this folder, most of the code is for changing the text and replacing an old tree with the new one.\n\nDirectory overview:\n\n- `manipulations` - Functions used to do a manipulations.\n- `textManipulations` - Classes used to manipulate text.\n- `nodeHandlers` - Classes to replace a tree.\n"},"files":{"packages/bootstrap/readme.md":"# @ts-morph/bootstrap\n\n[![npm version](https://badge.fury.io/js/%40ts-morph%2Fbootstrap.svg)](https://badge.fury.io/js/%40ts-morph%2Fbootstrap)\n[![CI](https://github.com/dsherret/ts-morph/workflows/CI/badge.svg)](https://github.com/dsherret/ts-morph/actions?query=workflow%3ACI)\n\nA library for quickly getting set up with the [TypeScript](https://github.com/Microsoft/TypeScript) Compiler API.\n\nThis library is separate from [ts-morph](https://github.com/dsherret/ts-morph/blob/latest/packages/ts-morph/), but uses some of its underlying infrastructure.\n\n- [Declarations](https://github.com/dsherret/ts-morph/blob/latest/packages/bootstrap/lib/ts-morph-bootstrap.d.ts)\n\n## Example\n\n```ts\nimport { createProject, ts } from \"@ts-morph/bootstrap\";\n\nconst project = await createProject(); // or createProjectSync\n\n// these are typed as ts.SourceFile\nconst myClassFile = project.createSourceFile(\n  \"MyClass.ts\",\n  \"export class MyClass { prop: string; }\",\n);\nconst mainFile = project.createSourceFile(\n  \"main.ts\",\n  \"import { MyClass } from './MyClass'\",\n);\n\n// ts.Program\nconst program = project.createProgram();\n// ts.TypeChecker\nconst typeChecker = program.getTypeChecker();\n// ts.LanguageService\nconst languageService = project.getLanguageService();\n// ts.ModuleResolutionHost\nconst moduleResolutionHost = project.getModuleResolutionHost();\n```\n\n## Setup\n\nGenerally:\n\n```ts\nconst project = await createProject({ tsConfigFilePath: \"tsconfig.json\" });\n```\n\nOr use the synchronous API:\n\n```ts\nconst project = createProjectSync({ tsConfigFilePath: \"tsconfig.json\" });\n```\n\n### File Systems\n\n```ts\n// will use a real file system\nconst project = await createProject();\n\n// in memory file system\nconst project2 = await createProject({ useInMemoryFileSystem: true });\n\n// custom file system\nconst fileSystem: FileSystemHost = { ...etc... };\nconst project = await createProject({ fileSystem });\n```\n\nTo access the file system after creating a project, you can use the `fileSystem` property:\n\n```ts\nproject.fileSystem.writeFileSync(\"MyClass.ts\", \"class MyClass {}\");\n```\n\n### Compiler options\n\n```ts\nconst project = await createProject({\n  compilerOptions: {\n    target: ts.ScriptTarget.ES3,\n  },\n});\n```\n\n### tsconfig.json:\n\nIf you would like to manually specify the path to a tsconfig.json file then specify that:\n\n```ts\nconst project = await createProject({\n  tsConfigFilePath: \"packages/my-library/tsconfig.json\",\n});\n\n// output all the source files that were added\nconsole.log(project.getSourceFiles().map(s => s.fileName));\n```\n\n_Note:_ You can override any tsconfig.json options by also providing a `compilerOptions` object.\n\nFor your convenience, this will automatically add all the associated source files from the tsconfig.json. If you don't wish to do that, then you will need to explicitly set `skipAddingFilesFromTsConfig` to `true`:\n\n```ts\nconst project = await createProject({\n  tsConfigFilePath: \"path/to/tsconfig.json\",\n  skipAddingFilesFromTsConfig: true,\n});\n```\n\n### Custom Module Resolution\n\nCustom module resolution can be specified by providing a resolution host factory function. This also supports providing custom type reference directive resolution.\n\nFor example:\n\n```ts\nimport { createProject, ts } from \"@ts-morph/bootstrap\";\n\n// This is deno style module resolution.\n// Ex. `import { MyClass } from \"./MyClass.ts\"`;\nconst project = await createProject({\n  resolutionHost: (moduleResolutionHost, getCompilerOptions) => {\n    return {\n      resolveModuleNames: (moduleNames, containingFile) => {\n        const compilerOptions = getCompilerOptions();\n        const resolvedModules: ts.ResolvedModule[] = [];\n\n        for (const moduleName of moduleNames.map(removeTsExtension)) {\n          const result = ts.resolveModuleName(\n            moduleName,\n            containingFile,\n            compilerOptions,\n            moduleResolutionHost,\n          );\n\n          if (result.resolvedModule)\n            resolvedModules.push(result.resolvedModule);\n        }\n\n        return resolvedModules;\n      },\n    };\n\n    function removeTsExtension(moduleName: string) {\n      if (moduleName.slice(-3).toLowerCase() === \".ts\")\n        return moduleName.slice(0, -3);\n      return moduleName;\n    }\n  },\n});\n```\n\n## Adding Source Files\n\nUse the following methods:\n\n- `const sourceFiles = await project.addSourceFilesByPaths(\"**/*.ts\");` or provide an array of file globs.\n- `const sourceFile = await project.addSourceFileAtPath(\"src/my-file.ts\");` or use `addSourceFileAtPathIfExists(filePath)`\n- `const sourceFiles = await project.addSourceFilesFromTsConfig(\"path/to/tsconfig.json\")`\n\nOr use the corresponding `-Sync` suffix methods for a synchronous API (though it will be much slower).\n\n## Creating Source Files\n\nUse the `Project#createSourceFile` method:\n\n```ts\nconst sourceFile = project.createSourceFile(\"MyClass.ts\", \"class MyClass {}\");\n```\n\n## Updating a Source File\n\nUse the `Project#updateSourceFile` method. This can be provided a file path and string for the text or a new `ts.SourceFile` object:\n\n```ts\nconst newSourceFile = project.updateSourceFile(\"MyClass.ts\", \"class MyClass {}\");\n// or\nproject.updateSourceFile(newSourceFileObj);\n```\n\n## Removing a Source File\n\nUse the `Project#removeSourceFile` method:\n\n```ts\nproject.removeSourceFile(\"MyClass.ts\");\n// or\nproject.removeSourceFile(sourceFile);\n```\n\n## Formatting Diagnostics\n\n```ts\nimport { createProject, ts } from \"@ts-morph/bootstrap\";\n\nconst project = await createProject({ useInMemoryFileSystem: true });\nproject.createSourceFile(\"test.ts\", \"const t: string = 5;\");\n\nconst program = project.createProgram();\nconst diagnostics = ts.getPreEmitDiagnostics(project.createProgram());\n\nconsole.log(project.formatDiagnosticsWithColorAndContext(diagnostics));\n```\n","packages/common/readme.md":"# @ts-morph/common\n\nCommon functionality for [ts-morph](../ts-morph) and [@ts-morph/bootstrap](../bootstrap).\n\nPlease do not depend on this library!\n","packages/ts-morph/readme.md":"# <img src=\"logo.svg\" alt=\"ts-morph\" height=\"58\" />\n\n[![npm version](https://badge.fury.io/js/ts-morph.svg)](https://badge.fury.io/js/ts-morph)\n[![CI](https://github.com/dsherret/ts-morph/workflows/CI/badge.svg)](https://github.com/dsherret/ts-morph/actions?query=workflow%3ACI)\n[![stable](http://badges.github.io/stability-badges/dist/stable.svg)](http://github.com/badges/stability-badges)\n\n[TypeScript](https://github.com/Microsoft/TypeScript) Compiler API wrapper. Provides an easier way to programmatically navigate and manipulate TypeScript and JavaScript code.\n\nFormerly `ts-simple-ast`.\n\n## Overview\n\n- [Documentation](https://ts-morph.com/)\n- [Declaration file](https://github.com/dsherret/ts-morph/blob/latest/packages/ts-morph/lib/ts-morph.d.ts)\n\n## Main Features\n\n1. Wraps the compiler API objects to provide helper methods for getting information and programmatically changing files.\n2. Allows falling back to the compiler API objects if necessary (ex. `classDeclaration.compilerNode` or `typeChecker.compilerObject`).\n3. All changes are kept in memory (including file and directory moves) until specifying to save to the underlying file system.\n4. Changes are made to the text and wrapped nodes can be held on to between manipulations.\n\n## Getting Started\n\n1. [Installing](https://ts-morph.com/)\n2. [Instantiating](https://ts-morph.com/setup/)\n3. [Adding source files](https://ts-morph.com/setup/adding-source-files)\n4. [Getting source files](https://ts-morph.com/navigation/getting-source-files)\n5. [Navigating](https://ts-morph.com/navigation/example)\n6. [Manipulating](https://ts-morph.com/manipulation/)\n\n## Library Progress\n\nThis library is still under active development. Most common code manipulation/generation use cases are implemented, but there's still a lot of work to do. Please open an issue if you find a feature missing, bug, or question that isn't in the issue tracker.\n\n- [Breaking changes](https://github.com/dsherret/ts-morph/blob/latest/packages/ts-morph/breaking-changes.md)\n- [Change log](https://github.com/dsherret/ts-morph/blob/latest/packages/ts-morph/CHANGELOG.md)\n- [Wrapped nodes progress report](https://github.com/dsherret/ts-morph/blob/latest/packages/ts-morph/wrapped-nodes.md)\n\n## Example\n\n<!-- dprint-ignore -->\n```ts\nimport { Project, StructureKind } from \"ts-morph\";\n\n// initialize\nconst project = new Project({\n    // Optionally specify compiler options, tsconfig.json, in-memory file system, and more here.\n    // If you initialize with a tsconfig.json, then it will automatically populate the project\n    // with the associated source files.\n    // Read more: https://ts-morph.com/setup/\n});\n\n// add source files\nproject.addSourceFilesAtPaths(\"src/**/*.ts\");\nconst myClassFile = project.createSourceFile(\"src/MyClass.ts\", \"export class MyClass {}\");\nconst myEnumFile = project.createSourceFile(\"src/MyEnum.ts\", {\n    statements: [{\n        kind: StructureKind.Enum,\n        name: \"MyEnum\",\n        isExported: true,\n        members: [{ name: \"member\" }],\n    }],\n});\n\n// get information\nconst myClass = myClassFile.getClassOrThrow(\"MyClass\");\nmyClass.getName();          // returns: \"MyClass\"\nmyClass.hasExportKeyword(); // returns: true\nmyClass.isDefaultExport();  // returns: false\n\n// manipulate\nconst myInterface = myClassFile.addInterface({\n    name: \"IMyInterface\",\n    isExported: true,\n    properties: [{\n        name: \"myProp\",\n        type: \"number\",\n    }],\n});\n\nmyClass.rename(\"NewName\");\nmyClass.addImplements(myInterface.getName());\nmyClass.addProperty({\n    name: \"myProp\",\n    initializer: \"5\",\n});\n\nproject.getSourceFileOrThrow(\"src/ExistingFile.ts\").delete();\n\n// asynchronously save all the changes above\nawait project.save();\n\n// get underlying compiler node from the typescript AST from any node\nconst compilerNode = myClassFile.compilerNode;\n```\n\nOr navigate existing compiler nodes created with the TypeScript compiler (the `ts` named export is the TypeScript compiler):\n\n```ts ignore-error: 1109\nimport { createWrappedNode, ClassDeclaration, ts } from \"ts-morph\";\n\n// some code that creates a class declaration using the ts object\nconst classNode: ts.ClassDeclaration = ...;\n\n// create and use a wrapped node\nconst classDec = createWrappedNode(classNode) as ClassDeclaration;\nconst firstProperty = classDec.getProperties()[0];\n\n// ... do more stuff here ...\n```\n","packages/ts-morph/scripts/readme.md":"# Scripts\n\nThis folder contains the code that verifies, manipulates, and generates code for ts-morph.\n","packages/ts-morph/src/manipulation/readme.md":"# Manipulation\n\nIn this folder, most of the code is for changing the text and replacing an old tree with the new one.\n\nDirectory overview:\n\n- `manipulations` - Functions used to do a manipulations.\n- `textManipulations` - Classes used to manipulate text.\n- `nodeHandlers` - Classes to replace a tree.\n"},"items":[{"name":"readme.md","path":"packages/bootstrap/readme.md","rawUrl":"https://raw.githubusercontent.com/dsherret/ts-morph/HEAD/packages/bootstrap/readme.md","title":"bootstrap Documentation","category":"plugin-manifest","format":"markdown","content":"# @ts-morph/bootstrap\n\n[![npm version](https://badge.fury.io/js/%40ts-morph%2Fbootstrap.svg)](https://badge.fury.io/js/%40ts-morph%2Fbootstrap)\n[![CI](https://github.com/dsherret/ts-morph/workflows/CI/badge.svg)](https://github.com/dsherret/ts-morph/actions?query=workflow%3ACI)\n\nA library for quickly getting set up with the [TypeScript](https://github.com/Microsoft/TypeScript) Compiler API.\n\nThis library is separate from [ts-morph](https://github.com/dsherret/ts-morph/blob/latest/packages/ts-morph/), but uses some of its underlying infrastructure.\n\n- [Declarations](https://github.com/dsherret/ts-morph/blob/latest/packages/bootstrap/lib/ts-morph-bootstrap.d.ts)\n\n## Example\n\n```ts\nimport { createProject, ts } from \"@ts-morph/bootstrap\";\n\nconst project = await createProject(); // or createProjectSync\n\n// these are typed as ts.SourceFile\nconst myClassFile = project.createSourceFile(\n  \"MyClass.ts\",\n  \"export class MyClass { prop: string; }\",\n);\nconst mainFile = project.createSourceFile(\n  \"main.ts\",\n  \"import { MyClass } from './MyClass'\",\n);\n\n// ts.Program\nconst program = project.createProgram();\n// ts.TypeChecker\nconst typeChecker = program.getTypeChecker();\n// ts.LanguageService\nconst languageService = project.getLanguageService();\n// ts.ModuleResolutionHost\nconst moduleResolutionHost = project.getModuleResolutionHost();\n```\n\n## Setup\n\nGenerally:\n\n```ts\nconst project = await createProject({ tsConfigFilePath: \"tsconfig.json\" });\n```\n\nOr use the synchronous API:\n\n```ts\nconst project = createProjectSync({ tsConfigFilePath: \"tsconfig.json\" });\n```\n\n### File Systems\n\n```ts\n// will use a real file system\nconst project = await createProject();\n\n// in memory file system\nconst project2 = await createProject({ useInMemoryFileSystem: true });\n\n// custom file system\nconst fileSystem: FileSystemHost = { ...etc... };\nconst project = await createProject({ fileSystem });\n```\n\nTo access the file system after creating a project, you can use the `fileSystem` property:\n\n```ts\nproject.fileSystem.writeFileSync(\"MyClass.ts\", \"class MyClass {}\");\n```\n\n### Compiler options\n\n```ts\nconst project = await createProject({\n  compilerOptions: {\n    target: ts.ScriptTarget.ES3,\n  },\n});\n```\n\n### tsconfig.json:\n\nIf you would like to manually specify the path to a tsconfig.json file then specify that:\n\n```ts\nconst project = await createProject({\n  tsConfigFilePath: \"packages/my-library/tsconfig.json\",\n});\n\n// output all the source files that were added\nconsole.log(project.getSourceFiles().map(s => s.fileName));\n```\n\n_Note:_ You can override any tsconfig.json options by also providing a `compilerOptions` object.\n\nFor your convenience, this will automatically add all the associated source files from the tsconfig.json. If you don't wish to do that, then you will need to explicitly set `skipAddingFilesFromTsConfig` to `true`:\n\n```ts\nconst project = await createProject({\n  tsConfigFilePath: \"path/to/tsconfig.json\",\n  skipAddingFilesFromTsConfig: true,\n});\n```\n\n### Custom Module Resolution\n\nCustom module resolution can be specified by providing a resolution host factory function. This also supports providing custom type reference directive resolution.\n\nFor example:\n\n```ts\nimport { createProject, ts } from \"@ts-morph/bootstrap\";\n\n// This is deno style module resolution.\n// Ex. `import { MyClass } from \"./MyClass.ts\"`;\nconst project = await createProject({\n  resolutionHost: (moduleResolutionHost, getCompilerOptions) => {\n    return {\n      resolveModuleNames: (moduleNames, containingFile) => {\n        const compilerOptions = getCompilerOptions();\n        const resolvedModules: ts.ResolvedModule[] = [];\n\n        for (const moduleName of moduleNames.map(removeTsExtension)) {\n          const result = ts.resolveModuleName(\n            moduleName,\n            containingFile,\n            compilerOptions,\n            moduleResolutionHost,\n          );\n\n          if (result.resolvedModule)\n            resolvedModules.push(result.resolvedModule);\n        }\n\n        return resolvedModules;\n      },\n    };\n\n    function removeTsExtension(moduleName: string) {\n      if (moduleName.slice(-3).toLowerCase() === \".ts\")\n        return moduleName.slice(0, -3);\n      return moduleName;\n    }\n  },\n});\n```\n\n## Adding Source Files\n\nUse the following methods:\n\n- `const sourceFiles = await project.addSourceFilesByPaths(\"**/*.ts\");` or provide an array of file globs.\n- `const sourceFile = await project.addSourceFileAtPath(\"src/my-file.ts\");` or use `addSourceFileAtPathIfExists(filePath)`\n- `const sourceFiles = await project.addSourceFilesFromTsConfig(\"path/to/tsconfig.json\")`\n\nOr use the corresponding `-Sync` suffix methods for a synchronous API (though it will be much slower).\n\n## Creating Source Files\n\nUse the `Project#createSourceFile` method:\n\n```ts\nconst sourceFile = project.createSourceFile(\"MyClass.ts\", \"class MyClass {}\");\n```\n\n## Updating a Source File\n\nUse the `Project#updateSourceFile` method. This can be provided a file path and string for the text or a new `ts.SourceFile` object:\n\n```ts\nconst newSourceFile = project.updateSourceFile(\"MyClass.ts\", \"class MyClass {}\");\n// or\nproject.updateSourceFile(newSourceFileObj);\n```\n\n## Removing a Source File\n\nUse the `Project#removeSourceFile` method:\n\n```ts\nproject.removeSourceFile(\"MyClass.ts\");\n// or\nproject.removeSourceFile(sourceFile);\n```\n\n## Formatting Diagnostics\n\n```ts\nimport { createProject, ts } from \"@ts-morph/bootstrap\";\n\nconst project = await createProject({ useInMemoryFileSystem: true });\nproject.createSourceFile(\"test.ts\", \"const t: string = 5;\");\n\nconst program = project.createProgram();\nconst diagnostics = ts.getPreEmitDiagnostics(project.createProgram());\n\nconsole.log(project.formatDiagnosticsWithColorAndContext(diagnostics));\n```\n","isInternal":false,"tokens":1310,"sizeBytes":5741},{"name":"readme.md","path":"packages/common/readme.md","rawUrl":"https://raw.githubusercontent.com/dsherret/ts-morph/HEAD/packages/common/readme.md","title":"common Documentation","category":"plugin-manifest","format":"markdown","content":"# @ts-morph/common\n\nCommon functionality for [ts-morph](../ts-morph) and [@ts-morph/bootstrap](../bootstrap).\n\nPlease do not depend on this library!\n","isInternal":false,"tokens":38,"sizeBytes":149},{"name":"readme.md","path":"packages/ts-morph/readme.md","rawUrl":"https://raw.githubusercontent.com/dsherret/ts-morph/HEAD/packages/ts-morph/readme.md","title":"ts-morph Documentation","category":"plugin-manifest","format":"markdown","content":"# <img src=\"logo.svg\" alt=\"ts-morph\" height=\"58\" />\n\n[![npm version](https://badge.fury.io/js/ts-morph.svg)](https://badge.fury.io/js/ts-morph)\n[![CI](https://github.com/dsherret/ts-morph/workflows/CI/badge.svg)](https://github.com/dsherret/ts-morph/actions?query=workflow%3ACI)\n[![stable](http://badges.github.io/stability-badges/dist/stable.svg)](http://github.com/badges/stability-badges)\n\n[TypeScript](https://github.com/Microsoft/TypeScript) Compiler API wrapper. Provides an easier way to programmatically navigate and manipulate TypeScript and JavaScript code.\n\nFormerly `ts-simple-ast`.\n\n## Overview\n\n- [Documentation](https://ts-morph.com/)\n- [Declaration file](https://github.com/dsherret/ts-morph/blob/latest/packages/ts-morph/lib/ts-morph.d.ts)\n\n## Main Features\n\n1. Wraps the compiler API objects to provide helper methods for getting information and programmatically changing files.\n2. Allows falling back to the compiler API objects if necessary (ex. `classDeclaration.compilerNode` or `typeChecker.compilerObject`).\n3. All changes are kept in memory (including file and directory moves) until specifying to save to the underlying file system.\n4. Changes are made to the text and wrapped nodes can be held on to between manipulations.\n\n## Getting Started\n\n1. [Installing](https://ts-morph.com/)\n2. [Instantiating](https://ts-morph.com/setup/)\n3. [Adding source files](https://ts-morph.com/setup/adding-source-files)\n4. [Getting source files](https://ts-morph.com/navigation/getting-source-files)\n5. [Navigating](https://ts-morph.com/navigation/example)\n6. [Manipulating](https://ts-morph.com/manipulation/)\n\n## Library Progress\n\nThis library is still under active development. Most common code manipulation/generation use cases are implemented, but there's still a lot of work to do. Please open an issue if you find a feature missing, bug, or question that isn't in the issue tracker.\n\n- [Breaking changes](https://github.com/dsherret/ts-morph/blob/latest/packages/ts-morph/breaking-changes.md)\n- [Change log](https://github.com/dsherret/ts-morph/blob/latest/packages/ts-morph/CHANGELOG.md)\n- [Wrapped nodes progress report](https://github.com/dsherret/ts-morph/blob/latest/packages/ts-morph/wrapped-nodes.md)\n\n## Example\n\n<!-- dprint-ignore -->\n```ts\nimport { Project, StructureKind } from \"ts-morph\";\n\n// initialize\nconst project = new Project({\n    // Optionally specify compiler options, tsconfig.json, in-memory file system, and more here.\n    // If you initialize with a tsconfig.json, then it will automatically populate the project\n    // with the associated source files.\n    // Read more: https://ts-morph.com/setup/\n});\n\n// add source files\nproject.addSourceFilesAtPaths(\"src/**/*.ts\");\nconst myClassFile = project.createSourceFile(\"src/MyClass.ts\", \"export class MyClass {}\");\nconst myEnumFile = project.createSourceFile(\"src/MyEnum.ts\", {\n    statements: [{\n        kind: StructureKind.Enum,\n        name: \"MyEnum\",\n        isExported: true,\n        members: [{ name: \"member\" }],\n    }],\n});\n\n// get information\nconst myClass = myClassFile.getClassOrThrow(\"MyClass\");\nmyClass.getName();          // returns: \"MyClass\"\nmyClass.hasExportKeyword(); // returns: true\nmyClass.isDefaultExport();  // returns: false\n\n// manipulate\nconst myInterface = myClassFile.addInterface({\n    name: \"IMyInterface\",\n    isExported: true,\n    properties: [{\n        name: \"myProp\",\n        type: \"number\",\n    }],\n});\n\nmyClass.rename(\"NewName\");\nmyClass.addImplements(myInterface.getName());\nmyClass.addProperty({\n    name: \"myProp\",\n    initializer: \"5\",\n});\n\nproject.getSourceFileOrThrow(\"src/ExistingFile.ts\").delete();\n\n// asynchronously save all the changes above\nawait project.save();\n\n// get underlying compiler node from the typescript AST from any node\nconst compilerNode = myClassFile.compilerNode;\n```\n\nOr navigate existing compiler nodes created with the TypeScript compiler (the `ts` named export is the TypeScript compiler):\n\n```ts ignore-error: 1109\nimport { createWrappedNode, ClassDeclaration, ts } from \"ts-morph\";\n\n// some code that creates a class declaration using the ts object\nconst classNode: ts.ClassDeclaration = ...;\n\n// create and use a wrapped node\nconst classDec = createWrappedNode(classNode) as ClassDeclaration;\nconst firstProperty = classDec.getProperties()[0];\n\n// ... do more stuff here ...\n```\n","isInternal":false,"tokens":1033,"sizeBytes":4341},{"name":"readme.md","path":"packages/ts-morph/scripts/readme.md","rawUrl":"https://raw.githubusercontent.com/dsherret/ts-morph/HEAD/packages/ts-morph/scripts/readme.md","title":"scripts Documentation","category":"plugin-manifest","format":"markdown","content":"# Scripts\n\nThis folder contains the code that verifies, manipulates, and generates code for ts-morph.\n","isInternal":false,"tokens":22,"sizeBytes":102},{"name":"readme.md","path":"packages/ts-morph/src/manipulation/readme.md","rawUrl":"https://raw.githubusercontent.com/dsherret/ts-morph/HEAD/packages/ts-morph/src/manipulation/readme.md","title":"manipulation Documentation","category":"plugin-manifest","format":"markdown","content":"# Manipulation\n\nIn this folder, most of the code is for changing the text and replacing an old tree with the new one.\n\nDirectory overview:\n\n- `manipulations` - Functions used to do a manipulations.\n- `textManipulations` - Classes used to manipulate text.\n- `nodeHandlers` - Classes to replace a tree.\n","isInternal":false,"tokens":70,"sizeBytes":301}],"systemPromptSnippet":"<yakaai_skills repo=\"dsherret/ts-morph\">\n<!-- File: packages/bootstrap/readme.md (Tokens: ~1310 | Category: plugin-manifest) -->\n# @ts-morph/bootstrap\n\n[![npm version](https://badge.fury.io/js/%40ts-morph%2Fbootstrap.svg)](https://badge.fury.io/js/%40ts-morph%2Fbootstrap)\n[![CI](https://github.com/dsherret/ts-morph/workflows/CI/badge.svg)](https://github.com/dsherret/ts-morph/actions?query=workflow%3ACI)\n\nA library for quickly getting set up with the [TypeScript](https://github.com/Microsoft/TypeScript) Compiler API.\n\nThis library is separate from [ts-morph](https://github.com/dsherret/ts-morph/blob/latest/packages/ts-morph/), but uses some of its underlying infrastructure.\n\n- [Declarations](https://github.com/dsherret/ts-morph/blob/latest/packages/bootstrap/lib/ts-morph-bootstrap.d.ts)\n\n## Example\n\n```ts\nimport { createProject, ts } from \"@ts-morph/bootstrap\";\n\nconst project = await createProject(); // or createProjectSync\n\n// these are typed as ts.SourceFile\nconst myClassFile = project.createSourceFile(\n  \"MyClass.ts\",\n  \"export class MyClass { prop: string; }\",\n);\nconst mainFile = project.createSourceFile(\n  \"main.ts\",\n  \"import { MyClass } from './MyClass'\",\n);\n\n// ts.Program\nconst program = project.createProgram();\n// ts.TypeChecker\nconst typeChecker = program.getTypeChecker();\n// ts.LanguageService\nconst languageService = project.getLanguageService();\n// ts.ModuleResolutionHost\nconst moduleResolutionHost = project.getModuleResolutionHost();\n```\n\n## Setup\n\nGenerally:\n\n```ts\nconst project = await createProject({ tsConfigFilePath: \"tsconfig.json\" });\n```\n\nOr use the synchronous API:\n\n```ts\nconst project = createProjectSync({ tsConfigFilePath: \"tsconfig.json\" });\n```\n\n### File Systems\n\n```ts\n// will use a real file system\nconst project = await createProject();\n\n// in memory file system\nconst project2 = await createProject({ useInMemoryFileSystem: true });\n\n// custom file system\nconst fileSystem: FileSystemHost = { ...etc... };\nconst project = await createProject({ fileSystem });\n```\n\nTo access the file system after creating a project, you can use the `fileSystem` property:\n\n```ts\nproject.fileSystem.writeFileSync(\"MyClass.ts\", \"class MyClass {}\");\n```\n\n### Compiler options\n\n```ts\nconst project = await createProject({\n  compilerOptions: {\n    target: ts.ScriptTarget.ES3,\n  },\n});\n```\n\n### tsconfig.json:\n\nIf you would like to manually specify the path to a tsconfig.json file then specify that:\n\n```ts\nconst project = await createProject({\n  tsConfigFilePath: \"packages/my-library/tsconfig.json\",\n});\n\n// output all the source files that were added\nconsole.log(project.getSourceFiles().map(s => s.fileName));\n```\n\n_Note:_ You can override any tsconfig.json options by also providing a `compilerOptions` object.\n\nFor your convenience, this will automatically add all the associated source files from the tsconfig.json. If you don't wish to do that, then you will need to explicitly set `skipAddingFilesFromTsConfig` to `true`:\n\n```ts\nconst project = await createProject({\n  tsConfigFilePath: \"path/to/tsconfig.json\",\n  skipAddingFilesFromTsConfig: true,\n});\n```\n\n### Custom Module Resolution\n\nCustom module resolution can be specified by providing a resolution host factory function. This also supports providing custom type reference directive resolution.\n\nFor example:\n\n```ts\nimport { createProject, ts } from \"@ts-morph/bootstrap\";\n\n// This is deno style module resolution.\n// Ex. `import { MyClass } from \"./MyClass.ts\"`;\nconst project = await createProject({\n  resolutionHost: (moduleResolutionHost, getCompilerOptions) => {\n    return {\n      resolveModuleNames: (moduleNames, containingFile) => {\n        const compilerOptions = getCompilerOptions();\n        const resolvedModules: ts.ResolvedModule[] = [];\n\n        for (const moduleName of moduleNames.map(removeTsExtension)) {\n          const result = ts.resolveModuleName(\n            moduleName,\n            containingFile,\n            compilerOptions,\n            moduleResolutionHost,\n          );\n\n          if (result.resolvedModule)\n            resolvedModules.push(result.resolvedModule);\n        }\n\n        return resolvedModules;\n      },\n    };\n\n    function removeTsExtension(moduleName: string) {\n      if (moduleName.slice(-3).toLowerCase() === \".ts\")\n        return moduleName.slice(0, -3);\n      return moduleName;\n    }\n  },\n});\n```\n\n## Adding Source Files\n\nUse the following methods:\n\n- `const sourceFiles = await project.addSourceFilesByPaths(\"**/*.ts\");` or provide an array of file globs.\n- `const sourceFile = await project.addSourceFileAtPath(\"src/my-file.ts\");` or use `addSourceFileAtPathIfExists(filePath)`\n- `const sourceFiles = await project.addSourceFilesFromTsConfig(\"path/to/tsconfig.json\")`\n\nOr use the corresponding `-Sync` suffix methods for a synchronous API (though it will be much slower).\n\n## Creating Source Files\n\nUse the `Project#createSourceFile` method:\n\n```ts\nconst sourceFile = project.createSourceFile(\"MyClass.ts\", \"class MyClass {}\");\n```\n\n## Updating a Source File\n\nUse the `Project#updateSourceFile` method. This can be provided a file path and string for the text or a new `ts.SourceFile` object:\n\n```ts\nconst newSourceFile = project.updateSourceFile(\"MyClass.ts\", \"class MyClass {}\");\n// or\nproject.updateSourceFile(newSourceFileObj);\n```\n\n## Removing a Source File\n\nUse the `Project#removeSourceFile` method:\n\n```ts\nproject.removeSourceFile(\"MyClass.ts\");\n// or\nproject.removeSourceFile(sourceFile);\n```\n\n## Formatting Diagnostics\n\n```ts\nimport { createProject, ts } from \"@ts-morph/bootstrap\";\n\nconst project = await createProject({ useInMemoryFileSystem: true });\nproject.createSourceFile(\"test.ts\", \"const t: string = 5;\");\n\nconst program = project.createProgram();\nconst diagnostics = ts.getPreEmitDiagnostics(project.createProgram());\n\nconsole.log(project.formatDiagnosticsWithColorAndContext(diagnostics));\n```\n\n<!-- File: packages/common/readme.md (Tokens: ~38 | Category: plugin-manifest) -->\n# @ts-morph/common\n\nCommon functionality for [ts-morph](../ts-morph) and [@ts-morph/bootstrap](../bootstrap).\n\nPlease do not depend on this library!\n\n<!-- File: packages/ts-morph/readme.md (Tokens: ~1033 | Category: plugin-manifest) -->\n# <img src=\"logo.svg\" alt=\"ts-morph\" height=\"58\" />\n\n[![npm version](https://badge.fury.io/js/ts-morph.svg)](https://badge.fury.io/js/ts-morph)\n[![CI](https://github.com/dsherret/ts-morph/workflows/CI/badge.svg)](https://github.com/dsherret/ts-morph/actions?query=workflow%3ACI)\n[![stable](http://badges.github.io/stability-badges/dist/stable.svg)](http://github.com/badges/stability-badges)\n\n[TypeScript](https://github.com/Microsoft/TypeScript) Compiler API wrapper. Provides an easier way to programmatically navigate and manipulate TypeScript and JavaScript code.\n\nFormerly `ts-simple-ast`.\n\n## Overview\n\n- [Documentation](https://ts-morph.com/)\n- [Declaration file](https://github.com/dsherret/ts-morph/blob/latest/packages/ts-morph/lib/ts-morph.d.ts)\n\n## Main Features\n\n1. Wraps the compiler API objects to provide helper methods for getting information and programmatically changing files.\n2. Allows falling back to the compiler API objects if necessary (ex. `classDeclaration.compilerNode` or `typeChecker.compilerObject`).\n3. All changes are kept in memory (including file and directory moves) until specifying to save to the underlying file system.\n4. Changes are made to the text and wrapped nodes can be held on to between manipulations.\n\n## Getting Started\n\n1. [Installing](https://ts-morph.com/)\n2. [Instantiating](https://ts-morph.com/setup/)\n3. [Adding source files](https://ts-morph.com/setup/adding-source-files)\n4. [Getting source files](https://ts-morph.com/navigation/getting-source-files)\n5. [Navigating](https://ts-morph.com/navigation/example)\n6. [Manipulating](https://ts-morph.com/manipulation/)\n\n## Library Progress\n\nThis library is still under active development. Most common code manipulation/generation use cases are implemented, but there's still a lot of work to do. Please open an issue if you find a feature missing, bug, or question that isn't in the issue tracker.\n\n- [Breaking changes](https://github.com/dsherret/ts-morph/blob/latest/packages/ts-morph/breaking-changes.md)\n- [Change log](https://github.com/dsherret/ts-morph/blob/latest/packages/ts-morph/CHANGELOG.md)\n- [Wrapped nodes progress report](https://github.com/dsherret/ts-morph/blob/latest/packages/ts-morph/wrapped-nodes.md)\n\n## Example\n\n<!-- dprint-ignore -->\n```ts\nimport { Project, StructureKind } from \"ts-morph\";\n\n// initialize\nconst project = new Project({\n    // Optionally specify compiler options, tsconfig.json, in-memory file system, and more here.\n    // If you initialize with a tsconfig.json, then it will automatically populate the project\n    // with the associated source files.\n    // Read more: https://ts-morph.com/setup/\n});\n\n// add source files\nproject.addSourceFilesAtPaths(\"src/**/*.ts\");\nconst myClassFile = project.createSourceFile(\"src/MyClass.ts\", \"export class MyClass {}\");\nconst myEnumFile = project.createSourceFile(\"src/MyEnum.ts\", {\n    statements: [{\n        kind: StructureKind.Enum,\n        name: \"MyEnum\",\n        isExported: true,\n        members: [{ name: \"member\" }],\n    }],\n});\n\n// get information\nconst myClass = myClassFile.getClassOrThrow(\"MyClass\");\nmyClass.getName();          // returns: \"MyClass\"\nmyClass.hasExportKeyword(); // returns: true\nmyClass.isDefaultExport();  // returns: false\n\n// manipulate\nconst myInterface = myClassFile.addInterface({\n    name: \"IMyInterface\",\n    isExported: true,\n    properties: [{\n        name: \"myProp\",\n        type: \"number\",\n    }],\n});\n\nmyClass.rename(\"NewName\");\nmyClass.addImplements(myInterface.getName());\nmyClass.addProperty({\n    name: \"myProp\",\n    initializer: \"5\",\n});\n\nproject.getSourceFileOrThrow(\"src/ExistingFile.ts\").delete();\n\n// asynchronously save all the changes above\nawait project.save();\n\n// get underlying compiler node from the typescript AST from any node\nconst compilerNode = myClassFile.compilerNode;\n```\n\nOr navigate existing compiler nodes created with the TypeScript compiler (the `ts` named export is the TypeScript compiler):\n\n```ts ignore-error: 1109\nimport { createWrappedNode, ClassDeclaration, ts } from \"ts-morph\";\n\n// some code that creates a class declaration using the ts object\nconst classNode: ts.ClassDeclaration = ...;\n\n// create and use a wrapped node\nconst classDec = createWrappedNode(classNode) as ClassDeclaration;\nconst firstProperty = classDec.getProperties()[0];\n\n// ... do more stuff here ...\n```\n\n<!-- File: packages/ts-morph/scripts/readme.md (Tokens: ~22 | Category: plugin-manifest) -->\n# Scripts\n\nThis folder contains the code that verifies, manipulates, and generates code for ts-morph.\n\n<!-- File: packages/ts-morph/src/manipulation/readme.md (Tokens: ~70 | Category: plugin-manifest) -->\n# Manipulation\n\nIn this folder, most of the code is for changing the text and replacing an old tree with the new one.\n\nDirectory overview:\n\n- `manipulations` - Functions used to do a manipulations.\n- `textManipulations` - Classes used to manipulate text.\n- `nodeHandlers` - Classes to replace a tree.\n</yakaai_skills>"}