Skip to content

feat: add plugin-ops-automations with auto-unblock, push routing, health monitor - #1

Open
nydamon wants to merge 68 commits into
masterfrom
feat/plugin-ops-automations
Open

feat: add plugin-ops-automations with auto-unblock, push routing, health monitor#1
nydamon wants to merge 68 commits into
masterfrom
feat/plugin-ops-automations

Conversation

@nydamon

@nydamon nydamon commented Mar 17, 2026

Copy link
Copy Markdown
Owner

Summary

  • Auto-Unblock Handler — When an issue transitions to done, scans all blocked issues for references to the completed issue. If all blockers are resolved, moves the blocked issue to todo with an explanatory comment.
  • Push Auto-Route Handler — Detects push-related tasks by title pattern and auto-assigns unassigned ones to the Senior Platform Engineer.
  • Parent Auto-Close Handler — Closes parent issues when all child issues are completed.
  • Health Monitor & Batch Push Sweep — Scheduled jobs for system health monitoring and sweeping unrouted push tasks.
  • Headless Agent Key Provisioning — CLI command and tests for provisioning agent API keys without interactive flow.
  • Release fixrelease() now properly clears executionRunId, executionLockedAt, and executionAgentNameKey.

Both plugin features are toggleable via config flags (autoUnblockEnabled, pushAutoRouteEnabled).

Files Changed

  • packages/plugins/examples/plugin-ops-automations-example/ — new plugin package
  • cli/src/commands/client/agent.ts — headless key provisioning
  • server/src/services/issues.ts — release() fix
  • server/src/__tests__/agent-keys.test.ts — new tests
  • docs/ — updated API and runbook docs
  • pnpm-lock.yaml — dependency lockfile

Test Plan

  • Verify plugin-ops-automations-example builds cleanly
  • Run agent-keys.test.ts suite
  • Validate auto-unblock logic with blocked issue referencing a completed issue
  • Confirm push auto-route assigns to correct agent
  • Verify release() clears execution lock fields

🤖 Generated with Claude Code

teknium1 and others added 30 commits March 10, 2026 23:12
Adds support for Hermes Agent (https://github.com/NousResearch/hermes-agent)
as a managed employee in Paperclip companies.

Hermes Agent is a full-featured AI agent by Nous Research with 30+ native
tools, persistent memory, session persistence, 80+ skills, MCP support,
and multi-provider model access.

Changes:
- Add 'hermes_local' to AGENT_ADAPTER_TYPES (packages/shared)
- Add @nousresearch/paperclip-adapter-hermes dependency (server)
- Register hermesLocalAdapter in the adapter registry (server)

The adapter package is maintained at:
https://github.com/NousResearch/hermes-paperclip-adapter
- Pin @nousresearch/paperclip-adapter-hermes to v0.1.0 tag for
  reproducible builds and supply-chain safety
- Import and wire hermesSessionCodec into the adapter registration
  for structured session parameter validation (matching claude_local,
  codex_local, and other adapters that support session persistence)
- Published hermes-paperclip-adapter@0.1.0 to npm registry
- Replaced github:NousResearch/hermes-paperclip-adapter with
  hermes-paperclip-adapter ^0.1.0 (proper semver, reproducible builds)
- Updated imports from @nousresearch/paperclip-adapter-hermes to
  hermes-paperclip-adapter
- Wired in hermesSessionCodec for structured session validation

Addresses both review items from greptile-apps:
1. Unpinned GitHub dependency → now a proper npm package with semver
2. Missing sessionCodec → now imported and registered
* public-gh/master: (33 commits)
  fix: align embedded postgres ctor types with initdbFlags usage
  docs: add dated plan naming rule and align workspace plan
  Expand workspace plan for migration and cloud execution
  Add workspace product model plan
  docs: add token optimization plan
  docs: organize plans into doc/plans with date prefixes
  fix: keep runtime skills scoped to ./skills
  fix: prefer .agents skills and repair codex symlink targets\n\nCo-Authored-By: Paperclip <noreply@paperclip.ing>
  Change sidebar Documentation link to external docs.paperclip.ing
  Fix local-cli skill install for moved .agents skills
  docs: update PRODUCT.md and add 2026-03-13 features plan
  feat(worktree): add worktree:cleanup command, env var defaults, and auto-prefix
  fix: resolve type errors in process-lost-reaper PR
  fix(heartbeat): prevent false process_lost failures on queued and non-child-process runs
  Revert "Merge pull request paperclipai#707 from paperclipai/nm/premerge-lockfile-refresh"
  ci: refresh pnpm lockfile before merge
  fix(docker): include gemini adapter manifest in deps stage
  chore(lockfile): refresh pnpm-lock.yaml
  Raise default max turns to 300
  Drop pnpm lockfile from PR
  ...
* public-gh/master:
  Add worktree UI branding
  Fix company switch remembered routes
  Add me and unassigned assignee options
  feat: skip pre-filled assignee/project fields when tabbing in new issue dialog
  Fix manual company switch route sync
  Delay onboarding starter task creation until launch
…issing

The server only loads environment variables from .paperclip/.env, which is
not the standard location users expect. When DATABASE_URL is set in a .env
file in the project root (cwd), it is silently ignored, requiring users to
manually export the variable.

Add a fallback that loads cwd/.env after .paperclip/.env with override:false,
so the Paperclip-specific env file always takes precedence but standard .env
files in the project root are also picked up.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Paperclip <noreply@paperclip.ing>
- Pin hermes-paperclip-adapter to exact version 0.1.1 (was ^0.1.0).
  Avoids auto-pulling potentially breaking patches from a 0.x package.
- Enable supportsLocalAgentJwt (was false). The adapter uses
  buildPaperclipEnv which passes the JWT to the child process,
  matching the pattern of all other local adapters.
The $AGENT_HOME environment variable was referenced by skills (e.g.
para-memory-files) but never actually set, causing runtime errors like
"/HEARTBEAT.md: No such file or directory" when agents tried to resolve
paths relative to their home directory.

Add agentHome to the paperclipWorkspace context in the heartbeat service
and propagate it as the AGENT_HOME env var in all local adapters.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
realpathSync resolves symlinks and normalizes case, preventing
double-loading the same .env file when paths differ only by
symlink indirection or filesystem case.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
fix: set AGENT_HOME env var for agent processes
…ntime-instance-cleanup

WIP: Simplify plugin runtime and cleanup lifecycle
Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>
The plugin event bus accepts subscriptions for core events like
issue.created but nothing emits them. This adds a bridge in
logActivity() so every domain action that's already logged also
fires a PluginEvent to subscribing plugins.

Uses a module-level setter (same pattern as publishLiveEvent)
to avoid threading the bus through all route handlers. Only
actions matching PLUGIN_EVENT_TYPES are forwarded.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
gsxdsm and others added 25 commits March 14, 2026 14:34
Add globalToolbarButton slot type and update related documentation
- Added packagePath to plugin loader for improved manifest handling.
- Refactored GlobalToolbarPlugins for better slot and launcher management in BreadcrumbBar.
- Updated launcher trigger styles for globalToolbarButton.
The scrollbar-auto-hide utility was only hiding the thumb but left the
track background visible, creating a visible "well" even when idle.
Now both track and thumb are transparent by default, appearing only on
container hover.

Fixes PAP-374

Co-Authored-By: Paperclip <noreply@paperclip.ing>
…lbar-hover-track

fix(ui): hide sidebar scrollbar track until hover
Enhance plugin loading and toolbar integration
fix(server): load .env from cwd as fallback
…apter

feat: add Hermes Agent adapter (hermes_local)
Plugin workers register event handlers via `ctx.events.on()` in the SDK,
but these subscriptions were never forwarded to the host process. The host
sends events via `notifyWorker("onEvent", ...)` which produces a JSON-RPC
notification (no `id`), but the worker only dispatched `onEvent` as a
request handler — notifications were silently dropped.

Changes:
- Add `events.subscribe` RPC method so workers can register subscriptions
  on the host-side event bus during setup
- Handle `onEvent` notifications in the worker notification dispatcher
  (previously only `agents.sessions.event` was handled)
- Add `events.subscribe` to HostServices interface, capability map, and
  host client handler
- Add `subscribe` handler in host services that registers on the scoped
  plugin event bus and forwards matched events to the worker
…ty, stale diagram

- Add scopedBus.clear() in dispose() to prevent subscription accumulation
  on worker crash/restart cycles
- Use two-arg subscribe() overload when filter is null instead of passing
  empty object; fix filter type to include null
- Update ASCII flow diagram: onEvent is a notification, not request/response
…ubscription-wiring

fix: wire plugin event subscriptions from worker to host
- README: mark plugin system as shipped in roadmap
- SPEC: update adapter table with openclaw_gateway, gemini-local, hermes_local
- SPEC: update plugin architecture section to reflect shipped status
- Add .doc-review-cursor for future maintenance runs

Co-Authored-By: Paperclip <noreply@paperclip.ing>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Fix gemini adapter name: `gemini-local` → `gemini_local` (matches registry.ts)
- Move .doc-review-cursor to .gitignore (tooling state, not source)

Co-Authored-By: Paperclip <noreply@paperclip.ing>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…-20260316

docs: fix documentation drift — adapters, plugins, tech stack
…nAgentNameKey

The release() method cleared checkoutRunId but left executionRunId,
executionLockedAt, and executionAgentNameKey intact. This created
orphaned execution locks that permanently blocked all mutations
(checkout, comment, PATCH, release) on affected issues.

Adds the three missing null-clears to the release() .set() call,
symmetric with the checkout path.

Fixes: DLD-149

Co-Authored-By: Paperclip <noreply@paperclip.ing>
Add `agent key create/list/revoke` CLI commands for board users to
manage agent API keys without the UI. Add comprehensive route tests
for key creation, listing, revocation, auth guards, and status
rejections. Document the API endpoints and add a GitHub Actions
service key provisioning guide.

Closes DLD-366

Co-Authored-By: Paperclip <noreply@paperclip.ing>
New plugin in packages/plugins/examples/ that provides two event-driven
automations:

1. Auto-Unblock (issue.updated → done): scans blocked issues for
   references to the completed issue identifier; when all referenced
   blockers are resolved, moves the blocked issue to todo with a comment.

2. Push Auto-Route (issue.created): detects push-related tasks by title
   pattern and auto-assigns them to the Senior Platform Engineer agent,
   with SPE agent ID cached in plugin state.

Both handlers are toggleable via instanceConfigSchema feature flags.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
… plugin

Adds two scheduled jobs (DLD-480):
- health-monitor (*/15 * * * *): detects idle agents with >3 stalled in-progress
  tasks, creates alert issues for CEO, posts comments on stalled tasks, enforces
  2-hour cooldown per agent via plugin state
- batch-push-sweep (*/30 * * * *): finds unassigned push-pattern tasks and
  batch-assigns them to Senior Platform Engineer

Also adds issues.create capability, companyId persistence for job context,
and config flags for both features.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
When a child issue transitions to done, check if all siblings under the
same parent are also terminal (done or cancelled). If so, automatically
close the parent and post a summary comment. Cascades up the hierarchy.

Guarded by enableParentAutoClose config flag (default: true). Only acts
on parents in in_progress or in_review status.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

nydamon pushed a commit that referenced this pull request Mar 23, 2026
**#1 — Missing `description` field in fields table**
The create body example included `description` and the schema confirms
`description: z.string().optional().nullable()`, but the reference table
omitted it. Added as an optional field.

**#2 — Concurrency policy descriptions were inaccurate**
Original docs described both `coalesce_if_active` and `skip_if_active` as
variants of "skip", which was wrong. Source-verified against
`server/src/services/routines.ts` (dispatchRoutineRun, line 568):

  const status = concurrencyPolicy === "skip_if_active" ? "skipped" : "coalesced";

Both policies write identical DB state (same linkedIssueId and
coalescedIntoRunId); the only difference is the run status value.
Descriptions now reflect this: both finalise the incoming run immediately
and link it to the active run — no new issue is created in either case.

Note: the reviewer's suggestion that `coalesce_if_active` "extends or
notifies" the active run was also not supported by the code; corrected
accordingly.

**#3 — `triggerId` undocumented in Manual Run**
`runRoutineSchema` accepts `triggerId` and the service genuinely uses it
(routines.ts:1029–1034): fetches the trigger, enforces that it belongs to
the routine (403) and is enabled (409), then passes it to dispatchRoutineRun
which records the run against the trigger and updates its `lastFiredAt`.
Added `triggerId` to the example body and documented all three behaviours.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
nydamon pushed a commit that referenced this pull request Mar 31, 2026
* docs: add board-operator delegation guide

Create docs/guides/board-operator/delegation.md explaining the full
CEO-led delegation lifecycle from the board operator's perspective.
Covers what the board needs to do, what the CEO automates, common
delegation patterns (flat, 3-level, hire-on-demand), and a
troubleshooting section that directly answers the #1 new-user
confusion point: "Do I have to tell the CEO to delegate?"

Also adds a Delegation section to core-concepts.md and wires the
new guide into docs.json navigation after Managing Tasks.

Co-Authored-By: Paperclip <noreply@paperclip.ing>

* docs: add AGENTS.md troubleshooting note to delegation guide

Add a row to the troubleshooting table telling board operators to
verify the CEO's AGENTS.md instructions file contains delegation
directives. Without these instructions, the CEO won't delegate.

Co-Authored-By: Paperclip <noreply@paperclip.ing>

* docs: fix stale concept count and frontmatter summary

Update "five key concepts" to "six" and add "delegation" to the
frontmatter summary field, addressing Greptile review comments.

Co-Authored-By: Paperclip <noreply@paperclip.ing>

---------

Co-authored-by: Paperclip <noreply@paperclip.ing>
nydamon added a commit that referenced this pull request Apr 9, 2026
…en screenshots exist (paperclipai#212)

Two changes to reduce false evidence gate blocks:

1. Widened BROWSE_EVIDENCE_PATTERN to match actual agent output: goto,
   snapshot, gstack, playwright, VERIFIED, health score, browser
   verification/testing, console errors, screenshot attached.

2. Changed both engineer and QA evidence gates to accept screenshot
   attachments as primary evidence even without matching browse text.
   The text pattern is a v1 stopgap; the real proof of interactive
   testing is the screenshot itself. Text-only (no image) is still
   rejected.

Audit showed done_requires_qa_browse_evidence was the #1 remaining
false block — agents uploaded screenshots but their comments used
goto/snapshot/gstack/playwright commands that didn't match the regex.

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
nydamon added a commit that referenced this pull request Apr 9, 2026
…en screenshots exist (paperclipai#214)

Two changes to reduce false evidence gate blocks:

1. Widened BROWSE_EVIDENCE_PATTERN to match actual agent output: goto,
   snapshot, gstack, playwright, VERIFIED, health score, browser
   verification/testing, console errors, screenshot attached.

2. Changed both engineer and QA evidence gates to accept screenshot
   attachments as primary evidence even without matching browse text.
   The text pattern is a v1 stopgap; the real proof of interactive
   testing is the screenshot itself. Text-only (no image) is still
   rejected.

Audit showed done_requires_qa_browse_evidence was the #1 remaining
false block — agents uploaded screenshots but their comments used
goto/snapshot/gstack/playwright commands that didn't match the regex.

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants