@bevel-software/platform-core-backend 0.33.0 → 0.35.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 (602) hide show
  1. package/agent-guide/access-control.md +146 -289
  2. package/agent-guide/conventions.md +23 -25
  3. package/agent-guide/directory-structure.md +72 -120
  4. package/agent-guide/drafts-and-change-requests.md +92 -0
  5. package/agent-guide/for-git-users.md +47 -0
  6. package/agent-guide/glossary.md +36 -0
  7. package/agent-guide/how-agents-find-things.md +49 -0
  8. package/agent-guide/html-views.md +239 -8
  9. package/agent-guide/new-knowledge-base.md +9 -8
  10. package/agent-guide/skills.md +67 -42
  11. package/agent-guide/start-here.md +65 -0
  12. package/agent-guide/tool-manuals.md +133 -155
  13. package/agent-guide/tools.md +67 -0
  14. package/agent-guide/where-a-new-file-goes.md +45 -28
  15. package/dist/core/catalog-revision.d.ts +12 -1
  16. package/dist/core/catalog-revision.d.ts.map +1 -1
  17. package/dist/core/catalog-revision.js +23 -3
  18. package/dist/core/catalog-revision.js.map +1 -1
  19. package/dist/core/core-ports.d.ts +41 -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.map +1 -1
  23. package/dist/core/create-core-server.js +15 -8
  24. package/dist/core/create-core-server.js.map +1 -1
  25. package/dist/core/create-core-services.d.ts +22 -5
  26. package/dist/core/create-core-services.d.ts.map +1 -1
  27. package/dist/core/create-core-services.js +44 -16
  28. package/dist/core/create-core-services.js.map +1 -1
  29. package/dist/core/lifecycle.d.ts +16 -0
  30. package/dist/core/lifecycle.d.ts.map +1 -1
  31. package/dist/core/lifecycle.js +12 -2
  32. package/dist/core/lifecycle.js.map +1 -1
  33. package/dist/index.d.ts +1 -1
  34. package/dist/index.d.ts.map +1 -1
  35. package/dist/index.js.map +1 -1
  36. package/dist/modules/access/access-control.interface.d.ts +39 -9
  37. package/dist/modules/access/access-control.interface.d.ts.map +1 -1
  38. package/dist/modules/access/access-control.service.d.ts +15 -3
  39. package/dist/modules/access/access-control.service.d.ts.map +1 -1
  40. package/dist/modules/access/access-control.service.js +239 -75
  41. package/dist/modules/access/access-control.service.js.map +1 -1
  42. package/dist/modules/access/access-mutation.service.d.ts +22 -24
  43. package/dist/modules/access/access-mutation.service.d.ts.map +1 -1
  44. package/dist/modules/access/access-mutation.service.js +48 -51
  45. package/dist/modules/access/access-mutation.service.js.map +1 -1
  46. package/dist/modules/access/access-view.d.ts.map +1 -1
  47. package/dist/modules/access/access-view.js +12 -11
  48. package/dist/modules/access/access-view.js.map +1 -1
  49. package/dist/modules/access/access.routes.d.ts +3 -0
  50. package/dist/modules/access/access.routes.d.ts.map +1 -1
  51. package/dist/modules/access/access.routes.js +58 -33
  52. package/dist/modules/access/access.routes.js.map +1 -1
  53. package/dist/modules/access/groups-admin.routes.d.ts.map +1 -1
  54. package/dist/modules/access/groups-admin.routes.js +4 -2
  55. package/dist/modules/access/groups-admin.routes.js.map +1 -1
  56. package/dist/modules/access/groups-admin.service.d.ts +44 -13
  57. package/dist/modules/access/groups-admin.service.d.ts.map +1 -1
  58. package/dist/modules/access/groups-admin.service.js +80 -38
  59. package/dist/modules/access/groups-admin.service.js.map +1 -1
  60. package/dist/modules/access/groups-edit.d.ts +1 -1
  61. package/dist/modules/access/groups-edit.d.ts.map +1 -1
  62. package/dist/modules/access/groups-edit.js +1 -1
  63. package/dist/modules/access/groups-edit.js.map +1 -1
  64. package/dist/modules/access/index.d.ts +1 -1
  65. package/dist/modules/access/index.d.ts.map +1 -1
  66. package/dist/modules/access/reference-scan.d.ts +116 -24
  67. package/dist/modules/access/reference-scan.d.ts.map +1 -1
  68. package/dist/modules/access/reference-scan.js +305 -44
  69. package/dist/modules/access/reference-scan.js.map +1 -1
  70. package/dist/modules/access/roles-admin.service.d.ts +17 -8
  71. package/dist/modules/access/roles-admin.service.d.ts.map +1 -1
  72. package/dist/modules/access/roles-admin.service.js +32 -23
  73. package/dist/modules/access/roles-admin.service.js.map +1 -1
  74. package/dist/modules/access-model/access-grammar.d.ts +35 -10
  75. package/dist/modules/access-model/access-grammar.d.ts.map +1 -1
  76. package/dist/modules/access-model/access-grammar.js +60 -20
  77. package/dist/modules/access-model/access-grammar.js.map +1 -1
  78. package/dist/modules/access-model/access-splice.d.ts +22 -18
  79. package/dist/modules/access-model/access-splice.d.ts.map +1 -1
  80. package/dist/modules/access-model/access-splice.js +20 -14
  81. package/dist/modules/access-model/access-splice.js.map +1 -1
  82. package/dist/modules/access-model/group-files.d.ts +1 -0
  83. package/dist/modules/access-model/group-files.d.ts.map +1 -1
  84. package/dist/modules/access-model/group-files.js +5 -1
  85. package/dist/modules/access-model/group-files.js.map +1 -1
  86. package/dist/modules/agent-guide/agent-guide.d.ts +47 -7
  87. package/dist/modules/agent-guide/agent-guide.d.ts.map +1 -1
  88. package/dist/modules/agent-guide/agent-guide.js +103 -13
  89. package/dist/modules/agent-guide/agent-guide.js.map +1 -1
  90. package/dist/modules/agent-guide/agent-guide.tools.d.ts +6 -2
  91. package/dist/modules/agent-guide/agent-guide.tools.d.ts.map +1 -1
  92. package/dist/modules/agent-guide/agent-guide.tools.js +46 -22
  93. package/dist/modules/agent-guide/agent-guide.tools.js.map +1 -1
  94. package/dist/modules/agent-guide/guide-budget.d.ts +48 -0
  95. package/dist/modules/agent-guide/guide-budget.d.ts.map +1 -0
  96. package/dist/modules/agent-guide/guide-budget.js +67 -0
  97. package/dist/modules/agent-guide/guide-budget.js.map +1 -0
  98. package/dist/modules/agent-guide/index.d.ts +2 -1
  99. package/dist/modules/agent-guide/index.d.ts.map +1 -1
  100. package/dist/modules/agent-guide/index.js +2 -1
  101. package/dist/modules/agent-guide/index.js.map +1 -1
  102. package/dist/modules/agent-instructions/compose.d.ts +3 -1
  103. package/dist/modules/agent-instructions/compose.d.ts.map +1 -1
  104. package/dist/modules/agent-instructions/compose.js +7 -1
  105. package/dist/modules/agent-instructions/compose.js.map +1 -1
  106. package/dist/modules/agent-instructions/shared-file-rules.d.ts +5 -1
  107. package/dist/modules/agent-instructions/shared-file-rules.d.ts.map +1 -1
  108. package/dist/modules/agent-instructions/shared-file-rules.js +26 -9
  109. package/dist/modules/agent-instructions/shared-file-rules.js.map +1 -1
  110. package/dist/modules/agent-scope/agent-scope.contract.d.ts +67 -0
  111. package/dist/modules/agent-scope/agent-scope.contract.d.ts.map +1 -0
  112. package/dist/modules/agent-scope/agent-scope.contract.js +27 -0
  113. package/dist/modules/agent-scope/agent-scope.contract.js.map +1 -0
  114. package/dist/modules/agent-scope/connection-scope.d.ts +111 -0
  115. package/dist/modules/agent-scope/connection-scope.d.ts.map +1 -0
  116. package/dist/modules/agent-scope/connection-scope.js +165 -0
  117. package/dist/modules/agent-scope/connection-scope.js.map +1 -0
  118. package/dist/modules/agent-scope/index.d.ts +3 -0
  119. package/dist/modules/agent-scope/index.d.ts.map +1 -0
  120. package/dist/modules/agent-scope/index.js +3 -0
  121. package/dist/modules/agent-scope/index.js.map +1 -0
  122. package/dist/modules/audit/agent-audit.service.d.ts.map +1 -1
  123. package/dist/modules/audit/agent-audit.service.js +2 -0
  124. package/dist/modules/audit/agent-audit.service.js.map +1 -1
  125. package/dist/modules/audit/audit.contract.d.ts +6 -0
  126. package/dist/modules/audit/audit.contract.d.ts.map +1 -1
  127. package/dist/modules/audit/audit.contract.js.map +1 -1
  128. package/dist/modules/auth/account-admission.d.ts +12 -0
  129. package/dist/modules/auth/account-admission.d.ts.map +1 -1
  130. package/dist/modules/auth/account-admission.js +15 -0
  131. package/dist/modules/auth/account-admission.js.map +1 -1
  132. package/dist/modules/auth/auth.middleware.d.ts +27 -1
  133. package/dist/modules/auth/auth.middleware.d.ts.map +1 -1
  134. package/dist/modules/auth/auth.middleware.js +42 -4
  135. package/dist/modules/auth/auth.middleware.js.map +1 -1
  136. package/dist/modules/auth/auth.routes.d.ts +13 -9
  137. package/dist/modules/auth/auth.routes.d.ts.map +1 -1
  138. package/dist/modules/auth/auth.routes.js +35 -29
  139. package/dist/modules/auth/auth.routes.js.map +1 -1
  140. package/dist/modules/auth/auth.service.d.ts +55 -6
  141. package/dist/modules/auth/auth.service.d.ts.map +1 -1
  142. package/dist/modules/auth/auth.service.js +128 -34
  143. package/dist/modules/auth/auth.service.js.map +1 -1
  144. package/dist/modules/auth/index.d.ts +1 -1
  145. package/dist/modules/auth/index.d.ts.map +1 -1
  146. package/dist/modules/auth/index.js +1 -1
  147. package/dist/modules/auth/index.js.map +1 -1
  148. package/dist/modules/auth/oidc-auth-provider.d.ts.map +1 -1
  149. package/dist/modules/auth/oidc-auth-provider.js +2 -9
  150. package/dist/modules/auth/oidc-auth-provider.js.map +1 -1
  151. package/dist/modules/code-mode/code-mode.tool.js +2 -2
  152. package/dist/modules/code-mode/code-mode.tool.js.map +1 -1
  153. package/dist/modules/connection-probe/connection-probe.service.d.ts +0 -12
  154. package/dist/modules/connection-probe/connection-probe.service.d.ts.map +1 -1
  155. package/dist/modules/connection-probe/connection-probe.service.js +1 -38
  156. package/dist/modules/connection-probe/connection-probe.service.js.map +1 -1
  157. package/dist/modules/database/core-schema.d.ts +68 -0
  158. package/dist/modules/database/core-schema.d.ts.map +1 -1
  159. package/dist/modules/database/core-schema.js +33 -0
  160. package/dist/modules/database/core-schema.js.map +1 -1
  161. package/dist/modules/declared-variables/declared-variables.routes.d.ts +8 -1
  162. package/dist/modules/declared-variables/declared-variables.routes.d.ts.map +1 -1
  163. package/dist/modules/declared-variables/declared-variables.routes.js +13 -2
  164. package/dist/modules/declared-variables/declared-variables.routes.js.map +1 -1
  165. package/dist/modules/embed/embed.tools.d.ts.map +1 -1
  166. package/dist/modules/embed/embed.tools.js +5 -0
  167. package/dist/modules/embed/embed.tools.js.map +1 -1
  168. package/dist/modules/kb-fs/index.d.ts +2 -0
  169. package/dist/modules/kb-fs/index.d.ts.map +1 -1
  170. package/dist/modules/kb-fs/index.js +1 -0
  171. package/dist/modules/kb-fs/index.js.map +1 -1
  172. package/dist/modules/kb-fs/locking-filesystem.d.ts.map +1 -1
  173. package/dist/modules/kb-fs/locking-filesystem.js +7 -1
  174. package/dist/modules/kb-fs/locking-filesystem.js.map +1 -1
  175. package/dist/modules/kb-fs/repo-path.d.ts +26 -6
  176. package/dist/modules/kb-fs/repo-path.d.ts.map +1 -1
  177. package/dist/modules/kb-fs/repo-path.js +22 -7
  178. package/dist/modules/kb-fs/repo-path.js.map +1 -1
  179. package/dist/modules/kb-fs/tmp-ref.d.ts +36 -0
  180. package/dist/modules/kb-fs/tmp-ref.d.ts.map +1 -0
  181. package/dist/modules/kb-fs/tmp-ref.js +76 -0
  182. package/dist/modules/kb-fs/tmp-ref.js.map +1 -0
  183. package/dist/modules/mcp/mcp-auth.middleware.d.ts +7 -0
  184. package/dist/modules/mcp/mcp-auth.middleware.d.ts.map +1 -1
  185. package/dist/modules/mcp/mcp-auth.middleware.js +14 -1
  186. package/dist/modules/mcp/mcp-auth.middleware.js.map +1 -1
  187. package/dist/modules/mcp/mcp.routes.d.ts +7 -1
  188. package/dist/modules/mcp/mcp.routes.d.ts.map +1 -1
  189. package/dist/modules/mcp/mcp.routes.js +39 -4
  190. package/dist/modules/mcp/mcp.routes.js.map +1 -1
  191. package/dist/modules/mcp/mcp.service.d.ts +11 -0
  192. package/dist/modules/mcp/mcp.service.d.ts.map +1 -1
  193. package/dist/modules/mcp/mcp.service.js +74 -48
  194. package/dist/modules/mcp/mcp.service.js.map +1 -1
  195. package/dist/modules/mcp/oauth/bevel-oauth-provider.d.ts +24 -1
  196. package/dist/modules/mcp/oauth/bevel-oauth-provider.d.ts.map +1 -1
  197. package/dist/modules/mcp/oauth/bevel-oauth-provider.js +45 -10
  198. package/dist/modules/mcp/oauth/bevel-oauth-provider.js.map +1 -1
  199. package/dist/modules/mcp/oauth/oauth-consent.routes.d.ts +9 -0
  200. package/dist/modules/mcp/oauth/oauth-consent.routes.d.ts.map +1 -1
  201. package/dist/modules/mcp/oauth/oauth-consent.routes.js +34 -1
  202. package/dist/modules/mcp/oauth/oauth-consent.routes.js.map +1 -1
  203. package/dist/modules/plugins/index.d.ts +1 -1
  204. package/dist/modules/plugins/index.d.ts.map +1 -1
  205. package/dist/modules/plugins/index.js.map +1 -1
  206. package/dist/modules/plugins/plugin-links.d.ts +18 -2
  207. package/dist/modules/plugins/plugin-links.d.ts.map +1 -1
  208. package/dist/modules/plugins/plugin-links.js.map +1 -1
  209. package/dist/modules/plugins/plugins.routes.d.ts +5 -1
  210. package/dist/modules/plugins/plugins.routes.d.ts.map +1 -1
  211. package/dist/modules/plugins/plugins.routes.js +32 -5
  212. package/dist/modules/plugins/plugins.routes.js.map +1 -1
  213. package/dist/modules/secrets-vault/db-secrets-vault.service.d.ts +11 -1
  214. package/dist/modules/secrets-vault/db-secrets-vault.service.d.ts.map +1 -1
  215. package/dist/modules/secrets-vault/db-secrets-vault.service.js +159 -24
  216. package/dist/modules/secrets-vault/db-secrets-vault.service.js.map +1 -1
  217. package/dist/modules/secrets-vault/index.d.ts +1 -1
  218. package/dist/modules/secrets-vault/index.d.ts.map +1 -1
  219. package/dist/modules/secrets-vault/index.js +1 -1
  220. package/dist/modules/secrets-vault/index.js.map +1 -1
  221. package/dist/modules/secrets-vault/secrets-vault.contract.d.ts +53 -11
  222. package/dist/modules/secrets-vault/secrets-vault.contract.d.ts.map +1 -1
  223. package/dist/modules/secrets-vault/secrets-vault.contract.js +27 -0
  224. package/dist/modules/secrets-vault/secrets-vault.contract.js.map +1 -1
  225. package/dist/modules/secrets-vault/secrets-vault.routes.d.ts +9 -0
  226. package/dist/modules/secrets-vault/secrets-vault.routes.d.ts.map +1 -1
  227. package/dist/modules/secrets-vault/secrets-vault.routes.js +100 -42
  228. package/dist/modules/secrets-vault/secrets-vault.routes.js.map +1 -1
  229. package/dist/modules/settings/oidc-check.d.ts.map +1 -1
  230. package/dist/modules/settings/oidc-check.js +5 -17
  231. package/dist/modules/settings/oidc-check.js.map +1 -1
  232. package/dist/modules/skills/index.d.ts +3 -3
  233. package/dist/modules/skills/index.d.ts.map +1 -1
  234. package/dist/modules/skills/index.js +0 -2
  235. package/dist/modules/skills/index.js.map +1 -1
  236. package/dist/modules/skills/skills.contract.d.ts +16 -0
  237. package/dist/modules/skills/skills.contract.d.ts.map +1 -1
  238. package/dist/modules/skills/skills.service.d.ts.map +1 -1
  239. package/dist/modules/skills/skills.service.js +6 -1
  240. package/dist/modules/skills/skills.service.js.map +1 -1
  241. package/dist/modules/skills/skills.tools.d.ts.map +1 -1
  242. package/dist/modules/skills/skills.tools.js +25 -13
  243. package/dist/modules/skills/skills.tools.js.map +1 -1
  244. package/dist/modules/tool-auth/external-api-key.interface.d.ts +11 -0
  245. package/dist/modules/tool-auth/external-api-key.interface.d.ts.map +1 -1
  246. package/dist/modules/tool-auth/external-api-key.interface.js.map +1 -1
  247. package/dist/modules/tool-auth/external-api-key.service.d.ts +1 -0
  248. package/dist/modules/tool-auth/external-api-key.service.d.ts.map +1 -1
  249. package/dist/modules/tool-auth/external-api-key.service.js +4 -1
  250. package/dist/modules/tool-auth/external-api-key.service.js.map +1 -1
  251. package/dist/modules/tool-auth/index.d.ts +1 -1
  252. package/dist/modules/tool-auth/index.d.ts.map +1 -1
  253. package/dist/modules/tool-auth/internal-token.service.d.ts +9 -0
  254. package/dist/modules/tool-auth/internal-token.service.d.ts.map +1 -1
  255. package/dist/modules/tool-auth/internal-token.service.js +1 -0
  256. package/dist/modules/tool-auth/internal-token.service.js.map +1 -1
  257. package/dist/modules/tool-auth/tool-auth.middleware.d.ts +27 -3
  258. package/dist/modules/tool-auth/tool-auth.middleware.d.ts.map +1 -1
  259. package/dist/modules/tool-auth/tool-auth.middleware.js +32 -6
  260. package/dist/modules/tool-auth/tool-auth.middleware.js.map +1 -1
  261. package/dist/modules/tool-helpers/tool-context.d.ts +7 -0
  262. package/dist/modules/tool-helpers/tool-context.d.ts.map +1 -1
  263. package/dist/modules/tool-helpers/tool-context.js +3 -0
  264. package/dist/modules/tool-helpers/tool-context.js.map +1 -1
  265. package/dist/modules/tool-helpers/tool-def.js +1 -1
  266. package/dist/modules/tool-helpers/tool-def.js.map +1 -1
  267. package/dist/modules/tool-helpers/tool-handler.d.ts +15 -0
  268. package/dist/modules/tool-helpers/tool-handler.d.ts.map +1 -1
  269. package/dist/modules/tool-helpers/tool-handler.js +19 -0
  270. package/dist/modules/tool-helpers/tool-handler.js.map +1 -1
  271. package/dist/modules/tool-helpers/tool.contract.d.ts +10 -0
  272. package/dist/modules/tool-helpers/tool.contract.d.ts.map +1 -1
  273. package/dist/modules/tool-helpers/tool.contract.js.map +1 -1
  274. package/dist/modules/tool-helpers/validate-token.d.ts +3 -1
  275. package/dist/modules/tool-helpers/validate-token.d.ts.map +1 -1
  276. package/dist/modules/tool-helpers/validate-token.js +1 -1
  277. package/dist/modules/tool-helpers/validate-token.js.map +1 -1
  278. package/dist/modules/tool-manuals/index.d.ts +3 -3
  279. package/dist/modules/tool-manuals/index.d.ts.map +1 -1
  280. package/dist/modules/tool-manuals/index.js +0 -2
  281. package/dist/modules/tool-manuals/index.js.map +1 -1
  282. package/dist/modules/tool-manuals/mcp-json-discovery.d.ts +7 -1
  283. package/dist/modules/tool-manuals/mcp-json-discovery.d.ts.map +1 -1
  284. package/dist/modules/tool-manuals/mcp-json-discovery.js +69 -38
  285. package/dist/modules/tool-manuals/mcp-json-discovery.js.map +1 -1
  286. package/dist/modules/tool-manuals/tool-manuals.contract.d.ts +46 -6
  287. package/dist/modules/tool-manuals/tool-manuals.contract.d.ts.map +1 -1
  288. package/dist/modules/tool-manuals/tool-manuals.routes.d.ts +7 -1
  289. package/dist/modules/tool-manuals/tool-manuals.routes.d.ts.map +1 -1
  290. package/dist/modules/tool-manuals/tool-manuals.routes.js +41 -4
  291. package/dist/modules/tool-manuals/tool-manuals.routes.js.map +1 -1
  292. package/dist/modules/tool-manuals/tool-manuals.service.d.ts +24 -13
  293. package/dist/modules/tool-manuals/tool-manuals.service.d.ts.map +1 -1
  294. package/dist/modules/tool-manuals/tool-manuals.service.js +138 -59
  295. package/dist/modules/tool-manuals/tool-manuals.service.js.map +1 -1
  296. package/dist/modules/tool-manuals/tool-manuals.tools.d.ts +8 -2
  297. package/dist/modules/tool-manuals/tool-manuals.tools.d.ts.map +1 -1
  298. package/dist/modules/tool-manuals/tool-manuals.tools.js +56 -20
  299. package/dist/modules/tool-manuals/tool-manuals.tools.js.map +1 -1
  300. package/dist/modules/tool-registry/manual.routes.d.ts +8 -1
  301. package/dist/modules/tool-registry/manual.routes.d.ts.map +1 -1
  302. package/dist/modules/tool-registry/manual.routes.js +27 -7
  303. package/dist/modules/tool-registry/manual.routes.js.map +1 -1
  304. package/dist/modules/tool-registry/tool.contract.d.ts +7 -0
  305. package/dist/modules/tool-registry/tool.contract.d.ts.map +1 -1
  306. package/dist/modules/tool-registry/tool.contract.js.map +1 -1
  307. package/dist/modules/workflow/agent-tools/workflow.tools.d.ts.map +1 -1
  308. package/dist/modules/workflow/agent-tools/workflow.tools.js +36 -27
  309. package/dist/modules/workflow/agent-tools/workflow.tools.js.map +1 -1
  310. package/dist/modules/workflow/git/git.service.d.ts +2 -2
  311. package/dist/modules/workflow/git/git.service.d.ts.map +1 -1
  312. package/dist/modules/workflow/git/git.service.js +20 -35
  313. package/dist/modules/workflow/git/git.service.js.map +1 -1
  314. package/dist/modules/workflow/workflow.service.d.ts +2 -1
  315. package/dist/modules/workflow/workflow.service.d.ts.map +1 -1
  316. package/dist/modules/workflow/workflow.service.js +3 -0
  317. package/dist/modules/workflow/workflow.service.js.map +1 -1
  318. package/dist/modules/workspace/agent-access.gate.d.ts +1 -1
  319. package/dist/modules/workspace/agent-access.gate.d.ts.map +1 -1
  320. package/dist/modules/workspace/agent-access.gate.js +1 -1
  321. package/dist/modules/workspace/agent-access.gate.js.map +1 -1
  322. package/dist/modules/workspace/file-readers/doc-extract.service.d.ts +28 -4
  323. package/dist/modules/workspace/file-readers/doc-extract.service.d.ts.map +1 -1
  324. package/dist/modules/workspace/file-readers/doc-extract.service.js +61 -40
  325. package/dist/modules/workspace/file-readers/doc-extract.service.js.map +1 -1
  326. package/dist/modules/workspace/index.d.ts +8 -0
  327. package/dist/modules/workspace/index.d.ts.map +1 -1
  328. package/dist/modules/workspace/index.js +8 -0
  329. package/dist/modules/workspace/index.js.map +1 -1
  330. package/dist/modules/workspace/nul-scan.d.ts +19 -0
  331. package/dist/modules/workspace/nul-scan.d.ts.map +1 -0
  332. package/dist/modules/workspace/nul-scan.js +55 -0
  333. package/dist/modules/workspace/nul-scan.js.map +1 -0
  334. package/dist/modules/workspace/pattern-matcher.contract.d.ts +110 -27
  335. package/dist/modules/workspace/pattern-matcher.contract.d.ts.map +1 -1
  336. package/dist/modules/workspace/pattern-matcher.contract.js +30 -13
  337. package/dist/modules/workspace/pattern-matcher.contract.js.map +1 -1
  338. package/dist/modules/workspace/ripgrep-search.d.ts +54 -0
  339. package/dist/modules/workspace/ripgrep-search.d.ts.map +1 -0
  340. package/dist/modules/workspace/ripgrep-search.js +657 -0
  341. package/dist/modules/workspace/ripgrep-search.js.map +1 -0
  342. package/dist/modules/workspace/ripgrep-version.d.ts +15 -0
  343. package/dist/modules/workspace/ripgrep-version.d.ts.map +1 -0
  344. package/dist/modules/workspace/ripgrep-version.js +31 -0
  345. package/dist/modules/workspace/ripgrep-version.js.map +1 -0
  346. package/dist/modules/workspace/startup/beside-checkout.d.ts +8 -5
  347. package/dist/modules/workspace/startup/beside-checkout.d.ts.map +1 -1
  348. package/dist/modules/workspace/startup/beside-checkout.js +14 -5
  349. package/dist/modules/workspace/startup/beside-checkout.js.map +1 -1
  350. package/dist/modules/workspace/worker-pool.d.ts +3 -4
  351. package/dist/modules/workspace/worker-pool.d.ts.map +1 -1
  352. package/dist/modules/workspace/worker-pool.js.map +1 -1
  353. package/dist/modules/workspace/workspace-tmp.d.ts +146 -0
  354. package/dist/modules/workspace/workspace-tmp.d.ts.map +1 -0
  355. package/dist/modules/workspace/workspace-tmp.js +435 -0
  356. package/dist/modules/workspace/workspace-tmp.js.map +1 -0
  357. package/dist/modules/workspace/workspace.routes.d.ts.map +1 -1
  358. package/dist/modules/workspace/workspace.routes.js +5 -26
  359. package/dist/modules/workspace/workspace.routes.js.map +1 -1
  360. package/dist/modules/workspace/workspace.service.d.ts +47 -6
  361. package/dist/modules/workspace/workspace.service.d.ts.map +1 -1
  362. package/dist/modules/workspace/workspace.service.js +86 -6
  363. package/dist/modules/workspace/workspace.service.js.map +1 -1
  364. package/dist/modules/workspace/workspace.tools.d.ts +3 -2
  365. package/dist/modules/workspace/workspace.tools.d.ts.map +1 -1
  366. package/dist/modules/workspace/workspace.tools.js +531 -137
  367. package/dist/modules/workspace/workspace.tools.js.map +1 -1
  368. package/dist/shared/oauth-token-error.d.ts +23 -0
  369. package/dist/shared/oauth-token-error.d.ts.map +1 -0
  370. package/dist/shared/oauth-token-error.js +47 -0
  371. package/dist/shared/oauth-token-error.js.map +1 -0
  372. package/dist/shared/path-order.d.ts +28 -8
  373. package/dist/shared/path-order.d.ts.map +1 -1
  374. package/dist/shared/path-order.js +37 -8
  375. package/dist/shared/path-order.js.map +1 -1
  376. package/dist/shared/read-capped.d.ts +19 -0
  377. package/dist/shared/read-capped.d.ts.map +1 -0
  378. package/dist/shared/read-capped.js +45 -0
  379. package/dist/shared/read-capped.js.map +1 -0
  380. package/migrations/0022_session_version.sql +6 -0
  381. package/migrations/0023_agent_path.sql +3 -0
  382. package/migrations/meta/0022_snapshot.json +2360 -0
  383. package/migrations/meta/0023_snapshot.json +2378 -0
  384. package/migrations/meta/_journal.json +14 -0
  385. package/package.json +4 -3
  386. package/src/__tests__/hexis-catalog.ts +144 -0
  387. package/src/__tests__/pg-scratch.test.ts +69 -0
  388. package/src/__tests__/pg-scratch.ts +31 -0
  389. package/src/__tests__/real-disk.ts +21 -0
  390. package/src/__tests__/slow-ripgrep.ts +65 -0
  391. package/src/__tests__/tokens.ts +19 -0
  392. package/src/__tests__/tool-manuals.ts +32 -0
  393. package/src/__tests__/tool-wiring.ts +25 -0
  394. package/src/core/__tests__/boot-without-ripgrep.test.ts +34 -0
  395. package/src/core/__tests__/catalog-revision.test.ts +89 -0
  396. package/src/core/__tests__/damaged-document.tools.test.ts +2 -2
  397. package/src/core/__tests__/gated-boot.test.ts +8 -1
  398. package/src/core/__tests__/lifecycle.test.ts +46 -13
  399. package/src/core/__tests__/oauth-sign-in-real-file.test.ts +179 -0
  400. package/src/core/catalog-revision.ts +24 -2
  401. package/src/core/core-ports.ts +42 -0
  402. package/src/core/create-core-server.ts +14 -1
  403. package/src/core/create-core-services.ts +62 -15
  404. package/src/core/lifecycle.ts +26 -2
  405. package/src/index.ts +1 -1
  406. package/src/modules/access/__tests__/access-control.admin-root-floor.test.ts +12 -0
  407. package/src/modules/access/__tests__/access-control.colliding-name-cases.test.ts +113 -0
  408. package/src/modules/access/__tests__/access-control.frontmatter-head.test.ts +117 -0
  409. package/src/modules/access/__tests__/access-control.group-named-admin.test.ts +122 -0
  410. package/src/modules/access/__tests__/access-control.preview-relocation.test.ts +50 -0
  411. package/src/modules/access/__tests__/access-declarations.test.ts +19 -0
  412. package/src/modules/access/__tests__/access-groups.test.ts +55 -22
  413. package/src/modules/access/__tests__/access-mutation.service.test.ts +85 -59
  414. package/src/modules/access/__tests__/access-restrict-here.test.ts +7 -5
  415. package/src/modules/access/__tests__/access.routes.admins.test.ts +1 -0
  416. package/src/modules/access/__tests__/access.routes.batch.test.ts +2 -0
  417. package/src/modules/access/__tests__/access.routes.folder-governs.test.ts +2 -0
  418. package/src/modules/access/__tests__/access.routes.group-grant.test.ts +50 -14
  419. package/src/modules/access/__tests__/access.routes.overrides.test.ts +2 -1
  420. package/src/modules/access/__tests__/access.routes.proposal-branch.test.ts +1 -0
  421. package/src/modules/access/__tests__/access.routes.prospective.test.ts +52 -10
  422. package/src/modules/access/__tests__/access.routes.revoke.test.ts +18 -13
  423. package/src/modules/access/__tests__/access.routes.unknown-email.test.ts +2 -0
  424. package/src/modules/access/__tests__/grant-sources.test.ts +20 -15
  425. package/src/modules/access/__tests__/groups-admin.routes.test.ts +61 -0
  426. package/src/modules/access/__tests__/groups-admin.service.test.ts +211 -18
  427. package/src/modules/access/__tests__/holder-changes.test.ts +127 -0
  428. package/src/modules/access/__tests__/reference-scan.test.ts +366 -14
  429. package/src/modules/access/__tests__/roles-admin.security.test.ts +1 -1
  430. package/src/modules/access/__tests__/roles-admin.service.test.ts +43 -22
  431. package/src/modules/access/__tests__/roles-capabilities.test.ts +6 -2
  432. package/src/modules/access/__tests__/roles.routes.test.ts +1 -1
  433. package/src/modules/access/access-control.interface.ts +43 -10
  434. package/src/modules/access/access-control.service.ts +250 -72
  435. package/src/modules/access/access-mutation.service.ts +48 -53
  436. package/src/modules/access/access-view.ts +12 -10
  437. package/src/modules/access/access.routes.ts +66 -37
  438. package/src/modules/access/groups-admin.routes.ts +4 -2
  439. package/src/modules/access/groups-admin.service.ts +114 -44
  440. package/src/modules/access/groups-edit.ts +1 -1
  441. package/src/modules/access/index.ts +1 -1
  442. package/src/modules/access/reference-scan.ts +319 -46
  443. package/src/modules/access/roles-admin.service.ts +43 -26
  444. package/src/modules/access/synced-groups-writer.ts +1 -1
  445. package/src/modules/access-model/__tests__/access-grammar.test.ts +38 -1
  446. package/src/modules/access-model/__tests__/access-splice.test.ts +50 -8
  447. package/src/modules/access-model/access-grammar.ts +65 -20
  448. package/src/modules/access-model/access-splice.ts +31 -23
  449. package/src/modules/access-model/group-files.ts +5 -0
  450. package/src/modules/agent-guide/__tests__/agent-guide.test.ts +110 -25
  451. package/src/modules/agent-guide/__tests__/agent-guide.tools.test.ts +38 -11
  452. package/src/modules/agent-guide/__tests__/guide-budget.test.ts +95 -0
  453. package/src/modules/agent-guide/__tests__/guide-eval.test.ts +182 -0
  454. package/src/modules/agent-guide/__tests__/guide-matches-code.test.ts +263 -0
  455. package/src/modules/agent-guide/__tests__/tool-surface.json +514 -0
  456. package/src/modules/agent-guide/__tests__/tool-surface.test.ts +75 -0
  457. package/src/modules/agent-guide/agent-guide.tools.ts +51 -22
  458. package/src/modules/agent-guide/agent-guide.ts +120 -13
  459. package/src/modules/agent-guide/guide-budget.ts +73 -0
  460. package/src/modules/agent-guide/index.ts +12 -0
  461. package/src/modules/agent-instructions/__tests__/shared-file-rules.test.ts +5 -4
  462. package/src/modules/agent-instructions/compose.ts +7 -1
  463. package/src/modules/agent-instructions/shared-file-rules.ts +27 -9
  464. package/src/modules/agent-scope/__tests__/agent-surfaces.connect-as.test.ts +421 -0
  465. package/src/modules/agent-scope/__tests__/connection-scope.test.ts +46 -0
  466. package/src/modules/agent-scope/__tests__/in-memory-kb.ts +148 -0
  467. package/src/modules/agent-scope/agent-scope.contract.ts +83 -0
  468. package/src/modules/agent-scope/connection-scope.ts +199 -0
  469. package/src/modules/agent-scope/index.ts +15 -0
  470. package/src/modules/audit/agent-audit.service.ts +2 -0
  471. package/src/modules/audit/audit.contract.ts +6 -0
  472. package/src/modules/auth/__tests__/auth.middleware.test.ts +30 -2
  473. package/src/modules/auth/__tests__/auth.routes.test.ts +71 -5
  474. package/src/modules/auth/__tests__/auth.service.test.ts +90 -9
  475. package/src/modules/auth/__tests__/password-change-sessions.pg.test.ts +269 -0
  476. package/src/modules/auth/account-admission.ts +19 -0
  477. package/src/modules/auth/auth.middleware.ts +45 -4
  478. package/src/modules/auth/auth.routes.ts +46 -29
  479. package/src/modules/auth/auth.service.ts +135 -34
  480. package/src/modules/auth/index.ts +2 -0
  481. package/src/modules/auth/oidc-auth-provider.ts +2 -9
  482. package/src/modules/code-mode/code-mode.tool.ts +2 -2
  483. package/src/modules/connection-probe/__tests__/connection-probe.service.test.ts +5 -24
  484. package/src/modules/connection-probe/connection-probe.service.ts +1 -34
  485. package/src/modules/database/__tests__/session-version-migration.pg.test.ts +133 -0
  486. package/src/modules/database/core-schema.ts +33 -0
  487. package/src/modules/declared-variables/__tests__/declared-variables.route.test.ts +44 -1
  488. package/src/modules/declared-variables/declared-variables.routes.ts +12 -1
  489. package/src/modules/embed/__tests__/embed.tools.test.ts +12 -0
  490. package/src/modules/embed/embed.tools.ts +5 -0
  491. package/src/modules/kb-fs/__tests__/locking-filesystem.test.ts +25 -0
  492. package/src/modules/kb-fs/__tests__/repo-path.test.ts +53 -8
  493. package/src/modules/kb-fs/index.ts +2 -0
  494. package/src/modules/kb-fs/locking-filesystem.ts +7 -1
  495. package/src/modules/kb-fs/repo-path.ts +33 -7
  496. package/src/modules/kb-fs/tmp-ref.ts +81 -0
  497. package/src/modules/mcp/__tests__/connect-as.pg.test.ts +137 -0
  498. package/src/modules/mcp/__tests__/mcp-auth.middleware.test.ts +29 -5
  499. package/src/modules/mcp/__tests__/mcp-routes-harness.ts +8 -0
  500. package/src/modules/mcp/__tests__/mcp.connect-as.test.ts +195 -0
  501. package/src/modules/mcp/__tests__/mcp.routes.connect-as.test.ts +192 -0
  502. package/src/modules/mcp/__tests__/oauth-consent.connect-as.test.ts +146 -0
  503. package/src/modules/mcp/mcp-auth.middleware.ts +19 -2
  504. package/src/modules/mcp/mcp.routes.ts +39 -3
  505. package/src/modules/mcp/mcp.service.ts +112 -52
  506. package/src/modules/mcp/oauth/bevel-oauth-provider.ts +46 -8
  507. package/src/modules/mcp/oauth/oauth-consent.routes.ts +41 -1
  508. package/src/modules/plugins/__tests__/plugins.tools.test.ts +38 -2
  509. package/src/modules/plugins/index.ts +1 -1
  510. package/src/modules/plugins/plugin-links.ts +19 -2
  511. package/src/modules/plugins/plugins.routes.ts +35 -4
  512. package/src/modules/secrets-vault/__tests__/connect-pending.route.test.ts +113 -0
  513. package/src/modules/secrets-vault/__tests__/db-secrets-vault.oauth.test.ts +430 -3
  514. package/src/modules/secrets-vault/__tests__/oauth-live-declaration.route.test.ts +218 -0
  515. package/src/modules/secrets-vault/__tests__/oauth-return-to.route.test.ts +39 -6
  516. package/src/modules/secrets-vault/db-secrets-vault.service.ts +170 -27
  517. package/src/modules/secrets-vault/index.ts +1 -1
  518. package/src/modules/secrets-vault/secrets-vault.contract.ts +61 -11
  519. package/src/modules/secrets-vault/secrets-vault.routes.ts +114 -42
  520. package/src/modules/settings/oidc-check.ts +5 -18
  521. package/src/modules/skills/__tests__/skills.service.test.ts +34 -0
  522. package/src/modules/skills/index.ts +7 -2
  523. package/src/modules/skills/skills.contract.ts +17 -0
  524. package/src/modules/skills/skills.service.ts +5 -1
  525. package/src/modules/skills/skills.tools.ts +45 -14
  526. package/src/modules/tool-auth/__tests__/external-api-key.service.test.ts +4 -0
  527. package/src/modules/tool-auth/external-api-key.interface.ts +11 -1
  528. package/src/modules/tool-auth/external-api-key.service.ts +5 -2
  529. package/src/modules/tool-auth/index.ts +1 -1
  530. package/src/modules/tool-auth/internal-token.service.ts +10 -0
  531. package/src/modules/tool-auth/tool-auth.middleware.ts +45 -3
  532. package/src/modules/tool-helpers/__tests__/agent-roles-write.test.ts +19 -11
  533. package/src/modules/tool-helpers/__tests__/can-write.tools.test.ts +3 -1
  534. package/src/modules/tool-helpers/__tests__/route-tool-schemas.catalog.test.ts +38 -0
  535. package/src/modules/tool-helpers/tool-context.ts +10 -0
  536. package/src/modules/tool-helpers/tool-def.ts +1 -1
  537. package/src/modules/tool-helpers/tool-handler.ts +34 -0
  538. package/src/modules/tool-helpers/tool.contract.ts +10 -0
  539. package/src/modules/tool-helpers/validate-token.ts +4 -2
  540. package/src/modules/tool-manuals/__tests__/tool-manuals.archive.route.test.ts +80 -4
  541. package/src/modules/tool-manuals/__tests__/tool-manuals.mcp-oauth.test.ts +197 -11
  542. package/src/modules/tool-manuals/__tests__/tool-manuals.service.test.ts +42 -0
  543. package/src/modules/tool-manuals/__tests__/tool-manuals.tools.test.ts +99 -8
  544. package/src/modules/tool-manuals/index.ts +6 -2
  545. package/src/modules/tool-manuals/mcp-json-discovery.ts +73 -34
  546. package/src/modules/tool-manuals/tool-manuals.contract.ts +40 -6
  547. package/src/modules/tool-manuals/tool-manuals.routes.ts +40 -3
  548. package/src/modules/tool-manuals/tool-manuals.service.ts +169 -61
  549. package/src/modules/tool-manuals/tool-manuals.tools.ts +81 -25
  550. package/src/modules/tool-registry/__tests__/tool-description-length.test.ts +6 -113
  551. package/src/modules/tool-registry/manual.routes.ts +26 -5
  552. package/src/modules/tool-registry/tool.contract.ts +7 -0
  553. package/src/modules/workflow/__tests__/workflow.service.facade.test.ts +1 -1
  554. package/src/modules/workflow/__tests__/workflow.service.sync.test.ts +1 -1
  555. package/src/modules/workflow/agent-tools/__tests__/workflow.tools.test.ts +54 -3
  556. package/src/modules/workflow/agent-tools/workflow.tools.ts +36 -27
  557. package/src/modules/workflow/git/__tests__/git.service.list-branches.test.ts +130 -3
  558. package/src/modules/workflow/git/git.service.ts +29 -48
  559. package/src/modules/workflow/workflow.service.ts +5 -0
  560. package/src/modules/workspace/__tests__/git-internals.security.test.ts +2 -2
  561. package/src/modules/workspace/__tests__/holds-nul.test.ts +66 -0
  562. package/src/modules/workspace/__tests__/rest-tool-arguments.test.ts +3 -3
  563. package/src/modules/workspace/__tests__/ripgrep-search.test.ts +570 -0
  564. package/src/modules/workspace/__tests__/ripgrep-version.test.ts +29 -0
  565. package/src/modules/workspace/__tests__/workspace-tmp.tools.test.ts +928 -0
  566. package/src/modules/workspace/__tests__/workspace.routes.read-gate.test.ts +17 -37
  567. package/src/modules/workspace/__tests__/workspace.service.read-filter.test.ts +20 -8
  568. package/src/modules/workspace/__tests__/workspace.tools.agents-file.test.ts +10 -12
  569. package/src/modules/workspace/__tests__/workspace.tools.branch-errors.test.ts +22 -10
  570. package/src/modules/workspace/__tests__/workspace.tools.test.ts +549 -162
  571. package/src/modules/workspace/agent-access.gate.ts +1 -1
  572. package/src/modules/workspace/file-readers/__tests__/doc-extract.service.test.ts +10 -0
  573. package/src/modules/workspace/file-readers/doc-extract.service.ts +71 -38
  574. package/src/modules/workspace/index.ts +20 -0
  575. package/src/modules/workspace/nul-scan.ts +50 -0
  576. package/src/modules/workspace/pattern-matcher.contract.ts +123 -32
  577. package/src/modules/workspace/ripgrep-search.ts +715 -0
  578. package/src/modules/workspace/ripgrep-version.ts +35 -0
  579. package/src/modules/workspace/startup/__tests__/beside-checkout.test.ts +11 -0
  580. package/src/modules/workspace/startup/beside-checkout.ts +13 -5
  581. package/src/modules/workspace/worker-pool.ts +3 -4
  582. package/src/modules/workspace/workspace-tmp.ts +457 -0
  583. package/src/modules/workspace/workspace.routes.ts +6 -27
  584. package/src/modules/workspace/workspace.service.ts +92 -15
  585. package/src/modules/workspace/workspace.tools.ts +574 -176
  586. package/src/shared/__tests__/read-capped.test.ts +68 -0
  587. package/src/shared/oauth-token-error.ts +46 -0
  588. package/src/shared/path-order.ts +37 -8
  589. package/src/shared/read-capped.ts +40 -0
  590. package/starter-packs/engineering/Plugins/engineering-starter/access.md +1 -1
  591. package/starter-packs/general/Plugins/general-starter/access.md +1 -1
  592. package/starter-packs/operations/Plugins/operations-starter/access.md +1 -1
  593. package/starter-packs/sales/Plugins/sales-starter/access.md +1 -1
  594. package/starter-packs/support/Plugins/support-starter/access.md +1 -1
  595. package/agent-guide/finding-things.md +0 -7
  596. package/agent-guide/introduction.md +0 -27
  597. package/dist/modules/workspace/bounded-matcher.d.ts +0 -73
  598. package/dist/modules/workspace/bounded-matcher.d.ts.map +0 -1
  599. package/dist/modules/workspace/bounded-matcher.js +0 -200
  600. package/dist/modules/workspace/bounded-matcher.js.map +0 -1
  601. package/src/modules/workspace/__tests__/bounded-matcher.test.ts +0 -213
  602. package/src/modules/workspace/bounded-matcher.ts +0 -271
@@ -1,145 +1,115 @@
1
1
  ## Access control
2
2
 
3
- Access to any path — reading it as much as writing it — is governed by
4
- `roles.yaml` (who has which role), `groups.yaml` (who is in which group) and
5
- `access.md` files (who may do what, where).
3
+ Who may read and change each path, on every branch, is set by three kinds of
4
+ file: `roles.yaml` (who holds which role), `groups.yaml` (who is in which
5
+ group) and `access.md` files (who may do what, where). A folder everyone may
6
+ read and the Platform Team may change has this `access.md`:
6
7
 
7
- - **Roles** in `roles.yaml` map a role name to a list of members: emails, and
8
- `group:<Name>` entries that give the role to a whole group (see *Giving a
9
- role to a group* below). Role names are
10
- case- and whitespace-insensitive (`Admin` = `admin` = `ADMIN`; `Product Team`
11
- = `product team`). The reserved names `deny` and `everyone` cannot be used, and neither can
12
- names starting with `role/` or `plugin/` — those spellings are tokens in
13
- access entries (below). One exception to the file's authority: the
14
- **deployment admin** — the address the server configuration sets as
15
- `ADMIN_EMAIL` — is **always an Admin**, whether or not `roles.yaml` lists
16
- it, and taking it out of the file does not change that. It is the rescue
17
- path for a `roles.yaml` that has lost its last Admin. The App roles page
18
- shows that account under Admin as a fixed member that cannot be added or
19
- removed there; every other Admin membership is exactly what the file says,
20
- and removing one takes effect on that person's next request.
21
- - **Plugins are grantable principals.** `plugin/<name>/read`,
22
- `plugin/<name>/write` and `plugin/<name>/owner` in any access file mean
23
- everyone who currently holds that verb on the plugin whose manifest `name`
24
- is `<name>`, derived live from the plugin's own `access.md`. Any spelling
25
- folds to the identifier (`plugin/GTM/read` and `plugin/gtm/read` are one
26
- principal). This is how a shared skill is made visible to a plugin's
27
- members: `read: plugin/gtm/read` on the skill's folder.
28
- Adding or removing someone on the plugin changes what they can read
29
- everywhere the token is granted, with no copying.
30
- - **Access rules** live in `access.md` files, which carry **two blocks with two
31
- scopes**: the BODY (below the closing `---`) declares the rules for the
32
- folder the file sits in, and the FRONTMATTER declares who may read and
33
- write that `access.md` itself. Each block names verbs (`read`, `write`,
34
- `download`, `owner`) whose entries are either grants (a bare principal) or
35
- denials (the lowercase word `deny`, a space, then the principal).
36
- Capitalised forms like `Deny` are *not* triggers; they are treated as part
37
- of a name.
38
- - **Principals** are a role name from `roles.yaml`, a group name from
39
- `groups.yaml`, a person as `Name <email>`, a plugin token (above), or
40
- **`everyone`** — the built-in org-wide principal: every signed-in person and
41
- their agents. `read: everyone` in a folder's BODY opens that folder to the
42
- whole organisation; it is how an organisation-wide skill or plugin is
43
- shared. The same line in a file's FRONTMATTER only makes that one file
44
- visible — a plugin's `access.md` ships with `read: everyone` in its
45
- frontmatter so the plugin can be found and joined, and that admits nobody
46
- to the plugin itself. A person's personal plugin
47
- (`{{pluginsDir}}/personal-<id>/`) grants its owner access and denies
48
- `everyone` outright, so opening a parent folder never opens it.
49
- When a group and a role share a name, the bare name means the GROUP;
50
- `role/<Name>` (for example `deny role/Reviewer`) always means the role.
51
- - **Keep an `access.md` body pure YAML**, with any explanation in `#` comments.
52
- A body that does not parse as YAML naming at least one verb is read in the
53
- older format instead, where the FRONTMATTER carried the folder's rules — so a
54
- stray line of prose silently changes which block governs the folder.
55
- - **The verbs nest.** `owner` sits over `write` and `download`; `write` and
56
- `download` each sit over `read` — anyone who may edit a node, or save a copy
57
- of it, may also view it. `write` and `download` say nothing about each other.
58
- The nesting is GRANT-ONLY: a grant of a higher verb confers the lower ones,
59
- but `deny write` or `deny download` says nothing about `read` and never
60
- strips a separate read grant. So `download: Ana <ana@x.io>` alone lets Ana
61
- open the node as well as download it, and a `deny download` beside an
62
- inherited read leaves her able to open it but not save it.
63
- - **You can only change what you can read.** Nothing is created, changed,
64
- moved into or removed from a place the caller cannot read — on every
65
- branch, drafts included, whatever `write:` rules say. A write tool refused
66
- for this says so (`write-denied`, naming the unreadable folder), and
67
- proposing is not offered either: a proposal into a folder its author cannot
68
- see would vanish from them the moment it landed. Two exceptions. A NEW
69
- FOLDER directly under `{{knowledgeBaseDir}}/`, `{{skillsDir}}/` or
70
- `{{pluginsDir}}/`: anyone may start one, whatever the root's rules grant
71
- them, and the new folder's `access.md` is seeded with the creator's own
72
- `read:` grant so what they put there is visible to them (a loose FILE
73
- directly at a root has no folder to carry that grant and is not excepted).
74
- And an Admin — or the deployment owner — may change the files directly in
75
- the repository root (`roles.yaml`, `access.md`, `groups.yaml`, …) even when
76
- the root grants read to nobody: the same rescue the write
77
- floor gives them, so a tree whose root rules lock everyone out stays
78
- repairable from inside the app. That rescue stops at the root; a subfolder
79
- an admin cannot read is closed to them like to anyone else.
80
- - **Resolution** walks repo root → file directory, accumulating per-principal
81
- state. User-level entries trump role-level entries. A role denial removes
82
- only that role's contribution; it does not undo grants from other roles.
83
- - **`roles.yaml` is editable only by Admin** — hard-coded in the resolver,
84
- never overridable by an `access.md`.
85
- - **`access.md` files are picked up at any depth**, so a folder can tighten or
86
- widen what it inherited from its parent.
87
- - **Per-file rules exist for Markdown notes and `.tool` definitions.** A note
88
- (`.md`, lowercase) may name verbs in its own frontmatter, and those rules
89
- apply to that one note; a `.tool` definition keeps the access verbs in its
90
- own YAML the same way; a distribution may register further file kinds
91
- that carry their own rules. Any other file (a PDF, a presentation, a
92
- spreadsheet, an image, any binary, a `.markdown` or `.MD` file, or binary
93
- content saved as `.md`) takes its folder's rules: sharing it on its own is refused with
94
- `folder-governs-access`, naming the folder. To change who
95
- can open such a file, change its folder's `access.md`, or move the file to a
96
- folder whose rules fit.
97
-
98
- Rules are enforced at runtime; a malformed `roles.yaml` or `access.md` surfaces
99
- when access is resolved.
8
+ ```yaml
9
+ ---
10
+ owner:
11
+ - role/Admin
12
+ ---
13
+ read:
14
+ - everyone
15
+ write:
16
+ - group/Platform Team
17
+ ```
100
18
 
101
- ### Roles are pre-set — a "new role" is usually a group
19
+ - **An `access.md` has two blocks.** The body, below the closing `---`, holds
20
+ the rules for the folder the file sits in. The frontmatter above it says who
21
+ may read and change that `access.md` itself. Keep the body pure YAML, with
22
+ any explanation in `#` comments: a body that does not parse as YAML naming at
23
+ least one verb is read in an older format, where the frontmatter carried the
24
+ folder's rules.
25
+ - **Verbs and entries.** The verbs are `read`, `write`, `download` and
26
+ `owner`. Each verb takes a list, one entry per line, as above: a one-line
27
+ value such as `write: everyone` does not parse, and the whole file is
28
+ skipped. Each entry is a grant (a principal) or a denial (the lowercase word
29
+ `deny`, a space, then the principal). `Deny` with a capital is part of a
30
+ name, not a denial.
31
+ - **Verbs nest.** `owner` includes `write` and `download`, and each of those
32
+ includes `read`: a grant gives the verbs below it, so a `download` grant
33
+ alone lets a person open a page as well as save a copy.
34
+ A denial takes away the verbs above it: `deny read` also removes `write`,
35
+ `download` and `owner`, and `deny write` removes `owner`. `deny write` and
36
+ `deny download` never remove `read`.
37
+ - **Principals** are a role (`role/<Name>`, from `roles.yaml`), a group
38
+ (`group/<Name>`, from the active group source), a person as
39
+ `Name <email>`, a plugin token, or **`everyone`**: every signed-in
40
+ person and their agents. `everyone` under `read` in a folder's body opens the
41
+ folder to the organisation; in a file's frontmatter it only makes that file
42
+ visible (a plugin's `access.md` has it there so the plugin can be found and
43
+ joined, which admits nobody to the plugin). Write roles and groups with
44
+ their prefix, as the app does: a bare name means the role when one has that
45
+ name, the group otherwise, in a denial too. A person's
46
+ personal plugin (`{{pluginsDir}}/personal-<id>/`) grants its owner access and
47
+ denies `everyone` outright, so opening a parent folder never opens it.
48
+ - **Plugin tokens.** `plugin/<name>/read`, `plugin/<name>/write` and
49
+ `plugin/<name>/owner` mean everyone the body of that plugin's own
50
+ `access.md` grants that verb or a higher one (grants inherited from folders
51
+ above the plugin, and `deny` lines, do not count). `<name>` is the
52
+ manifest's `name`, in any spelling. This is how a shared skill reaches a
53
+ plugin's members: `plugin/gtm/read` under `read` on the skill's folder.
54
+ - **The nearest rule decides, verb by verb.** For a path and a verb, the
55
+ platform looks at the file's own rules (below), then its folder's
56
+ `access.md`, then each folder above, up to the root, and the first one that
57
+ says anything about you for that verb decides; a nearer `read` rule leaves a
58
+ `write` grant from a folder above in force. Within
59
+ one file, a rule naming you beats one for your roles or groups; a grant
60
+ through one of your roles beats a denial through another; `everyone` comes
61
+ last. No rule anywhere means no access: a folder no rule opens to you is
62
+ invisible to you.
63
+ - **Per-file rules** exist for markdown notes (`.md`, lowercase) and `.tool`
64
+ files: verbs in a note's frontmatter, or in a `.tool`'s YAML, apply to that
65
+ file alone. Any other file (a PDF, an image, a spreadsheet, a `.markdown` or
66
+ `.MD` file) takes its folder's rules, and sharing it on its own is refused
67
+ with `folder-governs-access`, naming the folder. Change the folder's rules,
68
+ or move the file to a folder whose rules fit.
69
+ - **You can only change what you can read**, on every branch, drafts
70
+ included, whatever `write` says. Such a write is refused with `write-denied`,
71
+ naming the place you cannot read, and proposing it is not offered: it would
72
+ vanish from you the moment it landed. Two exceptions. Anyone may start a new
73
+ folder directly under `{{knowledgeBaseDir}}/`, `{{skillsDir}}/` or
74
+ `{{pluginsDir}}/`, and its `access.md` is seeded with the creator's own read
75
+ grant (a loose file directly at a root is not excepted); on a protected
76
+ branch you still need write there, so start it on a draft. And an Admin may
77
+ always change the files at the repository root (`roles.yaml`, `access.md`,
78
+ `groups.yaml`), so a tree that locks everyone out stays repairable.
79
+ - **Broken rules.** A `roles.yaml` that does not parse stops access from
80
+ resolving until it is fixed. An `access.md` that does not parse is skipped
81
+ (its folder then follows the folders above it) with no error you can see, so
82
+ after editing one, check the result with `file_stat` and `explainAccess`.
83
+
84
+ ### Roles are pre-set: a "new role" is usually a group
102
85
 
103
86
  **What a role is.** A role in `roles.yaml` is an app role: a capability the
104
- platform defines and acts on (`Admin` is one), listed with the people who hold
105
- it. The set of roles is pre-set by the platform. A role is not a way to name a
106
- team.
87
+ platform defines and acts on (`Admin` is one), with the people who hold it. The
88
+ set of roles is pre-set. A role is not a way to name a team. The deployment
89
+ admin (the server's `ADMIN_EMAIL`) is always an Admin, whatever the file says.
107
90
 
108
- **Agents never create roles.** Add people to a role that already exists, or
109
- remove them, and nothing more: never add a role name to `roles.yaml`, and never
110
- rename one — a rename is a delete plus a create. Such a write is refused with a
111
- 422 that names the role and says: app roles are pre-set — add people to
91
+ **Agents never create roles.** Add people to a role that exists, or remove
92
+ them, and nothing more: never add or rename a role in `roles.yaml`. Such a
93
+ write is refused with a 422 saying that app roles are pre-set: add people to
112
94
  existing roles, and use a GROUP for a task- or team-scoped set of people.
113
- Relay that refusal to your user as it stands; do not look for another way to
114
- write the file.
115
-
116
- **Is it really a group?** When someone asks for a "new role", it almost always
117
- is. It is a group when any of these hold:
118
-
119
- - the name says who the people are — a team, a project, a customer, a
120
- committee — rather than a capability the platform already has;
121
- - it would change or disappear when the project ends or the team reshuffles;
122
- - its purpose is to give those people access to some folders or files.
95
+ Relay that to your user as it stands.
123
96
 
124
- A request that matches a role that already exists is membership, not a new
125
- role.
97
+ **Is it really a group?** It is when the name says who the people are (a team,
98
+ a project, a customer) rather than a capability the platform has, when it
99
+ would change when the project ends or the team reshuffles, or when its purpose
100
+ is to give those people access to some folders.
126
101
 
127
- **What to do instead.**
128
-
129
- 1. If an existing role already carries the capability, add the people to it.
130
- 2. Otherwise make it a group: add or extend the group in `groups.yaml` (or
131
- point your user at the app's Groups page), then grant the group in the
132
- `access.md` of the folders it should reach.
133
- 3. If your user still needs a role the platform does not have, that is not an
134
- edit you can make — say so, and leave the decision to an admin.
102
+ **What to do instead.** Add the people to an existing role that carries the
103
+ capability. Otherwise make it a group: add it to `groups.yaml` (or point your
104
+ user at the app's Groups page), then grant the group in the `access.md` of the
105
+ folders it should reach. A role the platform does not have is an admin's
106
+ decision, not an edit you can make.
135
107
 
136
108
  ### Giving a role to a group
137
109
 
138
- A role's member list takes a group as well as individual emails. Write the
139
- entry as `- group:<Name>`, where `<Name>` is a group in the active group
140
- source — `synced-groups.yaml` when the deployment syncs groups from an
141
- identity provider, `groups.yaml` otherwise. Here a `Reviewer` role the
142
- deployment already has goes to a whole group:
110
+ A role's members may include a group: write `- group:<Name>`, naming a group
111
+ in the active group source (`synced-groups.yaml` when groups are synced from
112
+ the organisation's directory, `groups.yaml` otherwise):
143
113
 
144
114
  ```yaml
145
115
  roles:
@@ -150,167 +120,54 @@ roles:
150
120
  - group:Platform Team
151
121
  ```
152
122
 
153
- - **Matching.** The name is matched case- and whitespace-insensitively against
154
- the active group source, like role names: `group:platform team` and
155
- `group:Platform Team` are the same entry as `group:Platform Team`.
156
- - **Unknown groups are refused.** An entry naming a group the active source
157
- does not declare is a validation error: the write is refused with a 422
158
- that names the entry and its role (`'- group:Platfrom Team' under role
159
- 'Reviewer'`), and nothing is saved. Create the group first, or fix the name.
160
- - **A group under `Admin` makes every member a full admin** — including anyone
161
- added to the group later, and including the right to edit `roles.yaml`
162
- itself. Only make that edit when your user is an Admin and explicitly asks
163
- for exactly that, and say so in the commit summary; for anyone else, tell
164
- them what it would mean and who can do it (below). `Admin` must also always keep at least one
165
- direct email member; a group entry alone is not enough, so a broken
166
- directory can never leave the deployment without an admin.
167
- - **With direct emails.** Group entries and emails add up: the role's members
168
- are everyone listed by email plus everyone currently in each listed group.
169
- A person in both is simply a member; adding or removing someone from the
170
- group changes the role with no edit to `roles.yaml`.
171
- - **With denials.** Group members hold the role's grants exactly as if they
172
- were listed by email. A denial of the role in an `access.md`
173
- (`deny role/Reviewer`) therefore removes the role's contribution for
174
- everyone in the group, as it does for the emails. Write the `role/` form:
175
- a bare `deny Reviewer` would deny a group named `Reviewer` instead, if one
176
- exists. The nearest `access.md` that says
177
- anything about the person decides: a person granted by name
178
- (`Name <email>`) in the SAME `access.md` as the denial keeps that access,
179
- because within one file a person's own entry beats a role entry. A grant by
180
- name in a folder further up does not survive a role denial closer to the
181
- file.
182
-
183
- **Only an Admin changes `roles.yaml`, and only on the default branch.** A
184
- change request cannot carry the edit: when a request is merged, `roles.yaml`
185
- is restored to what the default branch has, so a role edit drafted on a
186
- branch is dropped at the merge without a word. Do not propose one. If your
187
- user is an Admin, `edit_file` the file on the default branch directly — for
188
- example, to give the Reviewer role to a group, add the entry under the
189
- existing role:
190
-
191
- ```yaml
192
- roles:
193
- Admin:
194
- - dana@example.com
195
- Reviewer:
196
- - lee@example.com
197
- - group:Platform Team # added
198
- ```
199
-
200
- If your user is not an Admin, tell them who is (the `Admin` entries in
201
- `roles.yaml`) and that the change is made in the app's Roles page or by an
202
- admin editing the file; do not open a change request for it.
123
+ - **Matching** is case- and whitespace-insensitively against the active group
124
+ source, as for role names.
125
+ - **An unknown group is a validation error**: the write is refused with a 422
126
+ naming the entry and its role, and nothing is saved.
127
+ - **A group under `Admin` makes every member a full admin**, including anyone
128
+ added to the group later. Make that edit only when your user is an Admin and
129
+ asks for exactly that, and say so in the summary. `Admin` must keep at least
130
+ one member listed by email.
131
+ - **Members add up**: the role's members are the emails listed plus everyone
132
+ currently in each group.
133
+ - **A denial** of the role (`deny role/Reviewer`) removes the role's
134
+ contribution for everyone in the group, as for the emails. To deny the
135
+ group instead, write `deny group/Platform Team`.
136
+
137
+ **Only an Admin changes `roles.yaml`, on a protected branch, directly.** On a
138
+ draft anyone who can read the file may save it, but a merge puts back the
139
+ target branch's copy, so a role edit drafted on a branch is dropped without a
140
+ word. Do not propose one. If your user is an Admin, `edit_file` the file on
141
+ `{{defaultBranch}}`. If not, tell them who the Admins are (the `Admin` entries)
142
+ and that the change is made in the app's Roles page or by an Admin.
143
+
144
+ ### Before you say or change who has access
145
+
146
+ Look it up, folder by folder: one folder's rules say nothing about another's.
147
+ `file_stat` on each path that matters, with `explainAccess: true`, lists who
148
+ holds each verb (`roster`, when you may manage the path's access); the active
149
+ group source (`synced-groups.yaml` when groups are synced, `groups.yaml`
150
+ otherwise) says who is in each group, the person you are helping included. It
151
+ does not judge one named person for you. Then name the people: who can do it
152
+ now and, for a move or a rule change, who gains and who loses. When they
153
+ already have it, say so and change nothing.
203
154
 
204
155
  ### Direct writes vs change requests
205
156
 
206
- File-level write access decides how a change lands on the default branch:
207
-
208
- - A user — or an agent acting as that user — whose access resolution grants
209
- **write or owner on every file the change touches** may commit **directly**
210
- to the default branch.
211
- - Without that access, the change goes through a **branch + change request**,
212
- approved by an owner / write-access holder of the affected files — every
213
- affected file with an eligible approver needs that approval, whatever its
214
- type (notes, binary files, files without an extension).
215
- - Agents carry exactly their user's access, never more. Before writing to the
216
- default branch, **ask the user** whether to write directly or go through the
217
- review flow — and prefer a change request when in doubt, when the change is
218
- large, or when it touches content the user does not own.
157
+ - A person, or an agent acting for them, with **write or owner on every file a
158
+ change touches** may write directly to a protected branch. Prefer a change
159
+ request when in doubt, when the change is large, or when it touches content
160
+ they do not own.
161
+ - Without that access, the change goes through a **draft and a change
162
+ request**, approved by an owner or writer of each affected file that has one.
163
+ Agents carry exactly their user's access, never more.
219
164
  - **Check `canWrite` before offering a direct write.** `list_skills` reports
220
- it for a skill's `SKILL.md`; `get_skill` for every file of the skill (or,
221
- with `file`, for that one file alone — never read a file's verdict as the
222
- whole skill's); `list_files` and `read_file` per path. The verdict says
223
- whether the user may commit that change directly on the default branch,
224
- under the rules committed there — the same answer on a draft, where anyone
225
- who can read may write. `canWrite: false` means use a branch and a change
226
- request; do not offer a direct write. A read-only connection gets `false`
227
- everywhere and can do neither. To explain a verdict, call `file_stat` on
228
- the DEFAULT branch with `explainAccess: true`: it says why, and — when you
229
- can manage that path's access — who holds each verb: who can approve.
230
- The one exception is `roles.yaml`: a change request cannot carry that edit
231
- (see above), so `canWrite: false` there means the change is an Admin's to
232
- make, in the app's Roles page or directly on the default branch — do not
233
- open a request for it.
234
-
235
- ### An agent proposes and syncs; a person merges
236
-
237
- - **Propose** with `open_change_request`, then give the user the request's
238
- `url`. Reviewing, approving and merging a change request happen in the app,
239
- by a person — no agent tool approves a file, bypasses approval, or merges a
240
- request. `merge_change_request` no longer exists.
241
- - **Edit** an open request's title or description with `update_change_request`
242
- — its author, or anyone who may merge it (an Admin, or someone who may
243
- approve every file it changes); anyone else is refused, and so is a merged or
244
- closed request. `description` replaces the request's description (the `body`
245
- `get_change_request` answers) whole; readers see the new text at once.
246
- - **Sync** a draft with `update_branch` on the draft, `from` = the branch the
247
- request targets. This is allowed while the draft's request is open, and is
248
- how you bring it up to date. Left out, `from` is the draft's own shared
249
- state: for when it moved while your workspace held commits of its own
250
- (`branch_status` says `behindRemote`). `merge_branch` (`source` = the
251
- target, `target` = the draft) does the same without conflict handling.
252
- - **Resolve conflicts** where `update_branch` answers `conflicts`: for every
253
- conflicted path it carries the file at the merge base, on your side and on
254
- theirs, and the working copy with git's markers — and it has left the draft
255
- exactly as it was. A side is null when that side has no file, or when
256
- `truncated` names it (too large, or not text): then read `ours` with
257
- `read_file` (it is the draft's own file), `theirs` with `read_file_at` at
258
- `from` (the branch, not a commit — its tip is not on the draft's history
259
- until the merge lands), and `base` with `read_file_at` at the answer's
260
- `mergeBase`. A side that is not text cannot be read that way (those
261
- reads are text-only): settle such a file whole, with `choose` — `content`
262
- is for text. A conflicted file you may not read on one of the two
263
- branches is left out and only counted (`withheldConflicts`): it is not
264
- yours to settle, so ask a person who can read it to update the draft in
265
- the app. Decide each
266
- file shown (keep both sides' information unless one is clearly stale;
267
- `list_file_changes` says who changed what and why), then call
268
- `update_branch` again **with the same `from`** and `resolutions`, one per
269
- conflicted path: `content`, the resolved text, or `choose` (`ours`,
270
- `theirs`, `delete`). A resolution is a write on your draft: you must be
271
- able to read the file at both commits the answer names (`ours`, the
272
- draft's; `theirs`, the merged-in branch's), and it takes the rule every
273
- save on a draft takes — you may read the file, or it is new — never a
274
- write permission. It merges, commits as you and publishes. A publish the
275
- host refuses, or a replay that conflicts because the shared branch moved
276
- meanwhile, answers with the saved-locally error: the merge is committed
277
- on your draft but NOT shared — `branch_status` shows it ahead. Do not
278
- report the draft as shared then; the next save or `share_current_branch`
279
- carries the commit, and a replay that conflicts is handed to recovery.
280
- Nothing else is written that way: an ordinary edit goes through the file
281
- tools. You have no git command; there is never a half-done merge on disk
282
- for you to finish.
283
- - `merge_branch` refuses to merge a draft into the branch its open change
284
- request targets — it names the request; ask the user to review it in the
285
- app. Into a protected branch it merges only what you could commit there
286
- directly, under the rule above — and never a change to `roles.yaml`, whoever
287
- you are: roles are changed in the app, not merged in from a draft.
288
- - **Know where a draft stands** with `branch_status`: ahead/behind, whether
289
- the shared branch moved, the files written but not committed yet, the
290
- protected branch it was forked from, and `changedPaths` — what it changes
291
- against that base, the files a change request would carry. The list holds
292
- only the files you may read; `withheldPaths` counts the rest, so when it
293
- is above zero the list is not the request's whole set. Ask it before
294
- proposing a draft.
295
- - **Read history** with `list_file_changes` (a file's commits: who, when,
296
- subject), `read_file_at` (the file at a commit, or on another branch) and
297
- `compare_file` (the diff of a commit, or between two branches). Each takes
298
- the read the file itself takes. To put an earlier version back, read it
299
- with `read_file_at` and write it with `write_file`.
300
- - **Delete** a draft with `delete_branch`, which removes it for everyone. Only
301
- its author (`<email-localpart>/…`, or your own `suggestions/…` bundle) or an
302
- Admin may. Preview with `dryRun: true` first: it changes nothing and says
303
- whether the delete would go through, how many commits are not on the default
304
- branch, and the last commit. A branch holding such commits is refused unless
305
- you pass `discardUnmerged: true` — only when the user wants that work gone. An
306
- open change request from or into the branch that proposes nothing is closed
307
- by the delete. One that still proposes something refuses it, with a link:
308
- its author can withdraw it, or an Admin can decline it, in the app — hand the
309
- user that link. A request you cannot see is not named, and a preview leaves
310
- it out, so a delete can still be refused after a clean preview. Hand the user the
311
- `lastCommit` it answers, so the branch can be restored. The server removes a
312
- draft on its own once its change request was merged, but only while nothing
313
- has happened to it since: no commit that is not on the default branch, no
314
- request open from or into it, no save still landing, no file held for
315
- editing, and its last commit
316
- the one that was merged. Any other draft stays until someone deletes it.
165
+ it for a skill's `SKILL.md`; `get_skill` for every file of the skill (or, with
166
+ `file`, for that file alone); `list_files` and `read_file` per path. It
167
+ answers for `{{defaultBranch}}` under the rules committed there, whichever
168
+ branch you read. `false` means use a draft and a change request. A read-only
169
+ connection gets `false` everywhere and can do neither. To explain a verdict,
170
+ call `file_stat` on `{{defaultBranch}}` with `explainAccess: true`: it says
171
+ why, and, when you may manage that path's access, who holds each verb (who
172
+ can approve). For `roles.yaml`, `false` means an Admin's change, not a
173
+ request.
@@ -1,35 +1,33 @@
1
1
  ## Conventions
2
2
 
3
- These are conventions, not validations — nothing rejects a file for breaking
4
- them. They exist because a knowledge base people can navigate beats one that is
5
- merely correct.
3
+ These are conventions, not validations: nothing rejects a file for breaking
4
+ them. They exist because a knowledge base people can find their way around
5
+ beats one that is merely correct.
6
6
 
7
7
  1. **Descriptive file names.** `Weekly-Sync-2026-03-14.md` beats `notes3.md`.
8
- Avoid spaces; they survive git fine but make links noisier to read.
8
+ Avoid spaces: a link to a name with a space needs `%20` in its place.
9
9
 
10
- 2. **Markdown links between documents.** Use
11
- `[Page Name](relative/path/to/Page.md)`, relative to the LINKING file's
12
- directory rather than the repo root, so links resolve both in the app and on
13
- the git host.
14
- `move_file` keeps most of them working: it rewrites the links inside the
15
- moved files and those in the other markdown pages it searches, and names
16
- what it left — HTML pages, raw HTML inside a markdown page, and pages you
17
- may not change. It does not search
18
- `transcripts/` or `probes/` folders, and pages you cannot read are neither
19
- searched nor named (the answer only says such pages may exist); links there
20
- can still point at the old path. Paths written in prose or code are not
21
- links, and a move leaves them as they are.
10
+ 2. **Markdown links between documents.** Write `[Page Name](relative/path/Page.md)`,
11
+ relative to the folder of the page that holds the link, so it resolves in
12
+ the app and on the git host. When you read a link, resolve it the same way.
13
+ `move_file` keeps most links working: it rewrites the links in the moved
14
+ files and in the other markdown pages it searches, and names what it left:
15
+ HTML pages, raw HTML inside a page, and pages you may not change. It leaves
16
+ `transcripts/` and `probes/` folders alone, even files moved out of them,
17
+ and pages you cannot read (the answer only says such pages may exist). A
18
+ move that would edit links in more than 200 files is refused unless you pass
19
+ `rewriteLinks: false`. Paths written in prose or code are not links.
22
20
 
23
- 3. **Absolute dates.** `YYYY-MM-DD`, never "last Tuesday" — a saved file
21
+ 3. **Absolute dates.** `YYYY-MM-DD`, never "last Tuesday": a saved file
24
22
  outlives the moment it was written.
25
23
 
26
- 4. **Search before creating.** If a document on the subject exists, extend it
27
- rather than starting a rival.
24
+ 4. **Search before creating.** `grep` for the subject and `list_files` the
25
+ folder first. If a page on the subject exists, extend it rather than start
26
+ a rival.
28
27
 
29
- 5. **Preserve what is there.** Append or edit sections; do not overwrite a file
30
- wholesale unless asked to.
28
+ 5. **Preserve what is there.** Append or edit sections; do not overwrite a
29
+ file wholesale unless asked to.
31
30
 
32
- 6. **Say where it came from.** When a claim rests on a specific source — a
33
- person, a ticket, a document, a URL — name it inline near the claim, with
34
- the date it was true. The next reader's first question is "says who, and is
35
- it still true?".
31
+ 6. **Say where it came from.** When a claim rests on a source (a person, a
32
+ ticket, a document, a URL), name it next to the claim, with the date it was
33
+ true. The next reader's first question is "says who, and is it still true?".