@zecalis/fael 0.20.0 → 0.22.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/README.md CHANGED
@@ -5,30 +5,48 @@
5
5
  [![CI](https://github.com/zecalis/fael/actions/workflows/ci.yml/badge.svg)](https://github.com/zecalis/fael/actions/workflows/ci.yml)
6
6
  [![license](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
7
7
 
8
- **The secretary for every agent on your team.** Every agent on your repo gets what git can't tell
9
- it — why a call was made, what was rejected, what's still open — next to the file it opens.
10
-
11
- One person runs five agents; a team runs fifty — and each of those hands work to sub-agents. Every
12
- one of them starts from zero: it finds the same flaky test, re-asks why that function looks weird,
13
- and repeats the mistake the last agent already fixed.
14
- Memory tools that try to help stuff a summary of everything into context before the agent has said
15
- what it's about to do — the one row that mattered gets averaged away, and a summary of stale notes
16
- is still stale.
17
-
18
- fael works the other way round: like a good secretary, it takes the notes nobody else will and hands
19
- each agent **only what matters for the file in front of it**. The agent writes down what it decided
20
- or found **in the same reply, at no extra turn**, and when it opens a file it gets **only what was
21
- written about that file**. The file it touches is the question.
22
-
23
- The team isn't only the people who write code. A PM, QA, EM or tech lead writes a requirement, a
24
- decision or an assignment once — through their own agent or the CLI — and every dev agent that
25
- touches that code later gets it, so the next feature doesn't forget what the last one agreed.
26
-
27
- fael gives the repo a memory that agents can't skip:
28
-
29
- - **Writing costs no extra turn.** The agent ends its reply with `fael decision|issue|note: …
30
- [files: …]` lines and fael files them — no turn is stopped or re-prompted. Want the old
31
- enforcement (no row, no end of turn)? Opt in with `[capture] block = true`.
8
+ **A shared work ledger for every agent on your repo.** Hand work from one session, agent or person to
9
+ the next — a decision, a requirement, an issue assigned to someone, a claim, where a plan stopped —
10
+ and it shows up where the next agent is working: on the file it opens, and at session start for what
11
+ is routed to it.
12
+
13
+ One person runs five agents; a team runs fifty — and each of those hands work to sub-agents. They
14
+ don't share a chat, so every one starts from zero: it finds the same flaky test, re-asks why that
15
+ function looks weird, picks up the issue another agent is already on, and repeats the mistake the
16
+ last agent already fixed. Tools that stuff a summary of everything into context before the agent has
17
+ said what it's about to do average the one row that mattered away, and a summary of stale notes is
18
+ still stale.
19
+
20
+ fael works the other way round. The agent writes down what it decided or found **in the same
21
+ message as its next tool call, at no extra turn**, and when it opens a file it gets **only what was
22
+ written about that file**. The file it touches is the question. Work routed to an agent or a person
23
+ lists in full at their session start.
24
+
25
+ What moves through it:
26
+
27
+ - **Hand-offs.** `fael add note "pricing page: copy approved, layout half-done" --files
28
+ src/pricing.tsx --key pricing:page` — the next session or agent gets it when it opens that file or
29
+ its prompt names the key.
30
+ - **Assignments.** `fael add issue "…" --to ploy` — lists in full at the session start of whoever's
31
+ git `user.name` is `ploy` (lowercased). `--to opencode` (or `codex`, `claude`) reaches every
32
+ session of that agent in the repo — Claude hands a review to OpenCode, and what it answers comes
33
+ back as the close line (`fael find --all`). The receipt prints the line to paste to the other
34
+ agent and, for an agent, the command that starts it on the row (`opencode run "…"`) — fael
35
+ prints it, you or your agent runs it, in the worktree you chose. fael never wakes an agent:
36
+ it reads the row when it next starts or touches the file.
37
+ - **Claims.** `fael claim <id>` — `fael find --kind issue` then shows `(held @<branch>)`, so another
38
+ agent picks something else. Never a lock.
39
+ - **Requirements and decisions.** A PM, QA, EM or tech lead writes one once — through their own
40
+ agent or the CLI — and every dev agent that touches that code later gets it, so the next feature
41
+ doesn't forget what the last one agreed.
42
+ - **Come-backs.** `--revisit <date|text>` brings a row back when it is due.
43
+
44
+ How it behaves:
45
+
46
+ - **Writing costs no extra turn.** The agent runs `fael add` in the same message as its next tool
47
+ call. When a turn ends with no tool call left, it can close its reply with `fael
48
+ decision|issue|note: … [files: …]` lines and fael files them — no turn is stopped or
49
+ re-prompted.
32
50
  - **Memory finds them.** When an agent reads a file, the decisions and open bugs about *that file*
33
51
  come attached — nobody has to remember to search. Sub-agents too: one starts with an empty
34
52
  context and only a short brief, and the file it opens brings the memory the brief left out.
@@ -47,7 +65,7 @@ fael gives the repo a memory that agents can't skip:
47
65
  shared at once by every worktree, so PRs never carry log lines to conflict on. `fael sync` carries
48
66
  them to teammates through your own remote (`refs/fael/*`). No server, no account.
49
67
 
50
- Works with **Claude Code, Codex and OpenCode**, and any MCP host. One small binary; hooks run in 2–3 ms.
68
+ Works with **Claude Code, Codex and OpenCode**, and any MCP host. One small binary; a hook call takes about 10 ms on a repo with a thousand rows (a session start, once, about 100 ms).
51
69
 
52
70
  ## What you get
53
71
 
@@ -56,11 +74,32 @@ Works with **Claude Code, Codex and OpenCode**, and any MCP host. One small bina
56
74
  | Each session starts from zero | Session opens with what the last one left: open bugs, recent decisions |
57
75
  | "Why is it like this?" — ask again, guess again | The reason sits next to the file, from the agent that made the call |
58
76
  | Agent notices a bug mid-task, then forgets it | It's filed on the spot, and shown to whoever touches that file next |
59
- | Two agents in parallel worktrees hit the same problem | The first files it; the second gets it when it opens the file — the same hour, before any commit |
77
+ | Two agents in parallel worktrees hit the same problem | The first files it; the second gets it when it opens the file — the same hour, before any commit (`fael stats` → `across agents` counts how often) |
60
78
  | A sub-agent finds something and its summary drops it | Its `fael issue: …` line is filed when it stops (Claude Code), and the parent gets it on that file |
79
+ | Work is handed over in chat and lost between sessions | A hand-off note, an assigned issue or a claim sits in the ledger — the assignee sees it at session start |
80
+ | Two agents pick the same issue | `fael claim <id>`: the second sees `(held @<branch>)` and picks another |
61
81
  | Knowledge stays in one person's chat history | It's in the clone — teammates and their agents get it on `fael sync` |
62
82
  | A PM's requirement lives in a ticket the agent never opens | `fael add decision … --files src/pay.rs` — it's in front of the agent the moment it opens the file |
63
83
 
84
+ ## Does it help? Check your own numbers
85
+
86
+ fael does not claim to save tokens, turns or time: it cannot see what an agent would have done
87
+ without it. It reports what it handed over, so you can judge on your own repo:
88
+
89
+ ```bash
90
+ fael stats
91
+ ```
92
+
93
+ - `hit N/M rows` per event — rows still in front of the agent when it edited that file. A lower
94
+ bound: a read-only session scores every row a miss.
95
+ - `across agents` — rows one agent wrote that another was handed, and how many were written while
96
+ the receiver was working. If you run agents in parallel worktrees, watch this one.
97
+ - `retired at touch`, `issues closed`, `handoffs picked up` — rows closed or picked up.
98
+
99
+ Most useful when several agents (or people) work in one repo and return to the same files over
100
+ days. Little to gain from one short session in a repo you will not touch again.
101
+ Definitions: [docs/stats.md](docs/stats.md).
102
+
64
103
  ## Install
65
104
 
66
105
  **1. Get the binary** — prebuilt for macOS, Linux and Windows. No Rust needed.
@@ -105,7 +144,7 @@ Rather review memory in PRs? `store = "tracked"` in `.fael/config.toml` also wri
105
144
  ## How it works
106
145
 
107
146
  ```
108
- agent reads src/pay.rs → fael attaches: "[bug] refund rounds down on JPY → src/pay.rs"
147
+ agent reads src/pay.rs → fael attaches: "[bug] refund rounds down on JPY"
109
148
  agent fixes it, replies → "…done. fael decision: refunds round half-up, per finance [files: src/pay.rs]"
110
149
  fael → files that line as a row — no extra turn, nothing blocked
111
150
  fael sync → the next agent, on any machine, sees it when it opens src/pay.rs
@@ -19,7 +19,7 @@
19
19
  "hasInstallScript": true,
20
20
  "license": "MIT",
21
21
  "name": "@zecalis/fael",
22
- "version": "0.20.0"
22
+ "version": "0.22.0"
23
23
  },
24
24
  "node_modules/detect-libc": {
25
25
  "engines": {
@@ -48,5 +48,5 @@
48
48
  }
49
49
  },
50
50
  "requires": true,
51
- "version": "0.20.0"
51
+ "version": "0.22.0"
52
52
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "artifactDownloadUrls": [
3
- "https://github.com/zecalis/fael/releases/download/v0.20.0"
3
+ "https://github.com/zecalis/fael/releases/download/v0.22.0"
4
4
  ],
5
5
  "bin": {
6
6
  "fael": "run-fael.js"
@@ -81,7 +81,7 @@
81
81
  "zipExt": ".tar.xz"
82
82
  }
83
83
  },
84
- "version": "0.20.0",
84
+ "version": "0.22.0",
85
85
  "volta": {
86
86
  "node": "18.14.1",
87
87
  "npm": "9.5.0"