@bevel-software/platform-core-backend 0.25.2 → 0.27.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (733) hide show
  1. package/agent-guide/access-control.md +251 -0
  2. package/agent-guide/conventions.md +35 -0
  3. package/agent-guide/directory-structure.md +145 -0
  4. package/agent-guide/finding-things.md +7 -0
  5. package/agent-guide/html-views.md +83 -0
  6. package/agent-guide/introduction.md +27 -0
  7. package/agent-guide/new-knowledge-base.md +24 -0
  8. package/agent-guide/skills.md +47 -0
  9. package/agent-guide/tool-manuals.md +227 -0
  10. package/agent-guide/where-a-new-file-goes.md +36 -0
  11. package/dist/assets.d.ts +26 -0
  12. package/dist/assets.d.ts.map +1 -1
  13. package/dist/assets.js +35 -2
  14. package/dist/assets.js.map +1 -1
  15. package/dist/core/catalog-revision.d.ts +19 -1
  16. package/dist/core/catalog-revision.d.ts.map +1 -1
  17. package/dist/core/catalog-revision.js +14 -3
  18. package/dist/core/catalog-revision.js.map +1 -1
  19. package/dist/core/core-ports.d.ts +11 -0
  20. package/dist/core/core-ports.d.ts.map +1 -1
  21. package/dist/core/core-ports.js.map +1 -1
  22. package/dist/core/create-core-server.d.ts +5 -0
  23. package/dist/core/create-core-server.d.ts.map +1 -1
  24. package/dist/core/create-core-server.js +65 -3
  25. package/dist/core/create-core-server.js.map +1 -1
  26. package/dist/core/create-core-services.d.ts +35 -0
  27. package/dist/core/create-core-services.d.ts.map +1 -1
  28. package/dist/core/create-core-services.js +114 -12
  29. package/dist/core/create-core-services.js.map +1 -1
  30. package/dist/core/lifecycle.d.ts +16 -1
  31. package/dist/core/lifecycle.d.ts.map +1 -1
  32. package/dist/core/lifecycle.js +18 -1
  33. package/dist/core/lifecycle.js.map +1 -1
  34. package/dist/core-config.d.ts +21 -0
  35. package/dist/core-config.d.ts.map +1 -1
  36. package/dist/core-config.js +22 -1
  37. package/dist/core-config.js.map +1 -1
  38. package/dist/index.d.ts +1 -1
  39. package/dist/index.d.ts.map +1 -1
  40. package/dist/index.js +2 -2
  41. package/dist/index.js.map +1 -1
  42. package/dist/modules/access/access-control.interface.d.ts +17 -0
  43. package/dist/modules/access/access-control.interface.d.ts.map +1 -1
  44. package/dist/modules/access/access-control.service.d.ts +2 -0
  45. package/dist/modules/access/access-control.service.d.ts.map +1 -1
  46. package/dist/modules/access/access-control.service.js +27 -0
  47. package/dist/modules/access/access-control.service.js.map +1 -1
  48. package/dist/modules/access/directory-sync-bot.js +1 -1
  49. package/dist/modules/access/directory-sync-bot.js.map +1 -1
  50. package/dist/modules/agent-guide/agent-guide.d.ts +145 -0
  51. package/dist/modules/agent-guide/agent-guide.d.ts.map +1 -0
  52. package/dist/modules/agent-guide/agent-guide.js +199 -0
  53. package/dist/modules/agent-guide/agent-guide.js.map +1 -0
  54. package/dist/modules/agent-guide/agent-guide.tools.d.ts +24 -0
  55. package/dist/modules/agent-guide/agent-guide.tools.d.ts.map +1 -0
  56. package/dist/modules/agent-guide/agent-guide.tools.js +100 -0
  57. package/dist/modules/agent-guide/agent-guide.tools.js.map +1 -0
  58. package/dist/modules/agent-guide/index.d.ts +4 -0
  59. package/dist/modules/agent-guide/index.d.ts.map +1 -0
  60. package/dist/modules/agent-guide/index.js +4 -0
  61. package/dist/modules/agent-guide/index.js.map +1 -0
  62. package/dist/modules/agent-instructions/agent-instructions.routes.d.ts +3 -2
  63. package/dist/modules/agent-instructions/agent-instructions.routes.d.ts.map +1 -1
  64. package/dist/modules/agent-instructions/agent-instructions.routes.js +3 -2
  65. package/dist/modules/agent-instructions/agent-instructions.routes.js.map +1 -1
  66. package/dist/modules/agent-instructions/compose.d.ts +14 -6
  67. package/dist/modules/agent-instructions/compose.d.ts.map +1 -1
  68. package/dist/modules/agent-instructions/compose.js +28 -8
  69. package/dist/modules/agent-instructions/compose.js.map +1 -1
  70. package/dist/modules/agent-instructions/index.d.ts +1 -1
  71. package/dist/modules/agent-instructions/index.d.ts.map +1 -1
  72. package/dist/modules/agent-instructions/index.js +1 -1
  73. package/dist/modules/agent-instructions/index.js.map +1 -1
  74. package/dist/modules/agent-instructions/shared-file-rules.d.ts +10 -50
  75. package/dist/modules/agent-instructions/shared-file-rules.d.ts.map +1 -1
  76. package/dist/modules/agent-instructions/shared-file-rules.js +51 -104
  77. package/dist/modules/agent-instructions/shared-file-rules.js.map +1 -1
  78. package/dist/modules/audit/agent-audit.service.d.ts +21 -2
  79. package/dist/modules/audit/agent-audit.service.d.ts.map +1 -1
  80. package/dist/modules/audit/agent-audit.service.js +43 -2
  81. package/dist/modules/audit/agent-audit.service.js.map +1 -1
  82. package/dist/modules/audit/agent-connection.routes.d.ts +34 -0
  83. package/dist/modules/audit/agent-connection.routes.d.ts.map +1 -0
  84. package/dist/modules/audit/agent-connection.routes.js +38 -0
  85. package/dist/modules/audit/agent-connection.routes.js.map +1 -0
  86. package/dist/modules/audit/audit.contract.d.ts +24 -0
  87. package/dist/modules/audit/audit.contract.d.ts.map +1 -1
  88. package/dist/modules/audit/audit.contract.js.map +1 -1
  89. package/dist/modules/audit/index.d.ts +1 -0
  90. package/dist/modules/audit/index.d.ts.map +1 -1
  91. package/dist/modules/audit/index.js +1 -0
  92. package/dist/modules/audit/index.js.map +1 -1
  93. package/dist/modules/auth/account.routes.d.ts.map +1 -1
  94. package/dist/modules/auth/account.routes.js +10 -3
  95. package/dist/modules/auth/account.routes.js.map +1 -1
  96. package/dist/modules/auth/auth.middleware.d.ts +7 -0
  97. package/dist/modules/auth/auth.middleware.d.ts.map +1 -1
  98. package/dist/modules/auth/auth.middleware.js +1 -1
  99. package/dist/modules/auth/auth.middleware.js.map +1 -1
  100. package/dist/modules/code-mode/code-mode.tool.d.ts.map +1 -1
  101. package/dist/modules/code-mode/code-mode.tool.js +11 -3
  102. package/dist/modules/code-mode/code-mode.tool.js.map +1 -1
  103. package/dist/modules/database/core-schema.d.ts +96 -0
  104. package/dist/modules/database/core-schema.d.ts.map +1 -1
  105. package/dist/modules/database/core-schema.js +32 -3
  106. package/dist/modules/database/core-schema.js.map +1 -1
  107. package/dist/modules/embed/account-link.service.d.ts +42 -0
  108. package/dist/modules/embed/account-link.service.d.ts.map +1 -0
  109. package/dist/modules/embed/account-link.service.js +50 -0
  110. package/dist/modules/embed/account-link.service.js.map +1 -0
  111. package/dist/modules/embed/embed-link.d.ts +58 -0
  112. package/dist/modules/embed/embed-link.d.ts.map +1 -0
  113. package/dist/modules/embed/embed-link.js +160 -0
  114. package/dist/modules/embed/embed-link.js.map +1 -0
  115. package/dist/modules/embed/embed.errors.d.ts +30 -0
  116. package/dist/modules/embed/embed.errors.d.ts.map +1 -0
  117. package/dist/modules/embed/embed.errors.js +42 -0
  118. package/dist/modules/embed/embed.errors.js.map +1 -0
  119. package/dist/modules/embed/embed.interface.d.ts +204 -0
  120. package/dist/modules/embed/embed.interface.d.ts.map +1 -0
  121. package/dist/modules/embed/embed.interface.js +2 -0
  122. package/dist/modules/embed/embed.interface.js.map +1 -0
  123. package/dist/modules/embed/embed.routes.d.ts +59 -0
  124. package/dist/modules/embed/embed.routes.d.ts.map +1 -0
  125. package/dist/modules/embed/embed.routes.js +343 -0
  126. package/dist/modules/embed/embed.routes.js.map +1 -0
  127. package/dist/modules/embed/embed.service.d.ts +169 -0
  128. package/dist/modules/embed/embed.service.d.ts.map +1 -0
  129. package/dist/modules/embed/embed.service.js +627 -0
  130. package/dist/modules/embed/embed.service.js.map +1 -0
  131. package/dist/modules/embed/embed.tools.d.ts +51 -0
  132. package/dist/modules/embed/embed.tools.d.ts.map +1 -0
  133. package/dist/modules/embed/embed.tools.js +170 -0
  134. package/dist/modules/embed/embed.tools.js.map +1 -0
  135. package/dist/modules/embed/mcp-app.d.ts +64 -0
  136. package/dist/modules/embed/mcp-app.d.ts.map +1 -0
  137. package/dist/modules/embed/mcp-app.js +147 -0
  138. package/dist/modules/embed/mcp-app.js.map +1 -0
  139. package/dist/modules/embed/mcp-app.routes.d.ts +21 -0
  140. package/dist/modules/embed/mcp-app.routes.d.ts.map +1 -0
  141. package/dist/modules/embed/mcp-app.routes.js +36 -0
  142. package/dist/modules/embed/mcp-app.routes.js.map +1 -0
  143. package/dist/modules/github-app/github-app.connection.d.ts +15 -0
  144. package/dist/modules/github-app/github-app.connection.d.ts.map +1 -1
  145. package/dist/modules/github-app/github-app.connection.js +34 -3
  146. package/dist/modules/github-app/github-app.connection.js.map +1 -1
  147. package/dist/modules/kb-fs/locking-filesystem.d.ts +65 -0
  148. package/dist/modules/kb-fs/locking-filesystem.d.ts.map +1 -1
  149. package/dist/modules/kb-fs/locking-filesystem.js +300 -0
  150. package/dist/modules/kb-fs/locking-filesystem.js.map +1 -1
  151. package/dist/modules/kb-sync/kb-sync.interface.d.ts +5 -0
  152. package/dist/modules/kb-sync/kb-sync.interface.d.ts.map +1 -1
  153. package/dist/modules/kb-sync/kb-sync.service.d.ts.map +1 -1
  154. package/dist/modules/kb-sync/kb-sync.service.js +6 -0
  155. package/dist/modules/kb-sync/kb-sync.service.js.map +1 -1
  156. package/dist/modules/mcp/mcp-auth.middleware.d.ts.map +1 -1
  157. package/dist/modules/mcp/mcp-auth.middleware.js +2 -1
  158. package/dist/modules/mcp/mcp-auth.middleware.js.map +1 -1
  159. package/dist/modules/mcp/mcp.service.d.ts +57 -3
  160. package/dist/modules/mcp/mcp.service.d.ts.map +1 -1
  161. package/dist/modules/mcp/mcp.service.js +177 -24
  162. package/dist/modules/mcp/mcp.service.js.map +1 -1
  163. package/dist/modules/mcp/oauth/bevel-oauth-provider.d.ts +24 -0
  164. package/dist/modules/mcp/oauth/bevel-oauth-provider.d.ts.map +1 -1
  165. package/dist/modules/mcp/oauth/bevel-oauth-provider.js +32 -4
  166. package/dist/modules/mcp/oauth/bevel-oauth-provider.js.map +1 -1
  167. package/dist/modules/mcp/tool-schema-guard.d.ts +105 -0
  168. package/dist/modules/mcp/tool-schema-guard.d.ts.map +1 -0
  169. package/dist/modules/mcp/tool-schema-guard.js +171 -0
  170. package/dist/modules/mcp/tool-schema-guard.js.map +1 -0
  171. package/dist/modules/onboarding/onboarding.contract.d.ts +80 -0
  172. package/dist/modules/onboarding/onboarding.contract.d.ts.map +1 -0
  173. package/dist/modules/onboarding/onboarding.contract.js +7 -0
  174. package/dist/modules/onboarding/onboarding.contract.js.map +1 -0
  175. package/dist/modules/onboarding/onboarding.routes.d.ts +18 -0
  176. package/dist/modules/onboarding/onboarding.routes.d.ts.map +1 -0
  177. package/dist/modules/onboarding/onboarding.routes.js +81 -0
  178. package/dist/modules/onboarding/onboarding.routes.js.map +1 -0
  179. package/dist/modules/onboarding/starter-pack.service.d.ts +213 -0
  180. package/dist/modules/onboarding/starter-pack.service.d.ts.map +1 -0
  181. package/dist/modules/onboarding/starter-pack.service.js +492 -0
  182. package/dist/modules/onboarding/starter-pack.service.js.map +1 -0
  183. package/dist/modules/onboarding/starter-packs.d.ts +78 -0
  184. package/dist/modules/onboarding/starter-packs.d.ts.map +1 -0
  185. package/dist/modules/onboarding/starter-packs.js +156 -0
  186. package/dist/modules/onboarding/starter-packs.js.map +1 -0
  187. package/dist/modules/plugins/index.d.ts +1 -1
  188. package/dist/modules/plugins/index.d.ts.map +1 -1
  189. package/dist/modules/plugins/index.js +1 -1
  190. package/dist/modules/plugins/index.js.map +1 -1
  191. package/dist/modules/plugins/plugin-provision.service.d.ts +19 -0
  192. package/dist/modules/plugins/plugin-provision.service.d.ts.map +1 -1
  193. package/dist/modules/plugins/plugin-provision.service.js +18 -1
  194. package/dist/modules/plugins/plugin-provision.service.js.map +1 -1
  195. package/dist/modules/plugins/plugins.routes.d.ts +0 -36
  196. package/dist/modules/plugins/plugins.routes.d.ts.map +1 -1
  197. package/dist/modules/plugins/plugins.routes.js +31 -0
  198. package/dist/modules/plugins/plugins.routes.js.map +1 -1
  199. package/dist/modules/plugins/plugins.tools.d.ts +36 -2
  200. package/dist/modules/plugins/plugins.tools.d.ts.map +1 -1
  201. package/dist/modules/plugins/plugins.tools.js +71 -14
  202. package/dist/modules/plugins/plugins.tools.js.map +1 -1
  203. package/dist/modules/settings/deployment-settings.service.d.ts +34 -7
  204. package/dist/modules/settings/deployment-settings.service.d.ts.map +1 -1
  205. package/dist/modules/settings/deployment-settings.service.js +148 -54
  206. package/dist/modules/settings/deployment-settings.service.js.map +1 -1
  207. package/dist/modules/settings/repository-source.d.ts +1 -0
  208. package/dist/modules/settings/repository-source.d.ts.map +1 -1
  209. package/dist/modules/settings/repository-source.js +3 -3
  210. package/dist/modules/settings/repository-source.js.map +1 -1
  211. package/dist/modules/settings/setup.routes.d.ts.map +1 -1
  212. package/dist/modules/settings/setup.routes.js +3 -6
  213. package/dist/modules/settings/setup.routes.js.map +1 -1
  214. package/dist/modules/skills/skills.tools.d.ts.map +1 -1
  215. package/dist/modules/skills/skills.tools.js +103 -43
  216. package/dist/modules/skills/skills.tools.js.map +1 -1
  217. package/dist/modules/tool-auth/connection-key-rejection.d.ts +10 -1
  218. package/dist/modules/tool-auth/connection-key-rejection.d.ts.map +1 -1
  219. package/dist/modules/tool-auth/connection-key-rejection.js +11 -3
  220. package/dist/modules/tool-auth/connection-key-rejection.js.map +1 -1
  221. package/dist/modules/tool-auth/external-api-key.interface.d.ts +8 -0
  222. package/dist/modules/tool-auth/external-api-key.interface.d.ts.map +1 -1
  223. package/dist/modules/tool-auth/external-api-key.service.d.ts +24 -2
  224. package/dist/modules/tool-auth/external-api-key.service.d.ts.map +1 -1
  225. package/dist/modules/tool-auth/external-api-key.service.js +59 -2
  226. package/dist/modules/tool-auth/external-api-key.service.js.map +1 -1
  227. package/dist/modules/tool-auth/tool-auth.middleware.d.ts.map +1 -1
  228. package/dist/modules/tool-auth/tool-auth.middleware.js +9 -4
  229. package/dist/modules/tool-auth/tool-auth.middleware.js.map +1 -1
  230. package/dist/modules/tool-helpers/index.d.ts +28 -1
  231. package/dist/modules/tool-helpers/index.d.ts.map +1 -1
  232. package/dist/modules/tool-helpers/index.js +28 -1
  233. package/dist/modules/tool-helpers/index.js.map +1 -1
  234. package/dist/modules/tool-helpers/route-argument-check.d.ts +10 -0
  235. package/dist/modules/tool-helpers/route-argument-check.d.ts.map +1 -0
  236. package/dist/modules/tool-helpers/route-argument-check.js +132 -0
  237. package/dist/modules/tool-helpers/route-argument-check.js.map +1 -0
  238. package/dist/modules/tool-helpers/route-tool-schemas.d.ts +89 -0
  239. package/dist/modules/tool-helpers/route-tool-schemas.d.ts.map +1 -0
  240. package/dist/modules/tool-helpers/route-tool-schemas.js +113 -0
  241. package/dist/modules/tool-helpers/route-tool-schemas.js.map +1 -0
  242. package/dist/modules/tool-helpers/tool-def.d.ts +71 -0
  243. package/dist/modules/tool-helpers/tool-def.d.ts.map +1 -1
  244. package/dist/modules/tool-helpers/tool-def.js +70 -6
  245. package/dist/modules/tool-helpers/tool-def.js.map +1 -1
  246. package/dist/modules/tool-helpers/tool-handler.d.ts +46 -6
  247. package/dist/modules/tool-helpers/tool-handler.d.ts.map +1 -1
  248. package/dist/modules/tool-helpers/tool-handler.js +157 -8
  249. package/dist/modules/tool-helpers/tool-handler.js.map +1 -1
  250. package/dist/modules/tool-helpers/tool.contract.d.ts +9 -0
  251. package/dist/modules/tool-helpers/tool.contract.d.ts.map +1 -1
  252. package/dist/modules/tool-helpers/tool.contract.js.map +1 -1
  253. package/dist/modules/tool-manuals/tool-manuals.contract.d.ts +23 -4
  254. package/dist/modules/tool-manuals/tool-manuals.contract.d.ts.map +1 -1
  255. package/dist/modules/tool-manuals/tool-manuals.contract.js.map +1 -1
  256. package/dist/modules/tool-manuals/tool-manuals.service.d.ts +4 -0
  257. package/dist/modules/tool-manuals/tool-manuals.service.d.ts.map +1 -1
  258. package/dist/modules/tool-manuals/tool-manuals.service.js +14 -0
  259. package/dist/modules/tool-manuals/tool-manuals.service.js.map +1 -1
  260. package/dist/modules/tool-manuals/tool-manuals.tools.d.ts +7 -0
  261. package/dist/modules/tool-manuals/tool-manuals.tools.d.ts.map +1 -1
  262. package/dist/modules/tool-manuals/tool-manuals.tools.js +77 -38
  263. package/dist/modules/tool-manuals/tool-manuals.tools.js.map +1 -1
  264. package/dist/modules/tool-registry/description-length.d.ts +20 -16
  265. package/dist/modules/tool-registry/description-length.d.ts.map +1 -1
  266. package/dist/modules/tool-registry/description-length.js +50 -30
  267. package/dist/modules/tool-registry/description-length.js.map +1 -1
  268. package/dist/modules/tool-registry/guide-first.d.ts +27 -0
  269. package/dist/modules/tool-registry/guide-first.d.ts.map +1 -0
  270. package/dist/modules/tool-registry/guide-first.js +40 -0
  271. package/dist/modules/tool-registry/guide-first.js.map +1 -0
  272. package/dist/modules/tool-registry/tool-registry.d.ts +6 -0
  273. package/dist/modules/tool-registry/tool-registry.d.ts.map +1 -1
  274. package/dist/modules/tool-registry/tool-registry.js +9 -2
  275. package/dist/modules/tool-registry/tool-registry.js.map +1 -1
  276. package/dist/modules/workflow/agent-tools/change-request-read-shape.d.ts +449 -0
  277. package/dist/modules/workflow/agent-tools/change-request-read-shape.d.ts.map +1 -0
  278. package/dist/modules/workflow/agent-tools/change-request-read-shape.js +481 -0
  279. package/dist/modules/workflow/agent-tools/change-request-read-shape.js.map +1 -0
  280. package/dist/modules/workflow/agent-tools/change-request-read.tools.d.ts +126 -0
  281. package/dist/modules/workflow/agent-tools/change-request-read.tools.d.ts.map +1 -0
  282. package/dist/modules/workflow/agent-tools/change-request-read.tools.js +611 -0
  283. package/dist/modules/workflow/agent-tools/change-request-read.tools.js.map +1 -0
  284. package/dist/modules/workflow/agent-tools/change-request-summary.d.ts +12 -1
  285. package/dist/modules/workflow/agent-tools/change-request-summary.d.ts.map +1 -1
  286. package/dist/modules/workflow/agent-tools/change-request-summary.js +5 -1
  287. package/dist/modules/workflow/agent-tools/change-request-summary.js.map +1 -1
  288. package/dist/modules/workflow/agent-tools/workflow.tools.d.ts +8 -1
  289. package/dist/modules/workflow/agent-tools/workflow.tools.d.ts.map +1 -1
  290. package/dist/modules/workflow/agent-tools/workflow.tools.js +133 -37
  291. package/dist/modules/workflow/agent-tools/workflow.tools.js.map +1 -1
  292. package/dist/modules/workflow/file-lock.service.d.ts +29 -5
  293. package/dist/modules/workflow/file-lock.service.d.ts.map +1 -1
  294. package/dist/modules/workflow/file-lock.service.js +62 -5
  295. package/dist/modules/workflow/file-lock.service.js.map +1 -1
  296. package/dist/modules/workflow/git/git.service.d.ts +282 -14
  297. package/dist/modules/workflow/git/git.service.d.ts.map +1 -1
  298. package/dist/modules/workflow/git/git.service.js +627 -126
  299. package/dist/modules/workflow/git/git.service.js.map +1 -1
  300. package/dist/modules/workflow/git/merge-commit.d.ts +73 -0
  301. package/dist/modules/workflow/git/merge-commit.d.ts.map +1 -0
  302. package/dist/modules/workflow/git/merge-commit.js +89 -0
  303. package/dist/modules/workflow/git/merge-commit.js.map +1 -0
  304. package/dist/modules/workflow/git/node-git-runner.d.ts +15 -0
  305. package/dist/modules/workflow/git/node-git-runner.d.ts.map +1 -1
  306. package/dist/modules/workflow/git/node-git-runner.js +78 -6
  307. package/dist/modules/workflow/git/node-git-runner.js.map +1 -1
  308. package/dist/modules/workflow/git/pull-request.service.d.ts +94 -1
  309. package/dist/modules/workflow/git/pull-request.service.d.ts.map +1 -1
  310. package/dist/modules/workflow/git/pull-request.service.js +332 -37
  311. package/dist/modules/workflow/git/pull-request.service.js.map +1 -1
  312. package/dist/modules/workflow/pending-commits.service.d.ts +15 -0
  313. package/dist/modules/workflow/pending-commits.service.d.ts.map +1 -1
  314. package/dist/modules/workflow/pending-commits.service.js +25 -1
  315. package/dist/modules/workflow/pending-commits.service.js.map +1 -1
  316. package/dist/modules/workflow/pending-commits.worker.d.ts +6 -1
  317. package/dist/modules/workflow/pending-commits.worker.d.ts.map +1 -1
  318. package/dist/modules/workflow/pending-commits.worker.js +23 -6
  319. package/dist/modules/workflow/pending-commits.worker.js.map +1 -1
  320. package/dist/modules/workflow/recovery-bot.js +1 -1
  321. package/dist/modules/workflow/recovery-bot.js.map +1 -1
  322. package/dist/modules/workflow/review-workflow/review-workflow.service.d.ts +35 -0
  323. package/dist/modules/workflow/review-workflow/review-workflow.service.d.ts.map +1 -1
  324. package/dist/modules/workflow/review-workflow/review-workflow.service.js +180 -13
  325. package/dist/modules/workflow/review-workflow/review-workflow.service.js.map +1 -1
  326. package/dist/modules/workflow/sanitize-error.d.ts +16 -0
  327. package/dist/modules/workflow/sanitize-error.d.ts.map +1 -1
  328. package/dist/modules/workflow/sanitize-error.js +45 -0
  329. package/dist/modules/workflow/sanitize-error.js.map +1 -1
  330. package/dist/modules/workflow/workflow.routes.d.ts +6 -2
  331. package/dist/modules/workflow/workflow.routes.d.ts.map +1 -1
  332. package/dist/modules/workflow/workflow.routes.js +7 -2
  333. package/dist/modules/workflow/workflow.routes.js.map +1 -1
  334. package/dist/modules/workflow/workflow.service.d.ts +187 -15
  335. package/dist/modules/workflow/workflow.service.d.ts.map +1 -1
  336. package/dist/modules/workflow/workflow.service.js +808 -106
  337. package/dist/modules/workflow/workflow.service.js.map +1 -1
  338. package/dist/modules/workspace/agent-download.builder.d.ts +105 -0
  339. package/dist/modules/workspace/agent-download.builder.d.ts.map +1 -0
  340. package/dist/modules/workspace/agent-download.builder.js +238 -0
  341. package/dist/modules/workspace/agent-download.builder.js.map +1 -0
  342. package/dist/modules/workspace/agent-download.routes.d.ts +77 -0
  343. package/dist/modules/workspace/agent-download.routes.d.ts.map +1 -0
  344. package/dist/modules/workspace/agent-download.routes.js +156 -0
  345. package/dist/modules/workspace/agent-download.routes.js.map +1 -0
  346. package/dist/modules/workspace/agent-download.store.d.ts +225 -0
  347. package/dist/modules/workspace/agent-download.store.d.ts.map +1 -0
  348. package/dist/modules/workspace/agent-download.store.js +423 -0
  349. package/dist/modules/workspace/agent-download.store.js.map +1 -0
  350. package/dist/modules/workspace/agent-upload.store.d.ts +10 -1
  351. package/dist/modules/workspace/agent-upload.store.d.ts.map +1 -1
  352. package/dist/modules/workspace/agent-upload.store.js +16 -6
  353. package/dist/modules/workspace/agent-upload.store.js.map +1 -1
  354. package/dist/modules/workspace/file-readers/raw-mime.d.ts +6 -0
  355. package/dist/modules/workspace/file-readers/raw-mime.d.ts.map +1 -0
  356. package/dist/modules/workspace/file-readers/raw-mime.js +38 -0
  357. package/dist/modules/workspace/file-readers/raw-mime.js.map +1 -0
  358. package/dist/modules/workspace/file-readers/text-reader.d.ts +5 -5
  359. package/dist/modules/workspace/file-readers/text-reader.d.ts.map +1 -1
  360. package/dist/modules/workspace/file-readers/text-reader.js +5 -8
  361. package/dist/modules/workspace/file-readers/text-reader.js.map +1 -1
  362. package/dist/modules/workspace/first-run.d.ts +111 -0
  363. package/dist/modules/workspace/first-run.d.ts.map +1 -0
  364. package/dist/modules/workspace/first-run.js +181 -0
  365. package/dist/modules/workspace/first-run.js.map +1 -0
  366. package/dist/modules/workspace/move-links.d.ts +92 -0
  367. package/dist/modules/workspace/move-links.d.ts.map +1 -0
  368. package/dist/modules/workspace/move-links.js +173 -0
  369. package/dist/modules/workspace/move-links.js.map +1 -0
  370. package/dist/modules/workspace/startup/steps/seed-tree.d.ts.map +1 -1
  371. package/dist/modules/workspace/startup/steps/seed-tree.js +24 -39
  372. package/dist/modules/workspace/startup/steps/seed-tree.js.map +1 -1
  373. package/dist/modules/workspace/startup/steps/template-files.step.d.ts +58 -52
  374. package/dist/modules/workspace/startup/steps/template-files.step.d.ts.map +1 -1
  375. package/dist/modules/workspace/startup/steps/template-files.step.js +209 -223
  376. package/dist/modules/workspace/startup/steps/template-files.step.js.map +1 -1
  377. package/dist/modules/workspace/startup/steps/template-source.d.ts +5 -3
  378. package/dist/modules/workspace/startup/steps/template-source.d.ts.map +1 -1
  379. package/dist/modules/workspace/startup/steps/template-source.js +5 -3
  380. package/dist/modules/workspace/startup/steps/template-source.js.map +1 -1
  381. package/dist/modules/workspace/workspace.routes.d.ts.map +1 -1
  382. package/dist/modules/workspace/workspace.routes.js +63 -22
  383. package/dist/modules/workspace/workspace.routes.js.map +1 -1
  384. package/dist/modules/workspace/workspace.service.d.ts +75 -2
  385. package/dist/modules/workspace/workspace.service.d.ts.map +1 -1
  386. package/dist/modules/workspace/workspace.service.js +197 -24
  387. package/dist/modules/workspace/workspace.service.js.map +1 -1
  388. package/dist/modules/workspace/workspace.tools.d.ts +68 -1
  389. package/dist/modules/workspace/workspace.tools.d.ts.map +1 -1
  390. package/dist/modules/workspace/workspace.tools.js +642 -71
  391. package/dist/modules/workspace/workspace.tools.js.map +1 -1
  392. package/dist/modules/write-access/write-access.d.ts.map +1 -1
  393. package/dist/modules/write-access/write-access.js +9 -0
  394. package/dist/modules/write-access/write-access.js.map +1 -1
  395. package/dist/shared/domain-errors.d.ts +84 -1
  396. package/dist/shared/domain-errors.d.ts.map +1 -1
  397. package/dist/shared/domain-errors.js +100 -12
  398. package/dist/shared/domain-errors.js.map +1 -1
  399. package/dist/shared/git.contract.d.ts +10 -1
  400. package/dist/shared/git.contract.d.ts.map +1 -1
  401. package/dist/shared/git.contract.js.map +1 -1
  402. package/dist/shared/hidden-tools.d.ts +44 -0
  403. package/dist/shared/hidden-tools.d.ts.map +1 -0
  404. package/dist/shared/hidden-tools.js +13 -0
  405. package/dist/shared/hidden-tools.js.map +1 -0
  406. package/dist/shared/utf8-text.d.ts +15 -0
  407. package/dist/shared/utf8-text.d.ts.map +1 -0
  408. package/dist/shared/utf8-text.js +20 -0
  409. package/dist/shared/utf8-text.js.map +1 -0
  410. package/dist/tenancy/static-tenant-source.d.ts +2 -1
  411. package/dist/tenancy/static-tenant-source.d.ts.map +1 -1
  412. package/dist/tenancy/static-tenant-source.js +9 -2
  413. package/dist/tenancy/static-tenant-source.js.map +1 -1
  414. package/kb-template/.bevelignore +0 -5
  415. package/mcp-app/page.html +349 -0
  416. package/migrations/0017_atlassian_account_links.sql +37 -0
  417. package/migrations/meta/0017_snapshot.json +2396 -0
  418. package/migrations/meta/_journal.json +8 -1
  419. package/package.json +6 -3
  420. package/src/__tests__/kb-layout-config.test.ts +10 -100
  421. package/src/__tests__/packaged-assets-ship.test.ts +66 -0
  422. package/src/assets.ts +38 -2
  423. package/src/core/__tests__/catalog-revision.test.ts +40 -0
  424. package/src/core/__tests__/gated-boot.test.ts +1 -0
  425. package/src/core/__tests__/lifecycle.test.ts +14 -0
  426. package/src/core/catalog-revision.ts +15 -2
  427. package/src/core/core-ports.ts +11 -0
  428. package/src/core/create-core-server.ts +78 -3
  429. package/src/core/create-core-services.ts +168 -10
  430. package/src/core/lifecycle.ts +28 -2
  431. package/src/core-config.ts +24 -1
  432. package/src/index.ts +2 -2
  433. package/src/modules/access/__tests__/access-control.atref-batch.test.ts +58 -0
  434. package/src/modules/access/__tests__/access-control.platform-restore.test.ts +8 -7
  435. package/src/modules/access/__tests__/access-control.service.test.ts +19 -0
  436. package/src/modules/access/__tests__/access-personal-plugin.test.ts +1 -18
  437. package/src/modules/access/access-control.interface.ts +28 -0
  438. package/src/modules/access/access-control.service.ts +37 -0
  439. package/src/modules/access/directory-sync-bot.ts +1 -1
  440. package/src/modules/agent-guide/__tests__/agent-guide.test.ts +386 -0
  441. package/src/modules/agent-guide/__tests__/agent-guide.tools.test.ts +207 -0
  442. package/src/modules/agent-guide/agent-guide.tools.ts +122 -0
  443. package/src/modules/agent-guide/agent-guide.ts +300 -0
  444. package/src/modules/agent-guide/index.ts +22 -0
  445. package/src/modules/agent-instructions/__tests__/shared-file-rules.test.ts +39 -118
  446. package/src/modules/agent-instructions/agent-instructions.routes.ts +3 -2
  447. package/src/modules/agent-instructions/compose.ts +26 -8
  448. package/src/modules/agent-instructions/index.ts +0 -3
  449. package/src/modules/agent-instructions/shared-file-rules.ts +50 -112
  450. package/src/modules/audit/__tests__/agent-audit.service.test.ts +64 -4
  451. package/src/modules/audit/__tests__/agent-connection.routes.test.ts +102 -0
  452. package/src/modules/audit/agent-audit.service.ts +58 -3
  453. package/src/modules/audit/agent-connection.routes.ts +56 -0
  454. package/src/modules/audit/audit.contract.ts +26 -0
  455. package/src/modules/audit/index.ts +1 -0
  456. package/src/modules/auth/__tests__/account.routes.test.ts +5 -3
  457. package/src/modules/auth/account.routes.ts +10 -3
  458. package/src/modules/auth/auth.middleware.ts +1 -1
  459. package/src/modules/code-mode/__tests__/code-mode.tool.test.ts +18 -2
  460. package/src/modules/code-mode/code-mode.tool.ts +13 -2
  461. package/src/modules/database/core-schema.ts +33 -3
  462. package/src/modules/embed/__tests__/account-links.migration.test.ts +98 -0
  463. package/src/modules/embed/__tests__/embed-link.test.ts +122 -0
  464. package/src/modules/embed/__tests__/embed.routes.test.ts +362 -0
  465. package/src/modules/embed/__tests__/embed.service.lock.test.ts +193 -0
  466. package/src/modules/embed/__tests__/embed.service.test.ts +805 -0
  467. package/src/modules/embed/__tests__/embed.tools.test.ts +304 -0
  468. package/src/modules/embed/__tests__/mcp-app.test.ts +207 -0
  469. package/src/modules/embed/account-link.service.ts +76 -0
  470. package/src/modules/embed/embed-link.ts +180 -0
  471. package/src/modules/embed/embed.errors.ts +43 -0
  472. package/src/modules/embed/embed.interface.ts +203 -0
  473. package/src/modules/embed/embed.routes.ts +363 -0
  474. package/src/modules/embed/embed.service.ts +705 -0
  475. package/src/modules/embed/embed.tools.ts +206 -0
  476. package/src/modules/embed/mcp-app.routes.ts +41 -0
  477. package/src/modules/embed/mcp-app.ts +173 -0
  478. package/src/modules/github-app/__tests__/github-app.test.ts +76 -0
  479. package/src/modules/github-app/github-app.connection.ts +38 -4
  480. package/src/modules/kb-fs/__tests__/move-with-edits.test.ts +304 -0
  481. package/src/modules/kb-fs/locking-filesystem.ts +287 -0
  482. package/src/modules/kb-sync/__tests__/kb-sync.service.test.ts +35 -0
  483. package/src/modules/kb-sync/kb-sync.interface.ts +2 -0
  484. package/src/modules/kb-sync/kb-sync.service.ts +6 -0
  485. package/src/modules/mcp/__tests__/bevel-oauth-provider.test.ts +68 -11
  486. package/src/modules/mcp/__tests__/fake-downstream-mcp-server.ts +14 -3
  487. package/src/modules/mcp/__tests__/mcp-proxy-helpers.test.ts +37 -2
  488. package/src/modules/mcp/__tests__/mcp.app.e2e.test.ts +200 -0
  489. package/src/modules/mcp/__tests__/mcp.e2e.test.ts +252 -0
  490. package/src/modules/mcp/__tests__/mcp.service.test.ts +42 -24
  491. package/src/modules/mcp/__tests__/tool-call-interface.e2e.test.ts +499 -0
  492. package/src/modules/mcp/__tests__/tool-schema-guard.test.ts +266 -0
  493. package/src/modules/mcp/mcp-auth.middleware.ts +2 -1
  494. package/src/modules/mcp/mcp.service.ts +218 -31
  495. package/src/modules/mcp/oauth/bevel-oauth-provider.ts +42 -4
  496. package/src/modules/mcp/tool-schema-guard.ts +196 -0
  497. package/src/modules/onboarding/__tests__/onboarding.routes.test.ts +163 -0
  498. package/src/modules/onboarding/__tests__/starter-pack.service.test.ts +635 -0
  499. package/src/modules/onboarding/__tests__/starter-packs.test.ts +169 -0
  500. package/src/modules/onboarding/onboarding.contract.ts +85 -0
  501. package/src/modules/onboarding/onboarding.routes.ts +85 -0
  502. package/src/modules/onboarding/starter-pack.service.ts +580 -0
  503. package/src/modules/onboarding/starter-packs.ts +182 -0
  504. package/src/modules/plugins/__tests__/plugins.tools.test.ts +177 -4
  505. package/src/modules/plugins/index.ts +1 -0
  506. package/src/modules/plugins/plugin-provision.service.ts +22 -1
  507. package/src/modules/plugins/plugins.routes.ts +29 -0
  508. package/src/modules/plugins/plugins.tools.ts +75 -15
  509. package/src/modules/settings/__tests__/deployment-settings.service.test.ts +176 -56
  510. package/src/modules/settings/__tests__/repository-source.test.ts +9 -0
  511. package/src/modules/settings/deployment-settings.service.ts +144 -55
  512. package/src/modules/settings/repository-source.ts +4 -4
  513. package/src/modules/settings/setup.routes.ts +3 -6
  514. package/src/modules/skills/__tests__/skills.tools.description.test.ts +95 -0
  515. package/src/modules/skills/skills.tools.ts +112 -46
  516. package/src/modules/tool-auth/__tests__/connection-key-rejection.test.ts +32 -0
  517. package/src/modules/tool-auth/__tests__/external-api-key.service.test.ts +65 -0
  518. package/src/modules/tool-auth/connection-key-rejection.ts +13 -3
  519. package/src/modules/tool-auth/external-api-key.interface.ts +9 -0
  520. package/src/modules/tool-auth/external-api-key.service.ts +61 -4
  521. package/src/modules/tool-auth/tool-auth.middleware.ts +13 -4
  522. package/src/modules/tool-helpers/__tests__/branch-declaration.test.ts +502 -0
  523. package/src/modules/tool-helpers/__tests__/route-argument-check.test.ts +337 -0
  524. package/src/modules/tool-helpers/index.ts +34 -1
  525. package/src/modules/tool-helpers/route-argument-check.ts +149 -0
  526. package/src/modules/tool-helpers/route-tool-schemas.ts +171 -0
  527. package/src/modules/tool-helpers/tool-def.ts +132 -7
  528. package/src/modules/tool-helpers/tool-handler.ts +196 -8
  529. package/src/modules/tool-helpers/tool.contract.ts +9 -0
  530. package/src/modules/tool-manuals/__tests__/tool-manuals.detail.route.test.ts +57 -0
  531. package/src/modules/tool-manuals/__tests__/tool-manuals.tools.test.ts +73 -4
  532. package/src/modules/tool-manuals/tool-manuals.contract.ts +24 -4
  533. package/src/modules/tool-manuals/tool-manuals.service.ts +17 -0
  534. package/src/modules/tool-manuals/tool-manuals.tools.ts +86 -38
  535. package/src/modules/tool-registry/__tests__/own-tool-schemas.test.ts +173 -0
  536. package/src/modules/tool-registry/__tests__/tool-description-length.test.ts +81 -66
  537. package/src/modules/tool-registry/description-length.ts +57 -32
  538. package/src/modules/tool-registry/guide-first.ts +41 -0
  539. package/src/modules/tool-registry/tool-registry.ts +9 -2
  540. package/src/modules/workflow/__tests__/apply-failure.test.ts +6 -1
  541. package/src/modules/workflow/__tests__/file-lock.service.deletion-gate.test.ts +104 -0
  542. package/src/modules/workflow/__tests__/pending-commits.repository-replaced.test.ts +66 -0
  543. package/src/modules/workflow/__tests__/pending-commits.worker.test.ts +31 -2
  544. package/src/modules/workflow/__tests__/preserve-roles-yaml.test.ts +110 -6
  545. package/src/modules/workflow/__tests__/sanitize-error.test.ts +89 -1
  546. package/src/modules/workflow/__tests__/workflow.routes.push-refused.test.ts +202 -0
  547. package/src/modules/workflow/__tests__/workflow.service.branch-in-use.test.ts +6 -6
  548. package/src/modules/workflow/__tests__/workflow.service.delete-branch.test.ts +1026 -0
  549. package/src/modules/workflow/__tests__/workflow.service.facade.test.ts +468 -10
  550. package/src/modules/workflow/__tests__/workflow.service.folder-proposals.test.ts +4 -0
  551. package/src/modules/workflow/__tests__/workflow.service.releaseLock.test.ts +5 -4
  552. package/src/modules/workflow/__tests__/workflow.service.update-from-target.test.ts +54 -2
  553. package/src/modules/workflow/agent-tools/__tests__/change-request-read-shape.test.ts +705 -0
  554. package/src/modules/workflow/agent-tools/__tests__/change-request-read.tools.test.ts +1554 -0
  555. package/src/modules/workflow/agent-tools/__tests__/workflow.tools.test.ts +150 -4
  556. package/src/modules/workflow/agent-tools/change-request-read-shape.ts +712 -0
  557. package/src/modules/workflow/agent-tools/change-request-read.tools.ts +759 -0
  558. package/src/modules/workflow/agent-tools/change-request-summary.ts +5 -1
  559. package/src/modules/workflow/agent-tools/workflow.tools.ts +137 -35
  560. package/src/modules/workflow/file-lock.service.ts +67 -5
  561. package/src/modules/workflow/git/__tests__/git.service.appliedChange.test.ts +285 -0
  562. package/src/modules/workflow/git/__tests__/git.service.changedFilesForPr.test.ts +124 -0
  563. package/src/modules/workflow/git/__tests__/git.service.deleteBranch.test.ts +164 -0
  564. package/src/modules/workflow/git/__tests__/git.service.mergeChangeRequest.test.ts +334 -0
  565. package/src/modules/workflow/git/__tests__/git.service.pull.test.ts +48 -1
  566. package/src/modules/workflow/git/__tests__/node-git-runner.test.ts +231 -2
  567. package/src/modules/workflow/git/__tests__/pull-request.service.list-fetch.test.ts +72 -2
  568. package/src/modules/workflow/git/__tests__/pull-request.service.placeholder.test.ts +24 -2
  569. package/src/modules/workflow/git/__tests__/pull-request.service.test.ts +620 -1
  570. package/src/modules/workflow/git/git.service.ts +714 -133
  571. package/src/modules/workflow/git/merge-commit.ts +88 -0
  572. package/src/modules/workflow/git/node-git-runner.ts +82 -7
  573. package/src/modules/workflow/git/pull-request.service.ts +380 -54
  574. package/src/modules/workflow/pending-commits.service.ts +29 -1
  575. package/src/modules/workflow/pending-commits.worker.ts +24 -6
  576. package/src/modules/workflow/recovery-bot.ts +1 -1
  577. package/src/modules/workflow/review-workflow/__tests__/approval-states.test.ts +7 -1
  578. package/src/modules/workflow/review-workflow/__tests__/merge-records-own-commit.test.ts +407 -0
  579. package/src/modules/workflow/review-workflow/review-workflow.service.ts +191 -12
  580. package/src/modules/workflow/sanitize-error.ts +50 -0
  581. package/src/modules/workflow/workflow.routes.ts +7 -2
  582. package/src/modules/workflow/workflow.service.ts +886 -112
  583. package/src/modules/workspace/__tests__/agent-downloads.test.ts +823 -0
  584. package/src/modules/workspace/__tests__/escape-sequences.routes.test.ts +4 -3
  585. package/src/modules/workspace/__tests__/first-run.test.ts +234 -0
  586. package/src/modules/workspace/__tests__/git-internals.security.test.ts +5 -2
  587. package/src/modules/workspace/__tests__/md-links.test.ts +353 -0
  588. package/src/modules/workspace/__tests__/move-links.test.ts +261 -0
  589. package/src/modules/workspace/__tests__/rest-tool-arguments.test.ts +219 -0
  590. package/src/modules/workspace/__tests__/workspace-paths-inside-the-repo.test.ts +3 -0
  591. package/src/modules/workspace/__tests__/workspace.routes.delete.test.ts +102 -0
  592. package/src/modules/workspace/__tests__/workspace.routes.download.test.ts +52 -5
  593. package/src/modules/workspace/__tests__/workspace.routes.folder-zip-access.test.ts +190 -0
  594. package/src/modules/workspace/__tests__/workspace.routes.move-platform-files.test.ts +21 -10
  595. package/src/modules/workspace/__tests__/workspace.service.forget-clone-races.test.ts +8 -4
  596. package/src/modules/workspace/__tests__/workspace.service.test.ts +50 -8
  597. package/src/modules/workspace/__tests__/workspace.tools.agents-file.test.ts +33 -55
  598. package/src/modules/workspace/__tests__/workspace.tools.branch-errors.test.ts +44 -1
  599. package/src/modules/workspace/__tests__/workspace.tools.test.ts +664 -34
  600. package/src/modules/workspace/agent-download.builder.ts +308 -0
  601. package/src/modules/workspace/agent-download.routes.ts +183 -0
  602. package/src/modules/workspace/agent-download.store.ts +533 -0
  603. package/src/modules/workspace/agent-upload.store.ts +23 -7
  604. package/src/modules/workspace/file-readers/raw-mime.ts +40 -0
  605. package/src/modules/workspace/file-readers/text-reader.ts +5 -8
  606. package/src/modules/workspace/first-run.ts +222 -0
  607. package/src/modules/workspace/move-links.ts +237 -0
  608. package/src/modules/workspace/startup/steps/__tests__/steps.test.ts +191 -489
  609. package/src/modules/workspace/startup/steps/seed-tree.ts +23 -38
  610. package/src/modules/workspace/startup/steps/template-files.step.ts +217 -249
  611. package/src/modules/workspace/startup/steps/template-source.ts +5 -3
  612. package/src/modules/workspace/workspace.routes.ts +64 -22
  613. package/src/modules/workspace/workspace.service.ts +202 -25
  614. package/src/modules/workspace/workspace.tools.ts +707 -68
  615. package/src/modules/write-access/__tests__/write-access.test.ts +13 -0
  616. package/src/modules/write-access/write-access.ts +9 -0
  617. package/src/shared/domain-errors.ts +123 -11
  618. package/src/shared/git.contract.ts +8 -1
  619. package/src/shared/hidden-tools.ts +45 -0
  620. package/src/shared/utf8-text.ts +21 -0
  621. package/src/tenancy/__tests__/static-tenant-source.test.ts +1 -0
  622. package/src/tenancy/static-tenant-source.ts +10 -2
  623. package/starter-packs/README.md +103 -0
  624. package/starter-packs/engineering/KnowledgeBase/About us.md +9 -0
  625. package/starter-packs/engineering/KnowledgeBase/Architecture.md +9 -0
  626. package/starter-packs/engineering/KnowledgeBase/Glossary.md +9 -0
  627. package/starter-packs/engineering/KnowledgeBase/How we ship.md +9 -0
  628. package/starter-packs/engineering/Plugins/engineering-starter/LICENSE +21 -0
  629. package/starter-packs/engineering/Plugins/engineering-starter/SOURCE.md +20 -0
  630. package/starter-packs/engineering/Plugins/engineering-starter/access.md +19 -0
  631. package/starter-packs/engineering/Plugins/engineering-starter/plugin.json +10 -0
  632. package/starter-packs/engineering/Plugins/engineering-starter/skills/office-hours/SKILL.md +171 -0
  633. package/starter-packs/engineering/Plugins/engineering-starter/skills/office-hours/sections/phase-2a-startup-diagnostic.md +157 -0
  634. package/starter-packs/engineering/Plugins/engineering-starter/skills/office-hours/sections/phase-2b-builder-brainstorm.md +39 -0
  635. package/starter-packs/engineering/Plugins/engineering-starter/skills/plan-ceo-review/SKILL.md +144 -0
  636. package/starter-packs/engineering/Plugins/engineering-starter/skills/plan-eng-review/SKILL.md +144 -0
  637. package/starter-packs/engineering/Plugins/engineering-starter/skills/review/SKILL.md +80 -0
  638. package/starter-packs/engineering/Plugins/engineering-starter/skills/review/checklist.md +184 -0
  639. package/starter-packs/engineering/pack.yaml +11 -0
  640. package/starter-packs/general/KnowledgeBase/About us.md +9 -0
  641. package/starter-packs/general/KnowledgeBase/Glossary.md +9 -0
  642. package/starter-packs/general/KnowledgeBase/How we work.md +9 -0
  643. package/starter-packs/general/Plugins/general-starter/LICENSE +202 -0
  644. package/starter-packs/general/Plugins/general-starter/SOURCE.md +10 -0
  645. package/starter-packs/general/Plugins/general-starter/access.md +19 -0
  646. package/starter-packs/general/Plugins/general-starter/plugin.json +10 -0
  647. package/starter-packs/general/Plugins/general-starter/skills/memory-management/SKILL.md +332 -0
  648. package/starter-packs/general/Plugins/general-starter/skills/productivity-start/SKILL.md +163 -0
  649. package/starter-packs/general/Plugins/general-starter/skills/productivity-update/SKILL.md +167 -0
  650. package/starter-packs/general/Plugins/general-starter/skills/task-management/SKILL.md +83 -0
  651. package/starter-packs/general/pack.yaml +10 -0
  652. package/starter-packs/operations/KnowledgeBase/Glossary.md +9 -0
  653. package/starter-packs/operations/KnowledgeBase/How we work.md +9 -0
  654. package/starter-packs/operations/KnowledgeBase/Processes.md +9 -0
  655. package/starter-packs/operations/KnowledgeBase/Tools we use.md +9 -0
  656. package/starter-packs/operations/KnowledgeBase/Vendors.md +9 -0
  657. package/starter-packs/operations/Plugins/operations-starter/LICENSE +202 -0
  658. package/starter-packs/operations/Plugins/operations-starter/SOURCE.md +10 -0
  659. package/starter-packs/operations/Plugins/operations-starter/access.md +19 -0
  660. package/starter-packs/operations/Plugins/operations-starter/plugin.json +10 -0
  661. package/starter-packs/operations/Plugins/operations-starter/skills/capacity-plan/SKILL.md +111 -0
  662. package/starter-packs/operations/Plugins/operations-starter/skills/change-request/SKILL.md +119 -0
  663. package/starter-packs/operations/Plugins/operations-starter/skills/compliance-tracking/SKILL.md +44 -0
  664. package/starter-packs/operations/Plugins/operations-starter/skills/process-doc/SKILL.md +80 -0
  665. package/starter-packs/operations/Plugins/operations-starter/skills/process-optimization/SKILL.md +39 -0
  666. package/starter-packs/operations/Plugins/operations-starter/skills/risk-assessment/SKILL.md +40 -0
  667. package/starter-packs/operations/Plugins/operations-starter/skills/runbook/SKILL.md +85 -0
  668. package/starter-packs/operations/Plugins/operations-starter/skills/status-report/SKILL.md +75 -0
  669. package/starter-packs/operations/Plugins/operations-starter/skills/vendor-review/SKILL.md +102 -0
  670. package/starter-packs/operations/pack.yaml +12 -0
  671. package/starter-packs/sales/KnowledgeBase/About us.md +9 -0
  672. package/starter-packs/sales/KnowledgeBase/Customers.md +9 -0
  673. package/starter-packs/sales/KnowledgeBase/Glossary.md +9 -0
  674. package/starter-packs/sales/KnowledgeBase/How we sell.md +9 -0
  675. package/starter-packs/sales/KnowledgeBase/Objections.md +9 -0
  676. package/starter-packs/sales/KnowledgeBase/Pricing.md +9 -0
  677. package/starter-packs/sales/Plugins/sales-starter/LICENSE +202 -0
  678. package/starter-packs/sales/Plugins/sales-starter/SOURCE.md +10 -0
  679. package/starter-packs/sales/Plugins/sales-starter/access.md +19 -0
  680. package/starter-packs/sales/Plugins/sales-starter/plugin.json +10 -0
  681. package/starter-packs/sales/Plugins/sales-starter/skills/account-context/SKILL.md +94 -0
  682. package/starter-packs/sales/Plugins/sales-starter/skills/account-plan/SKILL.md +95 -0
  683. package/starter-packs/sales/Plugins/sales-starter/skills/account-research/SKILL.md +99 -0
  684. package/starter-packs/sales/Plugins/sales-starter/skills/account-tiering/SKILL.md +101 -0
  685. package/starter-packs/sales/Plugins/sales-starter/skills/call-prep/SKILL.md +111 -0
  686. package/starter-packs/sales/Plugins/sales-starter/skills/call-summary/SKILL.md +111 -0
  687. package/starter-packs/sales/Plugins/sales-starter/skills/close-plan/SKILL.md +106 -0
  688. package/starter-packs/sales/Plugins/sales-starter/skills/competitive-intelligence/SKILL.md +102 -0
  689. package/starter-packs/sales/Plugins/sales-starter/skills/create-an-asset/SKILL.md +105 -0
  690. package/starter-packs/sales/Plugins/sales-starter/skills/crm-hygiene-check/SKILL.md +103 -0
  691. package/starter-packs/sales/Plugins/sales-starter/skills/customer-health/SKILL.md +108 -0
  692. package/starter-packs/sales/Plugins/sales-starter/skills/customer-voice/SKILL.md +94 -0
  693. package/starter-packs/sales/Plugins/sales-starter/skills/daily-briefing/SKILL.md +61 -0
  694. package/starter-packs/sales/Plugins/sales-starter/skills/deal-advance-gap/SKILL.md +102 -0
  695. package/starter-packs/sales/Plugins/sales-starter/skills/deal-review/SKILL.md +105 -0
  696. package/starter-packs/sales/Plugins/sales-starter/skills/deal-signals/SKILL.md +96 -0
  697. package/starter-packs/sales/Plugins/sales-starter/skills/deal-slip-scenario/SKILL.md +104 -0
  698. package/starter-packs/sales/Plugins/sales-starter/skills/draft-outreach/SKILL.md +116 -0
  699. package/starter-packs/sales/Plugins/sales-starter/skills/end-of-day/SKILL.md +114 -0
  700. package/starter-packs/sales/Plugins/sales-starter/skills/expansion-whitespace/SKILL.md +97 -0
  701. package/starter-packs/sales/Plugins/sales-starter/skills/forecast/SKILL.md +100 -0
  702. package/starter-packs/sales/Plugins/sales-starter/skills/handle-objection/SKILL.md +93 -0
  703. package/starter-packs/sales/Plugins/sales-starter/skills/inbox-sweep/SKILL.md +114 -0
  704. package/starter-packs/sales/Plugins/sales-starter/skills/lead-triage/SKILL.md +106 -0
  705. package/starter-packs/sales/Plugins/sales-starter/skills/log-activity/SKILL.md +111 -0
  706. package/starter-packs/sales/Plugins/sales-starter/skills/pipeline-review/SKILL.md +97 -0
  707. package/starter-packs/sales/Plugins/sales-starter/skills/renewal-radar/SKILL.md +95 -0
  708. package/starter-packs/sales/Plugins/sales-starter/skills/rep-context/SKILL.md +90 -0
  709. package/starter-packs/sales/Plugins/sales-starter/skills/route-lead/SKILL.md +111 -0
  710. package/starter-packs/sales/Plugins/sales-starter/skills/sales-setup/SKILL.md +200 -0
  711. package/starter-packs/sales/Plugins/sales-starter/skills/schedule-meeting/SKILL.md +99 -0
  712. package/starter-packs/sales/Plugins/sales-starter/skills/stakeholder-map/SKILL.md +107 -0
  713. package/starter-packs/sales/Plugins/sales-starter/skills/team-pipeline/SKILL.md +105 -0
  714. package/starter-packs/sales/Plugins/sales-starter/skills/update-opportunity/SKILL.md +112 -0
  715. package/starter-packs/sales/Plugins/sales-starter/skills/weekly-wrap/SKILL.md +90 -0
  716. package/starter-packs/sales/Plugins/sales-starter/skills/win-loss-review/SKILL.md +88 -0
  717. package/starter-packs/sales/pack.yaml +13 -0
  718. package/starter-packs/support/KnowledgeBase/Escalations.md +9 -0
  719. package/starter-packs/support/KnowledgeBase/Glossary.md +9 -0
  720. package/starter-packs/support/KnowledgeBase/Known issues.md +9 -0
  721. package/starter-packs/support/KnowledgeBase/Products.md +9 -0
  722. package/starter-packs/support/KnowledgeBase/Tone of voice.md +9 -0
  723. package/starter-packs/support/Plugins/support-starter/LICENSE +202 -0
  724. package/starter-packs/support/Plugins/support-starter/SOURCE.md +10 -0
  725. package/starter-packs/support/Plugins/support-starter/access.md +19 -0
  726. package/starter-packs/support/Plugins/support-starter/plugin.json +10 -0
  727. package/starter-packs/support/Plugins/support-starter/skills/customer-escalation/SKILL.md +246 -0
  728. package/starter-packs/support/Plugins/support-starter/skills/customer-research/SKILL.md +250 -0
  729. package/starter-packs/support/Plugins/support-starter/skills/draft-response/SKILL.md +416 -0
  730. package/starter-packs/support/Plugins/support-starter/skills/kb-article/SKILL.md +350 -0
  731. package/starter-packs/support/Plugins/support-starter/skills/ticket-triage/SKILL.md +273 -0
  732. package/starter-packs/support/pack.yaml +12 -0
  733. package/kb-template/AGENTS.md +0 -730
@@ -1,14 +1,6 @@
1
- import { readFile } from 'node:fs/promises';
2
- import path from 'node:path';
3
- import {
4
- DEFAULT_KB_LAYOUT,
5
- LEGACY_AGENTS_FILE,
6
- PREAMBLE_CAP,
7
- renderKbLayoutPlaceholders,
8
- } from '@bevel-software/platform-shared';
1
+ import { DEFAULT_KB_LAYOUT, PREAMBLE_CAP } from '@bevel-software/platform-shared';
9
2
  import { describe, expect, it } from 'vitest';
10
- import { defaultKbTemplateDir } from '../../../assets.js';
11
- import { renderTemplateText, SHARED_FILE_RULES_PLACEHOLDER } from '../../workspace/startup/steps/template-source.js';
3
+ import { composeAgentGuide } from '../../agent-guide/agent-guide.js';
12
4
  import {
13
5
  INSTRUCTIONS_CAP,
14
6
  PLATFORM_HEADER,
@@ -17,37 +9,29 @@ import {
17
9
  platformInstructions,
18
10
  } from '../compose.js';
19
11
  import {
20
- POINTER_GUIDE_NAME_BUDGET,
21
12
  SHARED_FILE_RULES_CAP,
22
- SHARED_RULES_POINTER_MAX,
23
13
  SHARED_RULES_SECTION,
24
14
  sharedFileRules,
25
15
  sharedFileRulesSection,
26
- sharedRulesPointer,
27
16
  } from '../shared-file-rules.js';
28
17
 
29
18
  /**
30
19
  * The rules every file tool shares are stated in TWO places — the handshake
31
- * `instructions` and the platform-managed agent guide — and in neither tool
20
+ * `instructions` and the platform's agent guide — and in neither tool
32
21
  * description. These tests are what makes "stated once" true: the two places
33
22
  * carry the SAME string, built from one text, so a rule cannot be changed in one
34
23
  * and left stale in the other.
35
24
  */
36
25
 
37
- /** The packaged template's agent guide, as it ships (placeholders unrendered). */
38
- async function guideTemplate(): Promise<string> {
39
- return readFile(path.join(defaultKbTemplateDir(), LEGACY_AGENTS_FILE), 'utf8');
40
- }
41
-
42
26
  describe('the shared file rules are one text, in two places', () => {
43
- it('puts the identical section in the handshake instructions and in the managed guide', async () => {
27
+ it('puts the identical section in the handshake instructions and in the agent guide', async () => {
44
28
  const section = sharedFileRulesSection(DEFAULT_KB_LAYOUT);
45
29
  expect(section.startsWith(`## ${SHARED_RULES_SECTION}\n\n`)).toBe(true);
46
30
 
47
31
  const instructions = composeAgentInstructions(null).instructions;
48
32
  expect(instructions).toContain(section);
49
33
 
50
- const guide = renderTemplateText(await guideTemplate(), DEFAULT_KB_LAYOUT);
34
+ const guide = await composeAgentGuide(DEFAULT_KB_LAYOUT);
51
35
  expect(guide).toContain(section);
52
36
 
53
37
  // Byte-for-byte the same text in both, which is the whole point: neither is
@@ -62,7 +46,7 @@ describe('the shared file rules are one text, in two places', () => {
62
46
 
63
47
  it('states every rule in both places, and the content rule exactly once in each', async () => {
64
48
  const instructions = composeAgentInstructions(null).instructions;
65
- const guide = renderTemplateText(await guideTemplate(), DEFAULT_KB_LAYOUT);
49
+ const guide = await composeAgentGuide(DEFAULT_KB_LAYOUT);
66
50
  const rules = sharedFileRules(DEFAULT_KB_LAYOUT);
67
51
  expect(rules.map((r) => r.id)).toEqual([
68
52
  'agent-guide',
@@ -87,7 +71,7 @@ describe('the shared file rules are one text, in two places', () => {
87
71
  });
88
72
 
89
73
  it('carries the whole content rule — the refused families, the byte tools and the upload path', async () => {
90
- for (const text of [composeAgentInstructions(null).instructions, renderTemplateText(await guideTemplate(), DEFAULT_KB_LAYOUT)]) {
74
+ for (const text of [composeAgentInstructions(null).instructions, await composeAgentGuide(DEFAULT_KB_LAYOUT)]) {
91
75
  expect(text).toContain('`binary_not_writable`');
92
76
  expect(text).toContain('copy_file, move_file and delete_file act on bytes of any kind');
93
77
  expect(text).toContain('unzip extracts the entries of a `.zip`');
@@ -102,108 +86,45 @@ describe('the shared file rules are one text, in two places', () => {
102
86
  }
103
87
  });
104
88
 
105
- it('names the guide under the name this deployment gave it, in both places and in the pointer', async () => {
89
+ /**
90
+ * The guide is no file: it is reached by one name at the KB root and by one
91
+ * tool, on every deployment. The first rule says so, and names the
92
+ * organisation's own conventions file beside it — which is what a
93
+ * `read_file` of that name serves first.
94
+ */
95
+ it('tells an agent to call get_agent_guide first, and that AGENTS.md answers with the same guide after the organisation\'s own', () => {
96
+ const rule = sharedFileRules(DEFAULT_KB_LAYOUT).find((r) => r.id === 'agent-guide')!.body;
97
+ expect(rule).toContain("call `get_agent_guide` and read the platform's guide");
98
+ expect(rule).toContain('read_file on `AGENTS.md` at the KB root answers with the same guide');
99
+ expect(rule).toContain("after the organisation's own conventions file of that name");
100
+ // The pre-rename name is still offered, for a knowledge base that kept one.
101
+ expect(rule).toContain('`CLAUDE.md`');
102
+ });
103
+
104
+ it('names one guide on every deployment, whatever name a deployment once saved for the written one', () => {
106
105
  const layout = { ...DEFAULT_KB_LAYOUT, agentsFile: 'HEXIS.md' };
107
106
  const section = sharedFileRulesSection(layout);
108
- // Ours first, then the organisation's own AGENTS.md, then the pre-rename name.
109
- expect(section).toContain('read `HEXIS.md` at the KB root, then `AGENTS.md` if it also exists');
110
- expect(section).toContain('`CLAUDE.md` on a knowledge base seeded before it was renamed');
111
- // The platform files a move refuses list the guide under its own name too.
112
- expect(section).toContain('`HEXIS.md`');
107
+ expect(section).toBe(sharedFileRulesSection(DEFAULT_KB_LAYOUT));
108
+ expect(section).not.toContain('HEXIS.md');
113
109
  expect(composeAgentInstructions(null, layout).instructions).toContain(section);
114
- expect(renderTemplateText(await guideTemplate(), layout)).toContain(section);
115
- expect(sharedRulesPointer(layout)).toBe(` Shared rules for all file tools: see "${SHARED_RULES_SECTION}" in HEXIS.md.`);
110
+ // The guide is not a platform file under any name: the list a move
111
+ // refuses does not carry it.
112
+ expect(section).toContain('`access.md` or `.bevelignore` in any folder, `roles.yaml` at the repository root');
116
113
  });
117
114
 
118
- it('keeps the pointer bounded whatever the guide is called', () => {
119
- // The pointer rides on every file tool, so its length is not the guide's
120
- // business: `validateFilename` allows a 255-byte name, and an unbounded
121
- // pointer would reach 318 characters and push `file_stat` past the
122
- // description cap — on a renamed deployment only, which no measurement
123
- // taken under the default layout would ever show.
124
- const nameOfLength = (n: number): string => `${'x'.repeat(n - 3)}.md`;
125
- for (const length of [9, POINTER_GUIDE_NAME_BUDGET, POINTER_GUIDE_NAME_BUDGET + 1, 120, 255]) {
126
- const pointer = sharedRulesPointer({ ...DEFAULT_KB_LAYOUT, agentsFile: nameOfLength(length) });
127
- expect(pointer.length, `a ${length}-character name`).toBeLessThanOrEqual(SHARED_RULES_POINTER_MAX);
128
- }
129
- // Up to the budget the file is NAMED, which is the better sentence.
130
- const named = nameOfLength(POINTER_GUIDE_NAME_BUDGET);
131
- expect(sharedRulesPointer({ ...DEFAULT_KB_LAYOUT, agentsFile: named })).toContain(named);
132
- // Past it the guide is named by its role instead — a sentence that still
133
- // says where to look, rather than a catalog entry the client cuts.
134
- const tooLong = nameOfLength(POINTER_GUIDE_NAME_BUDGET + 1);
135
- const fallback = sharedRulesPointer({ ...DEFAULT_KB_LAYOUT, agentsFile: tooLong });
136
- expect(fallback).not.toContain(tooLong);
137
- expect(fallback).toBe(` Shared rules for all file tools: see "${SHARED_RULES_SECTION}" in the agent guide at the KB root.`);
138
- // Either way the section's first rule still names the file, so the name is
139
- // never actually lost.
140
- expect(sharedFileRulesSection({ ...DEFAULT_KB_LAYOUT, agentsFile: tooLong })).toContain(tooLong);
141
- });
142
-
143
- it('points at the section with one short sentence under the default name', () => {
144
- expect(sharedRulesPointer(DEFAULT_KB_LAYOUT)).toBe(
145
- ' Shared rules for all file tools: see "Working with files" in AGENTS.md.',
146
- );
147
- // An unset guide name means the default, as it does everywhere else.
148
- expect(sharedRulesPointer({ ...DEFAULT_KB_LAYOUT, agentsFile: undefined })).toBe(
149
- sharedRulesPointer(DEFAULT_KB_LAYOUT),
150
- );
151
- });
152
115
  });
153
116
 
154
- describe('the guide template asks for the rules rather than repeating them', () => {
155
- it('carries the placeholder once, and no rule text of its own', async () => {
156
- const template = await guideTemplate();
157
- expect(template.split(SHARED_FILE_RULES_PLACEHOLDER)).toHaveLength(2);
158
- // The rules are not ALSO written into the template — that is the copy that
159
- // would drift. Checked on a fragment of each rule rather than on the whole.
160
- for (const rule of sharedFileRules(DEFAULT_KB_LAYOUT)) {
161
- expect(template, rule.id).not.toContain(rule.body.slice(0, 60));
162
- }
163
- });
164
-
165
- it('renders the placeholder nowhere else, so other managed files are untouched', async () => {
166
- const access = await readFile(path.join(defaultKbTemplateDir(), 'access.md'), 'utf8');
167
- expect(access).not.toContain(SHARED_FILE_RULES_PLACEHOLDER);
168
- // So rendering it gains no rule text: whatever the layout renderer does to
169
- // its own tokens, the section is nowhere in the result.
170
- const rendered = renderTemplateText(access, DEFAULT_KB_LAYOUT);
171
- expect(rendered).not.toContain(sharedFileRulesSection(DEFAULT_KB_LAYOUT));
172
- expect(rendered).not.toContain(`## ${SHARED_RULES_SECTION}`);
173
- });
174
-
175
- it('leaves no placeholder behind once rendered', async () => {
176
- const guide = renderTemplateText(await guideTemplate(), DEFAULT_KB_LAYOUT);
177
- expect(guide).not.toContain('{{');
178
- });
179
-
180
- it('renders the layout tokens first, then injects the rules — so the rules are never re-rendered', async () => {
181
- // A layout the two orders DISAGREE on, which an ordinary one does not: the
182
- // section states the knowledge-base folder's name, so a deployment whose
183
- // folder is literally called `{{skillsDir}}` puts a layout token inside the
184
- // rendered section. Injecting first would then rewrite it on the second
185
- // pass and the guide would name the skills folder where the rule means the
186
- // knowledge-base one. Pathological on purpose: it is the only kind of input
187
- // on which the order is observable at all, which is why a test that pins
188
- // the order has to use one.
189
- const layout = { ...DEFAULT_KB_LAYOUT, knowledgeBaseDir: '{{skillsDir}}', skillsDir: 'Playbooks' };
190
- const section = sharedFileRulesSection(layout);
191
- expect(section).toContain('{{skillsDir}}/');
192
-
193
- const template = `Skills live in {{skillsDir}}/.\n\n${SHARED_FILE_RULES_PLACEHOLDER}\n`;
194
- const rendered = renderTemplateText(template, layout);
195
- // The author's token is rendered, and the section survives byte for byte.
196
- expect(rendered).toBe(`Skills live in Playbooks/.\n\n${section}\n`);
197
-
198
- // And the other order really does differ on this input, so the assertion
199
- // above is load-bearing rather than true of both.
200
- const injectedFirst = renderKbLayoutPlaceholders(
201
- template.replaceAll(SHARED_FILE_RULES_PLACEHOLDER, () => section),
202
- layout,
203
- );
204
- expect(injectedFirst).not.toBe(rendered);
205
- expect(injectedFirst).not.toContain(section);
206
- expect(injectedFirst).toContain('`Playbooks/`) and git metadata are refused');
117
+ describe('the delete rule for platform files', () => {
118
+ const managedItems = (): string => sharedFileRules(DEFAULT_KB_LAYOUT).find((r) => r.id === 'managed-items')!.body;
119
+
120
+ it('says a nested access.md is deleted by whoever may write it, and the root\'s platform files by nobody', async () => {
121
+ const body = managedItems();
122
+ expect(body).toContain('delete_file deletes a nested `access.md` for whoever may write it');
123
+ expect(body).toContain("its folder then follows its parent's rules");
124
+ expect(body).toContain("the repository root's `access.md` and `roles.yaml` are deleted by nobody");
125
+ // The sentence the refusal actually carries, as the tools and the app say it.
126
+ expect(body).toContain("\"<name> is the repository's own file and cannot be deleted.\"");
127
+ expect(await composeAgentGuide(DEFAULT_KB_LAYOUT)).toContain(body);
207
128
  });
208
129
  });
209
130
 
@@ -28,8 +28,9 @@ export function createAgentInstructionsRoutes(
28
28
  readPreamble: AgentPreambleReader,
29
29
  /**
30
30
  * The layout in effect, read per request — the shared file rules name the
31
- * managed guide, whose name the setup save may change without a restart.
32
- * Optional so a construction with no layout in hand gets `AGENTS.md`.
31
+ * guide by the name a deployment saved for it, which the setup save may
32
+ * change without a restart. Optional so a construction with no layout in
33
+ * hand gets `AGENTS.md`.
33
34
  */
34
35
  kbLayout?: () => KbLayout,
35
36
  ): express.Router {
@@ -30,6 +30,7 @@ import {
30
30
  stripHtmlComments,
31
31
  type KbLayout,
32
32
  } from '@bevel-software/platform-shared';
33
+ import { splitCallLine } from '@bevel-software/platform-mcp-core';
33
34
  import { sharedFileRulesSection } from './shared-file-rules.js';
34
35
 
35
36
  export { PREAMBLE_CAP, PREAMBLE_FILE, TOOL_PREFIX_CAP };
@@ -48,7 +49,13 @@ export const PLATFORM_HEADER =
48
49
  'Before answering a question about the organisation, its people, customers, products, processes, projects or internal terms, ' +
49
50
  'search the knowledge base: call `start_session` once, then `grep` for the key terms, `list_files` to orient, and `read_file` what matches. ' +
50
51
  'Prefer what you find there over memory or the web, and say so when the knowledge base is silent on something the organisation should have documented. ' +
51
- 'Skills are available as prompts and through `list_skills` and `get_skill`.';
52
+ 'Skills are available as prompts and through `list_skills` and `get_skill`. ' +
53
+ // There is no one calling shape to state: the knowledge-base tools take
54
+ // their arguments under `body`, a tool that calls another service takes them
55
+ // flat, and an agent told one rule for all of them sends a GET with a body.
56
+ // The per-tool `Call:` line is generated from each tool's own input schema,
57
+ // so pointing at it is both shorter and always right.
58
+ 'Tools do not share one calling shape: call each tool exactly as the `Call:` line at the top of its description shows.';
52
59
 
53
60
  /**
54
61
  * The fixed first line of the tool prefix. It always leads, so an admin's
@@ -64,8 +71,10 @@ export const TOOL_PREFIX_LINE = "This organisation's knowledge base. Search it b
64
71
  * `header` field carries and what the card shows as fixed and not editable;
65
72
  * the admin's preamble follows it.
66
73
  *
67
- * A FUNCTION of the layout, because the shared rules name the managed guide
68
- * and its file name is a deployment setting.
74
+ * A FUNCTION of the layout, because the shared rules name the platform files
75
+ * by the root names a deployment chose (`Skills/`, `Plugins/`), which are
76
+ * deployment settings. The guide's name is not one of them: it is `AGENTS.md`
77
+ * everywhere.
69
78
  */
70
79
  export function platformInstructions(layout: KbLayout): string {
71
80
  return `${PLATFORM_HEADER}\n\n${sharedFileRulesSection(layout)}`;
@@ -119,10 +128,11 @@ export interface ComposedAgentInstructions {
119
128
  * unterminated `<!--` strips everything after it, so the most likely editing
120
129
  * slip withholds text rather than leaking it.
121
130
  *
122
- * `layout` decides only the guide's name inside the shared rules, and defaults
123
- * to the standard one — a caller with no layout in hand (a test, a surface that
124
- * predates the setting) gets `AGENTS.md`, which is what an unset name means
125
- * everywhere else.
131
+ * `layout` decides the root names the shared rules spell (`Skills/`,
132
+ * `Plugins/`, the knowledge folder) and defaults to the standard ones — a
133
+ * caller with no layout in hand (a test, a surface that predates the setting)
134
+ * gets the defaults. The guide's name is not among them: it is `AGENTS.md` on
135
+ * every deployment.
126
136
  */
127
137
  export function composeAgentInstructions(
128
138
  preamble: string | null,
@@ -164,9 +174,17 @@ export function composeAgentInstructions(
164
174
  * A tool description with the prefix ahead of it: the prefix, a blank line,
165
175
  * then the original. Purpose line first, because claude.ai cuts descriptions
166
176
  * near 500 characters.
177
+ *
178
+ * Except for the `Call:` line, which stays the very first line whatever else
179
+ * is prepended: it is how an agent learns the shape this tool's arguments take,
180
+ * and a description that opens with the purpose prefix instead would bury the
181
+ * one line the refusal for a wrong call points back to.
167
182
  */
168
183
  export function prefixToolDescription(toolPrefix: string, description: string | undefined): string {
169
- return description ? `${toolPrefix}\n\n${description}` : toolPrefix;
184
+ if (!description) return toolPrefix;
185
+ const { call, rest } = splitCallLine(description);
186
+ if (call === null) return `${toolPrefix}\n\n${description}`;
187
+ return rest === '' ? `${call}\n\n${toolPrefix}` : `${call}\n\n${toolPrefix}\n\n${rest}`;
170
188
  }
171
189
 
172
190
  /** An ATX heading line: `#` to `######`, then a space or the end. */
@@ -13,13 +13,10 @@ export {
13
13
  type ComposedAgentInstructions,
14
14
  } from './compose.js';
15
15
  export {
16
- POINTER_GUIDE_NAME_BUDGET,
17
16
  SHARED_FILE_RULES_CAP,
18
- SHARED_RULES_POINTER_MAX,
19
17
  SHARED_RULES_SECTION,
20
18
  sharedFileRules,
21
19
  sharedFileRulesSection,
22
- sharedRulesPointer,
23
20
  type SharedFileRule,
24
21
  } from './shared-file-rules.js';
25
22
  export { readAgentPreamble, type AgentPreambleReader, type PreambleWorkspace } from './read-preamble.js';
@@ -14,24 +14,24 @@
14
14
  *
15
15
  * - the MCP `instructions` of the initialize handshake (see `compose.ts`),
16
16
  * which Claude Code, Claude Desktop and Cursor put in the system prompt;
17
- * - the platform-managed agent guide at the repository root (`AGENTS.md` by
18
- * default), rendered from `{{sharedFileRules}}` in the template — claude.ai
19
- * on the web, the Agent SDK and Cline drop `instructions`, and a guide the
20
- * agent is told to read before its first action is always available.
17
+ * - the platform's agent guide, which `get_agent_guide` returns and a
18
+ * `read_file` of the guide's name serves (see `modules/agent-guide`) —
19
+ * claude.ai on the web, the Agent SDK and Cline drop `instructions`, and a
20
+ * guide the agent is told to read before its first action is always
21
+ * available.
21
22
  *
22
23
  * Both places get the SAME string, from {@link sharedFileRulesSection} — not
23
24
  * two hand-mirrored copies. A rule written twice is a rule that drifts, and a
24
25
  * drifted rule is worse than a repeated one, because the agent cannot tell
25
- * which copy is current. Each description ends instead with
26
- * {@link sharedRulesPointer}, one sentence naming the section and the file.
26
+ * which copy is current. Each description opens instead with the one
27
+ * sentence sending the agent to the guide (`tool-registry/guide-first.ts`).
27
28
  *
28
- * Pure text, a function of the layout only: the guide's file name is a
29
- * deployment setting, so nothing here may snapshot `AGENTS.md`.
29
+ * Pure text, a function of the layout only: the guide's name is a deployment
30
+ * setting (an alias a deployment chose before the guide left the disk), so
31
+ * nothing here may snapshot `AGENTS.md`.
30
32
  */
31
33
 
32
34
  import {
33
- DEFAULT_KB_LAYOUT,
34
- agentsFileOf,
35
35
  LEGACY_AGENTS_FILE,
36
36
  platformFilesByDepth,
37
37
  type KbLayout,
@@ -43,9 +43,9 @@ export const SHARED_RULES_SECTION = 'Working with files';
43
43
 
44
44
  /**
45
45
  * The guide's name on a knowledge base seeded before it was renamed to
46
- * {@link LEGACY_AGENTS_FILE}. Named in the conventions rule because the seeder
47
- * never deletes a file it did not expect, so such a knowledge base still
48
- * carries one.
46
+ * {@link LEGACY_AGENTS_FILE}, back when the guide was a file. The platform's
47
+ * own copy is taken out at startup now (see template-files.step.ts); one that
48
+ * stays is a file the organisation edited, so it is theirs and still named.
49
49
  */
50
50
  const PRE_RENAME_AGENTS_FILE = 'CLAUDE.md';
51
51
 
@@ -84,12 +84,11 @@ export interface SharedFileRule {
84
84
  * ones that said "this tool" or "this call" name the tools instead.
85
85
  */
86
86
  export function sharedFileRules(layout: KbLayout): readonly SharedFileRule[] {
87
- const agentsFile = agentsFileOf(layout);
88
87
  return [
89
88
  {
90
89
  id: 'agent-guide',
91
90
  heading: "This knowledge base's own conventions",
92
- body: conventionsRule(agentsFile),
91
+ body: conventionsRule(),
93
92
  },
94
93
  {
95
94
  id: 'content-kinds',
@@ -146,15 +145,15 @@ export function sharedFileRules(layout: KbLayout): readonly SharedFileRule[] {
146
145
  // that take content as a JSON string names the route in one sentence of
147
146
  // its own; WHY a file should go that way, and how, is here.
148
147
  id: 'upload-route',
149
- heading: 'Large, escape-heavy and binary content goes by upload',
148
+ heading: 'Large, escape-heavy and binary content: upload in, download out',
150
149
  body:
151
- 'write_file, write_files and edit_file take content as a JSON string you have to type out in full, so a long ' +
152
- 'file is cut off mid-answer, a file full of backslashes or `\\u` escapes fails to parse as a parameter, and ' +
153
- 'an image, a PDF or a zip cannot be sent at all. For any of those: call `request_file_upload`, POST the file — ' +
154
- 'or one zip holding many files — to the address it answers with any HTTP client ' +
155
- '(`curl -X POST --data-binary @<file> "<uploadUrl>?filename=<name>"`), then `apply_file_upload` to land it on ' +
156
- 'a branch in one commit. The bytes never pass through the conversation, so nothing is cut or mangled on the ' +
157
- 'way. A person can also use Upload in the app.',
150
+ 'write_file, write_files and edit_file take content as a JSON string you type out in full, so a long file ' +
151
+ 'is cut off mid-answer, a file full of backslashes or `\\u` escapes fails to parse as a parameter, and an ' +
152
+ 'image, a PDF or a zip cannot be sent at all. For those, call `request_file_upload`, POST the file (or one ' +
153
+ 'zip of many) with any HTTP client (`curl -X POST --data-binary @<file> ' +
154
+ '"<uploadUrl>?filename=<name>"`), then `apply_file_upload` lands it in one commit. To take copies OUT, ' +
155
+ '`request_file_download` answers a one-time link per file and a zip per folder (`curl -o <name> ' +
156
+ '"<downloadUrl>"`). Either way no bytes pass through the conversation.',
158
157
  },
159
158
  {
160
159
  id: 'dry-run-confirm',
@@ -164,22 +163,22 @@ export function sharedFileRules(layout: KbLayout): readonly SharedFileRule[] {
164
163
  'what the call would touch, `allowed`, and `reason` when it may not run. A non-empty folder is deleted, and a ' +
165
164
  'move that changes your access runs, only with `confirm: true`; without it the call changes nothing and ' +
166
165
  'returns the same impact with `confirmationRequired: true`. Do NOT set `confirm: true` on your first call — ' +
167
- 'dry-run, check the impact, then confirm. delete_file takes neither: it removes the one file you named, so ' +
168
- 'check it first with file_stat (`deletable`) if you are unsure.',
166
+ 'dry-run, check the impact, then confirm. delete_file takes neither: check it first with file_stat ' +
167
+ '(`deletable`) if you are unsure. delete_branch has its own `dryRun`.',
169
168
  },
170
169
  {
171
170
  id: 'managed-items',
172
171
  heading: 'What these tools never move or delete',
173
172
  body:
174
- `A platform file (${platformFileList(layout)}) is refused with ` +
175
- '"<name> is a platform file and stays in its folder." — a folder that moves ' +
176
- 'takes its own platform files along, still in their folder, and a folder that is deleted takes them with it in ' +
177
- 'the same one change, so its files are never left ungoverned part-way. A platform folder (the repository root ' +
178
- `or a reserved root folder such as \`${layout.knowledgeBaseDir}/\`) and git metadata are refused, and so is creating a ` +
179
- 'platform file or folder at a destination (renaming a note to `access.md` is refused). A path that is, or goes ' +
180
- 'through, a symbolic link is refused: links are never followed or removed. On a protected branch you must be ' +
181
- 'able to write everything the call touches — for a folder, every file under it, at its old and its new path. ' +
182
- 'file_stat reports `managed`, `movable` and `deletable` so you can tell before the call.',
173
+ `A platform file (${platformFileList(layout)}) is never moved: "<name> is a platform file and stays in its folder." ` +
174
+ 'A folder moved or deleted takes its own along, in one change. delete_file deletes a nested `access.md` for ' +
175
+ "whoever may write it (its folder then follows its parent's rules) and refuses `.bevelignore`; the repository " +
176
+ "root's `access.md` and `roles.yaml` are deleted by nobody: \"<name> is the repository's own file and cannot be " +
177
+ 'deleted." A platform folder (the root, or a reserved one like ' +
178
+ `\`${layout.knowledgeBaseDir}/\`), git metadata, and making a platform file or folder at a destination are ` +
179
+ 'refused; so is a path that is or crosses a symlink: links are never followed or removed. On a protected ' +
180
+ 'branch you must be able to write all a call touches — for a folder, every file under it, at its old and new ' +
181
+ 'path. file_stat reports `managed`, `movable` and `deletable` up front.',
183
182
  },
184
183
  {
185
184
  id: 'refused-for-permissions',
@@ -204,15 +203,14 @@ export function sharedFileRules(layout: KbLayout): readonly SharedFileRule[] {
204
203
 
205
204
  /**
206
205
  * The platform files as the rules list them — from the one function that knows
207
- * which they are, so the list cannot drift from what actually refuses a move,
208
- * and the guide appears under this deployment's name for it.
206
+ * which they are, so the list cannot drift from what actually refuses a move.
209
207
  *
210
208
  * WITH THE DEPTH each name counts at, because the name alone is half the rule:
211
209
  * `access.md` governs the folder it sits in and `.bevelignore` layers, so both
212
- * are platform files wherever they are; `roles.yaml` and the guide are read
213
- * from the repository root only, so a nested copy of either is ordinary
214
- * content that moves and deletes like any page. An agent told only the names
215
- * refuses a rename it may make, and trusts a nested `access.md` it may not.
210
+ * are platform files wherever they are; `roles.yaml` is read from the
211
+ * repository root only, so a nested copy is ordinary content that moves and
212
+ * deletes like any page. An agent told only the names refuses a rename it may
213
+ * make, and trusts a nested `access.md` it may not.
216
214
  */
217
215
  function platformFileList(layout: KbLayout): string {
218
216
  const { anyDepth, rootOnly } = platformFilesByDepth(layout);
@@ -221,30 +219,21 @@ function platformFileList(layout: KbLayout): string {
221
219
  }
222
220
 
223
221
  /**
224
- * The conventions reminder — which file holds the author's own rules for this
225
- * knowledge base, and to read it first.
222
+ * The conventions reminder — where the platform's guide is, that the
223
+ * organisation's own conventions file comes with it, and to read both first.
226
224
  *
227
- * `CLAUDE.md` is named as a fallback because knowledge bases seeded before the
228
- * rename still carry one. WHEN THE GUIDE HAS BEEN RENAMED the sentence names
229
- * two files, ours first: the second is the organisation's OWN `AGENTS.md`,
230
- * which on such a deployment is ordinary content the platform never touches —
231
- * and which no harness reads for a remote agent, because a remote agent has no
232
- * checkout. Under the default name the wording collapses to the one file it
233
- * has always named.
225
+ * The guide is read by name at the repository root, where coding agents look
226
+ * for an `AGENTS.md` by convention, and `get_agent_guide` returns it alone.
227
+ * One name on every deployment, so the rule takes no layout. `CLAUDE.md` is
228
+ * named as a fallback because a knowledge base seeded before the rename may
229
+ * still carry one its people edited.
234
230
  */
235
- function conventionsRule(agentsFile: string): string {
236
- if (agentsFile === LEGACY_AGENTS_FILE) {
237
- return (
238
- `Before your first read or change in a workspace, read \`${LEGACY_AGENTS_FILE}\` at the KB root — or ` +
239
- `\`${PRE_RENAME_AGENTS_FILE}\` on a knowledge base seeded before it was renamed — if either exists: it holds ` +
240
- "the author's conventions for this knowledge base, and you should follow them."
241
- );
242
- }
231
+ function conventionsRule(): string {
243
232
  return (
244
- `Before your first read or change in a workspace, read \`${agentsFile}\` at the KB root, then ` +
245
- `\`${LEGACY_AGENTS_FILE}\` if it also exists (the organisation's own conventions) — or ` +
246
- `\`${PRE_RENAME_AGENTS_FILE}\` on a knowledge base seeded before it was renamed: together they hold the ` +
247
- 'conventions for this knowledge base, and you should follow them.'
233
+ "Before your first read or change in a workspace, call `get_agent_guide` and read the platform's guide " +
234
+ `(whole, or one section). read_file on \`${LEGACY_AGENTS_FILE}\` at the KB root answers with the same ` +
235
+ "guide, after the organisation's own conventions file of that name when it has one: follow both. A " +
236
+ `\`${PRE_RENAME_AGENTS_FILE}\` at the KB root is the organisation's own too; read it if it exists.`
248
237
  );
249
238
  }
250
239
 
@@ -260,55 +249,4 @@ export function sharedFileRulesSection(layout: KbLayout): string {
260
249
  return `## ${SHARED_RULES_SECTION}\n\n${body}`;
261
250
  }
262
251
 
263
- /**
264
- * The longest guide file name the pointer sentence spells out. Beyond this it
265
- * names the guide by its ROLE instead (see {@link sharedRulesPointer}).
266
- *
267
- * There has to be a bound somewhere, because the pointer rides on every file
268
- * tool and a file name is not a fixed cost: `validateFilename` allows a name
269
- * of up to 255 bytes, so an unbounded pointer could reach 318 characters and
270
- * push `file_stat` to 1,428 — over the description cap, recreating on a
271
- * renamed deployment exactly the truncation this module exists to prevent, and
272
- * invisibly, because every measurement is taken under the default layout.
273
- *
274
- * 40 is well past any name a deployment plausibly picks
275
- * (`ENGINEERING-AGENT-CONVENTIONS.md` is 32) and the fallback below is only
276
- * reachable past it.
277
- */
278
- export const POINTER_GUIDE_NAME_BUDGET = 40;
279
-
280
- /**
281
- * The one sentence a tool description ends with, in place of the paragraphs it
282
- * used to carry. Short on purpose: it costs every description the same ~100
283
- * characters at worst, and its whole job is to name the section and the file
284
- * to read.
285
- *
286
- * BOUNDED BY CONSTRUCTION, which is what lets the description cap mean
287
- * something on a deployment that renamed its guide: a name within
288
- * {@link POINTER_GUIDE_NAME_BUDGET} is spelled out, and a longer one gets the
289
- * generic wording. Naming the file is the better sentence and wins whenever it
290
- * fits; a name past the budget is pathological, and there the choice is between
291
- * a sentence that says where to look and a catalog entry the client cuts. The
292
- * guide's own name is still in the section's first rule either way.
293
- *
294
- * An absent layout means the default one, as it does in
295
- * `composeAgentInstructions`: a caller reading the layout from configuration
296
- * gets `undefined` when none is set, and the pointer must still name a file.
297
- */
298
- export function sharedRulesPointer(layout: KbLayout = DEFAULT_KB_LAYOUT): string {
299
- const agentsFile = agentsFileOf(layout);
300
- const where =
301
- agentsFile.length <= POINTER_GUIDE_NAME_BUDGET ? agentsFile : 'the agent guide at the KB root';
302
- return ` Shared rules for all file tools: see "${SHARED_RULES_SECTION}" in ${where}.`;
303
- }
304
252
 
305
- /**
306
- * The most the pointer can ever cost a description, over every layout. What the
307
- * description cap is measured against, the way the tool prefix is measured at
308
- * ITS cap rather than at whatever the current admin wrote: a description that
309
- * only fits beside the short default guide name does not really fit.
310
- */
311
- export const SHARED_RULES_POINTER_MAX = Math.max(
312
- sharedRulesPointer({ ...DEFAULT_KB_LAYOUT, agentsFile: `${'x'.repeat(POINTER_GUIDE_NAME_BUDGET - 3)}.md` }).length,
313
- sharedRulesPointer({ ...DEFAULT_KB_LAYOUT, agentsFile: `${'x'.repeat(POINTER_GUIDE_NAME_BUDGET + 10)}.md` }).length,
314
- );