Files
paseo/plugin-examples/lifecycle-actions
Mohamed Boudra 986687b8fd feat(plugins): unify lifecycle hooks and await worktree initialization (#8081)
* refactor(plugins): make lifecycle hook timing explicit

Use one registration method and subject.operation.step names so plugin authors can read whether an operation waits. Preserve old registrations through a single SDK adapter and keep timing and payloads unchanged.

* fix(plugins): align hook notes and example fixtures with release contracts

Keep the changelog inside its versioned beta entry for app parsing. Run current plugin examples against the checkout version so their declared requirements remain valid.

* docs(plugins): align translated hook dependency guidance

* fix(plugins): align hook exports and release documentation

* feat(plugins): use lifecycle positions and await worktree initialization

* test(plugins): cover first-agent worktree initialization

* test(plugins): verify rollback against workspace catalog entries
2026-10-28 17:04:52 +07:00
..

Lifecycle actions

Small callbacks using the existing SDK:

  • Send Try again. when the latest output contains out of credits.
  • Decline a shell request matching rm -rf; approve exactly git status; leave other requests alone.
  • Inject PASEO_HOOK_CREATE_EXAMPLE=created on creation and PASEO_HOOK_OPEN_EXAMPLE=opened on each session opening.
  • Change requested Codex agents to Claude Haiku before creation.
  • Create a worktree when a directory creation request is titled Isolated lifecycle example.

This is a demonstration plugin: installing it enables all these behaviors on its host. Install it alongside lifecycle-logger on a test daemon with plugins enabled:

paseo plugin install /absolute/path/to/plugin-examples/lifecycle-actions
paseo plugin install /absolute/path/to/plugin-examples/lifecycle-logger
paseo plugin logs lifecycle-logger

Outside the Paseo repository, server/inspect.ts needs @getpaseo/protocol installed for its type imports. Add it to your plugin development dependencies at the same version as @getpaseo/plugin before installing this example.

Copy the callbacks you need into your own plugin. The follow-up example sends a new message; it does not replay attachments or undo previous tool effects. If the provider keeps returning the matching phrase, it keeps sending follow-ups. Add limits or delay in your plugin when your workflow needs them. The command regex illustrates a policy; it does not parse shell syntax or cover every deletion command.

server/inspect.ts joins provider text chunks and excludes earlier turns and the current user prompt from the phrase match. The failing-first regression test records the split text observed with a real Claude agent.

See agent configuration for a focused example that injects MCP servers and changes Codex sandbox and approval options while preserving other settings.

See the lifecycle reference for the API.