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.
- package/CHANGELOG.md +25 -0
- package/README.md +46 -4
- package/dist/{activity-P4UUFHWV.js → activity-BKW7G4I5.js} +4 -4
- package/dist/{agents-3HTSQGL2.js → agents-DFSNEOP5.js} +4 -4
- package/dist/{analyze-F3YOILNL.js → analyze-ZY3MXBOI.js} +7 -6
- package/dist/{chunk-PR53DT7I.js → chunk-3XSDI5WF.js} +5 -5
- package/dist/{chunk-S7T6VX56.js → chunk-7DZK6WSQ.js} +8 -4
- package/dist/{chunk-32PRS2MG.js → chunk-DZDI2HRT.js} +4 -4
- package/dist/{chunk-EF6GHOIN.js → chunk-FVCDMQUQ.js} +2 -2
- package/dist/{chunk-SJOOXO34.js → chunk-GGXPG6OE.js} +3 -3
- package/dist/{chunk-TGJUUB44.js → chunk-KHMBNT66.js} +4 -4
- package/dist/{chunk-PANVPNYF.js → chunk-MPG3IEGB.js} +37 -238
- package/dist/chunk-QCC4VJUH.js +217 -0
- package/dist/{chunk-JY6BFIJJ.js → chunk-QLW657NT.js} +2 -2
- package/dist/{chunk-XB66PZ6Z.js → chunk-RVTNSNGK.js} +2 -2
- package/dist/{chunk-LMOFZNTQ.js → chunk-SJ4DQFIJ.js} +2 -2
- package/dist/{chunk-PDFQ5BFG.js → chunk-SVTEJYMS.js} +4 -155
- package/dist/chunk-TDNZ2RYA.js +702 -0
- package/dist/chunk-UAZLPNVC.js +108 -0
- package/dist/chunk-WVQC2EGO.js +166 -0
- package/dist/{chunk-DOQMAZL5.js → chunk-XDCKZ5TV.js} +3 -3
- package/dist/{chunk-2RS6TA3D.js → chunk-YRIS7ZS6.js} +28 -17
- package/dist/{clean-S7PKCOLM.js → clean-MDBYH62P.js} +4 -4
- package/dist/cli.js +1 -1
- package/dist/{context-AH5MFHRG.js → context-PLPCAPCO.js} +23 -9
- package/dist/{doctor-RSJMLE2P.js → doctor-BX677KRE.js} +13 -6
- package/dist/{init-2V34DVRQ.js → init-WQCAOJ2R.js} +7 -6
- package/dist/{mcp-T2GRTEX5.js → mcp-U7EPH43L.js} +153 -15
- package/dist/memory-VSVNLEJC.js +393 -0
- package/dist/{open-2QSZKKUG.js → open-UJZRYF4E.js} +246 -55
- package/dist/{program-V2USHGXN.js → program-CWJNGCTZ.js} +37 -20
- package/dist/{review-R3R2J5BJ.js → review-OOKXSYMP.js} +10 -8
- package/dist/{security-PI4LXCOB.js → security-LME3XFL3.js} +6 -4
- package/dist/{staged-check-HHIBKKMR.js → staged-check-X24C3YRD.js} +9 -7
- package/dist/{status-6M73WX5I.js → status-RR57ZNGI.js} +8 -2
- package/dist/{sync-3ZNJDSSU.js → sync-KFJANRXF.js} +11 -9
- package/dist/{watch-USN5CQIV.js → watch-CY7QHIYN.js} +11 -9
- package/dist/web/assets/{Editor-BI56-HX5.js → Editor-Bnilgch0.js} +1 -1
- package/dist/web/assets/{abnfDiagram-O67JEVCF-y_9px2ob.js → abnfDiagram-O67JEVCF-DW9LWr8f.js} +1 -1
- package/dist/web/assets/architecture-7GRP2DOG-BWDZV2yn.js +1 -0
- package/dist/web/assets/{architectureDiagram-NJMV4G6O-lB6fcVzU.js → architectureDiagram-NJMV4G6O-0eKeQRhj.js} +1 -1
- package/dist/web/assets/{blockDiagram-BEXU5L5S-DcM5pEjM.js → blockDiagram-BEXU5L5S-D5i3-ogI.js} +1 -1
- package/dist/web/assets/{c4Diagram-YGBWAQC7-CJgqxTY2.js → c4Diagram-YGBWAQC7-BAWQZrEu.js} +1 -1
- package/dist/web/assets/channel-Bkh05NKd.js +1 -0
- package/dist/web/assets/{chunk-3FUC2YCW-B8l_VuWR.js → chunk-3FUC2YCW-fKRGOZF3.js} +1 -1
- package/dist/web/assets/{chunk-5DYCD2WN-CZecgNhf.js → chunk-5DYCD2WN-C5jOlx42.js} +1 -1
- package/dist/web/assets/{chunk-742MDFTN-BeZ7P5jB.js → chunk-742MDFTN-urY4RP_A.js} +1 -1
- package/dist/web/assets/{chunk-7INBJB4K-IKy0pr5m.js → chunk-7INBJB4K-nk48sKqZ.js} +1 -1
- package/dist/web/assets/{chunk-7M6MHVWA-Dg_QqJEX.js → chunk-7M6MHVWA-BfBD9X0F.js} +1 -1
- package/dist/web/assets/{chunk-7PRAP22T-DqQNS8oq.js → chunk-7PRAP22T-jYf59QlI.js} +1 -1
- package/dist/web/assets/{chunk-GTNCS2PH-x4sM51nJ.js → chunk-GTNCS2PH-BOCxryKf.js} +1 -1
- package/dist/web/assets/{chunk-GWA4HPMP-CE5GcwVN.js → chunk-GWA4HPMP-CFpaW0ru.js} +1 -1
- package/dist/web/assets/{chunk-MBY4JIJT-DA_D1hjF.js → chunk-MBY4JIJT-BIB8HctN.js} +1 -1
- package/dist/web/assets/{chunk-NETBCI7D-CeJ3XBZ2.js → chunk-NETBCI7D-CpUUK6rh.js} +1 -1
- package/dist/web/assets/{chunk-O7XYJQB3-BH2gESvO.js → chunk-O7XYJQB3-BNx_V4Oi.js} +1 -1
- package/dist/web/assets/{chunk-UA2S7LBM-BWr0xCux.js → chunk-UA2S7LBM-D3tMiIOY.js} +1 -1
- package/dist/web/assets/{chunk-WEXAMYUT-B4QwUZPM.js → chunk-WEXAMYUT-CC-3C32l.js} +1 -1
- package/dist/web/assets/{chunk-Z7XXMR3K-BxcA-y5B.js → chunk-Z7XXMR3K-BzhxKQUc.js} +1 -1
- package/dist/web/assets/{chunk-ZIGJFQKS-BZYvP63G.js → chunk-ZIGJFQKS-D4tBHzxg.js} +1 -1
- package/dist/web/assets/{classDiagram-v2-NBCMYWYE-BS3P_NXb.js → classDiagram-v2-NBCMYWYE-BbtyanXR.js} +1 -1
- package/dist/web/assets/{cynefin-OW5HDTMX-BALD4Pve.js → cynefin-OW5HDTMX-BIArb8W1.js} +1 -1
- package/dist/web/assets/{cynefinDiagram-VND7K2PF-BM2y4W6d.js → cynefinDiagram-VND7K2PF-BrAcfkXL.js} +1 -1
- package/dist/web/assets/{dagre-6A5THRUB-PTfOrIdF.js → dagre-6A5THRUB-BcHXRl4s.js} +1 -1
- package/dist/web/assets/{diagram-22UHCM2B-CpXEHhUl.js → diagram-22UHCM2B-Dx9tSCdE.js} +1 -1
- package/dist/web/assets/{diagram-3UASUU5V-DPHfXzr6.js → diagram-3UASUU5V-CLLDP9yH.js} +1 -1
- package/dist/web/assets/{diagram-ATOU4E4O-DMBNXvAC.js → diagram-ATOU4E4O-B46H9iPt.js} +1 -1
- package/dist/web/assets/{diagram-CDSNMT55-CDLe1M7G.js → diagram-CDSNMT55-CYtvB6aG.js} +1 -1
- package/dist/web/assets/{diagram-MLGK6HIB-D6L8oE7j.js → diagram-MLGK6HIB-Dar7ktoX.js} +1 -1
- package/dist/web/assets/{diagram-MPIPVDR6-CP-S7rrQ.js → diagram-MPIPVDR6-C-DljnYN.js} +1 -1
- package/dist/web/assets/{ebnfDiagram-ZINNZB2B-CkUc63TK.js → ebnfDiagram-ZINNZB2B-Dv_3jWnh.js} +1 -1
- package/dist/web/assets/{elk-276RUBZZ-C1CAJLH_.js → elk-276RUBZZ-DnHciE9k.js} +1 -1
- package/dist/web/assets/{erDiagram-OPXOYQCR-DXBnaTHm.js → erDiagram-OPXOYQCR-Bn46KrHz.js} +1 -1
- package/dist/web/assets/eventmodeling-NTZA5JFV-DYwoptMd.js +1 -0
- package/dist/web/assets/flowDiagram-KWPJA3E3-y4rS0gIB.js +1 -0
- package/dist/web/assets/{ganttDiagram-FUAMR5RP-BVm8SiGg.js → ganttDiagram-FUAMR5RP-DOjjJtqz.js} +1 -1
- package/dist/web/assets/{gitGraph-4MIJSDKK-Dm7xBrW0.js → gitGraph-4MIJSDKK-BIoMXJRQ.js} +1 -1
- package/dist/web/assets/{gitGraphDiagram-X574FWY7-D_PIKKhx.js → gitGraphDiagram-X574FWY7-BsJ01R0v.js} +1 -1
- package/dist/web/assets/{index-CeOIBpu2.js → index-Cen0jOXj.js} +5 -4
- package/dist/web/assets/{index-DKE3ojTe.css → index-WwRY6n68.css} +1 -1
- package/dist/web/assets/{info-A6RAGUB7-CLGrx8pn.js → info-A6RAGUB7-BmlXzRWj.js} +1 -1
- package/dist/web/assets/{infoDiagram-VRGFBTTK-BlBjaKm7.js → infoDiagram-VRGFBTTK-CYPJPmBP.js} +1 -1
- package/dist/web/assets/{ishikawaDiagram-OU5B5YK6-Kxe7GGS3.js → ishikawaDiagram-OU5B5YK6-YN96geky.js} +1 -1
- package/dist/web/assets/{journeyDiagram-ZHPQQLJL-wCMoHK4M.js → journeyDiagram-ZHPQQLJL-20juojKY.js} +1 -1
- package/dist/web/assets/{kanban-definition-PNTS6WVX-BxdCz9Ko.js → kanban-definition-PNTS6WVX-BhCKIEbP.js} +1 -1
- package/dist/web/assets/{line-Zf11FnWF.js → line-BERsMFG6.js} +1 -1
- package/dist/web/assets/{mermaid-parser.core-BvFFklev.js → mermaid-parser.core-Bis_wTB-.js} +3 -3
- package/dist/web/assets/{mermaid.core-Cd_Ssti9.js → mermaid.core-DMsM3ZX7.js} +4 -4
- package/dist/web/assets/{mindmap-definition-NLK3R4M7-BGPQl-GY.js → mindmap-definition-NLK3R4M7-BkcGdOfv.js} +1 -1
- package/dist/web/assets/{packet-AYTQ26CC-6lI3cEX_.js → packet-AYTQ26CC-Bh30-JJX.js} +1 -1
- package/dist/web/assets/{pegDiagram-GJSIUBJH-BPIjlSAj.js → pegDiagram-GJSIUBJH-DxnIo9RF.js} +1 -1
- package/dist/web/assets/{pie-WAS4IAKB-D6Dzj3Ja.js → pie-WAS4IAKB-ChaTr-GD.js} +1 -1
- package/dist/web/assets/{pieDiagram-5QR66LMP-DtA-vZmv.js → pieDiagram-5QR66LMP-CzAp78FM.js} +1 -1
- package/dist/web/assets/{quadrantDiagram-O4NWA36T-EettyqQn.js → quadrantDiagram-O4NWA36T-BDSE-cfY.js} +1 -1
- package/dist/web/assets/{radar-RG4KPBEZ-xmRc3Dl8.js → radar-RG4KPBEZ-DgJ-o_dq.js} +1 -1
- package/dist/web/assets/{railroad-74A4TZTK-BLB7dhOn.js → railroad-74A4TZTK-C8MmcBKz.js} +1 -1
- package/dist/web/assets/railroad-abnf-HS5TGJTU-CTLXjcdP.js +1 -0
- package/dist/web/assets/railroad-ebnf-LZEXJU2U-ggWsTTL0.js +1 -0
- package/dist/web/assets/railroad-peg-WCYAUIDC-D1mCX705.js +1 -0
- package/dist/web/assets/{railroadDiagram-XR7U4H2S-PBw4We6b.js → railroadDiagram-XR7U4H2S-DfbcWRNh.js} +1 -1
- package/dist/web/assets/{requirementDiagram-PLB6GJNP-DjQpaUFA.js → requirementDiagram-PLB6GJNP-DM3nksxs.js} +1 -1
- package/dist/web/assets/{sankeyDiagram-IPEJSGJF-CBW-_AoF.js → sankeyDiagram-IPEJSGJF-DthUpiiC.js} +1 -1
- package/dist/web/assets/{sequenceDiagram-PO4LG4MO-DEoPYqY9.js → sequenceDiagram-PO4LG4MO-DLA3nuvA.js} +1 -1
- package/dist/web/assets/{stateDiagram-v2-GCMORJYK-UZq5rPud.js → stateDiagram-v2-GCMORJYK-B0X6ihBW.js} +1 -1
- package/dist/web/assets/{swimlanes-2SLR337P-CACfuXJR.js → swimlanes-2SLR337P-B4qWe6vE.js} +1 -1
- package/dist/web/assets/swimlanesDiagram-TC7HE7FX-ClIk3e7S.js +8 -0
- package/dist/web/assets/{timeline-definition-EJHVYXUP-CYJl7mP-.js → timeline-definition-EJHVYXUP-F-cDzYrj.js} +1 -1
- package/dist/web/assets/{treeView-Q6P3EWNA-DtZ5nkPQ.js → treeView-Q6P3EWNA-BaI30nLZ.js} +1 -1
- package/dist/web/assets/{treemap-WGGIJYW6-m49GDM-M.js → treemap-WGGIJYW6-D2jGGoMl.js} +1 -1
- package/dist/web/assets/{usecaseDiagram-POWQR4AR-C2Vg20UK.js → usecaseDiagram-POWQR4AR-B9qoAQCy.js} +1 -1
- package/dist/web/assets/{vennDiagram-UO4OBE2U-C07v5OGI.js → vennDiagram-UO4OBE2U-DGVNOaKO.js} +1 -1
- package/dist/web/assets/{wardley-WFR3VGLG-C9Z7EZtz.js → wardley-WFR3VGLG-DbKqhNAh.js} +1 -1
- package/dist/web/assets/{wardleyDiagram-VNRHLVJA-DdA8CcSC.js → wardleyDiagram-VNRHLVJA-BgZ1gprw.js} +1 -1
- package/dist/web/assets/{xychartDiagram-PMCCYNJV-C9EZw07b.js → xychartDiagram-PMCCYNJV-D73RYid1.js} +1 -1
- package/dist/web/index.html +2 -2
- package/package.json +1 -1
- package/dist/chunk-CXUTYCZX.js +0 -238
- package/dist/web/assets/architecture-7GRP2DOG-DyxkwYiW.js +0 -1
- package/dist/web/assets/channel-BvDD7AMO.js +0 -1
- package/dist/web/assets/eventmodeling-NTZA5JFV-cLIzvgDp.js +0 -1
- package/dist/web/assets/flowDiagram-KWPJA3E3-D7Zq63VQ.js +0 -1
- package/dist/web/assets/railroad-abnf-HS5TGJTU-DBFym6g8.js +0 -1
- package/dist/web/assets/railroad-ebnf-LZEXJU2U-CkG28ig8.js +0 -1
- package/dist/web/assets/railroad-peg-WCYAUIDC-Df_Ifaad.js +0 -1
- 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
|
-
|
|
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-
|
|
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-
|
|
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-
|
|
77
|
+
//# sourceMappingURL=activity-BKW7G4I5.js.map
|
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
configureAgents,
|
|
4
4
|
listAgents,
|
|
5
5
|
removeAgents
|
|
6
|
-
} from "./chunk-
|
|
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-
|
|
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-
|
|
69
|
+
//# sourceMappingURL=agents-DFSNEOP5.js.map
|
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
printSummary,
|
|
5
5
|
runWithProgress,
|
|
6
6
|
summarize
|
|
7
|
-
} from "./chunk-
|
|
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-
|
|
20
|
-
import "./chunk-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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
|
-
|
|
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-
|
|
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-
|
|
4
|
+
} from "./chunk-RVTNSNGK.js";
|
|
5
5
|
import {
|
|
6
6
|
applySync,
|
|
7
7
|
needsIndexRefreshOnly
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-KHMBNT66.js";
|
|
9
9
|
import {
|
|
10
10
|
readExclude
|
|
11
|
-
} from "./chunk-
|
|
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-
|
|
169
|
+
//# sourceMappingURL=chunk-DZDI2HRT.js.map
|
|
@@ -6,7 +6,7 @@ import {
|
|
|
6
6
|
import {
|
|
7
7
|
loadScan,
|
|
8
8
|
manifestDependencyNames
|
|
9
|
-
} from "./chunk-
|
|
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-
|
|
343
|
+
//# sourceMappingURL=chunk-FVCDMQUQ.js.map
|
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
analyzeProject,
|
|
4
4
|
loadScanFromDir,
|
|
5
5
|
persistAnalysisCache
|
|
6
|
-
} from "./chunk-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
14
|
+
} from "./chunk-GGXPG6OE.js";
|
|
15
15
|
import {
|
|
16
16
|
analyzeProject
|
|
17
|
-
} from "./chunk-
|
|
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-
|
|
399
|
+
//# sourceMappingURL=chunk-KHMBNT66.js.map
|