Skip to content

gc 0.3.0: setup openclaw, tasks ask, initiatives create/update, listen --kinds (Phase 0, GC 70fc2610) - #5

Merged
slue merged 7 commits into
mainfrom
feat/phase0-openclaw
Nov 10, 2026
Merged

slue merged 7 commits into
mainfrom
feat/phase0-openclaw

Conversation

@slue

@slue slue commented Nov 9, 2026

Copy link
Copy Markdown
Contributor

Closes the toolkit gaps of the plugin→gc migration, Phase 0 (GC task 70fc2610, parent c680a4fa). The parity check covered plugin 0.9.17 against gc 0.2.0.

Summary

  • gc initiatives create|update: name, description, color, visibility (create defaults to public), default assignee (none clears it), --summary[-file] and --memory-summary[-file]. The nightly summary crons depend on these.
  • gc tasks ask <task-id> --body-file -: POST /tasks/{id}/asks (Desk ask). --to and --content[-file] override the JSON.
  • gc listen --kinds a,b: only these change kinds count and wake. The help documents the plugin's 9-kind "OpenClaw worker set". The cursor still advances when every item is filtered out.
  • gc setup openclaw [--dry-run] is idempotent:
    • spawn cron(s): gc-worker-spawn, or one gc-worker-spawn-<profile> per profile. Disabled, light-context, --no-deliver, bound to Telegram allowFrom[0]. The model and delivery are inherited from the old spawn cron. The prompt pins gc --profile <p>, uses its own --cursor-file and contains ZEITVERSETZTE AUFTRÄGE and the closing GC_OK line.
    • nightly gc-journal, gc-initiative-summaries and gc-memory-summaries with gc prompts. An existing plugin cron gets the new prompt with delivery off and keeps its enabled state.
    • skill install, using the OpenClaw overlay.
    • listener:
      • macOS: LaunchAgent ai.groundcontrol.listen, running listen --once --all-profiles --kinds … --exec ~/.openclaw/bin/gc-listen-wake with StartInterval 300.
      • container (GC_OPENCLAW_LISTENER=entrypoint): only the listen.enabled marker.
    • guard: while the groundcontrol plugin is active it changes nothing, prints a hint and exits 0.
  • gc setup openclaw-wake is the Go wake behind gc-listen-wake. Macs have no jq, so the script calls this instead of parsing JSON itself.
  • gc onboarding runs setup when openclaw is present: automatically without a TTY, after a y/N prompt on a TTY. --no-openclaw turns it off. A failed setup never fails the onboarding.
  • Skill variants: skills/groundcontrol/SKILL.openclaw.md is installed for OpenClaw under the same name. It covers exit 3 never shown to the user, offering setup once, the declined marker, the work rules, GC_OK and delayed requests. Details are in gc guide openclaw (server PR in MakersLab-ai/groundcontrol).

Test plan

  • go vet ./..., go test -count=1 ./... and scripts/validate-skills.sh are green. New e2e tests cover initiatives, ask and --kinds. Hermetic setup tests use a fake openclaw/launchctl: fresh host, rerun, inheritance, multi-profile, repair, guard, container, dry-run, wake, and the onboarding paths.
  • Against a real, isolated OpenClaw 2026.10.10 gateway (--profile gctest, own port and state; the production gateway was not touched):
    • setup created gc-worker-spawn-<p> ×2 with the inherited model, telegram:4711 and delivery none, disabled;
    • it created the summary crons and repaired the plugin gc-journal (still disabled, delivery none);
    • the rerun found everything unchanged;
    • the guard fired with the plugin active, and the container marker was written;
    • gc-listen-wake with GC_PROFILE=team-philipp ran the right spawn cron.
    • That run found one bug, which is fixed in 739d0f8: a repaired nightly cron kept announce and would have sent "GC_OK" every night.
  • After merge: tag v0.3.0 (goreleaser publishes the tarballs and checksums.txt), then merge the server PR so the guide names commands that exist.

🤖 Generated with Claude Code

https://claude.ai/code/session_01KWPUqjyxAUS8K14FyVdrQo

slue and others added 7 commits November 9, 2026 11:42
create defaults to visibility public explicitly (the API default has
changed before); update takes summary / memory_summary inline or from a
file / stdin and never sends the *_updated_at stamps, which the server
sets itself. --default-assignee none clears it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…n comment

POST /tasks/{id}/asks with the ask as JSON from --body-file (file or
stdin). --to and --content/--content-file override the JSON. Locally
only the shape is checked (an object with a non-empty questions array);
the server validates the rest. A 404 explains that the Desk may be off.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Default is unchanged (every array counts). Filtered-out items print
nothing, wake nothing and are not counted in GC_LISTEN_COUNT; the cursor
still advances on a poll whose items were all filtered out. The help
names the OpenClaw worker set (the 9 arrays gc-worker.sh woke for).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…w overlay

skills/<name>/SKILL.<agent>.md is embedded next to SKILL.md and installed
for that agent under the same skill name. gc skills list shows the
variants, --dir --agent <name> picks one. validate-skills.sh, the size
cap and the snippet pinning cover the variants too.

First version of skills/groundcontrol/SKILL.openclaw.md: gc is
preinstalled (only run gc onboarding from a setup prompt), exit 3 is
never relayed raw, work rules (assignment = mandate, gc tasks ask instead
of a question comment, blocker first), worker runs end with GC_OK,
delayed requests via exec → openclaw cron add, details in
gc guide openclaw.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…e plugin

gc setup openclaw is idempotent (--dry-run, --json): it creates only
missing crons via openclaw cron add (checked with cron list --all
--json, never duplicated), repairs plugin-era messages via cron edit,
installs the OpenClaw skill variant, and wires the listener:

- gc-worker-spawn (≤1 profile) or gc-worker-spawn-<profile>: disabled,
  isolated, light context, no delivery, Telegram bound from allowFrom;
  model and delivery inherited from an existing spawn cron like the
  plugin's ensureManagedCronsOnce. The German prompt pins
  gc --profile <p>, carries ZEITVERSETZTE AUFTRÄGE and ends with GC_OK.
- gc-journal / gc-initiative-summaries / gc-memory-summaries with gc
  prompts over every profile; created enabled when gc has a profile,
  existing ones keep their enabled state.
- macOS: ai.groundcontrol.listen LaunchAgent (gc listen --once
  --all-profiles --kinds <worker set> --exec ~/.openclaw/bin/gc-listen-wake),
  reloaded only when the plist changed. Container
  (GC_OPENCLAW_LISTENER=entrypoint): only <config dir>/listen.enabled.
  Other Linux: a crontab line to add.

Guard: while the plugin groundcontrol is still active nothing is set up
(exit 0 with a hint). gc setup openclaw-wake is what the wake script
runs: gc-worker-spawn-$GC_PROFILE, else gc-worker-spawn.

gc onboarding runs the setup when openclaw is present: automatically
without a TTY, after y/N on a TTY, --no-openclaw skips it; a failing
setup only warns. The snippet checker now accepts leading global flags
(gc --profile <p> …), and the cron prompts are pinned like the skills.

Tests are hermetic: openclaw and launchctl are the test binary behind
symlinks; the e2e runGc points GC_OPENCLAW_BIN nowhere.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ves create/update

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The plugin created gc-journal / gc-*-summaries without a delivery flag
(announce/last). Replacing only the message kept that mode, and the gc
prompt ends on a GC_OK line — the user would have received "GC_OK" on
Telegram every night. Found against a real (isolated) OpenClaw 2026.10.10
gateway; the edit now passes --no-deliver as well.

Refs: https://groundcontrol.makerslab.ai/tasks/70fc2610-ed81-46a9-8c47-ad049a4329a3

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KWPUqjyxAUS8K14FyVdrQo
@slue
slue merged commit d7fabd2 into main Nov 10, 2026
2 checks passed
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.

1 participant