@bevel-software/platform-core-backend 0.34.0 → 0.36.1

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 (908) hide show
  1. package/agent-guide/access-control.md +146 -300
  2. package/agent-guide/conventions.md +23 -25
  3. package/agent-guide/directory-structure.md +72 -120
  4. package/agent-guide/drafts-and-change-requests.md +92 -0
  5. package/agent-guide/for-git-users.md +47 -0
  6. package/agent-guide/glossary.md +36 -0
  7. package/agent-guide/how-agents-find-things.md +49 -0
  8. package/agent-guide/html-views.md +16 -11
  9. package/agent-guide/new-knowledge-base.md +9 -8
  10. package/agent-guide/onboarding.md +111 -0
  11. package/agent-guide/skills.md +67 -42
  12. package/agent-guide/start-here.md +66 -0
  13. package/agent-guide/tool-manuals.md +133 -154
  14. package/agent-guide/tools.md +67 -0
  15. package/agent-guide/where-a-new-file-goes.md +45 -28
  16. package/dist/core/catalog-cache-invalidation.d.ts +2 -2
  17. package/dist/core/catalog-cache-invalidation.d.ts.map +1 -1
  18. package/dist/core/compose-embed.d.ts +2 -2
  19. package/dist/core/compose-embed.d.ts.map +1 -1
  20. package/dist/core/compose-embed.js +1 -1
  21. package/dist/core/compose-embed.js.map +1 -1
  22. package/dist/core/core-ports.d.ts +19 -4
  23. package/dist/core/core-ports.d.ts.map +1 -1
  24. package/dist/core/core-ports.js.map +1 -1
  25. package/dist/core/create-core-server.d.ts.map +1 -1
  26. package/dist/core/create-core-server.js +27 -25
  27. package/dist/core/create-core-server.js.map +1 -1
  28. package/dist/core/create-core-services.d.ts +25 -13
  29. package/dist/core/create-core-services.d.ts.map +1 -1
  30. package/dist/core/create-core-services.js +75 -60
  31. package/dist/core/create-core-services.js.map +1 -1
  32. package/dist/core/lifecycle.d.ts +4 -4
  33. package/dist/core/lifecycle.d.ts.map +1 -1
  34. package/dist/core/lifecycle.js +5 -5
  35. package/dist/core/lifecycle.js.map +1 -1
  36. package/dist/core-config.d.ts +2 -2
  37. package/dist/core-config.js +3 -3
  38. package/dist/core-config.js.map +1 -1
  39. package/dist/index.d.ts +4 -4
  40. package/dist/index.d.ts.map +1 -1
  41. package/dist/index.js +3 -3
  42. package/dist/index.js.map +1 -1
  43. package/dist/modules/access/access-control.interface.d.ts +22 -0
  44. package/dist/modules/access/access-control.interface.d.ts.map +1 -1
  45. package/dist/modules/access/access-control.service.d.ts +3 -1
  46. package/dist/modules/access/access-control.service.d.ts.map +1 -1
  47. package/dist/modules/access/access-control.service.js +76 -1
  48. package/dist/modules/access/access-control.service.js.map +1 -1
  49. package/dist/modules/access/access-declarations.d.ts +2 -2
  50. package/dist/modules/access/access-declarations.d.ts.map +1 -1
  51. package/dist/modules/access/access-declarations.js +2 -2
  52. package/dist/modules/access/access-declarations.js.map +1 -1
  53. package/dist/modules/access/access-mutation.service.d.ts +2 -2
  54. package/dist/modules/access/access-mutation.service.d.ts.map +1 -1
  55. package/dist/modules/access/access-mutation.service.js +2 -2
  56. package/dist/modules/access/access-mutation.service.js.map +1 -1
  57. package/dist/modules/access/access-requests.routes.d.ts +2 -2
  58. package/dist/modules/access/access-requests.routes.d.ts.map +1 -1
  59. package/dist/modules/access/access-requests.routes.js +5 -5
  60. package/dist/modules/access/access-requests.routes.js.map +1 -1
  61. package/dist/modules/access/access-requests.service.d.ts +2 -2
  62. package/dist/modules/access/access-requests.service.d.ts.map +1 -1
  63. package/dist/modules/access/access-requests.service.js +11 -11
  64. package/dist/modules/access/access-requests.service.js.map +1 -1
  65. package/dist/modules/access/access.routes.d.ts +2 -2
  66. package/dist/modules/access/access.routes.d.ts.map +1 -1
  67. package/dist/modules/access/access.routes.js +32 -13
  68. package/dist/modules/access/access.routes.js.map +1 -1
  69. package/dist/modules/access/admin-locked-commit.d.ts +5 -5
  70. package/dist/modules/access/admin-locked-commit.d.ts.map +1 -1
  71. package/dist/modules/access/admin-locked-commit.js +7 -7
  72. package/dist/modules/access/admin-locked-commit.js.map +1 -1
  73. package/dist/modules/access/admin-route-helpers.d.ts +1 -1
  74. package/dist/modules/access/admin-route-helpers.js +5 -5
  75. package/dist/modules/access/admin-route-helpers.js.map +1 -1
  76. package/dist/modules/access/change-read-gate.d.ts +1 -1
  77. package/dist/modules/access/change-read-gate.js +1 -1
  78. package/dist/modules/access/groups-admin.service.d.ts +7 -7
  79. package/dist/modules/access/groups-admin.service.d.ts.map +1 -1
  80. package/dist/modules/access/groups-admin.service.js +6 -6
  81. package/dist/modules/access/groups-admin.service.js.map +1 -1
  82. package/dist/modules/access/index.d.ts +1 -1
  83. package/dist/modules/access/index.d.ts.map +1 -1
  84. package/dist/modules/access/reference-scan.d.ts +1 -1
  85. package/dist/modules/access/roles-admin.service.d.ts +7 -7
  86. package/dist/modules/access/roles-admin.service.d.ts.map +1 -1
  87. package/dist/modules/access/roles-admin.service.js +8 -8
  88. package/dist/modules/access/roles-admin.service.js.map +1 -1
  89. package/dist/modules/access/synced-groups-committer.d.ts +4 -4
  90. package/dist/modules/access/synced-groups-committer.d.ts.map +1 -1
  91. package/dist/modules/access/synced-groups-committer.js +7 -7
  92. package/dist/modules/access/synced-groups-committer.js.map +1 -1
  93. package/dist/modules/access/user-access-removal.service.d.ts +6 -6
  94. package/dist/modules/access/user-access-removal.service.d.ts.map +1 -1
  95. package/dist/modules/access/user-access-removal.service.js +4 -4
  96. package/dist/modules/access/user-access-removal.service.js.map +1 -1
  97. package/dist/modules/access-model/access-errors.d.ts +4 -4
  98. package/dist/modules/access-model/access-errors.d.ts.map +1 -1
  99. package/dist/modules/access-model/access-errors.js +4 -4
  100. package/dist/modules/access-model/access-errors.js.map +1 -1
  101. package/dist/modules/access-model/access-grammar.d.ts +1 -1
  102. package/dist/modules/access-model/access-grammar.js +4 -4
  103. package/dist/modules/access-model/change-gate.d.ts +1 -1
  104. package/dist/modules/access-model/change-gate.js +1 -1
  105. package/dist/modules/access-model/roles-yaml-guard.d.ts +4 -4
  106. package/dist/modules/access-model/roles-yaml-guard.d.ts.map +1 -1
  107. package/dist/modules/access-model/roles-yaml-guard.js +4 -4
  108. package/dist/modules/access-model/roles-yaml-guard.js.map +1 -1
  109. package/dist/modules/agent-guide/agent-guide.d.ts +63 -18
  110. package/dist/modules/agent-guide/agent-guide.d.ts.map +1 -1
  111. package/dist/modules/agent-guide/agent-guide.js +144 -30
  112. package/dist/modules/agent-guide/agent-guide.js.map +1 -1
  113. package/dist/modules/agent-guide/agent-guide.tools.d.ts +6 -2
  114. package/dist/modules/agent-guide/agent-guide.tools.d.ts.map +1 -1
  115. package/dist/modules/agent-guide/agent-guide.tools.js +45 -31
  116. package/dist/modules/agent-guide/agent-guide.tools.js.map +1 -1
  117. package/dist/modules/agent-guide/guide-budget.d.ts +51 -0
  118. package/dist/modules/agent-guide/guide-budget.d.ts.map +1 -0
  119. package/dist/modules/agent-guide/guide-budget.js +71 -0
  120. package/dist/modules/agent-guide/guide-budget.js.map +1 -0
  121. package/dist/modules/agent-guide/index.d.ts +2 -1
  122. package/dist/modules/agent-guide/index.d.ts.map +1 -1
  123. package/dist/modules/agent-guide/index.js +2 -1
  124. package/dist/modules/agent-guide/index.js.map +1 -1
  125. package/dist/modules/agent-instructions/agent-instructions.routes.d.ts +12 -5
  126. package/dist/modules/agent-instructions/agent-instructions.routes.d.ts.map +1 -1
  127. package/dist/modules/agent-instructions/agent-instructions.routes.js +13 -6
  128. package/dist/modules/agent-instructions/agent-instructions.routes.js.map +1 -1
  129. package/dist/modules/agent-instructions/compose.d.ts +15 -8
  130. package/dist/modules/agent-instructions/compose.d.ts.map +1 -1
  131. package/dist/modules/agent-instructions/compose.js +28 -10
  132. package/dist/modules/agent-instructions/compose.js.map +1 -1
  133. package/dist/modules/agent-instructions/shared-file-rules.d.ts +14 -6
  134. package/dist/modules/agent-instructions/shared-file-rules.d.ts.map +1 -1
  135. package/dist/modules/agent-instructions/shared-file-rules.js +60 -18
  136. package/dist/modules/agent-instructions/shared-file-rules.js.map +1 -1
  137. package/dist/modules/auth/account-erasure.service.d.ts +36 -7
  138. package/dist/modules/auth/account-erasure.service.d.ts.map +1 -1
  139. package/dist/modules/auth/account-erasure.service.js +30 -10
  140. package/dist/modules/auth/account-erasure.service.js.map +1 -1
  141. package/dist/modules/auth/account-hooks.d.ts +20 -0
  142. package/dist/modules/auth/account-hooks.d.ts.map +1 -1
  143. package/dist/modules/auth/account-hooks.js +10 -0
  144. package/dist/modules/auth/account-hooks.js.map +1 -1
  145. package/dist/modules/auth/account-switch-lock.js +2 -2
  146. package/dist/modules/auth/account-switch-lock.js.map +1 -1
  147. package/dist/modules/auth/account.routes.d.ts +7 -2
  148. package/dist/modules/auth/account.routes.d.ts.map +1 -1
  149. package/dist/modules/auth/account.routes.js +23 -4
  150. package/dist/modules/auth/account.routes.js.map +1 -1
  151. package/dist/modules/auth/auth.service.d.ts +1 -1
  152. package/dist/modules/auth/auth.service.js +4 -4
  153. package/dist/modules/auth/auth.service.js.map +1 -1
  154. package/dist/modules/auth/index.d.ts +1 -0
  155. package/dist/modules/auth/index.d.ts.map +1 -1
  156. package/dist/modules/code-mode/code-mode.tool.js +2 -2
  157. package/dist/modules/code-mode/code-mode.tool.js.map +1 -1
  158. package/dist/modules/connection-probe/connection-probe.service.d.ts +0 -12
  159. package/dist/modules/connection-probe/connection-probe.service.d.ts.map +1 -1
  160. package/dist/modules/connection-probe/connection-probe.service.js +1 -38
  161. package/dist/modules/connection-probe/connection-probe.service.js.map +1 -1
  162. package/dist/modules/database/core-schema.js +2 -2
  163. package/dist/modules/database/core-schema.js.map +1 -1
  164. package/dist/modules/diff/diff.routes.d.ts +3 -3
  165. package/dist/modules/diff/diff.routes.d.ts.map +1 -1
  166. package/dist/modules/diff/diff.routes.js +7 -7
  167. package/dist/modules/diff/diff.routes.js.map +1 -1
  168. package/dist/modules/embed/embed.routes.js +1 -1
  169. package/dist/modules/embed/embed.routes.js.map +1 -1
  170. package/dist/modules/embed/embed.service.d.ts +4 -4
  171. package/dist/modules/embed/embed.service.d.ts.map +1 -1
  172. package/dist/modules/embed/embed.service.js +18 -18
  173. package/dist/modules/embed/embed.service.js.map +1 -1
  174. package/dist/modules/kb-fs/branch-name.js +8 -8
  175. package/dist/modules/kb-fs/branch-name.js.map +1 -1
  176. package/dist/modules/kb-fs/file-change-notifier.d.ts +2 -2
  177. package/dist/modules/kb-fs/locking-filesystem.d.ts +9 -9
  178. package/dist/modules/kb-fs/locking-filesystem.d.ts.map +1 -1
  179. package/dist/modules/kb-fs/locking-filesystem.js +27 -27
  180. package/dist/modules/kb-fs/locking-filesystem.js.map +1 -1
  181. package/dist/modules/kb-fs/repo-path.js +5 -5
  182. package/dist/modules/kb-fs/repo-path.js.map +1 -1
  183. package/dist/modules/kb-fs/tmp-ref.d.ts +2 -2
  184. package/dist/modules/kb-fs/tmp-ref.d.ts.map +1 -1
  185. package/dist/modules/kb-fs/tmp-ref.js +2 -2
  186. package/dist/modules/kb-fs/tmp-ref.js.map +1 -1
  187. package/dist/modules/kb-sync/index.d.ts +1 -1
  188. package/dist/modules/kb-sync/index.d.ts.map +1 -1
  189. package/dist/modules/kb-sync/kb-sync.interface.d.ts +3 -3
  190. package/dist/modules/kb-sync/kb-sync.interface.d.ts.map +1 -1
  191. package/dist/modules/kb-sync/kb-sync.service.d.ts +3 -3
  192. package/dist/modules/kb-sync/kb-sync.service.d.ts.map +1 -1
  193. package/dist/modules/kb-sync/kb-sync.service.js +10 -10
  194. package/dist/modules/kb-sync/kb-sync.service.js.map +1 -1
  195. package/dist/modules/mcp/mcp.service.d.ts +11 -4
  196. package/dist/modules/mcp/mcp.service.d.ts.map +1 -1
  197. package/dist/modules/mcp/mcp.service.js +80 -53
  198. package/dist/modules/mcp/mcp.service.js.map +1 -1
  199. package/dist/modules/onboarding/onboarding.contract.d.ts +1 -1
  200. package/dist/modules/onboarding/onboarding.routes.js +2 -2
  201. package/dist/modules/onboarding/onboarding.routes.js.map +1 -1
  202. package/dist/modules/onboarding/starter-pack.service.d.ts +4 -4
  203. package/dist/modules/onboarding/starter-pack.service.d.ts.map +1 -1
  204. package/dist/modules/onboarding/starter-pack.service.js +4 -4
  205. package/dist/modules/onboarding/starter-pack.service.js.map +1 -1
  206. package/dist/modules/plugins/join-request-jobs.service.d.ts +2 -2
  207. package/dist/modules/plugins/join-request-jobs.service.d.ts.map +1 -1
  208. package/dist/modules/plugins/join-request-jobs.service.js +7 -7
  209. package/dist/modules/plugins/join-request-jobs.service.js.map +1 -1
  210. package/dist/modules/plugins/join-requests.service.d.ts +3 -3
  211. package/dist/modules/plugins/join-requests.service.d.ts.map +1 -1
  212. package/dist/modules/plugins/join-requests.service.js +5 -5
  213. package/dist/modules/plugins/join-requests.service.js.map +1 -1
  214. package/dist/modules/plugins/plugin-rename.service.js +1 -1
  215. package/dist/modules/plugins/plugin-rename.service.js.map +1 -1
  216. package/dist/modules/plugins/plugins.routes.d.ts +2 -2
  217. package/dist/modules/plugins/plugins.routes.d.ts.map +1 -1
  218. package/dist/modules/plugins/plugins.routes.js +8 -8
  219. package/dist/modules/plugins/plugins.routes.js.map +1 -1
  220. package/dist/modules/secrets-vault/db-secrets-vault.service.d.ts +87 -2
  221. package/dist/modules/secrets-vault/db-secrets-vault.service.d.ts.map +1 -1
  222. package/dist/modules/secrets-vault/db-secrets-vault.service.js +635 -74
  223. package/dist/modules/secrets-vault/db-secrets-vault.service.js.map +1 -1
  224. package/dist/modules/secrets-vault/index.d.ts +3 -2
  225. package/dist/modules/secrets-vault/index.d.ts.map +1 -1
  226. package/dist/modules/secrets-vault/index.js +2 -1
  227. package/dist/modules/secrets-vault/index.js.map +1 -1
  228. package/dist/modules/secrets-vault/managed-sign-in-erasure.d.ts +36 -0
  229. package/dist/modules/secrets-vault/managed-sign-in-erasure.d.ts.map +1 -0
  230. package/dist/modules/secrets-vault/managed-sign-in-erasure.js +37 -0
  231. package/dist/modules/secrets-vault/managed-sign-in-erasure.js.map +1 -0
  232. package/dist/modules/secrets-vault/secrets-vault.contract.d.ts +205 -11
  233. package/dist/modules/secrets-vault/secrets-vault.contract.d.ts.map +1 -1
  234. package/dist/modules/secrets-vault/secrets-vault.contract.js +27 -0
  235. package/dist/modules/secrets-vault/secrets-vault.contract.js.map +1 -1
  236. package/dist/modules/secrets-vault/secrets-vault.routes.d.ts +7 -1
  237. package/dist/modules/secrets-vault/secrets-vault.routes.d.ts.map +1 -1
  238. package/dist/modules/secrets-vault/secrets-vault.routes.js +206 -45
  239. package/dist/modules/secrets-vault/secrets-vault.routes.js.map +1 -1
  240. package/dist/modules/settings/connection-check.js +1 -1
  241. package/dist/modules/settings/connection-check.js.map +1 -1
  242. package/dist/modules/settings/deployment-settings.service.js +1 -1
  243. package/dist/modules/settings/git-root-folders.js +1 -1
  244. package/dist/modules/settings/git-root-folders.js.map +1 -1
  245. package/dist/modules/settings/oidc-check.d.ts.map +1 -1
  246. package/dist/modules/settings/oidc-check.js +5 -17
  247. package/dist/modules/settings/oidc-check.js.map +1 -1
  248. package/dist/modules/settings/setup.routes.d.ts +1 -1
  249. package/dist/modules/settings/setup.routes.js +1 -1
  250. package/dist/modules/skills/pending-skills.service.d.ts +3 -3
  251. package/dist/modules/skills/pending-skills.service.d.ts.map +1 -1
  252. package/dist/modules/skills/pending-skills.service.js +4 -4
  253. package/dist/modules/skills/pending-skills.service.js.map +1 -1
  254. package/dist/modules/skills/skill-access-requests.routes.d.ts +2 -2
  255. package/dist/modules/skills/skill-access-requests.routes.d.ts.map +1 -1
  256. package/dist/modules/skills/skill-access-requests.routes.js +5 -5
  257. package/dist/modules/skills/skill-access-requests.routes.js.map +1 -1
  258. package/dist/modules/skills/skills.tools.js +1 -1
  259. package/dist/modules/skills/skills.tools.js.map +1 -1
  260. package/dist/modules/tool-helpers/tool-context.d.ts +4 -4
  261. package/dist/modules/tool-helpers/tool-context.d.ts.map +1 -1
  262. package/dist/modules/tool-helpers/tool-context.js +2 -2
  263. package/dist/modules/tool-helpers/tool-context.js.map +1 -1
  264. package/dist/modules/tool-helpers/tool-def.js +1 -1
  265. package/dist/modules/tool-helpers/tool-def.js.map +1 -1
  266. package/dist/modules/tool-helpers/tool-handler.js +2 -2
  267. package/dist/modules/tool-helpers/tool-handler.js.map +1 -1
  268. package/dist/modules/tool-helpers/tool.contract.d.ts +4 -4
  269. package/dist/modules/tool-helpers/tool.contract.d.ts.map +1 -1
  270. package/dist/modules/tool-manuals/mcp-json-discovery.d.ts +7 -1
  271. package/dist/modules/tool-manuals/mcp-json-discovery.d.ts.map +1 -1
  272. package/dist/modules/tool-manuals/mcp-json-discovery.js +69 -38
  273. package/dist/modules/tool-manuals/mcp-json-discovery.js.map +1 -1
  274. package/dist/modules/tool-manuals/mcp-server-edit.service.js +1 -1
  275. package/dist/modules/tool-manuals/mcp-server-edit.service.js.map +1 -1
  276. package/dist/modules/tool-manuals/pending-tools.service.d.ts +3 -3
  277. package/dist/modules/tool-manuals/pending-tools.service.d.ts.map +1 -1
  278. package/dist/modules/tool-manuals/pending-tools.service.js +4 -4
  279. package/dist/modules/tool-manuals/pending-tools.service.js.map +1 -1
  280. package/dist/modules/tool-manuals/tool-delete.service.js +1 -1
  281. package/dist/modules/tool-manuals/tool-delete.service.js.map +1 -1
  282. package/dist/modules/tool-manuals/tool-manuals.contract.d.ts +70 -3
  283. package/dist/modules/tool-manuals/tool-manuals.contract.d.ts.map +1 -1
  284. package/dist/modules/tool-manuals/tool-manuals.service.d.ts +18 -8
  285. package/dist/modules/tool-manuals/tool-manuals.service.d.ts.map +1 -1
  286. package/dist/modules/tool-manuals/tool-manuals.service.js +166 -49
  287. package/dist/modules/tool-manuals/tool-manuals.service.js.map +1 -1
  288. package/dist/modules/tool-manuals/tool-manuals.tools.d.ts +11 -2
  289. package/dist/modules/tool-manuals/tool-manuals.tools.d.ts.map +1 -1
  290. package/dist/modules/tool-manuals/tool-manuals.tools.js +66 -24
  291. package/dist/modules/tool-manuals/tool-manuals.tools.js.map +1 -1
  292. package/dist/modules/version-control/agent-tools/change-request-read-shape.d.ts.map +1 -0
  293. package/dist/modules/version-control/agent-tools/change-request-read-shape.js.map +1 -0
  294. package/dist/modules/version-control/agent-tools/change-request-read.tools.d.ts.map +1 -0
  295. package/dist/modules/{workflow → version-control}/agent-tools/change-request-read.tools.js +2 -2
  296. package/dist/modules/version-control/agent-tools/change-request-read.tools.js.map +1 -0
  297. package/dist/modules/version-control/agent-tools/change-request-summary.d.ts.map +1 -0
  298. package/dist/modules/version-control/agent-tools/change-request-summary.js.map +1 -0
  299. package/dist/modules/{workflow/agent-tools/workflow.tools.d.ts → version-control/agent-tools/version-control.tools.d.ts} +4 -4
  300. package/dist/modules/version-control/agent-tools/version-control.tools.d.ts.map +1 -0
  301. package/dist/modules/{workflow/agent-tools/workflow.tools.js → version-control/agent-tools/version-control.tools.js} +53 -49
  302. package/dist/modules/version-control/agent-tools/version-control.tools.js.map +1 -0
  303. package/dist/modules/{workflow → version-control}/change-request-hooks.d.ts +1 -1
  304. package/dist/modules/version-control/change-request-hooks.d.ts.map +1 -0
  305. package/dist/modules/version-control/change-request-hooks.js.map +1 -0
  306. package/dist/modules/version-control/change-request-review/approval-lock.d.ts.map +1 -0
  307. package/dist/modules/version-control/change-request-review/approval-lock.js.map +1 -0
  308. package/dist/modules/{workflow/review-workflow/review-workflow.interface.d.ts → version-control/change-request-review/change-request-review.interface.d.ts} +2 -2
  309. package/dist/modules/version-control/change-request-review/change-request-review.interface.d.ts.map +1 -0
  310. package/dist/modules/version-control/change-request-review/change-request-review.interface.js +2 -0
  311. package/dist/modules/version-control/change-request-review/change-request-review.interface.js.map +1 -0
  312. package/dist/modules/{workflow/review-workflow/review-workflow.service.d.ts → version-control/change-request-review/change-request-review.service.d.ts} +3 -3
  313. package/dist/modules/version-control/change-request-review/change-request-review.service.d.ts.map +1 -0
  314. package/dist/modules/{workflow/review-workflow/review-workflow.service.js → version-control/change-request-review/change-request-review.service.js} +26 -26
  315. package/dist/modules/version-control/change-request-review/change-request-review.service.js.map +1 -0
  316. package/dist/modules/{workflow → version-control}/event-bus.d.ts +8 -8
  317. package/dist/modules/version-control/event-bus.d.ts.map +1 -0
  318. package/dist/modules/{workflow → version-control}/event-bus.js +4 -4
  319. package/dist/modules/version-control/event-bus.js.map +1 -0
  320. package/dist/modules/{workflow → version-control}/events-delivery.d.ts +4 -4
  321. package/dist/modules/version-control/events-delivery.d.ts.map +1 -0
  322. package/dist/modules/version-control/events-delivery.js.map +1 -0
  323. package/dist/modules/{workflow → version-control}/events.routes.d.ts +4 -4
  324. package/dist/modules/version-control/events.routes.d.ts.map +1 -0
  325. package/dist/modules/version-control/events.routes.js.map +1 -0
  326. package/dist/modules/{workflow → version-control}/file-lock.service.d.ts +2 -2
  327. package/dist/modules/version-control/file-lock.service.d.ts.map +1 -0
  328. package/dist/modules/{workflow → version-control}/file-lock.service.js +6 -6
  329. package/dist/modules/version-control/file-lock.service.js.map +1 -0
  330. package/dist/modules/version-control/git/change-request-link.d.ts.map +1 -0
  331. package/dist/modules/version-control/git/change-request-link.js.map +1 -0
  332. package/dist/modules/version-control/git/git-version.d.ts.map +1 -0
  333. package/dist/modules/version-control/git/git-version.js.map +1 -0
  334. package/dist/modules/{workflow → version-control}/git/git.service.d.ts +8 -8
  335. package/dist/modules/version-control/git/git.service.d.ts.map +1 -0
  336. package/dist/modules/{workflow → version-control}/git/git.service.js +53 -53
  337. package/dist/modules/version-control/git/git.service.js.map +1 -0
  338. package/dist/modules/version-control/git/merge-commit.d.ts.map +1 -0
  339. package/dist/modules/version-control/git/merge-commit.js.map +1 -0
  340. package/dist/modules/version-control/git/node-git-runner.d.ts.map +1 -0
  341. package/dist/modules/{workflow → version-control}/git/node-git-runner.js +1 -1
  342. package/dist/modules/version-control/git/node-git-runner.js.map +1 -0
  343. package/dist/modules/{workflow → version-control}/git/pull-request.service.d.ts +5 -5
  344. package/dist/modules/version-control/git/pull-request.service.d.ts.map +1 -0
  345. package/dist/modules/{workflow → version-control}/git/pull-request.service.js +10 -10
  346. package/dist/modules/version-control/git/pull-request.service.js.map +1 -0
  347. package/dist/modules/{workflow → version-control}/index.d.ts +6 -5
  348. package/dist/modules/version-control/index.d.ts.map +1 -0
  349. package/dist/modules/{workflow → version-control}/index.js +3 -2
  350. package/dist/modules/version-control/index.js.map +1 -0
  351. package/dist/modules/{workflow → version-control}/pending-commits.service.d.ts +2 -2
  352. package/dist/modules/version-control/pending-commits.service.d.ts.map +1 -0
  353. package/dist/modules/{workflow → version-control}/pending-commits.service.js +2 -2
  354. package/dist/modules/version-control/pending-commits.service.js.map +1 -0
  355. package/dist/modules/{workflow → version-control}/pending-commits.worker.d.ts +5 -5
  356. package/dist/modules/version-control/pending-commits.worker.d.ts.map +1 -0
  357. package/dist/modules/{workflow → version-control}/pending-commits.worker.js +3 -3
  358. package/dist/modules/version-control/pending-commits.worker.js.map +1 -0
  359. package/dist/modules/{workflow → version-control}/read-on-branch.d.ts +2 -2
  360. package/dist/modules/version-control/read-on-branch.d.ts.map +1 -0
  361. package/dist/modules/{workflow → version-control}/read-on-branch.js +2 -2
  362. package/dist/modules/version-control/read-on-branch.js.map +1 -0
  363. package/dist/modules/version-control/recovery-bot.d.ts.map +1 -0
  364. package/dist/modules/version-control/recovery-bot.js.map +1 -0
  365. package/dist/modules/version-control/sanitize-error.d.ts.map +1 -0
  366. package/dist/modules/version-control/sanitize-error.js.map +1 -0
  367. package/dist/modules/{workflow/workflow-hooks.d.ts → version-control/version-control-hooks.d.ts} +4 -4
  368. package/dist/modules/version-control/version-control-hooks.d.ts.map +1 -0
  369. package/dist/modules/{workflow/workflow-hooks.js → version-control/version-control-hooks.js} +3 -3
  370. package/dist/modules/version-control/version-control-hooks.js.map +1 -0
  371. package/dist/modules/{workflow/workflow.routes.d.ts → version-control/version-control.routes.d.ts} +6 -5
  372. package/dist/modules/version-control/version-control.routes.d.ts.map +1 -0
  373. package/dist/modules/{workflow/workflow.routes.js → version-control/version-control.routes.js} +61 -60
  374. package/dist/modules/version-control/version-control.routes.js.map +1 -0
  375. package/dist/modules/{workflow/workflow.service.d.ts → version-control/version-control.service.d.ts} +26 -31
  376. package/dist/modules/version-control/version-control.service.d.ts.map +1 -0
  377. package/dist/modules/{workflow/workflow.service.js → version-control/version-control.service.js} +89 -94
  378. package/dist/modules/version-control/version-control.service.js.map +1 -0
  379. package/dist/modules/workspace/agent-access.gate.d.ts +6 -6
  380. package/dist/modules/workspace/agent-access.gate.d.ts.map +1 -1
  381. package/dist/modules/workspace/agent-access.gate.js +2 -2
  382. package/dist/modules/workspace/agent-access.gate.js.map +1 -1
  383. package/dist/modules/workspace/git-internals.middleware.d.ts +1 -1
  384. package/dist/modules/workspace/git-internals.middleware.js +2 -2
  385. package/dist/modules/workspace/kb-repository.js +1 -1
  386. package/dist/modules/workspace/kb-repository.js.map +1 -1
  387. package/dist/modules/workspace/startup/kb-git.d.ts +1 -1
  388. package/dist/modules/workspace/startup/kb-git.d.ts.map +1 -1
  389. package/dist/modules/workspace/startup/kb-git.js +1 -1
  390. package/dist/modules/workspace/startup/kb-git.js.map +1 -1
  391. package/dist/modules/workspace/startup/steps/seed-tree.d.ts +2 -2
  392. package/dist/modules/workspace/startup/steps/seed-tree.d.ts.map +1 -1
  393. package/dist/modules/workspace/startup/steps/seed-tree.js +1 -1
  394. package/dist/modules/workspace/startup/steps/seed-tree.js.map +1 -1
  395. package/dist/modules/workspace/startup/steps/template-files.step.d.ts +2 -2
  396. package/dist/modules/workspace/startup/steps/template-files.step.d.ts.map +1 -1
  397. package/dist/modules/workspace/startup/steps/template-files.step.js +2 -2
  398. package/dist/modules/workspace/startup/steps/template-files.step.js.map +1 -1
  399. package/dist/modules/workspace/startup/steps/template-source.d.ts +17 -4
  400. package/dist/modules/workspace/startup/steps/template-source.d.ts.map +1 -1
  401. package/dist/modules/workspace/startup/steps/template-source.js +8 -5
  402. package/dist/modules/workspace/startup/steps/template-source.js.map +1 -1
  403. package/dist/modules/workspace/workspace-tmp.js +3 -3
  404. package/dist/modules/workspace/workspace-tmp.js.map +1 -1
  405. package/dist/modules/workspace/workspace.routes.d.ts +4 -4
  406. package/dist/modules/workspace/workspace.routes.d.ts.map +1 -1
  407. package/dist/modules/workspace/workspace.routes.js +22 -22
  408. package/dist/modules/workspace/workspace.routes.js.map +1 -1
  409. package/dist/modules/workspace/workspace.service.d.ts +6 -6
  410. package/dist/modules/workspace/workspace.service.d.ts.map +1 -1
  411. package/dist/modules/workspace/workspace.service.js +11 -11
  412. package/dist/modules/workspace/workspace.service.js.map +1 -1
  413. package/dist/modules/workspace/workspace.tools.d.ts +5 -3
  414. package/dist/modules/workspace/workspace.tools.d.ts.map +1 -1
  415. package/dist/modules/workspace/workspace.tools.js +85 -30
  416. package/dist/modules/workspace/workspace.tools.js.map +1 -1
  417. package/dist/shared/canonical-file-identity.d.ts +2 -2
  418. package/dist/shared/canonical-file-identity.js +5 -5
  419. package/dist/shared/canonical-file-identity.js.map +1 -1
  420. package/dist/shared/domain-errors.d.ts +39 -39
  421. package/dist/shared/domain-errors.d.ts.map +1 -1
  422. package/dist/shared/domain-errors.js +44 -44
  423. package/dist/shared/domain-errors.js.map +1 -1
  424. package/dist/shared/git.contract.d.ts +1 -1
  425. package/dist/shared/git.contract.js +1 -1
  426. package/dist/shared/http-errors.d.ts +3 -3
  427. package/dist/shared/http-errors.d.ts.map +1 -1
  428. package/dist/shared/http-errors.js +1 -1
  429. package/dist/shared/http-errors.js.map +1 -1
  430. package/dist/shared/oauth-token-error.d.ts +23 -0
  431. package/dist/shared/oauth-token-error.d.ts.map +1 -0
  432. package/dist/shared/oauth-token-error.js +47 -0
  433. package/dist/shared/oauth-token-error.js.map +1 -0
  434. package/dist/shared/pending-proposals.d.ts +3 -3
  435. package/dist/shared/pending-proposals.d.ts.map +1 -1
  436. package/dist/shared/pending-proposals.js +2 -2
  437. package/dist/shared/pending-proposals.js.map +1 -1
  438. package/dist/shared/read-capped.d.ts +19 -0
  439. package/dist/shared/read-capped.d.ts.map +1 -0
  440. package/dist/shared/read-capped.js +45 -0
  441. package/dist/shared/read-capped.js.map +1 -0
  442. package/dist/tenancy/static-tenant-source.js +1 -1
  443. package/dist/tenancy/static-tenant-source.js.map +1 -1
  444. package/migrations/0012_agent_audit.sql +40 -40
  445. package/migrations/0013_agent_identity_and_key_soft_delete.sql +29 -29
  446. package/migrations/meta/0012_snapshot.json +2246 -2246
  447. package/migrations/meta/0013_snapshot.json +2258 -2258
  448. package/package.json +5 -4
  449. package/src/__tests__/account-admin.ts +27 -0
  450. package/src/__tests__/hexis-catalog.ts +144 -0
  451. package/src/__tests__/kb-context.ts +30 -30
  452. package/src/__tests__/kb-layout-config.test.ts +21 -0
  453. package/src/__tests__/open-change-gate.ts +1 -1
  454. package/src/__tests__/real-disk.ts +21 -0
  455. package/src/__tests__/tokens.ts +19 -0
  456. package/src/__tests__/tool-handler.ts +15 -0
  457. package/src/__tests__/tool-manuals.ts +32 -0
  458. package/src/__tests__/tool-wiring.ts +31 -0
  459. package/src/__tests__/workspace-service.ts +1 -1
  460. package/src/core/__tests__/catalog-cache-invalidation.test.ts +3 -3
  461. package/src/core/__tests__/compose-embed.test.ts +1 -1
  462. package/src/core/__tests__/damaged-document.tools.test.ts +3 -3
  463. package/src/core/__tests__/erasure-slices-wired-once.test.ts +46 -0
  464. package/src/core/__tests__/gated-boot.test.ts +2 -2
  465. package/src/core/__tests__/lifecycle.test.ts +9 -9
  466. package/src/core/__tests__/oauth-sign-in-real-file.test.ts +179 -0
  467. package/src/core/catalog-cache-invalidation.ts +2 -2
  468. package/src/core/compose-embed.ts +3 -3
  469. package/src/core/core-ports.ts +19 -4
  470. package/src/core/create-core-server.ts +40 -26
  471. package/src/core/create-core-services.ts +92 -66
  472. package/src/core/lifecycle.ts +9 -9
  473. package/src/core-config.ts +3 -3
  474. package/src/index.ts +5 -5
  475. package/src/modules/access/__tests__/access-control.admin-root-floor.test.ts +4 -4
  476. package/src/modules/access/__tests__/access-own-read-grant.test.ts +14 -14
  477. package/src/modules/access/__tests__/access-requests.routes.test.ts +20 -20
  478. package/src/modules/access/__tests__/access.routes.admins.test.ts +4 -4
  479. package/src/modules/access/__tests__/access.routes.batch.test.ts +4 -4
  480. package/src/modules/access/__tests__/access.routes.folder-governs.test.ts +6 -6
  481. package/src/modules/access/__tests__/access.routes.group-grant.test.ts +6 -6
  482. package/src/modules/access/__tests__/access.routes.overrides.test.ts +5 -5
  483. package/src/modules/access/__tests__/access.routes.proposal-branch.test.ts +6 -6
  484. package/src/modules/access/__tests__/access.routes.prospective.test.ts +54 -14
  485. package/src/modules/access/__tests__/access.routes.revoke.test.ts +6 -6
  486. package/src/modules/access/__tests__/access.routes.unknown-email.test.ts +6 -6
  487. package/src/modules/access/__tests__/admin-locked-commit.test.ts +6 -6
  488. package/src/modules/access/__tests__/admin-route-helpers.test.ts +5 -5
  489. package/src/modules/access/__tests__/groups-admin.service.test.ts +27 -27
  490. package/src/modules/access/__tests__/holder-changes.test.ts +127 -0
  491. package/src/modules/access/__tests__/roles-admin.security.test.ts +14 -13
  492. package/src/modules/access/__tests__/roles-admin.service.test.ts +27 -27
  493. package/src/modules/access/__tests__/roles-capabilities.test.ts +19 -19
  494. package/src/modules/access/__tests__/roles.routes.test.ts +6 -6
  495. package/src/modules/access/__tests__/synced-groups-committer.test.ts +13 -13
  496. package/src/modules/access/__tests__/user-access-removal.service.test.ts +29 -29
  497. package/src/modules/access/access-control.interface.ts +26 -0
  498. package/src/modules/access/access-control.service.ts +93 -1
  499. package/src/modules/access/access-declarations.ts +2 -2
  500. package/src/modules/access/access-mutation.service.ts +2 -2
  501. package/src/modules/access/access-requests.routes.ts +7 -7
  502. package/src/modules/access/access-requests.service.ts +13 -13
  503. package/src/modules/access/access.routes.ts +34 -15
  504. package/src/modules/access/admin-locked-commit.ts +11 -11
  505. package/src/modules/access/admin-route-helpers.ts +5 -5
  506. package/src/modules/access/change-read-gate.ts +1 -1
  507. package/src/modules/access/groups-admin.service.ts +7 -7
  508. package/src/modules/access/index.ts +1 -1
  509. package/src/modules/access/reference-scan.ts +1 -1
  510. package/src/modules/access/roles-admin.service.ts +9 -9
  511. package/src/modules/access/synced-groups-committer.ts +11 -11
  512. package/src/modules/access/user-access-removal.service.ts +7 -7
  513. package/src/modules/access-model/__tests__/access-grammar.test.ts +2 -2
  514. package/src/modules/access-model/access-errors.ts +4 -4
  515. package/src/modules/access-model/access-grammar.ts +4 -4
  516. package/src/modules/access-model/change-gate.ts +1 -1
  517. package/src/modules/access-model/roles-yaml-guard.ts +4 -4
  518. package/src/modules/agent-guide/__tests__/agent-guide.test.ts +98 -29
  519. package/src/modules/agent-guide/__tests__/agent-guide.tools.test.ts +39 -12
  520. package/src/modules/agent-guide/__tests__/guide-budget.test.ts +95 -0
  521. package/src/modules/agent-guide/__tests__/guide-eval.test.ts +182 -0
  522. package/src/modules/agent-guide/__tests__/guide-matches-code.test.ts +263 -0
  523. package/src/modules/agent-guide/__tests__/tool-surface.json +514 -0
  524. package/src/modules/agent-guide/__tests__/tool-surface.test.ts +75 -0
  525. package/src/modules/agent-guide/agent-guide.tools.ts +49 -31
  526. package/src/modules/agent-guide/agent-guide.ts +165 -32
  527. package/src/modules/agent-guide/guide-budget.ts +77 -0
  528. package/src/modules/agent-guide/index.ts +12 -0
  529. package/src/modules/agent-instructions/__tests__/agent-instructions.route.test.ts +4 -5
  530. package/src/modules/agent-instructions/__tests__/compose.test.ts +1 -1
  531. package/src/modules/agent-instructions/__tests__/shared-file-rules.test.ts +117 -11
  532. package/src/modules/agent-instructions/agent-instructions.routes.ts +12 -5
  533. package/src/modules/agent-instructions/compose.ts +28 -9
  534. package/src/modules/agent-instructions/shared-file-rules.ts +62 -18
  535. package/src/modules/agent-scope/__tests__/agent-surfaces.connect-as.test.ts +1 -1
  536. package/src/modules/audit/__tests__/agent-rest-audit.middleware.test.ts +113 -113
  537. package/src/modules/audit/__tests__/event-classifier.test.ts +121 -121
  538. package/src/modules/audit/event-classifier.ts +155 -155
  539. package/src/modules/auth/__tests__/account-deactivation.test.ts +1 -1
  540. package/src/modules/auth/__tests__/account-erasure.approval-gate.test.ts +4 -4
  541. package/src/modules/auth/__tests__/account-erasure.participants.test.ts +56 -0
  542. package/src/modules/auth/__tests__/account-switch-lock.pg.test.ts +2 -2
  543. package/src/modules/auth/__tests__/account-switch-lock.test.ts +2 -2
  544. package/src/modules/auth/__tests__/account.routes.test.ts +73 -11
  545. package/src/modules/auth/__tests__/auth.service.test.ts +1 -1
  546. package/src/modules/auth/account-erasure.service.ts +27 -9
  547. package/src/modules/auth/account-hooks.ts +34 -0
  548. package/src/modules/auth/account-switch-lock.ts +2 -2
  549. package/src/modules/auth/account.routes.ts +23 -5
  550. package/src/modules/auth/auth.service.ts +4 -4
  551. package/src/modules/auth/index.ts +1 -0
  552. package/src/modules/code-mode/code-mode.tool.ts +2 -2
  553. package/src/modules/connection-probe/__tests__/connection-probe.service.test.ts +5 -24
  554. package/src/modules/connection-probe/connection-probe.service.ts +1 -34
  555. package/src/modules/database/__tests__/advisory-lock.test.ts +169 -169
  556. package/src/modules/database/__tests__/migrations-unqualified.test.ts +32 -32
  557. package/src/modules/database/core-schema.ts +2 -2
  558. package/src/modules/diff/__tests__/diff.routes.read-gate.test.ts +2 -2
  559. package/src/modules/diff/__tests__/diff.routes.rejectPathsLocked.test.ts +12 -12
  560. package/src/modules/diff/diff.routes.ts +8 -8
  561. package/src/modules/embed/__tests__/embed.service.lock.test.ts +7 -7
  562. package/src/modules/embed/__tests__/embed.service.test.ts +42 -42
  563. package/src/modules/embed/__tests__/embed.tools.test.ts +1 -1
  564. package/src/modules/embed/embed.routes.ts +1 -1
  565. package/src/modules/embed/embed.service.ts +17 -17
  566. package/src/modules/kb-fs/__tests__/branch-name.test.ts +2 -2
  567. package/src/modules/kb-fs/__tests__/locking-filesystem.test.ts +260 -260
  568. package/src/modules/kb-fs/__tests__/move-with-edits.test.ts +34 -34
  569. package/src/modules/kb-fs/__tests__/repo-path.test.ts +8 -8
  570. package/src/modules/kb-fs/branch-name.ts +8 -8
  571. package/src/modules/kb-fs/file-change-notifier.ts +2 -2
  572. package/src/modules/kb-fs/locking-filesystem.ts +30 -30
  573. package/src/modules/kb-fs/repo-path.ts +5 -5
  574. package/src/modules/kb-fs/tmp-ref.ts +3 -3
  575. package/src/modules/kb-sync/__tests__/kb-sync.service.test.ts +36 -36
  576. package/src/modules/kb-sync/index.ts +1 -1
  577. package/src/modules/kb-sync/kb-sync.interface.ts +3 -3
  578. package/src/modules/kb-sync/kb-sync.service.ts +9 -9
  579. package/src/modules/marketplace/__tests__/github-facade.test.ts +1 -1
  580. package/src/modules/marketplace/__tests__/marketplace-git.test.ts +1 -1
  581. package/src/modules/mcp/__tests__/mcp-proxy-helpers.test.ts +4 -2
  582. package/src/modules/mcp/__tests__/mcp.e2e.test.ts +69 -8
  583. package/src/modules/mcp/__tests__/mcp.service.test.ts +91 -13
  584. package/src/modules/mcp/__tests__/read-only-hint.pg.test.ts +194 -0
  585. package/src/modules/mcp/mcp.service.ts +93 -62
  586. package/src/modules/onboarding/__tests__/starter-pack.service.test.ts +55 -55
  587. package/src/modules/onboarding/onboarding.contract.ts +1 -1
  588. package/src/modules/onboarding/onboarding.routes.ts +2 -2
  589. package/src/modules/onboarding/starter-pack.service.ts +6 -6
  590. package/src/modules/plugins/__tests__/bundle-dialect.e2e.test.ts +1 -1
  591. package/src/modules/plugins/__tests__/compile-marketplace.test.ts +1 -1
  592. package/src/modules/plugins/__tests__/join-request-jobs.service.test.ts +43 -43
  593. package/src/modules/plugins/__tests__/join-requests.service.test.ts +19 -19
  594. package/src/modules/plugins/__tests__/join-requests.settlement.test.ts +26 -26
  595. package/src/modules/plugins/__tests__/plugins.routes.test.ts +25 -25
  596. package/src/modules/plugins/join-request-jobs.service.ts +10 -10
  597. package/src/modules/plugins/join-requests.service.ts +4 -4
  598. package/src/modules/plugins/plugin-rename.service.ts +1 -1
  599. package/src/modules/plugins/plugins.routes.ts +9 -9
  600. package/src/modules/secrets-vault/__tests__/db-secrets-vault.managed.test.ts +773 -0
  601. package/src/modules/secrets-vault/__tests__/db-secrets-vault.oauth.test.ts +458 -4
  602. package/src/modules/secrets-vault/__tests__/managed-sign-in.route.test.ts +351 -0
  603. package/src/modules/secrets-vault/__tests__/oauth-live-declaration.route.test.ts +218 -0
  604. package/src/modules/secrets-vault/__tests__/oauth-return-to.route.test.ts +39 -6
  605. package/src/modules/secrets-vault/db-secrets-vault.service.ts +728 -118
  606. package/src/modules/secrets-vault/index.ts +8 -1
  607. package/src/modules/secrets-vault/managed-sign-in-erasure.ts +41 -0
  608. package/src/modules/secrets-vault/secrets-variable-loader.ts +134 -134
  609. package/src/modules/secrets-vault/secrets-vault.contract.ts +213 -11
  610. package/src/modules/secrets-vault/secrets-vault.routes.ts +244 -45
  611. package/src/modules/settings/__tests__/repository-source.test.ts +1 -1
  612. package/src/modules/settings/__tests__/setup.routes.layout-phase.test.ts +1 -1
  613. package/src/modules/settings/__tests__/setup.routes.managed-phase.test.ts +1 -1
  614. package/src/modules/settings/connection-check.ts +1 -1
  615. package/src/modules/settings/deployment-settings.service.ts +1 -1
  616. package/src/modules/settings/git-root-folders.ts +1 -1
  617. package/src/modules/settings/oidc-check.ts +5 -18
  618. package/src/modules/settings/setup.routes.ts +1 -1
  619. package/src/modules/skills/__tests__/allowed-tools-warn.tools.test.ts +3 -3
  620. package/src/modules/skills/__tests__/branch-skills.tools.test.ts +1 -1
  621. package/src/modules/skills/__tests__/pending-skills.service.test.ts +8 -8
  622. package/src/modules/skills/__tests__/skill-access-requests.routes.test.ts +18 -18
  623. package/src/modules/skills/__tests__/skills.service.test.ts +3 -3
  624. package/src/modules/skills/pending-skills.service.ts +3 -3
  625. package/src/modules/skills/skill-access-requests.routes.ts +7 -7
  626. package/src/modules/skills/skills.tools.ts +1 -1
  627. package/src/modules/tool-helpers/__tests__/agent-roles-write.test.ts +22 -14
  628. package/src/modules/tool-helpers/__tests__/branch-declaration.test.ts +3 -3
  629. package/src/modules/tool-helpers/__tests__/can-write.tools.test.ts +3 -3
  630. package/src/modules/tool-helpers/__tests__/phase4-tools.test.ts +4 -4
  631. package/src/modules/tool-helpers/__tests__/route-tool-schemas.catalog.test.ts +38 -0
  632. package/src/modules/tool-helpers/__tests__/tools-surface.test.ts +3 -3
  633. package/src/modules/tool-helpers/__tests__/validate-token.test.ts +1 -1
  634. package/src/modules/tool-helpers/tool-context.ts +6 -6
  635. package/src/modules/tool-helpers/tool-def.ts +1 -1
  636. package/src/modules/tool-helpers/tool-handler.ts +2 -2
  637. package/src/modules/tool-helpers/tool.contract.ts +4 -4
  638. package/src/modules/tool-manuals/__tests__/pending-tools.service.test.ts +9 -9
  639. package/src/modules/tool-manuals/__tests__/tool-manuals.managed-sign-in.test.ts +89 -0
  640. package/src/modules/tool-manuals/__tests__/tool-manuals.mcp-oauth.test.ts +197 -11
  641. package/src/modules/tool-manuals/__tests__/tool-manuals.restart.test.ts +1 -1
  642. package/src/modules/tool-manuals/__tests__/tool-manuals.tools.test.ts +132 -6
  643. package/src/modules/tool-manuals/mcp-json-discovery.ts +73 -34
  644. package/src/modules/tool-manuals/mcp-server-edit.service.ts +1 -1
  645. package/src/modules/tool-manuals/pending-tools.service.ts +3 -3
  646. package/src/modules/tool-manuals/tool-delete.service.ts +1 -1
  647. package/src/modules/tool-manuals/tool-manuals.contract.ts +63 -3
  648. package/src/modules/tool-manuals/tool-manuals.service.ts +191 -51
  649. package/src/modules/tool-manuals/tool-manuals.tools.ts +93 -28
  650. package/src/modules/tool-registry/__tests__/own-tool-schemas.test.ts +4 -4
  651. package/src/modules/tool-registry/__tests__/read-only-hints.test.ts +3 -3
  652. package/src/modules/tool-registry/__tests__/tool-description-length.test.ts +12 -119
  653. package/src/modules/{workflow → version-control}/__tests__/apply-failure.test.ts +54 -54
  654. package/src/modules/{workflow → version-control}/__tests__/event-bus.test.ts +27 -27
  655. package/src/modules/{workflow → version-control}/__tests__/events-delivery.test.ts +37 -37
  656. package/src/modules/{workflow → version-control}/__tests__/file-lock.service.deletion-gate.test.ts +2 -2
  657. package/src/modules/{workflow → version-control}/__tests__/file-lock.service.path-identity.test.ts +8 -8
  658. package/src/modules/{workflow → version-control}/__tests__/merge-announces-tree.test.ts +11 -11
  659. package/src/modules/{workflow → version-control}/__tests__/pending-commits.worker.concurrency.test.ts +9 -9
  660. package/src/modules/{workflow → version-control}/__tests__/pending-commits.worker.test.ts +25 -25
  661. package/src/modules/{workflow → version-control}/__tests__/preserve-roles-yaml.test.ts +42 -42
  662. package/src/modules/version-control/__tests__/public-surface.test.ts +114 -0
  663. package/src/modules/{workflow/__tests__/workflow.routes.folder-proposals.test.ts → version-control/__tests__/version-control.routes.folder-proposals.test.ts} +18 -18
  664. package/src/modules/{workflow/__tests__/workflow.routes.fork-point-file.test.ts → version-control/__tests__/version-control.routes.fork-point-file.test.ts} +19 -19
  665. package/src/modules/{workflow/__tests__/workflow.routes.history-read-gate.test.ts → version-control/__tests__/version-control.routes.history-read-gate.test.ts} +13 -13
  666. package/src/modules/{workflow/__tests__/workflow.routes.lock-path.test.ts → version-control/__tests__/version-control.routes.lock-path.test.ts} +18 -18
  667. package/src/modules/{workflow/__tests__/workflow.routes.open-change-request.test.ts → version-control/__tests__/version-control.routes.open-change-request.test.ts} +7 -7
  668. package/src/modules/{workflow/__tests__/workflow.routes.push-refused.test.ts → version-control/__tests__/version-control.routes.push-refused.test.ts} +14 -14
  669. package/src/modules/{workflow/__tests__/workflow.service.branch-in-use.test.ts → version-control/__tests__/version-control.service.branch-in-use.test.ts} +6 -6
  670. package/src/modules/{workflow/__tests__/workflow.service.commitFileWhileLocked.test.ts → version-control/__tests__/version-control.service.commitFileWhileLocked.test.ts} +14 -14
  671. package/src/modules/{workflow/__tests__/workflow.service.delete-branch.test.ts → version-control/__tests__/version-control.service.delete-branch.test.ts} +14 -14
  672. package/src/modules/{workflow/__tests__/workflow.service.deleted-branch-sweep.test.ts → version-control/__tests__/version-control.service.deleted-branch-sweep.test.ts} +4 -4
  673. package/src/modules/{workflow/__tests__/workflow.service.facade.test.ts → version-control/__tests__/version-control.service.facade.test.ts} +97 -99
  674. package/src/modules/{workflow/__tests__/workflow.service.folder-proposals.test.ts → version-control/__tests__/version-control.service.folder-proposals.test.ts} +7 -7
  675. package/src/modules/{workflow/__tests__/workflow.service.platform-restore.test.ts → version-control/__tests__/version-control.service.platform-restore.test.ts} +6 -6
  676. package/src/modules/{workflow/__tests__/workflow.service.read-gate.test.ts → version-control/__tests__/version-control.service.read-gate.test.ts} +9 -9
  677. package/src/modules/{workflow/__tests__/workflow.service.releaseLock.test.ts → version-control/__tests__/version-control.service.releaseLock.test.ts} +42 -42
  678. package/src/modules/{workflow/__tests__/workflow.service.repository-replaced.test.ts → version-control/__tests__/version-control.service.repository-replaced.test.ts} +4 -4
  679. package/src/modules/{workflow/__tests__/workflow.service.sync.test.ts → version-control/__tests__/version-control.service.sync.test.ts} +17 -17
  680. package/src/modules/{workflow/__tests__/workflow.service.update-change-request.pg.test.ts → version-control/__tests__/version-control.service.update-change-request.pg.test.ts} +6 -6
  681. package/src/modules/{workflow/__tests__/workflow.service.update-change-request.test.ts → version-control/__tests__/version-control.service.update-change-request.test.ts} +11 -11
  682. package/src/modules/{workflow/__tests__/workflow.service.update-from-target.test.ts → version-control/__tests__/version-control.service.update-from-target.test.ts} +22 -22
  683. package/src/modules/{workflow → version-control}/agent-tools/__tests__/change-request-read.tools.test.ts +3 -3
  684. package/src/modules/{workflow → version-control}/agent-tools/__tests__/update-change-request.parity.test.ts +16 -16
  685. package/src/modules/{workflow/agent-tools/__tests__/workflow.tools.test.ts → version-control/agent-tools/__tests__/version-control.tools.test.ts} +9 -9
  686. package/src/modules/{workflow → version-control}/agent-tools/change-request-read.tools.ts +2 -2
  687. package/src/modules/{workflow/agent-tools/workflow.tools.ts → version-control/agent-tools/version-control.tools.ts} +52 -48
  688. package/src/modules/{workflow → version-control}/change-request-hooks.ts +1 -1
  689. package/src/modules/{workflow/review-workflow → version-control/change-request-review}/__tests__/approval-states.test.ts +5 -5
  690. package/src/modules/{workflow/review-workflow → version-control/change-request-review}/__tests__/cancel-pr.test.ts +8 -8
  691. package/src/modules/{workflow/review-workflow → version-control/change-request-review}/__tests__/carry-approvals-forward.test.ts +6 -6
  692. package/src/modules/{workflow/review-workflow → version-control/change-request-review}/__tests__/erase-approver.test.ts +5 -5
  693. package/src/modules/{workflow/review-workflow → version-control/change-request-review}/__tests__/merge-gate.test.ts +3 -3
  694. package/src/modules/{workflow/review-workflow → version-control/change-request-review}/__tests__/merge-records-own-commit.test.ts +3 -3
  695. package/src/modules/{workflow/review-workflow/review-workflow.interface.ts → version-control/change-request-review/change-request-review.interface.ts} +1 -1
  696. package/src/modules/{workflow/review-workflow/review-workflow.service.ts → version-control/change-request-review/change-request-review.service.ts} +28 -28
  697. package/src/modules/{workflow → version-control}/event-bus.ts +14 -14
  698. package/src/modules/{workflow → version-control}/events-delivery.ts +11 -11
  699. package/src/modules/{workflow → version-control}/events.routes.ts +5 -5
  700. package/src/modules/{workflow → version-control}/file-lock.service.ts +6 -6
  701. package/src/modules/{workflow → version-control}/git/__tests__/git-test-helpers.ts +3 -3
  702. package/src/modules/{workflow → version-control}/git/__tests__/git.service.accessGating.test.ts +5 -5
  703. package/src/modules/{workflow → version-control}/git/__tests__/git.service.appliedChange.test.ts +4 -4
  704. package/src/modules/{workflow → version-control}/git/__tests__/git.service.changedFilesForPr.test.ts +16 -16
  705. package/src/modules/{workflow → version-control}/git/__tests__/git.service.changedPathsMemo.test.ts +2 -2
  706. package/src/modules/{workflow → version-control}/git/__tests__/git.service.commitChanges.test.ts +3 -3
  707. package/src/modules/{workflow → version-control}/git/__tests__/git.service.commitFile.strayPath.test.ts +10 -10
  708. package/src/modules/{workflow → version-control}/git/__tests__/git.service.commitFile.test.ts +3 -3
  709. package/src/modules/{workflow → version-control}/git/__tests__/git.service.createBranch.test.ts +3 -3
  710. package/src/modules/{workflow → version-control}/git/__tests__/git.service.deleteBranch.test.ts +7 -7
  711. package/src/modules/{workflow → version-control}/git/__tests__/git.service.diffFileAtCommit.test.ts +9 -9
  712. package/src/modules/{workflow → version-control}/git/__tests__/git.service.diffFileBetweenBranches.test.ts +23 -23
  713. package/src/modules/{workflow → version-control}/git/__tests__/git.service.fileBytesAtCommit.test.ts +7 -7
  714. package/src/modules/{workflow → version-control}/git/__tests__/git.service.fileContentsAtCommit.test.ts +3 -3
  715. package/src/modules/{workflow → version-control}/git/__tests__/git.service.forkPoint.test.ts +2 -2
  716. package/src/modules/{workflow → version-control}/git/__tests__/git.service.history-guards.test.ts +2 -2
  717. package/src/modules/{workflow → version-control}/git/__tests__/git.service.list-branches.test.ts +12 -12
  718. package/src/modules/{workflow → version-control}/git/__tests__/git.service.listTrackedFiles.test.ts +2 -2
  719. package/src/modules/{workflow → version-control}/git/__tests__/git.service.logForFile.test.ts +6 -6
  720. package/src/modules/{workflow → version-control}/git/__tests__/git.service.mergeChangeRequest.test.ts +20 -20
  721. package/src/modules/{workflow → version-control}/git/__tests__/git.service.mergeIntoBranch.test.ts +16 -16
  722. package/src/modules/{workflow → version-control}/git/__tests__/git.service.pendingChanges.test.ts +2 -2
  723. package/src/modules/{workflow → version-control}/git/__tests__/git.service.postMergePull.test.ts +5 -5
  724. package/src/modules/{workflow → version-control}/git/__tests__/git.service.prFetchFailure.test.ts +2 -2
  725. package/src/modules/{workflow → version-control}/git/__tests__/git.service.pull.test.ts +12 -12
  726. package/src/modules/{workflow → version-control}/git/__tests__/git.service.readFileAtRef.test.ts +3 -3
  727. package/src/modules/{workflow → version-control}/git/__tests__/git.service.revertPathsAndPush.test.ts +2 -2
  728. package/src/modules/{workflow → version-control}/git/__tests__/git.service.status.test.ts +4 -4
  729. package/src/modules/{workflow → version-control}/git/__tests__/git.service.syncFromRemote.test.ts +8 -8
  730. package/src/modules/{workflow → version-control}/git/__tests__/git.service.worktrees.test.ts +4 -4
  731. package/src/modules/{workflow → version-control}/git/__tests__/pull-request.service.list-fetch.test.ts +2 -2
  732. package/src/modules/{workflow → version-control}/git/__tests__/pull-request.service.test.ts +6 -6
  733. package/src/modules/{workflow → version-control}/git/git.service.ts +57 -57
  734. package/src/modules/{workflow → version-control}/git/node-git-runner.ts +1 -1
  735. package/src/modules/{workflow → version-control}/git/pull-request.service.ts +12 -12
  736. package/src/modules/{workflow → version-control}/index.ts +6 -5
  737. package/src/modules/{workflow → version-control}/pending-commits.service.ts +2 -2
  738. package/src/modules/{workflow → version-control}/pending-commits.worker.ts +8 -8
  739. package/src/modules/{workflow → version-control}/read-on-branch.ts +2 -2
  740. package/src/modules/{workflow/workflow-hooks.ts → version-control/version-control-hooks.ts} +3 -3
  741. package/src/modules/{workflow/workflow.routes.ts → version-control/version-control.routes.ts} +64 -63
  742. package/src/modules/{workflow/workflow.service.ts → version-control/version-control.service.ts} +92 -97
  743. package/src/modules/workspace/__tests__/agent-access.gate.test.ts +8 -8
  744. package/src/modules/workspace/__tests__/agent-downloads.test.ts +13 -16
  745. package/src/modules/workspace/__tests__/agent-uploads.test.ts +11 -12
  746. package/src/modules/workspace/__tests__/escape-sequences.routes.test.ts +11 -16
  747. package/src/modules/workspace/__tests__/file-stat-access.test.ts +3 -3
  748. package/src/modules/workspace/__tests__/git-internals.security.test.ts +27 -27
  749. package/src/modules/workspace/__tests__/kb-repository.test.ts +1 -1
  750. package/src/modules/workspace/__tests__/rest-tool-arguments.test.ts +3 -3
  751. package/src/modules/workspace/__tests__/start-session.default-branch.test.ts +152 -0
  752. package/src/modules/workspace/__tests__/workspace-paths-inside-the-repo.test.ts +6 -6
  753. package/src/modules/workspace/__tests__/workspace-tmp.tools.test.ts +13 -14
  754. package/src/modules/workspace/__tests__/workspace.routes.at-ref.test.ts +6 -6
  755. package/src/modules/workspace/__tests__/workspace.routes.branch-errors.test.ts +4 -4
  756. package/src/modules/workspace/__tests__/workspace.routes.create-grant.test.ts +6 -6
  757. package/src/modules/workspace/__tests__/workspace.routes.delete.test.ts +8 -8
  758. package/src/modules/workspace/__tests__/workspace.routes.download-implies-read.test.ts +4 -4
  759. package/src/modules/workspace/__tests__/workspace.routes.download.test.ts +6 -6
  760. package/src/modules/workspace/__tests__/workspace.routes.file-writes.test.ts +6 -6
  761. package/src/modules/workspace/__tests__/workspace.routes.folder-zip-access.test.ts +4 -4
  762. package/src/modules/workspace/__tests__/workspace.routes.folders.test.ts +6 -6
  763. package/src/modules/workspace/__tests__/workspace.routes.move-platform-files.test.ts +7 -7
  764. package/src/modules/workspace/__tests__/workspace.routes.read-gate.test.ts +13 -13
  765. package/src/modules/workspace/__tests__/workspace.service.any-workspace-credentials.test.ts +1 -1
  766. package/src/modules/workspace/__tests__/workspace.service.replaced-repository.test.ts +1 -1
  767. package/src/modules/workspace/__tests__/workspace.service.worktrees.test.ts +1 -1
  768. package/src/modules/workspace/__tests__/workspace.tools.agents-file.test.ts +12 -14
  769. package/src/modules/workspace/__tests__/workspace.tools.branch-errors.test.ts +5 -5
  770. package/src/modules/workspace/__tests__/workspace.tools.test.ts +182 -75
  771. package/src/modules/workspace/agent-access.gate.ts +6 -6
  772. package/src/modules/workspace/git-internals.middleware.ts +2 -2
  773. package/src/modules/workspace/kb-repository.ts +1 -1
  774. package/src/modules/workspace/startup/__tests__/kb-startup-runner.degraded.test.ts +1 -1
  775. package/src/modules/workspace/startup/__tests__/kb-startup-runner.test.ts +1 -1
  776. package/src/modules/workspace/startup/__tests__/kb-startup-runner.worktrees.test.ts +1 -1
  777. package/src/modules/workspace/startup/kb-git.ts +1 -1
  778. package/src/modules/workspace/startup/steps/__tests__/steps.test.ts +94 -70
  779. package/src/modules/workspace/startup/steps/seed-tree.ts +4 -5
  780. package/src/modules/workspace/startup/steps/template-files.step.ts +4 -5
  781. package/src/modules/workspace/startup/steps/template-source.ts +21 -6
  782. package/src/modules/workspace/workspace-tmp.ts +4 -4
  783. package/src/modules/workspace/workspace.routes.ts +26 -26
  784. package/src/modules/workspace/workspace.service.ts +11 -11
  785. package/src/modules/workspace/workspace.tools.ts +90 -30
  786. package/src/shared/__tests__/canonical-file-identity.test.ts +5 -5
  787. package/src/shared/__tests__/http-errors.test.ts +4 -4
  788. package/src/shared/__tests__/read-capped.test.ts +68 -0
  789. package/src/shared/canonical-file-identity.ts +5 -5
  790. package/src/shared/domain-errors.ts +44 -44
  791. package/src/shared/git.contract.ts +1 -1
  792. package/src/shared/http-errors.ts +3 -3
  793. package/src/shared/kb-context.ts +130 -130
  794. package/src/shared/oauth-token-error.ts +46 -0
  795. package/src/shared/pending-proposals.ts +4 -4
  796. package/src/shared/read-capped.ts +40 -0
  797. package/src/tenancy/__tests__/tenant-host.test.ts +372 -372
  798. package/src/tenancy/__tests__/tenant-runtime.test.ts +221 -221
  799. package/src/tenancy/__tests__/tenant-secrets.test.ts +35 -35
  800. package/src/tenancy/index.ts +35 -35
  801. package/src/tenancy/static-tenant-source.ts +1 -1
  802. package/src/tenancy/tenant-host.ts +261 -261
  803. package/src/tenancy/tenant-runtime.ts +208 -208
  804. package/src/tenancy/tenant-source.contract.ts +59 -59
  805. package/agent-guide/finding-things.md +0 -7
  806. package/agent-guide/introduction.md +0 -27
  807. package/dist/modules/workflow/agent-tools/change-request-read-shape.d.ts.map +0 -1
  808. package/dist/modules/workflow/agent-tools/change-request-read-shape.js.map +0 -1
  809. package/dist/modules/workflow/agent-tools/change-request-read.tools.d.ts.map +0 -1
  810. package/dist/modules/workflow/agent-tools/change-request-read.tools.js.map +0 -1
  811. package/dist/modules/workflow/agent-tools/change-request-summary.d.ts.map +0 -1
  812. package/dist/modules/workflow/agent-tools/change-request-summary.js.map +0 -1
  813. package/dist/modules/workflow/agent-tools/workflow.tools.d.ts.map +0 -1
  814. package/dist/modules/workflow/agent-tools/workflow.tools.js.map +0 -1
  815. package/dist/modules/workflow/change-request-hooks.d.ts.map +0 -1
  816. package/dist/modules/workflow/change-request-hooks.js.map +0 -1
  817. package/dist/modules/workflow/event-bus.d.ts.map +0 -1
  818. package/dist/modules/workflow/event-bus.js.map +0 -1
  819. package/dist/modules/workflow/events-delivery.d.ts.map +0 -1
  820. package/dist/modules/workflow/events-delivery.js.map +0 -1
  821. package/dist/modules/workflow/events.routes.d.ts.map +0 -1
  822. package/dist/modules/workflow/events.routes.js.map +0 -1
  823. package/dist/modules/workflow/file-lock.service.d.ts.map +0 -1
  824. package/dist/modules/workflow/file-lock.service.js.map +0 -1
  825. package/dist/modules/workflow/git/change-request-link.d.ts.map +0 -1
  826. package/dist/modules/workflow/git/change-request-link.js.map +0 -1
  827. package/dist/modules/workflow/git/git-version.d.ts.map +0 -1
  828. package/dist/modules/workflow/git/git-version.js.map +0 -1
  829. package/dist/modules/workflow/git/git.service.d.ts.map +0 -1
  830. package/dist/modules/workflow/git/git.service.js.map +0 -1
  831. package/dist/modules/workflow/git/merge-commit.d.ts.map +0 -1
  832. package/dist/modules/workflow/git/merge-commit.js.map +0 -1
  833. package/dist/modules/workflow/git/node-git-runner.d.ts.map +0 -1
  834. package/dist/modules/workflow/git/node-git-runner.js.map +0 -1
  835. package/dist/modules/workflow/git/pull-request.service.d.ts.map +0 -1
  836. package/dist/modules/workflow/git/pull-request.service.js.map +0 -1
  837. package/dist/modules/workflow/index.d.ts.map +0 -1
  838. package/dist/modules/workflow/index.js.map +0 -1
  839. package/dist/modules/workflow/pending-commits.service.d.ts.map +0 -1
  840. package/dist/modules/workflow/pending-commits.service.js.map +0 -1
  841. package/dist/modules/workflow/pending-commits.worker.d.ts.map +0 -1
  842. package/dist/modules/workflow/pending-commits.worker.js.map +0 -1
  843. package/dist/modules/workflow/read-on-branch.d.ts.map +0 -1
  844. package/dist/modules/workflow/read-on-branch.js.map +0 -1
  845. package/dist/modules/workflow/recovery-bot.d.ts.map +0 -1
  846. package/dist/modules/workflow/recovery-bot.js.map +0 -1
  847. package/dist/modules/workflow/review-workflow/approval-lock.d.ts.map +0 -1
  848. package/dist/modules/workflow/review-workflow/approval-lock.js.map +0 -1
  849. package/dist/modules/workflow/review-workflow/review-workflow.interface.d.ts.map +0 -1
  850. package/dist/modules/workflow/review-workflow/review-workflow.interface.js +0 -2
  851. package/dist/modules/workflow/review-workflow/review-workflow.interface.js.map +0 -1
  852. package/dist/modules/workflow/review-workflow/review-workflow.service.d.ts.map +0 -1
  853. package/dist/modules/workflow/review-workflow/review-workflow.service.js.map +0 -1
  854. package/dist/modules/workflow/sanitize-error.d.ts.map +0 -1
  855. package/dist/modules/workflow/sanitize-error.js.map +0 -1
  856. package/dist/modules/workflow/workflow-hooks.d.ts.map +0 -1
  857. package/dist/modules/workflow/workflow-hooks.js.map +0 -1
  858. package/dist/modules/workflow/workflow.routes.d.ts.map +0 -1
  859. package/dist/modules/workflow/workflow.routes.js.map +0 -1
  860. package/dist/modules/workflow/workflow.service.d.ts.map +0 -1
  861. package/dist/modules/workflow/workflow.service.js.map +0 -1
  862. package/src/modules/mcp/__tests__/read-only-hint.e2e.test.ts +0 -213
  863. /package/dist/modules/{workflow → version-control}/agent-tools/change-request-read-shape.d.ts +0 -0
  864. /package/dist/modules/{workflow → version-control}/agent-tools/change-request-read-shape.js +0 -0
  865. /package/dist/modules/{workflow → version-control}/agent-tools/change-request-read.tools.d.ts +0 -0
  866. /package/dist/modules/{workflow → version-control}/agent-tools/change-request-summary.d.ts +0 -0
  867. /package/dist/modules/{workflow → version-control}/agent-tools/change-request-summary.js +0 -0
  868. /package/dist/modules/{workflow → version-control}/change-request-hooks.js +0 -0
  869. /package/dist/modules/{workflow/review-workflow → version-control/change-request-review}/approval-lock.d.ts +0 -0
  870. /package/dist/modules/{workflow/review-workflow → version-control/change-request-review}/approval-lock.js +0 -0
  871. /package/dist/modules/{workflow → version-control}/events-delivery.js +0 -0
  872. /package/dist/modules/{workflow → version-control}/events.routes.js +0 -0
  873. /package/dist/modules/{workflow → version-control}/git/change-request-link.d.ts +0 -0
  874. /package/dist/modules/{workflow → version-control}/git/change-request-link.js +0 -0
  875. /package/dist/modules/{workflow → version-control}/git/git-version.d.ts +0 -0
  876. /package/dist/modules/{workflow → version-control}/git/git-version.js +0 -0
  877. /package/dist/modules/{workflow → version-control}/git/merge-commit.d.ts +0 -0
  878. /package/dist/modules/{workflow → version-control}/git/merge-commit.js +0 -0
  879. /package/dist/modules/{workflow → version-control}/git/node-git-runner.d.ts +0 -0
  880. /package/dist/modules/{workflow → version-control}/recovery-bot.d.ts +0 -0
  881. /package/dist/modules/{workflow → version-control}/recovery-bot.js +0 -0
  882. /package/dist/modules/{workflow → version-control}/sanitize-error.d.ts +0 -0
  883. /package/dist/modules/{workflow → version-control}/sanitize-error.js +0 -0
  884. /package/src/modules/{workflow → version-control}/__tests__/change-request-hooks.test.ts +0 -0
  885. /package/src/modules/{workflow → version-control}/__tests__/fake-file-lock-db.ts +0 -0
  886. /package/src/modules/{workflow → version-control}/__tests__/pending-commits.canonical.test.ts +0 -0
  887. /package/src/modules/{workflow → version-control}/__tests__/pending-commits.enqueue-if-absent.test.ts +0 -0
  888. /package/src/modules/{workflow → version-control}/__tests__/pending-commits.repository-replaced.test.ts +0 -0
  889. /package/src/modules/{workflow → version-control}/__tests__/sanitize-error.test.ts +0 -0
  890. /package/src/modules/{workflow → version-control}/agent-tools/__tests__/change-request-read-shape.test.ts +0 -0
  891. /package/src/modules/{workflow → version-control}/agent-tools/change-request-read-shape.ts +0 -0
  892. /package/src/modules/{workflow → version-control}/agent-tools/change-request-summary.ts +0 -0
  893. /package/src/modules/{workflow/review-workflow → version-control/change-request-review}/approval-lock.ts +0 -0
  894. /package/src/modules/{workflow → version-control}/git/__tests__/branchAuthor.test.ts +0 -0
  895. /package/src/modules/{workflow → version-control}/git/__tests__/change-request-link.test.ts +0 -0
  896. /package/src/modules/{workflow → version-control}/git/__tests__/git-version.failure.test.ts +0 -0
  897. /package/src/modules/{workflow → version-control}/git/__tests__/git-version.test.ts +0 -0
  898. /package/src/modules/{workflow → version-control}/git/__tests__/node-git-runner.test.ts +0 -0
  899. /package/src/modules/{workflow → version-control}/git/__tests__/pull-request.service.getPrDetail.test.ts +0 -0
  900. /package/src/modules/{workflow → version-control}/git/__tests__/pull-request.service.placeholder.test.ts +0 -0
  901. /package/src/modules/{workflow → version-control}/git/__tests__/pull-request.service.viewer-can-cancel.test.ts +0 -0
  902. /package/src/modules/{workflow → version-control}/git/__tests__/pull-request.service.viewer-can-delete.test.ts +0 -0
  903. /package/src/modules/{workflow → version-control}/git/__tests__/pull-request.service.viewer-can-update.test.ts +0 -0
  904. /package/src/modules/{workflow → version-control}/git/change-request-link.ts +0 -0
  905. /package/src/modules/{workflow → version-control}/git/git-version.ts +0 -0
  906. /package/src/modules/{workflow → version-control}/git/merge-commit.ts +0 -0
  907. /package/src/modules/{workflow → version-control}/recovery-bot.ts +0 -0
  908. /package/src/modules/{workflow → version-control}/sanitize-error.ts +0 -0
@@ -14,7 +14,7 @@ import { redactSecret, urlQuerySecrets } from '../../../shared/redact-secret.js'
14
14
  * runs through (`shared/git.contract.ts`).
15
15
  */
16
16
 
17
- /** Fallback committer identity; workflow commits override with `--author`. */
17
+ /** Fallback committer identity; version-control commits override with `--author`. */
18
18
  export const BOT_NAME = 'Bevel Workflow';
19
19
  export const BOT_EMAIL = 'bevel-workflow@bevel.software';
20
20
 
@@ -1,24 +1,29 @@
1
1
  import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
2
- import { NodeFs } from '../../../../kb-fs/node-fs.js';
2
+ import { realDisk } from '../../../../../__tests__/real-disk.js';
3
+ import { NodeGitRunner } from '../../../../version-control/index.js';
4
+ import { renderRolesYaml } from '../../../../access-model/index.js';
3
5
  import { execFile } from 'node:child_process';
4
6
  import { promisify } from 'node:util';
5
7
  import fs from 'node:fs/promises';
6
8
  import os from 'node:os';
7
9
  import path from 'node:path';
8
- import { NodeGitRunner } from '../../../../workflow/git/node-git-runner.js';
9
10
  import type { OnServerStart, ServerStartContext, StepResult } from '../../on-server-start.js';
10
11
  import { GroupsToPluginsStep } from '../groups-to-plugins.step.js';
11
12
  import { PluginDisplayNamesStep } from '../plugin-display-names.step.js';
12
13
  import { PluginManifestsStep } from '../plugin-manifests.step.js';
13
14
  import { PersonalSpacesStep } from '../personal-spaces.step.js';
14
15
  import { RolesYamlStep } from '../roles-yaml.step.js';
15
- import { renderRolesYaml } from '../../../../access-model/render-roles-yaml.js';
16
16
  import { TemplateFilesStep } from '../template-files.step.js';
17
17
  import { buildSeedTree } from '../seed-tree.js';
18
18
  import { defaultKbTemplateDir } from '../../../../../assets.js';
19
19
  import { DEFAULT_KB_LAYOUT } from '@bevel-software/platform-shared';
20
- import { renderTemplateText } from '../template-source.js';
21
- import { TOOL_PREFIX_LINE, composeAgentInstructions, platformInstructions } from '../../../../agent-instructions/index.js';
20
+ import { SHARED_FILE_RULES_PLACEHOLDER, renderTemplateText } from '../template-source.js';
21
+ import {
22
+ TOOL_PREFIX_LINE,
23
+ composeAgentInstructions,
24
+ platformInstructions,
25
+ sharedFileRulesSection,
26
+ } from '../../../../agent-instructions/index.js';
22
27
  import { testKbContext } from '../../../../../__tests__/kb-context.js';
23
28
  import { newKbStartupRunner } from '../../../../../__tests__/workspace-service.js';
24
29
 
@@ -152,7 +157,7 @@ async function template(name: string): Promise<string> {
152
157
  // `renderTemplateText`, not the layout renderer alone: the managed guide also
153
158
  // asks for the shared file rules, and a fixture rendered with half the
154
159
  // placeholders filled would read as drifted on every boot.
155
- return renderTemplateText(await fs.readFile(path.join(TEMPLATE_DIR, name), 'utf8'), DEFAULT_KB_LAYOUT);
160
+ return renderTemplateText(await fs.readFile(path.join(TEMPLATE_DIR, name), 'utf8'), DEFAULT_KB_LAYOUT, '');
156
161
  }
157
162
 
158
163
  /** Every required file + reserved root already present, from the real template. */
@@ -171,7 +176,7 @@ async function fullScaffold(): Promise<Record<string, string>> {
171
176
  describe('TemplateFilesStep', () => {
172
177
  it('adds the missing scaffolding — .gitignore arriving from its packable template spelling', async () => {
173
178
  await seedUpstream({ 'marker.txt': 'seeded' });
174
- await makeRunner([new TemplateFilesStep(new NodeFs(), kbContext)]).runAll();
179
+ await makeRunner([new TemplateFilesStep(realDisk(), kbContext)]).runAll();
175
180
 
176
181
  for (const b of PROTECTED) {
177
182
  const dir = await checkout(b);
@@ -199,7 +204,7 @@ describe('TemplateFilesStep', () => {
199
204
  // the folders it will find, and an ignore file hiding the real ones.
200
205
  kbContext.applyLayout({ knowledgeBaseDir: 'docs', skillsDir: 'skills', pluginsDir: 'plugins' });
201
206
  await seedUpstream({ 'marker.txt': 'seeded' });
202
- await makeRunner([new TemplateFilesStep(new NodeFs(), kbContext)]).runAll();
207
+ await makeRunner([new TemplateFilesStep(realDisk(), kbContext)]).runAll();
203
208
 
204
209
  const dir = await checkout(DEFAULT_BRANCH);
205
210
  // No guide is written: the platform serves it (see modules/agent-guide).
@@ -215,7 +220,7 @@ describe('TemplateFilesStep', () => {
215
220
  expect(await exists(dir, 'docs/.gitkeep')).toBe(true);
216
221
 
217
222
  // And a second boot sees the rendered guide as current: no churn commit.
218
- await makeRunner([new TemplateFilesStep(new NodeFs(), kbContext)]).runAll();
223
+ await makeRunner([new TemplateFilesStep(realDisk(), kbContext)]).runAll();
219
224
  const again = await checkout(DEFAULT_BRANCH);
220
225
  expect((await git(again, ['rev-list', '--count', 'HEAD'])).trim()).toBe('2'); // init + scaffolding
221
226
  });
@@ -230,7 +235,7 @@ describe('TemplateFilesStep', () => {
230
235
  * deployment's own root names rather than the placeholders.
231
236
  */
232
237
  it('scaffolds the layout in effect when it RUNS, not the one it was built under', async () => {
233
- const builtAtBoot = new TemplateFilesStep(new NodeFs(), kbContext);
238
+ const builtAtBoot = new TemplateFilesStep(realDisk(), kbContext);
234
239
  await seedUpstream({ 'skills/deploy/SKILL.md': '# deploy\n' });
235
240
  kbContext.applyLayout({ knowledgeBaseDir: 'Docs', skillsDir: 'skills', pluginsDir: 'Plugins' });
236
241
  await makeRunner([builtAtBoot]).runAll();
@@ -252,7 +257,7 @@ describe('TemplateFilesStep', () => {
252
257
 
253
258
  it('rejects the git folder — in any spelling — as a reserved root name', async () => {
254
259
  for (const bad of ['.git', '.GIT', '.Git', '.git.', '%2egit']) {
255
- expect(() => new TemplateFilesStep(new NodeFs(), kbContext, [bad]), bad).toThrow(/must not name the git folder/);
260
+ expect(() => new TemplateFilesStep(realDisk(), kbContext, [bad]), bad).toThrow(/must not name the git folder/);
256
261
  }
257
262
  });
258
263
 
@@ -267,7 +272,7 @@ describe('TemplateFilesStep', () => {
267
272
  delete scaffold['.bevelignore']; // the one file the step will declare from the template
268
273
  await seedUpstream(scaffold);
269
274
 
270
- await makeRunner([new TemplateFilesStep(new NodeFs(), kbContext)], customTemplate).runAll();
275
+ await makeRunner([new TemplateFilesStep(realDisk(), kbContext)], customTemplate).runAll();
271
276
 
272
277
  const dir = await checkout(DEFAULT_BRANCH);
273
278
  const lines = norm(await fs.readFile(path.join(dir, '.bevelignore'), 'utf8')).split('\n').map((l) => l.trim());
@@ -287,14 +292,14 @@ describe('TemplateFilesStep', () => {
287
292
  '# mine\n.git/\nAGENTS.md\nPlugins/\n\n# Added by the platform: the conventions doc is not node content.\nSkills/\n';
288
293
  await seedUpstream(scaffold);
289
294
 
290
- await makeRunner([new TemplateFilesStep(new NodeFs(), kbContext)]).runAll();
295
+ await makeRunner([new TemplateFilesStep(realDisk(), kbContext)]).runAll();
291
296
 
292
297
  const dir = await checkout(DEFAULT_BRANCH);
293
298
  const text = norm(await fs.readFile(path.join(dir, '.bevelignore'), 'utf8'));
294
299
  // The plugins-root rule goes with it — the same sidebar draws that root now.
295
300
  expect(text).toBe('# mine\n.git/\nAGENTS.md\n' + PREAMBLE_IGNORE_BLOCK);
296
301
  // Idempotent: a second boot has nothing to change.
297
- await makeRunner([new TemplateFilesStep(new NodeFs(), kbContext)]).runAll();
302
+ await makeRunner([new TemplateFilesStep(realDisk(), kbContext)]).runAll();
298
303
  const again = await checkout(DEFAULT_BRANCH);
299
304
  expect(norm(await fs.readFile(path.join(again, '.bevelignore'), 'utf8'))).toBe(text);
300
305
  });
@@ -308,7 +313,7 @@ describe('TemplateFilesStep', () => {
308
313
  'AGENTS.md\nPlugins/\n# The shared-skills root is rendered by the Skills & Tools app, like Groups/.\nSkills/\n';
309
314
  await seedUpstream(scaffold);
310
315
 
311
- await makeRunner([new TemplateFilesStep(new NodeFs(), kbContext)]).runAll();
316
+ await makeRunner([new TemplateFilesStep(realDisk(), kbContext)]).runAll();
312
317
 
313
318
  const dir = await checkout(DEFAULT_BRANCH);
314
319
  expect(norm(await fs.readFile(path.join(dir, '.bevelignore'), 'utf8'))).toBe(
@@ -325,7 +330,7 @@ describe('TemplateFilesStep', () => {
325
330
  'AGENTS.md\nPlugins/\n# The shared-skills root is rendered by the Skills & Tools app, like My Plugins/.\nSkills/\n';
326
331
  await seedUpstream(scaffold);
327
332
 
328
- await makeRunner([new TemplateFilesStep(new NodeFs(), kbContext)]).runAll();
333
+ await makeRunner([new TemplateFilesStep(realDisk(), kbContext)]).runAll();
329
334
 
330
335
  const dir = await checkout(DEFAULT_BRANCH);
331
336
  expect(norm(await fs.readFile(path.join(dir, '.bevelignore'), 'utf8'))).toBe(
@@ -342,7 +347,7 @@ describe('TemplateFilesStep', () => {
342
347
  scaffold['.bevelignore'] = text;
343
348
  await seedUpstream(scaffold);
344
349
 
345
- await makeRunner([new TemplateFilesStep(new NodeFs(), kbContext)]).runAll();
350
+ await makeRunner([new TemplateFilesStep(realDisk(), kbContext)]).runAll();
346
351
 
347
352
  const dir = await checkout(DEFAULT_BRANCH);
348
353
  expect(norm(await fs.readFile(path.join(dir, '.bevelignore'), 'utf8'))).toBe(
@@ -355,7 +360,7 @@ describe('TemplateFilesStep', () => {
355
360
  scaffold['.bevelignore'] = 'AGENTS.md\n# I hide skills on purpose\nSkills/\n';
356
361
  await seedUpstream(scaffold);
357
362
 
358
- await makeRunner([new TemplateFilesStep(new NodeFs(), kbContext)]).runAll();
363
+ await makeRunner([new TemplateFilesStep(realDisk(), kbContext)]).runAll();
359
364
 
360
365
  const dir = await checkout(DEFAULT_BRANCH);
361
366
  expect(norm(await fs.readFile(path.join(dir, '.bevelignore'), 'utf8'))).toBe(
@@ -374,13 +379,13 @@ describe('TemplateFilesStep', () => {
374
379
  '# mine\nAGENTS.md\nPlugins/\nMy-Own-Rule/\n# Added by the platform: the conventions doc is not node content.\nPlugins/\n!Plugins/\n';
375
380
  await seedUpstream(scaffold);
376
381
 
377
- await makeRunner([new TemplateFilesStep(new NodeFs(), kbContext)]).runAll();
382
+ await makeRunner([new TemplateFilesStep(realDisk(), kbContext)]).runAll();
378
383
 
379
384
  const dir = await checkout(DEFAULT_BRANCH);
380
385
  const text = norm(await fs.readFile(path.join(dir, '.bevelignore'), 'utf8'));
381
386
  expect(text).toBe('# mine\nAGENTS.md\nMy-Own-Rule/\n!Plugins/\n' + PREAMBLE_IGNORE_BLOCK);
382
387
  // Idempotent: a second boot has nothing to change.
383
- await makeRunner([new TemplateFilesStep(new NodeFs(), kbContext)]).runAll();
388
+ await makeRunner([new TemplateFilesStep(realDisk(), kbContext)]).runAll();
384
389
  const again = await checkout(DEFAULT_BRANCH);
385
390
  expect(norm(await fs.readFile(path.join(again, '.bevelignore'), 'utf8'))).toBe(text);
386
391
  });
@@ -393,7 +398,7 @@ describe('TemplateFilesStep', () => {
393
398
  await fs.writeFile(path.join(customTemplate, '.bevelignore'), '.git/\nAGENTS.md\n\nPlugins/\n');
394
399
  await seedUpstream({ 'marker.txt': 'seeded' });
395
400
 
396
- await makeRunner([new TemplateFilesStep(new NodeFs(), kbContext)], customTemplate).runAll();
401
+ await makeRunner([new TemplateFilesStep(realDisk(), kbContext)], customTemplate).runAll();
397
402
 
398
403
  const dir = await checkout(DEFAULT_BRANCH);
399
404
  const lines = norm(await fs.readFile(path.join(dir, '.bevelignore'), 'utf8')).split('\n').map((l) => l.trim());
@@ -412,7 +417,7 @@ describe('TemplateFilesStep', () => {
412
417
 
413
418
  const dir = path.join(root, 'seeded-gitlink');
414
419
  await fs.mkdir(dir, { recursive: true });
415
- await buildSeedTree(new NodeFs(), customTemplate, [], ['admin@example.com'], kbContext)(dir);
420
+ await buildSeedTree(realDisk(), customTemplate, [], ['admin@example.com'], kbContext)(dir);
416
421
 
417
422
  await expect(fs.readFile(path.join(dir, 'notes.md'), 'utf8')).rejects.toMatchObject({ code: 'ENOENT' });
418
423
  await expect(fs.readdir(path.join(dir, '.git'))).rejects.toMatchObject({ code: 'ENOENT' });
@@ -434,7 +439,7 @@ describe('TemplateFilesStep', () => {
434
439
  // The empty-remote seed is the one path that copies a whole template.
435
440
  const dir = path.join(root, 'seeded-bytes');
436
441
  await fs.mkdir(dir, { recursive: true });
437
- await buildSeedTree(new NodeFs(), customTemplate, [], ['admin@example.com'], kbContext)(dir);
442
+ await buildSeedTree(realDisk(), customTemplate, [], ['admin@example.com'], kbContext)(dir);
438
443
 
439
444
  expect(await fs.readFile(path.join(dir, 'assets', '.logo.bin'))).toEqual(binary);
440
445
  expect(norm(await fs.readFile(path.join(dir, 'scripts', 'run.sh'), 'utf8'))).toBe('#!/bin/sh\necho Skills\n');
@@ -459,7 +464,7 @@ describe('TemplateFilesStep', () => {
459
464
  delete scaffold['.bevelignore'];
460
465
  await seedUpstream(scaffold);
461
466
 
462
- await makeRunner([new TemplateFilesStep(new NodeFs(), kbContext)], customTemplate).runAll();
467
+ await makeRunner([new TemplateFilesStep(realDisk(), kbContext)], customTemplate).runAll();
463
468
 
464
469
  const dir = await checkout(DEFAULT_BRANCH);
465
470
  const text = norm(await fs.readFile(path.join(dir, '.bevelignore'), 'utf8'));
@@ -473,7 +478,7 @@ describe('TemplateFilesStep', () => {
473
478
  scaffold['.bevelignore'] = 'AGENTS.md\n!Skills/\n';
474
479
  await seedUpstream(scaffold);
475
480
 
476
- await makeRunner([new TemplateFilesStep(new NodeFs(), kbContext)]).runAll();
481
+ await makeRunner([new TemplateFilesStep(realDisk(), kbContext)]).runAll();
477
482
 
478
483
  const dir = await checkout(DEFAULT_BRANCH);
479
484
  expect(norm(await fs.readFile(path.join(dir, '.bevelignore'), 'utf8'))).toBe(
@@ -488,7 +493,7 @@ describe('TemplateFilesStep', () => {
488
493
  scaffold['.bevelignore'] = '# operator wants the doc visible\n!AGENTS.md\nMyStuff/\n';
489
494
  await seedUpstream(scaffold);
490
495
 
491
- await makeRunner([new TemplateFilesStep(new NodeFs(), kbContext)]).runAll();
496
+ await makeRunner([new TemplateFilesStep(realDisk(), kbContext)]).runAll();
492
497
 
493
498
  const dir = await checkout(DEFAULT_BRANCH);
494
499
  expect(norm(await fs.readFile(path.join(dir, '.bevelignore'), 'utf8'))).toBe(
@@ -501,7 +506,7 @@ describe('TemplateFilesStep', () => {
501
506
  scaffold['.bevelignore'] = 'AGENTS.md\n!mcp-description.md\n';
502
507
  await seedUpstream(scaffold);
503
508
 
504
- await makeRunner([new TemplateFilesStep(new NodeFs(), kbContext)]).runAll();
509
+ await makeRunner([new TemplateFilesStep(realDisk(), kbContext)]).runAll();
505
510
 
506
511
  const dir = await checkout(DEFAULT_BRANCH);
507
512
  expect(norm(await fs.readFile(path.join(dir, '.bevelignore'), 'utf8'))).toBe(
@@ -518,14 +523,14 @@ describe('TemplateFilesStep', () => {
518
523
  'AGENTS.md\n# Added by the platform: agent instructions are edited from External agent access.\nmcp-description.md\n';
519
524
  await seedUpstream(scaffold);
520
525
 
521
- await makeRunner([new TemplateFilesStep(new NodeFs(), kbContext)]).runAll();
526
+ await makeRunner([new TemplateFilesStep(realDisk(), kbContext)]).runAll();
522
527
 
523
528
  const dir = await checkout(DEFAULT_BRANCH);
524
529
  expect(norm(await fs.readFile(path.join(dir, '.bevelignore'), 'utf8'))).toBe(
525
530
  'AGENTS.md\n# Added by the platform: agent instructions are edited from External agent access.\n/mcp-description.md\n',
526
531
  );
527
532
  // Idempotent: a second boot has nothing to change.
528
- await makeRunner([new TemplateFilesStep(new NodeFs(), kbContext)]).runAll();
533
+ await makeRunner([new TemplateFilesStep(realDisk(), kbContext)]).runAll();
529
534
  const again = await checkout(DEFAULT_BRANCH);
530
535
  expect(norm(await fs.readFile(path.join(again, '.bevelignore'), 'utf8'))).toBe(
531
536
  'AGENTS.md\n# Added by the platform: agent instructions are edited from External agent access.\n/mcp-description.md\n',
@@ -537,7 +542,7 @@ describe('TemplateFilesStep', () => {
537
542
  scaffold['.bevelignore'] = 'AGENTS.md\n# I hide it everywhere on purpose\nmcp-description.md\n';
538
543
  await seedUpstream(scaffold);
539
544
 
540
- await makeRunner([new TemplateFilesStep(new NodeFs(), kbContext)]).runAll();
545
+ await makeRunner([new TemplateFilesStep(realDisk(), kbContext)]).runAll();
541
546
 
542
547
  const dir = await checkout(DEFAULT_BRANCH);
543
548
  expect(norm(await fs.readFile(path.join(dir, '.bevelignore'), 'utf8'))).toBe(
@@ -549,7 +554,7 @@ describe('TemplateFilesStep', () => {
549
554
  const scaffold = await fullScaffold();
550
555
  delete scaffold['mcp-description.md'];
551
556
  await seedUpstream(scaffold);
552
- await makeRunner([new TemplateFilesStep(new NodeFs(), kbContext)]).runAll();
557
+ await makeRunner([new TemplateFilesStep(realDisk(), kbContext)]).runAll();
553
558
 
554
559
  for (const b of PROTECTED) {
555
560
  const dir = await checkout(b);
@@ -564,7 +569,7 @@ describe('TemplateFilesStep', () => {
564
569
  it('leaves an existing mcp-description.md untouched: seeded once, never refreshed', async () => {
565
570
  const mine = 'Acme builds solar farms.\n\n## What is where\n\n- Projects/\n';
566
571
  await seedUpstream({ ...(await fullScaffold()), 'mcp-description.md': mine });
567
- await makeRunner([new TemplateFilesStep(new NodeFs(), kbContext)]).runAll();
572
+ await makeRunner([new TemplateFilesStep(realDisk(), kbContext)]).runAll();
568
573
 
569
574
  const dir = await checkout(DEFAULT_BRANCH);
570
575
  expect(norm(await fs.readFile(path.join(dir, 'mcp-description.md'), 'utf8'))).toBe(mine);
@@ -573,7 +578,7 @@ describe('TemplateFilesStep', () => {
573
578
 
574
579
  it('keeps a deliberately emptied mcp-description.md empty: the top-up restores only a MISSING file', async () => {
575
580
  await seedUpstream({ ...(await fullScaffold()), 'mcp-description.md': '' });
576
- await makeRunner([new TemplateFilesStep(new NodeFs(), kbContext)]).runAll();
581
+ await makeRunner([new TemplateFilesStep(realDisk(), kbContext)]).runAll();
577
582
 
578
583
  const dir = await checkout(DEFAULT_BRANCH);
579
584
  expect(await fs.readFile(path.join(dir, 'mcp-description.md'), 'utf8')).toBe('');
@@ -590,7 +595,7 @@ describe('TemplateFilesStep', () => {
590
595
  expect(shipped).toContain('first paragraph under about 220');
591
596
  expect(shipped).not.toContain('{{');
592
597
  const composed = composeAgentInstructions(shipped);
593
- expect(composed.instructions).toBe(platformInstructions(DEFAULT_KB_LAYOUT));
598
+ expect(composed.instructions).toBe(platformInstructions(DEFAULT_KB_LAYOUT, ''));
594
599
  expect(composed.toolPrefix).toBe(TOOL_PREFIX_LINE);
595
600
  expect(composed.unterminatedComment).toBe(false);
596
601
  expect(composed.preambleChars).toBe(0);
@@ -608,7 +613,7 @@ describe('TemplateFilesStep', () => {
608
613
  await seedUpstream(scaffold);
609
614
  const warn = vi.spyOn(console, 'warn').mockImplementation(() => {});
610
615
 
611
- await makeRunner([new TemplateFilesStep(new NodeFs(), kbContext)], customTemplate).runAll();
616
+ await makeRunner([new TemplateFilesStep(realDisk(), kbContext)], customTemplate).runAll();
612
617
 
613
618
  const dir = await checkout(DEFAULT_BRANCH);
614
619
  expect(norm(await fs.readFile(path.join(dir, 'mcp-description.md'), 'utf8'))).toBe(
@@ -623,7 +628,7 @@ describe('TemplateFilesStep', () => {
623
628
  const scaffold = await fullScaffold();
624
629
  delete scaffold['access.md'];
625
630
  await seedUpstream(scaffold);
626
- await expect(makeRunner([new TemplateFilesStep(new NodeFs(), kbContext)], stricter).runAll()).rejects.toThrow(/ENOENT/);
631
+ await expect(makeRunner([new TemplateFilesStep(realDisk(), kbContext)], stricter).runAll()).rejects.toThrow(/ENOENT/);
627
632
  });
628
633
  });
629
634
 
@@ -650,7 +655,7 @@ describe('TemplateFilesStep: the guide copies earlier releases wrote', () => {
650
655
 
651
656
  it('removes the platform-written AGENTS.md from every protected branch, and the rules that hid it', async () => {
652
657
  await seedUpstream({ ...(await fullScaffold()), 'AGENTS.md': MANAGED_GUIDE_COPY, '.bevelignore': OLD_RELEASE_IGNORE });
653
- await makeRunner([new TemplateFilesStep(new NodeFs(), kbContext)]).runAll();
658
+ await makeRunner([new TemplateFilesStep(realDisk(), kbContext)]).runAll();
654
659
 
655
660
  for (const branch of PROTECTED) {
656
661
  const dir = await checkout(branch);
@@ -671,13 +676,13 @@ describe('TemplateFilesStep: the guide copies earlier releases wrote', () => {
671
676
 
672
677
  // The boot after finds nothing to do.
673
678
  const head = (await git(await checkout(DEFAULT_BRANCH), ['rev-parse', 'HEAD'])).trim();
674
- await makeRunner([new TemplateFilesStep(new NodeFs(), kbContext)]).runAll();
679
+ await makeRunner([new TemplateFilesStep(realDisk(), kbContext)]).runAll();
675
680
  expect((await git(await checkout(DEFAULT_BRANCH), ['rev-parse', 'HEAD'])).trim()).toBe(head);
676
681
  });
677
682
 
678
683
  it("leaves the organisation's own AGENTS.md byte for byte, and stops hiding it", async () => {
679
684
  await seedUpstream({ ...(await fullScaffold()), 'AGENTS.md': CUSTOMER_GUIDE, '.bevelignore': OLD_RELEASE_IGNORE });
680
- await makeRunner([new TemplateFilesStep(new NodeFs(), kbContext)]).runAll();
685
+ await makeRunner([new TemplateFilesStep(realDisk(), kbContext)]).runAll();
681
686
 
682
687
  const dir = await checkout(DEFAULT_BRANCH);
683
688
  expect(norm(await fs.readFile(path.join(dir, 'AGENTS.md'), 'utf8'))).toBe(CUSTOMER_GUIDE);
@@ -700,7 +705,7 @@ describe('TemplateFilesStep: the guide copies earlier releases wrote', () => {
700
705
  // A negation and a hand-written rule under neither comment stay.
701
706
  '!Notes.md\n# mine\nPrivate.md\n';
702
707
  await seedUpstream(scaffold);
703
- await makeRunner([new TemplateFilesStep(new NodeFs(), kbContext)]).runAll();
708
+ await makeRunner([new TemplateFilesStep(realDisk(), kbContext)]).runAll();
704
709
 
705
710
  const dir = await checkout(DEFAULT_BRANCH);
706
711
  expect(norm(await fs.readFile(path.join(dir, 'HEXIS.md'), 'utf8'))).toBe(CUSTOMER_GUIDE);
@@ -720,7 +725,7 @@ describe('TemplateFilesStep: the guide copies earlier releases wrote', () => {
720
725
  scaffold['.bevelignore'] = '# mine\nAGENTS.md\nMyStuff/\n';
721
726
  scaffold['AGENTS.md'] = CUSTOMER_GUIDE;
722
727
  await seedUpstream(scaffold);
723
- await makeRunner([new TemplateFilesStep(new NodeFs(), kbContext)]).runAll();
728
+ await makeRunner([new TemplateFilesStep(realDisk(), kbContext)]).runAll();
724
729
  const text = norm(await fs.readFile(path.join(await checkout(DEFAULT_BRANCH), '.bevelignore'), 'utf8'));
725
730
  expect(text).toContain('# mine\nAGENTS.md\nMyStuff/');
726
731
  });
@@ -733,7 +738,7 @@ describe('TemplateFilesStep: the guide copies earlier releases wrote', () => {
733
738
  // The rule the release that wrote the guide under that name appended.
734
739
  scaffold['.bevelignore'] = `${OLD_RELEASE_IGNORE}\n# The platform's agent guide.\n${String.raw`\#Guide\[1\].md`}\n`;
735
740
  await seedUpstream(scaffold);
736
- await makeRunner([new TemplateFilesStep(new NodeFs(), kbContext)]).runAll();
741
+ await makeRunner([new TemplateFilesStep(realDisk(), kbContext)]).runAll();
737
742
 
738
743
  const dir = await checkout(DEFAULT_BRANCH);
739
744
  expect(await exists(dir, '#Guide[1].md')).toBe(false);
@@ -754,7 +759,7 @@ describe('TemplateFilesStep: the guide copies earlier releases wrote', () => {
754
759
  scaffold['Welcome.md'] = '# Welcome\n\nStart with the handbook.\n';
755
760
  scaffold['.bevelignore'] = `${OLD_RELEASE_IGNORE}\n# The platform's agent guide.\nOLD-GUIDE.md\n`;
756
761
  await seedUpstream(scaffold);
757
- await makeRunner([new TemplateFilesStep(new NodeFs(), kbContext)]).runAll();
762
+ await makeRunner([new TemplateFilesStep(realDisk(), kbContext)]).runAll();
758
763
 
759
764
  const dir = await checkout(DEFAULT_BRANCH);
760
765
  expect(await exists(dir, 'OLD-GUIDE.md')).toBe(false);
@@ -777,7 +782,7 @@ describe('TemplateFilesStep: the guide copies earlier releases wrote', () => {
777
782
  await git(seeding, ['commit', '-m', 'link AGENTS.md at our own file']);
778
783
  await git(seeding, ['push', 'origin', DEFAULT_BRANCH]);
779
784
 
780
- await makeRunner([new TemplateFilesStep(new NodeFs(), kbContext)]).runAll();
785
+ await makeRunner([new TemplateFilesStep(realDisk(), kbContext)]).runAll();
781
786
 
782
787
  const dir = await checkout(DEFAULT_BRANCH);
783
788
  expect((await fs.lstat(path.join(dir, 'AGENTS.md'))).isSymbolicLink()).toBe(true);
@@ -790,7 +795,7 @@ describe('TemplateFilesStep: the guide copies earlier releases wrote', () => {
790
795
  describe('RolesYamlStep', () => {
791
796
  it('generates roles.yaml with the configured admins on every protected branch', async () => {
792
797
  await seedUpstream({ 'marker.txt': 'seeded' });
793
- await makeRunner([new RolesYamlStep(new NodeFs(), ['admin@example.com'], kbContext)]).runAll();
798
+ await makeRunner([new RolesYamlStep(realDisk(), ['admin@example.com'], kbContext)]).runAll();
794
799
 
795
800
  for (const b of PROTECTED) {
796
801
  const dir = await checkout(b);
@@ -808,7 +813,7 @@ describe('RolesYamlStep', () => {
808
813
  // skip-if-present check, reporting success over a KB whose access roster
809
814
  // cannot be read. Fail closed instead.
810
815
  await seedUpstream({ 'roles.yaml/placeholder.txt': 'squatter' });
811
- await expect(makeRunner([new RolesYamlStep(new NodeFs(), ['admin@example.com'], kbContext)]).runAll()).rejects.toThrow(
816
+ await expect(makeRunner([new RolesYamlStep(realDisk(), ['admin@example.com'], kbContext)]).runAll()).rejects.toThrow(
812
817
  /"roles\.yaml" on branch "current-company-state" exists but is not a regular file \(directory\)/,
813
818
  );
814
819
  });
@@ -816,7 +821,7 @@ describe('RolesYamlStep', () => {
816
821
  it('declares a skip when the file is missing and no admins are configured', async () => {
817
822
  await seedUpstream({ 'marker.txt': 'seeded' });
818
823
  const warn = vi.spyOn(console, 'warn').mockImplementation(() => {});
819
- await makeRunner([new RolesYamlStep(new NodeFs(), [])]).runAll(); // resolves — a declared skip, not a failure
824
+ await makeRunner([new RolesYamlStep(realDisk(), [])]).runAll(); // resolves — a declared skip, not a failure
820
825
 
821
826
  expect(warn.mock.calls.some((c) => String(c[0]).includes('roles-yaml: skipped'))).toBe(true);
822
827
  const dir = await checkout(DEFAULT_BRANCH);
@@ -862,7 +867,7 @@ describe('buildSeedTree', () => {
862
867
 
863
868
  const dest = path.join(root, 'seed-dest');
864
869
  await fs.mkdir(dest, { recursive: true });
865
- const generated = await buildSeedTree(new NodeFs(),templateDir, [], ['admin@example.com'], kbContext)(dest);
870
+ const generated = await buildSeedTree(realDisk(),templateDir, [], ['admin@example.com'], kbContext)(dest);
866
871
 
867
872
  expect(await exists(dest, '.git')).toBe(false);
868
873
  expect(await exists(dest, 'docs/.git')).toBe(false);
@@ -873,12 +878,31 @@ describe('buildSeedTree', () => {
873
878
  expect(await exists(dest, 'roles.yaml')).toBe(true);
874
879
  });
875
880
 
881
+ it('seeds the shared rules naming the default branch, and naming none for a caller that hands only the layout', async () => {
882
+ const templateDir = path.join(root, 'seed-rules-template');
883
+ await fs.mkdir(templateDir, { recursive: true });
884
+ await fs.writeFile(path.join(templateDir, 'rules.md'), SHARED_FILE_RULES_PLACEHOLDER, 'utf8');
885
+ const seed = async (kb: Parameters<typeof buildSeedTree>[4], name: string): Promise<string> => {
886
+ const dest = path.join(root, name);
887
+ await fs.mkdir(dest, { recursive: true });
888
+ await buildSeedTree(realDisk(), templateDir, [], ['admin@example.com'], kb)(dest);
889
+ return fs.readFile(path.join(dest, 'rules.md'), 'utf8');
890
+ };
891
+
892
+ const named = await seed({ layout: DEFAULT_KB_LAYOUT, defaultBranch: 'target-company-state' }, 'seed-rules-named');
893
+ expect(named).toBe(sharedFileRulesSection(DEFAULT_KB_LAYOUT, 'target-company-state'));
894
+ expect(named).toContain("This knowledge base's default branch is `target-company-state`");
895
+ // The context took only `{ layout }` before the branch was named; that
896
+ // call still compiles and seeds the rules without the sentence.
897
+ expect(await seed({ layout: DEFAULT_KB_LAYOUT }, 'seed-rules-layout-only')).toBe(sharedFileRulesSection(DEFAULT_KB_LAYOUT, ''));
898
+ });
899
+
876
900
  it('seeds the layout in effect when it seeds, not the one it was composed under', async () => {
877
901
  const templateDir = path.join(root, 'seed-template-layout');
878
902
  await fs.mkdir(templateDir, { recursive: true });
879
903
  await fs.writeFile(path.join(templateDir, 'access.md'), 'policy', 'utf8');
880
904
  // Composed at boot, under the defaults…
881
- const seed = buildSeedTree(new NodeFs(), templateDir, [], ['admin@example.com'], kbContext);
905
+ const seed = buildSeedTree(realDisk(), templateDir, [], ['admin@example.com'], kbContext);
882
906
  // …and run after the completing save applied the admin's names.
883
907
  kbContext.applyLayout({ knowledgeBaseDir: 'Docs', skillsDir: 'skills', pluginsDir: 'Plugins' });
884
908
  const dest = path.join(root, 'seed-dest-layout');
@@ -890,7 +914,7 @@ describe('buildSeedTree', () => {
890
914
  it('seeds no guide, and no rule hiding one: the platform serves the guide', async () => {
891
915
  const dest = path.join(root, 'seed-dest-no-guide');
892
916
  await fs.mkdir(dest, { recursive: true });
893
- await buildSeedTree(new NodeFs(), TEMPLATE_DIR, [], ['admin@example.com'], kbContext)(dest);
917
+ await buildSeedTree(realDisk(), TEMPLATE_DIR, [], ['admin@example.com'], kbContext)(dest);
894
918
  expect(await exists(dest, 'AGENTS.md')).toBe(false);
895
919
  expect(await exists(dest, 'CLAUDE.md')).toBe(false);
896
920
  const ignore = norm(await fs.readFile(path.join(dest, '.bevelignore'), 'utf8')).split('\n').map((l) => l.trim());
@@ -913,7 +937,7 @@ describe('buildSeedTree', () => {
913
937
  await fs.writeFile(path.join(stale, 'LEGACY-GUIDE.MD'), MANAGED_GUIDE_COPY, 'utf8');
914
938
  const staleDest = path.join(root, 'seed-dest-stale-guide');
915
939
  await fs.mkdir(staleDest, { recursive: true });
916
- await buildSeedTree(new NodeFs(), stale, [], ['admin@example.com'], kbContext)(staleDest);
940
+ await buildSeedTree(realDisk(), stale, [], ['admin@example.com'], kbContext)(staleDest);
917
941
  expect(await exists(staleDest, 'AGENTS.md')).toBe(false);
918
942
  expect(await exists(staleDest, 'OLD-GUIDE.md')).toBe(false);
919
943
  expect(await exists(staleDest, 'LEGACY-GUIDE.MD')).toBe(false);
@@ -925,14 +949,14 @@ describe('buildSeedTree', () => {
925
949
  await fs.writeFile(path.join(own, 'AGENTS.md'), '# Acme conventions\n', 'utf8');
926
950
  const ownDest = path.join(root, 'seed-dest-own-guide');
927
951
  await fs.mkdir(ownDest, { recursive: true });
928
- await buildSeedTree(new NodeFs(), own, [], ['admin@example.com'], kbContext)(ownDest);
952
+ await buildSeedTree(realDisk(), own, [], ['admin@example.com'], kbContext)(ownDest);
929
953
  expect(norm(await fs.readFile(path.join(ownDest, 'AGENTS.md'), 'utf8'))).toBe('# Acme conventions\n');
930
954
  });
931
955
 
932
956
  it('names a template that is not there — a missing directory is a broken build, not an empty seed', async () => {
933
957
  const dest = path.join(root, 'seed-dest-missing');
934
958
  await fs.mkdir(dest, { recursive: true });
935
- await expect(buildSeedTree(new NodeFs(),path.join(root, 'no-such-template'), [], ['admin@example.com'], kbContext)(dest)).rejects.toThrow(
959
+ await expect(buildSeedTree(realDisk(),path.join(root, 'no-such-template'), [], ['admin@example.com'], kbContext)(dest)).rejects.toThrow(
936
960
  /KB template ".*no-such-template" is not a directory/,
937
961
  );
938
962
  });
@@ -948,7 +972,7 @@ describe('buildSeedTree', () => {
948
972
 
949
973
  const dest = path.join(root, 'seed-dest-links');
950
974
  await fs.mkdir(dest, { recursive: true });
951
- await buildSeedTree(new NodeFs(),templateDir, [], ['admin@example.com'], kbContext)(dest);
975
+ await buildSeedTree(realDisk(),templateDir, [], ['admin@example.com'], kbContext)(dest);
952
976
  // The link's CONTENT, under the link's own name, as a real file.
953
977
  expect(await fs.readFile(path.join(dest, 'docs/linked.md'), 'utf8')).toBe('shared');
954
978
  expect((await fs.lstat(path.join(dest, 'docs/linked.md'))).isSymbolicLink()).toBe(false);
@@ -957,7 +981,7 @@ describe('buildSeedTree', () => {
957
981
  await fs.symlink(path.join(root, 'nowhere.md'), path.join(templateDir, 'dangling.md'), 'file');
958
982
  const dest2 = path.join(root, 'seed-dest-links-2');
959
983
  await fs.mkdir(dest2, { recursive: true });
960
- await expect(buildSeedTree(new NodeFs(),templateDir, [], ['admin@example.com'], kbContext)(dest2)).rejects.toThrow(
984
+ await expect(buildSeedTree(realDisk(),templateDir, [], ['admin@example.com'], kbContext)(dest2)).rejects.toThrow(
961
985
  /KB template entry "dangling.md" links to nothing/,
962
986
  );
963
987
  // …and so is a link to a folder, named for what it is.
@@ -965,7 +989,7 @@ describe('buildSeedTree', () => {
965
989
  await fs.symlink(elsewhere, path.join(templateDir, 'dirlink'), process.platform === 'win32' ? 'junction' : 'dir');
966
990
  const dest3 = path.join(root, 'seed-dest-links-3');
967
991
  await fs.mkdir(dest3, { recursive: true });
968
- await expect(buildSeedTree(new NodeFs(),templateDir, [], ['admin@example.com'], kbContext)(dest3)).rejects.toThrow(
992
+ await expect(buildSeedTree(realDisk(),templateDir, [], ['admin@example.com'], kbContext)(dest3)).rejects.toThrow(
969
993
  /KB template entry "dirlink" links to a directory/,
970
994
  );
971
995
  });
@@ -983,7 +1007,7 @@ describe('buildSeedTree', () => {
983
1007
 
984
1008
  const dest = path.join(root, 'proto-dest');
985
1009
  await fs.mkdir(dest, { recursive: true });
986
- await buildSeedTree(new NodeFs(), templateDir, [], ['admin@example.com'], kbContext)(dest);
1010
+ await buildSeedTree(realDisk(), templateDir, [], ['admin@example.com'], kbContext)(dest);
987
1011
  expect(await fs.readFile(path.join(dest, 'constructor'), 'utf8')).toBe('not a function');
988
1012
  expect(await fs.readFile(path.join(dest, 'toString'), 'utf8')).toBe('nor this');
989
1013
  });
@@ -1015,7 +1039,7 @@ describe('PluginManifestsStep', () => {
1015
1039
  'Plugins/deps/node_modules/some-pkg/SKILL.md': '---\ndescription: z\n---\n',
1016
1040
  });
1017
1041
 
1018
- await makeRunner([new PluginManifestsStep(new NodeFs(), kbContext)]).runAll();
1042
+ await makeRunner([new PluginManifestsStep(realDisk(), kbContext)]).runAll();
1019
1043
 
1020
1044
  for (const branch of PROTECTED) {
1021
1045
  const dir = await checkout(branch);
@@ -1034,7 +1058,7 @@ describe('PluginManifestsStep', () => {
1034
1058
  expect(log).toContain('Plugins/GTM: plugin.json written');
1035
1059
 
1036
1060
  // Idempotent: nothing left to write on the next boot.
1037
- await makeRunner([new PluginManifestsStep(new NodeFs(), kbContext)]).runAll();
1061
+ await makeRunner([new PluginManifestsStep(realDisk(), kbContext)]).runAll();
1038
1062
  const again = await checkout(DEFAULT_BRANCH);
1039
1063
  expect((await git(again, ['rev-list', '--count', 'HEAD'])).trim()).toBe('2'); // init + one migration commit
1040
1064
  });
@@ -1069,7 +1093,7 @@ describe('PluginDisplayNamesStep', () => {
1069
1093
  'Plugins/functional/cluster/example/plugin.bundle.json': '{"name":"example"}',
1070
1094
  });
1071
1095
 
1072
- await makeRunner([new PluginDisplayNamesStep(new NodeFs(), kbContext)]).runAll();
1096
+ await makeRunner([new PluginDisplayNamesStep(realDisk(), kbContext)]).runAll();
1073
1097
 
1074
1098
  for (const branch of PROTECTED) {
1075
1099
  const dir = await checkout(branch);
@@ -1101,7 +1125,7 @@ describe('PluginDisplayNamesStep', () => {
1101
1125
  expect(log).toContain('Plugins/Sales Team: displayName "Sales Team"');
1102
1126
 
1103
1127
  // Idempotent: every manifest it would touch now carries the field.
1104
- await makeRunner([new PluginDisplayNamesStep(new NodeFs(), kbContext)]).runAll();
1128
+ await makeRunner([new PluginDisplayNamesStep(realDisk(), kbContext)]).runAll();
1105
1129
  const again = await checkout(DEFAULT_BRANCH);
1106
1130
  expect((await git(again, ['rev-list', '--count', 'HEAD'])).trim()).toBe('2'); // init + one backfill commit
1107
1131
  });
@@ -1138,7 +1162,7 @@ describe('PluginDisplayNamesStep', () => {
1138
1162
  { 'Plugins/Kit Pro/plugin.json': '../../vendor-manifest.json' },
1139
1163
  );
1140
1164
 
1141
- await makeRunner([new PluginDisplayNamesStep(new NodeFs(), kbContext)]).runAll();
1165
+ await makeRunner([new PluginDisplayNamesStep(realDisk(), kbContext)]).runAll();
1142
1166
 
1143
1167
  const dir = await checkout(DEFAULT_BRANCH);
1144
1168
  expect(await readJson(dir, 'Plugins/Growth Team/plugin.json')).toEqual({
@@ -1160,7 +1184,7 @@ describe('PluginDisplayNamesStep', () => {
1160
1184
  expect(log).not.toContain('Kit Pro');
1161
1185
 
1162
1186
  // Idempotent over all of it: the next boot finds nothing to write.
1163
- await makeRunner([new PluginDisplayNamesStep(new NodeFs(), kbContext)]).runAll();
1187
+ await makeRunner([new PluginDisplayNamesStep(realDisk(), kbContext)]).runAll();
1164
1188
  const again = await checkout(DEFAULT_BRANCH);
1165
1189
  expect((await git(again, ['rev-list', '--count', 'HEAD'])).trim()).toBe('2'); // init + one backfill commit
1166
1190
  });
@@ -1174,7 +1198,7 @@ describe('PluginDisplayNamesStep', () => {
1174
1198
  'Plugins/Sales Team/access.md': '---\n---\nread:\n - everyone\n',
1175
1199
  });
1176
1200
 
1177
- await makeRunner([new PluginManifestsStep(new NodeFs(), kbContext), new PluginDisplayNamesStep(new NodeFs(), kbContext)]).runAll();
1201
+ await makeRunner([new PluginManifestsStep(realDisk(), kbContext), new PluginDisplayNamesStep(realDisk(), kbContext)]).runAll();
1178
1202
 
1179
1203
  const dir = await checkout(DEFAULT_BRANCH);
1180
1204
  expect(await readJson(dir, 'Plugins/Sales Team/plugin.json')).toEqual({
@@ -1232,7 +1256,7 @@ describe('PersonalSpacesStep', () => {
1232
1256
  await git(seed, ['checkout', '-b', 'ali/draft']);
1233
1257
  await git(seed, ['push', 'origin', 'ali/draft']);
1234
1258
 
1235
- await makeRunner([new PersonalSpacesStep(new NodeFs(), kbContext)]).runAll();
1259
+ await makeRunner([new PersonalSpacesStep(realDisk(), kbContext)]).runAll();
1236
1260
 
1237
1261
  for (const branch of [...PROTECTED, 'ali/draft']) {
1238
1262
  const dir = await checkout(branch);
@@ -1288,7 +1312,7 @@ describe('PersonalSpacesStep', () => {
1288
1312
  expect(log).toContain('Plugins/personal-u5/access.md: read denies everyone');
1289
1313
 
1290
1314
  // Idempotent: the next boot finds every space already closed.
1291
- await makeRunner([new PersonalSpacesStep(new NodeFs(), kbContext)]).runAll();
1315
+ await makeRunner([new PersonalSpacesStep(realDisk(), kbContext)]).runAll();
1292
1316
  const again = await checkout(DEFAULT_BRANCH);
1293
1317
  expect((await git(again, ['rev-list', '--count', 'HEAD'])).trim()).toBe('2');
1294
1318
  });
@@ -1317,7 +1341,7 @@ describe('GroupsToPluginsStep', () => {
1317
1341
  await git(seed, ['checkout', '-b', 'alice/draft']);
1318
1342
  await git(seed, ['push', 'origin', 'alice/draft']);
1319
1343
 
1320
- await makeRunner([new GroupsToPluginsStep(new NodeFs(), kbContext)]).runAll();
1344
+ await makeRunner([new GroupsToPluginsStep(realDisk(), kbContext)]).runAll();
1321
1345
 
1322
1346
  for (const b of [DEFAULT_BRANCH, 'alice/draft']) {
1323
1347
  const dir = await checkout(b);
@@ -1352,7 +1376,7 @@ describe('GroupsToPluginsStep', () => {
1352
1376
  // silently skipping a branch whose reserved root cannot be a plugin tree
1353
1377
  // (and on a draft nothing later would ever report it).
1354
1378
  await seedUpstream({ Plugins: 'i am a file, not a folder' });
1355
- await expect(makeRunner([new GroupsToPluginsStep(new NodeFs(), kbContext)]).runAll()).rejects.toThrow(
1379
+ await expect(makeRunner([new GroupsToPluginsStep(realDisk(), kbContext)]).runAll()).rejects.toThrow(
1356
1380
  /"Plugins" exists but is not a directory/,
1357
1381
  );
1358
1382
  });
@@ -1364,7 +1388,7 @@ describe('GroupsToPluginsStep', () => {
1364
1388
  'Plugins/B/y.md': 'new',
1365
1389
  });
1366
1390
  await makeRunner([
1367
- new GroupsToPluginsStep(new NodeFs(), kbContext),
1391
+ new GroupsToPluginsStep(realDisk(), kbContext),
1368
1392
  // A later step dirties the branch so the refusal note surfaces in the commit.
1369
1393
  step('dirty', async (ctx) => {
1370
1394
  for (const b of await ctx.protectedBranches()) {
@@ -1394,7 +1418,7 @@ describe('GroupsToPluginsStep', () => {
1394
1418
  */
1395
1419
  describe('GroupsToPluginsStep — migration edge cases', () => {
1396
1420
  async function migrate(): Promise<void> {
1397
- await makeRunner([new GroupsToPluginsStep(new NodeFs(), kbContext)]).runAll();
1421
+ await makeRunner([new GroupsToPluginsStep(realDisk(), kbContext)]).runAll();
1398
1422
  }
1399
1423
 
1400
1424
  /** What the runner's `partial` warning carried — the named refusals. */