fdeops 3.9.6 → 3.9.9

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
@@ -2,12 +2,12 @@
2
2
 
3
3
  **Your AI coding agent forgets your client every morning. fdeops remembers.**
4
4
 
5
- [![npm version](https://img.shields.io/npm/v/fdeops)](https://www.npmjs.com/package/fdeops)
5
+ [![npm version](https://img.shields.io/npm/v/fdeops.svg)](https://www.npmjs.com/package/fdeops)
6
6
  [![CI](https://github.com/suboss87/fdeops/actions/workflows/validate.yml/badge.svg)](https://github.com/suboss87/fdeops/actions)
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
- One `@fde` skill over a local client notebook (the **fieldbook** under `.fde/`) - 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
@@ -33,7 +33,7 @@ Day to day you only need `@fde` and normal English. No command cheat sheet.
33
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
34
  | **End of week** | `@fde` draft the sponsor update from the record | Status grounded in what actually happened |
35
35
 
36
- Same client folder every time (`~/fde-engagements/<client>/.fde/`). Your AI coding agent reads it on every session. Optional terminal tools live under [Under the hood](#under-the-hood-optional).
36
+ Same client folder every time (`~/fde-engagements/<client>/.fde/`). Your AI coding agent reads it on every session.
37
37
 
38
38
  ---
39
39
 
@@ -88,7 +88,7 @@ npx fdeops resume # prints a short "where we are" for this clien
88
88
 
89
89
  - **You** describe the situation with `@fde` (or plain language once the skill is loaded)
90
90
  - **Session start / end** - small hooks load where you left off and capture what changed (no re-paste)
91
- - **Under the hood** - a local CLI does memory writes, search, and status with no model tokens; you do not need to learn it for daily use
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))
92
92
 
93
93
  fdeops complements repo memory: CLAUDE.md holds how the *code* works; the fieldbook holds how the *client engagement* works.
94
94
 
@@ -114,7 +114,7 @@ Overlays for regulated domains (AI, fintech, healthcare, government) activate on
114
114
 
115
115
  ## Engagement memory (`.fde/`)
116
116
 
117
- 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:
118
118
 
119
119
  | File | Holds |
120
120
  |------|-------|
@@ -129,52 +129,11 @@ Every entry is dated and sourced, so you can defend it in front of skeptical sta
129
129
 
130
130
  ---
131
131
 
132
- ## Under the hood (optional)
132
+ ## Fieldbook UI
133
133
 
134
- **You do not need to learn these for daily work.** Chat with `@fde`; the agent runs the local tools. The list below is for setup, air-gap, or if you prefer the terminal.
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).
135
135
 
136
- **Humans only need (once / occasional):**
137
-
138
- ```bash
139
- npx fdeops resume --init <client> # one-time: create + bind this workspace
140
- npx fdeops resume # check "where we are"
141
- npx fdeops scan # try day-1 recon with no install
142
- npx fdeops dashboard # optional local HTML view of the fieldbook
143
- ```
144
-
145
- **What you say → what the agent runs** (you never have to type the right-hand side):
146
-
147
- | You say | Agent runs |
148
- |---------|------------|
149
- | Debrief these notes | `fde debrief --smart …` → you confirm → `--apply` |
150
- | Prep me for the sponsor meeting | `fde prep "…"` |
151
- | When did we agree to drop that? | `fde receipts …` |
152
- | Draft the sponsor update | `fde status` (+ judgment in chat) |
153
- | Log that the sponsor went quiet | `fde log contact "…" --signal amber` |
154
-
155
- <details>
156
- <summary><strong>Full command list</strong> (power users / scripts)</summary>
157
-
158
- ```bash
159
- fde triage # short status (also injected by session hooks)
160
- fde debrief notes.md # if notes already use decision: / risk: / … prefixes
161
- fde doctor # check the fieldbook for gaps
162
- fde log decision "…"
163
- fde log contact "…" --signal amber
164
- fde dashboard --all # every client, sorted by trust
165
- ```
166
-
167
- Optional: `export FDEOPS_ENGAGEMENTS_ROOT=~/path/to/engagements` to isolate from `~/fde-engagements`.
168
-
169
- Each `.fde/` is a local git repo (no remote, no telemetry). More detail: [docs/USAGE.md](docs/USAGE.md).
170
-
171
- </details>
172
-
173
- <p align="center"><img src="media/terminal-demo.svg" alt="fde CLI - status, scan, dashboard" width="720"/></p>
174
-
175
- Optional FieldBook view (`fde dashboard`) - current engagement by default:
176
-
177
- <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>
178
137
 
179
138
  ---
180
139
 
@@ -186,7 +145,7 @@ Optional FieldBook view (`fde dashboard`) - current engagement by default:
186
145
  | **Consultant or contractor at a client site** | Remembers the engagement so you stop re-explaining it |
187
146
  | **Solutions architect / engineer** | Methods for the politics as well as the architecture |
188
147
  | **Agency developer running 3-5 clients** | One `.fde/` per client - details stop blurring |
189
- | **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 |
190
149
 
191
150
  ---
192
151
 
package/bin/check.js CHANGED
@@ -266,15 +266,25 @@ ok('hooks registry-aware')
266
266
  if (!fs.existsSync(path.join(root, 'bin', 'fde.js'))) {
267
267
  fail('bin/fde.js missing (the deterministic core)')
268
268
  } else {
269
- const cli = read('bin/fde.js')
270
- for (const sub of ['cmdScan', 'cmdResume', 'cmdLog', 'cmdDebrief', 'cmdReceipts', 'cmdCapture', 'cmdStatus']) {
271
- 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}`)
272
278
  }
273
279
  if (!JSON.parse(read('package.json')).bin.fde) fail('package.json must expose the fde bin')
274
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/')
275
282
  if (!read('skills/fde/SKILL.md').includes('fde resume')) fail('SKILL.md must use the CLI for memory ops')
276
- if (!cli.includes('[signal:')) fail('fde.js must support structured [signal:x] trust tokens')
277
- 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
+ }
278
288
  if (!read('bin/install.js').includes('FDE_SUBCOMMANDS')) fail('install.js must pass fde subcommands through (npx fdeops scan)')
279
289
  ok('fde CLI present and wired')
280
290
  }