[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M71E09KEC20AVMAJBXZRPXBA":3,"skill-same:01M71E09KEC20AVMAJBXZRPXBA":92},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":23,"publishedAt":43,"linkOnly":44,"markdownContent":45,"markdownBody":46,"frontMatter":47,"refName":49,"commitSha":50,"skillDirectory":51,"forksCount":52,"repositoryHtmlUrl":53,"repositoryHomepageUrl":6,"ownerHtmlUrl":54,"ownerBlogUrl":55,"ownerDescription":56,"updatedAt":57,"install":58,"resources":71},"01M71E09KEC20AVMAJBXZRPXBA","outpost-host",null,"Host an app on this HQ Outpost\u002FEC2 VM behind nginx and return its public URL. Refuses to run elsewhere. For artifacts use \u002Fdeploy.","indigoai-us\u002Fhq-core","indigoai-us","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F122242446?v=4","01M71DTQ5NGD10GT1Z7E6XKWC5","HQ","01M71DTQ6BKSYYBNC9RAKT3YDK",94,"MIT","https:\u002F\u002Fgithub.com\u002Findigoai-us\u002Fhq-core\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Foutpost-host\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000011","运维与部署","SCENARIO","使用场景",[24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42],"host","outpost host","root","deploy","public","grep","read","run","ec2","plugin","artifacts","Bash","URL","nginx","vm","use","project","for","app","2026-11-10 10:12:30",false,"---\nname: outpost-host\ndescription: \"Host an app on this HQ Outpost\u002FEC2 VM behind nginx and return its public URL. Refuses to run elsewhere. For artifacts use \u002Fdeploy.\"\nallowed-tools: Bash, Read, Glob, Grep, Bash(bash \"$CLAUDE_PLUGIN_ROOT\u002Fskills\u002Foutpost-host\u002Fhost-app.sh:*), Bash(bash \"$CLAUDE_PROJECT_DIR\u002F.claude\u002Fskills\u002Foutpost-host\u002Fhost-app.sh:*), AskUserQuestion\n---\n\n# \u002Foutpost-host — serve an app from the Outpost VM\n\nStand up a web server **on the cloud VM this session is running on** and serve whatever the user wants — a static site or a running full-stack app — behind nginx, then hand back the public URL.\n\nThis comes from the idea: *let people host apps on the VM the Outpost is running on, and ship an Outpost-specific command that finds a free host and deploys to it.* This skill is that command, scoped to the current box.\n\n## Hard constraint: Outposts \u002F EC2 only\n\nThis skill installs system packages, edits `\u002Fetc\u002Fnginx`, opens ports, and exposes an app to the internet. That is only safe on a disposable, already-public cloud VM — an **HQ Outpost** or a plain **EC2 instance**. It must never do this on an operator's laptop or any non-cloud host.\n\n**Step 1, always, before anything else:** run the environment guard.\n\n```bash\nif [[ -n \"${CLAUDE_PLUGIN_ROOT:-}\" ]]; then\n  bash \"$CLAUDE_PLUGIN_ROOT\u002Fskills\u002Foutpost-host\u002Fhost-app.sh\" check\nelse\n  bash \"$CLAUDE_PROJECT_DIR\u002F.claude\u002Fskills\u002Foutpost-host\u002Fhost-app.sh\" check\nfi\n```\n\n- Exit `0` → you are on an Outpost\u002FEC2 box; continue.\n- Exit `1` → **stop.** Print the guard's message to the user verbatim (it explains this skill only runs on an Outpost\u002FEC2 and points them to `\u002Fdeploy` and `\u002Fhq-share`). Do not install anything, do not retry, do not work around it.\n\nThe guard detects the environment offline (HQ Outpost `outpost-*` systemd units; EC2 DMI markers `sys_vendor=Amazon EC2` \u002F `board_asset_tag=i-…`; Xen hypervisor uuid) and falls back to IMDSv2. It does not depend on the network being up.\n\n## What you can serve\n\nAsk the user which mode fits (use `AskUserQuestion` if unclear):\n\n1. **Static** — a directory of files (built site, plain HTML\u002FCSS\u002FJS, exported app). nginx serves it directly.\n2. **Proxy** — an app already running (or that you will start) on a local port (Next.js, an API, a Flask\u002FExpress server). nginx reverse-proxies to it, including WebSocket upgrade headers.\n\nFor a full-stack app, the usual flow is: start the app bound to `127.0.0.1:\u003CappPort>` (e.g. via its own `npm start`\u002Fprocess manager), then use **proxy** mode pointed at that port. Keep the app process alive yourself (e.g. a systemd unit or `nohup`\u002F`pm2`); nginx only fronts it.\n\n## Process\n\n### 1. Gate\n\nRun `host-app.sh check`. On failure, relay the message and stop (see above).\n\n### 2. Gather inputs\n\n- `name` — a short slug for the app (`[a-z0-9-]`), used for the nginx site filename and `list`\u002F`remove`.\n- `mode` — `static` or `proxy`.\n- For static: the `root` directory to serve.\n- For proxy: the running app's `host:port` (usually `127.0.0.1:\u003Cport>`).\n- Optional explicit public `--port`; otherwise a free port is chosen automatically.\n\n### 3. Find a free host slot\n\n```bash\nhost-app.sh free-port           # first free port in 8080-8099\n```\n\nThe deploy step does this automatically when `--port` is omitted. Use port `80` only if the user explicitly wants the bare `http:\u002F\u002F\u003Chost>` URL and nothing else is on 80.\n\n### 4. Deploy\n\nThis installs nginx if missing, writes `\u002Fetc\u002Fnginx\u002Fconf.d\u002Foutpost-\u003Cname>.conf`, validates with `nginx -t` (auto-reverting on failure), and reloads nginx.\n\n```bash\n# static site\nhost-app.sh deploy --name myapp --mode static --root \u002Fpath\u002Fto\u002Fsite\n\n# reverse-proxy to a running app on port 3000\nhost-app.sh deploy --name myapp --mode proxy --upstream 127.0.0.1:3000\n```\n\nOn success it prints `URL=…`. Surface that URL to the user in one plain line.\n\n### 5. Open the firewall (tell the user)\n\nnginx now listens on the chosen port, but the instance's **security group** must allow inbound TCP on that port for the URL to be reachable from outside. The skill cannot change AWS security groups safely on its own — tell the user which port to open (or use port 80 if their SG already allows it).\n\n### 6. Manage \u002F clean up\n\n```bash\nhost-app.sh list                # what this skill is currently serving\nhost-app.sh remove --name myapp # tear down one app's nginx site and reload\n```\n\n## Safety notes (full prose — this exposes things publicly)\n\n- **Exposing an app publicly is an outward-facing action.** Before deploying, confirm with the user that the app is meant to be public and contains nothing sensitive. An app on the Outpost can reach the box's local services and credentials, so only proxy apps you trust.\n- The skill writes only to `\u002Fetc\u002Fnginx\u002Fconf.d\u002Foutpost-*.conf` and never edits the operator's other nginx config. `remove` deletes only the file it created.\n- nginx config is always validated with `nginx -t` before reload; a bad config is reverted rather than left in place.\n- Keep the upstream app process supervised yourself — nginx fronts it but does not start or restart it.\n\n## Files\n\n- `guard.sh` — environment gate (Outpost\u002FEC2 detection; injectable inputs for testing).\n- `host-app.sh` — install nginx, find a free port, deploy\u002Flist\u002Fremove sites, resolve the public URL.\n- `test-guard.sh` — verifies the guard passes on an outpost-like env and refuses on a non-outpost env.\n","# \u002Foutpost-host — serve an app from the Outpost VM\n\nStand up a web server **on the cloud VM this session is running on** and serve whatever the user wants — a static site or a running full-stack app — behind nginx, then hand back the public URL.\n\nThis comes from the idea: *let people host apps on the VM the Outpost is running on, and ship an Outpost-specific command that finds a free host and deploys to it.* This skill is that command, scoped to the current box.\n\n## Hard constraint: Outposts \u002F EC2 only\n\nThis skill installs system packages, edits `\u002Fetc\u002Fnginx`, opens ports, and exposes an app to the internet. That is only safe on a disposable, already-public cloud VM — an **HQ Outpost** or a plain **EC2 instance**. It must never do this on an operator's laptop or any non-cloud host.\n\n**Step 1, always, before anything else:** run the environment guard.\n\n```bash\nif [[ -n \"${CLAUDE_PLUGIN_ROOT:-}\" ]]; then\n  bash \"$CLAUDE_PLUGIN_ROOT\u002Fskills\u002Foutpost-host\u002Fhost-app.sh\" check\nelse\n  bash \"$CLAUDE_PROJECT_DIR\u002F.claude\u002Fskills\u002Foutpost-host\u002Fhost-app.sh\" check\nfi\n```\n\n- Exit `0` → you are on an Outpost\u002FEC2 box; continue.\n- Exit `1` → **stop.** Print the guard's message to the user verbatim (it explains this skill only runs on an Outpost\u002FEC2 and points them to `\u002Fdeploy` and `\u002Fhq-share`). Do not install anything, do not retry, do not work around it.\n\nThe guard detects the environment offline (HQ Outpost `outpost-*` systemd units; EC2 DMI markers `sys_vendor=Amazon EC2` \u002F `board_asset_tag=i-…`; Xen hypervisor uuid) and falls back to IMDSv2. It does not depend on the network being up.\n\n## What you can serve\n\nAsk the user which mode fits (use `AskUserQuestion` if unclear):\n\n1. **Static** — a directory of files (built site, plain HTML\u002FCSS\u002FJS, exported app). nginx serves it directly.\n2. **Proxy** — an app already running (or that you will start) on a local port (Next.js, an API, a Flask\u002FExpress server). nginx reverse-proxies to it, including WebSocket upgrade headers.\n\nFor a full-stack app, the usual flow is: start the app bound to `127.0.0.1:\u003CappPort>` (e.g. via its own `npm start`\u002Fprocess manager), then use **proxy** mode pointed at that port. Keep the app process alive yourself (e.g. a systemd unit or `nohup`\u002F`pm2`); nginx only fronts it.\n\n## Process\n\n### 1. Gate\n\nRun `host-app.sh check`. On failure, relay the message and stop (see above).\n\n### 2. Gather inputs\n\n- `name` — a short slug for the app (`[a-z0-9-]`), used for the nginx site filename and `list`\u002F`remove`.\n- `mode` — `static` or `proxy`.\n- For static: the `root` directory to serve.\n- For proxy: the running app's `host:port` (usually `127.0.0.1:\u003Cport>`).\n- Optional explicit public `--port`; otherwise a free port is chosen automatically.\n\n### 3. Find a free host slot\n\n```bash\nhost-app.sh free-port           # first free port in 8080-8099\n```\n\nThe deploy step does this automatically when `--port` is omitted. Use port `80` only if the user explicitly wants the bare `http:\u002F\u002F\u003Chost>` URL and nothing else is on 80.\n\n### 4. Deploy\n\nThis installs nginx if missing, writes `\u002Fetc\u002Fnginx\u002Fconf.d\u002Foutpost-\u003Cname>.conf`, validates with `nginx -t` (auto-reverting on failure), and reloads nginx.\n\n```bash\n# static site\nhost-app.sh deploy --name myapp --mode static --root \u002Fpath\u002Fto\u002Fsite\n\n# reverse-proxy to a running app on port 3000\nhost-app.sh deploy --name myapp --mode proxy --upstream 127.0.0.1:3000\n```\n\nOn success it prints `URL=…`. Surface that URL to the user in one plain line.\n\n### 5. Open the firewall (tell the user)\n\nnginx now listens on the chosen port, but the instance's **security group** must allow inbound TCP on that port for the URL to be reachable from outside. The skill cannot change AWS security groups safely on its own — tell the user which port to open (or use port 80 if their SG already allows it).\n\n### 6. Manage \u002F clean up\n\n```bash\nhost-app.sh list                # what this skill is currently serving\nhost-app.sh remove --name myapp # tear down one app's nginx site and reload\n```\n\n## Safety notes (full prose — this exposes things publicly)\n\n- **Exposing an app publicly is an outward-facing action.** Before deploying, confirm with the user that the app is meant to be public and contains nothing sensitive. An app on the Outpost can reach the box's local services and credentials, so only proxy apps you trust.\n- The skill writes only to `\u002Fetc\u002Fnginx\u002Fconf.d\u002Foutpost-*.conf` and never edits the operator's other nginx config. `remove` deletes only the file it created.\n- nginx config is always validated with `nginx -t` before reload; a bad config is reverted rather than left in place.\n- Keep the upstream app process supervised yourself — nginx fronts it but does not start or restart it.\n\n## Files\n\n- `guard.sh` — environment gate (Outpost\u002FEC2 detection; injectable inputs for testing).\n- `host-app.sh` — install nginx, find a free port, deploy\u002Flist\u002Fremove sites, resolve the public URL.\n- `test-guard.sh` — verifies the guard passes on an outpost-like env and refuses on a non-outpost env.\n",{"name":5,"description":7,"allowed-tools":48},"Bash, Read, Glob, Grep, Bash(bash \"$CLAUDE_PLUGIN_ROOT\u002Fskills\u002Foutpost-host\u002Fhost-app.sh:*), Bash(bash \"$CLAUDE_PROJECT_DIR\u002F.claude\u002Fskills\u002Foutpost-host\u002Fhost-app.sh:*), AskUserQuestion","main","205cf61728a27ef15e9153aa38df5856fc8d82f5",".claude\u002Fskills\u002Foutpost-host",18,"https:\u002F\u002Fgithub.com\u002Findigoai-us\u002Fhq-core","https:\u002F\u002Fgithub.com\u002Findigoai-us","https:\u002F\u002Fhqforwork.com\u002F","The AI Context Layer for Teams","2026-11-09 23:36:37",{"source":8,"skillName":5,"commands":59,"prompt":69,"zipAvailable":70},[60,63,66],{"tool":61,"command":62},"npx","npx skills add indigoai-us\u002Fhq-core --skill outpost-host",{"tool":64,"command":65},"bunx","bunx skills add indigoai-us\u002Fhq-core --skill outpost-host",{"tool":67,"command":68},"pnpm","pnpm dlx skills add indigoai-us\u002Fhq-core --skill outpost-host","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Findigoai-us\u002Fhq-core\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Foutpost-host\u002FSKILL.md",true,[72,78,84,88],{"path":73,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":76,"sourceHtmlUrl":77},"agents\u002Fopenai.yaml","REFERENCE","参考文档",140,"https:\u002F\u002Fgithub.com\u002Findigoai-us\u002Fhq-core\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Foutpost-host\u002Fagents\u002Fopenai.yaml",{"path":79,"resourceType":80,"resourceTypeDesc":81,"sizeBytes":82,"sourceHtmlUrl":83},"guard.sh","SCRIPT","脚本",3644,"https:\u002F\u002Fgithub.com\u002Findigoai-us\u002Fhq-core\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Foutpost-host\u002Fguard.sh",{"path":85,"resourceType":80,"resourceTypeDesc":81,"sizeBytes":86,"sourceHtmlUrl":87},"host-app.sh",10919,"https:\u002F\u002Fgithub.com\u002Findigoai-us\u002Fhq-core\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Foutpost-host\u002Fhost-app.sh",{"path":89,"resourceType":80,"resourceTypeDesc":81,"sizeBytes":90,"sourceHtmlUrl":91},"test-guard.sh",3111,"https:\u002F\u002Fgithub.com\u002Findigoai-us\u002Fhq-core\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Foutpost-host\u002Ftest-guard.sh",[93,112,139,163,174,183],{"skillNo":94,"name":95,"nameZh":6,"description":96,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":97,"categories":98,"keywords":99,"publishedAt":43},"01M71E4MQ04WPK1EVDS7VKJ3E8","social-graphic","Generate 1080x1080 HTML social graphics for HQ update posts.","https:\u002F\u002Fgithub.com\u002Findigoai-us\u002Fhq-core\u002Fblob\u002Fmain\u002Fcore\u002Fworkers\u002Fpublic\u002Fsocial-strategist\u002Fskills\u002Fsocial-graphic\u002FSKILL.md",[],[100,101,35,102,103,104,30,105,106,107,108,109,110,41,111],"social","social graphic","html","edit","write","update","generate","graphics","browser","open","agent-browser","posts",{"skillNo":113,"name":110,"nameZh":6,"description":114,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":115,"categories":116,"keywords":123,"publishedAt":43},"01M71E4H33K4P5H5M7ENPTMFSC","Browser automation CLI for AI agents. Use when the user needs to interact with websites, including navigating pages, filling forms, clicking buttons, taking screenshots, extracting data, testing web apps, or automating any browser task. Triggers include requests to \"open a website\", \"fill out a form\", \"click a button\", \"take a screenshot\", \"scrape data from a page\", \"test this web app\", \"login to a site\", \"automate browser actions\", or any task requiring programmatic web interaction.","https:\u002F\u002Fgithub.com\u002Findigoai-us\u002Fhq-core\u002Fblob\u002Fmain\u002Fcore\u002Fworkers\u002Fpublic\u002Fqa-tester\u002Fskills\u002Fagent-browser\u002FSKILL.md",[117,120],{"categoryNo":118,"categoryName":119,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000008","测试与质量",{"categoryNo":121,"categoryName":122,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",[124,108,125,126,42,127,35,128,129,130,131,132,109,133,110,134,135,136,137,138],"agent browser","click","ai agents","scrape","when","apps","actions","extracting","take a screenshot","testing","programmatic","browser automation","website","cli","interaction",{"skillNo":140,"name":141,"nameZh":6,"description":142,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":143,"categories":144,"keywords":145,"publishedAt":43},"01M71E4FDBD7J8Y45JJ9KMMYGN","work-mesh","Work Mesh Live — automatic presence via hq mesh daemon; context reconcile\u002Forganize; manual session task-status, blocked, and note only.","https:\u002F\u002Fgithub.com\u002Findigoai-us\u002Fhq-core\u002Fblob\u002Fmain\u002Fcore\u002Fskills\u002Fwork-mesh\u002FSKILL.md",[],[146,147,148,35,149,150,151,152,153,154,155,156,157,158,30,159,160,161,162],"work mesh","work","mesh","status","context","note","live","presence","automatic","reconcile","only","organize","task","session","manual","daemon","via",{"skillNo":164,"name":165,"nameZh":6,"description":166,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":167,"categories":168,"keywords":169,"publishedAt":43},"01M71E4EGHNAAGWAPV6KGBMQ9W","review","Parity worker review skill (materialization fixture).","https:\u002F\u002Fgithub.com\u002Findigoai-us\u002Fhq-core\u002Fblob\u002Fmain\u002Fcore\u002Fscripts\u002Ftests\u002Ffixtures\u002Fagent-session\u002Fworker-materialization\u002Fparity-worker\u002Fskills\u002Freview\u002FSKILL.md",[],[165,170,171,172,173],"review skill","fixture","parity","worker",{"skillNo":175,"name":31,"nameZh":6,"description":176,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":177,"categories":178,"keywords":179,"publishedAt":43},"01M71E4D1FZDJPDC15DRERKX8Y","Run or list HQ workers (parity fixture).","https:\u002F\u002Fgithub.com\u002Findigoai-us\u002Fhq-core\u002Fblob\u002Fmain\u002Fcore\u002Fscripts\u002Ftests\u002Ffixtures\u002Fagent-session\u002Fskills\u002Frun\u002FSKILL.md",[],[31,180,181,172,182,171],"parity fixture","workers","list",{"skillNo":184,"name":185,"nameZh":6,"description":186,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":187,"categories":188,"keywords":189,"publishedAt":43},"01M71E4BF4MV5SEWZJZ4T1QPQW","handoff","Preserve session state for a follow-up agent (parity fixture).","https:\u002F\u002Fgithub.com\u002Findigoai-us\u002Fhq-core\u002Fblob\u002Fmain\u002Fcore\u002Fscripts\u002Ftests\u002Ffixtures\u002Fagent-session\u002Fskills\u002Fhandoff\u002FSKILL.md",[],[185,180,190,191,159,192,41,172,193,194,171],"up","preserve","session state","follow-up","state"]