taskuary 0.2.0__tar.gz → 0.2.1__tar.gz

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.
Files changed (100) hide show
  1. {taskuary-0.2.0/taskuary.egg-info → taskuary-0.2.1}/PKG-INFO +8 -7
  2. {taskuary-0.2.0 → taskuary-0.2.1}/README.md +7 -6
  3. {taskuary-0.2.0 → taskuary-0.2.1}/pyproject.toml +1 -1
  4. {taskuary-0.2.0 → taskuary-0.2.1}/taskuary/agents.py +4 -1
  5. {taskuary-0.2.0 → taskuary-0.2.1}/taskuary/terminal.py +15 -3
  6. {taskuary-0.2.0 → taskuary-0.2.1/taskuary.egg-info}/PKG-INFO +8 -7
  7. {taskuary-0.2.0 → taskuary-0.2.1}/LICENSE +0 -0
  8. {taskuary-0.2.0 → taskuary-0.2.1}/setup.cfg +0 -0
  9. {taskuary-0.2.0 → taskuary-0.2.1}/taskuary/__init__.py +0 -0
  10. {taskuary-0.2.0 → taskuary-0.2.1}/taskuary/artifacts.py +0 -0
  11. {taskuary-0.2.0 → taskuary-0.2.1}/taskuary/aws.py +0 -0
  12. {taskuary-0.2.0 → taskuary-0.2.1}/taskuary/azure.py +0 -0
  13. {taskuary-0.2.0 → taskuary-0.2.1}/taskuary/blackboard.py +0 -0
  14. {taskuary-0.2.0 → taskuary-0.2.1}/taskuary/channels.py +0 -0
  15. {taskuary-0.2.0 → taskuary-0.2.1}/taskuary/ci.py +0 -0
  16. {taskuary-0.2.0 → taskuary-0.2.1}/taskuary/cli.py +0 -0
  17. {taskuary-0.2.0 → taskuary-0.2.1}/taskuary/coder.py +0 -0
  18. {taskuary-0.2.0 → taskuary-0.2.1}/taskuary/config.py +0 -0
  19. {taskuary-0.2.0 → taskuary-0.2.1}/taskuary/db.py +0 -0
  20. {taskuary-0.2.0 → taskuary-0.2.1}/taskuary/desktop.py +0 -0
  21. {taskuary-0.2.0 → taskuary-0.2.1}/taskuary/devtools.py +0 -0
  22. {taskuary-0.2.0 → taskuary-0.2.1}/taskuary/digest.py +0 -0
  23. {taskuary-0.2.0 → taskuary-0.2.1}/taskuary/docsync.py +0 -0
  24. {taskuary-0.2.0 → taskuary-0.2.1}/taskuary/github.py +0 -0
  25. {taskuary-0.2.0 → taskuary-0.2.1}/taskuary/histgen.py +0 -0
  26. {taskuary-0.2.0 → taskuary-0.2.1}/taskuary/imapmail.py +0 -0
  27. {taskuary-0.2.0 → taskuary-0.2.1}/taskuary/ingest.py +0 -0
  28. {taskuary-0.2.0 → taskuary-0.2.1}/taskuary/learn.py +0 -0
  29. {taskuary-0.2.0 → taskuary-0.2.1}/taskuary/llm.py +0 -0
  30. {taskuary-0.2.0 → taskuary-0.2.1}/taskuary/logs.py +0 -0
  31. {taskuary-0.2.0 → taskuary-0.2.1}/taskuary/mcp.py +0 -0
  32. {taskuary-0.2.0 → taskuary-0.2.1}/taskuary/messengers.py +0 -0
  33. {taskuary-0.2.0 → taskuary-0.2.1}/taskuary/mssql.py +0 -0
  34. {taskuary-0.2.0 → taskuary-0.2.1}/taskuary/outbound.py +0 -0
  35. {taskuary-0.2.0 → taskuary-0.2.1}/taskuary/phone.py +0 -0
  36. {taskuary-0.2.0 → taskuary-0.2.1}/taskuary/pm.py +0 -0
  37. {taskuary-0.2.0 → taskuary-0.2.1}/taskuary/policy.py +0 -0
  38. {taskuary-0.2.0 → taskuary-0.2.1}/taskuary/proof.py +0 -0
  39. {taskuary-0.2.0 → taskuary-0.2.1}/taskuary/proposals.py +0 -0
  40. {taskuary-0.2.0 → taskuary-0.2.1}/taskuary/reports.py +0 -0
  41. {taskuary-0.2.0 → taskuary-0.2.1}/taskuary/reshape.py +0 -0
  42. {taskuary-0.2.0 → taskuary-0.2.1}/taskuary/responder.py +0 -0
  43. {taskuary-0.2.0 → taskuary-0.2.1}/taskuary/routing.py +0 -0
  44. {taskuary-0.2.0 → taskuary-0.2.1}/taskuary/scopes.py +0 -0
  45. {taskuary-0.2.0 → taskuary-0.2.1}/taskuary/server.py +0 -0
  46. {taskuary-0.2.0 → taskuary-0.2.1}/taskuary/store.py +0 -0
  47. {taskuary-0.2.0 → taskuary-0.2.1}/taskuary/templates/coder.md +0 -0
  48. {taskuary-0.2.0 → taskuary-0.2.1}/taskuary/templates/digest.md +0 -0
  49. {taskuary-0.2.0 → taskuary-0.2.1}/taskuary/templates/learned.md +0 -0
  50. {taskuary-0.2.0 → taskuary-0.2.1}/taskuary/templates/soul.md +0 -0
  51. {taskuary-0.2.0 → taskuary-0.2.1}/taskuary/templates/style.md +0 -0
  52. {taskuary-0.2.0 → taskuary-0.2.1}/taskuary/templates/triage.md +0 -0
  53. {taskuary-0.2.0 → taskuary-0.2.1}/taskuary/toil.py +0 -0
  54. {taskuary-0.2.0 → taskuary-0.2.1}/taskuary/triage.py +0 -0
  55. {taskuary-0.2.0 → taskuary-0.2.1}/taskuary/verdicts.py +0 -0
  56. {taskuary-0.2.0 → taskuary-0.2.1}/taskuary/web/assets/index-6GBZ9nXN.css +0 -0
  57. {taskuary-0.2.0 → taskuary-0.2.1}/taskuary/web/assets/index-Cjj87C2X.js +0 -0
  58. {taskuary-0.2.0 → taskuary-0.2.1}/taskuary/web/favicon.ico +0 -0
  59. {taskuary-0.2.0 → taskuary-0.2.1}/taskuary/web/favicon.png +0 -0
  60. {taskuary-0.2.0 → taskuary-0.2.1}/taskuary/web/index.html +0 -0
  61. {taskuary-0.2.0 → taskuary-0.2.1}/taskuary/whatsapp/bridge.mjs +0 -0
  62. {taskuary-0.2.0 → taskuary-0.2.1}/taskuary/whatsapp/package.json +0 -0
  63. {taskuary-0.2.0 → taskuary-0.2.1}/taskuary.egg-info/SOURCES.txt +0 -0
  64. {taskuary-0.2.0 → taskuary-0.2.1}/taskuary.egg-info/dependency_links.txt +0 -0
  65. {taskuary-0.2.0 → taskuary-0.2.1}/taskuary.egg-info/entry_points.txt +0 -0
  66. {taskuary-0.2.0 → taskuary-0.2.1}/taskuary.egg-info/requires.txt +0 -0
  67. {taskuary-0.2.0 → taskuary-0.2.1}/taskuary.egg-info/top_level.txt +0 -0
  68. {taskuary-0.2.0 → taskuary-0.2.1}/tests/test_answers.py +0 -0
  69. {taskuary-0.2.0 → taskuary-0.2.1}/tests/test_api.py +0 -0
  70. {taskuary-0.2.0 → taskuary-0.2.1}/tests/test_blackboard.py +0 -0
  71. {taskuary-0.2.0 → taskuary-0.2.1}/tests/test_cloud.py +0 -0
  72. {taskuary-0.2.0 → taskuary-0.2.1}/tests/test_cloud_sources.py +0 -0
  73. {taskuary-0.2.0 → taskuary-0.2.1}/tests/test_config.py +0 -0
  74. {taskuary-0.2.0 → taskuary-0.2.1}/tests/test_core.py +0 -0
  75. {taskuary-0.2.0 → taskuary-0.2.1}/tests/test_desktop.py +0 -0
  76. {taskuary-0.2.0 → taskuary-0.2.1}/tests/test_devtools.py +0 -0
  77. {taskuary-0.2.0 → taskuary-0.2.1}/tests/test_diff_review.py +0 -0
  78. {taskuary-0.2.0 → taskuary-0.2.1}/tests/test_docs_and_llm.py +0 -0
  79. {taskuary-0.2.0 → taskuary-0.2.1}/tests/test_harvest.py +0 -0
  80. {taskuary-0.2.0 → taskuary-0.2.1}/tests/test_histgen.py +0 -0
  81. {taskuary-0.2.0 → taskuary-0.2.1}/tests/test_imapmail.py +0 -0
  82. {taskuary-0.2.0 → taskuary-0.2.1}/tests/test_mark_read.py +0 -0
  83. {taskuary-0.2.0 → taskuary-0.2.1}/tests/test_mcp.py +0 -0
  84. {taskuary-0.2.0 → taskuary-0.2.1}/tests/test_messengers.py +0 -0
  85. {taskuary-0.2.0 → taskuary-0.2.1}/tests/test_mssql.py +0 -0
  86. {taskuary-0.2.0 → taskuary-0.2.1}/tests/test_not_coding.py +0 -0
  87. {taskuary-0.2.0 → taskuary-0.2.1}/tests/test_pm.py +0 -0
  88. {taskuary-0.2.0 → taskuary-0.2.1}/tests/test_poll_overlap.py +0 -0
  89. {taskuary-0.2.0 → taskuary-0.2.1}/tests/test_poll_sources.py +0 -0
  90. {taskuary-0.2.0 → taskuary-0.2.1}/tests/test_proof_ci_proposals.py +0 -0
  91. {taskuary-0.2.0 → taskuary-0.2.1}/tests/test_reply_channels.py +0 -0
  92. {taskuary-0.2.0 → taskuary-0.2.1}/tests/test_reply_voice.py +0 -0
  93. {taskuary-0.2.0 → taskuary-0.2.1}/tests/test_reviews.py +0 -0
  94. {taskuary-0.2.0 → taskuary-0.2.1}/tests/test_scopes.py +0 -0
  95. {taskuary-0.2.0 → taskuary-0.2.1}/tests/test_sync_clock.py +0 -0
  96. {taskuary-0.2.0 → taskuary-0.2.1}/tests/test_task_identity.py +0 -0
  97. {taskuary-0.2.0 → taskuary-0.2.1}/tests/test_terminal.py +0 -0
  98. {taskuary-0.2.0 → taskuary-0.2.1}/tests/test_toil.py +0 -0
  99. {taskuary-0.2.0 → taskuary-0.2.1}/tests/test_vision.py +0 -0
  100. {taskuary-0.2.0 → taskuary-0.2.1}/tests/test_watermark.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: taskuary
3
- Version: 0.2.0
3
+ Version: 0.2.1
4
4
  Summary: Automate your job - the local-first operating system for your work: AI triage in, coding agents out.
5
5
  License: MIT
6
6
  Project-URL: Homepage, https://github.com/ldbumble/taskuary
@@ -51,6 +51,7 @@ Dynamic: license-file
51
51
  [![CI](https://github.com/ldbumble/taskuary/actions/workflows/ci.yml/badge.svg)](https://github.com/ldbumble/taskuary/actions/workflows/ci.yml)
52
52
  [![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
53
53
  [![Python 3.10+](https://img.shields.io/badge/python-3.10%2B-3776ab.svg)](https://github.com/ldbumble/taskuary)
54
+ [![PyPI](https://img.shields.io/pypi/v/taskuary.svg)](https://pypi.org/project/taskuary/)
54
55
  [![PRs welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](CONTRIBUTING.md)
55
56
  [![GitHub stars](https://img.shields.io/github/stars/ldbumble/taskuary?style=social)](https://github.com/ldbumble/taskuary/stargazers)
56
57
 
@@ -60,7 +61,7 @@ Dynamic: license-file
60
61
  scheduled reports land on one timeline; AI triage says what is real work; the coding CLI
61
62
  you already use does it; you approve the result. Runs entirely on your machine.
62
63
 
63
- ![Taskuary in use: the timeline of email, chats and scheduled reports; a mail opened to show why triage made it a task and the AI reply drafted for approval; a scheduled report landing with its bar chart and spreadsheet; the Reports pipeline list; and the agent board with live sessions and the note one agent left the next](docs/hero.gif)
64
+ ![Taskuary in use: the timeline of email, chats and scheduled reports; a mail opened to show why triage made it a task and the AI reply drafted for approval; a scheduled report landing with its bar chart and spreadsheet; the Reports pipeline list; and the agent board with live sessions and the note one agent left the next](https://raw.githubusercontent.com/ldbumble/taskuary/master/docs/hero.gif)
64
65
 
65
66
  <sub>Real app, real data — a mail triaged and its reply drafted for your approval, then a scheduled SQL report landing on the same rail with its chart and spreadsheet. Nothing sends without you.</sub>
66
67
 
@@ -92,7 +93,7 @@ sender (yours to review under Settings → Agent memory).
92
93
 
93
94
  The general lessons take a stricter road, so one odd Tuesday never becomes a rule:
94
95
 
95
- ![Your verdicts become a hypothesis with score s:2; agreeing verdicts add a point and contradictions remove one; at s:4 with proof from two or more people it is promoted into LEARNED.md, which then rides into every triage, draft and agent run](docs/learning-loop.svg)
96
+ ![Your verdicts become a hypothesis with score s:2; agreeing verdicts add a point and contradictions remove one; at s:4 with proof from two or more people it is promoted into LEARNED.md, which then rides into every triage, draft and agent run](https://raw.githubusercontent.com/ldbumble/taskuary/master/docs/learning-loop.svg)
96
97
 
97
98
  **How the memory works, concretely.** Each lesson is one line in `LEARNED.md` (Docs tab) —
98
99
  a guess with a score. Say you strip the greeting off three drafts this week; the file soon
@@ -129,7 +130,7 @@ markers always survive. What each one feeds from then on:
129
130
  ## Get started
130
131
 
131
132
  ```bash
132
- pip install git+https://github.com/ldbumble/taskuary
133
+ pip install taskuary
133
134
  taskuary # opens http://127.0.0.1:7787
134
135
  ```
135
136
 
@@ -161,7 +162,7 @@ No cloud key at all? Set **Settings → Triage & routing → Triage brain** to y
161
162
  and skip step 1 — one brain does everything, slower and pricier per message. See
162
163
  [One brain or two](#one-brain-or-two).
163
164
 
164
- Prefer a desktop app? `pip install "taskuary[desktop] @ git+https://github.com/ldbumble/taskuary"`
165
+ Prefer a desktop app? `pip install "taskuary[desktop]"`
165
166
  then `taskuary-desktop` — the same UI in a native window. A prebuilt single-file
166
167
  `Taskuary.exe` is attached to every CI run.
167
168
 
@@ -215,7 +216,7 @@ with no AI connected messages file visibly instead of heuristics spraying tasks.
215
216
 
216
217
  ## Many agents, one repo — no stepping on each other
217
218
 
218
- ![Two agents share one checkout: each working card shows the files ITS agent has modified (claude in the theme files, codex in the report code and its tests), and a third task waits in Queued with the reason written on the card — waiting on TQ-0009, both would modify ReportsView.jsx, starts by itself when it can](docs/screenshot-board.png)
219
+ ![Two agents share one checkout: each working card shows the files ITS agent has modified (claude in the theme files, codex in the report code and its tests), and a third task waits in Queued with the reason written on the card — waiting on TQ-0009, both would modify ReportsView.jsx, starts by itself when it can](https://raw.githubusercontent.com/ldbumble/taskuary/master/docs/screenshot-board.png)
219
220
 
220
221
  Auto-dispatch can put several CLIs to work at once — and the board keeps them out of each
221
222
  other's way with three light moves. No locks, no worktrees, no manager agent:
@@ -265,7 +266,7 @@ Plain markdown, all on the Docs tab, all yours to edit. Three you write, two wri
265
266
  themselves, and two can **bootstrap themselves from your mail history** (`TRIAGE.md` and
266
267
  `STYLE.md` — the Generate from history button). Each feeds exactly the calls it belongs in.
267
268
 
268
- ![TRIAGE.md, STYLE.md, SOUL.md and LEARNED.md feed triage and replies on the cheap model; SOUL.md, CODER.md and LEARNED.md feed coding agents on your CLI; DIGEST.md is your own morning read — and TRIAGE.md and STYLE.md can be generated from three months of your own mail](docs/six-docs.svg)
269
+ ![TRIAGE.md, STYLE.md, SOUL.md and LEARNED.md feed triage and replies on the cheap model; SOUL.md, CODER.md and LEARNED.md feed coding agents on your CLI; DIGEST.md is your own morning read — and TRIAGE.md and STYLE.md can be generated from three months of your own mail](https://raw.githubusercontent.com/ldbumble/taskuary/master/docs/six-docs.svg)
269
270
 
270
271
  | document | what it is | who reads it |
271
272
  |---|---|---|
@@ -3,6 +3,7 @@
3
3
  [![CI](https://github.com/ldbumble/taskuary/actions/workflows/ci.yml/badge.svg)](https://github.com/ldbumble/taskuary/actions/workflows/ci.yml)
4
4
  [![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
5
5
  [![Python 3.10+](https://img.shields.io/badge/python-3.10%2B-3776ab.svg)](https://github.com/ldbumble/taskuary)
6
+ [![PyPI](https://img.shields.io/pypi/v/taskuary.svg)](https://pypi.org/project/taskuary/)
6
7
  [![PRs welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](CONTRIBUTING.md)
7
8
  [![GitHub stars](https://img.shields.io/github/stars/ldbumble/taskuary?style=social)](https://github.com/ldbumble/taskuary/stargazers)
8
9
 
@@ -12,7 +13,7 @@
12
13
  scheduled reports land on one timeline; AI triage says what is real work; the coding CLI
13
14
  you already use does it; you approve the result. Runs entirely on your machine.
14
15
 
15
- ![Taskuary in use: the timeline of email, chats and scheduled reports; a mail opened to show why triage made it a task and the AI reply drafted for approval; a scheduled report landing with its bar chart and spreadsheet; the Reports pipeline list; and the agent board with live sessions and the note one agent left the next](docs/hero.gif)
16
+ ![Taskuary in use: the timeline of email, chats and scheduled reports; a mail opened to show why triage made it a task and the AI reply drafted for approval; a scheduled report landing with its bar chart and spreadsheet; the Reports pipeline list; and the agent board with live sessions and the note one agent left the next](https://raw.githubusercontent.com/ldbumble/taskuary/master/docs/hero.gif)
16
17
 
17
18
  <sub>Real app, real data — a mail triaged and its reply drafted for your approval, then a scheduled SQL report landing on the same rail with its chart and spreadsheet. Nothing sends without you.</sub>
18
19
 
@@ -44,7 +45,7 @@ sender (yours to review under Settings → Agent memory).
44
45
 
45
46
  The general lessons take a stricter road, so one odd Tuesday never becomes a rule:
46
47
 
47
- ![Your verdicts become a hypothesis with score s:2; agreeing verdicts add a point and contradictions remove one; at s:4 with proof from two or more people it is promoted into LEARNED.md, which then rides into every triage, draft and agent run](docs/learning-loop.svg)
48
+ ![Your verdicts become a hypothesis with score s:2; agreeing verdicts add a point and contradictions remove one; at s:4 with proof from two or more people it is promoted into LEARNED.md, which then rides into every triage, draft and agent run](https://raw.githubusercontent.com/ldbumble/taskuary/master/docs/learning-loop.svg)
48
49
 
49
50
  **How the memory works, concretely.** Each lesson is one line in `LEARNED.md` (Docs tab) —
50
51
  a guess with a score. Say you strip the greeting off three drafts this week; the file soon
@@ -81,7 +82,7 @@ markers always survive. What each one feeds from then on:
81
82
  ## Get started
82
83
 
83
84
  ```bash
84
- pip install git+https://github.com/ldbumble/taskuary
85
+ pip install taskuary
85
86
  taskuary # opens http://127.0.0.1:7787
86
87
  ```
87
88
 
@@ -113,7 +114,7 @@ No cloud key at all? Set **Settings → Triage & routing → Triage brain** to y
113
114
  and skip step 1 — one brain does everything, slower and pricier per message. See
114
115
  [One brain or two](#one-brain-or-two).
115
116
 
116
- Prefer a desktop app? `pip install "taskuary[desktop] @ git+https://github.com/ldbumble/taskuary"`
117
+ Prefer a desktop app? `pip install "taskuary[desktop]"`
117
118
  then `taskuary-desktop` — the same UI in a native window. A prebuilt single-file
118
119
  `Taskuary.exe` is attached to every CI run.
119
120
 
@@ -167,7 +168,7 @@ with no AI connected messages file visibly instead of heuristics spraying tasks.
167
168
 
168
169
  ## Many agents, one repo — no stepping on each other
169
170
 
170
- ![Two agents share one checkout: each working card shows the files ITS agent has modified (claude in the theme files, codex in the report code and its tests), and a third task waits in Queued with the reason written on the card — waiting on TQ-0009, both would modify ReportsView.jsx, starts by itself when it can](docs/screenshot-board.png)
171
+ ![Two agents share one checkout: each working card shows the files ITS agent has modified (claude in the theme files, codex in the report code and its tests), and a third task waits in Queued with the reason written on the card — waiting on TQ-0009, both would modify ReportsView.jsx, starts by itself when it can](https://raw.githubusercontent.com/ldbumble/taskuary/master/docs/screenshot-board.png)
171
172
 
172
173
  Auto-dispatch can put several CLIs to work at once — and the board keeps them out of each
173
174
  other's way with three light moves. No locks, no worktrees, no manager agent:
@@ -217,7 +218,7 @@ Plain markdown, all on the Docs tab, all yours to edit. Three you write, two wri
217
218
  themselves, and two can **bootstrap themselves from your mail history** (`TRIAGE.md` and
218
219
  `STYLE.md` — the Generate from history button). Each feeds exactly the calls it belongs in.
219
220
 
220
- ![TRIAGE.md, STYLE.md, SOUL.md and LEARNED.md feed triage and replies on the cheap model; SOUL.md, CODER.md and LEARNED.md feed coding agents on your CLI; DIGEST.md is your own morning read — and TRIAGE.md and STYLE.md can be generated from three months of your own mail](docs/six-docs.svg)
221
+ ![TRIAGE.md, STYLE.md, SOUL.md and LEARNED.md feed triage and replies on the cheap model; SOUL.md, CODER.md and LEARNED.md feed coding agents on your CLI; DIGEST.md is your own morning read — and TRIAGE.md and STYLE.md can be generated from three months of your own mail](https://raw.githubusercontent.com/ldbumble/taskuary/master/docs/six-docs.svg)
221
222
 
222
223
  | document | what it is | who reads it |
223
224
  |---|---|---|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "taskuary"
7
- version = "0.2.0"
7
+ version = "0.2.1"
8
8
  description = "Automate your job - the local-first operating system for your work: AI triage in, coding agents out."
9
9
  readme = "README.md"
10
10
  license = { text = "MIT" }
@@ -59,7 +59,10 @@ def _shim_target(path: str) -> list:
59
59
  here = os.path.dirname(path)
60
60
  found = []
61
61
  for tok in re.findall(r'"([^"]+)"', txt):
62
- real = os.path.normpath(tok.replace('%dp0%', here).replace('%~dp0', here))
62
+ # a batch file always writes \ - a separator on Windows, an ordinary character
63
+ # everywhere else. Translating it means this parser can be exercised by CI on
64
+ # Linux and macOS too, rather than only on the platform that has the bug.
65
+ real = os.path.normpath(tok.replace('%dp0%', here).replace('%~dp0', here).replace(chr(92), os.sep))
63
66
  if os.path.isfile(real) and real.lower().endswith(('.exe', '.js')): found.append(real)
64
67
  exe = next((f for f in found if f.lower().endswith('.exe')), None)
65
68
  js = next((f for f in found if f.lower().endswith('.js')), None)
@@ -636,6 +636,18 @@ def _cut(text: str, n: int, what: str = 'message') -> str:
636
636
  'Ask the owner for the rest before assuming anything past this point.]')
637
637
 
638
638
 
639
+ # An agent working a repository has no use for anybody's email address, and every prompt is
640
+ # a copy handed to a third-party CLI, written into its transcript and its own logs. So the
641
+ # addresses come out of everything we inject: SOUL.md carries the owner's, the coder rules and
642
+ # handover notes quote correspondents, and none of it changes a line of code. The NAME stays -
643
+ # "Sign as Uri J Nussbaum" still means something without the mailbox next to it.
644
+ _EMAIL = re.compile(r'\b[\w.+-]+@[\w-]+\.[\w.-]+')
645
+
646
+
647
+ def no_emails(text: str) -> str:
648
+ return _EMAIL.sub('[email removed]', text or '')
649
+
650
+
639
651
  def seed_text(store, tid: int, instruction: str = None, repo: str = None, cwd: str = None) -> str:
640
652
  """What gets typed into a fresh session, and the ONLY context it should need: the ask, the
641
653
  mail behind it, which checkout to work in, and the coder rules. One line - a newline
@@ -676,7 +688,7 @@ def seed_text(store, tid: int, instruction: str = None, repo: str = None, cwd: s
676
688
  note = next((c['Body'] for c in reversed(store.list_comments(tid))
677
689
  if str(c.get('Body') or '').startswith(PAUSE_MARKER)), None)
678
690
  if note: parts.append('HANDOVER: an earlier session on this task was paused and left this - '
679
- f'continue from it, do not start over: {_cut(note, 3000, "handover note")}')
691
+ f'continue from it, do not start over: {no_emails(_cut(note, 3000, "handover note"))}')
680
692
  # SOUL.md rides in WITH the coder rules, because the coder rules refer to it: CODER.md says
681
693
  # "work only in the repository the task names (see the repository map in SOUL.md)" and
682
694
  # claims it is "stacked on top of SOUL.md for every coder run" - and for a live session it
@@ -685,9 +697,9 @@ def seed_text(store, tid: int, instruction: str = None, repo: str = None, cwd: s
685
697
  # structurally incapable of seeing. It was right. These docs live in Taskuary's database;
686
698
  # if the prompt does not carry them, nothing does.
687
699
  soul = ' '.join(str(store.doc('soul') or '').split())[:SOUL_CHARS]
688
- if soul: parts.append(f'OPERATOR RULES (SOUL.md - authoritative): {soul}')
700
+ if soul: parts.append(f'OPERATOR RULES (SOUL.md - authoritative): {no_emails(soul)}')
689
701
  rules = rules_text(store)
690
- if rules: parts.append(f'RULES: {rules}')
702
+ if rules: parts.append(f'RULES: {no_emails(rules)}')
691
703
  # The job, spelled out. An agent handed a bare task description went looking for the ticket
692
704
  # it came from - Taskuary's own API, its database, the mailbox - and spent its first minute
693
705
  # re-fetching what is already in this paragraph.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: taskuary
3
- Version: 0.2.0
3
+ Version: 0.2.1
4
4
  Summary: Automate your job - the local-first operating system for your work: AI triage in, coding agents out.
5
5
  License: MIT
6
6
  Project-URL: Homepage, https://github.com/ldbumble/taskuary
@@ -51,6 +51,7 @@ Dynamic: license-file
51
51
  [![CI](https://github.com/ldbumble/taskuary/actions/workflows/ci.yml/badge.svg)](https://github.com/ldbumble/taskuary/actions/workflows/ci.yml)
52
52
  [![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
53
53
  [![Python 3.10+](https://img.shields.io/badge/python-3.10%2B-3776ab.svg)](https://github.com/ldbumble/taskuary)
54
+ [![PyPI](https://img.shields.io/pypi/v/taskuary.svg)](https://pypi.org/project/taskuary/)
54
55
  [![PRs welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](CONTRIBUTING.md)
55
56
  [![GitHub stars](https://img.shields.io/github/stars/ldbumble/taskuary?style=social)](https://github.com/ldbumble/taskuary/stargazers)
56
57
 
@@ -60,7 +61,7 @@ Dynamic: license-file
60
61
  scheduled reports land on one timeline; AI triage says what is real work; the coding CLI
61
62
  you already use does it; you approve the result. Runs entirely on your machine.
62
63
 
63
- ![Taskuary in use: the timeline of email, chats and scheduled reports; a mail opened to show why triage made it a task and the AI reply drafted for approval; a scheduled report landing with its bar chart and spreadsheet; the Reports pipeline list; and the agent board with live sessions and the note one agent left the next](docs/hero.gif)
64
+ ![Taskuary in use: the timeline of email, chats and scheduled reports; a mail opened to show why triage made it a task and the AI reply drafted for approval; a scheduled report landing with its bar chart and spreadsheet; the Reports pipeline list; and the agent board with live sessions and the note one agent left the next](https://raw.githubusercontent.com/ldbumble/taskuary/master/docs/hero.gif)
64
65
 
65
66
  <sub>Real app, real data — a mail triaged and its reply drafted for your approval, then a scheduled SQL report landing on the same rail with its chart and spreadsheet. Nothing sends without you.</sub>
66
67
 
@@ -92,7 +93,7 @@ sender (yours to review under Settings → Agent memory).
92
93
 
93
94
  The general lessons take a stricter road, so one odd Tuesday never becomes a rule:
94
95
 
95
- ![Your verdicts become a hypothesis with score s:2; agreeing verdicts add a point and contradictions remove one; at s:4 with proof from two or more people it is promoted into LEARNED.md, which then rides into every triage, draft and agent run](docs/learning-loop.svg)
96
+ ![Your verdicts become a hypothesis with score s:2; agreeing verdicts add a point and contradictions remove one; at s:4 with proof from two or more people it is promoted into LEARNED.md, which then rides into every triage, draft and agent run](https://raw.githubusercontent.com/ldbumble/taskuary/master/docs/learning-loop.svg)
96
97
 
97
98
  **How the memory works, concretely.** Each lesson is one line in `LEARNED.md` (Docs tab) —
98
99
  a guess with a score. Say you strip the greeting off three drafts this week; the file soon
@@ -129,7 +130,7 @@ markers always survive. What each one feeds from then on:
129
130
  ## Get started
130
131
 
131
132
  ```bash
132
- pip install git+https://github.com/ldbumble/taskuary
133
+ pip install taskuary
133
134
  taskuary # opens http://127.0.0.1:7787
134
135
  ```
135
136
 
@@ -161,7 +162,7 @@ No cloud key at all? Set **Settings → Triage & routing → Triage brain** to y
161
162
  and skip step 1 — one brain does everything, slower and pricier per message. See
162
163
  [One brain or two](#one-brain-or-two).
163
164
 
164
- Prefer a desktop app? `pip install "taskuary[desktop] @ git+https://github.com/ldbumble/taskuary"`
165
+ Prefer a desktop app? `pip install "taskuary[desktop]"`
165
166
  then `taskuary-desktop` — the same UI in a native window. A prebuilt single-file
166
167
  `Taskuary.exe` is attached to every CI run.
167
168
 
@@ -215,7 +216,7 @@ with no AI connected messages file visibly instead of heuristics spraying tasks.
215
216
 
216
217
  ## Many agents, one repo — no stepping on each other
217
218
 
218
- ![Two agents share one checkout: each working card shows the files ITS agent has modified (claude in the theme files, codex in the report code and its tests), and a third task waits in Queued with the reason written on the card — waiting on TQ-0009, both would modify ReportsView.jsx, starts by itself when it can](docs/screenshot-board.png)
219
+ ![Two agents share one checkout: each working card shows the files ITS agent has modified (claude in the theme files, codex in the report code and its tests), and a third task waits in Queued with the reason written on the card — waiting on TQ-0009, both would modify ReportsView.jsx, starts by itself when it can](https://raw.githubusercontent.com/ldbumble/taskuary/master/docs/screenshot-board.png)
219
220
 
220
221
  Auto-dispatch can put several CLIs to work at once — and the board keeps them out of each
221
222
  other's way with three light moves. No locks, no worktrees, no manager agent:
@@ -265,7 +266,7 @@ Plain markdown, all on the Docs tab, all yours to edit. Three you write, two wri
265
266
  themselves, and two can **bootstrap themselves from your mail history** (`TRIAGE.md` and
266
267
  `STYLE.md` — the Generate from history button). Each feeds exactly the calls it belongs in.
267
268
 
268
- ![TRIAGE.md, STYLE.md, SOUL.md and LEARNED.md feed triage and replies on the cheap model; SOUL.md, CODER.md and LEARNED.md feed coding agents on your CLI; DIGEST.md is your own morning read — and TRIAGE.md and STYLE.md can be generated from three months of your own mail](docs/six-docs.svg)
269
+ ![TRIAGE.md, STYLE.md, SOUL.md and LEARNED.md feed triage and replies on the cheap model; SOUL.md, CODER.md and LEARNED.md feed coding agents on your CLI; DIGEST.md is your own morning read — and TRIAGE.md and STYLE.md can be generated from three months of your own mail](https://raw.githubusercontent.com/ldbumble/taskuary/master/docs/six-docs.svg)
269
270
 
270
271
  | document | what it is | who reads it |
271
272
  |---|---|---|
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes