jackherd 1.11.2 → 1.12.1
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 +21 -0
- package/README.md +69 -51
- package/dist/{chunk-RMMXD4G5.js → chunk-V4HOLGFP.js} +2 -2
- package/dist/config.d.ts +10 -0
- package/dist/config.js +15 -5
- package/dist/plan-format.d.ts +11 -6
- package/dist/plan-format.js +8 -2
- package/docs/follow-dark.svg +2 -2
- package/docs/follow.svg +2 -2
- package/docs/workflow-dark.svg +56 -64
- package/docs/workflow.svg +56 -64
- package/herdr-plugin/herdr-plugin.toml +1 -1
- package/install.sh +1 -1
- package/kit/workflow/skills/implement/SKILL.md +1 -1
- package/kit/workflow/skills/orchestrate/SKILL.md +1 -1
- package/kit/workflow/skills/orchestrate/references/draft-review.md +4 -0
- package/kit/workflow/skills/orchestrate/references/events.md +8 -1
- package/kit/workflow/skills/plan/SKILL.md +2 -0
- package/package.json +2 -2
- package/schemas/jackherd.schema.json +18 -1
- package/src/config/link-kinds.ts +1 -1
- package/src/config/schema.ts +5 -2
- package/src/config/tones.ts +9 -2
- package/src/context/fill.ts +4 -10
- package/src/context/session-log.ts +108 -2
- package/src/plan-format/lanes.ts +10 -1
- package/src/plan-format/phases.ts +11 -3
- package/src/plan-format/progress.ts +4 -2
- package/src/plan-format/waiting.ts +12 -0
- package/src/plans/active-tasks.ts +31 -8
- package/src/plans/appointment-rows.ts +42 -53
- package/src/plans/board-rows.ts +14 -0
- package/src/plans/calendar-days.ts +29 -0
- package/src/plans/click-hint.ts +94 -0
- package/src/plans/command.ts +8 -9
- package/src/plans/current-phase.ts +22 -10
- package/src/plans/current-task.ts +18 -3
- package/src/plans/frame.ts +18 -26
- package/src/plans/git.ts +90 -31
- package/src/plans/groomed.ts +13 -7
- package/src/plans/lane-reason.ts +61 -0
- package/src/plans/lane-summary.ts +75 -24
- package/src/plans/layout-phase.ts +123 -76
- package/src/plans/layout-summary.ts +133 -83
- package/src/plans/layout.ts +451 -345
- package/src/plans/legend.ts +29 -0
- package/src/plans/link-chips.ts +26 -8
- package/src/plans/live.ts +238 -84
- package/src/plans/next-rows.ts +5 -37
- package/src/plans/phase-source.ts +8 -3
- package/src/plans/plan-chips.ts +6 -3
- package/src/plans/plan-heads.ts +1 -1
- package/src/plans/planned.ts +4 -1
- package/src/plans/process-slots.ts +36 -0
- package/src/plans/pull-requests.ts +9 -1
- package/src/plans/read-cache.ts +18 -3
- package/src/plans/refresh-pace.ts +13 -0
- package/src/plans/row-focus.ts +86 -15
- package/src/plans/selection.ts +124 -89
- package/src/plans/sent-files.ts +1 -1
- package/src/plans/settings.ts +5 -2
- package/src/plans/shimmer.ts +124 -0
- package/src/plans/signals-read.ts +38 -10
- package/src/plans/slice-gate.ts +51 -0
- package/src/plans/snapshot.ts +185 -84
- package/src/plans/source-asked.ts +1 -1
- package/src/plans/source-rows.ts +60 -18
- package/src/plans/sprint-html.ts +1 -1
- package/src/plans/status-pace.ts +45 -0
- package/src/plans/subagent-tasks.ts +1 -1
- package/src/plans/subagents-read.ts +61 -24
- package/src/plans/subagents.ts +2 -2
- package/src/plans/symbols.ts +4 -1
- package/src/plans/task-brief.ts +143 -0
- package/src/plans/texts.ts +181 -39
- package/src/plans/view.ts +198 -32
- package/src/plans/waiting-click.ts +54 -110
- package/src/plans/watch-burst.ts +25 -0
- package/src/plans/worktree-stamp.ts +35 -0
- package/src/plans/your-turn-rows.ts +102 -0
- package/src/plans/your-turn.ts +226 -0
- package/src/terminal/herdr.ts +25 -5
- package/src/terminal/restore.ts +44 -0
- package/src/terminal/text.ts +2 -2
- package/src/terminal/width.ts +9 -0
- package/src/vocabulary/index.ts +6 -5
- package/src/watch/command.ts +28 -2
- package/src/watch/lane-report.ts +2 -0
- package/src/watch/lane-rest.ts +7 -1
- package/src/watch/reference-paths.ts +1 -0
- package/src/watch/unlinked-artifacts-read.ts +43 -0
- package/src/watch/unlinked-artifacts.ts +76 -0
- package/src/watch/watch-events.ts +12 -0
- package/src/watch/watcher-lock.ts +47 -4
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,27 @@
|
|
|
2
2
|
|
|
3
3
|
What changed for people who use jackherd, newest first.
|
|
4
4
|
|
|
5
|
+
## 1.12.1
|
|
6
|
+
|
|
7
|
+
- **Fixes in the herd.** Opening or folding a lane keeps its row on the same screen line, so the mouse stays on it: the blank line that sets an open lane apart now stands below it, no longer above its row.
|
|
8
|
+
|
|
9
|
+
## 1.12.0
|
|
10
|
+
|
|
11
|
+
- **One "Your turn" block on top of the herd.** "Waiting for you", "Next" and "Appointments" are one block, one row per topic: a question (`?`, amber), a file or Artifact sent to you (`📎`) and an appointment (`◷`, teal), the time right-aligned in one column. What blocks a lane comes first, then the oldest; five rows show, then `▸ n more · k older than 7 days`, and appointments of the next seven days, three of them, then `▸ n later`. A topic that stood in two blocks stands once. The head keeps its count, how many rows block lanes and the age of the oldest, folded too; the block starts folded, and without anything open it reads `Your turn · nothing waits for you`. The buttons stand only at the selected row. Board sections and watcher messages keep their names.
|
|
12
|
+
- **"Unblocks" column on the board.** A board row that waits for you may name the lanes it frees in this optional column (`Gibt frei` in German); the herd shows `unblocks …` under the row and puts it first. The colour role `planned` in `plans.tones` (the key keeps its name) colours the appointments.
|
|
13
|
+
- **Sources as one line.** Folded, `▸ Sources` names per source its new entries or when it last ran, amber only for a new entry no row of Your turn asks about, red while it fails. Opened, the title column is capped so count and time stay in the pane; an entry no longer opens, a click opens its link. `↑ asked` is now `↑ in your turn`.
|
|
14
|
+
- **A "Lanes" block.** The lanes at work stand indented under `▾ Lanes · n` with their balance (`1 waits on you · 3 idle`), visible folded too. A lane line says its state, what a resting lane waits on (`waits on you · 1 question`, `waits on …`, `after …`, `idle · no reason`), its phase and count; the reason gives way before phase and count in a narrow pane. "planned" is now "Backlog", and Backlog and Waiting start folded.
|
|
15
|
+
- **A compact open lane.** Branch, model and idle time on one line; link chips in brackets on one line with `+n`; each phase it works on with its bar and at most four open tasks, the running one first, then `▸ n more open · k done`; `▸ next` and `▸ done` below. A phase whose run was merged and that the newest board row no longer names stands behind the others, not on top. Phase titles are bold, tasks plain, additions dim.
|
|
16
|
+
- **The running task stands in teal and shimmers.** `▶` is gone: a task an agent reported carries a teal `●`, one the herd only guesses a dim `◌`, and no triangle, which now always means a row that opens. The text of a reported task stands in teal with a light band running over it, like the shimmer in ChatGPT; `plans.shimmer: false`, `NO_COLOR` and `--once` keep it still, in teal.
|
|
17
|
+
- **The footer says what a click does.** On the row under the mouse or the arrows it names the action (`click or → opens search-ui · ? help`). One focus: the mouse takes over the selection and lets go of it on a line without a row, a row the arrows chose stays; after a refresh the row under the mouse is found again. `↑↓` walks every clickable row, the heads of Your turn and Sources included.
|
|
18
|
+
- **The help is a legend.** `?` shows sections (Keys, Lanes, Tasks, Your turn, Sources, Links, Colours) with one mark or key and its meaning per line; it scrolls, and `esc` closes it. The rules behind the marks are in the README's section on the herd. The `a` key is gone; a click on `▸ n done` lists the ticked tasks.
|
|
19
|
+
- **An opened task reads like a brief.** A click on a task opens that task only, never its whole phase with the done ones. It shows what the task asks, up to its first ` — `, one sentence per line behind a thin `│`, only whole sentences in at most five lines of at most 72 characters, the origin included (a first sentence longer than that ends in `…`); code in teal without backticks and a path without its leading `src/`; its origin in parentheses dim at the end. `▸ n more lines` opens the protocol, measurements and findings in the same form, running on from the brief, and then stands below the whole text; a long origin breaks onto dim lines of its own. The plan text stays as written.
|
|
20
|
+
- **Artifact chips carry `🔗`.** A link in parentheses becomes a chip too, and the watcher tells Jack once about an Artifact sent to you that no plan links.
|
|
21
|
+
- **Fixes in the herd.** A long source title no longer pushes count and time out of the pane; text never wraps one character per line; the refresh blocks the terminal far shorter and mouse moves are bundled, each frame drawn within synchronized output; `groomed` counts calendar days (`groomed yesterday`); appointments outside the current week show their date; a report that names a box in two phases puts its `●` in the running one; a folded lane shows a reported `now: …` below it as the open lane does, also while no phase runs.
|
|
22
|
+
- **A merged phase no longer runs from fresh ticks.** When the base branch already carries ticks of a phase the newest board row no longer names, ticks the lane adds later in its worktree neither put it on top nor make the herd guess a task in it; a task the lane reports brings it back.
|
|
23
|
+
- **The terminal comes back after a crash.** However the herd ends (`q`, a signal, a closed terminal, an error), it switches mouse reports and the alternate screen off, shows the cursor and leaves raw mode, once; a terminal that went away (`EIO` on its input) ends it quietly, without a stack trace.
|
|
24
|
+
- **A cheaper refresh.** Log lines read before are not parsed again, subagent directories are listed again only when they changed, a lane costs two git processes instead of three and pull request heads one for all, and the page key and the drawing skip work on text that did not change. `git status` of a worktree runs only when its index, its HEAD or its agent's log moved, or once a minute, and never rewrites the lane's index; a change made by hand without an agent shows within that minute. While a refresh changes nothing on the screen, the next one waits longer (5, 10, then 20 seconds); the first change brings it back to 5 seconds, and an edited plan file still shows at once; a burst of edits or fetches costs at most one refresh every 5 seconds, and the herd's own fetch asks for no refresh beyond the one at its end. The clock beside the board title is gone: it changed the screen every minute and kept the refresh from slowing down.
|
|
25
|
+
|
|
5
26
|
## 1.11.2
|
|
6
27
|
|
|
7
28
|
- **The README opens like a package page, not a pitch.** The headline is the package name, the first line says what Jack does ("Jack herds your coding agents"), the install command sits above the fold, and each of the six benefits is one line. The approval boundary is stated once and exactly: nothing is committed, pushed or merged without your approval, and Jack merges on green checks only where you said so, for one pull request or for a plan's pull requests for up to 24 hours. The old first benefit implied that approving a plan was enough for a merge; it is not.
|
package/README.md
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
<p>
|
|
2
|
-
<img alt="jackherd: a black and white Shih Tzu in a turquoise bandana, three lanes running from him to three agent nodes" src="https://unpkg.com/jackherd@1.
|
|
2
|
+
<img alt="jackherd: a black and white Shih Tzu in a turquoise bandana, three lanes running from him to three agent nodes" src="https://unpkg.com/jackherd@1.12.1/assets/branding/jackherd-logo-outline.svg" width="340">
|
|
3
3
|
<br>
|
|
4
4
|
</p>
|
|
5
5
|
|
|
6
|
-
[](https://www.npmjs.com/package/jackherd) [](https://www.npmjs.com/package/jackherd) [](https://www.npmjs.com/package/jackherd?activeTab=dependencies)<br><img width="1" height="8" alt="" src="https://unpkg.com/jackherd@1.
|
|
6
|
+
[](https://www.npmjs.com/package/jackherd) [](https://www.npmjs.com/package/jackherd) [](https://www.npmjs.com/package/jackherd?activeTab=dependencies)<br><img width="1" height="8" alt="" src="https://unpkg.com/jackherd@1.12.1/assets/icons/space.svg">
|
|
7
7
|
|
|
8
8
|
# Jack herds your coding agents.
|
|
9
9
|
|
|
@@ -15,25 +15,25 @@ For developers who'd rather decide than supervise.
|
|
|
15
15
|
curl -fsSL https://unpkg.com/jackherd/install.sh | sh
|
|
16
16
|
```
|
|
17
17
|
|
|
18
|
-
Then `/jh-start` in a repository, and Jack offers your first plan. → [Quickstart](#quickstart)<br><img width="1" height="8" alt="" src="https://unpkg.com/jackherd@1.
|
|
18
|
+
Then `/jh-start` in a repository, and Jack offers your first plan. → [Quickstart](#quickstart)<br><img width="1" height="8" alt="" src="https://unpkg.com/jackherd@1.12.1/assets/icons/space.svg">
|
|
19
19
|
|
|
20
20
|
<p>
|
|
21
|
-
<img src="https://unpkg.com/jackherd@1.
|
|
21
|
+
<img src="https://unpkg.com/jackherd@1.12.1/docs/workflow-dark.svg" width="720" alt="jackherd in herdr: a lane hits a question, Jack asks you as a choice, you pick, and the lane works on while the herd view counts its progress.">
|
|
22
22
|
<br>
|
|
23
|
-
<sub>Jack and his lanes in <a href="https://herdr.dev/">herdr</a>, a terminal for coding agents (recommended). Without it, one Claude Code session builds with subagents.</sub><br><img width="1" height="8" alt="" src="https://unpkg.com/jackherd@1.
|
|
23
|
+
<sub>Jack and his lanes in <a href="https://herdr.dev/">herdr</a>, a terminal for coding agents (recommended). Without it, one Claude Code session builds with subagents.</sub><br><img width="1" height="8" alt="" src="https://unpkg.com/jackherd@1.12.1/assets/icons/space.svg">
|
|
24
24
|
</p>
|
|
25
25
|
|
|
26
|
-
<p><img src="https://unpkg.com/jackherd@1.
|
|
26
|
+
<p><img src="https://unpkg.com/jackherd@1.12.1/assets/icons/lanes.svg" width="24" height="34" align="middle" alt=""> <b>Parallel where it pays.</b><br>Phases that don't collide run side by side, each lane on its own branch and worktree. Jack keeps the merge order and has the others rebase.</p>
|
|
27
27
|
|
|
28
|
-
<p><img src="https://unpkg.com/jackherd@1.
|
|
28
|
+
<p><img src="https://unpkg.com/jackherd@1.12.1/assets/icons/bark.svg" width="24" height="34" align="middle" alt=""> <b>Jack barks.</b><br>A blocked lane, a red check, a review comment: Jack wakes, and the herd view shows where every lane stands.</p>
|
|
29
29
|
|
|
30
|
-
<p><img src="https://unpkg.com/jackherd@1.
|
|
30
|
+
<p><img src="https://unpkg.com/jackherd@1.12.1/assets/icons/ear.svg" width="24" height="34" align="middle" alt=""> <b>Jack listens.</b><br>Review comments go to the lane that fixes them, with a test. <code>/jh-follow</code> brings anything with a CLI or an API into the herd: tickets, error logs, status pages, deploys, and whatever else you point it at.</p>
|
|
31
31
|
|
|
32
|
-
<p><img src="https://unpkg.com/jackherd@1.
|
|
32
|
+
<p><img src="https://unpkg.com/jackherd@1.12.1/assets/icons/bowl.svg" width="24" height="34" align="middle" alt=""> <b>Picks up where you left off.</b><br>Plan and board hold the state, not the chat.</p>
|
|
33
33
|
|
|
34
|
-
<p><img src="https://unpkg.com/jackherd@1.
|
|
34
|
+
<p><img src="https://unpkg.com/jackherd@1.12.1/assets/icons/plan.svg" width="24" height="34" align="middle" alt=""> <b>Lives in your repository.</b><br>Plans, board and every decision are Markdown, reviewed like code. <code>jh init</code> gives your team the same setup.</p>
|
|
35
35
|
|
|
36
|
-
<p><img src="https://unpkg.com/jackherd@1.
|
|
36
|
+
<p><img src="https://unpkg.com/jackherd@1.12.1/assets/icons/decide.svg" width="24" height="34" align="middle" alt=""> <b>You make the calls.</b><br>Nothing is committed, pushed or merged without your approval. Jack merges on green checks only where you said so: one pull request, or a plan's for up to 24 hours.<br><img width="1" height="8" alt="" src="https://unpkg.com/jackherd@1.12.1/assets/icons/space.svg"></p>
|
|
37
37
|
|
|
38
38
|
## Quickstart
|
|
39
39
|
|
|
@@ -69,22 +69,22 @@ Then `/jh-start` in a repository, and Jack offers your first plan. → [Quicksta
|
|
|
69
69
|
/jh-orchestrate docs/plans/board-<name>/board.md
|
|
70
70
|
```
|
|
71
71
|
|
|
72
|
-
By hand (Bun 1.3+): `bun add -g jackherd` or `npm install -g jackherd`, then `jh init --global` for yourself, or `jh init` in a repository to give your team the same skills and guard hooks. → [INSTALL.md](https://unpkg.com/jackherd/INSTALL.md)
|
|
72
|
+
By hand (Bun 1.3+): `bun add -g jackherd` or `npm install -g jackherd`, then `jh init --global` for yourself, or `jh init` in a repository to give your team the same skills and guard hooks. → [INSTALL.md](https://unpkg.com/jackherd/INSTALL.md)<br><img width="1" height="8" alt="" src="https://unpkg.com/jackherd@1.12.1/assets/icons/space.svg">
|
|
73
73
|
|
|
74
74
|
## Follow anything outside GitHub
|
|
75
75
|
|
|
76
76
|
Whatever you check by hand, Jack can watch: tickets, error logs, status pages, deploys. One `/jh-follow`, one yes, and every change comes to you like this:
|
|
77
77
|
|
|
78
|
-
<img src="https://unpkg.com/jackherd@1.
|
|
78
|
+
<img src="https://unpkg.com/jackherd@1.12.1/docs/follow-dark.svg" width="720" alt="A source (ticket, error log or status page) has a new or changed entry; jh watch reports it to Jack; Jack puts a row into Your turn, prefixed with the source's label; its [ask] button makes Jack ask you, and then a lane works it.">
|
|
79
79
|
|
|
80
|
-
The herd
|
|
80
|
+
The herd sums up your sources in one `Sources` line: per source its new entries, or when it last ran, red while it fails; opened, a click on an entry opens it. A ticket shows on the lane that works it, and a row in Your turn that came from a source starts with that source's label.<br><img width="1" height="8" alt="" src="https://unpkg.com/jackherd@1.12.1/assets/icons/space.svg">
|
|
81
81
|
|
|
82
82
|
## In detail
|
|
83
83
|
|
|
84
84
|
<details>
|
|
85
85
|
<summary><b>What Jack does on his own, and what waits for you</b></summary>
|
|
86
86
|
|
|
87
|
-
<img src="https://unpkg.com/jackherd@1.
|
|
87
|
+
<img src="https://unpkg.com/jackherd@1.12.1/docs/lanes-dark.svg" alt="Jack prompts two lanes and asks you for decisions and approvals; the lanes send questions back as text; jh watch reads lane state, pull requests and checks and wakes Jack.">
|
|
88
88
|
|
|
89
89
|
| On his own | After your approval | Never |
|
|
90
90
|
| --- | --- | --- |
|
|
@@ -117,7 +117,7 @@ The guards catch mistakes, not intent; for that, use branch protection. The hook
|
|
|
117
117
|
|
|
118
118
|
A **plan** is Markdown with phases, checkbox tasks, a model and a review gate per phase. A **board** lists the lanes of one or more plans: which phases each lane builds, on which model, after what. A **lane** is one agent session in its own git worktree (a second checkout of your repository), and **Jack** is the session in the main checkout that runs `/jh-orchestrate` on a board.
|
|
119
119
|
|
|
120
|
-
<img src="https://unpkg.com/jackherd@1.
|
|
120
|
+
<img src="https://unpkg.com/jackherd@1.12.1/docs/skills-dark.svg" alt="/jh-grill hands decisions to /jh-plan; /jh-plan feeds /jh-orchestrate or a single /jh-implement; /jh-implement ends in /jh-pre-commit, which runs the reviewers; /jh-diagnose hands a red command to /jh-implement.">
|
|
121
121
|
|
|
122
122
|
| Skill | Does |
|
|
123
123
|
| --- | --- |
|
|
@@ -135,9 +135,58 @@ The global install names the skills with a `jh-` prefix; a project install uses
|
|
|
135
135
|
</details>
|
|
136
136
|
|
|
137
137
|
<details>
|
|
138
|
-
<summary><b>
|
|
138
|
+
<summary><b>The herd view</b></summary>
|
|
139
139
|
|
|
140
|
-
|
|
140
|
+
`jh herd` shows every lane of a board: plan progress, pull request and checks, and with herdr agent state and context fill. It changes nothing in your repository.
|
|
141
|
+
|
|
142
|
+
It has five blocks, top down. **Your turn** holds everything that waits on you, one row per topic: a question of the board or of a session's dialog (`?`, amber), a file or Artifact sent to you (`📎`, not the `🔗` chip of a plan's link) and an appointment (`◷`, teal). **Sources** is one line for your sources outside GitHub. **Lanes** shows the lanes at work, **Waiting** the lanes not started yet, and **Backlog** the plans no lane works on. A block with `▸` opens on a click; `?` shows every mark and key.
|
|
143
|
+
|
|
144
|
+
```text
|
|
145
|
+
🐾 Board 01 groomed today
|
|
146
|
+
▾ Your turn · 3 1 blocks lanes · oldest 2 h ───────────────────────────
|
|
147
|
+
? Ship the fee change before Friday? since 09:40
|
|
148
|
+
unblocks checkout-fee
|
|
149
|
+
📎 search-box-mockup.html since 11:02
|
|
150
|
+
◷ Release 1.4 to production Mo 09:00
|
|
151
|
+
|
|
152
|
+
▸ Sources sentry-errors 3 entries, 1 new · status-page 20 min ago
|
|
153
|
+
|
|
154
|
+
▾ Lanes · 3 1 waits on you · 1 idle ───────────────────────────────────
|
|
155
|
+
▾ ◆ search-ui blocked ██████░░░░ 6/9
|
|
156
|
+
|
|
157
|
+
⎇ feat/search-ui ↑1 ±4 · Opus 5.5 🥣 62 %
|
|
158
|
+
[📄 Plan] [📡 PROJ-123 · In Progress] [🔗 Mockup] +1
|
|
159
|
+
|
|
160
|
+
P3 Docs · 4 min ago · gate ████████░░ 2/3
|
|
161
|
+
● Review gate
|
|
162
|
+
▸ 2 done
|
|
163
|
+
|
|
164
|
+
▸ next P4
|
|
165
|
+
▸ done P2
|
|
166
|
+
|
|
167
|
+
▸ ○ checkout-fee waits on you · 1 question ↗ #42 💬 2 P2 6/6
|
|
168
|
+
▸ ● search-index ████████░░ 4/5
|
|
169
|
+
● Rebuild the index on deploy
|
|
170
|
+
|
|
171
|
+
▸ Waiting · 1 docs-site
|
|
172
|
+
|
|
173
|
+
▸ Backlog · 4 next: Billing P1, Onboarding P3
|
|
174
|
+
────────────────────────────────────────────────────────────────────────
|
|
175
|
+
↑↓ select →← open s html q quit ? help
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
How the herd reads the board:
|
|
179
|
+
|
|
180
|
+
- **Your turn** takes its rows from the board's open questions, the questions a session left in its dialog, the files and Artifacts sent to you, the board's appointments and its next section. What blocks a lane comes first, then the oldest; five rows show, then `▸ n more · k older than 7 days`. Appointments show for the next seven days, three of them, then `▸ n later`. `unblocks …` under a row names the lanes it frees (the board's Unblocks column). The head keeps the count, how many rows block lanes and the age of the oldest, folded too. At the selected row, `[ask]` asks Jack to put the question to you, `[done]` closes the row, `[run]` asks Jack to run an appointment now and `[move]` to ask you for a new time; enter never presses `[done]`. A row goes once its board row is closed or after `jh waiting close <id>`.
|
|
181
|
+
- **Sources** shows, per source that is no ticket, its entries and how many are new, or when it last ran: amber with a new entry that is not in Your turn yet, red while it fails. Opened, a click on an entry opens it; `↑ in your turn` marks one a row of Your turn asks about.
|
|
182
|
+
- **Lanes** opens at the start. A lane that works or is blocked opens by itself only when it first appears; after that, opening and folding are yours. A lane symbol says the state (`●` working, `◆` blocked, `◉` the agent finished its answer, `○` idle, `(·) no agent` a worktree nobody works in); only blocked wears its word. A resting lane names what it waits on: `waits on you` with the open questions of its report, `waits on` a row of Your turn, `after` its board row's starts-after cell, or `idle · no reason`.
|
|
183
|
+
- **Waiting** lists the lanes not started yet: no worktree yet, something left to do, and what each starts after; it starts folded. Finished lanes (cleaned up, or every phase they name ticked) are not shown.
|
|
184
|
+
- **An open lane** shows, top down: its branch, the model and how long it idles; its link chips on one line, `+n` for the rest; its pull requests; the phases it works on, each with its bar and its first four open tasks, the running ones first, `▸ n more open · k done` to list them all; `▸ next` with the phases that wait, as ranges; `▸ done` with the finished ones. A lane shows only the phases its board rows name; a lane without a worktree reads its plan from the main checkout. A folded lane line names the phase moved last, `+n` more active ones and its count, and a reported task below it.
|
|
185
|
+
- **A phase runs** when an agent reports working on it, one of its boxes was ticked in the last 20 minutes, or some of its tasks are ticked. A phase whose run was merged and that the lane's newest board row no longer names waits behind the others in `▸ next`, its open boxes left open on purpose. `n min ago` counts since the last tick or report; `· gate` means only the review gate is open, `docs open` only the documentation box.
|
|
186
|
+
- **A running task** carries `●` when an agent reported it, from its task list or `jh task`; its text stands in teal and a light band runs over it (`plans.shimmer: false`, `NO_COLOR` and `--once` keep it still). `◌` in dim is only guessed from the words of the lane's log. `now: …` is a reported task no plan task names, `Subagent: …` a running subagent on no phase; a running review sits on the gate box that names it, in the phase it names or else the lane's current one. With several agents in a lane, each task carries its agent's name, dim, at the right edge.
|
|
187
|
+
- **Counts and colours:** the bar is the progress over the lane's plans; `n/m` counts checkboxes, `n/m ph` finished phases, green when all are ticked; `–` is a phase without checkboxes, `?` one not in the plan. `🥣` is the share of the context window used, on a folded lane only once it warns. `Sonnet ≠ Opus` in amber says a phase's subagent ran on another model than the plan's. `stale?` in Backlog marks a plan file unchanged on the base branch for 14 days.
|
|
188
|
+
- **Chips:** `🔗` an Artifact, `⑂` a pull request or issue, `◈` Figma, `📡` a ticket with its status (`📡 n` in amber on a folded lane when tickets are new), `private` where the plan says so. After the lane: `↗` a pull request with its checks, `💬` new feedback, `✋` changes requested, `🌐` a preview. ctrl+click opens a chip's link.
|
|
189
|
+
- **Mouse and keys:** `▸` `▾` marks a row that opens and folds, and only such a row has one; it turns teal under the mouse or the arrows. `❯` and a light background mark the row under the mouse or the arrows; the mark leaves with the mouse, while a row the arrows chose keeps it; the footer says what a click or a key does there. A click or enter on a task opens it and nothing else: what it asks, up to its first ` — `, one sentence per line behind a thin `│`, only whole sentences in at most five lines, code in teal and the origin dim at the end; `▸ n more lines` opens the rest. Buttons in square brackets do something, bold under the mouse. `s` opens every lane and plan as one HTML page.
|
|
141
190
|
|
|
142
191
|
</details>
|
|
143
192
|
|
|
@@ -151,40 +200,9 @@ Jack doesn't watch the terminals himself. `jh watch`, which he starts, wakes him
|
|
|
151
200
|
</details>
|
|
152
201
|
|
|
153
202
|
<details>
|
|
154
|
-
<summary><b>
|
|
155
|
-
|
|
156
|
-
`jh herd` shows every lane of a board: plan progress, pull request and checks, and with herdr agent state and context fill. It changes nothing in your repository.
|
|
157
|
-
|
|
158
|
-
On top, **Waiting for you** lists what needs your answer: a file or Artifact sent to you (`📎`) and open questions from the board or a session's dialog (`?`). **Appointments** below it shows the dated rows of the board's appointments section. A click folds either block.
|
|
203
|
+
<summary><b>Which model runs each phase</b></summary>
|
|
159
204
|
|
|
160
|
-
|
|
161
|
-
🐾 Board 01 11:38
|
|
162
|
-
▾ Waiting for you · 2 ──────────────────────────────────────────────────────────
|
|
163
|
-
▌ 📎 search-box-mockup.html
|
|
164
|
-
▌ ? Ship the fee change before Friday? [ask]
|
|
165
|
-
▾ Appointments · 1 ─────────────────────────────────────────────────────────────
|
|
166
|
-
▌ ◷ Mo 09:00 Release 1.4 to production
|
|
167
|
-
────────────────────────────────────────────────────────────────────────────────
|
|
168
|
-
▾ ◆ search-ui blocked ██████░░░░ 6/9
|
|
169
|
-
├─ Search box docs ⎇ feat/search-ui ↑1 ±4 🥣 62 %
|
|
170
|
-
├─ 📄 Plan 📡 PROJ-123 · In Progress ✦ Mockup ◈ Search box
|
|
171
|
-
├─ P3 Docs · 4 min ago · gate 2/3
|
|
172
|
-
│ ▶ Review gate
|
|
173
|
-
├─ next P4
|
|
174
|
-
└─ ✓ P2
|
|
175
|
-
────────────────────────────────────────────────────────────────────────────────
|
|
176
|
-
▸ ◉ checkout-fee ↗ #42 💬 2 ██████████ 6/6
|
|
177
|
-
────────────────────────────────────────────────────────────────────────────────
|
|
178
|
-
▾ ● search-index ████████░░ 4/5
|
|
179
|
-
├─ Search index ⎇ feat/search-index ↑3 ±2 🥣 34 %
|
|
180
|
-
├─ ↗ #41 … checks 🌐 preview 💬 1 new Search index
|
|
181
|
-
└─ P1 Index · just now 4/5
|
|
182
|
-
▶ /jh-uncle-bob
|
|
183
|
-
────────────────────────────────────────────────────────────────────────────────
|
|
184
|
-
· no agent (1) docs-site 1/3
|
|
185
|
-
────────────────────────────────────────────────────────────────────────────────
|
|
186
|
-
↑↓ select →← open a/click ticked tasks s html q quit ? help
|
|
187
|
-
```
|
|
205
|
+
Each phase in the plan names its model: the planning model (Opus by default) where a mistake is expensive, such as data, security or a migration, and the cheaper implementation model (Sonnet by default) for everything else. `/jh-implement` and Jack start each phase on its model. In a project install, a hook stops a phase's subagent started on a weaker one, and the watcher tells Jack about a lane that runs on one. Set the models per role under `models` in the config.
|
|
188
206
|
|
|
189
207
|
</details>
|
|
190
208
|
|
|
@@ -58,13 +58,13 @@ var NEXT_VOCABULARY = {
|
|
|
58
58
|
var WAITING_VOCABULARY = {
|
|
59
59
|
[PLAN_LANGUAGE.de]: {
|
|
60
60
|
heading: "Wartet auf dich",
|
|
61
|
-
columns: { since: "Seit", item: "Punkt", origin: "Herkunft", status: "Stand" },
|
|
61
|
+
columns: { since: "Seit", item: "Punkt", origin: "Herkunft", unblocks: "Gibt frei", status: "Stand" },
|
|
62
62
|
statusAlso: ["Status"],
|
|
63
63
|
open: ["offen"]
|
|
64
64
|
},
|
|
65
65
|
[PLAN_LANGUAGE.en]: {
|
|
66
66
|
heading: "Waiting for you",
|
|
67
|
-
columns: { since: "Since", item: "Item", origin: "Origin", status: "Status" },
|
|
67
|
+
columns: { since: "Since", item: "Item", origin: "Origin", unblocks: "Unblocks", status: "Status" },
|
|
68
68
|
statusAlso: [],
|
|
69
69
|
open: ["open"]
|
|
70
70
|
}
|
package/dist/config.d.ts
CHANGED
|
@@ -106,6 +106,7 @@ declare const jackherdConfigSchema: z.ZodObject<{
|
|
|
106
106
|
}, z.core.$strict>>;
|
|
107
107
|
plans: z.ZodPrefault<z.ZodObject<{
|
|
108
108
|
fetchIntervalMinutes: z.ZodDefault<z.ZodNumber>;
|
|
109
|
+
shimmer: z.ZodDefault<z.ZodBoolean>;
|
|
109
110
|
linkKinds: z.ZodDefault<z.ZodArray<z.ZodObject<{
|
|
110
111
|
pattern: z.ZodString;
|
|
111
112
|
label: z.ZodString;
|
|
@@ -131,6 +132,15 @@ declare const jackherdConfigSchema: z.ZodObject<{
|
|
|
131
132
|
blue: "blue";
|
|
132
133
|
magenta: "magenta";
|
|
133
134
|
}>>;
|
|
135
|
+
planned: z.ZodDefault<z.ZodEnum<{
|
|
136
|
+
amber: "amber";
|
|
137
|
+
teal: "teal";
|
|
138
|
+
grey: "grey";
|
|
139
|
+
red: "red";
|
|
140
|
+
green: "green";
|
|
141
|
+
blue: "blue";
|
|
142
|
+
magenta: "magenta";
|
|
143
|
+
}>>;
|
|
134
144
|
new: z.ZodDefault<z.ZodEnum<{
|
|
135
145
|
amber: "amber";
|
|
136
146
|
teal: "teal";
|
package/dist/config.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
PLAN_LANGUAGE,
|
|
3
3
|
RESPONSE_ADDRESS
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-V4HOLGFP.js";
|
|
5
5
|
|
|
6
6
|
// src/config/json-schema.ts
|
|
7
7
|
import { z as z3 } from "zod";
|
|
@@ -200,7 +200,7 @@ var windowDays = (since, until) => Math.round((Date.parse(`${until}T00:00:00Z`)
|
|
|
200
200
|
var ARTIFACT_LINK_KIND = {
|
|
201
201
|
pattern: "^https://claude\\.ai/(code/)?artifact/",
|
|
202
202
|
label: "Artifact",
|
|
203
|
-
icon: "\
|
|
203
|
+
icon: "\u{1F517}"
|
|
204
204
|
};
|
|
205
205
|
var DEFAULT_LINK_KINDS = [
|
|
206
206
|
{ pattern: "^https://github\\.com/[^/]+/[^/]+/(pull|issues)/\\d+", label: "GitHub", icon: "\u2442" },
|
|
@@ -286,9 +286,16 @@ var TONE = {
|
|
|
286
286
|
magenta: "magenta"
|
|
287
287
|
};
|
|
288
288
|
var TONE_NAMES = Object.values(TONE);
|
|
289
|
-
var TONE_ROLE = {
|
|
289
|
+
var TONE_ROLE = {
|
|
290
|
+
waiting: "waiting",
|
|
291
|
+
planned: "planned",
|
|
292
|
+
new: "new",
|
|
293
|
+
running: "running",
|
|
294
|
+
resting: "resting"
|
|
295
|
+
};
|
|
290
296
|
var DEFAULT_TONES = {
|
|
291
297
|
[TONE_ROLE.waiting]: TONE.amber,
|
|
298
|
+
[TONE_ROLE.planned]: TONE.teal,
|
|
292
299
|
[TONE_ROLE.new]: TONE.amber,
|
|
293
300
|
[TONE_ROLE.running]: TONE.teal,
|
|
294
301
|
[TONE_ROLE.resting]: TONE.grey
|
|
@@ -429,7 +436,7 @@ var sourceSchema = z2.strictObject({
|
|
|
429
436
|
ignoreAuthors: z2.array(z2.string().min(1)).default([]),
|
|
430
437
|
/** The most new or changed entries one report shows of this source; the rest is one line `+<n> more`. */
|
|
431
438
|
reportLimit: z2.number().int().min(1).default(5),
|
|
432
|
-
/** Shown before a row of "
|
|
439
|
+
/** Shown before a row of "Your turn" that came from this source (`Error log · Checkout: …`); without it the source's name. */
|
|
433
440
|
label: z2.string().min(1).max(40).regex(/^[^\r\n]+$/, "one line").optional(),
|
|
434
441
|
/** The lane the source's reports name. */
|
|
435
442
|
lane: z2.string().min(1).optional(),
|
|
@@ -541,6 +548,7 @@ var hintsSchema = z2.strictObject({
|
|
|
541
548
|
var DEFAULT_TASK_SIGNAL_MINUTES = 10;
|
|
542
549
|
var tonesSchema = z2.strictObject({
|
|
543
550
|
waiting: toneName.default(DEFAULT_TONES.waiting),
|
|
551
|
+
planned: toneName.default(DEFAULT_TONES.planned),
|
|
544
552
|
new: toneName.default(DEFAULT_TONES.new),
|
|
545
553
|
running: toneName.default(DEFAULT_TONES.running),
|
|
546
554
|
resting: toneName.default(DEFAULT_TONES.resting)
|
|
@@ -606,6 +614,8 @@ var jackherdConfigSchema = z2.strictObject({
|
|
|
606
614
|
plans: z2.strictObject({
|
|
607
615
|
/** Minutes between background fetches of the base branch while `jh herd` runs; 0 turns them off. */
|
|
608
616
|
fetchIntervalMinutes: z2.number().min(0).default(5),
|
|
617
|
+
/** The running task of a folded lane shimmers in `jh herd`; `false` keeps it still. `NO_COLOR` keeps it still too. */
|
|
618
|
+
shimmer: z2.boolean().default(true),
|
|
609
619
|
/** Links in a plan that the sprint page shows as chips; the list replaces the built-in kinds. */
|
|
610
620
|
linkKinds: z2.array(
|
|
611
621
|
z2.strictObject({
|
|
@@ -615,7 +625,7 @@ var jackherdConfigSchema = z2.strictObject({
|
|
|
615
625
|
})
|
|
616
626
|
).default(DEFAULT_LINK_KINDS.map((kind) => ({ ...kind }))),
|
|
617
627
|
context: contextSchema.prefault({}),
|
|
618
|
-
/** The colour of each role in the herd, by name: what waits for you, what is new, what runs, what rests. */
|
|
628
|
+
/** The colour of each role in the herd, by name: what waits for you, what is planned for you, what is new, what runs, what rests. */
|
|
619
629
|
tones: tonesSchema.prefault({})
|
|
620
630
|
}).prefault({}),
|
|
621
631
|
/**
|
package/dist/plan-format.d.ts
CHANGED
|
@@ -73,8 +73,9 @@ declare const NEXT_VOCABULARY: Record<PlanLanguage, {
|
|
|
73
73
|
}>;
|
|
74
74
|
/**
|
|
75
75
|
* The board section of what waits on the user's answer (a sent preview, an open question, a report to accept): its
|
|
76
|
-
* heading, the header names of its columns (since, item, origin, status, found by name in any order;
|
|
77
|
-
* column may also carry a name of `statusAlso`) and the lower-case words a status
|
|
76
|
+
* heading, the header names of its columns (since, item, origin, unblocks, status, found by name in any order; origin
|
|
77
|
+
* and unblocks are optional, the status column may also carry a name of `statusAlso`) and the lower-case words a status
|
|
78
|
+
* cell of a still open item starts with.
|
|
78
79
|
*/
|
|
79
80
|
declare const WAITING_VOCABULARY: Record<PlanLanguage, {
|
|
80
81
|
heading: string;
|
|
@@ -82,6 +83,7 @@ declare const WAITING_VOCABULARY: Record<PlanLanguage, {
|
|
|
82
83
|
since: string;
|
|
83
84
|
item: string;
|
|
84
85
|
origin: string;
|
|
86
|
+
unblocks: string;
|
|
85
87
|
status: string;
|
|
86
88
|
};
|
|
87
89
|
statusAlso: readonly string[];
|
|
@@ -198,8 +200,9 @@ type MisplacedDeferral = {
|
|
|
198
200
|
corrected: string;
|
|
199
201
|
};
|
|
200
202
|
/**
|
|
201
|
-
* `touched` is set by the phase source when the worktree's ticks differ from the base branch's
|
|
202
|
-
* the
|
|
203
|
+
* `touched` is set by the phase source when the worktree's ticks differ from the base branch's, `merged` beside it
|
|
204
|
+
* when the base branch already carries a tick of the phase: a run of it was merged. `deferred` holds the checkboxes
|
|
205
|
+
* moved to another phase; they are not among `items`, so they count neither as open nor as done.
|
|
203
206
|
*/
|
|
204
207
|
type PlanPhase = {
|
|
205
208
|
id: string;
|
|
@@ -207,6 +210,7 @@ type PlanPhase = {
|
|
|
207
210
|
items: ChecklistItem[];
|
|
208
211
|
deferred?: DeferredItem[];
|
|
209
212
|
touched?: true;
|
|
213
|
+
merged?: true;
|
|
210
214
|
};
|
|
211
215
|
/** A phase heading with its 1-based line, the lower-case id and the title. */
|
|
212
216
|
type PhaseHeading = {
|
|
@@ -451,8 +455,8 @@ declare const mergedPhasesWithOpenBoxes: (markdown: string, base: string, langua
|
|
|
451
455
|
declare const boardRowsWithoutPhase: (markdown: string, language: PlanLanguage, previousLines: ReadonlySet<string>) => RowWithoutPhase[];
|
|
452
456
|
|
|
453
457
|
/**
|
|
454
|
-
* `title` is null when the sprint names a phase the plan does not have; `touched` and `deferred` carry the
|
|
455
|
-
* phase's own, and the deferred checkboxes are in neither `done` nor `total`.
|
|
458
|
+
* `title` is null when the sprint names a phase the plan does not have; `touched`, `merged` and `deferred` carry the
|
|
459
|
+
* plan phase's own, and the deferred checkboxes are in neither `done` nor `total`.
|
|
456
460
|
*/
|
|
457
461
|
type PhaseProgress = {
|
|
458
462
|
id: string;
|
|
@@ -462,6 +466,7 @@ type PhaseProgress = {
|
|
|
462
466
|
items: ChecklistItem[];
|
|
463
467
|
deferred?: DeferredItem[];
|
|
464
468
|
touched?: true;
|
|
469
|
+
merged?: true;
|
|
465
470
|
};
|
|
466
471
|
type StepProgress = {
|
|
467
472
|
step: PlanStep;
|
package/dist/plan-format.js
CHANGED
|
@@ -16,7 +16,7 @@ import {
|
|
|
16
16
|
isPlanLanguage,
|
|
17
17
|
phaseHeading,
|
|
18
18
|
sectionHeading
|
|
19
|
-
} from "./chunk-
|
|
19
|
+
} from "./chunk-V4HOLGFP.js";
|
|
20
20
|
|
|
21
21
|
// src/plan-format/lanes.ts
|
|
22
22
|
import { posix } from "path";
|
|
@@ -126,13 +126,18 @@ var leadingIds = (clause, leading, patterns) => {
|
|
|
126
126
|
const spanned = spannedPhaseIds(Number(first), Number(end[1]));
|
|
127
127
|
return spanned.length > 0 ? spanned : [first];
|
|
128
128
|
};
|
|
129
|
+
var parenthesisChange = (clause) => (clause.match(/\(/g)?.length ?? 0) - (clause.match(/\)/g)?.length ?? 0);
|
|
129
130
|
var phaseIdsOf = (cell, patterns) => {
|
|
130
131
|
const parts = cell.split(CLAUSE_SEPARATOR);
|
|
131
132
|
const ids = [];
|
|
132
133
|
let listRunning = false;
|
|
134
|
+
let depth = 0;
|
|
133
135
|
for (let index = 0; index < parts.length; index += 2) {
|
|
134
136
|
const separator = index > 0 ? parts[index - 1] : null;
|
|
135
137
|
const clause = parts[index];
|
|
138
|
+
const inParenthesis = depth > 0;
|
|
139
|
+
depth = Math.max(depth + parenthesisChange(clause), 0);
|
|
140
|
+
if (inParenthesis) continue;
|
|
136
141
|
const entryStart = separator === null || ENTRY_END.has(separator);
|
|
137
142
|
if (entryStart) listRunning = false;
|
|
138
143
|
const leading = clause.match(patterns.leading);
|
|
@@ -386,7 +391,8 @@ var phaseProgress = (phases, id) => {
|
|
|
386
391
|
total: items.length,
|
|
387
392
|
items,
|
|
388
393
|
...phase?.deferred ? { deferred: phase.deferred } : {},
|
|
389
|
-
...phase?.touched ? { touched: true } : {}
|
|
394
|
+
...phase?.touched ? { touched: true } : {},
|
|
395
|
+
...phase?.merged ? { merged: true } : {}
|
|
390
396
|
};
|
|
391
397
|
};
|
|
392
398
|
var isPhaseFinished = ({ items }) => items.length > 0 && items.every(({ done }) => done);
|
package/docs/follow-dark.svg
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
<svg xmlns="http://www.w3.org/2000/svg" width="960" height="372" viewBox="0 0 960 372" role="img" aria-labelledby="t d"><title id="t">How a source reaches you</title><desc id="d">A source (a ticket, an error log or a status page) has a new or changed entry. jh watch reads it and reports it to Jack, who puts a row
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="960" height="372" viewBox="0 0 960 372" role="img" aria-labelledby="t d"><title id="t">How a source reaches you</title><desc id="d">A source (a ticket, an error log or a status page) has a new or changed entry. jh watch reads it and reports it to Jack, who puts a row on the board that the herd shows in Your turn; the row starts with the source's label, for example Error log, Checkout. The [ask] button on the row makes Jack ask you about it, and once you have answered, a lane works it.</desc><defs><style>.s{font-family:ui-sans-serif, system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif}.m{font-family:ui-monospace, SFMono-Regular, Menlo, Consolas, 'Liberation Mono', monospace}</style><clipPath id="jack-clip"><rect width="240" height="240" rx="50"/></clipPath><symbol id="jack" viewBox="0 0 240 240"><rect width="240" height="240" rx="50" fill="#212E34"/><g clip-path="url(#jack-clip)"><g transform="translate(34 8)"><path fill="#4A4E51" d="M80 50.5c.2 .1 .2 .1 1 1c-.2 .6-.3 1.3-.5 2c-.7 .4-.7 .4-4 2c-6 3.3-6 3.3-7 6.5c1.2-.4 2.3-.6 3.5-1c.8 0 1.7 0 2.5 0c.2 .1 .2 .1 1 1c-.5 2-.5 2-5.5 6.5c-3 5-3 5-5.5 11c.2 .3 .2 .3 1 2c.2 .3 .3 .7 .5 1c-.7 .7-1.3 1.3-2 2c-1.3-.2-2.6-.3-4-.5c0-1.2 0-2.3 0-3.5c-.2 .1-.2 .1-1.5 .5c-1.2 2.7-2.4 5.3-3.5 8c-1 2.1-2 4.2-3 6.3c-2.5 5.7-2.5 5.7-3 8.2c.5 0 1 0 1.5 0c.1-.8 .4-1.7 .5-2.5c.6 0 1.3 0 2 0c.5 2 1 3.9 1.6 6c1 4 2.2 8 3.4 11.9c2.1 8.4 1.1 15.5-3 23.1c-.6-.2-1.3-.3-2-.5c-.1-1.5-.3-3-.5-4.6c-.3-2.6-.5-5.2-1-7.9c-.5 0-1 0-1.5 0c-.1 1.7-.4 3.3-.5 5c-2.7 10.2-2.7 10.2-6 13.5c-6.1-3.1-9-14.9-11-21c-1.1-8.2 .9-14.7 3.5-22.5c-8.4 8.3-8.3 20.5-9 31.5c-.6-.2-1.3-.3-2-.5c-5.4-8.9-5.1-15-3-25c.5-1 1-2 1.5-3c-3 1.5-3 1.5-6.5 5c-.4 0-.6 0-1 0c.8-6.5 3.2-10.2 7.5-15c.6-.8 .6-.8 3.5-5c2.6-2.6 5.2-5.1 8-7.5c.6-.6 .6-.6 3.5-3.5c-.5-2-.5-2-1-3.5c3.6-6 6.5-9.2 12.5-13c.4-.6 .6-1.3 1-2c-.5-.6-1-1.3-1.5-2c2-3 2-3 4.5-4.5c.5 1 .5 1 1 3.5c2.5-1 2.5-1 8.5-5.5c.3 0 .7 0 1 0c-.1-.4-.1-.4-.5-2.5c4.3-3.3 10-2.5 15-1zM153 69.5c1.2 .2 2.3 .3 3.5 .5c.3 .7 .7 1.3 1 2c.3 0 .7 0 1 0c.5 1.2 1 2.3 1.5 3.5c3.4 7.6 6.2 13.7 12.2 19.6c3.3 3.4 3.3 3.4 3.8 5.9c-.2 .2-.3 .3-.5 .5c.1 .7 .1 .7 .5 4.5c-.5 .3-1 .7-1.5 1c-.8-.3-1.7-.7-2.5-1c.3 .7 .7 1.3 1 2c1.2 5.8 1.4 10 1 16c-.7 0-1.3 0-2 0c-.4-1.3-.8-2.7-1.3-4.1c-2.1-6.1-5.2-11.4-8.7-16.9c-.2-.8-.2-.8-1.5-5c-.3-.6-.3-.6-2.1-3.5c-1.9-3.5-1.9-3.5-2.9-8.5c.7 0 1.3 0 2 0c.5 .5 1 1 1.5 1.5c-.8-2.3-1.7-4.6-2.5-7c-.7-2-1.3-4-2-6c-.7-1-1.3-2-2-3c.2-.7 .3-1.3 .5-2zM86.5 100.5c1 0 2 0 3 0c1.3 .8 2.7 1.7 4 2.5c-2.5 2.5-2.5 2.5-8 5.5c-5.5 4.3-8.6 7-10 14c-.8 2.2-1.7 4.3-2.5 6.5c-1.2 4.6-.5 9.3 0 14c-.5 0-1 0-1.5 0c-.2 2-.3 3.9-.5 6c-.7 0-1.3 0-2 0c-.3-.6-.3-.6-2-3.5c-1-.8-2-1.7-3-2.5c-.5-1.5-.5-1.5 1.5-8.5c.3-10.3-1-18.2-4-28c0-4 0-4 1-6c2 2 2 2 3 6.5c2.5-.5 2.5-.5 8-4c9.8-3.5 9.8-3.5 13-2.5zM43 161.5c2.5 2.5 2.5 2.5 3 5c-1.5 2.5-1.5 2.5-4 5c.5 3.5 .5 3.5 4 6.5c-.1 1.2-.4 2.3-.5 3.5c-5.3 3.5-5.3 3.5-8.5 3.5c-6-2.5-6-2.5-11.5-7c0-3 0-3 4-8c9.5-8.5 9.5-8.5 13.5-8.5z"/><path fill="#9B9D9E" d="M142.5 60.5c.5 1 .5 1-.5 4.5c1.2 1.5 2.3 3 3.5 4.5c2 4.5 2 4.5 2.5 9.5c-.5 .2-1 .3-1.5 .5c-.1 .2-.1 .2-.5 1c-2-1-3.9-2-6-3c-.8-.3-1.7-.7-2.5-1c-.3-.7-.7-1.3-1-2c.3-.5 .7-1 1-1.5c-.2-.7-.3-1.3-.5-2c-3.5 .5-3.5 .5-7.5 4c-.5 3-.5 3 0 5.5c-2 4-2 4-3.5 5.5c-.3 0-.7 0-1 0c0 .7 0 1.3 0 2c-2-1-2-1-2.5-2.5c.3-13.7 .3-13.7 4.8-18.5c4.1-3.9 6.3-4.8 11.7-6c1-.5 1-.5 3.5-.5zM98 70.5c.5 .3 1 .7 1.5 1c1.3 .3 2.7 .7 4 1c4.4 5.8 6.5 10.3 6.5 17.5c-2 2-2 2-5 2.5c-.3 .2-.3 .2-2 1c-.2-.2-.2-.2-1.5-1c.5-3 .5-3 1-5c-.7-.8-1.3-1.7-2-2.5c-.2-1.7-.3-3.3-.5-5c-4.5-2.7-8.5-3-13.5-2.5c-.1 .3-.1 .3-.5 1.5c1.3 .8 2.7 1.7 4 2.5c-.1 .4-.1 .4-.5 2.5c-2.3 1.2-4.6 2.3-7 3.5c-5.5 5.5-5.5 5.5-6.5 7c0 .5 0 1 0 1.5c.9-.1 .9-.1 5.5-.5c1 1.3 2 2.7 3 4c-.2 .5-.3 1-.5 1.5c-1.7 .5-3.2 1-5 1.6c-5.5 1.9-5.5 1.9-11 5.4c-.4 .1-.4 .1-2.5 .5c-1.5-1.5-1.5-1.5-2.5-6c-.4-.3-.6-.7-1-1c0-6.7 .9-11.7 3-18c.2-.6 .2-.6 1-3.5c7.8-9.7 20.5-14.1 32-9.5z"/><path fill="#FAF9F8" d="M103.5 40c0 .4 0 .6 0 1c2.2-.1 4.3-.4 6.5-.5c7 0 7 0 9.5 1c-.2 .6-.3 1.3-.5 2c-1.8 .6-3.7 1.3-5.5 2c-.2 .5-.3 1-.5 1.5c.7-.1 1.3-.4 2-.5c13.4-.3 13.4-.3 19.5 3.5c-.3 .6-.7 1.3-1 2c-1 0-2 0-3 0c0 .5 0 1 0 1.5c1.2 .1 1.2 .1 7 .5c3.5 2 3.5 2 5.5 4.5c0 1 0 2 0 3c-3.3 .9-6.7 1.6-10 2.5c-7.5 5-7.5 5-8.5 9c-.3 4.5-.4 9-.5 13.5c1.5 1 1.5 1 7.5 2.5c.9 .6 .9 .6 5.5 3.5c2 1 2 1 9 2.5c7.9 4 11.3 8.3 15 16.5c0 .5 0 1 0 1.5c-1 .2-2 .3-3 .5c.5 1.8 1 3.7 1.5 5.5c.3 8.5-.8 13.6-6 20.5c-.7-.2-1.3-.3-2-.5c0-1.7 0-3.3 0-5c-.7 .2-1.3 .3-2 .5c-1.3 2.7-2.7 5.3-4 8c-3.2 3.7-6.4 6.2-11 8c-1-1-1-1-1.5-3c-2.5 1.3-4.8 2.9-7 4.5c-6.3 2.8-10.8 3.2-17.6 1c-1.3-.5-2.6-1-3.9-1.5c.2 1.2 .3 2.3 .5 3.5c-.2 .3-.3 .7-.5 1c-5.9 0-9-1.8-14-5c-3-3.5-3-3.5-3-4.5c-.7 0-1.3 0-2 0c.5 2.2 1 4.3 1.5 6.5c-.3 .3-.7 .7-1 1c-4.5-.9-7.6-3.6-11-6.5c-4-6-4-9.3-4-16.5c2.5-7.5 2.5-7.5 3.5-9.5c.3-1.7 .7-3.3 1-5c6.4-8 14.7-13 24.5-16c6.4-6.3 6.4-6.3 8.5-10.5c0-6-1.6-9.8-4.5-15c-.2-.5-.3-1-.5-1.5c-1.7-.3-3.3-.7-5-1c-1.3-.7-2.7-1.3-4-2c-5.7-1.9-10.2-.3-15.5 1.5c-10 5.5-10 5.5-13 10c-.3-.2-.3-.2-2-1c1.3-6.8 4.6-11.7 9.5-16.5c.5-.3 1-.6 1.5-1c.2-.5 .3-1 .5-1.5c-1 .1-1 .1-6 1c-.3-.4-.7-.6-1-1c.5-2 .5-2 4-6c5-2.5 5-2.5 7.5-3c0-.5 0-1 0-1.5c-10.5-1.5-18.5 1-27 7c-.5 .9-1 1.6-1.5 2.5c-.9 .6-.9 .6-5.5 4c-4 3.5-7.6 7-11 11c-4.6 3.8-8.7 6.8-14 9.5c-.7-.3-1.3-.7-2-1c.2-.7 .3-1.3 .5-2c1.8-1 3.7-2 5.5-3c5.2-4.2 9.7-8.5 14-13.5c3.1-2.8 6.2-5.5 9.5-8c1.3-1.3 2.6-2.6 4-4c5.6-3.6 10.4-6.1 17-7c.5-1 1-2 1.5-3c7.2-2.4 12.5-2.2 20-.5c.2 .1 .2 .1 1 .5c3.5 0 3.5 0 8.5-3.5c1-.5 1-.5 3-.5zM118 92.5c-1 1.2-2 2.3-3 3.5c.5 2.5 .5 2.5 3 5c1.8 .8 3.7 1.7 5.5 2.5c.5 1 .5 1 .5 4.5c-4 4.8-6.1 5-12.5 6c0 .7 0 1.3 0 2c4.7 1.5 7.7 .2 12-1.5c1.2-.7 2.3-1.3 3.5-2c1.3 .3 2.7 .7 4 1c3.5 0 3.5 0 5.5-1.5c-.2-.5-.3-1-.5-1.5c-1.7-.3-3.3-.7-5-1c-2.5-2-2.5-2-3-5.5c2-3 2-3 4-5.5c.5-3.5 .5-3.5-1.5-6.5c-4.3-2.2-8.2-1-12.5 .5zM146 58.5c5.8 1.1 8.3 3.9 12.5 8c3.7 5.9 4.4 7.3 5 14c2.8 6.2 5.4 10 10.5 14.5c5.2 5.2 7.2 10.3 9 17.5c0 3.5 0 3.5-2 11c-.2 1.3-.2 1.3-1 7.5c-3.8 10.7-3.8 10.7-8.5 13.5c-.5 .2-.5 .2-3 1c-1 1.3-2 2.7-3 4c-4.5 3-4.5 3-10.5 5c-2.7-.6-5.3-1.3-8-2c-1.7 1.2-3.3 2.3-5 3.5c-2 1-2 1-4 .5c.5-1.5 .5-1.5 6-5c.3-.3 .3-.3 2-2c2.4 0 4.9 0 7.5 0c.5 .5 1 1 1.5 1.5c4.3-.6 7.1-2.3 10.5-5c3.5-5.5 3.5-5.5 4-7c1.5 0 2.9 0 4.5 0c4.3-8.7 4.6-14 2.5-23.5c-.3-1-.7-2-1-3c.3 .1 .3 .1 2 .5c1.5 2.5 1.5 2.5 1.5 4c.5-.2 1-.3 1.5-.5c-.8-10-4.3-16-11.4-22.8c-3.7-3.8-5.5-6.9-7.6-11.7c-.7-1.5-1.5-2.9-2.3-4.4c-1.7-3.6-1.7-3.6-1.7-5.6c.3-.2 .7-.3 1-.5c-.5-3-.5-3-4.5-7c-2-1-3.9-2-6-3c-.7-.4-1.3-.6-2-1c0-.6 0-1.3 0-2zM33.5 83.5c-1 4-5.1 6.4-8 9c-8.6 8.1-14.6 17.2-15.2 29.2c.3 8.1 .3 8.1 2.2 11.8c.5 0 1 0 1.5 0c.4-2.9 .6-6 1-9c.6 0 1.3 0 2 0c.2 1.3 .4 2.7 .6 4.1c1.8 9.3 5.3 14.8 12.9 20.4c2.3 1.2 4.6 2.3 7 3.5c.7 .6 .7 .6 4.5 3.5c3.5 0 3.5 0 8.5-1.5c1 0 2 0 3 0c-1 2-1 2-2.5 3.5c-6.5 1.7-9.6 .9-16-1.5c-1.1-1-2.3-2-3.5-3c-1.5-.7-2.9-1.3-4.5-2c-3.9-3.4-6.9-6.5-9.5-11c-1.1-.5-2.3-1-3.5-1.5c-5.9-6.7-8-12.7-8-21.5c2.4-12.2 7.2-19.8 16.5-28c4.5-4 4.5-4 6-5.5c3.5-1 3.5-1 5-.5zM50.5 172c2.5 1 2.5 1 7 6.5c6 6.2 12 11.8 18.8 17.1c5.7 4.5 11.3 9.1 16.7 13.9c1.3 1.2 2.7 2.3 4 3.5c.7 .7 1.3 1.3 2 2c-.2 .8-.3 1.7-.5 2.5c-6 2.9-11.7 4-18.5 4c-2.6-2.6-4.3-5.5-5.5-9c-.3 .1-.3 .1-1.5 .5c0 2.3 0 4.6 0 7c-.3 .5-.7 1-1 1.5c-13.3 0-24.6-4.6-34.5-13.5c-4.5-4.5-4.5-4.5-8.5-11c.5-2.5 .5-2.5 4.5-7c5-3 5-3 8-3.5c.5 .3 1 .7 1.5 1c2-.5 2-.5 4-2c.9-4.2 1.7-8.3 2.5-12.5c.4-.3 .6-.7 1-1z"/><path fill="#03B5BD" d="M58.5 149.5c2.5 .5 2.5 .5 7 3.5c9.8 5.2 18.9 7.9 30 8.5c2.2 .5 4.3 1 6.5 1.5c7 0 7 0 9-.5c2.3-.2 4.6-.3 7-.5c3.2-.9 6.3-1.9 9.5-3c1.3-.2 2.7-.3 4-.5c.2 .2 .3 .3 .5 .5c-.8 6.3-4.1 10.2-8 15c-.2 .5-.3 1-.5 1.5c1.7-1 3.3-2 5-3c.7 .2 1.3 .3 2 .5c-3 12.2-9.3 20.3-17.5 29.5c-.7 .7-.7 .7-4 4.5c-1 .8-2 1.7-3 2.5c-3.5-.5-3.5-.5-8-5c-2.3-1.8-4.7-3.7-7-5.5c-2.7-2.2-5.3-4.3-8-6.5c-.8-.6-.8-.6-4.5-3.5c-11-9.3-20.7-18.8-28.5-31c3-4 3-4 8.5-8.5z"/><ellipse cx="94" cy="94" rx="6.5" ry="6.5" fill="#212E34"/><ellipse cx="135" cy="85.6" rx="6.2" ry="5.8" fill="#212E34"/><g fill="#FAF9F8"><circle cx="91.5" cy="91.5" r="2.1"/><circle cx="134.6" cy="84.3" r="2"/></g><ellipse cx="124" cy="93.8" rx="3.4" ry="1.1" fill="#9B9D9E" transform="rotate(-6 124 93.8)"/></g></g><rect x="5" y="5" width="230" height="230" rx="45" fill="none" stroke="#5B6B73" stroke-width="10"/></symbol></defs>
|
|
2
2
|
<rect x="1" y="1" width="958" height="370" rx="18" fill="#151D22" stroke="#34434B" stroke-width="1.5"/>
|
|
3
3
|
<path d="M146 115.5 152.5 115.4 158.5 115.3 163.9 115.3 168.8 115.2 173.2 115.1 177.2 115 180.9 115 184.2 114.9 187.3 114.8 190.1 114.7 192.7 114.6 195.2 114.6 197.6 114.5 200 114.4 202.4 114.3 204.8 114.2 207.3 114.2 209.9 114.1 212.7 114 215.8 113.9 219.1 113.8 222.8 113.8 226.8 113.7 231.2 113.6 236.1 113.5 241.5 113.5 247.5 113.4 254 113.3 A1.3 1.3 0 0 1 254 110.7 L254 110.7 247.5 110.6 241.5 110.5 236.1 110.5 231.2 110.4 226.8 110.3 222.8 110.2 219.1 110.2 215.8 110.1 212.7 110 209.9 109.9 207.3 109.8 204.8 109.8 202.4 109.7 200 109.6 197.6 109.5 195.2 109.4 192.7 109.4 190.1 109.3 187.3 109.2 184.2 109.1 180.9 109 177.2 109 173.2 108.9 168.8 108.8 163.9 108.7 158.5 108.7 152.5 108.6 146 108.5 A3.5 3.5 0 0 1 146 115.5Z" fill="#21BEC5"/>
|
|
4
4
|
<path d="M246 118L254 112L246 106" fill="none" stroke="#21BEC5" stroke-width="2.6" stroke-linecap="round" stroke-linejoin="round"/>
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
<circle cx="290" cy="285" r="7.5" fill="#FAF9F8"/><path d="M277 308a13 12 0 0 1 26 0z" fill="#FAF9F8"/>
|
|
27
27
|
<rect x="82" y="264" width="56" height="56" rx="11.2" fill="#212E34" stroke="#5B6B73" stroke-width="2.2"/><circle cx="110" cy="292" r="10.6" fill="#21BEC5"/>
|
|
28
28
|
<rect x="620" y="74.0" width="290" height="76" rx="12" fill="#1B252B" stroke="#2E3B42" stroke-width="1.5"/>
|
|
29
|
-
<text x="638" y="102" class="s" font-size="14" fill="#E6EDF3" font-weight="700">
|
|
29
|
+
<text x="638" y="102" class="s" font-size="14" fill="#E6EDF3" font-weight="700">Your turn</text>
|
|
30
30
|
<text x="638" y="126" class="m" font-size="13" fill="#9B9D9E">Error log · Checkout: …</text>
|
|
31
31
|
<text x="892" y="126" class="m" font-size="13" fill="#F0B455" font-weight="700" text-anchor="end">[ask]</text>
|
|
32
32
|
<text x="110" y="164" class="s" font-size="15" fill="#E6EDF3" font-weight="700" text-anchor="middle">Source</text>
|
package/docs/follow.svg
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
<svg xmlns="http://www.w3.org/2000/svg" width="960" height="372" viewBox="0 0 960 372" role="img" aria-labelledby="t d"><title id="t">How a source reaches you</title><desc id="d">A source (a ticket, an error log or a status page) has a new or changed entry. jh watch reads it and reports it to Jack, who puts a row
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="960" height="372" viewBox="0 0 960 372" role="img" aria-labelledby="t d"><title id="t">How a source reaches you</title><desc id="d">A source (a ticket, an error log or a status page) has a new or changed entry. jh watch reads it and reports it to Jack, who puts a row on the board that the herd shows in Your turn; the row starts with the source's label, for example Error log, Checkout. The [ask] button on the row makes Jack ask you about it, and once you have answered, a lane works it.</desc><defs><style>.s{font-family:ui-sans-serif, system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif}.m{font-family:ui-monospace, SFMono-Regular, Menlo, Consolas, 'Liberation Mono', monospace}</style><clipPath id="jack-clip"><rect width="240" height="240" rx="50"/></clipPath><symbol id="jack" viewBox="0 0 240 240"><rect width="240" height="240" rx="50" fill="#212E34"/><g clip-path="url(#jack-clip)"><g transform="translate(34 8)"><path fill="#4A4E51" d="M80 50.5c.2 .1 .2 .1 1 1c-.2 .6-.3 1.3-.5 2c-.7 .4-.7 .4-4 2c-6 3.3-6 3.3-7 6.5c1.2-.4 2.3-.6 3.5-1c.8 0 1.7 0 2.5 0c.2 .1 .2 .1 1 1c-.5 2-.5 2-5.5 6.5c-3 5-3 5-5.5 11c.2 .3 .2 .3 1 2c.2 .3 .3 .7 .5 1c-.7 .7-1.3 1.3-2 2c-1.3-.2-2.6-.3-4-.5c0-1.2 0-2.3 0-3.5c-.2 .1-.2 .1-1.5 .5c-1.2 2.7-2.4 5.3-3.5 8c-1 2.1-2 4.2-3 6.3c-2.5 5.7-2.5 5.7-3 8.2c.5 0 1 0 1.5 0c.1-.8 .4-1.7 .5-2.5c.6 0 1.3 0 2 0c.5 2 1 3.9 1.6 6c1 4 2.2 8 3.4 11.9c2.1 8.4 1.1 15.5-3 23.1c-.6-.2-1.3-.3-2-.5c-.1-1.5-.3-3-.5-4.6c-.3-2.6-.5-5.2-1-7.9c-.5 0-1 0-1.5 0c-.1 1.7-.4 3.3-.5 5c-2.7 10.2-2.7 10.2-6 13.5c-6.1-3.1-9-14.9-11-21c-1.1-8.2 .9-14.7 3.5-22.5c-8.4 8.3-8.3 20.5-9 31.5c-.6-.2-1.3-.3-2-.5c-5.4-8.9-5.1-15-3-25c.5-1 1-2 1.5-3c-3 1.5-3 1.5-6.5 5c-.4 0-.6 0-1 0c.8-6.5 3.2-10.2 7.5-15c.6-.8 .6-.8 3.5-5c2.6-2.6 5.2-5.1 8-7.5c.6-.6 .6-.6 3.5-3.5c-.5-2-.5-2-1-3.5c3.6-6 6.5-9.2 12.5-13c.4-.6 .6-1.3 1-2c-.5-.6-1-1.3-1.5-2c2-3 2-3 4.5-4.5c.5 1 .5 1 1 3.5c2.5-1 2.5-1 8.5-5.5c.3 0 .7 0 1 0c-.1-.4-.1-.4-.5-2.5c4.3-3.3 10-2.5 15-1zM153 69.5c1.2 .2 2.3 .3 3.5 .5c.3 .7 .7 1.3 1 2c.3 0 .7 0 1 0c.5 1.2 1 2.3 1.5 3.5c3.4 7.6 6.2 13.7 12.2 19.6c3.3 3.4 3.3 3.4 3.8 5.9c-.2 .2-.3 .3-.5 .5c.1 .7 .1 .7 .5 4.5c-.5 .3-1 .7-1.5 1c-.8-.3-1.7-.7-2.5-1c.3 .7 .7 1.3 1 2c1.2 5.8 1.4 10 1 16c-.7 0-1.3 0-2 0c-.4-1.3-.8-2.7-1.3-4.1c-2.1-6.1-5.2-11.4-8.7-16.9c-.2-.8-.2-.8-1.5-5c-.3-.6-.3-.6-2.1-3.5c-1.9-3.5-1.9-3.5-2.9-8.5c.7 0 1.3 0 2 0c.5 .5 1 1 1.5 1.5c-.8-2.3-1.7-4.6-2.5-7c-.7-2-1.3-4-2-6c-.7-1-1.3-2-2-3c.2-.7 .3-1.3 .5-2zM86.5 100.5c1 0 2 0 3 0c1.3 .8 2.7 1.7 4 2.5c-2.5 2.5-2.5 2.5-8 5.5c-5.5 4.3-8.6 7-10 14c-.8 2.2-1.7 4.3-2.5 6.5c-1.2 4.6-.5 9.3 0 14c-.5 0-1 0-1.5 0c-.2 2-.3 3.9-.5 6c-.7 0-1.3 0-2 0c-.3-.6-.3-.6-2-3.5c-1-.8-2-1.7-3-2.5c-.5-1.5-.5-1.5 1.5-8.5c.3-10.3-1-18.2-4-28c0-4 0-4 1-6c2 2 2 2 3 6.5c2.5-.5 2.5-.5 8-4c9.8-3.5 9.8-3.5 13-2.5zM43 161.5c2.5 2.5 2.5 2.5 3 5c-1.5 2.5-1.5 2.5-4 5c.5 3.5 .5 3.5 4 6.5c-.1 1.2-.4 2.3-.5 3.5c-5.3 3.5-5.3 3.5-8.5 3.5c-6-2.5-6-2.5-11.5-7c0-3 0-3 4-8c9.5-8.5 9.5-8.5 13.5-8.5z"/><path fill="#9B9D9E" d="M142.5 60.5c.5 1 .5 1-.5 4.5c1.2 1.5 2.3 3 3.5 4.5c2 4.5 2 4.5 2.5 9.5c-.5 .2-1 .3-1.5 .5c-.1 .2-.1 .2-.5 1c-2-1-3.9-2-6-3c-.8-.3-1.7-.7-2.5-1c-.3-.7-.7-1.3-1-2c.3-.5 .7-1 1-1.5c-.2-.7-.3-1.3-.5-2c-3.5 .5-3.5 .5-7.5 4c-.5 3-.5 3 0 5.5c-2 4-2 4-3.5 5.5c-.3 0-.7 0-1 0c0 .7 0 1.3 0 2c-2-1-2-1-2.5-2.5c.3-13.7 .3-13.7 4.8-18.5c4.1-3.9 6.3-4.8 11.7-6c1-.5 1-.5 3.5-.5zM98 70.5c.5 .3 1 .7 1.5 1c1.3 .3 2.7 .7 4 1c4.4 5.8 6.5 10.3 6.5 17.5c-2 2-2 2-5 2.5c-.3 .2-.3 .2-2 1c-.2-.2-.2-.2-1.5-1c.5-3 .5-3 1-5c-.7-.8-1.3-1.7-2-2.5c-.2-1.7-.3-3.3-.5-5c-4.5-2.7-8.5-3-13.5-2.5c-.1 .3-.1 .3-.5 1.5c1.3 .8 2.7 1.7 4 2.5c-.1 .4-.1 .4-.5 2.5c-2.3 1.2-4.6 2.3-7 3.5c-5.5 5.5-5.5 5.5-6.5 7c0 .5 0 1 0 1.5c.9-.1 .9-.1 5.5-.5c1 1.3 2 2.7 3 4c-.2 .5-.3 1-.5 1.5c-1.7 .5-3.2 1-5 1.6c-5.5 1.9-5.5 1.9-11 5.4c-.4 .1-.4 .1-2.5 .5c-1.5-1.5-1.5-1.5-2.5-6c-.4-.3-.6-.7-1-1c0-6.7 .9-11.7 3-18c.2-.6 .2-.6 1-3.5c7.8-9.7 20.5-14.1 32-9.5z"/><path fill="#FAF9F8" d="M103.5 40c0 .4 0 .6 0 1c2.2-.1 4.3-.4 6.5-.5c7 0 7 0 9.5 1c-.2 .6-.3 1.3-.5 2c-1.8 .6-3.7 1.3-5.5 2c-.2 .5-.3 1-.5 1.5c.7-.1 1.3-.4 2-.5c13.4-.3 13.4-.3 19.5 3.5c-.3 .6-.7 1.3-1 2c-1 0-2 0-3 0c0 .5 0 1 0 1.5c1.2 .1 1.2 .1 7 .5c3.5 2 3.5 2 5.5 4.5c0 1 0 2 0 3c-3.3 .9-6.7 1.6-10 2.5c-7.5 5-7.5 5-8.5 9c-.3 4.5-.4 9-.5 13.5c1.5 1 1.5 1 7.5 2.5c.9 .6 .9 .6 5.5 3.5c2 1 2 1 9 2.5c7.9 4 11.3 8.3 15 16.5c0 .5 0 1 0 1.5c-1 .2-2 .3-3 .5c.5 1.8 1 3.7 1.5 5.5c.3 8.5-.8 13.6-6 20.5c-.7-.2-1.3-.3-2-.5c0-1.7 0-3.3 0-5c-.7 .2-1.3 .3-2 .5c-1.3 2.7-2.7 5.3-4 8c-3.2 3.7-6.4 6.2-11 8c-1-1-1-1-1.5-3c-2.5 1.3-4.8 2.9-7 4.5c-6.3 2.8-10.8 3.2-17.6 1c-1.3-.5-2.6-1-3.9-1.5c.2 1.2 .3 2.3 .5 3.5c-.2 .3-.3 .7-.5 1c-5.9 0-9-1.8-14-5c-3-3.5-3-3.5-3-4.5c-.7 0-1.3 0-2 0c.5 2.2 1 4.3 1.5 6.5c-.3 .3-.7 .7-1 1c-4.5-.9-7.6-3.6-11-6.5c-4-6-4-9.3-4-16.5c2.5-7.5 2.5-7.5 3.5-9.5c.3-1.7 .7-3.3 1-5c6.4-8 14.7-13 24.5-16c6.4-6.3 6.4-6.3 8.5-10.5c0-6-1.6-9.8-4.5-15c-.2-.5-.3-1-.5-1.5c-1.7-.3-3.3-.7-5-1c-1.3-.7-2.7-1.3-4-2c-5.7-1.9-10.2-.3-15.5 1.5c-10 5.5-10 5.5-13 10c-.3-.2-.3-.2-2-1c1.3-6.8 4.6-11.7 9.5-16.5c.5-.3 1-.6 1.5-1c.2-.5 .3-1 .5-1.5c-1 .1-1 .1-6 1c-.3-.4-.7-.6-1-1c.5-2 .5-2 4-6c5-2.5 5-2.5 7.5-3c0-.5 0-1 0-1.5c-10.5-1.5-18.5 1-27 7c-.5 .9-1 1.6-1.5 2.5c-.9 .6-.9 .6-5.5 4c-4 3.5-7.6 7-11 11c-4.6 3.8-8.7 6.8-14 9.5c-.7-.3-1.3-.7-2-1c.2-.7 .3-1.3 .5-2c1.8-1 3.7-2 5.5-3c5.2-4.2 9.7-8.5 14-13.5c3.1-2.8 6.2-5.5 9.5-8c1.3-1.3 2.6-2.6 4-4c5.6-3.6 10.4-6.1 17-7c.5-1 1-2 1.5-3c7.2-2.4 12.5-2.2 20-.5c.2 .1 .2 .1 1 .5c3.5 0 3.5 0 8.5-3.5c1-.5 1-.5 3-.5zM118 92.5c-1 1.2-2 2.3-3 3.5c.5 2.5 .5 2.5 3 5c1.8 .8 3.7 1.7 5.5 2.5c.5 1 .5 1 .5 4.5c-4 4.8-6.1 5-12.5 6c0 .7 0 1.3 0 2c4.7 1.5 7.7 .2 12-1.5c1.2-.7 2.3-1.3 3.5-2c1.3 .3 2.7 .7 4 1c3.5 0 3.5 0 5.5-1.5c-.2-.5-.3-1-.5-1.5c-1.7-.3-3.3-.7-5-1c-2.5-2-2.5-2-3-5.5c2-3 2-3 4-5.5c.5-3.5 .5-3.5-1.5-6.5c-4.3-2.2-8.2-1-12.5 .5zM146 58.5c5.8 1.1 8.3 3.9 12.5 8c3.7 5.9 4.4 7.3 5 14c2.8 6.2 5.4 10 10.5 14.5c5.2 5.2 7.2 10.3 9 17.5c0 3.5 0 3.5-2 11c-.2 1.3-.2 1.3-1 7.5c-3.8 10.7-3.8 10.7-8.5 13.5c-.5 .2-.5 .2-3 1c-1 1.3-2 2.7-3 4c-4.5 3-4.5 3-10.5 5c-2.7-.6-5.3-1.3-8-2c-1.7 1.2-3.3 2.3-5 3.5c-2 1-2 1-4 .5c.5-1.5 .5-1.5 6-5c.3-.3 .3-.3 2-2c2.4 0 4.9 0 7.5 0c.5 .5 1 1 1.5 1.5c4.3-.6 7.1-2.3 10.5-5c3.5-5.5 3.5-5.5 4-7c1.5 0 2.9 0 4.5 0c4.3-8.7 4.6-14 2.5-23.5c-.3-1-.7-2-1-3c.3 .1 .3 .1 2 .5c1.5 2.5 1.5 2.5 1.5 4c.5-.2 1-.3 1.5-.5c-.8-10-4.3-16-11.4-22.8c-3.7-3.8-5.5-6.9-7.6-11.7c-.7-1.5-1.5-2.9-2.3-4.4c-1.7-3.6-1.7-3.6-1.7-5.6c.3-.2 .7-.3 1-.5c-.5-3-.5-3-4.5-7c-2-1-3.9-2-6-3c-.7-.4-1.3-.6-2-1c0-.6 0-1.3 0-2zM33.5 83.5c-1 4-5.1 6.4-8 9c-8.6 8.1-14.6 17.2-15.2 29.2c.3 8.1 .3 8.1 2.2 11.8c.5 0 1 0 1.5 0c.4-2.9 .6-6 1-9c.6 0 1.3 0 2 0c.2 1.3 .4 2.7 .6 4.1c1.8 9.3 5.3 14.8 12.9 20.4c2.3 1.2 4.6 2.3 7 3.5c.7 .6 .7 .6 4.5 3.5c3.5 0 3.5 0 8.5-1.5c1 0 2 0 3 0c-1 2-1 2-2.5 3.5c-6.5 1.7-9.6 .9-16-1.5c-1.1-1-2.3-2-3.5-3c-1.5-.7-2.9-1.3-4.5-2c-3.9-3.4-6.9-6.5-9.5-11c-1.1-.5-2.3-1-3.5-1.5c-5.9-6.7-8-12.7-8-21.5c2.4-12.2 7.2-19.8 16.5-28c4.5-4 4.5-4 6-5.5c3.5-1 3.5-1 5-.5zM50.5 172c2.5 1 2.5 1 7 6.5c6 6.2 12 11.8 18.8 17.1c5.7 4.5 11.3 9.1 16.7 13.9c1.3 1.2 2.7 2.3 4 3.5c.7 .7 1.3 1.3 2 2c-.2 .8-.3 1.7-.5 2.5c-6 2.9-11.7 4-18.5 4c-2.6-2.6-4.3-5.5-5.5-9c-.3 .1-.3 .1-1.5 .5c0 2.3 0 4.6 0 7c-.3 .5-.7 1-1 1.5c-13.3 0-24.6-4.6-34.5-13.5c-4.5-4.5-4.5-4.5-8.5-11c.5-2.5 .5-2.5 4.5-7c5-3 5-3 8-3.5c.5 .3 1 .7 1.5 1c2-.5 2-.5 4-2c.9-4.2 1.7-8.3 2.5-12.5c.4-.3 .6-.7 1-1z"/><path fill="#03B5BD" d="M58.5 149.5c2.5 .5 2.5 .5 7 3.5c9.8 5.2 18.9 7.9 30 8.5c2.2 .5 4.3 1 6.5 1.5c7 0 7 0 9-.5c2.3-.2 4.6-.3 7-.5c3.2-.9 6.3-1.9 9.5-3c1.3-.2 2.7-.3 4-.5c.2 .2 .3 .3 .5 .5c-.8 6.3-4.1 10.2-8 15c-.2 .5-.3 1-.5 1.5c1.7-1 3.3-2 5-3c.7 .2 1.3 .3 2 .5c-3 12.2-9.3 20.3-17.5 29.5c-.7 .7-.7 .7-4 4.5c-1 .8-2 1.7-3 2.5c-3.5-.5-3.5-.5-8-5c-2.3-1.8-4.7-3.7-7-5.5c-2.7-2.2-5.3-4.3-8-6.5c-.8-.6-.8-.6-4.5-3.5c-11-9.3-20.7-18.8-28.5-31c3-4 3-4 8.5-8.5z"/><ellipse cx="94" cy="94" rx="6.5" ry="6.5" fill="#212E34"/><ellipse cx="135" cy="85.6" rx="6.2" ry="5.8" fill="#212E34"/><g fill="#FAF9F8"><circle cx="91.5" cy="91.5" r="2.1"/><circle cx="134.6" cy="84.3" r="2"/></g><ellipse cx="124" cy="93.8" rx="3.4" ry="1.1" fill="#9B9D9E" transform="rotate(-6 124 93.8)"/></g></g><rect x="5" y="5" width="230" height="230" rx="45" fill="none"/></symbol></defs>
|
|
2
2
|
<rect x="1" y="1" width="958" height="370" rx="18" fill="#FAF9F8" stroke="#C4CBCE" stroke-width="1.5"/>
|
|
3
3
|
<path d="M146 115.5 152.5 115.4 158.5 115.3 163.9 115.3 168.8 115.2 173.2 115.1 177.2 115 180.9 115 184.2 114.9 187.3 114.8 190.1 114.7 192.7 114.6 195.2 114.6 197.6 114.5 200 114.4 202.4 114.3 204.8 114.2 207.3 114.2 209.9 114.1 212.7 114 215.8 113.9 219.1 113.8 222.8 113.8 226.8 113.7 231.2 113.6 236.1 113.5 241.5 113.5 247.5 113.4 254 113.3 A1.3 1.3 0 0 1 254 110.7 L254 110.7 247.5 110.6 241.5 110.5 236.1 110.5 231.2 110.4 226.8 110.3 222.8 110.2 219.1 110.2 215.8 110.1 212.7 110 209.9 109.9 207.3 109.8 204.8 109.8 202.4 109.7 200 109.6 197.6 109.5 195.2 109.4 192.7 109.4 190.1 109.3 187.3 109.2 184.2 109.1 180.9 109 177.2 109 173.2 108.9 168.8 108.8 163.9 108.7 158.5 108.7 152.5 108.6 146 108.5 A3.5 3.5 0 0 1 146 115.5Z" fill="#03B5BD"/>
|
|
4
4
|
<path d="M246 118L254 112L246 106" fill="none" stroke="#03B5BD" stroke-width="2.6" stroke-linecap="round" stroke-linejoin="round"/>
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
<circle cx="290" cy="285" r="7.5" fill="#FAF9F8"/><path d="M277 308a13 12 0 0 1 26 0z" fill="#FAF9F8"/>
|
|
27
27
|
<rect x="82" y="264" width="56" height="56" rx="11.2" fill="#212E34"/><circle cx="110" cy="292" r="10.6" fill="#03B5BD"/>
|
|
28
28
|
<rect x="620" y="74.0" width="290" height="76" rx="12" fill="#FFFFFF" stroke="#DDE2E4" stroke-width="1.5"/>
|
|
29
|
-
<text x="638" y="102" class="s" font-size="14" fill="#212E34" font-weight="700">
|
|
29
|
+
<text x="638" y="102" class="s" font-size="14" fill="#212E34" font-weight="700">Your turn</text>
|
|
30
30
|
<text x="638" y="126" class="m" font-size="13" fill="#4A4E51">Error log · Checkout: …</text>
|
|
31
31
|
<text x="892" y="126" class="m" font-size="13" fill="#9A5A00" font-weight="700" text-anchor="end">[ask]</text>
|
|
32
32
|
<text x="110" y="164" class="s" font-size="15" fill="#212E34" font-weight="700" text-anchor="middle">Source</text>
|