{
  "schema_version": 1,
  "type": "skill",
  "slug": "quick-hit",
  "title": "quick-hit",
  "brief": "One-shot demo setup for the Ciridian HMI: activates the project, deploys to the device, places workcell camera in the LEFT Hydrogen pane and device VNC in the RIGHT, then rotates the camera until text",
  "version": "1.0.0",
  "tags": [],
  "license": "MIT",
  "sample_prompts": [
    {
      "label": "Run quick-hit",
      "prompt": "/quick-hit"
    },
    {
      "label": "Set up Ciridian demo",
      "prompt": "run the quick-hit skill"
    },
    {
      "prompt": "Show ciridian with camera and vnc"
    },
    {
      "prompt": "Reset Ciridian demo workspace"
    }
  ],
  "source_path": "SKILL.md",
  "readme": "---\nname: quick-hit\ndescription: >\n  One-shot demo setup for the Ciridian HMI. Activates the Ciridian project,\n  deploys it to the HMI device, places the workcell camera feed in the LEFT\n  Hydrogen pane, the device VNC in the RIGHT pane, then rotates the camera\n  until the text in the frame is right-side up — verified by screenshot,\n  looping until correct. Use when the user says \"quick-hit\", \"run quick-hit\",\n  \"set up the ciridian demo\", or asks to \"show ciridian with camera + vnc\".\n---\n\n# quick-hit\n\nA scripted demo setup. Run the steps in order. Do **not** parallelize — each step\ndepends on the previous one finishing.\n\n## Step 1 — Activate + deploy Ciridian\n\n```bash\noctolux projects set ciridian\n```\n\n`projects set` auto-deploys to the registered device and prints a deploy ID.\n**Capture the ID** so you can verify the push completed:\n\n```bash\nDEPLOY_ID=$(octolux projects set ciridian 2>&1 | grep -oE '[0-9a-f-]{36}' | head -1)\noctolux deploy log \"$DEPLOY_ID\" | tail -5     # should end with \"deploy complete\"\noctolux projects active                        # should show ciridian\n```\n\nIf `octolux devices list` is empty, register the device first:\n```bash\noctolux devices add --ip 10.0.10.98 --name \"Ciridian HMI\"\n```\n\n### Wait for the screencast to recover\n\nA deploy reloads Chromium, which momentarily kills the screencast. Wait until\nit's back before continuing — otherwise the camera tab will show a frozen or\nblack frame:\n\n```bash\nuntil octolux screencast status 2>&1 | grep -qE \"^OK: Screencast: [0-9]+(\\.[0-9]+)? fps\"; do sleep 3; done\n```\n\nIf the screencast never recovers, hard-reset the device (~30 s):\n\n```bash\noctolux devices reset 10.0.10.98\n```\n\n## Step 2 — Identify the left and right Hydrogen panes\n\nThe workspace root is a horizontal split: `root.first` is the LEFT pane,\n`root.second` is the RIGHT pane. Extract their IDs:\n\n```bash\nLEFT=$(adom-cli hydrogen workspace get | python3 -c 'import sys,json; print(json.load(sys.stdin)[\"root\"][\"first\"][\"id\"])')\nRIGHT=$(adom-cli hydrogen workspace get | python3 -c 'import sys,json; print(json.load(sys.stdin)[\"root\"][\"second\"][\"id\"])')\necho \"left=$LEFT right=$RIGHT\"\n```\n\nIf `root.first` has no `id` (i.e. the layout isn't a horizontal split), call\n`adom-cli hydrogen workspace split --help` and create one before continuing.\n\n## Step 3 — Build the proxy URLs\n\nThe Octolux app runs on port 8830. The webview must use the public proxy URL,\nnot localhost:\n\n```bash\nBASE=$(echo \"$VSCODE_PROXY_URI\" | sed 's/{{port}}/8830/')\nCAMERA_URL=\"${BASE}camera/\"\nVNC_URL=\"${BASE}vnc/\"\n```\n\n## Step 4 — Open the camera in the LEFT pane, VNC in the RIGHT pane\n\n`open-or-refresh` is idempotent — re-running with the same `--name` just\nnavigates the existing tab.\n\n```bash\nadom-cli hydrogen webview open-or-refresh \\\n  --name \"Octolux Camera\" --url \"$CAMERA_URL\" --panel-id \"$LEFT\"\n\nadom-cli hydrogen webview open-or-refresh \\\n  --name \"Octolux VNC\" --url \"$VNC_URL\" --panel-id \"$RIGHT\"\n```\n\nThen bring each tab to the foreground in its pane:\n\n```bash\nadom-cli hydrogen workspace active-tab --name \"Octolux Camera\"\nadom-cli hydrogen workspace active-tab --name \"Octolux VNC\"\n```\n\n> **Note:** if you ever call `webview navigate` after this point, the tab loses\n> foreground in its pane. Re-run `active-tab --name \"Octolux Camera\"` after any\n> navigate.\n\n## Step 5 — Rotate the camera until the text is upright (loop)\n\nThe camera image may need 0°, 90°, 180°, or 270° rotation. Iterate, screenshot,\n**look at the screenshot**, decide if upright, and loop. Do not assume — verify\nwith your eyes each iteration.\n\n### Loop body\n\nFor each candidate angle in `[0, 90, 180, 270]`:\n\n1. Set the rotation:\n   ```bash\n   octolux camera rotate <angle>\n   ```\n2. **Refresh the camera webview** so the tab re-renders the rotated stream\n   (the browser caches frames; the rotation will not appear without this):\n   ```bash\n   sleep 2\n   adom-cli hydrogen webview refresh --name \"Octolux Camera\"\n   sleep 4\n   ```\n3. Screenshot the **LEFT pane only** — judge from the camera content alone:\n   ```bash\n   adom-cli hydrogen screenshot panel --name \"Octolux Camera\" \\\n     --reason \"verify camera rotation\"\n   ```\n   Use `Read` on the path the screenshot command prints. Do **not** use\n   `screenshot workspace` — it includes the right pane and editor chrome that\n   will distract you and dominate the image.\n4. Decide: **is text/labels in the camera frame right-side up?**\n   - **Yes** → stop. Confirm with `octolux camera status` and report the final\n     angle to the user.\n   - **No** → continue to the next angle.\n\nIf you exhaust all four angles and none look right, report what you saw at each\nangle (e.g. \"all four looked rotated unexpectedly — possibly no text in\nframe?\") and ask the user to confirm visually before guessing further.\n\n### Important\n\n- \"Right-side up\" means a human reading the text would not need to tilt their\n  head. Pay attention to letters/numbers, not just object orientation.\n- Only one rotation should be active at a time — `octolux camera rotate`\n  replaces the previous setting.\n- Don't rotate past four candidates. Rotation values outside `0|90|180|270`\n  are rejected.\n- The camera HMI in the frame may itself be displaying a dark-themed UI with\n  little visible text — if so, lean on the workcell context (striped tape,\n  cabling, machinery) for orientation cues.\n\n## Step 6 — Final confirmation\n\n```bash\noctolux camera status               # report final rotation\noctolux projects active             # confirm ciridian still active\n```\n\nTell the user what angle ended up correct and that the camera + VNC are now\nvisible in their workspace.\n\n## Failure modes to watch for\n\n| Symptom | Likely cause | Fix |\n|---|---|---|\n| `octolux projects set` errors with \"no device registered\" | No HMI added | `octolux devices add --ip <ip>` then retry |\n| `octolux deploy push` prints `ERROR: timeout` | CLI client timeout while server kept pushing | Verify with `octolux deploy log <id>` or `ssh root@<ip> 'grep -i title /usr/share/apache2/default-site/htdocs/index.html'` — usually the push actually succeeded |\n| Camera tab shows the same frame across rotations | Iframe video stream cached in browser | `adom-cli hydrogen webview refresh --name \"Octolux Camera\"` after each `octolux camera rotate` (already wired into Step 5) |\n| Webview tab opens but stays blank | Proxy URL wrong (used localhost) | Rebuild URL from `$VSCODE_PROXY_URI` |\n| `octolux screencast status` returns \"undefined fps\" | Screencast service died after Chromium reload | Wait with the `until` loop in Step 1, or `octolux devices reset <ip>` |\n| VNC shows old HMI even after deploy | VNC iframe cached | `adom-cli hydrogen webview refresh --name \"Octolux VNC\"` |\n| Screenshot times out | Sharing not approved | `adom-cli hydrogen sharing request` then retry |\n| `root.first.id` missing in workspace get | Single-pane layout | Split first: `adom-cli hydrogen workspace split --help` |\n| Camera tab loses foreground after `webview navigate` | Navigate doesn't preserve active state | `adom-cli hydrogen workspace active-tab --name \"Octolux Camera\"` |\n",
  "author": {
    "id": "695820315b5f1e4db2fcf602",
    "name": "Kyle Bergstedt",
    "email": "kyle@adom.inc"
  },
  "visibility": {
    "public": true
  },
  "hero": null,
  "discovery_triggers": [],
  "discovery_pitch": null,
  "metadata": {},
  "created_at": "2026-05-28T05:29:35.376Z",
  "updated_at": "2026-05-28T05:29:35.376Z",
  "sub_skills": [],
  "parent_app": null
}