fdeops 3.7.1 → 3.7.2
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 +19 -3
- package/bin/fde.js +5 -4
- package/hooks/session-start +29 -1
- package/package.json +1 -1
- package/skills/fde/SKILL.md +1 -1
package/AGENTS.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# AGENTS.md - working in the fdeops repository
|
|
2
2
|
|
|
3
|
-
This repository **is** fdeops - the
|
|
3
|
+
This repository **is** fdeops - the second brain for Forward Deployed Engineers. One `@fde` skill routes an entire client engagement across six domains, the `fde` CLI does the deterministic work, and per-customer memory writes itself into `.fde/` files.
|
|
4
4
|
|
|
5
5
|
## If you are helping use fdeops in an engagement
|
|
6
6
|
|
package/README.md
CHANGED
|
@@ -27,6 +27,8 @@ Your AI agent's memory is scoped to a **repo**. Client work isn't: one engagemen
|
|
|
27
27
|
|
|
28
28
|
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.
|
|
29
29
|
|
|
30
|
+
A notes app stores what you type. fdeops loads the right client into your AI agent's context automatically and turns meetings into dated receipts you can defend - the difference is what happens without you opening it.
|
|
31
|
+
|
|
30
32
|
## Without fdeops vs with fdeops
|
|
31
33
|
|
|
32
34
|
| Moment | Without fdeops | With fdeops |
|
|
@@ -51,9 +53,11 @@ fdeops adds the missing layer: memory scoped to the **client** - plain markdown
|
|
|
51
53
|
**2. Bind your client workspace** - run once, inside the workspace:
|
|
52
54
|
|
|
53
55
|
```bash
|
|
54
|
-
|
|
56
|
+
npx fdeops resume --init garvey
|
|
55
57
|
```
|
|
56
58
|
|
|
59
|
+
(`npx` needs nothing pre-installed. Want the bare `fde` command the rest of this README uses? `npm i -g fdeops` - the plugin install alone does not put `fde` on your PATH.)
|
|
60
|
+
|
|
57
61
|
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.
|
|
58
62
|
|
|
59
63
|
**3. Work**
|
|
@@ -64,7 +68,7 @@ fdeops' `--init` creates the engagement memory at `~/fde-engagements/garvey/.fde
|
|
|
64
68
|
|
|
65
69
|
`@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).
|
|
66
70
|
|
|
67
|
-
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.
|
|
71
|
+
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. The scan is heuristic by design - treat its output as leads to verify on day one, not findings.
|
|
68
72
|
|
|
69
73
|
<details>
|
|
70
74
|
<summary><strong>Other install paths</strong> - Cursor, Codex, Copilot, Gemini CLI, local LLMs, air-gapped</summary>
|
|
@@ -80,6 +84,17 @@ Not ready to install? `npx fdeops scan` runs on any repo you can read - day-1 re
|
|
|
80
84
|
|
|
81
85
|
---
|
|
82
86
|
|
|
87
|
+
## The week
|
|
88
|
+
|
|
89
|
+
This is the actual habit, not the 35 skills:
|
|
90
|
+
|
|
91
|
+
- **Monday morning** - open your agent, context loads, you're not re-explaining anything
|
|
92
|
+
- **After a meeting** - `fde debrief` turns raw notes into dated decisions, risks, and signals
|
|
93
|
+
- **Mid-scope-fight** - `fde receipts <term>` answers "when did we agree to that?"
|
|
94
|
+
- **Friday** - `fde status` gives you the sponsor update from the week's actual record
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
83
98
|
## How it works
|
|
84
99
|
|
|
85
100
|
Two hooks and one router, on top of the fieldbook:
|
|
@@ -100,7 +115,7 @@ Two hooks and one router, on top of the fieldbook:
|
|
|
100
115
|
|
|
101
116
|
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).
|
|
102
117
|
|
|
103
|
-
Works with **Claude Code** - **Cursor** - **Copilot** - **
|
|
118
|
+
Works with **Claude Code** - **Cursor** - **Copilot** - **Gemini CLI** - **Ollama** - **LM Studio** - any model that reads a markdown file.
|
|
104
119
|
|
|
105
120
|
---
|
|
106
121
|
|
|
@@ -174,6 +189,7 @@ Details: [PRIVACY.md](PRIVACY.md) · [SECURITY.md](SECURITY.md)
|
|
|
174
189
|
## Principles
|
|
175
190
|
|
|
176
191
|
- **The artifact is the memory** - producing work and recording it are one action
|
|
192
|
+
- **Methods, not autonomy** - each skill tells you what to check; the judgment, the trust, and the consequences stay yours
|
|
177
193
|
- **Trust before production** - earn the right to touch their systems
|
|
178
194
|
- **Brief is a hypothesis** - discover before building the wrong thing
|
|
179
195
|
- **Evidence on every claim** - these files get defended in front of skeptical clients
|
package/bin/fde.js
CHANGED
|
@@ -547,10 +547,11 @@ function cmdResume(args) {
|
|
|
547
547
|
process.exit(2)
|
|
548
548
|
}
|
|
549
549
|
console.log(`ENGAGEMENT: ${eng}\n`)
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
550
|
+
// readClean, not fs.readFileSync: this output is what an agent loads as
|
|
551
|
+
// context, so it goes through the same <private> redaction as the dashboard.
|
|
552
|
+
const ctx = readClean(eng, 'context.md')
|
|
553
|
+
if (!ctx) { console.log('(context.md empty - new engagement)') }
|
|
554
|
+
else { console.log(args.includes('--full') ? ctx : resumeView(ctx)) }
|
|
554
555
|
}
|
|
555
556
|
|
|
556
557
|
// Token discipline: context.md grows every session (the session-stop hook
|
package/hooks/session-start
CHANGED
|
@@ -79,6 +79,31 @@ if [ "$IS_FDE_PROJECT" -eq 0 ]; then
|
|
|
79
79
|
exit 0
|
|
80
80
|
fi
|
|
81
81
|
|
|
82
|
+
# Mirrors stripPrivate() in bin/fde.js: this is what an agent loads as
|
|
83
|
+
# context, so <private>...</private> blocks (sacred data, never-AI content)
|
|
84
|
+
# must never reach here unredacted, same guarantee as the dashboard renderer.
|
|
85
|
+
# <private> blocks are written one per line in the templates (own line, own
|
|
86
|
+
# closing tag), so a line-based state machine matches the real usage; an
|
|
87
|
+
# unclosed <private> redacts to end-of-file, same as the JS regex fallback.
|
|
88
|
+
strip_private() {
|
|
89
|
+
awk '
|
|
90
|
+
BEGIN { inblock = 0 }
|
|
91
|
+
{
|
|
92
|
+
line = $0
|
|
93
|
+
if (inblock) {
|
|
94
|
+
if (index(line, "</private>") > 0) { inblock = 0 }
|
|
95
|
+
next
|
|
96
|
+
}
|
|
97
|
+
if (index(line, "<private>") > 0) {
|
|
98
|
+
print "(private - redacted)"
|
|
99
|
+
if (index(line, "</private>") == 0) { inblock = 1 }
|
|
100
|
+
next
|
|
101
|
+
}
|
|
102
|
+
print line
|
|
103
|
+
}
|
|
104
|
+
' "$1"
|
|
105
|
+
}
|
|
106
|
+
|
|
82
107
|
# Token discipline: context.md grows every session (session-stop appends a
|
|
83
108
|
# snapshot). Inject a bounded view - curated head + most recent activity -
|
|
84
109
|
# instead of the whole log. Mirrors resumeView() in bin/fde.js; keep in sync.
|
|
@@ -106,7 +131,10 @@ if [ -n "$BOOTSTRAP" ]; then
|
|
|
106
131
|
fi
|
|
107
132
|
|
|
108
133
|
if [ -n "$CONTEXT_FILE" ] && [ -f "$CONTEXT_FILE" ]; then
|
|
109
|
-
|
|
134
|
+
REDACTED_CONTEXT=$(mktemp)
|
|
135
|
+
strip_private "$CONTEXT_FILE" > "$REDACTED_CONTEXT"
|
|
136
|
+
CONTENT="$CONTENT---\nEngagement context ($CONTEXT_FILE):\n$(bounded_context "$REDACTED_CONTEXT")\n"
|
|
137
|
+
rm -f "$REDACTED_CONTEXT"
|
|
110
138
|
fi
|
|
111
139
|
|
|
112
140
|
printf '%b' "$CONTENT"
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "fdeops",
|
|
3
|
-
"version": "3.7.
|
|
3
|
+
"version": "3.7.2",
|
|
4
4
|
"description": "Field kit for engineers embedded in client work - a real CLI (recon, memory, portfolio), one @fde skill with field judgment on top, and hooks that make it automatic. Claude Code plugin and any agent that loads skills.",
|
|
5
5
|
"bin": {
|
|
6
6
|
"fdeops": "bin/install.js",
|
package/skills/fde/SKILL.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: fde
|
|
3
|
-
description: The
|
|
3
|
+
description: The second brain for Forward Deployed Engineers. 35 skills across 6 domains - from first meeting to final handoff. Tell it your situation, it routes to the right skill, does the work, and the engagement memory writes itself.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# @fde
|