fdeops 3.5.6 → 3.7.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/bin/install.js CHANGED
@@ -199,7 +199,7 @@ function cmdInstall() {
199
199
  console.log(' node bin/install.js init <engagement-name>')
200
200
  console.log('')
201
201
  console.log(' Example:')
202
- console.log(' node bin/install.js init acme-payments')
202
+ console.log(' node bin/install.js init garvey-payments')
203
203
  console.log(' (npm 3.0.0+: npx fdeops@latest init <engagement-name>)')
204
204
  console.log('')
205
205
  console.log(' Use another AI tool (Cursor, Codex, Gemini CLI, Copilot)? Wire it up:')
@@ -210,11 +210,17 @@ function cmdInstall() {
210
210
  console.log('')
211
211
  }
212
212
 
213
+ // `npx fdeops scan` must recon, not install - any fde subcommand passes straight
214
+ // through to the CLI (fde.js reads process.argv itself, so require() is enough).
215
+ const FDE_SUBCOMMANDS = ['scan', 'resume', 'log', 'debrief', 'receipts', 'capture', 'status', 'dashboard']
216
+
213
217
  const arg = process.argv[2]
214
218
  if (arg === 'init') {
215
219
  cmdInit(process.argv[3])
216
220
  } else if (arg === 'adapters') {
217
221
  cmdAdapters(process.argv[3])
222
+ } else if (FDE_SUBCOMMANDS.includes(arg)) {
223
+ require(path.join(__dirname, 'fde.js'))
218
224
  } else {
219
225
  cmdInstall()
220
226
  }
package/hooks/pre-compact CHANGED
@@ -11,8 +11,27 @@ resolve_engagement_dir() {
11
11
  return 1
12
12
  }
13
13
 
14
+ # Workspace registry written by `fde resume --init` - mirrors resolveEngagement()
15
+ # step 2 in bin/fde.js; keep the resolution order identical in bash and JS.
16
+ # Lines are "<workspace-path> <slug>": the path may contain spaces, the slug
17
+ # never does, so split on the LAST space (same as the JS lastIndexOf parse).
18
+ registry_engagement_dir() {
19
+ local reg="$HOME/fde-engagements/.registry" slug
20
+ [ -f "$reg" ] || return 1
21
+ slug=$(awk 'BEGIN{ws=ENVIRON["PWD"]}
22
+ { i = match($0, / [^ ]*$/)
23
+ if (i > 0 && substr($0, 1, i - 1) == ws) { print substr($0, i + 1); exit } }' "$reg" 2>/dev/null)
24
+ [ -z "$slug" ] && return 1
25
+ [ -d "$HOME/fde-engagements/$slug/.fde" ] && printf '%s\n' "$HOME/fde-engagements/$slug/.fde" && return 0
26
+ return 1
27
+ }
28
+
14
29
  ENG_DIR=$(resolve_engagement_dir "${FDEOPS_ENGAGEMENT:-${FDEOS_ENGAGEMENT:-}}")
15
30
 
31
+ if [ -z "$ENG_DIR" ]; then
32
+ ENG_DIR=$(registry_engagement_dir)
33
+ fi
34
+
16
35
  if [ -z "$ENG_DIR" ] && [ -f "CLAUDE.md" ]; then
17
36
  ENG=$(grep -m1 '^FDEOPS_ENGAGEMENT=\|^FDEOS_ENGAGEMENT=' CLAUDE.md 2>/dev/null | cut -d= -f2-)
18
37
  ENG_DIR=$(resolve_engagement_dir "$ENG")
@@ -23,27 +23,48 @@ resolve_engagement_dir() {
23
23
  return 1
24
24
  }
25
25
 
26
+ # Workspace registry written by `fde resume --init` - mirrors resolveEngagement()
27
+ # step 2 in bin/fde.js; keep the resolution order identical in bash and JS.
28
+ # Lines are "<workspace-path> <slug>": the path may contain spaces, the slug
29
+ # never does, so split on the LAST space (same as the JS lastIndexOf parse).
30
+ registry_engagement_dir() {
31
+ local reg="$HOME/fde-engagements/.registry" slug
32
+ [ -f "$reg" ] || return 1
33
+ slug=$(awk 'BEGIN{ws=ENVIRON["PWD"]}
34
+ { i = match($0, / [^ ]*$/)
35
+ if (i > 0 && substr($0, 1, i - 1) == ws) { print substr($0, i + 1); exit } }' "$reg" 2>/dev/null)
36
+ [ -z "$slug" ] && return 1
37
+ [ -d "$HOME/fde-engagements/$slug/.fde" ] && printf '%s\n' "$HOME/fde-engagements/$slug/.fde" && return 0
38
+ return 1
39
+ }
40
+
26
41
  # 1) Environment variable (any agent)
27
42
  if [ -z "$CONTEXT_FILE" ]; then
28
43
  ENG_DIR=$(resolve_engagement_dir "${FDEOPS_ENGAGEMENT:-${FDEOS_ENGAGEMENT:-}}")
29
44
  [ -n "$ENG_DIR" ] && CONTEXT_FILE="$ENG_DIR/context.md"
30
45
  fi
31
46
 
32
- # 2) Project CLAUDE.md
47
+ # 2) Workspace registry binding (written by fde resume --init)
48
+ if [ -z "$CONTEXT_FILE" ]; then
49
+ ENG_DIR=$(registry_engagement_dir)
50
+ [ -n "$ENG_DIR" ] && CONTEXT_FILE="$ENG_DIR/context.md"
51
+ fi
52
+
53
+ # 3) Project CLAUDE.md
33
54
  if [ -z "$CONTEXT_FILE" ] && [ -f "CLAUDE.md" ]; then
34
55
  ENG=$(grep -m1 '^FDEOPS_ENGAGEMENT=\|^FDEOS_ENGAGEMENT=' CLAUDE.md 2>/dev/null | cut -d= -f2-)
35
56
  ENG_DIR=$(resolve_engagement_dir "$ENG")
36
57
  [ -n "$ENG_DIR" ] && CONTEXT_FILE="$ENG_DIR/context.md"
37
58
  fi
38
59
 
39
- # 3) Global fdeops pointer file
60
+ # 4) Global fdeops pointer file
40
61
  if [ -z "$CONTEXT_FILE" ] && [ -f "$HOME/.claude/FDEOPS-CLAUDE.md" ]; then
41
62
  ENG=$(grep -m1 '^FDEOPS_ENGAGEMENT=\|^FDEOS_ENGAGEMENT=' "$HOME/.claude/FDEOPS-CLAUDE.md" 2>/dev/null | cut -d= -f2-)
42
63
  ENG_DIR=$(resolve_engagement_dir "$ENG")
43
64
  [ -n "$ENG_DIR" ] && CONTEXT_FILE="$ENG_DIR/context.md"
44
65
  fi
45
66
 
46
- # 4) Optional in-repo .fde (customer-approved only)
67
+ # 5) Optional in-repo .fde (customer-approved only)
47
68
  if [ -z "$CONTEXT_FILE" ] && [ -f ".fde/context.md" ]; then
48
69
  CONTEXT_FILE=".fde/context.md"
49
70
  fi
@@ -19,24 +19,44 @@ resolve_engagement_dir() {
19
19
  return 1
20
20
  }
21
21
 
22
+ # Workspace registry written by `fde resume --init` - mirrors resolveEngagement()
23
+ # step 2 in bin/fde.js; keep the resolution order identical in bash and JS.
24
+ # Lines are "<workspace-path> <slug>": the path may contain spaces, the slug
25
+ # never does, so split on the LAST space (same as the JS lastIndexOf parse).
26
+ registry_engagement_dir() {
27
+ local reg="$HOME/fde-engagements/.registry" slug
28
+ [ -f "$reg" ] || return 1
29
+ slug=$(awk 'BEGIN{ws=ENVIRON["PWD"]}
30
+ { i = match($0, / [^ ]*$/)
31
+ if (i > 0 && substr($0, 1, i - 1) == ws) { print substr($0, i + 1); exit } }' "$reg" 2>/dev/null)
32
+ [ -z "$slug" ] && return 1
33
+ [ -d "$HOME/fde-engagements/$slug/.fde" ] && printf '%s\n' "$HOME/fde-engagements/$slug/.fde" && return 0
34
+ return 1
35
+ }
36
+
22
37
  ENG_DIR=""
23
38
 
24
39
  # 1) Environment variable (any agent)
25
40
  ENG_DIR=$(resolve_engagement_dir "${FDEOPS_ENGAGEMENT:-${FDEOS_ENGAGEMENT:-}}")
26
41
 
27
- # 2) Project CLAUDE.md
42
+ # 2) Workspace registry binding (written by fde resume --init)
43
+ if [ -z "$ENG_DIR" ]; then
44
+ ENG_DIR=$(registry_engagement_dir)
45
+ fi
46
+
47
+ # 3) Project CLAUDE.md
28
48
  if [ -z "$ENG_DIR" ] && [ -f "CLAUDE.md" ]; then
29
49
  ENG=$(grep -m1 '^FDEOPS_ENGAGEMENT=\|^FDEOS_ENGAGEMENT=' CLAUDE.md 2>/dev/null | cut -d= -f2-)
30
50
  ENG_DIR=$(resolve_engagement_dir "$ENG")
31
51
  fi
32
52
 
33
- # 3) Global fdeops pointer file
53
+ # 4) Global fdeops pointer file
34
54
  if [ -z "$ENG_DIR" ] && [ -f "$HOME/.claude/FDEOPS-CLAUDE.md" ]; then
35
55
  ENG=$(grep -m1 '^FDEOPS_ENGAGEMENT=\|^FDEOS_ENGAGEMENT=' "$HOME/.claude/FDEOPS-CLAUDE.md" 2>/dev/null | cut -d= -f2-)
36
56
  ENG_DIR=$(resolve_engagement_dir "$ENG")
37
57
  fi
38
58
 
39
- # 4) Optional in-repo .fde (customer-approved only)
59
+ # 5) Optional in-repo .fde (customer-approved only)
40
60
  if [ -z "$ENG_DIR" ] && [ -d ".fde" ]; then
41
61
  ENG_DIR=".fde"
42
62
  fi
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fdeops",
3
- "version": "3.5.6",
3
+ "version": "3.7.0",
4
4
  "description": "Field kit for engineers embedded in client work - a real CLI (recon, memory, portfolio), one @fde skill with field judgment on top, and hooks that make it automatic. Claude Code plugin and any agent that loads skills.",
5
5
  "bin": {
6
6
  "fdeops": "bin/install.js",
@@ -26,7 +26,7 @@ This is what makes fdeops a second brain instead of a chat window.
26
26
  2. **Deliverable = memory.** The output of every phase IS a `.fde/` file. You never ask the FDE to "update their notes" - producing the work and writing the memory are one action. The phase reference tells you which file.
27
27
  3. **Evidence rule.** Every claim in an artifact carries its source: `(validated with: ops lead, Day 5)`, `(churn: 47 commits/90d)`, `(stated, unverified)`. The FDE defends these files in front of skeptical clients - traceable beats plausible.
28
28
  4. **No invented facts - ever.** People, names, quotes, meetings, and numbers exist only if the FDE said them or the repo shows them. Never invent a stakeholder, a conversation, or a source to make the narrative richer - one fabricated name poisons every real citation around it. A missing fact is written as `unknown - ask: <the question>`, nothing else.
29
- 5. **On exit:** before the session ends, append three lines to `context.md`: where we are, what changed today, the next step. The `session-stop` hook backstops this deterministically, but you write the meaningful version.
29
+ 5. **On exit:** before the session ends, append three lines to `context.md`: where we are, what changed today, the next step. The `session-stop` hook backstops this deterministically (hooks resolve the engagement through the workspace registry - no env var needed), but you write the meaningful version.
30
30
  6. **One customer, one folder.** Never merge two engagements into one `.fde/`. Confirm which engagement applies when multiple exist.
31
31
 
32
32
  ## Data boundary (confirm before touching their code)
@@ -37,19 +37,22 @@ This is what makes fdeops a second brain instead of a chat window.
37
37
  - Data tagged `<private>` in `trust-profile.md` (sacred data, PHI, cardholder, classified) **never enters your context or any subagent prompt** - work around it, never with it.
38
38
  - Locked-down engagement (no AI on their code)? Use the CLI + the fieldbook only. The memory layer is the FDE's own notes, not customer code.
39
39
 
40
- **Engagement path - zero ceremony.** Run `fde resume` (fallback: `node ~/.claude/fdeops/fde.js resume`). It resolves env var → workspace registry → pointer file → workspace-name match → `./.fde`, and prints a **bounded** view of `context.md` - the curated head (state, next action) plus the most recent activity, with the older session log collapsed (use `fde resume --full` when you genuinely need the whole history). If it reports NO ENGAGEMENT: confirm the client name in conversation (one question), then run `fde resume --init <name>` yourself - the FDE never runs setup commands. Never install fdeops on infrastructure the FDE does not control.
40
+ **Engagement path - zero ceremony.** Run `fde resume` (fallback: `node ~/.claude/fdeops/fde.js resume`). The **workspace registry** (written once by `fde resume --init <name>`) is the normal path; resolution order is env var override → registry → pointer file → workspace-name match → `./.fde`. It prints a **bounded** view of `context.md` - the curated head (state, next action) plus the most recent activity, with the older session log collapsed (use `fde resume --full` when you genuinely need the whole history). If it reports NO ENGAGEMENT: confirm the client name in conversation (one question), then run `fde resume --init <name>` yourself - the one setup step; the FDE never runs setup commands. Never install fdeops on infrastructure the FDE does not control.
41
41
 
42
42
  **The `fde` CLI does the deterministic work - use it instead of improvising shell:**
43
43
 
44
44
  | Mechanics | Command |
45
45
  |-----------|---------|
46
46
  | Load/create engagement memory | `fde resume` (bounded) / `fde resume --full` / `fde resume --init <name>` |
47
- | Day-1 repo recon (facts) | `fde scan` - then YOU interpret against the brief |
48
- | Structured memory appends | `fde log decision\|risk\|delivery\|contact "<text>"` |
47
+ | Day-1 repo recon (facts + ASK ON DAY 1) | `fde scan` - then YOU interpret against the brief |
48
+ | Structured memory appends | `fde log decision\|risk\|delivery\|contact "<text>"` - on `contact`, add `--signal green\|amber\|red` to write a `[signal:…]` token |
49
+ | Meeting notes → memory | `fde debrief <file>` (or stdin) - `decision:`/`risk:`/`delivery:`/`contact:` prefixed lines route to their `.fde` file with dates; the rest lands as a dated block in `context.md` |
49
50
  | "What did we agree?" with dates | `fde receipts <term>` |
50
- | Portfolio across customers | `fde status` - heuristic triage; verify before acting |
51
+ | Portfolio across customers | `fde status` - trust from the latest dated `[signal:…]` token (stale after 21 days; keyword heuristic only as fallback); verify before acting |
51
52
  | Visual portfolio (one local page) | `fde dashboard` - renders `.fde/` → `fieldbook.html`, deterministic, 0 tokens |
52
53
 
54
+ **The debrief verb.** When the FDE shares meeting notes or a transcript, or says "debrief": structure the notes into lines prefixed `decision:` / `risk:` / `delivery:` / `contact:` (append `[signal:green|amber|red]` to a `contact:` line when the notes carry trust information), leave everything else unprefixed, **show the structured version to the FDE for confirmation**, then pipe it to `fde debrief`. Routing and dating are deterministic and cost zero tokens - your judgment is the structuring. Signal-reading guidance: `references/debrief.md`.
55
+
53
56
  CLI missing → use the manual fallback commands inside each reference.
54
57
 
55
58
  **Token model - where the cost goes.** Deterministic work is the CLI's job and costs **zero model tokens**: memory writes, recon, receipts, status, dashboard, and the bounded `fde resume`. Spend tokens only on judgment - reading the situation, routing, running the phase method, writing the artifact. Three rules keep a full day of FDE work cheap: load the router first and pull **one** reference only when you route to it; never dump a whole `.fde/` file into context - read the bounded resume, or `fde receipts <term>` for a targeted slice; don't re-read files you already have. The expensive model should fire for real decisions, not for plumbing the CLI already does.
@@ -60,7 +63,7 @@ After loading `context.md` via `fde resume`, run a quick integrity scan and open
60
63
 
61
64
  **Always open with a 2-3 line state summary:**
62
65
 
63
- > "Last session you shipped the payment retry slice. Plan is 3/5 tasks done. Diana saw the demo Tuesday - signal is green. One thing worth noting: [finding, or 'nothing flagged - where do you want to pick up?']"
66
+ > "Last session you shipped the payment retry slice. Plan is 3/5 tasks done. Denise saw the demo Tuesday - signal is green. One thing worth noting: [finding, or 'nothing flagged - where do you want to pick up?']"
64
67
 
65
68
  **What to scan (in order, surface only what matters):**
66
69
 
@@ -124,7 +127,7 @@ The FDE can nod (zero friction) or correct ("billing-service too"). This replace
124
127
  - The concern is minor and won't change the next 3 moves
125
128
  - You already have the answer in the artifacts - act on it, don't re-confirm
126
129
 
127
- **The principle:** Your goal is to elevate, not interrogate. Add clarity where it prevents mistakes. Stay out of the way everywhere else. A 20-year FDE peer doesn't ask "are you sure?" - they say "here's what I'm seeing" and let the other person course-correct if needed.
130
+ **The principle:** Your goal is to elevate, not interrogate. Add clarity where it prevents mistakes. Stay out of the way everywhere else.
128
131
 
129
132
  **Never:** fire multiple questions at once, probe where the answer doesn't change the work, repeat what's already in the artifacts, or slow down a confident FDE to prove you're being thorough. One well-placed observation beats five careful questions.
130
133
 
@@ -144,14 +147,12 @@ After updating `.fde/` artifacts, suggest the ONE next move that accelerates the
144
147
 
145
148
  **The format:** One line, directed, based on engagement state. Not a menu.
146
149
 
147
- > "Updated. Terrain is mapped - ready to plan the slices, or does Diana need to see this first?"
150
+ > "Updated. Terrain is mapped - ready to plan the slices, or does Denise need to see this first?"
148
151
 
149
152
  > "Shipped and logged. Task 4 touches the billing module where that open risk sits. Worth addressing that before starting?"
150
153
 
151
154
  > "Brief written. You don't have repo access yet - want me to draft the request or are you handling that?"
152
155
 
153
- The suggestion should feel like a colleague who sees the board and says "hey, this would be faster if..." - not a system prompting for the next input.
154
-
155
156
  ## Routing - 6 domains, 35 skills
156
157
 
157
158
  Route on what you hear, then **read the skill reference from this skill's `references/` directory and follow its method**. Do not improvise from memory - the method is the product.
@@ -224,7 +225,7 @@ Running the engagement and ending it well.
224
225
  |----------|-------|-----------|
225
226
  | Weekly update due, "need to send the sponsor something" | status | `references/status.md` |
226
227
  | Demo coming up, show-and-tell, exec walkthrough | demo-prep | `references/demo-prep.md` |
227
- | Just out of a meeting, raw notes, "they said…" | debrief | `references/debrief.md` |
228
+ | Just out of a meeting, raw notes, "they said…", "debrief" | debrief | the debrief verb (above) + `references/debrief.md` |
228
229
  | Sponsor's boss needs a summary, board update, justify continued investment | exec-narrative | `references/exec-narrative.md` |
229
230
  | Status across all my customers | dashboard | `references/dashboard.md` |
230
231
  | Juggling 2+ customers, losing track, context-switching | multi-customer-ops | `references/multi-customer-ops.md` |
@@ -12,9 +12,9 @@ The solo FDE running three customers simultaneously is the norm, not the excepti
12
12
 
13
13
  ```
14
14
  ~/fde-engagements/
15
- acme-corp/.fde/ Acme's engagement memory
16
- globex/.fde/ Globex's engagement memory
17
- initech/.fde/ Initech's engagement memory
15
+ garvey-payments/.fde/ Garvey's engagement memory
16
+ kesterman-freight/.fde/ Kesterman's engagement memory
17
+ rennick-health/.fde/ Rennick's engagement memory
18
18
  ```
19
19
 
20
20
  **Never:**
@@ -32,11 +32,11 @@ Cross-contamination is the fastest way to lose two engagements at once.
32
32
 
33
33
  | Customer | Trust signal | Top risk | Today's action | Time budget |
34
34
  |----------|-------------|----------|---------------|-------------|
35
- | Acme | green | Migration deadline Fri | Finish data mapping, send status | 4h |
36
- | Globex | AMBER | Sponsor went quiet Tue | Proactive conversation TODAY | 2h |
37
- | Initech | green | None active | Build slice 3, push PR | 2h |
35
+ | Garvey | green | Canary blocked on their security ticket | Chase ticket, prep ship checklist | 4h |
36
+ | Kesterman | AMBER | Sponsor went quiet Tue | Proactive conversation TODAY | 2h |
37
+ | Rennick | green | None active | Build slice 3, push PR | 2h |
38
38
 
39
- Priority order: Globex (amber trust), Acme (deadline), Initech (steady)
39
+ Priority order: Kesterman (amber trust), Garvey (deadline), Rennick (steady)
40
40
  ```
41
41
 
42
42
  **3. The triage rules.** In order of priority:
@@ -60,7 +60,7 @@ BEFORE STARTING CUSTOMER B:
60
60
  1. Run: fde resume (loads Customer B's engagement)
61
61
  2. Read context.md - where did we leave off?
62
62
  3. Confirm: what's the one thing to accomplish in this block?
63
- 4. Set a time boundary (e.g., "2 hours on Globex, then back to Acme")
63
+ 4. Set a time boundary (e.g., "2 hours on Kesterman, then back to Garvey")
64
64
  ```
65
65
 
66
66
  The 3-line context update is the bridge. Without it, the next session starts with "what was I doing?" - that's 20 minutes of re-discovery each time.
@@ -34,7 +34,7 @@ You are not a helpful peer right now. You are the skeptical senior who has seen
34
34
  | **Second-order** | If this succeeds, what new problem does it create? Who notices? |
35
35
 
36
36
  **4. Deliver the hits.** Three rules:
37
- - **Specific, not generic.** Not "have you considered stakeholder alignment?" but "Robert Tanaka hasn't signed off on the compliance scope change and he reports to Diana's boss - what happens when he raises it in the Thursday meeting?"
37
+ - **Specific, not generic.** Not "have you considered stakeholder alignment?" but "Robert Tanaka hasn't signed off on the compliance scope change and he reports to Denise's boss - what happens when he raises it in the Thursday meeting?"
38
38
  - **Grounded in their data.** Use names, dates, and facts from the `.fde/` files. If `risks.md` says something is CRITICAL and `delivery.md` shows no mitigation logged, say so.
39
39
  - **One at a time.** Deliver a challenge. Wait for the response. Then the next. A barrage overwhelms; a sequence sharpens.
40
40
 
@@ -57,13 +57,13 @@ EXPOSED - no answer, no plan, this will hurt them in the room
57
57
  The red-team adapts to what's being tested:
58
58
 
59
59
  ### Pre-meeting red-team
60
- The FDE is about to walk into a sponsor meeting, accumulation conversation, or exec presentation. Attack their talking points, their data, their ask. "If Diana says 'why should I keep paying for this when nothing shipped last week,' what are your first three words?"
60
+ The FDE is about to walk into a sponsor meeting, accumulation conversation, or exec presentation. Attack their talking points, their data, their ask. "If Denise says 'why should I keep paying for this when nothing shipped last week,' what are your first three words?"
61
61
 
62
62
  ### Pre-ship red-team
63
63
  About to deploy, hand off, or mark complete. Attack the readiness. "It's 2am, the batch job fails, you're on a flight. Who fixes it? Show me the runbook they'll actually open. What's the first command?"
64
64
 
65
65
  ### Position red-team
66
- The FDE has decided something (scope response, technical approach, staffing plan). Attack the decision. "You're saying no to the reporting module. Diana asked for it personally. What happens to trust when you say no? What's your alternative offer?"
66
+ The FDE has decided something (scope response, technical approach, staffing plan). Attack the decision. "You're saying no to the reporting module. Denise asked for it personally. What happens to trust when you say no? What's your alternative offer?"
67
67
 
68
68
  ### Brief red-team
69
69
  Day 1 or early discovery. Attack the brief itself. "This brief says 'migrate COBOL to Java.' That's a solution, not a problem. What's the actual problem? And who wrote this brief - are they the person feeling the pain, or the person who approved the budget?"
package/README.md.bak DELETED
@@ -1,227 +0,0 @@
1
- # fdeops
2
-
3
- [![npm version](https://img.shields.io/npm/v/fdeops)](https://www.npmjs.com/package/fdeops)
4
- [![CI](https://github.com/suboss87/fdeops/actions/workflows/validate.yml/badge.svg)](https://github.com/suboss87/fdeops/actions)
5
- [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)
6
- [![Node](https://img.shields.io/badge/node-%3E%3D18-brightgreen)](https://nodejs.org)
7
-
8
- You embed at a client site. You bridge strategy and code. You ship on their systems, not yours.
9
-
10
- Every morning you open your AI coding agent, and it has no idea what happened yesterday. You re-paste the same context. You explain the stakeholders again. You remind it about the scope change from Tuesday. Meanwhile, the real problem - the one the brief didn't mention - sits undiscovered because nobody asked the right questions on day one.
11
-
12
- **fdeops fixes this.** It gives your AI agent a complete engagement methodology and a private memory that writes itself. You type `@fde`, describe your situation, and the right method runs - from first stakeholder meeting to final handoff. Tomorrow's session starts exactly where today ended.
13
-
14
- ```mermaid
15
- flowchart LR
16
- A["@fde"] --> B{"Describe\nyour situation"}
17
- B --> C["Embed & Trust"]
18
- B --> D["Discover & Diagnose"]
19
- B --> E["Plan & Align"]
20
- B --> F["Build & Guard"]
21
- B --> G["Ship & Verify"]
22
- B --> H["Operate & Close"]
23
- C --> I[".fde/ memory\n(written as you work)"]
24
- D --> I
25
- E --> I
26
- F --> I
27
- G --> I
28
- H --> I
29
- I --> J["Next session\nloads automatically"]
30
- ```
31
-
32
- Works with **Claude Code** · **Cursor** · **Copilot** · **Devin** · **Gemini CLI** · **Ollama** · **LM Studio** · any model that reads SKILL.md
33
-
34
- <p align="center"><strong>The CLI</strong></p>
35
- <p align="center"><img src="media/terminal-demo.svg" alt="fde CLI - status, scan, dashboard" width="720"/></p>
36
-
37
- <p align="center"><strong>The Fieldbook Dashboard</strong></p>
38
- <p align="center"><img src="media/fieldbook-dashboard.png" alt="FDE Fieldbook - portfolio view" width="720"/></p>
39
-
40
- ---
41
-
42
- ## Who this is for
43
-
44
- | You are... | fdeops helps when... |
45
- |----------|-------------------|
46
- | **Consultant or contractor at a client site** | Every session, you re-explain context. fdeops remembers for you. |
47
- | **Solutions architect bridging strategy and code** | You navigate politics AND architecture. fdeops has methods for both. |
48
- | **Agency engineer running 3-5 clients** | Client details blur together. One `.fde/` per customer, never cross-contaminated. |
49
- | **Forward Deployed Engineer** | The role this was built for. 35 skills across the full engagement lifecycle. |
50
- | **Technical founder doing client work solo** | You ARE the team. The agent becomes your second brain. |
51
- | **Enterprise programme lead** | Leading AI transformations? Built-in methods for model selection, agent safety, governance, and cost management. |
52
-
53
- ---
54
-
55
- ## Without fdeops vs with fdeops
56
-
57
- | | **Without fdeops** | **With fdeops** |
58
- |---|-------------------|----------------|
59
- | **Monday morning** | Re-paste last week's context, explain the stakeholders again | Agent opens with "last session you were on the ingest retry - CTO demo is Friday" |
60
- | **Scope creep** | Five "small" additions absorbed silently, timeline slips | Receipts timestamped - you walk into the sponsor meeting with evidence |
61
- | **Multiple customers** | Wrong client name in a status update, details blur | One folder per customer, context-switch protocol, cross-contamination checklist |
62
- | **The sponsor meeting** | "We completed the API endpoint" | "Manual reconciliation dropped from 3 FTEs to 0.5 - here's the rollback if it turns" |
63
-
64
- ---
65
-
66
- ## Quickstart
67
-
68
- **Requires:** [Node.js](https://nodejs.org) >= 18
69
-
70
- ### 1. Create your first engagement
71
-
72
- ```bash
73
- npx fdeops init my-client # creates engagement memory
74
- ```
75
-
76
- This creates `~/fde-engagements/my-client/.fde/` with 12 memory files - your private engagement brain.
77
-
78
- ### 2. Try the CLI (no AI needed)
79
-
80
- ```bash
81
- cd ~/fde-engagements/my-client
82
- fde scan # instant repo recon (run from any git repo)
83
- fde log decision "Chose React over Vue for the dashboard"
84
- fde log risk "No staging environment for integration tests"
85
- fde receipts "React" # find what you logged, with dates
86
- fde status # portfolio view across all clients
87
- fde dashboard # offline HTML fieldbook - open in browser
88
- ```
89
-
90
- These commands work without any AI model. Zero network. Zero tokens.
91
-
92
- ### 3. Connect your AI agent
93
-
94
- ```bash
95
- export FDEOPS_ENGAGEMENT=~/fde-engagements/my-client/.fde
96
- ```
97
-
98
- Then in Claude Code, Cursor, Copilot, Gemini, or any agent:
99
-
100
- ```
101
- @fde I'm on site. First stakeholder meeting tomorrow. Brief says fix the payments API.
102
- ```
103
-
104
- The agent loads your engagement memory, routes to the right skill, and starts working with you - not from scratch. The memory compounds. You maintain nothing.
105
-
106
- > **Other install methods:** `npx skills add suboss87/fdeops` or `git clone && node bin/install.js`
107
-
108
- ---
109
-
110
- ## Works with any AI coding tool
111
-
112
- One skill file powers every tool. Install adapters for your setup:
113
-
114
- ```bash
115
- npx fdeops adapters ~/fde-engagements/my-client
116
- ```
117
-
118
- | Tool | What it reads |
119
- |------|--------------|
120
- | Claude Code | Plugin + `~/.claude/FDEOPS-CLAUDE.md` |
121
- | Codex / OpenAI / generic | `AGENTS.md` |
122
- | Gemini CLI | `GEMINI.md` |
123
- | Cursor | `.cursor/rules/fde.mdc` |
124
- | GitHub Copilot | `.github/copilot-instructions.md` |
125
- | **Local LLMs** (Ollama, LM Studio, llama.cpp, vLLM) | Load `SKILL.md` as system prompt |
126
-
127
- Each adapter points at the same `@fde` skill, so the methodology and memory stay consistent across tools. Details: [`adapters/`](adapters/README.md).
128
-
129
- > **No cloud dependency.** fdeops calls no external API. The AI skill is a markdown file your model reads. The CLI is local Node.js. Works fully offline, fully air-gapped, fully private. See [`adapters/LOCAL-LLM.md`](adapters/LOCAL-LLM.md) for local model setup.
130
-
131
- ---
132
-
133
- ## How it works
134
-
135
- ```text
136
- YOU (human) AI CODING AGENT (software)
137
- meetings, judgment @fde routes -> right skill -> drafts the artifact
138
- | -----> .fde/ memory (written as you work)
139
- | |
140
- +---------------> client workspace (code, VPN, tickets)
141
- ```
142
-
143
- 1. **Describe** - tell the agent what's happening ("new client", "production is down", "need a board update")
144
- 2. **Route** - the system picks the right skill from 34 options across 6 domains
145
- 3. **Execute** - the skill's method runs, artifacts are written to `.fde/`, you review at checkpoints
146
-
147
- ---
148
-
149
- ## The 6 domains - 35 skills + 5 overlays
150
-
151
- | Domain | Skills | What it covers |
152
- |--------|--------|---------------|
153
- | **Embed & Trust** | land, audit, stakeholder-radar, trust-engineering, scope-defense | First days: access, credibility, scope |
154
- | **Discover & Diagnose** | discover, assumption-audit, use-case-scoring, sketch | Finding the real problem behind the brief |
155
- | **Plan & Align** | plan, business-case, options-analysis, initiative-triage | Sequencing work, getting sponsor alignment |
156
- | **Build & Guard** | build, incremental-build, test-on-legacy, blast-radius, debug, rescue, security-audit, observability | Helping you build safely on their codebase |
157
- | **Ship & Verify** | ship, review, rollback-drill, qa-live | Getting to production without surprises |
158
- | **Operate & Close** | status, demo-prep, debrief, exec-narrative, dashboard, multi-customer-ops, close, handoff-engineering, pattern-extract, red-team | Running and ending the engagement well |
159
-
160
- **Overlays** activate automatically when your engagement involves AI projects, executive reporting, fintech, healthcare, or government compliance.
161
-
162
- Full skill details: [docs/skills-reference.md](docs/skills-reference.md)
163
-
164
- ---
165
-
166
- ## Engagement memory (`.fde/`)
167
-
168
- Your **fieldbook** - one per client, private to you, plain markdown:
169
-
170
- | File | Role | Written by |
171
- |------|------|-----------|
172
- | `context.md` | Where you are; loaded first every session | every phase + session-stop hook |
173
- | `brief.md` | What they said - hypothesis until discover | land |
174
- | `success.md` | Done, measured, signed-off by whom | land |
175
- | `reality.md` | The real problem, with evidence | discover / audit |
176
- | `terrain.md` | Codebase map: hotspots, test gaps, AI components, data estate | discover / audit |
177
- | `stakeholders.md` | Champions, resistance, trust signals | land, updated continuously |
178
- | `trust-profile.md` | Sacred data, AI policy, approval chain | land + overlays |
179
- | `decisions.md` | Plan + choices + integration contracts + sizing | plan / build / review / rescue |
180
- | `risks.md` | Live risk register | all phases |
181
- | `delivery.md` | What shipped, business value, rollback, pulse, adoption metrics | build / ship |
182
-
183
- Every claim is tagged with its source and date so you can defend it in front of skeptical stakeholders.
184
-
185
- ---
186
-
187
- ## The CLI
188
-
189
- These commands run locally on your machine. No AI needed, no API costs, works offline.
190
-
191
- ```bash
192
- fde scan # day-1 recon: hotspots, test gaps, "temporary" code, AI components, secrets
193
- fde resume # initialize or resume an engagement
194
- fde log # write decisions, risks, delivery, contacts
195
- fde receipts # search memory with dates
196
- fde capture # session-end snapshot
197
- fde status # portfolio triage across all customers
198
- fde dashboard # render every engagement into one offline dashboard
199
- ```
200
-
201
- ---
202
-
203
- ## Principles
204
-
205
- - **The artifact is the memory** - producing work and recording it are one action
206
- - **Trust before production** - earn the right to touch their systems
207
- - **Brief is a hypothesis** - discover before building the wrong thing
208
- - **Evidence on every claim** - these files get defended in front of skeptical clients
209
- - **Map before moving** - unknown terrain gets characterisation tests
210
- - **Thin slices** - ship learning, not theatre
211
- - **One customer, one folder** - context never bleeds
212
-
213
- ---
214
-
215
- ## Updating
216
-
217
- ```bash
218
- cd fdeops && git pull && node bin/install.js
219
- ```
220
-
221
- ---
222
-
223
- ## Contributing
224
-
225
- Maintained by **[Subash Natarajan](https://www.linkedin.com/in/subashn/)**. Feedback via [Issues](https://github.com/suboss87/fdeops/issues) - see [CONTRIBUTING.md](CONTRIBUTING.md).
226
-
227
- [FDE Methodology](FDE-METHODOLOGY.md) · [ATTRIBUTION.md](ATTRIBUTION.md) · [SECURITY.md](SECURITY.md) · [PRIVACY.md](PRIVACY.md) · [Repo layout](docs/REPO_LAYOUT.md) · [Skills reference](docs/skills-reference.md) · MIT