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 CHANGED
@@ -7,7 +7,7 @@
7
7
  [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)
8
8
  [![Node](https://img.shields.io/badge/node-%3E%3D18-brightgreen)](https://nodejs.org)
9
9
 
10
- CLI + one `@fde` skill + hooks over a local `.fde/` fieldbook - one folder per client. The **second brain for Forward Deployed Engineers** - engineers embedded at a client, from first meeting to final handoff. Works the same for consultants, agency developers, solutions architects, and fractional CTOs.
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
- **Glossary:** **fieldbook** = the `.fde/` folder · **TRIAGE** = trust + phase + next from memory · **receipts** = dated search of what you logged · **hooks** = auto load/capture at session start/end.
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
- What you actually run most days - the habit that compounds the fieldbook:
26
+ Day to day you only need `@fde` and normal English. No command cheat sheet.
29
27
 
30
- | When | What you do | Why it matters |
31
- |------|-------------|----------------|
32
- | **Monday** | Open your AI coding agent → TRIAGE loads (trust, phase, next) | Start where last week left off - no re-paste |
33
- | **After a meeting** | `fde debrief --smart notes.txt` review `--apply` | Messy notes become dated decisions, risks, contacts |
34
- | **Before a walk-in** | `fde prep "Denise sync"` | Walk in with memory, not a blank chat |
35
- | **Scope fight** | `fde receipts descope` (+ memory git hash) | Answer "when did we agree?" from the record |
36
- | **Friday** | `fde status` sponsor update from the real record | Status from evidence, not memory theater |
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 engagement folder every time (`~/fde-engagements/<client>/.fde/`). Git versions it. Your AI coding agent reads it on every session.
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** - once, inside the client workspace:
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
- **Verify:**
59
+ **Check it worked:**
62
60
 
63
61
  ```bash
64
- npx fdeops resume # should print TRIAGE (trust, phase, next) for garvey
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 writes `.fde/` artifacts - you confirm judgment. Use `npx fdeops …` until you want a short command: `npm i -g fdeops` (optional). Full workflow: [docs/USAGE.md](docs/USAGE.md).
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
- Three pieces on top of the fieldbook:
92
-
93
- - **Session start** - a hook loads where you left off into your AI coding agent's context
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
- ## The CLI
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
- `fde dashboard` (FieldBook) renders the **current** engagement by default. Pass `--all` for every client sorted by trust:
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="fde dashboard FieldBook" src="https://github.com/user-attachments/assets/5683614c-7730-4a3a-860d-185053a377eb" /></p>
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 second brain - and your audit trail for billable work |
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
 
@@ -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, mid-project takeover, production fire, quiet stakeholder, ready to ship), load the skill and route.
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
- Use the CLI for deterministic work - `fde scan | log | debrief | prep | doctor | receipts | status | dashboard` - instead of improvising shell.
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 (!hook.includes('invoke @fde')) {
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 cli = read('bin/fde.js')
257
- for (const sub of ['cmdScan', 'cmdResume', 'cmdLog', 'cmdDebrief', 'cmdReceipts', 'cmdCapture', 'cmdStatus']) {
258
- if (!cli.includes(sub)) fail(`fde.js missing ${sub}`)
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 (!cli.includes('[signal:')) fail('fde.js must support structured [signal:x] trust tokens')
264
- if (!cli.includes('ASK ON DAY 1')) fail('fde.js scan must emit ASK ON DAY 1 questions')
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
  }