fdeops 3.16.0 → 3.20.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 +82 -84
- package/adapters/AGENTS.md +1 -1
- package/adapters/GEMINI.md +1 -1
- package/adapters/LOCAL-LLM.md +5 -5
- package/adapters/README.md +2 -2
- package/adapters/copilot-instructions.md +1 -1
- package/adapters/cursor.fde.mdc +1 -1
- package/bin/check.js +42 -11
- package/bin/fde.js +157 -20
- package/bin/lib/render.js +2 -2
- package/bin/lib/trust.js +42 -5
- package/mcp/fdeops-ingest/package.json +1 -1
- package/package.json +1 -1
- package/plugin.json +1 -1
- package/skills/fde/SKILL.md +43 -42
- package/skills/fde/references/ai.md +2 -2
- package/skills/fde/references/audit.md +2 -2
- package/skills/fde/references/board-memo.md +1 -1
- package/skills/fde/references/business-case.md +1 -1
- package/skills/fde/references/close.md +1 -1
- package/skills/fde/references/connect.md +1 -1
- package/skills/fde/references/dashboard.md +2 -2
- package/skills/fde/references/debrief.md +1 -1
- package/skills/fde/references/demo-prep.md +1 -1
- package/skills/fde/references/discover.md +34 -15
- package/skills/fde/references/earn-trust.md +1 -1
- package/skills/fde/references/encode-pattern.md +3 -3
- package/skills/fde/references/eval-pack.md +2 -2
- package/skills/fde/references/hold-scope.md +1 -1
- package/skills/fde/references/ingest.md +1 -1
- package/skills/fde/references/land.md +1 -1
- package/skills/fde/references/pick-three.md +1 -1
- package/skills/fde/references/plan.md +10 -7
- package/skills/fde/references/poc.md +4 -2
- package/skills/fde/references/readout.md +1 -1
- package/skills/fde/references/red-team.md +1 -1
- package/skills/fde/references/rescue.md +3 -2
- package/skills/fde/references/review.md +1 -1
- package/skills/fde/references/rollback.md +1 -1
- package/skills/fde/references/runbook.md +1 -1
- package/skills/fde/references/score-use-cases.md +1 -1
- package/skills/fde/references/ship.md +124 -17
- package/skills/fde/references/switch-clients.md +1 -1
- package/skills/fde/references/test-assumptions.md +2 -2
- package/skills/fde/references/three-options.md +1 -1
- package/skills/fde/references/what-breaks.md +1 -1
- package/skills/fde/references/who-decides.md +1 -1
- package/templates/.fde/assumptions.md +1 -1
- package/templates/.fde/reality.md +6 -1
- package/templates/.fde/terrain.md +1 -1
- package/skills/fde/references/thin-slices.md +0 -100
package/README.md
CHANGED
|
@@ -2,43 +2,38 @@
|
|
|
2
2
|
|
|
3
3
|
**Forward deployed engineering skills for AI coding agents.**
|
|
4
4
|
|
|
5
|
-
Skills encode the workflows, quality gates, and judgment Forward Deployed Engineers use on someone else's site. Packaged so an AI coding agent can run the embed end-to-end: discovery, POC,
|
|
5
|
+
Skills encode the workflows, quality gates, and judgment Forward Deployed Engineers use on someone else's site. Packaged so an AI coding agent can run the embed end-to-end: discovery, POC, their codebase (greenfield or brownfield), go-live, eval, signed outcome. The workspace still compiles and commits. `@fde` does not leave.
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
LAND DISCOVER PLAN SHIP PROVE CLOSE
|
|
9
|
-
┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐
|
|
10
|
-
│ Brief │ ───▶ │ Reality│ ───▶ │ Sequence│───▶ │ Live │ ───▶ │ Signed │ ───▶ │ They │
|
|
11
|
-
│ Trust │ │ Terrain│ │ Align │ │ slice │ │ off │ │ run │
|
|
12
|
-
└────────┘ └────────┘ └────────┘ └────────┘ └────────┘ └────────┘
|
|
13
|
-
/brief /discover /plan /ship /outcome /close
|
|
14
|
-
```
|
|
7
|
+
<img width="1774" height="887" alt="FDEops-githubposter" src="https://github.com/user-attachments/assets/9eb842d2-a356-4995-9057-841f1b2d15d6" />
|
|
15
8
|
|
|
16
9
|
---
|
|
17
10
|
|
|
18
11
|
## Commands
|
|
19
12
|
|
|
20
|
-
|
|
13
|
+
One command per stage. Skills load automatically.
|
|
21
14
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
|
25
|
-
|
|
26
|
-
|
|
|
27
|
-
|
|
|
28
|
-
|
|
|
29
|
-
|
|
|
15
|
+
Six commands map to the embed. Each one loads `@fde`, which opens the skill for that moment: a thin brief pulls land, a wrong brief pulls discover, a Friday number pulls readout. Sprint or programme. Greenfield or brownfield. Any industry. You never pick from 30 names.
|
|
16
|
+
|
|
17
|
+
| Work | Command | Stage | Principle |
|
|
18
|
+
|------|---------|-------|-----------|
|
|
19
|
+
| Engage | `/brief` | Land | Name who signs done |
|
|
20
|
+
| Diagnose | `/discover` | Discover | Treat the brief as a hypothesis |
|
|
21
|
+
| Align | `/plan` | Plan | Work backwards from done |
|
|
22
|
+
| Deliver | `/ship` | Ship | One visible change, then go live |
|
|
23
|
+
| Realize | `/outcome` | Outcome | Promised, measured, accepted |
|
|
24
|
+
| Transfer | `/close` | Close | They operate it without you |
|
|
30
25
|
|
|
31
26
|
Also:
|
|
32
27
|
|
|
33
|
-
|
|
|
34
|
-
|
|
35
|
-
|
|
|
36
|
-
|
|
|
37
|
-
|
|
|
38
|
-
|
|
|
39
|
-
|
|
|
28
|
+
| Work | Command | Principle |
|
|
29
|
+
|------|---------|-----------|
|
|
30
|
+
| Diagnose trust | `/trust` | Process gap, or they stopped trusting you |
|
|
31
|
+
| Find the receipt | `/receipts` | A dated line, or it did not happen |
|
|
32
|
+
| Capture the meeting | `/debrief` | Notes into the record |
|
|
33
|
+
| Prepare the meeting | `/prep` | One page from the record |
|
|
34
|
+
| Report the outcome | `/readout` | Promised, measured, accepted |
|
|
40
35
|
|
|
41
|
-
Skills also activate on English: naming a client, running a POC,
|
|
36
|
+
Skills also activate on English: naming a client, running a POC, changing their checkout, going live, asking what was agreed. A throwaway one-liner in an unbound repo can skip `@fde`. Bound client work cannot.
|
|
42
37
|
|
|
43
38
|
---
|
|
44
39
|
|
|
@@ -100,70 +95,71 @@ Requires Node.js >= 18. Override: `FDEOPS_ENGAGEMENT`. See [docs/install.md](doc
|
|
|
100
95
|
|
|
101
96
|
---
|
|
102
97
|
|
|
103
|
-
## All
|
|
98
|
+
## All 30 Skills
|
|
99
|
+
|
|
100
|
+
The catalog. 30 skills spanning the embed. Not prompts - structured workflows with steps, an artifact, and a checkpoint. Type English or a slash command. `@fde` activates the right skill. You never pick one by name.
|
|
104
101
|
|
|
105
|
-
|
|
102
|
+
Full detail: [docs/skills-reference.md](docs/skills-reference.md).
|
|
106
103
|
|
|
107
|
-
### Land -
|
|
104
|
+
### Land - Engage
|
|
108
105
|
|
|
109
|
-
| Skill | What
|
|
106
|
+
| Skill | What it does | Use when |
|
|
110
107
|
|--------|--------------|----------|
|
|
111
|
-
| [land](skills/fde/references/land.md) | Interrogate the brief
|
|
112
|
-
| [audit](skills/fde/references/audit.md) | Verify claims
|
|
113
|
-
| [who-decides](skills/fde/references/who-decides.md) |
|
|
114
|
-
| [earn-trust](skills/fde/references/earn-trust.md) |
|
|
115
|
-
| [hold-scope](skills/fde/references/hold-scope.md) |
|
|
108
|
+
| [land](skills/fde/references/land.md) | Interrogate the brief | New client, first meeting, just got the brief |
|
|
109
|
+
| [audit](skills/fde/references/audit.md) | Verify inherited claims | Taking over, previous consultant left |
|
|
110
|
+
| [who-decides](skills/fde/references/who-decides.md) | Map decision rights | Need to know who matters |
|
|
111
|
+
| [earn-trust](skills/fde/references/earn-trust.md) | Earn access | Need access or credibility |
|
|
112
|
+
| [hold-scope](skills/fde/references/hold-scope.md) | Hold scope | "Also can you…", timeline unchanged |
|
|
116
113
|
|
|
117
|
-
### Discover -
|
|
114
|
+
### Discover - Diagnose
|
|
118
115
|
|
|
119
|
-
| Skill | What
|
|
116
|
+
| Skill | What it does | Use when |
|
|
120
117
|
|--------|--------------|----------|
|
|
121
|
-
| [discover](skills/fde/references/discover.md) |
|
|
122
|
-
| [test-assumptions](skills/fde/references/test-assumptions.md) |
|
|
123
|
-
| [score-use-cases](skills/fde/references/score-use-cases.md) |
|
|
124
|
-
| [poc](skills/fde/references/poc.md) |
|
|
118
|
+
| [discover](skills/fde/references/discover.md) | Frame the problem | Brief feels wrong, shadow processes |
|
|
119
|
+
| [test-assumptions](skills/fde/references/test-assumptions.md) | Test assumptions | Brief feels too neat |
|
|
120
|
+
| [score-use-cases](skills/fde/references/score-use-cases.md) | Score use cases | Everything is P0 |
|
|
121
|
+
| [poc](skills/fde/references/poc.md) | Validate the solution | POC, spike, need to de-risk |
|
|
125
122
|
|
|
126
|
-
### Plan -
|
|
123
|
+
### Plan - Align
|
|
127
124
|
|
|
128
|
-
| Skill | What
|
|
125
|
+
| Skill | What it does | Use when |
|
|
129
126
|
|--------|--------------|----------|
|
|
130
|
-
| [plan](skills/fde/references/plan.md) |
|
|
131
|
-
| [business-case](skills/fde/references/business-case.md) |
|
|
132
|
-
| [three-options](skills/fde/references/three-options.md) |
|
|
133
|
-
| [pick-three](skills/fde/references/pick-three.md) |
|
|
127
|
+
| [plan](skills/fde/references/plan.md) | Sequence the work | What order, what is done |
|
|
128
|
+
| [business-case](skills/fde/references/business-case.md) | Build the business case | Defend budget or timeline |
|
|
129
|
+
| [three-options](skills/fde/references/three-options.md) | Generate options | "What should we do?" |
|
|
130
|
+
| [pick-three](skills/fde/references/pick-three.md) | Prioritize three | Everything is urgent |
|
|
134
131
|
|
|
135
|
-
### Ship -
|
|
132
|
+
### Ship - Deliver
|
|
136
133
|
|
|
137
|
-
| Skill | What
|
|
134
|
+
| Skill | What it does | Use when |
|
|
138
135
|
|--------|--------------|----------|
|
|
139
|
-
| [
|
|
140
|
-
| [what-breaks](skills/fde/references/what-breaks.md) |
|
|
141
|
-
| [rescue](skills/fde/references/rescue.md) |
|
|
142
|
-
| [
|
|
143
|
-
| [
|
|
144
|
-
| [rollback](skills/fde/references/rollback.md) | Test the escape route before 2am | "We can always revert" |
|
|
136
|
+
| [ship](skills/fde/references/ship.md) | Deliver the increment | Building, updating, or going live |
|
|
137
|
+
| [what-breaks](skills/fde/references/what-breaks.md) | Assess impact | Touching shared infrastructure |
|
|
138
|
+
| [rescue](skills/fde/references/rescue.md) | Resolve the incident | Down, or they went quiet |
|
|
139
|
+
| [review](skills/fde/references/review.md) | Review the change | Before merge, scope creep |
|
|
140
|
+
| [rollback](skills/fde/references/rollback.md) | Rehearse rollback | "We can always revert" |
|
|
145
141
|
|
|
146
|
-
###
|
|
142
|
+
### Outcome - Realize
|
|
147
143
|
|
|
148
|
-
| Skill | What
|
|
144
|
+
| Skill | What it does | Use when |
|
|
149
145
|
|--------|--------------|----------|
|
|
150
|
-
| [readout](skills/fde/references/readout.md) |
|
|
151
|
-
| [demo-prep](skills/fde/references/demo-prep.md) |
|
|
152
|
-
| [debrief](skills/fde/references/debrief.md) |
|
|
153
|
-
| [board-memo](skills/fde/references/board-memo.md) |
|
|
154
|
-
| [dashboard](skills/fde/references/dashboard.md) |
|
|
155
|
-
| [ingest](skills/fde/references/ingest.md) |
|
|
156
|
-
| [connect](skills/fde/references/connect.md) |
|
|
146
|
+
| [readout](skills/fde/references/readout.md) | Report the outcome | Friday, sponsor update |
|
|
147
|
+
| [demo-prep](skills/fde/references/demo-prep.md) | Prepare the demo | Demo or exec walkthrough |
|
|
148
|
+
| [debrief](skills/fde/references/debrief.md) | Capture the meeting | Just left a meeting |
|
|
149
|
+
| [board-memo](skills/fde/references/board-memo.md) | Brief the board | Justify continued investment |
|
|
150
|
+
| [dashboard](skills/fde/references/dashboard.md) | View the portfolio | All my customers |
|
|
151
|
+
| [ingest](skills/fde/references/ingest.md) | Ingest sources | Transcript, Notion, Slack |
|
|
152
|
+
| [connect](skills/fde/references/connect.md) | Connect a source | Connect Granola |
|
|
157
153
|
|
|
158
|
-
### Close -
|
|
154
|
+
### Close - Transfer
|
|
159
155
|
|
|
160
|
-
| Skill | What
|
|
156
|
+
| Skill | What it does | Use when |
|
|
161
157
|
|--------|--------------|----------|
|
|
162
|
-
| [close](skills/fde/references/close.md) |
|
|
163
|
-
| [runbook](skills/fde/references/runbook.md) |
|
|
164
|
-
| [switch-clients](skills/fde/references/switch-clients.md) | Switch
|
|
165
|
-
| [encode-pattern](skills/fde/references/encode-pattern.md) |
|
|
166
|
-
| [red-team](skills/fde/references/red-team.md) |
|
|
158
|
+
| [close](skills/fde/references/close.md) | Transfer operations | Wrapping up |
|
|
159
|
+
| [runbook](skills/fde/references/runbook.md) | Write the runbook | They must operate without you |
|
|
160
|
+
| [switch-clients](skills/fde/references/switch-clients.md) | Switch engagements | 2+ clients |
|
|
161
|
+
| [encode-pattern](skills/fde/references/encode-pattern.md) | Encode the pattern | It will apply again |
|
|
162
|
+
| [red-team](skills/fde/references/red-team.md) | Challenge the plan | "Poke holes in this" |
|
|
167
163
|
|
|
168
164
|
Overlays (on signal, not on request): [ai](skills/fde/references/ai.md) · [artifacts](skills/fde/references/artifacts.md) · [fintech](skills/fde/references/fintech.md) · [healthcare](skills/fde/references/healthcare.md) · [gov](skills/fde/references/gov.md) · [eval-pack](skills/fde/references/eval-pack.md)
|
|
169
165
|
|
|
@@ -182,7 +178,7 @@ One skill. One reference file per situation. One folder per client.
|
|
|
182
178
|
skills/fde/SKILL.md hosts load this one file
|
|
183
179
|
│ routes. you never pick a skill by name
|
|
184
180
|
▼
|
|
185
|
-
references/land.md one
|
|
181
|
+
references/land.md one skill, then stop
|
|
186
182
|
│
|
|
187
183
|
▼
|
|
188
184
|
fde CLI (local) dates, gates, redacts. no network
|
|
@@ -191,11 +187,13 @@ One skill. One reference file per situation. One folder per client.
|
|
|
191
187
|
~/fde-engagements/<client>/.fde/
|
|
192
188
|
```
|
|
193
189
|
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
190
|
+
**One skill routes.** Hosts load `@fde`. It reads the situation and opens one `references/*.md`. Slash commands and English both land here. You never pick a skill by name.
|
|
191
|
+
|
|
192
|
+
**Evidence, not memory.** Promised → measured → accepted. A dated line in `.fde/`, or it did not happen. Nothing is done on vibes.
|
|
193
|
+
|
|
194
|
+
**Confirm before write.** Local CLI: git and files, no network. `.fde/` on your laptop. The AI coding agent runs the command. You confirm. Then it is on the record.
|
|
195
|
+
|
|
196
|
+
**Progressive disclosure.** `SKILL.md` is the entry. One skill file loads when routed. Writes and status cost zero model tokens.
|
|
199
197
|
|
|
200
198
|
Change hosts, install `@fde` on the new one, bind if needed, keep talking. The record is not inside any vendor.
|
|
201
199
|
|
|
@@ -207,7 +205,7 @@ Change hosts, install `@fde` on the new one, bind if needed, keep talking. The r
|
|
|
207
205
|
fdeops/
|
|
208
206
|
├── skills/fde/ # the one skill hosts load
|
|
209
207
|
│ ├── SKILL.md # router
|
|
210
|
-
│ └── references/ #
|
|
208
|
+
│ └── references/ # 30 skills + overlays (you never pick)
|
|
211
209
|
│ ├── land.md # Land
|
|
212
210
|
│ ├── audit.md
|
|
213
211
|
│ ├── who-decides.md
|
|
@@ -221,13 +219,12 @@ fdeops/
|
|
|
221
219
|
│ ├── business-case.md
|
|
222
220
|
│ ├── three-options.md
|
|
223
221
|
│ ├── pick-three.md
|
|
224
|
-
│ ├──
|
|
222
|
+
│ ├── ship.md # Ship
|
|
225
223
|
│ ├── what-breaks.md
|
|
226
224
|
│ ├── rescue.md
|
|
227
|
-
│ ├── ship.md
|
|
228
225
|
│ ├── review.md
|
|
229
226
|
│ ├── rollback.md
|
|
230
|
-
│ ├── readout.md #
|
|
227
|
+
│ ├── readout.md # Outcome
|
|
231
228
|
│ ├── demo-prep.md
|
|
232
229
|
│ ├── debrief.md
|
|
233
230
|
│ ├── board-memo.md
|
|
@@ -272,9 +269,9 @@ fdeops/
|
|
|
272
269
|
|
|
273
270
|
## Why FDEOps?
|
|
274
271
|
|
|
275
|
-
AI coding agents are built for a repo, not for a client.
|
|
272
|
+
AI coding agents are built for a repo, not for a client. Left alone they skip who signs done, whether the brief is true, and whether anyone accepted the number. Monday morning they start from the ticket again.
|
|
276
273
|
|
|
277
|
-
FDEOps is
|
|
274
|
+
FDEOps is the catalog you take on site. One `@fde` skill runs the embed from discovery to signed outcome: POC, their codebase, go-live, eval when a model judges, promised → measured → accepted. A local CLI dates every decision. `.fde/` is markdown on your laptop. You confirm; then it is on the record.
|
|
278
275
|
|
|
279
276
|
---
|
|
280
277
|
|
|
@@ -313,8 +310,9 @@ Local only - `git` + files, no network, no telemetry. Plain markdown. The model
|
|
|
313
310
|
|
|
314
311
|
## Principles
|
|
315
312
|
|
|
313
|
+
- **One map** - any scale, greenfield or brownfield, any industry. Overlays carry the vertical
|
|
316
314
|
- **The artifact is the memory** - producing the work and recording it are one action
|
|
317
|
-
- **Ground loop** - name the
|
|
315
|
+
- **Ground loop** - name the change, characterise their code, prove it on their staging, go live, log the outcome
|
|
318
316
|
- **Skills, not autonomy** - the kit says what to check; judgment stays yours
|
|
319
317
|
- **Brief is a hypothesis** - discover before building the wrong thing
|
|
320
318
|
- **Evidence on every claim** - these files get defended in the room
|
package/adapters/AGENTS.md
CHANGED
|
@@ -6,7 +6,7 @@ You are the AI coding agent for a **Forward Deployed Engineer (FDE)** - the huma
|
|
|
6
6
|
|
|
7
7
|
When the FDE types **`@fde`**, names a client, pastes meeting notes, asks what was agreed, or describes embed work (quiet sponsor, brief feels wrong, Friday update) - load the skill. If `fde resume` says NO ENGAGEMENT: ask the client name once, then **you** run `fde resume --init <slug>`. Never tell them to type it.
|
|
8
8
|
|
|
9
|
-
Do **not** load `@fde` for a one-line typo in an unbound repo. On a bound client, stay on `@fde` for POC,
|
|
9
|
+
Do **not** load `@fde` for a one-line typo in an unbound repo. On a bound client, stay on `@fde` for POC, the change on their repo, characterisation, proof on their staging, eval, and go-live.
|
|
10
10
|
|
|
11
11
|
- Skill (single source of truth): `~/.claude/skills/fde/SKILL.md`
|
|
12
12
|
- **Never ask the FDE to pick a skill.** Read the situation, route silently, do the work.
|
package/adapters/GEMINI.md
CHANGED
|
@@ -6,7 +6,7 @@ Context for Gemini CLI when assisting a **Forward Deployed Engineer (FDE)** - th
|
|
|
6
6
|
|
|
7
7
|
When the FDE types **`@fde`**, names a client, pastes meeting notes, asks what was agreed, or describes embed work (quiet sponsor, brief feels wrong, Friday update) - load the skill. If `fde resume` says NO ENGAGEMENT: ask the client name once, then **you** run `fde resume --init <slug>`. Never tell them to type it.
|
|
8
8
|
|
|
9
|
-
Do **not** load `@fde` for a one-line typo in an unbound repo. On a bound client, stay on `@fde` for POC,
|
|
9
|
+
Do **not** load `@fde` for a one-line typo in an unbound repo. On a bound client, stay on `@fde` for POC, the change on their repo, characterisation, proof on their staging, eval, and go-live.
|
|
10
10
|
|
|
11
11
|
- Skill (single source of truth): `~/.claude/skills/fde/SKILL.md`
|
|
12
12
|
- **Never ask the FDE to pick a skill.** Read the situation, route silently, do the work.
|
package/adapters/LOCAL-LLM.md
CHANGED
|
@@ -4,7 +4,7 @@ Use fdeops with **any local model** - Ollama, LM Studio, llama.cpp, vLLM, Open W
|
|
|
4
4
|
|
|
5
5
|
## Why it works
|
|
6
6
|
|
|
7
|
-
fdeops is a SKILL.md file + markdown memory + a Node.js CLI. It calls no external API. The AI does the
|
|
7
|
+
fdeops is a SKILL.md file + markdown memory + a Node.js CLI. It calls no external API. The AI does the skills; the CLI does the mechanics. Any model that can read a markdown system prompt can run fdeops.
|
|
8
8
|
|
|
9
9
|
## Setup
|
|
10
10
|
|
|
@@ -62,12 +62,12 @@ The model reads SKILL.md, routes to the right skill, and produces artifacts in y
|
|
|
62
62
|
|
|
63
63
|
## Model size recommendations
|
|
64
64
|
|
|
65
|
-
The
|
|
65
|
+
The kit is detailed (30 skills, routing logic, evidence format, memory contract). Larger models handle it better:
|
|
66
66
|
|
|
67
67
|
| Model class | Experience |
|
|
68
68
|
|-------------|-----------|
|
|
69
69
|
| **7-8B** (Llama 3.1 8B, Mistral 7B, Qwen 2.5 7B) | Handles individual skills (readout, log, land). May struggle with complex routing or multi-skill sessions. Good for the CLI-heavy workflow where you invoke skills explicitly. |
|
|
70
|
-
| **13-34B** (Llama 3.1 13B, Mixtral 8x7B, Qwen 2.5 32B, DeepSeek-R1 32B) | Good across all domains. Routes correctly, follows memory contract, writes structured artifacts. Recommended minimum for full
|
|
70
|
+
| **13-34B** (Llama 3.1 13B, Mixtral 8x7B, Qwen 2.5 32B, DeepSeek-R1 32B) | Good across all domains. Routes correctly, follows memory contract, writes structured artifacts. Recommended minimum for full use. |
|
|
71
71
|
| **70B+** (Llama 3.1 405B, DeepSeek V3, Qwen 2.5 72B) | Full capability. Handles regulated overlays, switch-clients, board-memo pyramid, runbook handoff. |
|
|
72
72
|
|
|
73
73
|
## The CLI works without ANY model
|
|
@@ -105,6 +105,6 @@ ollama run my-fde-model --system "$(cat skills/fde/SKILL.md)"
|
|
|
105
105
|
## Tips for local models
|
|
106
106
|
|
|
107
107
|
- **Context window matters.** SKILL.md + references can be large. Use a model with at least 8K context; 32K+ is ideal for loading skill references on demand.
|
|
108
|
-
- **Temperature 0.2-0.4 works best.** The
|
|
108
|
+
- **Temperature 0.2-0.4 works best.** The skills are structured - lower temperature keeps routing accurate and artifacts consistent.
|
|
109
109
|
- **Use the CLI for mechanics.** Don't ask the model to do what the CLI already does deterministically. Use `fde scan` for repo recon, `fde log` for memory writes, `fde receipts` for searching. Let the model handle judgment, routing, and artifact drafting.
|
|
110
|
-
- **Explicit skill invocation.** If a smaller model struggles with routing, you can invoke skills directly: "@fde run the discover phase" or "@fde use hold-scope." The model skips routing and goes straight to the
|
|
110
|
+
- **Explicit skill invocation.** If a smaller model struggles with routing, you can invoke skills directly: "@fde run the discover phase" or "@fde use hold-scope." The model skips routing and goes straight to the skill.
|
package/adapters/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
**One brain, thin adapters.** fdeops has a single source of truth - the `@fde` skill at `skills/fde/SKILL.md` and the `fde` CLI. Each AI coding tool discovers it through a small pointer file in the place that tool already looks. No forked logic, no five copies to maintain - every adapter says the same thing: *route via `@fde`, read/write `.fde/` memory, talk like a peer, never touch what isn't yours.*
|
|
4
4
|
|
|
5
|
-
**Switching tools:** the fieldbook does not live in the agent. It lives at `~/fde-engagements/<client>/.fde/`. Point a new tool at a bound workspace, drop adapters (or install the skill/plugin for that tool), and the same client record opens. Auto session hooks are Claude Code-first; elsewhere load via `@fde` / `fde resume`. See [README § How
|
|
5
|
+
**Switching tools:** the fieldbook does not live in the agent. It lives at `~/fde-engagements/<client>/.fde/`. Point a new tool at a bound workspace, drop adapters (or install the skill/plugin for that tool), and the same client record opens. Auto session hooks are Claude Code-first; elsewhere load via `@fde` / `fde resume`. See [README § How Skills Work](../README.md#how-skills-work).
|
|
6
6
|
|
|
7
7
|
## What goes where
|
|
8
8
|
|
|
@@ -31,4 +31,4 @@ Defaults to the current directory if no path is given. Existing files are never
|
|
|
31
31
|
|
|
32
32
|
## The principle
|
|
33
33
|
|
|
34
|
-
The adapter only tells the tool **where the brain is and how to behave**. All
|
|
34
|
+
The adapter only tells the tool **where the brain is and how to behave**. All 30 skills, the overlays, and the memory contract live once in `skills/fde/SKILL.md`. Update the brain, every platform gets it. That's why fdeops feels native in whatever the FDE already uses, without five things to keep in sync.
|
|
@@ -6,7 +6,7 @@ You are the AI coding agent for a **Forward Deployed Engineer (FDE)** - the huma
|
|
|
6
6
|
|
|
7
7
|
When the FDE types **`@fde`**, names a client, pastes meeting notes, asks what was agreed, or describes embed work (quiet sponsor, brief feels wrong, Friday update) - load the skill. If `fde resume` says NO ENGAGEMENT: ask the client name once, then **you** run `fde resume --init <slug>`. Never tell them to type it.
|
|
8
8
|
|
|
9
|
-
Do **not** load `@fde` for a one-line typo in an unbound repo. On a bound client, stay on `@fde` for POC,
|
|
9
|
+
Do **not** load `@fde` for a one-line typo in an unbound repo. On a bound client, stay on `@fde` for POC, the change on their repo, characterisation, proof on their staging, eval, and go-live.
|
|
10
10
|
|
|
11
11
|
- Skill (single source of truth): `~/.claude/skills/fde/SKILL.md`
|
|
12
12
|
- **Never ask the FDE to pick a skill.** Read the situation, route silently, do the work.
|
package/adapters/cursor.fde.mdc
CHANGED
|
@@ -11,7 +11,7 @@ You are the AI coding agent for a **Forward Deployed Engineer (FDE)** - the huma
|
|
|
11
11
|
|
|
12
12
|
When the FDE types **`@fde`**, names a client, pastes meeting notes, asks what was agreed, or describes embed work (quiet sponsor, brief feels wrong, Friday update) - load `@fde`. If `fde resume` says NO ENGAGEMENT: ask the client name once, then **you** run `fde resume --init <slug>`. Never tell them to type it.
|
|
13
13
|
|
|
14
|
-
Do **not** load `@fde` for a one-line typo in an unbound repo. On a bound client, stay on `@fde` for POC,
|
|
14
|
+
Do **not** load `@fde` for a one-line typo in an unbound repo. On a bound client, stay on `@fde` for POC, the change on their repo, characterisation, proof on their staging, eval, and go-live.
|
|
15
15
|
|
|
16
16
|
- Skill (single source of truth): `~/.claude/skills/fde/SKILL.md` (or the copy this install placed)
|
|
17
17
|
- **Never ask the FDE to pick a skill.** Read the situation, route silently, do the work.
|
package/bin/check.js
CHANGED
|
@@ -57,7 +57,7 @@ for (const dir of fs.readdirSync(path.join(root, 'skills'))) {
|
|
|
57
57
|
ok('skills structure')
|
|
58
58
|
|
|
59
59
|
if (fs.existsSync(path.join(root, 'skills', 'fde', 'archive'))) {
|
|
60
|
-
fail('skills/fde/archive must not exist - unrouted
|
|
60
|
+
fail('skills/fde/archive must not exist - unrouted skills are dead code')
|
|
61
61
|
} else ok('no archived skill dump')
|
|
62
62
|
|
|
63
63
|
// v3: one skill + phase references (progressive disclosure)
|
|
@@ -164,7 +164,7 @@ ok(`router dispatch (${mentioned.length} reference targets verified) + memory co
|
|
|
164
164
|
documentedRows++
|
|
165
165
|
documented.add(m[1])
|
|
166
166
|
// A link nobody followed is the same unverifiable claim this gate exists for:
|
|
167
|
-
// the target must exist, and it must be the
|
|
167
|
+
// the target must exist, and it must be the skill the text names.
|
|
168
168
|
if (m[2] !== `${m[1]}.md`) {
|
|
169
169
|
fail(`docs/skills-reference.md links [${m[1]}] at references/${m[2]}`)
|
|
170
170
|
} else if (!fs.existsSync(path.join(root, 'skills', 'fde', 'references', m[2]))) {
|
|
@@ -172,13 +172,13 @@ ok(`router dispatch (${mentioned.length} reference targets verified) + memory co
|
|
|
172
172
|
}
|
|
173
173
|
}
|
|
174
174
|
if (documented.size !== documentedRows) {
|
|
175
|
-
fail(`docs/skills-reference.md lists ${documentedRows}
|
|
175
|
+
fail(`docs/skills-reference.md lists ${documentedRows} skill rows for ${documented.size} skills - a duplicate row inflates the count`)
|
|
176
176
|
}
|
|
177
177
|
const undocumented = [...routed].filter(name => !documented.has(name))
|
|
178
178
|
if (undocumented.length) {
|
|
179
179
|
fail(`SKILL.md routes skill(s) missing from docs/skills-reference.md: ${undocumented.join(', ')}`)
|
|
180
180
|
}
|
|
181
|
-
// and the other direction: a documented
|
|
181
|
+
// and the other direction: a documented skill nothing routes to is a skill
|
|
182
182
|
// the agent can never reach, advertised anyway.
|
|
183
183
|
const unrouted = [...documented].filter(name => !routed.has(name))
|
|
184
184
|
if (unrouted.length) {
|
|
@@ -187,7 +187,7 @@ ok(`router dispatch (${mentioned.length} reference targets verified) + memory co
|
|
|
187
187
|
for (const rel of ['docs/skills.md', 'docs/skills-reference.md']) {
|
|
188
188
|
const body = read(rel)
|
|
189
189
|
// `-` is a word boundary, so \bscore\b matches inside `score-use-cases`:
|
|
190
|
-
// a
|
|
190
|
+
// a skill could disappear from the docs behind a hyphenated sibling.
|
|
191
191
|
const absent = [...documented].filter(name => !new RegExp(`(?<![\\w-])${name}(?![\\w-])`).test(body))
|
|
192
192
|
if (absent.length) fail(`${rel} does not list skill(s): ${absent.join(', ')}`)
|
|
193
193
|
const claims = [...body.matchAll(/(\d+)\s+skills/g)].map(m => Number(m[1]))
|
|
@@ -201,8 +201,23 @@ ok(`router dispatch (${mentioned.length} reference targets verified) + memory co
|
|
|
201
201
|
|
|
202
202
|
const refDir = path.join(root, 'skills', 'fde', 'references')
|
|
203
203
|
const extra = fs.readdirSync(refDir).filter(f => f.endsWith('.md') && !mentioned.includes(f))
|
|
204
|
-
if (extra.length) fail(`unrouted reference file(s) - dead
|
|
204
|
+
if (extra.length) fail(`unrouted reference file(s) - dead skill: ${extra.join(', ')}`)
|
|
205
205
|
else ok('no unrouted reference files')
|
|
206
|
+
|
|
207
|
+
// The on-site change loop lives in ship.md. A sibling skill is a split.
|
|
208
|
+
for (const dead of ['small-prs.md', 'thin-slices.md', 'implement.md']) {
|
|
209
|
+
if (fs.existsSync(path.join(refDir, dead))) {
|
|
210
|
+
fail(`${dead} must not exist - that craft lives in ship.md`)
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
ok('ship is one skill (no implement / small-prs / thin-slices sibling)')
|
|
214
|
+
|
|
215
|
+
if (/^### Prove\b/m.test(read('skills/fde/SKILL.md'))) {
|
|
216
|
+
fail('SKILL.md must not use Prove as a stage heading - the public stage is Outcome')
|
|
217
|
+
} else ok('SKILL.md stage heading is Outcome')
|
|
218
|
+
if (/\b31 names\b|\b31 skills\b/.test(read('README.md'))) {
|
|
219
|
+
fail('README must not advertise 31 skills')
|
|
220
|
+
} else ok('README skill count is 30')
|
|
206
221
|
}
|
|
207
222
|
|
|
208
223
|
const install = read('bin/install.js')
|
|
@@ -221,8 +236,10 @@ if (read('package.json').includes('postinstall')) {
|
|
|
221
236
|
}
|
|
222
237
|
|
|
223
238
|
const readme = read('README.md')
|
|
224
|
-
if (/session\.gif|demo\.gif
|
|
225
|
-
fail('README must not embed
|
|
239
|
+
if (/session\.gif|demo\.gif/i.test(readme)) {
|
|
240
|
+
fail('README must not embed session.gif or demo.gif - the recording lives in docs/USAGE.md')
|
|
241
|
+
} else if (/<img /i.test(readme) && !/user-attachments\/assets/.test(readme)) {
|
|
242
|
+
fail('README <img> must be the GitHub poster (user-attachments), not a local gif')
|
|
226
243
|
} else ok('README is text (no gif)')
|
|
227
244
|
|
|
228
245
|
const usage = read('docs/USAGE.md')
|
|
@@ -268,9 +285,11 @@ for (const cmd of ['/brief', '/discover', '/plan', '/ship', '/outcome', '/close'
|
|
|
268
285
|
if (/(^|[^\w/])\/got\b/.test(readme)) fail('README must use /outcome, not /got')
|
|
269
286
|
ok('README slash commands documented')
|
|
270
287
|
|
|
271
|
-
// Front-door map is the embed left-to-right (
|
|
272
|
-
|
|
273
|
-
|
|
288
|
+
// Front-door map is the embed left-to-right (Land → Close). After the GitHub
|
|
289
|
+
// poster (#68) the table is the map: /brief /discover /plan /ship /outcome /close.
|
|
290
|
+
const front = readme.slice(0, 4000)
|
|
291
|
+
if (!['/brief', '/discover', '/plan', '/ship', '/outcome', '/close'].every(c => front.includes(c))) {
|
|
292
|
+
fail('README must include the Land→Close command map near the top')
|
|
274
293
|
} else ok('README command-map diagram')
|
|
275
294
|
|
|
276
295
|
if (readme.includes('your-client-repo')) {
|
|
@@ -337,6 +356,18 @@ for (const rx of derivativeFraming) {
|
|
|
337
356
|
if (/docs\/internal|PMF_360/i.test(readme)) {
|
|
338
357
|
fail('README must not link docs/internal or PMF_360')
|
|
339
358
|
}
|
|
359
|
+
if (!/One command per stage/.test(readme) || !/Skills load automatically/.test(readme)) {
|
|
360
|
+
fail('README must formulate Commands as: one command per stage, skills load automatically')
|
|
361
|
+
}
|
|
362
|
+
if (!/Not prompts/.test(readme)) {
|
|
363
|
+
fail('README catalog must say skills are not prompts')
|
|
364
|
+
}
|
|
365
|
+
if (/\b(30|31|37)\s+methods\b|\broutes methods\b|\bphase methods\b|\bfield methods\b|\bengagement methods\b/.test(readme)) {
|
|
366
|
+
fail('README must call the catalog skills, not methods')
|
|
367
|
+
}
|
|
368
|
+
if (/\broutes methods\b|\bphase methods\b|\bengagement methods\b/.test(usage)) {
|
|
369
|
+
fail('docs/USAGE.md must call them skills, not methods')
|
|
370
|
+
}
|
|
340
371
|
ok('README tone')
|
|
341
372
|
|
|
342
373
|
if (fs.existsSync(path.join(root, '.codex')) || fs.existsSync(path.join(root, '.opencode'))) {
|