@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 +1 -1
- package/harness/harness/kickoff.py +12 -2
- package/harness/test_work.py +26 -0
- package/package.json +3 -3
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 = "
|
|
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
|
|
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.
|
|
188
|
+
return task.name if ordinal == 1 else f"{ordinal} · {task.name}"
|
|
179
189
|
|
|
180
190
|
|
|
181
191
|
def cmd_kickoff(args) -> int:
|
package/harness/test_work.py
CHANGED
|
@@ -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.
|
|
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/
|
|
66
|
+
"@jarvis/vitest-config": "1.0.0",
|
|
67
67
|
"@jarvis/typescript-config": "1.0.0",
|
|
68
68
|
"@jarvis/ui": "0.1.0",
|
|
69
|
-
"@jarvis/
|
|
69
|
+
"@jarvis/types": "1.0.0"
|
|
70
70
|
},
|
|
71
71
|
"scripts": {
|
|
72
72
|
"dev": "tsx watch src/bin.ts start --foreground",
|