@stablekernel/pi-background-run 0.4.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -33,7 +33,8 @@ Restart pi after install so the extension loads.
33
33
  | ------ | --------- |
34
34
  | `bgrun` | Launch a command detached in the background. Optional `name` gives the job a short human-readable label. Returns `started: <job-id>` immediately. Wakes the session automatically on completion. |
35
35
  | `bgstatus` | Show job status. With an id: any job's state + exit code. Without: this session's running jobs (finished jobs hidden by default — pass `includeDone: true` or set `showCompletedJobs`). Jobs from other sessions are only listed when `adoptForeignJobs` is enabled. |
36
- | `bgtail` | Print the last N lines of a job's log (default 40), **condensed for context**: ANSI escapes stripped, repeated lines collapsed, long lines and total size capped. Pass `raw: true` to skip condensing. |
36
+ | `bgtail` | Read the newest lines of a job's log (default 40), **condensed for context**: ANSI escapes stripped, repeated lines collapsed, long lines and total size capped. First read = full last-N tail; repeat reads return **only lines appended since your last read** (delta tailing) — polling a running job never re-pays for lines already seen. Pass `raw: true` for the unprocessed last-N window (still advances the bookmark). |
37
+ | `bggrep` | Regex search over a job's log: line-numbered matches, optional `context` lines, capped (~50 matches, ~2KB/line, ~8KB) and condensed. Runs inside the extension, so it reaches **any** jobs dir — including global logs that project-sandboxed tools (`ctx_execute_file`) cannot. With no `pattern`, a generic failure-signature default is used (override it — convenience, not guarantee). |
37
38
  | `bgclean` | Remove old job logs. **Default scope: this session's jobs only** — other sessions' logs are untouched. Pass `all: true` to sweep the whole shared jobs dir. Retention: `cleanupDays` config (7 days). Never removes a running job's log. |
38
39
 
39
40
  ## Slash commands
@@ -85,11 +86,26 @@ exit code even after a restart.
85
86
  Two-tier read model — the log file stays complete on disk for deep analysis;
86
87
  only bounded digests ever enter the conversation:
87
88
 
88
- - **Quick peek:** `bgtail <id>` — condensed last-40-lines (ANSI stripped, repeats
89
- collapsed, ~8KB cap). The wake message itself already carries the exit code
90
- and the log's last line, so many turns need no follow-up read at all.
91
- - **Whole-log analysis:** `ctx_execute_file` on the job's log path to extract
92
- only failure lines. Never `cat` or `Read` a full bgrun log.
89
+ - **Quick peek:** `bgtail <id>` — condensed newest lines (ANSI stripped, repeats
90
+ collapsed, ~2KB/line and ~8KB caps). The first read is the last-40-lines tail; each later
91
+ read returns only what was appended since, so repeated polling is nearly
92
+ free. The wake message itself already carries the exit code and the log's
93
+ last line, so many turns need no follow-up read at all.
94
+ - **Pattern search:** `bggrep <id> [pattern] [context]` — line-numbered matches,
95
+ capped and condensed (~50 matches, ~2KB/line, ~8KB); works on global jobs dirs that `ctx_execute_file`
96
+ cannot reach. Pass your own pattern when you know the log's format.
97
+ - **Whole-log analysis:** `ctx_execute_file` on the job's log path (reachable
98
+ when logs are project-local) to extract only failure lines. Never `cat` or
99
+ `Read` a full bgrun log.
100
+
101
+ **Why `bggrep` instead of `bash grep` on the log?** A bash grep's output is
102
+ uncapped — a retry-storm log can dump thousands of matching lines straight
103
+ into context, and safety depends on remembering `| head` on every call.
104
+ `bggrep` is bounded by design (~50 matches, ~2KB/line, ~8KB), takes the job id instead of
105
+ a reconstructed log path (no shell-quoting of the regex), runs on any jobs
106
+ dir — including global logs that project-sandboxed tools like
107
+ `ctx_execute_file` cannot reach — and reports match counts, line numbers, and
108
+ skip markers. Plain `grep` is fine only for a one-off search you know is tiny.
93
109
 
94
110
  ## Configuration
95
111
 
@@ -118,11 +134,41 @@ config file (trusted projects only) ← environment variables**.
118
134
  }
119
135
  ```
120
136
 
137
+ ### Project-local logs
138
+
139
+ A **relative** `jobsDir` (from any config layer, or `PI_BGRUN_DIR`) opts into
140
+ project-local logs: it resolves against the session's project root, so job logs
141
+ land inside the workspace — e.g. `"jobsDir": ".pi-bgrun/jobs"` in the project
142
+ config writes logs to `<project>/.pi-bgrun/jobs`.
143
+
144
+ Why you might want this:
145
+
146
+ - Logs sit inside the project sandbox, so project-confined analysis tools
147
+ (e.g. context-mode's `ctx_execute_file` / `ctx_index`) can process whole logs
148
+ without pulling raw bytes into the context window.
149
+ - Each checkout/worktree gets its own logs — no cross-project clutter in the
150
+ shared dir.
151
+ - The dir is auto-added to the repo's `.git/info/exclude` (local-only — the
152
+ tracked `.gitignore` is never touched), so logs never pollute `git status`.
153
+ Works in linked worktrees too (`.git` file → pointed git dir).
154
+
155
+ Rules and migration notes:
156
+
157
+ - Absolute `jobsDir` values behave exactly as in older versions — nothing
158
+ moves, nothing breaks on upgrade.
159
+ - If the session cwd is not a recognizable project root (no `.git`/`.pi`), a
160
+ relative path falls back to the global dir rather than scattering logs
161
+ across arbitrary directories.
162
+ - Tools resolve a job's log from the session's job record first, so jobs
163
+ started before a config change stay readable after it.
164
+ - Existing logs in the old global dir are not migrated (they're ephemeral,
165
+ `cleanupDays`-retained); `bgclean all` sweeps them once you've switched.
166
+
121
167
  Environment variables (same knobs, handy for one-off overrides):
122
168
 
123
169
  | Variable | Default | Description |
124
170
  | --- | --- | --- |
125
- | `PI_BGRUN_DIR` | `~/.pi-bgrun/jobs` | Override where job logs are stored. |
171
+ | `PI_BGRUN_DIR` | `~/.pi-bgrun/jobs` | Override where job logs are stored. An absolute path is used as-is; a **relative** path resolves against the project root (see [project-local logs](#project-local-logs)), falling back to the default when there is no project root. |
126
172
  | `PI_BGRUN_FOREIGN_JOBS` | `false` | Adopt other sessions' running jobs into this session's widget and job list. Adopted jobs are polled so they leave the widget when they finish. |
127
173
  | `PI_BGRUN_SHOW_COMPLETED` | `false` | Include finished jobs in `bgstatus` listings by default. |
128
174
  | `PI_BGRUN_CLEANUP_DAYS` | `7` | Log retention for cleanup sweeps and the `bgclean` default. |