bullswarm 0.28.1 → 0.28.2

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/CHANGELOG.md CHANGED
@@ -1,5 +1,67 @@
1
1
  # bullswarm changelog
2
2
 
3
+ ## 0.28.2 — terminal glyph fallback, issue watcher, health on a fresh home
4
+
5
+ - `bullswarm workflow` repainted flashing `?` characters on macOS
6
+ Terminal.app. Cause is font coverage, not encoding: parsing the `cmap` of
7
+ every monospace face Terminal.app offers shows **zero** glyphs in the
8
+ Braille block `U+2800-U+28FF` — Andale Mono, Menlo, SF Mono, Monaco and
9
+ Courier New are all 0/256 — and none of the five has `⧖` (`U+29D6`) or `⟡`
10
+ (`U+27E1`). The dashboard's 10-frame Braille spinner advances every 400ms,
11
+ so every repaint drew a question mark that flashed; the static `✓ ✗ ⊘ ◇ ↳
12
+ ⚠ ● ○ ■ ♡ ◆ ↻ ↺ ▶ ⚙` icons beside it were the steady ones. Terminal.app
13
+ does not substitute another face for these ranges.
14
+ - New `src/lib/glyphs.js` holds one table per mode and the detection order:
15
+ `BULLSWARM_ASCII` forces ASCII, `BULLSWARM_UNICODE` forces Unicode and
16
+ overrides detection, then a non-UTF-8 locale, `TERM=dumb`/`TERM=linux`, and
17
+ `TERM_PROGRAM=Apple_Terminal` select ASCII. Every replacement is one column
18
+ of printable ASCII, because panel width maths uses `String#length` and a
19
+ wide substitute would shear the borders. Box drawing, `· › × … ≈ ≥ █` are in
20
+ all five fonts and are left alone, so panels keep their borders.
21
+ - Wired through the three live-refreshing renderers only:
22
+ `src/workflow/dashboard.js`, `src/workflow/watch-cli.js` and
23
+ `src/strategy-dashboard.js`. One-shot `✓`/`✗` message prefixes in
24
+ `src/workflow/cli.js`, `src/help.js`, `src/integrate.js`,
25
+ `src/workflow/runs-cli.js`, `src/strategy-cli.js` and
26
+ `src/lib/cli-flags.js` are untouched — they do not flash and are a separate
27
+ change.
28
+ - `spinnerGlyph` now parks a non-finite frame counter on frame 0. The previous
29
+ expression `SPINNER_FRAMES[Math.abs(Number(f) || 0) % SPINNER_FRAMES.length]`
30
+ returned `undefined` for `Infinity`, so a repaint could have painted the
31
+ string "undefined" into the frame.
32
+ - `tests/glyphs.test.js` covers the detection matrix (including that `''`,
33
+ `'0'` and `'false'` do not switch tables, and that `LC_ALL` outranks
34
+ `LANG`), asserts every Unicode entry has a one-column pure-ASCII twin that
35
+ is never `?`, and renders both dashboards, `renderWatchSnapshot`,
36
+ `renderWatchEvent` over 15 event shapes and `renderAnalysisProgress` at five
37
+ spinner frames, asserting no substituted glyph survives in ASCII mode while
38
+ the Braille spinner still appears in Unicode mode.
39
+ - `tests/strategy-cli.test.js`, `tests/workflow-dashboard.test.js` and
40
+ `tests/workflow-watch.test.js` assert the Unicode presentation, so they now
41
+ pin `BULLSWARM_UNICODE=1` and `delete process.env.BULLSWARM_ASCII`; without
42
+ the pin the suite's own output depended on which terminal the developer ran
43
+ it in, and without the delete an ambient `BULLSWARM_ASCII=1` — the very
44
+ workaround the README hands an affected user — outranked the pin and broke
45
+ 22 tests.
46
+ - The four arrows `↑ ↓ ← →` are deliberately not substituted. They are only
47
+ missing from Monaco, and they live in the frozen `DASHBOARD_KEYS` constant,
48
+ which binds at import time — before any env pin could apply.
49
+ - `scripts/issue-watcher/` — a durable GitHub issue watcher for this
50
+ repository, installed as a launchd agent
51
+ (`node scripts/issue-watcher/install.mjs`). Idle costs ZERO model tokens:
52
+ a pass is one `gh issue list` and nothing else. Only when an issue appears
53
+ that is new since install does it delegate — one
54
+ `bullswarm run --lane analyze` to triage (label + plain-words comment),
55
+ and for a bug it judged fixable at confidence >= 0.7 one
56
+ `bullswarm run --lane build` to fix, which the watcher then verifies
57
+ itself (test suite green in its own clone, diff non-empty) before pushing
58
+ `fix/issue-<n>` and opening a pull request. Both delegations run on the
59
+ owner's subscriptions through normal bullswarm routing, never API tokens.
60
+ Capped at 6 triages and 2 fix attempts per UTC day, one fix attempt per
61
+ issue; guarded by a pass lock, a `paused` file, and a 3-attempt triage
62
+ retry cap. Delegates get no GitHub credentials and issue text is quoted as
63
+ untrusted data. It never merges, closes, or releases — a maintainer does.
64
+
3
65
  ## 0.28.1 — summary bytes on the wire, monthly pacing
4
66
 
5
67
  - `workflow runs result <id> --summary` was budgeted by `fitResultSummary`
package/README.md CHANGED
@@ -800,6 +800,25 @@ to toggle Timeline and Phases, then use Enter/Esc for agents and activity.
800
800
  bullswarm workflow tui
801
801
  ```
802
802
 
803
+ #### Terminal glyphs
804
+
805
+ The live views draw a Braille spinner and symbol status icons. macOS
806
+ Terminal.app cannot render them: Andale Mono, Menlo, SF Mono, Monaco and
807
+ Courier New all have zero glyphs in `U+2800-U+28FF`, and none has `⧖`, so the
808
+ dashboard repaints a flashing `?` where each one should be. Apple Terminal is
809
+ detected and given a one-column ASCII table instead (`|/-\` spinner, `+`
810
+ succeeded, `x` failed, `:` waiting, `#` blocked). Panel borders are unchanged —
811
+ box drawing is present in every one of those fonts.
812
+
813
+ Override the detection either way:
814
+
815
+ ```bash
816
+ BULLSWARM_ASCII=1 bullswarm workflow # force ascii (any terminal showing ?)
817
+ BULLSWARM_UNICODE=1 bullswarm workflow # force unicode (font does have them)
818
+ ```
819
+
820
+ A non-UTF-8 locale, `TERM=dumb` and `TERM=linux` also select ASCII.
821
+
803
822
  The same dashboard is agent-friendly and never requires a TTY when used with
804
823
  JSON/control flags:
805
824
 
@@ -888,6 +907,19 @@ runtime value and uses its matching connector rate metadata for the attempt's
888
907
  cost estimate. Unknown or provider-hidden model identity remains explicitly
889
908
  unknown.
890
909
 
910
+ ## Repository operations
911
+
912
+ `scripts/issue-watcher/` is a launchd agent that watches this repository's
913
+ GitHub issues. Idle it costs zero model tokens — a pass is one `gh issue
914
+ list` and nothing else. When an issue arrives that is new since install, it
915
+ delegates one analyze run to triage it (label plus a plain-words comment),
916
+ and for a bug it judged fixable at confidence >= 0.7 one build run to fix
917
+ it, verifying the result itself (suite green in its own clone, diff
918
+ non-empty) before pushing `fix/issue-<n>` and opening a pull request. Both
919
+ delegations route through `bullswarm run` on the owner's subscriptions. It
920
+ never merges, closes, or releases. Install, guards, cost model and paths:
921
+ [`scripts/issue-watcher/README.md`](scripts/issue-watcher/README.md).
922
+
891
923
  ## The verdict
892
924
 
893
925
  ```json