fdeops 3.17.0 → 3.21.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/AGENTS.md +1 -1
- package/README.md +160 -149
- package/adapters/AGENTS.md +1 -1
- package/adapters/GEMINI.md +1 -1
- package/adapters/LOCAL-LLM.md +5 -5
- package/adapters/README.md +1 -1
- package/adapters/copilot-instructions.md +1 -1
- package/adapters/cursor.fde.mdc +1 -1
- package/bin/check.js +29 -10
- package/bin/fde.js +7 -7
- package/bin/lib/trust.js +4 -2
- package/mcp/fdeops-ingest/package.json +1 -1
- package/package.json +2 -2
- package/plugin.json +2 -2
- package/skills/fde/SKILL.md +34 -32
- 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 +23 -9
- package/skills/fde/references/earn-trust.md +1 -1
- package/skills/fde/references/encode-pattern.md +4 -3
- package/skills/fde/references/eval-pack.md +4 -4
- package/skills/fde/references/hold-scope.md +1 -1
- package/skills/fde/references/ingest.md +1 -1
- package/skills/fde/references/land.md +5 -5
- package/skills/fde/references/pick-three.md +1 -1
- package/skills/fde/references/plan.md +1 -1
- package/skills/fde/references/poc.md +8 -3
- package/skills/fde/references/readout.md +5 -4
- package/skills/fde/references/red-team.md +1 -1
- package/skills/fde/references/rescue.md +3 -2
- package/skills/fde/references/review.md +3 -3
- package/skills/fde/references/rollback.md +1 -1
- package/skills/fde/references/runbook.md +5 -3
- package/skills/fde/references/score-use-cases.md +1 -1
- package/skills/fde/references/ship.md +11 -3
- package/skills/fde/references/switch-clients.md +1 -1
- package/skills/fde/references/test-assumptions.md +19 -8
- package/skills/fde/references/three-options.md +18 -11
- package/skills/fde/references/what-breaks.md +1 -1
- package/skills/fde/references/who-decides.md +1 -1
- package/templates/.fde/README.md +1 -1
- package/templates/.fde/assumptions.md +3 -2
- package/templates/.fde/terrain.md +1 -1
package/AGENTS.md
CHANGED
|
@@ -4,7 +4,7 @@ This repository **is** fdeops - the engagement record for Forward Deployed Engin
|
|
|
4
4
|
|
|
5
5
|
## If you are helping use fdeops in an engagement
|
|
6
6
|
|
|
7
|
-
Route via **`@fde`** - read `skills/fde/SKILL.md` (the single source of truth),
|
|
7
|
+
Route via **`@fde`** - read `skills/fde/SKILL.md` (the single source of truth), route to one `references/*.md`, do the work, and write `.fde/` memory. Never ask the human to pick a skill. Other tools get the same behavior through thin pointer files in [`adapters/`](adapters/README.md).
|
|
8
8
|
|
|
9
9
|
## If you are contributing to this repository
|
|
10
10
|
|
package/README.md
CHANGED
|
@@ -2,89 +2,76 @@
|
|
|
2
2
|
|
|
3
3
|
**Forward deployed engineering skills for AI coding agents.**
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
You're on a customer site. The AI coding agent writes code in their repo. This kit is the work around that code: the brief, who can say yes, proof on their staging then live, whether they signed off, whether they can run it after you leave.
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
Notes stay on your laptop. Their repo stays theirs. You confirm before anything is written down.
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
## Commands
|
|
12
|
-
|
|
13
|
-
Each command loads the same `@fde` skill. You never pick from 31 names.
|
|
9
|
+
<img width="1536" height="1024" alt="fdeops" src="https://github.com/user-attachments/assets/2bcb8739-55ee-445d-8a1a-8b38433b7b58" />
|
|
14
10
|
|
|
15
|
-
|
|
16
|
-
|-------------------|---------|-----------|
|
|
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 |
|
|
11
|
+
---
|
|
23
12
|
|
|
24
|
-
|
|
13
|
+
## Quick Start
|
|
25
14
|
|
|
26
|
-
|
|
27
|
-
|-------------------|---------|-----------|
|
|
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 |
|
|
30
|
-
| After a meeting | `/debrief` | Notes into the record |
|
|
31
|
-
| Prep before the meeting | `/prep` | One page from the record |
|
|
32
|
-
| Friday sponsor update | `/readout` | Promised, measured, accepted |
|
|
15
|
+
**Try it first, nothing installed.** In any repo:
|
|
33
16
|
|
|
34
|
-
|
|
17
|
+
```bash
|
|
18
|
+
npx fdeops scan
|
|
19
|
+
```
|
|
35
20
|
|
|
36
|
-
|
|
21
|
+
Two minutes. It prints what to look at on day one and the questions to ask. Local only, nothing written.
|
|
37
22
|
|
|
38
|
-
|
|
23
|
+
**Then install the skill:**
|
|
39
24
|
|
|
40
25
|
```bash
|
|
41
26
|
npx skills add suboss87/fdeops --skill fde
|
|
42
27
|
```
|
|
43
28
|
|
|
44
|
-
|
|
29
|
+
One chat. Name the client:
|
|
45
30
|
|
|
46
31
|
```text
|
|
47
|
-
@fde this is
|
|
32
|
+
@fde this is client01
|
|
48
33
|
```
|
|
49
34
|
|
|
50
|
-
Paste kickoff notes in the same thread. `@fde`
|
|
35
|
+
That creates `~/fde-engagements/client01/.fde/` on your laptop. Paste kickoff notes in the same thread. `@fde` picks what to check. You still decide.
|
|
36
|
+
|
|
37
|
+
Day to day: [docs/USAGE.md](docs/USAGE.md).
|
|
51
38
|
|
|
52
39
|
<details>
|
|
53
|
-
<summary><b>Claude Code
|
|
40
|
+
<summary><b>Claude Code</b></summary>
|
|
54
41
|
|
|
55
42
|
```text
|
|
56
43
|
/plugin marketplace add suboss87/fdeops
|
|
57
44
|
/plugin install fdeops@fdeops
|
|
58
45
|
```
|
|
59
46
|
|
|
60
|
-
Hooks
|
|
47
|
+
Hooks resume where you left off. Slash commands match the table below.
|
|
61
48
|
|
|
62
49
|
</details>
|
|
63
50
|
|
|
64
51
|
<details>
|
|
65
52
|
<summary><b>Cursor</b></summary>
|
|
66
53
|
|
|
54
|
+
After the skill install, in the **client repo** you have open (pointer, not a second pack):
|
|
55
|
+
|
|
67
56
|
```bash
|
|
68
|
-
npx
|
|
57
|
+
npx fdeops adapters .
|
|
69
58
|
```
|
|
70
59
|
|
|
71
|
-
|
|
60
|
+
See [adapters/](adapters/README.md).
|
|
72
61
|
|
|
73
62
|
</details>
|
|
74
63
|
|
|
75
64
|
<details>
|
|
76
|
-
<summary><b>
|
|
65
|
+
<summary><b>Air-gap, PATH, override</b></summary>
|
|
77
66
|
|
|
78
67
|
```bash
|
|
79
|
-
|
|
68
|
+
git clone https://github.com/suboss87/fdeops.git && node bin/install.js
|
|
80
69
|
```
|
|
81
70
|
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
Fallback if the agent cannot bind:
|
|
71
|
+
If the agent cannot create the folder:
|
|
85
72
|
|
|
86
73
|
```bash
|
|
87
|
-
npx fdeops resume --init
|
|
74
|
+
npx fdeops resume --init client01 # ~/fde-engagements/client01
|
|
88
75
|
```
|
|
89
76
|
|
|
90
77
|
Requires Node.js >= 18. Override: `FDEOPS_ENGAGEMENT`. See [docs/install.md](docs/install.md). Try the loop: `npx fdeops demo`.
|
|
@@ -93,71 +80,94 @@ Requires Node.js >= 18. Override: `FDEOPS_ENGAGEMENT`. See [docs/install.md](doc
|
|
|
93
80
|
|
|
94
81
|
---
|
|
95
82
|
|
|
83
|
+
## Commands
|
|
84
|
+
|
|
85
|
+
One command per stage. Skills load automatically.
|
|
86
|
+
|
|
87
|
+
Six stages, same order every job: Land, Discover, Plan, Ship, Outcome, Close.
|
|
88
|
+
|
|
89
|
+
| What you're doing | Command | Stage |
|
|
90
|
+
|-------------------|---------|-------|
|
|
91
|
+
| First days. Get the brief. Name who signs. | `/brief` | Land |
|
|
92
|
+
| Check the brief is the real job. | `/discover` | Discover |
|
|
93
|
+
| Sequence from done, not from the ticket. | `/plan` | Plan |
|
|
94
|
+
| Prove it on their staging, then go live. | `/ship` | Ship |
|
|
95
|
+
| What you promised, measured, and who accepted. | `/outcome` | Outcome |
|
|
96
|
+
| Hand it over. They run it without you. | `/close` | Close |
|
|
97
|
+
|
|
98
|
+
Same `@fde`, when you need them: `/debrief` (notes into the record), `/prep` (one page before you walk in), `/trust` (process gap, or they stopped trusting you), `/receipts` (a dated line, or it did not happen), `/readout` (Friday page for the sponsor; not a seventh stage).
|
|
99
|
+
|
|
100
|
+
You can also just say it: naming a client, a POC, changing their checkout, going live, asking what was agreed. A typo in a repo that is not a client job can skip this. A named client, a POC, or go-live cannot.
|
|
101
|
+
|
|
102
|
+
---
|
|
103
|
+
|
|
96
104
|
## All 30 Skills
|
|
97
105
|
|
|
98
|
-
|
|
106
|
+
Thirty situations, grouped by stage. Not prompts - each one has steps, a file it writes, and a checkpoint with you. Type English or a slash command. `@fde` opens the matching skill. You never pick one by name.
|
|
107
|
+
|
|
108
|
+
Full detail: [docs/skills-reference.md](docs/skills-reference.md).
|
|
99
109
|
|
|
100
|
-
### Land
|
|
110
|
+
### Land
|
|
101
111
|
|
|
102
|
-
| Skill | What
|
|
112
|
+
| Skill | What it does | Use when |
|
|
103
113
|
|--------|--------------|----------|
|
|
104
|
-
| [land](skills/fde/references/land.md) | Interrogate the brief
|
|
105
|
-
| [audit](skills/fde/references/audit.md) | Verify claims
|
|
106
|
-
| [who-decides](skills/fde/references/who-decides.md) |
|
|
107
|
-
| [earn-trust](skills/fde/references/earn-trust.md) |
|
|
108
|
-
| [hold-scope](skills/fde/references/hold-scope.md) |
|
|
114
|
+
| [land](skills/fde/references/land.md) | Interrogate the brief | New client, first meeting, just got the brief |
|
|
115
|
+
| [audit](skills/fde/references/audit.md) | Verify inherited claims | Taking over, previous consultant left |
|
|
116
|
+
| [who-decides](skills/fde/references/who-decides.md) | Map decision rights | Need to know who matters |
|
|
117
|
+
| [earn-trust](skills/fde/references/earn-trust.md) | Earn access | Need access or credibility |
|
|
118
|
+
| [hold-scope](skills/fde/references/hold-scope.md) | Hold scope | "Also can you…", timeline unchanged |
|
|
109
119
|
|
|
110
|
-
### Discover
|
|
120
|
+
### Discover
|
|
111
121
|
|
|
112
|
-
| Skill | What
|
|
122
|
+
| Skill | What it does | Use when |
|
|
113
123
|
|--------|--------------|----------|
|
|
114
|
-
| [discover](skills/fde/references/discover.md) |
|
|
115
|
-
| [test-assumptions](skills/fde/references/test-assumptions.md) |
|
|
116
|
-
| [score-use-cases](skills/fde/references/score-use-cases.md) |
|
|
117
|
-
| [poc](skills/fde/references/poc.md) |
|
|
124
|
+
| [discover](skills/fde/references/discover.md) | Frame the problem | Brief feels wrong, shadow processes |
|
|
125
|
+
| [test-assumptions](skills/fde/references/test-assumptions.md) | Test assumptions | Brief feels too neat |
|
|
126
|
+
| [score-use-cases](skills/fde/references/score-use-cases.md) | Score use cases | Everything is P0 |
|
|
127
|
+
| [poc](skills/fde/references/poc.md) | Validate the solution | POC, spike, need to de-risk |
|
|
118
128
|
|
|
119
|
-
### Plan
|
|
129
|
+
### Plan
|
|
120
130
|
|
|
121
|
-
| Skill | What
|
|
131
|
+
| Skill | What it does | Use when |
|
|
122
132
|
|--------|--------------|----------|
|
|
123
|
-
| [plan](skills/fde/references/plan.md) |
|
|
124
|
-
| [business-case](skills/fde/references/business-case.md) |
|
|
125
|
-
| [three-options](skills/fde/references/three-options.md) |
|
|
126
|
-
| [pick-three](skills/fde/references/pick-three.md) |
|
|
133
|
+
| [plan](skills/fde/references/plan.md) | Sequence the work | What order, what is done |
|
|
134
|
+
| [business-case](skills/fde/references/business-case.md) | Build the business case | Defend budget or timeline |
|
|
135
|
+
| [three-options](skills/fde/references/three-options.md) | Generate options | "What should we do?" |
|
|
136
|
+
| [pick-three](skills/fde/references/pick-three.md) | Prioritize three | Everything is urgent |
|
|
127
137
|
|
|
128
|
-
### Ship
|
|
138
|
+
### Ship
|
|
129
139
|
|
|
130
|
-
| Skill | What
|
|
140
|
+
| Skill | What it does | Use when |
|
|
131
141
|
|--------|--------------|----------|
|
|
132
|
-
| [ship](skills/fde/references/ship.md) |
|
|
133
|
-
| [what-breaks](skills/fde/references/what-breaks.md) |
|
|
134
|
-
| [rescue](skills/fde/references/rescue.md) |
|
|
135
|
-
| [review](skills/fde/references/review.md) |
|
|
136
|
-
| [rollback](skills/fde/references/rollback.md) |
|
|
142
|
+
| [ship](skills/fde/references/ship.md) | Deliver the increment | Building, updating, or going live |
|
|
143
|
+
| [what-breaks](skills/fde/references/what-breaks.md) | Assess impact | Touching shared infrastructure |
|
|
144
|
+
| [rescue](skills/fde/references/rescue.md) | Resolve the incident | Down, or they went quiet |
|
|
145
|
+
| [review](skills/fde/references/review.md) | Review the change | Before merge, scope creep |
|
|
146
|
+
| [rollback](skills/fde/references/rollback.md) | Rehearse rollback | "We can always revert" |
|
|
137
147
|
|
|
138
|
-
### Outcome
|
|
148
|
+
### Outcome
|
|
139
149
|
|
|
140
|
-
| Skill | What
|
|
150
|
+
| Skill | What it does | Use when |
|
|
141
151
|
|--------|--------------|----------|
|
|
142
|
-
| [readout](skills/fde/references/readout.md) |
|
|
143
|
-
| [demo-prep](skills/fde/references/demo-prep.md) |
|
|
144
|
-
| [debrief](skills/fde/references/debrief.md) |
|
|
145
|
-
| [board-memo](skills/fde/references/board-memo.md) |
|
|
146
|
-
| [dashboard](skills/fde/references/dashboard.md) |
|
|
147
|
-
| [ingest](skills/fde/references/ingest.md) |
|
|
148
|
-
| [connect](skills/fde/references/connect.md) |
|
|
152
|
+
| [readout](skills/fde/references/readout.md) | Report the outcome | Friday, sponsor update |
|
|
153
|
+
| [demo-prep](skills/fde/references/demo-prep.md) | Prepare the demo | Demo or exec walkthrough |
|
|
154
|
+
| [debrief](skills/fde/references/debrief.md) | Capture the meeting | Just left a meeting |
|
|
155
|
+
| [board-memo](skills/fde/references/board-memo.md) | Brief the board | Justify continued investment |
|
|
156
|
+
| [dashboard](skills/fde/references/dashboard.md) | View the portfolio | All my customers |
|
|
157
|
+
| [ingest](skills/fde/references/ingest.md) | Ingest sources | Transcript, Notion, Slack |
|
|
158
|
+
| [connect](skills/fde/references/connect.md) | Connect a source | Connect Granola |
|
|
149
159
|
|
|
150
|
-
### Close
|
|
160
|
+
### Close
|
|
151
161
|
|
|
152
|
-
| Skill | What
|
|
162
|
+
| Skill | What it does | Use when |
|
|
153
163
|
|--------|--------------|----------|
|
|
154
|
-
| [close](skills/fde/references/close.md) |
|
|
155
|
-
| [runbook](skills/fde/references/runbook.md) |
|
|
156
|
-
| [switch-clients](skills/fde/references/switch-clients.md) | Switch
|
|
157
|
-
| [encode-pattern](skills/fde/references/encode-pattern.md) |
|
|
158
|
-
| [red-team](skills/fde/references/red-team.md) |
|
|
164
|
+
| [close](skills/fde/references/close.md) | Transfer operations | Wrapping up |
|
|
165
|
+
| [runbook](skills/fde/references/runbook.md) | Write the runbook | They must operate without you |
|
|
166
|
+
| [switch-clients](skills/fde/references/switch-clients.md) | Switch engagements | 2+ clients |
|
|
167
|
+
| [encode-pattern](skills/fde/references/encode-pattern.md) | Encode the pattern | It will apply again |
|
|
168
|
+
| [red-team](skills/fde/references/red-team.md) | Challenge the plan | "Poke holes in this" |
|
|
159
169
|
|
|
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)
|
|
170
|
+
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). AI companion (not a sixth overlay): [eval-pack](skills/fde/references/eval-pack.md).
|
|
161
171
|
|
|
162
172
|
Optional pull: you add the source MCP; we **pull** on request. [mcp/recipes/](mcp/recipes/)
|
|
163
173
|
|
|
@@ -165,31 +175,84 @@ Optional pull: you add the source MCP; we **pull** on request. [mcp/recipes/](mc
|
|
|
165
175
|
|
|
166
176
|
## How Skills Work
|
|
167
177
|
|
|
168
|
-
One
|
|
178
|
+
One `@fde`. One file per situation. One folder per client.
|
|
169
179
|
|
|
170
180
|
```
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
▼
|
|
174
|
-
skills/fde/SKILL.md hosts load this one file
|
|
181
|
+
"@fde this is client01" creates ~/fde-engagements/client01/.fde/
|
|
182
|
+
/brief or English the AI coding agent loads skills/fde/SKILL.md
|
|
175
183
|
│ routes. you never pick a skill by name
|
|
176
184
|
▼
|
|
177
|
-
references
|
|
185
|
+
references/<one>.md one skill, then stop
|
|
178
186
|
│
|
|
179
187
|
▼
|
|
180
188
|
fde CLI (local) dates, gates, redacts. no network
|
|
181
189
|
│ after you confirm
|
|
182
190
|
▼
|
|
183
|
-
~/fde-engagements
|
|
191
|
+
~/fde-engagements/client01/.fde/
|
|
184
192
|
```
|
|
185
193
|
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
- **Progressive disclosure.** `SKILL.md` is the entry point. One `references/*.md` loads when routed.
|
|
190
|
-
- **Local CLI.** Writes and status cost zero model tokens. The AI coding agent runs it.
|
|
194
|
+
**A dated line, or it did not happen.** Promised → measured → accepted. If it is not in `.fde/`, it is not on the record.
|
|
195
|
+
|
|
196
|
+
**Confirm, then it is written.** The CLI stays on your laptop: git and files, no network. The AI coding agent runs the command. You say yes. Then it is in the folder.
|
|
191
197
|
|
|
192
|
-
Change hosts, install `@fde` on the new one,
|
|
198
|
+
**The record is on your laptop.** Change hosts, install `@fde` on the new one, keep talking. The notes are not inside any vendor.
|
|
199
|
+
|
|
200
|
+
One skill hosts load: `skills/fde/SKILL.md`. It opens one file in `skills/fde/references/` and stops. Slash commands live in `.claude/commands/`. The local CLI is `bin/fde.js` (git + files, no network). Layout: [docs/REPO_LAYOUT.md](docs/REPO_LAYOUT.md).
|
|
201
|
+
|
|
202
|
+
---
|
|
203
|
+
|
|
204
|
+
## Engagement memory (`.fde/`)
|
|
205
|
+
|
|
206
|
+
One folder per client. Plain markdown. Grep it, copy it, take it into a meeting.
|
|
207
|
+
|
|
208
|
+
| File | Holds |
|
|
209
|
+
|------|-------|
|
|
210
|
+
| `context.md` | Where you are |
|
|
211
|
+
| `brief.md` / `success.md` | What they asked; what “done” is and who signs |
|
|
212
|
+
| `reality.md` / `terrain.md` | The real problem; the map |
|
|
213
|
+
| `stakeholders.md` | `[signal:green\|amber\|red]` |
|
|
214
|
+
| `trust-profile.md` | Sacred data, AI policy, approval chain |
|
|
215
|
+
| `decisions.md` / `risks.md` / `delivery.md` | Dated choices; live risks; what shipped and how it rolls back |
|
|
216
|
+
|
|
217
|
+
Schema: [docs/schema.md](docs/schema.md). Local HTML: `npx fdeops dashboard`.
|
|
218
|
+
|
|
219
|
+
---
|
|
220
|
+
|
|
221
|
+
## Who this is for
|
|
222
|
+
|
|
223
|
+
You sit with a customer's team. An AI coding agent writes in their repo. You need a record of the brief, who can say yes, what went live, and whether they signed off.
|
|
224
|
+
|
|
225
|
+
If you ship your own company's product from HQ, with no customer team that has to run it after you leave, you do not need this kit.
|
|
226
|
+
|
|
227
|
+
---
|
|
228
|
+
|
|
229
|
+
## Your data stays yours
|
|
230
|
+
|
|
231
|
+
The **CLI** is local: git + files, no network, no telemetry. The **host model** sees `.fde/` the agent loads (usually a bounded `context.md`) and any client code you open. It must not see `<private>` blocks - redacted from CLI, dashboard, and hooks; do not paste them or open them with file tools. Nothing is written until you confirm. `~/fde-engagements` is in `$HOME`; iCloud/Dropbox is an NDA incident waiting.
|
|
232
|
+
|
|
233
|
+
[PRIVACY.md](PRIVACY.md) · [SECURITY.md](SECURITY.md)
|
|
234
|
+
|
|
235
|
+
---
|
|
236
|
+
|
|
237
|
+
## Why FDEOps?
|
|
238
|
+
|
|
239
|
+
AI coding agents are built for a repo, not for a client. Left alone they skip who signs, whether the brief is true, and whether anyone accepted the number. Monday they start from the ticket again.
|
|
240
|
+
|
|
241
|
+
This is the kit you take on site. `@fde` runs the client work around the code. A local command dates every decision. The notes are markdown on your laptop. You confirm; then it is on the record.
|
|
242
|
+
|
|
243
|
+
---
|
|
244
|
+
|
|
245
|
+
## Principles
|
|
246
|
+
|
|
247
|
+
- **Who signs** - name them in the first days
|
|
248
|
+
- **Brief vs real job** - check the floor, not only the slide
|
|
249
|
+
- **Back from done** - sequence from signed-off, not from the ticket
|
|
250
|
+
- **Their staging then live** - prove it where they operate, then go live
|
|
251
|
+
- **Promised, measured, accepted** - a number nobody signed is claimed, not delivered
|
|
252
|
+
- **They run it** - if they cannot operate it without you, you are not done
|
|
253
|
+
- **A dated line, or it did not happen** - these files get defended in the room
|
|
254
|
+
- **One customer, one folder** - context never bleeds
|
|
255
|
+
- **The kit says what to check. You still decide.**
|
|
193
256
|
|
|
194
257
|
---
|
|
195
258
|
|
|
@@ -252,7 +315,7 @@ fdeops/
|
|
|
252
315
|
├── bin/ # local CLI: git + files, no network
|
|
253
316
|
├── hooks/ # session-start / session-stop / pre-compact
|
|
254
317
|
├── adapters/ # Cursor, Gemini, Copilot, Codex pointers
|
|
255
|
-
├── templates/.fde/ # memory files created on
|
|
318
|
+
├── templates/.fde/ # memory files created on first client
|
|
256
319
|
├── examples/ # fictional walkthroughs
|
|
257
320
|
├── mcp/ # optional ingest + source recipes
|
|
258
321
|
├── evals/ # routing checks
|
|
@@ -261,58 +324,6 @@ fdeops/
|
|
|
261
324
|
|
|
262
325
|
---
|
|
263
326
|
|
|
264
|
-
## Why FDEOps?
|
|
265
|
-
|
|
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.
|
|
267
|
-
|
|
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.
|
|
269
|
-
|
|
270
|
-
---
|
|
271
|
-
|
|
272
|
-
## Engagement memory (`.fde/`)
|
|
273
|
-
|
|
274
|
-
One folder per client. Plain markdown. Grep it, copy it, defend it.
|
|
275
|
-
|
|
276
|
-
| File | Holds |
|
|
277
|
-
|------|-------|
|
|
278
|
-
| `context.md` | Where you are |
|
|
279
|
-
| `brief.md` / `success.md` | What they asked; what “done” is and who signs |
|
|
280
|
-
| `reality.md` / `terrain.md` | The real problem; the map |
|
|
281
|
-
| `stakeholders.md` | `[signal:green\|amber\|red]` |
|
|
282
|
-
| `trust-profile.md` | Sacred data, AI policy, approval chain |
|
|
283
|
-
| `decisions.md` / `risks.md` / `delivery.md` | Dated choices; live risks; what shipped and how it rolls back |
|
|
284
|
-
|
|
285
|
-
Schema: [docs/schema.md](docs/schema.md). Local HTML: `npx fdeops dashboard`.
|
|
286
|
-
|
|
287
|
-
---
|
|
288
|
-
|
|
289
|
-
## Who this is for
|
|
290
|
-
|
|
291
|
-
You embed with a customer and an AI coding agent. Take this on the ground. Discovery through signed outcome lives in `@fde`. One `.fde/` per client so they do not blur.
|
|
292
|
-
|
|
293
|
-
If you only write code in your own repo with no client record to defend, you do not need this kit.
|
|
294
|
-
|
|
295
|
-
---
|
|
296
|
-
|
|
297
|
-
## Your data stays yours
|
|
298
|
-
|
|
299
|
-
Local only - `git` + files, no network, no telemetry. Plain markdown. The model sees client code only when you point the AI coding agent at it. `<private>` is redacted from CLI, dashboard, and hooks. Nothing is written until you confirm. `~/fde-engagements` is in `$HOME`; iCloud/Dropbox is an NDA incident waiting.
|
|
300
|
-
|
|
301
|
-
[PRIVACY.md](PRIVACY.md) · [SECURITY.md](SECURITY.md)
|
|
302
|
-
|
|
303
|
-
---
|
|
304
|
-
|
|
305
|
-
## Principles
|
|
306
|
-
|
|
307
|
-
- **The artifact is the memory** - producing the work and recording it are one action
|
|
308
|
-
- **Ground loop** - name the change, characterise their code, prove it on their staging, go live, log the outcome
|
|
309
|
-
- **Skills, not autonomy** - the kit says what to check; judgment stays yours
|
|
310
|
-
- **Brief is a hypothesis** - discover before building the wrong thing
|
|
311
|
-
- **Evidence on every claim** - these files get defended in the room
|
|
312
|
-
- **One customer, one folder** - context never bleeds
|
|
313
|
-
|
|
314
|
-
---
|
|
315
|
-
|
|
316
327
|
## Contributing
|
|
317
328
|
|
|
318
329
|
**[Subash Natarajan](https://www.linkedin.com/in/subashn/)**. [Issues](https://github.com/suboss87/fdeops/issues) · [Discussions](https://github.com/suboss87/fdeops/discussions) · [CONTRIBUTING.md](CONTRIBUTING.md) · [Code of Conduct](CODE_OF_CONDUCT.md)
|
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
|
|
|
@@ -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)
|
|
@@ -153,8 +153,8 @@ ok(`router dispatch (${mentioned.length} reference targets verified) + memory co
|
|
|
153
153
|
}
|
|
154
154
|
if (!routed.size) fail('check.js could not parse the SKILL.md routing table')
|
|
155
155
|
|
|
156
|
-
// docs/skills-reference.md is the canonical per-
|
|
157
|
-
//
|
|
156
|
+
// docs/skills-reference.md is the canonical per-skill list: one row per
|
|
157
|
+
// skill inside the six stage tables, ending at the Overlays section.
|
|
158
158
|
const reference = read('docs/skills-reference.md')
|
|
159
159
|
const documented = new Set()
|
|
160
160
|
let documentedRows = 0
|
|
@@ -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,16 +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
206
|
|
|
207
|
-
// The on-site change loop lives in ship.md. A sibling
|
|
207
|
+
// The on-site change loop lives in ship.md. A sibling skill is a split.
|
|
208
208
|
for (const dead of ['small-prs.md', 'thin-slices.md', 'implement.md']) {
|
|
209
209
|
if (fs.existsSync(path.join(refDir, dead))) {
|
|
210
210
|
fail(`${dead} must not exist - that craft lives in ship.md`)
|
|
211
211
|
}
|
|
212
212
|
}
|
|
213
|
-
ok('ship is one
|
|
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')
|
|
214
221
|
}
|
|
215
222
|
|
|
216
223
|
const install = read('bin/install.js')
|
|
@@ -349,6 +356,18 @@ for (const rx of derivativeFraming) {
|
|
|
349
356
|
if (/docs\/internal|PMF_360/i.test(readme)) {
|
|
350
357
|
fail('README must not link docs/internal or PMF_360')
|
|
351
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
|
+
}
|
|
352
371
|
ok('README tone')
|
|
353
372
|
|
|
354
373
|
if (fs.existsSync(path.join(root, '.codex')) || fs.existsSync(path.join(root, '.opencode'))) {
|