GreptimeDB Dev Docker Image
GreptimeTeam/greptimedb
Packages a locally built GreptimeDB debug binary into a development-only Docker image for local-cluster testing, with an optional push to a dev registry.
Deploy or run the ScienceDiscovery stack, either as host processes (scripts/start-stack.sh) or with Docker Compose.
$ npx skills add openJiuwen-ai/sciencediscovery --skill deploy -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install openJiuwen-ai/sciencediscovery deploy --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/openJiuwen-ai/sciencediscovery.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/deploy .claude/skills/deploy && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "deploy" agent skill from https://github.com/openJiuwen-ai/sciencediscovery/tree/main/.agents/skills/deploy into .claude/skills/deploy/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "deploy", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/openJiuwen-ai/sciencediscovery/tree/main/.agents/skills/deployType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add openJiuwen-ai/sciencediscovery --skill deploy -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install openJiuwen-ai/sciencediscovery deploy --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/openJiuwen-ai/sciencediscovery.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.agents/skills/deploy .agents/skills/deploy && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "deploy" agent skill from https://github.com/openJiuwen-ai/sciencediscovery/tree/main/.agents/skills/deploy into .agents/skills/deploy/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "deploy", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add openJiuwen-ai/sciencediscovery --skill deploy -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install openJiuwen-ai/sciencediscovery deploy --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/openJiuwen-ai/sciencediscovery.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.agents/skills/deploy .cursor/skills/deploy && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "deploy" agent skill from https://github.com/openJiuwen-ai/sciencediscovery/tree/main/.agents/skills/deploy into .cursor/skills/deploy/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "deploy", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/openJiuwen-ai/sciencediscovery.git --path .agents/skills/deploy--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add openJiuwen-ai/sciencediscovery --skill deploy -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install openJiuwen-ai/sciencediscovery deploy --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/openJiuwen-ai/sciencediscovery.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.agents/skills/deploy .gemini/skills/deploy && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "deploy" agent skill from https://github.com/openJiuwen-ai/sciencediscovery/tree/main/.agents/skills/deploy into .gemini/skills/deploy/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "deploy", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install openJiuwen-ai/sciencediscovery deployInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add openJiuwen-ai/sciencediscovery --skill deploy -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/openJiuwen-ai/sciencediscovery.git skills-src && mkdir -p .github/skills && cp -r skills-src/.agents/skills/deploy .github/skills/deploy && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "deploy" agent skill from https://github.com/openJiuwen-ai/sciencediscovery/tree/main/.agents/skills/deploy into .github/skills/deploy/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "deploy", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add openJiuwen-ai/sciencediscovery --skill deploy -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install openJiuwen-ai/sciencediscovery deploy --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/openJiuwen-ai/sciencediscovery.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.agents/skills/deploy .opencode/skills/deploy && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "deploy" agent skill from https://github.com/openJiuwen-ai/sciencediscovery/tree/main/.agents/skills/deploy into .opencode/skills/deploy/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "deploy", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
deployDeploy or run the ScienceDiscovery stack, either as host processes (scripts/start-stack.sh) or with Docker Compose.
Deploy is an agent skill from openJiuwen-ai/sciencediscovery. Deploy or run the ScienceDiscovery stack, either as host processes (scripts/start-stack.sh) or with Docker Compose. Use when the user asks to deploy, start, run, or containerize ScienceDiscovery, or asks for the UI URL, SSH port forwarding, or start/stop/restart/log commands.
Its SKILL.md is about 5k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in DevOps & Cloud, covering Containers and Deployment. It works with Docker. The repository describes itself as: ScienceDiscovery is an all‑in‑one agentic workbench built specifically for scientific research. The licence is Apache-2.0.
4 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 9189206. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
dockerpnpmcurlsshnodepython3uvnpmshFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use docker, pnpm, curl, ssh, uv and npm, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names these keys or tokens, usually read from environment variables:
SCIENCE_AGENT_AUTH_TOKENFrom names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Deploy loads about 5k tokens when it runs. Until then it costs about 71 tokens; SKILL.md has 2,289 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check noted patterns worth knowing about, such as sudo or a known installer.
6. Repository-local writes are fine (`.env`, `.sciencediscovery-data/`),suggest user-level installs that need no sudo and touchask for `sudo sysctl -w ...=0`. That restriction is configured per AppArmorconfirmed cause, quote `sudo sysctl -w`SCIENCE_AGENT_RUNNER_URL` in `.env` — it does not follow `*_PORT``SCIENCE_AGENT_PYPI_INDEX` in `.env` (e.g. the Huawei Cloud mirrors; see thecp .env.example .env # first time only; never overwrite an existing .envcp .env.docker.example .env # or merge its keys into an existing .envfrom the user's `.env` or that file — do not print a token into a sharedtype. Compose forwards only the keys of `.env.docker.example` |Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from openJiuwen-ai/sciencediscovery at commit 9189206, republished under its Apache-2.0 licence (© openJiuwen-ai). 2,289 words, ~4,984 tokens.
.claude/skills/deploy/SKILL.md (or your agent's skills folder).Project-local skill for ScienceDiscovery. Authoritative facts live in
README.md → Quick start, in
docs/zh/getting-started/deployment.md (Chinese) → local
mode and Docker deployment, and in docs/zh/reference/configuration.md → variable tables. Read the matching section before
improvising; never invent ports, tokens, flags, or paths.
You assist the user through a deployment. You do not silently reconfigure their machine.
sudo on the user's behalf unless they explicitly ask for that
specific command in this conversation.apt/dnf/brew/npm -g, persistent
sysctl, systemd units, editing files outside the repository). List the gap
and the command you suggest the user run themselves. After written consent
you may assist, still preferring project-local installs
(uv/pnpm/corepack) over system-wide ones..env, .sciencediscovery-data/),
but say what you are writing before you write it.Docker Compose, or host processes?
| Docker Compose | Host processes | |
|---|---|---|
| Host needs | Docker Engine 24+ and Compose v2 only | Node 22.19+, pnpm, Python 3, uv, bubblewrap |
| Entry point | docker compose up -d → scripts/start-stack.sh --mode docker | ./scripts/start-stack.sh --mode local |
| Runs | Detached, restarts on failure | Foreground terminal (Ctrl-C stops it) |
| State | Host bind mount ./data (no named volume) | ./data (SCIENCE_AGENT_DATA_DIR) |
| Published on | 127.0.0.1:4310 by default | 0.0.0.0:4310 by default |
Both need Linux x86_64 or aarch64 with unprivileged user namespaces — the bubblewrap sandbox is not optional and Docker Desktop on macOS/Windows is unsupported.
Run from the repository root. Report each check as pass/fail with the value seen.
Common
uname -s -m # expect: Linux x86_64 or aarch64
ss -ltn | grep -E ':(4310|4311)' || echo "ports free"Sandbox availability is decided by running the product's probe, never by reading a sysctl. Use the probe below for host-process mode, and the in-container probe under Docker mode for Compose. A sysctl value is a diagnostic to reach for after a probe fails — see Step 3.
Host-process mode (mirrors README.md → Quick start → Requirements)
node --version # v22.19+
pnpm --version # 11.1.2
python3 --version
uv --version # 0.9+
bwrap --version # 0.6+; 0.8+ recommended (adds --disable-userns where the environment allows it; otherwise the runner logs a startup warning and omits it)
curl --version | head -1Sandbox preflight — the same probe scripts/start-stack.sh and
packages/sandbox-capability run, harmless and read-only:
bwrap --unshare-all --unshare-user --die-with-parent \
--ro-bind /usr /usr --symlink usr/bin /bin --symlink usr/lib /lib \
--symlink usr/lib64 /lib64 --proc /proc /usr/bin/true && echo "sandbox ok"Docker mode
docker version --format '{{.Server.Version}}' # 24+
docker compose version # v2.x
docker info >/dev/null && echo "daemon reachable"
id -u; id -g # → SCIENCE_AGENT_UID / _GIDThe container's sandbox can only be probed once the image exists, and the entry
point already probes it at startup: a failure is printed to
docker compose logs. To confirm it positively after up -d:
docker compose exec sciencediscovery sh -c '
bwrap --unshare-all --unshare-user --die-with-parent \
--ro-bind /usr /usr --symlink usr/bin /bin --symlink usr/lib /lib \
--symlink usr/lib64 /lib64 --proc /proc /usr/bin/true' && echo "sandbox ok"Keep the outer sh -c. With bwrap as the exec session's first process the
loopback setup fails for reasons unrelated to sandbox capability, which reads
as a false negative.
Present a short table: check / expected / actual / suggested fix. Suggested fixes are for the user to run, quoted as such:
$HOME: Node 22 tarball extracted to ~/opt/node22 (add its
bin to PATH), corepack enable --install-directory ~/.local/bin && corepack prepare $(node -p "require('./package.json').packageManager") --activate for
the pinned pnpm, and the official uv installer script (installs to
~/.local/bin). Missing bubblewrap has no user-level path — it is a distro
package the user must install.kernel.apparmor_restrict_unprivileged_userns, do not report it, and never
ask for sudo sysctl -w ...=0. That restriction is configured per AppArmor
profile, so the value is routinely 1 on Ubuntu 24.04+ hosts where the probe
passes; quoting a root command there is wrong advice.security_opt (Docker mode needs seccomp, apparmor and
systempaths all unconfined); then the host AppArmor configuration, where
/etc/apparmor.d/ can grant userns create per program; and only then
sysctl kernel.unprivileged_userns_clone and
sysctl kernel.apparmor_restrict_unprivileged_userns. If the last one is the
confirmed cause, quote sudo sysctl -w kernel.apparmor_restrict_unprivileged_userns=0, say it needs root and does
not persist, and stop for the user's decision.SCIENCE_AGENT_PORT (host mode) or
SCIENCE_AGENT_PUBLISH_PORT (Docker) instead of killing the other process.
When moving the runner port, also update the explicit
SCIENCE_AGENT_RUNNER_URL in .env — it does not follow *_PORT
automatically.SCIENCE_AGENT_NPM_REGISTRY /
SCIENCE_AGENT_PYPI_INDEX in .env (e.g. the Huawei Cloud mirrors; see the
variable table in docs/zh/reference/configuration.md). Both are scoped to
start-stack.sh's install commands and never touch user or global
npm/uv config.If the sandbox probe keeps failing, the API and UI still start and /health
still reports the runner, but every run_python / run_shell fails. Say this
plainly and let the user choose whether to continue.
cp .env.example .env # first time only; never overwrite an existing .env
./scripts/start-stack.sh --mode local # install + build + start
./scripts/start-stack.sh --mode local --no-build # start only, after a previous buildnohup ./scripts/start-stack.sh --mode local &, tmux, a
supervisor) changes how it must be stopped — see Stopping a backgrounded
host stack below. Ctrl-C no longer applies..sciencediscovery-data/envs/gateway and .sciencediscovery-data/envs/paper through uv
and needs outbound network../scripts/run-local.sh [--no-build] is the compatibility wrapper; pnpm start
and pnpm server go through it.sudo. For unattended operation, hand the user a
supervisor option (tmux, or a systemd user unit) — do not install one.cp .env.docker.example .env # or merge its keys into an existing .env
# set SCIENCE_AGENT_UID / SCIENCE_AGENT_GID to `id -u` / `id -g` when they are not 1000
mkdir -p data # before `up`: Docker creates a missing bind-mount source as root
docker compose build # first build is long and needs network
docker compose up -d
curl -fsS http://127.0.0.1:4310/health./data is bind-mounted to /app/data and is the only persisted location; it
survives docker compose down and rebuilds.
A uid/gid mismatch is the most common first-run failure: the entry point exits
with an explicit "not writable" message. Fix it via SCIENCE_AGENT_UID /
SCIENCE_AGENT_GID and recreate the container. The same message appears when
the data directory did not exist at up time: Docker then created it as
root, so remove it and mkdir -p it as the user first.
The sign-in URL in docker compose logs always names the container port
SCIENCE_AGENT_PUBLISH_PORT differs, tell the user to substitute
the published port before opening it.The first start seeds micromamba into ./data/scientific-envs/bin/ and then
creates the starter Python environment in the background (conda-forge, about
2 GB into ./data). The UI works meanwhile; runner.scientificEnvs.startersReady
in /health turns true when it is done. SCIENTIFIC_ENVS=0 skips it.
Several instances on one host: give each its own Compose project name, port
and data directory. The service sets no container_name, so the project name
alone separates container and network names.
mkdir -p data-b
COMPOSE_PROJECT_NAME=sciencediscovery-b SCIENCE_AGENT_PUBLISH_PORT=4320 \
SCIENCE_AGENT_DATA_HOST_DIR=./data-b docker compose up -dEvery later ps / logs / down needs the same project name, or it acts on
the other instance. Add SCIENCE_AGENT_IMAGE when the instances are built
from different checkouts.
The service already sets seccomp=unconfined, apparmor=unconfined and
systempaths=unconfined for bubblewrap. Do not add capabilities or
privileged: true. Dropping systempaths=unconfined still works, but the
runner then falls back to binding the container's /proc and warns at
startup: sandboxed code sees the container's process list.
SCIENCE_AGENT_AUTH_TOKEN. There is no shipped default: when
the variable is unset, the stack generates a token on its first start, prints
it at startup, and stores it in <data dir>/secrets/auth-token. Read the value
from the user's .env or that file — do not print a token into a shared
channel.http://<machine-ip>:4310
also works. Docker publishes on 127.0.0.1 unless SCIENCE_AGENT_PUBLISH_HOST
is changed, and the Open to sign in URL in its log always says port 4310 —
report the published port instead when it differs. Auth is one bearer token with no TLS: recommend loopback plus SSH
forwarding over exposing the port, and tell the user to change the token first
if they do expose it.docs/zh/reference/runtime-behavior.md → 模型).When the stack runs on a remote development machine, forward the port instead of publishing it. Run from the laptop:
remote_user="alice"; remote_host="science-host.example"
ssh -N -L 4310:127.0.0.1:4310 "${remote_user}@${remote_host}"
local_port=4310; remote_port=4310
ssh -f -N -o ServerAliveInterval=30 \
-L "${local_port}:127.0.0.1:${remote_port}" "${remote_user}@${remote_host}"Then open http://127.0.0.1:<local-port> locally. <remote-port> is the
published port: SCIENCE_AGENT_PORT in host-process mode,
SCIENCE_AGENT_PUBLISH_PORT in Docker mode. Pick a different <local-port> if
4310 is taken locally. Stop the tunnel by closing the session, or by killing the
backgrounded ssh -f process.
Forward only the API port. The runner (4311) is loopback-only by design.
| Action | Host processes | Docker Compose |
|---|---|---|
| Start | ./scripts/start-stack.sh --mode local [--no-build] | docker compose up -d |
| Stop (foreground) | Ctrl-C in that terminal (also stops the runner) | docker compose down (./data survives) |
| Stop (backgrounded) | signal the instance's process group — see below | same |
| Restart | stop as above, then start again | docker compose restart |
| Rebuild + restart | start once without --no-build | docker compose up -d --build |
| Logs | stdout/stderr of the foreground terminal (or the supervisor's log) | docker compose logs -f |
| State | ss -ltn | grep 4310 | docker compose ps (includes the health check) |
| Health | curl -fsS http://127.0.0.1:4310/health | same, against the published host/port |
Component health endpoint in both modes: runner http://127.0.0.1:4311/health
(reachable from inside the container in Docker mode). The API's own /health
echoes the runner status, so it is usually the only one worth checking.
Ctrl-C only reaches a foreground stack. Started with nohup ... &, tmux or
any supervisor, the script sits in its own process group and is reparented to
init, so the terminal's SIGINT never reaches it and its services keep running.
Signalling the script alone is also not enough: start-stack.sh runs the API in
its own foreground and its trap cleanup EXIT INT TERM only fires once that API
exits. kill -TERM <start-stack.sh PID> therefore leaves the API, the runner,
the memory-graph sidecar and the bundled MCP sidecars running and the ports
bound.
Stop the whole process group instead, and identify it from the port this instance published — never from the script name, because a developer host often runs several stacks on different ports at once:
api_port=4310 # this instance's SCIENCE_AGENT_PORT
api_pid=$(ss -ltnp | grep ":${api_port} " | grep -o 'pid=[0-9]*' | head -1 | cut -d= -f2)
pgid=$(ps -o pgid= -p "$api_pid" | tr -d ' ')
pgrep -g "$pgid" -a # review the group before signalling it
kill -TERM -"$pgid"
for _ in $(seq 1 30); do ss -ltn | grep -qE ":(${api_port}|4311|17674)\b" || break; sleep 0.5; done
ss -ltn | grep -E ":(${api_port}|4311|17674)\b" || echo "ports released"
pgrep -g "$pgid" -a || echo "no survivors"List the group with pgrep -g, not ps -g: ps reads a numeric -g argument
as a session id, so it silently prints nothing and the group looks empty.
kill -KILL -"$pgid" only for what survives, and only after the
30-second wait: SIGTERM lets the runner tear its sandboxes down.pkill -f start-stack.sh, pkill -f 'node.*server.js' or
killall node. Those match every stack and every unrelated Node process on
the host; the port-derived process group matches exactly one instance./health must still answer.ss -ltnp prints the PID only for sockets you own; for another user's stack
ask that user rather than widening the match.SCIENCE_AGENT_PORT, SCIENCE_AGENT_RUNNER_PORT and
SCIENCE_AGENT_MEMORY_GRAPH_PORT everywhere above.| Symptom | Cause / next step |
|---|---|
data ... is not writable by uid ... | Docker uid/gid mismatch → set SCIENCE_AGENT_UID / _GID, recreate |
WARNING: bubblewrap cannot create a sandbox in logs | The probe failed → work Step 3's order: security_opt, then host AppArmor profiles, then the sysctl. Never open with the sysctl fix |
.sciencediscovery-data/envs/gateway is missing | Started with --no-build before a build → run once without it (that venv holds the interpreter for the bundled Python MCP servers) |
| API up but every run fails | Usually the sandbox warning above, or no model profile configured |
Port already bound (Bind for 127.0.0.1:4310 failed: port is already allocated in Docker mode) | Change SCIENCE_AGENT_PORT / SCIENCE_AGENT_PUBLISH_PORT; substitute the new port in the sign-in URL |
Sign-in URL from docker compose logs does not open | It names container port 4310; replace it with SCIENCE_AGENT_PUBLISH_PORT |
| Second Docker instance exits with the "not writable" message | Its data directory was created by Docker as root → mkdir -p it as the user before up |
| Model on the host is unreachable from the container | 127.0.0.1 inside the container is the container. Add extra_hosts: ["host.docker.internal:host-gateway"] to the service in a docker-compose.override.yml and use host.docker.internal:<port>, or the host's LAN IP |
| Model calls need a proxy (Docker mode) | System configuration → Network proxies with a custom_url record, or inject HTTPS_PROXY through docker-compose.override.yml and pick the environment proxy type. Compose forwards only the keys of .env.docker.example |
| Web says "Local service access token rejected" | The pasted value is not this instance's token (a model API key, or another data directory's token) → use ./data/secrets/auth-token |
| Ctrl-C did not stop a host stack, ports still bound | It was backgrounded (nohup/tmux/supervisor), so SIGINT never reached it → stop its process group, see Stopping a backgrounded host stack |
| Killed the script but the API/runner survived | start-stack.sh only runs its cleanup trap after its foreground API exits → signal the process group, not the script PID |
does not support --disable-userns warning at runner startup | Expected on bwrap < 0.8 (e.g. Ubuntu 22.04's 0.6): nested-userns hardening is skipped, everything else isolates normally. Upgrade bubblewrap for the stronger profile |
supports --disable-userns but cannot use it here warning at runner startup | Expected under LXC and container runtimes that mount /proc/sys read-only, so bubblewrap cannot write user.max_user_namespaces. The option is omitted and executions run; everything else isolates normally. Do not grant privileged or systempaths=unconfined to silence it |
First docker compose build fails on network | The build resolves pnpm and both uv environments; retry with network available |
sudo, no global install/health, then reported URL + token sourcePolicy: this skill assists; it does not change host configuration on its own. Repository-local writes need a heads-up, host-level changes need the user's explicit go-ahead, and root-level changes are always executed by the user.
© openJiuwen-ai, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in .agents/skills/deploy of openJiuwen-ai/sciencediscovery.
Open the folder on GitHubat commit 9189206
Deploy next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Deploy this skillopenJiuwen-ai/sciencediscovery | 156 | — | ~5k | Automated safety check: Notes | Apache-2.0 | |
| GreptimeDB Dev Docker ImageGreptimeTeam/greptimedb | 6.7k | — | ~4k | Automated safety check: Notes | Apache-2.0 | |
| Senior DevOps Toolkitmaslennikov-ig/claude-code-orchestrator-kit | 260 | 6 repos | ~1.1k | Automated safety check: Notes | Custom licence | |
| LangBot Deployment Guidelangbot-app/LangBot | 18k | — | ~1.2k | Automated safety check: Notes | Apache-2.0 | |
| Reflexo ReleaseMyriad-Dreamin/typst.ts | 1.2k | — | ~1.5k | Automated safety check: Pass | Apache-2.0 | |
| Classical Poem Silk VideoMr-funny/hbg-classical-poem-silk-video | 361 | — | ~1.6k | Automated safety check: Pass | MIT |
GreptimeTeam/greptimedb
Packages a locally built GreptimeDB debug binary into a development-only Docker image for local-cluster testing, with an optional push to a dev registry.
maslennikov-ig/claude-code-orchestrator-kit
Comprehensive DevOps skill for CI/CD, infrastructure automation, containerization, and cloud platforms (AWS, GCP, Azure). Includes pipeline setup…
langbot-app/LangBot
Deploys and configures a LangBot instance with Docker Compose or Kubernetes, covering config.yaml, the Box sandbox runtime, the plugin runtime and the global API key.
Myriad-Dreamin/typst.ts
Guide Reflexo/typst.ts release preparation and operator handoffs.
Mr-funny/hbg-classical-poem-silk-video
Turn Chinese classical poems and ci into coherent vertical Chinese-art videos with poem-driven scene grouping, GPT ImageGen stills, Docker-only Gemini I2V, retained model-generated ambience, Gemini…
arch3rPro/1Panel-Appstore
A skill your agent uses when packaging Docker deployments as 1Panel local app store apps, including GitHub projects, docker-compose.yml files, docker run commands, app metadata, version directories…
openJiuwen-ai/sciencediscovery
A skill your agent uses when you need to write and execute Python/R code to process, transform, and analyze data, delivering reproducible computational results with complete code-level methodology…
openJiuwen-ai/sciencediscovery
Operate GitCode issues, PRs, wikis, code/MR refs, and cached org templates.
openJiuwen-ai/sciencediscovery
Inspect a local PDB structure, summarize chains and residue composition, and identify protein atoms near a user-specified ligand or pocket center.
openJiuwen-ai/sciencediscovery
Prepare, launch, monitor, and summarize the real RFdiffusion to ProteinMPNN to Protenix antibody pipeline on a local or remote ScienceDiscovery Runner with sandboxed Ascend NPUs.
openJiuwen-ai/sciencediscovery
A skill your agent uses to orchestrate a multi-domain research team for literature/evidence research and data analysis.
openJiuwen-ai/sciencediscovery
A skill your agent uses when a research workflow needs verified academic source retrieval through literature-search MCP interfaces available in the current session before evidence extraction.
Works with
Categories
Deploy or run the ScienceDiscovery stack, either as host processes (scripts/start-stack.sh) or with Docker Compose. Deploy is an agent skill from openJiuwen-ai/sciencediscovery.sh) or with Docker Compose.
Deploy fits situations like: the user asks to deploy; containerize ScienceDiscovery; asks for the UI URL; SSH port forwarding.
Run `npx skills add openJiuwen-ai/sciencediscovery --skill deploy -a claude-code`. Or copy the skill folder (.agents/skills/deploy in openJiuwen-ai/sciencediscovery) into .claude/skills/deploy in your project. Claude Code loads it when a task matches its description.
Run `npx skills add openJiuwen-ai/sciencediscovery --skill deploy -a codex`. Or copy the skill folder (.agents/skills/deploy in openJiuwen-ai/sciencediscovery) into .agents/skills/deploy in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add openJiuwen-ai/sciencediscovery --skill deploy -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/deploy, .gemini/skills/deploy, .github/skills/deploy and .opencode/skills/deploy in your project.
Going by SKILL.md and its folder, Deploy needs the command-line tools its instructions call (docker, pnpm, curl, ssh, node and python3) and credentials named SCIENCE_AGENT_AUTH_TOKEN. Our summary lists: Python 3; Docker; A credential in SCIENCE_AGENT_AUTH_TOKEN.
SKILL.md contains no URLs. Its commands use docker, curl, ssh, uv and npm, which can reach the network depending on how they are called. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found notes only (mentions a .env file; runs commands with sudo), nothing it rates as a warning. It is not a guarantee. Review the folder before installing.
Deploy is published under the Apache-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 5k tokens (SKILL.md is roughly 20k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Deploy: GreptimeDB Dev Docker Image (GreptimeTeam/greptimedb, 6.7k stars), Senior DevOps Toolkit (maslennikov-ig/claude-code-orchestrator-kit, 260 stars), LangBot Deployment Guide (langbot-app/LangBot, 18k stars) and Reflexo Release (Myriad-Dreamin/typst.ts, 1.2k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
openJiuwen-ai (a GitHub organization) maintains it in openJiuwen-ai/sciencediscovery, which has 156 GitHub stars. The repository holds 22 skills in this directory. The repository was last updated on October 9, 2026.
Source: openJiuwen-ai/sciencediscovery on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.