Codex support, and plainer docs
install.sh / install.ps1 synced from the source repo: they now wire the Codex runtime where codex is on PATH, with --no-codex / -NoCodex to opt out. README: say what gets wired and name the Windows flag spellings; drop the stiffer wording in the licence and service sections; add a table of where the binary, the data and the service definition actually live, since ~/.standup is the thing people need to know about for backups and for STANDUP_HOME. Signed-off-by: disqualifier <dev@disqualifier.me>
This commit is contained in:
1 parent
93473dd789
commit
419852e259
3 files changed
+72
-25
No files matched your search
@@ -31,12 +31,21 @@ already set up prints status and changes nothing.
|
|||||||
| --- | --- |
|
| --- | --- |
|
||||||
| `--skill-only` | skill and hooks only; no daemon, no service |
|
| `--skill-only` | skill and hooks only; no daemon, no service |
|
||||||
| `--no-node` | never provision Node; falls back to skill-only if yours is too old |
|
| `--no-node` | never provision Node; falls back to skill-only if yours is too old |
|
||||||
|
| `--no-codex` | don't wire Codex, even if it's installed |
|
||||||
| `--registry <url>` | install from somewhere other than the default registry |
|
| `--registry <url>` | install from somewhere other than the default registry |
|
||||||
| `--yes` | don't prompt |
|
| `--yes` | don't prompt |
|
||||||
|
|
||||||
Node 20 is the floor for single mode. The daemon needs 22.13 or newer, because
|
Node 20 is the floor for single mode. The daemon needs 22.13 or newer, because
|
||||||
it uses `node:sqlite` without a flag.
|
it uses `node:sqlite` without a flag.
|
||||||
|
|
||||||
|
Claude Code gets wired up either way. If `codex` is on your PATH that gets
|
||||||
|
wired too — hooks, the skill, and a marked block in your project's `AGENTS.md`.
|
||||||
|
If it isn't installed, nothing is written for it. `--no-codex` skips it on a
|
||||||
|
box that does have it.
|
||||||
|
|
||||||
|
Windows uses the same flags with PowerShell spelling: `-SkillOnly`, `-NoNode`,
|
||||||
|
`-NoCodex`, `-Registry <url>`, `-Yes`.
|
||||||
|
|
||||||
## Your licence key
|
## Your licence key
|
||||||
|
|
||||||
You'll get a key as one long line with a dot in the middle:
|
You'll get a key as one long line with a dot in the middle:
|
||||||
@@ -45,16 +54,17 @@ You'll get a key as one long line with a dot in the middle:
|
|||||||
eyJob2xkZXIiOiJBY21lIENvcnAiLCJlZGl0aW9uIjoicHJvIi...}.VI7V1ZkucEx_Vn7qxh2ep...
|
eyJob2xkZXIiOiJBY21lIENvcnAiLCJlZGl0aW9uIjoicHJvIi...}.VI7V1ZkucEx_Vn7qxh2ep...
|
||||||
```
|
```
|
||||||
|
|
||||||
Install it either way:
|
Install it via cli:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
standup license install ~/Downloads/acme.key --code YOUR-OPERATOR-CODE
|
standup license install ~/Downloads/acme.key --code YOUR-OPERATOR-CODE
|
||||||
```
|
```
|
||||||
|
|
||||||
Or open **http://127.0.0.1:7335/license** and paste the key into the box.
|
...or by opening **http://127.0.0.1:7335/license** and pasting your key in the
|
||||||
|
box.
|
||||||
|
|
||||||
The key is copied to `~/.standup/license.key` at `0600`. Delete the file you
|
The key will be installed to `~/.standup/license.key`, you do not need to save
|
||||||
were sent afterwards if you like — the install keeps its own copy.
|
your key file after installation.
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
standup license show # check what you're running under
|
standup license show # check what you're running under
|
||||||
@@ -80,11 +90,11 @@ If a key is refused, the error names which problem it is:
|
|||||||
|
|
||||||
## Keeping the daemon alive
|
## Keeping the daemon alive
|
||||||
|
|
||||||
Use `standup service` rather than touching systemd, launchd or Task Scheduler
|
Use `standup service` instead of touching systemd, launchd or Task Scheduler
|
||||||
yourself. One set of commands, three platforms:
|
yourself — same commands on all three:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
standup service install # install and enable at login
|
standup service install # install it, start it at login
|
||||||
standup service start
|
standup service start
|
||||||
standup service status
|
standup service status
|
||||||
standup service restart
|
standup service restart
|
||||||
@@ -92,42 +102,55 @@ standup service stop --code <operator code>
|
|||||||
standup service uninstall --code <operator code>
|
standup service uninstall --code <operator code>
|
||||||
```
|
```
|
||||||
|
|
||||||
Under the hood that's a systemd `--user` unit on Linux, a launchd agent on
|
Behind that it's a systemd `--user` unit on Linux, a launchd agent on macOS and
|
||||||
macOS, and a scheduled task on Windows. `stop` and `uninstall` are
|
a scheduled task on Windows. `stop` and `uninstall` need `--code` because
|
||||||
operator-only, so they want `--code`.
|
they're operator-only.
|
||||||
|
|
||||||
The installer runs `service install` and `start` for you on first run.
|
The installer does `install` and `start` for you on first run, so normally you
|
||||||
|
don't touch any of this.
|
||||||
|
|
||||||
### Linux without a systemd user bus
|
### Linux without a systemd user bus
|
||||||
|
|
||||||
The unit gets written but not enabled, and the installer says so. **On WSL2**,
|
You'll get the unit written but not started, and the installer will say so.
|
||||||
systemd is usually just off:
|
**On WSL2** this is usually just systemd being off:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
# add to /etc/wsl.conf
|
# /etc/wsl.conf
|
||||||
[boot]
|
[boot]
|
||||||
systemd=true
|
systemd=true
|
||||||
```
|
```
|
||||||
|
|
||||||
Then `wsl --shutdown` from Windows and reopen the shell. After that
|
Then `wsl --shutdown` from Windows, reopen your shell, and
|
||||||
`standup service install` works normally.
|
`standup service install` will work.
|
||||||
|
|
||||||
**Containers and minimal boxes** may have no user bus at all. Run the daemon
|
Containers and stripped-down boxes may have no user bus at all. Run the daemon
|
||||||
directly and keep it up however you already supervise things:
|
yourself and supervise it however you already do:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
standup daemon
|
standup daemon
|
||||||
```
|
```
|
||||||
|
|
||||||
### Checking it's up
|
### Is it up?
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
standup status
|
standup status
|
||||||
```
|
```
|
||||||
|
|
||||||
The daemon listens on `127.0.0.1:7335` by default. `standup status` tells you
|
That tells you which mode you're in, who's holding the port, and — if the
|
||||||
which mode you're in, who holds the port, and — if the daemon is refusing
|
daemon is refusing everything — whether a licence is what it's waiting for.
|
||||||
everything — whether a licence is what it wants.
|
The daemon listens on `127.0.0.1:7335` unless you've moved it.
|
||||||
|
|
||||||
|
## Where things live
|
||||||
|
|
||||||
|
| | |
|
||||||
|
| --- | --- |
|
||||||
|
| the `standup` binary | npm's global prefix (`npm config get prefix`) |
|
||||||
|
| all your data | `~/.standup/` — rooms, KB, config, licence |
|
||||||
|
| the service definition | `~/.config/systemd/user/standupd.service`, or `~/Library/LaunchAgents/io.rethinkstudios.standupd.plist`, or a scheduled task named `agent-standups standupd` |
|
||||||
|
|
||||||
|
`~/.standup/` is the whole install as far as your data goes — back that up and
|
||||||
|
you've backed up everything. Set `STANDUP_HOME` to put it somewhere else, and
|
||||||
|
you get a genuinely separate install sharing the same binary.
|
||||||
|
|
||||||
## Uninstall
|
## Uninstall
|
||||||
|
|
||||||
@@ -135,4 +158,4 @@ everything — whether a licence is what it wants.
|
|||||||
standup uninstall --yes --code <operator code>
|
standup uninstall --yes --code <operator code>
|
||||||
```
|
```
|
||||||
|
|
||||||
Add `--purge` to take the data with it.
|
Add `--purge` if you want your data gone with it.
|
||||||
+13
-1
@@ -2,7 +2,7 @@
|
|||||||
#
|
#
|
||||||
# irm https://git.rethinkstudios.io/rethink-software/agent-standups/raw/tag/v0.1.0/install.ps1 | iex
|
# irm https://git.rethinkstudios.io/rethink-software/agent-standups/raw/tag/v0.1.0/install.ps1 | iex
|
||||||
#
|
#
|
||||||
# Flags (when invoked as a file): -SkillOnly -NoNode -Registry <url> -Yes
|
# Flags (when invoked as a file): -SkillOnly -NoNode -NoCodex -Registry <url> -Yes
|
||||||
# Through `irm | iex` the defaults apply; download it to pass flags.
|
# Through `irm | iex` the defaults apply; download it to pass flags.
|
||||||
#
|
#
|
||||||
# Idempotent: on an installed box it prints status and changes nothing.
|
# Idempotent: on an installed box it prints status and changes nothing.
|
||||||
@@ -11,6 +11,7 @@
|
|||||||
param(
|
param(
|
||||||
[switch]$SkillOnly,
|
[switch]$SkillOnly,
|
||||||
[switch]$NoNode,
|
[switch]$NoNode,
|
||||||
|
[switch]$NoCodex,
|
||||||
[string]$Registry = 'https://git.rethinkstudios.io/api/packages/rethink-software/npm/',
|
[string]$Registry = 'https://git.rethinkstudios.io/api/packages/rethink-software/npm/',
|
||||||
[switch]$Yes
|
[switch]$Yes
|
||||||
)
|
)
|
||||||
@@ -83,6 +84,8 @@ Say "winget : $(if (Have winget) { 'present' } else { 'not available' })"
|
|||||||
|
|
||||||
$standupBin = if (Have standup) { (Get-Command standup).Source } else { '' }
|
$standupBin = if (Have standup) { (Get-Command standup).Source } else { '' }
|
||||||
Say "standup : $(if ($standupBin) { $standupBin } else { 'not installed' })"
|
Say "standup : $(if ($standupBin) { $standupBin } else { 'not installed' })"
|
||||||
|
$codexBin = (Get-Command codex -ErrorAction SilentlyContinue).Source
|
||||||
|
Say "codex : $(if ($codexBin) { "$codexBin$(if ($NoCodex) { ' (-NoCodex)' })" } else { 'not installed' })"
|
||||||
$standupHome = if ($env:STANDUP_HOME) { $env:STANDUP_HOME } else { Join-Path $HOME '.standup' }
|
$standupHome = if ($env:STANDUP_HOME) { $env:STANDUP_HOME } else { Join-Path $HOME '.standup' }
|
||||||
Say "config : $(if (Test-Path (Join-Path $standupHome 'config.toml')) { 'exists' } else { 'absent' })"
|
Say "config : $(if (Test-Path (Join-Path $standupHome 'config.toml')) { 'exists' } else { 'absent' })"
|
||||||
|
|
||||||
@@ -240,6 +243,15 @@ if (-not $serviceOnly) {
|
|||||||
& standup install --runtime claude
|
& standup install --runtime claude
|
||||||
if ($LASTEXITCODE -ne 0) { Warn 'runtime install reported a problem; see doctor below' }
|
if ($LASTEXITCODE -ne 0) { Warn 'runtime install reported a problem; see doctor below' }
|
||||||
|
|
||||||
|
# Codex only where its binary exists: `--runtime codex` writes to
|
||||||
|
# $CODEX_HOME/hooks.json, ~/.agents/skills/ and the project's AGENTS.md, and
|
||||||
|
# leaving marked blocks for a tool that is not installed is worse than
|
||||||
|
# skipping. -NoCodex opts out on a box that does have it.
|
||||||
|
if (-not $NoCodex -and $codexBin) {
|
||||||
|
& standup install --runtime codex
|
||||||
|
if ($LASTEXITCODE -ne 0) { Warn 'codex runtime install reported a problem; see doctor below' }
|
||||||
|
}
|
||||||
|
|
||||||
if ($probe -and -not $probe.HasExited) { Stop-Process -Id $probe.Id -Force -ErrorAction SilentlyContinue }
|
if ($probe -and -not $probe.HasExited) { Stop-Process -Id $probe.Id -Force -ErrorAction SilentlyContinue }
|
||||||
Remove-Item -Recurse -Force $probeDir -ErrorAction SilentlyContinue
|
Remove-Item -Recurse -Force $probeDir -ErrorAction SilentlyContinue
|
||||||
}
|
}
|
||||||
|
|||||||
+13
-1
@@ -23,12 +23,14 @@ PKG="agent-standups"
|
|||||||
|
|
||||||
SKILL_ONLY=0
|
SKILL_ONLY=0
|
||||||
NO_NODE=0
|
NO_NODE=0
|
||||||
|
NO_CODEX=0
|
||||||
ASSUME_YES=0
|
ASSUME_YES=0
|
||||||
|
|
||||||
while [ $# -gt 0 ]; do
|
while [ $# -gt 0 ]; do
|
||||||
case "$1" in
|
case "$1" in
|
||||||
--skill-only) SKILL_ONLY=1 ;;
|
--skill-only) SKILL_ONLY=1 ;;
|
||||||
--no-node) NO_NODE=1 ;;
|
--no-node) NO_NODE=1 ;;
|
||||||
|
--no-codex) NO_CODEX=1 ;;
|
||||||
--yes|-y) ASSUME_YES=1 ;;
|
--yes|-y) ASSUME_YES=1 ;;
|
||||||
--registry) shift; REGISTRY="${1:-$REGISTRY}" ;;
|
--registry) shift; REGISTRY="${1:-$REGISTRY}" ;;
|
||||||
--registry=*) REGISTRY="${1#--registry=}" ;;
|
--registry=*) REGISTRY="${1#--registry=}" ;;
|
||||||
@@ -38,6 +40,7 @@ agent-standups installer
|
|||||||
|
|
||||||
--skill-only install the skill and hooks only; no daemon, no service
|
--skill-only install the skill and hooks only; no daemon, no service
|
||||||
--no-node never provision Node; fall back to skill-only if too old
|
--no-node never provision Node; fall back to skill-only if too old
|
||||||
|
--no-codex never wire the Codex runtime, even where codex is installed
|
||||||
--registry <url> npm registry for a standalone install
|
--registry <url> npm registry for a standalone install
|
||||||
--yes no prompts; also sets the provisioned Node as your default
|
--yes no prompts; also sets the provisioned Node as your default
|
||||||
USAGE
|
USAGE
|
||||||
@@ -119,7 +122,9 @@ say " nvm : $([ "$NVM_PRESENT" = 1 ] && echo "present ($NVM_DIR_RESOLVE
|
|||||||
# Existing install.
|
# Existing install.
|
||||||
STANDUP_BIN=""
|
STANDUP_BIN=""
|
||||||
have standup && STANDUP_BIN="$(command -v standup)"
|
have standup && STANDUP_BIN="$(command -v standup)"
|
||||||
|
CODEX_BIN="$(command -v codex 2>/dev/null || true)"
|
||||||
say " standup : ${STANDUP_BIN:-not installed}"
|
say " standup : ${STANDUP_BIN:-not installed}"
|
||||||
|
say " codex : ${CODEX_BIN:-not installed}$([ -n "$CODEX_BIN" ] && [ "$NO_CODEX" = 1 ] && echo ' (--no-codex)')"
|
||||||
say " config : $([ -f "${STANDUP_HOME:-$HOME/.standup}/config.toml" ] && echo exists || echo absent)"
|
say " config : $([ -f "${STANDUP_HOME:-$HOME/.standup}/config.toml" ] && echo exists || echo absent)"
|
||||||
|
|
||||||
# ------------------------------------------------- 2. choose the target path --
|
# ------------------------------------------------- 2. choose the target path --
|
||||||
@@ -397,7 +402,7 @@ say " standup $(standup version 2>/dev/null || echo '?') at $(command -v standu
|
|||||||
# The runtime install ends with a synthetic Stop proving the hook is REACHABLE,
|
# The runtime install ends with a synthetic Stop proving the hook is REACHABLE,
|
||||||
# not merely present. That needs a server answering, so start a throwaway one.
|
# not merely present. That needs a server answering, so start a throwaway one.
|
||||||
if [ "$SERVICE_ONLY" = 0 ]; then
|
if [ "$SERVICE_ONLY" = 0 ]; then
|
||||||
step "installing the Claude runtime"
|
step "installing the agent runtimes"
|
||||||
PROBE_DIR="$(mktemp -d)"
|
PROBE_DIR="$(mktemp -d)"
|
||||||
# `--no-git`: the probe project is a throwaway in a bare mktemp dir, and
|
# `--no-git`: the probe project is a throwaway in a bare mktemp dir, and
|
||||||
# `create` requires a git work tree (spec 06 §3). Without this flag it exits
|
# `create` requires a git work tree (spec 06 §3). Without this flag it exits
|
||||||
@@ -421,6 +426,13 @@ if [ "$SERVICE_ONLY" = 0 ]; then
|
|||||||
done
|
done
|
||||||
fi
|
fi
|
||||||
standup install --runtime claude || warn "runtime install reported a problem; see doctor below"
|
standup install --runtime claude || warn "runtime install reported a problem; see doctor below"
|
||||||
|
# Codex only where its binary exists: `--runtime codex` writes to
|
||||||
|
# $CODEX_HOME/hooks.json, ~/.agents/skills/ and the project's AGENTS.md, and
|
||||||
|
# leaving marked blocks for a tool that is not installed is worse than
|
||||||
|
# skipping. `--no-codex` opts out on a box that does have it.
|
||||||
|
if [ "$NO_CODEX" = 0 ] && [ -n "$CODEX_BIN" ]; then
|
||||||
|
standup install --runtime codex || warn "codex runtime install reported a problem; see doctor below"
|
||||||
|
fi
|
||||||
[ -n "$PROBE_PID" ] && { kill "$PROBE_PID" 2>/dev/null || true; wait "$PROBE_PID" 2>/dev/null || true; PROBE_PID=""; }
|
[ -n "$PROBE_PID" ] && { kill "$PROBE_PID" 2>/dev/null || true; wait "$PROBE_PID" 2>/dev/null || true; PROBE_PID=""; }
|
||||||
rm -rf "$PROBE_DIR"; PROBE_DIR=""
|
rm -rf "$PROBE_DIR"; PROBE_DIR=""
|
||||||
fi
|
fi
|
||||||
|
|||||||
Reference in new issue
Block a user