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 CHANGED
@@ -1,6 +1,6 @@
1
1
  # AGENTS.md - working in the fdeops repository
2
2
 
3
- This repository **is** fdeops - the operating system 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.
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
- fde resume --init garvey
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** - **Devin** - **Gemini CLI** - **Ollama** - **LM Studio** - any model that reads a markdown file.
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
- try {
551
- const ctx = fs.readFileSync(path.join(eng, 'context.md'), 'utf8')
552
- console.log(args.includes('--full') ? ctx : resumeView(ctx))
553
- } catch (_) { console.log('(context.md empty - new engagement)') }
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
@@ -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
- CONTENT="$CONTENT---\nEngagement context ($CONTEXT_FILE):\n$(bounded_context "$CONTEXT_FILE")\n"
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.1",
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",
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: fde
3
- description: The operating system 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.
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