fdeops 5.1.9 → 5.1.11
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 +38 -12
- package/adapters/AGENTS.md +1 -1
- package/adapters/GEMINI.md +1 -1
- package/adapters/LOCAL-LLM.md +1 -1
- package/adapters/README.md +2 -2
- package/adapters/copilot-instructions.md +1 -1
- package/adapters/cursor.fde.mdc +1 -1
- package/bin/check.js +5 -5
- package/bin/fde.js +19 -2
- package/bin/lib/follow-through.js +41 -0
- package/mcp/fdeops-ingest/package.json +1 -1
- package/package.json +1 -1
- package/plugin.json +1 -1
- package/skills/brief/.fde-generated.json +1 -1
- package/skills/brief/references/land.md +3 -1
- package/skills/fde/SKILL.md +6 -2
- package/skills/fde/references/close.md +3 -3
- package/skills/fde/references/encode-pattern.md +6 -8
- package/skills/fde/references/land.md +3 -1
- package/skills/fde/references/switch-clients.md +29 -90
- package/skills/feedback/.fde-generated.json +1 -1
- package/skills/feedback/references/encode-pattern.md +6 -8
- package/skills/handoff/.fde-generated.json +3 -2
- package/skills/handoff/references/close.md +3 -3
- package/skills/handoff/references/encode-pattern.md +6 -8
- package/skills/handoff/references/land.md +138 -0
- package/skills/runbook/.fde-generated.json +3 -2
- package/skills/runbook/references/close.md +3 -3
- package/skills/runbook/references/encode-pattern.md +6 -8
- package/skills/runbook/references/land.md +138 -0
- package/skills/switch-clients/.fde-generated.json +3 -2
- package/skills/switch-clients/references/switch-clients.md +29 -90
- package/skills/switch-clients/references/verification.md +45 -0
- package/hooks/run-hook.cmd +0 -3
package/README.md
CHANGED
|
@@ -12,11 +12,13 @@ FDEOps brings that context into the work, from the first meeting to a system the
|
|
|
12
12
|
|
|
13
13
|
[Get started](#quick-start) · [What it helps with](#three-things-it-helps-with) · [Choose a skill](#task-skills) · [Data boundaries](#your-records-your-control) · [Docs](docs/README.md)
|
|
14
14
|
|
|
15
|
-
|
|
15
|
+

|
|
16
|
+
|
|
17
|
+
*Fictional customers. Illustrative enterprise conversation with real local review-logic tests. Synthetic data; no live model or customer deployment. [Read the conversation](media/chat-demo.md) · [View a still](media/chat-demo.png).*
|
|
16
18
|
|
|
17
19
|
## Quick start
|
|
18
20
|
|
|
19
|
-
**Use customer
|
|
21
|
+
**Use your customer’s approved AI tools and data.** FDEOps runs locally; your AI agent’s settings determine what reaches its provider. Start with synthetic data until customer access is approved. [Safe setup](SECURITY.md#before-customer-work).
|
|
20
22
|
|
|
21
23
|
### Let `fde` coordinate a customer project
|
|
22
24
|
|
|
@@ -34,7 +36,7 @@ checks internal documents, then assigns each request to another team.
|
|
|
34
36
|
Help me prepare for the first meeting. Here is the brief: ...
|
|
35
37
|
```
|
|
36
38
|
|
|
37
|
-
The coordinator
|
|
39
|
+
The coordinator selects the right skill as the work changes. For an ongoing project, it keeps decisions, evidence and next actions in a local customer record. You bring the context and make the decisions.
|
|
38
40
|
|
|
39
41
|
### Use one skill for one task
|
|
40
42
|
|
|
@@ -50,11 +52,16 @@ Separate decisions, requests and open questions. Return a draft only.
|
|
|
50
52
|
[Paste notes you are permitted to share.]
|
|
51
53
|
```
|
|
52
54
|
|
|
53
|
-
|
|
55
|
+
Each task skill includes the instructions it needs. Use `debrief` on supplied notes without creating a customer record or installing the coordinator.
|
|
56
|
+
|
|
57
|
+
<details>
|
|
58
|
+
<summary>Installation requirements and alternatives</summary>
|
|
54
59
|
|
|
55
60
|
These installation commands use Node.js and Git; the optional record CLI requires Node.js 18+. See [installation and upgrades](docs/install.md) for host-specific invocation, the full pack and alternatives. Installing `fde` includes all underlying instructions, but does not add the 35 separate task names to your agent's menu.
|
|
56
61
|
|
|
57
|
-
|
|
62
|
+
</details>
|
|
63
|
+
|
|
64
|
+
**See it in action:** `npx fdeops demo` turns fictional meeting notes into a review and a fieldbook, a browser view of the customer record. No AI model is called. The demo uses Node.js 18+ and Git; `npx` may download the package. It creates or resets its separate `.demo` workspace. [Five-minute walkthrough](docs/USAGE.md#new-here-5-minutes).
|
|
58
65
|
|
|
59
66
|
## Three things it helps with
|
|
60
67
|
|
|
@@ -65,7 +72,16 @@ A repository tells you where the code lives. It may not tell you why the custome
|
|
|
65
72
|
<a name="keep-a-customer-record"></a>
|
|
66
73
|
<a name="how-skills-work"></a>
|
|
67
74
|
|
|
68
|
-
For
|
|
75
|
+
For ongoing engagements, each customer gets a plain-Markdown record at `~/fde-engagements/<customer>/.fde/`. The coordinator loads a short summary and looks up details as needed. Before resuming implementation, it checks the saved next action against the current task and code. Saved lessons are searchable within that customer’s record. Meeting preparation brings back recorded open questions and commitments; sharing a lesson with another customer requires explicit approval.
|
|
76
|
+
|
|
77
|
+
From the fictional demo’s `fde resume` output:
|
|
78
|
+
|
|
79
|
+
```text
|
|
80
|
+
next: get the reconciliation runbook from Tom before touching anything. [source: meeting 2026-09-10]
|
|
81
|
+
do first: Ask the acceptance owner to review the reported result and its evidence (delivery.md: 1 reported result awaiting acceptance)
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
The next session can pick up the work while keeping acceptance pending.
|
|
69
85
|
|
|
70
86
|
Use [debrief](skills/debrief/SKILL.md) after a meeting and [switch-clients](skills/switch-clients/SKILL.md) when changing customers. [How records work](docs/USAGE.md).
|
|
71
87
|
|
|
@@ -73,13 +89,13 @@ Use [debrief](skills/debrief/SKILL.md) after a meeting and [switch-clients](skil
|
|
|
73
89
|
|
|
74
90
|
A stakeholder asks for more scope. A demo looks promising. Neither establishes a new commitment or an accepted result.
|
|
75
91
|
|
|
76
|
-
FDEOps
|
|
92
|
+
FDEOps keeps requests, confirmed decisions, reported results and open questions distinct. You review proposed record changes before saving them. Dates and sources keep claims traceable; customer approval still comes from the agreed owner.
|
|
77
93
|
|
|
78
94
|
For example, these fictional notes:
|
|
79
95
|
|
|
80
96
|
> Mara agreed to keep CSV upload this phase. Devon asked for real-time sync; Mara has not answered. Two staging runs took 12 minutes. Production has not been measured.
|
|
81
97
|
|
|
82
|
-
|
|
98
|
+
The review separates them:
|
|
83
99
|
|
|
84
100
|
| Record | What the notes support |
|
|
85
101
|
|---|---|
|
|
@@ -94,7 +110,17 @@ This is a draft, not a saved agreement. Use [who-decides](skills/who-decides/SKI
|
|
|
94
110
|
|
|
95
111
|
A local test, a deployed change and a customer-accepted result answer different questions.
|
|
96
112
|
|
|
97
|
-
|
|
113
|
+
| Claim | Evidence it needs |
|
|
114
|
+
|---|---|
|
|
115
|
+
| Implemented | The change exists in the identified revision |
|
|
116
|
+
| Verified | Applicable checks passed under stated conditions |
|
|
117
|
+
| Deployed | The intended environment is running the change |
|
|
118
|
+
| Measured | A result was observed against the agreed measure |
|
|
119
|
+
| Accepted | The agreed owner or mechanism accepted the outcome |
|
|
120
|
+
|
|
121
|
+
The skills use these distinctions when reporting progress; they are not automatic dashboard states.
|
|
122
|
+
|
|
123
|
+
FDEOps carries agreed checks into implementation and ties test results to the revision and environment checked. Before rollout, it asks for operating limits, recovery evidence and an owner. You can see what is ready, what is blocked and what still needs verification.
|
|
98
124
|
|
|
99
125
|
Use [build](skills/build/SKILL.md), [integrate](skills/integrate/SKILL.md), [review](skills/review/SKILL.md), [ship](skills/ship/SKILL.md) and [handoff](skills/handoff/SKILL.md) as needed. [See the tests and their limits](docs/verification.md).
|
|
100
126
|
|
|
@@ -112,7 +138,7 @@ Use [build](skills/build/SKILL.md), [integrate](skills/integrate/SKILL.md), [rev
|
|
|
112
138
|
| A release or operating handover | `ship`, `runbook`, `handoff` |
|
|
113
139
|
| Meeting notes or a customer update | `debrief`, `readout` |
|
|
114
140
|
|
|
115
|
-
|
|
141
|
+
Start with the task you need, or let `fde` select it. `dashboard` works with saved records; `debrief` can review supplied notes and return a draft. Each skill explains the context it needs. [Full skill catalog](docs/skills-reference.md).
|
|
116
142
|
|
|
117
143
|
<a name="what-a-working-day-looks-like"></a>
|
|
118
144
|
|
|
@@ -138,13 +164,13 @@ Copy an action into your agent to continue. Regenerate the view after record upd
|
|
|
138
164
|
|
|
139
165
|
The CLI reads local files and Git without network calls or telemetry. Installation may download packages. Your AI host controls model connections and may transmit what it reads.
|
|
140
166
|
|
|
141
|
-
CLI and hook outputs mask common identifier patterns. `<private>` blocks are redacted from those outputs and the dashboard. Local reports retain unmarked identifiers by default.
|
|
167
|
+
CLI and hook outputs mask common identifier patterns. `<private>` blocks are redacted from those outputs and the dashboard. Local reports retain unmarked identifiers by default. These filters cover FDEOps output, not raw files or text you paste into an agent. Use only approved material, including when anonymised.
|
|
142
168
|
|
|
143
169
|
You review consequential record updates. Enabled hooks can save mechanical session progress; direct CLI write commands update records when run. [Privacy](PRIVACY.md) · [Security](SECURITY.md) · [Local-model results](docs/verification.md#local-model-results).
|
|
144
170
|
|
|
145
171
|
## Who this is for
|
|
146
172
|
|
|
147
|
-
Forward deployed engineers, consultants and delivery teams working across customer meetings, codebases and operating environments.
|
|
173
|
+
Forward deployed engineers, consultants and delivery teams working across customer meetings, codebases and operating environments. Bring your existing tools, access and customer agreements. Start with one task or use `fde` throughout the engagement.
|
|
148
174
|
|
|
149
175
|
## Go deeper
|
|
150
176
|
|
package/adapters/AGENTS.md
CHANGED
|
@@ -16,7 +16,7 @@ Do **not** load `@fde` for a one-line typo in an unbound repo. On a bound client
|
|
|
16
16
|
|
|
17
17
|
Read and write engagement files under the workspace's bound engagement: follow the skill’s entry rule 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.
|
|
18
18
|
|
|
19
|
-
Follow **
|
|
19
|
+
Follow **Entry (every session)** in `skills/fde/SKILL.md` for setup, context reuse and refresh. Use the CLI for deterministic work - `fde scan | log | receipts | status | dashboard` - instead of improvising shell.
|
|
20
20
|
|
|
21
21
|
## Voice
|
|
22
22
|
|
package/adapters/GEMINI.md
CHANGED
|
@@ -16,7 +16,7 @@ Do **not** load `@fde` for a one-line typo in an unbound repo. On a bound client
|
|
|
16
16
|
|
|
17
17
|
Read and write engagement files under the workspace's bound engagement: follow the skill’s entry rule 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.
|
|
18
18
|
|
|
19
|
-
Follow **
|
|
19
|
+
Follow **Entry (every session)** in `skills/fde/SKILL.md` for setup, context reuse and refresh. Use the CLI for deterministic work - `fde scan | log | receipts | status | dashboard` - instead of improvising shell.
|
|
20
20
|
|
|
21
21
|
## Voice
|
|
22
22
|
|
package/adapters/LOCAL-LLM.md
CHANGED
|
@@ -7,7 +7,7 @@ The FDEOps CLI and offline dashboard need Node.js and Git, not a model. AI-assis
|
|
|
7
7
|
1. Download FDEOps, your agent host and your model while online. After that, the CLI operates offline. Model/provider configuration belongs to the host; FDEOps does not start or configure an inference server.
|
|
8
8
|
2. From the client workspace, run `node /path/to/fdeops/bin/fde.js resume --init my-client` to create and bind a local record.
|
|
9
9
|
3. Make `skills/fde/SKILL.md` and its references available to the host. Use the host's documented skill/file mechanism. Give it the FDEOps CLI path and permission to read the bound record and execute the requested commands.
|
|
10
|
-
4. Follow **
|
|
10
|
+
4. Follow **Entry (every session)** in `skills/fde/SKILL.md`, then ask for the next action. Inspect the tool calls, cited records and any proposed writes before trusting the workflow.
|
|
11
11
|
|
|
12
12
|
Use `fde recall <topic>` for relevant evidence. `resume` and `recall` default to a 16 KiB output ceiling; `--max-bytes 4096` requests a smaller allowance. This limits FDEOps output, not the host's entire context window. Keep unrelated transcripts and tools out of the active context. Private blocks must stay out of direct file reads as well as prompts.
|
|
13
13
|
|
package/adapters/README.md
CHANGED
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
| Gemini CLI | `GEMINI.md` | `GEMINI.md` |
|
|
14
14
|
| Cursor | `.cursor/rules/fde.mdc` | `cursor.fde.mdc` |
|
|
15
15
|
| GitHub Copilot | `.github/copilot-instructions.md` | `copilot-instructions.md` |
|
|
16
|
-
| Local LLMs (Ollama, LM Studio, llama.cpp, vLLM) |
|
|
16
|
+
| Local LLMs (Ollama, LM Studio, llama.cpp, vLLM) | Capable agent host with `SKILL.md`, its references, and approved CLI access | [`LOCAL-LLM.md`](LOCAL-LLM.md) (guide) |
|
|
17
17
|
|
|
18
18
|
`AGENTS.md` is the emerging cross-tool standard - many agents read it, so it doubles as the universal fallback. For local/self-hosted models, see [`LOCAL-LLM.md`](LOCAL-LLM.md).
|
|
19
19
|
|
|
@@ -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**.
|
|
34
|
+
The adapter only tells the tool **where the brain is and how to behave**. The 35 task methods and supporting guidance live in `skills/fde/references/`; `skills/fde/SKILL.md` coordinates them and the memory contract. 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.
|
|
@@ -16,7 +16,7 @@ Do **not** load `@fde` for a one-line typo in an unbound repo. On a bound client
|
|
|
16
16
|
|
|
17
17
|
Read and write engagement files under the workspace's bound engagement: follow the skill’s entry rule 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.
|
|
18
18
|
|
|
19
|
-
Follow **
|
|
19
|
+
Follow **Entry (every session)** in `skills/fde/SKILL.md` for setup, context reuse and refresh. Use the CLI for deterministic work - `fde scan | log | receipts | status | dashboard` - instead of improvising shell.
|
|
20
20
|
|
|
21
21
|
## Voice
|
|
22
22
|
|
package/adapters/cursor.fde.mdc
CHANGED
|
@@ -21,7 +21,7 @@ Do **not** load `@fde` for a one-line typo in an unbound repo. On a bound client
|
|
|
21
21
|
|
|
22
22
|
Read and write engagement files under the workspace's bound engagement: follow the skill’s entry rule 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.
|
|
23
23
|
|
|
24
|
-
Follow **
|
|
24
|
+
Follow **Entry (every session)** in `skills/fde/SKILL.md` for setup, context reuse and refresh. The entry packet includes TRIAGE; use it for trust, phase, open risks and next action. Do not invent stakeholders or status.
|
|
25
25
|
|
|
26
26
|
You run the CLI for deterministic work - `fde scan | log | debrief | prep | doctor | receipts | status | dashboard` - instead of improvising shell or handing commands to the human.
|
|
27
27
|
|
package/bin/check.js
CHANGED
|
@@ -194,11 +194,11 @@ if (read('package.json').includes('postinstall')) {
|
|
|
194
194
|
}
|
|
195
195
|
|
|
196
196
|
const readme = read('README.md')
|
|
197
|
-
if (/
|
|
198
|
-
fail('README must
|
|
199
|
-
} else if (
|
|
200
|
-
fail('
|
|
201
|
-
} else ok('README
|
|
197
|
+
if (!readme.includes('media/chat-demo.gif') || !readme.includes('media/chat-demo.md') || !readme.includes('Fictional customers')) {
|
|
198
|
+
fail('README must include the chat walkthrough, text alternative and fictional-record disclosure')
|
|
199
|
+
} else if (['chat-demo.gif', 'chat-demo.png', 'chat-demo.json', 'chat-demo.md', 'render-chat-demo.py'].some(name => !fs.existsSync(path.join(root, 'media', name)))) {
|
|
200
|
+
fail('chat walkthrough must include rendered assets, text, source and renderer')
|
|
201
|
+
} else ok('README chat walkthrough has accessible text and reproducible source')
|
|
202
202
|
|
|
203
203
|
const usage = read('docs/USAGE.md')
|
|
204
204
|
if (!usage.includes('media/session.gif') || !usage.includes('media/record-session.sh')) {
|
package/bin/fde.js
CHANGED
|
@@ -33,6 +33,7 @@ const path = require('path')
|
|
|
33
33
|
const os = require('os')
|
|
34
34
|
const { execSync, execFileSync } = require('child_process')
|
|
35
35
|
const { createMemoryApi } = require('./lib/memory')
|
|
36
|
+
const { pendingSummary } = require('./lib/follow-through')
|
|
36
37
|
const { createTrustApi } = require('./lib/trust')
|
|
37
38
|
const vault = require('./lib/vault')
|
|
38
39
|
const context = require('./lib/context')
|
|
@@ -1462,7 +1463,7 @@ function cmdResume(args) {
|
|
|
1462
1463
|
console.log(`NO ENGAGEMENT for this workspace.\nexisting: ${list}\nAsk the human the client name (one question), then run: fde resume --init <client-name>\nDo not tell them to type that command.`)
|
|
1463
1464
|
process.exit(2)
|
|
1464
1465
|
}
|
|
1465
|
-
const intro = [resumeTriage(eng), firstActionLine(eng), ...hygieneTriageLines(eng), ...recordDigest(eng)].join('\n')
|
|
1466
|
+
const intro = [resumeTriage(eng), firstActionLine(eng), pendingSummary(readClean(eng, 'context.md')), ...hygieneTriageLines(eng), ...recordDigest(eng)].join('\n')
|
|
1466
1467
|
const ctx = readClean(eng, 'context.md')
|
|
1467
1468
|
const savedWork = context.implementationCheckpoint(ctx)
|
|
1468
1469
|
const checkpoint = stripTemplateNoise(savedWork.checkpoint).trim()
|
|
@@ -2710,11 +2711,25 @@ function cmdRecall(args) {
|
|
|
2710
2711
|
}
|
|
2711
2712
|
const eng = resolveEngagement()
|
|
2712
2713
|
if (!eng) { console.error('no engagement - bind a client before recall'); process.exit(2) }
|
|
2713
|
-
const files = ['context.md', 'trust-profile.md', 'success.md', 'decisions.md', 'risks.md', 'delivery.md', 'stakeholders.md', 'brief.md', 'reality.md', 'assumptions.md', 'terrain.md', 'handoff.md']
|
|
2714
|
+
const files = ['context.md', 'trust-profile.md', 'success.md', 'decisions.md', 'risks.md', 'delivery.md', 'stakeholders.md', 'brief.md', 'reality.md', 'assumptions.md', 'terrain.md', 'handoff.md', 'patterns.md']
|
|
2715
|
+
// Never follow a directory link into another customer's record.
|
|
2716
|
+
const retrospectiveDir = path.join(eng, 'retrospectives')
|
|
2717
|
+
let omitted = false
|
|
2718
|
+
try {
|
|
2719
|
+
if (fs.lstatSync(retrospectiveDir).isDirectory()) {
|
|
2720
|
+
const names = fs.readdirSync(retrospectiveDir).filter(name => {
|
|
2721
|
+
if (!/^\d{4}-\d{2}-\d{2}-.+\.md$/.test(name)) return false
|
|
2722
|
+
try { return fs.lstatSync(path.join(retrospectiveDir, name)).isFile() } catch (_) { return false }
|
|
2723
|
+
}).sort().reverse()
|
|
2724
|
+
omitted = names.length > 100
|
|
2725
|
+
files.push(...names.slice(0, 100).map(name => `retrospectives/${name}`))
|
|
2726
|
+
}
|
|
2727
|
+
} catch (_) {}
|
|
2714
2728
|
const result = context.recallSections(files.map(file => ({ file, text: readClean(eng, file) })), query, 12, masking.mask)
|
|
2715
2729
|
process.stdout.write(maskedSections([
|
|
2716
2730
|
`RECALL - ${eng}\n${result.total ? `${result.sections.length} of ${result.total} matching lines; refine the query if evidence is omitted.` : 'No matching record. This is not proof that the event never happened.'}\nSources are local record assertions; verify dates, supersession and approval scope.`,
|
|
2717
2731
|
...result.sections,
|
|
2732
|
+
omitted ? 'Older retrospectives omitted: searched at most the 100 newest dated files.' : '',
|
|
2718
2733
|
], maxBytes))
|
|
2719
2734
|
}
|
|
2720
2735
|
|
|
@@ -3497,6 +3512,8 @@ function cmdPrep(args) {
|
|
|
3497
3512
|
// Grounded brief: only text already in .fde/. No invention (Rowboat meeting-prep rule).
|
|
3498
3513
|
console.log(`MEETING PREP - ${label}`)
|
|
3499
3514
|
console.log('(grounded in local .fde/ only - if a fact is missing, it is missing)\n')
|
|
3515
|
+
const pending = pendingSummary(readClean(eng, 'context.md'))
|
|
3516
|
+
if (pending) console.log(masking.mask(pending) + '\n')
|
|
3500
3517
|
console.log(resumeTriage(eng))
|
|
3501
3518
|
const owner = readOwner(eng)
|
|
3502
3519
|
const head = memoryHead(eng)
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
'use strict'
|
|
2
|
+
|
|
3
|
+
// Explicit checkboxes keep closure human-owned; prose is not inferred as a debt.
|
|
4
|
+
function localDay(now = new Date()) {
|
|
5
|
+
return [now.getFullYear(), String(now.getMonth() + 1).padStart(2, '0'), String(now.getDate()).padStart(2, '0')].join('-')
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
function pendingItems(text, today = localDay()) {
|
|
9
|
+
const items = []
|
|
10
|
+
let section = ''
|
|
11
|
+
let fence = ''
|
|
12
|
+
for (const [index, line] of String(text || '').split('\n').entries()) {
|
|
13
|
+
if (fence) {
|
|
14
|
+
if (new RegExp(`^[\\t ]*${fence.char}{${fence.length},}[\\t ]*$`).test(line)) fence = null
|
|
15
|
+
continue
|
|
16
|
+
}
|
|
17
|
+
const opening = line.match(/^ {0,3}(?:(?:[-+*]|\d{1,9}[.)])[\t ]+)?(`{3,}|~{3,})(.*)$/)
|
|
18
|
+
if (opening && (opening[1][0] !== '`' || !opening[2].includes('`'))) {
|
|
19
|
+
fence = { char: opening[1][0], length: opening[1].length }
|
|
20
|
+
continue
|
|
21
|
+
}
|
|
22
|
+
const heading = line.match(/^(#{1,2})(?:[\t ]+|$)(.*)$/)
|
|
23
|
+
if (heading) section = heading[1] === '##' ? heading[2].replace(/[\t ]+#+[\t ]*$/, '').trim().toLowerCase() : ''
|
|
24
|
+
if (!['commitments', 'open questions'].includes(section)) continue
|
|
25
|
+
const match = line.match(/^ {0,3}-\s+\[ \]\s+(.+)/)
|
|
26
|
+
if (!match) continue
|
|
27
|
+
const due = match[1].match(/\b(?:due|review):\s*(\d{4}-\d{2}-\d{2})\b/i)
|
|
28
|
+
const date = due && due[1]
|
|
29
|
+
const valid = date && !Number.isNaN(Date.parse(date)) && new Date(date).toISOString().slice(0, 10) === date
|
|
30
|
+
items.push(`context.md:${index + 1} [${section}] ${match[1].slice(0, 400)}${valid && date < today ? ' [past recorded due/review date; confirm status]' : ''}`)
|
|
31
|
+
}
|
|
32
|
+
return items
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function pendingSummary(text) {
|
|
36
|
+
const items = pendingItems(text)
|
|
37
|
+
if (!items.length) return ''
|
|
38
|
+
return `OPEN FOLLOW-THROUGH (${Math.min(items.length, 8)} of ${items.length} recorded items)\n${items.slice(0, 8).join('\n')}\nRecorded items, not a complete agenda. Confirm status and meeting relevance.`
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
module.exports = { pendingItems, pendingSummary, localDay }
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "fdeops",
|
|
3
|
-
"version": "5.1.
|
|
3
|
+
"version": "5.1.11",
|
|
4
4
|
"description": "Forward deployed engineering skills for AI coding agents. Use focused task skills or @fde for discovery, implementation, verification and handoff, with local engagement records.",
|
|
5
5
|
"bin": {
|
|
6
6
|
"fdeops": "bin/install.js",
|
package/plugin.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",
|
|
3
3
|
"name": "fdeops",
|
|
4
|
-
"version": "5.1.
|
|
4
|
+
"version": "5.1.11",
|
|
5
5
|
"description": "Forward deployed engineering skills for AI coding agents. Use focused task skills or @fde for discovery, implementation, verification and handoff, with local engagement records.",
|
|
6
6
|
"author": {
|
|
7
7
|
"name": "Subash Natarajan",
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"files": {
|
|
5
5
|
"SKILL.md": "5d88b9818951f8a8a44c39ad2b36ccdca74fef5e6ed31e67788b50d3ca1bb006",
|
|
6
6
|
"agents/openai.yaml": "8dc0b43545004419bad49e1d50cd3beb968bbcc24baacdaf7fb7304a5fd03bba",
|
|
7
|
-
"references/land.md": "
|
|
7
|
+
"references/land.md": "87dfffc8e39d35eaf23d510ba7e9913d48e90d2705eb9155ab192d12ea98d18d",
|
|
8
8
|
"references/task-context.md": "9066514a50043f3ad888d133d4e8b89b7132551e098cf2c80203c458a80126e5"
|
|
9
9
|
}
|
|
10
10
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# land - Interrogate the brief
|
|
2
2
|
|
|
3
|
-
**Enter when:** new customer, first meeting, just got the brief, nothing started yet.
|
|
3
|
+
**Enter when:** new customer, first meeting, just got the brief, nothing started yet, or an old or closed project is reopening.
|
|
4
4
|
|
|
5
5
|
**Read first:** apply [task context](task-context.md), then permitted `context.md` evidence if it exists and the supplied brief. Once the engagement type and AI/access policy are known, inspect the supplied repo/docs relevant to the ask before asking questions they can answer. This is a bounded evidence check, not a full discovery scan.
|
|
6
6
|
|
|
@@ -18,6 +18,8 @@ Then check - probe ONLY if it prevents a bad start:
|
|
|
18
18
|
|
|
19
19
|
State your read, let the FDE correct, then land.
|
|
20
20
|
|
|
21
|
+
**Reopening an old or closed project:** after the privacy-safe context check, use `fde recall <topic>` for relevant client patterns, retrospectives, and prior decisions. Treat old evidence as historical. Before dependent action, recheck current AI/data policy, access, decision and operating owners, and the deployed revision against current permitted evidence. Record changes and unknowns; an old approval or successful drill does not establish present authority or readiness. Continue independent preparation while material gaps are resolved.
|
|
22
|
+
|
|
21
23
|
## Brief interrogation (only when the brief is thin)
|
|
22
24
|
|
|
23
25
|
Use this when the ask is conventional or underspecified - missing who decides, why now, what success looks like, or the binding constraint. **Do not** run it when the FDE already gave a clear brief, is mid-flow, or asked for speed over verification.
|
package/skills/fde/SKILL.md
CHANGED
|
@@ -27,8 +27,8 @@ For record-backed work only:
|
|
|
27
27
|
|
|
28
28
|
1. Before client reads, run `fde setup --show` and verify `fde privacy` support. If setup is unconfigured or the user requests preferences, follow `references/record-setup.md`. Setup does not authorize sharing customer data.
|
|
29
29
|
2. Use a fresh `fde resume` packet for this turn/task. Reuse a current session-hook packet only when its visible `ENGAGEMENT:` matches the binding and its freshness is certain. Refresh after binding, masking or record changes, or when the user asks where things stand. Do not reuse an earlier turn's packet or repeat the same entry solely because another method loaded.
|
|
30
|
-
3. Read policy, signer, goals, risks and current work. Retrieve omitted or disputed evidence with `fde recall <topic>`; never replace this with raw or recursive record reads. Resume defaults to 16 KiB (4 KiB in compact setup); `--max-bytes 4096` reduces it, and `--full` is for explicitly needed complete context.
|
|
31
|
-
4. For interrupted implementation, inspect the saved checkpoint and follow `references/verification.md#recoverable-checkpoint` before acting. A checkpoint is a dated claim, not a fresh test or permission to execute.
|
|
30
|
+
3. Read policy, signer, goals, risks and current work. Retrieve omitted or disputed evidence, saved lessons and dated retrospectives with `fde recall <topic>`; never replace this with raw or recursive record reads. Resume defaults to 16 KiB (4 KiB in compact setup); `--max-bytes 4096` reduces it, and `--full` is for explicitly needed complete context.
|
|
31
|
+
4. For interrupted implementation, inspect the saved checkpoint and follow `references/verification.md#recoverable-checkpoint` before acting. A checkpoint is a dated claim, not a fresh test or permission to execute. For a returning or closed engagement, apply the reopening check in `references/land.md` before relying on historical access, owners or deployment evidence.
|
|
32
32
|
5. Give a brief playback and load the relevant method below. `hygiene:` means offer `fde doctor`; never auto-rewrite.
|
|
33
33
|
|
|
34
34
|
The CLI uses local files and Git, without network calls. Install it on the FDE's own machine, never customer infrastructure. The AI host's permissions and provider policy remain separate.
|
|
@@ -173,3 +173,7 @@ Ready to build: check that the supplied facts establish the outcome, constraints
|
|
|
173
173
|
- A missing record or check is an explicit gap, not a reason to fabricate facts or restart discovery.
|
|
174
174
|
- Confirm consequential record changes; use customer policy and actual decision authority for external actions.
|
|
175
175
|
- Report what was achieved, its evidence and remaining limits. Never equate implementation with deployment or acceptance.
|
|
176
|
+
|
|
177
|
+
### Keep open work visible
|
|
178
|
+
|
|
179
|
+
For confirmed follow-ups, maintain `## Commitments` and `## Open questions` in the existing `context.md`. Use unchecked bullets for unresolved items and check them only after confirmed resolution. A commitment says who owes what to whom; include a source and `due: YYYY-MM-DD` or `review: YYYY-MM-DD` only when agreed. Preserve unresolved `unknown - ask:` questions here when they affect the next decision. Do not infer a promise from a suggestion. `resume` and `prep` surface these entries with sources; dates prompt a status check, not an invented escalation. For a meeting, select relevant entries and use targeted recall for supporting evidence. Users describe the follow-up naturally; maintain the record for them.
|
|
@@ -6,7 +6,7 @@ For a standalone handoff draft, use the supplied notes and project evidence; no
|
|
|
6
6
|
|
|
7
7
|
**Enter when:** the engagement is ending - the customer team must run this without the FDE.
|
|
8
8
|
|
|
9
|
-
**Read first:** for standalone work, use the supplied permitted operating notes, evidence and ownership; no engagement binding or CLI command is required. For a bound engagement, use bounded `fde handoff` or `fde resume`, then
|
|
9
|
+
**Read first:** for standalone work, use the supplied permitted operating notes, evidence and ownership; no engagement binding or CLI command is required. For a bound engagement, use bounded `fde handoff` or `fde resume`, then `fde recall <topic>` for relevant client patterns, earlier retrospectives, and missing evidence. Never initialize records merely to draft a handoff. Build the picture through relevant excerpts, not a full-directory load. Consult `terrain.md` only for code paths needed by the successor.
|
|
10
10
|
|
|
11
11
|
The engagement doesn't end at ship. It ends when the customer can maintain what was built without calling.
|
|
12
12
|
|
|
@@ -28,7 +28,7 @@ The engagement doesn't end at ship. It ends when the customer can maintain what
|
|
|
28
28
|
- Eval receipt: **n/a if no AI**, else final scoped eval result + operating owner and required human-review or bounded-automation authority recorded; kill switch / fallback named in `handoff.md`.
|
|
29
29
|
- One line in the retrospective: which bucket moved, by how much, vs baseline.
|
|
30
30
|
|
|
31
|
-
**2. The pattern.** Anything that happened here and
|
|
31
|
+
**2. The pattern.** Anything that happened here and may happen again - a compliance approach, a migration pattern, a stakeholder dynamic - is a candidate for the client's `patterns.md`. Use [encode-pattern](encode-pattern.md) to record applicability, counterexamples, and evidence. Cross-client generalizations need explicit approval and a user-chosen export destination under the applicable policy; closing an engagement does not authorize an automatic scan or export.
|
|
32
32
|
|
|
33
33
|
**3. The handoff.** Operational knowledge for the person woken at 2am, not technical documentation: the 3 things that will break and the fix for each · who holds the tribal knowledge · what each alert means · deploy and rollback in plain language. AI components additionally: model version, what normal output looks like (so drift is recognisable), fallback behaviour, who owns evaluation and corrective changes, and how to disable or contain the AI path using the supported fallback. Do not assume retraining is available or appropriate.
|
|
34
34
|
|
|
@@ -40,7 +40,7 @@ The engagement doesn't end at ship. It ends when the customer can maintain what
|
|
|
40
40
|
|
|
41
41
|
## Artifact
|
|
42
42
|
|
|
43
|
-
**`retrospectives/YYYY-MM-DD-<engagement>.md`** - one file per close
|
|
43
|
+
**`retrospectives/YYYY-MM-DD-<engagement>.md`** - one file per close, retaining dated lessons for targeted recall within this client. **`patterns.md`** - client pattern candidates and evidence. **`handoff.md`** - the 2am document, including the deployed revision and the policy, access, and ownership evidence current at handoff. If the project reopens, use [land](land.md) to recheck these before dependent action; closure evidence remains historical.
|
|
44
44
|
|
|
45
45
|
## Checkpoint
|
|
46
46
|
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
**Enter when:** the engagement is closing and reusable patterns exist, a technique worked well and will apply to future clients, the FDE notices themselves doing the same thing on a second engagement, or close identified a pattern worth preserving.
|
|
6
6
|
|
|
7
|
-
**Read first:** `decisions.md`, `reality.md`, `delivery.md`, `retrospectives/`, `context.md`. Patterns live in what was *done*, not what was planned.
|
|
7
|
+
**Read first:** permitted evidence from `decisions.md`, `reality.md`, `delivery.md`, `retrospectives/`, `patterns.md`, and `context.md`. For a bound engagement, use `fde recall <topic>` to retrieve relevant client patterns and retrospective excerpts; do not load whole directories. Patterns live in what was *done*, not what was planned.
|
|
8
8
|
|
|
9
9
|
The difference between a 5-year FDE and a 15-year FDE is not talent - it's encoded patterns. The 15-year FDE walks into a new engagement and recognises the situation in minutes because they've seen it before, named it, and know the move. Pattern extraction turns experience into reusable intelligence.
|
|
10
10
|
|
|
@@ -49,7 +49,7 @@ The difference between a 5-year FDE and a 15-year FDE is not talent - it's encod
|
|
|
49
49
|
| **Specific enough?** | Contains concrete steps, not just principles | "Build trust" / "Communicate well" - too vague to act on |
|
|
50
50
|
| **Repeatable?** | Applies to a class of situations, not just this one | Only worked because of a unique circumstance |
|
|
51
51
|
| **Falsifiable?** | You can tell when the pattern is working or not | No way to measure whether applying it helped |
|
|
52
|
-
| **
|
|
52
|
+
| **Useful again?** | A named move plus an artifact you could use when the situation and policy permit (pipe questions, CAB dance, eval golden shape, floor-drill script) | "We learned to communicate." No concrete move or conditions for reuse |
|
|
53
53
|
|
|
54
54
|
**4. Classify by stage.** Patterns sort into the same stages as the skills:
|
|
55
55
|
|
|
@@ -69,17 +69,15 @@ The difference between a 5-year FDE and a 15-year FDE is not talent - it's encod
|
|
|
69
69
|
- After modification: increment minor version with what changed and why
|
|
70
70
|
- After contradiction: note the counter-example, adjust the "watch out for" section
|
|
71
71
|
|
|
72
|
-
**6.
|
|
72
|
+
**6. Review before reuse.** Client patterns and retrospectives remain in that client's record. Recall relevant evidence with `fde recall <topic>` and check the situation trigger, applicability, counterexamples, and current policy before applying a move. Previous success is historical evidence, not present authority or proof of fit.
|
|
73
73
|
|
|
74
|
-
-
|
|
75
|
-
- Compare permitted decision summaries - are the same decisions being made?
|
|
76
|
-
- Compare permitted lessons - are the same lessons being learned twice?
|
|
74
|
+
Cross-client reuse requires an explicitly approved generalization exported to a user-chosen destination, permitted by the source customer's data policy. Review exactly what will leave the record before export. Do not automatically scan other clients, export patterns, or maintain a shared library. In the receiving engagement, use only the approved export and recheck applicability, counterexamples, and that customer's policy before reuse; do not pull the source client record into its context.
|
|
77
75
|
|
|
78
76
|
A pattern learned twice is a process failure. Encoding it prevents the third time.
|
|
79
77
|
|
|
80
78
|
## Artifact
|
|
81
79
|
|
|
82
|
-
**`patterns.md`** - candidates and evidence for this engagement, indexed by stage and situation trigger. A
|
|
80
|
+
**`patterns.md`** - candidates and evidence for this engagement, indexed by stage and situation trigger. A cross-client export is separate and explicitly approved, to a user-chosen destination: remove names, identifiers, distinctive operational details, secrets, and confidential code or data. Keep source receipts in the original record and export only permitted generalizations with their limits and counterexamples.
|
|
83
81
|
|
|
84
82
|
**`retrospectives/YYYY-MM-DD-<engagement>.md`** - reference to which patterns were extracted from this engagement.
|
|
85
83
|
|
|
@@ -93,4 +91,4 @@ Present the extracted patterns to the FDE: "From this engagement, I've identifie
|
|
|
93
91
|
- Patterns are steps, not principles. "Build trust" isn't a pattern; "fix a small visible bug on day one" is.
|
|
94
92
|
- Every pattern needs a situation trigger - the FDE must recognise when it applies.
|
|
95
93
|
- Version substantive changes. State the evidence and limits; repeated use is not automatic confirmation.
|
|
96
|
-
-
|
|
94
|
+
- Keep client evidence local to its record; share only explicitly approved generalizations.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# land - Interrogate the brief
|
|
2
2
|
|
|
3
|
-
**Enter when:** new customer, first meeting, just got the brief, nothing started yet.
|
|
3
|
+
**Enter when:** new customer, first meeting, just got the brief, nothing started yet, or an old or closed project is reopening.
|
|
4
4
|
|
|
5
5
|
**Read first:** apply [task context](task-context.md), then permitted `context.md` evidence if it exists and the supplied brief. Once the engagement type and AI/access policy are known, inspect the supplied repo/docs relevant to the ask before asking questions they can answer. This is a bounded evidence check, not a full discovery scan.
|
|
6
6
|
|
|
@@ -18,6 +18,8 @@ Then check - probe ONLY if it prevents a bad start:
|
|
|
18
18
|
|
|
19
19
|
State your read, let the FDE correct, then land.
|
|
20
20
|
|
|
21
|
+
**Reopening an old or closed project:** after the privacy-safe context check, use `fde recall <topic>` for relevant client patterns, retrospectives, and prior decisions. Treat old evidence as historical. Before dependent action, recheck current AI/data policy, access, decision and operating owners, and the deployed revision against current permitted evidence. Record changes and unknowns; an old approval or successful drill does not establish present authority or readiness. Continue independent preparation while material gaps are resolved.
|
|
22
|
+
|
|
21
23
|
## Brief interrogation (only when the brief is thin)
|
|
22
24
|
|
|
23
25
|
Use this when the ask is conventional or underspecified - missing who decides, why now, what success looks like, or the binding constraint. **Do not** run it when the FDE already gave a clear brief, is mid-flow, or asked for speed over verification.
|