@amsterdamdatalabs/adl-agent-control-linux-x64 0.1.12 → 0.1.28

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 (410) hide show
  1. package/bin/adl +2 -2
  2. package/bin/git +16 -17
  3. package/bin/git-ado +25 -24
  4. package/bin/git-defaults +173 -0
  5. package/bin/health-check +8 -1
  6. package/bin/kimi-hooks +1 -1
  7. package/bin/lib/adl-package.sh +257 -0
  8. package/bin/lib/fleet-host.sh +8 -5
  9. package/bin/reconcile +482 -232
  10. package/bin/reconcile-host +30 -20
  11. package/bin/setup +20 -17
  12. package/bin/shell-path-policy +15 -5
  13. package/bin/sync-and-reconcile +62 -64
  14. package/bin/validate-manifest +33 -9
  15. package/package.json +2 -10
  16. package/packages/agent-hooks/README.md +14 -9
  17. package/packages/agent-hooks/assets/hooks.json +0 -20
  18. package/packages/agent-hooks/src/cli/args.ts +1 -1
  19. package/packages/agent-hooks/src/cli/doctor.ts +6 -58
  20. package/packages/agent-hooks/src/deploy/deploy.ts +12 -41
  21. package/packages/agent-hooks/src/deploy/doctor.ts +8 -11
  22. package/packages/agent-hooks/src/deploy/index.ts +14 -14
  23. package/packages/agent-hooks/src/deploy/json-merge.ts +7 -8
  24. package/packages/agent-hooks/src/deploy/legacy-lock.ts +2 -2
  25. package/packages/agent-hooks/src/deploy/list.ts +1 -1
  26. package/packages/agent-hooks/src/deploy/lock.ts +31 -12
  27. package/packages/agent-hooks/src/deploy/profile.ts +3 -4
  28. package/packages/agent-hooks/src/deploy/source.ts +1 -1
  29. package/packages/agent-hooks/src/gating/config.ts +12 -24
  30. package/packages/agent-hooks/src/gating/root.ts +3 -3
  31. package/packages/agent-hooks/src/hooks/briefing/handler.ts +2 -2
  32. package/packages/agent-hooks/src/hooks/briefing/index.ts +27 -287
  33. package/packages/agent-hooks/src/hooks/contract.ts +17 -17
  34. package/packages/agent-hooks/src/hooks/crg/background.ts +27 -0
  35. package/packages/agent-hooks/src/hooks/crg/index.ts +7 -6
  36. package/packages/agent-hooks/src/hooks/log.ts +8 -10
  37. package/packages/agent-hooks/src/hooks/user-prompt-submit/match.ts +1 -1
  38. package/packages/agent-hooks/src/hooks/user-prompt-submit/tokenizer.ts +1 -1
  39. package/packages/agent-hooks/src/hooks/user-prompt-submit/vector.ts +6 -5
  40. package/packages/agent-hooks/src/hosts/registry.ts +1 -1
  41. package/packages/agent-hooks/src/log/adl-dir.ts +44 -0
  42. package/packages/agent-hooks/src/log/writer.ts +16 -2
  43. package/packages/agent-hooks/src/main.ts +7 -41
  44. package/packages/agent-hooks/src/pre-tool-use/handler.ts +71 -82
  45. package/packages/agent-hooks/src/rules/engine.ts +13 -17
  46. package/packages/agent-hooks/src/rules/impl/adl-build-run-denied.ts +3 -3
  47. package/packages/agent-hooks/src/rules/impl/adl-git-credential-bypass.ts +12 -14
  48. package/packages/agent-hooks/src/rules/impl/adl-git-identity.ts +28 -28
  49. package/packages/agent-hooks/src/rules/impl/adl-git-push-policy.ts +8 -9
  50. package/packages/agent-hooks/src/rules/impl/adl-human-azdo-bypass.ts +56 -59
  51. package/packages/agent-hooks/src/rules/impl/adl-identity.ts +16 -23
  52. package/packages/agent-hooks/src/rules/impl/adl-mcp-cli.ts +19 -16
  53. package/packages/agent-hooks/src/rules/impl/adl-pr-complete-pending.ts +2 -2
  54. package/packages/agent-hooks/src/rules/impl/adl-pr-review-role.ts +9 -12
  55. package/packages/agent-hooks/src/rules/impl/adl-pr-role.ts +5 -7
  56. package/packages/agent-hooks/src/rules/impl/adl-run-required.ts +411 -0
  57. package/packages/agent-hooks/src/rules/impl/adl-token-minting-role.ts +4 -5
  58. package/packages/agent-hooks/src/rules/impl/adl-workitem-role.ts +6 -7
  59. package/packages/agent-hooks/src/rules/impl/agent-tamper-protection.ts +77 -70
  60. package/packages/agent-hooks/src/rules/impl/deny-allowlist.ts +131 -0
  61. package/packages/agent-hooks/src/rules/impl/git-helpers.ts +21 -23
  62. package/packages/agent-hooks/src/rules/impl/git-worktree.ts +14 -28
  63. package/packages/agent-hooks/src/rules/impl/mcp-tool.ts +3 -3
  64. package/packages/agent-hooks/src/rules/impl/messages.ts +1 -1
  65. package/packages/agent-hooks/src/rules/impl/pr-completion.ts +1 -1
  66. package/packages/agent-hooks/src/rules/impl/tool-azure-devops.ts +35 -46
  67. package/packages/agent-hooks/src/rules/impl/tool-find.ts +34 -7
  68. package/packages/agent-hooks/src/rules/impl/tool-grep.ts +33 -12
  69. package/packages/agent-hooks/src/rules/impl/tool-native-search.ts +52 -9
  70. package/packages/agent-hooks/src/rules/ports.ts +5 -7
  71. package/packages/agent-hooks/src/rules/registry.ts +4 -6
  72. package/packages/agent-hooks/src/rules/shell/git-identity.ts +86 -101
  73. package/packages/agent-hooks/src/rules/shell/git-internals.ts +1 -1
  74. package/packages/agent-hooks/src/rules/shell/invocation.ts +24 -118
  75. package/packages/agent-hooks/src/rules/shell/piped-script.ts +1 -1
  76. package/packages/agent-hooks/src/rules/shell/prefixes.ts +1 -1
  77. package/packages/agent-hooks/src/rules/shell/protected-carrier-writes.ts +11 -10
  78. package/packages/agent-hooks/src/rules/shell/protected-carriers.ts +26 -26
  79. package/packages/agent-hooks/src/rules/shell/substitution.ts +1 -1
  80. package/packages/agent-hooks/src/rules/shell/xargs.ts +2 -2
  81. package/packages/agent-hooks/src/rules/spec.ts +2 -2
  82. package/packages/agent-settings/README.md +287 -0
  83. package/packages/agent-settings/assets/GLOBAL-AGENTS.md +14 -16
  84. package/packages/agent-settings/assets/agents/architect.toml +2 -0
  85. package/packages/agent-settings/assets/agents/code-reviewer.toml +2 -0
  86. package/packages/agent-settings/assets/agents/executor.toml +2 -0
  87. package/packages/agent-settings/assets/agents/explore.toml +2 -0
  88. package/packages/agent-settings/assets/agents/planner.toml +2 -0
  89. package/packages/agent-settings/assets/mcp.json +0 -4
  90. package/packages/agent-settings/deploy-profile.json +139 -0
  91. package/packages/agent-settings/deploy-profile.schema.json +147 -0
  92. package/packages/agent-settings/managed/README.md +29 -30
  93. package/packages/agent-settings/managed/codex-requirements.toml +9 -9
  94. package/packages/agent-settings/package.json +20 -0
  95. package/packages/agent-settings/src/deploy/agent-render.ts +2 -2
  96. package/packages/agent-settings/src/deploy/agent-toml.ts +1 -1
  97. package/packages/agent-settings/src/deploy/agents-deploy.ts +17 -3
  98. package/packages/agent-settings/src/deploy/doctor.ts +3 -83
  99. package/packages/agent-settings/src/deploy/index.ts +6 -33
  100. package/packages/agent-settings/src/deploy/legacy-lock.ts +6 -6
  101. package/packages/agent-settings/src/deploy/list.ts +5 -19
  102. package/packages/agent-settings/src/deploy/lock.ts +8 -18
  103. package/packages/agent-settings/src/deploy/mcp-deploy.ts +10 -5
  104. package/packages/agent-settings/src/deploy/mcp-merge.ts +22 -3
  105. package/packages/agent-settings/src/deploy/mcp-source.ts +1 -1
  106. package/packages/agent-settings/src/deploy/profile.ts +11 -35
  107. package/packages/agent-settings/src/deploy/retire-lean-ctx.ts +184 -0
  108. package/packages/agent-settings/src/deploy/settings.ts +17 -22
  109. package/packages/agent-settings/src/global-surface-sweep.ts +0 -2
  110. package/packages/agent-settings/src/kimi-hooks.ts +339 -192
  111. package/packages/agent-settings/src/opencode-hooks.ts +1 -1
  112. package/packages/agent-settings/tsconfig.json +23 -0
  113. package/packages/agent-skills/assets/agent-search-tool-audit/SKILL.md +120 -0
  114. package/packages/agent-skills/assets/agent-search-tool-audit/scripts/audit.sh +276 -0
  115. package/packages/agent-skills/assets/debug-issue/SKILL.md +8 -7
  116. package/packages/agent-skills/assets/explore-codebase/SKILL.md +13 -13
  117. package/packages/agent-skills/assets/refactor-safely/SKILL.md +12 -11
  118. package/packages/agent-skills/assets/review-changes/SKILL.md +7 -7
  119. package/packages/agent-skills/assets/testing/references/e2e.md +37 -0
  120. package/packages/agent-skills/assets/testing/references/integration.md +37 -0
  121. package/packages/agent-skills/assets/testing/references/unit.md +32 -0
  122. package/packages/agent-skills/dist/deploy.d.ts +2 -0
  123. package/packages/agent-skills/dist/deploy.d.ts.map +1 -1
  124. package/packages/agent-skills/dist/deploy.js +27 -1
  125. package/packages/agent-skills/dist/deploy.js.map +1 -1
  126. package/packages/agent-skills/dist/doctor.d.ts +0 -2
  127. package/packages/agent-skills/dist/doctor.d.ts.map +1 -1
  128. package/packages/agent-skills/dist/doctor.js +1 -1
  129. package/packages/agent-skills/dist/doctor.js.map +1 -1
  130. package/packages/agent-skills/dist/fs-utils.d.ts +0 -1
  131. package/packages/agent-skills/dist/fs-utils.d.ts.map +1 -1
  132. package/packages/agent-skills/dist/fs-utils.js +1 -1
  133. package/packages/agent-skills/dist/fs-utils.js.map +1 -1
  134. package/packages/agent-skills/src/deploy.ts +29 -1
  135. package/packages/agent-skills/src/doctor.ts +1 -1
  136. package/packages/agent-skills/src/fs-utils.ts +1 -1
  137. package/packages/azdo/README.md +10 -9
  138. package/packages/azdo/package.json +1 -3
  139. package/packages/azdo/scripts/probe-ado-rules.ts +311 -0
  140. package/packages/azdo/src/azdo-pl.ts +2 -54
  141. package/packages/azdo/src/azdo-pr-review.ts +4 -4
  142. package/packages/azdo/src/azdo-repo-doctor.ts +101 -52
  143. package/packages/azdo/src/azdo-wit.ts +44 -2
  144. package/packages/azdo/src/lib/agent-identity.ts +12 -14
  145. package/packages/azdo/src/lib/agent-token.ts +2 -2
  146. package/packages/azdo/src/lib/client.ts +0 -5
  147. package/packages/azdo/src/lib/graph-identity.ts +4 -4
  148. package/packages/azdo/src/workflow-ladder.csv +241 -0
  149. package/packages/azdo/src/workflow-rules-matrix.csv +85 -0
  150. package/packages/azdo/src/workflow-rules.ts +194 -0
  151. package/packages/fleet/manifest.json +35 -11
  152. package/packages/fleet/manifest.schema.json +62 -10
  153. package/packages/fleet/src/default-agent-file.ts +3 -3
  154. package/packages/fleet/src/install-adl-package.ts +73 -15
  155. package/packages/fleet/src/install-embedding-model.ts +13 -13
  156. package/packages/fleet/src/managed-settings.ts +7 -7
  157. package/packages/fleet/src/repo-maintain.ts +91 -55
  158. package/packages/fleet/src/scratch-reap.ts +5 -5
  159. package/packages/fleet/src/vscode-settings.ts +5 -5
  160. package/packages/repo-controls/README.md +141 -43
  161. package/packages/repo-controls/assets/promote.ts +4 -4
  162. package/packages/repo-controls/assets/reconcile-guard.sh +10 -46
  163. package/packages/repo-controls/assets/version-bump.sh +31 -84
  164. package/packages/repo-controls/bunfig.toml +6 -7
  165. package/packages/repo-controls/package/adl-compliance/AGENTS.md +5 -6
  166. package/packages/repo-controls/package/adl-compliance/conftest.py +3 -1
  167. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/__init__.py +4 -16
  168. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/adr_lifecycle/test_check.py +9 -2
  169. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/closed_set/fixtures/docs/notes.md +1 -0
  170. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/closed_set/test_check.py +11 -0
  171. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/__init__.py +7 -0
  172. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/check.py +266 -0
  173. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-assets/docs/guide/.drafts/c.md +1 -0
  174. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-assets/docs/guide/.drafts/d.md +1 -0
  175. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-assets/docs/guide/.hidden.md +1 -0
  176. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-assets/docs/guide/a.md +1 -0
  177. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-assets/docs/guide/b.md +1 -0
  178. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-assets/docs/guide/data.csv +1 -0
  179. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-assets/docs/guide/diagram.png +1 -0
  180. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-assets/docs/guide/mock.png +1 -0
  181. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-assets/docs/guide/sub/nested.md +1 -0
  182. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-assets/docs.md +1 -0
  183. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-assets/grants.yaml +4 -0
  184. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-assets/plans/deep/p1.md +1 -0
  185. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-assets/plans/deep/p2.md +1 -0
  186. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-assets/plans/deep/p3.md +1 -0
  187. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-assets/plans/deep/p4.md +1 -0
  188. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-assets/plans/deep/p5.md +1 -0
  189. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-clean/docs/architecture/build.md +1 -0
  190. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-clean/docs/architecture/overview.md +1 -0
  191. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-clean/docs/guide/install.md +1 -0
  192. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-clean/docs/guide/start.md +1 -0
  193. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-clean/grants.yaml +4 -0
  194. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-decisions/docs/decisions/adr-001-tenancy.md +1 -0
  195. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-decisions/docs/decisions/adr-002-carrier.md +1 -0
  196. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-decisions/docs/decisions/adr-003-cli.md +1 -0
  197. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-decisions/docs/decisions/archive/adr-000-old.md +1 -0
  198. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-decisions/docs/decisions/archive/adr-000-older.md +1 -0
  199. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-decisions/docs/guide/a.md +1 -0
  200. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-decisions/docs/guide/b.md +1 -0
  201. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-decisions/docs/guide/c.md +1 -0
  202. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-decisions/grants.yaml +4 -0
  203. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-default-cap/docs/guide/page-01.md +1 -0
  204. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-default-cap/docs/guide/page-02.md +1 -0
  205. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-default-cap/docs/guide/page-03.md +1 -0
  206. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-default-cap/docs/guide/page-04.md +1 -0
  207. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-default-cap/docs/guide/page-05.md +1 -0
  208. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-default-cap/docs/guide/page-06.md +1 -0
  209. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-default-cap/docs/guide/page-07.md +1 -0
  210. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-default-cap/docs/guide/page-08.md +1 -0
  211. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-default-cap/docs/guide/page-09.md +1 -0
  212. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-default-cap/docs/guide/page-10.md +1 -0
  213. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-default-cap/docs/guide/page-11.md +1 -0
  214. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-default-cap/docs/guide/page-12.md +1 -0
  215. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-default-cap/docs/guide/page-13.md +1 -0
  216. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-default-cap/docs/guide/page-14.md +1 -0
  217. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-default-cap/docs/guide/page-15.md +1 -0
  218. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-default-cap/docs/guide/page-16.md +1 -0
  219. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-default-cap/grants.yaml +4 -0
  220. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-exempt/docs/guide/a.md +1 -0
  221. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-exempt/docs/guide/b.md +1 -0
  222. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-exempt/docs/guide/c.md +1 -0
  223. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-exempt/grants.yaml +4 -0
  224. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-grew/docs/guide/a.md +1 -0
  225. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-grew/docs/guide/b.md +1 -0
  226. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-grew/docs/guide/c.md +1 -0
  227. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-grew/grants.yaml +4 -0
  228. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-no-section/docs/guide/a.md +1 -0
  229. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-no-section/docs/guide/b.md +1 -0
  230. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-no-section/docs/guide/c.md +1 -0
  231. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-no-section/docs/guide/d.md +1 -0
  232. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-no-section/docs/guide/e.md +1 -0
  233. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-no-section/grants.yaml +4 -0
  234. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-over-cap/docs/guide/a.md +1 -0
  235. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-over-cap/docs/guide/b.md +1 -0
  236. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-over-cap/docs/guide/c.md +1 -0
  237. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-over-cap/docs/short/only.md +1 -0
  238. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-over-cap/grants.yaml +4 -0
  239. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-stale/docs/held/a.md +1 -0
  240. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-stale/docs/held/b.md +1 -0
  241. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-stale/docs/held/c.md +1 -0
  242. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-stale/docs/held/d.md +1 -0
  243. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-stale/docs/shrunk/a.md +1 -0
  244. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-stale/docs/shrunk/b.md +1 -0
  245. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-stale/grants.yaml +6 -0
  246. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-unusable/docs/guide/a.md +1 -0
  247. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-unusable/docs/guide/b.md +1 -0
  248. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-unusable/docs/guide/c.md +1 -0
  249. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-unusable/grants.yaml +3 -0
  250. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/test_check.py +345 -0
  251. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/english_only/check.py +18 -5
  252. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/english_only/test_check.py +35 -0
  253. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/__init__.py +7 -0
  254. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/check.py +91 -0
  255. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/AGENTS.md +3 -0
  256. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/CLAUDE.md +3 -0
  257. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/architecture/-leading-hyphen.md +3 -0
  258. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/architecture/AGENTS.md +3 -0
  259. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/architecture/double--hyphen.md +3 -0
  260. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/architecture/getting started.md +3 -0
  261. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/architecture/nested/page-here.md +3 -0
  262. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/architecture/trailing-hyphen-.md +3 -0
  263. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/architecture/ui-contract.md +4 -0
  264. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/architecture/user_profile.md +3 -0
  265. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/assets/UI-CONTRACT.png +2 -0
  266. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/assets/diagram.png +1 -0
  267. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/index.md +4 -0
  268. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/notes.md +3 -0
  269. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/reference.html +1 -0
  270. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/research/2026-10-experiment.md +3 -0
  271. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/research/UI-CONTRACT.md +6 -0
  272. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs.md +5 -0
  273. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/test_check.py +194 -0
  274. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/indexes/check.py +14 -2
  275. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/indexes/docs-knowledge-indexes.yaml +5 -5
  276. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/indexes/fixtures/knowledge-indexes-shipped-register-legacy/docs/compliance/index.md +10 -0
  277. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/indexes/fixtures/knowledge-indexes-shipped-register-type/docs/compliance/index.md +10 -0
  278. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/indexes/test_check.py +58 -6
  279. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/ledger/test_check.py +0 -1
  280. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/check.py +64 -17
  281. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/docs-okf-profiles.yaml +60 -9
  282. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-ledger-clean/docs/notes.md +17 -0
  283. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-ledger-no-lines/docs/notes.md +13 -0
  284. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-profile-clean/docs/architecture/demo.md +0 -1
  285. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-profile-clean/docs-okf-profiles.yaml +0 -1
  286. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-profile-untyped/docs/research/no-type.md +9 -0
  287. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-profile-untyped/docs/research/typed-experiment.md +10 -0
  288. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-profile-untyped/docs/research/typed-research.md +10 -0
  289. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-profile-untyped/docs-okf-profiles.yaml +5 -0
  290. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-profile-violation/docs/architecture/bad-status.md +0 -1
  291. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-profile-violation/docs-okf-profiles.yaml +0 -1
  292. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-research/docs/research/experiment-ok.md +15 -0
  293. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-research/docs/research/extra-key.md +15 -0
  294. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-research/docs/research/extra-keys.md +16 -0
  295. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-research/docs/research/missing-created.md +11 -0
  296. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-research/docs/research/missing-description.md +11 -0
  297. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-research/docs/research/missing-last-update.md +11 -0
  298. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-research/docs/research/missing-sources.md +10 -0
  299. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-research/docs/research/missing-status.md +11 -0
  300. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-research/docs/research/missing-title.md +11 -0
  301. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-research/docs/research/optional-keys.md +16 -0
  302. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-research/docs/research/research-ok.md +14 -0
  303. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-research-neighbours/docs/architecture/created-date.md +21 -0
  304. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-research-neighbours/docs/architecture/research-shaped.md +19 -0
  305. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-research-neighbours/docs/operations/runbook.md +26 -0
  306. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/test_check.py +228 -2
  307. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/register.py +5 -0
  308. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/semantics/test_check.py +11 -2
  309. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/__init__.py +5 -3
  310. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/check.py +160 -44
  311. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-clean/grants.yaml +0 -2
  312. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-empty-register/frontend/packages/desktop/src/a.ts +1 -0
  313. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-empty-register/frontend/packages/desktop/src/b.ts +1 -0
  314. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-empty-register/grants.yaml +3 -0
  315. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-excluded/grants.yaml +0 -2
  316. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-missing-tree/frontend/packages/desktop/src/renderer/solo/item.ts +1 -0
  317. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-missing-tree/grants.yaml +5 -0
  318. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-no-ceilings/frontend/packages/desktop/src/a.ts +1 -0
  319. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-no-ceilings/frontend/packages/desktop/src/b.ts +1 -0
  320. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-no-ceilings/frontend/packages/desktop/src/c.ts +1 -0
  321. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-no-ceilings/grants.yaml +4 -0
  322. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-stale-entry/frontend/packages/desktop/src/renderer/solo/item.ts +1 -0
  323. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-stale-entry/grants.yaml +5 -0
  324. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-unbaselined/grants.yaml +0 -2
  325. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-unusable-register/frontend/packages/desktop/src/renderer/solo/item.ts +1 -0
  326. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-unusable-register/grants.yaml +3 -0
  327. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/register.py +127 -0
  328. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/test_check.py +265 -29
  329. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/markdown_trees/check.py +75 -2
  330. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/markdown_trees/test_check.py +194 -0
  331. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/open_work_cap/check.py +56 -10
  332. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/open_work_cap/test_check.py +258 -2
  333. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/placement/check.py +40 -12
  334. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/placement/test_check.py +108 -0
  335. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/plan_metadata.py +9 -4
  336. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/plans_layout/check.py +1 -1
  337. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/plans_layout/fixtures/plans-layout-clean/plans/features/az347-test-coverage/items/az351-restore-entrypoint.md +1 -1
  338. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/plans_layout/test_check.py +3 -3
  339. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/references/check.py +2 -3
  340. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/check.py +23 -6
  341. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/test_check.py +76 -0
  342. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_markdown_allowlist/check.py +58 -17
  343. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_markdown_allowlist/test_check.py +161 -0
  344. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/scripts_size_depth/check.py +35 -3
  345. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/scripts_size_depth/test_check.py +108 -1
  346. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/check.py +281 -61
  347. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/absolute-path.yaml +3 -0
  348. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/backslash-path.yaml +3 -0
  349. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/baseline-is-a-list.yaml +2 -0
  350. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/boolean-size.yaml +3 -0
  351. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/dot-segment.yaml +3 -0
  352. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/duplicate-path.yaml +4 -0
  353. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/empty-file.yaml +0 -0
  354. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/empty-segment.yaml +3 -0
  355. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/float-size.yaml +3 -0
  356. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/negative-size.yaml +3 -0
  357. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/no-over-limit-baseline.yaml +1 -0
  358. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/no-schema-version.yaml +1 -0
  359. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/non-string-path.yaml +3 -0
  360. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/not-yaml.yaml +2 -0
  361. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/null-size.yaml +3 -0
  362. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/parent-segment.yaml +3 -0
  363. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/string-size.yaml +3 -0
  364. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/top-level-is-a-list.yaml +2 -0
  365. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/trailing-slash.yaml +3 -0
  366. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/unknown-key.yaml +3 -0
  367. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/wrong-schema-version.yaml +2 -0
  368. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/zero-size.yaml +3 -0
  369. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/valid.yaml +4 -0
  370. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/test_check.py +758 -45
  371. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/ignored_paths/check.py +4 -3
  372. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/ignored_paths/test_check.py +2 -2
  373. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/lockfile_integrity/cargo_lock.py +490 -0
  374. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/lockfile_integrity/check.py +368 -55
  375. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/lockfile_integrity/test_check.py +4 -2
  376. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/lockfile_integrity/test_declared_paths.py +523 -0
  377. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/lockfile_integrity/test_stale_lock.py +1179 -0
  378. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/cli.py +122 -3
  379. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/core/check.py +33 -1
  380. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/core/constants.py +0 -11
  381. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/core/context.py +16 -1
  382. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/policy/config.py +1 -2
  383. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/policy/docs_shape.py +12 -1
  384. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/policy/gate-registry.alt.yaml +133 -147
  385. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/policy/gate-registry.yaml +133 -147
  386. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/policy/registry.py +1 -1
  387. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/policy/root_shape.py +52 -10
  388. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/runner.py +23 -4
  389. package/packages/repo-controls/package.json +2 -9
  390. package/packages/repo-controls/scripts/hooks/post-merge +13 -0
  391. package/packages/repo-controls/scripts/hooks/pre-push +3 -3
  392. package/packages/repo-controls/src/azdo-push.ts +64 -36
  393. package/packages/repo-controls/src/azure-devops-governance.ts +7 -9
  394. package/packages/repo-controls/src/azure-devops-remote.ts +1 -1
  395. package/packages/repo-controls/src/cli.ts +29 -8
  396. package/packages/repo-controls/src/compliance-config.ts +410 -2
  397. package/packages/repo-controls/src/config.ts +133 -60
  398. package/packages/repo-controls/src/constants.ts +13 -27
  399. package/packages/repo-controls/src/coverage-ratchet.ts +4 -4
  400. package/packages/repo-controls/src/doctor.ts +46 -19
  401. package/packages/repo-controls/src/gitignore-block.ts +5 -29
  402. package/packages/repo-controls/src/hook-log.ts +1 -2
  403. package/packages/repo-controls/src/hook.ts +201 -45
  404. package/packages/repo-controls/src/install.ts +14 -8
  405. package/packages/repo-controls/src/integrity.ts +3 -3
  406. package/packages/repo-controls/src/lfs.ts +111 -0
  407. package/packages/repo-controls/src/promote.ts +8 -8
  408. package/packages/repo-controls/src/runtime.ts +9 -1
  409. package/packages/repo-controls/src/workflows-drift.ts +4 -5
  410. package/packages/repo-controls/src/worktree-guard.ts +3 -3
@@ -23,16 +23,33 @@
23
23
  "vscode_settings": {
24
24
  "enabled": true
25
25
  },
26
+ "repo_maintain": {
27
+ "branch_max_age_days": 7
28
+ },
26
29
  "scratch_reap": {
27
30
  "enabled": true,
28
31
  "idle_days": 1,
29
32
  "reap_days": 7,
30
33
  "remove_worktrees": true
31
34
  },
35
+ "brew_upgrade_exclude": [],
32
36
  "protected_tools": ["git", "jq"],
33
37
  "git_global_config": {
38
+ "credential.helper": ["", "{git-credential-manager}"],
39
+ "credential.https://dev.azure.com.useHttpPath": "true",
34
40
  "lfs.ssh://ssh.dev.azure.com/.sshtransfer": "never",
35
- "lfs.https://ssh.dev.azure.com/.locksverify": "false"
41
+ "lfs.https://ssh.dev.azure.com/.locksverify": "false",
42
+ "push.autoSetupRemote": "true",
43
+ "push.default": "current",
44
+ "branch.autoSetupMerge": "simple",
45
+ "init.defaultBranch": "main",
46
+ "advice.addEmbeddedRepo": "false",
47
+ "fetch.prune": "true",
48
+ "pull.rebase": "false",
49
+ "rerere.enabled": "true",
50
+ "merge.conflictStyle": "zdiff3",
51
+ "diff.algorithm": "histogram",
52
+ "core.autocrlf": "false"
36
53
  }
37
54
  },
38
55
  "mac": {
@@ -42,7 +59,7 @@
42
59
  "ast-grep": {"manager": "brew", "package": "ast-grep", "executable": "ast-grep"},
43
60
  "azure-cli": {"manager": "brew", "package": "azure-cli", "executable": "az"},
44
61
  "bun": {"manager": "brew", "package": "bun", "executable": "bun"},
45
- "adl-embedding": {"manager": "embedding-model", "package": "adl-embedding", "executable": "adl-embedding/model/model.bin", "version": "0.0.1", "source": "minishlab/potion-multilingual-128M", "vocab_limit": 150000, "dim": 256, "reason": "Model data is downloaded and verified into the per-user cache; it is not an Adl code component."},
62
+ "enact-embedding": {"manager": "embedding-model", "package": "enact-embedding", "executable": "enact-embedding/model/model.bin", "version": "0.0.1", "source": "minishlab/potion-multilingual-128M", "vocab_limit": 150000, "dim": 256, "reason": "Model data is downloaded and verified into the per-user cache; it is not an Adl code component."},
46
63
  "code-review-graph": {"manager": "pip", "package": "code-review-graph", "executable": "code-review-graph"},
47
64
  "crg": {"manager": "shim", "package": "code-review-graph", "executable": "/usr/local/bin/crg"},
48
65
  "curl": {"manager": "brew", "package": "curl", "executable": "curl"},
@@ -56,8 +73,8 @@
56
73
  "git": {"manager": "brew", "package": "git", "executable": "git"},
57
74
  "jq": {"manager": "brew", "package": "jq", "executable": "jq"},
58
75
  "just": {"manager": "brew", "package": "just", "executable": "just"},
59
- "lean-ctx": {"manager": "release-archive-latest", "package": "lean-ctx", "executable": "/usr/local/bin/lean-ctx", "repo": "yvgude/lean-ctx", "asset": "lean-ctx-aarch64-apple-darwin.tar.gz", "checksums_asset": "SHA256SUMS", "archive_executable": "lean-ctx"},
60
76
  "node": {"manager": "brew", "package": "node", "executable": "node"},
77
+ "orca": {"manager": "brew", "package": "stablyai/orca/orca", "tap": "stablyai/orca", "executable": "orca", "reason": "Stably's Orca agent runtime (com.stablyai.orca), official tap. Cask auto_updates: reconcile installs when missing and never fights the in-app stable-channel updater. No version pinned here. Linux CLI (orca-ide) has no cask — still undeclared, see plans/GAPS-AND-FINDINGS.md."},
61
78
  "ripgrep": {"manager": "brew", "package": "ripgrep", "executable": "rg"},
62
79
  "search": {"manager": "shim", "package": "enact-docs-search", "executable": "/usr/local/bin/search"},
63
80
  "shellcheck": {"manager": "brew", "package": "shellcheck", "executable": "shellcheck"},
@@ -70,16 +87,17 @@
70
87
  "m3": {
71
88
  "administrator": "tarunrana",
72
89
  "default_agent": "agent-tarun",
90
+ "git_user": {"name": "Tarun Rana", "email": "tarun.rana@amsterdamdatalabs.com"},
73
91
  "home": "/Users/tarunrana",
74
92
  "minimum_free_gib": 20,
75
93
  "schedule_minute": 5,
76
- "repo_location": "/Users/tarunrana/Documents/Repos",
94
+ "repo_location": "/Users/tarunrana/workspace",
77
95
  "brew_upgrade_all": true,
78
96
  "surface_clis": [
79
97
  {"name": "claude", "manager": "native", "command": "claude", "update_args": ["update"]},
80
98
  {"name": "codex", "manager": "brew", "command": "brew", "update_args": ["upgrade", "--cask", "codex"]},
81
99
  {"name": "kimi", "manager": "native", "command": "kimi", "update_args": ["upgrade"]},
82
- {"name": "opencode", "manager": "native", "command": "opencode", "update_args": ["upgrade"]},
100
+ {"name": "opencode", "manager": "bun", "package": "opencode-ai", "command": "opencode"},
83
101
  {"name": "agent", "manager": "native", "command": "agent", "update_args": ["update"]}
84
102
  ],
85
103
  "tools": {
@@ -91,16 +109,17 @@
91
109
  "m5": {
92
110
  "administrator": "ranahome",
93
111
  "default_agent": "agent-tarun",
112
+ "git_user": {"name": "Tarun Rana", "email": "tarun.rana@amsterdamdatalabs.com"},
94
113
  "home": "/Users/ranahome",
95
114
  "minimum_free_gib": 20,
96
115
  "schedule_minute": 35,
97
- "repo_location": "/Users/ranahome/Documents",
116
+ "repo_location": "/Users/ranahome/workspace",
98
117
  "brew_upgrade_all": true,
99
118
  "surface_clis": [
100
119
  {"name": "claude", "manager": "native", "command": "claude", "update_args": ["update"]},
101
120
  {"name": "codex", "manager": "brew", "command": "brew", "update_args": ["upgrade", "--cask", "codex"]},
102
121
  {"name": "kimi", "manager": "native", "command": "kimi", "update_args": ["upgrade"]},
103
- {"name": "opencode", "manager": "native", "command": "opencode", "update_args": ["upgrade"]},
122
+ {"name": "opencode", "manager": "bun", "package": "opencode-ai", "command": "opencode"},
104
123
  {"name": "agent", "manager": "native", "command": "agent", "update_args": ["update"]}
105
124
  ],
106
125
  "tools": {
@@ -114,12 +133,16 @@
114
133
  "linux": {
115
134
  "common": {
116
135
  "os_upgrade": true,
136
+ "git_global_config": {
137
+ "credential.credentialStore": "cache",
138
+ "credential.cacheOptions": "--timeout 604800"
139
+ },
117
140
  "tools": {
118
141
  "agent-vault-cli": {"manager": "release-archive-latest", "package": "agent-vault", "executable": "/usr/local/bin/agent-vault", "repo": "Infisical/agent-vault", "asset": "agent-vault_{version}_linux_amd64.tar.gz", "checksums_asset": "checksums.txt", "archive_executable": "agent-vault"},
119
142
  "ast-grep": {"manager": "brew", "package": "ast-grep", "executable": "ast-grep"},
120
143
  "azure-cli": {"manager": "brew", "package": "azure-cli", "executable": "az"},
121
144
  "bun": {"manager": "brew", "package": "bun", "executable": "bun"},
122
- "adl-embedding": {"manager": "embedding-model", "package": "adl-embedding", "executable": "adl-embedding/model/model.bin", "version": "0.0.1", "source": "minishlab/potion-multilingual-128M", "vocab_limit": 150000, "dim": 256, "reason": "Model data is downloaded and verified into the per-user cache; it is not an Adl code component."},
145
+ "enact-embedding": {"manager": "embedding-model", "package": "enact-embedding", "executable": "enact-embedding/model/model.bin", "version": "0.0.1", "source": "minishlab/potion-multilingual-128M", "vocab_limit": 150000, "dim": 256, "reason": "Model data is downloaded and verified into the per-user cache; it is not an Adl code component."},
123
146
  "code-review-graph": {"manager": "pip", "package": "code-review-graph", "executable": "code-review-graph"},
124
147
  "crg": {"manager": "shim", "package": "code-review-graph", "executable": "/usr/local/bin/crg"},
125
148
  "curl": {"manager": "brew", "package": "curl", "executable": "curl"},
@@ -133,7 +156,6 @@
133
156
  "git": {"manager": "brew", "package": "git", "executable": "git"},
134
157
  "jq": {"manager": "brew", "package": "jq", "executable": "jq"},
135
158
  "just": {"manager": "brew", "package": "just", "executable": "just"},
136
- "lean-ctx": {"manager": "release-archive-latest", "package": "lean-ctx", "executable": "/usr/local/bin/lean-ctx", "repo": "yvgude/lean-ctx", "asset": "lean-ctx-x86_64-unknown-linux-gnu.tar.gz", "checksums_asset": "SHA256SUMS", "archive_executable": "lean-ctx"},
137
159
  "node": {"manager": "brew", "package": "node", "executable": "node"},
138
160
  "ripgrep": {"manager": "brew", "package": "ripgrep", "executable": "rg"},
139
161
  "search": {"manager": "shim", "package": "enact-docs-search", "executable": "/usr/local/bin/search"},
@@ -146,6 +168,7 @@
146
168
  "hostinger-vps-1": {
147
169
  "administrator": "root",
148
170
  "default_agent": "agent-tarun",
171
+ "git_user": {"name": "Tarun Rana", "email": "tarun.rana@amsterdamdatalabs.com"},
149
172
  "home": "/root",
150
173
  "minimum_free_gib": 25,
151
174
  "schedule_minute": 50,
@@ -154,7 +177,7 @@
154
177
  "brew_upgrade_all": true,
155
178
  "surface_clis": [
156
179
  {"name": "claude", "manager": "native", "command": "claude", "update_args": ["update"]},
157
- {"name": "opencode", "manager": "native", "command": "opencode", "update_args": ["upgrade"]},
180
+ {"name": "opencode", "manager": "bun", "package": "opencode-ai", "command": "opencode"},
158
181
  {"name": "kimi", "manager": "native", "command": "kimi", "update_args": ["upgrade"]},
159
182
  {"name": "codex", "manager": "unknown", "report_only": true, "executable": "/root/codex"}
160
183
  ],
@@ -167,6 +190,7 @@
167
190
  "strato-vps-1": {
168
191
  "administrator": "root",
169
192
  "default_agent": "agent-tarun",
193
+ "git_user": {"name": "Tarun Rana", "email": "tarun.rana@amsterdamdatalabs.com"},
170
194
  "home": "/root",
171
195
  "minimum_free_gib": 25,
172
196
  "schedule_minute": 20,
@@ -174,7 +198,7 @@
174
198
  "repo_location": "/root/workspace",
175
199
  "brew_upgrade_all": true,
176
200
  "surface_clis": [
177
- {"name": "opencode", "manager": "npm", "command": "opencode", "update_args": ["upgrade"]},
201
+ {"name": "opencode", "manager": "bun", "package": "opencode-ai", "command": "opencode"},
178
202
  {"name": "kimi", "manager": "native", "command": "kimi", "update_args": ["upgrade"]}
179
203
  ],
180
204
  "tools": {
@@ -8,7 +8,7 @@
8
8
  "properties": {
9
9
  "config": {
10
10
  "type": "object",
11
- "required": ["schema", "repository", "branch", "interval_seconds", "update_policy", "allow_major_updates", "remove_deleted_entries", "global_surface_sweep", "kimi_hooks", "surface_policy", "global_agents", "vscode_settings", "scratch_reap", "protected_tools", "git_global_config"],
11
+ "required": ["schema", "repository", "branch", "interval_seconds", "update_policy", "allow_major_updates", "remove_deleted_entries", "global_surface_sweep", "kimi_hooks", "surface_policy", "global_agents", "vscode_settings", "repo_maintain", "scratch_reap", "brew_upgrade_exclude", "protected_tools", "git_global_config"],
12
12
  "properties": {
13
13
  "global_surface_sweep": {
14
14
  "type": "object",
@@ -52,6 +52,15 @@
52
52
  "enabled": {"const": true}
53
53
  }
54
54
  },
55
+ "repo_maintain": {
56
+ "type": "object",
57
+ "description": "The 12-hourly repository step (adl maintain). branch_max_age_days: local branches whose tip commit is older than this many days are deleted with a WARN line carrying the tip sha; integration/main/master/develop, the checked-out HEAD and any branch checked out in a worktree are never deleted.",
58
+ "additionalProperties": false,
59
+ "required": ["branch_max_age_days"],
60
+ "properties": {
61
+ "branch_max_age_days": {"type": "integer", "minimum": 1}
62
+ }
63
+ },
55
64
  "scratch_reap": {
56
65
  "type": "object",
57
66
  "description": "Reclaim scratch-worktree disk on the devices that declare scratch_repos. The regenerable-artifact tier is always on; remove_worktrees arms the destructive tier.",
@@ -64,18 +73,40 @@
64
73
  "remove_worktrees": {"type": "boolean"}
65
74
  }
66
75
  },
67
- "git_global_config": {
68
- "type": "object",
69
- "description": "Global git config entries set for the administrator on every host; entries removed from the manifest are unset.",
70
- "propertyNames": {"pattern": "^[A-Za-z][A-Za-z0-9-]*\\..+"},
71
- "additionalProperties": {"type": "string"}
72
- }
76
+ "brew_upgrade_exclude": {
77
+ "type": "array",
78
+ "description": "Homebrew formulae and casks the automatic brew upgrade step never upgrades (an outdated excluded package is logged and skipped). Not a brew pin and not a version pin. git: every Homebrew git upgrade installs an ad-hoc-signed binary at a new Cellar path, which re-prompts the osxkeychain ACL.",
79
+ "uniqueItems": true,
80
+ "items": {"type": "string", "pattern": "^[A-Za-z0-9][A-Za-z0-9@._+/-]*$"}
81
+ },
82
+ "git_global_config": {"$ref": "#/$defs/git_global_config"}
73
83
  }
74
84
  },
75
85
  "mac": {"$ref": "#/$defs/platform"},
76
86
  "linux": {"$ref": "#/$defs/platform"}
77
87
  },
78
88
  "$defs": {
89
+ "git_global_config": {
90
+ "type": "object",
91
+ "description": "Global git config entries set for the administrator by bin/git-defaults (reconcile). A value is a string (single-valued key) or an ordered array of strings (multi-valued key, e.g. the empty-reset-then-helper pattern of credential.helper): the key is rewritten with --unset-all then --add in order when the current values differ. Keys not declared here are never touched. The only placeholder is {git-credential-manager}, resolved at run time as the administrator; when it is not installed the key is skipped with a WARN. Platform common may add keys for that platform only.",
92
+ "propertyNames": {"pattern": "^[A-Za-z][A-Za-z0-9-]*\\..+"},
93
+ "additionalProperties": {
94
+ "oneOf": [
95
+ {"type": "string"},
96
+ {"type": "array", "minItems": 1, "items": {"type": "string"}}
97
+ ]
98
+ }
99
+ },
100
+ "git_user": {
101
+ "type": "object",
102
+ "additionalProperties": false,
103
+ "required": ["name", "email"],
104
+ "description": "user.name and user.email set in the administrator's global git config on this device. Every device carries the same identity so the human git setup is identical on every host.",
105
+ "properties": {
106
+ "name": {"type": "string", "minLength": 1},
107
+ "email": {"type": "string", "minLength": 1}
108
+ }
109
+ },
79
110
  "tool": {
80
111
  "type": "object",
81
112
  "additionalProperties": false,
@@ -89,6 +120,7 @@
89
120
  "sha256": {"type": "string", "pattern": "^[0-9a-f]{64}$"},
90
121
  "archive_executable": {"type": "string", "pattern": "^[^/][^\\n]*$"},
91
122
  "repo": {"type": "string", "pattern": "^[^/\\s]+/[^/\\s]+$"},
123
+ "tap": {"type": "string", "pattern": "^[^/\\s]+/[^/\\s]+$", "description": "brew only: tap (owner/repo) to ensure is tapped before install/upgrade — required for fully-qualified package names like stablyai/orca/orca, which Homebrew will not auto-tap. Declaring it also grants item-level brew trust (`brew trust --formula|--cask <package>`) per Homebrew ≥6 tap trust; the whole tap is never trusted."},
92
124
  "asset": {"type": "string", "pattern": "^[^/][^\\n]*$"},
93
125
  "checksums_asset": {"type": "string", "pattern": "^[^/][^\\n]*$"},
94
126
  "source": {"type": "string", "pattern": "^[^/][^\\n]*$"},
@@ -151,7 +183,12 @@
151
183
  "required": ["name", "manager"],
152
184
  "properties": {
153
185
  "name": {"type": "string", "minLength": 1},
154
- "manager": {"enum": ["native", "npm", "brew", "unknown"]},
186
+ "manager": {"enum": ["native", "npm", "brew", "bun", "unknown"]},
187
+ "package": {
188
+ "type": "string",
189
+ "pattern": "^(@[a-z0-9][a-z0-9._-]*/)?[a-z0-9][a-z0-9._-]*$",
190
+ "description": "manager=bun only: the bare npm registry package, installed and updated with `bun add -g <package>@latest` as the device administrator. Never a version spec; versions are never pinned."
191
+ },
155
192
  "command": {"type": "string", "minLength": 1, "pattern": "^[^/]+$"},
156
193
  "executable": {"type": "string", "pattern": "^/"},
157
194
  "update_args": {"type": "array", "minItems": 1, "items": {"type": "string", "minLength": 1}},
@@ -161,7 +198,20 @@
161
198
  {
162
199
  "if": {"properties": {"report_only": {"const": true}}, "required": ["report_only"]},
163
200
  "then": {"required": ["executable"]},
164
- "else": {"required": ["command", "update_args"]}
201
+ "else": {"required": ["command"]}
202
+ },
203
+ {
204
+ "if": {"properties": {"manager": {"const": "bun"}}, "required": ["manager"]},
205
+ "then": {
206
+ "required": ["package", "command"],
207
+ "properties": {"report_only": {"const": false}},
208
+ "not": {"required": ["update_args"]}
209
+ },
210
+ "else": {
211
+ "not": {"required": ["package"]},
212
+ "if": {"properties": {"report_only": {"const": true}}, "required": ["report_only"]},
213
+ "else": {"required": ["update_args"]}
214
+ }
165
215
  },
166
216
  {
167
217
  "if": {"properties": {"manager": {"const": "brew"}}, "required": ["manager"]},
@@ -194,6 +244,7 @@
194
244
  "required": ["tools"],
195
245
  "properties": {
196
246
  "os_upgrade": {"type": "boolean"},
247
+ "git_global_config": {"$ref": "#/$defs/git_global_config"},
197
248
  "tools": {"$ref": "#/$defs/tools"}
198
249
  }
199
250
  },
@@ -202,7 +253,7 @@
202
253
  "additionalProperties": {
203
254
  "type": "object",
204
255
  "additionalProperties": false,
205
- "required": ["administrator", "default_agent", "home", "minimum_free_gib", "schedule_minute", "tools"],
256
+ "required": ["administrator", "default_agent", "git_user", "home", "minimum_free_gib", "schedule_minute", "tools"],
206
257
  "properties": {
207
258
  "administrator": {"type": "string", "minLength": 1},
208
259
  "default_agent": {
@@ -210,6 +261,7 @@
210
261
  "pattern": "^agent-[a-z0-9-]+$",
211
262
  "description": "The adl identity a plain `claude`/`codex` session (no `adl run --as`) acts as on this device, and the identity host automation (sync-and-reconcile, scratch-reap) uses via git-ado. Written by reconcile to the machine's single default-agent file (docs/architecture/cli-design.md, 2026-09-27 decisions)."
212
263
  },
264
+ "git_user": {"$ref": "#/$defs/git_user"},
213
265
  "home": {"type": "string", "pattern": "^/"},
214
266
  "minimum_free_gib": {"type": "integer", "minimum": 1},
215
267
  "schedule_minute": {"type": "integer", "minimum": 0, "maximum": 59},
@@ -22,9 +22,9 @@
22
22
  * path computation every consumer of the READ side needs too
23
23
  * (`defaultAgentFilePath`). The read itself lives in ONE place,
24
24
  * `packages/azdo/src/lib/agent-identity.ts`'s `readDefaultAgentFile` /
25
- * `resolveAgentIdentity` (STATUS.md 12p, W1) —
26
- * every reader in this repo, including this package's own scratch-reap.ts,
27
- * goes through that module rather than duplicating the read here.
25
+ * `resolveAgentIdentity` — every reader in this repo, including this
26
+ * package's own scratch-reap.ts, goes through that module rather than
27
+ * duplicating the read here.
28
28
  *
29
29
  * `root` is an injectable filesystem root so tests can point every path here
30
30
  * at a disposable directory instead of the real system path — a test must
@@ -10,16 +10,19 @@ import {
10
10
  readlinkSync,
11
11
  renameSync,
12
12
  rmSync,
13
+ statSync,
13
14
  symlinkSync,
14
15
  } from 'node:fs'
15
16
  import { dirname, isAbsolute, join, relative, resolve, sep } from 'node:path'
16
17
 
17
18
  // Exported so tests can pin this list against the packages that actually
18
- // import cross-package by relative path (STATUS.md 12p, finding C1) — a
19
- // package added to those imports but not here breaks every managed repo's
20
- // git hooks with "Cannot find module" the next time reconcile projects this
21
- // payload.
22
- export const payloadDirectories = ['packages/agent-skills', 'packages/repo-controls', 'packages/agent-hooks', 'packages/azdo']
19
+ // import cross-package by relative path — a package added to those imports
20
+ // but not here breaks every managed repo's git hooks with "Cannot find module"
21
+ // the next time reconcile projects this payload.
22
+ // Every package apps/cli reads from /usr/local/libexec/adl (hooks.ts, skills.ts, settings.ts,
23
+ // repo-controls.ts: DEFAULT_LIBEXEC_DIR) plus azdo, which they import by relative path.
24
+ // install-adl-package.test.ts pins both against the real sources.
25
+ export const payloadDirectories = ['packages/agent-skills', 'packages/repo-controls', 'packages/agent-hooks', 'packages/agent-settings', 'packages/azdo']
23
26
  const payloadScripts = ['bin/git', 'bin/git-ado']
24
27
  const requiredFiles = [
25
28
  'bin/reconcile',
@@ -27,12 +30,13 @@ const requiredFiles = [
27
30
  'packages/agent-skills/dist/index.js',
28
31
  'packages/repo-controls/bin/adl-repo-controls.ts',
29
32
  'packages/agent-hooks/src/log/writer.ts',
33
+ 'packages/agent-settings/deploy-profile.json',
30
34
  // repo-controls, fleet and agent-hooks each import THE one Azure DevOps
31
35
  // identity resolver/minter by relative path (`../../azdo/src/lib/...`,
32
36
  // `../../../../azdo/src/lib/...`) rather than as a package dependency, so
33
37
  // this directory must ship as a sibling of theirs under packages/ or every
34
38
  // managed repo's git hooks break with "Cannot find module" the next time
35
- // reconcile projects this payload (STATUS.md 12p, finding C1).
39
+ // reconcile projects this payload. install-adl-package.test.ts pins this.
36
40
  'packages/azdo/src/lib/agent-identity.ts',
37
41
  'packages/azdo/src/lib/agent-token.ts',
38
42
  ]
@@ -41,6 +45,15 @@ const managedScriptMarkers = ['# Managed by adl global-tools.', '# Managed by En
41
45
  export interface InstallAdlPackageOptions {
42
46
  packageRoot: string
43
47
  systemRoot?: string
48
+ /**
49
+ * Package mode: link /usr/local/bin/adl to THIS package's own bin/adl. Hosts
50
+ * install the package with bun, which links `adl` into the owner's ~/.bun/bin
51
+ * only, yet bin/git-ado's `adl id token`, the MCP server command, the managed
52
+ * surface hooks and GUI-launched agents all run a bare `adl` without that
53
+ * shell PATH. Checkout mode (a developer build, no compiled bin/adl in the
54
+ * tree) leaves it off.
55
+ */
56
+ linkAdl?: boolean
44
57
  }
45
58
 
46
59
  function isPathInside(parent: string, candidate: string): boolean {
@@ -48,7 +61,7 @@ function isPathInside(parent: string, candidate: string): boolean {
48
61
  return pathFromParent === '' || (pathFromParent !== '..' && !pathFromParent.startsWith(`..${sep}`) && !isAbsolute(pathFromParent))
49
62
  }
50
63
 
51
- function assertPackageRoot(packageRoot: string): string {
64
+ function assertPackageRoot(packageRoot: string, linkAdl: boolean): string {
52
65
  const root = realpathSync(packageRoot)
53
66
  const rootStat = lstatSync(root)
54
67
  if (!rootStat.isDirectory()) throw new Error(`Adl platform package root is not a directory: ${packageRoot}`)
@@ -64,13 +77,20 @@ function assertPackageRoot(packageRoot: string): string {
64
77
  }
65
78
  if (!stat.isFile()) throw new Error(`required package file is not a regular file: ${relative}`)
66
79
  if (payloadScripts.includes(relative)) {
67
- if ((stat.mode & 0o111) === 0) throw new Error(`package script must be executable: ${relative}`)
80
+ // No exec-bit requirement: bun leaves every shipped file but the `bin`
81
+ // targets 0644; replaceManagedScript installs the copy 0755.
68
82
  const firstLines = readFileSync(source, 'utf8').split('\n', 3)
69
83
  if (!managedScriptMarkers.some((marker) => firstLines.includes(marker))) {
70
84
  throw new Error(`package script is missing its managed marker: ${relative}`)
71
85
  }
72
86
  }
73
87
  }
88
+ if (linkAdl) {
89
+ const adl = join(root, 'bin/adl')
90
+ if (!existsSync(adl) || !lstatSync(adl).isFile() || (statSync(adl).mode & 0o111) === 0) {
91
+ throw new Error('package adl must be an executable file: bin/adl')
92
+ }
93
+ }
74
94
  return root
75
95
  }
76
96
 
@@ -137,9 +157,45 @@ function replaceManagedScript(source: string, target: string): void {
137
157
  }
138
158
  }
139
159
 
160
+ // A link this function made points into some install's platform package. Anything else at the
161
+ // path is someone else's adl and is never replaced silently.
162
+ const managedAdlLinkTarget = /\/adl-agent-control-[a-z0-9]+-[a-z0-9]+\/bin\/adl$/
163
+
164
+ function adlLinkStatus(link: string, source: string): 'current' | 'replace' | 'create' {
165
+ if (!lstatExists(link)) return 'create'
166
+ if (!lstatSync(link).isSymbolicLink()) {
167
+ const date = new Date().toISOString().slice(0, 10).replaceAll('-', '')
168
+ throw new Error(
169
+ `refusing to replace ${link}: a different adl (a legacy compiled one from before the package existed) shadows this package. Move it aside, never delete it, then run this again: sudo mv ${link} ${link}.legacy-${date}`,
170
+ )
171
+ }
172
+ const current = readlinkTarget(link)
173
+ if (current === source) return 'current'
174
+ if (!managedAdlLinkTarget.test(current)) throw new Error(`refusing to replace unmanaged symlink: ${link} -> ${current}`)
175
+ return 'replace'
176
+ }
177
+
178
+ function linkAdlToPackage(packageRoot: string, systemRoot: string, status: 'current' | 'replace' | 'create'): void {
179
+ if (status === 'current') return
180
+ const link = join(systemRoot, 'usr/local/bin/adl')
181
+ mkdirSync(dirname(link), { recursive: true })
182
+ const tempDirectory = mkdtempSync(join(dirname(link), '.adl-package-link-'))
183
+ const temp = join(tempDirectory, 'adl')
184
+ try {
185
+ symlinkSync(join(packageRoot, 'bin/adl'), temp)
186
+ renameSync(temp, link)
187
+ } finally {
188
+ rmSync(tempDirectory, { recursive: true, force: true })
189
+ }
190
+ }
191
+
140
192
  export function installAdlPackage(options: InstallAdlPackageOptions): void {
141
- const packageRoot = assertPackageRoot(options.packageRoot)
193
+ const packageRoot = assertPackageRoot(options.packageRoot, options.linkAdl === true)
142
194
  const systemRoot = resolve(options.systemRoot ?? '/')
195
+ // Refusals come before any replacement, so a shadowing legacy adl leaves the host untouched.
196
+ const adlLink = options.linkAdl
197
+ ? adlLinkStatus(join(systemRoot, 'usr/local/bin/adl'), join(packageRoot, 'bin/adl'))
198
+ : undefined
143
199
  for (const relative of payloadDirectories) {
144
200
  replacePayloadSymlink(
145
201
  join(packageRoot, relative),
@@ -153,23 +209,25 @@ export function installAdlPackage(options: InstallAdlPackageOptions): void {
153
209
  join(systemRoot, 'usr/local/bin', relative.split('/').at(-1)!),
154
210
  )
155
211
  }
212
+ if (adlLink !== undefined) linkAdlToPackage(packageRoot, systemRoot, adlLink)
156
213
  }
157
214
 
158
215
  if (import.meta.main) {
159
216
  const args = process.argv.slice(2)
160
- if (args[0] !== 'install') throw new Error('usage: install-adl-package.ts install --package-root PATH [--system-root PATH]')
217
+ if (args[0] !== 'install') throw new Error('usage: install-adl-package.ts install --package-root PATH [--system-root PATH] [--link-adl]')
161
218
  let packageRoot = ''
162
219
  let systemRoot = '/'
163
- for (let index = 1; index < args.length; index += 2) {
220
+ let linkAdl = false
221
+ for (let index = 1; index < args.length; index += 1) {
164
222
  const option = args[index]
165
- const value = args[index + 1] ?? ''
166
- if (option === '--package-root') packageRoot = value
167
- else if (option === '--system-root') systemRoot = value
223
+ if (option === '--link-adl') linkAdl = true
224
+ else if (option === '--package-root') packageRoot = args[++index] ?? ''
225
+ else if (option === '--system-root') systemRoot = args[++index] ?? ''
168
226
  else throw new Error(`unknown option: ${option}`)
169
227
  }
170
228
  if (!packageRoot) throw new Error('missing --package-root')
171
229
  try {
172
- installAdlPackage({ packageRoot, systemRoot })
230
+ installAdlPackage({ packageRoot, systemRoot, linkAdl })
173
231
  console.log(`projected Adl package payload from ${packageRoot}`)
174
232
  } catch (error) {
175
233
  console.error(error instanceof Error ? error.message : String(error))
@@ -1,7 +1,7 @@
1
1
  /**
2
- * Global installer for the `adl-embedding` static (Model2Vec) embedding
2
+ * Global installer for the `enact-embedding` static (Model2Vec) embedding
3
3
  * artifact that `adl hook`'s skill-match hook loads from
4
- * `${XDG_CACHE_HOME:-$HOME/.cache}/adl-embedding/model/` (falling back to
4
+ * `${XDG_CACHE_HOME:-$HOME/.cache}/enact-embedding/model/` (falling back to
5
5
  * BM25 when absent) — see enact-repo-controls-m5's
6
6
  * `src/hooks/user-prompt-submit/vector.ts`, which this script's output must
7
7
  * satisfy exactly: `model.bin`, `tokenizer.json`, `tokenizer_config.json`,
@@ -76,7 +76,7 @@ const UPSTREAM_FILE_NAMES = ['model.safetensors', 'tokenizer.json', 'tokenizer_c
76
76
  export function resolveArtifactDir(env: Readonly<Record<string, string | undefined>>): string {
77
77
  const xdgCacheHome = env.XDG_CACHE_HOME
78
78
  const base = xdgCacheHome && xdgCacheHome.trim() !== '' ? xdgCacheHome : join(requireHome(env), '.cache')
79
- return join(base, 'adl-embedding', 'model')
79
+ return join(base, 'enact-embedding', 'model')
80
80
  }
81
81
 
82
82
  function requireHome(env: Readonly<Record<string, string | undefined>>): string {
@@ -255,7 +255,7 @@ export interface EmbeddingModelDeps {
255
255
  readonly downloadFile: (url: string, dest: string) => void
256
256
  }
257
257
 
258
- export const defaultDeps: EmbeddingModelDeps = {
258
+ const defaultDeps: EmbeddingModelDeps = {
259
259
  resolveLatestRevision: defaultResolveLatestRevision,
260
260
  fetchPathsInfo: defaultFetchPathsInfo,
261
261
  downloadFile: defaultDownloadFile,
@@ -279,13 +279,13 @@ export async function install(spec: EmbeddingModelSpec, artifactDir: string, dep
279
279
  const revision = await deps.resolveLatestRevision(spec.source)
280
280
 
281
281
  if (isInstalledAtRevision(artifactDir, revision)) {
282
- console.log(`adl-embedding: already installed and verified at ${artifactDir} (${spec.source}@${revision})`)
282
+ console.log(`enact-embedding: already installed and verified at ${artifactDir} (${spec.source}@${revision})`)
283
283
  return
284
284
  }
285
285
 
286
- const work = mkdtempSync(join(tmpdir(), 'adl-embedding-install-'))
286
+ const work = mkdtempSync(join(tmpdir(), 'enact-embedding-install-'))
287
287
  try {
288
- console.log(`adl-embedding: installing ${spec.package} ${spec.version} (${spec.source}@${revision})`)
288
+ console.log(`enact-embedding: installing ${spec.package} ${spec.version} (${spec.source}@${revision})`)
289
289
 
290
290
  const pathsInfo = await deps.fetchPathsInfo(spec.source, revision, UPSTREAM_FILE_NAMES)
291
291
  const downloadedPaths: Record<string, string> = {}
@@ -345,7 +345,7 @@ export async function install(spec: EmbeddingModelSpec, artifactDir: string, dep
345
345
  writeFileSync(staged, readFileSync(join(outDir, name)))
346
346
  renameSync(staged, join(artifactDir, name))
347
347
  }
348
- console.log(`adl-embedding: installed and verified at ${artifactDir} (${spec.source}@${revision})`)
348
+ console.log(`enact-embedding: installed and verified at ${artifactDir} (${spec.source}@${revision})`)
349
349
  } finally {
350
350
  rmSync(work, { recursive: true, force: true })
351
351
  }
@@ -353,18 +353,18 @@ export async function install(spec: EmbeddingModelSpec, artifactDir: string, dep
353
353
 
354
354
  export function uninstall(artifactDir: string): void {
355
355
  if (!existsSync(artifactDir)) {
356
- console.log(`adl-embedding: nothing to remove at ${artifactDir}`)
356
+ console.log(`enact-embedding: nothing to remove at ${artifactDir}`)
357
357
  return
358
358
  }
359
359
  rmSync(artifactDir, { recursive: true, force: true })
360
- console.log(`adl-embedding: removed ${artifactDir}`)
360
+ console.log(`enact-embedding: removed ${artifactDir}`)
361
361
  }
362
362
 
363
363
  function usage(): never {
364
364
  throw new Error('usage: install-embedding-model <install|check|uninstall> --spec JSON [--home ABSOLUTE_PATH]')
365
365
  }
366
366
 
367
- export async function main(argv: readonly string[]): Promise<void> {
367
+ async function main(argv: readonly string[]): Promise<void> {
368
368
  const mode = argv[0]
369
369
  if (mode !== 'install' && mode !== 'check' && mode !== 'uninstall') usage()
370
370
 
@@ -394,8 +394,8 @@ export async function main(argv: readonly string[]): Promise<void> {
394
394
  const ok = isInstalledAtRevision(artifactDir, revision)
395
395
  console.log(
396
396
  ok
397
- ? `adl-embedding: installed and verified at ${artifactDir} (${spec.source}@${revision})`
398
- : `adl-embedding: NOT installed at latest revision ${revision} at ${artifactDir}`,
397
+ ? `enact-embedding: installed and verified at ${artifactDir} (${spec.source}@${revision})`
398
+ : `enact-embedding: NOT installed at latest revision ${revision} at ${artifactDir}`,
399
399
  )
400
400
  process.exitCode = ok ? 0 : 1
401
401
  return
@@ -1,6 +1,6 @@
1
1
  /**
2
- * Render and install the managed baseline hook artifacts (adl items 10/17,
3
- * `docs/architecture/cli-design.md` §2/§3) from the committed templates in
2
+ * Render and install the managed baseline hook artifacts
3
+ * (`docs/architecture/cli-design.md` §2/§3) from the committed templates in
4
4
  * `packages/agent-settings/managed/` onto the real, per-platform system
5
5
  * paths -- the "fleet installation" that directory's own README used to say
6
6
  * was a separate, later item. It is this reconcile pass.
@@ -70,7 +70,7 @@
70
70
  * best-effort, never depended on) -- the actual, CONFIRMED
71
71
  * enforcement is `allow_managed_hooks_only` above plus the
72
72
  * fail-closed managed baseline hook
73
- * (`adl.session-required-for-writes`): a missing or overridden
73
+ * (`adl.run-required-for-writes`): a missing or overridden
74
74
  * `ADL_AGENT_ID_AGENT` denies Azure DevOps writes for that session,
75
75
  * exactly like a plain `codex` with no `adl run` today -- it never
76
76
  * grants anything by being absent. Installed at
@@ -92,8 +92,8 @@ import { DEFAULT_AGENT_PATTERN } from './default-agent-file.ts'
92
92
  export type FleetPlatform = 'mac' | 'linux'
93
93
 
94
94
  const MANAGED_DIR = fileURLToPath(new URL('../../agent-settings/managed', import.meta.url))
95
- export const CLAUDE_TEMPLATE_PATH = join(MANAGED_DIR, 'claude-managed-settings.json')
96
- export const CODEX_REQUIREMENTS_TEMPLATE_PATH = join(MANAGED_DIR, 'codex-requirements.toml')
95
+ const CLAUDE_TEMPLATE_PATH = join(MANAGED_DIR, 'claude-managed-settings.json')
96
+ const CODEX_REQUIREMENTS_TEMPLATE_PATH = join(MANAGED_DIR, 'codex-requirements.toml')
97
97
 
98
98
  export function claudeManagedSettingsPath(platform: FleetPlatform, root = ''): string {
99
99
  switch (platform) {
@@ -153,7 +153,7 @@ export function renderCodexManagedConfig(agent: string): string {
153
153
  # https://developers.openai.com/codex/config-reference. Deployed anyway
154
154
  # because it is harmless if ignored or overridden: unsetting
155
155
  # ADL_AGENT_ID_AGENT here grants nothing -- the managed baseline hook
156
- # (adl.session-required-for-writes, CONFIRMED enforced from
156
+ # (adl.run-required-for-writes, CONFIRMED enforced from
157
157
  # allow_managed_hooks_only in requirements.toml in this same directory) then
158
158
  # denies Azure DevOps writes for that session, fail-closed, exactly like a
159
159
  # plain \`codex\` with no \`adl run\` today. That hook is the real backstop,
@@ -168,7 +168,7 @@ set = { ADL_AGENT_ID_AGENT = "${agent}" }
168
168
  `
169
169
  }
170
170
 
171
- export interface FileWriteResult {
171
+ interface FileWriteResult {
172
172
  readonly path: string
173
173
  readonly changed: boolean
174
174
  }