fdeops 3.5.6 → 3.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +100 -114
- package/adapters/AGENTS.md +1 -1
- package/adapters/GEMINI.md +1 -1
- package/adapters/copilot-instructions.md +1 -1
- package/adapters/cursor.fde.mdc +1 -1
- package/bin/check.js +15 -3
- package/bin/fde.js +998 -275
- package/bin/install.js +7 -1
- package/hooks/pre-compact +19 -0
- package/hooks/session-start +24 -3
- package/hooks/session-stop +23 -3
- package/package.json +1 -1
- package/skills/fde/SKILL.md +12 -11
- package/skills/fde/references/multi-customer-ops.md +8 -8
- package/skills/fde/references/red-team.md +3 -3
- package/README.md.bak +0 -227
package/README.md
CHANGED
|
@@ -1,176 +1,163 @@
|
|
|
1
|
-
#
|
|
1
|
+
# fdeops
|
|
2
2
|
|
|
3
|
-
**
|
|
3
|
+
**Your AI coding agent forgets your client every morning. fdeops remembers.**
|
|
4
4
|
|
|
5
5
|
[](https://www.npmjs.com/package/fdeops)
|
|
6
6
|
[](https://github.com/suboss87/fdeops/actions)
|
|
7
7
|
[](LICENSE)
|
|
8
8
|
[](https://nodejs.org)
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
Built for **Forward Deployed Engineers** - engineers embedded at a client, from first meeting to final handoff. Works the same for consultants, agency developers, solutions architects, and fractional CTOs.
|
|
11
11
|
|
|
12
|
-
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## The problem
|
|
15
|
+
|
|
16
|
+
Your AI coding agent's memory is scoped to a **repo**. Client work isn't: one engagement spans several repos, a dozen stakeholders, and decisions made in meetings your agent never saw. That context lives in rooms, chats, and hallway conversations - nothing writes it down where your tools can use it.
|
|
17
|
+
|
|
18
|
+
fdeops adds the missing layer: memory scoped to the **client** - plain markdown at `~/fde-engagements/<client>/.fde/`, written as a side effect of doing the work. Local only, zero dependencies, no network, no telemetry.
|
|
19
|
+
|
|
20
|
+
## Without fdeops vs with fdeops
|
|
13
21
|
|
|
14
|
-
|
|
22
|
+
| Moment | Without fdeops | With fdeops |
|
|
23
|
+
|---|---|---|
|
|
24
|
+
| **Monday morning** | Re-paste last week's context, re-explain the stakeholders | A hook loads the engagement at session start - the agent opens knowing the deadline and the open thread |
|
|
25
|
+
| **After a meeting** | Notes rot in a scratch file | `fde debrief` routes decisions, risks, deliveries, and contacts into the record, dated |
|
|
26
|
+
| **Scope dispute** | "Small" additions absorbed silently; no record when the sponsor asks | `fde receipts <term>` answers "when did we agree to that?" with dates |
|
|
27
|
+
| **Quiet stakeholder** | Noticed three weeks too late | `fde log contact --signal amber` the day it happens; `fde status` surfaces it |
|
|
28
|
+
| **Multiple clients** | Details blur across engagements | One folder per client, never cross-contaminated |
|
|
15
29
|
|
|
16
30
|
---
|
|
17
31
|
|
|
18
32
|
## Quickstart
|
|
19
33
|
|
|
20
|
-
|
|
34
|
+
**1. Install** (Claude Code)
|
|
21
35
|
|
|
22
|
-
|
|
23
|
-
```
|
|
36
|
+
```text
|
|
24
37
|
/plugin marketplace add suboss87/fdeops
|
|
25
38
|
/plugin install fdeops@fdeops
|
|
26
39
|
```
|
|
27
40
|
|
|
28
|
-
**
|
|
29
|
-
```bash
|
|
30
|
-
npx fdeops adapters .
|
|
31
|
-
```
|
|
32
|
-
|
|
33
|
-
**Local LLMs** - load `skills/fde/SKILL.md` as system prompt ([guide](adapters/LOCAL-LLM.md))
|
|
34
|
-
|
|
35
|
-
### 2. Create your first engagement
|
|
41
|
+
**2. Bind your client workspace** - run once, inside the workspace:
|
|
36
42
|
|
|
37
43
|
```bash
|
|
38
|
-
|
|
39
|
-
export FDEOPS_ENGAGEMENT=~/fde-engagements/my-client/.fde # point your tool at it
|
|
44
|
+
fde resume --init garvey
|
|
40
45
|
```
|
|
41
46
|
|
|
42
|
-
|
|
47
|
+
fdeops' `--init` creates the engagement memory at `~/fde-engagements/garvey/.fde/` (plain markdown, private to your machine) and binds this workspace to it. The hooks read that binding - context auto-loads at session start, auto-captures at session end. That is the whole setup.
|
|
43
48
|
|
|
44
|
-
|
|
49
|
+
**3. Work**
|
|
45
50
|
|
|
46
|
-
```
|
|
47
|
-
@fde I just got the brief. New client, payments platform,
|
|
51
|
+
```text
|
|
52
|
+
@fde I just got the brief. New client, payments platform, they want it live before their Q3 audit.
|
|
48
53
|
```
|
|
49
54
|
|
|
50
|
-
Describe what's happening
|
|
55
|
+
`@fde` is the one skill fdeops installs. Describe what's happening; it routes to the right field method and the memory writes itself. Full workflow: [docs/USAGE.md](docs/USAGE.md).
|
|
51
56
|
|
|
52
|
-
|
|
53
|
-
>
|
|
54
|
-
> **Other install methods:** `npx skills add suboss87/fdeops` (Skills CLI) or `git clone https://github.com/suboss87/fdeops.git && cd fdeops && node bin/install.js` (manual). Full install details: [docs/install.md](docs/install.md).
|
|
57
|
+
Not ready to install? `npx fdeops scan` runs on any repo you can read - day-1 recon (pure `git` + file reads, no config, no account) that maps hotspots, test gaps, and reverted attempts, and ends with the ASK ON DAY 1 questions the brief never mentions.
|
|
55
58
|
|
|
56
|
-
|
|
59
|
+
<details>
|
|
60
|
+
<summary><strong>Other install paths</strong> - Cursor, Codex, Copilot, Gemini CLI, local LLMs, air-gapped</summary>
|
|
57
61
|
|
|
58
|
-
|
|
62
|
+
- **Cursor / Codex / Copilot / Gemini CLI:** `npx fdeops adapters .` drops a thin pointer to the same `@fde` skill - [adapters/](adapters/README.md)
|
|
63
|
+
- **Local LLMs (Ollama, LM Studio, llama.cpp):** load `skills/fde/SKILL.md` as the system prompt - [guide](adapters/LOCAL-LLM.md)
|
|
64
|
+
- **Skills CLI:** `npx skills add suboss87/fdeops`
|
|
65
|
+
- **Manual / air-gapped:** `git clone https://github.com/suboss87/fdeops.git && cd fdeops && node bin/install.js`
|
|
66
|
+
- **Requires:** [Node.js](https://nodejs.org) >= 18 for the CLI and adapters; the Claude Code plugin install does not need Node separately.
|
|
67
|
+
- **Advanced:** the `FDEOPS_ENGAGEMENT` env var overrides the workspace registry - only for unusual setups. Full matrix: [docs/install.md](docs/install.md)
|
|
59
68
|
|
|
60
|
-
|
|
61
|
-
|----------|-------------------|
|
|
62
|
-
| **Forward Deployed Engineer** | The role this was built for. 35 skills across the full engagement lifecycle - land, build, ship, close. |
|
|
63
|
-
| **Consultant or contractor at a client site** | Every session, you re-explain context. fdeops remembers for you. |
|
|
64
|
-
| **Solutions architect bridging strategy and code** | You navigate politics AND architecture. fdeops has methods for both. |
|
|
65
|
-
| **Agency engineer running 3-5 clients** | Client details blur together. One `.fde/` per customer, never cross-contaminated. |
|
|
66
|
-
| **Technical founder doing client work solo** | You ARE the team. The agent becomes your second brain. |
|
|
69
|
+
</details>
|
|
67
70
|
|
|
68
71
|
---
|
|
69
72
|
|
|
70
73
|
## How it works
|
|
71
74
|
|
|
72
|
-
|
|
73
|
-
flowchart LR
|
|
74
|
-
A["@fde"] --> B{"Describe\nyour situation"}
|
|
75
|
-
B --> C["Embed & Trust"]
|
|
76
|
-
B --> D["Discover & Diagnose"]
|
|
77
|
-
B --> E["Plan & Align"]
|
|
78
|
-
B --> F["Build & Guard"]
|
|
79
|
-
B --> G["Ship & Verify"]
|
|
80
|
-
B --> H["Operate & Close"]
|
|
81
|
-
C --> I[".fde/ memory\n(written as you work)"]
|
|
82
|
-
D --> I
|
|
83
|
-
E --> I
|
|
84
|
-
F --> I
|
|
85
|
-
G --> I
|
|
86
|
-
H --> I
|
|
87
|
-
I --> J["Next session\nloads automatically"]
|
|
88
|
-
```
|
|
75
|
+
Two hooks and one router, on top of the fieldbook:
|
|
89
76
|
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
77
|
+
- **Session start** - a hook loads where you left off into your AI coding agent's context
|
|
78
|
+
- **Session end** - a hook captures what happened back into the fieldbook
|
|
79
|
+
- **After meetings** - `fde debrief notes.md` routes lines prefixed `decision:` / `risk:` / `delivery:` / `contact:` to the matching file, dated; everything else lands as a dated block in `context.md`
|
|
80
|
+
- **On top of the memory** - the `@fde` skill routes six phase verbs:
|
|
94
81
|
|
|
95
|
-
|
|
82
|
+
| Verb | When |
|
|
83
|
+
|------|------|
|
|
84
|
+
| **land** | First days at a new client - interrogate the brief, map stakeholders, define success |
|
|
85
|
+
| **discover** | The brief feels wrong - find the real problem, with evidence from the repo |
|
|
86
|
+
| **plan** | Scope agreed - sequence it backwards from success, in PR-sized slices |
|
|
87
|
+
| **build** | Ready to write code - declare blast radius, log deliveries as you ship |
|
|
88
|
+
| **ship** | Going to production - pre-flight, canary, tested rollback |
|
|
89
|
+
| **close** | Engagement ending - handoff doc, retrospective, receipts that survive you |
|
|
96
90
|
|
|
97
|
-
|
|
91
|
+
Overlays for regulated domains (AI, fintech, healthcare, government) activate on signal. fdeops complements your agent's native repo memory: CLAUDE.md holds how the *code* works; the fieldbook holds how the *engagement* works. Full matrix: [docs/skills.md](docs/skills.md).
|
|
98
92
|
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
## Without fdeops vs with fdeops
|
|
102
|
-
|
|
103
|
-
| | **Without fdeops** | **With fdeops** |
|
|
104
|
-
|---|-------------------|----------------|
|
|
105
|
-
| **Monday morning** | Re-paste last week's context, explain the stakeholders again | Agent opens with "last session you were on the ingest retry - CTO demo is Friday" |
|
|
106
|
-
| **Scope creep** | Five "small" additions absorbed silently, timeline slips | Receipts timestamped - you walk into the sponsor meeting with evidence |
|
|
107
|
-
| **Multiple customers** | Wrong client name in a status update, details blur | One folder per customer, context-switch protocol, cross-contamination checklist |
|
|
108
|
-
| **The sponsor meeting** | "We completed the API endpoint" | "Manual reconciliation dropped from 3 FTEs to 0.5 - here's the rollback if it turns" |
|
|
109
|
-
| **Before building** | AI builds what it thinks you meant, surprises in the PR | Agent generates the spec first, you approve in one word, zero surprises |
|
|
110
|
-
|
|
111
|
-
---
|
|
112
|
-
|
|
113
|
-
## 35 skills + 5 overlays
|
|
114
|
-
|
|
115
|
-
| Domain | Skills | What it covers |
|
|
116
|
-
|--------|--------|---------------|
|
|
117
|
-
| **Embed & Trust** | land, audit, stakeholder-radar, trust-engineering, scope-defense | First days: access, credibility, scope |
|
|
118
|
-
| **Discover & Diagnose** | discover, assumption-audit, use-case-scoring, sketch | Finding the real problem behind the brief |
|
|
119
|
-
| **Plan & Align** | plan, business-case, options-analysis, initiative-triage | Sequencing work, getting sponsor alignment |
|
|
120
|
-
| **Build & Guard** | build, incremental-build, test-on-legacy, blast-radius, debug, rescue, security-audit, observability | Building safely on their codebase |
|
|
121
|
-
| **Ship & Verify** | ship, review, rollback-drill, qa-live | Getting to production without surprises |
|
|
122
|
-
| **Operate & Close** | status, demo-prep, debrief, exec-narrative, dashboard, multi-customer-ops, close, handoff-engineering, pattern-extract, red-team | Running and ending the engagement well |
|
|
123
|
-
|
|
124
|
-
**Overlays** activate automatically when your engagement involves AI projects, executive reporting, fintech, healthcare, or government compliance.
|
|
125
|
-
|
|
126
|
-
Full skill details: [docs/skills-reference.md](docs/skills-reference.md)
|
|
93
|
+
Works with **Claude Code** - **Cursor** - **Copilot** - **Devin** - **Gemini CLI** - **Ollama** - **LM Studio** - any model that reads a markdown file.
|
|
127
94
|
|
|
128
95
|
---
|
|
129
96
|
|
|
130
97
|
## Engagement memory (`.fde/`)
|
|
131
98
|
|
|
132
|
-
|
|
99
|
+
The **fieldbook** - one folder per client, plain markdown you can read, grep, and take with you:
|
|
133
100
|
|
|
134
|
-
| File |
|
|
135
|
-
|
|
136
|
-
| `context.md` | Where you are
|
|
137
|
-
| `brief.md` | What they
|
|
138
|
-
| `
|
|
139
|
-
| `
|
|
140
|
-
| `
|
|
141
|
-
| `
|
|
142
|
-
| `trust-profile.md` | Sacred data, AI policy, approval chain | land + overlays |
|
|
143
|
-
| `decisions.md` | Plan + choices + integration contracts + sizing | plan / build / review / rescue |
|
|
144
|
-
| `risks.md` | Live risk register | all phases |
|
|
145
|
-
| `delivery.md` | What shipped, business value, rollback, pulse, adoption metrics | build / ship |
|
|
101
|
+
| File | Holds |
|
|
102
|
+
|------|-------|
|
|
103
|
+
| `context.md` | Where you are - loaded first every session |
|
|
104
|
+
| `brief.md` / `success.md` | What they asked for; what "done" means and who signs it off |
|
|
105
|
+
| `reality.md` / `terrain.md` | The real problem; the codebase map |
|
|
106
|
+
| `stakeholders.md` | Champions, resistance, `[signal:green\|amber\|red]` trust tokens |
|
|
107
|
+
| `trust-profile.md` | Sacred data, AI policy, approval chain |
|
|
108
|
+
| `decisions.md` / `risks.md` / `delivery.md` | Choices with dates; live risk register; what shipped and its rollback |
|
|
146
109
|
|
|
147
|
-
Every
|
|
110
|
+
Every entry is dated and sourced, so you can defend it in front of skeptical stakeholders. Schema: [docs/schema.md](docs/schema.md).
|
|
148
111
|
|
|
149
112
|
---
|
|
150
113
|
|
|
151
114
|
## The CLI
|
|
152
115
|
|
|
153
|
-
|
|
116
|
+
Deterministic, offline, zero tokens - the skill adds judgment on top:
|
|
154
117
|
|
|
155
118
|
```bash
|
|
156
|
-
fde scan
|
|
157
|
-
fde resume
|
|
158
|
-
fde
|
|
159
|
-
fde
|
|
160
|
-
fde
|
|
161
|
-
fde
|
|
162
|
-
fde
|
|
119
|
+
fde scan # day-1 recon + ASK ON DAY 1 questions (works via npx)
|
|
120
|
+
fde resume # load this workspace's engagement
|
|
121
|
+
fde resume --init <client> # THE setup step: create + bind an engagement
|
|
122
|
+
fde debrief notes.md # route meeting notes into memory (also reads stdin)
|
|
123
|
+
fde log decision "descope agreed with Kowalczyk"
|
|
124
|
+
fde log contact "Denise gone quiet" --signal amber
|
|
125
|
+
fde receipts <term> # dated search; no hit = a gap in the record, not proof of absence
|
|
126
|
+
fde status # portfolio triage across all clients (red > amber > green)
|
|
127
|
+
fde dashboard # render every engagement into one offline HTML fieldbook
|
|
163
128
|
```
|
|
164
129
|
|
|
130
|
+
The latest dated `[signal:...]` token per stakeholder drives the trust column in `status` and `dashboard`; signals older than 21 days show as stale.
|
|
131
|
+
|
|
165
132
|
<p align="center"><img src="media/terminal-demo.svg" alt="fde CLI - status, scan, dashboard" width="720"/></p>
|
|
166
133
|
|
|
134
|
+
`fde dashboard` renders every engagement into one offline HTML fieldbook - engagements sorted by trust, next action and open risks per client, one glance to know where to start:
|
|
135
|
+
|
|
136
|
+
<p align="center"><img width="1176" height="686" alt="fieldbook - portfolio dashboard, sorted by trust" src="https://github.com/user-attachments/assets/c9bd4b03-457e-4770-974a-0495759b1339" /></p>
|
|
137
|
+
|
|
138
|
+
---
|
|
139
|
+
|
|
140
|
+
## Who this is for
|
|
141
|
+
|
|
142
|
+
| You are... | What fdeops does for you |
|
|
143
|
+
|----------|-------------------|
|
|
144
|
+
| **Forward Deployed Engineer** | The role this was built for - the full lifecycle, first meeting to final handoff |
|
|
145
|
+
| **Consultant or contractor at a client site** | Remembers the engagement so you stop re-explaining it |
|
|
146
|
+
| **Solutions architect / engineer** | Methods for the politics as well as the architecture |
|
|
147
|
+
| **Agency developer running 3-5 clients** | One `.fde/` per client - details stop blurring |
|
|
148
|
+
| **Fractional CTO doing client work** | The fieldbook is your second brain - and your audit trail for billable work |
|
|
149
|
+
|
|
167
150
|
---
|
|
168
151
|
|
|
169
|
-
##
|
|
152
|
+
## Your data stays yours
|
|
170
153
|
|
|
171
|
-
|
|
154
|
+
- **Local only.** Pure `git` + file reads - no network calls, no telemetry, no account. Works air-gapped.
|
|
155
|
+
- **Plain markdown.** No database, no lock-in.
|
|
156
|
+
- **No new data path.** The AI sees client code only when *you* point your agent at it; `<private>`-tagged data never enters the model's context.
|
|
157
|
+
- **Nothing enters the record unreviewed.** The model drafts, you confirm (`fde debrief --dry-run` shows the routing first); the hooks record only git facts. Your fieldbook stays yours to defend.
|
|
158
|
+
- **Know your sync surface.** `~/fde-engagements` lives in your home directory - your backup and cloud-sync setup now covers client notes. `fde resume --init` warns if the folder sits in a synced path. Read [PRIVACY.md](PRIVACY.md) before your first NDA'd engagement.
|
|
172
159
|
|
|
173
|
-
|
|
160
|
+
Details: [PRIVACY.md](PRIVACY.md) · [SECURITY.md](SECURITY.md)
|
|
174
161
|
|
|
175
162
|
---
|
|
176
163
|
|
|
@@ -180,7 +167,6 @@ One skill file powers every tool. Each adapter is a thin pointer at the same `@f
|
|
|
180
167
|
- **Trust before production** - earn the right to touch their systems
|
|
181
168
|
- **Brief is a hypothesis** - discover before building the wrong thing
|
|
182
169
|
- **Evidence on every claim** - these files get defended in front of skeptical clients
|
|
183
|
-
- **Map before moving** - unknown terrain gets characterisation tests
|
|
184
170
|
- **Thin slices** - ship learning, not theatre
|
|
185
171
|
- **One customer, one folder** - context never bleeds
|
|
186
172
|
|
|
@@ -196,6 +182,6 @@ cd fdeops && git pull && node bin/install.js
|
|
|
196
182
|
|
|
197
183
|
## Contributing
|
|
198
184
|
|
|
199
|
-
Built and maintained by **[Subash Natarajan](https://www.linkedin.com/in/subashn/)**. Share your
|
|
185
|
+
Built and maintained by **[Subash Natarajan](https://www.linkedin.com/in/subashn/)**. Share your feedback via [Issues](https://github.com/suboss87/fdeops/issues) - see [CONTRIBUTING.md](CONTRIBUTING.md).
|
|
200
186
|
|
|
201
|
-
[FDE Methodology](FDE-METHODOLOGY.md) - [ATTRIBUTION.md](ATTRIBUTION.md) - [SECURITY.md](SECURITY.md) - [PRIVACY.md](PRIVACY.md) - [Repo layout](docs/REPO_LAYOUT.md) - [Skills
|
|
187
|
+
[FDE Methodology](FDE-METHODOLOGY.md) - [ATTRIBUTION.md](ATTRIBUTION.md) - [SECURITY.md](SECURITY.md) - [PRIVACY.md](PRIVACY.md) - [Repo layout](docs/REPO_LAYOUT.md) - [Skills matrix](docs/skills.md) - MIT
|
package/adapters/AGENTS.md
CHANGED
|
@@ -11,7 +11,7 @@ When the FDE types **`@fde`** (or describes an engagement situation - new custom
|
|
|
11
11
|
|
|
12
12
|
## Engagement memory
|
|
13
13
|
|
|
14
|
-
Read and write engagement files under
|
|
14
|
+
Read and write engagement files under the workspace's bound engagement: run `fde resume` to resolve it (binding created once with `fde resume --init <name>`; default `~/fde-engagements/<name>/.fde/`). `FDEOPS_ENGAGEMENT` (expand `~`) overrides when set. Use `./.fde/` only when the engagement approves it and it is gitignored.
|
|
15
15
|
|
|
16
16
|
On entry, run `fde resume` (fallback `node ~/.claude/fdeops/fde.js resume`) to load `context.md`. Use the CLI for deterministic work - `fde scan | log | receipts | status | dashboard` - instead of improvising shell.
|
|
17
17
|
|
package/adapters/GEMINI.md
CHANGED
|
@@ -11,7 +11,7 @@ When the FDE types **`@fde`** or describes an engagement situation (new customer
|
|
|
11
11
|
|
|
12
12
|
## Engagement memory
|
|
13
13
|
|
|
14
|
-
Read and write engagement files under
|
|
14
|
+
Read and write engagement files under the workspace's bound engagement: run `fde resume` to resolve it (binding created once with `fde resume --init <name>`; default `~/fde-engagements/<name>/.fde/`). `FDEOPS_ENGAGEMENT` (expand `~`) overrides when set. Use `./.fde/` only when the engagement approves it and it is gitignored.
|
|
15
15
|
|
|
16
16
|
On entry, run `fde resume` (fallback `node ~/.claude/fdeops/fde.js resume`) to load `context.md`. Use the CLI for deterministic work - `fde scan | log | receipts | status | dashboard` - instead of improvising shell.
|
|
17
17
|
|
|
@@ -11,7 +11,7 @@ When the FDE types **`@fde`** or describes an engagement situation (new customer
|
|
|
11
11
|
|
|
12
12
|
## Engagement memory
|
|
13
13
|
|
|
14
|
-
Read and write engagement files under
|
|
14
|
+
Read and write engagement files under the workspace's bound engagement: run `fde resume` to resolve it (binding created once with `fde resume --init <name>`; default `~/fde-engagements/<name>/.fde/`). `FDEOPS_ENGAGEMENT` (expand `~`) overrides when set. Use `./.fde/` only when the engagement approves it and it is gitignored.
|
|
15
15
|
|
|
16
16
|
On entry, run `fde resume` (fallback `node ~/.claude/fdeops/fde.js resume`) to load `context.md`. Use the CLI for deterministic work - `fde scan | log | receipts | status | dashboard` - instead of improvising shell.
|
|
17
17
|
|
package/adapters/cursor.fde.mdc
CHANGED
|
@@ -16,7 +16,7 @@ When the FDE types **`@fde`** or describes an engagement situation (new customer
|
|
|
16
16
|
|
|
17
17
|
## Engagement memory
|
|
18
18
|
|
|
19
|
-
Read and write engagement files under
|
|
19
|
+
Read and write engagement files under the workspace's bound engagement: run `fde resume` to resolve it (binding created once with `fde resume --init <name>`; default `~/fde-engagements/<name>/.fde/`). `FDEOPS_ENGAGEMENT` (expand `~`) overrides when set. Use `./.fde/` only when the engagement approves it and it is gitignored.
|
|
20
20
|
|
|
21
21
|
On entry, run `fde resume` (fallback `node ~/.claude/fdeops/fde.js resume`) to load `context.md`. Use the CLI for deterministic work - `fde scan | log | receipts | status | dashboard` - instead of improvising shell.
|
|
22
22
|
|
package/bin/check.js
CHANGED
|
@@ -182,8 +182,8 @@ else ok('SECURITY.md')
|
|
|
182
182
|
|
|
183
183
|
const exampleFiles = ['reality.md', 'decisions.md', 'delivery.md', 'stakeholders.md']
|
|
184
184
|
for (const f of exampleFiles) {
|
|
185
|
-
const p = path.join(root, 'examples', '
|
|
186
|
-
if (!fs.existsSync(p)) fail(`examples/
|
|
185
|
+
const p = path.join(root, 'examples', 'garvey-payments', '.fde', f)
|
|
186
|
+
if (!fs.existsSync(p)) fail(`examples/garvey-payments/.fde/${f} missing`)
|
|
187
187
|
}
|
|
188
188
|
ok('examples walkthrough files')
|
|
189
189
|
|
|
@@ -220,17 +220,29 @@ for (const h of ['session-start', 'session-stop', 'pre-compact']) {
|
|
|
220
220
|
}
|
|
221
221
|
ok('hook exec bits')
|
|
222
222
|
|
|
223
|
+
// registry-aware hooks: `fde resume --init` binds via ~/fde-engagements/.registry,
|
|
224
|
+
// so every hook must consult it or registry-bound users get zero auto-capture
|
|
225
|
+
for (const h of ['session-start', 'session-stop', 'pre-compact']) {
|
|
226
|
+
const body = read('hooks/' + h)
|
|
227
|
+
if (!body.includes('fde-engagements/.registry')) fail(`hooks/${h} must consult the workspace registry`)
|
|
228
|
+
if (!body.includes('registry_engagement_dir')) fail(`hooks/${h} missing registry_engagement_dir`)
|
|
229
|
+
}
|
|
230
|
+
ok('hooks registry-aware')
|
|
231
|
+
|
|
223
232
|
// v3.1: the fde CLI (deterministic core)
|
|
224
233
|
if (!fs.existsSync(path.join(root, 'bin', 'fde.js'))) {
|
|
225
234
|
fail('bin/fde.js missing (the deterministic core)')
|
|
226
235
|
} else {
|
|
227
236
|
const cli = read('bin/fde.js')
|
|
228
|
-
for (const sub of ['cmdScan', 'cmdResume', 'cmdLog', 'cmdReceipts', 'cmdCapture', 'cmdStatus']) {
|
|
237
|
+
for (const sub of ['cmdScan', 'cmdResume', 'cmdLog', 'cmdDebrief', 'cmdReceipts', 'cmdCapture', 'cmdStatus']) {
|
|
229
238
|
if (!cli.includes(sub)) fail(`fde.js missing ${sub}`)
|
|
230
239
|
}
|
|
231
240
|
if (!JSON.parse(read('package.json')).bin.fde) fail('package.json must expose the fde bin')
|
|
232
241
|
if (!read('bin/install.js').includes('fde.js')) fail('install.js must deploy fde.js')
|
|
233
242
|
if (!read('skills/fde/SKILL.md').includes('fde resume')) fail('SKILL.md must use the CLI for memory ops')
|
|
243
|
+
if (!cli.includes('[signal:')) fail('fde.js must support structured [signal:x] trust tokens')
|
|
244
|
+
if (!cli.includes('ASK ON DAY 1')) fail('fde.js scan must emit ASK ON DAY 1 questions')
|
|
245
|
+
if (!read('bin/install.js').includes('FDE_SUBCOMMANDS')) fail('install.js must pass fde subcommands through (npx fdeops scan)')
|
|
234
246
|
ok('fde CLI present and wired')
|
|
235
247
|
}
|
|
236
248
|
const hooksJson = JSON.parse(read('hooks/hooks.json'))
|