@appchy/jarvis 0.1.122 → 0.1.123

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/dist/bin.js CHANGED
@@ -10286,7 +10286,7 @@ import { createRequire as createRequire2 } from "module";
10286
10286
  var _require = createRequire2(import.meta.url);
10287
10287
  var VERSION2 = _require("../package.json").version ?? "0.0.0";
10288
10288
  var IS_DEV = String(_require("../package.json").name ?? "").endsWith("-dev");
10289
- var SHA = "63c9236";
10289
+ var SHA = "4d8962c";
10290
10290
  var BUILT = "2026-09-12";
10291
10291
  var BUILD = SHA ?? "source";
10292
10292
  var BUILD_LABEL = `${SHA ? `${VERSION2} (${SHA}${BUILT ? ` ${BUILT}` : ""})` : `${VERSION2} (source)`}${IS_DEV ? " \u2014 development build" : ""}`;
@@ -167,15 +167,25 @@ def session_name(task) -> str:
167
167
  one Claude Code derives a name from the FOLDER — identical for every session
168
168
  in a repo, so several runs are told apart only by an id nobody reads.
169
169
 
170
+ **It is the item's NAME, not its title** (founder, 2026-09-12). A title is a
171
+ sentence — "The verify lock refuses cleanly but cannot say you are queued, or
172
+ that you were displaced" is 90 characters — and a picker truncates it to the
173
+ half that carries no information, so four sessions read as four rows of
174
+ near-identical prose. Worse, it is not a string a person can type: this name
175
+ is also what `ListAgents` lists and `SendMessage` addresses, so it has to be
176
+ something somebody can say out loud to point an agent at one session. The
177
+ item's name is already that — short, unique across the whole board by
178
+ construction, and the same word the person would use for the work itself.
179
+
170
180
  A run is numbered by how many have already worked the item, so the first is
171
- just the title and the fifth says it is the fifth. The number leads because
181
+ just the name and the fifth says it is the fifth. The number leads because
172
182
  that is the column a picker never truncates, and the count comes off
173
183
  `sessions:` rather than being carried in the prompt: the wrap has just
174
184
  recorded the run doing the wrapping, so the successor is the next one along
175
185
  and nothing has to remember what number it is.
176
186
  """
177
187
  ordinal = len(task.sessions) + 1
178
- return task.title if ordinal == 1 else f"{ordinal} · {task.title}"
188
+ return task.name if ordinal == 1 else f"{ordinal} · {task.name}"
179
189
 
180
190
 
181
191
  def cmd_kickoff(args) -> int:
@@ -3566,6 +3566,32 @@ def test_a_slot_the_harness_cannot_write_is_not_reported_as_somebody_elses_run()
3566
3566
  gate.VERIFY = old
3567
3567
 
3568
3568
 
3569
+ def test_a_session_is_named_for_the_work_not_for_its_title():
3570
+ # The founder could see only prompts: a picker shows each session's FIRST prompt,
3571
+ # which for a jarvis-started run is the whole kickoff block, so four sessions read
3572
+ # as four walls of near-identical text. The name field existed and carried the
3573
+ # TITLE — a 90-character sentence that truncates to the half saying nothing, and
3574
+ # that nobody can type. It is also what `ListAgents` lists and `SendMessage`
3575
+ # addresses, so it has to be a word a person can say out loud.
3576
+ with tempfile.TemporaryDirectory() as tmp:
3577
+ v = _tree(tmp)
3578
+ e = _epic(v, "an-epic")
3579
+ _task(e / "in-progress", "a-verify-says-whether-you-are-queued",
3580
+ body="# The verify lock refuses cleanly but cannot say you are queued, "
3581
+ "or that you were displaced\n")
3582
+ with _work_dir(tmp) as root:
3583
+ task = model.locate(root, "a-verify-says-whether-you-are-queued")
3584
+ assert kickoff.session_name(task) == "a-verify-says-whether-you-are-queued"
3585
+ # The title is what it must NOT be, and the title is the long one.
3586
+ assert len(task.title) > 60, task.title
3587
+ assert task.title not in kickoff.session_name(task)
3588
+
3589
+ # A second run on the same item leads with the number, because that is the
3590
+ # column a picker never truncates.
3591
+ task.sessions.append("2026-09-12 aaaa")
3592
+ assert kickoff.session_name(task) == "2 · a-verify-says-whether-you-are-queued"
3593
+
3594
+
3569
3595
  def test_a_pid_somebody_else_owns_is_alive_not_dead():
3570
3596
  # Two readings of one pid: `peers._live` treats a kernel refusal as alive and
3571
3597
  # this treated it as dead, so a run owned by another user read as over and a
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@appchy/jarvis",
3
- "version": "0.1.122",
3
+ "version": "0.1.123",
4
4
  "description": "Jarvis — local AI coding assistant CLI",
5
5
  "private": false,
6
6
  "type": "module",
@@ -63,10 +63,10 @@
63
63
  "@jarvis/errors": "1.0.0",
64
64
  "@jarvis/logger": "1.0.0",
65
65
  "@jarvis/rpc": "1.0.0",
66
- "@jarvis/types": "1.0.0",
66
+ "@jarvis/vitest-config": "1.0.0",
67
67
  "@jarvis/typescript-config": "1.0.0",
68
68
  "@jarvis/ui": "0.1.0",
69
- "@jarvis/vitest-config": "1.0.0"
69
+ "@jarvis/types": "1.0.0"
70
70
  },
71
71
  "scripts": {
72
72
  "dev": "tsx watch src/bin.ts start --foreground",