Skip to content

Run the worker on macOS

Use a user-scoped launchd agent after the one-off setup check succeeds.

Capture absolute paths

In an interactive shell, print the three paths the agent needs:

bash
AGENT_DIR="${PI_CODING_AGENT_DIR:-$HOME/.pi/agent}"
NODE_BIN="$(command -v node)"
WORKER_BIN="$(command -v no-forgetti 2>/dev/null || true)"
if [ -z "$WORKER_BIN" ]; then
  WORKER_BIN="$AGENT_DIR/git/github.com/Jeecabs/no-forgetti/bin/no-forgetti.mjs"
fi

printf 'NODE_BIN=%s\nWORKER_BIN=%s\nAGENT_DIR=%s\n' \
  "$NODE_BIN" "$WORKER_BIN" "$AGENT_DIR"
mkdir -p "$AGENT_DIR/no-forgetti/logs" "$HOME/Library/LaunchAgents"

Use the printed absolute values below. launchd does not load shell startup files, aliases, or Node version-manager initialization.

Create the LaunchAgent

Create ~/Library/LaunchAgents/com.jeecabs.no-forgetti-review.plist:

xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key>
  <string>com.jeecabs.no-forgetti-review</string>

  <key>ProgramArguments</key>
  <array>
    <string>/absolute/path/to/node</string>
    <string>/absolute/path/to/no-forgetti/bin/no-forgetti.mjs</string>
    <string>review</string>
    <string>--agent-dir</string>
    <string>/absolute/path/to/.pi/agent</string>
    <string>--worker-id</string>
    <string>launchd</string>
  </array>

  <key>RunAtLoad</key>
  <true/>
  <key>KeepAlive</key>
  <true/>
  <key>ThrottleInterval</key>
  <integer>10</integer>

  <key>StandardOutPath</key>
  <string>/absolute/path/to/.pi/agent/no-forgetti/logs/review.stdout.log</string>
  <key>StandardErrorPath</key>
  <string>/absolute/path/to/.pi/agent/no-forgetti/logs/review.stderr.log</string>
</dict>
</plist>

Replace every placeholder, including the three log paths. Do not use ~ or shell variables in the plist.

Validate and register

bash
plutil -lint "$HOME/Library/LaunchAgents/com.jeecabs.no-forgetti-review.plist"
launchctl bootstrap "gui/$(id -u)" "$HOME/Library/LaunchAgents/com.jeecabs.no-forgetti-review.plist"
launchctl enable "gui/$(id -u)/com.jeecabs.no-forgetti-review"
launchctl kickstart -k "gui/$(id -u)/com.jeecabs.no-forgetti-review"

bootstrap reports an error if the same agent is already loaded. In that case, inspect it first or run the bootout command below before bootstrapping the edited plist again.

Verify

bash
launchctl print "gui/$(id -u)/com.jeecabs.no-forgetti-review"
tail -n 50 "$AGENT_DIR/no-forgetti/logs/review.stderr.log"

Inside Pi, run:

text
/memory status

The worker heartbeat should become healthy. Queue depth should fall as eligible jobs complete.

Restart after updates

No Forgetti’s worker loads its model profile and memory-policy version at process startup. Restart it after updating the package or changing the reviewer profile:

bash
launchctl kickstart -k "gui/$(id -u)/com.jeecabs.no-forgetti-review"

If a Node version manager moved the Node executable, or the package checkout path changed, update the plist, boot it out, and bootstrap it again.

Stop or unregister

Stop and unregister the agent:

bash
launchctl bootout "gui/$(id -u)/com.jeecabs.no-forgetti-review"

This does not delete queued work, configuration, budgets, or review evidence. See Disable external mode for the complete sequence.

Authentication note

Credentials stored through Pi’s /login are read from the configured agent directory’s auth.json. If you instead depend on shell environment variables, this agent will not see them unless you explicitly configure a launchd environment. Avoid placing literal credentials in a world-readable plist; prefer auth.json or your existing secure credential mechanism.

No Forgetti is open source under the MIT License.