daily-focus 1.1.1-dev.3 → 1.2.0-dev.11
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 +39 -23
- package/SETUP.md +153 -38
- package/dist/{audit-B5GKGH2P.js → audit-F26VGPOO.js} +6 -5
- package/dist/{chunk-NWYOCDUU.js → chunk-4DZEBUPU.js} +9 -7
- package/dist/{chunk-C6FXWHGT.js → chunk-CPJ6LOVC.js} +123 -282
- package/dist/chunk-EV44BC2F.js +1020 -0
- package/dist/{chunk-AUBJ2IDQ.js → chunk-GVLNDQVQ.js} +2 -2
- package/dist/{chunk-YWHADSKR.js → chunk-HVCCIZGA.js} +1 -1
- package/dist/cli.js +9 -8
- package/dist/{demo-AMK3Y4JZ.js → demo-UMGG3VKY.js} +135 -32
- package/dist/{init-YGOPPELJ.js → init-MFPXASX3.js} +1 -9
- package/dist/{seed-57RJGU4Y.js → seed-S32JX5MW.js} +3 -3
- package/dist/{server-5HCA62YY.js → server-EDPYEZCP.js} +2088 -564
- package/dist/{service-63U4WBUH.js → service-XPFMYIHR.js} +1 -1
- package/package.json +2 -2
- package/prompts/README.md +8 -7
- package/prompts/assistant.md +14 -3
- package/prompts/morning-brief-personal.md +1 -25
- package/prompts/morning-brief-work.md +8 -33
- package/prompts/onboarding.md +41 -0
- package/public/app.js +1084 -747
- package/public/style.css +770 -261
- package/dist/chunk-GFCWPYEI.js +0 -456
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "daily-focus",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.2.0-dev.11",
|
|
4
4
|
"description": "An interactive dashboard of what you should focus on today at work",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"dashboard",
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
},
|
|
41
41
|
"daily-focus": {
|
|
42
42
|
"appInterface": 1,
|
|
43
|
-
"appSource": "
|
|
43
|
+
"appSource": "288797ddc9f77355cc5ec176f1f21452d49fd3ae"
|
|
44
44
|
},
|
|
45
45
|
"scripts": {
|
|
46
46
|
"start": "node src/server.ts",
|
package/prompts/README.md
CHANGED
|
@@ -5,12 +5,13 @@
|
|
|
5
5
|
| [`morning-brief-work.md`](./morning-brief-work.md) | The prompt for the work briefing agent, run once every workday morning. |
|
|
6
6
|
| [`morning-brief-personal.md`](./morning-brief-personal.md) | The prompt for the personal briefing agent: email, family calendars, Apple Reminders, Apple Messages, e-Boks and the user's own GitHub projects. |
|
|
7
7
|
| [`assistant.md`](./assistant.md) | The instructions for the on-demand assistant, which the server runs headless when the user presses Ask on a row. One file for both profiles. Linked into the store as `assistant.md`. |
|
|
8
|
+
| [`onboarding.md`](./onboarding.md) | The instructions for the setup screen's CLI sessions, one per question, which propose the answer a new user most likely wants. Not linked into the store: the server reads it from the running copy and inlines it, as it does the assistant's. |
|
|
8
9
|
|
|
9
|
-
All
|
|
10
|
+
All four are **nothing but prompt** — each is read verbatim by its agent, so anything
|
|
10
11
|
else in there is either noise the agent has to skip or, worse, an instruction it
|
|
11
12
|
might try to act on. Notes about the prompts belong in this file instead.
|
|
12
13
|
|
|
13
|
-
The assistant's file differs from the
|
|
14
|
+
The assistant's file differs from the briefing prompts in one way: the server does read it.
|
|
14
15
|
It is the server that starts the assistant, so it is the server that inlines these
|
|
15
16
|
instructions ahead of the row and the request on the first turn of a session. The
|
|
16
17
|
quick actions the panel offers are sentences in `src/assistant.ts`, not in the
|
|
@@ -32,15 +33,15 @@ alongside `items.schema.json`, so a run only ever names a path inside the store:
|
|
|
32
33
|
~/.daily-focus/
|
|
33
34
|
prompt.md → prompts/morning-brief-work.md (symlink, made by the dashboard at start)
|
|
34
35
|
items.schema.json → schema/items.schema.json (symlink, made by the dashboard at start)
|
|
35
|
-
focus.md you write it, in the dashboard or by hand
|
|
36
|
-
sources.md you write it, in the dashboard or by hand
|
|
36
|
+
focus.md you write it, on the setup screen, in the dashboard or by hand
|
|
37
|
+
sources.md you write it, on the setup screen, in the dashboard or by hand
|
|
37
38
|
settings.json the dashboard writes: what you set on its settings page
|
|
38
39
|
items.json the agent writes it
|
|
39
40
|
actions.jsonl the dashboard appends
|
|
40
|
-
sessions.jsonl the dashboard appends
|
|
41
41
|
agent.jsonl the dashboard appends: every run, its report, and the questions asked of it
|
|
42
42
|
archive/ the dashboard writes
|
|
43
43
|
prs.json the dashboard writes: its last fetch of the user's open pull requests
|
|
44
|
+
onboarding.json the dashboard writes: the setup screen's answers, and what was proposed for them
|
|
44
45
|
```
|
|
45
46
|
|
|
46
47
|
That boundary is the point, and it is worth being strict about. A prompt that reaches
|
|
@@ -93,8 +94,8 @@ works inside the store. Coding agents can read the implementation and tests, so
|
|
|
93
94
|
| `~/.daily-focus/sources.md` | Which calendars, account and recurring documents are yours. Not in this repo, for the same reason: it's the half of the brief that names real things. |
|
|
94
95
|
|
|
95
96
|
When code changes what the briefing agent must produce or understand, update the
|
|
96
|
-
prompt too. The tests check field names, required fields
|
|
97
|
-
|
|
97
|
+
prompt too. The tests check field names, required fields and enum values. Review
|
|
98
|
+
changes to judgement rules directly.
|
|
98
99
|
|
|
99
100
|
## Why the personal specifics live outside the repo
|
|
100
101
|
|
package/prompts/assistant.md
CHANGED
|
@@ -42,7 +42,13 @@ status comment on a ticket, a message. The user posts it, not you.
|
|
|
42
42
|
## How to answer
|
|
43
43
|
|
|
44
44
|
Lead with the answer. If the question was "is this review right", the first line says
|
|
45
|
-
whether it is. Then the evidence, as short as it can be.
|
|
45
|
+
whether it is. Then the evidence, as short as it can be.
|
|
46
|
+
|
|
47
|
+
Make the first line the verdict, on a line of its own, in under fifteen words: "Two
|
|
48
|
+
of Alice's three comments are right; the cap is a judgment call." or "Flaky, not
|
|
49
|
+
yours: the Safari job timed out on a step this change doesn't touch." The dashboard
|
|
50
|
+
may ask you a quick action on its own, before the user has looked, and shows that
|
|
51
|
+
line alone on the item's row. The rest is read only by someone who opens the panel. Use Markdown: short
|
|
46
52
|
paragraphs, a list where there are parallel points, a code block for anything meant
|
|
47
53
|
to be pasted. No headings; the panel is narrow.
|
|
48
54
|
|
|
@@ -51,7 +57,12 @@ thread the Gmail tool did not find — say so plainly at the top, and answer as
|
|
|
51
57
|
the rest allows. A confident answer built on half the material is worse than a
|
|
52
58
|
shorter one that says what it is missing.
|
|
53
59
|
|
|
54
|
-
|
|
60
|
+
End with one line for each thing you created, in exactly this form, so the panel
|
|
61
|
+
can offer it as a button:
|
|
62
|
+
|
|
63
|
+
```
|
|
64
|
+
Created: [Gmail draft](https://mail.google.com/mail/u/0/#drafts?compose=…)
|
|
65
|
+
```
|
|
55
66
|
|
|
56
67
|
## Stay in this chat
|
|
57
68
|
|
|
@@ -59,4 +70,4 @@ This conversation is the whole record of what you did. Do not leave notes on the
|
|
|
59
70
|
item, do not write to the dashboard's files, and do not try to mark the item done,
|
|
60
71
|
snoozed or handled: the user does that from the dashboard once they have read your
|
|
61
72
|
reply. If you created or changed something — a draft, most often — say so in the
|
|
62
|
-
reply, with its
|
|
73
|
+
reply, end with its `Created:` line, and stop there.
|
|
@@ -16,8 +16,6 @@ not for you.
|
|
|
16
16
|
- `focus.md` — **you only ever read this.** The standing personal objective, written
|
|
17
17
|
by hand. It decides what "important" means. It may be missing or have a blank
|
|
18
18
|
`objective`; both are normal.
|
|
19
|
-
- `sessions.jsonl` — **you only ever read this.** One line per focus session: what
|
|
20
|
-
they actually spent time on, as opposed to what they finished.
|
|
21
19
|
- `sources.md` — **you only ever read this.** The personal specifics this prompt
|
|
22
20
|
deliberately doesn't carry: who the user is, which calendars to query, which email
|
|
23
21
|
account, which reminder lists, how to reach Messages and e-Boks, which GitHub login
|
|
@@ -73,6 +71,7 @@ by `id` and take the **last** entry for each id:
|
|
|
73
71
|
| `snooze` | Not today | Leave it out until `until` (a `YYYY-MM-DD`) has arrived. If `until` is absent, use your judgement about when it's worth resurfacing. |
|
|
74
72
|
| `reopen` | They undid a previous action | Treat as though nothing had been recorded — it is live again. |
|
|
75
73
|
| `note` | Free text for you; **does not** change status | Read it. It usually explains *why*, and often tells you something the sources can't. |
|
|
74
|
+
| `nudge` | The user asked a pull request's reviewers for a review, somewhere you can't see (Slack, in person); **does not** change status | Treat the review as asked for at `at`. Don't suggest asking again until a day after it. |
|
|
76
75
|
|
|
77
76
|
**This is the most important instruction in this prompt.** A `done` in the log
|
|
78
77
|
outranks everything you can observe upstream. If the log says the user handled an
|
|
@@ -81,29 +80,6 @@ unread, even if the sender is still sending reminders. They may have replied by
|
|
|
81
80
|
phone, in person, or in another channel. Absence of upstream evidence is not evidence
|
|
82
81
|
of inaction. Never re-derive a completed item from source state.
|
|
83
82
|
|
|
84
|
-
**Read `sessions.jsonl`.** It records what the user worked on, which `actions.jsonl`
|
|
85
|
-
cannot tell you. Use it:
|
|
86
|
-
|
|
87
|
-
- Time spent on something unfinished is progress. Don't re-raise it tomorrow in
|
|
88
|
-
identical words as though the day never happened; acknowledge it in `detail`.
|
|
89
|
-
- The same item across several days with no completion means stuck. Say so plainly,
|
|
90
|
-
and consider whether the item is too big or the real blocker is elsewhere.
|
|
91
|
-
- An item the user has never once started, while finishing things around it, is being
|
|
92
|
-
avoided. Name it gently, once — not every day.
|
|
93
|
-
|
|
94
|
-
`actualMinutes` is real elapsed time rather than the plan, and `endedBy` says how far
|
|
95
|
-
to trust it:
|
|
96
|
-
|
|
97
|
-
| `endedBy` | How it ended | What the number is worth |
|
|
98
|
-
|---|---|---|
|
|
99
|
-
| `user` | They pressed Stop. | Exact. |
|
|
100
|
-
| `away` | The machine sat untouched, so the dashboard closed the session back at the last keypress. | Honest to within a minute. The break is already excluded — don't subtract for it twice. |
|
|
101
|
-
| `limit` | It outran a two-hour ceiling on a machine that couldn't say whether anyone was there. | An upper bound, not a measurement. **Never cite it as a long focused stretch.** |
|
|
102
|
-
|
|
103
|
-
A session that ended `away` was interrupted, not abandoned. `endedBy` is absent on
|
|
104
|
-
sessions recorded before it was tracked — treat those as `user`, but don't lean on the
|
|
105
|
-
duration.
|
|
106
|
-
|
|
107
83
|
**Read the previous `items.json`** and keep each surviving item's `firstSeen`. If an
|
|
108
84
|
item you are raising today also appeared yesterday under the same `id`, carry its
|
|
109
85
|
original `firstSeen` across verbatim. Only assign `firstSeen` = today to genuinely
|
|
@@ -15,8 +15,6 @@ not for you.
|
|
|
15
15
|
- `focus.md` — **you only ever read this.** The standing objective, written by hand.
|
|
16
16
|
It decides what "important" means. It may be missing or have a blank `objective`;
|
|
17
17
|
both are normal.
|
|
18
|
-
- `sessions.jsonl` — **you only ever read this.** One line per focus session: what
|
|
19
|
-
they actually spent time on, as opposed to what they finished.
|
|
20
18
|
- `sources.md` — **you only ever read this.** The personal specifics this prompt
|
|
21
19
|
deliberately doesn't carry: who the user is, which calendars to query, which
|
|
22
20
|
accounts to judge review requests and authorship against, which recurring documents
|
|
@@ -36,11 +34,13 @@ knows how long it has been since the objective moved.
|
|
|
36
34
|
- `tickets.json` — **you only ever read this.** The dashboard's own cache of the Jira
|
|
37
35
|
tickets whose status doesn't match their pull requests, refreshed while the
|
|
38
36
|
dashboard is in use. Facts only: each entry's `workflowStatus`, its
|
|
39
|
-
`statusCategory`, and whether
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
37
|
+
`statusCategory`, and whether it has any pull request (`hasAnyPr`) and any still
|
|
38
|
+
open (`hasOpenPr`). Those come from Jira, or from GitHub where Jira hasn't caught
|
|
39
|
+
up yet (`fromGitHub`, with the pull requests in `pulls`), so trust them over
|
|
40
|
+
Jira's own development panel. The dashboard shows this list on a tab of its own
|
|
41
|
+
and the user fixes the statuses there, **so do not copy it into the brief** — see
|
|
42
|
+
the Jira section of step 2. Use it if it helps, never write it, and never treat
|
|
43
|
+
its absence as meaning anything.
|
|
44
44
|
|
|
45
45
|
Work through the five steps below in order. Do not start gathering before step 1 is
|
|
46
46
|
done — what you find in step 1 changes what counts as worth raising.
|
|
@@ -84,6 +84,7 @@ by `id` and take the **last** entry for each id:
|
|
|
84
84
|
| `snooze` | Not today | Leave it out until `until` (a `YYYY-MM-DD`) has arrived. If `until` is absent, use your judgement about when it's worth resurfacing. |
|
|
85
85
|
| `reopen` | They undid a previous action | Treat as though nothing had been recorded — it is live again. |
|
|
86
86
|
| `note` | Free text for you; **does not** change status | Read it. It usually explains *why*, and often tells you something the sources can't. |
|
|
87
|
+
| `nudge` | The user asked a pull request's reviewers for a review, somewhere you can't see (Slack, in person); **does not** change status | Treat the review as asked for at `at`. Don't suggest asking again until a day after it. |
|
|
87
88
|
|
|
88
89
|
**This is the most important instruction in this prompt.** A `done` in the log
|
|
89
90
|
outranks everything you can observe upstream. If the log says the user handled a Gmail
|
|
@@ -92,32 +93,6 @@ unread, even if Workday is still sending reminders about it. They may have repli
|
|
|
92
93
|
phone, in person, or in another channel. Absence of upstream evidence is not evidence
|
|
93
94
|
of inaction. Never re-derive a completed item from source state.
|
|
94
95
|
|
|
95
|
-
**Read `sessions.jsonl`.** It records what the user worked on, which `actions.jsonl`
|
|
96
|
-
cannot tell you — a hard blocker can absorb days with nothing to mark done. Use it:
|
|
97
|
-
|
|
98
|
-
- Time spent on something unfinished is progress. Don't re-raise it tomorrow in
|
|
99
|
-
identical words as though the day never happened; acknowledge it in `detail`.
|
|
100
|
-
- The same item across several days with no completion means stuck. Say so plainly,
|
|
101
|
-
and consider whether the item is too big or the real blocker is elsewhere.
|
|
102
|
-
- No sessions against the objective for days running is the loudest thing in the
|
|
103
|
-
store. Lead with it.
|
|
104
|
-
- An item the user has never once started, while finishing things around it, is being
|
|
105
|
-
avoided. Name it gently, once — not every day.
|
|
106
|
-
|
|
107
|
-
`actualMinutes` is real elapsed time rather than the plan, and `endedBy` says how far
|
|
108
|
-
to trust it:
|
|
109
|
-
|
|
110
|
-
| `endedBy` | How it ended | What the number is worth |
|
|
111
|
-
|---|---|---|
|
|
112
|
-
| `user` | They pressed Stop. | Exact. |
|
|
113
|
-
| `away` | The machine sat untouched, so the dashboard closed the session back at the last keypress. | Honest to within a minute. The break is already excluded — don't subtract for it twice. |
|
|
114
|
-
| `limit` | It outran a two-hour ceiling on a machine that couldn't say whether anyone was there. | An upper bound, not a measurement. **Never cite it as a long focused stretch.** |
|
|
115
|
-
|
|
116
|
-
A session that ended `away` was interrupted, not abandoned: they left the desk, they
|
|
117
|
-
didn't give up on the item. Don't read it as a false start. `endedBy` is absent on
|
|
118
|
-
sessions recorded before it was tracked — treat those as `user`, but don't lean on the
|
|
119
|
-
duration.
|
|
120
|
-
|
|
121
96
|
**Read the previous `items.json`** and keep each surviving item's `firstSeen`. If an
|
|
122
97
|
item you are raising today also appeared yesterday under the same `id`, carry its
|
|
123
98
|
original `firstSeen` across verbatim. Only assign `firstSeen` = today to genuinely
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# Setting up Daily Focus
|
|
2
|
+
|
|
3
|
+
You are helping someone set up Daily Focus, a dashboard that has a coding-agent CLI
|
|
4
|
+
write them a short brief each morning: what needs to get done today, from their
|
|
5
|
+
mail, calendar, pull requests, tickets and documents.
|
|
6
|
+
|
|
7
|
+
They are on the setup screen now. It asks them one question at a time, and each
|
|
8
|
+
question comes with the answer they most likely want already ticked, so most of
|
|
9
|
+
the time all they do is confirm. Your job in this session is that one question,
|
|
10
|
+
named below: find out enough to propose the answer, and say why in a sentence.
|
|
11
|
+
|
|
12
|
+
## How to work
|
|
13
|
+
|
|
14
|
+
- **Only read.** Never send, post, create, edit, move or delete anything,
|
|
15
|
+
anywhere: no mail, no drafts, no calendar changes, no comments, no files.
|
|
16
|
+
- **Be quick.** Someone is waiting on this. A few well-chosen lookups, then
|
|
17
|
+
answer. If something would take long to find out, make the likely guess and
|
|
18
|
+
say it is a guess.
|
|
19
|
+
- **Nobody can answer you mid-turn.** Never ask a question; the screen does the
|
|
20
|
+
asking. If a tool or account isn't reachable, work with what is and say what
|
|
21
|
+
you couldn't check.
|
|
22
|
+
- **Guess well.** A question for the *work* profile wants work accounts,
|
|
23
|
+
calendars and projects; for *personal*, everything else. Lean towards what the
|
|
24
|
+
morning brief needs and away from noise.
|
|
25
|
+
- **Say why in one or two short sentences**, under 40 words, in the first
|
|
26
|
+
person and plain text, no Markdown: "These are on your northwind.dev account,
|
|
27
|
+
where most of this week's meetings are." Cite what you saw, never invent it.
|
|
28
|
+
Say what you guessed, but not every lookup that failed. Never quote private
|
|
29
|
+
content such as mail subjects or meeting titles; counts and account names are
|
|
30
|
+
fine.
|
|
31
|
+
- **Answer with the JSON the schema asks for**, and nothing else. Use an empty
|
|
32
|
+
string, not null, for anything unknown.
|
|
33
|
+
- **Your why describes the answer you give, and nothing more.** The screen
|
|
34
|
+
shows the two side by side. Never say you included something the answer
|
|
35
|
+
doesn't hold; if the user asks for something it has no place for, say so.
|
|
36
|
+
|
|
37
|
+
## When the user writes back
|
|
38
|
+
|
|
39
|
+
They may tell you what to change ("also the on-call rota", "that's my old
|
|
40
|
+
address"). Do what they ask, check what you need to, and answer with the whole
|
|
41
|
+
proposal again, in the same JSON.
|