fdeops 4.1.1 → 5.1.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.
Files changed (264) hide show
  1. package/AGENTS.md +2 -2
  2. package/README.md +85 -246
  3. package/bin/catalog-doc.js +38 -0
  4. package/bin/check.js +20 -49
  5. package/bin/fde.js +2 -2
  6. package/bin/generate-skills.js +11 -3
  7. package/bin/install.js +37 -3
  8. package/bin/skill-catalog.js +283 -16
  9. package/mcp/fdeops-ingest/package.json +1 -1
  10. package/package.json +2 -2
  11. package/plugin.json +1 -1
  12. package/skills/README.md +7 -0
  13. package/skills/audit/.fde-generated.json +10 -0
  14. package/skills/audit/SKILL.md +21 -0
  15. package/skills/audit/references/discover.md +112 -0
  16. package/skills/{fde-build → audit}/references/task-context.md +7 -1
  17. package/skills/board-memo/.fde-generated.json +10 -0
  18. package/skills/board-memo/SKILL.md +21 -0
  19. package/skills/{fde-debug → board-memo}/references/task-context.md +7 -1
  20. package/skills/brief/.fde-generated.json +9 -0
  21. package/skills/brief/SKILL.md +21 -0
  22. package/skills/brief/references/land.md +136 -0
  23. package/skills/{fde-discover → brief}/references/task-context.md +7 -1
  24. package/skills/{fde-build → build}/.fde-generated.json +2 -2
  25. package/skills/{fde-build → build}/SKILL.md +2 -2
  26. package/skills/{fde-evaluate → build}/references/task-context.md +7 -1
  27. package/skills/business-case/.fde-generated.json +9 -0
  28. package/skills/business-case/SKILL.md +21 -0
  29. package/skills/business-case/references/task-context.md +18 -0
  30. package/skills/connect/.fde-generated.json +12 -0
  31. package/skills/connect/SKILL.md +21 -0
  32. package/skills/connect/references/connect.md +24 -0
  33. package/skills/connect/references/debrief.md +91 -0
  34. package/skills/connect/references/ingest.md +75 -0
  35. package/skills/connect/references/source-setup.md +30 -0
  36. package/skills/connect/references/task-context.md +18 -0
  37. package/skills/dashboard/.fde-generated.json +9 -0
  38. package/skills/dashboard/SKILL.md +21 -0
  39. package/skills/dashboard/references/dashboard.md +40 -0
  40. package/skills/dashboard/references/task-context.md +18 -0
  41. package/skills/debrief/.fde-generated.json +12 -0
  42. package/skills/debrief/SKILL.md +21 -0
  43. package/skills/debrief/references/connect.md +24 -0
  44. package/skills/debrief/references/debrief.md +91 -0
  45. package/skills/debrief/references/ingest.md +75 -0
  46. package/skills/debrief/references/source-setup.md +30 -0
  47. package/skills/debrief/references/task-context.md +18 -0
  48. package/skills/{fde-debug → debug}/.fde-generated.json +2 -2
  49. package/skills/{fde-debug → debug}/SKILL.md +2 -2
  50. package/skills/debug/references/task-context.md +18 -0
  51. package/skills/demo-prep/.fde-generated.json +9 -0
  52. package/skills/demo-prep/SKILL.md +21 -0
  53. package/skills/demo-prep/references/demo-prep.md +31 -0
  54. package/skills/demo-prep/references/task-context.md +18 -0
  55. package/skills/discover/.fde-generated.json +10 -0
  56. package/skills/{fde-discover → discover}/SKILL.md +2 -2
  57. package/skills/discover/references/discover.md +112 -0
  58. package/skills/discover/references/task-context.md +18 -0
  59. package/skills/earn-trust/.fde-generated.json +9 -0
  60. package/skills/earn-trust/SKILL.md +21 -0
  61. package/skills/earn-trust/references/earn-trust.md +100 -0
  62. package/skills/earn-trust/references/task-context.md +18 -0
  63. package/skills/{fde-integrate → evaluate}/.fde-generated.json +2 -2
  64. package/skills/{fde-evaluate → evaluate}/SKILL.md +2 -2
  65. package/skills/evaluate/references/task-context.md +18 -0
  66. package/skills/fde/SKILL.md +11 -10
  67. package/skills/fde/references/connect.md +14 -24
  68. package/skills/fde/references/debrief.md +2 -0
  69. package/skills/fde/references/discover.md +66 -208
  70. package/skills/fde/references/ingest.md +4 -2
  71. package/skills/fde/references/plan.md +6 -6
  72. package/skills/fde/references/runbook.md +52 -120
  73. package/skills/fde/references/source-setup.md +30 -0
  74. package/skills/fde/references/task-context.md +7 -1
  75. package/skills/feedback/.fde-generated.json +9 -0
  76. package/skills/{fde-feedback → feedback}/SKILL.md +2 -2
  77. package/skills/feedback/references/task-context.md +18 -0
  78. package/skills/{fde-handoff → handoff}/.fde-generated.json +2 -2
  79. package/skills/{fde-handoff → handoff}/SKILL.md +2 -2
  80. package/skills/handoff/references/task-context.md +18 -0
  81. package/skills/ingest/.fde-generated.json +12 -0
  82. package/skills/ingest/SKILL.md +21 -0
  83. package/skills/ingest/references/connect.md +24 -0
  84. package/skills/ingest/references/debrief.md +91 -0
  85. package/skills/ingest/references/ingest.md +75 -0
  86. package/skills/ingest/references/source-setup.md +30 -0
  87. package/skills/ingest/references/task-context.md +18 -0
  88. package/skills/{fde-evaluate → integrate}/.fde-generated.json +2 -2
  89. package/skills/{fde-integrate → integrate}/SKILL.md +2 -2
  90. package/skills/integrate/references/task-context.md +18 -0
  91. package/skills/{fde-options → options}/.fde-generated.json +2 -2
  92. package/skills/{fde-options → options}/SKILL.md +2 -2
  93. package/skills/options/references/task-context.md +18 -0
  94. package/skills/plan/.fde-generated.json +10 -0
  95. package/skills/plan/SKILL.md +21 -0
  96. package/skills/plan/references/business-case.md +90 -0
  97. package/skills/{fde-poc → plan}/references/plan.md +6 -6
  98. package/skills/plan/references/task-context.md +18 -0
  99. package/skills/{fde-poc → poc}/.fde-generated.json +4 -4
  100. package/skills/{fde-poc → poc}/SKILL.md +2 -2
  101. package/skills/poc/references/audit.md +71 -0
  102. package/skills/poc/references/business-case.md +90 -0
  103. package/skills/poc/references/discover.md +112 -0
  104. package/skills/poc/references/plan.md +167 -0
  105. package/skills/poc/references/task-context.md +18 -0
  106. package/skills/prioritize/.fde-generated.json +10 -0
  107. package/skills/prioritize/SKILL.md +21 -0
  108. package/skills/prioritize/references/business-case.md +90 -0
  109. package/skills/prioritize/references/pick-three.md +95 -0
  110. package/skills/prioritize/references/task-context.md +18 -0
  111. package/skills/qa/.fde-generated.json +16 -0
  112. package/skills/{fde-qa → qa}/SKILL.md +2 -2
  113. package/skills/qa/references/task-context.md +18 -0
  114. package/skills/{fde-readout → readout}/.fde-generated.json +2 -2
  115. package/skills/{fde-readout → readout}/SKILL.md +2 -2
  116. package/skills/readout/references/board-memo.md +108 -0
  117. package/skills/readout/references/business-case.md +90 -0
  118. package/skills/readout/references/task-context.md +18 -0
  119. package/skills/red-team/.fde-generated.json +9 -0
  120. package/skills/red-team/SKILL.md +21 -0
  121. package/skills/red-team/references/red-team.md +105 -0
  122. package/skills/red-team/references/task-context.md +18 -0
  123. package/skills/rescue/.fde-generated.json +9 -0
  124. package/skills/rescue/SKILL.md +21 -0
  125. package/skills/rescue/references/rescue.md +82 -0
  126. package/skills/rescue/references/task-context.md +18 -0
  127. package/skills/review/.fde-generated.json +16 -0
  128. package/skills/{fde-review → review}/SKILL.md +2 -2
  129. package/skills/review/references/task-context.md +18 -0
  130. package/skills/rollback/.fde-generated.json +9 -0
  131. package/skills/rollback/SKILL.md +21 -0
  132. package/skills/rollback/references/rollback.md +102 -0
  133. package/skills/rollback/references/task-context.md +18 -0
  134. package/skills/runbook/.fde-generated.json +11 -0
  135. package/skills/runbook/SKILL.md +21 -0
  136. package/skills/runbook/references/close.md +66 -0
  137. package/skills/runbook/references/encode-pattern.md +96 -0
  138. package/skills/runbook/references/runbook.md +73 -0
  139. package/skills/runbook/references/task-context.md +18 -0
  140. package/skills/scope/.fde-generated.json +9 -0
  141. package/skills/{fde-scope → scope}/SKILL.md +2 -2
  142. package/skills/scope/references/task-context.md +18 -0
  143. package/skills/score-use-cases/.fde-generated.json +10 -0
  144. package/skills/score-use-cases/SKILL.md +21 -0
  145. package/skills/score-use-cases/references/business-case.md +90 -0
  146. package/skills/score-use-cases/references/score-use-cases.md +70 -0
  147. package/skills/score-use-cases/references/task-context.md +18 -0
  148. package/skills/ship/.fde-generated.json +16 -0
  149. package/skills/{fde-ship → ship}/SKILL.md +2 -2
  150. package/skills/ship/references/task-context.md +18 -0
  151. package/skills/switch-clients/.fde-generated.json +9 -0
  152. package/skills/switch-clients/SKILL.md +21 -0
  153. package/skills/switch-clients/references/switch-clients.md +114 -0
  154. package/skills/switch-clients/references/task-context.md +18 -0
  155. package/skills/test-assumptions/.fde-generated.json +9 -0
  156. package/skills/test-assumptions/SKILL.md +21 -0
  157. package/skills/test-assumptions/references/task-context.md +18 -0
  158. package/skills/test-assumptions/references/test-assumptions.md +102 -0
  159. package/skills/what-breaks/.fde-generated.json +9 -0
  160. package/skills/what-breaks/SKILL.md +21 -0
  161. package/skills/what-breaks/references/task-context.md +18 -0
  162. package/skills/what-breaks/references/what-breaks.md +91 -0
  163. package/skills/who-decides/.fde-generated.json +9 -0
  164. package/skills/who-decides/SKILL.md +21 -0
  165. package/skills/who-decides/references/task-context.md +18 -0
  166. package/skills/who-decides/references/who-decides.md +91 -0
  167. package/skills/fde-discover/.fde-generated.json +0 -10
  168. package/skills/fde-discover/references/discover.md +0 -254
  169. package/skills/fde-feedback/.fde-generated.json +0 -9
  170. package/skills/fde-feedback/references/task-context.md +0 -12
  171. package/skills/fde-handoff/references/task-context.md +0 -12
  172. package/skills/fde-integrate/references/task-context.md +0 -12
  173. package/skills/fde-options/references/task-context.md +0 -12
  174. package/skills/fde-poc/references/discover.md +0 -254
  175. package/skills/fde-poc/references/task-context.md +0 -12
  176. package/skills/fde-qa/.fde-generated.json +0 -16
  177. package/skills/fde-qa/references/task-context.md +0 -12
  178. package/skills/fde-readout/references/task-context.md +0 -12
  179. package/skills/fde-review/.fde-generated.json +0 -16
  180. package/skills/fde-review/references/task-context.md +0 -12
  181. package/skills/fde-scope/.fde-generated.json +0 -9
  182. package/skills/fde-scope/references/task-context.md +0 -12
  183. package/skills/fde-ship/.fde-generated.json +0 -16
  184. package/skills/fde-ship/references/task-context.md +0 -12
  185. /package/skills/{fde-discover → audit}/references/audit.md +0 -0
  186. /package/skills/{fde-readout → board-memo}/references/board-memo.md +0 -0
  187. /package/skills/{fde-options → board-memo}/references/business-case.md +0 -0
  188. /package/skills/{fde-build → build}/references/build.md +0 -0
  189. /package/skills/{fde-build → build}/references/debug.md +0 -0
  190. /package/skills/{fde-build → build}/references/eval-pack.md +0 -0
  191. /package/skills/{fde-build → build}/references/integrate.md +0 -0
  192. /package/skills/{fde-build → build}/references/qa.md +0 -0
  193. /package/skills/{fde-build → build}/references/review.md +0 -0
  194. /package/skills/{fde-build → build}/references/ship.md +0 -0
  195. /package/skills/{fde-build → build}/references/verification.md +0 -0
  196. /package/skills/{fde-poc → business-case}/references/business-case.md +0 -0
  197. /package/skills/{fde-debug → debug}/references/build.md +0 -0
  198. /package/skills/{fde-debug → debug}/references/debug.md +0 -0
  199. /package/skills/{fde-debug → debug}/references/eval-pack.md +0 -0
  200. /package/skills/{fde-debug → debug}/references/integrate.md +0 -0
  201. /package/skills/{fde-debug → debug}/references/qa.md +0 -0
  202. /package/skills/{fde-debug → debug}/references/review.md +0 -0
  203. /package/skills/{fde-debug → debug}/references/ship.md +0 -0
  204. /package/skills/{fde-debug → debug}/references/verification.md +0 -0
  205. /package/skills/{fde-poc → discover}/references/audit.md +0 -0
  206. /package/skills/{fde-evaluate → evaluate}/references/build.md +0 -0
  207. /package/skills/{fde-evaluate → evaluate}/references/debug.md +0 -0
  208. /package/skills/{fde-evaluate → evaluate}/references/eval-pack.md +0 -0
  209. /package/skills/{fde-evaluate → evaluate}/references/integrate.md +0 -0
  210. /package/skills/{fde-evaluate → evaluate}/references/qa.md +0 -0
  211. /package/skills/{fde-evaluate → evaluate}/references/review.md +0 -0
  212. /package/skills/{fde-evaluate → evaluate}/references/ship.md +0 -0
  213. /package/skills/{fde-evaluate → evaluate}/references/verification.md +0 -0
  214. /package/skills/{fde-feedback → feedback}/references/encode-pattern.md +0 -0
  215. /package/skills/{fde-handoff → handoff}/references/close.md +0 -0
  216. /package/skills/{fde-handoff → handoff}/references/encode-pattern.md +0 -0
  217. /package/skills/{fde-integrate → integrate}/references/build.md +0 -0
  218. /package/skills/{fde-integrate → integrate}/references/debug.md +0 -0
  219. /package/skills/{fde-integrate → integrate}/references/eval-pack.md +0 -0
  220. /package/skills/{fde-integrate → integrate}/references/integrate.md +0 -0
  221. /package/skills/{fde-integrate → integrate}/references/qa.md +0 -0
  222. /package/skills/{fde-integrate → integrate}/references/review.md +0 -0
  223. /package/skills/{fde-integrate → integrate}/references/ship.md +0 -0
  224. /package/skills/{fde-integrate → integrate}/references/verification.md +0 -0
  225. /package/skills/{fde-readout → options}/references/business-case.md +0 -0
  226. /package/skills/{fde-options → options}/references/test-assumptions.md +0 -0
  227. /package/skills/{fde-options → options}/references/three-options.md +0 -0
  228. /package/skills/{fde-poc → poc}/references/build.md +0 -0
  229. /package/skills/{fde-poc → poc}/references/debug.md +0 -0
  230. /package/skills/{fde-poc → poc}/references/eval-pack.md +0 -0
  231. /package/skills/{fde-poc → poc}/references/integrate.md +0 -0
  232. /package/skills/{fde-poc → poc}/references/poc.md +0 -0
  233. /package/skills/{fde-poc → poc}/references/qa.md +0 -0
  234. /package/skills/{fde-poc → poc}/references/review.md +0 -0
  235. /package/skills/{fde-poc → poc}/references/ship.md +0 -0
  236. /package/skills/{fde-poc → poc}/references/test-assumptions.md +0 -0
  237. /package/skills/{fde-poc → poc}/references/three-options.md +0 -0
  238. /package/skills/{fde-poc → poc}/references/verification.md +0 -0
  239. /package/skills/{fde-qa → qa}/references/build.md +0 -0
  240. /package/skills/{fde-qa → qa}/references/debug.md +0 -0
  241. /package/skills/{fde-qa → qa}/references/eval-pack.md +0 -0
  242. /package/skills/{fde-qa → qa}/references/integrate.md +0 -0
  243. /package/skills/{fde-qa → qa}/references/qa.md +0 -0
  244. /package/skills/{fde-qa → qa}/references/review.md +0 -0
  245. /package/skills/{fde-qa → qa}/references/ship.md +0 -0
  246. /package/skills/{fde-qa → qa}/references/verification.md +0 -0
  247. /package/skills/{fde-readout → readout}/references/readout.md +0 -0
  248. /package/skills/{fde-review → review}/references/build.md +0 -0
  249. /package/skills/{fde-review → review}/references/debug.md +0 -0
  250. /package/skills/{fde-review → review}/references/eval-pack.md +0 -0
  251. /package/skills/{fde-review → review}/references/integrate.md +0 -0
  252. /package/skills/{fde-review → review}/references/qa.md +0 -0
  253. /package/skills/{fde-review → review}/references/review.md +0 -0
  254. /package/skills/{fde-review → review}/references/ship.md +0 -0
  255. /package/skills/{fde-review → review}/references/verification.md +0 -0
  256. /package/skills/{fde-scope → scope}/references/hold-scope.md +0 -0
  257. /package/skills/{fde-ship → ship}/references/build.md +0 -0
  258. /package/skills/{fde-ship → ship}/references/debug.md +0 -0
  259. /package/skills/{fde-ship → ship}/references/eval-pack.md +0 -0
  260. /package/skills/{fde-ship → ship}/references/integrate.md +0 -0
  261. /package/skills/{fde-ship → ship}/references/qa.md +0 -0
  262. /package/skills/{fde-ship → ship}/references/review.md +0 -0
  263. /package/skills/{fde-ship → ship}/references/ship.md +0 -0
  264. /package/skills/{fde-ship → ship}/references/verification.md +0 -0
package/AGENTS.md CHANGED
@@ -1,10 +1,10 @@
1
1
  # AGENTS.md - working in the fdeops repository
2
2
 
3
- This repository **is** fdeops - the engagement record for Forward Deployed Engineers. One `@fde` skill, the `fde` CLI for deterministic work, and per-customer memory in `.fde/` as a side effect of the work (you still confirm judgment).
3
+ This repository **is** FDEOps: skills for Forward Deployed Engineers. The `fde` coordinator selects the relevant instructions for customer work. All 35 task skills also work individually. The local CLI manages customer records in `.fde/` files; users confirm consequential judgments.
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), 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).
7
+ For ongoing customer work, use **`@fde`**: read `skills/fde/SKILL.md`, select the relevant instructions, and follow its record rules. When the user selects a task such as `discover` or `build`, run that task directly with the supplied context; a customer record is optional. Do not make users choose a task when they have asked the coordinator for help. Other tools use 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
@@ -1,333 +1,172 @@
1
1
  # FDEOps
2
2
 
3
- **Forward deployed engineering skills for AI coding agents.**
3
+ **Forward deployed engineering skills for your AI coding agent.**
4
4
 
5
5
  <a name="why-use-it"></a>
6
6
 
7
- Take a customer request from discovery through implementation, verification and handoff. Use one task skill for the work in front of you, or `@fde` to coordinate the engagement and keep its decisions and evidence together.
7
+ Work through a customer project from the first conversation to a system their team can run. FDEOps helps your agent clarify the problem, compare solutions, write and test code, connect customer systems, and prepare delivery and handover evidence.
8
8
 
9
- Notes stay on your laptop, in a separate record for each client. Review the agent's proposed changes before saving them.
9
+ A **skill** is a set of instructions your AI coding agent follows. FDEOps includes **35 task skills + one coordinator, `fde`**. Use any skill directly, or ask `fde` to select the relevant skills as a customer project progresses.
10
10
 
11
- Implementation, integration, debugging and QA are included. Use your existing repository tools; no additional skill pack is required. Credentials, infrastructure and production authority still come from the customer.
11
+ Use it for a single integration, a small client project, or work within a larger enterprise team. You bring the customer context, repository tools and access. FDEOps supplies the working method; you and the responsible teams make the decisions.
12
12
 
13
- [Quick start](#quick-start) · [Daily fieldbook](#your-daily-fieldbook) · [Task skills](#task-skills) · [Documentation](docs/README.md)
13
+ [Get started](#quick-start) · [Choose a task](#task-skills) · [Keep a customer record](#keep-a-customer-record) · [Documentation](docs/README.md)
14
14
 
15
- <img width="960" height="640" alt="FDEOps: client delivery from the first meeting to handover" src="https://github.com/user-attachments/assets/2bcb8739-55ee-445d-8a1a-8b38433b7b58" />
15
+ ## Quick start
16
16
 
17
- ---
17
+ You need an AI coding agent that supports skills. The installation commands and FDEOps CLI require **Node.js 18+ and Git** on your machine.
18
18
 
19
- ## Task skills
19
+ ### Work on a customer project
20
20
 
21
- Call the task directly when you know what you need. No client folder is required for a one-off task.
22
-
23
- | Work | Skill |
24
- |------|-------|
25
- | Understand the workflow | `fde-discover` |
26
- | Handle a new scope request | `fde-scope` |
27
- | Compare approaches | `fde-options` |
28
- | Test a risky assumption | `fde-poc` |
29
- | Implement, integrate, repair | `fde-build`, `fde-integrate`, `fde-debug` |
30
- | Review, evaluate AI, test the journey | `fde-review`, `fde-evaluate`, `fde-qa` |
31
- | Release a verified increment | `fde-ship` |
32
- | Present evidence, transfer operation, reuse a lesson | `fde-readout`, `fde-handoff`, `fde-feedback` |
33
-
34
- For example, install just the integration skill:
21
+ Run this in your terminal and select your agent in the installer:
35
22
 
36
23
  ```bash
37
- npx skills add suboss87/fdeops --skill fde-integrate
24
+ npx skills add suboss87/fdeops --skill fde
38
25
  ```
39
26
 
40
- Ask it to connect a permitted customer API and test retry behavior. It includes the references it needs. `@fde` uses those same methods when the integration is part of an ongoing engagement. [Full pack and selective installation](docs/install.md#individual-skills-and-the-full-pack).
27
+ Then start a conversation with your agent:
41
28
 
42
- ## Quick Start
29
+ ```text
30
+ @fde this is client01. Their support team reads incoming requests,
31
+ checks internal documents, then assigns each request to another team.
32
+ Help me prepare for the first meeting. Here is the brief: …
33
+ ```
43
34
 
44
- **Try it in a local checkout.** Requires Node.js 18+ and Git:
35
+ `fde` asks for the information needed next and uses the relevant instructions. As work progresses, it can help you investigate delays, compare approaches, implement a change, test it, and prepare a customer update. You do not have to choose a skill at each step.
45
36
 
46
- ```bash
47
- npx fdeops scan
48
- ```
37
+ Naming the customer starts a local project record at `~/fde-engagements/client01/.fde/`. It keeps the brief, decisions, evidence and next actions together. Review proposed agreements and corrections before saving them. [How customer records work](#keep-a-customer-record).
49
38
 
50
- It prints what to look at on day one and the questions to ask. The scan reads local files without changing them. `npx` may download the package.
39
+ ### Use just one task
51
40
 
52
- **Then install the skill:**
41
+ For example, install only `discover`:
53
42
 
54
43
  ```bash
55
- npx skills add suboss87/fdeops --skill fde
44
+ npx skills add suboss87/fdeops --skill discover
56
45
  ```
57
46
 
58
- One chat. Name the client:
47
+ Then ask your agent:
59
48
 
60
49
  ```text
61
- @fde this is client01
50
+ Use FDEOps discover with these meeting notes. Show how the team handles
51
+ an incoming request today, where time goes, and what we still need to ask.
52
+ [Paste notes you are permitted to share.]
62
53
  ```
63
54
 
64
- That creates `~/fde-engagements/client01/.fde/` on your laptop. Paste kickoff notes in the same thread. `@fde` picks what to check. You still decide. After a meeting you review what changed, new asks, open questions, and next actions. Correct the proposal, then confirm the update.
65
-
66
- ### Make it fit your work
55
+ The agent works from your notes and returns its findings. You do not need to create a customer record for this task. Each task skill includes the instructions it needs and works without installing `fde` or another skill pack.
67
56
 
68
- Setup asks three short questions: how you work, what would help first, and what to mask before sharing context with your agent. Review your choices before saving; change them anytime.
57
+ **Want every task available by name?** Install the full pack using the [installation guide](docs/install.md#individual-skills-and-the-full-pack). Installing `fde` alone gives the coordinator all the underlying instructions; it does not add the 35 separate names to your agent's skill menu.
69
58
 
70
- ```bash
71
- npx fdeops@latest setup
72
- ```
73
-
74
- [See the choices and custom masking options](docs/USAGE.md#make-fdeops-fit-your-day).
59
+ Skill invocation differs between agents. Ask for the FDEOps skill by name or select it in your agent's skill picker. For Claude Code plugin installs, use `/fdeops:fde` or `/fdeops:discover`. See [host setup and name conflicts](docs/install.md#individual-skills-and-the-full-pack).
75
60
 
76
- Open the engagement fieldbook:
61
+ ## Choose a skill
77
62
 
78
- ```bash
79
- npx fdeops dashboard --open
80
- ```
63
+ <a name="task-skills"></a>
81
64
 
82
- Read-only HTML of the record - promised, measured, accepted, and evidence. Regenerate after you change memory. Day to day: [docs/USAGE.md](docs/USAGE.md).
65
+ Use the skill that matches the work in front of you. All skills are individually installable; the [complete catalog](docs/skills-reference.md) lists the input and result for each one.
83
66
 
84
- <details>
85
- <summary><b>Claude Code</b></summary>
67
+ | You need to… | Start with |
68
+ |---|---|
69
+ | Clarify a new customer request | `brief` or `discover` |
70
+ | Understand who can approve the change | `who-decides` |
71
+ | Decide what to build and what to leave out | `options`, `scope` or `plan` |
72
+ | Implement or connect customer systems | `build` or `integrate` |
73
+ | Find a failure or test the result | `debug`, `review`, `evaluate` or `qa` |
74
+ | Prepare an authorized release | `ship` |
75
+ | Review meeting notes or report progress | `debrief` or `readout` |
76
+ | Prepare the team to run the system | `runbook` or `handoff` |
86
77
 
87
- ```text
88
- /plugin marketplace add suboss87/fdeops
89
- /plugin install fdeops@fdeops
90
- ```
78
+ These examples are starting points, not a required sequence. The catalog also covers inherited projects, business cases, incidents, recovery, source connections and multiple customer records. `fde` uses the same instructions and loads additional detail only when needed.
91
79
 
92
- The plugin adds session hooks and the slash commands below. Skill-only installation does not add hooks. See the [installation guide](docs/install.md) for setup details.
80
+ **Which mode should I choose?** Use an individual skill for a specific task. Use `fde` when you want help across several tasks and a continuing customer record. Installing a skill makes it available independently; it does not remove its real input requirements. For example, `dashboard` needs records to display, while `debrief` can review pasted notes without saving anything.
93
81
 
94
- </details>
82
+ <a name="how-skills-work"></a>
95
83
 
96
- <details>
97
- <summary><b>Cursor</b></summary>
84
+ ## Keep a customer record
98
85
 
99
- After installing the skill, add the FDEOps instructions to the **client workspace** you have open:
86
+ An **engagement** is your ongoing project with a customer. Its record lives in a separate folder on your machine, outside the customer's application code:
100
87
 
101
- ```bash
102
- npx fdeops adapters .
88
+ ```text
89
+ ~/fde-engagements/client01/.fde/
103
90
  ```
104
91
 
105
- See [adapters/](adapters/README.md).
92
+ The files are readable Markdown. They track what the customer asked for, who can decide, what success means, what changed, and the evidence behind each result. You can inspect, copy or keep them if you stop using FDEOps.
93
+
94
+ After a meeting, paste permitted notes into the same agent conversation. It proposes the new requests, decisions, unresolved questions and next actions. Correct anything it misunderstood, then confirm the update.
106
95
 
107
- </details>
96
+ A request is not automatically an agreement. A passing test is not a production deployment. A measured improvement is not customer acceptance. FDEOps keeps those distinctions in the record.
108
97
 
109
- <details>
110
- <summary><b>Codex, other agents, and offline setup</b></summary>
98
+ At the next session, the coordinator retrieves a short summary rather than loading the full history. The default summary is capped at 16 KiB; older evidence is retrieved when needed. This cap applies to FDEOps output, not everything your agent loads.
111
99
 
112
- Use the skill installation above in a supported host. If the agent cannot create and bind the client folder, run this from the client workspace:
100
+ If your agent cannot start the record, run this in your terminal from the workspace where you work on that customer:
113
101
 
114
102
  ```bash
115
103
  npx fdeops resume --init client01
116
104
  ```
117
105
 
118
- For offline use, transfer an existing checkout to a machine with Node.js and Git, then run `node bin/install.js` from that checkout. Host adapters, local models, and advanced options are covered in [docs/install.md](docs/install.md).
119
-
120
- </details>
121
-
106
+ This links that workspace to the customer's record. [Daily use and meeting walkthrough](docs/USAGE.md) · [Record format](docs/schema.md).
122
107
 
123
108
  <a name="what-a-working-day-looks-like"></a>
124
109
 
125
110
  ## Your daily fieldbook
126
111
 
127
- See what needs your attention before you open another client thread: an open risk, missing evidence, a result waiting for acceptance, or the next action.
112
+ The fieldbook is a read-only browser view of your customer records. It shows next actions, open risks, missing evidence and results waiting for acceptance.
113
+
114
+ ![FDEOps fieldbook showing next actions and delivery gaps across fictional customers](media/fieldbook-preview.png)
128
115
 
129
- ![Dark FDEOps fieldbook showing next actions and delivery gaps across fictional clients](media/fieldbook-preview.png)
116
+ Run this in your terminal to view all your customers:
130
117
 
131
118
  ```bash
132
119
  npx fdeops dashboard --all --open
133
120
  ```
134
121
 
135
- Open a client, inspect its record, and copy an action into your agent to continue. The dashboard is a read-only snapshot; repeat the command after updating your records to refresh it.
136
-
137
- **Want to see the whole loop first?** `npx fdeops demo` runs fictional notes through review and prints a sample fieldbook path to open. It writes and resets its own folder under `~/fde-engagements/.demo/`, needs no AI model, and can be removed with `npx fdeops demo --clean`.
138
-
139
- ⭐ If FDEOps makes your client work easier, star the repo.
140
-
141
- ---
142
-
143
- <a name="from-the-first-meeting-to-handover"></a>
144
-
145
- ## Commands
146
-
147
- Describe the situation to `@fde`. It selects the relevant skill. The Claude Code plugin also provides these stage commands; other hosts use the same method through `@fde`.
148
-
149
- | What you're doing | Command | Stage |
150
- |-------------------|---------|-------|
151
- | First days. Get the brief. Name who signs. | `/brief` | Land |
152
- | Check the brief is the real job. | `/discover` | Discover |
153
- | Sequence from done, not from the ticket. | `/plan` | Plan |
154
- | Prove it on their staging, then go live. | `/ship` | Ship |
155
- | What you promised, measured, and who accepted. | `/outcome` | Outcome |
156
- | Hand it over. They run it without you. | `/close` | Close |
157
-
158
- Claude Code shortcuts for the moments between stages: `/debrief` (notes into the record), `/prep` (one page before you walk in), `/trust` (process gap, or they stopped trusting you), `/receipts` (find what was recorded and where it came from), `/readout` (Friday page for the sponsor; not a seventh stage).
159
-
160
- You can also just say it: “Prep me for the sponsor meeting,” “What did we agree about scope?” or “Help me hand this over.”
161
-
162
- ---
163
-
164
- ## Engagement workflows
165
-
166
- Thirty-four workflows, grouped by stage. Each skill gives the agent steps to follow, a record or report to produce, and a checkpoint with you. You describe the work; `@fde` finds the skill.
167
-
168
- Full detail: [docs/skills-reference.md](docs/skills-reference.md).
122
+ Open a customer's record and copy an action into your agent to continue. Run the command again after updates to refresh the view.
169
123
 
170
- ### Land
124
+ **Try a fictional example first:** `npx fdeops demo` runs sample meeting notes through review and produces a fieldbook without using an AI model. It creates or resets its demo folder under `~/fde-engagements/.demo/`. Remove that example with `npx fdeops demo --clean`.
171
125
 
172
- | Skill | What it does | Use when |
173
- |--------|--------------|----------|
174
- | [land](skills/fde/references/land.md) | Interrogate the brief | New client, first meeting, just got the brief |
175
- | [audit](skills/fde/references/audit.md) | Verify inherited claims | Taking over, previous consultant left |
176
- | [who-decides](skills/fde/references/who-decides.md) | Map decision rights | Need to know who matters |
177
- | [earn-trust](skills/fde/references/earn-trust.md) | Earn access | Need access or credibility |
178
- | [hold-scope](skills/fde/references/hold-scope.md) | Hold scope | "Also can you…", timeline unchanged |
126
+ ## Fit it to the project
179
127
 
180
- ### Discover
128
+ For a small task, use the supplied notes or code and return the result. For an ongoing project, use the customer record. For enterprise work, include the relevant teams, access rules, release checks and operating responsibilities in the plan.
181
129
 
182
- | Skill | What it does | Use when |
183
- |--------|--------------|----------|
184
- | [discover](skills/fde/references/discover.md) | Frame the problem | Brief feels wrong, shadow processes |
185
- | [test-assumptions](skills/fde/references/test-assumptions.md) | Test assumptions | Brief feels too neat |
186
- | [score-use-cases](skills/fde/references/score-use-cases.md) | Score use cases | Everything is P0 |
187
- | [poc](skills/fde/references/poc.md) | Validate the solution | POC, spike, need to de-risk |
130
+ The pack includes implementation, integration, debugging and QA instructions. It uses the repository's existing tools. It does not supply customer credentials, infrastructure, specialist approvals or production authority.
188
131
 
189
- ### Plan
132
+ Optional setup:
190
133
 
191
- | Skill | What it does | Use when |
192
- |--------|--------------|----------|
193
- | [plan](skills/fde/references/plan.md) | Sequence the work | What order, what is done |
194
- | [business-case](skills/fde/references/business-case.md) | Build the business case | Defend budget or timeline |
195
- | [three-options](skills/fde/references/three-options.md) | Generate options | "What should we do?" |
196
- | [pick-three](skills/fde/references/pick-three.md) | Prioritize three | Everything is urgent |
134
+ - **Personal preferences:** `npx fdeops setup` records how you work and what to mask before sharing context.
135
+ - **Repository reconnaissance:** `npx fdeops scan` reads local files and returns an initial assessment and questions. It does not change the repository.
136
+ - **Other agent hosts:** [Adapters](adapters/README.md) add a pointer to the coordinator in your workspace.
137
+ - **External sources:** [Connection recipes](mcp/recipes/) explain how to pull permitted material from tools you already use.
197
138
 
198
- ### Ship
199
-
200
- | Skill | What it does | Use when |
201
- |--------|--------------|----------|
202
- | [build](skills/fde/references/build.md) | Implement the increment | A scoped change in their repository |
203
- | [integrate](skills/fde/references/integrate.md) | Prove the system boundary | APIs, imports and write-back |
204
- | [debug](skills/fde/references/debug.md) | Reproduce and repair a failure | Unexpected behavior or a regression |
205
- | [qa](skills/fde/references/qa.md) | Exercise the delivered journey | Functional acceptance or browser QA |
206
- | [ship](skills/fde/references/ship.md) | Release with evidence | Ready for an authorized rollout |
207
- | [what-breaks](skills/fde/references/what-breaks.md) | Assess impact | Touching shared infrastructure |
208
- | [rescue](skills/fde/references/rescue.md) | Resolve the incident | Down, or they went quiet |
209
- | [review](skills/fde/references/review.md) | Review the change | Before merge, scope creep |
210
- | [rollback](skills/fde/references/rollback.md) | Rehearse rollback | "We can always revert" |
211
-
212
- ### Outcome
213
-
214
- | Skill | What it does | Use when |
215
- |--------|--------------|----------|
216
- | [readout](skills/fde/references/readout.md) | Report the outcome | Friday, sponsor update |
217
- | [demo-prep](skills/fde/references/demo-prep.md) | Prepare the demo | Demo or exec walkthrough |
218
- | [debrief](skills/fde/references/debrief.md) | Capture the meeting | Just left a meeting |
219
- | [board-memo](skills/fde/references/board-memo.md) | Brief the board | Justify continued investment |
220
- | [dashboard](skills/fde/references/dashboard.md) | Open the fieldbook | This customer, or all of them |
221
- | [ingest](skills/fde/references/ingest.md) | Ingest sources | Transcript, Notion, Slack |
222
- | [connect](skills/fde/references/connect.md) | Connect a source | Connect Granola |
223
-
224
- ### Close
225
-
226
- | Skill | What it does | Use when |
227
- |--------|--------------|----------|
228
- | [close](skills/fde/references/close.md) | Transfer operations | Wrapping up |
229
- | [runbook](skills/fde/references/runbook.md) | Write the runbook | They must operate without you |
230
- | [switch-clients](skills/fde/references/switch-clients.md) | Switch engagements | 2+ clients |
231
- | [encode-pattern](skills/fde/references/encode-pattern.md) | Encode the pattern | It will apply again |
232
- | [red-team](skills/fde/references/red-team.md) | Challenge the plan | "Poke holes in this" |
233
-
234
- 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).
235
-
236
- Optional pull: you add the source MCP; we **pull** on request. [mcp/recipes/](mcp/recipes/)
237
-
238
- ---
239
-
240
- <a name="use-the-cli-directly"></a>
241
-
242
- ## How Skills Work
243
-
244
- One `@fde`. One file per situation. One folder per client.
245
-
246
- Tell the agent what is happening. It reads the client record, opens the relevant skill, and works through the situation with you. After a meeting, it proposes the decisions, open questions, and next action. You correct what it misunderstood and confirm the update.
247
-
248
- A request stays a request until agreed. A staging result stays separate from production. Recording a result does not mean the customer accepted it.
249
-
250
- At the next session, FDEOps supplies a short summary instead of the whole history. Older detail stays on disk; `recall` finds relevant records when needed. The default summary is capped at 16 KiB, which limits FDEOps output rather than everything your agent loads.
251
-
252
- Before a sponsor meeting, `npx fdeops defend` separates recorded acceptance from claims and missing evidence. For a successor, `npx fdeops handoff --out successor.md` creates a portable summary with risks and sources.
253
-
254
- For free-form notes, start with `@fde`. The CLI's `debrief --smart` recognizes common phrases; it can miss details that your agent needs to help interpret. [Follow the notes → review → apply walkthrough](docs/USAGE.md#new-here-5-minutes).
255
-
256
- ---
257
-
258
- ## Engagement memory (`.fde/`)
259
-
260
- One folder per client. Plain markdown. Grep it, copy it, take it into a meeting.
261
-
262
- | File | Holds |
263
- |------|-------|
264
- | `context.md` | Where you are |
265
- | `brief.md` / `success.md` | What they asked; what “done” is and who signs |
266
- | `reality.md` / `terrain.md` | The real problem; the map |
267
- | `stakeholders.md` | `[signal:green\|amber\|red]` - worst active signal wins; empty is **new**, not green |
268
- | `trust-profile.md` | Sacred data, AI policy, approval chain |
269
- | `decisions.md` / `risks.md` / `delivery.md` | Dated choices; live risks; what shipped, evidence, rollback, acceptance |
270
-
271
- Schema: [docs/schema.md](docs/schema.md). Fieldbook: `npx fdeops dashboard --open` (bound) or `--all --open` (portfolio).
272
-
273
- ---
274
-
275
- ## Who this is for
276
-
277
- Forward deployed engineers, independent consultants, and small agencies working with customer teams. You need to carry the brief, decisions, delivery evidence, and handover across meetings, repositories, and sometimes several clients.
278
-
279
- If your work has no client commitments or operating handover to track, a simpler project note may be enough.
139
+ Use the [installation guide](docs/install.md) for the full pack, Claude Code hooks, offline setup and upgrading from earlier versions.
280
140
 
281
141
  <a name="your-records-your-control"></a>
282
142
 
283
143
  ## Your data stays yours
284
144
 
285
- The CLI works with local files and Git, without network calls or telemetry. Client records remain readable Markdown if you stop using FDEOps.
286
-
287
- Your AI host may send the material it reads to its configured model. CLI context and smart proposals mask common email, phone, SSN-shaped, and credential patterns locally; this is not complete PII detection. FDEOps redacts `<private>` blocks from CLI, dashboard, and hook outputs; do not load those raw blocks through the agent's file tools. Review reports before sharing client information.
145
+ The CLI reads local files and Git, with no network calls or telemetry. Installation through `npx` may download packages. Your AI host may send material it reads to its configured model.
288
146
 
289
- You review proposed decisions. Enabled session hooks can save where the session left off automatically; direct CLI write commands update records when you run them.
147
+ FDEOps masks common sensitive patterns and excludes `<private>` blocks from CLI, dashboard and hook outputs. This is not complete sensitive-data detection. Do not ask the agent to read private blocks directly, and use only material allowed by the customer's AI policy.
290
148
 
291
- The CLI and dashboard need no model. AI-assisted local use needs an agent with file and command access. Our small local-model tests produced wrong or incomplete answers, so check the [verification results](docs/verification.md) before relying on one for client work.
149
+ You review proposed decisions. Enabled session hooks can save mechanical session progress automatically; direct CLI write commands update records when you run them.
292
150
 
293
- [Privacy](PRIVACY.md) · [Security](SECURITY.md)
151
+ [Privacy](PRIVACY.md) · [Security](SECURITY.md) · [What has been tested and its limits](docs/verification.md)
294
152
 
295
- ## Principles
296
-
297
- - **Who signs** - name who can accept the work.
298
- - **Brief vs real job** - check what happens on the floor, not only the slide.
299
- - **Back from done** - agree how you will test success before planning the build.
300
- - **Their staging, then live** - prove the change and agree the release and rollback.
301
- - **Promised, measured, accepted** - keep each separate, with its evidence.
302
- - **They run it** - hand over the knowledge and ownership, not just the code.
303
- - **The kit says what to check. You still decide.**
304
-
305
- ---
153
+ ## Who this is for
306
154
 
307
- <a name="find-your-way-around"></a>
155
+ Forward deployed engineers, consultants and small delivery teams working with customers across meetings, codebases and operating environments. The pack supports the engineering and customer work together. Its checks help expose missing evidence; they do not replace professional judgment or prove every deployment safe.
308
156
 
309
- ## Project Structure
157
+ ## Find your way around
310
158
 
311
159
  | You want to… | Start here |
312
160
  |---|---|
313
- | Install or use FDEOps | [docs/](docs/README.md) |
314
- | Understand or change a workflow | [skills/fde/](skills/fde/SKILL.md) and its `references/` |
315
- | Work on the CLI or fieldbook | [bin/](bin/) and [test/](test/) |
316
- | Walk through a client engagement | [examples/](examples/) |
317
- | Check what has been tested | [evals/](evals/) and [verification](docs/verification.md) |
318
-
319
- [Full repository map](docs/REPO_LAYOUT.md).
320
-
321
- ---
322
-
323
- <a name="contribute"></a>
324
-
325
- ## Contributing
326
-
327
- **[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)
161
+ | Install or upgrade | [Installation](docs/install.md) |
162
+ | Work through your first customer project | [Usage](docs/USAGE.md) and [examples](examples/) |
163
+ | Explore the instructions | [Skill reference](docs/skills-reference.md) |
164
+ | Understand the repository | [Repository layout](docs/REPO_LAYOUT.md) |
165
+ | Check the test evidence | [Verification](docs/verification.md) |
166
+ | Improve the pack | [Contributing](CONTRIBUTING.md) |
328
167
 
329
- Skills should be **specific** (actionable steps), **verifiable** (an artifact in `.fde/`), and **minimal**. The `fde` CLI stays local-only.
168
+ Built by [Subash Natarajan](https://www.linkedin.com/in/subashn/). [Issues](https://github.com/suboss87/fdeops/issues) · [Discussions](https://github.com/suboss87/fdeops/discussions)
330
169
 
331
170
  ## License
332
171
 
333
- MIT - use these skills on client work.
172
+ MIT. Use FDEOps in your customer work. See [LICENSE](LICENSE).
@@ -0,0 +1,38 @@
1
+ #!/usr/bin/env node
2
+ const fs = require('node:fs')
3
+ const path = require('node:path')
4
+ const catalog = require('./skill-catalog')
5
+ const root = path.resolve(__dirname, '..')
6
+ const inputs = {
7
+ context: 'Supplied notes, code or evidence',
8
+ records: 'Existing customer records + CLI',
9
+ source: 'Host source tools or setup documentation',
10
+ 'record-write': 'Notes or source tools; selected record for staging/saving',
11
+ }
12
+ const cell = value => value.replace(/\|/g, '\\|').replace(/\n/g, ' ')
13
+ function renderCatalog(items = catalog) {
14
+ const out = ['# FDEOps skills', '', `**${items.length} task skills + one coordinator, \`fde\` = ${items.length + 1} installable skills.**`, '',
15
+ 'Every task below can be installed and used directly. Ask `fde` to select the relevant skills when working across a customer project. The groups help you find a task; they are not required phases.', '',
16
+ 'Install a task with `npx skills add suboss87/fdeops --skill <name>`, replacing `<name>` with its catalog name. See [installation](install.md#individual-skills-and-the-full-pack) for the full pack and host-specific invocation.', '',
17
+ 'Customer records live at `~/fde-engagements/<customer>/.fde/`. A skill provides instructions, not customer credentials or infrastructure. Drafting from supplied notes does not need a customer record. Viewing records does; staging or saving requires the intended customer and applicable confirmation.', '']
18
+ for (const group of [...new Set(items.map(item => item.group))]) {
19
+ out.push(`## ${group}`, '', '| Skill | Use it when | Result | Input needed |', '|---|---|---|---|')
20
+ for (const item of items.filter(item => item.group === group)) {
21
+ out.push(`| [${item.name}](../skills/${item.name}/SKILL.md) | ${cell(item.description)} | ${cell(item.result)} | ${inputs[item.inputMode]} |`)
22
+ }
23
+ out.push('')
24
+ }
25
+ out.push('## Domain guidance', '', 'The skills can apply supporting guidance for AI systems, financial services, healthcare, government work and customer-facing artifacts when relevant. These references are included instructions, not additional installable skills or a substitute for the responsible specialists.', '', '[Starting examples](skills.md) · [Customer records](schema.md) · [Verification and limits](verification.md)', '')
26
+ return out.join('\n')
27
+ }
28
+ function checkCatalog(base = root) {
29
+ const file = path.join(base, 'docs/skills-reference.md')
30
+ if (fs.readFileSync(file, 'utf8') !== renderCatalog()) throw new Error('Public skill catalog is stale; run npm run generate:skills')
31
+ const readme = fs.readFileSync(path.join(base, 'README.md'), 'utf8')
32
+ if (!readme.includes(`**${catalog.length} task skills + one coordinator, \`fde\`**`)) throw new Error('README skill count differs from the catalog')
33
+ }
34
+ module.exports = { renderCatalog, checkCatalog }
35
+ if (require.main === module) {
36
+ if (process.argv.includes('--check')) checkCatalog()
37
+ else fs.writeFileSync(path.join(root, 'docs/skills-reference.md'), renderCatalog())
38
+ }
package/bin/check.js CHANGED
@@ -115,9 +115,8 @@ for (const refFile of mentioned) {
115
115
  }
116
116
  ok(`router dispatch (${mentioned.length} reference targets verified) + memory contract`)
117
117
 
118
- // Public claims must match the router. The docs advertise a method count and a
119
- // per-domain list; both drifted from SKILL.md once (ingest / connect
120
- // routed but undocumented), and a number nobody can verify is worse than none.
118
+ // Public names, routed instructions, installation entries and generated docs
119
+ // must agree. A task must never be advertised without a usable package.
121
120
  {
122
121
  // Every routing row must parse. A row this misses is a method that could go
123
122
  // undocumented for free, so an unparsed row is a hard failure, not a silent skip.
@@ -150,55 +149,23 @@ ok(`router dispatch (${mentioned.length} reference targets verified) + memory co
150
149
  fail(`check.js cannot read the method name in a SKILL.md routing row: ${line.trim().slice(0, 80)}`)
151
150
  continue
152
151
  }
152
+ const entry = catalog.find(item => item.name === method)
153
+ const target = (line.match(/references\/([a-z0-9-]+)\.md/) || [])[1]
154
+ if (entry && entry.method !== target) fail(`Router points ${method} at ${target}, expected ${entry.method}`)
153
155
  routed.add(method)
154
156
  }
155
157
  if (!routed.size) fail('check.js could not parse the SKILL.md routing table')
156
158
 
157
- // docs/skills-reference.md is the canonical per-skill list: one row per
158
- // skill inside the six stage tables, ending at the Overlays section.
159
- const reference = read('docs/skills-reference.md')
160
- const documented = new Set()
161
- let documentedRows = 0
162
- for (const line of reference.split('### Overlays')[0].split('\n')) {
163
- const m = line.match(/^\|\s*\[([a-z0-9-]+)\]\(\.\.\/skills\/fde\/references\/([a-z0-9-]+\.md)\)/)
164
- if (!m) continue
165
- documentedRows++
166
- documented.add(m[1])
167
- // A link nobody followed is the same unverifiable claim this gate exists for:
168
- // the target must exist, and it must be the skill the text names.
169
- if (m[2] !== `${m[1]}.md`) {
170
- fail(`docs/skills-reference.md links [${m[1]}] at references/${m[2]}`)
171
- } else if (!fs.existsSync(path.join(root, 'skills', 'fde', 'references', m[2]))) {
172
- fail(`docs/skills-reference.md links references/${m[2]}, which does not exist`)
173
- }
174
- }
175
- if (documented.size !== documentedRows) {
176
- fail(`docs/skills-reference.md lists ${documentedRows} skill rows for ${documented.size} skills - a duplicate row inflates the count`)
177
- }
178
- const undocumented = [...routed].filter(name => !documented.has(name))
179
- if (undocumented.length) {
180
- fail(`SKILL.md routes skill(s) missing from docs/skills-reference.md: ${undocumented.join(', ')}`)
181
- }
182
- // and the other direction: a documented skill nothing routes to is a skill
183
- // the agent can never reach, advertised anyway.
184
- const unrouted = [...documented].filter(name => !routed.has(name))
185
- if (unrouted.length) {
186
- fail(`docs/skills-reference.md documents skill(s) SKILL.md never routes to: ${unrouted.join(', ')}`)
187
- }
188
- for (const rel of ['docs/skills.md', 'docs/skills-reference.md']) {
189
- const body = read(rel)
190
- // `-` is a word boundary, so \bscore\b matches inside `score-use-cases`:
191
- // a skill could disappear from the docs behind a hyphenated sibling.
192
- const absent = [...documented].filter(name => !new RegExp(`(?<![\\w-])${name}(?![\\w-])`).test(body))
193
- if (absent.length) fail(`${rel} does not list skill(s): ${absent.join(', ')}`)
194
- const claims = [...body.matchAll(/(\d+)\s+workflows/g)].map(m => Number(m[1]))
195
- if (!claims.length) fail(`${rel} must state how many workflows it documents`)
196
- const wrong = [...new Set(claims.filter(n => n !== documented.size))]
197
- if (wrong.length) {
198
- fail(`${rel} claims ${wrong.join('/')} skills; ${documented.size} are documented`)
199
- }
159
+ // Every routed task is installable and every public entry is reachable.
160
+ const names = new Set(catalog.map(item => item.name))
161
+ for (const name of routed) if (!names.has(name)) fail(`Routed task has no installable skill: ${name}`)
162
+ for (const item of catalog) {
163
+ if (!routed.has(item.name)) fail(`Installable skill has no coordinator route: ${item.name}`)
164
+ if (!router.includes(`references/${item.method}.md`)) fail(`Missing canonical instruction for ${item.name}`)
200
165
  }
201
- ok(`public skill count is verifiable (${documented.size} documented, ${routed.size} routed)`)
166
+ if (names.size !== catalog.length || new Set(catalog.map(item => item.method)).size !== catalog.length) fail('Duplicate public skill name or method')
167
+ try { require('./catalog-doc').checkCatalog(); ok('Public catalog matches installable skills') }
168
+ catch (error) { fail(error.message) }
202
169
 
203
170
  const refDir = path.join(root, 'skills', 'fde', 'references')
204
171
  const extra = fs.readdirSync(refDir).filter(f => f.endsWith('.md') && !mentioned.includes(f))
@@ -560,10 +527,14 @@ if (plugin.commands !== './.claude/commands' || plugin.skills !== './skills') {
560
527
  } else {
561
528
  for (const cmd of ['brief', 'discover', 'plan', 'ship', 'outcome', 'close', 'debrief', 'prep', 'trust', 'receipts', 'readout']) {
562
529
  const rel = `.claude/commands/${cmd}.md`
563
- if (!fs.existsSync(path.join(root, rel))) fail(`${rel} missing`)
530
+ const task = catalog.find(item => item.name === cmd)
531
+ if (task) {
532
+ if (!fs.existsSync(path.join(root, 'skills', cmd, 'SKILL.md'))) fail(`Missing command skill: ${cmd}`)
533
+ if (fs.existsSync(path.join(root, rel))) fail(`Duplicate command and task skill: ${cmd}`)
534
+ } else if (!fs.existsSync(path.join(root, rel))) fail(`${rel} missing`)
564
535
  else if (!read(rel).includes('@fde')) fail(`${rel} must load @fde`)
565
536
  }
566
- ok('slash commands load @fde')
537
+ ok('Task commands have one entry; legacy engagement shortcuts load @fde')
567
538
  }
568
539
 
569
540
  if (!fs.existsSync(path.join(root, 'mcp', 'fdeops-ingest', 'server.js'))) {
package/bin/fde.js CHANGED
@@ -569,8 +569,8 @@ function withFileLock(targetPath, fn, opts = {}) {
569
569
  console.error(msg)
570
570
  process.exit(1)
571
571
  }
572
- const waitUntil = Date.now() + 20
573
- while (Date.now() < waitUntil) { /* spin */ }
572
+ // This CLI is synchronous; yield CPU while the other writer finishes.
573
+ Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, 20)
574
574
  continue
575
575
  }
576
576
  if (opts.soft) throw e