fdeops 3.9.5 → 3.9.8
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 +25 -62
- package/adapters/cursor.fde.mdc +3 -2
- package/bin/check.js +30 -7
- package/bin/fde.js +180 -900
- package/bin/install.js +6 -1
- package/bin/lib/memory.js +164 -0
- package/bin/lib/render.js +666 -0
- package/bin/lib/trust.js +188 -0
- package/hooks/session-start +1 -1
- package/package.json +1 -1
- package/skills/fde/SKILL.md +26 -14
- package/skills/fde/references/debrief.md +35 -20
package/README.md
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
[](LICENSE)
|
|
8
8
|
[](https://nodejs.org)
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
One `@fde` skill over a local client notebook (the **fieldbook** under `.fde/`) - one folder per client. The **system of record for embeds** - Forward Deployed Engineers and anyone living on a client site from first meeting to handoff. Feels like a second brain; behaves like a defensible record (dated, sourced, yours). Works the same for consultants, agency developers, solutions architects, and fractional CTOs.
|
|
11
11
|
|
|
12
12
|
```
|
|
13
13
|
land discover plan build ship close
|
|
@@ -17,25 +17,23 @@ CLI + one `@fde` skill + hooks over a local `.fde/` fieldbook - one folder per c
|
|
|
17
17
|
written as a side effect of the work
|
|
18
18
|
```
|
|
19
19
|
|
|
20
|
-
**
|
|
21
|
-
|
|
22
|
-
Describe your situation - `@fde` routes to the right method and writes the matching `.fde/` artifact. Phase methods (land → close) live in the skill; the CLI owns scan, memory, and receipts. You still confirm judgment - the fieldbook does not maintain itself without you.
|
|
20
|
+
**You talk in plain language with `@fde`.** The agent (and an optional CLI) handles the boring memory work. You still confirm anything that goes into the record.
|
|
23
21
|
|
|
24
22
|
---
|
|
25
23
|
|
|
26
24
|
## The week
|
|
27
25
|
|
|
28
|
-
|
|
26
|
+
Day to day you only need `@fde` and normal English. No command cheat sheet.
|
|
29
27
|
|
|
30
|
-
| When | What you
|
|
31
|
-
|
|
32
|
-
| **
|
|
33
|
-
| **After a meeting** | `
|
|
34
|
-
| **Before a
|
|
35
|
-
| **
|
|
36
|
-
| **
|
|
28
|
+
| When | What you say | What you get |
|
|
29
|
+
|------|--------------|--------------|
|
|
30
|
+
| **Start of week** | Open your AI coding agent (nothing to paste) | It already knows where you left off - trust, phase, what's next |
|
|
31
|
+
| **After a meeting** | `@fde` debrief these notes *(paste or attach them)* | Proposed updates to the record - you review, then confirm |
|
|
32
|
+
| **Before a stakeholder meeting** | `@fde` prep me for tomorrow's meeting with the sponsor | A short brief from what you already logged - not a blank chat |
|
|
33
|
+
| **Someone disputes scope** | `@fde` when did we agree to drop that feature? | Dated answers from the record (or a clear gap if nothing was logged) |
|
|
34
|
+
| **End of week** | `@fde` draft the sponsor update from the record | Status grounded in what actually happened |
|
|
37
35
|
|
|
38
|
-
Same
|
|
36
|
+
Same client folder every time (`~/fde-engagements/<client>/.fde/`). Your AI coding agent reads it on every session.
|
|
39
37
|
|
|
40
38
|
---
|
|
41
39
|
|
|
@@ -52,25 +50,25 @@ npx skills add suboss87/fdeops # Cursor, Codex, and skills-compatible a
|
|
|
52
50
|
/plugin install fdeops@fdeops
|
|
53
51
|
```
|
|
54
52
|
|
|
55
|
-
**2. Bind** -
|
|
53
|
+
**2. Bind once** - inside the client workspace (setup only; not a daily habit):
|
|
56
54
|
|
|
57
55
|
```bash
|
|
58
56
|
npx fdeops resume --init garvey # creates ~/fde-engagements/garvey engagement + binds workspace
|
|
59
57
|
```
|
|
60
58
|
|
|
61
|
-
**
|
|
59
|
+
**Check it worked:**
|
|
62
60
|
|
|
63
61
|
```bash
|
|
64
|
-
npx fdeops resume #
|
|
62
|
+
npx fdeops resume # prints a short "where we are" for this client
|
|
65
63
|
```
|
|
66
64
|
|
|
67
|
-
**3. Work**
|
|
65
|
+
**3. Work** - talk normally:
|
|
68
66
|
|
|
69
67
|
```text
|
|
70
68
|
@fde I just got the brief. New client, payments platform, they want it live before their Q3 audit.
|
|
71
69
|
```
|
|
72
70
|
|
|
73
|
-
`@fde` routes and
|
|
71
|
+
`@fde` routes and updates the fieldbook - you confirm judgment. Full workflow: [docs/USAGE.md](docs/USAGE.md).
|
|
74
72
|
|
|
75
73
|
<details>
|
|
76
74
|
<summary><strong>Other install paths</strong> · scan · env</summary>
|
|
@@ -88,14 +86,11 @@ npx fdeops resume # should print TRIAGE (trust, phase, next) for
|
|
|
88
86
|
|
|
89
87
|
## How it works
|
|
90
88
|
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
- **
|
|
94
|
-
- **Session end** - a hook captures what happened back into the fieldbook
|
|
95
|
-
- **`@fde`** - routes your situation to a field method; you confirm before memory sticks
|
|
96
|
-
- **CLI** - deterministic, offline (`scan`, `debrief`, `prep`, `receipts`, `status`)
|
|
89
|
+
- **You** describe the situation with `@fde` (or plain language once the skill is loaded)
|
|
90
|
+
- **Session start / end** - small hooks load where you left off and capture what changed (no re-paste)
|
|
91
|
+
- **Local CLI** - memory writes, search, and status with no model tokens; the agent runs it. You do not need to learn it for daily use ([docs/USAGE.md](docs/USAGE.md))
|
|
97
92
|
|
|
98
|
-
fdeops complements repo memory: CLAUDE.md holds how the *code* works; the fieldbook holds how the *engagement* works.
|
|
93
|
+
fdeops complements repo memory: CLAUDE.md holds how the *code* works; the fieldbook holds how the *client engagement* works.
|
|
99
94
|
|
|
100
95
|
Works with **Claude Code** · **Cursor** · **Copilot** · **Gemini CLI** · **Ollama** · **LM Studio** - any model that reads markdown.
|
|
101
96
|
|
|
@@ -119,7 +114,7 @@ Overlays for regulated domains (AI, fintech, healthcare, government) activate on
|
|
|
119
114
|
|
|
120
115
|
## Engagement memory (`.fde/`)
|
|
121
116
|
|
|
122
|
-
The **fieldbook** - one folder per client, plain markdown you can read, grep, and take with you:
|
|
117
|
+
The **fieldbook** is the system of record for the embed - one folder per client, plain markdown you can read, grep, and take with you:
|
|
123
118
|
|
|
124
119
|
| File | Holds |
|
|
125
120
|
|------|-------|
|
|
@@ -134,43 +129,11 @@ Every entry is dated and sourced, so you can defend it in front of skeptical sta
|
|
|
134
129
|
|
|
135
130
|
---
|
|
136
131
|
|
|
137
|
-
##
|
|
138
|
-
|
|
139
|
-
Commands that match **The week** (skill adds judgment on top):
|
|
140
|
-
|
|
141
|
-
```bash
|
|
142
|
-
fde resume # TRIAGE + load this workspace's engagement
|
|
143
|
-
fde resume --init <client> # create + bind + git-version .fde/
|
|
144
|
-
fde debrief --smart notes.md # propose routing → --apply to confirm
|
|
145
|
-
fde prep "Denise sync" # walk-in brief from existing memory
|
|
146
|
-
fde receipts <term> # dated search (gap ≠ proof of absence)
|
|
147
|
-
fde status # sponsor-ready triage (--all for portfolio)
|
|
148
|
-
fde scan # day-1 recon + ASK ON DAY 1 (works via npx)
|
|
149
|
-
```
|
|
150
|
-
|
|
151
|
-
<details>
|
|
152
|
-
<summary><strong>More commands</strong></summary>
|
|
153
|
-
|
|
154
|
-
```bash
|
|
155
|
-
fde triage # TRIAGE only (hooks / Cursor entry)
|
|
156
|
-
fde debrief notes.md # prefix router: decision: / risk: / delivery: / contact:
|
|
157
|
-
fde doctor # lint: stale signals, unset phase, gaps
|
|
158
|
-
fde log decision "…"
|
|
159
|
-
fde log contact "…" --signal amber
|
|
160
|
-
fde dashboard # FieldBook HTML (--all for every client)
|
|
161
|
-
```
|
|
162
|
-
|
|
163
|
-
Optional: `export FDEOPS_ENGAGEMENTS_ROOT=~/path/to/engagements` to isolate from `~/fde-engagements`.
|
|
164
|
-
|
|
165
|
-
Each `.fde/` is a local git repo (no remote, no telemetry) - dated entries carry an author tag; every write commits so receipts are tamper-evident. Worst-of `[signal:...]` per stakeholder drives trust; signals older than 21 days show as stale.
|
|
166
|
-
|
|
167
|
-
</details>
|
|
168
|
-
|
|
169
|
-
<p align="center"><img src="media/terminal-demo.svg" alt="fde CLI - status, scan, dashboard" width="720"/></p>
|
|
132
|
+
## Fieldbook UI
|
|
170
133
|
|
|
171
|
-
`
|
|
134
|
+
Open the system of record in a browser - trust, phase, next action, and the full record in one local page. Ask `@fde` for the dashboard, or run `npx fdeops dashboard` (current engagement by default; `--all` for the portfolio).
|
|
172
135
|
|
|
173
|
-
<p align="center"><img width="1336" height="624" alt="
|
|
136
|
+
<p align="center"><img width="1336" height="624" alt="fdeops Fieldbook in the browser" src="https://github.com/user-attachments/assets/5683614c-7730-4a3a-860d-185053a377eb" /></p>
|
|
174
137
|
|
|
175
138
|
---
|
|
176
139
|
|
|
@@ -182,7 +145,7 @@ Each `.fde/` is a local git repo (no remote, no telemetry) - dated entries carry
|
|
|
182
145
|
| **Consultant or contractor at a client site** | Remembers the engagement so you stop re-explaining it |
|
|
183
146
|
| **Solutions architect / engineer** | Methods for the politics as well as the architecture |
|
|
184
147
|
| **Agency developer running 3-5 clients** | One `.fde/` per client - details stop blurring |
|
|
185
|
-
| **Fractional CTO doing client work** | The fieldbook is your
|
|
148
|
+
| **Fractional CTO doing client work** | The fieldbook is your system of record for the embed - and your audit trail for billable work |
|
|
186
149
|
|
|
187
150
|
---
|
|
188
151
|
|
package/adapters/cursor.fde.mdc
CHANGED
|
@@ -9,10 +9,11 @@ You are the AI coding agent for a **Forward Deployed Engineer (FDE)** - the huma
|
|
|
9
9
|
|
|
10
10
|
## Entry
|
|
11
11
|
|
|
12
|
-
When the FDE types **`@fde`** or describes an engagement situation (new customer,
|
|
12
|
+
When the FDE types **`@fde`** or describes an engagement situation in plain language (new customer, meeting notes, prep for a stakeholder meeting, scope dispute, ready to ship), load the skill and route.
|
|
13
13
|
|
|
14
14
|
- Skill (single source of truth): `~/.claude/skills/fde/SKILL.md`
|
|
15
15
|
- **Never ask the FDE to pick a skill.** Read the situation, route silently, do the work.
|
|
16
|
+
- **Never ask the FDE to type `fde …` commands.** You run the local CLI; they confirm judgment in chat.
|
|
16
17
|
|
|
17
18
|
## Engagement memory
|
|
18
19
|
|
|
@@ -20,7 +21,7 @@ Read and write engagement files under the workspace's bound engagement: run `fde
|
|
|
20
21
|
|
|
21
22
|
**On every session entry (before other work):** run `fde triage` (fallback `node ~/.claude/fdeops/fde.js triage`, then `fde resume`). Lead with that TRIAGE block — trust, phase, open risks, next action, record owner/hash. Do not invent stakeholders or status.
|
|
22
23
|
|
|
23
|
-
|
|
24
|
+
You run the CLI for deterministic work - `fde scan | log | debrief | prep | doctor | receipts | status | dashboard` - instead of improvising shell or handing commands to the human.
|
|
24
25
|
|
|
25
26
|
### Meeting → memory loop
|
|
26
27
|
- Messy notes: `fde debrief --smart notes.md` → review `.debrief-propose` → `fde debrief --apply`
|
package/bin/check.js
CHANGED
|
@@ -214,8 +214,21 @@ if (/\$\(cat\s+"\$BOOTSTRAP"\)|cat\s+"\$BOOTSTRAP"|cat\s+[^\n]*SKILL\.md/.test(h
|
|
|
214
214
|
if (hookCode.includes('BOOTSTRAP=')) {
|
|
215
215
|
fail('session-start must not resolve BOOTSTRAP skill path for inject')
|
|
216
216
|
}
|
|
217
|
-
if (
|
|
218
|
-
fail('session-start must include a lean @fde pointer (not full skill)')
|
|
217
|
+
if (!/plain language with @fde|invoke @fde/.test(hook)) {
|
|
218
|
+
fail('session-start must include a lean @fde / plain-language pointer (not full skill)')
|
|
219
|
+
}
|
|
220
|
+
const skillBody = read('skills/fde/SKILL.md')
|
|
221
|
+
if (!skillBody.includes('Human surface vs agent plumbing')) {
|
|
222
|
+
fail('SKILL.md must define human NL surface vs agent CLI plumbing')
|
|
223
|
+
}
|
|
224
|
+
if (!/never tell the FDE to type|Never tell the FDE to type|never ask the human to type fde/i.test(skillBody)) {
|
|
225
|
+
fail('SKILL.md must forbid asking the human to type fde commands')
|
|
226
|
+
}
|
|
227
|
+
if (!skillBody.includes('fde prep')) {
|
|
228
|
+
fail('SKILL.md must route walk-in prep to fde prep')
|
|
229
|
+
}
|
|
230
|
+
if (!skillBody.includes('debrief --smart')) {
|
|
231
|
+
fail('SKILL.md must prefer fde debrief --smart for messy notes')
|
|
219
232
|
}
|
|
220
233
|
if (!/\btriage\b/.test(hook)) {
|
|
221
234
|
fail('session-start must still inject TRIAGE')
|
|
@@ -253,15 +266,25 @@ ok('hooks registry-aware')
|
|
|
253
266
|
if (!fs.existsSync(path.join(root, 'bin', 'fde.js'))) {
|
|
254
267
|
fail('bin/fde.js missing (the deterministic core)')
|
|
255
268
|
} else {
|
|
256
|
-
const
|
|
257
|
-
|
|
258
|
-
|
|
269
|
+
const cliFiles = [
|
|
270
|
+
'bin/fde.js',
|
|
271
|
+
...fs.readdirSync(path.join(root, 'bin', 'lib'))
|
|
272
|
+
.filter(name => name.endsWith('.js'))
|
|
273
|
+
.map(name => path.join('bin', 'lib', name)),
|
|
274
|
+
]
|
|
275
|
+
const cliSource = cliFiles.map(read).join('\n')
|
|
276
|
+
for (const sub of ['cmdScan', 'cmdResume', 'cmdLog', 'cmdDebrief', 'cmdReceipts', 'cmdCapture', 'cmdStatus', 'cmdDashboard']) {
|
|
277
|
+
if (!cliSource.includes(sub)) fail(`CLI sources missing ${sub}`)
|
|
259
278
|
}
|
|
260
279
|
if (!JSON.parse(read('package.json')).bin.fde) fail('package.json must expose the fde bin')
|
|
261
280
|
if (!read('bin/install.js').includes('fde.js')) fail('install.js must deploy fde.js')
|
|
281
|
+
if (!read('bin/install.js').includes('LIB_SRC')) fail('install.js must deploy bin/lib/')
|
|
262
282
|
if (!read('skills/fde/SKILL.md').includes('fde resume')) fail('SKILL.md must use the CLI for memory ops')
|
|
263
|
-
if (!
|
|
264
|
-
if (!
|
|
283
|
+
if (!cliSource.includes('[signal:')) fail('CLI sources must support structured [signal:x] trust tokens')
|
|
284
|
+
if (!cliSource.includes('ASK ON DAY 1')) fail('CLI sources must emit ASK ON DAY 1 questions')
|
|
285
|
+
for (const renderSymbol of ['buildFieldbookHtml', 'dashStyles', 'dashScript', 'FONT_FACE_CSS']) {
|
|
286
|
+
if (!cliSource.includes(renderSymbol)) fail(`CLI sources missing dashboard renderer symbol ${renderSymbol}`)
|
|
287
|
+
}
|
|
265
288
|
if (!read('bin/install.js').includes('FDE_SUBCOMMANDS')) fail('install.js must pass fde subcommands through (npx fdeops scan)')
|
|
266
289
|
ok('fde CLI present and wired')
|
|
267
290
|
}
|