daily-focus 1.2.0-dev.8 → 2.0.0-dev.14

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/README.md CHANGED
@@ -35,9 +35,11 @@ To use your own data:
35
35
  npx daily-focus
36
36
  ```
37
37
 
38
- Until the first brief exists, the Today tab walks you through the rest: what it
39
- briefs, your objective, which coding-agent CLI writes the brief (Claude Code or
40
- Codex), and where it should look. Everything stays on the settings page afterwards.
38
+ A new store opens on the setup screen: a few questions, one at a time, each with
39
+ the likely answer already ticked. Once you've chosen the coding-agent CLI that writes
40
+ the brief (Claude Code or Codex), it looks into the rest for you, such as which of
41
+ your calendars are work ones, so most answers are a click. Everything stays on the
42
+ settings page afterwards.
41
43
  To keep it running in the background on macOS, install it and run it as a service:
42
44
 
43
45
  ```sh
@@ -130,9 +132,20 @@ why is CI red, what does this thread actually want from me. With
130
132
  `DAILY_FOCUS_ASSISTANT` set to `claude` or `codex`, every item's panel gets an
131
133
  assistant that runs that CLI headless against the item, with quick actions for the
132
134
  common asks and a field for anything else. Click a card to open its panel, where its
133
- notes live too; the reply streams in there, and you can follow up in the same
134
- conversation. The panel stays on the item it was opened for while you move through
135
- the list.
135
+ notes live too. While the assistant works, the panel shows what it is doing: each
136
+ command it runs and each page, thread or ticket it reads, with a clock, and a cross
137
+ on anything that failed, such as a repository it couldn't see. Once it answers,
138
+ that trail folds away under the answer. The answer has buttons to copy it, or any
139
+ block in it meant for pasting, and to open a draft it created. The field stays at
140
+ the foot of the panel, so you can follow up in the same conversation. The panel
141
+ stays on the item it was opened for while you move through the list.
142
+
143
+ It can also answer before you ask. With **Answer ahead** on in the settings, when a
144
+ pull request starts waiting on you because someone reviewed it or a check failed,
145
+ the assistant assesses the review or explains the failure on its own. The first
146
+ line of its answer appears on the row, such as "Flaky, not yours: the Safari job
147
+ timed out", so the card already says what to do. It asks about each state once,
148
+ one at a time, and no more than ten times a day unless you change the limit.
136
149
 
137
150
  It is told to read and draft, and nothing more. An email reply is created as a Gmail
138
151
  draft on the thread, so it is waiting there when you open the mail; a reply to a
@@ -150,8 +163,13 @@ in `DAILY_FOCUS_AGENT_AT`, and from the refresh icon beside the brief's age when
150
163
  morning's brief is out of date by lunch. Each run keeps what you have marked done,
151
164
  snoozed or noted.
152
165
 
166
+ The agent reads your sources in parallel, handing each to a subagent of its own.
167
+ While it runs, its panel shows what it is doing: what it says, each command it runs
168
+ and each thread or page it reads, and each subagent under the step that started it,
169
+ open while it works.
170
+
153
171
  Every run is recorded. Click "updated … ago" to open the latest: its report says what
154
- it wrote and what it could not reach, its working commentary is folded away beneath,
172
+ it wrote and what it could not reach, how it got there is folded away beneath,
155
173
  and you can ask it why it did what it did, or to look again, in the same session. Earlier runs are folded away below. See
156
174
  [SETUP.md](SETUP.md#connect-your-morning-agent).
157
175
 
package/SETUP.md CHANGED
@@ -27,18 +27,56 @@ and `npm start` runs it in the terminal. Each `daily-focus <command>` below is
27
27
  `npm run <command>` in a checkout, with two differences: `build-calendar` is
28
28
  `build:calendar`, and flags go after `--`, as in `npm run audit -- --against <file>`.
29
29
 
30
- Until the first brief exists, the Today tab walks you through setting it up:
31
-
32
- 1. **What it briefs**: your work, or your personal life. See
30
+ A new store opens on the setup screen. It first looks for Codex and Claude Code:
31
+ on your login shell's PATH, then where their installers put them, and checks that
32
+ the one it finds is logged in. With one ready it doesn't ask: it uses Codex if
33
+ that is ready, otherwise Claude Code, and says so in a line you can **Change**.
34
+ With neither ready, it says what is wrong with each and the command that fixes it
35
+ (`codex login`, `claude auth login`), links to the installers, and takes the path
36
+ to one it couldn't find.
37
+
38
+ Then it asks a few questions, one at a time, and each comes with the answer you
39
+ most likely want already ticked: confirm it or change it. A list can be left
40
+ unticked and a field empty. Two questions can be left, by a button that says what
41
+ that does: **Decide later** for the agent, and **Leave this out** for who you are.
42
+ **Change** reopens an earlier answer.
43
+
44
+ 1. **Who writes the brief**, only when it couldn't pick for you.
45
+ 2. **What it briefs**: your work, or your personal life. See
33
46
  [A personal instance](#a-personal-instance) for running both.
34
- 2. **Your objective**: the one thing you're trying to achieve, which the agent
35
- ranks the day against.
36
- 3. **Who writes the brief**: Claude Code or Codex, whichever it finds installed.
37
- 4. **Where it should look**: your source list, which starts from a template with
38
- what `gh` and `git` know about you filled in.
39
- 5. **What else to show**: the pull request board, the Jira board and the live
40
- agenda, each with its status and a button to turn it off.
41
- 6. **Write my first brief**, which runs the agent once while you watch.
47
+ 3. **When it runs**, and on which days.
48
+ 4. **Who you are**: your name as meeting notes write it, your email, and each
49
+ GitHub account `gh` is logged in to, with what it's for.
50
+ 5. **What else to show**: the pull request board and the Jira board, each with
51
+ its status.
52
+ 6. **Which calendars** the brief reads, which the live agenda follows too.
53
+ 7. **Your objective**, which the agent ranks the day against, and what's in the
54
+ way. It suggests a few from what you've been doing, when something stands
55
+ out, and writes one up from whatever you tell it, however rough.
56
+
57
+ The [assistant](#ask-the-assistant) isn't asked about: it comes on with the CLI
58
+ that writes the brief, unless you've set it already.
59
+
60
+ Once you've said what it briefs, the CLI looks into the others in the background,
61
+ one short session each, so the slow ones are ready when you get to them. It reads
62
+ `gh`, your mail and your calendars to tell work from personal, and says in a
63
+ sentence why it ticked what it did. Reply under that sentence with what to change,
64
+ such as "also the on-call rota", and it tries again, answering in the same place.
65
+ Continue before it has finished and it asks first, then stops and keeps what the
66
+ card holds.
67
+
68
+ The sessions run on the newest flagship model at low effort (Opus for Claude Code,
69
+ the first model in Codex's own list for Codex), which measured as fast as the
70
+ lighter models and, unlike them, told your calendars from other people's. They
71
+ only read, in an empty directory. Claude Code is given read tools by name, and
72
+ under Codex every connector write is refused, drafts included; `gh` and `acli` are
73
+ held to reading by their instructions, as
74
+ [the assistant's](#what-the-assistant-can-do) are.
75
+
76
+ Nothing is saved until the last step, **Write my first brief**. It saves the
77
+ settings, writes your source list from the answers (unless you already have one,
78
+ which it leaves alone) and your objective, restarts the dashboard to apply them,
79
+ and runs the agent once while you watch.
42
80
 
43
81
  Everything in it stays on the settings page afterwards: the gear in the header, or
44
82
  <kbd>,</kbd>. The dashboard keeps its files in `~/.daily-focus/`, and links the
@@ -52,6 +90,9 @@ terminal open while you use the dashboard. `daily-focus --help` lists the rest.
52
90
 
53
91
  If you'd rather write the files by hand, `daily-focus init` creates the store with
54
92
  templates for both. It preserves existing files, so you can safely run it again.
93
+ For a personal store, run `daily-focus init --profile personal`: it saves the
94
+ profile in the store's settings, so the templates, the prompt and the dashboard
95
+ agree.
55
96
 
56
97
  ## Set your objective and sources
57
98
 
@@ -91,24 +132,22 @@ Keep real names, account handles, and work details in this private store, outsid
91
132
 
92
133
  The dashboard runs the agent through a coding-agent CLI you already have. Install
93
134
  and log in to the [Codex CLI](https://developers.openai.com/codex/cli) or
94
- [Claude Code](https://code.claude.com/docs), and choose it in the setup steps or
95
- under **Morning agent** in the settings. In `.env` or the environment that is:
96
-
97
- ```dotenv
98
- DAILY_FOCUS_AGENT=codex
99
- ```
135
+ [Claude Code](https://code.claude.com/docs), and choose it on the setup screen or
136
+ as **Write the brief with** under **Morning agent** in the settings
137
+ (`DAILY_FOCUS_AGENT`).
100
138
 
101
139
  Each scheduled morning at 07:00 your time the dashboard starts the agent through
102
140
  that CLI, headless, in the store, and the brief appears when it finishes. Set
103
- `DAILY_FOCUS_AGENT_AT` to another time, such as `06:30`. The dashboard has to be
141
+ **Run it at** (`DAILY_FOCUS_AGENT_AT`) to another time, such as `06:30`. The dashboard has to be
104
142
  running at the time; if it wasn't, it runs the agent as soon as it is started that
105
143
  day, provided nothing has produced a brief for the day yet. It runs once a day,
106
144
  whatever became of the run: a failed morning is reported once, not retried every
107
145
  half minute. The days are Monday to Friday unless `DAILY_FOCUS_AGENT_DAYS` says
108
146
  otherwise; see [Match your working week](#match-your-working-week).
109
- `DAILY_FOCUS_AGENT_AT=off` means the dashboard never starts a run on its own; the
147
+ **Run it at** set to `off` means the dashboard never starts a run on its own; the
110
148
  refresh icon still does. A new store's first brief always comes from the setup
111
- steps' button, so the clock never runs the agent before you've told it where to look.
149
+ screen's last button, so the clock never runs the agent before you've told it where
150
+ to look.
112
151
 
113
152
  "Your time" is the time zone of the browser you last looked at the dashboard
114
153
  in. The page tells the dashboard when it loads, reconnects or comes back into view,
@@ -172,18 +211,9 @@ agent to read.
172
211
  ## Configure integrations
173
212
 
174
213
  Settings are saved in the store, in `settings.json`, by the dashboard's settings
175
- page; saving one restarts the dashboard to apply it once nothing is running. The
176
- settings below can also go in a `.env` in the repo, which is how they were set
177
- before the store kept its own:
178
-
179
- ```sh
180
- cp .env.example .env
181
- ```
182
-
183
- A value saved in the store beats the same one in `.env`, and a variable set in the
184
- environment the dashboard starts with beats both; the settings page shows such a
185
- value but can't change it. `.env` is gitignored because account and organisation
186
- names belong outside git.
214
+ page; saving one restarts the dashboard to apply it once nothing is running. Each
215
+ is named below by its label on the page, and by its key in `settings.json`, in case
216
+ you edit the file by hand; restart the dashboard after doing that.
187
217
 
188
218
  ### GitHub
189
219
 
@@ -194,22 +224,19 @@ gh auth login
194
224
  ```
195
225
 
196
226
  The board uses the active account by default. To choose accounts and repositories,
197
- set these in `.env`, replacing the invented examples with your own:
198
-
199
- ```dotenv
200
- DAILY_FOCUS_GITHUB_ACCOUNTS=alice,alice_corp
201
- DAILY_FOCUS_GITHUB_SCOPE=acme,acme-labs/webapp
202
- ```
227
+ set **Accounts** (`DAILY_FOCUS_GITHUB_ACCOUNTS`), such as `alice, alice_corp`, and
228
+ **Only these organisations or repositories** (`DAILY_FOCUS_GITHUB_SCOPE`), such as
229
+ `acme, acme-labs/webapp`, under **Pull requests**.
203
230
 
204
231
  Named accounts stay fixed even if you switch the active account in another terminal.
205
232
  For organisations using SAML, make sure the account's token has access. The board
206
233
  reports access problems instead of silently showing no pull requests.
207
234
 
208
235
  If your repository has a check that represents its merge policy, list its exact,
209
- case-sensitive name in `DAILY_FOCUS_GITHUB_MERGE_GATE_CHECKS`. Separate names with
210
- commas. Pending matches appear under *Waiting on merge gate*.
236
+ case-sensitive name in **Merge gate checks** (`DAILY_FOCUS_GITHUB_MERGE_GATE_CHECKS`).
237
+ Separate names with commas. Pending matches appear under *Waiting on merge gate*.
211
238
 
212
- Set `DAILY_FOCUS_GITHUB=off` to disable the board.
239
+ Turn **Pull request board** (`DAILY_FOCUS_GITHUB`) off to disable the board.
213
240
 
214
241
  ### Jira
215
242
 
@@ -219,14 +246,11 @@ Sign in with the Atlassian CLI:
219
246
  acli jira auth login
220
247
  ```
221
248
 
222
- The board uses that session. You can limit the projects and adjust which statuses
223
- need attention:
224
-
225
- ```dotenv
226
- DAILY_FOCUS_JIRA_PROJECTS=PROJ,OTHER
227
- DAILY_FOCUS_JIRA_HOLD_STATUSES=Blocked,On Hold
228
- DAILY_FOCUS_JIRA_IN_PROGRESS_STATUSES=In Progress
229
- ```
249
+ The board uses that session. Under **Jira tickets** you can limit the projects with
250
+ **Only these projects** (`DAILY_FOCUS_JIRA_PROJECTS`), such as `PROJ, OTHER`, and
251
+ adjust which statuses need attention with **Statuses that mean on hold**
252
+ (`DAILY_FOCUS_JIRA_HOLD_STATUSES`), such as `Blocked, On Hold`, and **Statuses that
253
+ mean working on it** (`DAILY_FOCUS_JIRA_IN_PROGRESS_STATUSES`), such as `In Progress`.
230
254
 
231
255
  Hold statuses suppress *In flight with nothing linked* reminders. They don't hide
232
256
  other status mismatches. The in-progress list filters the *Working on* view;
@@ -239,10 +263,10 @@ for workflow limits and undo behavior.
239
263
 
240
264
  The board also asks GitHub about your pull requests, because Jira can learn of
241
265
  them days late. It uses the pull request board's accounts and scope, and nothing
242
- else needs to be configured. With `DAILY_FOCUS_GITHUB=off`, the ticket board uses
266
+ else needs to be configured. With the pull request board off, the ticket board uses
243
267
  Jira alone.
244
268
 
245
- Set `DAILY_FOCUS_JIRA=off` to disable the board.
269
+ Turn **Jira ticket board** (`DAILY_FOCUS_JIRA`) off to disable the board.
246
270
 
247
271
  ### Live calendar on macOS
248
272
 
@@ -254,19 +278,16 @@ goes in `~/Library/Application Support/Daily Focus/`, where every copy finds it:
254
278
  daily-focus build-calendar
255
279
  ```
256
280
 
257
- Choose calendar names exactly as Calendar.app shows them, and list your own email
258
- addresses so the dashboard can recognize meetings you've declined:
259
-
260
- ```dotenv
261
- DAILY_FOCUS_CALENDARS=Work,Personal
262
- DAILY_FOCUS_CALENDAR_ADDRESSES=you@example.com,you@personal.example
263
- ```
281
+ Tick the calendars under **Calendar** in the settings (`DAILY_FOCUS_CALENDARS`,
282
+ spelled exactly as Calendar.app shows them), and list your own email addresses in
283
+ **Your email addresses** (`DAILY_FOCUS_CALENDAR_ADDRESSES`) so the dashboard can
284
+ recognize meetings you've declined.
264
285
 
265
286
  Start the dashboard and allow the helper's calendar access when macOS asks.
266
287
  Rebuilding the helper may prompt again.
267
288
 
268
289
  Without live calendar access, the agenda uses events from the morning brief.
269
- Set `DAILY_FOCUS_CALENDAR=off` to use those events explicitly.
290
+ Turn **Live agenda** (`DAILY_FOCUS_CALENDAR`) off to use those events explicitly.
270
291
 
271
292
  ## Ask the assistant
272
293
 
@@ -279,12 +300,8 @@ is failing, what a thread is asking of you, a reply to an email drafted straight
279
300
  Gmail as a draft on the thread.
280
301
 
281
302
  Install and log in to [Claude Code](https://code.claude.com/docs) or the
282
- [Codex CLI](https://developers.openai.com/codex/cli), then choose it under
283
- **Assistant** in the settings, or set:
284
-
285
- ```dotenv
286
- DAILY_FOCUS_ASSISTANT=claude
287
- ```
303
+ [Codex CLI](https://developers.openai.com/codex/cli), then choose it as **Answer
304
+ questions with** under **Assistant** in the settings (`DAILY_FOCUS_ASSISTANT`).
288
305
 
289
306
  Once the dashboard has restarted, the assistant appears in the panel. Model and effort default to whatever
290
307
  the CLI is configured with; `DAILY_FOCUS_ASSISTANT_MODEL` and
@@ -314,10 +331,11 @@ instructions. What the CLI itself enforces:
314
331
  `mcp__claude_ai_Gmail` allows every tool on the Gmail connector, sending and
315
332
  deleting included, and `gh` and `acli` can comment, merge and move tickets as well
316
333
  as read. Only the instructions keep it from doing those. To hold it to reading
317
- mail and drafting replies, name the Gmail tools instead of the connector:
334
+ mail and drafting replies, name the Gmail tools instead of the connector, in
335
+ **Tools Claude Code may use** under **Assistant** (`DAILY_FOCUS_ASSISTANT_TOOLS`):
318
336
 
319
- ```dotenv
320
- DAILY_FOCUS_ASSISTANT_TOOLS=Bash(gh *),Bash(acli *),WebFetch,mcp__claude_ai_Gmail__search_threads,mcp__claude_ai_Gmail__get_thread,mcp__claude_ai_Gmail__get_message,mcp__claude_ai_Gmail__list_labels,mcp__claude_ai_Gmail__list_drafts,mcp__claude_ai_Gmail__get_draft,mcp__claude_ai_Gmail__create_draft,mcp__claude_ai_Gmail__update_draft
337
+ ```text
338
+ Bash(gh *),Bash(acli *),WebFetch,mcp__claude_ai_Gmail__search_threads,mcp__claude_ai_Gmail__get_thread,mcp__claude_ai_Gmail__get_message,mcp__claude_ai_Gmail__list_labels,mcp__claude_ai_Gmail__list_drafts,mcp__claude_ai_Gmail__get_draft,mcp__claude_ai_Gmail__create_draft,mcp__claude_ai_Gmail__update_draft
321
339
  ```
322
340
 
323
341
  A tool left off the list is refused, so if the connector renames one, the
@@ -339,6 +357,26 @@ instructions. What the CLI itself enforces:
339
357
  assistant or the morning agent on it at all; before 0.149.0 it can't switch
340
358
  computer use off, so the assistant won't answer while that setting is off.
341
359
 
360
+ ### Answer ahead
361
+
362
+ With **Answer ahead on pull requests** (`DAILY_FOCUS_ASSISTANT_AUTO`) on, the
363
+ dashboard asks the assistant before you do. When a pull request lands in *Waiting on
364
+ you* because someone reviewed or commented, it asks the assistant to assess the
365
+ review. When a check fails, it asks for an explanation of the failure. The first
366
+ line of the answer appears on the row,
367
+ on the board and on the brief item for the same pull request, while it still
368
+ matches the pull request's state. The whole answer is in the panel, as a turn you
369
+ can follow up on.
370
+
371
+ It asks about each state once. A new comment or a new failure is a new question;
372
+ the same checks failing again on the same commit are not. It runs one question at a
373
+ time and never on a row you're asking about, and it starts no more than
374
+ `DAILY_FOCUS_ASSISTANT_AUTO_LIMIT` a day (10 by default). It uses only those two
375
+ quick actions, which read and answer, and never one that drafts. It follows the
376
+ board, which reads only while a tab is open, so it asks while you have the
377
+ dashboard open. It is off by default because it spends the CLI's usage without
378
+ you pressing anything.
379
+
342
380
  Its instructions live in `prompts/assistant.md`, linked into the store as
343
381
  `assistant.md` each time the dashboard starts. What it says stays in the chat in the panel: it
344
382
  never leaves notes on the item or marks it handled. That is yours to do once you have
@@ -354,10 +392,17 @@ in the archive. While it runs, a banner says so and offers Stop; click the banne
354
392
  to watch the run. When it finishes the banner goes, since the brief it wrote is the
355
393
  page. A run that fails stays as a warning until you dismiss it.
356
394
 
395
+ The agent reads your sources in parallel, each handed to a subagent of its own, and
396
+ the panel shows what it is doing as it goes: what it says, each command it runs and
397
+ each thing it reads, and each subagent under the step that started it, open while
398
+ it works. Claude Code reports its subagents itself. Codex doesn't, so for a Codex
399
+ run the dashboard reads them from Codex's own session files, under `~/.codex/sessions`
400
+ or `$CODEX_HOME`. It only ever reads them.
401
+
357
402
  Click "updated … ago" to open the latest run in the panel. It holds the agent's
358
403
  report — what it wrote, what it dropped as handled, and any source it could not
359
- reach — with everything it said on the way there folded away beneath, and a field
360
- to ask it about the run. The question goes to the agent in the
404
+ reach — with everything it said and did on the way there folded away beneath, and a
405
+ field to ask it about the run. The question goes to the agent in the
361
406
  same session, so it answers from what it actually did: why it dropped an item, what
362
407
  it could not find, whether it can find it now. A follow-up is given nothing to
363
408
  write; if something in the brief should change, it says what, and you run it again.
@@ -429,10 +474,11 @@ checkout it rebuilds the page each time the dashboard starts. It won't install f
429
474
  The LaunchAgent is written for this machine and isn't tracked in git, so each
430
475
  machine runs the command once. It uses the Node.js that ran it and keeps two things
431
476
  from your shell: `PATH`, so the dashboard finds `gh`, `acli` and your agent's CLI,
432
- and any `DAILY_FOCUS_` variables set there. Each time it starts, the dashboard also
433
- asks your login shell for its `PATH`, so a CLI installed since is found without
434
- reinstalling the service. Everything else comes from the store's settings and
435
- `.env`, which are read each time the dashboard starts. A CLI that relies on a token
477
+ and the store, port and host, whether given as `--data`, `--port` and `--host` or set
478
+ as `DAILY_FOCUS_DATA`, `DAILY_FOCUS_PORT` and `DAILY_FOCUS_HOST`. Each time it starts,
479
+ the dashboard also asks your login shell for its `PATH`, so a CLI installed since is
480
+ found without reinstalling the service. Everything else comes from the store's
481
+ settings, which are read each time the dashboard starts. A CLI that relies on a token
436
482
  exported in your shell profile, rather than its own login, won't find it.
437
483
 
438
484
  Each store gets one service. Running the command again for the same store replaces
@@ -451,19 +497,15 @@ daily-focus service --remove
451
497
 
452
498
  Daily Focus can brief your personal life as well as your work: email, family
453
499
  calendars, Apple Reminders, Apple Messages, e-Boks and your own GitHub projects. Run it as a second instance
454
- with its own store, server and morning agent, and choose **Personal life** in its
455
- setup steps, or set:
456
-
457
- ```dotenv
458
- DAILY_FOCUS_PROFILE=personal
459
- ```
500
+ with its own store, server and morning agent, and choose **Personal life** on its
501
+ setup screen (`DAILY_FOCUS_PROFILE`).
460
502
 
461
503
  The dashboard then links the personal prompt, `prompts/morning-brief-personal.md`,
462
504
  into the store as `prompt.md`, and the source list starts from a template with
463
505
  sections for those sources. The profile also switches off
464
506
  the Jira board, and gives the tab a green house icon instead of the blue briefcase. The pull request
465
507
  board stays on for side projects; point it at your personal account with
466
- `DAILY_FOCUS_GITHUB_ACCOUNTS`, or set `DAILY_FOCUS_GITHUB=off`.
508
+ **Accounts**, or turn the board off.
467
509
 
468
510
  The personal sources often live on another machine, such as a home Mac with access
469
511
  to Messages and Reminders. Run the instance there, keep `DAILY_FOCUS_HOST` on
@@ -482,40 +524,45 @@ Tailscale `ts.net` name, or by the name in `DAILY_FOCUS_HOST`. That stops a web
482
524
  from pointing its own name at your dashboard and reading your brief. Reached any
483
525
  other way, it replies `403` and names the host it was reached as.
484
526
 
485
- To run both instances on one machine, start the second with its own
486
- `DAILY_FOCUS_DATA`, `DAILY_FOCUS_PORT` and `DAILY_FOCUS_PROFILE` in its environment,
487
- which takes precedence over `.env`. `daily-focus service` keeps those variables, so this
488
- installs the second service beside the first. Use the same variables each time you
527
+ To run both instances on one machine, give the second its own store and port.
528
+ `daily-focus service` keeps them, so this installs the second service beside the
529
+ first, and its setup screen asks what it briefs. Use the same flags each time you
489
530
  run it for that instance:
490
531
 
491
532
  ```sh
492
- DAILY_FOCUS_PROFILE=personal DAILY_FOCUS_DATA=~/.daily-focus-personal DAILY_FOCUS_PORT=4322 daily-focus service
533
+ daily-focus service --data ~/.daily-focus-personal --port 4322
493
534
  ```
494
535
 
495
536
  ## Match your working week
496
537
 
497
- Set `DAILY_FOCUS_AGENT_DAYS` to the days the dashboard runs the agent. It uses cron
498
- weekday numbers: `1-5` for Monday to Friday, `0-4` for Sunday to Thursday, or `0,6`
499
- for weekends. Unset means Monday to Friday. `daily-focus audit` shows the schedule in
500
- use. Days without scheduled runs don't make a brief overdue. Once a refresh is due,
501
- the dashboard allows 45 minutes before showing a warning.
538
+ Set **On these days** under **Morning agent** (`DAILY_FOCUS_AGENT_DAYS`) to the days
539
+ the dashboard runs the agent. It uses cron weekday numbers: `1-5` for Monday to
540
+ Friday, `0-4` for Sunday to Thursday, or `0,6` for weekends. Unset means Monday to
541
+ Friday. `daily-focus audit` shows the schedule in use. Days without scheduled runs
542
+ don't make a brief overdue. Once a refresh is due, the dashboard allows 45 minutes
543
+ before showing a warning.
502
544
 
503
545
  ## Settings reference
504
546
 
505
- All settings can be changed on the settings page, which saves them in the store,
506
- or set in `.env` or the environment; restart after changing those two by hand.
507
- `DAILY_FOCUS_DATA`, `DAILY_FOCUS_PORT` and `DAILY_FOCUS_HOST` say where the store is
508
- and how the dashboard listens, so they are never kept in the store and only the
509
- environment or `.env` can change them. Their defaults suit almost everyone.
510
- The brief's `dayStart` and `dayEnd` override the configured working hours. Neither
511
- matters when `DAILY_FOCUS_FREE_WINDOWS` is off.
547
+ Three settings say where the store is and how the dashboard listens, so they are
548
+ never kept in the store. Give them as flags, or set them in the environment the
549
+ dashboard starts in; a flag wins. Their defaults suit almost everyone.
550
+
551
+ | Flag | Variable | Default | Purpose |
552
+ |---|---|---|---|
553
+ | `--data` | `DAILY_FOCUS_DATA` | `~/.daily-focus` | Where the store lives |
554
+ | `--port` | `DAILY_FOCUS_PORT` | `4321` | Port for the dashboard |
555
+ | `--host` | `DAILY_FOCUS_HOST` | `127.0.0.1` | Loopback only by default, since this is personal data. A name here is also one the dashboard answers to, besides localhost, IP addresses and `ts.net` names |
556
+
557
+ Everything else is set on the settings page, which saves it in the store's
558
+ `settings.json` under the keys below; restart the dashboard after editing that file
559
+ by hand. Nothing else is read from the environment. The brief's `dayStart` and
560
+ `dayEnd` override the configured working hours. Neither matters when
561
+ `DAILY_FOCUS_FREE_WINDOWS` is off.
512
562
 
513
- | Variable | Default | Purpose |
563
+ | Key | Default | Purpose |
514
564
  |---|---|---|
515
565
  | `DAILY_FOCUS_PROFILE` | `work` | `work` or `personal`. Picks the prompt the dashboard links and the defaults marked below |
516
- | `DAILY_FOCUS_DATA` | `~/.daily-focus` | Where the store lives |
517
- | `DAILY_FOCUS_PORT` | `4321` | Port for the dashboard |
518
- | `DAILY_FOCUS_HOST` | `127.0.0.1` | Loopback only by default, since this is personal data. A name here is also one the dashboard answers to, besides localhost, IP addresses and `ts.net` names |
519
566
  | `DAILY_FOCUS_FREE_WINDOWS` | `on`; `off` for personal | `off` shows events only: no free windows in the agenda, and the next event in place of focus time left |
520
567
  | `DAILY_FOCUS_WORK_START` | `9` | Local hour the working day starts, when the brief doesn't say |
521
568
  | `DAILY_FOCUS_WORK_END` | `17` | Local hour the working day ends when the brief does not specify it |
@@ -546,11 +593,14 @@ matters when `DAILY_FOCUS_FREE_WINDOWS` is off.
546
593
  | `DAILY_FOCUS_ASSISTANT_EFFORT` | *the CLI's own* | Effort passed to the CLI untouched: `low`, `medium`, `high`, `xhigh` or `max`. Unset passes no flag |
547
594
  | `DAILY_FOCUS_ASSISTANT_TOOLS` | `Bash(gh *),Bash(acli *),WebFetch,mcp__claude_ai_Gmail` | What Claude Code may use without asking, in its permission syntax, comma-separated. Editing tools are denied regardless. The default allows every Gmail tool, sending included; see [What the assistant can do](#what-the-assistant-can-do) to narrow it. Ignored by Codex |
548
595
  | `DAILY_FOCUS_ASSISTANT_COMPUTER_USE` | `off` | `on` lets the assistant use Codex's computer-use and browser plugins, which act in your apps and browser with your sign-ins. `off` switches them off for its runs. Ignored by Claude Code, which uses only the tools in its list |
596
+ | `DAILY_FOCUS_ASSISTANT_AUTO` | `off` | `on` asks the assistant ahead about pull requests waiting on you, after a review or a failing check, and puts the answer's first line on the row. See [Answer ahead](#answer-ahead) |
597
+ | `DAILY_FOCUS_ASSISTANT_AUTO_LIMIT` | `10` | How many times a day the assistant may start on its own, from 1 to 100 |
549
598
  | `DAILY_FOCUS_AGENT` | `off` | `codex` or `claude` lets the dashboard run the morning agent through that CLI: each scheduled morning, and from the refresh icon beside the brief's age. `off` hides it |
550
599
  | `DAILY_FOCUS_AGENT_AT` | `07:00` | Local time, `HH:MM`, at which the dashboard starts the agent on each scheduled day, or as soon as it is running after that. `off` means it never starts one on its own; the refresh icon still does. Needs `DAILY_FOCUS_AGENT` |
551
600
  | `DAILY_FOCUS_AGENT_BIN` | *the CLI's name* | Path to that CLI, for when the server's PATH lacks it. `~` is expanded |
552
601
  | `DAILY_FOCUS_AGENT_MODEL` | *the CLI's own* | Model passed to the CLI untouched. Unset passes no flag |
553
602
  | `DAILY_FOCUS_AGENT_EFFORT` | *the CLI's own* | Effort passed to the CLI untouched. Unset passes no flag |
603
+ | `DAILY_FOCUS_AGENT_SEARCH_TRASH` | `off` | Whether the agent searches the mail account's Trash as well as the inbox and archive. The dashboard writes it to `agent-settings.json` in the store before each run, where the agent reads it |
554
604
  | `DAILY_FOCUS_AGENT_TOOLS` | `Bash(gh *),Bash(acli *),WebFetch,mcp__claude_ai_Gmail` | What Claude Code may use to reach your sources, in its permission syntax, comma-separated. Writing `items.json`, and nothing else in the store, is allowed regardless. The default allows every Gmail tool, sending included. Ignored by Codex |
555
605
 
556
606
  ## If something looks wrong
@@ -559,9 +609,10 @@ matters when `DAILY_FOCUS_FREE_WINDOWS` is off.
559
609
  which it ends with. Run `daily-focus service` to keep it running. If the
560
610
  service is installed and the page still doesn't load, read
561
611
  `~/Library/Logs/local.daily-focus.log`.
562
- - Before the first brief, the Today tab shows the setup steps. Once a brief has
563
- existed, an empty Today tab means the agent hasn't written a new `items.json`:
564
- start a run from the refresh icon beside the brief's age.
612
+ - After setup and before the first brief, the Today tab says where the first brief
613
+ is, and offers to run it again if it didn't finish. Once a brief has existed, an
614
+ empty Today tab means the agent hasn't written a new `items.json`: start a run
615
+ from the refresh icon beside the brief's age.
565
616
  - A stale brief needs an agent run. Refreshing a board doesn't regenerate the brief;
566
617
  the icon beside the brief's age does. Click "updated … ago" to see what the last
567
618
  run said, or whether there was one: the dashboard has to be running at
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  readSystemZone,
3
3
  startingZone
4
- } from "./chunk-6SMUSPZG.js";
4
+ } from "./chunk-YPGKXTBX.js";
5
5
  import {
6
6
  linkState
7
7
  } from "./chunk-QKT2FAB5.js";
@@ -13,7 +13,8 @@ import {
13
13
  resolveItems,
14
14
  runContractChecks,
15
15
  setsStatus
16
- } from "./chunk-GQ3NCWRT.js";
16
+ } from "./chunk-ITUK7XKS.js";
17
+ import "./chunk-QG4XXKBP.js";
17
18
  import {
18
19
  BRIEF_REFRESH_GRACE_HOURS,
19
20
  describeSchedule,
@@ -23,7 +24,7 @@ import {
23
24
  resolveSchedule,
24
25
  runsOn,
25
26
  workingMsBetween
26
- } from "./chunk-KZNY45XW.js";
27
+ } from "./chunk-72NUDSOV.js";
27
28
  import {
28
29
  command
29
30
  } from "./chunk-BC2W7NND.js";