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/README.md +100 -114
- package/adapters/AGENTS.md +1 -1
- package/adapters/GEMINI.md +1 -1
- package/adapters/copilot-instructions.md +1 -1
- package/adapters/cursor.fde.mdc +1 -1
- package/bin/check.js +15 -3
- package/bin/fde.js +998 -275
- package/bin/install.js +7 -1
- package/hooks/pre-compact +19 -0
- package/hooks/session-start +24 -3
- package/hooks/session-stop +23 -3
- package/package.json +1 -1
- package/skills/fde/SKILL.md +12 -11
- package/skills/fde/references/multi-customer-ops.md +8 -8
- package/skills/fde/references/red-team.md +3 -3
- package/README.md.bak +0 -227
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
|
|
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")
|
package/hooks/session-start
CHANGED
|
@@ -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)
|
|
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
|
-
#
|
|
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
|
-
#
|
|
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
|
package/hooks/session-stop
CHANGED
|
@@ -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)
|
|
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
|
-
#
|
|
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
|
-
#
|
|
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.
|
|
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",
|
package/skills/fde/SKILL.md
CHANGED
|
@@ -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`).
|
|
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
|
|
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.
|
|
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.
|
|
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
|
|
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
|
-
|
|
16
|
-
|
|
17
|
-
|
|
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
|
-
|
|
|
36
|
-
|
|
|
37
|
-
|
|
|
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:
|
|
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
|
|
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
|
|
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
|
|
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.
|
|
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
|
-
[](https://www.npmjs.com/package/fdeops)
|
|
4
|
-
[](https://github.com/suboss87/fdeops/actions)
|
|
5
|
-
[](LICENSE)
|
|
6
|
-
[](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
|