[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-jetbrains-skillshare-devcontainer":3,"mdc-jo8ml1-key":36,"related-repo-jetbrains-skillshare-devcontainer":2255,"related-org-jetbrains-skillshare-devcontainer":2379},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":25,"repoUrl":26,"updatedAt":27,"license":28,"forks":29,"topics":30,"repo":31,"sourceUrl":34,"mdContent":35},"skillshare-devcontainer","run skillshare CLI commands and tests","Run CLI commands, tests, and debugging inside the skillshare devcontainer. Use this skill whenever you need to: execute skillshare CLI commands for verification, run Go tests (unit or integration), reproduce bugs, test new features, start the web UI, or perform any operation that requires a Linux environment. All CLI execution MUST happen inside the devcontainer — never run skillshare commands on the host. If you are about to use Bash to run `ss`, `skillshare`, `go test`, or `make test`, stop and use this skill first to ensure correct container execution.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},"jetbrains","JetBrains","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fjetbrains.png",[12,16,19,22],{"name":13,"slug":14,"type":15},"CLI","cli","tag",{"name":17,"slug":18,"type":15},"Engineering","engineering",{"name":20,"slug":21,"type":15},"Testing","testing",{"name":23,"slug":24,"type":15},"Go","go",252,"https:\u002F\u002Fgithub.com\u002FJetBrains\u002Fskills","2026-07-13T06:39:45.458544",null,17,[],{"repoUrl":26,"stars":25,"forks":29,"topics":32,"description":33},[],"Curated agent skills collection verified by JetBrains","https:\u002F\u002Fgithub.com\u002FJetBrains\u002Fskills\u002Ftree\u002FHEAD\u002Fdevcontainer","---\nname: skillshare-devcontainer\ndescription: >-\n  Run CLI commands, tests, and debugging inside the skillshare devcontainer.\n  Use this skill whenever you need to: execute skillshare CLI commands for\n  verification, run Go tests (unit or integration), reproduce bugs, test new\n  features, start the web UI, or perform any operation that requires a Linux\n  environment. All CLI execution MUST happen inside the devcontainer — never\n  run skillshare commands on the host. If you are about to use Bash to run\n  `ss`, `skillshare`, `go test`, or `make test`, stop and use this skill\n  first to ensure correct container execution.\nargument-hint: \"[command-to-run | task-description]\"\ntargets: [claude, codex]\nmetadata:\n  short-description: \"Run skillshare inside the devcontainer\"\n  author: Runkids\n  source: https:\u002F\u002Fgithub.com\u002Frunkids\u002Fskillshare\u002Ftree\u002Fmain\u002F.skillshare\u002Fskills\u002Fdevcontainer\n---\n\nExecute CLI commands and tests inside the devcontainer. The host machine is macOS but the project binary is Linux — running CLI commands on the host will silently produce wrong results or fail. This skill prevents that mistake.\n\n## When to Use This\n\n- Running `ss` \u002F `skillshare` commands for verification\n- Running `go test`, `make test`, `make check`\n- Reproducing a bug report\n- Testing a feature you just implemented\n- Starting the web UI dashboard\n- Any command that needs the skillshare binary or Go toolchain\n\n## When NOT to Use This\n\n- Editing source code (do that on host via Read\u002FEdit tools)\n- Running `git` commands (git works on host)\n- Running `make fmt`, `make lint` (host-safe Go toolchain commands; no container needed)\n- E2E test runbooks → use `cli-e2e-test` skill instead (it handles ssenv isolation)\n\n## Architecture: Two Layers of Isolation\n\n```\nHost (macOS)\n  └─ Devcontainer (Linux, Debian-based)\n       ├─ Default HOME: \u002Fhome\u002Fdeveloper (persistent volume)\n       ├─ Source: \u002Fworkspace (bind-mount of repo root)\n       └─ ssenv environments: ~\u002F.ss-envs\u002F\u003Cname>\u002F (isolated HOME dirs)\n```\n\n**Devcontainer** = Linux environment with Go, git, pnpm, air (hot-reload). Source code is at `\u002Fworkspace` (bind-mount of the host repo). The `ss` \u002F `skillshare` wrapper auto-builds from source on every invocation — **no manual `make build` needed**. Edit code on the host, then immediately `docker exec` to run it; the change is picked up automatically.\n\n**ssenv** = Isolated HOME directories within the devcontainer. Each env gets its own `~\u002F.config\u002Fskillshare\u002F`, `~\u002F.claude\u002F`, etc. Use ssenv when you need a clean state (testing init, install, sync) without polluting the container's default HOME.\n\n## Zero-Rebuild Workflow\n\nSource code is bind-mounted into the container at `\u002Fworkspace`. The `ss` wrapper runs `go build` transparently on every invocation:\n\n1. Edit files on host (Read\u002FEdit tools)\n2. `docker exec $CONTAINER ss \u003Ccommand>` — picks up your changes instantly\n3. No `make build`, no restart, no rebuild step\n\nThis also applies to `go test` — tests always compile against the latest source. The Web UI backend uses `air` for hot-reload (same zero-rebuild experience).\n\n## Entering the Devcontainer\n\nThe quickest way — one command builds, initialises, and enters the shell:\n\n```bash\nmake devc           # build + init + interactive shell (one step)\nmake devc-up        # start only (no shell)\nmake devc-down      # stop\nmake devc-restart   # restart + re-run start-dev.sh\nmake devc-reset     # full reset (remove volumes), then `make devc` to re-init\nmake devc-status    # show container status\n```\n\nWorks with **or without** VS Code — `make devc` handles the full lifecycle autonomously.\n\n### Programmatic access (for `docker exec` workflows)\n\n```bash\nCONTAINER=$(docker compose -f .devcontainer\u002Fdocker-compose.yml ps -q skillshare-devcontainer 2>\u002Fdev\u002Fnull)\n```\n\nIf `$CONTAINER` is empty, tell the user:\n> Devcontainer is not running. Start it with `make devc-up`.\n\nThen verify the binary:\n```bash\ndocker exec $CONTAINER bash -c \\\n  '\u002Fworkspace\u002F.devcontainer\u002Fensure-skillshare-linux-binary.sh && ss version'\n```\n\n## Running Commands\n\n### Simple command (uses container's default HOME)\n\n```bash\ndocker exec $CONTAINER ss \u003Ccommand> [flags]\n```\n\nGood for: `ss version`, `ss status`, `ss list`, `ss check`, `ss audit`.\n\n### Command with isolated HOME (clean state)\n\n```bash\nENV_NAME=\"test-$(date +%s)\"\ndocker exec $CONTAINER ssenv create \"$ENV_NAME\" --init\ndocker exec $CONTAINER ssenv enter \"$ENV_NAME\" -- ss status\n# Cleanup when done:\ndocker exec $CONTAINER ssenv delete \"$ENV_NAME\" --force\n```\n\nGood for: testing `init`, `install`, `sync`, `uninstall` — anything that modifies config\u002Fstate.\n\n### Multi-command sequence\n\n```bash\ndocker exec $CONTAINER ssenv enter \"$ENV_NAME\" -- bash -c '\n  ss install runkids\u002Fdemo-skills --track --force\n  ss list\n  ss sync\n'\n```\n\nAlways use `bash -c '...'` for multi-command sequences inside `ssenv enter`.\n\n### Go tests\n\n```bash\n# All tests (unit + integration)\ndocker exec $CONTAINER bash -c 'cd \u002Fworkspace && make test'\n\n# Unit tests only\ndocker exec $CONTAINER bash -c 'cd \u002Fworkspace && make test-unit'\n\n# Integration tests only\ndocker exec $CONTAINER bash -c 'cd \u002Fworkspace && make test-int'\n\n# Specific test\ndocker exec $CONTAINER bash -c 'cd \u002Fworkspace && go test .\u002Ftests\u002Fintegration -run TestInit_Fresh -count=1'\n\n# Specific package\ndocker exec $CONTAINER bash -c 'cd \u002Fworkspace && go test .\u002Finternal\u002Finstall\u002F... -count=1'\n```\n\nAlways `cd \u002Fworkspace` before Go commands — ssenv changes HOME which can break module resolution.\n\n### Go tests with auth disabled\n\nSome tests (e.g., `TestResolveToken`, `TestAuthEnv`) need auth credentials removed:\n\n```bash\ndocker exec $CONTAINER bash -c '\n  eval \"$(credential-helper --eval off)\"\n  cd \u002Fworkspace\n  go test .\u002Finternal\u002Fgithub -run TestResolveToken -count=1\n  eval \"$(credential-helper --eval on)\"\n'\n```\n\n## Web UI Dashboard\n\n```bash\n# Start (global mode)\ndocker exec $CONTAINER ui\n\n# Start (project mode — uses ~\u002Fdemo-project)\ndocker exec $CONTAINER ui -p\n\n# Stop\ndocker exec $CONTAINER ui stop\n```\n\nDashboard accessible at `http:\u002F\u002Flocalhost:5173` (Vite dev server with HMR).\nAPI backend at `http:\u002F\u002Flocalhost:19420`.\nLogs: `\u002Ftmp\u002Fapi-dev.log`, `\u002Ftmp\u002Fvite-dev.log`.\n\n## ssenv Quick Reference\n\n| Shortcut | Full form | Purpose |\n|----------|-----------|---------|\n| `ssnew \u003Cname>` | `ssenv create \u003Cname>` + enter | Create and enter isolated shell |\n| `ssuse \u003Cname>` | `ssenv enter \u003Cname>` | Enter existing isolated shell |\n| `ssrm \u003Cname>` | `ssenv delete \u003Cname> --force` | Delete environment |\n| `ssls` | `ssenv list` | List all environments |\n| `ssback` | `ssenv reset` | Leave isolated context |\n| `sshelp` | `help` | Show all devcontainer commands |\n\nFor automation (non-interactive), prefer `ssenv enter \u003Cname> -- \u003Ccommand>` over `ssnew`\u002F`ssuse` (which launch subshells).\n\n## Ports\n\n| Port | Service | Notes |\n|------|---------|-------|\n| 5173 | Vite dev server | React dashboard with HMR |\n| 19420 | Go API backend | `skillshare ui` server |\n| 3000 | Docusaurus | `docs` command in devcontainer |\n\n## Common Mistakes to Avoid\n\n1. **Running `ss` on host** — macOS binary won't match Linux container; always `docker exec`\n2. **Forgetting `cd \u002Fworkspace`** — Go tests fail if HOME was changed by ssenv\n3. **Using `make test` on host** — builds macOS binary, then tests run against wrong arch\n4. **Skipping `--init` on ssenv create** — env won't have config; most commands will fail\n5. **Not cleaning up ssenv** — `ssenv delete \u003Cname> --force` after done; or ask user\n6. **Running from \u002Fworkspace root without -g** — the `ss` wrapper auto-redirects to `~\u002Fdemo-project` in project mode; use `-g` for global or set `SKILLSHARE_DEV_ALLOW_WORKSPACE_PROJECT=1`\n7. **Running `make build` before testing** — unnecessary; the `ss` wrapper auto-builds from source every time\n\n## Rules\n\n- **All CLI execution inside devcontainer** — no exceptions\n- **Use ssenv for stateful tests** — don't pollute default HOME\n- **Always verify** — run the command and check output; never assume it worked\n- **Clean up** — delete ssenv environments after use (or ask user)\n- **Report container ID** — set `$CONTAINER` at the start and reuse throughout\n",{"data":37,"body":46},{"name":4,"description":6,"argument-hint":38,"targets":39,"metadata":42},"[command-to-run | task-description]",[40,41],"claude","codex",{"short-description":43,"author":44,"source":45},"Run skillshare inside the devcontainer","Runkids","https:\u002F\u002Fgithub.com\u002Frunkids\u002Fskillshare\u002Ftree\u002Fmain\u002F.skillshare\u002Fskills\u002Fdevcontainer",{"type":47,"children":48},"root",[49,57,64,136,142,194,200,212,267,292,298,325,357,377,383,388,511,531,545,617,630,647,652,708,714,720,771,811,817,1010,1044,1050,1141,1161,1167,1433,1446,1452,1472,1545,1551,1665,1700,1706,1897,1926,1932,2025,2031,2183,2189,2249],{"type":50,"tag":51,"props":52,"children":53},"element","p",{},[54],{"type":55,"value":56},"text","Execute CLI commands and tests inside the devcontainer. The host machine is macOS but the project binary is Linux — running CLI commands on the host will silently produce wrong results or fail. This skill prevents that mistake.",{"type":50,"tag":58,"props":59,"children":61},"h2",{"id":60},"when-to-use-this",[62],{"type":55,"value":63},"When to Use This",{"type":50,"tag":65,"props":66,"children":67},"ul",{},[68,91,116,121,126,131],{"type":50,"tag":69,"props":70,"children":71},"li",{},[72,74,81,83,89],{"type":55,"value":73},"Running ",{"type":50,"tag":75,"props":76,"children":78},"code",{"className":77},[],[79],{"type":55,"value":80},"ss",{"type":55,"value":82}," \u002F ",{"type":50,"tag":75,"props":84,"children":86},{"className":85},[],[87],{"type":55,"value":88},"skillshare",{"type":55,"value":90}," commands for verification",{"type":50,"tag":69,"props":92,"children":93},{},[94,95,101,103,109,110],{"type":55,"value":73},{"type":50,"tag":75,"props":96,"children":98},{"className":97},[],[99],{"type":55,"value":100},"go test",{"type":55,"value":102},", ",{"type":50,"tag":75,"props":104,"children":106},{"className":105},[],[107],{"type":55,"value":108},"make test",{"type":55,"value":102},{"type":50,"tag":75,"props":111,"children":113},{"className":112},[],[114],{"type":55,"value":115},"make check",{"type":50,"tag":69,"props":117,"children":118},{},[119],{"type":55,"value":120},"Reproducing a bug report",{"type":50,"tag":69,"props":122,"children":123},{},[124],{"type":55,"value":125},"Testing a feature you just implemented",{"type":50,"tag":69,"props":127,"children":128},{},[129],{"type":55,"value":130},"Starting the web UI dashboard",{"type":50,"tag":69,"props":132,"children":133},{},[134],{"type":55,"value":135},"Any command that needs the skillshare binary or Go toolchain",{"type":50,"tag":58,"props":137,"children":139},{"id":138},"when-not-to-use-this",[140],{"type":55,"value":141},"When NOT to Use This",{"type":50,"tag":65,"props":143,"children":144},{},[145,150,162,181],{"type":50,"tag":69,"props":146,"children":147},{},[148],{"type":55,"value":149},"Editing source code (do that on host via Read\u002FEdit tools)",{"type":50,"tag":69,"props":151,"children":152},{},[153,154,160],{"type":55,"value":73},{"type":50,"tag":75,"props":155,"children":157},{"className":156},[],[158],{"type":55,"value":159},"git",{"type":55,"value":161}," commands (git works on host)",{"type":50,"tag":69,"props":163,"children":164},{},[165,166,172,173,179],{"type":55,"value":73},{"type":50,"tag":75,"props":167,"children":169},{"className":168},[],[170],{"type":55,"value":171},"make fmt",{"type":55,"value":102},{"type":50,"tag":75,"props":174,"children":176},{"className":175},[],[177],{"type":55,"value":178},"make lint",{"type":55,"value":180}," (host-safe Go toolchain commands; no container needed)",{"type":50,"tag":69,"props":182,"children":183},{},[184,186,192],{"type":55,"value":185},"E2E test runbooks → use ",{"type":50,"tag":75,"props":187,"children":189},{"className":188},[],[190],{"type":55,"value":191},"cli-e2e-test",{"type":55,"value":193}," skill instead (it handles ssenv isolation)",{"type":50,"tag":58,"props":195,"children":197},{"id":196},"architecture-two-layers-of-isolation",[198],{"type":55,"value":199},"Architecture: Two Layers of Isolation",{"type":50,"tag":201,"props":202,"children":206},"pre",{"className":203,"code":205,"language":55},[204],"language-text","Host (macOS)\n  └─ Devcontainer (Linux, Debian-based)\n       ├─ Default HOME: \u002Fhome\u002Fdeveloper (persistent volume)\n       ├─ Source: \u002Fworkspace (bind-mount of repo root)\n       └─ ssenv environments: ~\u002F.ss-envs\u002F\u003Cname>\u002F (isolated HOME dirs)\n",[207],{"type":50,"tag":75,"props":208,"children":210},{"__ignoreMap":209},"",[211],{"type":55,"value":205},{"type":50,"tag":51,"props":213,"children":214},{},[215,221,223,229,231,236,237,242,244,257,259,265],{"type":50,"tag":216,"props":217,"children":218},"strong",{},[219],{"type":55,"value":220},"Devcontainer",{"type":55,"value":222}," = Linux environment with Go, git, pnpm, air (hot-reload). Source code is at ",{"type":50,"tag":75,"props":224,"children":226},{"className":225},[],[227],{"type":55,"value":228},"\u002Fworkspace",{"type":55,"value":230}," (bind-mount of the host repo). The ",{"type":50,"tag":75,"props":232,"children":234},{"className":233},[],[235],{"type":55,"value":80},{"type":55,"value":82},{"type":50,"tag":75,"props":238,"children":240},{"className":239},[],[241],{"type":55,"value":88},{"type":55,"value":243}," wrapper auto-builds from source on every invocation — ",{"type":50,"tag":216,"props":245,"children":246},{},[247,249,255],{"type":55,"value":248},"no manual ",{"type":50,"tag":75,"props":250,"children":252},{"className":251},[],[253],{"type":55,"value":254},"make build",{"type":55,"value":256}," needed",{"type":55,"value":258},". Edit code on the host, then immediately ",{"type":50,"tag":75,"props":260,"children":262},{"className":261},[],[263],{"type":55,"value":264},"docker exec",{"type":55,"value":266}," to run it; the change is picked up automatically.",{"type":50,"tag":51,"props":268,"children":269},{},[270,275,277,283,284,290],{"type":50,"tag":216,"props":271,"children":272},{},[273],{"type":55,"value":274},"ssenv",{"type":55,"value":276}," = Isolated HOME directories within the devcontainer. Each env gets its own ",{"type":50,"tag":75,"props":278,"children":280},{"className":279},[],[281],{"type":55,"value":282},"~\u002F.config\u002Fskillshare\u002F",{"type":55,"value":102},{"type":50,"tag":75,"props":285,"children":287},{"className":286},[],[288],{"type":55,"value":289},"~\u002F.claude\u002F",{"type":55,"value":291},", etc. Use ssenv when you need a clean state (testing init, install, sync) without polluting the container's default HOME.",{"type":50,"tag":58,"props":293,"children":295},{"id":294},"zero-rebuild-workflow",[296],{"type":55,"value":297},"Zero-Rebuild Workflow",{"type":50,"tag":51,"props":299,"children":300},{},[301,303,308,310,315,317,323],{"type":55,"value":302},"Source code is bind-mounted into the container at ",{"type":50,"tag":75,"props":304,"children":306},{"className":305},[],[307],{"type":55,"value":228},{"type":55,"value":309},". The ",{"type":50,"tag":75,"props":311,"children":313},{"className":312},[],[314],{"type":55,"value":80},{"type":55,"value":316}," wrapper runs ",{"type":50,"tag":75,"props":318,"children":320},{"className":319},[],[321],{"type":55,"value":322},"go build",{"type":55,"value":324}," transparently on every invocation:",{"type":50,"tag":326,"props":327,"children":328},"ol",{},[329,334,345],{"type":50,"tag":69,"props":330,"children":331},{},[332],{"type":55,"value":333},"Edit files on host (Read\u002FEdit tools)",{"type":50,"tag":69,"props":335,"children":336},{},[337,343],{"type":50,"tag":75,"props":338,"children":340},{"className":339},[],[341],{"type":55,"value":342},"docker exec $CONTAINER ss \u003Ccommand>",{"type":55,"value":344}," — picks up your changes instantly",{"type":50,"tag":69,"props":346,"children":347},{},[348,350,355],{"type":55,"value":349},"No ",{"type":50,"tag":75,"props":351,"children":353},{"className":352},[],[354],{"type":55,"value":254},{"type":55,"value":356},", no restart, no rebuild step",{"type":50,"tag":51,"props":358,"children":359},{},[360,362,367,369,375],{"type":55,"value":361},"This also applies to ",{"type":50,"tag":75,"props":363,"children":365},{"className":364},[],[366],{"type":55,"value":100},{"type":55,"value":368}," — tests always compile against the latest source. The Web UI backend uses ",{"type":50,"tag":75,"props":370,"children":372},{"className":371},[],[373],{"type":55,"value":374},"air",{"type":55,"value":376}," for hot-reload (same zero-rebuild experience).",{"type":50,"tag":58,"props":378,"children":380},{"id":379},"entering-the-devcontainer",[381],{"type":55,"value":382},"Entering the Devcontainer",{"type":50,"tag":51,"props":384,"children":385},{},[386],{"type":55,"value":387},"The quickest way — one command builds, initialises, and enters the shell:",{"type":50,"tag":201,"props":389,"children":393},{"className":390,"code":391,"language":392,"meta":209,"style":209},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","make devc           # build + init + interactive shell (one step)\nmake devc-up        # start only (no shell)\nmake devc-down      # stop\nmake devc-restart   # restart + re-run start-dev.sh\nmake devc-reset     # full reset (remove volumes), then `make devc` to re-init\nmake devc-status    # show container status\n","bash",[394],{"type":50,"tag":75,"props":395,"children":396},{"__ignoreMap":209},[397,421,439,457,475,493],{"type":50,"tag":398,"props":399,"children":402},"span",{"class":400,"line":401},"line",1,[403,409,415],{"type":50,"tag":398,"props":404,"children":406},{"style":405},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[407],{"type":55,"value":408},"make",{"type":50,"tag":398,"props":410,"children":412},{"style":411},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[413],{"type":55,"value":414}," devc",{"type":50,"tag":398,"props":416,"children":418},{"style":417},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic",[419],{"type":55,"value":420},"           # build + init + interactive shell (one step)\n",{"type":50,"tag":398,"props":422,"children":424},{"class":400,"line":423},2,[425,429,434],{"type":50,"tag":398,"props":426,"children":427},{"style":405},[428],{"type":55,"value":408},{"type":50,"tag":398,"props":430,"children":431},{"style":411},[432],{"type":55,"value":433}," devc-up",{"type":50,"tag":398,"props":435,"children":436},{"style":417},[437],{"type":55,"value":438},"        # start only (no shell)\n",{"type":50,"tag":398,"props":440,"children":442},{"class":400,"line":441},3,[443,447,452],{"type":50,"tag":398,"props":444,"children":445},{"style":405},[446],{"type":55,"value":408},{"type":50,"tag":398,"props":448,"children":449},{"style":411},[450],{"type":55,"value":451}," devc-down",{"type":50,"tag":398,"props":453,"children":454},{"style":417},[455],{"type":55,"value":456},"      # stop\n",{"type":50,"tag":398,"props":458,"children":460},{"class":400,"line":459},4,[461,465,470],{"type":50,"tag":398,"props":462,"children":463},{"style":405},[464],{"type":55,"value":408},{"type":50,"tag":398,"props":466,"children":467},{"style":411},[468],{"type":55,"value":469}," devc-restart",{"type":50,"tag":398,"props":471,"children":472},{"style":417},[473],{"type":55,"value":474},"   # restart + re-run start-dev.sh\n",{"type":50,"tag":398,"props":476,"children":478},{"class":400,"line":477},5,[479,483,488],{"type":50,"tag":398,"props":480,"children":481},{"style":405},[482],{"type":55,"value":408},{"type":50,"tag":398,"props":484,"children":485},{"style":411},[486],{"type":55,"value":487}," devc-reset",{"type":50,"tag":398,"props":489,"children":490},{"style":417},[491],{"type":55,"value":492},"     # full reset (remove volumes), then `make devc` to re-init\n",{"type":50,"tag":398,"props":494,"children":496},{"class":400,"line":495},6,[497,501,506],{"type":50,"tag":398,"props":498,"children":499},{"style":405},[500],{"type":55,"value":408},{"type":50,"tag":398,"props":502,"children":503},{"style":411},[504],{"type":55,"value":505}," devc-status",{"type":50,"tag":398,"props":507,"children":508},{"style":417},[509],{"type":55,"value":510},"    # show container status\n",{"type":50,"tag":51,"props":512,"children":513},{},[514,516,521,523,529],{"type":55,"value":515},"Works with ",{"type":50,"tag":216,"props":517,"children":518},{},[519],{"type":55,"value":520},"or without",{"type":55,"value":522}," VS Code — ",{"type":50,"tag":75,"props":524,"children":526},{"className":525},[],[527],{"type":55,"value":528},"make devc",{"type":55,"value":530}," handles the full lifecycle autonomously.",{"type":50,"tag":532,"props":533,"children":535},"h3",{"id":534},"programmatic-access-for-docker-exec-workflows",[536,538,543],{"type":55,"value":537},"Programmatic access (for ",{"type":50,"tag":75,"props":539,"children":541},{"className":540},[],[542],{"type":55,"value":264},{"type":55,"value":544}," workflows)",{"type":50,"tag":201,"props":546,"children":548},{"className":390,"code":547,"language":392,"meta":209,"style":209},"CONTAINER=$(docker compose -f .devcontainer\u002Fdocker-compose.yml ps -q skillshare-devcontainer 2>\u002Fdev\u002Fnull)\n",[549],{"type":50,"tag":75,"props":550,"children":551},{"__ignoreMap":209},[552],{"type":50,"tag":398,"props":553,"children":554},{"class":400,"line":401},[555,561,567,572,577,582,587,592,597,602,607,612],{"type":50,"tag":398,"props":556,"children":558},{"style":557},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[559],{"type":55,"value":560},"CONTAINER",{"type":50,"tag":398,"props":562,"children":564},{"style":563},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[565],{"type":55,"value":566},"=$(",{"type":50,"tag":398,"props":568,"children":569},{"style":405},[570],{"type":55,"value":571},"docker",{"type":50,"tag":398,"props":573,"children":574},{"style":411},[575],{"type":55,"value":576}," compose",{"type":50,"tag":398,"props":578,"children":579},{"style":411},[580],{"type":55,"value":581}," -f",{"type":50,"tag":398,"props":583,"children":584},{"style":411},[585],{"type":55,"value":586}," .devcontainer\u002Fdocker-compose.yml",{"type":50,"tag":398,"props":588,"children":589},{"style":411},[590],{"type":55,"value":591}," ps",{"type":50,"tag":398,"props":593,"children":594},{"style":411},[595],{"type":55,"value":596}," -q",{"type":50,"tag":398,"props":598,"children":599},{"style":411},[600],{"type":55,"value":601}," skillshare-devcontainer",{"type":50,"tag":398,"props":603,"children":604},{"style":563},[605],{"type":55,"value":606}," 2>",{"type":50,"tag":398,"props":608,"children":609},{"style":411},[610],{"type":55,"value":611},"\u002Fdev\u002Fnull",{"type":50,"tag":398,"props":613,"children":614},{"style":563},[615],{"type":55,"value":616},")\n",{"type":50,"tag":51,"props":618,"children":619},{},[620,622,628],{"type":55,"value":621},"If ",{"type":50,"tag":75,"props":623,"children":625},{"className":624},[],[626],{"type":55,"value":627},"$CONTAINER",{"type":55,"value":629}," is empty, tell the user:",{"type":50,"tag":631,"props":632,"children":633},"blockquote",{},[634],{"type":50,"tag":51,"props":635,"children":636},{},[637,639,645],{"type":55,"value":638},"Devcontainer is not running. Start it with ",{"type":50,"tag":75,"props":640,"children":642},{"className":641},[],[643],{"type":55,"value":644},"make devc-up",{"type":55,"value":646},".",{"type":50,"tag":51,"props":648,"children":649},{},[650],{"type":55,"value":651},"Then verify the binary:",{"type":50,"tag":201,"props":653,"children":655},{"className":390,"code":654,"language":392,"meta":209,"style":209},"docker exec $CONTAINER bash -c \\\n  '\u002Fworkspace\u002F.devcontainer\u002Fensure-skillshare-linux-binary.sh && ss version'\n",[656],{"type":50,"tag":75,"props":657,"children":658},{"__ignoreMap":209},[659,690],{"type":50,"tag":398,"props":660,"children":661},{"class":400,"line":401},[662,666,671,676,680,685],{"type":50,"tag":398,"props":663,"children":664},{"style":405},[665],{"type":55,"value":571},{"type":50,"tag":398,"props":667,"children":668},{"style":411},[669],{"type":55,"value":670}," exec",{"type":50,"tag":398,"props":672,"children":673},{"style":557},[674],{"type":55,"value":675}," $CONTAINER ",{"type":50,"tag":398,"props":677,"children":678},{"style":411},[679],{"type":55,"value":392},{"type":50,"tag":398,"props":681,"children":682},{"style":411},[683],{"type":55,"value":684}," -c",{"type":50,"tag":398,"props":686,"children":687},{"style":557},[688],{"type":55,"value":689}," \\\n",{"type":50,"tag":398,"props":691,"children":692},{"class":400,"line":423},[693,698,703],{"type":50,"tag":398,"props":694,"children":695},{"style":563},[696],{"type":55,"value":697},"  '",{"type":50,"tag":398,"props":699,"children":700},{"style":411},[701],{"type":55,"value":702},"\u002Fworkspace\u002F.devcontainer\u002Fensure-skillshare-linux-binary.sh && ss version",{"type":50,"tag":398,"props":704,"children":705},{"style":563},[706],{"type":55,"value":707},"'\n",{"type":50,"tag":58,"props":709,"children":711},{"id":710},"running-commands",[712],{"type":55,"value":713},"Running Commands",{"type":50,"tag":532,"props":715,"children":717},{"id":716},"simple-command-uses-containers-default-home",[718],{"type":55,"value":719},"Simple command (uses container's default HOME)",{"type":50,"tag":201,"props":721,"children":723},{"className":390,"code":722,"language":392,"meta":209,"style":209},"docker exec $CONTAINER ss \u003Ccommand> [flags]\n",[724],{"type":50,"tag":75,"props":725,"children":726},{"__ignoreMap":209},[727],{"type":50,"tag":398,"props":728,"children":729},{"class":400,"line":401},[730,734,738,742,746,751,756,761,766],{"type":50,"tag":398,"props":731,"children":732},{"style":405},[733],{"type":55,"value":571},{"type":50,"tag":398,"props":735,"children":736},{"style":411},[737],{"type":55,"value":670},{"type":50,"tag":398,"props":739,"children":740},{"style":557},[741],{"type":55,"value":675},{"type":50,"tag":398,"props":743,"children":744},{"style":411},[745],{"type":55,"value":80},{"type":50,"tag":398,"props":747,"children":748},{"style":563},[749],{"type":55,"value":750}," \u003C",{"type":50,"tag":398,"props":752,"children":753},{"style":411},[754],{"type":55,"value":755},"comman",{"type":50,"tag":398,"props":757,"children":758},{"style":557},[759],{"type":55,"value":760},"d",{"type":50,"tag":398,"props":762,"children":763},{"style":563},[764],{"type":55,"value":765},">",{"type":50,"tag":398,"props":767,"children":768},{"style":557},[769],{"type":55,"value":770}," [flags]\n",{"type":50,"tag":51,"props":772,"children":773},{},[774,776,782,783,789,790,796,797,803,804,810],{"type":55,"value":775},"Good for: ",{"type":50,"tag":75,"props":777,"children":779},{"className":778},[],[780],{"type":55,"value":781},"ss version",{"type":55,"value":102},{"type":50,"tag":75,"props":784,"children":786},{"className":785},[],[787],{"type":55,"value":788},"ss status",{"type":55,"value":102},{"type":50,"tag":75,"props":791,"children":793},{"className":792},[],[794],{"type":55,"value":795},"ss list",{"type":55,"value":102},{"type":50,"tag":75,"props":798,"children":800},{"className":799},[],[801],{"type":55,"value":802},"ss check",{"type":55,"value":102},{"type":50,"tag":75,"props":805,"children":807},{"className":806},[],[808],{"type":55,"value":809},"ss audit",{"type":55,"value":646},{"type":50,"tag":532,"props":812,"children":814},{"id":813},"command-with-isolated-home-clean-state",[815],{"type":55,"value":816},"Command with isolated HOME (clean state)",{"type":50,"tag":201,"props":818,"children":820},{"className":390,"code":819,"language":392,"meta":209,"style":209},"ENV_NAME=\"test-$(date +%s)\"\ndocker exec $CONTAINER ssenv create \"$ENV_NAME\" --init\ndocker exec $CONTAINER ssenv enter \"$ENV_NAME\" -- ss status\n# Cleanup when done:\ndocker exec $CONTAINER ssenv delete \"$ENV_NAME\" --force\n",[821],{"type":50,"tag":75,"props":822,"children":823},{"__ignoreMap":209},[824,867,910,961,969],{"type":50,"tag":398,"props":825,"children":826},{"class":400,"line":401},[827,832,837,842,847,852,857,862],{"type":50,"tag":398,"props":828,"children":829},{"style":557},[830],{"type":55,"value":831},"ENV_NAME",{"type":50,"tag":398,"props":833,"children":834},{"style":563},[835],{"type":55,"value":836},"=",{"type":50,"tag":398,"props":838,"children":839},{"style":563},[840],{"type":55,"value":841},"\"",{"type":50,"tag":398,"props":843,"children":844},{"style":411},[845],{"type":55,"value":846},"test-",{"type":50,"tag":398,"props":848,"children":849},{"style":563},[850],{"type":55,"value":851},"$(",{"type":50,"tag":398,"props":853,"children":854},{"style":405},[855],{"type":55,"value":856},"date",{"type":50,"tag":398,"props":858,"children":859},{"style":411},[860],{"type":55,"value":861}," +%s",{"type":50,"tag":398,"props":863,"children":864},{"style":563},[865],{"type":55,"value":866},")\"\n",{"type":50,"tag":398,"props":868,"children":869},{"class":400,"line":423},[870,874,878,882,886,891,896,901,905],{"type":50,"tag":398,"props":871,"children":872},{"style":405},[873],{"type":55,"value":571},{"type":50,"tag":398,"props":875,"children":876},{"style":411},[877],{"type":55,"value":670},{"type":50,"tag":398,"props":879,"children":880},{"style":557},[881],{"type":55,"value":675},{"type":50,"tag":398,"props":883,"children":884},{"style":411},[885],{"type":55,"value":274},{"type":50,"tag":398,"props":887,"children":888},{"style":411},[889],{"type":55,"value":890}," create",{"type":50,"tag":398,"props":892,"children":893},{"style":563},[894],{"type":55,"value":895}," \"",{"type":50,"tag":398,"props":897,"children":898},{"style":557},[899],{"type":55,"value":900},"$ENV_NAME",{"type":50,"tag":398,"props":902,"children":903},{"style":563},[904],{"type":55,"value":841},{"type":50,"tag":398,"props":906,"children":907},{"style":411},[908],{"type":55,"value":909}," --init\n",{"type":50,"tag":398,"props":911,"children":912},{"class":400,"line":441},[913,917,921,925,929,934,938,942,946,951,956],{"type":50,"tag":398,"props":914,"children":915},{"style":405},[916],{"type":55,"value":571},{"type":50,"tag":398,"props":918,"children":919},{"style":411},[920],{"type":55,"value":670},{"type":50,"tag":398,"props":922,"children":923},{"style":557},[924],{"type":55,"value":675},{"type":50,"tag":398,"props":926,"children":927},{"style":411},[928],{"type":55,"value":274},{"type":50,"tag":398,"props":930,"children":931},{"style":411},[932],{"type":55,"value":933}," enter",{"type":50,"tag":398,"props":935,"children":936},{"style":563},[937],{"type":55,"value":895},{"type":50,"tag":398,"props":939,"children":940},{"style":557},[941],{"type":55,"value":900},{"type":50,"tag":398,"props":943,"children":944},{"style":563},[945],{"type":55,"value":841},{"type":50,"tag":398,"props":947,"children":948},{"style":411},[949],{"type":55,"value":950}," --",{"type":50,"tag":398,"props":952,"children":953},{"style":411},[954],{"type":55,"value":955}," ss",{"type":50,"tag":398,"props":957,"children":958},{"style":411},[959],{"type":55,"value":960}," status\n",{"type":50,"tag":398,"props":962,"children":963},{"class":400,"line":459},[964],{"type":50,"tag":398,"props":965,"children":966},{"style":417},[967],{"type":55,"value":968},"# Cleanup when done:\n",{"type":50,"tag":398,"props":970,"children":971},{"class":400,"line":477},[972,976,980,984,988,993,997,1001,1005],{"type":50,"tag":398,"props":973,"children":974},{"style":405},[975],{"type":55,"value":571},{"type":50,"tag":398,"props":977,"children":978},{"style":411},[979],{"type":55,"value":670},{"type":50,"tag":398,"props":981,"children":982},{"style":557},[983],{"type":55,"value":675},{"type":50,"tag":398,"props":985,"children":986},{"style":411},[987],{"type":55,"value":274},{"type":50,"tag":398,"props":989,"children":990},{"style":411},[991],{"type":55,"value":992}," delete",{"type":50,"tag":398,"props":994,"children":995},{"style":563},[996],{"type":55,"value":895},{"type":50,"tag":398,"props":998,"children":999},{"style":557},[1000],{"type":55,"value":900},{"type":50,"tag":398,"props":1002,"children":1003},{"style":563},[1004],{"type":55,"value":841},{"type":50,"tag":398,"props":1006,"children":1007},{"style":411},[1008],{"type":55,"value":1009}," --force\n",{"type":50,"tag":51,"props":1011,"children":1012},{},[1013,1015,1021,1022,1028,1029,1035,1036,1042],{"type":55,"value":1014},"Good for: testing ",{"type":50,"tag":75,"props":1016,"children":1018},{"className":1017},[],[1019],{"type":55,"value":1020},"init",{"type":55,"value":102},{"type":50,"tag":75,"props":1023,"children":1025},{"className":1024},[],[1026],{"type":55,"value":1027},"install",{"type":55,"value":102},{"type":50,"tag":75,"props":1030,"children":1032},{"className":1031},[],[1033],{"type":55,"value":1034},"sync",{"type":55,"value":102},{"type":50,"tag":75,"props":1037,"children":1039},{"className":1038},[],[1040],{"type":55,"value":1041},"uninstall",{"type":55,"value":1043}," — anything that modifies config\u002Fstate.",{"type":50,"tag":532,"props":1045,"children":1047},{"id":1046},"multi-command-sequence",[1048],{"type":55,"value":1049},"Multi-command sequence",{"type":50,"tag":201,"props":1051,"children":1053},{"className":390,"code":1052,"language":392,"meta":209,"style":209},"docker exec $CONTAINER ssenv enter \"$ENV_NAME\" -- bash -c '\n  ss install runkids\u002Fdemo-skills --track --force\n  ss list\n  ss sync\n'\n",[1054],{"type":50,"tag":75,"props":1055,"children":1056},{"__ignoreMap":209},[1057,1110,1118,1126,1134],{"type":50,"tag":398,"props":1058,"children":1059},{"class":400,"line":401},[1060,1064,1068,1072,1076,1080,1084,1088,1092,1096,1101,1105],{"type":50,"tag":398,"props":1061,"children":1062},{"style":405},[1063],{"type":55,"value":571},{"type":50,"tag":398,"props":1065,"children":1066},{"style":411},[1067],{"type":55,"value":670},{"type":50,"tag":398,"props":1069,"children":1070},{"style":557},[1071],{"type":55,"value":675},{"type":50,"tag":398,"props":1073,"children":1074},{"style":411},[1075],{"type":55,"value":274},{"type":50,"tag":398,"props":1077,"children":1078},{"style":411},[1079],{"type":55,"value":933},{"type":50,"tag":398,"props":1081,"children":1082},{"style":563},[1083],{"type":55,"value":895},{"type":50,"tag":398,"props":1085,"children":1086},{"style":557},[1087],{"type":55,"value":900},{"type":50,"tag":398,"props":1089,"children":1090},{"style":563},[1091],{"type":55,"value":841},{"type":50,"tag":398,"props":1093,"children":1094},{"style":411},[1095],{"type":55,"value":950},{"type":50,"tag":398,"props":1097,"children":1098},{"style":411},[1099],{"type":55,"value":1100}," bash",{"type":50,"tag":398,"props":1102,"children":1103},{"style":411},[1104],{"type":55,"value":684},{"type":50,"tag":398,"props":1106,"children":1107},{"style":563},[1108],{"type":55,"value":1109}," '\n",{"type":50,"tag":398,"props":1111,"children":1112},{"class":400,"line":423},[1113],{"type":50,"tag":398,"props":1114,"children":1115},{"style":411},[1116],{"type":55,"value":1117},"  ss install runkids\u002Fdemo-skills --track --force\n",{"type":50,"tag":398,"props":1119,"children":1120},{"class":400,"line":441},[1121],{"type":50,"tag":398,"props":1122,"children":1123},{"style":411},[1124],{"type":55,"value":1125},"  ss list\n",{"type":50,"tag":398,"props":1127,"children":1128},{"class":400,"line":459},[1129],{"type":50,"tag":398,"props":1130,"children":1131},{"style":411},[1132],{"type":55,"value":1133},"  ss sync\n",{"type":50,"tag":398,"props":1135,"children":1136},{"class":400,"line":477},[1137],{"type":50,"tag":398,"props":1138,"children":1139},{"style":563},[1140],{"type":55,"value":707},{"type":50,"tag":51,"props":1142,"children":1143},{},[1144,1146,1152,1154,1160],{"type":55,"value":1145},"Always use ",{"type":50,"tag":75,"props":1147,"children":1149},{"className":1148},[],[1150],{"type":55,"value":1151},"bash -c '...'",{"type":55,"value":1153}," for multi-command sequences inside ",{"type":50,"tag":75,"props":1155,"children":1157},{"className":1156},[],[1158],{"type":55,"value":1159},"ssenv enter",{"type":55,"value":646},{"type":50,"tag":532,"props":1162,"children":1164},{"id":1163},"go-tests",[1165],{"type":55,"value":1166},"Go tests",{"type":50,"tag":201,"props":1168,"children":1170},{"className":390,"code":1169,"language":392,"meta":209,"style":209},"# All tests (unit + integration)\ndocker exec $CONTAINER bash -c 'cd \u002Fworkspace && make test'\n\n# Unit tests only\ndocker exec $CONTAINER bash -c 'cd \u002Fworkspace && make test-unit'\n\n# Integration tests only\ndocker exec $CONTAINER bash -c 'cd \u002Fworkspace && make test-int'\n\n# Specific test\ndocker exec $CONTAINER bash -c 'cd \u002Fworkspace && go test .\u002Ftests\u002Fintegration -run TestInit_Fresh -count=1'\n\n# Specific package\ndocker exec $CONTAINER bash -c 'cd \u002Fworkspace && go test .\u002Finternal\u002Finstall\u002F... -count=1'\n",[1171],{"type":50,"tag":75,"props":1172,"children":1173},{"__ignoreMap":209},[1174,1182,1219,1228,1236,1272,1279,1288,1325,1333,1342,1379,1387,1396],{"type":50,"tag":398,"props":1175,"children":1176},{"class":400,"line":401},[1177],{"type":50,"tag":398,"props":1178,"children":1179},{"style":417},[1180],{"type":55,"value":1181},"# All tests (unit + integration)\n",{"type":50,"tag":398,"props":1183,"children":1184},{"class":400,"line":423},[1185,1189,1193,1197,1201,1205,1210,1215],{"type":50,"tag":398,"props":1186,"children":1187},{"style":405},[1188],{"type":55,"value":571},{"type":50,"tag":398,"props":1190,"children":1191},{"style":411},[1192],{"type":55,"value":670},{"type":50,"tag":398,"props":1194,"children":1195},{"style":557},[1196],{"type":55,"value":675},{"type":50,"tag":398,"props":1198,"children":1199},{"style":411},[1200],{"type":55,"value":392},{"type":50,"tag":398,"props":1202,"children":1203},{"style":411},[1204],{"type":55,"value":684},{"type":50,"tag":398,"props":1206,"children":1207},{"style":563},[1208],{"type":55,"value":1209}," '",{"type":50,"tag":398,"props":1211,"children":1212},{"style":411},[1213],{"type":55,"value":1214},"cd \u002Fworkspace && make test",{"type":50,"tag":398,"props":1216,"children":1217},{"style":563},[1218],{"type":55,"value":707},{"type":50,"tag":398,"props":1220,"children":1221},{"class":400,"line":441},[1222],{"type":50,"tag":398,"props":1223,"children":1225},{"emptyLinePlaceholder":1224},true,[1226],{"type":55,"value":1227},"\n",{"type":50,"tag":398,"props":1229,"children":1230},{"class":400,"line":459},[1231],{"type":50,"tag":398,"props":1232,"children":1233},{"style":417},[1234],{"type":55,"value":1235},"# Unit tests only\n",{"type":50,"tag":398,"props":1237,"children":1238},{"class":400,"line":477},[1239,1243,1247,1251,1255,1259,1263,1268],{"type":50,"tag":398,"props":1240,"children":1241},{"style":405},[1242],{"type":55,"value":571},{"type":50,"tag":398,"props":1244,"children":1245},{"style":411},[1246],{"type":55,"value":670},{"type":50,"tag":398,"props":1248,"children":1249},{"style":557},[1250],{"type":55,"value":675},{"type":50,"tag":398,"props":1252,"children":1253},{"style":411},[1254],{"type":55,"value":392},{"type":50,"tag":398,"props":1256,"children":1257},{"style":411},[1258],{"type":55,"value":684},{"type":50,"tag":398,"props":1260,"children":1261},{"style":563},[1262],{"type":55,"value":1209},{"type":50,"tag":398,"props":1264,"children":1265},{"style":411},[1266],{"type":55,"value":1267},"cd \u002Fworkspace && make test-unit",{"type":50,"tag":398,"props":1269,"children":1270},{"style":563},[1271],{"type":55,"value":707},{"type":50,"tag":398,"props":1273,"children":1274},{"class":400,"line":495},[1275],{"type":50,"tag":398,"props":1276,"children":1277},{"emptyLinePlaceholder":1224},[1278],{"type":55,"value":1227},{"type":50,"tag":398,"props":1280,"children":1282},{"class":400,"line":1281},7,[1283],{"type":50,"tag":398,"props":1284,"children":1285},{"style":417},[1286],{"type":55,"value":1287},"# Integration tests only\n",{"type":50,"tag":398,"props":1289,"children":1291},{"class":400,"line":1290},8,[1292,1296,1300,1304,1308,1312,1316,1321],{"type":50,"tag":398,"props":1293,"children":1294},{"style":405},[1295],{"type":55,"value":571},{"type":50,"tag":398,"props":1297,"children":1298},{"style":411},[1299],{"type":55,"value":670},{"type":50,"tag":398,"props":1301,"children":1302},{"style":557},[1303],{"type":55,"value":675},{"type":50,"tag":398,"props":1305,"children":1306},{"style":411},[1307],{"type":55,"value":392},{"type":50,"tag":398,"props":1309,"children":1310},{"style":411},[1311],{"type":55,"value":684},{"type":50,"tag":398,"props":1313,"children":1314},{"style":563},[1315],{"type":55,"value":1209},{"type":50,"tag":398,"props":1317,"children":1318},{"style":411},[1319],{"type":55,"value":1320},"cd \u002Fworkspace && make test-int",{"type":50,"tag":398,"props":1322,"children":1323},{"style":563},[1324],{"type":55,"value":707},{"type":50,"tag":398,"props":1326,"children":1328},{"class":400,"line":1327},9,[1329],{"type":50,"tag":398,"props":1330,"children":1331},{"emptyLinePlaceholder":1224},[1332],{"type":55,"value":1227},{"type":50,"tag":398,"props":1334,"children":1336},{"class":400,"line":1335},10,[1337],{"type":50,"tag":398,"props":1338,"children":1339},{"style":417},[1340],{"type":55,"value":1341},"# Specific test\n",{"type":50,"tag":398,"props":1343,"children":1345},{"class":400,"line":1344},11,[1346,1350,1354,1358,1362,1366,1370,1375],{"type":50,"tag":398,"props":1347,"children":1348},{"style":405},[1349],{"type":55,"value":571},{"type":50,"tag":398,"props":1351,"children":1352},{"style":411},[1353],{"type":55,"value":670},{"type":50,"tag":398,"props":1355,"children":1356},{"style":557},[1357],{"type":55,"value":675},{"type":50,"tag":398,"props":1359,"children":1360},{"style":411},[1361],{"type":55,"value":392},{"type":50,"tag":398,"props":1363,"children":1364},{"style":411},[1365],{"type":55,"value":684},{"type":50,"tag":398,"props":1367,"children":1368},{"style":563},[1369],{"type":55,"value":1209},{"type":50,"tag":398,"props":1371,"children":1372},{"style":411},[1373],{"type":55,"value":1374},"cd \u002Fworkspace && go test .\u002Ftests\u002Fintegration -run TestInit_Fresh -count=1",{"type":50,"tag":398,"props":1376,"children":1377},{"style":563},[1378],{"type":55,"value":707},{"type":50,"tag":398,"props":1380,"children":1382},{"class":400,"line":1381},12,[1383],{"type":50,"tag":398,"props":1384,"children":1385},{"emptyLinePlaceholder":1224},[1386],{"type":55,"value":1227},{"type":50,"tag":398,"props":1388,"children":1390},{"class":400,"line":1389},13,[1391],{"type":50,"tag":398,"props":1392,"children":1393},{"style":417},[1394],{"type":55,"value":1395},"# Specific package\n",{"type":50,"tag":398,"props":1397,"children":1399},{"class":400,"line":1398},14,[1400,1404,1408,1412,1416,1420,1424,1429],{"type":50,"tag":398,"props":1401,"children":1402},{"style":405},[1403],{"type":55,"value":571},{"type":50,"tag":398,"props":1405,"children":1406},{"style":411},[1407],{"type":55,"value":670},{"type":50,"tag":398,"props":1409,"children":1410},{"style":557},[1411],{"type":55,"value":675},{"type":50,"tag":398,"props":1413,"children":1414},{"style":411},[1415],{"type":55,"value":392},{"type":50,"tag":398,"props":1417,"children":1418},{"style":411},[1419],{"type":55,"value":684},{"type":50,"tag":398,"props":1421,"children":1422},{"style":563},[1423],{"type":55,"value":1209},{"type":50,"tag":398,"props":1425,"children":1426},{"style":411},[1427],{"type":55,"value":1428},"cd \u002Fworkspace && go test .\u002Finternal\u002Finstall\u002F... -count=1",{"type":50,"tag":398,"props":1430,"children":1431},{"style":563},[1432],{"type":55,"value":707},{"type":50,"tag":51,"props":1434,"children":1435},{},[1436,1438,1444],{"type":55,"value":1437},"Always ",{"type":50,"tag":75,"props":1439,"children":1441},{"className":1440},[],[1442],{"type":55,"value":1443},"cd \u002Fworkspace",{"type":55,"value":1445}," before Go commands — ssenv changes HOME which can break module resolution.",{"type":50,"tag":532,"props":1447,"children":1449},{"id":1448},"go-tests-with-auth-disabled",[1450],{"type":55,"value":1451},"Go tests with auth disabled",{"type":50,"tag":51,"props":1453,"children":1454},{},[1455,1457,1463,1464,1470],{"type":55,"value":1456},"Some tests (e.g., ",{"type":50,"tag":75,"props":1458,"children":1460},{"className":1459},[],[1461],{"type":55,"value":1462},"TestResolveToken",{"type":55,"value":102},{"type":50,"tag":75,"props":1465,"children":1467},{"className":1466},[],[1468],{"type":55,"value":1469},"TestAuthEnv",{"type":55,"value":1471},") need auth credentials removed:",{"type":50,"tag":201,"props":1473,"children":1475},{"className":390,"code":1474,"language":392,"meta":209,"style":209},"docker exec $CONTAINER bash -c '\n  eval \"$(credential-helper --eval off)\"\n  cd \u002Fworkspace\n  go test .\u002Finternal\u002Fgithub -run TestResolveToken -count=1\n  eval \"$(credential-helper --eval on)\"\n'\n",[1476],{"type":50,"tag":75,"props":1477,"children":1478},{"__ignoreMap":209},[1479,1506,1514,1522,1530,1538],{"type":50,"tag":398,"props":1480,"children":1481},{"class":400,"line":401},[1482,1486,1490,1494,1498,1502],{"type":50,"tag":398,"props":1483,"children":1484},{"style":405},[1485],{"type":55,"value":571},{"type":50,"tag":398,"props":1487,"children":1488},{"style":411},[1489],{"type":55,"value":670},{"type":50,"tag":398,"props":1491,"children":1492},{"style":557},[1493],{"type":55,"value":675},{"type":50,"tag":398,"props":1495,"children":1496},{"style":411},[1497],{"type":55,"value":392},{"type":50,"tag":398,"props":1499,"children":1500},{"style":411},[1501],{"type":55,"value":684},{"type":50,"tag":398,"props":1503,"children":1504},{"style":563},[1505],{"type":55,"value":1109},{"type":50,"tag":398,"props":1507,"children":1508},{"class":400,"line":423},[1509],{"type":50,"tag":398,"props":1510,"children":1511},{"style":411},[1512],{"type":55,"value":1513},"  eval \"$(credential-helper --eval off)\"\n",{"type":50,"tag":398,"props":1515,"children":1516},{"class":400,"line":441},[1517],{"type":50,"tag":398,"props":1518,"children":1519},{"style":411},[1520],{"type":55,"value":1521},"  cd \u002Fworkspace\n",{"type":50,"tag":398,"props":1523,"children":1524},{"class":400,"line":459},[1525],{"type":50,"tag":398,"props":1526,"children":1527},{"style":411},[1528],{"type":55,"value":1529},"  go test .\u002Finternal\u002Fgithub -run TestResolveToken -count=1\n",{"type":50,"tag":398,"props":1531,"children":1532},{"class":400,"line":477},[1533],{"type":50,"tag":398,"props":1534,"children":1535},{"style":411},[1536],{"type":55,"value":1537},"  eval \"$(credential-helper --eval on)\"\n",{"type":50,"tag":398,"props":1539,"children":1540},{"class":400,"line":495},[1541],{"type":50,"tag":398,"props":1542,"children":1543},{"style":563},[1544],{"type":55,"value":707},{"type":50,"tag":58,"props":1546,"children":1548},{"id":1547},"web-ui-dashboard",[1549],{"type":55,"value":1550},"Web UI Dashboard",{"type":50,"tag":201,"props":1552,"children":1554},{"className":390,"code":1553,"language":392,"meta":209,"style":209},"# Start (global mode)\ndocker exec $CONTAINER ui\n\n# Start (project mode — uses ~\u002Fdemo-project)\ndocker exec $CONTAINER ui -p\n\n# Stop\ndocker exec $CONTAINER ui stop\n",[1555],{"type":50,"tag":75,"props":1556,"children":1557},{"__ignoreMap":209},[1558,1566,1586,1593,1601,1626,1633,1641],{"type":50,"tag":398,"props":1559,"children":1560},{"class":400,"line":401},[1561],{"type":50,"tag":398,"props":1562,"children":1563},{"style":417},[1564],{"type":55,"value":1565},"# Start (global mode)\n",{"type":50,"tag":398,"props":1567,"children":1568},{"class":400,"line":423},[1569,1573,1577,1581],{"type":50,"tag":398,"props":1570,"children":1571},{"style":405},[1572],{"type":55,"value":571},{"type":50,"tag":398,"props":1574,"children":1575},{"style":411},[1576],{"type":55,"value":670},{"type":50,"tag":398,"props":1578,"children":1579},{"style":557},[1580],{"type":55,"value":675},{"type":50,"tag":398,"props":1582,"children":1583},{"style":411},[1584],{"type":55,"value":1585},"ui\n",{"type":50,"tag":398,"props":1587,"children":1588},{"class":400,"line":441},[1589],{"type":50,"tag":398,"props":1590,"children":1591},{"emptyLinePlaceholder":1224},[1592],{"type":55,"value":1227},{"type":50,"tag":398,"props":1594,"children":1595},{"class":400,"line":459},[1596],{"type":50,"tag":398,"props":1597,"children":1598},{"style":417},[1599],{"type":55,"value":1600},"# Start (project mode — uses ~\u002Fdemo-project)\n",{"type":50,"tag":398,"props":1602,"children":1603},{"class":400,"line":477},[1604,1608,1612,1616,1621],{"type":50,"tag":398,"props":1605,"children":1606},{"style":405},[1607],{"type":55,"value":571},{"type":50,"tag":398,"props":1609,"children":1610},{"style":411},[1611],{"type":55,"value":670},{"type":50,"tag":398,"props":1613,"children":1614},{"style":557},[1615],{"type":55,"value":675},{"type":50,"tag":398,"props":1617,"children":1618},{"style":411},[1619],{"type":55,"value":1620},"ui",{"type":50,"tag":398,"props":1622,"children":1623},{"style":411},[1624],{"type":55,"value":1625}," -p\n",{"type":50,"tag":398,"props":1627,"children":1628},{"class":400,"line":495},[1629],{"type":50,"tag":398,"props":1630,"children":1631},{"emptyLinePlaceholder":1224},[1632],{"type":55,"value":1227},{"type":50,"tag":398,"props":1634,"children":1635},{"class":400,"line":1281},[1636],{"type":50,"tag":398,"props":1637,"children":1638},{"style":417},[1639],{"type":55,"value":1640},"# Stop\n",{"type":50,"tag":398,"props":1642,"children":1643},{"class":400,"line":1290},[1644,1648,1652,1656,1660],{"type":50,"tag":398,"props":1645,"children":1646},{"style":405},[1647],{"type":55,"value":571},{"type":50,"tag":398,"props":1649,"children":1650},{"style":411},[1651],{"type":55,"value":670},{"type":50,"tag":398,"props":1653,"children":1654},{"style":557},[1655],{"type":55,"value":675},{"type":50,"tag":398,"props":1657,"children":1658},{"style":411},[1659],{"type":55,"value":1620},{"type":50,"tag":398,"props":1661,"children":1662},{"style":411},[1663],{"type":55,"value":1664}," stop\n",{"type":50,"tag":51,"props":1666,"children":1667},{},[1668,1670,1676,1678,1684,1686,1692,1693,1699],{"type":55,"value":1669},"Dashboard accessible at ",{"type":50,"tag":75,"props":1671,"children":1673},{"className":1672},[],[1674],{"type":55,"value":1675},"http:\u002F\u002Flocalhost:5173",{"type":55,"value":1677}," (Vite dev server with HMR).\nAPI backend at ",{"type":50,"tag":75,"props":1679,"children":1681},{"className":1680},[],[1682],{"type":55,"value":1683},"http:\u002F\u002Flocalhost:19420",{"type":55,"value":1685},".\nLogs: ",{"type":50,"tag":75,"props":1687,"children":1689},{"className":1688},[],[1690],{"type":55,"value":1691},"\u002Ftmp\u002Fapi-dev.log",{"type":55,"value":102},{"type":50,"tag":75,"props":1694,"children":1696},{"className":1695},[],[1697],{"type":55,"value":1698},"\u002Ftmp\u002Fvite-dev.log",{"type":55,"value":646},{"type":50,"tag":58,"props":1701,"children":1703},{"id":1702},"ssenv-quick-reference",[1704],{"type":55,"value":1705},"ssenv Quick Reference",{"type":50,"tag":1707,"props":1708,"children":1709},"table",{},[1710,1734],{"type":50,"tag":1711,"props":1712,"children":1713},"thead",{},[1714],{"type":50,"tag":1715,"props":1716,"children":1717},"tr",{},[1718,1724,1729],{"type":50,"tag":1719,"props":1720,"children":1721},"th",{},[1722],{"type":55,"value":1723},"Shortcut",{"type":50,"tag":1719,"props":1725,"children":1726},{},[1727],{"type":55,"value":1728},"Full form",{"type":50,"tag":1719,"props":1730,"children":1731},{},[1732],{"type":55,"value":1733},"Purpose",{"type":50,"tag":1735,"props":1736,"children":1737},"tbody",{},[1738,1767,1793,1819,1845,1871],{"type":50,"tag":1715,"props":1739,"children":1740},{},[1741,1751,1762],{"type":50,"tag":1742,"props":1743,"children":1744},"td",{},[1745],{"type":50,"tag":75,"props":1746,"children":1748},{"className":1747},[],[1749],{"type":55,"value":1750},"ssnew \u003Cname>",{"type":50,"tag":1742,"props":1752,"children":1753},{},[1754,1760],{"type":50,"tag":75,"props":1755,"children":1757},{"className":1756},[],[1758],{"type":55,"value":1759},"ssenv create \u003Cname>",{"type":55,"value":1761}," + enter",{"type":50,"tag":1742,"props":1763,"children":1764},{},[1765],{"type":55,"value":1766},"Create and enter isolated shell",{"type":50,"tag":1715,"props":1768,"children":1769},{},[1770,1779,1788],{"type":50,"tag":1742,"props":1771,"children":1772},{},[1773],{"type":50,"tag":75,"props":1774,"children":1776},{"className":1775},[],[1777],{"type":55,"value":1778},"ssuse \u003Cname>",{"type":50,"tag":1742,"props":1780,"children":1781},{},[1782],{"type":50,"tag":75,"props":1783,"children":1785},{"className":1784},[],[1786],{"type":55,"value":1787},"ssenv enter \u003Cname>",{"type":50,"tag":1742,"props":1789,"children":1790},{},[1791],{"type":55,"value":1792},"Enter existing isolated shell",{"type":50,"tag":1715,"props":1794,"children":1795},{},[1796,1805,1814],{"type":50,"tag":1742,"props":1797,"children":1798},{},[1799],{"type":50,"tag":75,"props":1800,"children":1802},{"className":1801},[],[1803],{"type":55,"value":1804},"ssrm \u003Cname>",{"type":50,"tag":1742,"props":1806,"children":1807},{},[1808],{"type":50,"tag":75,"props":1809,"children":1811},{"className":1810},[],[1812],{"type":55,"value":1813},"ssenv delete \u003Cname> --force",{"type":50,"tag":1742,"props":1815,"children":1816},{},[1817],{"type":55,"value":1818},"Delete environment",{"type":50,"tag":1715,"props":1820,"children":1821},{},[1822,1831,1840],{"type":50,"tag":1742,"props":1823,"children":1824},{},[1825],{"type":50,"tag":75,"props":1826,"children":1828},{"className":1827},[],[1829],{"type":55,"value":1830},"ssls",{"type":50,"tag":1742,"props":1832,"children":1833},{},[1834],{"type":50,"tag":75,"props":1835,"children":1837},{"className":1836},[],[1838],{"type":55,"value":1839},"ssenv list",{"type":50,"tag":1742,"props":1841,"children":1842},{},[1843],{"type":55,"value":1844},"List all environments",{"type":50,"tag":1715,"props":1846,"children":1847},{},[1848,1857,1866],{"type":50,"tag":1742,"props":1849,"children":1850},{},[1851],{"type":50,"tag":75,"props":1852,"children":1854},{"className":1853},[],[1855],{"type":55,"value":1856},"ssback",{"type":50,"tag":1742,"props":1858,"children":1859},{},[1860],{"type":50,"tag":75,"props":1861,"children":1863},{"className":1862},[],[1864],{"type":55,"value":1865},"ssenv reset",{"type":50,"tag":1742,"props":1867,"children":1868},{},[1869],{"type":55,"value":1870},"Leave isolated context",{"type":50,"tag":1715,"props":1872,"children":1873},{},[1874,1883,1892],{"type":50,"tag":1742,"props":1875,"children":1876},{},[1877],{"type":50,"tag":75,"props":1878,"children":1880},{"className":1879},[],[1881],{"type":55,"value":1882},"sshelp",{"type":50,"tag":1742,"props":1884,"children":1885},{},[1886],{"type":50,"tag":75,"props":1887,"children":1889},{"className":1888},[],[1890],{"type":55,"value":1891},"help",{"type":50,"tag":1742,"props":1893,"children":1894},{},[1895],{"type":55,"value":1896},"Show all devcontainer commands",{"type":50,"tag":51,"props":1898,"children":1899},{},[1900,1902,1908,1910,1916,1918,1924],{"type":55,"value":1901},"For automation (non-interactive), prefer ",{"type":50,"tag":75,"props":1903,"children":1905},{"className":1904},[],[1906],{"type":55,"value":1907},"ssenv enter \u003Cname> -- \u003Ccommand>",{"type":55,"value":1909}," over ",{"type":50,"tag":75,"props":1911,"children":1913},{"className":1912},[],[1914],{"type":55,"value":1915},"ssnew",{"type":55,"value":1917},"\u002F",{"type":50,"tag":75,"props":1919,"children":1921},{"className":1920},[],[1922],{"type":55,"value":1923},"ssuse",{"type":55,"value":1925}," (which launch subshells).",{"type":50,"tag":58,"props":1927,"children":1929},{"id":1928},"ports",[1930],{"type":55,"value":1931},"Ports",{"type":50,"tag":1707,"props":1933,"children":1934},{},[1935,1956],{"type":50,"tag":1711,"props":1936,"children":1937},{},[1938],{"type":50,"tag":1715,"props":1939,"children":1940},{},[1941,1946,1951],{"type":50,"tag":1719,"props":1942,"children":1943},{},[1944],{"type":55,"value":1945},"Port",{"type":50,"tag":1719,"props":1947,"children":1948},{},[1949],{"type":55,"value":1950},"Service",{"type":50,"tag":1719,"props":1952,"children":1953},{},[1954],{"type":55,"value":1955},"Notes",{"type":50,"tag":1735,"props":1957,"children":1958},{},[1959,1977,2001],{"type":50,"tag":1715,"props":1960,"children":1961},{},[1962,1967,1972],{"type":50,"tag":1742,"props":1963,"children":1964},{},[1965],{"type":55,"value":1966},"5173",{"type":50,"tag":1742,"props":1968,"children":1969},{},[1970],{"type":55,"value":1971},"Vite dev server",{"type":50,"tag":1742,"props":1973,"children":1974},{},[1975],{"type":55,"value":1976},"React dashboard with HMR",{"type":50,"tag":1715,"props":1978,"children":1979},{},[1980,1985,1990],{"type":50,"tag":1742,"props":1981,"children":1982},{},[1983],{"type":55,"value":1984},"19420",{"type":50,"tag":1742,"props":1986,"children":1987},{},[1988],{"type":55,"value":1989},"Go API backend",{"type":50,"tag":1742,"props":1991,"children":1992},{},[1993,1999],{"type":50,"tag":75,"props":1994,"children":1996},{"className":1995},[],[1997],{"type":55,"value":1998},"skillshare ui",{"type":55,"value":2000}," server",{"type":50,"tag":1715,"props":2002,"children":2003},{},[2004,2009,2014],{"type":50,"tag":1742,"props":2005,"children":2006},{},[2007],{"type":55,"value":2008},"3000",{"type":50,"tag":1742,"props":2010,"children":2011},{},[2012],{"type":55,"value":2013},"Docusaurus",{"type":50,"tag":1742,"props":2015,"children":2016},{},[2017,2023],{"type":50,"tag":75,"props":2018,"children":2020},{"className":2019},[],[2021],{"type":55,"value":2022},"docs",{"type":55,"value":2024}," command in devcontainer",{"type":50,"tag":58,"props":2026,"children":2028},{"id":2027},"common-mistakes-to-avoid",[2029],{"type":55,"value":2030},"Common Mistakes to Avoid",{"type":50,"tag":326,"props":2032,"children":2033},{},[2034,2055,2070,2086,2104,2121,2160],{"type":50,"tag":69,"props":2035,"children":2036},{},[2037,2048,2050],{"type":50,"tag":216,"props":2038,"children":2039},{},[2040,2041,2046],{"type":55,"value":73},{"type":50,"tag":75,"props":2042,"children":2044},{"className":2043},[],[2045],{"type":55,"value":80},{"type":55,"value":2047}," on host",{"type":55,"value":2049}," — macOS binary won't match Linux container; always ",{"type":50,"tag":75,"props":2051,"children":2053},{"className":2052},[],[2054],{"type":55,"value":264},{"type":50,"tag":69,"props":2056,"children":2057},{},[2058,2068],{"type":50,"tag":216,"props":2059,"children":2060},{},[2061,2063],{"type":55,"value":2062},"Forgetting ",{"type":50,"tag":75,"props":2064,"children":2066},{"className":2065},[],[2067],{"type":55,"value":1443},{"type":55,"value":2069}," — Go tests fail if HOME was changed by ssenv",{"type":50,"tag":69,"props":2071,"children":2072},{},[2073,2084],{"type":50,"tag":216,"props":2074,"children":2075},{},[2076,2078,2083],{"type":55,"value":2077},"Using ",{"type":50,"tag":75,"props":2079,"children":2081},{"className":2080},[],[2082],{"type":55,"value":108},{"type":55,"value":2047},{"type":55,"value":2085}," — builds macOS binary, then tests run against wrong arch",{"type":50,"tag":69,"props":2087,"children":2088},{},[2089,2102],{"type":50,"tag":216,"props":2090,"children":2091},{},[2092,2094,2100],{"type":55,"value":2093},"Skipping ",{"type":50,"tag":75,"props":2095,"children":2097},{"className":2096},[],[2098],{"type":55,"value":2099},"--init",{"type":55,"value":2101}," on ssenv create",{"type":55,"value":2103}," — env won't have config; most commands will fail",{"type":50,"tag":69,"props":2105,"children":2106},{},[2107,2112,2114,2119],{"type":50,"tag":216,"props":2108,"children":2109},{},[2110],{"type":55,"value":2111},"Not cleaning up ssenv",{"type":55,"value":2113}," — ",{"type":50,"tag":75,"props":2115,"children":2117},{"className":2116},[],[2118],{"type":55,"value":1813},{"type":55,"value":2120}," after done; or ask user",{"type":50,"tag":69,"props":2122,"children":2123},{},[2124,2129,2131,2136,2138,2144,2146,2152,2154],{"type":50,"tag":216,"props":2125,"children":2126},{},[2127],{"type":55,"value":2128},"Running from \u002Fworkspace root without -g",{"type":55,"value":2130}," — the ",{"type":50,"tag":75,"props":2132,"children":2134},{"className":2133},[],[2135],{"type":55,"value":80},{"type":55,"value":2137}," wrapper auto-redirects to ",{"type":50,"tag":75,"props":2139,"children":2141},{"className":2140},[],[2142],{"type":55,"value":2143},"~\u002Fdemo-project",{"type":55,"value":2145}," in project mode; use ",{"type":50,"tag":75,"props":2147,"children":2149},{"className":2148},[],[2150],{"type":55,"value":2151},"-g",{"type":55,"value":2153}," for global or set ",{"type":50,"tag":75,"props":2155,"children":2157},{"className":2156},[],[2158],{"type":55,"value":2159},"SKILLSHARE_DEV_ALLOW_WORKSPACE_PROJECT=1",{"type":50,"tag":69,"props":2161,"children":2162},{},[2163,2174,2176,2181],{"type":50,"tag":216,"props":2164,"children":2165},{},[2166,2167,2172],{"type":55,"value":73},{"type":50,"tag":75,"props":2168,"children":2170},{"className":2169},[],[2171],{"type":55,"value":254},{"type":55,"value":2173}," before testing",{"type":55,"value":2175}," — unnecessary; the ",{"type":50,"tag":75,"props":2177,"children":2179},{"className":2178},[],[2180],{"type":55,"value":80},{"type":55,"value":2182}," wrapper auto-builds from source every time",{"type":50,"tag":58,"props":2184,"children":2186},{"id":2185},"rules",[2187],{"type":55,"value":2188},"Rules",{"type":50,"tag":65,"props":2190,"children":2191},{},[2192,2202,2212,2222,2232],{"type":50,"tag":69,"props":2193,"children":2194},{},[2195,2200],{"type":50,"tag":216,"props":2196,"children":2197},{},[2198],{"type":55,"value":2199},"All CLI execution inside devcontainer",{"type":55,"value":2201}," — no exceptions",{"type":50,"tag":69,"props":2203,"children":2204},{},[2205,2210],{"type":50,"tag":216,"props":2206,"children":2207},{},[2208],{"type":55,"value":2209},"Use ssenv for stateful tests",{"type":55,"value":2211}," — don't pollute default HOME",{"type":50,"tag":69,"props":2213,"children":2214},{},[2215,2220],{"type":50,"tag":216,"props":2216,"children":2217},{},[2218],{"type":55,"value":2219},"Always verify",{"type":55,"value":2221}," — run the command and check output; never assume it worked",{"type":50,"tag":69,"props":2223,"children":2224},{},[2225,2230],{"type":50,"tag":216,"props":2226,"children":2227},{},[2228],{"type":55,"value":2229},"Clean up",{"type":55,"value":2231}," — delete ssenv environments after use (or ask user)",{"type":50,"tag":69,"props":2233,"children":2234},{},[2235,2240,2242,2247],{"type":50,"tag":216,"props":2236,"children":2237},{},[2238],{"type":55,"value":2239},"Report container ID",{"type":55,"value":2241}," — set ",{"type":50,"tag":75,"props":2243,"children":2245},{"className":2244},[],[2246],{"type":55,"value":627},{"type":55,"value":2248}," at the start and reuse throughout",{"type":50,"tag":2250,"props":2251,"children":2252},"style",{},[2253],{"type":55,"value":2254},"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":2256,"total":2378},[2257,2276,2291,2307,2322,2345,2362],{"slug":2258,"name":2258,"fn":2259,"description":2260,"org":2261,"tags":2262,"stars":25,"repoUrl":26,"updatedAt":2275},"algorithmic-art","create generative art with p5.js","Creating algorithmic art using p5.js with seeded randomness and interactive parameter exploration. Use this when users request creating art using code, generative art, algorithmic art, flow fields, or particle systems. Create original algorithmic art rather than copying existing artists' work to avoid copyright violations.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2263,2266,2269,2272],{"name":2264,"slug":2265,"type":15},"Creative","creative",{"name":2267,"slug":2268,"type":15},"Generative Art","generative-art",{"name":2270,"slug":2271,"type":15},"Graphics","graphics",{"name":2273,"slug":2274,"type":15},"JavaScript","javascript","2026-07-13T06:41:35.540127",{"slug":2277,"name":2277,"fn":2278,"description":2279,"org":2280,"tags":2281,"stars":25,"repoUrl":26,"updatedAt":2290},"antfu","configure JavaScript projects with Anthony Fu's tools","Anthony Fu's opinionated tooling and conventions for JavaScript\u002FTypeScript projects. Use when setting up new projects, configuring ESLint\u002FPrettier alternatives, monorepos, library publishing, or when the user mentions Anthony Fu's preferences.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2282,2285,2286,2287],{"name":2283,"slug":2284,"type":15},"Best Practices","best-practices",{"name":17,"slug":18,"type":15},{"name":2273,"slug":2274,"type":15},{"name":2288,"slug":2289,"type":15},"TypeScript","typescript","2026-07-13T06:43:13.153309",{"slug":2292,"name":2292,"fn":2293,"description":2294,"org":2295,"tags":2296,"stars":25,"repoUrl":26,"updatedAt":2306},"brand-guidelines","apply Anthropic brand guidelines","Applies Anthropic's official brand colors and typography to any sort of artifact that may benefit from having Anthropic's look-and-feel. Use it when brand colors or style guidelines, visual formatting, or company design standards apply.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2297,2300,2303],{"name":2298,"slug":2299,"type":15},"Branding","branding",{"name":2301,"slug":2302,"type":15},"Design","design",{"name":2304,"slug":2305,"type":15},"Typography","typography","2026-07-13T06:43:06.077629",{"slug":2308,"name":2308,"fn":2309,"description":2310,"org":2311,"tags":2312,"stars":25,"repoUrl":26,"updatedAt":2321},"canvas-design","create visual art and design assets","Create beautiful visual art in .png and .pdf documents using design philosophy. You should use this skill when the user asks to create a poster, piece of art, design, or other static piece. Create original visual designs, never copying existing artists' work to avoid copyright violations.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2313,2314,2315,2318],{"name":2264,"slug":2265,"type":15},{"name":2301,"slug":2302,"type":15},{"name":2316,"slug":2317,"type":15},"Images","images",{"name":2319,"slug":2320,"type":15},"PDF","pdf","2026-07-13T06:39:58.803113",{"slug":2323,"name":2323,"fn":2324,"description":2325,"org":2326,"tags":2327,"stars":25,"repoUrl":26,"updatedAt":2344},"ci-cd-containerization-advisor","design CI\u002FCD pipelines for Kotlin applications","Design reproducible build, image, and deployment pipelines for Kotlin plus Spring applications, including CI verification, layered containers, rollout safety, and deployment-time migration coordination. Use when creating or improving Dockerfiles, CI workflows, image hardening, Kubernetes manifests, release gates, or deployment strategies for Spring Boot services, especially where build reproducibility and operational safety matter.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2328,2331,2334,2337,2338,2341],{"name":2329,"slug":2330,"type":15},"CI\u002FCD","ci-cd",{"name":2332,"slug":2333,"type":15},"Containers","containers",{"name":2335,"slug":2336,"type":15},"Deployment","deployment",{"name":17,"slug":18,"type":15},{"name":2339,"slug":2340,"type":15},"Kotlin","kotlin",{"name":2342,"slug":2343,"type":15},"Spring","spring","2026-07-13T06:41:47.83899",{"slug":2346,"name":2346,"fn":2347,"description":2348,"org":2349,"tags":2350,"stars":25,"repoUrl":26,"updatedAt":2361},"cloudflare-deploy","deploy applications to Cloudflare","Deploy applications and infrastructure to Cloudflare using Workers, Pages, and related platform services. Use when the user asks to deploy, host, publish, or set up a project on Cloudflare.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2351,2354,2357,2360],{"name":2352,"slug":2353,"type":15},"Cloudflare","cloudflare",{"name":2355,"slug":2356,"type":15},"Cloudflare Pages","cloudflare-pages",{"name":2358,"slug":2359,"type":15},"Cloudflare Workers","cloudflare-workers",{"name":2335,"slug":2336,"type":15},"2026-07-17T06:04:42.853896",{"slug":2363,"name":2363,"fn":2364,"description":2365,"org":2366,"tags":2367,"stars":25,"repoUrl":26,"updatedAt":2377},"compose-ui-control","interact with Compose Desktop applications","Control a running Compose Desktop application via HTTP. Use when you need to interact with UI elements, click buttons, enter text, wait for elements to appear, or capture screenshots in a Compose Desktop app that has compose-ui-test-server enabled.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2368,2371,2374],{"name":2369,"slug":2370,"type":15},"Automation","automation",{"name":2372,"slug":2373,"type":15},"Desktop","desktop",{"name":2375,"slug":2376,"type":15},"UI Components","ui-components","2026-07-13T06:40:38.798626",128,{"items":2380,"total":2505},[2381,2397,2406,2415,2426,2436,2445,2454,2463,2473,2482,2495],{"slug":2382,"name":2382,"fn":2383,"description":2384,"org":2385,"tags":2386,"stars":2394,"repoUrl":2395,"updatedAt":2396},"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},[2387,2390,2393],{"name":2388,"slug":2389,"type":15},"Architecture","architecture",{"name":2391,"slug":2392,"type":15},"Configuration","configuration",{"name":17,"slug":18,"type":15},1650,"https:\u002F\u002Fgithub.com\u002FJetBrains\u002FMPS","2026-07-17T06:06:57.311661",{"slug":2398,"name":2398,"fn":2399,"description":2400,"org":2401,"tags":2402,"stars":2394,"repoUrl":2395,"updatedAt":2405},"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},[2403,2404],{"name":2388,"slug":2389,"type":15},{"name":17,"slug":18,"type":15},"2026-07-17T06:04:48.066901",{"slug":2407,"name":2407,"fn":2408,"description":2409,"org":2410,"tags":2411,"stars":2394,"repoUrl":2395,"updatedAt":2414},"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},[2412,2413],{"name":2388,"slug":2389,"type":15},{"name":17,"slug":18,"type":15},"2026-07-13T06:45:21.757084",{"slug":2416,"name":2416,"fn":2417,"description":2418,"org":2419,"tags":2420,"stars":2394,"repoUrl":2395,"updatedAt":2425},"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},[2421,2422],{"name":2388,"slug":2389,"type":15},{"name":2423,"slug":2424,"type":15},"Code Analysis","code-analysis","2026-07-23T05:41:33.639365",{"slug":2427,"name":2427,"fn":2428,"description":2429,"org":2430,"tags":2431,"stars":2394,"repoUrl":2395,"updatedAt":2435},"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},[2432],{"name":2433,"slug":2434,"type":15},"Data Analysis","data-analysis","2026-07-13T06:45:19.114674",{"slug":2437,"name":2437,"fn":2438,"description":2439,"org":2440,"tags":2441,"stars":2394,"repoUrl":2395,"updatedAt":2444},"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},[2442,2443],{"name":2301,"slug":2302,"type":15},{"name":2375,"slug":2376,"type":15},"2026-07-23T05:41:56.638151",{"slug":2446,"name":2446,"fn":2447,"description":2448,"org":2449,"tags":2450,"stars":2394,"repoUrl":2395,"updatedAt":2453},"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},[2451,2452],{"name":17,"slug":18,"type":15},{"name":2375,"slug":2376,"type":15},"2026-07-23T05:41:49.666535",{"slug":2455,"name":2455,"fn":2456,"description":2457,"org":2458,"tags":2459,"stars":2394,"repoUrl":2395,"updatedAt":2462},"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},[2460,2461],{"name":2388,"slug":2389,"type":15},{"name":17,"slug":18,"type":15},"2026-07-13T06:44:59.507855",{"slug":2464,"name":2464,"fn":2465,"description":2466,"org":2467,"tags":2468,"stars":2394,"repoUrl":2395,"updatedAt":2472},"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},[2469,2470,2471],{"name":2388,"slug":2389,"type":15},{"name":2423,"slug":2424,"type":15},{"name":17,"slug":18,"type":15},"2026-07-17T06:06:58.042999",{"slug":2474,"name":2474,"fn":2475,"description":2476,"org":2477,"tags":2478,"stars":2394,"repoUrl":2395,"updatedAt":2481},"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},[2479,2480],{"name":2388,"slug":2389,"type":15},{"name":17,"slug":18,"type":15},"2026-07-23T05:41:48.692899",{"slug":2483,"name":2483,"fn":2484,"description":2485,"org":2486,"tags":2487,"stars":2394,"repoUrl":2395,"updatedAt":2494},"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},[2488,2491],{"name":2489,"slug":2490,"type":15},"Debugging","debugging",{"name":2492,"slug":2493,"type":15},"Migration","migration","2026-07-13T06:45:20.372122",{"slug":2496,"name":2496,"fn":2497,"description":2498,"org":2499,"tags":2500,"stars":2394,"repoUrl":2395,"updatedAt":2504},"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},[2501],{"name":2502,"slug":2503,"type":15},"Data Modeling","data-modeling","2026-07-23T05:41:30.705975",188]