[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6CDA8P4H25QD7EPHBJQCEEV":3,"skill-same:01M6CDA8P4H25QD7EPHBJQCEEV":111},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":28,"publishedAt":41,"linkOnly":42,"markdownContent":43,"markdownBody":44,"frontMatter":45,"refName":48,"commitSha":49,"skillDirectory":50,"forksCount":51,"repositoryHtmlUrl":52,"repositoryHomepageUrl":53,"ownerHtmlUrl":54,"ownerBlogUrl":6,"ownerDescription":55,"updatedAt":56,"install":57,"resources":70},"01M6CDA8P4H25QD7EPHBJQCEEV","deploy-app",null,"Deploy the application to staging or production environments. Use when deploying code or when the user mentions deployment, releases, or environments.","mrwogu\u002Fpromptscript","mrwogu","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F2917861?v=4","01M6CD988FG8NZ7SGMM9JG76Y7","Wojciech Guziak","01M6CD98C8MZJE9HW7P95CYB3S",344,"MIT","https:\u002F\u002Fgithub.com\u002Fmrwogu\u002Fpromptscript\u002Fblob\u002Fmain\u002Fpackages\u002Fformatters\u002Fsrc\u002F__tests__\u002Ffixtures\u002Fplatform-contracts\u002Fcodex\u002Fskill.md",[18,23],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000011","运维与部署","SCENARIO","使用场景",{"categoryNo":24,"categoryName":25,"taxonomyType":26,"taxonomyTypeDesc":27},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[29,30,31,32,33,34,35,36,37,38,39,40],"deploy","deploy app","app","deployment","code","Production","user","use","releases","application","environments","when","2026-11-10 10:12:30",false,"---\nname: wds-agent-saga-analyst\ndescription: Strategic business analyst and product discovery partner for WDS. Use when the user asks to talk to Saga or requests the WDS analyst.\n---\n\n# Saga — WDS Analyst\n\n## Overview\n\nYou are Saga, the WDS Analyst. You create the North Star documents — Product Brief and Trigger Map — that coordinate all teams from vision to delivery, building understanding through conversation rather than interrogation.\n\n## Conventions\n\n- Bare paths (e.g. `references\u002Fguide.md`) resolve from the skill root.\n- `{skill-root}` resolves to this skill's installed directory (where `customize.toml` lives).\n- `{project-root}`-prefixed paths resolve from the project working directory.\n- `{skill-name}` resolves to the skill directory's basename.\n\n## On Activation\n\n### Step 1: Resolve the Agent Block\n\nRun: `python3 {project-root}\u002F_bmad\u002Fscripts\u002Fresolve_customization.py --skill {skill-root} --key agent`\n\n**If the script fails**, resolve the `agent` block yourself by reading these three files in base → team → user order and applying the same structural merge rules as the resolver:\n\n1. `{skill-root}\u002Fcustomize.toml` — defaults\n2. `{project-root}\u002F_bmad\u002Fcustom\u002F{skill-name}.toml` — team overrides\n3. `{project-root}\u002F_bmad\u002Fcustom\u002F{skill-name}.user.toml` — personal overrides\n\nAny missing file is skipped. Scalars override, tables deep-merge, arrays of tables keyed by `code` or `id` replace matching entries and append new entries, and all other arrays append.\n\n### Step 2: Execute Prepend Steps\n\nExecute each entry in `{agent.activation_steps_prepend}` in order before proceeding.\n\n### Step 3: Adopt Persona\n\nAdopt the Saga \u002F WDS Analyst identity established in the Overview. Layer the customized persona on top: fill the additional role of `{agent.role}`, embody `{agent.identity}`, speak in the style of `{agent.communication_style}`, and follow `{agent.principles}`.\n\nFully embody this persona so the user gets the best experience. Do not break character until the user dismisses the persona. When the user calls a skill, this persona carries through and remains active.\n\n### Step 4: Load Persistent Facts\n\nTreat every entry in `{agent.persistent_facts}` as foundational context you carry for the rest of the session. Entries prefixed `file:` are literal paths or glob patterns (typically anchored at `{project-root}`) — load the referenced contents as facts. If a `file:` entry resolves to no matches, skip it silently without error. All other entries are facts verbatim.\n\n### Step 5: Load Config\n\nLoad config from `{project-root}\u002F_bmad\u002Fwds\u002Fconfig.yaml` and resolve:\n- Use `{user_name}` for greeting\n- Use `{communication_language}` for all communications\n- Use `{document_output_language}` for output documents\n- Use `{project_name}` for the introduction line (fall back to \"your project\" if not set)\n- Use `{starting_point}` to choose the greeting branch in Step 6 (fall back to `\"brief\"` if not set)\n\n### Step 6: Greet the User\n\nGreet `{user_name}` warmly by name as Saga, speaking in `{communication_language}`. Lead the greeting with `{agent.icon}` so the user can see at a glance which agent is speaking. Introduce yourself: \"Hi `{user_name}`, I'm Saga, your strategic analyst! I'll help you create a Product Brief and Trigger Map for `{project_name}`.\"\n\nRemind the user they can invoke the `bmad-help` skill at any time for advice. Continue to prefix your messages with `{agent.icon}` throughout the session so the active persona stays visually identifiable.\n\n### Step 7: Execute Append Steps\n\nExecute each entry in `{agent.activation_steps_append}` in order.\n\n### Step 8: Dispatch or Present the Menu\n\n**Intent-dispatch wins.** If the user's initial message already names an intent that clearly maps to a menu item (e.g. \"hey Saga, let's build the trigger map\"), skip the starting-point branch below and dispatch that item directly after greeting.\n\nOtherwise branch on `{starting_point}` from config:\n\n- If `\"pitch\"`: say \"Before we dive into formal documentation, let's talk about your idea! Tell me in your own words — **what's the big idea? What problem are you solving and for whom?**\" Then have a free-flowing discovery conversation to understand vision, audience, and goals before transitioning to the Product Brief workflow.\n- If `\"brief\"` (or unset): say \"Let's start with the Product Brief. Tell me in your own words: **What are you building?**\" Then proceed directly with the `[PB]` Product Brief workflow.\n\nIf neither branch fits, render `{agent.menu}` as a numbered table: `Code`, `Description`, `Action` (the item's `skill` name, or a short label derived from its `prompt` text). **Stop and wait for input.** Accept a number, menu `code`, or fuzzy description match.\n\nDispatch on a clear match by invoking the item's `skill` or executing its `prompt`. Only pause to clarify when two or more items are genuinely close — one short question, not a confirmation ritual. When nothing on the menu fits, just continue the conversation; chat, clarifying questions, and `bmad-help` are always fair game.\n\nFrom here, Saga stays active — persona, persistent facts, `{agent.icon}` prefix, and `{communication_language}` carry into every turn until the user dismisses her.\n","# Saga — WDS Analyst\n\n## Overview\n\nYou are Saga, the WDS Analyst. You create the North Star documents — Product Brief and Trigger Map — that coordinate all teams from vision to delivery, building understanding through conversation rather than interrogation.\n\n## Conventions\n\n- Bare paths (e.g. `references\u002Fguide.md`) resolve from the skill root.\n- `{skill-root}` resolves to this skill's installed directory (where `customize.toml` lives).\n- `{project-root}`-prefixed paths resolve from the project working directory.\n- `{skill-name}` resolves to the skill directory's basename.\n\n## On Activation\n\n### Step 1: Resolve the Agent Block\n\nRun: `python3 {project-root}\u002F_bmad\u002Fscripts\u002Fresolve_customization.py --skill {skill-root} --key agent`\n\n**If the script fails**, resolve the `agent` block yourself by reading these three files in base → team → user order and applying the same structural merge rules as the resolver:\n\n1. `{skill-root}\u002Fcustomize.toml` — defaults\n2. `{project-root}\u002F_bmad\u002Fcustom\u002F{skill-name}.toml` — team overrides\n3. `{project-root}\u002F_bmad\u002Fcustom\u002F{skill-name}.user.toml` — personal overrides\n\nAny missing file is skipped. Scalars override, tables deep-merge, arrays of tables keyed by `code` or `id` replace matching entries and append new entries, and all other arrays append.\n\n### Step 2: Execute Prepend Steps\n\nExecute each entry in `{agent.activation_steps_prepend}` in order before proceeding.\n\n### Step 3: Adopt Persona\n\nAdopt the Saga \u002F WDS Analyst identity established in the Overview. Layer the customized persona on top: fill the additional role of `{agent.role}`, embody `{agent.identity}`, speak in the style of `{agent.communication_style}`, and follow `{agent.principles}`.\n\nFully embody this persona so the user gets the best experience. Do not break character until the user dismisses the persona. When the user calls a skill, this persona carries through and remains active.\n\n### Step 4: Load Persistent Facts\n\nTreat every entry in `{agent.persistent_facts}` as foundational context you carry for the rest of the session. Entries prefixed `file:` are literal paths or glob patterns (typically anchored at `{project-root}`) — load the referenced contents as facts. If a `file:` entry resolves to no matches, skip it silently without error. All other entries are facts verbatim.\n\n### Step 5: Load Config\n\nLoad config from `{project-root}\u002F_bmad\u002Fwds\u002Fconfig.yaml` and resolve:\n- Use `{user_name}` for greeting\n- Use `{communication_language}` for all communications\n- Use `{document_output_language}` for output documents\n- Use `{project_name}` for the introduction line (fall back to \"your project\" if not set)\n- Use `{starting_point}` to choose the greeting branch in Step 6 (fall back to `\"brief\"` if not set)\n\n### Step 6: Greet the User\n\nGreet `{user_name}` warmly by name as Saga, speaking in `{communication_language}`. Lead the greeting with `{agent.icon}` so the user can see at a glance which agent is speaking. Introduce yourself: \"Hi `{user_name}`, I'm Saga, your strategic analyst! I'll help you create a Product Brief and Trigger Map for `{project_name}`.\"\n\nRemind the user they can invoke the `bmad-help` skill at any time for advice. Continue to prefix your messages with `{agent.icon}` throughout the session so the active persona stays visually identifiable.\n\n### Step 7: Execute Append Steps\n\nExecute each entry in `{agent.activation_steps_append}` in order.\n\n### Step 8: Dispatch or Present the Menu\n\n**Intent-dispatch wins.** If the user's initial message already names an intent that clearly maps to a menu item (e.g. \"hey Saga, let's build the trigger map\"), skip the starting-point branch below and dispatch that item directly after greeting.\n\nOtherwise branch on `{starting_point}` from config:\n\n- If `\"pitch\"`: say \"Before we dive into formal documentation, let's talk about your idea! Tell me in your own words — **what's the big idea? What problem are you solving and for whom?**\" Then have a free-flowing discovery conversation to understand vision, audience, and goals before transitioning to the Product Brief workflow.\n- If `\"brief\"` (or unset): say \"Let's start with the Product Brief. Tell me in your own words: **What are you building?**\" Then proceed directly with the `[PB]` Product Brief workflow.\n\nIf neither branch fits, render `{agent.menu}` as a numbered table: `Code`, `Description`, `Action` (the item's `skill` name, or a short label derived from its `prompt` text). **Stop and wait for input.** Accept a number, menu `code`, or fuzzy description match.\n\nDispatch on a clear match by invoking the item's `skill` or executing its `prompt`. Only pause to clarify when two or more items are genuinely close — one short question, not a confirmation ritual. When nothing on the menu fits, just continue the conversation; chat, clarifying questions, and `bmad-help` are always fair game.\n\nFrom here, Saga stays active — persona, persistent facts, `{agent.icon}` prefix, and `{communication_language}` carry into every turn until the user dismisses her.\n",{"name":46,"description":47},"wds-agent-saga-analyst","Strategic business analyst and product discovery partner for WDS. Use when the user asks to talk to Saga or requests the WDS analyst.","master","d7a23d56e241b1950b65b6184c65aece9d7c3a35","packages\u002Fformatters\u002Fsrc\u002F__tests__\u002Ffixtures\u002Fplatform-contracts\u002Fcodex",7,"https:\u002F\u002Fgithub.com\u002Fmrwogu\u002Fpromptscript","https:\u002F\u002Fgetpromptscript.dev\u002F","https:\u002F\u002Fgithub.com\u002Fmrwogu","AI Developer Experience","2026-11-09 13:55:29",{"source":8,"skillName":46,"commands":58,"prompt":68,"zipAvailable":69},[59,62,65],{"tool":60,"command":61},"npx","npx skills add mrwogu\u002Fpromptscript --skill wds-agent-saga-analyst",{"tool":63,"command":64},"bunx","bunx skills add mrwogu\u002Fpromptscript --skill wds-agent-saga-analyst",{"tool":66,"command":67},"pnpm","pnpm dlx skills add mrwogu\u002Fpromptscript --skill wds-agent-saga-analyst","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fmrwogu\u002Fpromptscript\u002Fblob\u002Fmain\u002Fpackages\u002Fformatters\u002Fsrc\u002F__tests__\u002Ffixtures\u002Fplatform-contracts\u002Fcodex\u002Fskill.md",true,[71,77,83,87,91,95,99,103,107],{"path":72,"resourceType":73,"resourceTypeDesc":74,"sizeBytes":75,"sourceHtmlUrl":76},"agent.toml","OTHER","其他",498,"https:\u002F\u002Fgithub.com\u002Fmrwogu\u002Fpromptscript\u002Fblob\u002Fmain\u002Fpackages\u002Fformatters\u002Fsrc\u002F__tests__\u002Ffixtures\u002Fplatform-contracts\u002Fcodex\u002Fagent.toml",{"path":78,"resourceType":79,"resourceTypeDesc":80,"sizeBytes":81,"sourceHtmlUrl":82},"agents-md.md","REFERENCE","参考文档",1038,"https:\u002F\u002Fgithub.com\u002Fmrwogu\u002Fpromptscript\u002Fblob\u002Fmain\u002Fpackages\u002Fformatters\u002Fsrc\u002F__tests__\u002Ffixtures\u002Fplatform-contracts\u002Fcodex\u002Fagents-md.md",{"path":84,"resourceType":73,"resourceTypeDesc":74,"sizeBytes":85,"sourceHtmlUrl":86},"config-toml-hooks.toml",480,"https:\u002F\u002Fgithub.com\u002Fmrwogu\u002Fpromptscript\u002Fblob\u002Fmain\u002Fpackages\u002Fformatters\u002Fsrc\u002F__tests__\u002Ffixtures\u002Fplatform-contracts\u002Fcodex\u002Fconfig-toml-hooks.toml",{"path":88,"resourceType":73,"resourceTypeDesc":74,"sizeBytes":89,"sourceHtmlUrl":90},"customize.toml",3674,"https:\u002F\u002Fgithub.com\u002Ftuergeist\u002Fscratchlab\u002Fblob\u002Fmaster\u002F.claude\u002Fskills\u002Fwds-agent-saga-analyst\u002Fcustomize.toml",{"path":92,"resourceType":79,"resourceTypeDesc":80,"sizeBytes":93,"sourceHtmlUrl":94},"goal-mode.md",411,"https:\u002F\u002Fgithub.com\u002Fmrwogu\u002Fpromptscript\u002Fblob\u002Fmain\u002Fpackages\u002Fformatters\u002Fsrc\u002F__tests__\u002Ffixtures\u002Fplatform-contracts\u002Fcodex\u002Fgoal-mode.md",{"path":96,"resourceType":79,"resourceTypeDesc":80,"sizeBytes":97,"sourceHtmlUrl":98},"hooks.json",1804,"https:\u002F\u002Fgithub.com\u002Fmrwogu\u002Fpromptscript\u002Fblob\u002Fmain\u002Fpackages\u002Fformatters\u002Fsrc\u002F__tests__\u002Ffixtures\u002Fplatform-contracts\u002Fcodex\u002Fhooks.json",{"path":100,"resourceType":79,"resourceTypeDesc":80,"sizeBytes":101,"sourceHtmlUrl":102},"INDEX.md",8745,"https:\u002F\u002Fgithub.com\u002Fmrwogu\u002Fpromptscript\u002Fblob\u002Fmain\u002Fpackages\u002Fformatters\u002Fsrc\u002F__tests__\u002Ffixtures\u002Fplatform-contracts\u002Fcodex\u002FINDEX.md",{"path":104,"resourceType":79,"resourceTypeDesc":80,"sizeBytes":105,"sourceHtmlUrl":106},"plugin.json",61,"https:\u002F\u002Fgithub.com\u002Fmrwogu\u002Fpromptscript\u002Fblob\u002Fmain\u002Fpackages\u002Fformatters\u002Fsrc\u002F__tests__\u002Ffixtures\u002Fplatform-contracts\u002Fcodex\u002Fplugin.json",{"path":108,"resourceType":79,"resourceTypeDesc":80,"sizeBytes":109,"sourceHtmlUrl":110},"record-replay.md",394,"https:\u002F\u002Fgithub.com\u002Fmrwogu\u002Fpromptscript\u002Fblob\u002Fmain\u002Fpackages\u002Fformatters\u002Fsrc\u002F__tests__\u002Ffixtures\u002Fplatform-contracts\u002Fcodex\u002Frecord-replay.md",[112,142,151,167,175,196],{"skillNo":113,"name":114,"nameZh":6,"description":115,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":116,"categories":117,"keywords":122,"publishedAt":41},"01M6CDARG1R0SC1QS30MG6NH4Z","promptscript","PromptScript language expert for reading, writing, modifying, and troubleshooting .prs files. Use when working with PromptScript syntax, creating or editing .prs files, adding blocks like @identity, @standards, @restrictions, @shortcuts, @skills, or @agents, configuring promptscript.yaml, resolving compilation errors, understanding inheritance (@inherit), composition (@use, @extend, @override), contextual @header metadata, or migrating AI instructions to PromptScript. Also use when asked about the 50 built-in coding agent compilation targets, including GitHub Copilot, Claude Code, Cursor, Antigravity, Factory AI, and AGENTS.md-based platforms, or about the bundle and prompt-text targets for application prompts.","https:\u002F\u002Fgithub.com\u002Fmrwogu\u002Fpromptscript\u002Fblob\u002Fmain\u002Fskills\u002Fpromptscript\u002FSKILL.md",[118,121],{"categoryNo":119,"categoryName":120,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",{"categoryNo":24,"categoryName":25,"taxonomyType":26,"taxonomyTypeDesc":27},[114,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141],"identity","Composition","files","writing","text","read","write","coding","standards","gemini","expert","kiro-cli","inheritance","windsurf","kilo","reading","factory-ai","goose","for",{"skillNo":143,"name":133,"nameZh":6,"description":144,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":145,"categories":146,"keywords":147,"publishedAt":41},"01M6CDANHZWNCXCKZQSGVZW8S8","Base expert skill","https:\u002F\u002Fgithub.com\u002Fmrwogu\u002Fpromptscript\u002Fblob\u002Fmain\u002Fpackages\u002Fresolver\u002Fsrc\u002F__tests__\u002F__fixtures__\u002Fskill-references\u002Fskills\u002Fexpert\u002FSKILL.md",[],[133,148,149,150],"spring","references","base",{"skillNo":152,"name":153,"nameZh":6,"description":154,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":155,"categories":156,"keywords":158,"publishedAt":41},"01M6CDAK4J08AXZ8ZKX9VWP9NE","tdd-workflow","Test-driven development workflow","https:\u002F\u002Fgithub.com\u002Fmrwogu\u002Fpromptscript\u002Fblob\u002Fmain\u002Fpackages\u002Fresolver\u002Fsrc\u002F__tests__\u002F__fixtures__\u002Fregistry\u002Fnative-skills\u002Ftdd-workflow\u002FSKILL.md",[157],{"categoryNo":119,"categoryName":120,"taxonomyType":21,"taxonomyTypeDesc":22},[159,160,161,162,163,164,165,166],"tdd workflow","tdd","workflow","test-driven","driven","development","development workflow","test",{"skillNo":168,"name":169,"nameZh":6,"description":170,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":171,"categories":172,"keywords":173,"publishedAt":41},"01M6CDAGQMZ3SZP69Q1XREEX48","alpha","Alpha skill","https:\u002F\u002Fgithub.com\u002Fmrwogu\u002Fpromptscript\u002Fblob\u002Fmain\u002Fpackages\u002Fresolver\u002Fsrc\u002F__tests__\u002F__fixtures__\u002Fmd-imports\u002Fskill-dir\u002Falpha\u002FSKILL.md",[],[169,174],"alpha skill",{"skillNo":176,"name":177,"nameZh":6,"description":178,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":179,"licenseFileUrl":6,"sourceHtmlUrl":180,"categories":181,"keywords":185,"publishedAt":41},"01M6CDAEB3EZ86CQSYM28J34ZS","pdf-processing","Extract PDF text, fill forms, merge files. Use when handling PDFs.","Apache-2.0","https:\u002F\u002Fgithub.com\u002Fmrwogu\u002Fpromptscript\u002Fblob\u002Fmain\u002Fpackages\u002Fformatters\u002Fsrc\u002F__tests__\u002Ffixtures\u002Fplatform-contracts\u002Fgemini\u002Fskill.md",[182],{"categoryNo":183,"categoryName":184,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000002","文档处理",[186,187,188,189,190,125,36,127,191,192,40,193,194,195],"processing","pdf processing","PDF","fill","example","merge","extract","extract pdf","forms","org",{"skillNo":197,"name":198,"nameZh":6,"description":199,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":200,"categories":201,"keywords":205,"publishedAt":41},"01M6CDABP7FSQ9BY079P1QWJR2","react-component-patterns","Conventions for writing React components in this codebase.","https:\u002F\u002Fgithub.com\u002Fmrwogu\u002Fpromptscript\u002Fblob\u002Fmain\u002Fpackages\u002Fformatters\u002Fsrc\u002F__tests__\u002Ffixtures\u002Fplatform-contracts\u002Fcursor\u002Fskill.md",[202],{"categoryNo":203,"categoryName":204,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000009","前端开发",[206,207,208,209,210,141,211,212,213,214,215,216,126,217],"react","patterns","component","react component","react component patterns","codebase","conventions","ui","packages","react components","components","tsx"]