@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
@@ -0,0 +1,207 @@
1
+ import type { Server } from 'node:http';
2
+ import type { AddressInfo } from 'node:net';
3
+ import express from 'express';
4
+ import { afterEach, describe, expect, it } from 'vitest';
5
+ import { ToolRegistry } from '../../tool-registry/tool-registry.js';
6
+ import { GUIDE_FIRST_SENTENCE } from '../../tool-registry/guide-first.js';
7
+ import { TOOL_DESCRIPTION_CAP } from '../../tool-registry/description-length.js';
8
+ import { createToolHandlerFactory } from '../../tool-helpers/tool-handler.js';
9
+ import type { ToolContext } from '../../tool-helpers/tool.contract.js';
10
+ import { toolDef } from '../../tool-helpers/tool-def.js';
11
+ import { GET_AGENT_GUIDE_TOOL, registerAgentGuideTool } from '../agent-guide.tools.js';
12
+ import { DEFAULT_KB_LAYOUT } from '@bevel-software/platform-shared';
13
+ import { agentGuideSections, joinGuideSections, type RenderedGuideSection } from '../agent-guide.js';
14
+
15
+ let server: Server | null = null;
16
+
17
+ afterEach(async () => {
18
+ if (server) await new Promise<void>((resolve) => server!.close(() => resolve()));
19
+ server = null;
20
+ });
21
+
22
+ const SECTIONS: RenderedGuideSection[] = [
23
+ { id: 'introduction', title: 'Knowledge base', body: '# Knowledge base\n\nRead me.' },
24
+ { id: 'access-control', title: 'Access control', body: '## Access control\n\nWho may do what.' },
25
+ { id: 'knowledge-graph', title: 'Knowledge graph', body: '## Knowledge graph\n\nA distribution added this one.' },
26
+ ];
27
+
28
+ describe('get_agent_guide', () => {
29
+ async function serve() {
30
+ const registry = new ToolRegistry();
31
+ const router = express.Router();
32
+ // Stands in for the connection-key auth: the caller is a signed-in reader.
33
+ const auth = (req: express.Request, _res: express.Response, next: express.NextFunction) => {
34
+ req.toolAuth = { source: 'internal', userId: 'u', scope: 'read' };
35
+ next();
36
+ };
37
+ const resolve = async (): Promise<ToolContext> =>
38
+ ({
39
+ user: { id: 'u', email: 'a@x.io', name: 'A' },
40
+ scope: 'read',
41
+ source: 'internal',
42
+ abortSignal: new AbortController().signal,
43
+ workspaceService: {} as never,
44
+ workflowService: {} as never,
45
+ events: {} as never,
46
+ getFilesystem: async () => {
47
+ throw new Error('the guide reads no file');
48
+ },
49
+ }) as unknown as ToolContext;
50
+ let reads = 0;
51
+ let current: RenderedGuideSection[] = SECTIONS;
52
+ registerAgentGuideTool(registry, router, auth, createToolHandlerFactory(resolve), async () => {
53
+ reads += 1;
54
+ return current;
55
+ });
56
+ const sectionsNow = (sections: RenderedGuideSection[]) => {
57
+ current = sections;
58
+ };
59
+ // Another tool beside it, to see what the catalog does to each.
60
+ registry.registerExternalTool(
61
+ toolDef({ name: 'read_file', description: 'Read a file.', path: '/api/agent/tools/read_file', inputs: { type: 'object', properties: {} }, tags: [] }),
62
+ );
63
+
64
+ const web = express();
65
+ web.use(express.json());
66
+ web.use('/api', router);
67
+ server = await new Promise<Server>((resolve) => {
68
+ const s = web.listen(0, '127.0.0.1', () => resolve(s));
69
+ });
70
+ const port = (server.address() as AddressInfo).port;
71
+ const call = async (body: Record<string, unknown> = {}) => {
72
+ const res = await fetch(`http://127.0.0.1:${port}/api/agent/tools/${GET_AGENT_GUIDE_TOOL}`, {
73
+ method: 'POST',
74
+ headers: { 'content-type': 'application/json', authorization: 'Bearer x' },
75
+ body: JSON.stringify(body),
76
+ });
77
+ return { status: res.status, body: (await res.json()) as Record<string, unknown> };
78
+ };
79
+ return { registry, call, reads: () => reads, sectionsNow };
80
+ }
81
+
82
+ it('is on both surfaces, says to call it first, and lists the sections the guide has now', async () => {
83
+ const { registry } = await serve();
84
+ for (const list of [registry.listExternal(), registry.listInternal()]) {
85
+ const def = (await list).find((t) => t.name === GET_AGENT_GUIDE_TOOL);
86
+ expect(def).toBeDefined();
87
+ expect(def!.description).toContain('ALWAYS call this first and read the guide before you do anything else');
88
+ expect(def!.description).toContain("`read_file` on `AGENTS.md` at the KB root");
89
+ // The sections, a distribution's own included, by id and title.
90
+ expect(def!.description).toContain(
91
+ 'Sections: `introduction` (Knowledge base), `access-control` (Access control), `knowledge-graph` (Knowledge graph).',
92
+ );
93
+ // The one tool that does not open with "call get_agent_guide first".
94
+ expect(def!.description.startsWith(GUIDE_FIRST_SENTENCE)).toBe(false);
95
+ // The def wraps a tool's inputs as its request `body`; this one takes `section` and nothing else.
96
+ const body = (def!.inputs as { properties: { body: { properties?: Record<string, unknown> } } }).properties.body;
97
+ expect(Object.keys(body.properties ?? {})).toEqual(['section']);
98
+ }
99
+ });
100
+
101
+ it('puts the guide-first sentence at the front of every other tool the catalog lists', async () => {
102
+ const { registry } = await serve();
103
+ const read = (await registry.listExternal()).find((t) => t.name === 'read_file')!;
104
+ expect(read.description).toBe(`${GUIDE_FIRST_SENTENCE} Read a file.`);
105
+ });
106
+
107
+ it('returns the whole guide, or one section by id, composed when asked', async () => {
108
+ const { call, reads, sectionsNow } = await serve();
109
+ expect(await call()).toEqual({
110
+ status: 200,
111
+ body: {
112
+ guide: '# Knowledge base\n\nRead me.\n\n## Access control\n\nWho may do what.\n\n## Knowledge graph\n\nA distribution added this one.\n',
113
+ // The complete list, whatever the description had room for.
114
+ sections: [
115
+ { id: 'introduction', title: 'Knowledge base' },
116
+ { id: 'access-control', title: 'Access control' },
117
+ { id: 'knowledge-graph', title: 'Knowledge graph' },
118
+ ],
119
+ },
120
+ });
121
+ expect(await call({ section: 'access-control' })).toEqual({
122
+ status: 200,
123
+ body: { guide: '## Access control\n\nWho may do what.', section: 'access-control', title: 'Access control' },
124
+ });
125
+ // A section the guide does not have is refused with the ones it has.
126
+ const unknown = await call({ section: 'nope' });
127
+ expect(unknown.status).toBe(400);
128
+ expect(String(unknown.body.error)).toContain('The guide has no section "nope". Sections: `introduction`, `access-control`, `knowledge-graph`.');
129
+ // Composed per call, never cached here: what the reader answers NOW is
130
+ // what the next call returns, so a layout applied later is seen.
131
+ expect(reads()).toBe(3);
132
+ sectionsNow([{ id: 'introduction', title: 'Renamed', body: '# Renamed\n\nThe layout changed.' }]);
133
+ expect(await call()).toEqual({
134
+ status: 200,
135
+ body: { guide: '# Renamed\n\nThe layout changed.\n', sections: [{ id: 'introduction', title: 'Renamed' }] },
136
+ });
137
+ expect(await call({ section: 'introduction' })).toMatchObject({ status: 200, body: { title: 'Renamed' } });
138
+ expect((await call({ section: 'access-control' })).status).toBe(400);
139
+ expect(reads()).toBe(6);
140
+ });
141
+
142
+ it('stays under the cap whatever a distribution adds: titles go first, then ids beyond what fits are counted', async () => {
143
+ // A client cuts a long description from the end, and an id cut off is a
144
+ // section an agent cannot ask for — so the description never carries a
145
+ // cut list. Three forms, by what fits: ids with titles; ids alone; as
146
+ // many ids as fit and the count of the rest, with the complete list on
147
+ // the whole-guide response's `sections`.
148
+ const { registry, call, sectionsNow } = await serve();
149
+ const describedAs = async () => (await registry.listExternal()).find((t) => t.name === GET_AGENT_GUIDE_TOOL)!.description!;
150
+
151
+ // Forty sections with long titles: the ids fit, the titles do not.
152
+ const many = Array.from({ length: 40 }, (_, i) => ({
153
+ id: `section-${i}`,
154
+ title: `A title long enough that forty of them do not fit, number ${i}`,
155
+ body: `## Title ${i}\n\nBody.`,
156
+ }));
157
+ sectionsNow([...SECTIONS, ...many]);
158
+ const idsOnly = await describedAs();
159
+ expect(idsOnly.length).toBeLessThanOrEqual(TOOL_DESCRIPTION_CAP);
160
+ for (const section of [...SECTIONS, ...many]) expect(idsOnly).toContain(`\`${section.id}\``);
161
+ expect(idsOnly).not.toContain('(Knowledge base)');
162
+ expect(idsOnly).not.toContain(' more');
163
+
164
+ // Two hundred sections with long ids: not even the ids fit. The ones
165
+ // that do are listed whole, the rest are counted, nothing is cut — and
166
+ // the whole-guide response names every one.
167
+ const flood = Array.from({ length: 200 }, (_, i) => ({
168
+ id: `a-section-id-long-enough-that-two-hundred-never-fit-${i}`,
169
+ title: `T${i}`,
170
+ body: `## T${i}\n\nBody.`,
171
+ }));
172
+ sectionsNow([...SECTIONS, ...flood]);
173
+ const counted = await describedAs();
174
+ expect(counted.length).toBeLessThanOrEqual(TOOL_DESCRIPTION_CAP);
175
+ expect(counted).toContain('`introduction`');
176
+ const shown = (counted.match(/`[^`]+`(?=, |\.$)/g) ?? []).filter((id) => id.startsWith('`a-section-id') || id === '`introduction`' || id === '`access-control`' || id === '`knowledge-graph`');
177
+ expect(shown.length).toBeGreaterThan(0);
178
+ expect(shown.length).toBeLessThan(203);
179
+ expect(counted).toMatch(new RegExp(`and ${203 - shown.length} more, all named under \`sections\` in the whole-guide response\\.$`));
180
+ // No id is ever cut mid-way: every listed id is one of the guide's.
181
+ const all = new Set([...SECTIONS, ...flood].map((s) => `\`${s.id}\``));
182
+ for (const id of shown) expect(all.has(id), id).toBe(true);
183
+ const whole = (await call()).body as { sections: { id: string }[] };
184
+ expect(whole.sections.map((s) => s.id)).toEqual([...SECTIONS, ...flood].map((s) => s.id));
185
+
186
+ // With the platform's few, the titles are there.
187
+ sectionsNow(SECTIONS);
188
+ expect(await describedAs()).toContain('`introduction` (Knowledge base)');
189
+ });
190
+
191
+ it('returns the platform\'s HTML views section on its own, and inside the whole guide', async () => {
192
+ const { call, registry, sectionsNow } = await serve();
193
+ const platform = await agentGuideSections(DEFAULT_KB_LAYOUT);
194
+ sectionsNow([...platform]);
195
+ const html = platform.find((s) => s.id === 'html-views')!;
196
+ expect(await call({ section: 'html-views' })).toEqual({
197
+ status: 200,
198
+ body: { guide: html.body, section: 'html-views', title: 'HTML views' },
199
+ });
200
+ const whole = await call();
201
+ expect(whole.body.guide).toBe(joinGuideSections(platform));
202
+ expect(String(whole.body.guide)).toContain('## HTML views');
203
+ // The description lists it, so an agent knows it can ask for it.
204
+ const def = (await registry.listExternal()).find((t) => t.name === GET_AGENT_GUIDE_TOOL)!;
205
+ expect(def.description).toContain('`html-views`');
206
+ });
207
+ });
@@ -0,0 +1,122 @@
1
+ import type { Router, RequestHandler } from 'express';
2
+ import type { IToolRegistry, UtcpTool } from '../tool-registry/tool.contract.js';
3
+ import { GET_AGENT_GUIDE_TOOL } from '../tool-registry/guide-first.js';
4
+ import { TOOL_DESCRIPTION_CAP } from '../tool-registry/description-length.js';
5
+ import { ToolError } from '../tool-helpers/tool.contract.js';
6
+ import { toolDef } from '../tool-helpers/tool-def.js';
7
+ import type { ToolHandlerFactory } from '../tool-helpers/tool-handler.js';
8
+ import { AGENT_GUIDE_FILE, joinGuideSections, type AgentGuideSectionsReader } from './agent-guide.js';
9
+
10
+ export { GET_AGENT_GUIDE_TOOL };
11
+
12
+ /**
13
+ * The one tool that returns the guide on its own — whole, or one section by
14
+ * id. It takes nothing else: the guide is the platform's text for this
15
+ * deployment, the same for every caller and every branch, and reading it
16
+ * touches no file — so no `branch`, no `sessionId`, and no access gate. The
17
+ * other way to the same text is a `read_file` of `AGENTS.md` at the
18
+ * repository root, which also carries the knowledge base's own `AGENTS.md`
19
+ * when it has one (see `agent-guide.ts`).
20
+ *
21
+ * Registered as a PROVIDER on both surfaces, so the description names the
22
+ * sections the guide has NOW — a distribution's hook may add its own — and
23
+ * the in-process agent and an external one are told the same thing to read
24
+ * first. This is the one tool the catalog does not open with "call
25
+ * get_agent_guide first" (see `tool-registry/guide-first.ts`): it is what
26
+ * that sentence points at, and says so itself.
27
+ */
28
+ export function registerAgentGuideTool(
29
+ registry: IToolRegistry,
30
+ router: Router,
31
+ toolAuth: RequestHandler,
32
+ toolHandler: ToolHandlerFactory,
33
+ sections: AgentGuideSectionsReader,
34
+ ): void {
35
+ const build = async (): Promise<UtcpTool> => {
36
+ const list = await sections();
37
+ const describe = (sectionList: string) =>
38
+ "The platform's guide to this knowledge base: its layout, where a new file goes, the rules every file tool " +
39
+ 'shares, access control, skills and tool manuals. ALWAYS call this first and read the guide before you do ' +
40
+ 'anything else in the platform. Returns `{ guide }` as markdown: the whole guide, or one section when ' +
41
+ '`section` names one. The same text comes back from `read_file` on `' +
42
+ AGENT_GUIDE_FILE +
43
+ "` at the KB root, after the knowledge base's own " +
44
+ AGENT_GUIDE_FILE +
45
+ ` when it has one. Sections: ${sectionList}.`;
46
+ // The description stays under the cap WHATEVER a distribution adds, in
47
+ // three steps: every id with its title; every id alone; as many ids as
48
+ // fit and a count of the rest. An id a client cut off the end would be a
49
+ // section an agent cannot ask for — so nothing is ever cut: the one
50
+ // complete list of sections is `sections` on the whole-guide response,
51
+ // which the description names when it cannot carry them all itself.
52
+ const titled = describe(list.map((s) => `\`${s.id}\` (${s.title})`).join(', '));
53
+ const ids = list.map((s) => `\`${s.id}\``);
54
+ const counted = (shown: number) =>
55
+ describe(
56
+ shown === 0
57
+ ? `${ids.length}, named under \`sections\` in the whole-guide response`
58
+ : [...ids.slice(0, shown), `and ${ids.length - shown} more, all named under \`sections\` in the whole-guide response`].join(', '),
59
+ );
60
+ let description = titled.length <= TOOL_DESCRIPTION_CAP ? titled : describe(ids.join(', '));
61
+ for (let shown = ids.length; description.length > TOOL_DESCRIPTION_CAP && shown > 0; shown--) {
62
+ description = counted(shown - 1);
63
+ }
64
+ return toolDef({
65
+ name: GET_AGENT_GUIDE_TOOL,
66
+ description,
67
+ path: `/api/agent/tools/${GET_AGENT_GUIDE_TOOL}`,
68
+ inputs: {
69
+ type: 'object',
70
+ properties: {
71
+ section: {
72
+ type: 'string',
73
+ description:
74
+ 'Optional: the id of one section to read instead of the whole guide (the ids are listed in this ' +
75
+ 'description, and every one under `sections` in the whole-guide response). Omit it for the whole guide.',
76
+ },
77
+ },
78
+ additionalProperties: false,
79
+ },
80
+ outputs: {
81
+ type: 'object',
82
+ properties: {
83
+ guide: { type: 'string', description: 'The guide, or the one section asked for, as markdown.' },
84
+ sections: {
85
+ type: 'array',
86
+ description: 'Without `section`: every section of the guide, in order, by id and heading — the complete list.',
87
+ items: {
88
+ type: 'object',
89
+ properties: { id: { type: 'string' }, title: { type: 'string' } },
90
+ required: ['id', 'title'],
91
+ },
92
+ },
93
+ section: { type: 'string', description: 'With `section`: the id of the section returned.' },
94
+ title: { type: 'string', description: 'With `section`: its heading.' },
95
+ },
96
+ required: ['guide'],
97
+ },
98
+ tags: ['workspace'],
99
+ });
100
+ };
101
+ registry.registerInternalTool(build);
102
+ registry.registerExternalTool(build);
103
+
104
+ router.post(
105
+ `/agent/tools/${GET_AGENT_GUIDE_TOOL}`,
106
+ toolAuth,
107
+ toolHandler(async (args) => {
108
+ const list = await sections();
109
+ const wanted = typeof args.section === 'string' ? args.section.trim() : '';
110
+ if (!wanted) return { guide: joinGuideSections(list), sections: list.map((s) => ({ id: s.id, title: s.title })) };
111
+ const one = list.find((s) => s.id === wanted);
112
+ if (!one) {
113
+ throw new ToolError(
114
+ `The guide has no section "${wanted}". Sections: ${list.map((s) => `\`${s.id}\``).join(', ')}. ` +
115
+ 'Omit `section` for the whole guide.',
116
+ 400,
117
+ );
118
+ }
119
+ return { guide: one.body, section: one.id, title: one.title };
120
+ }),
121
+ );
122
+ }
@@ -0,0 +1,300 @@
1
+ /**
2
+ * The platform's agent guide: what every agent is told to read before its
3
+ * first read or change in a knowledge base — the layout, where a new file
4
+ * goes, the rules every file tool shares, access control, skills and tool
5
+ * manuals.
6
+ *
7
+ * It is TEXT THE CODE OWNS, not a file in the repository. It used to be
8
+ * written to every protected branch as `AGENTS.md` and refreshed on every
9
+ * start, which had three costs: a repository that already had an `AGENTS.md`
10
+ * of its own lost it or had to rename ours; a distribution that wanted to add
11
+ * to the guide had to fork the whole file and then drifted from every change
12
+ * made here; and the file sat in git history on every branch, hidden from the
13
+ * tree by an ignore rule it had to keep writing. Now the guide is composed
14
+ * from SECTIONS at the moment an agent asks for it — `get_agent_guide`, or a
15
+ * `read_file` of the guide's name at the repository root — and a distribution
16
+ * shapes it with a hook that sees the sections and returns the sections it
17
+ * wants (append, replace or drop by id), so what Hexis says reaches it without
18
+ * a copy to maintain.
19
+ *
20
+ * The sections ship as markdown files in the package's `agent-guide/` folder
21
+ * (see `assets.ts`), one per section, with the layout placeholders the old
22
+ * template carried (`{{knowledgeBaseDir}}`, `{{skillsDir}}`, `{{pluginsDir}}`,
23
+ * `{{agentsFile}}`). ONE section is computed rather than read: the rules every
24
+ * file tool shares, which the MCP handshake also sends — the same string in
25
+ * both places, from `shared-file-rules.ts`, so a rule cannot be changed in one
26
+ * and left stale in the other.
27
+ */
28
+
29
+ import fs from 'node:fs/promises';
30
+ import path from 'node:path';
31
+ import {
32
+
33
+ renderKbLayoutPlaceholders,
34
+ resolveKbLayout,
35
+ type KbLayout,
36
+ } from '@bevel-software/platform-shared';
37
+ import { agentGuideDir } from '../../assets.js';
38
+ import { sharedFileRulesSection } from '../agent-instructions/shared-file-rules.js';
39
+
40
+ /** One section of the guide. */
41
+ export interface AgentGuideSection {
42
+ /**
43
+ * Stable id, so a distribution's hook can replace or drop a section by name
44
+ * and a test can say which one went missing. Core's ids are the
45
+ * {@link CORE_SECTION_IDS}.
46
+ */
47
+ id: string;
48
+ /**
49
+ * The section's markdown, heading included (`## …`). May carry the layout
50
+ * placeholders; they are rendered with the names in effect when the guide is
51
+ * composed, so a section can name the knowledge folder without knowing what
52
+ * this deployment calls it.
53
+ */
54
+ body: string;
55
+ /**
56
+ * The body is FINAL: already rendered, and not to be passed through the
57
+ * placeholder renderer. Set on the computed shared-rules section, which is
58
+ * rendered for the layout by the code that builds it; rendering it again
59
+ * could only misread a folder name it STATES as a placeholder.
60
+ */
61
+ literal?: boolean;
62
+ }
63
+
64
+ /**
65
+ * A distribution's say over the guide. Called with core's sections, in order,
66
+ * and the layout in effect; returns the sections the guide is composed from.
67
+ * Append to the array to add sections, map over it to replace one by id,
68
+ * filter it to drop one. Called on every composition, so a hook that reads
69
+ * something live (a feature flag, a setting) is read each time.
70
+ */
71
+ export type AgentGuideHook = (
72
+ sections: readonly AgentGuideSection[],
73
+ layout: Required<KbLayout>,
74
+ ) => readonly AgentGuideSection[] | Promise<readonly AgentGuideSection[]>;
75
+
76
+ /** Composes the guide for the layout in effect — the shape every consumer reads. */
77
+ export type AgentGuideReader = () => Promise<string>;
78
+
79
+ /** The computed section: the rules every file tool shares. */
80
+ export const WORKING_WITH_FILES_SECTION_ID = 'working-with-files';
81
+
82
+ /**
83
+ * What to do on a knowledge base nobody has written in yet: the section the
84
+ * `firstRun` note `start_session` answers with points at (see
85
+ * workspace/first-run.ts, which names it by this constant).
86
+ */
87
+ export const NEW_KNOWLEDGE_BASE_SECTION_ID = 'new-knowledge-base';
88
+
89
+ /**
90
+ * Core's sections, in reading order. Every id but the shared-rules one names
91
+ * a file in the package's `agent-guide/` folder.
92
+ */
93
+ export const CORE_SECTION_IDS: readonly string[] = Object.freeze([
94
+ 'introduction',
95
+ 'directory-structure',
96
+ 'where-a-new-file-goes',
97
+ WORKING_WITH_FILES_SECTION_ID,
98
+ 'access-control',
99
+ 'skills',
100
+ 'tool-manuals',
101
+ 'html-views',
102
+ 'conventions',
103
+ 'finding-things',
104
+ NEW_KNOWLEDGE_BASE_SECTION_ID,
105
+ ]);
106
+
107
+ /**
108
+ * The one line that proves a root guide file is the platform's and not the
109
+ * customer's: the blockquote the packaged guide opened with for as long as
110
+ * the guide was a file, under every release. Asked for WHERE the header put
111
+ * it — a blockquote line among the first lines of the file — and not anywhere
112
+ * in the text: a note of the organisation's own that quotes the platform's
113
+ * sentence in its body must not read as ours, because the consequence of the
114
+ * mistake is a deletion. Still read on every start, to take the copies
115
+ * earlier releases wrote out of the repository (see template-files.step.ts),
116
+ * and on every read of the guide's name, so a copy still on a draft is not
117
+ * served twice.
118
+ */
119
+ const MANAGED_GUIDE_HEADER_LINE = '> **This file is managed by the platform.**';
120
+
121
+ /** How far down a file the header's blockquote can sit: under the title and a sentence or two, never further. */
122
+ const MANAGED_GUIDE_HEADER_WITHIN_LINES = 12;
123
+
124
+ /** Whether `text` is a copy of the guide a release wrote to disk, of any vintage. */
125
+ export function isManagedGuide(text: string): boolean {
126
+ return text
127
+ .split('\n', MANAGED_GUIDE_HEADER_WITHIN_LINES)
128
+ .some((line) => line.trimStart().startsWith(MANAGED_GUIDE_HEADER_LINE));
129
+ }
130
+
131
+ /** The raw section files, read once per process: the package does not change while it runs. */
132
+ let coreSectionFiles: Promise<ReadonlyMap<string, string>> | null = null;
133
+
134
+ async function readCoreSectionFiles(): Promise<ReadonlyMap<string, string>> {
135
+ const dir = agentGuideDir();
136
+ const entries = await Promise.all(
137
+ CORE_SECTION_IDS.filter((id) => id !== WORKING_WITH_FILES_SECTION_ID).map(
138
+ // Line endings normalised: a checkout on Windows may carry CRLF, and the
139
+ // guide is one text with one ending wherever it is served from.
140
+ async (id) => [id, (await fs.readFile(path.join(dir, `${id}.md`), 'utf8')).replace(/\r\n?/g, '\n')] as const,
141
+ ),
142
+ );
143
+ return new Map(entries);
144
+ }
145
+
146
+ /**
147
+ * Core's sections for `layout`: the files, placeholders unrendered, with the
148
+ * shared-rules section computed and in its place. What a distribution's hook
149
+ * is handed.
150
+ */
151
+ export async function coreAgentGuideSections(layout: KbLayout): Promise<AgentGuideSection[]> {
152
+ coreSectionFiles ??= readCoreSectionFiles();
153
+ let files: ReadonlyMap<string, string>;
154
+ try {
155
+ files = await coreSectionFiles;
156
+ } catch (err) {
157
+ // A failed read is not cached: the next composition tries the disk again.
158
+ coreSectionFiles = null;
159
+ throw err;
160
+ }
161
+ return CORE_SECTION_IDS.map((id) =>
162
+ id === WORKING_WITH_FILES_SECTION_ID
163
+ ? { id, body: sharedFileRulesSection(layout), literal: true }
164
+ : { id, body: files.get(id)! },
165
+ );
166
+ }
167
+
168
+ /** What the guide is composed for, beyond the layout. */
169
+ export interface AgentGuideContext {
170
+ /**
171
+ * The name of the repository's checkout folder inside a workspace, which
172
+ * the file tools take paths under (`knowledge-base/` by default). Rendered
173
+ * into `{{kbDirName}}` so the paths the guide shows are the paths this
174
+ * deployment's tools report back.
175
+ */
176
+ kbDirName?: string;
177
+ }
178
+
179
+ /** The checkout folder's name when none is given — core's own default. */
180
+ const DEFAULT_KB_DIR_NAME = 'knowledge-base';
181
+
182
+ /** One section of the guide as an agent reads it: rendered, with the heading's text as its title. */
183
+ export interface RenderedGuideSection {
184
+ id: string;
185
+ /** The heading line's text, without its `#`s — what the tool lists the section as. */
186
+ title: string;
187
+ /** The section's markdown, heading included, rendered for the layout. */
188
+ body: string;
189
+ }
190
+
191
+ /** Composes the guide's sections for the layout in effect — what the guide tool reads. */
192
+ export type AgentGuideSectionsReader = () => Promise<RenderedGuideSection[]>;
193
+
194
+ /**
195
+ * The guide's sections as an agent reads them: core's sections through the
196
+ * distribution's hook (when there is one), rendered for the layout, each
197
+ * with its title. The whole guide is these joined (see
198
+ * {@link composeAgentGuide}); `get_agent_guide` also serves one at a time.
199
+ *
200
+ * A hook may append, replace and drop sections, with ONE exception: the
201
+ * shared file rules ({@link WORKING_WITH_FILES_SECTION_ID}) must come back
202
+ * WITH TEXT IN THEM, as core's or as the hook's own replacement. A client
203
+ * that drops the handshake instructions has the guide as the only place to
204
+ * read the rules — a guide without them would leave agents nothing to read.
205
+ * A hook that drops the section, or hands it back empty, is a composition
206
+ * error, thrown rather than served. Judged on what would be SERVED — the
207
+ * rendered, trimmed body — so a replacement of whitespace is caught like a
208
+ * missing one, rather than passing the check and vanishing with the other
209
+ * empty sections below.
210
+ */
211
+ export async function agentGuideSections(
212
+ layout: KbLayout,
213
+ hook?: AgentGuideHook,
214
+ context: AgentGuideContext = {},
215
+ ): Promise<RenderedGuideSection[]> {
216
+ const resolved = resolveKbLayout(layout);
217
+ const core = await coreAgentGuideSections(resolved);
218
+ const sections = hook ? await hook(core, resolved) : core;
219
+ const kbDirName = context.kbDirName?.trim() || DEFAULT_KB_DIR_NAME;
220
+ const rendered = sections.map((section) => {
221
+ const body = (
222
+ section.literal
223
+ ? section.body
224
+ : renderKbLayoutPlaceholders(section.body.replaceAll('{{kbDirName}}', () => kbDirName), resolved)
225
+ ).trim();
226
+ return { id: section.id, title: titleOf(body, section.id), body };
227
+ });
228
+ // Judged over EVERY section under the id — a hook may return the id twice
229
+ // — on what survives the empty-body filter below: one with text is enough.
230
+ const rules = rendered.filter((section) => section.id === WORKING_WITH_FILES_SECTION_ID);
231
+ if (!rules.some((section) => section.body.length > 0)) {
232
+ throw new Error(
233
+ `The agent guide hook ${rules.length === 0 ? 'dropped' : 'emptied'} the "${WORKING_WITH_FILES_SECTION_ID}" ` +
234
+ 'section, which every file tool points at. Keep it, or replace it under the same id with the rules in it.',
235
+ );
236
+ }
237
+ return rendered.filter((section) => section.body.length > 0);
238
+ }
239
+
240
+ /**
241
+ * The heading's text, or the id when the section opens with no heading. An
242
+ * ATX heading may close with a run of `#` of its own (`## Custom ##`); that
243
+ * is a delimiter, not part of the title.
244
+ */
245
+ function titleOf(body: string, id: string): string {
246
+ const first = body.split('\n', 1)[0] ?? '';
247
+ const heading = /^#{1,6}\s+(.*?)(?:\s+#+)?\s*$/.exec(first);
248
+ return heading ? heading[1]!.trim() : id;
249
+ }
250
+
251
+ /**
252
+ * The guide as an agent reads it whole: the sections joined by blank lines,
253
+ * ending in one newline.
254
+ */
255
+ export async function composeAgentGuide(
256
+ layout: KbLayout,
257
+ hook?: AgentGuideHook,
258
+ context: AgentGuideContext = {},
259
+ ): Promise<string> {
260
+ return joinGuideSections(await agentGuideSections(layout, hook, context));
261
+ }
262
+
263
+ /** The sections as one document, the way `composeAgentGuide` joins them. */
264
+ export function joinGuideSections(sections: readonly RenderedGuideSection[]): string {
265
+ return `${sections.map((section) => section.body).join('\n\n')}\n`;
266
+ }
267
+
268
+ /**
269
+ * What a `read_file` of the guide's name answers when the knowledge base has an
270
+ * `AGENTS.md` of its own: their text first, whole, then a rule and one line
271
+ * saying what follows, then the platform's guide. Theirs first because it is
272
+ * the more specific of the two, and the line between so neither is read as
273
+ * part of the other.
274
+ */
275
+ export const PLATFORM_GUIDE_SEPARATOR =
276
+ "---\n\n_The text above is this knowledge base's own conventions file. The platform's guide follows; `get_agent_guide` returns it on its own._";
277
+
278
+ export function withPlatformGuideAppended(ownText: string, guide: string): string {
279
+ // Their text as they wrote it, line endings normalised and the trailing
280
+ // newlines folded into the one blank line before the separator. Nothing
281
+ // else is touched: leading indentation and trailing spaces are markdown.
282
+ const own = ownText.replace(/\r\n?/g, '\n').replace(/\n+$/, '');
283
+ // A file with nothing in it has nothing to put first, and a separator
284
+ // above nothing would claim a conventions file that says nothing.
285
+ if (own.trim().length === 0) return guide;
286
+ return `${own}\n\n${PLATFORM_GUIDE_SEPARATOR}\n\n${guide}`;
287
+ }
288
+
289
+ /** The one name the guide is read by: `AGENTS.md` at the repository root, the name coding agents look for. */
290
+ export const AGENT_GUIDE_FILE = 'AGENTS.md';
291
+
292
+ /**
293
+ * Whether a repository-relative path is where the guide is read — `AGENTS.md`
294
+ * at the repository root, exactly spelled, like every platform path. One
295
+ * name on every deployment: there is no setting for it any more.
296
+ */
297
+ export function isAgentGuidePath(repoRelativePath: string): boolean {
298
+ const norm = repoRelativePath.replace(/^\.?\/+/, '').replace(/\/+$/, '');
299
+ return norm === AGENT_GUIDE_FILE;
300
+ }
@@ -0,0 +1,22 @@
1
+ export {
2
+ AGENT_GUIDE_FILE,
3
+ CORE_SECTION_IDS,
4
+ NEW_KNOWLEDGE_BASE_SECTION_ID,
5
+ PLATFORM_GUIDE_SEPARATOR,
6
+ WORKING_WITH_FILES_SECTION_ID,
7
+ agentGuideSections,
8
+ composeAgentGuide,
9
+ coreAgentGuideSections,
10
+ isAgentGuidePath,
11
+ isManagedGuide,
12
+ joinGuideSections,
13
+ withPlatformGuideAppended,
14
+ type AgentGuideContext,
15
+ type AgentGuideHook,
16
+ type AgentGuideReader,
17
+ type AgentGuideSection,
18
+ type AgentGuideSectionsReader,
19
+ type RenderedGuideSection,
20
+ } from './agent-guide.js';
21
+ export { GET_AGENT_GUIDE_TOOL, registerAgentGuideTool } from './agent-guide.tools.js';
22
+ export { GUIDE_FIRST_SENTENCE, withGuideFirst } from '../tool-registry/guide-first.js';