daily-focus 1.1.1-dev.2 → 1.2.0-dev.10
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 +34 -20
- package/SETUP.md +103 -21
- package/dist/{audit-W3O6CLOF.js → audit-7ZCLKF46.js} +10 -4
- package/dist/{chunk-Q5OKXJXT.js → chunk-64XB7UDN.js} +1 -1
- package/dist/{chunk-OPASVYLR.js → chunk-J7ZYVUG6.js} +5 -6
- package/dist/chunk-ODJGQCM3.js +1003 -0
- package/dist/{chunk-UM2EPNWR.js → chunk-RZNQJ6UG.js} +123 -282
- package/dist/chunk-Z4SFMMRQ.js +107 -0
- package/dist/cli.js +9 -8
- package/dist/{demo-OQLT3QWP.js → demo-BYLLMKSQ.js} +135 -32
- package/dist/{init-DEVCAQZZ.js → init-EMZDG2I7.js} +1 -9
- package/dist/{seed-SMKNFYTC.js → seed-JU4LQ33D.js} +3 -3
- package/dist/{server-5O3LQVEY.js → server-WQYUOKB3.js} +459 -385
- package/dist/{service-6ZFOHPWN.js → service-PUJ3YDH5.js} +1 -1
- package/package.json +2 -2
- package/prompts/README.md +2 -3
- package/prompts/assistant.md +14 -3
- package/prompts/morning-brief-personal.md +1 -25
- package/prompts/morning-brief-work.md +8 -33
- package/public/app.js +506 -431
- package/public/style.css +198 -181
- package/dist/chunk-GFCWPYEI.js +0 -456
package/README.md
CHANGED
|
@@ -64,13 +64,6 @@ since you completed something that advanced your objective.
|
|
|
64
64
|
- Mark tasks **Done** when you've handled them.
|
|
65
65
|
- **Snooze** an item until a date, or **Dismiss** it if it doesn't need attention.
|
|
66
66
|
- Leave a **Note** for the next brief, such as "already replied on Slack".
|
|
67
|
-
- Press **f** for focus mode, which shows your top item and agenda.
|
|
68
|
-
- Press **p** on an item to start a focus timer. Its countdown appears in the tab
|
|
69
|
-
title, and the session becomes part of the next brief's context.
|
|
70
|
-
|
|
71
|
-
The timer keeps counting after its target time. On macOS, it ends a session when
|
|
72
|
-
you've been away from the machine, excluding the time you were away. On systems
|
|
73
|
-
without idle detection, a two-hour limit caps the recorded session.
|
|
74
67
|
|
|
75
68
|
You can undo item actions except notes. The page updates as new data arrives, and
|
|
76
69
|
the theme button switches between system, light, and dark mode.
|
|
@@ -90,8 +83,10 @@ The second tab shows your open pull requests in seven buckets:
|
|
|
90
83
|
| Drafts | Pull requests you haven't marked ready for review. |
|
|
91
84
|
|
|
92
85
|
Park a pull request until a date, leave a note, or click **Nudged** after asking
|
|
93
|
-
for a review. Nudged records
|
|
94
|
-
|
|
86
|
+
for a review. Nudged records that you asked; it doesn't send a message. The pull
|
|
87
|
+
request moves to a Nudged section for a day, then goes back to Waiting on reviewers
|
|
88
|
+
with "time to ask" if nobody has reviewed it. Completing a task about a pull
|
|
89
|
+
request in the brief doesn't remove that pull request from the board.
|
|
95
90
|
|
|
96
91
|
Cancelled checks appear as "cancelled, no verdict" rather than failures.
|
|
97
92
|
When a check is rerun, the board uses its newest workflow run or attempt.
|
|
@@ -111,6 +106,14 @@ Draft pull requests count as open. Closed pull requests don't prove that a ticke
|
|
|
111
106
|
is finished, so the board leaves that decision to you. Park a reminder or leave a
|
|
112
107
|
note when there's more work planned.
|
|
113
108
|
|
|
109
|
+
Jira can take days to hear that a pull request merged, so the board also checks
|
|
110
|
+
GitHub. It searches your open pull requests and the ones closed in the last 60
|
|
111
|
+
days, and matches them to tickets by the key in the title, branch, description
|
|
112
|
+
or commit messages. An open pull request on GitHub always counts. GitHub can
|
|
113
|
+
also mark a ticket's pull requests as all closed, but only when it found at least
|
|
114
|
+
as many as Jira has linked. A row that GitHub changed lists those pull requests
|
|
115
|
+
under **GitHub, ahead of Jira**.
|
|
116
|
+
|
|
114
117
|
Switch to **Working on** to see your in-progress tickets grouped by status,
|
|
115
118
|
including ones that also need a status check. You can narrow this view in
|
|
116
119
|
[SETUP.md](SETUP.md#jira).
|
|
@@ -127,15 +130,28 @@ why is CI red, what does this thread actually want from me. With
|
|
|
127
130
|
`DAILY_FOCUS_ASSISTANT` set to `claude` or `codex`, every item's panel gets an
|
|
128
131
|
assistant that runs that CLI headless against the item, with quick actions for the
|
|
129
132
|
common asks and a field for anything else. Click a card to open its panel, where its
|
|
130
|
-
notes live too
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
the
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
133
|
+
notes live too. While the assistant works, the panel shows what it is doing: each
|
|
134
|
+
command it runs and each page, thread or ticket it reads, with a clock, and a cross
|
|
135
|
+
on anything that failed, such as a repository it couldn't see. Once it answers,
|
|
136
|
+
that trail folds away under the answer. The answer has buttons to copy it, or any
|
|
137
|
+
block in it meant for pasting, and to open a draft it created. The field stays at
|
|
138
|
+
the foot of the panel, so you can follow up in the same conversation. The panel
|
|
139
|
+
stays on the item it was opened for while you move through the list.
|
|
140
|
+
|
|
141
|
+
It can also answer before you ask. With **Answer ahead** on in the settings, when a
|
|
142
|
+
pull request starts waiting on you because someone reviewed it or a check failed,
|
|
143
|
+
the assistant assesses the review or explains the failure on its own. The first
|
|
144
|
+
line of its answer appears on the row, such as "Flaky, not yours: the Safari job
|
|
145
|
+
timed out", so the card already says what to do. It asks about each state once,
|
|
146
|
+
one at a time, and no more than ten times a day unless you change the limit.
|
|
147
|
+
|
|
148
|
+
It is told to read and draft, and nothing more. An email reply is created as a Gmail
|
|
149
|
+
draft on the thread, so it is waiting there when you open the mail; a reply to a
|
|
150
|
+
reviewer is handed back as text for you to post. It is told never to send, post, or
|
|
151
|
+
edit a file, and it has no checkout: fixing conflicts or a build is work for a real
|
|
152
|
+
coding session, and this is for the questions you would otherwise answer by opening
|
|
153
|
+
six tabs. How much of that the CLI itself enforces differs between Claude Code and
|
|
154
|
+
Codex; see [What the assistant can do](SETUP.md#what-the-assistant-can-do).
|
|
139
155
|
|
|
140
156
|
## The morning agent
|
|
141
157
|
|
|
@@ -165,8 +181,6 @@ Press **?** in the dashboard to see the shortcuts.
|
|
|
165
181
|
| `a` | Open the panel, ready to ask the assistant |
|
|
166
182
|
| `o` | Open the source link |
|
|
167
183
|
| `u` | Undo the last action |
|
|
168
|
-
| `f` | Toggle focus mode |
|
|
169
|
-
| `p` | Start / stop a focus session |
|
|
170
184
|
| `r` | Refresh the current board |
|
|
171
185
|
| `w` | Switch Jira views |
|
|
172
186
|
| `,` | Settings |
|
package/SETUP.md
CHANGED
|
@@ -98,7 +98,7 @@ under **Morning agent** in the settings. In `.env` or the environment that is:
|
|
|
98
98
|
DAILY_FOCUS_AGENT=codex
|
|
99
99
|
```
|
|
100
100
|
|
|
101
|
-
Each scheduled morning at 07:00
|
|
101
|
+
Each scheduled morning at 07:00 your time the dashboard starts the agent through
|
|
102
102
|
that CLI, headless, in the store, and the brief appears when it finishes. Set
|
|
103
103
|
`DAILY_FOCUS_AGENT_AT` to another time, such as `06:30`. The dashboard has to be
|
|
104
104
|
running at the time; if it wasn't, it runs the agent as soon as it is started that
|
|
@@ -110,6 +110,15 @@ otherwise; see [Match your working week](#match-your-working-week).
|
|
|
110
110
|
refresh icon still does. A new store's first brief always comes from the setup
|
|
111
111
|
steps' button, so the clock never runs the agent before you've told it where to look.
|
|
112
112
|
|
|
113
|
+
"Your time" is the time zone of the browser you last looked at the dashboard
|
|
114
|
+
in. The page tells the dashboard when it loads, reconnects or comes back into view,
|
|
115
|
+
and when the browser's own zone changes, so a dashboard on a Mac at home follows
|
|
116
|
+
you abroad as soon as you open it there. The dashboard also follows the Mac it runs
|
|
117
|
+
on when that Mac changes time zones, which covers the morning after a flight before
|
|
118
|
+
you have opened it. Whichever changed last wins, and the dashboard remembers it
|
|
119
|
+
across restarts. Every date and time on the page is shown in that zone; a browser
|
|
120
|
+
somewhere else says so under the page title.
|
|
121
|
+
|
|
113
122
|
Whichever way it starts, every run lands in the same place: the report it gives when
|
|
114
123
|
it finishes, and a chat where you can ask it why it did what it did. See
|
|
115
124
|
[The morning agent's runs](#the-morning-agents-runs).
|
|
@@ -117,21 +126,30 @@ it finishes, and a chat where you can ask it why it did what it did. See
|
|
|
117
126
|
The agent reaches your sources the way the CLI does:
|
|
118
127
|
|
|
119
128
|
- **Codex** runs in its workspace-write sandbox with network access, confined to the
|
|
120
|
-
store. Connectors from the Codex app are found through its plugin catalogue
|
|
121
|
-
|
|
122
|
-
|
|
129
|
+
store. Connectors from the Codex app are found through its plugin catalogue, and
|
|
130
|
+
every write through one is refused: a connector tool counts as a write unless it
|
|
131
|
+
is marked read-only. A command that needs to leave the sandbox, such as `gh`
|
|
132
|
+
switching accounts, is decided by your own Codex approval settings, as it would be
|
|
133
|
+
in your Codex. With nobody set to approve, the agent reports that restriction; with
|
|
134
|
+
Codex's automatic reviewer, the reviewer decides. The dashboard won't start a run
|
|
135
|
+
on a Codex older than 0.144.0, which would ignore the refusal of connector writes;
|
|
136
|
+
update Codex if a run fails saying so.
|
|
123
137
|
- **Claude Code** may write `items.json` and nothing else in the store, and reach
|
|
124
138
|
its sources with only what `DAILY_FOCUS_AGENT_TOOLS` allows. The default covers
|
|
125
139
|
GitHub, Jira, web pages and the claude.ai Gmail connector. Add your calendar, chat
|
|
126
140
|
and document connectors to the list by name, or the brief will report them as
|
|
127
|
-
unreachable.
|
|
141
|
+
unreachable. The default allows every Gmail tool, sending included, and `gh` and
|
|
142
|
+
`acli` can write as well as read; the agent's instructions forbid changing
|
|
143
|
+
anything. To narrow Gmail to reading, name its tools instead of the connector, as
|
|
144
|
+
[What the assistant can do](#what-the-assistant-can-do) shows, without the two
|
|
145
|
+
draft tools.
|
|
128
146
|
|
|
129
147
|
Set `DAILY_FOCUS_AGENT_MODEL` and `DAILY_FOCUS_AGENT_EFFORT` if the CLI's own
|
|
130
148
|
defaults are not what you want for a brief; a brief is worth a high effort. If the
|
|
131
149
|
server can't find the CLI, set `DAILY_FOCUS_AGENT_BIN`.
|
|
132
150
|
|
|
133
|
-
The agent writes `items.json`. The dashboard records your actions
|
|
134
|
-
|
|
151
|
+
The agent writes `items.json`. The dashboard records your actions for the next run
|
|
152
|
+
to read.
|
|
135
153
|
|
|
136
154
|
After the first run, read its report (click "updated … ago"): it says which sources
|
|
137
155
|
it couldn't reach. To check the brief against the payload contract, run:
|
|
@@ -219,6 +237,11 @@ Clicking a status in the dashboard writes one transition to Jira. All other Jira
|
|
|
219
237
|
access is read-only. See the [ticket board guide](README.md#the-jira-ticket-board)
|
|
220
238
|
for workflow limits and undo behavior.
|
|
221
239
|
|
|
240
|
+
The board also asks GitHub about your pull requests, because Jira can learn of
|
|
241
|
+
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
|
|
243
|
+
Jira alone.
|
|
244
|
+
|
|
222
245
|
Set `DAILY_FOCUS_JIRA=off` to disable the board.
|
|
223
246
|
|
|
224
247
|
### Live calendar on macOS
|
|
@@ -268,14 +291,72 @@ the CLI is configured with; `DAILY_FOCUS_ASSISTANT_MODEL` and
|
|
|
268
291
|
`DAILY_FOCUS_ASSISTANT_EFFORT` override them. If the server can't find the CLI,
|
|
269
292
|
set `DAILY_FOCUS_ASSISTANT_BIN` to its path.
|
|
270
293
|
|
|
271
|
-
The assistant
|
|
272
|
-
no checkout to work in. That is deliberate. Fixing merge conflicts or a
|
|
273
|
-
belongs in a real coding session; this panel is for the questions you'd
|
|
274
|
-
answer by opening six tabs. The Gmail draft is the one thing it creates,
|
|
275
|
-
Gmail tool the CLI has: with Claude Code that
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
the assistant hands you the text
|
|
294
|
+
The assistant is told to read and draft, and never to send, post or edit anything,
|
|
295
|
+
and it has no checkout to work in. That is deliberate. Fixing merge conflicts or a
|
|
296
|
+
failing build belongs in a real coding session; this panel is for the questions you'd
|
|
297
|
+
otherwise answer by opening six tabs. The Gmail draft is the one thing it creates,
|
|
298
|
+
and revises when you ask, through the Gmail tool the CLI has: with Claude Code that
|
|
299
|
+
is the claude.ai Gmail connector, which `DAILY_FOCUS_ASSISTANT_TOOLS` allows by
|
|
300
|
+
default; with Codex it is the Gmail app linked to your ChatGPT account, which the CLI
|
|
301
|
+
finds through its plugin catalogue. Without either, the assistant hands you the text
|
|
302
|
+
instead and says so.
|
|
303
|
+
|
|
304
|
+
### What the assistant can do
|
|
305
|
+
|
|
306
|
+
The assistant runs the CLI you already use, with the access that CLI already has.
|
|
307
|
+
The dashboard narrows some of that, and leaves the rest to the assistant's
|
|
308
|
+
instructions. What the CLI itself enforces:
|
|
309
|
+
|
|
310
|
+
- **Claude Code** may use only the tools in `DAILY_FOCUS_ASSISTANT_TOOLS`, and never
|
|
311
|
+
its file-editing tools, whatever the list says; anything else is refused rather
|
|
312
|
+
than asked about. Rules in your own Claude Code settings that allow a tool still
|
|
313
|
+
apply. The default list is broader than the assistant needs:
|
|
314
|
+
`mcp__claude_ai_Gmail` allows every tool on the Gmail connector, sending and
|
|
315
|
+
deleting included, and `gh` and `acli` can comment, merge and move tickets as well
|
|
316
|
+
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:
|
|
318
|
+
|
|
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
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
A tool left off the list is refused, so if the connector renames one, the
|
|
324
|
+
assistant reports that it can't reach your mail rather than working around it.
|
|
325
|
+
- **Codex** refuses every write through a connector (Gmail, Calendar, Drive, GitHub
|
|
326
|
+
and the other apps your ChatGPT account links) except creating and revising a
|
|
327
|
+
Gmail draft. A connector tool counts as a write unless it is marked read-only. A
|
|
328
|
+
tool you have told Codex to always allow, or an app given approval settings of its
|
|
329
|
+
own in your Codex config, keeps them. Computer use, the plugins that act in your
|
|
330
|
+
apps and browser with your sign-ins, is off unless you turn on
|
|
331
|
+
`DAILY_FOCUS_ASSISTANT_COMPUTER_USE`; the dashboard checks with Codex that it is
|
|
332
|
+
off before each session, and refuses to start one it can't confirm. Shell
|
|
333
|
+
commands follow your own Codex config: the sandbox keeps writes in the
|
|
334
|
+
assistant's working directory, and a command that needs to leave it is decided
|
|
335
|
+
by your Codex approval settings, as it would be in your own Codex. That keeps
|
|
336
|
+
`gh` working, and means it can write. All of this needs Codex 0.149.0 or
|
|
337
|
+
newer, and the page warns when yours is older. Before 0.144.0 Codex silently
|
|
338
|
+
ignores the refusal of connector writes, so the dashboard won't start the
|
|
339
|
+
assistant or the morning agent on it at all; before 0.149.0 it can't switch
|
|
340
|
+
computer use off, so the assistant won't answer while that setting is off.
|
|
341
|
+
|
|
342
|
+
### Answer ahead
|
|
343
|
+
|
|
344
|
+
With `DAILY_FOCUS_ASSISTANT_AUTO=on`, the dashboard asks the assistant before you
|
|
345
|
+
do. When a pull request lands in *Waiting on you* because someone reviewed or
|
|
346
|
+
commented, it asks the assistant to assess the review. When a check fails, it asks
|
|
347
|
+
for an explanation of the failure. The first line of the answer appears on the row,
|
|
348
|
+
on the board and on the brief item for the same pull request, while it still
|
|
349
|
+
matches the pull request's state. The whole answer is in the panel, as a turn you
|
|
350
|
+
can follow up on.
|
|
351
|
+
|
|
352
|
+
It asks about each state once. A new comment or a new failure is a new question;
|
|
353
|
+
the same checks failing again on the same commit are not. It runs one question at a
|
|
354
|
+
time and never on a row you're asking about, and it starts no more than
|
|
355
|
+
`DAILY_FOCUS_ASSISTANT_AUTO_LIMIT` a day (10 by default). It uses only those two
|
|
356
|
+
quick actions, which read and answer, and never one that drafts. It follows the
|
|
357
|
+
board, which reads only while a tab is open, so it asks while you have the
|
|
358
|
+
dashboard open. It is off by default because it spends the CLI's usage without
|
|
359
|
+
you pressing anything.
|
|
279
360
|
|
|
280
361
|
Its instructions live in `prompts/assistant.md`, linked into the store as
|
|
281
362
|
`assistant.md` each time the dashboard starts. What it says stays in the chat in the panel: it
|
|
@@ -399,7 +480,7 @@ DAILY_FOCUS_PROFILE=personal
|
|
|
399
480
|
The dashboard then links the personal prompt, `prompts/morning-brief-personal.md`,
|
|
400
481
|
into the store as `prompt.md`, and the source list starts from a template with
|
|
401
482
|
sections for those sources. The profile also switches off
|
|
402
|
-
the Jira board
|
|
483
|
+
the Jira board, and gives the tab a green house icon instead of the blue briefcase. The pull request
|
|
403
484
|
board stays on for side projects; point it at your personal account with
|
|
404
485
|
`DAILY_FOCUS_GITHUB_ACCOUNTS`, or set `DAILY_FOCUS_GITHUB=off`.
|
|
405
486
|
|
|
@@ -460,9 +541,7 @@ matters when `DAILY_FOCUS_FREE_WINDOWS` is off.
|
|
|
460
541
|
| `DAILY_FOCUS_MIN_FREE_WINDOW` | `45` | Minutes before a gap counts as a focus window |
|
|
461
542
|
| `DAILY_FOCUS_STALE_AFTER_HOURS` | `24` | When to expect a refresh. Shows an informational message for 45 minutes before warning that the agent may not have run. Counted only in hours a run was due, so days off never trip it |
|
|
462
543
|
| `DAILY_FOCUS_AGENT_DAYS` | `1-5` | Weekdays the dashboard runs the agent on, cron-style and cron-numbered: `1-5` for Monday to Friday, `0-4` for Sunday to Thursday, `0,6` for a weekend-only run |
|
|
463
|
-
| `
|
|
464
|
-
| `DAILY_FOCUS_AWAY_AFTER` | `10`; `0` for personal | Minutes of an untouched machine before a session is closed at the last sign of life. `0` turns it off |
|
|
465
|
-
| `DAILY_FOCUS_GITHUB` | `on` | `off` disables the pull request board; nothing is polled |
|
|
544
|
+
| `DAILY_FOCUS_GITHUB` | `on` | `off` disables the pull request board, and the ticket board stops checking GitHub; nothing is polled |
|
|
466
545
|
| `DAILY_FOCUS_GITHUB_ACCOUNTS` | *gh's active account* | Logins to poll as, comma-separated, each resolved with `gh auth token --user` |
|
|
467
546
|
| `DAILY_FOCUS_GITHUB_SCOPE` | *everything* | Organisations or `owner/repo` entries to limit the board to, comma-separated |
|
|
468
547
|
| `DAILY_FOCUS_GITHUB_MERGE_GATE_CHECKS` | *none* | Check names that stand for a repository's whole merge policy, comma-separated and matched exactly. Their rows get the *Waiting on merge gate* bucket |
|
|
@@ -484,13 +563,16 @@ matters when `DAILY_FOCUS_FREE_WINDOWS` is off.
|
|
|
484
563
|
| `DAILY_FOCUS_ASSISTANT_BIN` | *the CLI's name* | Path to the assistant's CLI, for when the server's PATH lacks it. `~` is expanded |
|
|
485
564
|
| `DAILY_FOCUS_ASSISTANT_MODEL` | *the CLI's own* | Model passed to the CLI untouched: an alias like `opus`, or a full id. Unset passes no flag |
|
|
486
565
|
| `DAILY_FOCUS_ASSISTANT_EFFORT` | *the CLI's own* | Effort passed to the CLI untouched: `low`, `medium`, `high`, `xhigh` or `max`. Unset passes no flag |
|
|
487
|
-
| `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. Ignored by Codex |
|
|
566
|
+
| `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 |
|
|
567
|
+
| `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 |
|
|
568
|
+
| `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) |
|
|
569
|
+
| `DAILY_FOCUS_ASSISTANT_AUTO_LIMIT` | `10` | How many times a day the assistant may start on its own, from 1 to 100 |
|
|
488
570
|
| `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 |
|
|
489
571
|
| `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` |
|
|
490
572
|
| `DAILY_FOCUS_AGENT_BIN` | *the CLI's name* | Path to that CLI, for when the server's PATH lacks it. `~` is expanded |
|
|
491
573
|
| `DAILY_FOCUS_AGENT_MODEL` | *the CLI's own* | Model passed to the CLI untouched. Unset passes no flag |
|
|
492
574
|
| `DAILY_FOCUS_AGENT_EFFORT` | *the CLI's own* | Effort passed to the CLI untouched. Unset passes no flag |
|
|
493
|
-
| `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. Ignored by Codex |
|
|
575
|
+
| `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 |
|
|
494
576
|
|
|
495
577
|
## If something looks wrong
|
|
496
578
|
|
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
import {
|
|
2
|
+
readSystemZone,
|
|
3
|
+
startingZone
|
|
4
|
+
} from "./chunk-Z4SFMMRQ.js";
|
|
1
5
|
import {
|
|
2
6
|
linkState
|
|
3
7
|
} from "./chunk-QKT2FAB5.js";
|
|
@@ -7,8 +11,9 @@ import {
|
|
|
7
11
|
parseBrief,
|
|
8
12
|
readArchiveIndex,
|
|
9
13
|
resolveItems,
|
|
10
|
-
runContractChecks
|
|
11
|
-
|
|
14
|
+
runContractChecks,
|
|
15
|
+
setsStatus
|
|
16
|
+
} from "./chunk-RZNQJ6UG.js";
|
|
12
17
|
import {
|
|
13
18
|
BRIEF_REFRESH_GRACE_HOURS,
|
|
14
19
|
describeSchedule,
|
|
@@ -18,7 +23,7 @@ import {
|
|
|
18
23
|
resolveSchedule,
|
|
19
24
|
runsOn,
|
|
20
25
|
workingMsBetween
|
|
21
|
-
} from "./chunk-
|
|
26
|
+
} from "./chunk-J7ZYVUG6.js";
|
|
22
27
|
import {
|
|
23
28
|
command
|
|
24
29
|
} from "./chunk-BC2W7NND.js";
|
|
@@ -27,6 +32,7 @@ import {
|
|
|
27
32
|
import { readFile, readdir } from "node:fs/promises";
|
|
28
33
|
import { resolve } from "node:path";
|
|
29
34
|
var config = loadConfig();
|
|
35
|
+
process.env.TZ = (await startingZone(config.timeZoneFile, await readSystemZone())).timeZone;
|
|
30
36
|
var store = new Store(config);
|
|
31
37
|
var failures = 0;
|
|
32
38
|
var warnings = 0;
|
|
@@ -175,7 +181,7 @@ if (!previous) {
|
|
|
175
181
|
const reproduced = [...previousIds].filter((id) => currentIds.has(id));
|
|
176
182
|
const dropped = [...previousIds].filter((id) => !currentIds.has(id));
|
|
177
183
|
const added = [...currentIds].filter((id) => !previousIds.has(id));
|
|
178
|
-
const actedOn = new Set(actions.filter(
|
|
184
|
+
const actedOn = new Set(actions.filter(setsStatus).map((a) => a.id));
|
|
179
185
|
const addedFingerprints = new Map(added.map((id) => [fingerprintId(id), id]));
|
|
180
186
|
const handled = dropped.filter((id) => actedOn.has(id));
|
|
181
187
|
const drifted = dropped.filter((id) => !actedOn.has(id) && addedFingerprints.has(fingerprintId(id)));
|
|
@@ -353,7 +353,10 @@ function envAssistant(env) {
|
|
|
353
353
|
binPath: expandHome((env.DAILY_FOCUS_ASSISTANT_BIN ?? "").trim() || (agent ?? "claude")),
|
|
354
354
|
model: envString("DAILY_FOCUS_ASSISTANT_MODEL", "", env) || null,
|
|
355
355
|
effort: envString("DAILY_FOCUS_ASSISTANT_EFFORT", "", env) || null,
|
|
356
|
-
tools: tools.length > 0 ? tools : DEFAULT_ASSISTANT_TOOLS
|
|
356
|
+
tools: tools.length > 0 ? tools : DEFAULT_ASSISTANT_TOOLS,
|
|
357
|
+
computerUse: envFlag("DAILY_FOCUS_ASSISTANT_COMPUTER_USE", false, env),
|
|
358
|
+
auto: envFlag("DAILY_FOCUS_ASSISTANT_AUTO", false, env),
|
|
359
|
+
autoLimit: envBounded("DAILY_FOCUS_ASSISTANT_AUTO_LIMIT", 10, 1, 100, env)
|
|
357
360
|
};
|
|
358
361
|
}
|
|
359
362
|
var DEFAULT_ASSISTANT_TOOLS = ["Bash(gh *)", "Bash(acli *)", "WebFetch", "mcp__claude_ai_Gmail"];
|
|
@@ -439,14 +442,10 @@ function loadConfig(env = loadEnv()) {
|
|
|
439
442
|
schemaFile: resolve2(dataDir, "items.schema.json"),
|
|
440
443
|
schemaSource: resolve2(import.meta.dirname, "..", "schema", "items.schema.json"),
|
|
441
444
|
archiveDir: resolve2(dataDir, "archive"),
|
|
442
|
-
sessionFile: resolve2(dataDir, "session.json"),
|
|
443
|
-
sessionsLogFile: resolve2(dataDir, "sessions.jsonl"),
|
|
444
445
|
pullsFile: resolve2(dataDir, "prs.json"),
|
|
445
446
|
calendarFile: resolve2(dataDir, "calendar.json"),
|
|
446
447
|
ticketsFile: resolve2(dataDir, "tickets.json"),
|
|
447
|
-
|
|
448
|
-
sessionMinutes: envBounded("DAILY_FOCUS_SESSION_MINUTES", 25, 1, 120, env),
|
|
449
|
-
awayAfterMinutes: envBounded("DAILY_FOCUS_AWAY_AFTER", profile === "personal" ? 0 : 10, 0, 24 * 60, env),
|
|
448
|
+
timeZoneFile: resolve2(dataDir, "timezone.json"),
|
|
450
449
|
port: envBounded("DAILY_FOCUS_PORT", 4321, 0, 65535, env),
|
|
451
450
|
host: envString("DAILY_FOCUS_HOST", "127.0.0.1", env),
|
|
452
451
|
freeWindows: envFlag("DAILY_FOCUS_FREE_WINDOWS", profile !== "personal", env),
|