Skip to content

Pulse 0.4.0

Choose a tag to compare

@github-actions github-actions released this 04 Oct 15:22

Added

  • Agents of pulse go and /pulse-build close each task of the Plan with a commit that carries the trailer Pulse-Task: <n>, and the live map shows Plan k/n with the next open task under the ladder of each of your jobs, read from the item's branch (#216).
  • The live map is a command center: Needs you stands on top only when you must act, each entry with its item, the reason and the key; each of your jobs shows a ladder of its stages with the active one's duration; the goal, the runner's next step and what it does about a hook's refusal stand at the Pulse runner row; an action stands at its item until two minutes after it is confirmed, and a conflict offers redo in the item view; someone else's items show only the item and its branch, plus your own sessions and actions on them. Next, Local actions and the goal above the sections are gone (#215).
  • /pulse-off and /pulse-on (in Codex $pulse:pulse-off, $pulse:pulse-on) and pulse off, pulse on turn Pulse off or on for you in this clone, or with --host on your computer, without changing your team's configuration. While any switch is off, yours or the team's mode = "off", your sessions there get no rules, guard or presence and pulse go starts no run; pulse status and the Map name the switch and the way back. Only you switch: Claude Code asks you in its own dialog, Codex names the command for your terminal, and the Codex rules forbid it to the agent (#231).
  • Who is doing what in the live map reads as a tree: your row sums up your items and sessions and adds pulse go: k of n slots only while your runner runs; each of your items shows its ladder of stages without repeating you as its holder; its sessions start folded behind a row such as ▸ 2 sessions that Enter, → or a click unfolds per item and the clone keeps; sessions on a branch without an item fold the same way; pulse status names the count on the row instead; an unfolded session shows its place, what it does and for how long, with its running Claude Code or Codex subagents below, each with its type, what it is for and how long it runs. The section of open work in its order is now called Backlog, in the map, its help and the docs (#234).
  • The live map scrolls as a whole in a low pane: PgUp, PgDn, Home and End move the window, a line names the lines shown (lines 21 to 40 of 96), and the window follows the selected row. Every section heading can be selected, and Enter or a click folds the section into one line with its count, such as BACKLOG (12); the folds stay with the clone (#214).
  • Below the backlog, the live map lists what Pulse integrated in the last 7 days, newest first, with who integrated each item and when; the section folds like the others and Enter opens an item there (#217).

Changed

  • Claude workers of pulse go get the rights you give your own sessions in the project: your permission mode (auto or bypassPermissions when your Claude Code settings set that permissions.defaultMode, else acceptEdits), the allow, ask and deny rules of your .claude/settings.local.json, subagents and read tools, and the Pulse guard as a hook of their own, so no worker pulls your levers. A call your mode does not allow without asking is named in the run report with its tool and input. worker_permissions = "narrow" keeps the former list; a branch that changes its Claude Code settings runs narrow on your user settings only. Codex workers keep their sandbox, and pulse go refuses a Codex template with --approve-for-me (#218).
  • pulse go hands an item to a Claude Code worker as one goal (/goal): one session plans, freezes its spec tests, builds, and closes each Plan task with Pulse-Task, with subagents and all its harness allows, bounded to 20 turns and the agent timeout; pulse go then pushes through your hooks and its own gates decide, and a finding goes back as a new goal within the fix rounds. Codex workers and item_flow = "phases" keep separate plan, build and fix sessions, and an item for which Claude Code refuses /goal (hooks restricted, an untrusted workspace) or which resumes on Codex after a usage limit falls back to them (#219).
  • Codex workers of pulse go get network and the review of approvals as you set them for your own Codex sessions at the top level of config.toml in $CODEX_HOME (by default ~/.codex), always in their workspace sandbox (an escalation Codex's own review approves runs outside it, as in your own session), and the plan, build and fix sessions of an item read the last comments on its issue by people who may push, as data after their instructions (a /goal session from a file named beside its condition). Workers still get no GitHub login (#230).

Fixed

  • The Pulse guard judges every command within 3.5 seconds and refuses one it cannot judge in that time, asking to split it, instead of being cut off at the hook's 5 second limit, which let the call run unchecked.
  • The guard's check of your Pulse switches stays fast on very long lines (it grew with the square of the pulse words in a line), and it reads the command string of npm exec, npx and pnpm in every spelling of their -c option.
  • A pulse go session that commits its Plan and then stops at a usage limit finds that Plan when it resumes; the item no longer fails with its work pushed.
  • A worker of pulse go keeps the Pulse guard: it starts no Claude or Codex agent that drops the guard (a changed PULSE_HOLDER, PULSE_CLONE, CLAUDE_CONFIG_DIR, CLAUDE_CODE_SIMPLE, CODEX_HOME or HOME, --setting-sources without user), skips its permission checks, or leaves Codex's sandbox, judged from the program the line starts, so a line that only names such a flag runs; and it changes neither the running Pulse copy nor the project's .pulse/, with its edit tools or by a shell line that names them and does more than read them. No agent runs a git command that config of its line may turn into an alias (only git's own commands run under such config), pushes without naming the branch, or with a branch that config of its line could redirect, or pushes to pulse-state. A phase that runs on your user settings keeps the sandbox block of the project's settings on the base branch (#229).
  • The live map's header counts as many "need you" as NEEDS YOU shows: an item your own session holds by hand and that has been silent too long, and an item on hold, now stand there with their next step.
  • The Pulse guard sees claude and codex again after do, then, else, if, while, a brace group, !, function, coproc, zsh's noglob and repeat, and inside npm exec -c, and export, unset and exec -c there; a named push that the line's push.default=upstream or tracking or a branch.<name>.merge key can send to the base or to pulse-state is refused; a push without a target is refused only under a key that can steer it, so git -c http.postBuffer=... push works again; for a worker, export PATH=... is no write, and git commands such as submodule count as no alias (#235).
  • Every job of pulse go that can reach a fix round (refresh and document jobs too) gives its fix session the comments of its issue, and a failure to read or write those comments becomes a note instead of stopping the item or the run.
  • Your switch for the whole computer lives in ~/.config/pulse-agents/ (or $XDG_CONFIG_HOME/pulse-agents/), so work with PulseAudio's ~/.config/pulse/ passes in every project and resetting PulseAudio no longer drops your switch. The guard also refuses pulse on and pulse off among the words of script, unbuffer, setsid or stdbuf and in their -c lines, counts the files script writes itself as writes, treats export -n, typeset +x, local and declare of an agent's marker as unset, and where only the switches count refuses exec -c only when it reaches one (#236).
  • In the live map, a subagent that another subagent starts shows its own description, and the sessions under an item are drawn as a tree.