[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-microsoft-digital-twin-universe":3,"mdc--ozwptg-key":33,"related-org-microsoft-digital-twin-universe":2093,"related-repo-microsoft-digital-twin-universe":2288},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":22,"repoUrl":23,"updatedAt":24,"license":25,"forks":26,"topics":27,"repo":28,"sourceUrl":31,"mdContent":32},"digital-twin-universe","test code in isolated deployment environments","Use when the user needs an isolated, realistic deployment environment to test code beyond \"tests pass on my machine.\" Covers launching environments from declarative profiles, executing commands inside them, managing their lifecycle, debugging networking or provisioning issues, and working with Incus containers. Also use when the user wants to simulate an end-user experience (e.g. Amplifier CLI, web UIs) without touching production infrastructure. Triggers on digital twin, DTU, isolated environment, simulation environment, amplifier-digital-twin, incus container, profile launch, test in realistic environment, deploy simulation. ALWAYS use this skill whenever a \"Digital Twin\" is mentioned!",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"microsoft","Microsoft","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fmicrosoft.png",[12,16,19],{"name":13,"slug":14,"type":15},"QA","qa","tag",{"name":17,"slug":18,"type":15},"Deployment","deployment",{"name":20,"slug":21,"type":15},"Testing","testing",6,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Famplifier-bundle-digital-twin-universe","2026-07-28T05:36:52.215479",null,2,[],{"repoUrl":23,"stars":22,"forks":26,"topics":29,"description":30},[],"Digital Twin Universe bundle for the Amplifier project","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Famplifier-bundle-digital-twin-universe\u002Ftree\u002FHEAD\u002Fskills\u002Fdigital-twin-universe","---\nname: digital-twin-universe\ndescription: Use when the user needs an isolated, realistic deployment environment to test code beyond \"tests pass on my machine.\" Covers launching environments from declarative profiles, executing commands inside them, managing their lifecycle, debugging networking or provisioning issues, and working with Incus containers. Also use when the user wants to simulate an end-user experience (e.g. Amplifier CLI, web UIs) without touching production infrastructure. Triggers on digital twin, DTU, isolated environment, simulation environment, amplifier-digital-twin, incus container, profile launch, test in realistic environment, deploy simulation. ALWAYS use this skill whenever a \"Digital Twin\" is mentioned!\nuser-invocable: true\n---\n\n# Digital Twin Universe Environments\n\n`amplifier-digital-twin` is a CLI for on-demand, isolated environments launched from declarative profiles. Environments can be updated in-place (pull fresh code, reinstall) without destroying and relaunching. All commands output JSON to stdout.\n\n## Prerequisites Check\n\nBefore any DTU operation, verify the environment:\n\n```bash\n# 1. Double check the CLI is installed\nwhich amplifier-digital-twin\n\n# 2. Is Incus available and running?\nwhich incus && incus version && echo \"Incus OK\" || echo \"Incus NOT available\"\n```\n\nIf `amplifier-digital-twin` is not found:\n```bash\nuv tool install git+https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Famplifier-bundle-digital-twin-universe@main\n```\n\n### Installing Incus\n\nIf the user doesn't have Incus installed, walk them through the platform-specific steps in the install guide. Present sudo commands to the user one at a time.\nIf their system is not in the documentation, go to the actual documentation at https:\u002F\u002Flinuxcontainers.org\u002Fincus\u002Fdocs\u002Fmain\u002Finstalling\u002F\n\n```\nread_file(\"@digital-twin-universe:docs\u002Finstalling-incus.md\")\n```\n\nAfter the user completes the install steps, run the verification commands yourself (`incus version`, launch a test container, exec into it, delete it). Report results to the user rather than asking them to run verification.\n\n### Installing Docker\n\nDocker is only needed for profiles that use Gitea repos or mock service sidecars. Check if it's already installed with `docker version`. \nYou should encourage the user to install Docker since some circumstances will require it.\nIf it's not installed, walk the user through the install guide:\n\n```\nread_file(\"@digital-twin-universe:docs\u002Finstalling-docker.md\")\n```\n\nAfter installing, make sure to test to see if its working as expected.\n\n**If prerequisites are missing, report clearly and stop. Do not attempt workarounds.**\n\n## When to Use Gitea with a Digital Twin\n\nThe Gitea bundle is included as a dependency of this bundle. Use Gitea whenever\nthe project has **local repos that need to be tested as if they were already\npublished on GitHub**. Gitea serves it locally so the Digital Twin can consume it without pushing to origin.\n\nCommon scenarios:\n- Verifying that unpublished code installs and runs correctly in isolation as if they were published to GitHub or PyPI\n- Amplifier specific: Testing local changes to a bundle, module, or app before pushing\n\n**NEVER push changes to upstream just to make them available inside a Digital Twin.**\nClone the local repos into Gitea first, then reference those in the profile via\n`url_rewrites` or `pypi_overrides`. Load the `gitea` skill for full CLI usage.\n\nIf the use case warrants it, you should FIRST load the `gitea` skill and setup the environment for the user.\n\n**Use the correct Gitea URL\u002Fendpoint for the system.** When the profile uses\n`url_rewrites` or `pypi_overrides`, pass the Gitea endpoint via\n`--var GITEA_URL=...` (and `--var GITEA_TOKEN=...`). The right value depends\non where the DTU host and the Gitea container can reach each other.\n\n## Documentation\n\nYou **must** load these files and refer to them as they contain necessary information on how to use the digital twin universe correctly.\n\nFor overview, quick start, installation, and feature list:\n\n```\nread_file(\"@digital-twin-universe:README.md\")\n```\n\nFor complete CLI reference with all flags and output schemas:\n\n```\nread_file(\"@digital-twin-universe:docs\u002Fapi-reference.md\")\n```\n\nFor the full profile schema and field reference, sample profiles organized by bucket (`amplifier\u002F`, `patterns\u002F`, `tests\u002F`, `community\u002F`), and contribution guidelines:\n\n```\nread_file(\"@digital-twin-universe:docs\u002Fprofiles.md\")\n```\n\nFor building mock services (Docker sidecars with domain interception) and discovering community-published mocks:\n\n```\nread_file(\"@digital-twin-universe:docs\u002Fmock-authoring.md\")\n```\n\nFor running Docker inside a Digital Twin Universe environment (nested containers), including platform-specific setup and troubleshooting:\n\n```\nread_file(\"@digital-twin-universe:docs\u002Fdocker-in-incus.md\")\n```\n\n## Shell Access\n\nWhen giving the user a command for an interactive shell in a DTU for a user (without explicit flag preferences), default to giving them a command with the default visual-id so they know that they are in a DTU:\n\n```bash\namplifier-digital-twin exec --visual-id \"\" \u003Cid>\n```\n\n`--visual-id \"\"` (the empty string sentinel) prepends `(dtu:\u003Cprofile>)` in\nblue to the prompt so the user can tell which DTU they are in. If the user\nhas several DTUs on the same profile, pass an explicit label so the prompts\nremain distinct:\n\n```bash\namplifier-digital-twin exec --visual-id testing-pr-42 \u003Cid>\n```\n\n**Important:** `--visual-id` always takes a value. The empty string `\"\"`\nmeans \"use the profile name\"; any non-empty value is used as the literal\nlabel. Always quote the empty string -- `--visual-id \"\"`.\n\n## Running Commands in a DTU\n\nEvery command path (`exec`, `exec --stream`, `provision.setup_cmds`,\n`provision.update.cmds`, `readiness.command`, bare interactive) is wrapped\nin `bash -lc`. The login shell sources `\u002Fetc\u002Fprofile.d\u002Fdtu-env.sh`, which\nputs `\u002Froot\u002F.cargo\u002Fbin:\u002Froot\u002F.local\u002Fbin` on PATH and exports passthrough\nenv vars.\n\n**Write commands bare.** Anything from `uv tool install` (`amplifier`,\n`uv`, etc.) resolves without help:\n\n```bash\namplifier-digital-twin exec \u003Cid> -- amplifier --version\n```\n\nDo NOT add any of the following — all redundant, all dead weight from older profiles:\n\n- `bash -lc '...'` wrapping (double-wraps).\n- `bash -c 'export PATH=\"\u002Froot\u002F.local\u002Fbin:$PATH\" && cmd'`.\n- `PATH=\u002Froot\u002F.local\u002Fbin:$PATH cmd` prefix on `readiness.command`.\n- Hardcoded `\u002Froot\u002F.local\u002Fbin\u002F\u003Ctool>` paths — use bare commands or\n  `command -v \u003Ctool>` for existence checks.\n- `export PATH=\"\u002Froot\u002F.local\u002Fbin:$PATH\"` at the top of heredoc\n  `setup_cmds` blocks.\n\nUse `bash -c` only when you need a shell construct (pipes, redirects,\n`&&`\u002F`||`, expansion) in a single command. Do not use `bash -lc` — the\nouter wrap already provides the login shell.\n\n## File Transfer\n\n`file-push` and `file-pull` move files between the host and a running DTU\nwithout going through `exec`. Both commands accept multiple sources before\nthe destination.\n\n```bash\n# Single file\namplifier-digital-twin file-push \u003Cid> .\u002Fconfig.yaml \u002Froot\u002Fconfig.yaml\namplifier-digital-twin file-pull \u003Cid> \u002Fvar\u002Flog\u002Fapp.log .\u002Fapp.log\n\n# Directory (-r is required when any source is a directory)\namplifier-digital-twin file-push -r \u003Cid> .\u002Fdata\u002F \u002Froot\u002Fapp\u002F\namplifier-digital-twin file-pull -r \u003Cid> \u002Froot\u002Fresults\u002F .\u002F\n```\n\n`-r\u002F--recursive` defaults to **off** for both commands. Pass `-r` when any\nsource is a directory; leave it off for single-file or multi-file transfers.\n\nOn `file-push -r`, the destination is treated as the **parent directory**\nand the source's basename is preserved inside it. Pushing `.\u002Fdata\u002F` to\n`\u002Froot\u002Fapp\u002F` lands files at `\u002Froot\u002Fapp\u002Fdata\u002F...`. To put contents directly\nat `\u002Froot\u002Fapp\u002Fdata\u002F`, push to `\u002Froot\u002Fapp\u002F` and let the basename land\nnaturally (do not push to `\u002Froot\u002Fapp\u002Fdata\u002F` -- that produces\n`\u002Froot\u002Fapp\u002Fdata\u002Fdata\u002F...`).\n\n## Hostname Support (mDNS)\n\nEnvironments can register a `.local` hostname via Avahi mDNS, making it easy to\ntell multiple DTU instances apart (e.g. `http:\u002F\u002Fmy-app.local:8410\u002F` instead of\n`http:\u002F\u002Flocalhost:8410\u002F`).\n\n**Prerequisites:** `avahi-daemon` and `avahi-utils` must be installed:\n```bash\nwhich avahi-publish-address && echo \"Avahi OK\" || echo \"Install: sudo apt install avahi-daemon avahi-utils\"\n```\n\n**Usage:** Set `access.hostname` in the profile or pass `--hostname` on the CLI:\n```bash\namplifier-digital-twin launch my-profile --hostname my-app\n# => access URLs will be http:\u002F\u002Fmy-app.local:\u003Cport>\u002F...\n```\n\nIf Avahi is not installed, hostname registration is silently skipped and access\nURLs fall back to `localhost`. No error, no failure -- it's a graceful degradation.\n\n**Platform support:**\n- Native Linux: fully supported (LAN-wide resolution via mDNS)\n- WSL2: works within WSL2; Windows browsers cannot resolve `.local` names from WSL2\n- macOS\u002FWindows: not supported (warning printed, falls back to localhost)\n\n## Updating Running Environments\n\nProfiles can define an `update` section with commands to pull fresh code and\nreinstall without destroying the environment:\n\n```bash\namplifier-digital-twin update \u003Cid> [--var K=V ...] [--skip-readiness]\n```\n\nThis enables a fast `launch` -> `update` -> `test` iteration loop. If the\nprofile has `refresh_pypi: true` in the `update` section, PyPI overrides are\nrebuilt from the current state of the source repos before running update commands.\n\nSee `api-reference.md` for the full `update` command reference and `profiles.md`\nfor the `update` profile schema.\n\n\n## Example Profiles\n\nWhen constructing profiles, read the most relevant examples first to understand established patterns:\n\n```\nread_file(\"@digital-twin-universe:profiles\u002Ftests\u002Famplifier-user-sim.yaml\")\nread_file(\"@digital-twin-universe:profiles\u002Famplifier\u002Famplifier-chat.yaml\")\nread_file(\"@digital-twin-universe:profiles\u002Famplifier\u002Famplifier-standalone.yaml\")\nread_file(\"@digital-twin-universe:profiles\u002Fpatterns\u002Fprivate-github-repo.yaml\")\nread_file(\"@digital-twin-universe:profiles\u002Ftests\u002Fdocker-in-incus.yaml\")\n```\n\nThe `amplifier-standalone` profile is a standalone Amplifier user environment\nwith the foundation bundle composed onto every session. Use it when the user\nwants to `exec` in and run interactive `amplifier` sessions immediately, with\nno extra services or UI on top.\n\nThe `private-github-repo` profile shows how to install from a private GitHub\nrepo without Gitea. It passes `GH_TOKEN` via `passthrough.services` and\nconfigures `git config --global url...insteadOf` to authenticate all clones.\nUse this pattern when you need to test the pushed state of a private repo.\nFor testing local uncommitted changes, use Gitea + `url_rewrites` instead.\n\nThe `docker-in-incus` profile is a minimal test for running Docker containers\ninside an Incus-based environment. Use it to verify that nested container\nnetworking works on a given host before attempting more complex profiles that\ndepend on Docker.\n\n## Profile Placement Convention\n\nWhen generating or saving DTU profiles, use this default path:\n\n```\n.amplifier\u002Fdigital-twin-universe\u002Fprofiles\u002F\u003Cprofile-name>.yaml\n```\n\nThis path is relative to the workspace or current working directory. Create the\ndirectory structure if it doesn't exist.\n\nDo not commit generated profiles by default. Profiles are often workspace-specific and ephemeral. \nIf the user explicitly wants a profile shipped with a repo, default to placing it\nat `\u003Crepo>\u002F.amplifier\u002Fdigital-twin-universe\u002Fprofiles\u002F\u003Cprofile-name>.yaml`.\n\n## Agents\n\nFor specialized DTU tasks within Amplifier sessions, you **MUST** use these agents instead of driving the CLI manually:\n\n- **`dtu-profile-builder`** — Explores a user's project repo, generates a DTU profile, launches the environment, and hands back access details. Use when the user has a project and wants to create a digital twin for it.\n\n\n## Cleanup Safety\n\n`amplifier-digital-twin list` returns **all** DTU environments on the machine,\nnot just ones from your session. Other users or concurrent sessions may have\nrunning instances.\n\n**Safe pattern:** Note the `id` returned by `launch` and only `destroy` that\nspecific ID when you are done.\n\n**Dangerous pattern:** Iterating `list` and destroying every entry. This will\ntear down environments belonging to other sessions.\n\nThere is currently no owner or session identifier in the `list` output. If you\nneed to identify your instance, match on the `id` you received from `launch`,\nor use `created_at` to narrow down which instance is yours. \nIf you are unsure, leave it and tell the user to clean up when they are ready.\n\n\n### Docker Inside a Digital Twin Universe Environment (pre-flight)\n\nDTU launches enable `security.nesting=true` by default, so profiles that run\nDocker inside the Incus container (e.g. spawning worker containers, running\nDocker Compose stacks) do not need to set it explicitly. A profile can opt out\nby setting `security.nesting: \"false\"` in `base.config` if isolation matters\nmore than Docker support.\n\nAt any point that Docker in Incus might be required, you MUST read the full\nguide on platform-specific issues and networking paths:\n\n```\nread_file(\"@digital-twin-universe:docs\u002Fdocker-in-incus.md\")\n```\n\nThe `docker-in-incus` profile can be used to verify the setup works before\nattempting more complex profiles.\n\n\n## Troubleshooting\n\nFor any error, unexpected behavior, or environment issue, read the troubleshooting reference:\n\n```\nread_file(\"@digital-twin-universe:docs\u002Ftroubleshooting.md\")\n```\n\nIf the behavior contradicts the docs, check what changed between versions:\n\n```\nread_file(\"@digital-twin-universe:docs\u002FCHANGELOG.md\")\n```\n",{"data":34,"body":36},{"name":4,"description":6,"user-invocable":35},true,{"type":37,"children":38},"root",[39,48,61,68,73,205,217,247,254,267,277,290,296,309,318,323,332,338,350,355,370,404,416,455,461,473,478,487,492,501,536,545,550,559,564,573,579,584,634,653,696,729,735,801,833,883,888,969,1005,1011,1037,1227,1253,1327,1333,1361,1385,1446,1472,1514,1527,1535,1560,1566,1579,1634,1676,1711,1717,1722,1731,1758,1801,1813,1819,1824,1833,1838,1850,1856,1868,1885,1891,1909,1942,1960,1994,2000,2029,2034,2042,2053,2059,2064,2073,2078,2087],{"type":40,"tag":41,"props":42,"children":44},"element","h1",{"id":43},"digital-twin-universe-environments",[45],{"type":46,"value":47},"text","Digital Twin Universe Environments",{"type":40,"tag":49,"props":50,"children":51},"p",{},[52,59],{"type":40,"tag":53,"props":54,"children":56},"code",{"className":55},[],[57],{"type":46,"value":58},"amplifier-digital-twin",{"type":46,"value":60}," is a CLI for on-demand, isolated environments launched from declarative profiles. Environments can be updated in-place (pull fresh code, reinstall) without destroying and relaunching. All commands output JSON to stdout.",{"type":40,"tag":62,"props":63,"children":65},"h2",{"id":64},"prerequisites-check",[66],{"type":46,"value":67},"Prerequisites Check",{"type":40,"tag":49,"props":69,"children":70},{},[71],{"type":46,"value":72},"Before any DTU operation, verify the environment:",{"type":40,"tag":74,"props":75,"children":80},"pre",{"className":76,"code":77,"language":78,"meta":79,"style":79},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# 1. Double check the CLI is installed\nwhich amplifier-digital-twin\n\n# 2. Is Incus available and running?\nwhich incus && incus version && echo \"Incus OK\" || echo \"Incus NOT available\"\n","bash","",[81],{"type":40,"tag":53,"props":82,"children":83},{"__ignoreMap":79},[84,96,111,120,129],{"type":40,"tag":85,"props":86,"children":89},"span",{"class":87,"line":88},"line",1,[90],{"type":40,"tag":85,"props":91,"children":93},{"style":92},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic",[94],{"type":46,"value":95},"# 1. Double check the CLI is installed\n",{"type":40,"tag":85,"props":97,"children":98},{"class":87,"line":26},[99,105],{"type":40,"tag":85,"props":100,"children":102},{"style":101},"--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF",[103],{"type":46,"value":104},"which",{"type":40,"tag":85,"props":106,"children":108},{"style":107},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[109],{"type":46,"value":110}," amplifier-digital-twin\n",{"type":40,"tag":85,"props":112,"children":114},{"class":87,"line":113},3,[115],{"type":40,"tag":85,"props":116,"children":117},{"emptyLinePlaceholder":35},[118],{"type":46,"value":119},"\n",{"type":40,"tag":85,"props":121,"children":123},{"class":87,"line":122},4,[124],{"type":40,"tag":85,"props":125,"children":126},{"style":92},[127],{"type":46,"value":128},"# 2. Is Incus available and running?\n",{"type":40,"tag":85,"props":130,"children":132},{"class":87,"line":131},5,[133,137,142,148,153,158,162,167,172,177,182,187,191,195,200],{"type":40,"tag":85,"props":134,"children":135},{"style":101},[136],{"type":46,"value":104},{"type":40,"tag":85,"props":138,"children":139},{"style":107},[140],{"type":46,"value":141}," incus",{"type":40,"tag":85,"props":143,"children":145},{"style":144},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[146],{"type":46,"value":147}," &&",{"type":40,"tag":85,"props":149,"children":151},{"style":150},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[152],{"type":46,"value":141},{"type":40,"tag":85,"props":154,"children":155},{"style":107},[156],{"type":46,"value":157}," version",{"type":40,"tag":85,"props":159,"children":160},{"style":144},[161],{"type":46,"value":147},{"type":40,"tag":85,"props":163,"children":164},{"style":101},[165],{"type":46,"value":166}," echo",{"type":40,"tag":85,"props":168,"children":169},{"style":144},[170],{"type":46,"value":171}," \"",{"type":40,"tag":85,"props":173,"children":174},{"style":107},[175],{"type":46,"value":176},"Incus OK",{"type":40,"tag":85,"props":178,"children":179},{"style":144},[180],{"type":46,"value":181},"\"",{"type":40,"tag":85,"props":183,"children":184},{"style":144},[185],{"type":46,"value":186}," ||",{"type":40,"tag":85,"props":188,"children":189},{"style":101},[190],{"type":46,"value":166},{"type":40,"tag":85,"props":192,"children":193},{"style":144},[194],{"type":46,"value":171},{"type":40,"tag":85,"props":196,"children":197},{"style":107},[198],{"type":46,"value":199},"Incus NOT available",{"type":40,"tag":85,"props":201,"children":202},{"style":144},[203],{"type":46,"value":204},"\"\n",{"type":40,"tag":49,"props":206,"children":207},{},[208,210,215],{"type":46,"value":209},"If ",{"type":40,"tag":53,"props":211,"children":213},{"className":212},[],[214],{"type":46,"value":58},{"type":46,"value":216}," is not found:",{"type":40,"tag":74,"props":218,"children":220},{"className":76,"code":219,"language":78,"meta":79,"style":79},"uv tool install git+https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Famplifier-bundle-digital-twin-universe@main\n",[221],{"type":40,"tag":53,"props":222,"children":223},{"__ignoreMap":79},[224],{"type":40,"tag":85,"props":225,"children":226},{"class":87,"line":88},[227,232,237,242],{"type":40,"tag":85,"props":228,"children":229},{"style":150},[230],{"type":46,"value":231},"uv",{"type":40,"tag":85,"props":233,"children":234},{"style":107},[235],{"type":46,"value":236}," tool",{"type":40,"tag":85,"props":238,"children":239},{"style":107},[240],{"type":46,"value":241}," install",{"type":40,"tag":85,"props":243,"children":244},{"style":107},[245],{"type":46,"value":246}," git+https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Famplifier-bundle-digital-twin-universe@main\n",{"type":40,"tag":248,"props":249,"children":251},"h3",{"id":250},"installing-incus",[252],{"type":46,"value":253},"Installing Incus",{"type":40,"tag":49,"props":255,"children":256},{},[257,259],{"type":46,"value":258},"If the user doesn't have Incus installed, walk them through the platform-specific steps in the install guide. Present sudo commands to the user one at a time.\nIf their system is not in the documentation, go to the actual documentation at ",{"type":40,"tag":260,"props":261,"children":265},"a",{"href":262,"rel":263},"https:\u002F\u002Flinuxcontainers.org\u002Fincus\u002Fdocs\u002Fmain\u002Finstalling\u002F",[264],"nofollow",[266],{"type":46,"value":262},{"type":40,"tag":74,"props":268,"children":272},{"className":269,"code":271,"language":46},[270],"language-text","read_file(\"@digital-twin-universe:docs\u002Finstalling-incus.md\")\n",[273],{"type":40,"tag":53,"props":274,"children":275},{"__ignoreMap":79},[276],{"type":46,"value":271},{"type":40,"tag":49,"props":278,"children":279},{},[280,282,288],{"type":46,"value":281},"After the user completes the install steps, run the verification commands yourself (",{"type":40,"tag":53,"props":283,"children":285},{"className":284},[],[286],{"type":46,"value":287},"incus version",{"type":46,"value":289},", launch a test container, exec into it, delete it). Report results to the user rather than asking them to run verification.",{"type":40,"tag":248,"props":291,"children":293},{"id":292},"installing-docker",[294],{"type":46,"value":295},"Installing Docker",{"type":40,"tag":49,"props":297,"children":298},{},[299,301,307],{"type":46,"value":300},"Docker is only needed for profiles that use Gitea repos or mock service sidecars. Check if it's already installed with ",{"type":40,"tag":53,"props":302,"children":304},{"className":303},[],[305],{"type":46,"value":306},"docker version",{"type":46,"value":308},".\nYou should encourage the user to install Docker since some circumstances will require it.\nIf it's not installed, walk the user through the install guide:",{"type":40,"tag":74,"props":310,"children":313},{"className":311,"code":312,"language":46},[270],"read_file(\"@digital-twin-universe:docs\u002Finstalling-docker.md\")\n",[314],{"type":40,"tag":53,"props":315,"children":316},{"__ignoreMap":79},[317],{"type":46,"value":312},{"type":40,"tag":49,"props":319,"children":320},{},[321],{"type":46,"value":322},"After installing, make sure to test to see if its working as expected.",{"type":40,"tag":49,"props":324,"children":325},{},[326],{"type":40,"tag":327,"props":328,"children":329},"strong",{},[330],{"type":46,"value":331},"If prerequisites are missing, report clearly and stop. Do not attempt workarounds.",{"type":40,"tag":62,"props":333,"children":335},{"id":334},"when-to-use-gitea-with-a-digital-twin",[336],{"type":46,"value":337},"When to Use Gitea with a Digital Twin",{"type":40,"tag":49,"props":339,"children":340},{},[341,343,348],{"type":46,"value":342},"The Gitea bundle is included as a dependency of this bundle. Use Gitea whenever\nthe project has ",{"type":40,"tag":327,"props":344,"children":345},{},[346],{"type":46,"value":347},"local repos that need to be tested as if they were already\npublished on GitHub",{"type":46,"value":349},". Gitea serves it locally so the Digital Twin can consume it without pushing to origin.",{"type":40,"tag":49,"props":351,"children":352},{},[353],{"type":46,"value":354},"Common scenarios:",{"type":40,"tag":356,"props":357,"children":358},"ul",{},[359,365],{"type":40,"tag":360,"props":361,"children":362},"li",{},[363],{"type":46,"value":364},"Verifying that unpublished code installs and runs correctly in isolation as if they were published to GitHub or PyPI",{"type":40,"tag":360,"props":366,"children":367},{},[368],{"type":46,"value":369},"Amplifier specific: Testing local changes to a bundle, module, or app before pushing",{"type":40,"tag":49,"props":371,"children":372},{},[373,378,380,386,388,394,396,402],{"type":40,"tag":327,"props":374,"children":375},{},[376],{"type":46,"value":377},"NEVER push changes to upstream just to make them available inside a Digital Twin.",{"type":46,"value":379},"\nClone the local repos into Gitea first, then reference those in the profile via\n",{"type":40,"tag":53,"props":381,"children":383},{"className":382},[],[384],{"type":46,"value":385},"url_rewrites",{"type":46,"value":387}," or ",{"type":40,"tag":53,"props":389,"children":391},{"className":390},[],[392],{"type":46,"value":393},"pypi_overrides",{"type":46,"value":395},". Load the ",{"type":40,"tag":53,"props":397,"children":399},{"className":398},[],[400],{"type":46,"value":401},"gitea",{"type":46,"value":403}," skill for full CLI usage.",{"type":40,"tag":49,"props":405,"children":406},{},[407,409,414],{"type":46,"value":408},"If the use case warrants it, you should FIRST load the ",{"type":40,"tag":53,"props":410,"children":412},{"className":411},[],[413],{"type":46,"value":401},{"type":46,"value":415}," skill and setup the environment for the user.",{"type":40,"tag":49,"props":417,"children":418},{},[419,424,426,431,432,437,439,445,447,453],{"type":40,"tag":327,"props":420,"children":421},{},[422],{"type":46,"value":423},"Use the correct Gitea URL\u002Fendpoint for the system.",{"type":46,"value":425}," When the profile uses\n",{"type":40,"tag":53,"props":427,"children":429},{"className":428},[],[430],{"type":46,"value":385},{"type":46,"value":387},{"type":40,"tag":53,"props":433,"children":435},{"className":434},[],[436],{"type":46,"value":393},{"type":46,"value":438},", pass the Gitea endpoint via\n",{"type":40,"tag":53,"props":440,"children":442},{"className":441},[],[443],{"type":46,"value":444},"--var GITEA_URL=...",{"type":46,"value":446}," (and ",{"type":40,"tag":53,"props":448,"children":450},{"className":449},[],[451],{"type":46,"value":452},"--var GITEA_TOKEN=...",{"type":46,"value":454},"). The right value depends\non where the DTU host and the Gitea container can reach each other.",{"type":40,"tag":62,"props":456,"children":458},{"id":457},"documentation",[459],{"type":46,"value":460},"Documentation",{"type":40,"tag":49,"props":462,"children":463},{},[464,466,471],{"type":46,"value":465},"You ",{"type":40,"tag":327,"props":467,"children":468},{},[469],{"type":46,"value":470},"must",{"type":46,"value":472}," load these files and refer to them as they contain necessary information on how to use the digital twin universe correctly.",{"type":40,"tag":49,"props":474,"children":475},{},[476],{"type":46,"value":477},"For overview, quick start, installation, and feature list:",{"type":40,"tag":74,"props":479,"children":482},{"className":480,"code":481,"language":46},[270],"read_file(\"@digital-twin-universe:README.md\")\n",[483],{"type":40,"tag":53,"props":484,"children":485},{"__ignoreMap":79},[486],{"type":46,"value":481},{"type":40,"tag":49,"props":488,"children":489},{},[490],{"type":46,"value":491},"For complete CLI reference with all flags and output schemas:",{"type":40,"tag":74,"props":493,"children":496},{"className":494,"code":495,"language":46},[270],"read_file(\"@digital-twin-universe:docs\u002Fapi-reference.md\")\n",[497],{"type":40,"tag":53,"props":498,"children":499},{"__ignoreMap":79},[500],{"type":46,"value":495},{"type":40,"tag":49,"props":502,"children":503},{},[504,506,512,514,520,521,527,528,534],{"type":46,"value":505},"For the full profile schema and field reference, sample profiles organized by bucket (",{"type":40,"tag":53,"props":507,"children":509},{"className":508},[],[510],{"type":46,"value":511},"amplifier\u002F",{"type":46,"value":513},", ",{"type":40,"tag":53,"props":515,"children":517},{"className":516},[],[518],{"type":46,"value":519},"patterns\u002F",{"type":46,"value":513},{"type":40,"tag":53,"props":522,"children":524},{"className":523},[],[525],{"type":46,"value":526},"tests\u002F",{"type":46,"value":513},{"type":40,"tag":53,"props":529,"children":531},{"className":530},[],[532],{"type":46,"value":533},"community\u002F",{"type":46,"value":535},"), and contribution guidelines:",{"type":40,"tag":74,"props":537,"children":540},{"className":538,"code":539,"language":46},[270],"read_file(\"@digital-twin-universe:docs\u002Fprofiles.md\")\n",[541],{"type":40,"tag":53,"props":542,"children":543},{"__ignoreMap":79},[544],{"type":46,"value":539},{"type":40,"tag":49,"props":546,"children":547},{},[548],{"type":46,"value":549},"For building mock services (Docker sidecars with domain interception) and discovering community-published mocks:",{"type":40,"tag":74,"props":551,"children":554},{"className":552,"code":553,"language":46},[270],"read_file(\"@digital-twin-universe:docs\u002Fmock-authoring.md\")\n",[555],{"type":40,"tag":53,"props":556,"children":557},{"__ignoreMap":79},[558],{"type":46,"value":553},{"type":40,"tag":49,"props":560,"children":561},{},[562],{"type":46,"value":563},"For running Docker inside a Digital Twin Universe environment (nested containers), including platform-specific setup and troubleshooting:",{"type":40,"tag":74,"props":565,"children":568},{"className":566,"code":567,"language":46},[270],"read_file(\"@digital-twin-universe:docs\u002Fdocker-in-incus.md\")\n",[569],{"type":40,"tag":53,"props":570,"children":571},{"__ignoreMap":79},[572],{"type":46,"value":567},{"type":40,"tag":62,"props":574,"children":576},{"id":575},"shell-access",[577],{"type":46,"value":578},"Shell Access",{"type":40,"tag":49,"props":580,"children":581},{},[582],{"type":46,"value":583},"When giving the user a command for an interactive shell in a DTU for a user (without explicit flag preferences), default to giving them a command with the default visual-id so they know that they are in a DTU:",{"type":40,"tag":74,"props":585,"children":587},{"className":76,"code":586,"language":78,"meta":79,"style":79},"amplifier-digital-twin exec --visual-id \"\" \u003Cid>\n",[588],{"type":40,"tag":53,"props":589,"children":590},{"__ignoreMap":79},[591],{"type":40,"tag":85,"props":592,"children":593},{"class":87,"line":88},[594,598,603,608,613,618,623,629],{"type":40,"tag":85,"props":595,"children":596},{"style":150},[597],{"type":46,"value":58},{"type":40,"tag":85,"props":599,"children":600},{"style":107},[601],{"type":46,"value":602}," exec",{"type":40,"tag":85,"props":604,"children":605},{"style":107},[606],{"type":46,"value":607}," --visual-id",{"type":40,"tag":85,"props":609,"children":610},{"style":144},[611],{"type":46,"value":612}," \"\"",{"type":40,"tag":85,"props":614,"children":615},{"style":144},[616],{"type":46,"value":617}," \u003C",{"type":40,"tag":85,"props":619,"children":620},{"style":107},[621],{"type":46,"value":622},"i",{"type":40,"tag":85,"props":624,"children":626},{"style":625},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[627],{"type":46,"value":628},"d",{"type":40,"tag":85,"props":630,"children":631},{"style":144},[632],{"type":46,"value":633},">\n",{"type":40,"tag":49,"props":635,"children":636},{},[637,643,645,651],{"type":40,"tag":53,"props":638,"children":640},{"className":639},[],[641],{"type":46,"value":642},"--visual-id \"\"",{"type":46,"value":644}," (the empty string sentinel) prepends ",{"type":40,"tag":53,"props":646,"children":648},{"className":647},[],[649],{"type":46,"value":650},"(dtu:\u003Cprofile>)",{"type":46,"value":652}," in\nblue to the prompt so the user can tell which DTU they are in. If the user\nhas several DTUs on the same profile, pass an explicit label so the prompts\nremain distinct:",{"type":40,"tag":74,"props":654,"children":656},{"className":76,"code":655,"language":78,"meta":79,"style":79},"amplifier-digital-twin exec --visual-id testing-pr-42 \u003Cid>\n",[657],{"type":40,"tag":53,"props":658,"children":659},{"__ignoreMap":79},[660],{"type":40,"tag":85,"props":661,"children":662},{"class":87,"line":88},[663,667,671,675,680,684,688,692],{"type":40,"tag":85,"props":664,"children":665},{"style":150},[666],{"type":46,"value":58},{"type":40,"tag":85,"props":668,"children":669},{"style":107},[670],{"type":46,"value":602},{"type":40,"tag":85,"props":672,"children":673},{"style":107},[674],{"type":46,"value":607},{"type":40,"tag":85,"props":676,"children":677},{"style":107},[678],{"type":46,"value":679}," testing-pr-42",{"type":40,"tag":85,"props":681,"children":682},{"style":144},[683],{"type":46,"value":617},{"type":40,"tag":85,"props":685,"children":686},{"style":107},[687],{"type":46,"value":622},{"type":40,"tag":85,"props":689,"children":690},{"style":625},[691],{"type":46,"value":628},{"type":40,"tag":85,"props":693,"children":694},{"style":144},[695],{"type":46,"value":633},{"type":40,"tag":49,"props":697,"children":698},{},[699,704,706,712,714,720,722,727],{"type":40,"tag":327,"props":700,"children":701},{},[702],{"type":46,"value":703},"Important:",{"type":46,"value":705}," ",{"type":40,"tag":53,"props":707,"children":709},{"className":708},[],[710],{"type":46,"value":711},"--visual-id",{"type":46,"value":713}," always takes a value. The empty string ",{"type":40,"tag":53,"props":715,"children":717},{"className":716},[],[718],{"type":46,"value":719},"\"\"",{"type":46,"value":721},"\nmeans \"use the profile name\"; any non-empty value is used as the literal\nlabel. Always quote the empty string -- ",{"type":40,"tag":53,"props":723,"children":725},{"className":724},[],[726],{"type":46,"value":642},{"type":46,"value":728},".",{"type":40,"tag":62,"props":730,"children":732},{"id":731},"running-commands-in-a-dtu",[733],{"type":46,"value":734},"Running Commands in a DTU",{"type":40,"tag":49,"props":736,"children":737},{},[738,740,746,747,753,754,760,762,768,769,775,777,783,785,791,793,799],{"type":46,"value":739},"Every command path (",{"type":40,"tag":53,"props":741,"children":743},{"className":742},[],[744],{"type":46,"value":745},"exec",{"type":46,"value":513},{"type":40,"tag":53,"props":748,"children":750},{"className":749},[],[751],{"type":46,"value":752},"exec --stream",{"type":46,"value":513},{"type":40,"tag":53,"props":755,"children":757},{"className":756},[],[758],{"type":46,"value":759},"provision.setup_cmds",{"type":46,"value":761},",\n",{"type":40,"tag":53,"props":763,"children":765},{"className":764},[],[766],{"type":46,"value":767},"provision.update.cmds",{"type":46,"value":513},{"type":40,"tag":53,"props":770,"children":772},{"className":771},[],[773],{"type":46,"value":774},"readiness.command",{"type":46,"value":776},", bare interactive) is wrapped\nin ",{"type":40,"tag":53,"props":778,"children":780},{"className":779},[],[781],{"type":46,"value":782},"bash -lc",{"type":46,"value":784},". The login shell sources ",{"type":40,"tag":53,"props":786,"children":788},{"className":787},[],[789],{"type":46,"value":790},"\u002Fetc\u002Fprofile.d\u002Fdtu-env.sh",{"type":46,"value":792},", which\nputs ",{"type":40,"tag":53,"props":794,"children":796},{"className":795},[],[797],{"type":46,"value":798},"\u002Froot\u002F.cargo\u002Fbin:\u002Froot\u002F.local\u002Fbin",{"type":46,"value":800}," on PATH and exports passthrough\nenv vars.",{"type":40,"tag":49,"props":802,"children":803},{},[804,809,811,817,819,825,826,831],{"type":40,"tag":327,"props":805,"children":806},{},[807],{"type":46,"value":808},"Write commands bare.",{"type":46,"value":810}," Anything from ",{"type":40,"tag":53,"props":812,"children":814},{"className":813},[],[815],{"type":46,"value":816},"uv tool install",{"type":46,"value":818}," (",{"type":40,"tag":53,"props":820,"children":822},{"className":821},[],[823],{"type":46,"value":824},"amplifier",{"type":46,"value":761},{"type":40,"tag":53,"props":827,"children":829},{"className":828},[],[830],{"type":46,"value":231},{"type":46,"value":832},", etc.) resolves without help:",{"type":40,"tag":74,"props":834,"children":836},{"className":76,"code":835,"language":78,"meta":79,"style":79},"amplifier-digital-twin exec \u003Cid> -- amplifier --version\n",[837],{"type":40,"tag":53,"props":838,"children":839},{"__ignoreMap":79},[840],{"type":40,"tag":85,"props":841,"children":842},{"class":87,"line":88},[843,847,851,855,859,863,868,873,878],{"type":40,"tag":85,"props":844,"children":845},{"style":150},[846],{"type":46,"value":58},{"type":40,"tag":85,"props":848,"children":849},{"style":107},[850],{"type":46,"value":602},{"type":40,"tag":85,"props":852,"children":853},{"style":144},[854],{"type":46,"value":617},{"type":40,"tag":85,"props":856,"children":857},{"style":107},[858],{"type":46,"value":622},{"type":40,"tag":85,"props":860,"children":861},{"style":625},[862],{"type":46,"value":628},{"type":40,"tag":85,"props":864,"children":865},{"style":144},[866],{"type":46,"value":867},">",{"type":40,"tag":85,"props":869,"children":870},{"style":107},[871],{"type":46,"value":872}," --",{"type":40,"tag":85,"props":874,"children":875},{"style":107},[876],{"type":46,"value":877}," amplifier",{"type":40,"tag":85,"props":879,"children":880},{"style":107},[881],{"type":46,"value":882}," --version\n",{"type":40,"tag":49,"props":884,"children":885},{},[886],{"type":46,"value":887},"Do NOT add any of the following — all redundant, all dead weight from older profiles:",{"type":40,"tag":356,"props":889,"children":890},{},[891,902,912,929,950],{"type":40,"tag":360,"props":892,"children":893},{},[894,900],{"type":40,"tag":53,"props":895,"children":897},{"className":896},[],[898],{"type":46,"value":899},"bash -lc '...'",{"type":46,"value":901}," wrapping (double-wraps).",{"type":40,"tag":360,"props":903,"children":904},{},[905,911],{"type":40,"tag":53,"props":906,"children":908},{"className":907},[],[909],{"type":46,"value":910},"bash -c 'export PATH=\"\u002Froot\u002F.local\u002Fbin:$PATH\" && cmd'",{"type":46,"value":728},{"type":40,"tag":360,"props":913,"children":914},{},[915,921,923,928],{"type":40,"tag":53,"props":916,"children":918},{"className":917},[],[919],{"type":46,"value":920},"PATH=\u002Froot\u002F.local\u002Fbin:$PATH cmd",{"type":46,"value":922}," prefix on ",{"type":40,"tag":53,"props":924,"children":926},{"className":925},[],[927],{"type":46,"value":774},{"type":46,"value":728},{"type":40,"tag":360,"props":930,"children":931},{},[932,934,940,942,948],{"type":46,"value":933},"Hardcoded ",{"type":40,"tag":53,"props":935,"children":937},{"className":936},[],[938],{"type":46,"value":939},"\u002Froot\u002F.local\u002Fbin\u002F\u003Ctool>",{"type":46,"value":941}," paths — use bare commands or\n",{"type":40,"tag":53,"props":943,"children":945},{"className":944},[],[946],{"type":46,"value":947},"command -v \u003Ctool>",{"type":46,"value":949}," for existence checks.",{"type":40,"tag":360,"props":951,"children":952},{},[953,959,961,967],{"type":40,"tag":53,"props":954,"children":956},{"className":955},[],[957],{"type":46,"value":958},"export PATH=\"\u002Froot\u002F.local\u002Fbin:$PATH\"",{"type":46,"value":960}," at the top of heredoc\n",{"type":40,"tag":53,"props":962,"children":964},{"className":963},[],[965],{"type":46,"value":966},"setup_cmds",{"type":46,"value":968}," blocks.",{"type":40,"tag":49,"props":970,"children":971},{},[972,974,980,982,988,990,996,998,1003],{"type":46,"value":973},"Use ",{"type":40,"tag":53,"props":975,"children":977},{"className":976},[],[978],{"type":46,"value":979},"bash -c",{"type":46,"value":981}," only when you need a shell construct (pipes, redirects,\n",{"type":40,"tag":53,"props":983,"children":985},{"className":984},[],[986],{"type":46,"value":987},"&&",{"type":46,"value":989},"\u002F",{"type":40,"tag":53,"props":991,"children":993},{"className":992},[],[994],{"type":46,"value":995},"||",{"type":46,"value":997},", expansion) in a single command. Do not use ",{"type":40,"tag":53,"props":999,"children":1001},{"className":1000},[],[1002],{"type":46,"value":782},{"type":46,"value":1004}," — the\nouter wrap already provides the login shell.",{"type":40,"tag":62,"props":1006,"children":1008},{"id":1007},"file-transfer",[1009],{"type":46,"value":1010},"File Transfer",{"type":40,"tag":49,"props":1012,"children":1013},{},[1014,1020,1022,1028,1030,1035],{"type":40,"tag":53,"props":1015,"children":1017},{"className":1016},[],[1018],{"type":46,"value":1019},"file-push",{"type":46,"value":1021}," and ",{"type":40,"tag":53,"props":1023,"children":1025},{"className":1024},[],[1026],{"type":46,"value":1027},"file-pull",{"type":46,"value":1029}," move files between the host and a running DTU\nwithout going through ",{"type":40,"tag":53,"props":1031,"children":1033},{"className":1032},[],[1034],{"type":46,"value":745},{"type":46,"value":1036},". Both commands accept multiple sources before\nthe destination.",{"type":40,"tag":74,"props":1038,"children":1040},{"className":76,"code":1039,"language":78,"meta":79,"style":79},"# Single file\namplifier-digital-twin file-push \u003Cid> .\u002Fconfig.yaml \u002Froot\u002Fconfig.yaml\namplifier-digital-twin file-pull \u003Cid> \u002Fvar\u002Flog\u002Fapp.log .\u002Fapp.log\n\n# Directory (-r is required when any source is a directory)\namplifier-digital-twin file-push -r \u003Cid> .\u002Fdata\u002F \u002Froot\u002Fapp\u002F\namplifier-digital-twin file-pull -r \u003Cid> \u002Froot\u002Fresults\u002F .\u002F\n",[1041],{"type":40,"tag":53,"props":1042,"children":1043},{"__ignoreMap":79},[1044,1052,1090,1128,1135,1143,1185],{"type":40,"tag":85,"props":1045,"children":1046},{"class":87,"line":88},[1047],{"type":40,"tag":85,"props":1048,"children":1049},{"style":92},[1050],{"type":46,"value":1051},"# Single file\n",{"type":40,"tag":85,"props":1053,"children":1054},{"class":87,"line":26},[1055,1059,1064,1068,1072,1076,1080,1085],{"type":40,"tag":85,"props":1056,"children":1057},{"style":150},[1058],{"type":46,"value":58},{"type":40,"tag":85,"props":1060,"children":1061},{"style":107},[1062],{"type":46,"value":1063}," file-push",{"type":40,"tag":85,"props":1065,"children":1066},{"style":144},[1067],{"type":46,"value":617},{"type":40,"tag":85,"props":1069,"children":1070},{"style":107},[1071],{"type":46,"value":622},{"type":40,"tag":85,"props":1073,"children":1074},{"style":625},[1075],{"type":46,"value":628},{"type":40,"tag":85,"props":1077,"children":1078},{"style":144},[1079],{"type":46,"value":867},{"type":40,"tag":85,"props":1081,"children":1082},{"style":107},[1083],{"type":46,"value":1084}," .\u002Fconfig.yaml",{"type":40,"tag":85,"props":1086,"children":1087},{"style":107},[1088],{"type":46,"value":1089}," \u002Froot\u002Fconfig.yaml\n",{"type":40,"tag":85,"props":1091,"children":1092},{"class":87,"line":113},[1093,1097,1102,1106,1110,1114,1118,1123],{"type":40,"tag":85,"props":1094,"children":1095},{"style":150},[1096],{"type":46,"value":58},{"type":40,"tag":85,"props":1098,"children":1099},{"style":107},[1100],{"type":46,"value":1101}," file-pull",{"type":40,"tag":85,"props":1103,"children":1104},{"style":144},[1105],{"type":46,"value":617},{"type":40,"tag":85,"props":1107,"children":1108},{"style":107},[1109],{"type":46,"value":622},{"type":40,"tag":85,"props":1111,"children":1112},{"style":625},[1113],{"type":46,"value":628},{"type":40,"tag":85,"props":1115,"children":1116},{"style":144},[1117],{"type":46,"value":867},{"type":40,"tag":85,"props":1119,"children":1120},{"style":107},[1121],{"type":46,"value":1122}," \u002Fvar\u002Flog\u002Fapp.log",{"type":40,"tag":85,"props":1124,"children":1125},{"style":107},[1126],{"type":46,"value":1127}," .\u002Fapp.log\n",{"type":40,"tag":85,"props":1129,"children":1130},{"class":87,"line":122},[1131],{"type":40,"tag":85,"props":1132,"children":1133},{"emptyLinePlaceholder":35},[1134],{"type":46,"value":119},{"type":40,"tag":85,"props":1136,"children":1137},{"class":87,"line":131},[1138],{"type":40,"tag":85,"props":1139,"children":1140},{"style":92},[1141],{"type":46,"value":1142},"# Directory (-r is required when any source is a directory)\n",{"type":40,"tag":85,"props":1144,"children":1145},{"class":87,"line":22},[1146,1150,1154,1159,1163,1167,1171,1175,1180],{"type":40,"tag":85,"props":1147,"children":1148},{"style":150},[1149],{"type":46,"value":58},{"type":40,"tag":85,"props":1151,"children":1152},{"style":107},[1153],{"type":46,"value":1063},{"type":40,"tag":85,"props":1155,"children":1156},{"style":107},[1157],{"type":46,"value":1158}," -r",{"type":40,"tag":85,"props":1160,"children":1161},{"style":144},[1162],{"type":46,"value":617},{"type":40,"tag":85,"props":1164,"children":1165},{"style":107},[1166],{"type":46,"value":622},{"type":40,"tag":85,"props":1168,"children":1169},{"style":625},[1170],{"type":46,"value":628},{"type":40,"tag":85,"props":1172,"children":1173},{"style":144},[1174],{"type":46,"value":867},{"type":40,"tag":85,"props":1176,"children":1177},{"style":107},[1178],{"type":46,"value":1179}," .\u002Fdata\u002F",{"type":40,"tag":85,"props":1181,"children":1182},{"style":107},[1183],{"type":46,"value":1184}," \u002Froot\u002Fapp\u002F\n",{"type":40,"tag":85,"props":1186,"children":1188},{"class":87,"line":1187},7,[1189,1193,1197,1201,1205,1209,1213,1217,1222],{"type":40,"tag":85,"props":1190,"children":1191},{"style":150},[1192],{"type":46,"value":58},{"type":40,"tag":85,"props":1194,"children":1195},{"style":107},[1196],{"type":46,"value":1101},{"type":40,"tag":85,"props":1198,"children":1199},{"style":107},[1200],{"type":46,"value":1158},{"type":40,"tag":85,"props":1202,"children":1203},{"style":144},[1204],{"type":46,"value":617},{"type":40,"tag":85,"props":1206,"children":1207},{"style":107},[1208],{"type":46,"value":622},{"type":40,"tag":85,"props":1210,"children":1211},{"style":625},[1212],{"type":46,"value":628},{"type":40,"tag":85,"props":1214,"children":1215},{"style":144},[1216],{"type":46,"value":867},{"type":40,"tag":85,"props":1218,"children":1219},{"style":107},[1220],{"type":46,"value":1221}," \u002Froot\u002Fresults\u002F",{"type":40,"tag":85,"props":1223,"children":1224},{"style":107},[1225],{"type":46,"value":1226}," .\u002F\n",{"type":40,"tag":49,"props":1228,"children":1229},{},[1230,1236,1238,1243,1245,1251],{"type":40,"tag":53,"props":1231,"children":1233},{"className":1232},[],[1234],{"type":46,"value":1235},"-r\u002F--recursive",{"type":46,"value":1237}," defaults to ",{"type":40,"tag":327,"props":1239,"children":1240},{},[1241],{"type":46,"value":1242},"off",{"type":46,"value":1244}," for both commands. Pass ",{"type":40,"tag":53,"props":1246,"children":1248},{"className":1247},[],[1249],{"type":46,"value":1250},"-r",{"type":46,"value":1252}," when any\nsource is a directory; leave it off for single-file or multi-file transfers.",{"type":40,"tag":49,"props":1254,"children":1255},{},[1256,1258,1264,1266,1271,1273,1279,1281,1287,1289,1295,1297,1303,1305,1310,1312,1317,1319,1325],{"type":46,"value":1257},"On ",{"type":40,"tag":53,"props":1259,"children":1261},{"className":1260},[],[1262],{"type":46,"value":1263},"file-push -r",{"type":46,"value":1265},", the destination is treated as the ",{"type":40,"tag":327,"props":1267,"children":1268},{},[1269],{"type":46,"value":1270},"parent directory",{"type":46,"value":1272},"\nand the source's basename is preserved inside it. Pushing ",{"type":40,"tag":53,"props":1274,"children":1276},{"className":1275},[],[1277],{"type":46,"value":1278},".\u002Fdata\u002F",{"type":46,"value":1280}," to\n",{"type":40,"tag":53,"props":1282,"children":1284},{"className":1283},[],[1285],{"type":46,"value":1286},"\u002Froot\u002Fapp\u002F",{"type":46,"value":1288}," lands files at ",{"type":40,"tag":53,"props":1290,"children":1292},{"className":1291},[],[1293],{"type":46,"value":1294},"\u002Froot\u002Fapp\u002Fdata\u002F...",{"type":46,"value":1296},". To put contents directly\nat ",{"type":40,"tag":53,"props":1298,"children":1300},{"className":1299},[],[1301],{"type":46,"value":1302},"\u002Froot\u002Fapp\u002Fdata\u002F",{"type":46,"value":1304},", push to ",{"type":40,"tag":53,"props":1306,"children":1308},{"className":1307},[],[1309],{"type":46,"value":1286},{"type":46,"value":1311}," and let the basename land\nnaturally (do not push to ",{"type":40,"tag":53,"props":1313,"children":1315},{"className":1314},[],[1316],{"type":46,"value":1302},{"type":46,"value":1318}," -- that produces\n",{"type":40,"tag":53,"props":1320,"children":1322},{"className":1321},[],[1323],{"type":46,"value":1324},"\u002Froot\u002Fapp\u002Fdata\u002Fdata\u002F...",{"type":46,"value":1326},").",{"type":40,"tag":62,"props":1328,"children":1330},{"id":1329},"hostname-support-mdns",[1331],{"type":46,"value":1332},"Hostname Support (mDNS)",{"type":40,"tag":49,"props":1334,"children":1335},{},[1336,1338,1344,1346,1352,1354,1360],{"type":46,"value":1337},"Environments can register a ",{"type":40,"tag":53,"props":1339,"children":1341},{"className":1340},[],[1342],{"type":46,"value":1343},".local",{"type":46,"value":1345}," hostname via Avahi mDNS, making it easy to\ntell multiple DTU instances apart (e.g. ",{"type":40,"tag":53,"props":1347,"children":1349},{"className":1348},[],[1350],{"type":46,"value":1351},"http:\u002F\u002Fmy-app.local:8410\u002F",{"type":46,"value":1353}," instead of\n",{"type":40,"tag":53,"props":1355,"children":1357},{"className":1356},[],[1358],{"type":46,"value":1359},"http:\u002F\u002Flocalhost:8410\u002F",{"type":46,"value":1326},{"type":40,"tag":49,"props":1362,"children":1363},{},[1364,1369,1370,1376,1377,1383],{"type":40,"tag":327,"props":1365,"children":1366},{},[1367],{"type":46,"value":1368},"Prerequisites:",{"type":46,"value":705},{"type":40,"tag":53,"props":1371,"children":1373},{"className":1372},[],[1374],{"type":46,"value":1375},"avahi-daemon",{"type":46,"value":1021},{"type":40,"tag":53,"props":1378,"children":1380},{"className":1379},[],[1381],{"type":46,"value":1382},"avahi-utils",{"type":46,"value":1384}," must be installed:",{"type":40,"tag":74,"props":1386,"children":1388},{"className":76,"code":1387,"language":78,"meta":79,"style":79},"which avahi-publish-address && echo \"Avahi OK\" || echo \"Install: sudo apt install avahi-daemon avahi-utils\"\n",[1389],{"type":40,"tag":53,"props":1390,"children":1391},{"__ignoreMap":79},[1392],{"type":40,"tag":85,"props":1393,"children":1394},{"class":87,"line":88},[1395,1399,1404,1408,1412,1416,1421,1425,1429,1433,1437,1442],{"type":40,"tag":85,"props":1396,"children":1397},{"style":101},[1398],{"type":46,"value":104},{"type":40,"tag":85,"props":1400,"children":1401},{"style":107},[1402],{"type":46,"value":1403}," avahi-publish-address",{"type":40,"tag":85,"props":1405,"children":1406},{"style":144},[1407],{"type":46,"value":147},{"type":40,"tag":85,"props":1409,"children":1410},{"style":101},[1411],{"type":46,"value":166},{"type":40,"tag":85,"props":1413,"children":1414},{"style":144},[1415],{"type":46,"value":171},{"type":40,"tag":85,"props":1417,"children":1418},{"style":107},[1419],{"type":46,"value":1420},"Avahi OK",{"type":40,"tag":85,"props":1422,"children":1423},{"style":144},[1424],{"type":46,"value":181},{"type":40,"tag":85,"props":1426,"children":1427},{"style":144},[1428],{"type":46,"value":186},{"type":40,"tag":85,"props":1430,"children":1431},{"style":101},[1432],{"type":46,"value":166},{"type":40,"tag":85,"props":1434,"children":1435},{"style":144},[1436],{"type":46,"value":171},{"type":40,"tag":85,"props":1438,"children":1439},{"style":107},[1440],{"type":46,"value":1441},"Install: sudo apt install avahi-daemon avahi-utils",{"type":40,"tag":85,"props":1443,"children":1444},{"style":144},[1445],{"type":46,"value":204},{"type":40,"tag":49,"props":1447,"children":1448},{},[1449,1454,1456,1462,1464,1470],{"type":40,"tag":327,"props":1450,"children":1451},{},[1452],{"type":46,"value":1453},"Usage:",{"type":46,"value":1455}," Set ",{"type":40,"tag":53,"props":1457,"children":1459},{"className":1458},[],[1460],{"type":46,"value":1461},"access.hostname",{"type":46,"value":1463}," in the profile or pass ",{"type":40,"tag":53,"props":1465,"children":1467},{"className":1466},[],[1468],{"type":46,"value":1469},"--hostname",{"type":46,"value":1471}," on the CLI:",{"type":40,"tag":74,"props":1473,"children":1475},{"className":76,"code":1474,"language":78,"meta":79,"style":79},"amplifier-digital-twin launch my-profile --hostname my-app\n# => access URLs will be http:\u002F\u002Fmy-app.local:\u003Cport>\u002F...\n",[1476],{"type":40,"tag":53,"props":1477,"children":1478},{"__ignoreMap":79},[1479,1506],{"type":40,"tag":85,"props":1480,"children":1481},{"class":87,"line":88},[1482,1486,1491,1496,1501],{"type":40,"tag":85,"props":1483,"children":1484},{"style":150},[1485],{"type":46,"value":58},{"type":40,"tag":85,"props":1487,"children":1488},{"style":107},[1489],{"type":46,"value":1490}," launch",{"type":40,"tag":85,"props":1492,"children":1493},{"style":107},[1494],{"type":46,"value":1495}," my-profile",{"type":40,"tag":85,"props":1497,"children":1498},{"style":107},[1499],{"type":46,"value":1500}," --hostname",{"type":40,"tag":85,"props":1502,"children":1503},{"style":107},[1504],{"type":46,"value":1505}," my-app\n",{"type":40,"tag":85,"props":1507,"children":1508},{"class":87,"line":26},[1509],{"type":40,"tag":85,"props":1510,"children":1511},{"style":92},[1512],{"type":46,"value":1513},"# => access URLs will be http:\u002F\u002Fmy-app.local:\u003Cport>\u002F...\n",{"type":40,"tag":49,"props":1515,"children":1516},{},[1517,1519,1525],{"type":46,"value":1518},"If Avahi is not installed, hostname registration is silently skipped and access\nURLs fall back to ",{"type":40,"tag":53,"props":1520,"children":1522},{"className":1521},[],[1523],{"type":46,"value":1524},"localhost",{"type":46,"value":1526},". No error, no failure -- it's a graceful degradation.",{"type":40,"tag":49,"props":1528,"children":1529},{},[1530],{"type":40,"tag":327,"props":1531,"children":1532},{},[1533],{"type":46,"value":1534},"Platform support:",{"type":40,"tag":356,"props":1536,"children":1537},{},[1538,1543,1555],{"type":40,"tag":360,"props":1539,"children":1540},{},[1541],{"type":46,"value":1542},"Native Linux: fully supported (LAN-wide resolution via mDNS)",{"type":40,"tag":360,"props":1544,"children":1545},{},[1546,1548,1553],{"type":46,"value":1547},"WSL2: works within WSL2; Windows browsers cannot resolve ",{"type":40,"tag":53,"props":1549,"children":1551},{"className":1550},[],[1552],{"type":46,"value":1343},{"type":46,"value":1554}," names from WSL2",{"type":40,"tag":360,"props":1556,"children":1557},{},[1558],{"type":46,"value":1559},"macOS\u002FWindows: not supported (warning printed, falls back to localhost)",{"type":40,"tag":62,"props":1561,"children":1563},{"id":1562},"updating-running-environments",[1564],{"type":46,"value":1565},"Updating Running Environments",{"type":40,"tag":49,"props":1567,"children":1568},{},[1569,1571,1577],{"type":46,"value":1570},"Profiles can define an ",{"type":40,"tag":53,"props":1572,"children":1574},{"className":1573},[],[1575],{"type":46,"value":1576},"update",{"type":46,"value":1578}," section with commands to pull fresh code and\nreinstall without destroying the environment:",{"type":40,"tag":74,"props":1580,"children":1582},{"className":76,"code":1581,"language":78,"meta":79,"style":79},"amplifier-digital-twin update \u003Cid> [--var K=V ...] [--skip-readiness]\n",[1583],{"type":40,"tag":53,"props":1584,"children":1585},{"__ignoreMap":79},[1586],{"type":40,"tag":85,"props":1587,"children":1588},{"class":87,"line":88},[1589,1593,1598,1602,1606,1610,1614,1619,1624,1629],{"type":40,"tag":85,"props":1590,"children":1591},{"style":150},[1592],{"type":46,"value":58},{"type":40,"tag":85,"props":1594,"children":1595},{"style":107},[1596],{"type":46,"value":1597}," update",{"type":40,"tag":85,"props":1599,"children":1600},{"style":144},[1601],{"type":46,"value":617},{"type":40,"tag":85,"props":1603,"children":1604},{"style":107},[1605],{"type":46,"value":622},{"type":40,"tag":85,"props":1607,"children":1608},{"style":625},[1609],{"type":46,"value":628},{"type":40,"tag":85,"props":1611,"children":1612},{"style":144},[1613],{"type":46,"value":867},{"type":40,"tag":85,"props":1615,"children":1616},{"style":625},[1617],{"type":46,"value":1618}," [--var ",{"type":40,"tag":85,"props":1620,"children":1621},{"style":107},[1622],{"type":46,"value":1623},"K=V",{"type":40,"tag":85,"props":1625,"children":1626},{"style":107},[1627],{"type":46,"value":1628}," ...]",{"type":40,"tag":85,"props":1630,"children":1631},{"style":625},[1632],{"type":46,"value":1633}," [--skip-readiness]\n",{"type":40,"tag":49,"props":1635,"children":1636},{},[1637,1639,1645,1647,1652,1653,1659,1661,1667,1669,1674],{"type":46,"value":1638},"This enables a fast ",{"type":40,"tag":53,"props":1640,"children":1642},{"className":1641},[],[1643],{"type":46,"value":1644},"launch",{"type":46,"value":1646}," -> ",{"type":40,"tag":53,"props":1648,"children":1650},{"className":1649},[],[1651],{"type":46,"value":1576},{"type":46,"value":1646},{"type":40,"tag":53,"props":1654,"children":1656},{"className":1655},[],[1657],{"type":46,"value":1658},"test",{"type":46,"value":1660}," iteration loop. If the\nprofile has ",{"type":40,"tag":53,"props":1662,"children":1664},{"className":1663},[],[1665],{"type":46,"value":1666},"refresh_pypi: true",{"type":46,"value":1668}," in the ",{"type":40,"tag":53,"props":1670,"children":1672},{"className":1671},[],[1673],{"type":46,"value":1576},{"type":46,"value":1675}," section, PyPI overrides are\nrebuilt from the current state of the source repos before running update commands.",{"type":40,"tag":49,"props":1677,"children":1678},{},[1679,1681,1687,1689,1694,1696,1702,1704,1709],{"type":46,"value":1680},"See ",{"type":40,"tag":53,"props":1682,"children":1684},{"className":1683},[],[1685],{"type":46,"value":1686},"api-reference.md",{"type":46,"value":1688}," for the full ",{"type":40,"tag":53,"props":1690,"children":1692},{"className":1691},[],[1693],{"type":46,"value":1576},{"type":46,"value":1695}," command reference and ",{"type":40,"tag":53,"props":1697,"children":1699},{"className":1698},[],[1700],{"type":46,"value":1701},"profiles.md",{"type":46,"value":1703},"\nfor the ",{"type":40,"tag":53,"props":1705,"children":1707},{"className":1706},[],[1708],{"type":46,"value":1576},{"type":46,"value":1710}," profile schema.",{"type":40,"tag":62,"props":1712,"children":1714},{"id":1713},"example-profiles",[1715],{"type":46,"value":1716},"Example Profiles",{"type":40,"tag":49,"props":1718,"children":1719},{},[1720],{"type":46,"value":1721},"When constructing profiles, read the most relevant examples first to understand established patterns:",{"type":40,"tag":74,"props":1723,"children":1726},{"className":1724,"code":1725,"language":46},[270],"read_file(\"@digital-twin-universe:profiles\u002Ftests\u002Famplifier-user-sim.yaml\")\nread_file(\"@digital-twin-universe:profiles\u002Famplifier\u002Famplifier-chat.yaml\")\nread_file(\"@digital-twin-universe:profiles\u002Famplifier\u002Famplifier-standalone.yaml\")\nread_file(\"@digital-twin-universe:profiles\u002Fpatterns\u002Fprivate-github-repo.yaml\")\nread_file(\"@digital-twin-universe:profiles\u002Ftests\u002Fdocker-in-incus.yaml\")\n",[1727],{"type":40,"tag":53,"props":1728,"children":1729},{"__ignoreMap":79},[1730],{"type":46,"value":1725},{"type":40,"tag":49,"props":1732,"children":1733},{},[1734,1736,1742,1744,1749,1751,1756],{"type":46,"value":1735},"The ",{"type":40,"tag":53,"props":1737,"children":1739},{"className":1738},[],[1740],{"type":46,"value":1741},"amplifier-standalone",{"type":46,"value":1743}," profile is a standalone Amplifier user environment\nwith the foundation bundle composed onto every session. Use it when the user\nwants to ",{"type":40,"tag":53,"props":1745,"children":1747},{"className":1746},[],[1748],{"type":46,"value":745},{"type":46,"value":1750}," in and run interactive ",{"type":40,"tag":53,"props":1752,"children":1754},{"className":1753},[],[1755],{"type":46,"value":824},{"type":46,"value":1757}," sessions immediately, with\nno extra services or UI on top.",{"type":40,"tag":49,"props":1759,"children":1760},{},[1761,1762,1768,1770,1776,1778,1784,1786,1792,1794,1799],{"type":46,"value":1735},{"type":40,"tag":53,"props":1763,"children":1765},{"className":1764},[],[1766],{"type":46,"value":1767},"private-github-repo",{"type":46,"value":1769}," profile shows how to install from a private GitHub\nrepo without Gitea. It passes ",{"type":40,"tag":53,"props":1771,"children":1773},{"className":1772},[],[1774],{"type":46,"value":1775},"GH_TOKEN",{"type":46,"value":1777}," via ",{"type":40,"tag":53,"props":1779,"children":1781},{"className":1780},[],[1782],{"type":46,"value":1783},"passthrough.services",{"type":46,"value":1785}," and\nconfigures ",{"type":40,"tag":53,"props":1787,"children":1789},{"className":1788},[],[1790],{"type":46,"value":1791},"git config --global url...insteadOf",{"type":46,"value":1793}," to authenticate all clones.\nUse this pattern when you need to test the pushed state of a private repo.\nFor testing local uncommitted changes, use Gitea + ",{"type":40,"tag":53,"props":1795,"children":1797},{"className":1796},[],[1798],{"type":46,"value":385},{"type":46,"value":1800}," instead.",{"type":40,"tag":49,"props":1802,"children":1803},{},[1804,1805,1811],{"type":46,"value":1735},{"type":40,"tag":53,"props":1806,"children":1808},{"className":1807},[],[1809],{"type":46,"value":1810},"docker-in-incus",{"type":46,"value":1812}," profile is a minimal test for running Docker containers\ninside an Incus-based environment. Use it to verify that nested container\nnetworking works on a given host before attempting more complex profiles that\ndepend on Docker.",{"type":40,"tag":62,"props":1814,"children":1816},{"id":1815},"profile-placement-convention",[1817],{"type":46,"value":1818},"Profile Placement Convention",{"type":40,"tag":49,"props":1820,"children":1821},{},[1822],{"type":46,"value":1823},"When generating or saving DTU profiles, use this default path:",{"type":40,"tag":74,"props":1825,"children":1828},{"className":1826,"code":1827,"language":46},[270],".amplifier\u002Fdigital-twin-universe\u002Fprofiles\u002F\u003Cprofile-name>.yaml\n",[1829],{"type":40,"tag":53,"props":1830,"children":1831},{"__ignoreMap":79},[1832],{"type":46,"value":1827},{"type":40,"tag":49,"props":1834,"children":1835},{},[1836],{"type":46,"value":1837},"This path is relative to the workspace or current working directory. Create the\ndirectory structure if it doesn't exist.",{"type":40,"tag":49,"props":1839,"children":1840},{},[1841,1843,1849],{"type":46,"value":1842},"Do not commit generated profiles by default. Profiles are often workspace-specific and ephemeral.\nIf the user explicitly wants a profile shipped with a repo, default to placing it\nat ",{"type":40,"tag":53,"props":1844,"children":1846},{"className":1845},[],[1847],{"type":46,"value":1848},"\u003Crepo>\u002F.amplifier\u002Fdigital-twin-universe\u002Fprofiles\u002F\u003Cprofile-name>.yaml",{"type":46,"value":728},{"type":40,"tag":62,"props":1851,"children":1853},{"id":1852},"agents",[1854],{"type":46,"value":1855},"Agents",{"type":40,"tag":49,"props":1857,"children":1858},{},[1859,1861,1866],{"type":46,"value":1860},"For specialized DTU tasks within Amplifier sessions, you ",{"type":40,"tag":327,"props":1862,"children":1863},{},[1864],{"type":46,"value":1865},"MUST",{"type":46,"value":1867}," use these agents instead of driving the CLI manually:",{"type":40,"tag":356,"props":1869,"children":1870},{},[1871],{"type":40,"tag":360,"props":1872,"children":1873},{},[1874,1883],{"type":40,"tag":327,"props":1875,"children":1876},{},[1877],{"type":40,"tag":53,"props":1878,"children":1880},{"className":1879},[],[1881],{"type":46,"value":1882},"dtu-profile-builder",{"type":46,"value":1884}," — Explores a user's project repo, generates a DTU profile, launches the environment, and hands back access details. Use when the user has a project and wants to create a digital twin for it.",{"type":40,"tag":62,"props":1886,"children":1888},{"id":1887},"cleanup-safety",[1889],{"type":46,"value":1890},"Cleanup Safety",{"type":40,"tag":49,"props":1892,"children":1893},{},[1894,1900,1902,1907],{"type":40,"tag":53,"props":1895,"children":1897},{"className":1896},[],[1898],{"type":46,"value":1899},"amplifier-digital-twin list",{"type":46,"value":1901}," returns ",{"type":40,"tag":327,"props":1903,"children":1904},{},[1905],{"type":46,"value":1906},"all",{"type":46,"value":1908}," DTU environments on the machine,\nnot just ones from your session. Other users or concurrent sessions may have\nrunning instances.",{"type":40,"tag":49,"props":1910,"children":1911},{},[1912,1917,1919,1925,1927,1932,1934,1940],{"type":40,"tag":327,"props":1913,"children":1914},{},[1915],{"type":46,"value":1916},"Safe pattern:",{"type":46,"value":1918}," Note the ",{"type":40,"tag":53,"props":1920,"children":1922},{"className":1921},[],[1923],{"type":46,"value":1924},"id",{"type":46,"value":1926}," returned by ",{"type":40,"tag":53,"props":1928,"children":1930},{"className":1929},[],[1931],{"type":46,"value":1644},{"type":46,"value":1933}," and only ",{"type":40,"tag":53,"props":1935,"children":1937},{"className":1936},[],[1938],{"type":46,"value":1939},"destroy",{"type":46,"value":1941}," that\nspecific ID when you are done.",{"type":40,"tag":49,"props":1943,"children":1944},{},[1945,1950,1952,1958],{"type":40,"tag":327,"props":1946,"children":1947},{},[1948],{"type":46,"value":1949},"Dangerous pattern:",{"type":46,"value":1951}," Iterating ",{"type":40,"tag":53,"props":1953,"children":1955},{"className":1954},[],[1956],{"type":46,"value":1957},"list",{"type":46,"value":1959}," and destroying every entry. This will\ntear down environments belonging to other sessions.",{"type":40,"tag":49,"props":1961,"children":1962},{},[1963,1965,1970,1972,1977,1979,1984,1986,1992],{"type":46,"value":1964},"There is currently no owner or session identifier in the ",{"type":40,"tag":53,"props":1966,"children":1968},{"className":1967},[],[1969],{"type":46,"value":1957},{"type":46,"value":1971}," output. If you\nneed to identify your instance, match on the ",{"type":40,"tag":53,"props":1973,"children":1975},{"className":1974},[],[1976],{"type":46,"value":1924},{"type":46,"value":1978}," you received from ",{"type":40,"tag":53,"props":1980,"children":1982},{"className":1981},[],[1983],{"type":46,"value":1644},{"type":46,"value":1985},",\nor use ",{"type":40,"tag":53,"props":1987,"children":1989},{"className":1988},[],[1990],{"type":46,"value":1991},"created_at",{"type":46,"value":1993}," to narrow down which instance is yours.\nIf you are unsure, leave it and tell the user to clean up when they are ready.",{"type":40,"tag":248,"props":1995,"children":1997},{"id":1996},"docker-inside-a-digital-twin-universe-environment-pre-flight",[1998],{"type":46,"value":1999},"Docker Inside a Digital Twin Universe Environment (pre-flight)",{"type":40,"tag":49,"props":2001,"children":2002},{},[2003,2005,2011,2013,2019,2021,2027],{"type":46,"value":2004},"DTU launches enable ",{"type":40,"tag":53,"props":2006,"children":2008},{"className":2007},[],[2009],{"type":46,"value":2010},"security.nesting=true",{"type":46,"value":2012}," by default, so profiles that run\nDocker inside the Incus container (e.g. spawning worker containers, running\nDocker Compose stacks) do not need to set it explicitly. A profile can opt out\nby setting ",{"type":40,"tag":53,"props":2014,"children":2016},{"className":2015},[],[2017],{"type":46,"value":2018},"security.nesting: \"false\"",{"type":46,"value":2020}," in ",{"type":40,"tag":53,"props":2022,"children":2024},{"className":2023},[],[2025],{"type":46,"value":2026},"base.config",{"type":46,"value":2028}," if isolation matters\nmore than Docker support.",{"type":40,"tag":49,"props":2030,"children":2031},{},[2032],{"type":46,"value":2033},"At any point that Docker in Incus might be required, you MUST read the full\nguide on platform-specific issues and networking paths:",{"type":40,"tag":74,"props":2035,"children":2037},{"className":2036,"code":567,"language":46},[270],[2038],{"type":40,"tag":53,"props":2039,"children":2040},{"__ignoreMap":79},[2041],{"type":46,"value":567},{"type":40,"tag":49,"props":2043,"children":2044},{},[2045,2046,2051],{"type":46,"value":1735},{"type":40,"tag":53,"props":2047,"children":2049},{"className":2048},[],[2050],{"type":46,"value":1810},{"type":46,"value":2052}," profile can be used to verify the setup works before\nattempting more complex profiles.",{"type":40,"tag":62,"props":2054,"children":2056},{"id":2055},"troubleshooting",[2057],{"type":46,"value":2058},"Troubleshooting",{"type":40,"tag":49,"props":2060,"children":2061},{},[2062],{"type":46,"value":2063},"For any error, unexpected behavior, or environment issue, read the troubleshooting reference:",{"type":40,"tag":74,"props":2065,"children":2068},{"className":2066,"code":2067,"language":46},[270],"read_file(\"@digital-twin-universe:docs\u002Ftroubleshooting.md\")\n",[2069],{"type":40,"tag":53,"props":2070,"children":2071},{"__ignoreMap":79},[2072],{"type":46,"value":2067},{"type":40,"tag":49,"props":2074,"children":2075},{},[2076],{"type":46,"value":2077},"If the behavior contradicts the docs, check what changed between versions:",{"type":40,"tag":74,"props":2079,"children":2082},{"className":2080,"code":2081,"language":46},[270],"read_file(\"@digital-twin-universe:docs\u002FCHANGELOG.md\")\n",[2083],{"type":40,"tag":53,"props":2084,"children":2085},{"__ignoreMap":79},[2086],{"type":46,"value":2081},{"type":40,"tag":2088,"props":2089,"children":2090},"style",{},[2091],{"type":46,"value":2092},"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":2094,"total":2287},[2095,2117,2136,2157,2172,2189,2200,2213,2228,2243,2262,2275],{"slug":2096,"name":2096,"fn":2097,"description":2098,"org":2099,"tags":2100,"stars":2114,"repoUrl":2115,"updatedAt":2116},"rushstack-best-practices","manage Rush monorepos with best practices","Provides best practices and guidance for working with Rush monorepos. Use when the user is working in a Rush-based repository, asks about Rush commands (install, update, build, rebuild), needs help with project selection, dependency management, build caching, subspace configuration, or troubleshooting Rush-specific issues.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2101,2104,2107,2108,2111],{"name":2102,"slug":2103,"type":15},"Engineering","engineering",{"name":2105,"slug":2106,"type":15},"Local Development","local-development",{"name":9,"slug":8,"type":15},{"name":2109,"slug":2110,"type":15},"Project Management","project-management",{"name":2112,"slug":2113,"type":15},"Rush","rush",6484,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Frushstack","2026-04-06T18:34:44.965032",{"slug":2118,"name":2118,"fn":2119,"description":2120,"org":2121,"tags":2122,"stars":2133,"repoUrl":2134,"updatedAt":2135},"azure-ai-agents-persistent-dotnet","build AI agents with Azure .NET SDK","Azure AI Agents Persistent SDK for .NET. Low-level SDK for creating and managing AI agents with threads, messages, runs, and tools. Use for agent CRUD, conversation threads, streaming responses, function calling, file search, and code interpreter. Triggers: \"PersistentAgentsClient\", \"persistent agents\", \"agent threads\", \"agent runs\", \"streaming agents\", \"function calling agents .NET\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2123,2126,2127,2130],{"name":2124,"slug":2125,"type":15},".NET","net",{"name":1855,"slug":1852,"type":15},{"name":2128,"slug":2129,"type":15},"Azure","azure",{"name":2131,"slug":2132,"type":15},"LLM","llm",2804,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fskills","2026-07-03T16:32:10.297433",{"slug":2137,"name":2137,"fn":2138,"description":2139,"org":2140,"tags":2141,"stars":2133,"repoUrl":2134,"updatedAt":2156},"azure-ai-anomalydetector-java","build anomaly detection applications with Java","Build anomaly detection applications with Azure AI Anomaly Detector SDK for Java. Use when implementing univariate\u002Fmultivariate anomaly detection, time-series analysis, or AI-powered monitoring.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2142,2145,2146,2149,2152,2153],{"name":2143,"slug":2144,"type":15},"Analytics","analytics",{"name":2128,"slug":2129,"type":15},{"name":2147,"slug":2148,"type":15},"Data Analysis","data-analysis",{"name":2150,"slug":2151,"type":15},"Java","java",{"name":9,"slug":8,"type":15},{"name":2154,"slug":2155,"type":15},"Monitoring","monitoring","2026-05-13T06:14:16.261754",{"slug":2158,"name":2158,"fn":2159,"description":2160,"org":2161,"tags":2162,"stars":2133,"repoUrl":2134,"updatedAt":2171},"azure-ai-contentsafety-java","build content moderation applications with Azure AI","Build content moderation applications with Azure AI Content Safety SDK for Java. Use when implementing text\u002Fimage analysis, blocklist management, or harm detection for hate, violence, sexual content, and self-harm.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2163,2166,2167,2168],{"name":2164,"slug":2165,"type":15},"AI Infrastructure","ai-infrastructure",{"name":2128,"slug":2129,"type":15},{"name":2150,"slug":2151,"type":15},{"name":2169,"slug":2170,"type":15},"Security","security","2026-07-07T06:53:31.293235",{"slug":2173,"name":2173,"fn":2174,"description":2175,"org":2176,"tags":2177,"stars":2133,"repoUrl":2134,"updatedAt":2188},"azure-ai-contentsafety-py","detect harmful content with Azure AI Content Safety","Azure AI Content Safety SDK for Python. Use for detecting harmful content in text and images with multi-severity classification.\nTriggers: \"azure-ai-contentsafety\", \"ContentSafetyClient\", \"content moderation\", \"harmful content\", \"text analysis\", \"image analysis\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2178,2179,2182,2183,2184,2187],{"name":2128,"slug":2129,"type":15},{"name":2180,"slug":2181,"type":15},"Compliance","compliance",{"name":2131,"slug":2132,"type":15},{"name":9,"slug":8,"type":15},{"name":2185,"slug":2186,"type":15},"Python","python",{"name":2169,"slug":2170,"type":15},"2026-07-18T05:14:23.017504",{"slug":2190,"name":2190,"fn":2191,"description":2192,"org":2193,"tags":2194,"stars":2133,"repoUrl":2134,"updatedAt":2199},"azure-ai-language-conversations-py","implement conversational language understanding with Python","Implement Conversational Language Understanding (CLU) using the azure-ai-language-conversations Python SDK. Use when working with ConversationAnalysisClient to analyze conversation intent and entities, building NLP features, or integrating language understanding into applications.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2195,2196,2197,2198],{"name":2143,"slug":2144,"type":15},{"name":2128,"slug":2129,"type":15},{"name":2131,"slug":2132,"type":15},{"name":2185,"slug":2186,"type":15},"2026-07-31T05:54:29.068751",{"slug":2201,"name":2201,"fn":2202,"description":2203,"org":2204,"tags":2205,"stars":2133,"repoUrl":2134,"updatedAt":2212},"azure-ai-translation-text-py","translate text using Azure AI services","Azure AI Text Translation SDK for real-time text translation, transliteration, language detection, and dictionary lookup. Use for translating text content in applications.\nTriggers: \"text translation\", \"translator\", \"translate text\", \"transliterate\", \"TextTranslationClient\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2206,2209,2210,2211],{"name":2207,"slug":2208,"type":15},"API Development","api-development",{"name":2128,"slug":2129,"type":15},{"name":9,"slug":8,"type":15},{"name":2185,"slug":2186,"type":15},"2026-07-18T05:14:16.988376",{"slug":2214,"name":2214,"fn":2215,"description":2216,"org":2217,"tags":2218,"stars":2133,"repoUrl":2134,"updatedAt":2227},"azure-ai-vision-imageanalysis-py","analyze images with Azure AI Vision","Azure AI Vision Image Analysis SDK for captions, tags, objects, OCR, people detection, and smart cropping. Use for computer vision and image understanding tasks.\nTriggers: \"image analysis\", \"computer vision\", \"OCR\", \"object detection\", \"ImageAnalysisClient\", \"image caption\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2219,2220,2223,2226],{"name":2128,"slug":2129,"type":15},{"name":2221,"slug":2222,"type":15},"Computer Vision","computer-vision",{"name":2224,"slug":2225,"type":15},"Images","images",{"name":2185,"slug":2186,"type":15},"2026-07-18T05:14:18.007737",{"slug":2229,"name":2229,"fn":2230,"description":2231,"org":2232,"tags":2233,"stars":2133,"repoUrl":2134,"updatedAt":2242},"azure-appconfiguration-java","manage configuration with Azure App Configuration","Azure App Configuration SDK for Java. Centralized application configuration management with key-value settings, feature flags, and snapshots.\nTriggers: \"ConfigurationClient java\", \"app configuration java\", \"feature flag java\", \"configuration setting java\", \"azure config java\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2234,2235,2238,2241],{"name":2128,"slug":2129,"type":15},{"name":2236,"slug":2237,"type":15},"Configuration","configuration",{"name":2239,"slug":2240,"type":15},"Feature Flags","feature-flags",{"name":2150,"slug":2151,"type":15},"2026-07-03T16:32:01.278468",{"slug":2244,"name":2244,"fn":2245,"description":2246,"org":2247,"tags":2248,"stars":2133,"repoUrl":2134,"updatedAt":2261},"azure-cosmos-rust","build applications with Azure Cosmos DB","Azure Cosmos DB library for Rust (NoSQL API). Document CRUD, containers, and globally distributed data.\nTriggers: \"cosmos db rust\", \"CosmosClient rust\", \"document crud rust\", \"NoSQL rust\", \"partition key rust\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2249,2252,2255,2258],{"name":2250,"slug":2251,"type":15},"Cosmos DB","cosmos-db",{"name":2253,"slug":2254,"type":15},"Database","database",{"name":2256,"slug":2257,"type":15},"NoSQL","nosql",{"name":2259,"slug":2260,"type":15},"Rust","rust","2026-07-31T05:54:27.021432",{"slug":2263,"name":2263,"fn":2245,"description":2264,"org":2265,"tags":2266,"stars":2133,"repoUrl":2134,"updatedAt":2274},"azure-cosmos-ts","Azure Cosmos DB JavaScript\u002FTypeScript SDK (@azure\u002Fcosmos) for data plane operations. Use for CRUD operations on documents, queries, bulk operations, and container management. Triggers: \"Cosmos DB\", \"@azure\u002Fcosmos\", \"CosmosClient\", \"document CRUD\", \"NoSQL queries\", \"bulk operations\", \"partition key\", \"container.items\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2267,2268,2269,2270,2271],{"name":2250,"slug":2251,"type":15},{"name":2253,"slug":2254,"type":15},{"name":9,"slug":8,"type":15},{"name":2256,"slug":2257,"type":15},{"name":2272,"slug":2273,"type":15},"TypeScript","typescript","2026-07-03T16:31:19.368382",{"slug":2276,"name":2276,"fn":2277,"description":2278,"org":2279,"tags":2280,"stars":2133,"repoUrl":2134,"updatedAt":2286},"azure-data-tables-java","build table storage applications with Java","Build table storage applications with Azure Tables SDK for Java. Use when working with Azure Table Storage or Cosmos DB Table API for NoSQL key-value data, schemaless storage, or structured data at scale.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2281,2282,2283,2284,2285],{"name":2128,"slug":2129,"type":15},{"name":2250,"slug":2251,"type":15},{"name":2253,"slug":2254,"type":15},{"name":2150,"slug":2151,"type":15},{"name":2256,"slug":2257,"type":15},"2026-05-13T06:14:17.582229",267,{"items":2289,"total":88},[2290],{"slug":4,"name":4,"fn":5,"description":6,"org":2291,"tags":2292,"stars":22,"repoUrl":23,"updatedAt":24},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2293,2294,2295],{"name":17,"slug":18,"type":15},{"name":13,"slug":14,"type":15},{"name":20,"slug":21,"type":15}]