fdeops 3.15.2 → 3.17.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 +61 -69
- package/adapters/AGENTS.md +1 -1
- package/adapters/GEMINI.md +1 -1
- package/adapters/LOCAL-LLM.md +4 -4
- package/adapters/README.md +1 -1
- package/adapters/copilot-instructions.md +1 -1
- package/adapters/cursor.fde.mdc +1 -1
- package/bin/check.js +27 -15
- package/bin/fde.js +150 -13
- package/bin/lib/render.js +2 -2
- package/bin/lib/trust.js +38 -3
- package/mcp/README.md +1 -1
- package/mcp/fdeops-ingest/package.json +1 -1
- package/mcp/recipes/README.md +1 -1
- package/package.json +1 -1
- package/plugin.json +1 -1
- package/skills/fde/SKILL.md +30 -31
- package/skills/fde/references/ai.md +1 -1
- package/skills/fde/references/{exec-narrative.md → board-memo.md} +1 -1
- package/skills/fde/references/business-case.md +2 -2
- package/skills/fde/references/{ingest-connect.md → connect.md} +1 -1
- package/skills/fde/references/discover.md +33 -14
- package/skills/fde/references/{trust-engineering.md → earn-trust.md} +1 -1
- package/skills/fde/references/{pattern-extract.md → encode-pattern.md} +1 -1
- package/skills/fde/references/eval-pack.md +1 -1
- package/skills/fde/references/{scope-defense.md → hold-scope.md} +2 -2
- package/skills/fde/references/ingest.md +3 -3
- package/skills/fde/references/land.md +2 -2
- package/skills/fde/references/{initiative-triage.md → pick-three.md} +1 -1
- package/skills/fde/references/plan.md +10 -7
- package/skills/fde/references/{sketch.md → poc.md} +1 -1
- package/skills/fde/references/{status.md → readout.md} +2 -2
- package/skills/fde/references/rescue.md +1 -1
- package/skills/fde/references/review.md +1 -1
- package/skills/fde/references/{rollback-drill.md → rollback.md} +1 -1
- package/skills/fde/references/{handoff-engineering.md → runbook.md} +3 -3
- package/skills/fde/references/{use-case-scoring.md → score-use-cases.md} +3 -3
- package/skills/fde/references/ship.md +121 -18
- package/skills/fde/references/{multi-customer-ops.md → switch-clients.md} +1 -1
- package/skills/fde/references/{assumption-audit.md → test-assumptions.md} +2 -2
- package/skills/fde/references/{options-analysis.md → three-options.md} +1 -1
- package/skills/fde/references/{blast-radius.md → what-breaks.md} +3 -3
- package/skills/fde/references/{stakeholder-radar.md → who-decides.md} +1 -1
- package/templates/.fde/assumptions.md +2 -2
- package/templates/.fde/reality.md +6 -1
- package/skills/fde/references/incremental-build.md +0 -100
package/README.md
CHANGED
|
@@ -2,16 +2,9 @@
|
|
|
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
|
|
|
@@ -21,23 +14,24 @@ Each command loads the same `@fde` skill. You never pick from 31 names.
|
|
|
21
14
|
|
|
22
15
|
| What you're doing | Command | Key principle |
|
|
23
16
|
|-------------------|---------|-----------|
|
|
24
|
-
|
|
|
25
|
-
| Find the real problem | `/discover` |
|
|
26
|
-
|
|
|
27
|
-
| Ship
|
|
28
|
-
|
|
|
29
|
-
|
|
|
17
|
+
| First week on site | `/brief` | Name who signs done |
|
|
18
|
+
| Find the real problem | `/discover` | Treat the brief as a hypothesis |
|
|
19
|
+
| Sequence the work | `/plan` | Work backwards from done |
|
|
20
|
+
| Ship to their production | `/ship` | One change they can see, then go live with a rollback you have run |
|
|
21
|
+
| Get the number accepted | `/outcome` | Promised, measured, accepted |
|
|
22
|
+
| Hand off so they run it | `/close` | They operate it without you |
|
|
30
23
|
|
|
31
|
-
|
|
24
|
+
Also:
|
|
32
25
|
|
|
33
26
|
| What you're doing | Command | Key principle |
|
|
34
27
|
|-------------------|---------|-----------|
|
|
35
|
-
| Sponsor went
|
|
36
|
-
|
|
|
28
|
+
| Sponsor went quiet | `/trust` | Process gap, or they stopped trusting you |
|
|
29
|
+
| When did we agree? | `/receipts` | A dated line, or it did not happen |
|
|
37
30
|
| After a meeting | `/debrief` | Notes into the record |
|
|
38
|
-
|
|
|
31
|
+
| Prep before the meeting | `/prep` | One page from the record |
|
|
32
|
+
| Friday sponsor update | `/readout` | Promised, measured, accepted |
|
|
39
33
|
|
|
40
|
-
Skills also activate on English: naming a client, running a POC,
|
|
34
|
+
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.
|
|
41
35
|
|
|
42
36
|
---
|
|
43
37
|
|
|
@@ -99,9 +93,9 @@ Requires Node.js >= 18. Override: `FDEOPS_ENGAGEMENT`. See [docs/install.md](doc
|
|
|
99
93
|
|
|
100
94
|
---
|
|
101
95
|
|
|
102
|
-
## All
|
|
96
|
+
## All 30 Skills
|
|
103
97
|
|
|
104
|
-
The commands above are the entry points. Under the hood, `@fde` activates these
|
|
98
|
+
The commands above are the entry points. Under the hood, `@fde` activates these 30 skills, each a structured workflow with steps, an artifact, and a checkpoint. You never pick one by name. Full detail: [docs/skills-reference.md](docs/skills-reference.md).
|
|
105
99
|
|
|
106
100
|
### Land - Brief and trust
|
|
107
101
|
|
|
@@ -109,59 +103,58 @@ The commands above are the entry points. Under the hood, `@fde` activates these
|
|
|
109
103
|
|--------|--------------|----------|
|
|
110
104
|
| [land](skills/fde/references/land.md) | Interrogate the brief, map stakeholders, define success | New client, first meeting, just got the brief |
|
|
111
105
|
| [audit](skills/fde/references/audit.md) | Verify claims, find the load-bearing wall | Taking over, previous consultant left |
|
|
112
|
-
| [
|
|
113
|
-
| [trust
|
|
114
|
-
| [scope
|
|
106
|
+
| [who-decides](skills/fde/references/who-decides.md) | Who decides, who blocks, who escalates | Need to know who matters |
|
|
107
|
+
| [earn-trust](skills/fde/references/earn-trust.md) | Observer → trusted; navigate AI policy | Need access or credibility |
|
|
108
|
+
| [hold-scope](skills/fde/references/hold-scope.md) | Scope receipts; the accumulation conversation | "Also can you…", timeline unchanged |
|
|
115
109
|
|
|
116
110
|
### Discover - Find the real problem
|
|
117
111
|
|
|
118
112
|
| Skill | What It Does | Use When |
|
|
119
113
|
|--------|--------------|----------|
|
|
120
|
-
| [discover](skills/fde/references/discover.md) |
|
|
121
|
-
| [
|
|
122
|
-
| [use-
|
|
123
|
-
| [
|
|
114
|
+
| [discover](skills/fde/references/discover.md) | Question first, then repo + workaround | Brief feels wrong, shadow processes |
|
|
115
|
+
| [test-assumptions](skills/fde/references/test-assumptions.md) | Untested assumptions by blast radius | Brief feels too neat |
|
|
116
|
+
| [score-use-cases](skills/fde/references/score-use-cases.md) | Value × urgency × alignment / complexity | Everything is P0 |
|
|
117
|
+
| [poc](skills/fde/references/poc.md) | Kill the killer assumption in a day | POC, spike, need to de-risk |
|
|
124
118
|
|
|
125
119
|
### Plan - Sequence the work
|
|
126
120
|
|
|
127
121
|
| Skill | What It Does | Use When |
|
|
128
122
|
|--------|--------------|----------|
|
|
129
|
-
| [plan](skills/fde/references/plan.md) | Backwards from done, PR
|
|
123
|
+
| [plan](skills/fde/references/plan.md) | Backwards from done, Kill if on each PR | What order, what is done |
|
|
130
124
|
| [business-case](skills/fde/references/business-case.md) | Cost of nothing → investment → return | Defend budget or timeline |
|
|
131
|
-
| [options
|
|
132
|
-
| [
|
|
125
|
+
| [three-options](skills/fde/references/three-options.md) | Three genuine options | "What should we do?" |
|
|
126
|
+
| [pick-three](skills/fde/references/pick-three.md) | Pick three from twenty urgents | Everything is urgent |
|
|
133
127
|
|
|
134
|
-
### Ship -
|
|
128
|
+
### Ship - On their repo, then live
|
|
135
129
|
|
|
136
130
|
| Skill | What It Does | Use When |
|
|
137
131
|
|--------|--------------|----------|
|
|
138
|
-
| [
|
|
139
|
-
| [
|
|
132
|
+
| [ship](skills/fde/references/ship.md) | One change they can see (greenfield or brownfield), proven on their staging, then go live | Building, updating, or going live |
|
|
133
|
+
| [what-breaks](skills/fde/references/what-breaks.md) | Impact from contained → irreversible | Touching shared infrastructure |
|
|
140
134
|
| [rescue](skills/fde/references/rescue.md) | Production fire or trust fire | Down, or they went quiet |
|
|
141
|
-
| [ship](skills/fde/references/ship.md) | Intent vs diff, pre-flight, rollback | Going live |
|
|
142
135
|
| [review](skills/fde/references/review.md) | Did we only build what we agreed | Before merge, scope creep |
|
|
143
|
-
| [rollback
|
|
136
|
+
| [rollback](skills/fde/references/rollback.md) | Test the escape route before 2am | "We can always revert" |
|
|
144
137
|
|
|
145
|
-
###
|
|
138
|
+
### Outcome - Get the number accepted
|
|
146
139
|
|
|
147
140
|
| Skill | What It Does | Use When |
|
|
148
141
|
|--------|--------------|----------|
|
|
149
|
-
| [
|
|
142
|
+
| [readout](skills/fde/references/readout.md) | Promised → measured → accepted | Friday, sponsor update |
|
|
150
143
|
| [demo-prep](skills/fde/references/demo-prep.md) | One number, five hard questions | Demo or exec walkthrough |
|
|
151
144
|
| [debrief](skills/fde/references/debrief.md) | Meeting notes into the record | Just left a meeting |
|
|
152
|
-
| [
|
|
145
|
+
| [board-memo](skills/fde/references/board-memo.md) | Board / sponsor's boss | Justify continued investment |
|
|
153
146
|
| [dashboard](skills/fde/references/dashboard.md) | Portfolio, trust-ordered | All my customers |
|
|
154
147
|
| [ingest](skills/fde/references/ingest.md) | Pull text you confirm | Transcript, Notion, Slack |
|
|
155
|
-
| [
|
|
148
|
+
| [connect](skills/fde/references/connect.md) | Wire a source MCP | Connect Granola |
|
|
156
149
|
|
|
157
150
|
### Close - They run it
|
|
158
151
|
|
|
159
152
|
| Skill | What It Does | Use When |
|
|
160
153
|
|--------|--------------|----------|
|
|
161
154
|
| [close](skills/fde/references/close.md) | Handoff that survives you | Wrapping up |
|
|
162
|
-
| [
|
|
163
|
-
| [
|
|
164
|
-
| [pattern
|
|
155
|
+
| [runbook](skills/fde/references/runbook.md) | Runbook, confidence scoring | They must operate without you |
|
|
156
|
+
| [switch-clients](skills/fde/references/switch-clients.md) | Switch without bleed | 2+ clients |
|
|
157
|
+
| [encode-pattern](skills/fde/references/encode-pattern.md) | If you did it twice, encode it | It will apply again |
|
|
165
158
|
| [red-team](skills/fde/references/red-team.md) | Stress-test before they do | "Poke holes in this" |
|
|
166
159
|
|
|
167
160
|
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)
|
|
@@ -191,7 +184,7 @@ One skill. One reference file per situation. One folder per client.
|
|
|
191
184
|
```
|
|
192
185
|
|
|
193
186
|
- **Process, not prose.** Each reference is a workflow with an artifact and a checkpoint, not a tip sheet.
|
|
194
|
-
- **Ground loop.** Name → characterise → prove where they live → log. The workspace compiles; `@fde` stays.
|
|
187
|
+
- **Ground loop.** Name → characterise → prove where they live → go live → log. The workspace compiles; `@fde` stays.
|
|
195
188
|
- **You confirm.** Nothing is written until you say so.
|
|
196
189
|
- **Progressive disclosure.** `SKILL.md` is the entry point. One `references/*.md` loads when routed.
|
|
197
190
|
- **Local CLI.** Writes and status cost zero model tokens. The AI coding agent runs it.
|
|
@@ -206,37 +199,36 @@ Change hosts, install `@fde` on the new one, bind if needed, keep talking. The r
|
|
|
206
199
|
fdeops/
|
|
207
200
|
├── skills/fde/ # the one skill hosts load
|
|
208
201
|
│ ├── SKILL.md # router
|
|
209
|
-
│ └── references/ #
|
|
202
|
+
│ └── references/ # 30 skills + overlays (you never pick)
|
|
210
203
|
│ ├── land.md # Land
|
|
211
204
|
│ ├── audit.md
|
|
212
|
-
│ ├──
|
|
213
|
-
│ ├── trust
|
|
214
|
-
│ ├── scope
|
|
205
|
+
│ ├── who-decides.md
|
|
206
|
+
│ ├── earn-trust.md
|
|
207
|
+
│ ├── hold-scope.md
|
|
215
208
|
│ ├── discover.md # Discover
|
|
216
|
-
│ ├──
|
|
217
|
-
│ ├── use-
|
|
218
|
-
│ ├──
|
|
209
|
+
│ ├── test-assumptions.md
|
|
210
|
+
│ ├── score-use-cases.md
|
|
211
|
+
│ ├── poc.md
|
|
219
212
|
│ ├── plan.md # Plan
|
|
220
213
|
│ ├── business-case.md
|
|
221
|
-
│ ├── options
|
|
222
|
-
│ ├──
|
|
223
|
-
│ ├──
|
|
224
|
-
│ ├──
|
|
214
|
+
│ ├── three-options.md
|
|
215
|
+
│ ├── pick-three.md
|
|
216
|
+
│ ├── ship.md # Ship
|
|
217
|
+
│ ├── what-breaks.md
|
|
225
218
|
│ ├── rescue.md
|
|
226
|
-
│ ├── ship.md
|
|
227
219
|
│ ├── review.md
|
|
228
|
-
│ ├── rollback
|
|
229
|
-
│ ├──
|
|
220
|
+
│ ├── rollback.md
|
|
221
|
+
│ ├── readout.md # Outcome
|
|
230
222
|
│ ├── demo-prep.md
|
|
231
223
|
│ ├── debrief.md
|
|
232
|
-
│ ├──
|
|
224
|
+
│ ├── board-memo.md
|
|
233
225
|
│ ├── dashboard.md
|
|
234
226
|
│ ├── ingest.md
|
|
235
|
-
│ ├──
|
|
227
|
+
│ ├── connect.md
|
|
236
228
|
│ ├── close.md # Close
|
|
237
|
-
│ ├──
|
|
238
|
-
│ ├──
|
|
239
|
-
│ ├── pattern
|
|
229
|
+
│ ├── runbook.md
|
|
230
|
+
│ ├── switch-clients.md
|
|
231
|
+
│ ├── encode-pattern.md
|
|
240
232
|
│ ├── red-team.md
|
|
241
233
|
│ ├── ai.md # overlays (on signal)
|
|
242
234
|
│ ├── artifacts.md
|
|
@@ -251,11 +243,11 @@ fdeops/
|
|
|
251
243
|
│ ├── ship.md
|
|
252
244
|
│ ├── outcome.md
|
|
253
245
|
│ ├── close.md
|
|
254
|
-
│ ├──
|
|
255
|
-
│ ├──
|
|
246
|
+
│ ├── trust.md
|
|
247
|
+
│ ├── receipts.md
|
|
256
248
|
│ ├── debrief.md
|
|
257
249
|
│ ├── prep.md
|
|
258
|
-
│ └──
|
|
250
|
+
│ └── readout.md
|
|
259
251
|
├── .claude-plugin/ # Claude Code marketplace
|
|
260
252
|
├── bin/ # local CLI: git + files, no network
|
|
261
253
|
├── hooks/ # session-start / session-stop / pre-compact
|
|
@@ -273,7 +265,7 @@ fdeops/
|
|
|
273
265
|
|
|
274
266
|
AI coding agents are built for a repo, not for a client. They forget the sponsor, the promise, who can say yes, and whether anyone accepted the number. Monday morning they start from the ticket again.
|
|
275
267
|
|
|
276
|
-
FDEOps is what you take on site. One `@fde` skill runs the embed from discovery to signed outcome: POC,
|
|
268
|
+
FDEOps is what 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.
|
|
277
269
|
|
|
278
270
|
---
|
|
279
271
|
|
|
@@ -313,7 +305,7 @@ Local only - `git` + files, no network, no telemetry. Plain markdown. The model
|
|
|
313
305
|
## Principles
|
|
314
306
|
|
|
315
307
|
- **The artifact is the memory** - producing the work and recording it are one action
|
|
316
|
-
- **Ground loop** - name the
|
|
308
|
+
- **Ground loop** - name the change, characterise their code, prove it on their staging, go live, log the outcome
|
|
317
309
|
- **Skills, not autonomy** - the kit says what to check; judgment stays yours
|
|
318
310
|
- **Brief is a hypothesis** - discover before building the wrong thing
|
|
319
311
|
- **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, small PRs, 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, small PRs, 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
|
@@ -62,13 +62,13 @@ 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 methodology is detailed (
|
|
65
|
+
The methodology 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
|
-
| **7-8B** (Llama 3.1 8B, Mistral 7B, Qwen 2.5 7B) | Handles individual skills (
|
|
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
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 methodology use. |
|
|
71
|
-
| **70B+** (Llama 3.1 405B, DeepSeek V3, Qwen 2.5 72B) | Full capability. Handles regulated overlays,
|
|
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
|
|
74
74
|
|
|
@@ -107,4 +107,4 @@ ollama run my-fde-model --system "$(cat skills/fde/SKILL.md)"
|
|
|
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
108
|
- **Temperature 0.2-0.4 works best.** The methodology is 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 scope
|
|
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 method.
|
package/adapters/README.md
CHANGED
|
@@ -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, small PRs, 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, small PRs, 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
|
@@ -63,8 +63,8 @@ if (fs.existsSync(path.join(root, 'skills', 'fde', 'archive'))) {
|
|
|
63
63
|
// v3: one skill + phase references (progressive disclosure)
|
|
64
64
|
const requiredReferences = [
|
|
65
65
|
'land.md', 'discover.md', 'audit.md', 'plan.md', 'review.md',
|
|
66
|
-
'rescue.md', 'ship.md', '
|
|
67
|
-
'debrief.md', '
|
|
66
|
+
'rescue.md', 'ship.md', 'poc.md', 'close.md', 'dashboard.md',
|
|
67
|
+
'debrief.md', 'readout.md', 'demo-prep.md',
|
|
68
68
|
'healthcare.md', 'fintech.md', 'gov.md',
|
|
69
69
|
'ai.md', 'eval-pack.md',
|
|
70
70
|
]
|
|
@@ -84,8 +84,8 @@ ok('phase references')
|
|
|
84
84
|
// file the work lands in. Prose-only guidance drifts into advice nobody can apply.
|
|
85
85
|
const exampleReferences = [
|
|
86
86
|
'land.md', 'discover.md', 'plan.md', 'ship.md', 'close.md',
|
|
87
|
-
'
|
|
88
|
-
'
|
|
87
|
+
'readout.md', 'who-decides.md', 'three-options.md', 'business-case.md',
|
|
88
|
+
'test-assumptions.md', 'hold-scope.md',
|
|
89
89
|
]
|
|
90
90
|
for (const f of exampleReferences) {
|
|
91
91
|
const p = path.join(root, 'skills', 'fde', 'references', f)
|
|
@@ -115,7 +115,7 @@ for (const refFile of mentioned) {
|
|
|
115
115
|
ok(`router dispatch (${mentioned.length} reference targets verified) + memory contract`)
|
|
116
116
|
|
|
117
117
|
// Public claims must match the router. The docs advertise a method count and a
|
|
118
|
-
// per-domain list; both drifted from SKILL.md once (ingest /
|
|
118
|
+
// per-domain list; both drifted from SKILL.md once (ingest / connect
|
|
119
119
|
// routed but undocumented), and a number nobody can verify is worse than none.
|
|
120
120
|
{
|
|
121
121
|
// Every routing row must parse. A row this misses is a method that could go
|
|
@@ -186,7 +186,7 @@ ok(`router dispatch (${mentioned.length} reference targets verified) + memory co
|
|
|
186
186
|
}
|
|
187
187
|
for (const rel of ['docs/skills.md', 'docs/skills-reference.md']) {
|
|
188
188
|
const body = read(rel)
|
|
189
|
-
// `-` is a word boundary, so \
|
|
189
|
+
// `-` is a word boundary, so \bscore\b matches inside `score-use-cases`:
|
|
190
190
|
// a method 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(', ')}`)
|
|
@@ -203,6 +203,14 @@ ok(`router dispatch (${mentioned.length} reference targets verified) + memory co
|
|
|
203
203
|
const extra = fs.readdirSync(refDir).filter(f => f.endsWith('.md') && !mentioned.includes(f))
|
|
204
204
|
if (extra.length) fail(`unrouted reference file(s) - dead method: ${extra.join(', ')}`)
|
|
205
205
|
else ok('no unrouted reference files')
|
|
206
|
+
|
|
207
|
+
// The on-site change loop lives in ship.md. A sibling method 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 method (no implement / small-prs / thin-slices sibling)')
|
|
206
214
|
}
|
|
207
215
|
|
|
208
216
|
const install = read('bin/install.js')
|
|
@@ -221,8 +229,10 @@ if (read('package.json').includes('postinstall')) {
|
|
|
221
229
|
}
|
|
222
230
|
|
|
223
231
|
const readme = read('README.md')
|
|
224
|
-
if (/session\.gif|demo\.gif
|
|
225
|
-
fail('README must not embed
|
|
232
|
+
if (/session\.gif|demo\.gif/i.test(readme)) {
|
|
233
|
+
fail('README must not embed session.gif or demo.gif - the recording lives in docs/USAGE.md')
|
|
234
|
+
} else if (/<img /i.test(readme) && !/user-attachments\/assets/.test(readme)) {
|
|
235
|
+
fail('README <img> must be the GitHub poster (user-attachments), not a local gif')
|
|
226
236
|
} else ok('README is text (no gif)')
|
|
227
237
|
|
|
228
238
|
const usage = read('docs/USAGE.md')
|
|
@@ -262,15 +272,17 @@ if (!readme.includes('AI coding agent')) {
|
|
|
262
272
|
}
|
|
263
273
|
ok('README clarity sections')
|
|
264
274
|
|
|
265
|
-
for (const cmd of ['/brief', '/discover', '/plan', '/ship', '/outcome', '/close', '/debrief', '/prep', '/
|
|
275
|
+
for (const cmd of ['/brief', '/discover', '/plan', '/ship', '/outcome', '/close', '/debrief', '/prep', '/trust', '/receipts', '/readout']) {
|
|
266
276
|
if (!readme.includes(cmd)) fail(`README must document slash command ${cmd}`)
|
|
267
277
|
}
|
|
268
278
|
if (/(^|[^\w/])\/got\b/.test(readme)) fail('README must use /outcome, not /got')
|
|
269
279
|
ok('README slash commands documented')
|
|
270
280
|
|
|
271
|
-
// Front-door map is the embed left-to-right (
|
|
272
|
-
|
|
273
|
-
|
|
281
|
+
// Front-door map is the embed left-to-right (Land → Close). After the GitHub
|
|
282
|
+
// poster (#68) the table is the map: /brief /discover /plan /ship /outcome /close.
|
|
283
|
+
const front = readme.slice(0, 4000)
|
|
284
|
+
if (!['/brief', '/discover', '/plan', '/ship', '/outcome', '/close'].every(c => front.includes(c))) {
|
|
285
|
+
fail('README must include the Land→Close command map near the top')
|
|
274
286
|
} else ok('README command-map diagram')
|
|
275
287
|
|
|
276
288
|
if (readme.includes('your-client-repo')) {
|
|
@@ -536,7 +548,7 @@ if (pkg.version !== plugin.version) {
|
|
|
536
548
|
if (plugin.commands !== './.claude/commands' || plugin.skills !== './skills') {
|
|
537
549
|
fail('.claude-plugin/plugin.json must declare skills and commands')
|
|
538
550
|
} else {
|
|
539
|
-
for (const cmd of ['brief', 'discover', 'plan', 'ship', 'outcome', 'close', 'debrief', 'prep', '
|
|
551
|
+
for (const cmd of ['brief', 'discover', 'plan', 'ship', 'outcome', 'close', 'debrief', 'prep', 'trust', 'receipts', 'readout']) {
|
|
540
552
|
const rel = `.claude/commands/${cmd}.md`
|
|
541
553
|
if (!fs.existsSync(path.join(root, rel))) fail(`${rel} missing`)
|
|
542
554
|
else if (!read(rel).includes('@fde')) fail(`${rel} must load @fde`)
|
|
@@ -550,8 +562,8 @@ if (!fs.existsSync(path.join(root, 'mcp', 'fdeops-ingest', 'server.js'))) {
|
|
|
550
562
|
fail('ingest MCP must expose ingest_stage')
|
|
551
563
|
} else if (!read('skills/fde/references/ingest.md').includes('stage')) {
|
|
552
564
|
fail('skills/fde/references/ingest.md missing stage contract')
|
|
553
|
-
} else if (!fs.existsSync(path.join(root, 'skills', 'fde', 'references', '
|
|
554
|
-
fail('skills/fde/references/
|
|
565
|
+
} else if (!fs.existsSync(path.join(root, 'skills', 'fde', 'references', 'connect.md'))) {
|
|
566
|
+
fail('skills/fde/references/connect.md missing')
|
|
555
567
|
} else {
|
|
556
568
|
for (const recipe of ['file.md', 'granola.md', 'slack.md', 'notion.md']) {
|
|
557
569
|
if (!fs.existsSync(path.join(root, 'mcp', 'recipes', recipe))) fail(`mcp/recipes/${recipe} missing`)
|