Agent-friendly CLI for the unofficial Skylight API reference.
Project description
Skylight CLI
skylightctl is a JSON-first CLI for the unofficial Skylight API reference. It
is built for agents and scripts: predictable command names, redacted previews,
and dry-run writes by default.
Install
Development use from this repository:
cd cli
uv sync --extra dev
uv run skylightctl --help
User-level install after the first PyPI release:
uv tool install skylightctl
skylightctl --help
Until then, install from GitHub:
uv tool install "skylightctl @ git+https://github.com/JamesHWade/SkylightAPI.git@main#subdirectory=cli"
From a local checkout:
uv tool install /path/to/SkylightAPI/cli
Setup
Interactive login prompts for email and a hidden password:
skylightctl auth login --save
--save writes the Bearer token, refresh token, and device fingerprint to
~/.config/skylightctl/config.json with 0600 permissions. Normal output
redacts secrets. Use --show-secret only when shell exports are needed.
Save a default frame:
skylightctl frames use --first
Check readiness:
skylightctl doctor
skylightctl smoke read
smoke read performs read-only requests and reports status, response shape, and
counts without dumping full account data.
Configuration
Optional environment variables:
SKYLIGHT_BASE_URL=https://app.ourskylight.com
SKYLIGHT_CONFIG=~/.config/skylightctl/config.json
SKYLIGHT_DEVICE_FINGERPRINT=<stable UUID>
SKYLIGHT_REFRESH_TOKEN=<oauth refresh token>
SKYLIGHT_PROFILE=default
SKYLIGHT_TIMEOUT=30
SKYLIGHT_API_VERSION=2026-03-01
Config files are JSON:
{
"default_profile": "default",
"profiles": {
"default": {
"auth_header": "Bearer REDACTED",
"refresh_token": "REDACTED",
"device_fingerprint": "REDACTED",
"frame_id": "REDACTED",
"base_url": "https://app.ourskylight.com",
"api_version": "2026-03-01"
}
}
}
Precedence is CLI option, environment variable, profile config, built-in default.
Agent Usage
Start here:
skylightctl capabilities
skylightctl doctor
skylightctl smoke read
Common reads:
skylightctl frames list
skylightctl chores list --after 2026-05-01 --before 2026-05-10
skylightctl categories list
skylightctl lists list
skylightctl lists get --list-id "$LIST_ID"
skylightctl calendars events --date-min 2026-05-10 --date-max 2026-05-17
skylightctl rewards points
Writes dry-run unless --execute is passed:
skylightctl chores create --summary "Take out trash" --start 2026-05-10
skylightctl chores update --chore-id "$CHORE_ID" --summary "Updated title"
skylightctl chores complete --chore-id "$CHORE_ID"
skylightctl chores skip --chore-id "$CHORE_ID"
skylightctl chores delete --chore-id "$CHORE_ID"
Raw escape hatches:
skylightctl raw get /api/frames/FRAME_ID/categories
skylightctl raw post /api/frames/FRAME_ID/chores --body '{"summary":"Test"}'
skylightctl raw put /api/frames/FRAME_ID/chores/CHORE_ID --body '{"summary":"Test"}'
skylightctl raw patch /api/frames/FRAME_ID/rewards/REWARD_ID --body '{"name":"Test"}'
skylightctl raw delete /api/frames/FRAME_ID/chores/CHORE_ID
--body accepts an inline JSON string or @path/to/file.json to load from disk.
Anything not prefixed with @ is parsed as inline JSON.
Inspection helpers:
skylightctl config show # resolved config with secrets redacted
skylightctl discover routes # probe known routes for 401-vs-404 drift
skylightctl discover routes --path /api/frames/{frameId}/something --probe-frame-id FRAME
The legacy /api/sessions flow is intentionally not implemented because it now
returns an unsupported-version error in live testing. Saved OAuth credentials are
refreshed automatically after a 401 response, retried once, and persisted —
this requires both refresh_token and device_fingerprint to be saved (run
skylightctl auth login --save to populate them). If the refreshed token cannot
be persisted to disk, the request fails loudly rather than silently desyncing
in-memory and on-disk state.
Validation
uv run pytest
uv run ruff check .
uv run ty check
PyPI releases are handled by the tag-triggered workflow in
.github/workflows/publish.yml; see ../docs/release.md.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file skylightctl-0.1.0.tar.gz.
File metadata
- Download URL: skylightctl-0.1.0.tar.gz
- Upload date:
- Size: 34.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.12 {"installer":{"name":"uv","version":"0.11.12","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
93d0df30a6589866f3d3b8a8801ced7d6508626eda5064d973d6c03bdbab3abb
|
|
| MD5 |
aac724141dbf9fde6ae29b08a88443f0
|
|
| BLAKE2b-256 |
5ced15806d3919492017aa51c8c18f3c7d3fdb3caf8eb5b726807c44769d6d95
|
File details
Details for the file skylightctl-0.1.0-py3-none-any.whl.
File metadata
- Download URL: skylightctl-0.1.0-py3-none-any.whl
- Upload date:
- Size: 22.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.12 {"installer":{"name":"uv","version":"0.11.12","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f5ade2451d8b6905d6c0acce82fb48f9f13f7f8a5b93440b72ad7768d64d36eb
|
|
| MD5 |
f00d068a8cdb928fa497c40495a5ee4e
|
|
| BLAKE2b-256 |
d4b2834a534382ac6c61dc0b61f9b897be2a38debdea3524965b16c7838a1949
|