daily-focus 1.2.0-dev.9 → 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 +18 -4
- package/SETUP.md +156 -105
- package/dist/{audit-DNTFZOHH.js → audit-AQUBVWPA.js} +4 -3
- package/dist/{chunk-KZNY45XW.js → chunk-72NUDSOV.js} +126 -119
- package/dist/{chunk-GQ3NCWRT.js → chunk-ITUK7XKS.js} +6 -19
- package/dist/{chunk-KL6RU4XT.js → chunk-JTMBBUMD.js} +316 -10
- package/dist/chunk-QG4XXKBP.js +18 -0
- package/dist/chunk-U6EPOXEW.js +570 -0
- package/dist/{chunk-P3E2B2SD.js → chunk-WPXIQPYX.js} +1 -1
- package/dist/{chunk-6SMUSPZG.js → chunk-YPGKXTBX.js} +2 -2
- package/dist/cli.js +19 -12
- package/dist/{demo-TIIXODJG.js → demo-KE6WDWMA.js} +159 -37
- package/dist/{init-XDMAXU2S.js → init-5KJVHWJU.js} +41 -6
- package/dist/{seed-TWT7EDXJ.js → seed-T4VEY6DT.js} +4 -3
- package/dist/{server-WT4CQ3VX.js → server-FFRNYEAO.js} +2000 -743
- package/dist/{service-ZUHI3VKH.js → service-LQ46YRCZ.js} +7 -6
- package/package.json +2 -2
- package/prompts/README.md +20 -4
- package/prompts/assistant.md +7 -1
- package/prompts/morning-brief-personal.md +37 -0
- package/prompts/morning-brief-work.md +37 -0
- package/prompts/onboarding.md +41 -0
- package/public/app.js +740 -279
- package/public/style.css +671 -75
- package/dist/chunk-V2UN3JYL.js +0 -140
package/README.md
CHANGED
|
@@ -35,9 +35,11 @@ To use your own data:
|
|
|
35
35
|
npx daily-focus
|
|
36
36
|
```
|
|
37
37
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
Codex),
|
|
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
|
|
@@ -138,6 +140,13 @@ block in it meant for pasting, and to open a draft it created. The field stays a
|
|
|
138
140
|
the foot of the panel, so you can follow up in the same conversation. The panel
|
|
139
141
|
stays on the item it was opened for while you move through the list.
|
|
140
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.
|
|
149
|
+
|
|
141
150
|
It is told to read and draft, and nothing more. An email reply is created as a Gmail
|
|
142
151
|
draft on the thread, so it is waiting there when you open the mail; a reply to a
|
|
143
152
|
reviewer is handed back as text for you to post. It is told never to send, post, or
|
|
@@ -154,8 +163,13 @@ in `DAILY_FOCUS_AGENT_AT`, and from the refresh icon beside the brief's age when
|
|
|
154
163
|
morning's brief is out of date by lunch. Each run keeps what you have marked done,
|
|
155
164
|
snoozed or noted.
|
|
156
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
|
+
|
|
157
171
|
Every run is recorded. Click "updated … ago" to open the latest: its report says what
|
|
158
|
-
it wrote and what it could not reach,
|
|
172
|
+
it wrote and what it could not reach, how it got there is folded away beneath,
|
|
159
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
|
|
160
174
|
[SETUP.md](SETUP.md#connect-your-morning-agent).
|
|
161
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
|
-
|
|
31
|
-
|
|
32
|
-
|
|
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
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
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
|
|
95
|
-
under **Morning agent** in the settings
|
|
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
|
-
`
|
|
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
|
-
|
|
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.
|
|
176
|
-
|
|
177
|
-
|
|
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
|
|
198
|
-
|
|
199
|
-
|
|
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
|
|
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
|
-
|
|
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.
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
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
|
|
266
|
+
else needs to be configured. With the pull request board off, the ticket board uses
|
|
243
267
|
Jira alone.
|
|
244
268
|
|
|
245
|
-
|
|
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
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
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
|
-
|
|
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
|
|
283
|
-
**Assistant** in the settings
|
|
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
|
-
```
|
|
320
|
-
|
|
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
|
|
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
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
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**
|
|
455
|
-
setup
|
|
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
|
-
|
|
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,
|
|
486
|
-
`
|
|
487
|
-
|
|
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
|
-
|
|
533
|
+
daily-focus service --data ~/.daily-focus-personal --port 4322
|
|
493
534
|
```
|
|
494
535
|
|
|
495
536
|
## Match your working week
|
|
496
537
|
|
|
497
|
-
Set
|
|
498
|
-
weekday numbers: `1-5` for Monday to
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
the dashboard allows 45 minutes
|
|
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
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
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
|
-
|
|
|
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
|
-
-
|
|
563
|
-
|
|
564
|
-
|
|
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-
|
|
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-
|
|
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-
|
|
27
|
+
} from "./chunk-72NUDSOV.js";
|
|
27
28
|
import {
|
|
28
29
|
command
|
|
29
30
|
} from "./chunk-BC2W7NND.js";
|