bullswarm 0.28.1 → 0.28.3

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,86 @@
1
1
  # bullswarm changelog
2
2
 
3
+ ## 0.28.3 — connector upgrades learn new packaged profiles
4
+
5
+ - command-code: a profile entry for `deepseek/deepseek-v4.1-flash` that
6
+ carries the model's own pricing from
7
+ https://commandcode.ai/docs/resources/pricing-limits (2026-09-11): input
8
+ $0.15, cache read $0.003, output $0.60 per million tokens off peak (the
9
+ peak window is documented in the entry). Tier and rank stay exactly what the
10
+ generic flash catch-all gives; this is not a recommendation, and none will
11
+ be packaged without benchmark evidence. Note for operators: model discovery
12
+ is only re-run by `bullswarm strategy refresh`, so a model a CLI added since
13
+ the last refresh is rejected by `strategy set-rung` until you refresh.
14
+ - Connector upgrades now insert packaged `modelProfiles` entries that the
15
+ installed connector lacks (keyed by `match` or `id`) at the position the
16
+ packaged order implies: before the installed generic catch-all a specific
17
+ entry was written to precede, never ahead of a profile the operator
18
+ authored. Profiles the installed connector already holds are never touched.
19
+ Before this, `modelProfiles` was copied only when the installed connector
20
+ had none at all, so existing installations never learned new entries.
21
+
22
+ ## 0.28.2 — terminal glyph fallback, issue watcher, health on a fresh home
23
+
24
+ - `bullswarm workflow` repainted flashing `?` characters on macOS
25
+ Terminal.app. Cause is font coverage, not encoding: parsing the `cmap` of
26
+ every monospace face Terminal.app offers shows **zero** glyphs in the
27
+ Braille block `U+2800-U+28FF` — Andale Mono, Menlo, SF Mono, Monaco and
28
+ Courier New are all 0/256 — and none of the five has `⧖` (`U+29D6`) or `⟡`
29
+ (`U+27E1`). The dashboard's 10-frame Braille spinner advances every 400ms,
30
+ so every repaint drew a question mark that flashed; the static `✓ ✗ ⊘ ◇ ↳
31
+ ⚠ ● ○ ■ ♡ ◆ ↻ ↺ ▶ ⚙` icons beside it were the steady ones. Terminal.app
32
+ does not substitute another face for these ranges.
33
+ - New `src/lib/glyphs.js` holds one table per mode and the detection order:
34
+ `BULLSWARM_ASCII` forces ASCII, `BULLSWARM_UNICODE` forces Unicode and
35
+ overrides detection, then a non-UTF-8 locale, `TERM=dumb`/`TERM=linux`, and
36
+ `TERM_PROGRAM=Apple_Terminal` select ASCII. Every replacement is one column
37
+ of printable ASCII, because panel width maths uses `String#length` and a
38
+ wide substitute would shear the borders. Box drawing, `· › × … ≈ ≥ █` are in
39
+ all five fonts and are left alone, so panels keep their borders.
40
+ - Wired through the three live-refreshing renderers only:
41
+ `src/workflow/dashboard.js`, `src/workflow/watch-cli.js` and
42
+ `src/strategy-dashboard.js`. One-shot `✓`/`✗` message prefixes in
43
+ `src/workflow/cli.js`, `src/help.js`, `src/integrate.js`,
44
+ `src/workflow/runs-cli.js`, `src/strategy-cli.js` and
45
+ `src/lib/cli-flags.js` are untouched — they do not flash and are a separate
46
+ change.
47
+ - `spinnerGlyph` now parks a non-finite frame counter on frame 0. The previous
48
+ expression `SPINNER_FRAMES[Math.abs(Number(f) || 0) % SPINNER_FRAMES.length]`
49
+ returned `undefined` for `Infinity`, so a repaint could have painted the
50
+ string "undefined" into the frame.
51
+ - `tests/glyphs.test.js` covers the detection matrix (including that `''`,
52
+ `'0'` and `'false'` do not switch tables, and that `LC_ALL` outranks
53
+ `LANG`), asserts every Unicode entry has a one-column pure-ASCII twin that
54
+ is never `?`, and renders both dashboards, `renderWatchSnapshot`,
55
+ `renderWatchEvent` over 15 event shapes and `renderAnalysisProgress` at five
56
+ spinner frames, asserting no substituted glyph survives in ASCII mode while
57
+ the Braille spinner still appears in Unicode mode.
58
+ - `tests/strategy-cli.test.js`, `tests/workflow-dashboard.test.js` and
59
+ `tests/workflow-watch.test.js` assert the Unicode presentation, so they now
60
+ pin `BULLSWARM_UNICODE=1` and `delete process.env.BULLSWARM_ASCII`; without
61
+ the pin the suite's own output depended on which terminal the developer ran
62
+ it in, and without the delete an ambient `BULLSWARM_ASCII=1` — the very
63
+ workaround the README hands an affected user — outranked the pin and broke
64
+ 22 tests.
65
+ - The four arrows `↑ ↓ ← →` are deliberately not substituted. They are only
66
+ missing from Monaco, and they live in the frozen `DASHBOARD_KEYS` constant,
67
+ which binds at import time — before any env pin could apply.
68
+ - `scripts/issue-watcher/` — a durable GitHub issue watcher for this
69
+ repository, installed as a launchd agent
70
+ (`node scripts/issue-watcher/install.mjs`). Idle costs ZERO model tokens:
71
+ a pass is one `gh issue list` and nothing else. Only when an issue appears
72
+ that is new since install does it delegate — one
73
+ `bullswarm run --lane analyze` to triage (label + plain-words comment),
74
+ and for a bug it judged fixable at confidence >= 0.7 one
75
+ `bullswarm run --lane build` to fix, which the watcher then verifies
76
+ itself (test suite green in its own clone, diff non-empty) before pushing
77
+ `fix/issue-<n>` and opening a pull request. Both delegations run on the
78
+ owner's subscriptions through normal bullswarm routing, never API tokens.
79
+ Capped at 6 triages and 2 fix attempts per UTC day, one fix attempt per
80
+ issue; guarded by a pass lock, a `paused` file, and a 3-attempt triage
81
+ retry cap. Delegates get no GitHub credentials and issue text is quoted as
82
+ untrusted data. It never merges, closes, or releases — a maintainer does.
83
+
3
84
  ## 0.28.1 — summary bytes on the wire, monthly pacing
4
85
 
5
86
  - `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
@@ -256,6 +256,19 @@
256
256
  "tier": "low",
257
257
  "qualityRank": 3
258
258
  },
259
+ {
260
+ "match": "^deepseek/deepseek-v4\\.1-flash$",
261
+ "tier": "low",
262
+ "qualityRank": 2,
263
+ "$comment-deepseek": "Facts only, no recommendation: tier and rank are exactly what the generic flash catch-all below would give, kept here so the entry carries the model's own pricing. OpenRouter publishes no indices for this model yet; raise nothing here without benchmark evidence. Pricing is the off-peak rate (17 h/day); peak is $0.30 input / $1.20 output during 01–04 and 06–10 UTC Monday–Friday.",
264
+ "pricing": {
265
+ "inputUsdPerMillion": 0.15,
266
+ "cacheReadUsdPerMillion": 0.003,
267
+ "outputUsdPerMillion": 0.6
268
+ },
269
+ "pricingSource": "https://commandcode.ai/docs/resources/pricing-limits",
270
+ "pricingUpdatedAt": "2026-09-11"
271
+ },
259
272
  {
260
273
  "match": "(?:flash|(?:^|[/.-])mini(?:$|[/.-])|luna|free)",
261
274
  "tier": "low",