project-athena 0.3.0 → 0.4.0

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 (124) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/README.md +46 -4
  3. package/dist/{activity-P4UUFHWV.js → activity-BKW7G4I5.js} +4 -4
  4. package/dist/{agents-3HTSQGL2.js → agents-DFSNEOP5.js} +4 -4
  5. package/dist/{analyze-F3YOILNL.js → analyze-ZY3MXBOI.js} +7 -6
  6. package/dist/{chunk-PR53DT7I.js → chunk-3XSDI5WF.js} +5 -5
  7. package/dist/{chunk-S7T6VX56.js → chunk-7DZK6WSQ.js} +8 -4
  8. package/dist/{chunk-32PRS2MG.js → chunk-DZDI2HRT.js} +4 -4
  9. package/dist/{chunk-EF6GHOIN.js → chunk-FVCDMQUQ.js} +2 -2
  10. package/dist/{chunk-SJOOXO34.js → chunk-GGXPG6OE.js} +3 -3
  11. package/dist/{chunk-TGJUUB44.js → chunk-KHMBNT66.js} +4 -4
  12. package/dist/{chunk-PANVPNYF.js → chunk-MPG3IEGB.js} +37 -238
  13. package/dist/chunk-QCC4VJUH.js +217 -0
  14. package/dist/{chunk-JY6BFIJJ.js → chunk-QLW657NT.js} +2 -2
  15. package/dist/{chunk-XB66PZ6Z.js → chunk-RVTNSNGK.js} +2 -2
  16. package/dist/{chunk-LMOFZNTQ.js → chunk-SJ4DQFIJ.js} +2 -2
  17. package/dist/{chunk-PDFQ5BFG.js → chunk-SVTEJYMS.js} +4 -155
  18. package/dist/chunk-TDNZ2RYA.js +702 -0
  19. package/dist/chunk-UAZLPNVC.js +108 -0
  20. package/dist/chunk-WVQC2EGO.js +166 -0
  21. package/dist/{chunk-DOQMAZL5.js → chunk-XDCKZ5TV.js} +3 -3
  22. package/dist/{chunk-2RS6TA3D.js → chunk-YRIS7ZS6.js} +28 -17
  23. package/dist/{clean-S7PKCOLM.js → clean-MDBYH62P.js} +4 -4
  24. package/dist/cli.js +1 -1
  25. package/dist/{context-AH5MFHRG.js → context-PLPCAPCO.js} +23 -9
  26. package/dist/{doctor-RSJMLE2P.js → doctor-BX677KRE.js} +13 -6
  27. package/dist/{init-2V34DVRQ.js → init-WQCAOJ2R.js} +7 -6
  28. package/dist/{mcp-T2GRTEX5.js → mcp-U7EPH43L.js} +153 -15
  29. package/dist/memory-VSVNLEJC.js +393 -0
  30. package/dist/{open-2QSZKKUG.js → open-UJZRYF4E.js} +246 -55
  31. package/dist/{program-V2USHGXN.js → program-CWJNGCTZ.js} +37 -20
  32. package/dist/{review-R3R2J5BJ.js → review-OOKXSYMP.js} +10 -8
  33. package/dist/{security-PI4LXCOB.js → security-LME3XFL3.js} +6 -4
  34. package/dist/{staged-check-HHIBKKMR.js → staged-check-X24C3YRD.js} +9 -7
  35. package/dist/{status-6M73WX5I.js → status-RR57ZNGI.js} +8 -2
  36. package/dist/{sync-3ZNJDSSU.js → sync-KFJANRXF.js} +11 -9
  37. package/dist/{watch-USN5CQIV.js → watch-CY7QHIYN.js} +11 -9
  38. package/dist/web/assets/{Editor-BI56-HX5.js → Editor-Bnilgch0.js} +1 -1
  39. package/dist/web/assets/{abnfDiagram-O67JEVCF-y_9px2ob.js → abnfDiagram-O67JEVCF-DW9LWr8f.js} +1 -1
  40. package/dist/web/assets/architecture-7GRP2DOG-BWDZV2yn.js +1 -0
  41. package/dist/web/assets/{architectureDiagram-NJMV4G6O-lB6fcVzU.js → architectureDiagram-NJMV4G6O-0eKeQRhj.js} +1 -1
  42. package/dist/web/assets/{blockDiagram-BEXU5L5S-DcM5pEjM.js → blockDiagram-BEXU5L5S-D5i3-ogI.js} +1 -1
  43. package/dist/web/assets/{c4Diagram-YGBWAQC7-CJgqxTY2.js → c4Diagram-YGBWAQC7-BAWQZrEu.js} +1 -1
  44. package/dist/web/assets/channel-Bkh05NKd.js +1 -0
  45. package/dist/web/assets/{chunk-3FUC2YCW-B8l_VuWR.js → chunk-3FUC2YCW-fKRGOZF3.js} +1 -1
  46. package/dist/web/assets/{chunk-5DYCD2WN-CZecgNhf.js → chunk-5DYCD2WN-C5jOlx42.js} +1 -1
  47. package/dist/web/assets/{chunk-742MDFTN-BeZ7P5jB.js → chunk-742MDFTN-urY4RP_A.js} +1 -1
  48. package/dist/web/assets/{chunk-7INBJB4K-IKy0pr5m.js → chunk-7INBJB4K-nk48sKqZ.js} +1 -1
  49. package/dist/web/assets/{chunk-7M6MHVWA-Dg_QqJEX.js → chunk-7M6MHVWA-BfBD9X0F.js} +1 -1
  50. package/dist/web/assets/{chunk-7PRAP22T-DqQNS8oq.js → chunk-7PRAP22T-jYf59QlI.js} +1 -1
  51. package/dist/web/assets/{chunk-GTNCS2PH-x4sM51nJ.js → chunk-GTNCS2PH-BOCxryKf.js} +1 -1
  52. package/dist/web/assets/{chunk-GWA4HPMP-CE5GcwVN.js → chunk-GWA4HPMP-CFpaW0ru.js} +1 -1
  53. package/dist/web/assets/{chunk-MBY4JIJT-DA_D1hjF.js → chunk-MBY4JIJT-BIB8HctN.js} +1 -1
  54. package/dist/web/assets/{chunk-NETBCI7D-CeJ3XBZ2.js → chunk-NETBCI7D-CpUUK6rh.js} +1 -1
  55. package/dist/web/assets/{chunk-O7XYJQB3-BH2gESvO.js → chunk-O7XYJQB3-BNx_V4Oi.js} +1 -1
  56. package/dist/web/assets/{chunk-UA2S7LBM-BWr0xCux.js → chunk-UA2S7LBM-D3tMiIOY.js} +1 -1
  57. package/dist/web/assets/{chunk-WEXAMYUT-B4QwUZPM.js → chunk-WEXAMYUT-CC-3C32l.js} +1 -1
  58. package/dist/web/assets/{chunk-Z7XXMR3K-BxcA-y5B.js → chunk-Z7XXMR3K-BzhxKQUc.js} +1 -1
  59. package/dist/web/assets/{chunk-ZIGJFQKS-BZYvP63G.js → chunk-ZIGJFQKS-D4tBHzxg.js} +1 -1
  60. package/dist/web/assets/{classDiagram-v2-NBCMYWYE-BS3P_NXb.js → classDiagram-v2-NBCMYWYE-BbtyanXR.js} +1 -1
  61. package/dist/web/assets/{cynefin-OW5HDTMX-BALD4Pve.js → cynefin-OW5HDTMX-BIArb8W1.js} +1 -1
  62. package/dist/web/assets/{cynefinDiagram-VND7K2PF-BM2y4W6d.js → cynefinDiagram-VND7K2PF-BrAcfkXL.js} +1 -1
  63. package/dist/web/assets/{dagre-6A5THRUB-PTfOrIdF.js → dagre-6A5THRUB-BcHXRl4s.js} +1 -1
  64. package/dist/web/assets/{diagram-22UHCM2B-CpXEHhUl.js → diagram-22UHCM2B-Dx9tSCdE.js} +1 -1
  65. package/dist/web/assets/{diagram-3UASUU5V-DPHfXzr6.js → diagram-3UASUU5V-CLLDP9yH.js} +1 -1
  66. package/dist/web/assets/{diagram-ATOU4E4O-DMBNXvAC.js → diagram-ATOU4E4O-B46H9iPt.js} +1 -1
  67. package/dist/web/assets/{diagram-CDSNMT55-CDLe1M7G.js → diagram-CDSNMT55-CYtvB6aG.js} +1 -1
  68. package/dist/web/assets/{diagram-MLGK6HIB-D6L8oE7j.js → diagram-MLGK6HIB-Dar7ktoX.js} +1 -1
  69. package/dist/web/assets/{diagram-MPIPVDR6-CP-S7rrQ.js → diagram-MPIPVDR6-C-DljnYN.js} +1 -1
  70. package/dist/web/assets/{ebnfDiagram-ZINNZB2B-CkUc63TK.js → ebnfDiagram-ZINNZB2B-Dv_3jWnh.js} +1 -1
  71. package/dist/web/assets/{elk-276RUBZZ-C1CAJLH_.js → elk-276RUBZZ-DnHciE9k.js} +1 -1
  72. package/dist/web/assets/{erDiagram-OPXOYQCR-DXBnaTHm.js → erDiagram-OPXOYQCR-Bn46KrHz.js} +1 -1
  73. package/dist/web/assets/eventmodeling-NTZA5JFV-DYwoptMd.js +1 -0
  74. package/dist/web/assets/flowDiagram-KWPJA3E3-y4rS0gIB.js +1 -0
  75. package/dist/web/assets/{ganttDiagram-FUAMR5RP-BVm8SiGg.js → ganttDiagram-FUAMR5RP-DOjjJtqz.js} +1 -1
  76. package/dist/web/assets/{gitGraph-4MIJSDKK-Dm7xBrW0.js → gitGraph-4MIJSDKK-BIoMXJRQ.js} +1 -1
  77. package/dist/web/assets/{gitGraphDiagram-X574FWY7-D_PIKKhx.js → gitGraphDiagram-X574FWY7-BsJ01R0v.js} +1 -1
  78. package/dist/web/assets/{index-CeOIBpu2.js → index-Cen0jOXj.js} +5 -4
  79. package/dist/web/assets/{index-DKE3ojTe.css → index-WwRY6n68.css} +1 -1
  80. package/dist/web/assets/{info-A6RAGUB7-CLGrx8pn.js → info-A6RAGUB7-BmlXzRWj.js} +1 -1
  81. package/dist/web/assets/{infoDiagram-VRGFBTTK-BlBjaKm7.js → infoDiagram-VRGFBTTK-CYPJPmBP.js} +1 -1
  82. package/dist/web/assets/{ishikawaDiagram-OU5B5YK6-Kxe7GGS3.js → ishikawaDiagram-OU5B5YK6-YN96geky.js} +1 -1
  83. package/dist/web/assets/{journeyDiagram-ZHPQQLJL-wCMoHK4M.js → journeyDiagram-ZHPQQLJL-20juojKY.js} +1 -1
  84. package/dist/web/assets/{kanban-definition-PNTS6WVX-BxdCz9Ko.js → kanban-definition-PNTS6WVX-BhCKIEbP.js} +1 -1
  85. package/dist/web/assets/{line-Zf11FnWF.js → line-BERsMFG6.js} +1 -1
  86. package/dist/web/assets/{mermaid-parser.core-BvFFklev.js → mermaid-parser.core-Bis_wTB-.js} +3 -3
  87. package/dist/web/assets/{mermaid.core-Cd_Ssti9.js → mermaid.core-DMsM3ZX7.js} +4 -4
  88. package/dist/web/assets/{mindmap-definition-NLK3R4M7-BGPQl-GY.js → mindmap-definition-NLK3R4M7-BkcGdOfv.js} +1 -1
  89. package/dist/web/assets/{packet-AYTQ26CC-6lI3cEX_.js → packet-AYTQ26CC-Bh30-JJX.js} +1 -1
  90. package/dist/web/assets/{pegDiagram-GJSIUBJH-BPIjlSAj.js → pegDiagram-GJSIUBJH-DxnIo9RF.js} +1 -1
  91. package/dist/web/assets/{pie-WAS4IAKB-D6Dzj3Ja.js → pie-WAS4IAKB-ChaTr-GD.js} +1 -1
  92. package/dist/web/assets/{pieDiagram-5QR66LMP-DtA-vZmv.js → pieDiagram-5QR66LMP-CzAp78FM.js} +1 -1
  93. package/dist/web/assets/{quadrantDiagram-O4NWA36T-EettyqQn.js → quadrantDiagram-O4NWA36T-BDSE-cfY.js} +1 -1
  94. package/dist/web/assets/{radar-RG4KPBEZ-xmRc3Dl8.js → radar-RG4KPBEZ-DgJ-o_dq.js} +1 -1
  95. package/dist/web/assets/{railroad-74A4TZTK-BLB7dhOn.js → railroad-74A4TZTK-C8MmcBKz.js} +1 -1
  96. package/dist/web/assets/railroad-abnf-HS5TGJTU-CTLXjcdP.js +1 -0
  97. package/dist/web/assets/railroad-ebnf-LZEXJU2U-ggWsTTL0.js +1 -0
  98. package/dist/web/assets/railroad-peg-WCYAUIDC-D1mCX705.js +1 -0
  99. package/dist/web/assets/{railroadDiagram-XR7U4H2S-PBw4We6b.js → railroadDiagram-XR7U4H2S-DfbcWRNh.js} +1 -1
  100. package/dist/web/assets/{requirementDiagram-PLB6GJNP-DjQpaUFA.js → requirementDiagram-PLB6GJNP-DM3nksxs.js} +1 -1
  101. package/dist/web/assets/{sankeyDiagram-IPEJSGJF-CBW-_AoF.js → sankeyDiagram-IPEJSGJF-DthUpiiC.js} +1 -1
  102. package/dist/web/assets/{sequenceDiagram-PO4LG4MO-DEoPYqY9.js → sequenceDiagram-PO4LG4MO-DLA3nuvA.js} +1 -1
  103. package/dist/web/assets/{stateDiagram-v2-GCMORJYK-UZq5rPud.js → stateDiagram-v2-GCMORJYK-B0X6ihBW.js} +1 -1
  104. package/dist/web/assets/{swimlanes-2SLR337P-CACfuXJR.js → swimlanes-2SLR337P-B4qWe6vE.js} +1 -1
  105. package/dist/web/assets/swimlanesDiagram-TC7HE7FX-ClIk3e7S.js +8 -0
  106. package/dist/web/assets/{timeline-definition-EJHVYXUP-CYJl7mP-.js → timeline-definition-EJHVYXUP-F-cDzYrj.js} +1 -1
  107. package/dist/web/assets/{treeView-Q6P3EWNA-DtZ5nkPQ.js → treeView-Q6P3EWNA-BaI30nLZ.js} +1 -1
  108. package/dist/web/assets/{treemap-WGGIJYW6-m49GDM-M.js → treemap-WGGIJYW6-D2jGGoMl.js} +1 -1
  109. package/dist/web/assets/{usecaseDiagram-POWQR4AR-C2Vg20UK.js → usecaseDiagram-POWQR4AR-B9qoAQCy.js} +1 -1
  110. package/dist/web/assets/{vennDiagram-UO4OBE2U-C07v5OGI.js → vennDiagram-UO4OBE2U-DGVNOaKO.js} +1 -1
  111. package/dist/web/assets/{wardley-WFR3VGLG-C9Z7EZtz.js → wardley-WFR3VGLG-DbKqhNAh.js} +1 -1
  112. package/dist/web/assets/{wardleyDiagram-VNRHLVJA-DdA8CcSC.js → wardleyDiagram-VNRHLVJA-BgZ1gprw.js} +1 -1
  113. package/dist/web/assets/{xychartDiagram-PMCCYNJV-C9EZw07b.js → xychartDiagram-PMCCYNJV-D73RYid1.js} +1 -1
  114. package/dist/web/index.html +2 -2
  115. package/package.json +1 -1
  116. package/dist/chunk-CXUTYCZX.js +0 -238
  117. package/dist/web/assets/architecture-7GRP2DOG-DyxkwYiW.js +0 -1
  118. package/dist/web/assets/channel-BvDD7AMO.js +0 -1
  119. package/dist/web/assets/eventmodeling-NTZA5JFV-cLIzvgDp.js +0 -1
  120. package/dist/web/assets/flowDiagram-KWPJA3E3-D7Zq63VQ.js +0 -1
  121. package/dist/web/assets/railroad-abnf-HS5TGJTU-DBFym6g8.js +0 -1
  122. package/dist/web/assets/railroad-ebnf-LZEXJU2U-CkG28ig8.js +0 -1
  123. package/dist/web/assets/railroad-peg-WCYAUIDC-Df_Ifaad.js +0 -1
  124. package/dist/web/assets/swimlanesDiagram-TC7HE7FX-CDSrqdgx.js +0 -8
package/CHANGELOG.md CHANGED
@@ -1,5 +1,30 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.4.0 — 2026-10-03
4
+
5
+ Agent memory: coding agents can now record what they learn — decisions and why, gotchas, bug root causes, conventions — and later sessions recall it. Memory lives in `.athena/memory/` as plain Markdown you commit and review like code. Anything an agent writes is `unreviewed` (INFERRED) until you confirm it (`athena memory review`, or the Memory page in `athena open`); entries turn `stale` when the files they describe change. Secrets are refused, and text that looks like it is trying to instruct the agent is flagged and kept out of recall.
6
+
7
+ After upgrading, run `athena analyze` (or `athena agents add <agent>`) so your agent instructions mention `recall` and `remember`.
8
+
9
+ ### Project memory
10
+
11
+ - New `athena memory` commands for the project memory in `.athena/memory/`: `list` (`--kind`, `--status`, `--stale`), `show`, `add` (`--kind`, `--title`, `--details` or `--details -` for stdin, repeatable `--file`/`--tag`, `--evidence`, `--supersedes`), `search`, `recall <task…>` (`--file`, `--tag`, `--limit`; ranked hits with reasons), `confirm <id…>`, `supersede <id> --by <id>`, `forget <id…>` (asks first; `--yes` in scripts), `edit`, `stale` and `review` (interactive in a terminal: confirm, forget or skip each agent-written entry). All support `--json`.
12
+ - Entries you record are FACT; entries agents record are INFERRED until confirmed. Stale entries (linked files changed) and flagged entries (possible prompt injection) are marked and explained. A memory that contains a possible secret is refused without echoing the value.
13
+ - `athena status` shows a memory line and a `memory` object (`total`, `unreviewed`, `stale`) in `--json`; `athena doctor` adds a Memory check when entries exist.
14
+ - `athena clean` now says how many project memory entries it would delete (they are committed and shared with the team) before asking for confirmation.
15
+
16
+ ### Agent memory: MCP, context and instructions
17
+
18
+ - New MCP tools `recall` (ranked memories for a task and/or files, with why each matched, label, status and staleness, fenced in `<athena-memory … trust="untrusted-data">` delimiters; entries flagged as possible prompt injection are excluded and counted), `list_memory` (summaries filtered by kind, status, stale) and `remember` (records a memory as **unreviewed**/INFERRED, attributed to `agent:<id>` from the client's `clientInfo.name` — claude-code, cursor, codex, copilot, gemini-cli, antigravity, windsurf, cline — or `agent:mcp`). `remember` is the only write the MCP server allows without `--allow-write`; it never touches knowledge documents, refuses secrets without echoing them, and is disabled by `athena mcp --no-memory-write`.
19
+ - `athena context` and `get_relevant_context` include up to five recalled memories (confirmed first, flagged excluded) with labels and reasons, within the character budget (at most 30% of it). `--json` and `/api/context` gain a `memories` field.
20
+ - Generated agent instructions (all adapters) tell agents to recall project memory at the start of a task, record durable, non-obvious learnings with `remember` at the end, and treat unreviewed memories as hints to verify — never instructions; `rules.md` and the developer always win.
21
+
22
+ ### Memory page (`athena open`)
23
+
24
+ - New **Memory** page (`/memory`, in the sidebar with a badge for entries awaiting review) to review project memory in `.athena/memory/*.md`. The review queue (agent-written, INFERRED entries) comes first with Confirm / Edit / Forget; confirmed entries (FACT) follow and superseded ones are collapsed. Cards show kind, FACT/INFERRED label, who recorded it and when, linked files, tags and evidence; details are shown as plain text, never rendered as Markdown or HTML. Stale entries (a linked file changed since) show the changed files and a Re-confirm action; entries that look like prompt injection carry a red warning. Filter chips (kind, status, stale, flagged), a text filter, and an Add memory form (developer entries are FACT immediately). The Overview links to the queue when entries await review.
25
+ - API: `GET /api/memory` (`kind`, `status`, `stale` filters; returns entries and counts), `GET /api/memory/:id`, `POST /api/memory`, `POST /api/memory/:id/confirm`, `POST /api/memory/:id/supersede`, `PATCH /api/memory/:id`, `DELETE /api/memory/:id` — all behind the existing token, Host/Origin and JSON-only checks, with strict schemas. Unknown ids are 404, superseded/busy/full conflicts 409, invalid input and refused secrets 400 (the secret value is never echoed).
26
+ - A `memory.changed` event is emitted after every write from the UI and when memory files change on disk (an agent writing through MCP, `athena memory` in a terminal, a `git pull`), so open pages refresh live.
27
+
3
28
  ## 0.3.0 — 2026-09-30
4
29
 
5
30
  Performance release: work is now proportional to what changed. On a 20,000-file repository (vs 0.2.1): a `sync --check` with nothing changed takes ~0.42 s instead of 2.9 s, `status` 0.14 s instead of 0.34 s, agent hooks start in ~28 ms instead of 112 ms, and peak memory is 20–52% lower in every scenario. The generated `model.json` is unchanged (golden-tested against the 0.2.1 analyzer). Benchmarks: `npm run bench`.
package/README.md CHANGED
@@ -58,6 +58,7 @@ Generated content sits between `athena:generated` markers. Anything outside the
58
58
  | `athena sync` | Show which documents would change and why (with diffs), then apply after confirmation (`--yes`, `--dry-run`, `--diff`, `--check` for CI) |
59
59
  | `athena watch` | Watch the project and propose updates as files change (`--auto-apply` to write automatically) |
60
60
  | `athena doctor` | Check the installation, project, knowledge files and agent integrations |
61
+ | `athena memory` | `list`, `show`, `add`, `search`, `recall`, `confirm`, `supersede`, `forget`, `edit`, `stale`, `review` — project memory in `.athena/memory/` (see [Project memory](#project-memory)) |
61
62
  | `athena rules` | `list`, `add "<rule>" --section <name>`, `edit`, `enable`, `disable`, `remove` |
62
63
  | `athena agents` | `list`, `add <claude-code\|cursor\|codex\|copilot\|gemini-cli\|antigravity\|windsurf\|cline\|agents-md\|all>`, `remove` |
63
64
  | `athena activity` | Show AI agent activity observed through hooks (`-n`, `--agent`) |
@@ -66,15 +67,48 @@ Generated content sits between `athena:generated` markers. Anything outside the
66
67
  | `athena git-hook` | `install` (`--review`), `uninstall`, `status` — a Git pre-commit hook that blocks commits when knowledge is out of date |
67
68
  | `athena context <task>` | Show which knowledge an agent should read for a task (`--full`, `--json`) |
68
69
  | `athena graph` | Inspect the project graph (`--build`, `--search`, `--node`, `--kind`) |
69
- | `athena mcp` | Serve project intelligence to agents over MCP (stdio; `--allow-write`) |
70
+ | `athena mcp` | Serve project intelligence to agents over MCP (stdio; `--allow-write`, `--no-memory-write`) |
70
71
  | `athena ai` | `status`, `enrich` — optional AI suggestions (`--consent`, `--dry-run`) |
71
72
  | `athena open` | Start (or reuse) the local web UI on `127.0.0.1`, watch for changes, and open it (`--port`, `--no-open`, `--no-watch`) |
72
- | `athena clean` | Remove `.athena/` and Athena integration blocks |
73
+ | `athena clean` | Remove `.athena/` (including project memory) and Athena integration blocks |
73
74
 
74
75
  Global flags: `--json`, `--quiet`, `--cwd <dir>`, `--no-color`.
75
76
 
76
77
  They print *Not available yet* and exit with code 2. See [docs/ROADMAP.md](docs/ROADMAP.md).
77
78
 
79
+ ## Project memory
80
+
81
+ Agents rediscover the same things every session: why the queue uses advisory locks, that tests need `TZ=UTC`, which bug the retry guard fixes. Athena keeps these as **project memory** in `.athena/memory/` — one Markdown file per kind (`decisions.md`, `gotchas.md`, `bugs.md`, `conventions.md`, `todos.md`, `facts.md`). Commit it: the team shares it and reviews changes in pull requests. Text you write outside the `athena:memory` markers is kept as written.
82
+
83
+ - **Evidence labels.** An entry you record is `confirmed` (**FACT**). An entry an agent records is `unreviewed` (**INFERRED**) until you confirm it.
84
+ - **Staleness.** Entries can link files. When a linked file changes, the entry is reported **stale** until you confirm it again (which re-anchors it), edit it or forget it.
85
+ - **Safety.** Entries that look like a secret are refused (the value is never stored or printed). Entries that address the agent instead of describing the project (possible prompt injection) are flagged and never recalled automatically.
86
+
87
+ ```bash
88
+ athena memory add --kind decision --title "Queue uses advisory locks" \
89
+ --file src/jobs/queue.ts --tag jobs --evidence "PR #412"
90
+ git log -1 --format=%B | athena memory add --kind bug --title "Double refund on webhook retry" --details -
91
+ athena memory list # --kind, --status unreviewed|confirmed|superseded, --stale
92
+ athena memory review # walk agent-written entries: [c]onfirm [e]dit later [f]orget [s]kip [q]uit
93
+ athena memory recall "change the refund flow" --file src/api/refunds.ts
94
+ athena memory stale # entries whose linked files changed
95
+ athena memory confirm m-1a2b3c m-4d5e6f
96
+ athena memory supersede m-1a2b3c --by m-7a8b9c # keep as history
97
+ athena memory forget m-1a2b3c # asks first; --yes in scripts
98
+ ```
99
+
100
+ ```text
101
+ $ athena memory list
102
+ ID KIND LABEL STATUS TITLE · SOURCE
103
+ m-b74d24 gotcha INFERRED unreviewed Refund webhook retries twice · agent:claude-code
104
+ m-815cd7 decision FACT confirmed stale Queue uses advisory locks · developer
105
+
106
+ 2 entries · 1 confirmed · 1 unreviewed · 1 stale · source: .athena/memory/
107
+ 1 entry written by agents is INFERRED until reviewed: run `athena memory review`.
108
+ ```
109
+
110
+ Every command supports `--json`. `athena memory review` is interactive only in a terminal; elsewhere it lists the unreviewed entries and exits 0. `athena status` and `athena doctor` show how many entries are unreviewed or stale, and `athena clean` warns before deleting project memory.
111
+
78
112
  ## Keeping knowledge in sync
79
113
 
80
114
  ```text
@@ -249,11 +283,19 @@ Documents to read
249
283
 
250
284
  - **Deterministic.** The same task and project state always produce the same selection, with a stated reason for each document. No AI is involved.
251
285
  - **Sections, not whole files.** Only the relevant sections are returned, under a character budget, with your rules always included.
286
+ - **Project memory.** Up to five recalled memories from `.athena/memory/` (confirmed ones first, possible prompt injections excluded) are included with their label (`FACT` once a developer confirmed them, `INFERRED` while unreviewed), whether they are stale, and why they matched. They share the character budget (at most 30% of it) and appear in `--full` output and as `memories` in `--json`.
252
287
  - **Project graph.** `athena graph --build` writes `.athena/graph.json`: packages, files, routes, entities, frameworks and commands, connected by `contains`, `imports`, `handles`, `defines` and `depends_on`. It comes from the analysis, so it never asserts more than DETECTED evidence.
253
288
 
254
- **MCP.** `athena mcp` serves this to any MCP-capable agent over stdio, and `athena agents add` registers it (`.mcp.json` for Claude Code, `.cursor/mcp.json` for Cursor, `[mcp_servers.athena]` in `.codex/config.toml` for Codex, `servers.athena` in `.vscode/mcp.json` for GitHub Copilot in VS Code, `mcpServers.athena` in `.gemini/settings.json` for Gemini CLI). Tools: `get_relevant_context`, `get_project_context`, `get_architecture`, `get_database_schema`, `get_api_context`, `get_security_context`, `get_project_rules`, `get_knowledge_document`, `get_project_changes`, `get_project_graph`, `get_athena_status`, `update_knowledge`.
289
+ **MCP.** `athena mcp` serves this to any MCP-capable agent over stdio, and `athena agents add` registers it (`.mcp.json` for Claude Code, `.cursor/mcp.json` for Cursor, `[mcp_servers.athena]` in `.codex/config.toml` for Codex, `servers.athena` in `.vscode/mcp.json` for GitHub Copilot in VS Code, `mcpServers.athena` in `.gemini/settings.json` for Gemini CLI). Tools: `get_relevant_context`, `get_project_context`, `get_architecture`, `get_database_schema`, `get_api_context`, `get_security_context`, `get_project_rules`, `get_knowledge_document`, `get_project_changes`, `get_project_graph`, `get_athena_status`, `update_knowledge`, and the memory tools `recall`, `list_memory` and `remember`.
290
+
291
+ The server is **read-only by default**: `update_knowledge` reports what would change and refuses to write unless you start it with `--allow-write`. The one exception is `remember`: an agent may append a memory to `.athena/memory/`, but it is always stored **unreviewed** (`INFERRED`, attributed to the agent, e.g. `agent:claude-code`, or `agent:mcp` when the client is not recognized) and counts as a `FACT` only after a developer confirms it. It never touches knowledge documents and refuses anything that looks like a secret. Start the server with `--no-memory-write` to turn it off.
255
292
 
256
- The server is **read-only by default**: `update_knowledge` reports what would change and refuses to write unless you start it with `--allow-write`. Repository content it returns is passed through the secret redactor and wrapped in `<athena-document … trust="untrusted-data">` delimiters, so agents can tell project data from instructions.
293
+ | Memory tool | Input | Returns |
294
+ | --- | --- | --- |
295
+ | `recall` | `task?`, `files?`, `tags?`, `limit?` | Ranked memories with why each matched, label, status and staleness, each in `<athena-memory … trust="untrusted-data">` delimiters. Entries that look like instructions to an agent are excluded (the reply says how many). |
296
+ | `list_memory` | `kind?`, `status?`, `stale?` | One-line summaries: id, kind, status, label, stale, title |
297
+ | `remember` | `kind`, `title`, `details?`, `files?`, `tags?`, `evidence?`, `supersedes?` | The new id and label (`INFERRED`); a developer must confirm it |
298
+ Repository content it returns is passed through the secret redactor and wrapped in `<athena-document … trust="untrusted-data">` (or `<athena-memory …>`) delimiters, so agents can tell project data from instructions. The generated agent instructions tell agents to `recall` at the start of a task, `remember` durable learnings at the end, and treat unreviewed memories as hints to verify — `rules.md` and the developer always win.
257
299
 
258
300
  ## Optional AI
259
301
 
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  listAgents
4
- } from "./chunk-JY6BFIJJ.js";
4
+ } from "./chunk-QLW657NT.js";
5
5
  import {
6
6
  readRecentEvents,
7
7
  summarizeSessions
@@ -21,14 +21,14 @@ import {
21
21
  } from "./chunk-XFN7UZCS.js";
22
22
  import "./chunk-KBO7XRBW.js";
23
23
  import "./chunk-JCGDR4UV.js";
24
- import "./chunk-2RS6TA3D.js";
24
+ import "./chunk-YRIS7ZS6.js";
25
25
  import "./chunk-GHFRQAYT.js";
26
+ import "./chunk-INT3IGMQ.js";
26
27
  import "./chunk-673EPYYH.js";
27
28
  import "./chunk-FQEGEVLY.js";
28
29
  import "./chunk-2DY4PUR4.js";
29
30
  import "./chunk-IQQBAWSM.js";
30
31
  import "./chunk-AD4OZCU2.js";
31
- import "./chunk-INT3IGMQ.js";
32
32
  import "./chunk-XW3MLHI2.js";
33
33
  import "./chunk-EUPETUWA.js";
34
34
 
@@ -74,4 +74,4 @@ async function activityCommand(opts) {
74
74
  export {
75
75
  activityCommand
76
76
  };
77
- //# sourceMappingURL=activity-P4UUFHWV.js.map
77
+ //# sourceMappingURL=activity-BKW7G4I5.js.map
@@ -3,7 +3,7 @@ import {
3
3
  configureAgents,
4
4
  listAgents,
5
5
  removeAgents
6
- } from "./chunk-JY6BFIJJ.js";
6
+ } from "./chunk-QLW657NT.js";
7
7
  import "./chunk-65TSRDQ3.js";
8
8
  import {
9
9
  c,
@@ -20,14 +20,14 @@ import {
20
20
  } from "./chunk-XFN7UZCS.js";
21
21
  import "./chunk-KBO7XRBW.js";
22
22
  import "./chunk-JCGDR4UV.js";
23
- import "./chunk-2RS6TA3D.js";
23
+ import "./chunk-YRIS7ZS6.js";
24
24
  import "./chunk-GHFRQAYT.js";
25
+ import "./chunk-INT3IGMQ.js";
25
26
  import "./chunk-673EPYYH.js";
26
27
  import "./chunk-FQEGEVLY.js";
27
28
  import "./chunk-2DY4PUR4.js";
28
29
  import "./chunk-IQQBAWSM.js";
29
30
  import "./chunk-AD4OZCU2.js";
30
- import "./chunk-INT3IGMQ.js";
31
31
  import "./chunk-XW3MLHI2.js";
32
32
  import "./chunk-EUPETUWA.js";
33
33
 
@@ -66,4 +66,4 @@ export {
66
66
  agentsListCommand,
67
67
  agentsRemoveCommand
68
68
  };
69
- //# sourceMappingURL=agents-3HTSQGL2.js.map
69
+ //# sourceMappingURL=agents-DFSNEOP5.js.map
@@ -4,7 +4,7 @@ import {
4
4
  printSummary,
5
5
  runWithProgress,
6
6
  summarize
7
- } from "./chunk-DOQMAZL5.js";
7
+ } from "./chunk-XDCKZ5TV.js";
8
8
  import {
9
9
  printHeader
10
10
  } from "./chunk-SHKXELUX.js";
@@ -16,21 +16,22 @@ import {
16
16
  requireProjectRoot
17
17
  } from "./chunk-XFN7UZCS.js";
18
18
  import "./chunk-KBO7XRBW.js";
19
- import "./chunk-SJOOXO34.js";
20
- import "./chunk-PANVPNYF.js";
19
+ import "./chunk-GGXPG6OE.js";
20
+ import "./chunk-MPG3IEGB.js";
21
21
  import "./chunk-ELKFRTZT.js";
22
22
  import "./chunk-2R6PXY6Z.js";
23
23
  import "./chunk-PVCIGUIT.js";
24
24
  import "./chunk-OLPSEQS5.js";
25
+ import "./chunk-QCC4VJUH.js";
25
26
  import "./chunk-JCGDR4UV.js";
26
- import "./chunk-2RS6TA3D.js";
27
+ import "./chunk-YRIS7ZS6.js";
27
28
  import "./chunk-GHFRQAYT.js";
29
+ import "./chunk-INT3IGMQ.js";
28
30
  import "./chunk-673EPYYH.js";
29
31
  import "./chunk-FQEGEVLY.js";
30
32
  import "./chunk-2DY4PUR4.js";
31
33
  import "./chunk-IQQBAWSM.js";
32
34
  import "./chunk-AD4OZCU2.js";
33
- import "./chunk-INT3IGMQ.js";
34
35
  import "./chunk-XW3MLHI2.js";
35
36
  import "./chunk-EUPETUWA.js";
36
37
 
@@ -46,4 +47,4 @@ async function analyzeCommand(opts) {
46
47
  export {
47
48
  analyzeCommand
48
49
  };
49
- //# sourceMappingURL=analyze-F3YOILNL.js.map
50
+ //# sourceMappingURL=analyze-ZY3MXBOI.js.map
@@ -5,13 +5,13 @@ import {
5
5
  import {
6
6
  whichExecutable
7
7
  } from "./chunk-VSYBC3VY.js";
8
+ import {
9
+ readRecentEvents
10
+ } from "./chunk-65TSRDQ3.js";
8
11
  import {
9
12
  listRules,
10
13
  parseRules
11
14
  } from "./chunk-3IS2X2Z7.js";
12
- import {
13
- readRecentEvents
14
- } from "./chunk-65TSRDQ3.js";
15
15
  import {
16
16
  findProjectRoot
17
17
  } from "./chunk-KBO7XRBW.js";
@@ -24,7 +24,7 @@ import {
24
24
  } from "./chunk-OLPSEQS5.js";
25
25
  import {
26
26
  ADAPTERS
27
- } from "./chunk-2RS6TA3D.js";
27
+ } from "./chunk-YRIS7ZS6.js";
28
28
  import {
29
29
  hookCommand
30
30
  } from "./chunk-GHFRQAYT.js";
@@ -176,4 +176,4 @@ export {
176
176
  findRunningInstance,
177
177
  runDoctor
178
178
  };
179
- //# sourceMappingURL=chunk-PR53DT7I.js.map
179
+ //# sourceMappingURL=chunk-3XSDI5WF.js.map
@@ -5,14 +5,15 @@ import {
5
5
  isJson,
6
6
  json,
7
7
  line,
8
- ok
8
+ ok,
9
+ sym
9
10
  } from "./chunk-Z6QWMJLK.js";
10
11
  import {
11
12
  requireProjectRoot
12
13
  } from "./chunk-XFN7UZCS.js";
13
14
  import {
14
15
  ADAPTERS
15
- } from "./chunk-2RS6TA3D.js";
16
+ } from "./chunk-YRIS7ZS6.js";
16
17
  import {
17
18
  athenaDir
18
19
  } from "./chunk-2DY4PUR4.js";
@@ -36,8 +37,11 @@ async function confirm(question) {
36
37
  async function cleanCommand(opts) {
37
38
  const root = await requireProjectRoot(opts);
38
39
  if (!opts.yes) {
39
- if (!process.stdin.isTTY) throw new AthenaError("Refusing to delete .athena/ without confirmation.", "Re-run with --yes in non-interactive environments.");
40
+ const memory = (await (await import("./memory-VSVNLEJC.js")).memorySummary(root))?.total ?? 0;
41
+ const memoryNote = memory ? `${memory} project memory ${memory === 1 ? "entry" : "entries"} in .athena/memory/ (shared with your team)` : "";
42
+ if (!process.stdin.isTTY) throw new AthenaError(`Refusing to delete .athena/${memory ? `, including ${memoryNote},` : ""} without confirmation.`, "Re-run with --yes in non-interactive environments.");
40
43
  line(`This removes ${c.bold(".athena/")} (including rules.md and your Developer Notes)${opts.keepAgents ? "" : " and Athena blocks/files in agent configurations"}.`);
44
+ if (memory) line(c.yellow(`${sym.warn} It also deletes ${memoryNote}.`));
41
45
  line(dim("If .athena/ is committed to Git you can restore it from history."));
42
46
  if (!await confirm("Continue?")) {
43
47
  line("Cancelled.");
@@ -58,4 +62,4 @@ export {
58
62
  confirm,
59
63
  cleanCommand
60
64
  };
61
- //# sourceMappingURL=chunk-S7T6VX56.js.map
65
+ //# sourceMappingURL=chunk-7DZK6WSQ.js.map
@@ -1,14 +1,14 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  AnalysisScheduler
4
- } from "./chunk-XB66PZ6Z.js";
4
+ } from "./chunk-RVTNSNGK.js";
5
5
  import {
6
6
  applySync,
7
7
  needsIndexRefreshOnly
8
- } from "./chunk-TGJUUB44.js";
8
+ } from "./chunk-KHMBNT66.js";
9
9
  import {
10
10
  readExclude
11
- } from "./chunk-PANVPNYF.js";
11
+ } from "./chunk-MPG3IEGB.js";
12
12
  import {
13
13
  IgnoreMatcher,
14
14
  factsConfigHash
@@ -166,4 +166,4 @@ async function watchProject(root, opts) {
166
166
  export {
167
167
  watchProject
168
168
  };
169
- //# sourceMappingURL=chunk-32PRS2MG.js.map
169
+ //# sourceMappingURL=chunk-DZDI2HRT.js.map
@@ -6,7 +6,7 @@ import {
6
6
  import {
7
7
  loadScan,
8
8
  manifestDependencyNames
9
- } from "./chunk-PANVPNYF.js";
9
+ } from "./chunk-MPG3IEGB.js";
10
10
  import {
11
11
  API_ROUTE_PATH,
12
12
  AUTH_PATH,
@@ -340,4 +340,4 @@ export {
340
340
  reviewChanges,
341
341
  hasBlockers
342
342
  };
343
- //# sourceMappingURL=chunk-EF6GHOIN.js.map
343
+ //# sourceMappingURL=chunk-FVCDMQUQ.js.map
@@ -3,7 +3,7 @@ import {
3
3
  analyzeProject,
4
4
  loadScanFromDir,
5
5
  persistAnalysisCache
6
- } from "./chunk-PANVPNYF.js";
6
+ } from "./chunk-MPG3IEGB.js";
7
7
  import {
8
8
  ATHENA_VERSION
9
9
  } from "./chunk-2R6PXY6Z.js";
@@ -16,7 +16,7 @@ import {
16
16
  import {
17
17
  ADAPTERS,
18
18
  applyChanges
19
- } from "./chunk-2RS6TA3D.js";
19
+ } from "./chunk-YRIS7ZS6.js";
20
20
  import {
21
21
  mergeDocument,
22
22
  renderBlock
@@ -901,4 +901,4 @@ export {
901
901
  composeState,
902
902
  runPipeline
903
903
  };
904
- //# sourceMappingURL=chunk-SJOOXO34.js.map
904
+ //# sourceMappingURL=chunk-GGXPG6OE.js.map
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  projectSession
4
- } from "./chunk-PDFQ5BFG.js";
4
+ } from "./chunk-WVQC2EGO.js";
5
5
  import {
6
6
  impactOf
7
7
  } from "./chunk-GR4DL2VM.js";
@@ -11,10 +11,10 @@ import {
11
11
  indexWithIntegrations,
12
12
  planKnowledge,
13
13
  writePlannedKnowledge
14
- } from "./chunk-SJOOXO34.js";
14
+ } from "./chunk-GGXPG6OE.js";
15
15
  import {
16
16
  analyzeProject
17
- } from "./chunk-PANVPNYF.js";
17
+ } from "./chunk-MPG3IEGB.js";
18
18
  import {
19
19
  headMovement
20
20
  } from "./chunk-OLPSEQS5.js";
@@ -396,4 +396,4 @@ export {
396
396
  HISTORY_SECTIONS,
397
397
  staleForCheck
398
398
  };
399
- //# sourceMappingURL=chunk-TGJUUB44.js.map
399
+ //# sourceMappingURL=chunk-KHMBNT66.js.map