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

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 (405) 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 +10 -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 +159 -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 +34 -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/src/azdo-pl.ts +2 -54
  140. package/packages/azdo/src/azdo-pr-review.ts +4 -4
  141. package/packages/azdo/src/azdo-repo-doctor.ts +101 -52
  142. package/packages/azdo/src/azdo-wit.ts +41 -2
  143. package/packages/azdo/src/lib/agent-identity.ts +12 -14
  144. package/packages/azdo/src/lib/agent-token.ts +2 -2
  145. package/packages/azdo/src/lib/client.ts +0 -5
  146. package/packages/azdo/src/lib/graph-identity.ts +4 -4
  147. package/packages/azdo/src/workflow-rules-matrix.csv +85 -0
  148. package/packages/azdo/src/workflow-rules.ts +128 -0
  149. package/packages/fleet/manifest.json +35 -11
  150. package/packages/fleet/manifest.schema.json +62 -10
  151. package/packages/fleet/src/default-agent-file.ts +3 -3
  152. package/packages/fleet/src/install-adl-package.ts +73 -15
  153. package/packages/fleet/src/install-embedding-model.ts +13 -13
  154. package/packages/fleet/src/managed-settings.ts +7 -7
  155. package/packages/fleet/src/repo-maintain.ts +91 -55
  156. package/packages/fleet/src/scratch-reap.ts +5 -5
  157. package/packages/fleet/src/vscode-settings.ts +5 -5
  158. package/packages/repo-controls/README.md +141 -43
  159. package/packages/repo-controls/assets/promote.ts +4 -4
  160. package/packages/repo-controls/assets/reconcile-guard.sh +10 -46
  161. package/packages/repo-controls/assets/version-bump.sh +31 -84
  162. package/packages/repo-controls/bunfig.toml +6 -7
  163. package/packages/repo-controls/package/adl-compliance/AGENTS.md +5 -6
  164. package/packages/repo-controls/package/adl-compliance/conftest.py +3 -1
  165. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/__init__.py +4 -16
  166. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/adr_lifecycle/test_check.py +9 -2
  167. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/closed_set/fixtures/docs/notes.md +1 -0
  168. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/closed_set/test_check.py +11 -0
  169. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/__init__.py +7 -0
  170. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/check.py +266 -0
  171. 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
  172. 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
  173. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-assets/docs/guide/.hidden.md +1 -0
  174. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-assets/docs/guide/a.md +1 -0
  175. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-assets/docs/guide/b.md +1 -0
  176. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-assets/docs/guide/data.csv +1 -0
  177. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-assets/docs/guide/diagram.png +1 -0
  178. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-assets/docs/guide/mock.png +1 -0
  179. 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
  180. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-assets/docs.md +1 -0
  181. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-assets/grants.yaml +4 -0
  182. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-assets/plans/deep/p1.md +1 -0
  183. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-assets/plans/deep/p2.md +1 -0
  184. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-assets/plans/deep/p3.md +1 -0
  185. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-assets/plans/deep/p4.md +1 -0
  186. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-assets/plans/deep/p5.md +1 -0
  187. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-clean/docs/architecture/build.md +1 -0
  188. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-clean/docs/architecture/overview.md +1 -0
  189. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-clean/docs/guide/install.md +1 -0
  190. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-clean/docs/guide/start.md +1 -0
  191. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-clean/grants.yaml +4 -0
  192. 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
  193. 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
  194. 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
  195. 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
  196. 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
  197. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-decisions/docs/guide/a.md +1 -0
  198. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-decisions/docs/guide/b.md +1 -0
  199. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-decisions/docs/guide/c.md +1 -0
  200. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-decisions/grants.yaml +4 -0
  201. 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
  202. 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
  203. 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
  204. 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
  205. 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
  206. 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
  207. 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
  208. 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
  209. 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
  210. 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
  211. 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
  212. 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
  213. 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
  214. 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
  215. 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
  216. 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
  217. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-default-cap/grants.yaml +4 -0
  218. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-exempt/docs/guide/a.md +1 -0
  219. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-exempt/docs/guide/b.md +1 -0
  220. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-exempt/docs/guide/c.md +1 -0
  221. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-exempt/grants.yaml +4 -0
  222. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-grew/docs/guide/a.md +1 -0
  223. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-grew/docs/guide/b.md +1 -0
  224. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-grew/docs/guide/c.md +1 -0
  225. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-grew/grants.yaml +4 -0
  226. 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
  227. 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
  228. 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
  229. 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
  230. 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
  231. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-no-section/grants.yaml +4 -0
  232. 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
  233. 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
  234. 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
  235. 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
  236. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-over-cap/grants.yaml +4 -0
  237. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-stale/docs/held/a.md +1 -0
  238. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-stale/docs/held/b.md +1 -0
  239. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-stale/docs/held/c.md +1 -0
  240. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-stale/docs/held/d.md +1 -0
  241. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-stale/docs/shrunk/a.md +1 -0
  242. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-stale/docs/shrunk/b.md +1 -0
  243. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-stale/grants.yaml +6 -0
  244. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-unusable/docs/guide/a.md +1 -0
  245. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-unusable/docs/guide/b.md +1 -0
  246. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-unusable/docs/guide/c.md +1 -0
  247. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-unusable/grants.yaml +3 -0
  248. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/test_check.py +345 -0
  249. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/english_only/check.py +18 -5
  250. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/english_only/test_check.py +35 -0
  251. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/__init__.py +7 -0
  252. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/check.py +91 -0
  253. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/AGENTS.md +3 -0
  254. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/CLAUDE.md +3 -0
  255. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/architecture/-leading-hyphen.md +3 -0
  256. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/architecture/AGENTS.md +3 -0
  257. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/architecture/double--hyphen.md +3 -0
  258. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/architecture/getting started.md +3 -0
  259. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/architecture/nested/page-here.md +3 -0
  260. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/architecture/trailing-hyphen-.md +3 -0
  261. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/architecture/ui-contract.md +4 -0
  262. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/architecture/user_profile.md +3 -0
  263. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/assets/UI-CONTRACT.png +2 -0
  264. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/assets/diagram.png +1 -0
  265. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/index.md +4 -0
  266. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/notes.md +3 -0
  267. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/reference.html +1 -0
  268. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/research/2026-10-experiment.md +3 -0
  269. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/research/UI-CONTRACT.md +6 -0
  270. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs.md +5 -0
  271. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/test_check.py +194 -0
  272. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/indexes/check.py +14 -2
  273. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/indexes/docs-knowledge-indexes.yaml +5 -5
  274. 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
  275. 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
  276. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/indexes/test_check.py +58 -6
  277. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/ledger/test_check.py +0 -1
  278. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/check.py +64 -17
  279. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/docs-okf-profiles.yaml +60 -9
  280. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-ledger-clean/docs/notes.md +17 -0
  281. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-ledger-no-lines/docs/notes.md +13 -0
  282. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-profile-clean/docs/architecture/demo.md +0 -1
  283. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-profile-clean/docs-okf-profiles.yaml +0 -1
  284. 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
  285. 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
  286. 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
  287. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-profile-untyped/docs-okf-profiles.yaml +5 -0
  288. 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
  289. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-profile-violation/docs-okf-profiles.yaml +0 -1
  290. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-research/docs/research/experiment-ok.md +15 -0
  291. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-research/docs/research/extra-key.md +15 -0
  292. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-research/docs/research/extra-keys.md +16 -0
  293. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-research/docs/research/missing-created.md +11 -0
  294. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-research/docs/research/missing-description.md +11 -0
  295. 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
  296. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-research/docs/research/missing-sources.md +10 -0
  297. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-research/docs/research/missing-status.md +11 -0
  298. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-research/docs/research/missing-title.md +11 -0
  299. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-research/docs/research/optional-keys.md +16 -0
  300. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-research/docs/research/research-ok.md +14 -0
  301. 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
  302. 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
  303. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-research-neighbours/docs/operations/runbook.md +26 -0
  304. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/test_check.py +228 -2
  305. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/register.py +5 -0
  306. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/semantics/test_check.py +11 -2
  307. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/__init__.py +5 -3
  308. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/check.py +160 -44
  309. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-clean/grants.yaml +0 -2
  310. 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
  311. 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
  312. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-empty-register/grants.yaml +3 -0
  313. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-excluded/grants.yaml +0 -2
  314. 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
  315. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-missing-tree/grants.yaml +5 -0
  316. 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
  317. 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
  318. 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
  319. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-no-ceilings/grants.yaml +4 -0
  320. 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
  321. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-stale-entry/grants.yaml +5 -0
  322. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-unbaselined/grants.yaml +0 -2
  323. 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
  324. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-unusable-register/grants.yaml +3 -0
  325. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/register.py +127 -0
  326. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/test_check.py +265 -29
  327. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/markdown_trees/check.py +75 -2
  328. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/markdown_trees/test_check.py +194 -0
  329. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/open_work_cap/check.py +56 -10
  330. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/open_work_cap/test_check.py +256 -0
  331. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/placement/check.py +40 -12
  332. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/placement/test_check.py +108 -0
  333. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/plans_layout/test_check.py +1 -1
  334. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/references/check.py +2 -3
  335. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/check.py +23 -6
  336. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/test_check.py +76 -0
  337. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_markdown_allowlist/check.py +58 -17
  338. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_markdown_allowlist/test_check.py +161 -0
  339. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/scripts_size_depth/check.py +35 -3
  340. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/scripts_size_depth/test_check.py +108 -1
  341. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/check.py +281 -61
  342. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/absolute-path.yaml +3 -0
  343. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/backslash-path.yaml +3 -0
  344. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/baseline-is-a-list.yaml +2 -0
  345. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/boolean-size.yaml +3 -0
  346. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/dot-segment.yaml +3 -0
  347. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/duplicate-path.yaml +4 -0
  348. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/empty-file.yaml +0 -0
  349. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/empty-segment.yaml +3 -0
  350. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/float-size.yaml +3 -0
  351. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/negative-size.yaml +3 -0
  352. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/no-over-limit-baseline.yaml +1 -0
  353. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/no-schema-version.yaml +1 -0
  354. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/non-string-path.yaml +3 -0
  355. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/not-yaml.yaml +2 -0
  356. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/null-size.yaml +3 -0
  357. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/parent-segment.yaml +3 -0
  358. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/string-size.yaml +3 -0
  359. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/top-level-is-a-list.yaml +2 -0
  360. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/trailing-slash.yaml +3 -0
  361. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/unknown-key.yaml +3 -0
  362. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/wrong-schema-version.yaml +2 -0
  363. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/zero-size.yaml +3 -0
  364. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/valid.yaml +4 -0
  365. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/test_check.py +758 -45
  366. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/ignored_paths/check.py +4 -3
  367. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/ignored_paths/test_check.py +2 -2
  368. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/lockfile_integrity/cargo_lock.py +490 -0
  369. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/lockfile_integrity/check.py +368 -55
  370. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/lockfile_integrity/test_check.py +4 -2
  371. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/lockfile_integrity/test_declared_paths.py +523 -0
  372. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/lockfile_integrity/test_stale_lock.py +1179 -0
  373. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/cli.py +122 -3
  374. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/core/check.py +33 -1
  375. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/core/constants.py +0 -11
  376. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/core/context.py +16 -1
  377. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/policy/config.py +1 -2
  378. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/policy/docs_shape.py +12 -1
  379. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/policy/gate-registry.alt.yaml +133 -147
  380. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/policy/gate-registry.yaml +133 -147
  381. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/policy/registry.py +1 -1
  382. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/policy/root_shape.py +52 -10
  383. package/packages/repo-controls/package/adl-compliance/src/adl_compliance/runner.py +23 -4
  384. package/packages/repo-controls/package.json +2 -9
  385. package/packages/repo-controls/scripts/hooks/post-merge +13 -0
  386. package/packages/repo-controls/scripts/hooks/pre-push +3 -3
  387. package/packages/repo-controls/src/azdo-push.ts +64 -36
  388. package/packages/repo-controls/src/azure-devops-governance.ts +7 -9
  389. package/packages/repo-controls/src/azure-devops-remote.ts +1 -1
  390. package/packages/repo-controls/src/cli.ts +29 -8
  391. package/packages/repo-controls/src/compliance-config.ts +410 -2
  392. package/packages/repo-controls/src/config.ts +133 -60
  393. package/packages/repo-controls/src/constants.ts +13 -27
  394. package/packages/repo-controls/src/coverage-ratchet.ts +4 -4
  395. package/packages/repo-controls/src/doctor.ts +46 -19
  396. package/packages/repo-controls/src/gitignore-block.ts +5 -29
  397. package/packages/repo-controls/src/hook-log.ts +1 -2
  398. package/packages/repo-controls/src/hook.ts +201 -45
  399. package/packages/repo-controls/src/install.ts +14 -8
  400. package/packages/repo-controls/src/integrity.ts +3 -3
  401. package/packages/repo-controls/src/lfs.ts +111 -0
  402. package/packages/repo-controls/src/promote.ts +8 -8
  403. package/packages/repo-controls/src/runtime.ts +9 -1
  404. package/packages/repo-controls/src/workflows-drift.ts +4 -5
  405. package/packages/repo-controls/src/worktree-guard.ts +3 -3
@@ -0,0 +1,128 @@
1
+ // Workflow gate matrix for the board's six Build flags (Custom.Planwritten,
2
+ // Custom.Implementationcomplete, Custom.Reviewpassed, Custom.Testspassing,
3
+ // Custom.Docsupdated, Custom.Mergedtointegration) against the seven
4
+ // Product Backlog Item/Bug states. Rebuild (2026-10-02) of the gate lost in
5
+ // the P4 port — the authoritative definition is
6
+ // docs/operations/workflow-matrix.csv in the enact-combined repo, copied
7
+ // verbatim to src/workflow-rules-matrix.csv next to this file. The unit test
8
+ // tests/workflow-rules.test.ts asserts this embedded table agrees with that
9
+ // CSV on all 84 rows, so the compiled binary needs no file access at runtime.
10
+ // Features and Epics carry no flags ("A Feature carries neither") and are
11
+ // exempt: evaluateWorkflowState returns no violations for them.
12
+
13
+ /** The six Build flags, in CSV column order. */
14
+ export const WORKFLOW_FLAG_REFS = [
15
+ 'Custom.Planwritten',
16
+ 'Custom.Implementationcomplete',
17
+ 'Custom.Reviewpassed',
18
+ 'Custom.Testspassing',
19
+ 'Custom.Docsupdated',
20
+ 'Custom.Mergedtointegration',
21
+ ] as const;
22
+ export type WorkflowFlagRef = (typeof WORKFLOW_FLAG_REFS)[number];
23
+
24
+ export const WORKFLOW_FLAG_LABELS: Record<WorkflowFlagRef, string> = {
25
+ 'Custom.Planwritten': 'Plan written',
26
+ 'Custom.Implementationcomplete': 'Implementation complete',
27
+ 'Custom.Reviewpassed': 'Review passed',
28
+ 'Custom.Testspassing': 'Tests passing',
29
+ 'Custom.Docsupdated': 'Docs updated',
30
+ 'Custom.Mergedtointegration': 'Merged to integration',
31
+ };
32
+
33
+ /**
34
+ * Only four flags carry a failure reason in the CSV; Implementation complete
35
+ * and Docs updated have none.
36
+ */
37
+ export const WORKFLOW_FAILURE_REASONS: Partial<Record<WorkflowFlagRef, string>> = {
38
+ 'Custom.Planwritten': 'Plan rejected',
39
+ 'Custom.Reviewpassed': 'Reviewer rejected',
40
+ 'Custom.Testspassing': 'Tests failed',
41
+ 'Custom.Mergedtointegration': 'Build failed',
42
+ };
43
+
44
+ /** The seven board states; the matrix has one rule vector per state. */
45
+ const WORKFLOW_STATES = ['New', 'Approved', 'Committed', 'In Progress', 'In Testing', 'Done', 'Removed'] as const;
46
+ export type WorkflowState = (typeof WORKFLOW_STATES)[number];
47
+
48
+ /**
49
+ * `yes` = flag must be true, `no` = flag must be false, `free` = either.
50
+ * The Product Backlog Item and Bug rows are identical in the CSV, so one
51
+ * table serves both types; per state the entries follow WORKFLOW_FLAG_REFS
52
+ * order.
53
+ */
54
+ export const WORKFLOW_STATE_RULES: Record<WorkflowState, Record<WorkflowFlagRef, WorkflowRule>> = {
55
+ New: { 'Custom.Planwritten': 'no', 'Custom.Implementationcomplete': 'no', 'Custom.Reviewpassed': 'no', 'Custom.Testspassing': 'no', 'Custom.Docsupdated': 'no', 'Custom.Mergedtointegration': 'no' },
56
+ Approved: { 'Custom.Planwritten': 'yes', 'Custom.Implementationcomplete': 'no', 'Custom.Reviewpassed': 'no', 'Custom.Testspassing': 'no', 'Custom.Docsupdated': 'no', 'Custom.Mergedtointegration': 'no' },
57
+ Committed: { 'Custom.Planwritten': 'yes', 'Custom.Implementationcomplete': 'no', 'Custom.Reviewpassed': 'no', 'Custom.Testspassing': 'no', 'Custom.Docsupdated': 'no', 'Custom.Mergedtointegration': 'no' },
58
+ 'In Progress': { 'Custom.Planwritten': 'yes', 'Custom.Implementationcomplete': 'free', 'Custom.Reviewpassed': 'no', 'Custom.Testspassing': 'free', 'Custom.Docsupdated': 'free', 'Custom.Mergedtointegration': 'no' },
59
+ 'In Testing': { 'Custom.Planwritten': 'yes', 'Custom.Implementationcomplete': 'yes', 'Custom.Reviewpassed': 'free', 'Custom.Testspassing': 'free', 'Custom.Docsupdated': 'free', 'Custom.Mergedtointegration': 'no' },
60
+ Done: { 'Custom.Planwritten': 'yes', 'Custom.Implementationcomplete': 'yes', 'Custom.Reviewpassed': 'yes', 'Custom.Testspassing': 'yes', 'Custom.Docsupdated': 'yes', 'Custom.Mergedtointegration': 'yes' },
61
+ Removed: { 'Custom.Planwritten': 'free', 'Custom.Implementationcomplete': 'free', 'Custom.Reviewpassed': 'free', 'Custom.Testspassing': 'free', 'Custom.Docsupdated': 'free', 'Custom.Mergedtointegration': 'free' },
62
+ };
63
+ export type WorkflowRule = 'yes' | 'no' | 'free';
64
+
65
+ export interface WorkflowViolation {
66
+ flagRef: WorkflowFlagRef;
67
+ flagLabel: string;
68
+ required: 'true' | 'false';
69
+ state: string;
70
+ failureReason?: string;
71
+ }
72
+
73
+ const GATED_TYPES = ['Product Backlog Item', 'Bug'] as const;
74
+
75
+ /**
76
+ * Evaluate the RESULTING (state, flags) pair against the matrix. One
77
+ * violation per breached yes/no row; `free` rows and exempt types
78
+ * (Feature/Epic) yield none. A flag absent from `flags` counts as false,
79
+ * matching an unset Azure boolean. A state outside the seven board states
80
+ * has no rows and yields no violations.
81
+ */
82
+ export function evaluateWorkflowState(
83
+ workItemType: string,
84
+ state: string,
85
+ flags: Partial<Record<WorkflowFlagRef, boolean>> = {},
86
+ ): WorkflowViolation[] {
87
+ if (!(GATED_TYPES as readonly string[]).includes(workItemType)) return [];
88
+ const rules = WORKFLOW_STATE_RULES[state as WorkflowState];
89
+ if (!rules) return [];
90
+ const violations: WorkflowViolation[] = [];
91
+ for (const flagRef of WORKFLOW_FLAG_REFS) {
92
+ const rule = rules[flagRef];
93
+ if (rule === 'free') continue;
94
+ if ((flags[flagRef] ?? false) !== (rule === 'yes')) {
95
+ violations.push({
96
+ flagRef,
97
+ flagLabel: WORKFLOW_FLAG_LABELS[flagRef],
98
+ required: rule === 'yes' ? 'true' : 'false',
99
+ state,
100
+ ...(WORKFLOW_FAILURE_REASONS[flagRef] === undefined ? {} : { failureReason: WORKFLOW_FAILURE_REASONS[flagRef] }),
101
+ });
102
+ }
103
+ }
104
+ return violations;
105
+ }
106
+
107
+ export function formatWorkflowViolation(violation: WorkflowViolation): string {
108
+ const reason = violation.failureReason === undefined ? '' : ` (${violation.failureReason})`;
109
+ return `fenced by workflow matrix: State '${violation.state}' requires '${violation.flagLabel}' to be ${violation.required}${reason}`;
110
+ }
111
+
112
+ /** One refusal line per violation, joined for a loud multi-line error. */
113
+ export function formatWorkflowRefusal(violations: WorkflowViolation[]): string {
114
+ return violations.map(formatWorkflowViolation).join('\n');
115
+ }
116
+
117
+ /**
118
+ * Pick the workflow flags out of a raw fields record (an Azure work item's
119
+ * `fields`, or a write's `fields` argument). Only strict booleans count;
120
+ * anything else is coerced to false rather than guessed at.
121
+ */
122
+ export function pickWorkflowFlags(fields: Record<string, unknown> | undefined): Partial<Record<WorkflowFlagRef, boolean>> {
123
+ const flags: Partial<Record<WorkflowFlagRef, boolean>> = {};
124
+ for (const flagRef of WORKFLOW_FLAG_REFS) {
125
+ if (fields !== undefined && flagRef in fields) flags[flagRef] = fields[flagRef] === true;
126
+ }
127
+ return flags;
128
+ }
@@ -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))