[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-jetbrains-youtrack-apps-skill":3,"mdc-f00nbc-key":34,"related-org-jetbrains-youtrack-apps-skill":2097,"related-repo-jetbrains-youtrack-apps-skill":2230},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":23,"repoUrl":24,"updatedAt":25,"license":26,"forks":27,"topics":28,"repo":29,"sourceUrl":32,"mdContent":33},"youtrack-apps-skill","build and manage YouTrack apps","Guides building, debugging, extending, and managing JetBrains YouTrack apps and workflows. Used when scaffolding, modifying, validating, uploading, downloading, enabling, disabling, or inspecting a YouTrack app, workflow rule, app endpoint, or manifest.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},"jetbrains","JetBrains","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fjetbrains.png",[12,14,17,20],{"name":9,"slug":8,"type":13},"tag",{"name":15,"slug":16,"type":13},"Automation","automation",{"name":18,"slug":19,"type":13},"Project Management","project-management",{"name":21,"slug":22,"type":13},"API Development","api-development",17,"https:\u002F\u002Fgithub.com\u002FJetBrains\u002Fyoutrack-apps","2026-08-15T03:47:37.429794",null,16,[],{"repoUrl":24,"stars":23,"forks":27,"topics":30,"description":31},[],"YouTrack Apps by JetBrains and related utilities","https:\u002F\u002Fgithub.com\u002FJetBrains\u002Fyoutrack-apps\u002Ftree\u002FHEAD\u002Fskills\u002Fyoutrack-apps-skill","---\nname: youtrack-apps-skill\ndescription: Guides building, debugging, extending, and managing JetBrains YouTrack apps and workflows. Used when scaffolding, modifying, validating, uploading, downloading, enabling, disabling, or inspecting a YouTrack app, workflow rule, app endpoint, or manifest.\nmetadata:\n  version: 1.0.0\n  YouTrackVersion: 2026.2.18243\n---\n\n# YouTrack App Builder\n\n# Required Environment\n\nVerify these requirements once near the start of the session before using this skill for YouTrack app work.\n\n| Requirement | How to verify |\n| --- | --- |\n| Node.js `>= 20.18.0` | Run `node --version`. Node is required because both scaffolding and app management run through Node-based CLIs and npm scripts. |\n| npm | Run `npm --version`. Use the version bundled with Node.js `>= 24`, unless the app project declares a stricter version. |\n| npx | Run `npx --version`. Use the version bundled with npm, unless the app project declares a stricter version. |\n| `create-youtrack-app` CLI | Run `create-youtrack-app --help`. If missing, read [references\u002Fcli-setup.md](references\u002Fcli-setup.md). |\n| `youtrack-app` CLI | Run `youtrack-app --help`. If missing, read [references\u002Fcli-setup.md](references\u002Fcli-setup.md). Commands that contact YouTrack also require a target host (`YOUTRACK_HOST`) and API token (`YOUTRACK_API_TOKEN`). If token variables are not in environment then read the article on how to obtain the token and instruct the user: [Manage Permanent Tokens](https:\u002F\u002Fwww.jetbrains.com\u002Fhelp\u002Fyoutrack\u002Fserver\u002Fmanage-permanent-token.html#obtain-permanent-token). Never print token values. |\n\nIf required tooling is missing and cannot be installed in the current environment, ask the\nuser before continuing with a reduced local-only workflow.\n\n# Mandatory Operating Steps\n\nWhen this skill is loaded, always follow this [PROTOCOL](.\u002Freferences\u002Foperating-steps.md) in order for every YouTrack app task.\nDo not skip, reorder, or silently complete steps.\n\nFor any task that involves code generation, file modification, app management commands, validation, deployment, or YouTrack instance inspection, maintain this checklist internally and expose the PLAN before acting. \n\n# App Type Selection\nUse this distinction when initializing a new app, adding generated modules, or deciding which file layout and build\nscripts to follow in an existing app. The generator exposes this choice as `--type js` and `--type ts`; feature commands\ninfer the app type from the existing project.\n\nTypeScript app (`--type ts`) means a TypeScript app with Enhanced DX such as: file-based backend routing, generated API types, typed widget client code, dev validation, watch upload, or frontend hot reload. Enhanced DX improves the developer experience.\n\nJavaScript app (`--type js`) means a basic JavaScript app. Use it for simple JavaScript workflows or automations, when\nthe existing app is already JavaScript, or when the user wants a minimal JavaScript project without Enhanced DX.\n\nFor a new app, ask which type the user wants before scaffolding. For an existing app, follow the current project\nstructure and do not mix JavaScript app and TypeScript app patterns unless the user explicitly asks to migrate or\nrecreate the app.\n\n# App Management\nUse the CLIs according to the task:\n- `create-youtrack-app` creates app source files and adds modules to a local project.\n- `youtrack-app` manages installed apps and instance data in YouTrack.\n\nBefore running a command, confirm only the inputs that matter for that command: local directory, target app, project short\nname, YouTrack host\u002Ftoken, and output format.\n\n## Command Discovery\n\nRun either CLI with `--help` before using an unfamiliar command; the installed CLI is the source of truth. Keep these\ncommand families in mind when exploring a request:\n\n- `create-youtrack-app`: `app init`, `rule add`, `http-handler add`, `settings init|add`,\n  `extension-property add`, and `widget add`.\n- `youtrack-app`: app lifecycle\u002Fconfiguration (`upload`, `download`, `validate`, `list`, `info`, `scripts`, settings,\n  enablement, logs, and requirement errors); instance exploration (`project`, `field`, `tag`, `group`, and `user`);\n  and `rest request` for an authenticated raw REST call. Use `--json` or `--yaml` when structured output helps.\n\n## YouTrack App CLI\nUse `youtrack-app --help` for current commands and options.\n\nUse `youtrack-app` for installed app and instance operations: validate or upload a local build, download an installed app,\nlist\u002Fsearch\u002Finspect apps, read scripts, configure settings, enable\u002Fdisable or attach\u002Fdetach apps, check requirement\nerrors, read logs, inspect projects, fields, users, groups, or tags, and make an authenticated raw REST request.\n\nDo not use it to scaffold new source files.\n\n### REST Requests for Exploration and Testing\n\nUse `youtrack-app rest request` for a relative YouTrack REST path. It uses the configured host\u002Ftoken; inspect first and\nmake state-changing calls only when requested. For an app HTTP handler, call its published URL, for example:\n\n```bash\nyoutrack-app rest request \\\n  --path \"\u002Fapi\u002FextensionEndpoints\u002F\u003Capp>\u002F\u003Chandler>\u002F\u003Cendpoint>\" \\\n  --method POST --header \"Content-Type:application\u002Fjson\" --body '{\"event\":\"ping\"}'\n```\n\nThat example is for a global handler. Use the scoped URL shapes in\n[HTTP Handler](references\u002Fscript-types.md#routing-and-authoring) for issue, article, project, or user handlers.\n\nTo invoke an installed action rule, submit its `command` with raw REST issue IDs (not `DEMO-123`):\n\n```bash\nyoutrack-app rest request --path \"\u002Fapi\u002Fcommands\" --method POST \\\n  --body '{\"query\":\"request-qa-review\",\"issues\":[{\"id\":\"2-123\"}]}'\n```\n\n# Project and Module Scaffolding CLI\n\n## Create YouTrack App CLI\n\nUse `create-youtrack-app --help` for current generator commands and options.\n\nUse `create-youtrack-app` to create a new app project or add local modules: workflow rules, HTTP handlers, settings,\nextension properties and widgets.\nAfter scaffolding, review generated files, manifest wiring, requirements, and the relevant script type reference before\nediting or deploying.\n\n## Deploying App\nDeploying means validating and uploading the local app build to a target YouTrack instance. It creates or updates the\ninstalled app whose package name is `manifest.json` `name`.\n\nDeployment does not publish to Marketplace. It only changes the app installed in the configured YouTrack site.\n\nAfter deployment, you can verify the installed app via `youtrack-app` CLI:\n- Check `info` and `requirement-errors`.\n- Configure settings or project attachment\u002Fenabled state when needed.\n- Check app logs or script logs while testing behavior.\n\n# Manifest\nUse for app identity which is `name` and package metadata like  `title`, `description`, `vendor`, `version`. Also use it\nwhen widgets must be declared.\nLoad for all fields: [references\u002Fmanifest.md](references\u002Fmanifest.md)\n\n# Frontend\nUse frontend for React widget implementation: component files, Ring UI, host registration, widget-to-backend calls,\nfrontend build order, and UI dev loops. A YouTrack app frontend is one or more widgets rendered inside a live YouTrack\ninstance at declared extension points. \nLoad for frontend implementation: [references\u002Ffrontend.md](references\u002Ffrontend.md)\n\n## Widgets\nA widget is a custom object that you can embed in one of the dedicated extension points in the YouTrack UI. Widget is not a standalone SPA: no client router, no owned `ReactDOM.render`, and no localhost-only render.\nLoad for widget configuration: [references\u002Fwidgets.md](references\u002Fwidgets.md)\n\n## Host API\nUse for information on how to wire widgets to backend, or how to wire widgets with YouTrack. Load [references\u002Fhost-api.md](.\u002Freferences\u002Fhost-api.md )\n\n# Rules\nUse rules for YouTrack automation that runs from issue\u002Farticle changes, explicit user commands, schedules, or\nconstrained lifecycle transitions.\n\n## On-Change Rule\nUse when logic should run automatically as an issue or article is created, edited, reported, removed, or has a relevant\nfield\u002Flink changed. Best for save-time validation and reactive side effects that must happen in the same transaction.\nLoad after selecting this script type and before\ncodegen: [references\u002Fscript-types.md#on-change-rule](references\u002Fscript-types.md#on-change-rule)\n\n## Action Rule\nUse when the user explicitly invokes behavior from a command, button, menu item, or bulk action. Best when the user\ncontrols when the behavior runs, or when runtime `userInput` is required.\nLoad after selecting this script type and before\ncodegen: [references\u002Fscript-types.md#action-rule](references\u002Fscript-types.md#action-rule)\n\n## On-Schedule Rule\nUse for periodic background work over issues selected by a YouTrack search query. Best for maintenance, reminders,\nescalations, cleanup, and recurring notifications that should not run during a save transaction.\nLoad after selecting this script type and before\ncodegen: [references\u002Fscript-types.md#on-schedule-rule](references\u002Fscript-types.md#on-schedule-rule)\n\n## State-Machine Rule\nUse when one issue field must follow a constrained lifecycle with named states, allowed transitions, guards, actions,\nand optional timers. Best when free-form field edits should be replaced by an explicit transition graph.\nLoad after selecting this script type and before\ncodegen: [references\u002Fscript-types.md#state-machine-rule](references\u002Fscript-types.md#state-machine-rule)\n\n## SLA Rule\nUse to define the set of time goals for tickets in a helpdesk project.\nLoad after selecting this script type and before\ncodegen: [references\u002Fscript-types.md#sla-rule](references\u002Fscript-types.md#sla-rule)\n\n# Custom API Endpoints\nUse endpoints when the app exposes callable backend behavior rather than workflow automation.\n\n## HTTP Handler\nUse for app-defined HTTP endpoints: webhook receivers, integration callbacks, health checks, or small APIs exposed by\nthe app.\n\nLoad after selecting this script type and before\ncodegen: [references\u002Fscript-types.md#http-handler](references\u002Fscript-types.md#http-handler)\n\n## MCP Tools\nUse when the app exposes a callable tool for YouTrack AI or an assistant runtime. Best for narrow, well-described\noperations with structured inputs and outputs where the tool description controls when the AI calls it.\n\nLoad after selecting this script type and before\ncodegen: [references\u002Fscript-types.md#mcp-tool](references\u002Fscript-types.md#mcp-tool)\n\n# Guidelines\nUse guidelines as a must when writing code for any app type.\n\n## UI Styles\nAlways load this for rules on what to do when styling widgets. \n[references\u002Fguidelines\u002Fstyles.md](references\u002Fguidelines\u002Fstyles.md)\n\n## Code style\n- In generated backend JavaScript\u002FTypeScript, prefer arrow functions (`(ctx) => { ... }`) for callbacks, handlers,\n  predicates, and local helper expressions. Use `function` declarations only for named helpers.\n\n## JS API usage\n- You need to verify every part code against the `API Reference` files. Give special notice to entity properties and\n  methods.\n- Never put issue link types into requirements section for any chosen script type.\n- For every entity property or method validate the reference file. Only listed reference files are allowed.\n- Never compare whole objects, always compare by name, login, key, id or similar.\n- Issue IDs are different in the JS API and the native YouTrack REST API:\n  - In the YouTrack JS API, use `Issue.id`. It is the readable issue ID, for example `DEMO-123`. There is no `Issue.idReadable`\n    property in the JS API.\n  - In the native YouTrack REST API, response and request body `id` values are raw IDs, for example `2-123` and there is an `idReadable` field.\n\n## Logging\nUse when deciding whether to log, what level\u002Fdetail to log, and how to keep logs useful without exposing sensitive data.\nLoad when relevant before codegen: [references\u002Fguidelines\u002Flogging.md](references\u002Fguidelines\u002Flogging.md)\n\n# API Reference\nThis is the main ground truth for the YouTrack JavaScript API. When a script type reference lists API areas, resolve them\nhere before writing code.\n\n## Search guidance\n\nBefore opening large reference files, search for the exact type, property, method, function, or concept first, then open\naround the matching lines. Useful patterns:\n\n```bash\n# Find high-value entity sections and common entity members.\nrg -n \"^### (Issue|Project|User|Set)$|^##### (fields|isVisibleTo|findByExtensionProperties)$\" references\u002Fapi\u002Fentities.md\n\n# Find settings, extension properties, persistence lookup, and async invocation usage across references.\nrg -n \"ctx\\\\.settings|extensionProperties|findByExtensionProperties|invokeAsync\" references\n\n# Replace placeholders with the exact API symbol to locate its module documentation.\nrg -n \"functionName|methodName|propertyName\" references\u002Fapi\n```\n\n## Important concepts\n- Async functions: [references\u002Fapi\u002Fasync-functions.md](references\u002Fapi\u002Fasync-functions.md). Load when working with\n  deferred work. Contains the mental model, usage points, structure, constraints, prerequisites, and examples.\n- [Set](references\u002Fapi\u002Fentities.md#set): Load when working with iteration over entities. YouTrack uses custom sets (not js sets)\n  for multi-value collections. Contains properties, methods, and explanations.\n- Requirements: [requirements](references\u002Fapi\u002Fentities.md#requirements). Load when you need to make sure\n  entities exist in the YouTrack instance, or when code needs to retrieve required entities through `ctx`.\n- Context: [references\u002Fapi\u002Fctx.md](references\u002Fapi\u002Fctx.md). Load when you need information about what is the `ctx` object\n  and what it consist of.\n\n## App persistence and settings\n- App Settings: [references\u002Fapp-persistance.md#app-settings](references\u002Fapp-persistance.md#app-settings). Expose user-facing settings in the YouTrack admin UI\n  for system and project administrators to configure the app. These settings are accessible from app code through\n  `ctx.settings`. Load for information on required variables, scopes, lifecycle and structure.\n- Extension Properties: [references\u002Fapp-persistance.md#extension-properties](references\u002Fapp-persistance.md#extension-properties). Load when the app\n  needs app-owned persistent state, `entity-extensions.json`, `extensionProperties`, or `ctx.globalStorage`.\n\n## Reading the API modules\n\nThe files in `references\u002Fapi\u002F` are the ground truth for module imports, top-level functions, and type details. Start with the module file, then follow its `Types` links for detail pages that list constructors, properties, methods, parameters, return values, and examples when available.\n\n- Constructors: use entries under `## Constructors` as `new TypeName(args)` when the API explicitly documents a constructor.\n- Properties: use entries under `## Properties` as `object.property`; check the listed type and whether the text says the value is readonly. Also, property is optional if the properety description says so.\n- Methods: use entries under `## Methods` as `object.method(args)`; follow the parameter list and return text on that method.\n- Functions: use entries under module `## Functions` after importing the module, for example `const workflow = require('@jetbrains\u002Fyoutrack-scripting-api\u002Fworkflow'); workflow.functionName(args);`.\n- Types: use module `## Types` links to open the detailed page for entity objects, helper objects, and schemas.\n\n### API Modules\n\n| API area | Ground-truth file | Runtime import in app code |\n| --- | --- | --- |\n| `date-time` | [.\u002Freferences\u002Fapi\u002Fdate-time.md](.\u002Freferences\u002Fapi\u002Fdate-time.md) | `require('@jetbrains\u002Fyoutrack-scripting-api\u002Fdate-time')` |\n| `entities` | [.\u002Freferences\u002Fapi\u002Fentities.md](.\u002Freferences\u002Fapi\u002Fentities.md) | `require('@jetbrains\u002Fyoutrack-scripting-api\u002Fentities')` |\n| `http` | [.\u002Freferences\u002Fapi\u002Fhttp.md](.\u002Freferences\u002Fapi\u002Fhttp.md) | `require('@jetbrains\u002Fyoutrack-scripting-api\u002Fhttp')` |\n| `license` | [.\u002Freferences\u002Fapi\u002Flicense.md](.\u002Freferences\u002Fapi\u002Flicense.md) | `require('@jetbrains\u002Fyoutrack-scripting-api\u002Flicense')` |\n| `notifications` | [.\u002Freferences\u002Fapi\u002Fnotifications.md](.\u002Freferences\u002Fapi\u002Fnotifications.md) | `require('@jetbrains\u002Fyoutrack-scripting-api\u002Fnotifications')` |\n| `search` | [.\u002Freferences\u002Fapi\u002Fsearch.md](.\u002Freferences\u002Fapi\u002Fsearch.md) | `require('@jetbrains\u002Fyoutrack-scripting-api\u002Fsearch')` |\n| `strings` | [.\u002Freferences\u002Fapi\u002Fstrings.md](.\u002Freferences\u002Fapi\u002Fstrings.md) | `require('@jetbrains\u002Fyoutrack-scripting-api\u002Fstrings')` |\n| `workflow` | [.\u002Freferences\u002Fapi\u002Fworkflow.md](.\u002Freferences\u002Fapi\u002Fworkflow.md) | `require('@jetbrains\u002Fyoutrack-scripting-api\u002Fworkflow')` |\n",{"data":35,"body":39},{"name":4,"description":6,"metadata":36},{"version":37,"YouTrackVersion":38},"1.0.0","2026.2.18243",{"type":40,"children":41},"root",[42,51,57,63,257,262,268,281,286,292,313,325,337,342,348,353,378,383,390,403,573,579,591,602,607,614,626,746,759,780,854,860,866,877,888,894,914,919,931,962,968,1014,1020,1030,1036,1054,1060,1071,1077,1082,1088,1098,1104,1122,1128,1138,1144,1154,1160,1170,1176,1181,1186,1191,1201,1207,1212,1221,1227,1232,1238,1248,1254,1278,1284,1380,1386,1396,1401,1406,1412,1417,1569,1575,1639,1645,1702,1708,1729,1826,1832,2091],{"type":43,"tag":44,"props":45,"children":47},"element","h1",{"id":46},"youtrack-app-builder",[48],{"type":49,"value":50},"text","YouTrack App Builder",{"type":43,"tag":44,"props":52,"children":54},{"id":53},"required-environment",[55],{"type":49,"value":56},"Required Environment",{"type":43,"tag":58,"props":59,"children":60},"p",{},[61],{"type":49,"value":62},"Verify these requirements once near the start of the session before using this skill for YouTrack app work.",{"type":43,"tag":64,"props":65,"children":66},"table",{},[67,86],{"type":43,"tag":68,"props":69,"children":70},"thead",{},[71],{"type":43,"tag":72,"props":73,"children":74},"tr",{},[75,81],{"type":43,"tag":76,"props":77,"children":78},"th",{},[79],{"type":49,"value":80},"Requirement",{"type":43,"tag":76,"props":82,"children":83},{},[84],{"type":49,"value":85},"How to verify",{"type":43,"tag":87,"props":88,"children":89},"tbody",{},[90,119,147,167,201],{"type":43,"tag":72,"props":91,"children":92},{},[93,106],{"type":43,"tag":94,"props":95,"children":96},"td",{},[97,99],{"type":49,"value":98},"Node.js ",{"type":43,"tag":100,"props":101,"children":103},"code",{"className":102},[],[104],{"type":49,"value":105},">= 20.18.0",{"type":43,"tag":94,"props":107,"children":108},{},[109,111,117],{"type":49,"value":110},"Run ",{"type":43,"tag":100,"props":112,"children":114},{"className":113},[],[115],{"type":49,"value":116},"node --version",{"type":49,"value":118},". Node is required because both scaffolding and app management run through Node-based CLIs and npm scripts.",{"type":43,"tag":72,"props":120,"children":121},{},[122,127],{"type":43,"tag":94,"props":123,"children":124},{},[125],{"type":49,"value":126},"npm",{"type":43,"tag":94,"props":128,"children":129},{},[130,131,137,139,145],{"type":49,"value":110},{"type":43,"tag":100,"props":132,"children":134},{"className":133},[],[135],{"type":49,"value":136},"npm --version",{"type":49,"value":138},". Use the version bundled with Node.js ",{"type":43,"tag":100,"props":140,"children":142},{"className":141},[],[143],{"type":49,"value":144},">= 24",{"type":49,"value":146},", unless the app project declares a stricter version.",{"type":43,"tag":72,"props":148,"children":149},{},[150,155],{"type":43,"tag":94,"props":151,"children":152},{},[153],{"type":49,"value":154},"npx",{"type":43,"tag":94,"props":156,"children":157},{},[158,159,165],{"type":49,"value":110},{"type":43,"tag":100,"props":160,"children":162},{"className":161},[],[163],{"type":49,"value":164},"npx --version",{"type":49,"value":166},". Use the version bundled with npm, unless the app project declares a stricter version.",{"type":43,"tag":72,"props":168,"children":169},{},[170,181],{"type":43,"tag":94,"props":171,"children":172},{},[173,179],{"type":43,"tag":100,"props":174,"children":176},{"className":175},[],[177],{"type":49,"value":178},"create-youtrack-app",{"type":49,"value":180}," CLI",{"type":43,"tag":94,"props":182,"children":183},{},[184,185,191,193,199],{"type":49,"value":110},{"type":43,"tag":100,"props":186,"children":188},{"className":187},[],[189],{"type":49,"value":190},"create-youtrack-app --help",{"type":49,"value":192},". If missing, read ",{"type":43,"tag":194,"props":195,"children":197},"a",{"href":196},"references\u002Fcli-setup.md",[198],{"type":49,"value":196},{"type":49,"value":200},".",{"type":43,"tag":72,"props":202,"children":203},{},[204,214],{"type":43,"tag":94,"props":205,"children":206},{},[207,213],{"type":43,"tag":100,"props":208,"children":210},{"className":209},[],[211],{"type":49,"value":212},"youtrack-app",{"type":49,"value":180},{"type":43,"tag":94,"props":215,"children":216},{},[217,218,224,225,229,231,237,239,245,247,255],{"type":49,"value":110},{"type":43,"tag":100,"props":219,"children":221},{"className":220},[],[222],{"type":49,"value":223},"youtrack-app --help",{"type":49,"value":192},{"type":43,"tag":194,"props":226,"children":227},{"href":196},[228],{"type":49,"value":196},{"type":49,"value":230},". Commands that contact YouTrack also require a target host (",{"type":43,"tag":100,"props":232,"children":234},{"className":233},[],[235],{"type":49,"value":236},"YOUTRACK_HOST",{"type":49,"value":238},") and API token (",{"type":43,"tag":100,"props":240,"children":242},{"className":241},[],[243],{"type":49,"value":244},"YOUTRACK_API_TOKEN",{"type":49,"value":246},"). If token variables are not in environment then read the article on how to obtain the token and instruct the user: ",{"type":43,"tag":194,"props":248,"children":252},{"href":249,"rel":250},"https:\u002F\u002Fwww.jetbrains.com\u002Fhelp\u002Fyoutrack\u002Fserver\u002Fmanage-permanent-token.html#obtain-permanent-token",[251],"nofollow",[253],{"type":49,"value":254},"Manage Permanent Tokens",{"type":49,"value":256},". Never print token values.",{"type":43,"tag":58,"props":258,"children":259},{},[260],{"type":49,"value":261},"If required tooling is missing and cannot be installed in the current environment, ask the\nuser before continuing with a reduced local-only workflow.",{"type":43,"tag":44,"props":263,"children":265},{"id":264},"mandatory-operating-steps",[266],{"type":49,"value":267},"Mandatory Operating Steps",{"type":43,"tag":58,"props":269,"children":270},{},[271,273,279],{"type":49,"value":272},"When this skill is loaded, always follow this ",{"type":43,"tag":194,"props":274,"children":276},{"href":275},".\u002Freferences\u002Foperating-steps.md",[277],{"type":49,"value":278},"PROTOCOL",{"type":49,"value":280}," in order for every YouTrack app task.\nDo not skip, reorder, or silently complete steps.",{"type":43,"tag":58,"props":282,"children":283},{},[284],{"type":49,"value":285},"For any task that involves code generation, file modification, app management commands, validation, deployment, or YouTrack instance inspection, maintain this checklist internally and expose the PLAN before acting.",{"type":43,"tag":44,"props":287,"children":289},{"id":288},"app-type-selection",[290],{"type":49,"value":291},"App Type Selection",{"type":43,"tag":58,"props":293,"children":294},{},[295,297,303,305,311],{"type":49,"value":296},"Use this distinction when initializing a new app, adding generated modules, or deciding which file layout and build\nscripts to follow in an existing app. The generator exposes this choice as ",{"type":43,"tag":100,"props":298,"children":300},{"className":299},[],[301],{"type":49,"value":302},"--type js",{"type":49,"value":304}," and ",{"type":43,"tag":100,"props":306,"children":308},{"className":307},[],[309],{"type":49,"value":310},"--type ts",{"type":49,"value":312},"; feature commands\ninfer the app type from the existing project.",{"type":43,"tag":58,"props":314,"children":315},{},[316,318,323],{"type":49,"value":317},"TypeScript app (",{"type":43,"tag":100,"props":319,"children":321},{"className":320},[],[322],{"type":49,"value":310},{"type":49,"value":324},") means a TypeScript app with Enhanced DX such as: file-based backend routing, generated API types, typed widget client code, dev validation, watch upload, or frontend hot reload. Enhanced DX improves the developer experience.",{"type":43,"tag":58,"props":326,"children":327},{},[328,330,335],{"type":49,"value":329},"JavaScript app (",{"type":43,"tag":100,"props":331,"children":333},{"className":332},[],[334],{"type":49,"value":302},{"type":49,"value":336},") means a basic JavaScript app. Use it for simple JavaScript workflows or automations, when\nthe existing app is already JavaScript, or when the user wants a minimal JavaScript project without Enhanced DX.",{"type":43,"tag":58,"props":338,"children":339},{},[340],{"type":49,"value":341},"For a new app, ask which type the user wants before scaffolding. For an existing app, follow the current project\nstructure and do not mix JavaScript app and TypeScript app patterns unless the user explicitly asks to migrate or\nrecreate the app.",{"type":43,"tag":44,"props":343,"children":345},{"id":344},"app-management",[346],{"type":49,"value":347},"App Management",{"type":43,"tag":58,"props":349,"children":350},{},[351],{"type":49,"value":352},"Use the CLIs according to the task:",{"type":43,"tag":354,"props":355,"children":356},"ul",{},[357,368],{"type":43,"tag":358,"props":359,"children":360},"li",{},[361,366],{"type":43,"tag":100,"props":362,"children":364},{"className":363},[],[365],{"type":49,"value":178},{"type":49,"value":367}," creates app source files and adds modules to a local project.",{"type":43,"tag":358,"props":369,"children":370},{},[371,376],{"type":43,"tag":100,"props":372,"children":374},{"className":373},[],[375],{"type":49,"value":212},{"type":49,"value":377}," manages installed apps and instance data in YouTrack.",{"type":43,"tag":58,"props":379,"children":380},{},[381],{"type":49,"value":382},"Before running a command, confirm only the inputs that matter for that command: local directory, target app, project short\nname, YouTrack host\u002Ftoken, and output format.",{"type":43,"tag":384,"props":385,"children":387},"h2",{"id":386},"command-discovery",[388],{"type":49,"value":389},"Command Discovery",{"type":43,"tag":58,"props":391,"children":392},{},[393,395,401],{"type":49,"value":394},"Run either CLI with ",{"type":43,"tag":100,"props":396,"children":398},{"className":397},[],[399],{"type":49,"value":400},"--help",{"type":49,"value":402}," before using an unfamiliar command; the installed CLI is the source of truth. Keep these\ncommand families in mind when exploring a request:",{"type":43,"tag":354,"props":404,"children":405},{},[406,461],{"type":43,"tag":358,"props":407,"children":408},{},[409,414,416,422,424,430,431,437,438,444,446,452,454,460],{"type":43,"tag":100,"props":410,"children":412},{"className":411},[],[413],{"type":49,"value":178},{"type":49,"value":415},": ",{"type":43,"tag":100,"props":417,"children":419},{"className":418},[],[420],{"type":49,"value":421},"app init",{"type":49,"value":423},", ",{"type":43,"tag":100,"props":425,"children":427},{"className":426},[],[428],{"type":49,"value":429},"rule add",{"type":49,"value":423},{"type":43,"tag":100,"props":432,"children":434},{"className":433},[],[435],{"type":49,"value":436},"http-handler add",{"type":49,"value":423},{"type":43,"tag":100,"props":439,"children":441},{"className":440},[],[442],{"type":49,"value":443},"settings init|add",{"type":49,"value":445},",\n",{"type":43,"tag":100,"props":447,"children":449},{"className":448},[],[450],{"type":49,"value":451},"extension-property add",{"type":49,"value":453},", and ",{"type":43,"tag":100,"props":455,"children":457},{"className":456},[],[458],{"type":49,"value":459},"widget add",{"type":49,"value":200},{"type":43,"tag":358,"props":462,"children":463},{},[464,469,471,477,478,484,485,491,492,498,499,505,506,512,514,520,521,527,528,533,534,540,541,547,549,555,557,563,565,571],{"type":43,"tag":100,"props":465,"children":467},{"className":466},[],[468],{"type":49,"value":212},{"type":49,"value":470},": app lifecycle\u002Fconfiguration (",{"type":43,"tag":100,"props":472,"children":474},{"className":473},[],[475],{"type":49,"value":476},"upload",{"type":49,"value":423},{"type":43,"tag":100,"props":479,"children":481},{"className":480},[],[482],{"type":49,"value":483},"download",{"type":49,"value":423},{"type":43,"tag":100,"props":486,"children":488},{"className":487},[],[489],{"type":49,"value":490},"validate",{"type":49,"value":423},{"type":43,"tag":100,"props":493,"children":495},{"className":494},[],[496],{"type":49,"value":497},"list",{"type":49,"value":423},{"type":43,"tag":100,"props":500,"children":502},{"className":501},[],[503],{"type":49,"value":504},"info",{"type":49,"value":423},{"type":43,"tag":100,"props":507,"children":509},{"className":508},[],[510],{"type":49,"value":511},"scripts",{"type":49,"value":513},", settings,\nenablement, logs, and requirement errors); instance exploration (",{"type":43,"tag":100,"props":515,"children":517},{"className":516},[],[518],{"type":49,"value":519},"project",{"type":49,"value":423},{"type":43,"tag":100,"props":522,"children":524},{"className":523},[],[525],{"type":49,"value":526},"field",{"type":49,"value":423},{"type":43,"tag":100,"props":529,"children":531},{"className":530},[],[532],{"type":49,"value":13},{"type":49,"value":423},{"type":43,"tag":100,"props":535,"children":537},{"className":536},[],[538],{"type":49,"value":539},"group",{"type":49,"value":453},{"type":43,"tag":100,"props":542,"children":544},{"className":543},[],[545],{"type":49,"value":546},"user",{"type":49,"value":548},");\nand ",{"type":43,"tag":100,"props":550,"children":552},{"className":551},[],[553],{"type":49,"value":554},"rest request",{"type":49,"value":556}," for an authenticated raw REST call. Use ",{"type":43,"tag":100,"props":558,"children":560},{"className":559},[],[561],{"type":49,"value":562},"--json",{"type":49,"value":564}," or ",{"type":43,"tag":100,"props":566,"children":568},{"className":567},[],[569],{"type":49,"value":570},"--yaml",{"type":49,"value":572}," when structured output helps.",{"type":43,"tag":384,"props":574,"children":576},{"id":575},"youtrack-app-cli",[577],{"type":49,"value":578},"YouTrack App CLI",{"type":43,"tag":58,"props":580,"children":581},{},[582,584,589],{"type":49,"value":583},"Use ",{"type":43,"tag":100,"props":585,"children":587},{"className":586},[],[588],{"type":49,"value":223},{"type":49,"value":590}," for current commands and options.",{"type":43,"tag":58,"props":592,"children":593},{},[594,595,600],{"type":49,"value":583},{"type":43,"tag":100,"props":596,"children":598},{"className":597},[],[599],{"type":49,"value":212},{"type":49,"value":601}," for installed app and instance operations: validate or upload a local build, download an installed app,\nlist\u002Fsearch\u002Finspect apps, read scripts, configure settings, enable\u002Fdisable or attach\u002Fdetach apps, check requirement\nerrors, read logs, inspect projects, fields, users, groups, or tags, and make an authenticated raw REST request.",{"type":43,"tag":58,"props":603,"children":604},{},[605],{"type":49,"value":606},"Do not use it to scaffold new source files.",{"type":43,"tag":608,"props":609,"children":611},"h3",{"id":610},"rest-requests-for-exploration-and-testing",[612],{"type":49,"value":613},"REST Requests for Exploration and Testing",{"type":43,"tag":58,"props":615,"children":616},{},[617,618,624],{"type":49,"value":583},{"type":43,"tag":100,"props":619,"children":621},{"className":620},[],[622],{"type":49,"value":623},"youtrack-app rest request",{"type":49,"value":625}," for a relative YouTrack REST path. It uses the configured host\u002Ftoken; inspect first and\nmake state-changing calls only when requested. For an app HTTP handler, call its published URL, for example:",{"type":43,"tag":627,"props":628,"children":633},"pre",{"className":629,"code":630,"language":631,"meta":632,"style":632},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","youtrack-app rest request \\\n  --path \"\u002Fapi\u002FextensionEndpoints\u002F\u003Capp>\u002F\u003Chandler>\u002F\u003Cendpoint>\" \\\n  --method POST --header \"Content-Type:application\u002Fjson\" --body '{\"event\":\"ping\"}'\n","bash","",[634],{"type":43,"tag":100,"props":635,"children":636},{"__ignoreMap":632},[637,665,694],{"type":43,"tag":638,"props":639,"children":642},"span",{"class":640,"line":641},"line",1,[643,648,654,659],{"type":43,"tag":638,"props":644,"children":646},{"style":645},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[647],{"type":49,"value":212},{"type":43,"tag":638,"props":649,"children":651},{"style":650},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[652],{"type":49,"value":653}," rest",{"type":43,"tag":638,"props":655,"children":656},{"style":650},[657],{"type":49,"value":658}," request",{"type":43,"tag":638,"props":660,"children":662},{"style":661},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[663],{"type":49,"value":664}," \\\n",{"type":43,"tag":638,"props":666,"children":668},{"class":640,"line":667},2,[669,674,680,685,690],{"type":43,"tag":638,"props":670,"children":671},{"style":650},[672],{"type":49,"value":673},"  --path",{"type":43,"tag":638,"props":675,"children":677},{"style":676},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[678],{"type":49,"value":679}," \"",{"type":43,"tag":638,"props":681,"children":682},{"style":650},[683],{"type":49,"value":684},"\u002Fapi\u002FextensionEndpoints\u002F\u003Capp>\u002F\u003Chandler>\u002F\u003Cendpoint>",{"type":43,"tag":638,"props":686,"children":687},{"style":676},[688],{"type":49,"value":689},"\"",{"type":43,"tag":638,"props":691,"children":692},{"style":661},[693],{"type":49,"value":664},{"type":43,"tag":638,"props":695,"children":697},{"class":640,"line":696},3,[698,703,708,713,717,722,726,731,736,741],{"type":43,"tag":638,"props":699,"children":700},{"style":650},[701],{"type":49,"value":702},"  --method",{"type":43,"tag":638,"props":704,"children":705},{"style":650},[706],{"type":49,"value":707}," POST",{"type":43,"tag":638,"props":709,"children":710},{"style":650},[711],{"type":49,"value":712}," --header",{"type":43,"tag":638,"props":714,"children":715},{"style":676},[716],{"type":49,"value":679},{"type":43,"tag":638,"props":718,"children":719},{"style":650},[720],{"type":49,"value":721},"Content-Type:application\u002Fjson",{"type":43,"tag":638,"props":723,"children":724},{"style":676},[725],{"type":49,"value":689},{"type":43,"tag":638,"props":727,"children":728},{"style":650},[729],{"type":49,"value":730}," --body",{"type":43,"tag":638,"props":732,"children":733},{"style":676},[734],{"type":49,"value":735}," '",{"type":43,"tag":638,"props":737,"children":738},{"style":650},[739],{"type":49,"value":740},"{\"event\":\"ping\"}",{"type":43,"tag":638,"props":742,"children":743},{"style":676},[744],{"type":49,"value":745},"'\n",{"type":43,"tag":58,"props":747,"children":748},{},[749,751,757],{"type":49,"value":750},"That example is for a global handler. Use the scoped URL shapes in\n",{"type":43,"tag":194,"props":752,"children":754},{"href":753},"references\u002Fscript-types.md#routing-and-authoring",[755],{"type":49,"value":756},"HTTP Handler",{"type":49,"value":758}," for issue, article, project, or user handlers.",{"type":43,"tag":58,"props":760,"children":761},{},[762,764,770,772,778],{"type":49,"value":763},"To invoke an installed action rule, submit its ",{"type":43,"tag":100,"props":765,"children":767},{"className":766},[],[768],{"type":49,"value":769},"command",{"type":49,"value":771}," with raw REST issue IDs (not ",{"type":43,"tag":100,"props":773,"children":775},{"className":774},[],[776],{"type":49,"value":777},"DEMO-123",{"type":49,"value":779},"):",{"type":43,"tag":627,"props":781,"children":783},{"className":629,"code":782,"language":631,"meta":632,"style":632},"youtrack-app rest request --path \"\u002Fapi\u002Fcommands\" --method POST \\\n  --body '{\"query\":\"request-qa-review\",\"issues\":[{\"id\":\"2-123\"}]}'\n",[784],{"type":43,"tag":100,"props":785,"children":786},{"__ignoreMap":632},[787,833],{"type":43,"tag":638,"props":788,"children":789},{"class":640,"line":641},[790,794,798,802,807,811,816,820,825,829],{"type":43,"tag":638,"props":791,"children":792},{"style":645},[793],{"type":49,"value":212},{"type":43,"tag":638,"props":795,"children":796},{"style":650},[797],{"type":49,"value":653},{"type":43,"tag":638,"props":799,"children":800},{"style":650},[801],{"type":49,"value":658},{"type":43,"tag":638,"props":803,"children":804},{"style":650},[805],{"type":49,"value":806}," --path",{"type":43,"tag":638,"props":808,"children":809},{"style":676},[810],{"type":49,"value":679},{"type":43,"tag":638,"props":812,"children":813},{"style":650},[814],{"type":49,"value":815},"\u002Fapi\u002Fcommands",{"type":43,"tag":638,"props":817,"children":818},{"style":676},[819],{"type":49,"value":689},{"type":43,"tag":638,"props":821,"children":822},{"style":650},[823],{"type":49,"value":824}," --method",{"type":43,"tag":638,"props":826,"children":827},{"style":650},[828],{"type":49,"value":707},{"type":43,"tag":638,"props":830,"children":831},{"style":661},[832],{"type":49,"value":664},{"type":43,"tag":638,"props":834,"children":835},{"class":640,"line":667},[836,841,845,850],{"type":43,"tag":638,"props":837,"children":838},{"style":650},[839],{"type":49,"value":840},"  --body",{"type":43,"tag":638,"props":842,"children":843},{"style":676},[844],{"type":49,"value":735},{"type":43,"tag":638,"props":846,"children":847},{"style":650},[848],{"type":49,"value":849},"{\"query\":\"request-qa-review\",\"issues\":[{\"id\":\"2-123\"}]}",{"type":43,"tag":638,"props":851,"children":852},{"style":676},[853],{"type":49,"value":745},{"type":43,"tag":44,"props":855,"children":857},{"id":856},"project-and-module-scaffolding-cli",[858],{"type":49,"value":859},"Project and Module Scaffolding CLI",{"type":43,"tag":384,"props":861,"children":863},{"id":862},"create-youtrack-app-cli",[864],{"type":49,"value":865},"Create YouTrack App CLI",{"type":43,"tag":58,"props":867,"children":868},{},[869,870,875],{"type":49,"value":583},{"type":43,"tag":100,"props":871,"children":873},{"className":872},[],[874],{"type":49,"value":190},{"type":49,"value":876}," for current generator commands and options.",{"type":43,"tag":58,"props":878,"children":879},{},[880,881,886],{"type":49,"value":583},{"type":43,"tag":100,"props":882,"children":884},{"className":883},[],[885],{"type":49,"value":178},{"type":49,"value":887}," to create a new app project or add local modules: workflow rules, HTTP handlers, settings,\nextension properties and widgets.\nAfter scaffolding, review generated files, manifest wiring, requirements, and the relevant script type reference before\nediting or deploying.",{"type":43,"tag":384,"props":889,"children":891},{"id":890},"deploying-app",[892],{"type":49,"value":893},"Deploying App",{"type":43,"tag":58,"props":895,"children":896},{},[897,899,905,907,913],{"type":49,"value":898},"Deploying means validating and uploading the local app build to a target YouTrack instance. It creates or updates the\ninstalled app whose package name is ",{"type":43,"tag":100,"props":900,"children":902},{"className":901},[],[903],{"type":49,"value":904},"manifest.json",{"type":49,"value":906}," ",{"type":43,"tag":100,"props":908,"children":910},{"className":909},[],[911],{"type":49,"value":912},"name",{"type":49,"value":200},{"type":43,"tag":58,"props":915,"children":916},{},[917],{"type":49,"value":918},"Deployment does not publish to Marketplace. It only changes the app installed in the configured YouTrack site.",{"type":43,"tag":58,"props":920,"children":921},{},[922,924,929],{"type":49,"value":923},"After deployment, you can verify the installed app via ",{"type":43,"tag":100,"props":925,"children":927},{"className":926},[],[928],{"type":49,"value":212},{"type":49,"value":930}," CLI:",{"type":43,"tag":354,"props":932,"children":933},{},[934,952,957],{"type":43,"tag":358,"props":935,"children":936},{},[937,939,944,945,951],{"type":49,"value":938},"Check ",{"type":43,"tag":100,"props":940,"children":942},{"className":941},[],[943],{"type":49,"value":504},{"type":49,"value":304},{"type":43,"tag":100,"props":946,"children":948},{"className":947},[],[949],{"type":49,"value":950},"requirement-errors",{"type":49,"value":200},{"type":43,"tag":358,"props":953,"children":954},{},[955],{"type":49,"value":956},"Configure settings or project attachment\u002Fenabled state when needed.",{"type":43,"tag":358,"props":958,"children":959},{},[960],{"type":49,"value":961},"Check app logs or script logs while testing behavior.",{"type":43,"tag":44,"props":963,"children":965},{"id":964},"manifest",[966],{"type":49,"value":967},"Manifest",{"type":43,"tag":58,"props":969,"children":970},{},[971,973,978,980,986,987,993,994,1000,1001,1007,1009],{"type":49,"value":972},"Use for app identity which is ",{"type":43,"tag":100,"props":974,"children":976},{"className":975},[],[977],{"type":49,"value":912},{"type":49,"value":979}," and package metadata like  ",{"type":43,"tag":100,"props":981,"children":983},{"className":982},[],[984],{"type":49,"value":985},"title",{"type":49,"value":423},{"type":43,"tag":100,"props":988,"children":990},{"className":989},[],[991],{"type":49,"value":992},"description",{"type":49,"value":423},{"type":43,"tag":100,"props":995,"children":997},{"className":996},[],[998],{"type":49,"value":999},"vendor",{"type":49,"value":423},{"type":43,"tag":100,"props":1002,"children":1004},{"className":1003},[],[1005],{"type":49,"value":1006},"version",{"type":49,"value":1008},". Also use it\nwhen widgets must be declared.\nLoad for all fields: ",{"type":43,"tag":194,"props":1010,"children":1012},{"href":1011},"references\u002Fmanifest.md",[1013],{"type":49,"value":1011},{"type":43,"tag":44,"props":1015,"children":1017},{"id":1016},"frontend",[1018],{"type":49,"value":1019},"Frontend",{"type":43,"tag":58,"props":1021,"children":1022},{},[1023,1025],{"type":49,"value":1024},"Use frontend for React widget implementation: component files, Ring UI, host registration, widget-to-backend calls,\nfrontend build order, and UI dev loops. A YouTrack app frontend is one or more widgets rendered inside a live YouTrack\ninstance at declared extension points.\nLoad for frontend implementation: ",{"type":43,"tag":194,"props":1026,"children":1028},{"href":1027},"references\u002Ffrontend.md",[1029],{"type":49,"value":1027},{"type":43,"tag":384,"props":1031,"children":1033},{"id":1032},"widgets",[1034],{"type":49,"value":1035},"Widgets",{"type":43,"tag":58,"props":1037,"children":1038},{},[1039,1041,1047,1049],{"type":49,"value":1040},"A widget is a custom object that you can embed in one of the dedicated extension points in the YouTrack UI. Widget is not a standalone SPA: no client router, no owned ",{"type":43,"tag":100,"props":1042,"children":1044},{"className":1043},[],[1045],{"type":49,"value":1046},"ReactDOM.render",{"type":49,"value":1048},", and no localhost-only render.\nLoad for widget configuration: ",{"type":43,"tag":194,"props":1050,"children":1052},{"href":1051},"references\u002Fwidgets.md",[1053],{"type":49,"value":1051},{"type":43,"tag":384,"props":1055,"children":1057},{"id":1056},"host-api",[1058],{"type":49,"value":1059},"Host API",{"type":43,"tag":58,"props":1061,"children":1062},{},[1063,1065],{"type":49,"value":1064},"Use for information on how to wire widgets to backend, or how to wire widgets with YouTrack. Load ",{"type":43,"tag":194,"props":1066,"children":1068},{"href":1067},".\u002Freferences\u002Fhost-api.md",[1069],{"type":49,"value":1070},"references\u002Fhost-api.md",{"type":43,"tag":44,"props":1072,"children":1074},{"id":1073},"rules",[1075],{"type":49,"value":1076},"Rules",{"type":43,"tag":58,"props":1078,"children":1079},{},[1080],{"type":49,"value":1081},"Use rules for YouTrack automation that runs from issue\u002Farticle changes, explicit user commands, schedules, or\nconstrained lifecycle transitions.",{"type":43,"tag":384,"props":1083,"children":1085},{"id":1084},"on-change-rule",[1086],{"type":49,"value":1087},"On-Change Rule",{"type":43,"tag":58,"props":1089,"children":1090},{},[1091,1093],{"type":49,"value":1092},"Use when logic should run automatically as an issue or article is created, edited, reported, removed, or has a relevant\nfield\u002Flink changed. Best for save-time validation and reactive side effects that must happen in the same transaction.\nLoad after selecting this script type and before\ncodegen: ",{"type":43,"tag":194,"props":1094,"children":1096},{"href":1095},"references\u002Fscript-types.md#on-change-rule",[1097],{"type":49,"value":1095},{"type":43,"tag":384,"props":1099,"children":1101},{"id":1100},"action-rule",[1102],{"type":49,"value":1103},"Action Rule",{"type":43,"tag":58,"props":1105,"children":1106},{},[1107,1109,1115,1117],{"type":49,"value":1108},"Use when the user explicitly invokes behavior from a command, button, menu item, or bulk action. Best when the user\ncontrols when the behavior runs, or when runtime ",{"type":43,"tag":100,"props":1110,"children":1112},{"className":1111},[],[1113],{"type":49,"value":1114},"userInput",{"type":49,"value":1116}," is required.\nLoad after selecting this script type and before\ncodegen: ",{"type":43,"tag":194,"props":1118,"children":1120},{"href":1119},"references\u002Fscript-types.md#action-rule",[1121],{"type":49,"value":1119},{"type":43,"tag":384,"props":1123,"children":1125},{"id":1124},"on-schedule-rule",[1126],{"type":49,"value":1127},"On-Schedule Rule",{"type":43,"tag":58,"props":1129,"children":1130},{},[1131,1133],{"type":49,"value":1132},"Use for periodic background work over issues selected by a YouTrack search query. Best for maintenance, reminders,\nescalations, cleanup, and recurring notifications that should not run during a save transaction.\nLoad after selecting this script type and before\ncodegen: ",{"type":43,"tag":194,"props":1134,"children":1136},{"href":1135},"references\u002Fscript-types.md#on-schedule-rule",[1137],{"type":49,"value":1135},{"type":43,"tag":384,"props":1139,"children":1141},{"id":1140},"state-machine-rule",[1142],{"type":49,"value":1143},"State-Machine Rule",{"type":43,"tag":58,"props":1145,"children":1146},{},[1147,1149],{"type":49,"value":1148},"Use when one issue field must follow a constrained lifecycle with named states, allowed transitions, guards, actions,\nand optional timers. Best when free-form field edits should be replaced by an explicit transition graph.\nLoad after selecting this script type and before\ncodegen: ",{"type":43,"tag":194,"props":1150,"children":1152},{"href":1151},"references\u002Fscript-types.md#state-machine-rule",[1153],{"type":49,"value":1151},{"type":43,"tag":384,"props":1155,"children":1157},{"id":1156},"sla-rule",[1158],{"type":49,"value":1159},"SLA Rule",{"type":43,"tag":58,"props":1161,"children":1162},{},[1163,1165],{"type":49,"value":1164},"Use to define the set of time goals for tickets in a helpdesk project.\nLoad after selecting this script type and before\ncodegen: ",{"type":43,"tag":194,"props":1166,"children":1168},{"href":1167},"references\u002Fscript-types.md#sla-rule",[1169],{"type":49,"value":1167},{"type":43,"tag":44,"props":1171,"children":1173},{"id":1172},"custom-api-endpoints",[1174],{"type":49,"value":1175},"Custom API Endpoints",{"type":43,"tag":58,"props":1177,"children":1178},{},[1179],{"type":49,"value":1180},"Use endpoints when the app exposes callable backend behavior rather than workflow automation.",{"type":43,"tag":384,"props":1182,"children":1184},{"id":1183},"http-handler",[1185],{"type":49,"value":756},{"type":43,"tag":58,"props":1187,"children":1188},{},[1189],{"type":49,"value":1190},"Use for app-defined HTTP endpoints: webhook receivers, integration callbacks, health checks, or small APIs exposed by\nthe app.",{"type":43,"tag":58,"props":1192,"children":1193},{},[1194,1196],{"type":49,"value":1195},"Load after selecting this script type and before\ncodegen: ",{"type":43,"tag":194,"props":1197,"children":1199},{"href":1198},"references\u002Fscript-types.md#http-handler",[1200],{"type":49,"value":1198},{"type":43,"tag":384,"props":1202,"children":1204},{"id":1203},"mcp-tools",[1205],{"type":49,"value":1206},"MCP Tools",{"type":43,"tag":58,"props":1208,"children":1209},{},[1210],{"type":49,"value":1211},"Use when the app exposes a callable tool for YouTrack AI or an assistant runtime. Best for narrow, well-described\noperations with structured inputs and outputs where the tool description controls when the AI calls it.",{"type":43,"tag":58,"props":1213,"children":1214},{},[1215,1216],{"type":49,"value":1195},{"type":43,"tag":194,"props":1217,"children":1219},{"href":1218},"references\u002Fscript-types.md#mcp-tool",[1220],{"type":49,"value":1218},{"type":43,"tag":44,"props":1222,"children":1224},{"id":1223},"guidelines",[1225],{"type":49,"value":1226},"Guidelines",{"type":43,"tag":58,"props":1228,"children":1229},{},[1230],{"type":49,"value":1231},"Use guidelines as a must when writing code for any app type.",{"type":43,"tag":384,"props":1233,"children":1235},{"id":1234},"ui-styles",[1236],{"type":49,"value":1237},"UI Styles",{"type":43,"tag":58,"props":1239,"children":1240},{},[1241,1243],{"type":49,"value":1242},"Always load this for rules on what to do when styling widgets.\n",{"type":43,"tag":194,"props":1244,"children":1246},{"href":1245},"references\u002Fguidelines\u002Fstyles.md",[1247],{"type":49,"value":1245},{"type":43,"tag":384,"props":1249,"children":1251},{"id":1250},"code-style",[1252],{"type":49,"value":1253},"Code style",{"type":43,"tag":354,"props":1255,"children":1256},{},[1257],{"type":43,"tag":358,"props":1258,"children":1259},{},[1260,1262,1268,1270,1276],{"type":49,"value":1261},"In generated backend JavaScript\u002FTypeScript, prefer arrow functions (",{"type":43,"tag":100,"props":1263,"children":1265},{"className":1264},[],[1266],{"type":49,"value":1267},"(ctx) => { ... }",{"type":49,"value":1269},") for callbacks, handlers,\npredicates, and local helper expressions. Use ",{"type":43,"tag":100,"props":1271,"children":1273},{"className":1272},[],[1274],{"type":49,"value":1275},"function",{"type":49,"value":1277}," declarations only for named helpers.",{"type":43,"tag":384,"props":1279,"children":1281},{"id":1280},"js-api-usage",[1282],{"type":49,"value":1283},"JS API usage",{"type":43,"tag":354,"props":1285,"children":1286},{},[1287,1300,1305,1310,1315],{"type":43,"tag":358,"props":1288,"children":1289},{},[1290,1292,1298],{"type":49,"value":1291},"You need to verify every part code against the ",{"type":43,"tag":100,"props":1293,"children":1295},{"className":1294},[],[1296],{"type":49,"value":1297},"API Reference",{"type":49,"value":1299}," files. Give special notice to entity properties and\nmethods.",{"type":43,"tag":358,"props":1301,"children":1302},{},[1303],{"type":49,"value":1304},"Never put issue link types into requirements section for any chosen script type.",{"type":43,"tag":358,"props":1306,"children":1307},{},[1308],{"type":49,"value":1309},"For every entity property or method validate the reference file. Only listed reference files are allowed.",{"type":43,"tag":358,"props":1311,"children":1312},{},[1313],{"type":49,"value":1314},"Never compare whole objects, always compare by name, login, key, id or similar.",{"type":43,"tag":358,"props":1316,"children":1317},{},[1318,1320],{"type":49,"value":1319},"Issue IDs are different in the JS API and the native YouTrack REST API:\n",{"type":43,"tag":354,"props":1321,"children":1322},{},[1323,1351],{"type":43,"tag":358,"props":1324,"children":1325},{},[1326,1328,1334,1336,1341,1343,1349],{"type":49,"value":1327},"In the YouTrack JS API, use ",{"type":43,"tag":100,"props":1329,"children":1331},{"className":1330},[],[1332],{"type":49,"value":1333},"Issue.id",{"type":49,"value":1335},". It is the readable issue ID, for example ",{"type":43,"tag":100,"props":1337,"children":1339},{"className":1338},[],[1340],{"type":49,"value":777},{"type":49,"value":1342},". There is no ",{"type":43,"tag":100,"props":1344,"children":1346},{"className":1345},[],[1347],{"type":49,"value":1348},"Issue.idReadable",{"type":49,"value":1350},"\nproperty in the JS API.",{"type":43,"tag":358,"props":1352,"children":1353},{},[1354,1356,1362,1364,1370,1372,1378],{"type":49,"value":1355},"In the native YouTrack REST API, response and request body ",{"type":43,"tag":100,"props":1357,"children":1359},{"className":1358},[],[1360],{"type":49,"value":1361},"id",{"type":49,"value":1363}," values are raw IDs, for example ",{"type":43,"tag":100,"props":1365,"children":1367},{"className":1366},[],[1368],{"type":49,"value":1369},"2-123",{"type":49,"value":1371}," and there is an ",{"type":43,"tag":100,"props":1373,"children":1375},{"className":1374},[],[1376],{"type":49,"value":1377},"idReadable",{"type":49,"value":1379}," field.",{"type":43,"tag":384,"props":1381,"children":1383},{"id":1382},"logging",[1384],{"type":49,"value":1385},"Logging",{"type":43,"tag":58,"props":1387,"children":1388},{},[1389,1391],{"type":49,"value":1390},"Use when deciding whether to log, what level\u002Fdetail to log, and how to keep logs useful without exposing sensitive data.\nLoad when relevant before codegen: ",{"type":43,"tag":194,"props":1392,"children":1394},{"href":1393},"references\u002Fguidelines\u002Flogging.md",[1395],{"type":49,"value":1393},{"type":43,"tag":44,"props":1397,"children":1399},{"id":1398},"api-reference",[1400],{"type":49,"value":1297},{"type":43,"tag":58,"props":1402,"children":1403},{},[1404],{"type":49,"value":1405},"This is the main ground truth for the YouTrack JavaScript API. When a script type reference lists API areas, resolve them\nhere before writing code.",{"type":43,"tag":384,"props":1407,"children":1409},{"id":1408},"search-guidance",[1410],{"type":49,"value":1411},"Search guidance",{"type":43,"tag":58,"props":1413,"children":1414},{},[1415],{"type":49,"value":1416},"Before opening large reference files, search for the exact type, property, method, function, or concept first, then open\naround the matching lines. Useful patterns:",{"type":43,"tag":627,"props":1418,"children":1420},{"className":629,"code":1419,"language":631,"meta":632,"style":632},"# Find high-value entity sections and common entity members.\nrg -n \"^### (Issue|Project|User|Set)$|^##### (fields|isVisibleTo|findByExtensionProperties)$\" references\u002Fapi\u002Fentities.md\n\n# Find settings, extension properties, persistence lookup, and async invocation usage across references.\nrg -n \"ctx\\\\.settings|extensionProperties|findByExtensionProperties|invokeAsync\" references\n\n# Replace placeholders with the exact API symbol to locate its module documentation.\nrg -n \"functionName|methodName|propertyName\" references\u002Fapi\n",[1421],{"type":43,"tag":100,"props":1422,"children":1423},{"__ignoreMap":632},[1424,1433,1464,1473,1482,1522,1530,1539],{"type":43,"tag":638,"props":1425,"children":1426},{"class":640,"line":641},[1427],{"type":43,"tag":638,"props":1428,"children":1430},{"style":1429},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic",[1431],{"type":49,"value":1432},"# Find high-value entity sections and common entity members.\n",{"type":43,"tag":638,"props":1434,"children":1435},{"class":640,"line":667},[1436,1441,1446,1450,1455,1459],{"type":43,"tag":638,"props":1437,"children":1438},{"style":645},[1439],{"type":49,"value":1440},"rg",{"type":43,"tag":638,"props":1442,"children":1443},{"style":650},[1444],{"type":49,"value":1445}," -n",{"type":43,"tag":638,"props":1447,"children":1448},{"style":676},[1449],{"type":49,"value":679},{"type":43,"tag":638,"props":1451,"children":1452},{"style":650},[1453],{"type":49,"value":1454},"^### (Issue|Project|User|Set)$|^##### (fields|isVisibleTo|findByExtensionProperties)$",{"type":43,"tag":638,"props":1456,"children":1457},{"style":676},[1458],{"type":49,"value":689},{"type":43,"tag":638,"props":1460,"children":1461},{"style":650},[1462],{"type":49,"value":1463}," references\u002Fapi\u002Fentities.md\n",{"type":43,"tag":638,"props":1465,"children":1466},{"class":640,"line":696},[1467],{"type":43,"tag":638,"props":1468,"children":1470},{"emptyLinePlaceholder":1469},true,[1471],{"type":49,"value":1472},"\n",{"type":43,"tag":638,"props":1474,"children":1476},{"class":640,"line":1475},4,[1477],{"type":43,"tag":638,"props":1478,"children":1479},{"style":1429},[1480],{"type":49,"value":1481},"# Find settings, extension properties, persistence lookup, and async invocation usage across references.\n",{"type":43,"tag":638,"props":1483,"children":1485},{"class":640,"line":1484},5,[1486,1490,1494,1498,1503,1508,1513,1517],{"type":43,"tag":638,"props":1487,"children":1488},{"style":645},[1489],{"type":49,"value":1440},{"type":43,"tag":638,"props":1491,"children":1492},{"style":650},[1493],{"type":49,"value":1445},{"type":43,"tag":638,"props":1495,"children":1496},{"style":676},[1497],{"type":49,"value":679},{"type":43,"tag":638,"props":1499,"children":1500},{"style":650},[1501],{"type":49,"value":1502},"ctx",{"type":43,"tag":638,"props":1504,"children":1505},{"style":661},[1506],{"type":49,"value":1507},"\\\\",{"type":43,"tag":638,"props":1509,"children":1510},{"style":650},[1511],{"type":49,"value":1512},".settings|extensionProperties|findByExtensionProperties|invokeAsync",{"type":43,"tag":638,"props":1514,"children":1515},{"style":676},[1516],{"type":49,"value":689},{"type":43,"tag":638,"props":1518,"children":1519},{"style":650},[1520],{"type":49,"value":1521}," references\n",{"type":43,"tag":638,"props":1523,"children":1525},{"class":640,"line":1524},6,[1526],{"type":43,"tag":638,"props":1527,"children":1528},{"emptyLinePlaceholder":1469},[1529],{"type":49,"value":1472},{"type":43,"tag":638,"props":1531,"children":1533},{"class":640,"line":1532},7,[1534],{"type":43,"tag":638,"props":1535,"children":1536},{"style":1429},[1537],{"type":49,"value":1538},"# Replace placeholders with the exact API symbol to locate its module documentation.\n",{"type":43,"tag":638,"props":1540,"children":1542},{"class":640,"line":1541},8,[1543,1547,1551,1555,1560,1564],{"type":43,"tag":638,"props":1544,"children":1545},{"style":645},[1546],{"type":49,"value":1440},{"type":43,"tag":638,"props":1548,"children":1549},{"style":650},[1550],{"type":49,"value":1445},{"type":43,"tag":638,"props":1552,"children":1553},{"style":676},[1554],{"type":49,"value":679},{"type":43,"tag":638,"props":1556,"children":1557},{"style":650},[1558],{"type":49,"value":1559},"functionName|methodName|propertyName",{"type":43,"tag":638,"props":1561,"children":1562},{"style":676},[1563],{"type":49,"value":689},{"type":43,"tag":638,"props":1565,"children":1566},{"style":650},[1567],{"type":49,"value":1568}," references\u002Fapi\n",{"type":43,"tag":384,"props":1570,"children":1572},{"id":1571},"important-concepts",[1573],{"type":49,"value":1574},"Important concepts",{"type":43,"tag":354,"props":1576,"children":1577},{},[1578,1590,1601,1620],{"type":43,"tag":358,"props":1579,"children":1580},{},[1581,1583,1588],{"type":49,"value":1582},"Async functions: ",{"type":43,"tag":194,"props":1584,"children":1586},{"href":1585},"references\u002Fapi\u002Fasync-functions.md",[1587],{"type":49,"value":1585},{"type":49,"value":1589},". Load when working with\ndeferred work. Contains the mental model, usage points, structure, constraints, prerequisites, and examples.",{"type":43,"tag":358,"props":1591,"children":1592},{},[1593,1599],{"type":43,"tag":194,"props":1594,"children":1596},{"href":1595},"references\u002Fapi\u002Fentities.md#set",[1597],{"type":49,"value":1598},"Set",{"type":49,"value":1600},": Load when working with iteration over entities. YouTrack uses custom sets (not js sets)\nfor multi-value collections. Contains properties, methods, and explanations.",{"type":43,"tag":358,"props":1602,"children":1603},{},[1604,1606,1612,1614,1619],{"type":49,"value":1605},"Requirements: ",{"type":43,"tag":194,"props":1607,"children":1609},{"href":1608},"references\u002Fapi\u002Fentities.md#requirements",[1610],{"type":49,"value":1611},"requirements",{"type":49,"value":1613},". Load when you need to make sure\nentities exist in the YouTrack instance, or when code needs to retrieve required entities through ",{"type":43,"tag":100,"props":1615,"children":1617},{"className":1616},[],[1618],{"type":49,"value":1502},{"type":49,"value":200},{"type":43,"tag":358,"props":1621,"children":1622},{},[1623,1625,1630,1632,1637],{"type":49,"value":1624},"Context: ",{"type":43,"tag":194,"props":1626,"children":1628},{"href":1627},"references\u002Fapi\u002Fctx.md",[1629],{"type":49,"value":1627},{"type":49,"value":1631},". Load when you need information about what is the ",{"type":43,"tag":100,"props":1633,"children":1635},{"className":1634},[],[1636],{"type":49,"value":1502},{"type":49,"value":1638}," object\nand what it consist of.",{"type":43,"tag":384,"props":1640,"children":1642},{"id":1641},"app-persistence-and-settings",[1643],{"type":49,"value":1644},"App persistence and settings",{"type":43,"tag":354,"props":1646,"children":1647},{},[1648,1668],{"type":43,"tag":358,"props":1649,"children":1650},{},[1651,1653,1658,1660,1666],{"type":49,"value":1652},"App Settings: ",{"type":43,"tag":194,"props":1654,"children":1656},{"href":1655},"references\u002Fapp-persistance.md#app-settings",[1657],{"type":49,"value":1655},{"type":49,"value":1659},". Expose user-facing settings in the YouTrack admin UI\nfor system and project administrators to configure the app. These settings are accessible from app code through\n",{"type":43,"tag":100,"props":1661,"children":1663},{"className":1662},[],[1664],{"type":49,"value":1665},"ctx.settings",{"type":49,"value":1667},". Load for information on required variables, scopes, lifecycle and structure.",{"type":43,"tag":358,"props":1669,"children":1670},{},[1671,1673,1678,1680,1686,1687,1693,1695,1701],{"type":49,"value":1672},"Extension Properties: ",{"type":43,"tag":194,"props":1674,"children":1676},{"href":1675},"references\u002Fapp-persistance.md#extension-properties",[1677],{"type":49,"value":1675},{"type":49,"value":1679},". Load when the app\nneeds app-owned persistent state, ",{"type":43,"tag":100,"props":1681,"children":1683},{"className":1682},[],[1684],{"type":49,"value":1685},"entity-extensions.json",{"type":49,"value":423},{"type":43,"tag":100,"props":1688,"children":1690},{"className":1689},[],[1691],{"type":49,"value":1692},"extensionProperties",{"type":49,"value":1694},", or ",{"type":43,"tag":100,"props":1696,"children":1698},{"className":1697},[],[1699],{"type":49,"value":1700},"ctx.globalStorage",{"type":49,"value":200},{"type":43,"tag":384,"props":1703,"children":1705},{"id":1704},"reading-the-api-modules",[1706],{"type":49,"value":1707},"Reading the API modules",{"type":43,"tag":58,"props":1709,"children":1710},{},[1711,1713,1719,1721,1727],{"type":49,"value":1712},"The files in ",{"type":43,"tag":100,"props":1714,"children":1716},{"className":1715},[],[1717],{"type":49,"value":1718},"references\u002Fapi\u002F",{"type":49,"value":1720}," are the ground truth for module imports, top-level functions, and type details. Start with the module file, then follow its ",{"type":43,"tag":100,"props":1722,"children":1724},{"className":1723},[],[1725],{"type":49,"value":1726},"Types",{"type":49,"value":1728}," links for detail pages that list constructors, properties, methods, parameters, return values, and examples when available.",{"type":43,"tag":354,"props":1730,"children":1731},{},[1732,1753,1773,1793,1813],{"type":43,"tag":358,"props":1733,"children":1734},{},[1735,1737,1743,1745,1751],{"type":49,"value":1736},"Constructors: use entries under ",{"type":43,"tag":100,"props":1738,"children":1740},{"className":1739},[],[1741],{"type":49,"value":1742},"## Constructors",{"type":49,"value":1744}," as ",{"type":43,"tag":100,"props":1746,"children":1748},{"className":1747},[],[1749],{"type":49,"value":1750},"new TypeName(args)",{"type":49,"value":1752}," when the API explicitly documents a constructor.",{"type":43,"tag":358,"props":1754,"children":1755},{},[1756,1758,1764,1765,1771],{"type":49,"value":1757},"Properties: use entries under ",{"type":43,"tag":100,"props":1759,"children":1761},{"className":1760},[],[1762],{"type":49,"value":1763},"## Properties",{"type":49,"value":1744},{"type":43,"tag":100,"props":1766,"children":1768},{"className":1767},[],[1769],{"type":49,"value":1770},"object.property",{"type":49,"value":1772},"; check the listed type and whether the text says the value is readonly. Also, property is optional if the properety description says so.",{"type":43,"tag":358,"props":1774,"children":1775},{},[1776,1778,1784,1785,1791],{"type":49,"value":1777},"Methods: use entries under ",{"type":43,"tag":100,"props":1779,"children":1781},{"className":1780},[],[1782],{"type":49,"value":1783},"## Methods",{"type":49,"value":1744},{"type":43,"tag":100,"props":1786,"children":1788},{"className":1787},[],[1789],{"type":49,"value":1790},"object.method(args)",{"type":49,"value":1792},"; follow the parameter list and return text on that method.",{"type":43,"tag":358,"props":1794,"children":1795},{},[1796,1798,1804,1806,1812],{"type":49,"value":1797},"Functions: use entries under module ",{"type":43,"tag":100,"props":1799,"children":1801},{"className":1800},[],[1802],{"type":49,"value":1803},"## Functions",{"type":49,"value":1805}," after importing the module, for example ",{"type":43,"tag":100,"props":1807,"children":1809},{"className":1808},[],[1810],{"type":49,"value":1811},"const workflow = require('@jetbrains\u002Fyoutrack-scripting-api\u002Fworkflow'); workflow.functionName(args);",{"type":49,"value":200},{"type":43,"tag":358,"props":1814,"children":1815},{},[1816,1818,1824],{"type":49,"value":1817},"Types: use module ",{"type":43,"tag":100,"props":1819,"children":1821},{"className":1820},[],[1822],{"type":49,"value":1823},"## Types",{"type":49,"value":1825}," links to open the detailed page for entity objects, helper objects, and schemas.",{"type":43,"tag":608,"props":1827,"children":1829},{"id":1828},"api-modules",[1830],{"type":49,"value":1831},"API Modules",{"type":43,"tag":64,"props":1833,"children":1834},{},[1835,1856],{"type":43,"tag":68,"props":1836,"children":1837},{},[1838],{"type":43,"tag":72,"props":1839,"children":1840},{},[1841,1846,1851],{"type":43,"tag":76,"props":1842,"children":1843},{},[1844],{"type":49,"value":1845},"API area",{"type":43,"tag":76,"props":1847,"children":1848},{},[1849],{"type":49,"value":1850},"Ground-truth file",{"type":43,"tag":76,"props":1852,"children":1853},{},[1854],{"type":49,"value":1855},"Runtime import in app code",{"type":43,"tag":87,"props":1857,"children":1858},{},[1859,1888,1917,1946,1975,2004,2033,2062],{"type":43,"tag":72,"props":1860,"children":1861},{},[1862,1871,1879],{"type":43,"tag":94,"props":1863,"children":1864},{},[1865],{"type":43,"tag":100,"props":1866,"children":1868},{"className":1867},[],[1869],{"type":49,"value":1870},"date-time",{"type":43,"tag":94,"props":1872,"children":1873},{},[1874],{"type":43,"tag":194,"props":1875,"children":1877},{"href":1876},".\u002Freferences\u002Fapi\u002Fdate-time.md",[1878],{"type":49,"value":1876},{"type":43,"tag":94,"props":1880,"children":1881},{},[1882],{"type":43,"tag":100,"props":1883,"children":1885},{"className":1884},[],[1886],{"type":49,"value":1887},"require('@jetbrains\u002Fyoutrack-scripting-api\u002Fdate-time')",{"type":43,"tag":72,"props":1889,"children":1890},{},[1891,1900,1908],{"type":43,"tag":94,"props":1892,"children":1893},{},[1894],{"type":43,"tag":100,"props":1895,"children":1897},{"className":1896},[],[1898],{"type":49,"value":1899},"entities",{"type":43,"tag":94,"props":1901,"children":1902},{},[1903],{"type":43,"tag":194,"props":1904,"children":1906},{"href":1905},".\u002Freferences\u002Fapi\u002Fentities.md",[1907],{"type":49,"value":1905},{"type":43,"tag":94,"props":1909,"children":1910},{},[1911],{"type":43,"tag":100,"props":1912,"children":1914},{"className":1913},[],[1915],{"type":49,"value":1916},"require('@jetbrains\u002Fyoutrack-scripting-api\u002Fentities')",{"type":43,"tag":72,"props":1918,"children":1919},{},[1920,1929,1937],{"type":43,"tag":94,"props":1921,"children":1922},{},[1923],{"type":43,"tag":100,"props":1924,"children":1926},{"className":1925},[],[1927],{"type":49,"value":1928},"http",{"type":43,"tag":94,"props":1930,"children":1931},{},[1932],{"type":43,"tag":194,"props":1933,"children":1935},{"href":1934},".\u002Freferences\u002Fapi\u002Fhttp.md",[1936],{"type":49,"value":1934},{"type":43,"tag":94,"props":1938,"children":1939},{},[1940],{"type":43,"tag":100,"props":1941,"children":1943},{"className":1942},[],[1944],{"type":49,"value":1945},"require('@jetbrains\u002Fyoutrack-scripting-api\u002Fhttp')",{"type":43,"tag":72,"props":1947,"children":1948},{},[1949,1958,1966],{"type":43,"tag":94,"props":1950,"children":1951},{},[1952],{"type":43,"tag":100,"props":1953,"children":1955},{"className":1954},[],[1956],{"type":49,"value":1957},"license",{"type":43,"tag":94,"props":1959,"children":1960},{},[1961],{"type":43,"tag":194,"props":1962,"children":1964},{"href":1963},".\u002Freferences\u002Fapi\u002Flicense.md",[1965],{"type":49,"value":1963},{"type":43,"tag":94,"props":1967,"children":1968},{},[1969],{"type":43,"tag":100,"props":1970,"children":1972},{"className":1971},[],[1973],{"type":49,"value":1974},"require('@jetbrains\u002Fyoutrack-scripting-api\u002Flicense')",{"type":43,"tag":72,"props":1976,"children":1977},{},[1978,1987,1995],{"type":43,"tag":94,"props":1979,"children":1980},{},[1981],{"type":43,"tag":100,"props":1982,"children":1984},{"className":1983},[],[1985],{"type":49,"value":1986},"notifications",{"type":43,"tag":94,"props":1988,"children":1989},{},[1990],{"type":43,"tag":194,"props":1991,"children":1993},{"href":1992},".\u002Freferences\u002Fapi\u002Fnotifications.md",[1994],{"type":49,"value":1992},{"type":43,"tag":94,"props":1996,"children":1997},{},[1998],{"type":43,"tag":100,"props":1999,"children":2001},{"className":2000},[],[2002],{"type":49,"value":2003},"require('@jetbrains\u002Fyoutrack-scripting-api\u002Fnotifications')",{"type":43,"tag":72,"props":2005,"children":2006},{},[2007,2016,2024],{"type":43,"tag":94,"props":2008,"children":2009},{},[2010],{"type":43,"tag":100,"props":2011,"children":2013},{"className":2012},[],[2014],{"type":49,"value":2015},"search",{"type":43,"tag":94,"props":2017,"children":2018},{},[2019],{"type":43,"tag":194,"props":2020,"children":2022},{"href":2021},".\u002Freferences\u002Fapi\u002Fsearch.md",[2023],{"type":49,"value":2021},{"type":43,"tag":94,"props":2025,"children":2026},{},[2027],{"type":43,"tag":100,"props":2028,"children":2030},{"className":2029},[],[2031],{"type":49,"value":2032},"require('@jetbrains\u002Fyoutrack-scripting-api\u002Fsearch')",{"type":43,"tag":72,"props":2034,"children":2035},{},[2036,2045,2053],{"type":43,"tag":94,"props":2037,"children":2038},{},[2039],{"type":43,"tag":100,"props":2040,"children":2042},{"className":2041},[],[2043],{"type":49,"value":2044},"strings",{"type":43,"tag":94,"props":2046,"children":2047},{},[2048],{"type":43,"tag":194,"props":2049,"children":2051},{"href":2050},".\u002Freferences\u002Fapi\u002Fstrings.md",[2052],{"type":49,"value":2050},{"type":43,"tag":94,"props":2054,"children":2055},{},[2056],{"type":43,"tag":100,"props":2057,"children":2059},{"className":2058},[],[2060],{"type":49,"value":2061},"require('@jetbrains\u002Fyoutrack-scripting-api\u002Fstrings')",{"type":43,"tag":72,"props":2063,"children":2064},{},[2065,2074,2082],{"type":43,"tag":94,"props":2066,"children":2067},{},[2068],{"type":43,"tag":100,"props":2069,"children":2071},{"className":2070},[],[2072],{"type":49,"value":2073},"workflow",{"type":43,"tag":94,"props":2075,"children":2076},{},[2077],{"type":43,"tag":194,"props":2078,"children":2080},{"href":2079},".\u002Freferences\u002Fapi\u002Fworkflow.md",[2081],{"type":49,"value":2079},{"type":43,"tag":94,"props":2083,"children":2084},{},[2085],{"type":43,"tag":100,"props":2086,"children":2088},{"className":2087},[],[2089],{"type":49,"value":2090},"require('@jetbrains\u002Fyoutrack-scripting-api\u002Fworkflow')",{"type":43,"tag":2092,"props":2093,"children":2094},"style",{},[2095],{"type":49,"value":2096},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":2098,"total":2229},[2099,2117,2126,2135,2146,2156,2169,2178,2187,2197,2206,2219],{"slug":2100,"name":2100,"fn":2101,"description":2102,"org":2103,"tags":2104,"stars":2114,"repoUrl":2115,"updatedAt":2116},"mps-aspect-accessories","configure JetBrains MPS module dependencies","Wire MPS module and model dependencies, used languages, used devkits, extended languages, runtime solutions, accessory models, and language\u002Fdependency versions. Use when adding\u002Fremoving module dependencies, importing languages or devkits into a model, declaring runtime solutions, or shipping accessory content visible to consumers without explicit import.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2105,2108,2111],{"name":2106,"slug":2107,"type":13},"Architecture","architecture",{"name":2109,"slug":2110,"type":13},"Configuration","configuration",{"name":2112,"slug":2113,"type":13},"Engineering","engineering",1650,"https:\u002F\u002Fgithub.com\u002FJetBrains\u002FMPS","2026-07-17T06:06:57.311661",{"slug":2118,"name":2118,"fn":2119,"description":2120,"org":2121,"tags":2122,"stars":2114,"repoUrl":2115,"updatedAt":2125},"mps-aspect-actions","define and edit MPS node factories","Use when defining or editing MPS node factories (the \"actions\" aspect) — `NodeFactories` roots, per-concept `NodeFactory` setup functions that initialize a freshly created node and optionally copy data from a replaced `sampleNode`, plus the actions aspect's `CopyPasteHandlers` and `PasteWrappers` roots. Reach for this skill when a substitution, side transform, completion replacement, or `add new initialized(...)` should preserve fields from the node it is replacing, or when defaults set in a constructor are not enough.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2123,2124],{"name":2106,"slug":2107,"type":13},{"name":2112,"slug":2113,"type":13},"2026-07-17T06:04:48.066901",{"slug":2127,"name":2127,"fn":2128,"description":2129,"org":2130,"tags":2131,"stars":2114,"repoUrl":2115,"updatedAt":2134},"mps-aspect-behavior","define and edit MPS concept behavior","Use when defining or editing MPS `ConceptBehavior` — per-concept methods (non-virtual \u002F virtual \u002F abstract \u002F static \u002F virtual static), constructors, virtual dispatch (MRO), super and interface-default calls (`super\u003CInterface>.method`), overriding methods from `lang.core.behavior` interfaces such as `ScopeProvider.getScope` \u002F `INamedConcept.getName` \u002F `BaseConcept.getPresentation`, calling sibling methods (`LocalBehaviorMethodCall`) and behavior methods from other aspects via `node.method(...)`. Reach for this skill whenever the task involves authoring or modifying `\u003Clang>\u002FlanguageModels\u002Fbehavior.mps`.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2132,2133],{"name":2106,"slug":2107,"type":13},{"name":2112,"slug":2113,"type":13},"2026-07-13T06:45:21.757084",{"slug":2136,"name":2136,"fn":2137,"description":2138,"org":2139,"tags":2140,"stars":2114,"repoUrl":2115,"updatedAt":2145},"mps-aspect-constraints","define JetBrains MPS language constraints","Use when defining or editing MPS language constraints — property validators \u002F setters \u002F getters, referent search scopes (imperative or inherited via `ScopeProvider.getScope`), `referentSetHandler` side effects, default-scope blocks, `canBeChild` \u002F `canBeParent` \u002F `canBeAncestor` \u002F `canBeRoot` placement rules, `defaultConcreteConcept` for abstract concepts, `set \u003Cread-only>` and `{name}` aliasing, and scope helpers (`SimpleRoleScope`, `ListScope`, `CompositeScope`, `HidingByNameScope`). Reach for this skill whenever the task involves authoring or modifying `\u003Clang>\u002FlanguageModels\u002Fconstraints.mps`.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2141,2142],{"name":2106,"slug":2107,"type":13},{"name":2143,"slug":2144,"type":13},"Code Analysis","code-analysis","2026-07-23T05:41:33.639365",{"slug":2147,"name":2147,"fn":2148,"description":2149,"org":2150,"tags":2151,"stars":2114,"repoUrl":2115,"updatedAt":2155},"mps-aspect-dataflow","define and debug MPS dataflow builders","Use when defining or debugging MPS dataflow builders for a concept — control\u002Fdata flow declarations that drive reachability analysis and variable-use checking. Covers DataFlowBuilderDeclaration, BuilderBlock, emit instructions (code for, jump, ifjump, label, read, write, ret, mayBeUnreachable), positions (AfterPosition, BeforePosition, LabelPosition), the jetbrains.mps.lang.dataFlow language, the NodeParameter implicit, BL+smodel usage inside builder bodies, and IBuilderMode for advanced analyses such as nullable\u002Fnon-null tracking.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2152],{"name":2153,"slug":2154,"type":13},"Data Analysis","data-analysis","2026-07-13T06:45:19.114674",{"slug":2157,"name":2157,"fn":2158,"description":2159,"org":2160,"tags":2161,"stars":2114,"repoUrl":2115,"updatedAt":2168},"mps-aspect-editor","define MPS editor layouts","Use when creating or changing MPS editor definitions — the overall workflow from scaffolding a `ConceptEditorDeclaration` through componentizing reusable `EditorComponentDeclaration`s, refining cell models and cell layouts, applying style sheets and indent-layout style items, wiring smart references, leveraging inheritance via super-concepts and interfaces, inspecting (`print_node_json`, `show_node_representation`) and validating (`check_root_node_problems`). Covers `jetbrains.mps.lang.editor` cell models (`CellModel_RefNode`\u002F`CellModel_RefNodeList`\u002F`CellModel_RefCell`\u002F`CellModel_Property`\u002F`CellModel_Constant`), layout choices, and JSON blueprints for common editor shapes. For the non-layout side (action maps, keymaps, transformation\u002Fsubstitute menus) use `mps-aspect-editor-menus-and-keymaps`.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2162,2165],{"name":2163,"slug":2164,"type":13},"Design","design",{"name":2166,"slug":2167,"type":13},"UI Components","ui-components","2026-07-23T05:41:56.638151",{"slug":2170,"name":2170,"fn":2171,"description":2172,"org":2173,"tags":2174,"stars":2114,"repoUrl":2115,"updatedAt":2177},"mps-aspect-editor-menus-and-keymaps","author MPS editor menus and keymaps","Use when authoring the **non-layout** parts of the MPS editor aspect — what happens when the user types, presses a key, triggers completion, pastes, or invokes a context action. Covers action maps (`CellActionMapDeclaration`), cell keymaps (`CellKeyMapDeclaration`), transformation menus (`TransformationMenu_Default` \u002F `_Named` \u002F `_Contribution`), substitute menus (`SubstituteMenu_Default` \u002F `SubstituteMenu` \u002F contributions), side transforms (LEFT\u002FRIGHT), legacy cell menus, paste wrappers and copy-paste handlers (in the actions language), completion styling, reference presentation, two-step deletion, and the editor selection API. Trigger terms: `actionMap`, `keyMap`, `delete_action_id`, `transformationMenu`, `substituteMenu`, `Ctrl+Space`, `Ctrl+Alt+B`, side transform, paste wrapper, completion styling, `PasteWrappers`, `CopyPasteHandlers`. For the **layout** side (cells, layouts, style sheets) use `mps-aspect-editor` instead.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2175,2176],{"name":2112,"slug":2113,"type":13},{"name":2166,"slug":2167,"type":13},"2026-07-23T05:41:49.666535",{"slug":2179,"name":2179,"fn":2180,"description":2181,"org":2182,"tags":2183,"stars":2114,"repoUrl":2115,"updatedAt":2186},"mps-aspect-generation-plan","modify MPS generation plans","Use when defining or modifying an MPS generation plan — explicit ordering of generators, checkpoints for cross-model reference resolution, forks for parallel branches, IncludePlan composition, conditional PlanContribution activation, ParameterEquals\u002FConceptListSelector fork selectors, and InitModelAttributes for targetFacet routing. Apply when working with @genplan models, the jetbrains.mps.lang.generator.plan language, attaching plans via DevKits or the Custom generation facet, or debugging cross-model mapping label resolution.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2184,2185],{"name":2106,"slug":2107,"type":13},{"name":2112,"slug":2113,"type":13},"2026-07-13T06:44:59.507855",{"slug":2188,"name":2188,"fn":2189,"description":2190,"org":2191,"tags":2192,"stars":2114,"repoUrl":2115,"updatedAt":2196},"mps-aspect-generator","define JetBrains MPS generator rules","Use when defining or modifying MPS generators — author a generator module, add or edit root\u002Freduction\u002Fweaving\u002Fpattern mapping rules, attach template macros ($COPY_SRC, $LOOP, $IF, $PROPERTY, $REF, $SWITCH, $MAP_SRC, $WEAVE, $INSERT, $LABEL, $TRACE, $VAR), wire mapping labels, build template switches, write pre\u002Fpost mapping scripts, navigate `genContext`, or debug \"rule didn't fire\", missing references, empty output, infinite reduction loops, and generated-Java compile failures.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2193,2194,2195],{"name":2106,"slug":2107,"type":13},{"name":2143,"slug":2144,"type":13},{"name":2112,"slug":2113,"type":13},"2026-07-17T06:06:58.042999",{"slug":2198,"name":2198,"fn":2199,"description":2200,"org":2201,"tags":2202,"stars":2114,"repoUrl":2115,"updatedAt":2205},"mps-aspect-intentions","define and edit MPS intentions","Use when defining or editing MPS intentions (the Alt+Enter context-action aspect) — adding `IntentionDeclaration` roots, parameterized or surround-with variants, description\u002FisApplicable\u002Fexecute blocks, child-filter functions, factory-initialized AST splicing, or debugging why an intention is not offered. Lives in the language's `intentions` model and uses `jetbrains.mps.lang.intentions`.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2203,2204],{"name":2106,"slug":2107,"type":13},{"name":2112,"slug":2113,"type":13},"2026-07-23T05:41:48.692899",{"slug":2207,"name":2207,"fn":2208,"description":2209,"org":2210,"tags":2211,"stars":2114,"repoUrl":2115,"updatedAt":2218},"mps-aspect-migrations","author and debug MPS migration scripts","Use when authoring or debugging MPS migration scripts that upgrade user models after a language definition changes — covers jetbrains.mps.lang.migration (MigrationScript class-based, PureMigrationScript declarative, MoveConcept\u002FMoveContainmentLink\u002FMoveReferenceLink\u002FMoveProperty, ordering via OrderDependency, data exchange via putData\u002FgetData, RefactoringLog, ConceptMigrationReference) and jetbrains.mps.lang.script Enhancement Scripts (MigrationScript with MigrationScriptPart_Instance, ExtractInterfaceMigration, FactoryMigrationScriptPart, CommentMigrationScriptPart) — when a model needs version-gated upgrade, concept rename or removal, link or property rename, instance-level transformation, or composition of migration steps.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2212,2215],{"name":2213,"slug":2214,"type":13},"Debugging","debugging",{"name":2216,"slug":2217,"type":13},"Migration","migration","2026-07-13T06:45:20.372122",{"slug":2220,"name":2220,"fn":2221,"description":2222,"org":2223,"tags":2224,"stars":2114,"repoUrl":2115,"updatedAt":2228},"mps-aspect-structure-concepts","define concepts in MPS structure aspect","Define concepts, interface concepts, enumerations, and constrained data types in an MPS language's `structure` aspect. Covers smart-reference detection, alias rules, cardinality, INamedConcept usage, bulk creation, and the full `mps_mcp_alter_structure` \u002F `mps_mcp_query_structure` reference. Use when authoring or modifying a language's structure model.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2225],{"name":2226,"slug":2227,"type":13},"Data Modeling","data-modeling","2026-07-23T05:41:30.705975",188,{"items":2231,"total":641},[2232],{"slug":4,"name":4,"fn":5,"description":6,"org":2233,"tags":2234,"stars":23,"repoUrl":24,"updatedAt":25},{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2235,2236,2237,2238],{"name":21,"slug":22,"type":13},{"name":15,"slug":16,"type":13},{"name":9,"slug":8,"type":13},{"name":18,"slug":19,"type":13}]