@aitne-sh/aitne 0.1.5 → 0.1.7

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 (77) hide show
  1. package/README.md +295 -479
  2. package/agent-assets/agent-profiles/_safety.md +17 -2
  3. package/agent-assets/agent-profiles/routine-fetch-window.md +75 -40
  4. package/agent-assets/agent-profiles/wiki-agent.md +19 -0
  5. package/agent-assets/docs/features/messaging/bang-commands.md +161 -0
  6. package/agent-assets/docs/features/messaging/overview.md +3 -0
  7. package/agent-assets/docs/features/wiki/commands.md +222 -0
  8. package/agent-assets/docs/features/wiki/overview.md +145 -0
  9. package/agent-assets/docs/getting-started/03-what-can-this-do.md +18 -0
  10. package/agent-assets/docs/glossary.md +34 -0
  11. package/agent-assets/docs/guides/budget-and-cost-for-wiki.md +123 -0
  12. package/agent-assets/docs/guides/build-your-wiki.md +99 -0
  13. package/agent-assets/docs/guides/explore-with-trace-and-connect.md +169 -0
  14. package/agent-assets/docs/guides/maintain-wiki-health.md +168 -0
  15. package/agent-assets/docs/guides/multiple-wikis-for-multiple-domains.md +192 -0
  16. package/agent-assets/docs/guides/pause-the-agent.md +10 -3
  17. package/agent-assets/docs/guides/use-an-existing-obsidian-vault.md +156 -0
  18. package/agent-assets/docs/reference/cli-commands.md +24 -1
  19. package/agent-assets/docs/troubleshooting/wiki-ingest-full-blocked.md +96 -0
  20. package/agent-assets/docs/troubleshooting/wiki-write-failed.md +82 -0
  21. package/agent-assets/skills/context/SKILL.md +288 -17
  22. package/agent-assets/skills/external-services/SKILL.delegated.claude.md +2 -2
  23. package/agent-assets/skills/external-services/SKILL.delegated.codex.md +3 -3
  24. package/agent-assets/skills/external-services/SKILL.delegated.gemini.md +6 -6
  25. package/agent-assets/skills/external-services/SKILL.md +5 -3
  26. package/agent-assets/skills/external-services/SKILL.native.claude.md +49 -58
  27. package/agent-assets/skills/external-services/SKILL.native.codex.md +50 -58
  28. package/agent-assets/skills/external-services/SKILL.native.gemini.md +53 -56
  29. package/agent-assets/skills/mail/SKILL.md +5 -5
  30. package/agent-assets/skills/mail/SKILL.native.claude.md +57 -65
  31. package/agent-assets/skills/mail/SKILL.native.codex.md +73 -75
  32. package/agent-assets/skills/mail/SKILL.native.gemini.md +80 -75
  33. package/agent-assets/skills/management-task-register/SKILL.md +3 -3
  34. package/agent-assets/skills/notion/SKILL.native.claude.md +78 -82
  35. package/agent-assets/skills/notion/SKILL.native.codex.md +78 -80
  36. package/agent-assets/skills/notion/SKILL.native.gemini.md +91 -90
  37. package/agent-assets/skills/observations/SKILL.md +104 -14
  38. package/agent-assets/skills/roadmap/SKILL.md +19 -0
  39. package/agent-assets/skills/schedule/SKILL.md +44 -3
  40. package/agent-assets/skills/today/SKILL.md +25 -5
  41. package/agent-assets/skills/travel-time/SKILL.md +9 -0
  42. package/agent-assets/skills/wiki/wiki-ask/SKILL.md +32 -0
  43. package/agent-assets/skills/wiki/wiki-compile/SKILL.md +126 -0
  44. package/agent-assets/skills/wiki/wiki-connect/SKILL.md +75 -0
  45. package/agent-assets/skills/wiki/wiki-graduate/SKILL.md +45 -0
  46. package/agent-assets/skills/wiki/wiki-ingest/SKILL.md +182 -0
  47. package/agent-assets/skills/wiki/wiki-lint/SKILL.md +90 -0
  48. package/agent-assets/skills/wiki/wiki-trace/SKILL.md +72 -0
  49. package/agent-assets/skills/wiki/wiki-vault-rules/SKILL.md +145 -0
  50. package/agent-assets/task-flows/_partials/calendar-acquire.google_calendar.md +28 -9
  51. package/agent-assets/task-flows/_partials/calendar-acquire.outlook_calendar.md +26 -9
  52. package/agent-assets/task-flows/_partials/mail-acquire.gmail.md +51 -24
  53. package/agent-assets/task-flows/_partials/mail-acquire.outlook_mail.md +46 -16
  54. package/agent-assets/task-flows/_partials/notion-acquire.notion.md +29 -9
  55. package/agent-assets/task-flows/message.received.dm.md +35 -2
  56. package/agent-assets/task-flows/message.received.dm.native.claude.md +25 -26
  57. package/agent-assets/task-flows/message.received.dm.native.codex.md +30 -24
  58. package/agent-assets/task-flows/message.received.dm.native.gemini.md +36 -36
  59. package/agent-assets/task-flows/message.received.dm_first.md +43 -4
  60. package/agent-assets/task-flows/message.received.dm_first.native.claude.md +20 -20
  61. package/agent-assets/task-flows/message.received.dm_first.native.codex.md +22 -19
  62. package/agent-assets/task-flows/message.received.dm_first.native.gemini.md +28 -24
  63. package/agent-assets/task-flows/routine.fetch_window.md +51 -36
  64. package/agent-assets/task-flows/routine.morning_routine.md +12 -3
  65. package/agent-assets/task-flows/routine.morning_routine_initial.md +22 -1
  66. package/agent-assets/task-flows/scheduled.dm.md +477 -0
  67. package/agent-assets/task-flows/wiki.ask.md +11 -0
  68. package/agent-assets/task-flows/wiki.compile.md +28 -0
  69. package/agent-assets/task-flows/wiki.connect.md +12 -0
  70. package/agent-assets/task-flows/wiki.ingest_url.md +35 -0
  71. package/agent-assets/task-flows/wiki.lint.md +13 -0
  72. package/agent-assets/task-flows/wiki.trace.md +13 -0
  73. package/agent-assets/wiki-seeds/schemas/output.md +12 -0
  74. package/agent-assets/wiki-seeds/schemas/raw.md +13 -0
  75. package/agent-assets/wiki-seeds/schemas/wiki.md +12 -0
  76. package/agent-assets/wiki-seeds/taxonomy.md +13 -0
  77. package/package.json +21 -41
package/README.md CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  ### Always on. Always yours.
6
6
 
7
- **A local-first, proactive personal AI agent that runs continuously on your own machine — and gets smarter about *you* every day.**
7
+ **A local-first, proactive personal AI agent that runs continuously on your own machine — and learns *you* every day.**
8
8
 
9
9
  [![npm version](https://img.shields.io/npm/v/@aitne-sh/aitne.svg)](https://www.npmjs.com/package/@aitne-sh/aitne)
10
10
  [![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](./LICENSE)
@@ -21,129 +21,194 @@ aitne start
21
21
 
22
22
  ---
23
23
 
24
- ## The concept
24
+ ## Overview
25
25
 
26
- ChatGPT and Claude are *reactive* — they wait for you to type. **Aitne is proactive.** It's a tiny daemon that lives on your laptop, watches your calendar, mail, repos and notes, and acts on its own — drafting your morning plan at 04:00, surfacing the email you forgot, nudging you about the PR your teammate is waiting on, and weaving everything into a Markdown journal you actually own.
26
+ ChatGPT and Claude wait for you to type. **Aitne does not.** It's a tiny TypeScript daemon that lives on your laptop, watches your calendar, mail, repositories, and notes, and acts on its own — drafting your morning plan at 04:00, surfacing the email you forgot, nudging you about the PR your teammate is waiting on, and weaving everything into Markdown files *you* own.
27
27
 
28
- ```mermaid
29
- flowchart LR
30
- subgraph WORLD["Your digital life"]
31
- direction TB
32
- W1["💬 Messages"]
33
- W2["📅 Calendar"]
34
- W3["📧 Mail"]
35
- W4["📦 Git"]
36
- W5["📓 Notes"]
37
- end
28
+ You bring the brain — Claude Code, OpenAI Codex CLI, or Google Gemini CLI. Aitne is the nervous system that schedules, routes, observes, and remembers.
38
29
 
39
- subgraph LOCAL["💻 Your laptop — Aitne"]
40
- direction TB
41
- DAEMON["⚙️ Daemon<br/>(always-on)"]
42
- BRAIN["🧠 Your AI<br/>(Claude · Codex · Gemini)"]
43
- MEMORY["📝 Markdown memory<br/>(plain files you own)"]
44
- DAEMON <--> BRAIN
45
- BRAIN <--> MEMORY
46
- DAEMON <--> MEMORY
47
- end
30
+ ---
48
31
 
49
- YOU["📱 You<br/>Slack · Telegram · Discord<br/>WhatsApp · Web chat"]
32
+ ## What makes Aitne different
50
33
 
51
- WORLD <--> DAEMON
52
- DAEMON <--> YOU
53
- ```
34
+ **It compounds.** Every DM, every reaction, every implicit signal shapes how Aitne thinks about you. After a month it sounds like you. After a year it remembers what you forgot last quarter. The model never changes — *the context does*.
54
35
 
55
- Three things make Aitne different:
36
+ **You manage it in plain language.** "Don't ping me before 9am." "Remember my partner's birthday." "Stop running hourly checks on weekends." A dedicated set of management skills (`management-task-register`, `management-policy`, `user-profile`, …) maps your words to settings, schedules, and profile updates. No 80-panel settings UI.
56
37
 
57
- | | |
58
- |---|---|
59
- | 🌱 **It compounds.** | Every day, every DM, every reaction emoji shapes the agent's understanding of *you*. After a month it sounds like you. After a year it knows what you forgot last quarter. |
60
- | 🗣️ **You manage it in plain language.** | "Don't ping me before 9am." "Remember my partner's birthday." "Stop running hourly checks on weekends." Aitne maps your words to settings, schedules, and profile updates — automatically. |
61
- | 🔌 **It rides on what you already have.** | Your Claude Code skills, your Codex config, your Gemini settings, your custom MCP servers Aitne loads them into every session. No re-configuring. No re-buying. |
38
+ **It rides on what you already have.** Your `~/.claude/skills`, your `~/.codex/config.toml`, your `~/.gemini/` settings, your custom MCP servers — Aitne reads them on session init and layers its persona on top. Your existing toolkit shows up in every Aitne-spawned session. No re-configuring. No vendor lock.
39
+
40
+ **Your memory is plain Markdown.** Everything Aitne writes lands in `~/.personal-agent/context/*.md`. You can `cat`, `vim`, `obsidian`, or `cp` any of it. Uninstall and the memory is still yours. No proprietary format. No migration headache.
41
+
42
+ **It runs entirely on your machine.** The daemon binds to `127.0.0.1` only. Secrets live in the OS keychain (macOS Keychain / libsecret / DPAPI). No telemetry. No cloud state. Verify with `lsof` and `nettop`.
62
43
 
63
44
  ---
64
45
 
65
- ## A day with Aitne
46
+ ## Installation
66
47
 
67
- > A real walkthrough of one user's Tuesday.
48
+ ### From npm
68
49
 
69
- **04:00 While you sleep.** Aitne reads yesterday's handoff, your calendar for today, the last 24 hours of mail across your accounts, new commits in your repos, and the pending observations from Notion. It generates `today.md` and queues a Morning Briefing DM for after quiet hours end.
50
+ The recommended path. Installs the `aitne` CLI globally with the daemon, dashboard, and built-in agent assets.
70
51
 
71
- **07:30 — Slack DM lands as you grab coffee:**
72
- > Good morning. 3 things to flag:
73
- > • **Sarah's PR (#487)** needs your review — she's been blocked since Friday
74
- > • **Sales call with Acme @ 14:00** — leaving home by 13:25 (12-min commute)
75
- > • **IRS reminder from Friday** — deadline is *tomorrow*
76
- >
77
- > Today: 2 meetings, 4 tasks. Light day. Reply `end` to close, or just talk to me.
52
+ ```bash
53
+ npm install -g @aitne-sh/aitne@latest
54
+ aitne start
55
+ ```
78
56
 
79
- **09:15 You DM Aitne:** *"Tell Sarah I'll review by 11. And book lunch with Mark on Thursday — somewhere near his office."*
80
- Aitne drafts the Slack reply to Sarah, finds 3 lunch slots Thursday, checks Mark's last 5 lunch venues from your `people.md`, suggests Tartine. You confirm. Done.
57
+ Then bring **at least one** AI backend:
81
58
 
82
- **11:30 — Hourly check fires.** A new commit in your repo modified the API contract you're about to ship. Aitne adds a note to `Agent Notes` on `today.md` and DMs once: *"⚠️ Heads up — `auth.ts:84` was just changed by @Yuki. Want me to summarize the diff?"*
59
+ ```bash
60
+ # Claude Code — full feature support including server-side advisor
61
+ npm install -g @anthropic-ai/claude-code
62
+ claude auth login
83
63
 
84
- **13:45 Calendar approach.** *"Sales call in 15 min. Acme is the warm lead from last Tuesday — they mentioned wanting webhook integration. Brief is in `projects/acme.md`."*
64
+ # OpenAI Codex CLI
65
+ npm install -g @openai/codex
66
+ codex login --device-auth
85
67
 
86
- **15:45 You forward a hotel confirmation email to Aitne.** It extracts dates, address, confirmation number into `travel_bookings`, saves the PDF to `~/.personal-agent/context/receipts/2026/05/`, and adds the trip to next week's morning briefing.
68
+ # Google Gemini CLI
69
+ npm install -g @google/gemini-cli
70
+ # OAuth handled on first use
71
+ ```
87
72
 
88
- **18:00 Evening review.** Aitne notices you didn't reply to two emails from this morning. They get carried to tomorrow's `today.md`. It also sees you wrote *"shorter please"* twice today, classifies that as a tone-class signal, and silently shortens its replies going forward.
73
+ Login once with each CLI you intend to use Aitne auto-detects them on the next session.
89
74
 
90
- **Friday 18:30 Weekly review.**
91
- > Week of 2026-05-04: shipped 3 PRs, 2 deferred. Open loops: hotel cancellation, Acme follow-up. Focus next week: launch prep. Heads up: you've worked past 22:00 every day this week — should I clear Friday afternoon?
75
+ ### From source (git)
76
+
77
+ For contributors, or if you want to hack on the daemon directly. Requires Node ≥ 22 and pnpm 10.x.
78
+
79
+ ```bash
80
+ git clone https://github.com/Aitne-sh/Aitne.git aitne
81
+ cd aitne
82
+ corepack enable
83
+ pnpm install
84
+ pnpm start # build (if stale) + launch daemon and dashboard in background
85
+ # or
86
+ pnpm dev # foreground with full stdio for debugging
87
+ ```
88
+
89
+ Common workflows:
92
90
 
93
- That's a normal Tuesday. The point isn't any single trick — it's that **all of this happens without you opening an app.**
91
+ ```bash
92
+ pnpm test # vitest unit tests across packages/*
93
+ pnpm test:watch
94
+ pnpm lint # turbo run lint
95
+ pnpm clean # turbo clean + remove node_modules and .buildstamp
96
+ ```
97
+
98
+ ### Verifying the install
99
+
100
+ ```bash
101
+ aitne status # PIDs, uptime, connected platforms, backends, today's spend
102
+ aitne doctor # 9-check install diagnostic
103
+ aitne logs -f # tail the daemon log
104
+ ```
105
+
106
+ The daemon listens on `:8321`, the dashboard on `:3000`. Open `http://localhost:3000` and finish the 9-step setup wizard.
94
107
 
95
108
  ---
96
109
 
97
- ## What you can do with it
110
+ ## How it works
98
111
 
99
- A non-exhaustive list. Click any group to expand.
112
+ A long-running daemon receives signals from every channel you've connected, parks short-term state in SQLite, and spawns an AI session whenever it needs to think. The session reads your Markdown memory, calls a curated set of skills, and writes results back through the daemon API.
113
+
114
+ ```mermaid
115
+ flowchart LR
116
+ subgraph WORLD["Your digital life"]
117
+ direction TB
118
+ W1["Messages"]
119
+ W2["Calendar"]
120
+ W3["Mail"]
121
+ W4["Git / GitHub"]
122
+ W5["Notes"]
123
+ end
124
+
125
+ subgraph LOCAL["Your laptop"]
126
+ direction TB
127
+ DAEMON["Aitne daemon<br/>(always on)"]
128
+ BRAIN["AI session<br/>Claude / Codex / Gemini"]
129
+ MEMORY["Markdown memory<br/>plain files you own"]
130
+ DAEMON --- BRAIN
131
+ BRAIN --- MEMORY
132
+ DAEMON --- MEMORY
133
+ end
134
+
135
+ YOU["You<br/>Slack · Telegram · Discord<br/>WhatsApp · Web dashboard"]
136
+
137
+ WORLD --- DAEMON
138
+ DAEMON --- YOU
139
+ ```
140
+
141
+ The daemon runs two execution paths in parallel:
142
+
143
+ - **Reactive path** — owner DMs, mentions, cron-driven routines (morning, evening, weekly, monthly), and calendar-approach events flow through the EventBus into the Dispatcher, which spawns a backend session sized for the work.
144
+ - **Polling path** — observers for Git, GitHub, Obsidian, Notion, Calendar, and mail write to an `observations` table without spawning sessions. A cron-driven hourly check triages those observations through a lite-tier session, then escalates to a full Sonnet-class session only if something worth surfacing was found.
145
+
146
+ A pre-pass `routine.fetch_window` session runs before each routine, fanning out per-account fetches (mail, calendar, Notion) into the `observations` table so the main session reads from a single source.
147
+
148
+ ### What you can do with it
149
+
150
+ A non-exhaustive catalogue — every entry below is backed by an implemented skill, route, or observer. Click to expand.
100
151
 
101
152
  <details>
102
- <summary><b>📅 Time, calendar, travel</b></summary>
153
+ <summary><b>Time, calendar, travel</b></summary>
103
154
 
104
155
  - Auto-generate `today.md` every morning with your real schedule
105
156
  - 15-min approach reminders for every calendar event, with travel time pre-computed via Google Maps
106
- - "Find me a 30-min slot with Sarah and Mark next week" — Aitne checks freebusy across calendars
157
+ - Find a 30-min slot across multiple calendars — Aitne checks freebusy and replies with options
107
158
  - Auto-extract flight, hotel, restaurant, train confirmations from email into a structured travel timeline
108
159
  - Surface tomorrow's itinerary in the morning briefing
109
160
  - "What time should I leave for my next meeting?" — answers with live traffic
110
161
  </details>
111
162
 
112
163
  <details>
113
- <summary><b>📧 Mail across all your accounts</b></summary>
164
+ <summary><b>Mail across every account</b></summary>
114
165
 
115
166
  - Unified inbox across Gmail, Outlook, Yahoo, and iCloud (OAuth or app-password / IMAP)
116
- - Local FTS5 full-text search across **every** account ("find emails about acme last quarter")
117
- - Auto-classify, label, and archive (Gmail) — full filter rules across all providers
167
+ - Local FTS5 full-text search across every account ("find emails about acme last quarter")
168
+ - Auto-classify, label, and archive (Gmail) — filter rules across all providers
118
169
  - Draft replies in your style ("draft a polite no to this conference invite")
119
- - Forwarded receipts auto-extracted to a structured `receipts` table tagged with category, vendor, amount
170
+ - Forwarded receipts extract to a structured `receipts` table with category, vendor, amount
120
171
  - Daily digest of unread mail in the morning briefing
121
- - IMAP IDLE for near-real-time delivery; PDF/image attachments are extracted and indexed
172
+ - IMAP IDLE for near-real-time delivery; PDF and image attachments are extracted and indexed
122
173
  </details>
123
174
 
124
175
  <details>
125
- <summary><b>📓 Knowledge: Obsidian, Notion, your own notes</b></summary>
176
+ <summary><b>Knowledge: Obsidian, Notion, your own notes</b></summary>
126
177
 
127
178
  - Use your existing Obsidian vault as Aitne's primary memory store — wiki-links keep working
128
179
  - Append to your daily note via the official Obsidian CLI (`obsidian create` / `daily:append`)
129
- - Full Notion page & database CRUD — query, create, update, archive
180
+ - Full Notion page and database CRUD — query, create, update, archive
130
181
  - "Summarize what I wrote about this project last month" — across vault layers
131
- - Auto-link new notes to existing concepts ("this is related to your `agent-architecture.md` from March")
182
+ - Auto-link new notes to existing concepts
183
+ </details>
184
+
185
+ <details>
186
+ <summary><b>Build a personal wiki from anything you DM</b></summary>
187
+
188
+ - DM `!ingest <url>` — the agent fetches, summarises, and saves a raw note in `10_raw/`
189
+ - Run `!compile` to synthesise raw notes into linked wiki articles in `20_wiki/` with an auto-maintained `_index.md`
190
+ - `!compile --preview` shows added / modified / unchanged pages plus cost and ETA before you spend tokens
191
+ - `!compile full` rebuilds everything — cost-gated, with a dashboard approval queue and an optional git pre-compile snapshot for external vaults
192
+ - `!ask <question>` answers from your own wiki and writes the cited reply to `30_outputs/`
193
+ - `!lint` audits for orphans, broken links, schema drift, and taxonomy candidates → dated health report
194
+ - `!trace <topic>` and `!connect A B` reconstruct how an idea evolved and find shared structure across domains
195
+ - Multiple workspaces (`!ingest @research ...`, `!compile @ops full`) — default workspace falls through when `@` is omitted
196
+ - Workspaces can be internal (`~/.personal-agent/wiki/`) or any number of external Obsidian vaults
132
197
  </details>
133
198
 
134
199
  <details>
135
- <summary><b>📦 Code, Git, GitHub</b></summary>
200
+ <summary><b>Code, Git, GitHub</b></summary>
136
201
 
137
202
  - Local Git: `git log`, `git diff`, `git show` exposed via daemon proxy
138
- - GitHub: PR lists, comments, issues, webhook receivers (HMAC-verified)
203
+ - GitHub: PR lists, comments, issues, webhook receivers (HMAC-SHA256 verified)
139
204
  - Per-repo cron triggers — "every Monday at 09:00, summarize merged PRs into `projects/<repo>.md`"
140
- - "Why did this build break?" — agent reads CI status + diff + traces
205
+ - "Why did this build break?" — agent reads CI status, diff, and traces
141
206
  - Auto-detect when a coworker modified a file you're about to ship
142
207
  - Unified Repositories: one row pairs a local clone with a GitHub remote; the doctor flags drift
143
208
  </details>
144
209
 
145
210
  <details>
146
- <summary><b>✅ Tasks, projects, life admin</b></summary>
211
+ <summary><b>Tasks, projects, life admin</b></summary>
147
212
 
148
213
  - Unified task view across GitHub Issues, mail-derived TODOs, and your own `today.md`
149
214
  - Per-project Markdown files with auto-maintained status, deadlines, and people
@@ -153,17 +218,17 @@ A non-exhaustive list. Click any group to expand.
153
218
  </details>
154
219
 
155
220
  <details>
156
- <summary><b>📚 Reading, lifestyle, voice</b></summary>
221
+ <summary><b>Reading, lifestyle, voice</b></summary>
157
222
 
158
223
  - Import Kindle highlights, build a reading-taste profile
159
224
  - Friday book recommendation DM based on your taste
160
225
  - Receipts auto-organized by month into your vault
161
226
  - Travel itinerary roll-up surfaced before each trip
162
- - **Voice attachments** — send a voice memo, get a Whisper-transcribed message (opt-in, runs locally)
227
+ - Voice attachments — send a voice memo, get a Whisper-transcribed message (opt-in, runs locally via `ffmpeg-static` + `@huggingface/transformers`)
163
228
  </details>
164
229
 
165
230
  <details>
166
- <summary><b>🤖 Self-management & automation</b></summary>
231
+ <summary><b>Self-management and automation</b></summary>
167
232
 
168
233
  - Tell it to remember things in plain language ("I'm allergic to nuts")
169
234
  - Tell it to forget things ("delete that note about my old job")
@@ -174,9 +239,9 @@ A non-exhaustive list. Click any group to expand.
174
239
  </details>
175
240
 
176
241
  <details>
177
- <summary><b>🔧 Run your own tools</b></summary>
242
+ <summary><b>Run your own tools</b></summary>
178
243
 
179
- - Bring your own MCP servers — they materialize into every session
244
+ - Bring your own MCP servers — they materialize into every session workdir
180
245
  - Bring your own Claude Code skills — they show up wherever the agent runs
181
246
  - Bring your own Codex / Gemini config — Aitne reads it on session init
182
247
  - Custom skills via the `/api/skills` endpoint — drop a `SKILL.md` and it's live
@@ -184,97 +249,99 @@ A non-exhaustive list. Click any group to expand.
184
249
 
185
250
  ---
186
251
 
187
- ## How Aitne accumulates knowledge about you
252
+ ## A day with Aitne
188
253
 
189
- Every signal Aitne sees flows through the same pipeline: capture → short-term → long-term → injected back into every future conversation.
254
+ A walkthrough of one user's Tuesday.
190
255
 
191
- ```mermaid
192
- flowchart TB
193
- subgraph SOURCES["📥 Sources"]
194
- direction LR
195
- S1["💬 messages"]
196
- S2["📅 calendar"]
197
- S3["📧 mail"]
198
- S4["📦 git/github"]
199
- S5["📓 obsidian/notion"]
200
- S6["✋ you editing<br/>files by hand"]
201
- end
256
+ **04:00 — While you sleep.** Aitne reads yesterday's handoff, your calendar for today, the last 24 hours of mail across your accounts, new commits in your repos, and the pending observations from Notion. It generates `today.md` and queues a Morning Briefing DM for after quiet hours end.
202
257
 
203
- OB["⚙️ Observers & adapters<br/>(WebSocket · IDLE · polling)"]
258
+ **07:30 Slack DM lands as you grab coffee:**
259
+ > Good morning. 3 things to flag:
260
+ > - **Sarah's PR (#487)** needs your review — she's been blocked since Friday
261
+ > - **Sales call with Acme @ 14:00** — leaving home by 13:25 (12-min commute)
262
+ > - **IRS reminder from Friday** — deadline is *tomorrow*
263
+ >
264
+ > Today: 2 meetings, 4 tasks. Light day. Reply `end` to close, or just talk to me.
204
265
 
205
- subgraph SHORT["🟡 Short-term memory"]
206
- direction LR
207
- ST1[("SQLite<br/>observations<br/>messages<br/>actions")]
208
- ST2["today.md<br/>(working view,<br/>always injected)"]
209
- end
266
+ **09:15 — You DM Aitne:** *"Tell Sarah I'll review by 11. And book lunch with Mark on Thursday — somewhere near his office."*
210
267
 
211
- subgraph LONG["🟢 Long-term memory (Markdown)"]
212
- direction TB
213
- LT1["user/profile.md<br/>work · expertise<br/>people · goals"]
214
- LT2["projects/*.md<br/>roadmap.md"]
215
- LT3["daily/YYYY-MM-DD.md<br/>↓<br/>weekly/YYYY-Www.md<br/>↓<br/>monthly/YYYY-MM.md"]
216
- end
268
+ Aitne drafts the Slack reply to Sarah, finds 3 lunch slots Thursday, checks Mark's last 5 lunch venues from your `people.md`, suggests Tartine. You confirm.
217
269
 
218
- AI(("🧠 Next session<br/>(any backend,<br/>any platform)"))
270
+ **11:30 — Hourly check fires.** A new commit in your repo modified the API contract you're about to ship. Aitne adds a note to `today.md` and DMs once: *"Heads up `auth.ts:84` was just changed by @Yuki. Want me to summarize the diff?"*
271
+
272
+ **13:45 — Calendar approach.** *"Sales call in 15 min. Acme is the warm lead from last Tuesday — they mentioned wanting webhook integration. Brief is in `projects/acme.md`."*
273
+
274
+ **15:45 — You forward a hotel confirmation email.** Aitne extracts dates, address, and confirmation number into `travel_bookings`, saves the PDF to `~/.personal-agent/context/receipts/2026/05/`, and adds the trip to next week's morning briefing.
275
+
276
+ **18:00 — Evening review.** Aitne notices you didn't reply to two emails from this morning. They get carried to tomorrow's `today.md`. It also sees you wrote *"shorter please"* twice today, classifies that as a tone-class signal, and silently shortens its replies going forward.
277
+
278
+ **Friday 18:30 — Weekly review.**
279
+ > Week of 2026-05-04: shipped 3 PRs, 2 deferred. Open loops: hotel cancellation, Acme follow-up. Focus next week: launch prep. Heads up: you've worked past 22:00 every day this week — should I clear Friday afternoon?
280
+
281
+ The point isn't any single trick — it's that **all of this happens without you opening an app.**
282
+
283
+ ---
284
+
285
+ ## How Aitne accumulates knowledge
286
+
287
+ Every signal flows through the same pipeline: capture → short-term → long-term → injected back into every future conversation.
288
+
289
+ ```mermaid
290
+ flowchart TB
291
+ SOURCES["Sources: messages, calendar, mail,<br/>git, GitHub, Obsidian, Notion,<br/>your own manual edits"]
292
+ OB["Observers and adapters<br/>(WebSocket, IDLE, polling)"]
293
+ SQL["SQLite: observations,<br/>messages, agent_actions"]
294
+ TODAY["today.md<br/>(working view, always injected)"]
295
+ PROFILE["user/profile.md<br/>work, expertise,<br/>people, goals"]
296
+ PROJECTS["projects/*.md<br/>roadmap.md"]
297
+ JOURNAL["daily/YYYY-MM-DD.md<br/>weekly/YYYY-Www.md<br/>monthly/YYYY-MM.md"]
298
+ AI["Next session<br/>any backend, any platform"]
219
299
 
220
300
  SOURCES --> OB
221
- OB --> ST1
222
- ST1 -- "hourly check<br/>aggregates" --> ST2
223
- ST2 -- "evening review<br/>condenses" --> LT3
224
- ST2 -- "patterns identified" --> LT1
225
- ST2 -- "project-tagged<br/>updates" --> LT2
226
- LT3 -- "Friday roll-up" --> LT3
227
- LT3 -- "month-end roll-up" --> LT3
228
-
229
- LT1 -. "always injected" .-> AI
230
- ST2 -. "always injected" .-> AI
231
- LT2 -. "morning + evening" .-> AI
232
- LT3 -. "recalled when relevant" .-> AI
301
+ OB --> SQL
302
+ SQL --> TODAY
303
+ TODAY --> JOURNAL
304
+ TODAY --> PROFILE
305
+ TODAY --> PROJECTS
306
+
307
+ PROFILE -.-> AI
308
+ TODAY -.-> AI
309
+ PROJECTS -.-> AI
310
+ JOURNAL -.-> AI
233
311
  ```
234
312
 
235
313
  **Key properties:**
236
314
 
237
- - **Plain Markdown.** You can `cat`, `vim`, `obsidian`, or `cp` any of these files. There is no proprietary format. Uninstall and the memory is still yours.
238
- - **Layered retention.** `today.md` rotates to `yesterday.md` once per agent-day. `daily/` files are persistent by design (synthesized journal). `weekly/` is pruned after 1 year. `agent/journal.md` keeps the most recent ~12 weekly + 24 monthly sections. SQLite-backed history (messages, agent_actions) is pruned after 90 days.
239
- - **Always-injected context.** Every session starts with `user/profile.md` + `rules/management.md` + `today.md` already loaded — the agent never has to "search for context."
315
+ - **Plain Markdown.** `cat`, `vim`, `obsidian`, `cp` there is no proprietary format. Uninstall and the memory stays yours.
316
+ - **Layered retention.** `today.md` rotates to `yesterday.md` once per agent-day. `daily/` files are persistent by design (synthesized journal). `weekly/` is pruned after one year. `agent/journal.md` keeps the most recent ~12 weekly + 24 monthly sections. SQLite-backed history (messages, agent_actions) is pruned after 90 days.
317
+ - **Always-injected context.** Every session starts with `user/profile.md` + `rules/management.md` + `today.md` already loaded — the agent never has to "search for context".
240
318
  - **You can always intervene.** Edit any file by hand. The agent picks up your changes on the next routine.
241
319
 
242
- ---
243
-
244
- ## Compounding intelligence
320
+ ### Compounding intelligence
245
321
 
246
- The longer you use it, the better it gets. Not because the model improves — because *the context does*.
322
+ The longer you use it, the better it gets. Not because the model improves — because the context does.
247
323
 
248
324
  ```mermaid
249
- graph LR
250
- D1["📆 <b>Day 1</b><br/>Empty profile<br/>Generic answers<br/>Asks who's Sarah"]
251
- W1["📅 <b>Week 1</b><br/>Calendar synced<br/>People dictionary<br/>Mail patterns ID'd"]
252
- M1["🌙 <b>Month 1</b><br/>Profile auto-filled<br/>Tone matches you<br/>Recurring tasks tracked"]
253
- M3["📈 <b>Month 3</b><br/>Full project map<br/>Knows your peers<br/>Proactive nudges"]
254
- Y1["🎯 <b>Year 1</b><br/>Anticipates needs<br/>Recalls Q1 context<br/>You can't go back"]
255
-
256
- D1 -->|implicit feedback| W1
257
- W1 -->|evening review| M1
258
- M1 -->|project tracking| M3
259
- M3 -->|long-term memory| Y1
260
-
261
- style D1 fill:#fef3c7,stroke:#f59e0b,stroke-width:2px
262
- style W1 fill:#fef3c7,stroke:#f59e0b,stroke-width:2px
263
- style M1 fill:#dbeafe,stroke:#3b82f6,stroke-width:2px
264
- style M3 fill:#dcfce7,stroke:#22c55e,stroke-width:2px
265
- style Y1 fill:#dcfce7,stroke:#22c55e,stroke-width:3px
325
+ flowchart LR
326
+ D1["Day 1<br/>Empty profile<br/>Generic answers"]
327
+ W1["Week 1<br/>Calendar synced<br/>People dictionary"]
328
+ M1["Month 1<br/>Profile auto-filled<br/>Tone matches you"]
329
+ M3["Month 3<br/>Full project map<br/>Proactive nudges"]
330
+ Y1["Year 1<br/>Anticipates needs<br/>Recalls Q1 context"]
331
+
332
+ D1 --> W1 --> M1 --> M3 --> Y1
266
333
  ```
267
334
 
268
335
  ### The implicit feedback loop
269
336
 
270
- Every interaction shapes Aitne's understanding of you, *implicitly*. No buttons. No surveys. Just talk to it.
337
+ Every interaction shapes Aitne's understanding of you implicitly. No buttons. No surveys.
271
338
 
272
- The Signal Detector tags each turn for **tone-class signals** (corrections like "be shorter", "no preamble") and **attribute-class signals** (durable facts like "I'm allergic to nuts"). The Evening Review interprets the raw signals on the next pass:
339
+ The Signal Detector tags each turn for **tone-class signals** (corrections like "be shorter", "no preamble") and **attribute-class signals** (durable facts like "I'm allergic to nuts"). The Evening Review interprets them:
273
340
 
274
341
  - **Tone** → updates the `character` runtime-config field, applied to every backend's system prompt.
275
342
  - **Attribute** → updates `user/profile.md` Learned Context.
276
343
 
277
- The line between the two is enforced server-side: a signal like "I prefer concise replies" is *tone* (goes to character). A signal like "my flight is on Friday" is *attribute* (goes to profile).
344
+ The line is enforced server-side: "I prefer concise replies" is tone (goes to character). "My flight is on Friday" is attribute (goes to profile).
278
345
 
279
346
  ---
280
347
 
@@ -290,7 +357,7 @@ Aitne has a dedicated set of management skills — `management-task-register`, `
290
357
  | *"Remember my partner's birthday is March 14"* | Appends to `user/profile.md` Learned Context |
291
358
  | *"I prefer concise replies — no preamble"* | Updates `character` field |
292
359
  | *"Move all my React work into one project file"* | Refactors `projects/*.md` and re-indexes |
293
- | *"Cancel tomorrow's morning briefing"* | Removes the agent_schedule row |
360
+ | *"Cancel tomorrow's morning briefing"* | Removes the `agent_schedule` row |
294
361
  | *"Forget what I said about my old job"* | Surgically edits `user/work.md` |
295
362
  | *"Email me a summary every Friday at 5pm"* | Creates a recurring schedule with a free-form prompt |
296
363
  | *"Switch to Codex for code reviews from now on"* | Updates `process_backend_config` mapping |
@@ -307,274 +374,60 @@ Every change is journaled to `agent_actions` with `source_kind=user_directive`.
307
374
 
308
375
  ---
309
376
 
310
- ## Bring your own harness (BYOH)
377
+ ## Bring your own harness
311
378
 
312
- Already invested in Claude Code skills? Custom MCP servers? A polished `~/.codex/config.toml`? **Aitne loads them all.** No re-configuring. No re-buying. No vendor lock.
379
+ Already invested in Claude Code skills? Custom MCP servers? A polished `~/.codex/config.toml`? **Aitne loads them all.** No re-configuring. No vendor lock.
313
380
 
314
381
  ```mermaid
315
382
  flowchart LR
316
- subgraph YOUR["🔵 Your existing setup"]
317
- direction TB
318
- Y1["~/.claude/<br/>· skills<br/>· slash commands<br/>· MCP servers"]
319
- Y2["~/.codex/<br/>· config<br/>· plugins"]
320
- Y3["~/.gemini/<br/>· config<br/>· tools"]
321
- Y4["Custom MCP servers<br/>(your data sources,<br/>internal tools)"]
322
- end
323
-
324
- subgraph AITNE_SKILLS["🟡 Aitne's built-ins"]
325
- direction TB
326
- A1["23 skills<br/>(Calendar, Mail, Notion,<br/>Roadmap, Schedule, ...)"]
327
- A2["Per-event task flows<br/>(morning, hourly,<br/>DM, mention, ...)"]
328
- A3["Persona MD<br/>(per-backend)"]
329
- end
330
-
331
- SESS["📦 Per-session workdir<br/>~/.personal-agent/agent-sessions/&lt;id&gt;/<br/>CLAUDE.md · AGENTS.md · GEMINI.md<br/>+ .claude/skills/ · .codex/skills/<br/>+ MCP config materialized"]
332
-
333
- RUN["🚀 Backend runs with<br/><b>your full toolkit + Aitne's</b>"]
334
-
335
- YOUR --> SESS
336
- AITNE_SKILLS --> SESS
383
+ Y1["~/.claude/<br/>skills, slash commands,<br/>MCP servers"]
384
+ Y2["~/.codex/<br/>config, plugins"]
385
+ Y3["~/.gemini/<br/>config, tools"]
386
+ Y4["Your custom<br/>MCP servers"]
387
+ A1["Aitne built-in skills<br/>(24 of them)"]
388
+ A2["Per-event task flows"]
389
+ A3["Persona MD per backend"]
390
+ SESS["Per-session workdir<br/>~/.personal-agent/agent-sessions/[id]/<br/>CLAUDE.md, AGENTS.md, GEMINI.md<br/>plus .claude/skills, .codex/skills<br/>plus materialized MCP config"]
391
+ RUN["Backend runs with<br/>your full toolkit plus Aitne's"]
392
+
393
+ Y1 --> SESS
394
+ Y2 --> SESS
395
+ Y3 --> SESS
396
+ Y4 --> SESS
397
+ A1 --> SESS
398
+ A2 --> SESS
399
+ A3 --> SESS
337
400
  SESS --> RUN
338
-
339
- style YOUR fill:#dbeafe,stroke:#3b82f6
340
- style AITNE_SKILLS fill:#fef3c7,stroke:#f59e0b
341
- style SESS fill:#dcfce7,stroke:#22c55e
342
- style RUN fill:#fae8ff,stroke:#a855f7
343
401
  ```
344
402
 
345
403
  | You already have… | In Aitne it just works |
346
404
  |---|---|
347
405
  | A Claude Code MCP server connected to your company's internal API | Every Aitne session can use it. No code changes. |
348
- | Custom slash commands you built for `/review` or `/test` | They're available in every Aitne-spawned Claude Code session. |
406
+ | Custom slash commands you built for `/review` or `/test` | Available in every Aitne-spawned Claude Code session. |
349
407
  | A polished `AGENTS.md` for your Codex setup | Aitne layers its persona on top, keeping your config intact. |
350
- | Your Gemini auth + project preferences | Inherited automatically. |
408
+ | Your Gemini auth and project preferences | Inherited automatically. |
351
409
  | Skills you wrote for `~/.claude/skills/` | Imported on demand. |
352
410
 
353
- **The growth flywheel:** Claude Code / Codex / Gemini ship a new connector → Aitne picks it up on next session → you get it for free.
411
+ **The growth flywheel:** Claude Code, Codex, or Gemini ships a new connector → Aitne picks it up on next session → you get it for free.
354
412
 
355
413
  ---
356
414
 
357
415
  ## Multi-platform, multi-app
358
416
 
359
- One agent, every surface.
417
+ One agent, every surface. A morning brief delivered to Slack, a follow-up via WhatsApp, an email draft from the dashboard — Aitne carries the same context across all of them.
360
418
 
361
419
  ```mermaid
362
- flowchart TB
363
- subgraph IN["📥 Input surfaces"]
364
- direction LR
365
- I1["💬 Slack DM/mention"]
366
- I2["📲 Telegram"]
367
- I3["🎮 Discord"]
368
- I4["💚 WhatsApp"]
369
- I5["🌐 Web dashboard chat"]
370
- I6["✋ Manual file edits"]
371
- end
372
-
373
- subgraph SVC["🔌 Connected apps"]
374
- direction TB
375
- SV1["📅 Google Calendar · Outlook Calendar"]
376
- SV2["📧 Gmail · Outlook · Yahoo · iCloud"]
377
- SV3["📓 Notion · Obsidian"]
378
- SV4["📦 GitHub · local Git"]
379
- SV5["🗺️ Google Maps"]
380
- SV6["🔧 Custom MCP servers"]
381
- end
382
-
383
- AITNE(("🧠 Aitne"))
420
+ flowchart LR
421
+ IN["Input surfaces:<br/>Slack DM, Telegram, Discord,<br/>WhatsApp, Web dashboard,<br/>manual file edits"]
422
+ AITNE["Aitne daemon"]
423
+ SVC["Connected apps:<br/>Google Calendar, Outlook Calendar,<br/>Gmail, Outlook, Yahoo, iCloud,<br/>Notion, Obsidian, GitHub,<br/>local Git, Google Maps,<br/>custom MCP servers"]
424
+ OUT["Output surfaces:<br/>same DM channel,<br/>today.md updates,<br/>calendar actions,<br/>drafted emails,<br/>proactive notifications"]
384
425
 
385
426
  IN --> AITNE
386
- AITNE <--> SVC
387
-
388
- subgraph OUT["📤 Output surfaces"]
389
- direction LR
390
- O1["💬 Same DM channel"]
391
- O2["📋 today.md<br/>updates"]
392
- O3["📅 Calendar<br/>actions"]
393
- O4["📧 Drafted emails"]
394
- O5["🔔 Proactive<br/>notifications"]
395
- end
396
-
427
+ AITNE --- SVC
397
428
  AITNE --> OUT
398
429
  ```
399
430
 
400
- **One conversation, every channel.** A morning brief delivered to Slack, a follow-up via WhatsApp, an email draft from the dashboard — Aitne carries the same context across all of them.
401
-
402
- ---
403
-
404
- ## Highlights
405
-
406
- | | |
407
- |---|---|
408
- | 🌅 **Proactive routines** | Morning · evening · weekly · monthly · hourly observation sweep |
409
- | 💬 **Reactive on every chat platform** | Slack · Telegram · Discord · WhatsApp · Web dashboard |
410
- | 🧠 **Multi-backend brain** | Claude (Opus 4.7 / Sonnet 4.6 / Haiku 4.5) · Codex CLI · Gemini CLI |
411
- | 📝 **MD-centric memory** | Plain Markdown you own — `today.md` · `roadmap.md` · `projects/*` · `daily/` · `weekly/` · `monthly/` |
412
- | 🔌 **23 built-in skills** | Calendar, mail, Notion, Obsidian, schedule, roadmap, receipts, travel, reading, voice, … |
413
- | 🔁 **4-mode integration framework** | `direct` (daemon polls) · `delegated` (backend's connector) · `native` (main backend MCP on demand) · `disabled` |
414
- | 🛡️ **Four-layer safety** | SDK allowlist · PreToolUse hooks · daemon API risk tiers · absolute-block layer that holds even in Allow mode |
415
- | 🪪 **Local-first & private** | Binds to `127.0.0.1`. No telemetry. Secrets in OS Keychain. Zero cloud state. |
416
- | 🧰 **Production tooling** | Background daemon · `aitne doctor` · cost analytics · auth health monitor with auto-recovery |
417
- | 🌍 **Speak any language** | The LLM handles it — talk to Aitne in Japanese, English, German, anything. `primaryLanguage` config nudges its outputs too. |
418
-
419
- ---
420
-
421
- ## Table of contents
422
-
423
- 1. [Quick start](#quick-start)
424
- 2. [Setup guide](#setup-guide)
425
- 3. [CLI reference](#cli-reference)
426
- 4. [Architecture](#architecture)
427
- 5. [Memory layout](#memory-layout)
428
- 6. [Multi-backend](#multi-backend)
429
- 7. [Integrations](#integrations)
430
- 8. [Safety model](#safety-model)
431
- 9. [Cost & quotas](#cost--quotas)
432
- 10. [Configuration](#configuration)
433
- 11. [Platform support](#platform-support)
434
- 12. [Troubleshooting](#troubleshooting)
435
- 13. [Development](#development)
436
- 14. [FAQ](#faq)
437
- 15. [License](#license)
438
-
439
- ---
440
-
441
- ## Quick start
442
-
443
- ### 1. Install
444
-
445
- ```bash
446
- npm install -g @aitne-sh/aitne@latest
447
- ```
448
-
449
- Installs the `aitne` CLI globally with the daemon, dashboard, and built-in agent assets.
450
-
451
- ### 2. Bring at least one AI backend
452
-
453
- Aitne is the nervous system; you bring the brain. Install **at least one** of:
454
-
455
- ```bash
456
- # Claude Code (recommended — full features, server-side advisor support)
457
- npm install -g @anthropic-ai/claude-code
458
-
459
- # OpenAI Codex CLI
460
- npm install -g @openai/codex
461
-
462
- # Google Gemini CLI
463
- npm install -g @google/gemini-cli
464
- ```
465
-
466
- Login once with each CLI you intend to use — Aitne auto-detects them.
467
-
468
- ### 3. Start
469
-
470
- ```bash
471
- aitne start
472
- ```
473
-
474
- The daemon (`:8321`) and dashboard (`:3000`) launch in the background and your browser opens to the setup wizard.
475
-
476
- ### 4. Confirm
477
-
478
- ```bash
479
- aitne status
480
- ```
481
-
482
- ```
483
- Aitne status:
484
-
485
- Daemon: running (PID 12345)
486
- Uptime: 1m 23s
487
- API: http://127.0.0.1:8321
488
- Platforms: slack, dashboard
489
- Backends: claude
490
- Dashboard: running (PID 12346)
491
- URL: http://localhost:3000
492
-
493
- Last action: 2026-05-11T07:30:14Z (routine.morning_routine)
494
- Today: 6 action(s) · $0.043 spent
495
- Next: 2026-05-11T18:00:00Z routine.evening_review
496
- ```
497
-
498
- That's it. Open `http://localhost:3000` and finish the wizard.
499
-
500
- ---
501
-
502
- ## Setup guide
503
-
504
- ### Prerequisites
505
-
506
- | Requirement | Version | Why |
507
- |---|---|---|
508
- | **Node.js** | ≥ 22.0.0 | Daemon runtime (LTS) |
509
- | **At least one AI backend** | — | Claude Code, Codex CLI, or Gemini CLI |
510
- | **OS Keychain** | macOS / libsecret on Linux / DPAPI on Windows | Secret storage (file-based fallback available) |
511
-
512
- ### Step 1 — Install Aitne
513
-
514
- ```bash
515
- npm install -g @aitne-sh/aitne@latest
516
- ```
517
-
518
- > Want to hack on the source? See [Development](#development).
519
-
520
- ### Step 2 — Install at least one backend CLI
521
-
522
- #### Claude Code (recommended)
523
-
524
- ```bash
525
- npm install -g @anthropic-ai/claude-code
526
- claude --version
527
- claude auth login # uses your Claude subscription
528
- ```
529
-
530
- #### OpenAI Codex CLI
531
-
532
- ```bash
533
- npm install -g @openai/codex
534
- codex --version
535
- codex login --device-auth # device-flow OAuth
536
- ```
537
-
538
- #### Google Gemini CLI
539
-
540
- ```bash
541
- npm install -g @google/gemini-cli
542
- gemini --version
543
- # OAuth handled automatically on first use
544
- ```
545
-
546
- You can install all three. Per-process tier routing lets you mix-and-match: Sonnet for routines and DMs, Haiku for delegated/polling, Codex for code-heavy work, Gemini for free-tier headroom — and Opus only on the keys that genuinely need it (first-day morning routine, knowledge import, opt-in heavy task mode).
547
-
548
- ### Step 3 — Launch and run the wizard
549
-
550
- ```bash
551
- aitne start
552
- ```
553
-
554
- Aitne builds (if needed), launches both processes, and opens `http://localhost:3000/setup`. The wizard walks 9 screens:
555
-
556
- | # | Step | What it asks |
557
- |---|---|---|
558
- | 1 | **Basics** | Agent display name + primary language |
559
- | 2 | **Vault** | Plain (`~/.personal-agent/context/`) or your existing Obsidian vault path |
560
- | 3 | **AI Backend** | Pick the main backend (Claude / Codex / Gemini), authenticate (API key or CLI login), choose execution mode (Safe vs. Allow) |
561
- | 4 | **Mail** | Gmail (OAuth) · Outlook (OAuth) · Yahoo / iCloud (IMAP + app password) — each card sets `direct` / `delegated` / `native` mode where supported |
562
- | 5 | **Calendar** | Google Calendar (OAuth) · Outlook Calendar (OAuth or user-managed MCP) — same mode picker per card |
563
- | 6 | **Note** | Notion (OAuth) and an optional secondary Obsidian vault path to watch |
564
- | 7 | **Messaging** | Slack · Telegram · Discord · WhatsApp pairing |
565
- | 8 | **Rules** | A short conversation with the agent — it interviews you and stages a `character` block + a `management-rules` block, which you confirm before saving |
566
- | 9 | **Done** | Summary; agent runs its first `setup` session |
567
-
568
- Required steps: Basics, Vault, AI Backend, Rules. Everything else exposes a **Skip** button — you can come back later from `/connections/*` or `/settings/*`.
569
-
570
- ### Step 4 — Verify
571
-
572
- ```bash
573
- aitne status # PIDs, uptime, connected platforms, backends, today's spend
574
- aitne doctor # install diagnostic
575
- aitne logs -f # tail the daemon log
576
- ```
577
-
578
431
  ---
579
432
 
580
433
  ## CLI reference
@@ -597,7 +450,7 @@ aitne logs -f # tail the daemon log
597
450
  |---|---|
598
451
  | `aitne setup` | Re-open the dashboard `/setup` wizard. Auto-starts the daemon if needed. |
599
452
  | `aitne open` | Open the dashboard in your browser. |
600
- | `aitne doctor [--json]` | 9 install checks; the repository-drift check expands into one extra row per repo whose `origin` no longer matches its registered slug. |
453
+ | `aitne doctor [--json]` | 8 base install checks; the repository-drift check expands into one extra row per drifted repo. |
601
454
  | `aitne audit [flags]` | Read the agent action log directly from SQLite. |
602
455
  | `aitne version [--json]` | Version, Node, install path, last build time. |
603
456
  | `aitne update [--check]` | Print the npm command to upgrade. `--check` makes one network call. |
@@ -608,13 +461,13 @@ aitne logs -f # tail the daemon log
608
461
 
609
462
  | Flag | Default | Description |
610
463
  |---|---|---|
611
- | `--since <duration>` | `24h` | Time window (e.g. `1h`, `7d`, `2026-04-20`). |
464
+ | `--since <duration>` | `24h` | Time window (`1h`, `7d`, `2026-04-20`). |
612
465
  | `--type <pattern>` | — | `action_type` filter (`%` for LIKE matching). |
613
466
  | `--result <value>` | — | `success` / `failed` / `partial` / `skipped`. |
614
467
  | `--backend <name>` | — | `claude` / `codex` / `gemini`. |
615
468
  | `--limit <N>` | 50 | Row cap. |
616
- | `--detail` | off | Expand the `detail` JSON column under each row. |
617
- | `--json` | off | Machine-readable JSON output. |
469
+ | `--detail` | off | Expand the `detail` JSON column. |
470
+ | `--json` | off | Machine-readable output. |
618
471
 
619
472
  ### `aitne doctor` checks
620
473
 
@@ -634,58 +487,36 @@ aitne logs -f # tail the daemon log
634
487
 
635
488
  ```mermaid
636
489
  flowchart TB
637
- subgraph PLAT["📱 Input platforms"]
638
- direction LR
639
- P1[Slack]
640
- P2[Telegram]
641
- P3[Discord]
642
- P4[WhatsApp]
643
- P5[Dashboard]
644
- end
490
+ PLAT["Input platforms:<br/>Slack, Telegram, Discord,<br/>WhatsApp, Web dashboard"]
645
491
 
646
- subgraph DAEMON["⚙️ Aitne daemon (Hono :8321)"]
492
+ subgraph DAEMON["Aitne daemon (Hono on :8321)"]
647
493
  direction TB
648
- EB[EventBus<br/>priority heap]
649
- DI[Dispatcher<br/>semaphores: 2 reactive +<br/>3 autonomous]
650
- BR[BackendRouter<br/>ProcessKey tier backend<br/>+ fallback]
651
- AC[Agent Core<br/>IAgentCore interface]
652
- OB[Observers<br/>Git · GitHub · Obsidian ·<br/>Notion · Calendar · Mail]
653
- SC[Scheduler<br/>node-cron + agent_schedule]
494
+ EB["EventBus<br/>(priority heap)"]
495
+ DI["Dispatcher<br/>(2 reactive + 3 autonomous semaphores)"]
496
+ BR["BackendRouter<br/>ProcessKey to tier and backend<br/>plus fallback"]
497
+ AC["Agent Core<br/>(IAgentCore interface)"]
498
+ OB["Observers:<br/>Git, GitHub, Obsidian,<br/>Notion, Calendar, Mail"]
499
+ SC["Scheduler<br/>(node-cron + agent_schedule)"]
654
500
  end
655
501
 
656
- subgraph BACKENDS["🧠 AI runtimes"]
657
- direction LR
658
- BC[Claude Code SDK]
659
- BX[Codex CLI subprocess]
660
- BG[Gemini CLI subprocess]
661
- end
502
+ BACKENDS["AI runtimes:<br/>Claude Code SDK,<br/>Codex CLI subprocess,<br/>Gemini CLI subprocess"]
662
503
 
663
- subgraph DATA["💾 Local data"]
664
- direction LR
665
- SQL[(SQLite<br/>WAL + FTS5)]
666
- MD["📝 Markdown memory<br/>~/.personal-agent/context/"]
667
- KC[OS Keychain]
668
- end
504
+ DATA["Local data:<br/>SQLite (WAL + FTS5),<br/>Markdown memory,<br/>OS Keychain"]
669
505
 
670
506
  PLAT --> EB
671
507
  SC --> EB
672
- OB --> SQL
673
- SQL -- "hourly check pulls" --> EB
508
+ OB --> DATA
509
+ DATA --> EB
674
510
  EB --> DI
675
511
  DI --> BR
676
512
  BR --> AC
677
- AC --> BC
678
- AC --> BX
679
- AC --> BG
680
- AC <-->|curl localhost API| DAEMON
681
- DAEMON <--> SQL
682
- DAEMON <--> MD
683
- DAEMON <--> KC
513
+ AC --> BACKENDS
514
+ AC --> DATA
684
515
  ```
685
516
 
686
517
  ### Two execution paths
687
518
 
688
- **Reactive path** — owner DMs/mentions, cron routines, calendar approach events, scheduled tasks
519
+ **Reactive path** — owner DMs / mentions, cron routines, calendar approach events, scheduled tasks
689
520
  → Event source → EventBus → Dispatcher → BackendRouter → Agent → output to user.
690
521
 
691
522
  **Polling path** — Obsidian, Git, GitHub, Notion, Calendar, Mail change detection
@@ -705,13 +536,13 @@ packages/
705
536
 
706
537
  agent-assets/ # Read by the daemon at session-init time
707
538
  ├── agent-profiles/ # Persona MD per backend (CLAUDE.md / AGENTS.md / GEMINI.md)
708
- ├── skills/ # 23 built-in skills (context, calendar, mail, notion, …)
709
- ├── task-flows/ # Per-event prompt templates (one per event type)
539
+ ├── skills/ # 24 built-in skills (context, calendar, mail, notion, …)
540
+ ├── task-flows/ # Per-event prompt templates
710
541
  └── templates/ # Scaffold MD copied to context/ on first run
711
542
 
712
543
  bin/aitne.mjs # CLI entry — lifecycle + ops
713
544
  scripts/ # Build/run helpers and per-command modules
714
- docs/design/ # Architecture & design docs (v4.16) — source of truth
545
+ docs/design/ # Architecture and design docs — source of truth
715
546
  ```
716
547
 
717
548
  ---
@@ -736,9 +567,9 @@ Everything the agent writes lives under `PA_DATA_DIR` (default `~/.personal-agen
736
567
  │ ├── routines/ # Per-cadence checklist rulebooks
737
568
  │ ├── dossiers/ # Carry-forward state per routine
738
569
  │ ├── projects/ # One file per active project + Obsidian Bases view
739
- │ ├── daily/<YYYY-MM-DD>.md # Synthesized daily journal (persistent by design)
740
- │ ├── weekly/<YYYY-Www>.md # Weekly review (1 yr file retention)
741
- │ ├── monthly/<YYYY-MM>.md # Monthly review (persistent by design)
570
+ │ ├── daily/YYYY-MM-DD.md # Synthesized daily journal (persistent by design)
571
+ │ ├── weekly/YYYY-Www.md # Weekly review (1 yr file retention)
572
+ │ ├── monthly/YYYY-MM.md # Monthly review (persistent by design)
742
573
  │ ├── inbox/ # Optional paste bucket
743
574
  │ └── agent/
744
575
  │ ├── journal.md # Private agent self-reflection
@@ -747,8 +578,8 @@ Everything the agent writes lives under `PA_DATA_DIR` (default `~/.personal-agen
747
578
  ├── logs/{daemon,dashboard}.log
748
579
  ├── prompts/ # Editable prompt templates
749
580
  ├── attachments/ # Chat attachments
750
- ├── agent-sessions/<id>/ # Per-session backend workdir
751
- ├── secrets/ # File-fallback secret store (`<name>.enc`); empty when OS keychain is used
581
+ ├── agent-sessions/[id]/ # Per-session backend workdir
582
+ ├── secrets/ # File-fallback secret store (empty when OS keychain is used)
752
583
  └── run/ # PID files for daemon + dashboard
753
584
  ```
754
585
 
@@ -764,9 +595,9 @@ Aitne abstracts three AI runtimes behind a single `IAgentCore` interface:
764
595
 
765
596
  | Backend | Implementation | Session resume | Strengths |
766
597
  |---|---|---|---|
767
- | **Claude Code** | `@anthropic-ai/claude-agent-sdk` | Full session resume | Best for routines, deep context, server-side advisor |
768
- | **Codex CLI** | OpenAI Codex CLI subprocess + JSONL stream | New session each time | Best for code-heavy tasks, fast iteration |
769
- | **Gemini CLI** | Google Gemini CLI subprocess + JSONL stream | New session each time | Best for free-tier, large-context summarization |
598
+ | **Claude Code** | `@anthropic-ai/claude-agent-sdk` | Yes (SDK `resume` option) | Best for routines, deep context, server-side advisor |
599
+ | **Codex CLI** | OpenAI Codex CLI subprocess + JSONL stream | Yes (`--resume <session-id>`) | Best for code-heavy tasks, fast iteration |
600
+ | **Gemini CLI** | Google Gemini CLI subprocess + JSONL stream | Yes (`--resume <session-id>`) | Best for free-tier headroom, large-context summarization |
770
601
 
771
602
  ### Per-process tier routing
772
603
 
@@ -791,8 +622,9 @@ Every kind of work has a `ProcessKey` mapped to a tier (`lite` / `medium` / `hig
791
622
  | `delegated_task` | lite | Delegated subprocess task mode |
792
623
  | `delegated_task_heavy` | high | Opt-in destructive-write task mode |
793
624
  | `observation.summarize` | lite | Per-observation classification |
625
+ | `wiki.ingest_url`, `wiki.compile`, `wiki.ask`, `wiki.lint`, `wiki.trace`, `wiki.connect` | medium | Personal wiki surfaces |
794
626
 
795
- Configure each ProcessKey's backend & tier from the dashboard `/settings/models` page. The router fails over to a fallback backend automatically on `BackendQuotaError` or `BackendDecisiveFailure`, re-materializing the fallback's instruction file + skill directories into the session workdir.
627
+ Configure each ProcessKey's backend and tier from the dashboard `/settings/models` page. The router fails over to a fallback backend automatically on `BackendQuotaError` or `BackendDecisiveFailure`, re-materializing the fallback's instruction file + skill directories into the session workdir.
796
628
 
797
629
  ---
798
630
 
@@ -805,7 +637,7 @@ Configure each ProcessKey's backend & tier from the dashboard `/settings/models`
805
637
  | Slack | `@slack/bolt` | Socket Mode (WebSocket) | Bot + App tokens |
806
638
  | Telegram | `telegraf` | Long polling | Bot token |
807
639
  | Discord | `discord.js` | Gateway | Bot token |
808
- | WhatsApp | `baileys` | QR pairing | Scan QR from dashboard |
640
+ | WhatsApp | `@whiskeysockets/baileys` | QR pairing | Scan QR from dashboard |
809
641
  | Web Dashboard | Hono SSE | Always on | None |
810
642
 
811
643
  ### Mail (multi-provider, unified API)
@@ -817,29 +649,30 @@ Configure each ProcessKey's backend & tier from the dashboard `/settings/models`
817
649
  | **Yahoo** | IMAP + app password | Read · send · IMAP IDLE |
818
650
  | **iCloud** | IMAP + app password | Read · send · IMAP IDLE |
819
651
 
820
- Local FTS5 full-text search runs across **every** account via `GET /api/mail/search?q=...`. The classifier (`mail-classifier`) tags messages across all providers; the Gmail-specific classifier auto-applies labels.
652
+ Local FTS5 full-text search runs across every account via `GET /api/mail/search?q=...`. The classifier (`mail-classifier`) tags messages across all providers; the Gmail-specific classifier auto-applies labels.
821
653
 
822
- ### Knowledge & docs
654
+ ### Knowledge and docs
823
655
 
824
656
  - **Obsidian** — read directly via `Read`; write via the official Obsidian CLI (`obsidian create`, `obsidian append`, `obsidian daily:append`, …); `chokidar` watches the vault for user edits
825
657
  - **Notion** — `@notionhq/client` REST API; full page + database CRUD
658
+ - **Wiki builder** — per-workspace ingest / compile / ask / lint / trace / connect surface backed by `packages/daemon/src/core/wiki/` (cost-gated full rebuilds, approval queue, compile preview, optional git pre-compile snapshot, dispatch-mode fan-out). One internal workspace or any number of external Obsidian vaults; addressed with `@<workspace>` on every bang command.
826
659
  - **Custom MCP servers** — register via `/api/mcp/servers`; materialized into the per-session workdir so backends use them transparently
827
660
 
828
661
  ### Code
829
662
 
830
663
  - **Git** (local) — daemon proxies `git log`, `git diff`, `git show`; cron-driven repository observer; `automation_triggers` table fires LLM prompts on `cron.daily` / `cron.weekly`
831
- - **GitHub** — `@octokit/rest` + webhooks; PR list & comment, issue ops, HMAC-SHA256 signature verification at `POST /webhook/github`
664
+ - **GitHub** — `@octokit/rest` + webhooks; PR list and comment, issue ops, HMAC-SHA256 signature verification at `POST /webhook/github`
832
665
 
833
- ### Calendar & travel
666
+ ### Calendar and travel
834
667
 
835
668
  - **Google Calendar** — `googleapis` OAuth2; full event CRUD, freebusy, calendar list, 15-min approaching reminders
836
669
  - **Outlook Calendar** — Microsoft Graph via `@azure/msal-node` in direct mode, or user-managed MCP in delegated / native modes
837
- - **iCloud Calendar** — CalDAV via `tsdav` (Apple Calendar service; reachable from any platform)
670
+ - **iCloud Calendar** — CalDAV via `tsdav`
838
671
  - **Google Maps** — Directions API for travel-time estimation tied to calendar events
839
672
 
840
673
  ### Lifestyle
841
674
 
842
- - **Receipts** — auto-extracts PDF/image attachments from mail with category detection
675
+ - **Receipts** — auto-extracts PDF / image attachments from mail with category detection
843
676
  - **Travel bookings** — auto-extracts flight, hotel, restaurant, train confirmations
844
677
  - **Reading** — Kindle My Clippings importer; reading-taste profile; weekly book recommendations
845
678
  - **Voice** — opt-in Whisper transcription (`ffmpeg-static` + `@huggingface/transformers`) runs locally on voice attachments. Install via `POST /api/voice/install`.
@@ -852,10 +685,10 @@ Each integration runs in one of **four** modes:
852
685
  |---|---|---|---|---|
853
686
  | **`direct`** | Daemon (OAuth in OS Keychain) | Daemon poller | 5–6 vendor-console steps | Full feature set |
854
687
  | **`delegated`** | Main backend's connector | Cron `delegated-sync-worker` (per-cadence opt-in) | None — backend already authed | Reduced (whatever the connector exposes) |
855
- | **`native`** | Main backend's connector | No daemon polling — agent reaches the integration in-turn via MCP | None | On-demand only; observations posted via `/api/observations` |
688
+ | **`native`** | Main backend's connector | None — agent reaches the integration in-turn via MCP | None | On-demand only; observations posted via `/api/observations` |
856
689
  | **`disabled`** | — | No | — | Off |
857
690
 
858
- `delegated` runs the backend's connector on a cron cadence (default-off, opt-in per cadence). `native` skips polling entirely and routes calls in-band during DMs / hourly checks. Outlook Mail and Outlook Calendar are *user-managed-connector* native: install the MCP yourself, Aitne synthesises a probe pass.
691
+ `delegated` runs the backend's connector on a cron cadence (default-off, opt-in per cadence). `native` skips polling entirely and routes calls in-band during DMs / hourly checks. Outlook Mail and Outlook Calendar are user-managed-connector native: install the MCP yourself, Aitne synthesises a probe pass.
859
692
 
860
693
  Every mode change goes through `POST /api/integrations/:key/probe` and the per-key flip lock — a live capability check is mandatory before flipping to `delegated` or `native`.
861
694
 
@@ -893,12 +726,14 @@ In Safe mode, every `Bash(curl ...)` invocation is parsed: the hostname must be
893
726
 
894
727
  Hard-blocked in **both Safe and Allow** modes. `bypassPermissions` and `allowedToolsOverride` cannot widen past this:
895
728
 
896
- - Recursive delete: `rm -rf *`, `rm -r *`, `rm --recursive*` (every flag-bundle variant)
729
+ - Recursive delete: `rm -rf *`, `rm -r *`, `rm --recursive*`, plus every common short-flag bundle (`-rfv`, `-fr`, `-vr`, `-R`, `-fR`, …)
897
730
  - Privilege escalation: `sudo *`, `doas *`, `su *`
898
- - Pipe-to-shell RCE: `curl * | sh`, `wget * | bash`, `bash <(...)`
899
- - Platform secret CLI: `security *`, `secret-tool *`, `cmdkey *`
900
- - Secret file reads/writes: `.env`, `~/.ssh/**`, `~/.gnupg/**`, `~/.aws/**`, `~/.config/gcloud/**`
901
- - Daemon-managed secrets: `~/.personal-agent/secrets/**`, `~/.personal-agent/whatsapp/auth/**`
731
+ - Pipe-to-shell RCE: `curl * | sh`, `wget * | bash`, `bash <(...)`, `sh <(...)`, no-space `bash<...` / `sh<...`
732
+ - Indirect-eval RCE: `eval *`, `source *` (no Aitne skill or task flow uses these)
733
+ - Platform secret CLI: `security *` (macOS), `secret-tool *` (Linux), `cmdkey *` (Windows)
734
+ - Secret file reads and writes: `.env`, `**/.env`, `id_rsa*`, `id_ed25519*`, `~/.ssh/**`, `~/.gnupg/**`, `~/.aws/**`, `~/.config/gcloud/**`, `~/.config/gh/hosts.yml`, `~/.netrc`, `~/Library/Keychains/**`, `~/.local/share/keyrings/**`
735
+ - Daemon-managed secret surfaces: `~/.personal-agent/secrets/**`, `~/.personal-agent/whatsapp/auth/**`, `~/.personal-agent/backups/**`
736
+ - Anthropic-cloud managed-agent tools: `CronCreate`, `CronList`, `CronDelete`, `RemoteTrigger`, `PushNotification` (would bypass the local audit log, MD memory, and cost telemetry)
902
737
 
903
738
  Every blocked attempt lands in `agent_actions` with `action_type='blocked_absolute'`.
904
739
 
@@ -914,7 +749,7 @@ Every blocked attempt lands in `agent_actions` with `action_type='blocked_absolu
914
749
 
915
750
  ---
916
751
 
917
- ## Cost & quotas
752
+ ## Cost and quotas
918
753
 
919
754
  ### Built-in controls
920
755
 
@@ -947,13 +782,12 @@ If you're on a Claude / Codex / Gemini subscription, none of this hits a metered
947
782
 
948
783
  ## Configuration
949
784
 
950
- `.env` is **bootstrap-only**. Everything else is editable from the dashboard at runtime — or via natural-language DMs to the agent.
785
+ `.env` is **bootstrap-only**. Everything else is editable from the dashboard at runtime — or via natural-language DMs.
951
786
 
952
787
  ### `.env` (bootstrap)
953
788
 
954
789
  ```bash
955
- PA_DATA_DIR=~/.personal-agent # macOS / Linux
956
- # PA_DATA_DIR=C:\Users\You\.personal-agent # Windows
790
+ PA_DATA_DIR=~/.personal-agent
957
791
  PA_API_PORT=8321
958
792
  PA_DASHBOARD_PORT=3000
959
793
  PA_LOG_LEVEL=info # trace | debug | info | warn | error
@@ -961,21 +795,18 @@ PA_LOG_LEVEL=info # trace | debug | info | warn | error
961
795
 
962
796
  ### Pre-seeding identifiers via env (optional)
963
797
 
964
- Bot **tokens and OAuth credentials** always live in the OS keychain — they're never read from environment variables. The wizard's Messaging step (or `/connections/*`) is the single entry point. The few non-secret identifiers you *can* pre-seed for fully scripted installs:
798
+ Bot tokens and OAuth credentials always live in the OS keychain — they are never read from environment variables. The wizard's Messaging step (or `/connections/*`) is the single entry point. The few non-secret identifiers you can pre-seed for fully scripted installs:
965
799
 
966
800
  ```bash
967
- # Owner identifiers (non-secret — let messaging adapters know who you are)
968
801
  PA_SLACK_OWNER_USER_ID=U...
969
802
  PA_TELEGRAM_OWNER_CHAT_ID=...
970
803
  PA_DISCORD_OWNER_USER_ID=...
971
804
  PA_WHATSAPP_ENABLED=true
972
805
  PA_WHATSAPP_OWNER_PHONE=...
973
806
 
974
- # Obsidian vault paths
975
807
  PA_PRIMARY_VAULT_PATH=~/Documents/MyVault
976
808
  PA_EXTERNAL_OBSIDIAN_VAULT_PATH=~/Documents/SecondaryVault
977
809
 
978
- # Notion default database routing
979
810
  PA_NOTION_DATABASE_IDS='{"tasks":"abc...","notes":"def..."}'
980
811
  ```
981
812
 
@@ -983,9 +814,9 @@ Everything else — bot tokens, OAuth refresh tokens, Notion API key, GitHub tok
983
814
 
984
815
  ### Runtime settings
985
816
 
986
- The dashboard `/settings` tree exposes ~100 runtime keys. The headline ones:
817
+ The dashboard `/settings` tree exposes ~100 runtime keys. Headline groups:
987
818
 
988
- - **Schedule** — `timezone`, `dayBoundaryHour`, hourly check window & interval, cron schedules
819
+ - **Schedule** — `timezone`, `dayBoundaryHour`, hourly check window and interval, cron schedules
989
820
  - **Notifications** — `quietHoursStart/End`, `maxNotificationsPerHour`, `maxNotificationsPerDay`, `batchIntervalMinutes`
990
821
  - **Sessions** — `sessionTimeoutDmMinutes`, `historyInjectionMaxMessages`, `historyInjectionMaxTokens`
991
822
  - **Safety** — execution mode per backend, `disallowedTools` overrides
@@ -994,7 +825,7 @@ The dashboard `/settings` tree exposes ~100 runtime keys. The headline ones:
994
825
  - **Mail** — provider list, poll interval, IMAP IDLE on/off
995
826
  - **Character** — 1,000-char free-form tone description
996
827
  - **Language** — `primaryLanguage` nudges output language for DMs, knowledge, and vault writes
997
- - **Voice** — `voiceTranscriptionEnabled`, `voiceTranscriptionModel`, `voiceTranscriptionPrimaryLanguage`
828
+ - **Voice** — `voiceTranscriptionEnabled`, `voiceTranscriptionPrimaryLanguage` (the model itself is set via `PA_VOICE_TRANSCRIPTION_MODEL` env-only)
998
829
  - **Delegated task mode** — kill switch, per-day quota, heavy-tier opt-in, cache / pool / structured-output toggles
999
830
 
1000
831
  …or just DM the agent: *"Don't run hourly checks on weekends."*
@@ -1093,21 +924,6 @@ aitne audit --since 24h --result failed --detail
1093
924
 
1094
925
  ## Development
1095
926
 
1096
- For contributors:
1097
-
1098
- ```bash
1099
- git clone https://github.com/Aitne-sh/Aitne.git aitne
1100
- cd aitne
1101
- corepack enable
1102
- pnpm install
1103
- pnpm start # build (if stale) + launch in background
1104
- pnpm dev # foreground mode with full stdio
1105
- pnpm test # vitest — unit tests across packages/*
1106
- pnpm test:watch
1107
- pnpm lint # turbo run lint
1108
- pnpm clean # remove all build artifacts and node_modules
1109
- ```
1110
-
1111
927
  ### Tech stack
1112
928
 
1113
929
  | Layer | Stack |
@@ -1124,7 +940,7 @@ pnpm clean # remove all build artifacts and node_modules
1124
940
  - TypeScript throughout, camelCase, ESM with `.js` import extensions
1125
941
  - Tests colocated with source as `foo.ts` + `foo.test.ts`
1126
942
  - Vitest enforces **100% coverage** on a curated subset of pure-logic modules
1127
- - The `docs/design/` tree (v4.16) is the authoritative spec; `packages/daemon/src/` is the source of truth when they diverge
943
+ - The `docs/design/` tree is the authoritative spec; `packages/daemon/src/` is the source of truth when they diverge
1128
944
 
1129
945
  ### Source-of-truth pointers
1130
946
 
@@ -1146,7 +962,7 @@ pnpm clean # remove all build artifacts and node_modules
1146
962
  ## FAQ
1147
963
 
1148
964
  **Is Aitne a chatbot?**
1149
- No. It's a daemon. It also responds to chat, but the more interesting half is what it does *while you're not looking at it*.
965
+ No. It's a daemon. It also responds to chat, but the more interesting half is what it does while you're not looking at it.
1150
966
 
1151
967
  **Does it phone home?**
1152
968
  No. The daemon binds to `127.0.0.1` only. There is no telemetry. Verify with `lsof` and `nettop`.
@@ -1161,7 +977,7 @@ Yes — Claude Code, OpenAI Codex, and Google Gemini CLI are all supported. Pick
1161
977
  No metered API key required — Aitne uses your subscription quota via the official CLIs (`claude auth login`, `codex login`, `gemini`). If you'd rather pay-as-you-go, supply `ANTHROPIC_API_KEY` / `OPENAI_API_KEY` / `GEMINI_API_KEY` in the wizard.
1162
978
 
1163
979
  **Can I edit the agent's memory directly?**
1164
- Yes — that's the entire point. Open `~/.personal-agent/context/today.md` in your editor, change anything, save. The agent picks up your edits on the next routine. Any edit is *just text in a file* — no proprietary format, no migration headaches if you uninstall.
980
+ Yes — that's the entire point. Open `~/.personal-agent/context/today.md` in your editor, change anything, save. The agent picks up your edits on the next routine. Any edit is just text in a file — no proprietary format, no migration headaches if you uninstall.
1165
981
 
1166
982
  **What about Obsidian?**
1167
983
  Aitne can use your existing Obsidian vault as the primary memory store. The agent reads vault files directly and writes via the official Obsidian CLI. Your wiki links keep working. Your daily notes get appended to.
@@ -1170,13 +986,13 @@ Aitne can use your existing Obsidian vault as the primary memory store. The agen
1170
986
  Yes. Register them in the dashboard `/connections` page; the daemon writes the per-session MCP config into each backend's session workdir before launching, so all your MCP tools are available transparently.
1171
987
 
1172
988
  **Do my existing Claude Code / Codex / Gemini settings work?**
1173
- Yes. Aitne reads your `~/.claude/`, `~/.codex/`, `~/.gemini/` configs on session init and layers its persona on top. Custom skills, slash commands, MCP servers, and plugins all carry over. See [Bring your own harness](#bring-your-own-harness-byoh).
989
+ Yes. Aitne reads your `~/.claude/`, `~/.codex/`, `~/.gemini/` configs on session init and layers its persona on top. Custom skills, slash commands, MCP servers, and plugins all carry over. See [Bring your own harness](#bring-your-own-harness).
1174
990
 
1175
991
  **Does it work without internet?**
1176
992
  The AI backends and reactive messaging need internet (to hit those services). The daemon, dashboard, observers (Git, Obsidian local), and Markdown memory are entirely offline.
1177
993
 
1178
994
  **Does it support languages other than English?**
1179
- Yes. Talk to it in your native language — Japanese, German, Spanish, anything. The LLM handles it; the `primaryLanguage` setting nudges DM / knowledge / vault outputs into that language too. Implementation code remains English-only.
995
+ Yes. Talk to it in your native language — Japanese, German, Spanish, anything. The LLM handles it; the `primaryLanguage` setting nudges DM, knowledge, and vault outputs into that language too. Implementation code remains English-only.
1180
996
 
1181
997
  **Is this for my whole team?**
1182
998
  No — Aitne is **single-owner by design**. Group chats and multi-user channels are filtered at the adapter layer. If you want a team agent, run one Aitne per teammate.