@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
@@ -42,11 +42,12 @@ export type Invocation =
42
42
  * The raw command word that invoked git — `git`/`git.exe` when run by
43
43
  * bare name (the common case, and the only one `git-worktree`'s
44
44
  * synthetic shortcut below ever produces), or the exact path when run
45
- * by one (`/usr/local/bin/git`, `/usr/bin/git`, …). H2
46
- * (`adl-git-credential-bypass.ts`) denies an ABSOLUTE path other than
45
+ * by one (`/usr/local/bin/git`, `/usr/bin/git`, …).
46
+ * `adl.git-credential-bypass` (`adl-git-credential-bypass.ts`) denies an ABSOLUTE path other than
47
47
  * the managed front controller `/usr/local/bin/git` — an agent
48
- * invoking git by any other absolute path bypasses `bin/git-ado`
49
- * entirely, since that routing lives at exactly that one path. Absent
48
+ * invoking git by any other absolute path bypasses the `bin/git` front
49
+ * controller and git-ado entirely, since that routing lives at exactly
50
+ * that one path. Absent
50
51
  * on the `git-worktree` binary shortcut (no real "binary word" to
51
52
  * report there).
52
53
  */
@@ -65,8 +66,8 @@ export type Invocation =
65
66
  | { readonly kind: 'git-internals-write'; readonly name: string; readonly targets: readonly string[] }
66
67
  /**
67
68
  * A command that writes into one of the seven tamper-protected carrier
68
- * files (`.claude/settings.json`, `.codex/hooks.json`, `adl-config.toml`,
69
- * …) via redirection, tee, mv/cp/install/ln, sed -i/perl -pi, truncate,
69
+ * files (`.claude/settings.json`, `.codex/hooks.json`,
70
+ * `.cursor/hooks.json`, …) via redirection, tee, mv/cp/install/ln, sed -i/perl -pi, truncate,
70
71
  * trash/rm/unlink/shred, or dd. See shell/protected-carrier-writes.ts;
71
72
  * denied by agent.tamper-protection. `git rm`/`checkout --`/`restore --`/
72
73
  * `reset --` on one of these files is a `'git'` Invocation instead — see
@@ -78,7 +79,7 @@ export type Invocation =
78
79
  * `az devops|repos|pipelines|boards|artifacts ...`. `args` is everything
79
80
  * after `az` itself (the subcommand group onward, e.g. `['repos', 'pr',
80
81
  * 'create', '--title', 'x']`) — carried so a rule can tell a mutating
81
- * subcommand from a read one (`adl.session-required-for-writes`); denied
82
+ * subcommand from a read one (`adl.run-required-for-writes`); denied
82
83
  * outright regardless of that distinction by tool.azure-devops, which
83
84
  * ignores this field. See impl/tool-azure-devops.ts.
84
85
  */
@@ -282,10 +283,9 @@ const LEADING_ASSIGNMENT_RE = /^[A-Za-z_][A-Za-z0-9_]*=/
282
283
  /**
283
284
  * Whether `tokens` begins (after any leading `NAME=value` assignments) with
284
285
  * an `env`/`env.exe` invocation that carries `-S`/`--split-string` among its
285
- * own flags — R3 (STATUS.md 12p). Checked at `walk()`'s
286
- * own call site BEFORE `skipPrefixes` (../prefixes.ts's `skipEnvFlags`)
287
- * consumes `-S`/`--split-string` and its value as an opaque, value-taking
288
- * flag argument; this mirrors that same flag-scanning loop just far enough
286
+ * own flags. Checked at `walk()`'s own call site BEFORE `skipPrefixes`
287
+ * (../prefixes.ts's `skipEnvFlags`) consumes `-S`/`--split-string` and its
288
+ * value as an opaque, value-taking flag argument; this mirrors that same flag-scanning loop just far enough
289
289
  * to detect the flag's PRESENCE, without trying to parse or classify what
290
290
  * its value names. Narrow by design: only a leading `env`, not `env` nested
291
291
  * behind another wrapper (`sudo env -S …`) — the common, and only currently
@@ -523,90 +523,6 @@ function walkShellCommand(name: string, args: readonly Token[], cfg: ClassifyCon
523
523
  return null
524
524
  }
525
525
 
526
- const LEAN_CTX_COMMAND_NAMES: ReadonlySet<string> = new Set(['lean-ctx', 'lean-ctx.exe'])
527
- /** `lean-ctx raw`'s documented alias, plus `exec` ("Same as -c" per `lean-ctx help all`). */
528
- const LEAN_CTX_EXEC_WORDS: ReadonlySet<string> = new Set(['exec', 'raw', 'bypass'])
529
- /**
530
- * lean-ctx's own shell-hook re-exec placeholder (`exec lean-ctx -c
531
- * "$BASH_EXECUTION_STRING"`, injected into `~/.bashenv` by `lean-ctx setup`
532
- * — see `../impl/tool-lean-ctx-global.ts`'s module doc). Bash substitutes
533
- * the REAL command text into this variable inside the interactive shell's
534
- * OWN DEBUG-trap machinery — never inside a Bash-tool `command` string an
535
- * agent hands this hook. Reaching here unresolved means lean-ctx execs an
536
- * EMPTY command (the variable is unset in every context this static
537
- * scanner actually observes), not an unknown one, so it is recognized as
538
- * this ONE specific, known placeholder and left alone — rather than
539
- * failing closed on "any `$...`", which `dynamicToken` would otherwise do
540
- * for every other unresolvable value below.
541
- */
542
- const LEAN_CTX_SHELL_HOOK_PLACEHOLDER = '$BASH_EXECUTION_STRING'
543
-
544
- /**
545
- * lean-ctx's own arbitrary-command-execution surface — independent-review
546
- * finding 1 (HIGH, pre-existing, affects every rule): `-c [--raw]`, `-t`,
547
- * `exec`, `raw`/`bypass <command>` all hand a shell command to a REAL
548
- * shell, exactly like `bash -c`'s own script argument, but nothing walked
549
- * that argument before this fix — it was an opaque word inside an
550
- * unclassified `{kind:'command', name:'lean-ctx', ...}`.
551
- *
552
- * Verified against the real `lean-ctx 3.10.5` binary: `lean-ctx -c echo a
553
- * b` prints `a b` — every remaining word is joined with a single space
554
- * into ONE command string (not only the first), so `rest.map(tokenValue).
555
- * join(' ')` mirrors that exactly; a single already-quoted argument
556
- * (`-c "npm install"`) round-trips unchanged through the same join.
557
- *
558
- * `lean-ctx shell` (an interactive compressed shell) is the READ side of
559
- * the same risk when its stdin is fed by a pipe or a file redirection —
560
- * the commands it will run are whatever that feed contains, invisible to
561
- * this static scanner, so it fails closed as `uncertain` (matching how
562
- * every other unreadable script source in this file is handled) rather
563
- * than silently falling through to an unclassified allow. A bare `lean-ctx
564
- * shell` with no stdin feed is left unclassified (out of scope for this
565
- * finding — no probe or finding names that shape, and an interactive
566
- * session an agent cannot feed input into is not the arbitrary-command
567
- * risk this fix closes).
568
- *
569
- * Redirections between `lean-ctx` and its first argument (`lean-ctx
570
- * >/dev/null -c "cmd"`) are stripped here the same way `walkShell` strips
571
- * them for a real shell's own `-c` — `rawArgs` (`args` in `classify()`)
572
- * still carries them; the generic `{kind:'command', ...}` fallback and
573
- * `tool.lean-ctx-global-state`'s own `firstPositional` scan handle THAT
574
- * redirection-before-subcommand case for the subcommand forms this
575
- * function does not otherwise touch.
576
- */
577
- function walkLeanCtxExec(
578
- name: string,
579
- rawArgs: readonly Token[],
580
- rawTokens: readonly Token[],
581
- parser: Parser,
582
- feed: StdinFeed | undefined,
583
- ): readonly Invocation[] | null {
584
- if (!LEAN_CTX_COMMAND_NAMES.has(name)) return null
585
- const args = withoutRedirections(rawArgs)
586
- if (args.length === 0) return null
587
- const first = tokenValue(args[0] as Token)
588
- const firstLower = first.toLowerCase()
589
-
590
- if (firstLower === 'shell') {
591
- return feed !== undefined || readsStdinFromFile(rawTokens) ? uncertain('lean-ctx shell fed from stdin') : null
592
- }
593
-
594
- let rest: readonly Token[] | null = null
595
- if (first === '-c') {
596
- const second = args[1]
597
- rest = second !== undefined && tokenValue(second) === '--raw' ? args.slice(2) : args.slice(1)
598
- } else if (first === '-t') {
599
- rest = args.slice(1)
600
- } else if (LEAN_CTX_EXEC_WORDS.has(firstLower)) {
601
- rest = args.slice(1)
602
- }
603
- if (rest === null) return null
604
- if (rest.length === 0) return uncertain('dynamic lean-ctx script')
605
- if (rest.length === 1 && tokenValue(rest[0] as Token) === LEAN_CTX_SHELL_HOOK_PLACEHOLDER) return []
606
- const joined = rest.map(tokenValue).join(' ')
607
- return parser.parseScript(joined, feed)
608
- }
609
-
610
526
  const isTrashDestination = (token: Token): boolean => {
611
527
  const value = tokenValue(token).replace(/\/+$/, '')
612
528
  return value.endsWith('/.Trash') || value === '~/.Trash' || value.endsWith('/Trash')
@@ -669,11 +585,10 @@ function isBunTestSubcommand(args: readonly Token[]): boolean {
669
585
  /**
670
586
  * The real Azure CLI global parameters that can appear before ANY
671
587
  * subcommand group — https://learn.microsoft.com/cli/azure/reference-index
672
- * (checked 2026-09-28) — M6 (STATUS.md 12p):
673
- * without skipping these, `az --output json devops project list` read
674
- * `args[0]` as `--output`, not `devops`, never matched
675
- * `azureDevopsSubcommands`, and fell through to the generic `'command'` kind
676
- * — invisible to `tool.azure-devops`'s outright deny. `--help`/`-h`/
588
+ * (checked 2026-09-28): without skipping these,
589
+ * `az --output json devops project list` read `args[0]` as `--output`, not
590
+ * `devops`, never matched `azureDevopsSubcommands`, and fell through to the
591
+ * generic `'command'` kind — invisible to `tool.azure-devops`'s outright deny. `--help`/`-h`/
677
592
  * `--version`/`-v` are deliberately NOT skipped here: `isHelpOrVersionOnly`
678
593
  * already gates a purely-help invocation before this runs, and one
679
594
  * appearing BEFORE the subcommand group is real az's own "show generic
@@ -687,7 +602,7 @@ const AZ_GLOBAL_BOOLEAN_FLAGS: ReadonlySet<string> = new Set(['--debug', '--only
687
602
  * flag (or its value) — see `AZ_GLOBAL_VALUE_FLAGS`/`AZ_GLOBAL_BOOLEAN_FLAGS`.
688
603
  * `--flag=value` is a single word and is skipped as one. Exported (not just
689
604
  * used internally here) so `impl/tool-azure-devops.ts`'s own separate
690
- * `account get-access-token`/`rest` positional checks (M6) use the SAME
605
+ * `account get-access-token`/`rest` positional checks use the SAME
691
606
  * skip, rather than a second copy that could drift from this one.
692
607
  */
693
608
  export function skipAzGlobalFlags(args: readonly Token[]): number {
@@ -757,7 +672,7 @@ function walkNested(tokens: readonly Token[], index: number, args: readonly Toke
757
672
  }
758
673
 
759
674
  /** Nested shell scripts (`-c` arguments, here-document and here-string bodies fed to a shell) are walked at most this deep. */
760
- export const MAX_SHELL_SCRIPT_DEPTH = 16
675
+ const MAX_SHELL_SCRIPT_DEPTH = 16
761
676
 
762
677
  /**
763
678
  * A piece's stdin when a pipe feeds it: every earlier stage of its pipeline
@@ -928,13 +843,13 @@ function makeParser(cfg: ClassifyConfig): Parser & { readonly parse: (command: s
928
843
  const walk = (rawTokens: readonly Token[], feed?: StdinFeed): readonly Invocation[] => {
929
844
  const input = detachShellInput(rawTokens, documents)
930
845
  const tokens = input.tokens
931
- // R3 (STATUS.md 12p): `env -S`/`--split-string` splits its
932
- // value into argv and execs it — but `skipPrefixes`'s own `skipEnvFlags`
933
- // (../prefixes.ts) treats that value as an opaque, value-taking flag
934
- // argument and skips straight past it, so whatever it actually names was
935
- // previously invisible to every rule (a bare `env -S '<value>'` made
936
- // `invocations()` return `[]` — no Invocation, so no rule's match() ever
937
- // ran). Checked BEFORE `skipPrefixes` runs, so this fires instead of
846
+ // `env -S`/`--split-string` splits its value into argv and execs it —
847
+ // but `skipPrefixes`'s own `skipEnvFlags` (../prefixes.ts) treats that
848
+ // value as an opaque, value-taking flag argument and skips straight past
849
+ // it, so whatever it actually names would be invisible to every rule (a
850
+ // bare `env -S '<value>'` would make `invocations()` return `[]` — no
851
+ // Invocation, so no rule's match() ever runs). Checked BEFORE
852
+ // `skipPrefixes` runs, so it is reported as uncertain instead of
938
853
  // silently vanishing; see `envUsesSplitString`'s own doc.
939
854
  if (envUsesSplitString(tokens)) return [...uncertain('env -S/--split-string execution')]
940
855
  const index = skipPrefixes(tokens)
@@ -959,15 +874,6 @@ function makeParser(cfg: ClassifyConfig): Parser & { readonly parse: (command: s
959
874
  if (name === 'git-worktree' || name === 'git-worktree.exe') return [{ kind: 'git', subcommand: 'worktree', globals: [], rest: args }]
960
875
  if (dynamicToken(first)) return uncertain('dynamic shell command')
961
876
 
962
- // Independent-review finding 1 (HIGH, pre-existing, affects every rule):
963
- // lean-ctx's own -c/-t/exec/raw(/bypass) run an ARBITRARY shell command
964
- // that nothing below this point ever inspected — see walkLeanCtxExec's
965
- // own doc for the fix and the verified-against-the-real-binary behavior
966
- // it relies on. Checked before walkShellCommand/walkToolCommand/the
967
- // generic fallback, same priority as a real shell's own -c.
968
- const leanCtxExec = walkLeanCtxExec(name, args, tokens, parser, feed)
969
- if (leanCtxExec !== null) return leanCtxExec
970
-
971
877
  const shellCommand = walkShellCommand(name, args, cfg, parser, feed)
972
878
  const denied = deniedPathInvocation(name, args, cfg)
973
879
  if (denied !== null) return [denied]
@@ -20,7 +20,7 @@ import { splitShell } from './split.ts'
20
20
  import { nestedSources } from './substitution.ts'
21
21
  import { tokenize } from './token.ts'
22
22
 
23
- export const REMOTE_FETCHERS: ReadonlySet<string> = new Set([
23
+ const REMOTE_FETCHERS: ReadonlySet<string> = new Set([
24
24
  'curl',
25
25
  'curlie',
26
26
  'wget',
@@ -53,7 +53,7 @@ export interface GitGlobalsScan {
53
53
  readonly terminal: boolean
54
54
  }
55
55
 
56
- export const COMMAND_PREFIXES = new Set([
56
+ const COMMAND_PREFIXES = new Set([
57
57
  'sudo',
58
58
  'doas',
59
59
  'command',
@@ -1,30 +1,31 @@
1
1
  /**
2
- * Filesystem writes into one of the seven tamper-protected carrier files —
2
+ * Filesystem writes into one of the tamper-protected carrier files —
3
3
  * the shell-command half of `agent.tamper-protection`.
4
4
  *
5
5
  * That rule's `match()` used to see only `tool-call` Write/Edit/MultiEdit/
6
6
  * NotebookEdit/Patch; a shell command reaching the same file through `>`,
7
7
  * `tee`, `mv`, `cp`, `install`, `ln -sf`, `sed -i`/`perl -pi`, `truncate`,
8
8
  * `trash`/`rm`/`unlink`/`shred`, or `dd of=` was invisible to it — measured
9
- * `{blocked: false}` against the real engine, closed here (STATUS.md 12p,
10
- * decision 13 follow-up, 2026-09-29).
9
+ * `{blocked: false}` against the real engine, which is why this module
10
+ * exists: hooks run per repo (Tarun, 2026-09-29), so the hook carriers are the
11
+ * enforcement layer, and an agent must not be able to edit its own guard away
12
+ * through the shell either.
11
13
  *
12
14
  * Deliberately mirrors `git-internals.ts`'s own redirection/operand
13
15
  * extraction (same incident shape: a denied edit tool is not the only way to
14
16
  * mutate a file) instead of re-deriving it — `nonOptionArgs`/`copyDestination`/
15
17
  * `inPlaceEditFiles`/`redirectionWriteTargets`/`withoutRedirections` are the
16
18
  * exact pure, path-agnostic pieces `git-internals.ts` already built and
17
- * tests; only the verb vocabulary (`shred` added; `chmod` added; `rsync`
18
- * added — P2, independent review, 2026-09-29, unlike `git-internals.ts`'s
19
- * own carve-out for `.git/hooks` there is no such exemption needed here;
20
- * `chown`/`chgrp` still excluded, not named by that finding) and the path
19
+ * tests; only the verb vocabulary (`shred`, `chmod` and `rsync` added;
20
+ * unlike `git-internals.ts`'s own carve-out for `.git/hooks` there is no such
21
+ * exemption needed here; `chown`/`chgrp` are not covered) and the path
21
22
  * predicate (`protectedCarrierMatch`/`protectedCarrierDirMatch` instead of
22
23
  * `isGitInternalsPath`) differ. `git rm`/`mv`/`checkout --`/`restore --`/
23
24
  * `reset --` are NOT handled here — those are `'git'`-kind Invocations, not
24
25
  * generic commands, and are checked directly in
25
26
  * `impl/agent-tamper-protection.ts`.
26
27
  *
27
- * P2 also asked for `mv`/`cp -r`/`rsync` onto (or, for `mv`, of) a carrier
28
+ * `mv`/`cp -r`/`rsync` onto (or, for `mv`, of) a carrier
28
29
  * DIRECTORY (`.claude`/`.codex`/`.cursor`/`.opencode` — deleting or
29
30
  * overwriting the whole directory takes the carrier file inside it with
30
31
  * it) — covered by the SAME candidate extraction as the file-level check,
@@ -56,7 +57,7 @@ const ANY_OPERAND = new Set(['rm', 'rm.exe', 'unlink', 'unlink.exe', 'trash', 't
56
57
  /** Tools where only the DESTINATION is a candidate write target. */
57
58
  const COPY_LIKE = new Set(['cp', 'ln', 'install'])
58
59
 
59
- /** `rsync ... SRC DEST` — the last positional operand is the destination (P2, independent review, 2026-09-29). */
60
+ /** `rsync ... SRC DEST` — the last positional operand is the destination. */
60
61
  function rsyncDestination(args: readonly Token[]): string | null {
61
62
  const positional = nonOptionArgs(args)
62
63
  return positional.length >= 2 ? (positional[positional.length - 1] as string) : null
@@ -100,7 +101,7 @@ function writeTargetCandidates(name: string, rawArgs: readonly Token[], tokens:
100
101
  */
101
102
  const isDynamicCandidate = (target: string): boolean => /\$\(|`/.test(target) && !/^[<>]\(/.test(target)
102
103
 
103
- /** The protected-carrier paths (files or, P2, directories) `name args...` (with its whole token list, for redirections) would write to. */
104
+ /** The protected-carrier paths (files or directories) `name args...` (with its whole token list, for redirections) would write to. */
104
105
  export function protectedCarrierWriteTargets(name: string, rawArgs: readonly Token[], tokens: readonly Token[]): readonly string[] {
105
106
  return writeTargetCandidates(name, rawArgs, tokens).filter(
106
107
  (candidate) => !isDynamicCandidate(candidate) && (protectedCarrierMatch(candidate) !== null || protectedCarrierDirMatch(candidate) !== null),
@@ -1,13 +1,14 @@
1
1
  /**
2
- * The seven tamper-protected carrier files — one source of the list.
2
+ * The tamper-protected carrier files — one source of the list.
3
3
  *
4
- * Decision 13 (STATUS.md 12p, 2026-09-29) closure: `agent.tamper-protection`
5
- * used to hard-code this Set inside `impl/agent-tamper-protection.ts` itself,
6
- * which worked while the only consumer was that rule's own `tool-call`
7
- * branch. Its shell-write coverage (`protected-carrier-writes.ts`) needs the
8
- * SAME list one layer down, in `shell/`, which `impl/*.ts` rules import FROM
9
- * — never the reverse — so the list moved here and `agent-tamper-protection.ts`
10
- * now imports it back, rather than keeping two copies that could drift.
4
+ * Hooks run only per repo, where `adl hooks deploy` has run (Tarun,
5
+ * 2026-09-29), so these carriers are the enforcement layer an agent must not
6
+ * be able to edit away. `agent.tamper-protection`'s `tool-call` branch
7
+ * (`impl/agent-tamper-protection.ts`) and the shell-write coverage
8
+ * (`protected-carrier-writes.ts`) both need the SAME list; `impl/*.ts` rules
9
+ * import FROM `shell/`, never the reverse, so the list lives here and
10
+ * `agent-tamper-protection.ts` imports it, rather than two copies that could
11
+ * drift.
11
12
  *
12
13
  * Still hard-coded on purpose (not configurable): see
13
14
  * `impl/agent-tamper-protection.ts`'s header for why an `adl-config.toml`
@@ -28,15 +29,17 @@ export const PROTECTED_CARRIER_PATHS: ReadonlySet<string> = new Set([
28
29
  '.claude/settings.json',
29
30
  '.claude/settings.local.json',
30
31
  '.codex/config.toml',
31
- 'adl-config.toml',
32
+ // `adl-config.toml` was the fourth entry until 2026-10-01 (Tarun: "nobody
33
+ // should stop editing adl-config.toml"). It stays human-landed at commit time
34
+ // (`git.protected-tree-commit`, repo-controls' integrity gate), but an agent
35
+ // can now write it, and every hook run re-reads it.
32
36
  '.codex/hooks.json',
33
37
  '.cursor/hooks.json',
34
38
  '.opencode/plugins/adl-repo.ts',
35
- // P2 (independent review, 2026-09-29): Kimi's ONLY carrier — a single,
36
- // globally-installed `~/.kimi-code/config.toml` (STATUS.md 12p's
37
- // "Hooks run only where adl hooks deploy has run" decision: Kimi stays
38
- // global by design, proven from Kimi's own docs — no per-repo carrier
39
- // exists for it at all). Deliberately a suffix-only entry, no leading
39
+ // Kimi's ONLY carrier — a single, globally-installed
40
+ // `~/.kimi-code/config.toml` (Kimi stays global by design: its documented
41
+ // hook config is that one file, checked against Kimi's own docs on
42
+ // 2026-09-29, so no per-repo carrier exists for it). Deliberately a suffix-only entry, no leading
40
43
  // `~`/home path baked in: the EXISTING suffix match
41
44
  // (`protectedCarrierMatch`'s `candidate.endsWith('/'+target)`) already
42
45
  // matches `~/.kimi-code/config.toml`, `$HOME/.kimi-code/config.toml`, and
@@ -47,7 +50,7 @@ export const PROTECTED_CARRIER_PATHS: ReadonlySet<string> = new Set([
47
50
  ])
48
51
 
49
52
  /**
50
- * P2 (independent review, 2026-09-29): on a case-INSENSITIVE filesystem
53
+ * On a case-INSENSITIVE filesystem
51
54
  * (macOS's default APFS/HFS+ — `darwin`), `.CLAUDE/Settings.JSON` opens the
52
55
  * SAME file on disk as `.claude/settings.json`, so a purely case-sensitive
53
56
  * string compare is a real bypass there, not merely cosmetic. Linux's
@@ -60,8 +63,8 @@ const CASE_INSENSITIVE_HOST_FS = process.platform === 'darwin'
60
63
  /**
61
64
  * Collapse `//` to `/` and resolve `.`/`..` segments (POSIX-style, no
62
65
  * filesystem access — this never has to be correct about symlinks, only
63
- * about what STRING a shell command's own path argument denotes) — P2
64
- * (independent review, 2026-09-29): `.codex/sub/../hooks.json` names
66
+ * about what STRING a shell command's own path argument denotes):
67
+ * `.codex/sub/../hooks.json` names
65
68
  * `.codex/hooks.json` exactly as much as the already-normalized spelling
66
69
  * does, and a purely textual suffix check misses it. A leading `..` (would
67
70
  * escape above the argument's own root) is left as `..` — this function
@@ -102,12 +105,10 @@ export function protectedCarrierMatch(path: string): string | null {
102
105
  /**
103
106
  * The per-host carrier DIRECTORIES — deleting, moving away, or overwriting
104
107
  * the WHOLE directory removes (or replaces) the carrier file inside it too,
105
- * exactly as much as touching that file directly (P2, independent review,
106
- * 2026-09-29). `.claude`/`.codex`/`.cursor`/`.opencode` — Kimi's own
108
+ * exactly as much as touching that file directly. `.claude`/`.codex`/`.cursor`/`.opencode` — Kimi's own
107
109
  * `~/.kimi-code/` is deliberately NOT included: `mv ~/.kimi-code /tmp` is a
108
110
  * genuinely different, much bigger blast radius (moving the user's whole
109
- * Kimi config directory, not a repo-scoped host-config directory) that this
110
- * finding did not name.
111
+ * Kimi config directory, not a repo-scoped host-config directory).
111
112
  *
112
113
  * Covers `mv`/`cp -r` (destination)/`rsync` (destination) via
113
114
  * `protected-carrier-writes.ts`'s existing operand extraction — a
@@ -115,18 +116,17 @@ export function protectedCarrierMatch(path: string): string | null {
115
116
  * operand) moving it away too. `tar -x`/`unzip -o` extracting INTO one of
116
117
  * these directories (via `-C`/`-d`) are NOT covered — those tools' own
117
118
  * target-directory flags are not among `protected-carrier-writes.ts`'s
118
- * existing operand handlers, and adding them needs new, tool-specific
119
- * parsing this pass did not have room for; noted rather than silently
120
- * dropped.
119
+ * existing operand handlers, and covering them needs new, tool-specific
120
+ * parsing; a known gap, recorded here rather than silently dropped.
121
121
  */
122
- export const PROTECTED_CARRIER_DIRS: ReadonlySet<string> = new Set(['.claude', '.codex', '.cursor', '.opencode'])
122
+ const PROTECTED_CARRIER_DIRS: ReadonlySet<string> = new Set(['.claude', '.codex', '.cursor', '.opencode'])
123
123
 
124
124
  /**
125
125
  * The protected carrier directory `path` names — exact match or a trailing
126
126
  * `/<dir>` suffix — or null. Same normalization/case rules as
127
127
  * `protectedCarrierMatch`.
128
128
  *
129
- * F7 (fourth independent review, 2026-09-29): `path` ending in a literal
129
+ * `path` ending in a literal
130
130
  * `/` (BEFORE normalization strips it for the comparison itself) means "a
131
131
  * file goes INTO this directory" (`cp GLOBAL-AGENTS.md .claude/`, `mv
132
132
  * notes.md .cursor/`) — the directory itself is untouched, only gaining an
@@ -46,7 +46,7 @@ export function findMatchingParen(command: string, openIndex: number): number {
46
46
  * `$((a) && (b))` is a command substitution of two subshells, not arithmetic,
47
47
  * and returns -1.
48
48
  */
49
- export function arithmeticClose(command: string, openIndex: number): number {
49
+ function arithmeticClose(command: string, openIndex: number): number {
50
50
  if (command[openIndex] !== '(' || command[openIndex + 1] !== '(') return -1
51
51
  const close = findMatchingParen(command, openIndex)
52
52
  if (close < 0) return -1
@@ -12,7 +12,7 @@
12
12
  import { dynamicToken, type Token, tokenValue } from './token.ts'
13
13
  import type { Invocation } from './invocation.ts'
14
14
 
15
- export const XARGS_OPTIONS_WITH_VALUE = new Set([
15
+ const XARGS_OPTIONS_WITH_VALUE = new Set([
16
16
  '-a',
17
17
  '--arg-file',
18
18
  '-d',
@@ -31,7 +31,7 @@ export const XARGS_OPTIONS_WITH_VALUE = new Set([
31
31
  '-s',
32
32
  '--max-chars',
33
33
  ])
34
- export const XARGS_FLAG_OPTIONS = new Set([
34
+ const XARGS_FLAG_OPTIONS = new Set([
35
35
  '-0',
36
36
  '--null',
37
37
  '-r',
@@ -33,9 +33,9 @@ export type Severity = 'deny' | 'advise'
33
33
  * (`../gating/config.ts`) treats it specially, refusing to let it resolve to
34
34
  * disabled without `rules.unsafeAllowUncertain` set.
35
35
  */
36
- export type RuleCategory = 'git' | 'filesystem' | 'tool' | 'tool-call' | 'uncertain' | 'advisory'
36
+ type RuleCategory = 'git' | 'filesystem' | 'tool' | 'tool-call' | 'uncertain' | 'advisory'
37
37
 
38
- export interface ParamDecodeIssue {
38
+ interface ParamDecodeIssue {
39
39
  readonly pointer: string
40
40
  readonly message: string
41
41
  }