@amsterdamdatalabs/adl-agent-control-darwin-arm64 0.1.4
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.
- package/bin/adl +4 -0
- package/bin/cursor-settings +14 -0
- package/bin/default-agent-file +14 -0
- package/bin/git +670 -0
- package/bin/git-ado +425 -0
- package/bin/global-agents +14 -0
- package/bin/global-surface-sweep +14 -0
- package/bin/health-check +38 -0
- package/bin/kimi-hooks +14 -0
- package/bin/lean-ctx-observe-strip +361 -0
- package/bin/lib/bun-compile-build.sh +34 -0
- package/bin/lib/lean-ctx-observe-hooks.sh +634 -0
- package/bin/managed-settings +14 -0
- package/bin/opencode-hooks +14 -0
- package/bin/reconcile +2648 -0
- package/bin/scratch-reap +14 -0
- package/bin/shell-path-policy +64 -0
- package/bin/surface-policy +14 -0
- package/bin/sync-and-reconcile +215 -0
- package/bin/update-azure-agent-pool +29 -0
- package/bin/validate-manifest +171 -0
- package/bin/vscode-settings +14 -0
- package/package.json +44 -0
- package/packages/agent-hooks/README.md +411 -0
- package/packages/agent-hooks/assets/hooks.json +97 -0
- package/packages/agent-hooks/assets/opencode-plugin.template.ts +224 -0
- package/packages/agent-hooks/bunfig.toml +27 -0
- package/packages/agent-hooks/deploy-profile.json +53 -0
- package/packages/agent-hooks/deploy-profile.schema.json +120 -0
- package/packages/agent-hooks/package.json +23 -0
- package/packages/agent-hooks/src/cli/args.ts +99 -0
- package/packages/agent-hooks/src/cli/doctor.ts +241 -0
- package/packages/agent-hooks/src/cli/rules.ts +133 -0
- package/packages/agent-hooks/src/deploy/deploy.ts +181 -0
- package/packages/agent-hooks/src/deploy/doctor.ts +158 -0
- package/packages/agent-hooks/src/deploy/index.ts +17 -0
- package/packages/agent-hooks/src/deploy/json-merge.ts +115 -0
- package/packages/agent-hooks/src/deploy/legacy-lock.ts +213 -0
- package/packages/agent-hooks/src/deploy/list.ts +117 -0
- package/packages/agent-hooks/src/deploy/lock.ts +65 -0
- package/packages/agent-hooks/src/deploy/opencode-template.ts +74 -0
- package/packages/agent-hooks/src/deploy/profile.ts +117 -0
- package/packages/agent-hooks/src/deploy/render.ts +162 -0
- package/packages/agent-hooks/src/deploy/source.ts +84 -0
- package/packages/agent-hooks/src/gating/config.ts +514 -0
- package/packages/agent-hooks/src/gating/root.ts +117 -0
- package/packages/agent-hooks/src/hooks/briefing/handler.ts +22 -0
- package/packages/agent-hooks/src/hooks/briefing/index.ts +320 -0
- package/packages/agent-hooks/src/hooks/contract.ts +112 -0
- package/packages/agent-hooks/src/hooks/crg/handler.ts +22 -0
- package/packages/agent-hooks/src/hooks/crg/index.ts +209 -0
- package/packages/agent-hooks/src/hooks/lean-ctx/handler.ts +22 -0
- package/packages/agent-hooks/src/hooks/lean-ctx/index.ts +173 -0
- package/packages/agent-hooks/src/hooks/lean-ctx/mapping.ts +121 -0
- package/packages/agent-hooks/src/hooks/lean-ctx/scope-rewrite.ts +207 -0
- package/packages/agent-hooks/src/hooks/log.ts +233 -0
- package/packages/agent-hooks/src/hooks/user-prompt-submit/config.ts +58 -0
- package/packages/agent-hooks/src/hooks/user-prompt-submit/constants.ts +149 -0
- package/packages/agent-hooks/src/hooks/user-prompt-submit/handler.ts +72 -0
- package/packages/agent-hooks/src/hooks/user-prompt-submit/index.ts +203 -0
- package/packages/agent-hooks/src/hooks/user-prompt-submit/match.ts +212 -0
- package/packages/agent-hooks/src/hooks/user-prompt-submit/skill-roots.ts +73 -0
- package/packages/agent-hooks/src/hooks/user-prompt-submit/skills.ts +98 -0
- package/packages/agent-hooks/src/hooks/user-prompt-submit/tokenizer.ts +115 -0
- package/packages/agent-hooks/src/hooks/user-prompt-submit/vector.ts +174 -0
- package/packages/agent-hooks/src/hosts/impl/claude.ts +47 -0
- package/packages/agent-hooks/src/hosts/impl/codex.ts +47 -0
- package/packages/agent-hooks/src/hosts/impl/cursor.ts +40 -0
- package/packages/agent-hooks/src/hosts/impl/kimi.ts +47 -0
- package/packages/agent-hooks/src/hosts/impl/opencode.ts +54 -0
- package/packages/agent-hooks/src/hosts/registry.ts +29 -0
- package/packages/agent-hooks/src/hosts/spec.ts +113 -0
- package/packages/agent-hooks/src/lean-ctx/env.ts +106 -0
- package/packages/agent-hooks/src/lean-ctx/mcp.ts +140 -0
- package/packages/agent-hooks/src/lib/spawn-with-timeout.ts +120 -0
- package/packages/agent-hooks/src/log/writer.ts +230 -0
- package/packages/agent-hooks/src/main.ts +269 -0
- package/packages/agent-hooks/src/pre-tool-use/handler.ts +549 -0
- package/packages/agent-hooks/src/rules/engine.ts +293 -0
- package/packages/agent-hooks/src/rules/impl/adl-build-run-denied.ts +51 -0
- package/packages/agent-hooks/src/rules/impl/adl-git-credential-bypass.ts +320 -0
- package/packages/agent-hooks/src/rules/impl/adl-git-identity.ts +249 -0
- package/packages/agent-hooks/src/rules/impl/adl-git-push-policy.ts +258 -0
- package/packages/agent-hooks/src/rules/impl/adl-human-azdo-bypass.ts +731 -0
- package/packages/agent-hooks/src/rules/impl/adl-identity.ts +128 -0
- package/packages/agent-hooks/src/rules/impl/adl-mcp-cli.ts +179 -0
- package/packages/agent-hooks/src/rules/impl/adl-pr-complete-pending.ts +65 -0
- package/packages/agent-hooks/src/rules/impl/adl-pr-review-role.ts +156 -0
- package/packages/agent-hooks/src/rules/impl/adl-pr-role.ts +121 -0
- package/packages/agent-hooks/src/rules/impl/adl-session-required.ts +403 -0
- package/packages/agent-hooks/src/rules/impl/adl-token-minting-role.ts +92 -0
- package/packages/agent-hooks/src/rules/impl/adl-workitem-role.ts +74 -0
- package/packages/agent-hooks/src/rules/impl/advisory-coverage.ts +43 -0
- package/packages/agent-hooks/src/rules/impl/advisory-finder.ts +62 -0
- package/packages/agent-hooks/src/rules/impl/agent-secrets-stay-unread.ts +173 -0
- package/packages/agent-hooks/src/rules/impl/agent-tamper-protection.ts +508 -0
- package/packages/agent-hooks/src/rules/impl/fs-canonical-checkout.ts +86 -0
- package/packages/agent-hooks/src/rules/impl/fs-git-internals.ts +75 -0
- package/packages/agent-hooks/src/rules/impl/fs-mv.ts +66 -0
- package/packages/agent-hooks/src/rules/impl/fs-rm.ts +83 -0
- package/packages/agent-hooks/src/rules/impl/fs-trash.ts +140 -0
- package/packages/agent-hooks/src/rules/impl/git-core.ts +101 -0
- package/packages/agent-hooks/src/rules/impl/git-helpers.ts +408 -0
- package/packages/agent-hooks/src/rules/impl/git-history.ts +77 -0
- package/packages/agent-hooks/src/rules/impl/git-paths.ts +139 -0
- package/packages/agent-hooks/src/rules/impl/git-plumbing.ts +167 -0
- package/packages/agent-hooks/src/rules/impl/git-protected-tree.ts +132 -0
- package/packages/agent-hooks/src/rules/impl/git-transitions.ts +292 -0
- package/packages/agent-hooks/src/rules/impl/git-verify.ts +95 -0
- package/packages/agent-hooks/src/rules/impl/git-worktree.ts +265 -0
- package/packages/agent-hooks/src/rules/impl/mcp-tool.ts +76 -0
- package/packages/agent-hooks/src/rules/impl/messages.ts +128 -0
- package/packages/agent-hooks/src/rules/impl/parse-uncertain.ts +143 -0
- package/packages/agent-hooks/src/rules/impl/pr-completion.ts +35 -0
- package/packages/agent-hooks/src/rules/impl/shell-remote-script-exec.ts +63 -0
- package/packages/agent-hooks/src/rules/impl/tool-azure-devops.ts +283 -0
- package/packages/agent-hooks/src/rules/impl/tool-bun-test.ts +81 -0
- package/packages/agent-hooks/src/rules/impl/tool-cargo.ts +66 -0
- package/packages/agent-hooks/src/rules/impl/tool-chmod-hook.ts +42 -0
- package/packages/agent-hooks/src/rules/impl/tool-find.ts +82 -0
- package/packages/agent-hooks/src/rules/impl/tool-frontend.ts +83 -0
- package/packages/agent-hooks/src/rules/impl/tool-grep.ts +93 -0
- package/packages/agent-hooks/src/rules/impl/tool-lean-ctx-global.ts +594 -0
- package/packages/agent-hooks/src/rules/impl/tool-native-search.ts +77 -0
- package/packages/agent-hooks/src/rules/ports.ts +178 -0
- package/packages/agent-hooks/src/rules/registry.ts +233 -0
- package/packages/agent-hooks/src/rules/shell/git-identity.ts +1415 -0
- package/packages/agent-hooks/src/rules/shell/git-internals.ts +186 -0
- package/packages/agent-hooks/src/rules/shell/invocation.ts +1083 -0
- package/packages/agent-hooks/src/rules/shell/piped-script.ts +201 -0
- package/packages/agent-hooks/src/rules/shell/prefixes.ts +214 -0
- package/packages/agent-hooks/src/rules/shell/protected-carrier-writes.ts +108 -0
- package/packages/agent-hooks/src/rules/shell/protected-carriers.ts +149 -0
- package/packages/agent-hooks/src/rules/shell/split.ts +179 -0
- package/packages/agent-hooks/src/rules/shell/substitution.ts +394 -0
- package/packages/agent-hooks/src/rules/shell/token.ts +180 -0
- package/packages/agent-hooks/src/rules/shell/xargs.ts +81 -0
- package/packages/agent-hooks/src/rules/spec.ts +152 -0
- package/packages/agent-hooks/src/surface-policy.ts +37 -0
- package/packages/agent-hooks/tsconfig.json +23 -0
- package/packages/agent-settings/assets/GLOBAL-AGENTS.md +107 -0
- package/packages/agent-settings/assets/agents/architect.toml +30 -0
- package/packages/agent-settings/assets/agents/code-reviewer.toml +27 -0
- package/packages/agent-settings/assets/agents/critic.toml +35 -0
- package/packages/agent-settings/assets/agents/executor.toml +28 -0
- package/packages/agent-settings/assets/agents/explore.toml +25 -0
- package/packages/agent-settings/assets/agents/planner.toml +29 -0
- package/packages/agent-settings/assets/lean-ctx/config.toml +39 -0
- package/packages/agent-settings/assets/lean-ctx/gitignore +6 -0
- package/packages/agent-settings/assets/lean-ctx/layout.toml +5 -0
- package/packages/agent-settings/assets/mcp.json +20 -0
- package/packages/agent-settings/managed/README.md +331 -0
- package/packages/agent-settings/managed/claude-managed-settings.json +150 -0
- package/packages/agent-settings/managed/codex-requirements.toml +105 -0
- package/packages/agent-settings/protected.json +470 -0
- package/packages/agent-settings/src/deploy/agent-render.ts +94 -0
- package/packages/agent-settings/src/deploy/agent-toml.ts +76 -0
- package/packages/agent-settings/src/deploy/agents-deploy.ts +129 -0
- package/packages/agent-settings/src/deploy/doctor.ts +201 -0
- package/packages/agent-settings/src/deploy/index.ts +33 -0
- package/packages/agent-settings/src/deploy/json-pretty.ts +66 -0
- package/packages/agent-settings/src/deploy/lean-ctx-deploy.ts +138 -0
- package/packages/agent-settings/src/deploy/legacy-lock.ts +286 -0
- package/packages/agent-settings/src/deploy/list.ts +135 -0
- package/packages/agent-settings/src/deploy/lock.ts +112 -0
- package/packages/agent-settings/src/deploy/mcp-deploy.ts +175 -0
- package/packages/agent-settings/src/deploy/mcp-inspect.ts +56 -0
- package/packages/agent-settings/src/deploy/mcp-merge.ts +164 -0
- package/packages/agent-settings/src/deploy/mcp-render.ts +80 -0
- package/packages/agent-settings/src/deploy/mcp-source.ts +43 -0
- package/packages/agent-settings/src/deploy/profile.ts +296 -0
- package/packages/agent-settings/src/deploy/settings.ts +65 -0
- package/packages/agent-settings/src/global-agents.ts +230 -0
- package/packages/agent-settings/src/global-surface-sweep.ts +2179 -0
- package/packages/agent-settings/src/kimi-hooks.ts +455 -0
- package/packages/agent-settings/src/opencode-hooks.ts +76 -0
- package/packages/agent-settings/src/surface-policy.ts +441 -0
- package/packages/agent-settings/surface-policy.json +20 -0
- package/packages/agent-skills/assets/code-review/SKILL.md +100 -0
- package/packages/agent-skills/assets/codebase-design/SKILL.md +98 -0
- package/packages/agent-skills/assets/codebase-design/references/DEEPENING.md +37 -0
- package/packages/agent-skills/assets/codebase-design/references/DESIGN-IT-TWICE.md +44 -0
- package/packages/agent-skills/assets/codebase-design/references/TESTABILITY.md +29 -0
- package/packages/agent-skills/assets/debug-issue/SKILL.md +40 -0
- package/packages/agent-skills/assets/diagnosing-bugs/SKILL.md +100 -0
- package/packages/agent-skills/assets/diagnosing-bugs/references/FEEDBACK-LOOP-TACTICS.md +34 -0
- package/packages/agent-skills/assets/diagnosing-bugs/scripts/hitl-loop.template.sh +41 -0
- package/packages/agent-skills/assets/domain-modeling/SKILL.md +86 -0
- package/packages/agent-skills/assets/domain-modeling/references/ADR-FORMAT.md +47 -0
- package/packages/agent-skills/assets/domain-modeling/references/CONTEXT-FORMAT.md +60 -0
- package/packages/agent-skills/assets/explore-codebase/SKILL.md +41 -0
- package/packages/agent-skills/assets/handoff/SKILL.md +28 -0
- package/packages/agent-skills/assets/implement/SKILL.md +28 -0
- package/packages/agent-skills/assets/refactor-safely/SKILL.md +44 -0
- package/packages/agent-skills/assets/review-changes/SKILL.md +45 -0
- package/packages/agent-skills/assets/tdd/SKILL.md +49 -0
- package/packages/agent-skills/assets/tdd/references/mocking.md +59 -0
- package/packages/agent-skills/assets/tdd/references/tests.md +77 -0
- package/packages/agent-skills/assets/testing/SKILL.md +54 -0
- package/packages/agent-skills/assets/to-feature/SKILL.md +91 -0
- package/packages/agent-skills/assets/to-feature/references/FEATURE-SPEC-TEMPLATE.md +88 -0
- package/packages/agent-skills/assets/to-workitems/SKILL.md +90 -0
- package/packages/agent-skills/assets/to-workitems/references/AZURE-DEVOPS-HIERARCHY.md +118 -0
- package/packages/agent-skills/assets/to-workitems/references/TICKET-TEMPLATES.md +70 -0
- package/packages/agent-skills/assets/wayfinder/SKILL.md +100 -0
- package/packages/agent-skills/assets/wayfinder/references/TEMPLATES.md +35 -0
- package/packages/agent-skills/assets/wayfinder/references/TICKET-TYPES.md +8 -0
- package/packages/agent-skills/deploy-profile.json +9 -0
- package/packages/agent-skills/deploy-profile.schema.json +45 -0
- package/packages/agent-skills/dist/deploy.d.ts +27 -0
- package/packages/agent-skills/dist/deploy.d.ts.map +1 -0
- package/packages/agent-skills/dist/deploy.js +186 -0
- package/packages/agent-skills/dist/deploy.js.map +1 -0
- package/packages/agent-skills/dist/doctor.d.ts +24 -0
- package/packages/agent-skills/dist/doctor.d.ts.map +1 -0
- package/packages/agent-skills/dist/doctor.js +141 -0
- package/packages/agent-skills/dist/doctor.js.map +1 -0
- package/packages/agent-skills/dist/fs-utils.d.ts +8 -0
- package/packages/agent-skills/dist/fs-utils.d.ts.map +1 -0
- package/packages/agent-skills/dist/fs-utils.js +40 -0
- package/packages/agent-skills/dist/fs-utils.js.map +1 -0
- package/packages/agent-skills/dist/index.d.ts +8 -0
- package/packages/agent-skills/dist/index.d.ts.map +1 -0
- package/packages/agent-skills/dist/index.js +8 -0
- package/packages/agent-skills/dist/index.js.map +1 -0
- package/packages/agent-skills/dist/legacy-lock.d.ts +44 -0
- package/packages/agent-skills/dist/legacy-lock.d.ts.map +1 -0
- package/packages/agent-skills/dist/legacy-lock.js +121 -0
- package/packages/agent-skills/dist/legacy-lock.js.map +1 -0
- package/packages/agent-skills/dist/list.d.ts +23 -0
- package/packages/agent-skills/dist/list.d.ts.map +1 -0
- package/packages/agent-skills/dist/list.js +75 -0
- package/packages/agent-skills/dist/list.js.map +1 -0
- package/packages/agent-skills/dist/manifest.d.ts +15 -0
- package/packages/agent-skills/dist/manifest.d.ts.map +1 -0
- package/packages/agent-skills/dist/manifest.js +57 -0
- package/packages/agent-skills/dist/manifest.js.map +1 -0
- package/packages/agent-skills/dist/profile.d.ts +41 -0
- package/packages/agent-skills/dist/profile.d.ts.map +1 -0
- package/packages/agent-skills/dist/profile.js +86 -0
- package/packages/agent-skills/dist/profile.js.map +1 -0
- package/packages/agent-skills/dist/skill-config.d.ts +24 -0
- package/packages/agent-skills/dist/skill-config.d.ts.map +1 -0
- package/packages/agent-skills/dist/skill-config.js +68 -0
- package/packages/agent-skills/dist/skill-config.js.map +1 -0
- package/packages/agent-skills/dist/skill-meta.d.ts +17 -0
- package/packages/agent-skills/dist/skill-meta.d.ts.map +1 -0
- package/packages/agent-skills/dist/skill-meta.js +67 -0
- package/packages/agent-skills/dist/skill-meta.js.map +1 -0
- package/packages/agent-skills/package.json +31 -0
- package/packages/agent-skills/src/deploy.ts +222 -0
- package/packages/agent-skills/src/doctor.ts +178 -0
- package/packages/agent-skills/src/fs-utils.ts +40 -0
- package/packages/agent-skills/src/index.ts +29 -0
- package/packages/agent-skills/src/legacy-lock.ts +152 -0
- package/packages/agent-skills/src/list.ts +94 -0
- package/packages/agent-skills/src/manifest.ts +66 -0
- package/packages/agent-skills/src/profile.ts +128 -0
- package/packages/agent-skills/src/skill-config.ts +75 -0
- package/packages/agent-skills/src/skill-meta.ts +78 -0
- package/packages/agent-skills/tsconfig.build.json +13 -0
- package/packages/agent-skills/tsconfig.json +23 -0
- package/packages/azdo/README.md +111 -0
- package/packages/azdo/package.json +21 -0
- package/packages/azdo/src/azdo-pl.ts +275 -0
- package/packages/azdo/src/azdo-pr-review.ts +160 -0
- package/packages/azdo/src/azdo-pr.ts +289 -0
- package/packages/azdo/src/azdo-repo-doctor.ts +839 -0
- package/packages/azdo/src/azdo-wit.ts +145 -0
- package/packages/azdo/src/cli.ts +251 -0
- package/packages/azdo/src/lib/agent-identity.ts +198 -0
- package/packages/azdo/src/lib/agent-token.ts +167 -0
- package/packages/azdo/src/lib/client.ts +259 -0
- package/packages/azdo/src/lib/graph-identity.ts +153 -0
- package/packages/azdo/src/lib/validate-pr-metadata.ts +57 -0
- package/packages/azdo/src/mcp-server.ts +209 -0
- package/packages/azdo/src/tool-dispatch.ts +204 -0
- package/packages/azdo/tsconfig.json +13 -0
- package/packages/fleet/jobs/git-maintain/src/main.ts +588 -0
- package/packages/fleet/manifest.json +207 -0
- package/packages/fleet/manifest.schema.json +283 -0
- package/packages/fleet/src/default-agent-file.ts +144 -0
- package/packages/fleet/src/install-adl-package.ts +178 -0
- package/packages/fleet/src/install-embedding-model.ts +412 -0
- package/packages/fleet/src/launch-agents.ts +649 -0
- package/packages/fleet/src/managed-settings.ts +278 -0
- package/packages/fleet/src/scratch-reap.ts +601 -0
- package/packages/fleet/src/vscode-settings.ts +705 -0
- package/packages/fleet/systemd/adl-azure-agent-update.service +13 -0
- package/packages/fleet/systemd/adl-azure-agent-update.timer +10 -0
- package/packages/repo-controls/AGENTS.md +96 -0
- package/packages/repo-controls/CLAUDE.md +1 -0
- package/packages/repo-controls/LICENSE +20 -0
- package/packages/repo-controls/README.md +493 -0
- package/packages/repo-controls/assets/enable-integration-auto-complete.mjs +79 -0
- package/packages/repo-controls/assets/promote.ts +371 -0
- package/packages/repo-controls/assets/version-bump.sh +189 -0
- package/packages/repo-controls/azure-pipelines.yml +274 -0
- package/packages/repo-controls/bin/adl-repo-controls.ts +10 -0
- package/packages/repo-controls/bunfig.toml +58 -0
- package/packages/repo-controls/package/adl-compliance/AGENTS.md +163 -0
- package/packages/repo-controls/package/adl-compliance/CLAUDE.md +1 -0
- package/packages/repo-controls/package/adl-compliance/conftest.py +78 -0
- package/packages/repo-controls/package/adl-compliance/pyproject.toml +31 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/__init__.py +50 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/__init__.py +98 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/__init__.py +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/adr_lifecycle/__init__.py +12 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/adr_lifecycle/check.py +210 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/adr_lifecycle/fixtures/adr-lifecycle-bad-status/docs/architecture/overview.md +8 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/adr_lifecycle/fixtures/adr-lifecycle-bad-status/docs/decisions/adr-901-proposed.md +10 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/adr_lifecycle/fixtures/adr-lifecycle-broken-backlink/docs/decisions/adr-902-dangling.md +11 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/adr_lifecycle/fixtures/adr-lifecycle-clean/docs/architecture/overview.md +8 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/adr_lifecycle/fixtures/adr-lifecycle-clean/docs/decisions/adr-900-example.md +10 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/adr_lifecycle/fixtures/adr-lifecycle-frontmatter-mismatch/.plans/b_committed/26-08-08-lifecycle-fixture.md +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/adr_lifecycle/fixtures/adr-lifecycle-frontmatter-mismatch/.specs/demo/lifecycle.md +7 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/adr_lifecycle/fixtures/adr-lifecycle-frontmatter-mismatch/docs/decisions/adr-903-frontmatter-mismatch.md +11 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/adr_lifecycle/fixtures/adr-lifecycle-inactive-plan/.plans/c_done/26-08-08-completed-fixture.md +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/adr_lifecycle/fixtures/adr-lifecycle-inactive-plan/.specs/demo/lifecycle.md +7 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/adr_lifecycle/fixtures/adr-lifecycle-inactive-plan/docs/decisions/adr-904-completed-plan.md +11 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/adr_lifecycle/test_check.py +127 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/closed_set/__init__.py +7 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/closed_set/check.py +91 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/closed_set/fixtures/docs/AGENTS.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/closed_set/fixtures/docs/CLAUDE.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/closed_set/fixtures/docs/architecture/declared.txt +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/closed_set/fixtures/docs/compliance/declared.txt +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/closed_set/fixtures/docs/decisions/declared.txt +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/closed_set/fixtures/docs/index.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/closed_set/fixtures/docs/operations/declared.txt +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/closed_set/fixtures/docs/research/declared.txt +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/closed_set/fixtures/docs/stray-root-file.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/closed_set/fixtures/docs/totally-made-up/nonsense.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/closed_set/test_check.py +106 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/english_only/__init__.py +7 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/english_only/check.py +291 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/english_only/fixtures/clean/backend/clean.rs +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/english_only/fixtures/excluded/frontend/mobile/src/i18n/locales/zh-CN/strings.ts +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/english_only/fixtures/violation/backend/escaped.rs +2 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/english_only/fixtures/violation/backend/raw.rs +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/english_only/fixtures/violation/backend//346/226/207/344/273/266.rs +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/english_only/test_check.py +193 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/index_updated/__init__.py +12 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/index_updated/check.py +140 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/index_updated/fixtures/index-updated-clean/docs/architecture/foo.md +7 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/index_updated/fixtures/index-updated-clean/docs/architecture/index.md +10 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/index_updated/fixtures/index-updated-violation/docs/architecture/foo.md +7 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/index_updated/fixtures/index-updated-violation/docs/architecture/index.md +9 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/index_updated/test_check.py +98 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/indexes/__init__.py +12 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/indexes/check.py +378 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/indexes/docs-knowledge-indexes.yaml +192 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/indexes/fixtures/knowledge-indexes-clean/docs/index.md +14 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/indexes/fixtures/knowledge-indexes-clean/docs/one.md +7 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/indexes/fixtures/knowledge-indexes-clean/docs/two.md +7 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/indexes/fixtures/knowledge-indexes-clean/docs-knowledge-indexes.yaml +20 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/indexes/fixtures/knowledge-indexes-duplicate/docs/index.md +15 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/indexes/fixtures/knowledge-indexes-duplicate/docs/one.md +7 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/indexes/fixtures/knowledge-indexes-duplicate/docs/two.md +7 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/indexes/fixtures/knowledge-indexes-duplicate/docs-knowledge-indexes.yaml +16 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/indexes/fixtures/knowledge-indexes-missing-entry/docs/index.md +13 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/indexes/fixtures/knowledge-indexes-missing-entry/docs/one.md +7 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/indexes/fixtures/knowledge-indexes-missing-entry/docs/two.md +7 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/indexes/fixtures/knowledge-indexes-missing-entry/docs-knowledge-indexes.yaml +16 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/indexes/test_check.py +102 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/ledger/__init__.py +12 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/ledger/check.py +387 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/ledger/fixtures/ledger-bad-date/plans/LEDGER.md +5 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/ledger/fixtures/ledger-clean/plans/LEDGER.md +6 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/ledger/fixtures/ledger-empty-table/plans/LEDGER.md +4 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/ledger/fixtures/ledger-long-event/plans/LEDGER.md +5 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/ledger/fixtures/ledger-violation/plans/LEDGER.md +5 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/ledger/test_check.py +427 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/markdown_ast/__init__.py +11 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/markdown_ast/check.py +84 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/markdown_ast/fixtures/markdown-structure-bad-fence/docs/bad-fence.md +2 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/markdown_ast/fixtures/markdown-structure-bad-fence/docs/valid.md +5 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/markdown_ast/fixtures/markdown-structure-bad-frontmatter/docs/bad-front-matter.md +2 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/markdown_ast/fixtures/markdown-structure-bad-frontmatter/docs/valid.md +5 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/markdown_ast/fixtures/markdown-structure-clean/docs/valid.md +7 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/markdown_ast/test_check.py +126 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/__init__.py +12 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/check.py +210 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/docs-okf-profiles.yaml +119 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-profile-clean/docs/architecture/demo.md +17 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-profile-clean/docs-okf-profiles.yaml +8 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-profile-violation/docs/architecture/bad-status.md +17 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-profile-violation/docs-okf-profiles.yaml +8 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/test_check.py +49 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/register.py +159 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/semantics/__init__.py +12 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/semantics/check.py +578 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/semantics/fixtures/semantics-clean/docs/architecture/backend/crate-overview.md +8 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/semantics/fixtures/semantics-clean/docs/architecture/team/team-overview.md +8 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/semantics/fixtures/semantics-clean/docs/compliance/controls/control-matrix.md +12 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/semantics/fixtures/semantics-clean/docs/compliance/controls/control-matrix.yaml +10 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/semantics/fixtures/semantics-clean/docs/research/benchmarks/note.md +24 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/semantics/fixtures/semantics-violations/docs/architecture/backend/crate-overview.md +8 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/semantics/fixtures/semantics-violations/docs/architecture/product/stable-delivery.md +10 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/semantics/fixtures/semantics-violations/docs/architecture/product/stable-recommendation.md +12 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/semantics/fixtures/semantics-violations/docs/architecture/product/target-narration.md +10 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/semantics/fixtures/semantics-violations/docs/architecture/team/team-overview.md +8 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/semantics/fixtures/semantics-violations/docs/compliance/controls/control-matrix.md +8 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/semantics/fixtures/semantics-violations/docs/compliance/controls/control-matrix.yaml +17 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/semantics/fixtures/semantics-violations/docs/research/benchmarks/bad-research.md +8 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/semantics/test_check.py +461 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/__init__.py +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/agents_layout/__init__.py +12 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/agents_layout/check.py +124 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/agents_layout/fixtures/.workflows/AGENTS.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/agents_layout/fixtures/.workflows/CLAUDE.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/agents_layout/fixtures/AGENTS.md +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/agents_layout/fixtures/CLAUDE.md +2 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/agents_layout/fixtures/INVARIANTS.md +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/agents_layout/fixtures/bad-pointer/AGENTS.md +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/agents_layout/fixtures/bad-pointer/CLAUDE.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/agents_layout/fixtures/docs/AGENTS.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/agents_layout/fixtures/docs/CLAUDE.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/agents_layout/fixtures/missing-pair/AGENTS.md +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/agents_layout/fixtures/owned/AGENTS.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/agents_layout/fixtures/owned/CLAUDE.md +2 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/agents_layout/test_check.py +116 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/ci_paths/__init__.py +13 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/ci_paths/check.py +380 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/ci_paths/fixtures/redeclared-workflows-tree/automation/pipelines/pr-validation.yaml +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/ci_paths/test_check.py +274 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/__init__.py +12 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/check.py +227 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-clean/frontend/packages/desktop/src/renderer/solo/item.ts +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-clean/grants.yaml +6 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-excluded/frontend/packages/desktop/src/renderer/fresh/fresh.ts +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-excluded/frontend/packages/desktop/src/renderer/many/sub1/only.ts +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-excluded/frontend/packages/desktop/src/renderer/many/sub10/only.ts +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-excluded/frontend/packages/desktop/src/renderer/many/sub11/only.ts +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-excluded/frontend/packages/desktop/src/renderer/many/sub2/only.ts +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-excluded/frontend/packages/desktop/src/renderer/many/sub3/only.ts +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-excluded/frontend/packages/desktop/src/renderer/many/sub4/only.ts +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-excluded/frontend/packages/desktop/src/renderer/many/sub5/only.ts +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-excluded/frontend/packages/desktop/src/renderer/many/sub6/only.ts +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-excluded/frontend/packages/desktop/src/renderer/many/sub7/only.ts +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-excluded/frontend/packages/desktop/src/renderer/many/sub8/only.ts +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-excluded/frontend/packages/desktop/src/renderer/many/sub9/only.ts +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-excluded/frontend/packages/desktop/src/renderer/services/i18n/locales/de/common.json +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-excluded/frontend/packages/desktop/src/renderer/solo/item.ts +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-excluded/frontend/packages/desktop/src/vendored-crate/Cargo.toml +2 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-excluded/grants.yaml +6 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-unbaselined/frontend/packages/desktop/src/renderer/fresh/fresh.ts +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-unbaselined/frontend/packages/desktop/src/renderer/many/sub1/only.ts +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-unbaselined/frontend/packages/desktop/src/renderer/many/sub10/only.ts +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-unbaselined/frontend/packages/desktop/src/renderer/many/sub11/only.ts +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-unbaselined/frontend/packages/desktop/src/renderer/many/sub2/only.ts +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-unbaselined/frontend/packages/desktop/src/renderer/many/sub3/only.ts +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-unbaselined/frontend/packages/desktop/src/renderer/many/sub4/only.ts +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-unbaselined/frontend/packages/desktop/src/renderer/many/sub5/only.ts +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-unbaselined/frontend/packages/desktop/src/renderer/many/sub6/only.ts +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-unbaselined/frontend/packages/desktop/src/renderer/many/sub7/only.ts +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-unbaselined/frontend/packages/desktop/src/renderer/many/sub8/only.ts +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-unbaselined/frontend/packages/desktop/src/renderer/many/sub9/only.ts +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-unbaselined/frontend/packages/desktop/src/renderer/solo/item.ts +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-unbaselined/grants.yaml +6 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/test_check.py +138 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/markdown_trees/__init__.py +12 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/markdown_trees/check.py +240 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/markdown_trees/fixtures/markdown-trees-clean/.plans/a_new/plan.md +7 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/markdown_trees/fixtures/markdown-trees-clean/backend/AGENTS.md +4 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/markdown_trees/fixtures/markdown-trees-clean/docs/page.md +7 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/markdown_trees/fixtures/markdown-trees-stray/backend/notes.md +4 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/markdown_trees/fixtures/markdown-trees-stray/docs/page.md +8 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/markdown_trees/test_check.py +220 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/open_work_cap/__init__.py +5 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/open_work_cap/check.py +225 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/open_work_cap/fixtures/open-work-cap-clean/plans/GAPS-AND-FINDINGS.md +5 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/open_work_cap/fixtures/open-work-cap-clean/plans/features/az601-clean/spec.md +10 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/open_work_cap/test_check.py +330 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/placement/__init__.py +12 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/placement/check.py +240 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/placement/fixtures/placement-allowed/agent/crates/enact-providers/src/snapshots/README.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/placement/fixtures/placement-allowed/backend/crates/enact-app/assets/builtin-assistants/avatars/assistant.jpg +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/placement/fixtures/placement-allowed/backend/crates/enact-assets/assets/logos/tools/coding/tool.png +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/placement/fixtures/placement-allowed/backend/crates/enact-session/src/backend/codex_init_prompt.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/placement/fixtures/placement-allowed/frontend/mobile/assets/images/icon.png +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/placement/fixtures/placement-allowed/frontend/packages/desktop/src/renderer/assets/logos/brand/app.png +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/placement/fixtures/placement-allowed/frontend/packages/desktop/src/renderer/assets/themes/default-theme.png +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/placement/fixtures/placement-allowed/frontend/public/pwa/icon-192.png +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/placement/fixtures/placement-allowed/frontend/resources/product.png +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/placement/fixtures/placement-stray/apps/legacy/file.ts +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/placement/fixtures/placement-stray/backend/crates/enact-session/src/backend/README.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/placement/fixtures/placement-stray/frontend/unapproved/screenshot.png +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/placement/test_check.py +230 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/plan_metadata.py +53 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/plans_layout/__init__.py +7 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/plans_layout/check.py +438 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/plans_layout/fixtures/plans-layout-clean/plans/AGENTS.md +1 -0
- 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 +9 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/plans_layout/fixtures/plans-layout-clean/plans/features/az347-test-coverage/spec.md +12 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/plans_layout/fixtures/plans-layout-clean/plans/templates/feature.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/plans_layout/fixtures/plans-layout-violation/plans/features/az347-test-coverage/items/az351-restore-entrypoint.md +9 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/plans_layout/fixtures/plans-layout-violation/plans/features/az347-test-coverage/spec.md +12 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/plans_layout/test_check.py +461 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/profile_data/__init__.py +11 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/profile_data/check.py +62 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/profile_data/fixtures/migration-filenames/backend/crates/demo/NotAMigration.sql +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/profile_data/fixtures/migration-filenames/backend/crates/demo/migrations/0001_long_prefix.sql +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/profile_data/fixtures/migration-filenames/backend/crates/demo/migrations/001_init.sql +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/profile_data/fixtures/migration-filenames/backend/crates/demo/migrations/002_add_index.sql +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/profile_data/fixtures/migration-filenames/backend/crates/demo/migrations/003-dashed-slug.sql +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/profile_data/fixtures/migration-filenames/backend/crates/demo/migrations/004_MixedCase.sql +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/profile_data/fixtures/migration-filenames/backend/crates/demo/migrations/005_trailing space.sql +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/profile_data/fixtures/migration-filenames/backend/crates/demo/migrations/01_short_prefix.sql +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/profile_data/fixtures/migration-filenames/backend/crates/demo/migrations/not-a-migration.sql +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/profile_data/test_check.py +116 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/references/__init__.py +11 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/references/check.py +188 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/references/fixtures/link-targets-broken/.plans/c_done/26-07-27-history.md +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/references/fixtures/link-targets-broken/docs/README.md +8 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/references/fixtures/link-targets-broken/docs/architecture/product/links.md +20 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/references/fixtures/link-targets-broken/docs/architecture/product/route-target.md +8 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/references/fixtures/link-targets-clean/.plans/c_done/26-07-27-history.md +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/references/fixtures/link-targets-clean/docs/README.md +8 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/references/fixtures/link-targets-clean/docs/architecture/product/links.md +20 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/references/fixtures/link-targets-clean/docs/architecture/product/route-target.md +8 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/references/test_check.py +166 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/__init__.py +11 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/check.py +135 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/fixtures/.agents/declared.txt +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/fixtures/.changeset/declared.txt +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/fixtures/.claude/declared.txt +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/fixtures/.code-review-graph/declared.txt +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/fixtures/.code-review-graph_old/declared.txt +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/fixtures/.codex/declared.txt +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/fixtures/.cursor/declared.txt +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/fixtures/.cursorrules +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/fixtures/.dockerignore +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/fixtures/.docs/declared.txt +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/fixtures/.donors/declared.txt +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/fixtures/.gitattributes +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/fixtures/.kimi-code/declared.txt +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/fixtures/.lfsconfig +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/fixtures/.mcp.json +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/fixtures/.opencode/declared.txt +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/fixtures/.workflows/declared.txt +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/fixtures/AGENTS.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/fixtures/CHANGELOG.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/fixtures/CLAUDE-INVARIANTS.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/fixtures/CLAUDE.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/fixtures/INDEPENDENT-VERIFICATION.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/fixtures/INVARIANTS.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/fixtures/LICENSE +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/fixtures/NOTICE +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/fixtures/README.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/fixtures/RELEASE.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/fixtures/VERSION +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/fixtures/backend/declared.txt +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/fixtures/compliance/declared.txt +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/fixtures/dev/declared.txt +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/fixtures/docker/declared.txt +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/fixtures/docs/declared.txt +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/fixtures/frontend/declared.txt +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/fixtures/infra/declared.txt +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/fixtures/justfile +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/fixtures/opencode.jsonc +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/fixtures/rule-tests/undeclared.txt +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/fixtures/rules/undeclared.txt +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/fixtures/unapproved-root/undeclared.txt +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/fixtures/undeclared-root-file.txt +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/test_check.py +122 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_markdown_allowlist/__init__.py +12 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_markdown_allowlist/check.py +290 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_markdown_allowlist/fixtures/root-markdown-clean/.changeset/some-change.md +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_markdown_allowlist/fixtures/root-markdown-clean/.plans/AGENTS.md +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_markdown_allowlist/fixtures/root-markdown-clean/.specs/AGENTS.md +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_markdown_allowlist/fixtures/root-markdown-clean/.workflows/AGENTS.md +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_markdown_allowlist/fixtures/root-markdown-clean/AGENTS.md +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_markdown_allowlist/fixtures/root-markdown-clean/CHANGELOG.md +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_markdown_allowlist/fixtures/root-markdown-clean/CLAUDE.md +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_markdown_allowlist/fixtures/root-markdown-clean/INDEPENDENT-VERIFICATION.md +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_markdown_allowlist/fixtures/root-markdown-clean/INVARIANTS.md +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_markdown_allowlist/fixtures/root-markdown-clean/README.md +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_markdown_allowlist/fixtures/root-markdown-clean/RELEASE.md +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_markdown_allowlist/fixtures/root-markdown-clean/STRAY.md +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_markdown_allowlist/fixtures/root-markdown-clean/docs/AGENTS.md +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_markdown_allowlist/fixtures/root-markdown-clean/docs/architecture/note.md +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_markdown_allowlist/fixtures/root-markdown-clean/frontend/README.md +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_markdown_allowlist/fixtures/root-markdown-missing-guide/.workflows/AGENTS.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_markdown_allowlist/fixtures/root-markdown-missing-guide/AGENTS.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_markdown_allowlist/fixtures/root-markdown-missing-guide/README.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_markdown_allowlist/fixtures/root-markdown-missing-guide/docs/overview.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_markdown_allowlist/fixtures/root-markdown-missing-guide/plans/AGENTS.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_markdown_allowlist/test_check.py +329 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/scripts_size_depth/__init__.py +12 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/scripts_size_depth/check.py +127 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/scripts_size_depth/fixtures/scripts-layout/.workflows/scripts/a/b/c/d/at-limit.sh +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/scripts_size_depth/fixtures/scripts-layout/.workflows/scripts/a/b/c/d/e/too-deep.sh +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/scripts_size_depth/fixtures/scripts-layout/.workflows/scripts/direct-01.sh +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/scripts_size_depth/fixtures/scripts-layout/.workflows/scripts/direct-02.sh +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/scripts_size_depth/fixtures/scripts-layout/.workflows/scripts/direct-03.sh +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/scripts_size_depth/fixtures/scripts-layout/.workflows/scripts/direct-04.sh +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/scripts_size_depth/fixtures/scripts-layout/.workflows/scripts/direct-05.sh +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/scripts_size_depth/fixtures/scripts-layout/.workflows/scripts/direct-06.sh +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/scripts_size_depth/fixtures/scripts-layout/.workflows/scripts/direct-07.sh +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/scripts_size_depth/fixtures/scripts-layout/.workflows/scripts/direct-08.sh +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/scripts_size_depth/fixtures/scripts-layout/.workflows/scripts/direct-09.sh +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/scripts_size_depth/fixtures/scripts-layout/.workflows/scripts/direct-10.sh +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/scripts_size_depth/fixtures/scripts-layout/.workflows/scripts/direct-11.sh +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/scripts_size_depth/fixtures/scripts-layout/.workflows/scripts/direct-12.sh +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/scripts_size_depth/fixtures/scripts-layout/.workflows/scripts/direct-13.sh +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/scripts_size_depth/fixtures/scripts-layout/.workflows/scripts/direct-14.sh +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/scripts_size_depth/fixtures/scripts-layout/.workflows/scripts/direct-15.sh +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/scripts_size_depth/fixtures/scripts-layout/.workflows/scripts/direct-16.sh +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/scripts_size_depth/test_check.py +163 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/__init__.py +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/__init__.py +11 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/check.py +169 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/attribute-without-conversion/.gitattributes +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/attribute-without-conversion/large file.bin +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/clean/.gitattributes +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/clean/large file.bin +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/clean/small.txt +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/missing-filter/large file.bin +0 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/unmatched-extension/.gitattributes +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/unmatched-extension/payload.dat +0 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/test_check.py +133 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/pipeline/__init__.py +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/pipeline/phase_disjoint/__init__.py +12 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/pipeline/phase_disjoint/check.py +129 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/pipeline/phase_disjoint/fixtures/disjoint/gate-registry.yaml +13 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/pipeline/phase_disjoint/fixtures/empty/gate-registry.yaml +7 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/pipeline/phase_disjoint/fixtures/overlapping/gate-registry.yaml +13 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/pipeline/phase_disjoint/test_check.py +109 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/release/__init__.py +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/release/changeset_plan/__init__.py +11 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/release/changeset_plan/check.py +149 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/release/changeset_plan/fixtures/clean/docs/readme.md +4 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/release/changeset_plan/fixtures/relevant/VERSION +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/release/changeset_plan/test_check.py +151 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/release/version_release/__init__.py +11 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/release/version_release/check.py +202 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/release/version_release/fixtures/aligned/.workflows/changesets/package.json +5 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/release/version_release/fixtures/aligned/.workflows/package.json +5 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/release/version_release/fixtures/aligned/CHANGELOG.md +5 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/release/version_release/fixtures/aligned/VERSION +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/release/version_release/fixtures/mismatched/.workflows/changesets/package.json +5 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/release/version_release/fixtures/mismatched/.workflows/package.json +5 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/release/version_release/fixtures/mismatched/CHANGELOG.md +5 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/release/version_release/fixtures/mismatched/VERSION +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/release/version_release/test_check.py +162 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/__init__.py +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/banned_commands/__init__.py +12 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/banned_commands/check.py +103 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/banned_commands/fixtures/no-banned-commands/compliance_py/checks/git-bad.sh +2 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/banned_commands/fixtures/no-banned-commands/compliance_py/checks/git-note.sh +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/banned_commands/fixtures/no-banned-commands/compliance_py/checks/good.sh +2 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/banned_commands/fixtures/no-banned-commands/compliance_py/checks/grep-bad.sh +2 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/banned_commands/fixtures/no-banned-commands/compliance_py/checks/grep-note.sh +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/banned_commands/fixtures/no-banned-commands/compliance_py/checks/grep-trailing.sh +2 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/banned_commands/fixtures/no-banned-commands/compliance_py/checks/notes.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/banned_commands/fixtures/no-banned-commands/elsewhere/loose-git.sh +6 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/banned_commands/fixtures/no-banned-commands/elsewhere/loose-grep.sh +4 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/banned_commands/test_check.py +117 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/ignored_paths/__init__.py +13 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/ignored_paths/check.py +265 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/ignored_paths/fixtures/ignored-paths/keep.log +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/ignored_paths/fixtures/ignored-paths/src/main.rs +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/ignored_paths/test_check.py +180 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/license_declared/__init__.py +12 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/license_declared/check.py +84 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/license_declared/fixtures/license-declared-clean/LICENSE +10 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/license_declared/fixtures/license-declared-mismatch/LICENSE +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/license_declared/fixtures/license-declared-missing/README.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/license_declared/test_check.py +66 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/lockfile_integrity/__init__.py +11 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/lockfile_integrity/check.py +167 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/lockfile_integrity/fixtures/clean/backend/Cargo.lock +7 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/lockfile_integrity/fixtures/clean/backend/Cargo.toml +4 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/lockfile_integrity/fixtures/clean/backend/rust-toolchain.toml +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/lockfile_integrity/fixtures/clean/backend/src/main.rs +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/lockfile_integrity/fixtures/clean/frontend/bun.lock +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/lockfile_integrity/fixtures/empty-bun-lock/backend/Cargo.lock +7 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/lockfile_integrity/fixtures/empty-bun-lock/backend/Cargo.toml +4 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/lockfile_integrity/fixtures/empty-bun-lock/backend/rust-toolchain.toml +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/lockfile_integrity/fixtures/empty-bun-lock/backend/src/main.rs +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/lockfile_integrity/fixtures/empty-bun-lock/frontend/bun.lock +0 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/lockfile_integrity/test_check.py +109 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/cli.py +483 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/core/__init__.py +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/core/ast_grep.py +199 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/core/batch.py +52 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/core/check.py +303 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/core/constants.py +106 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/core/context.py +99 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/core/errors.py +32 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/core/finding.py +65 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/core/models.py +40 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/core/receipt.py +63 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/core/scope.py +82 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/core/verdict.py +161 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/policy/__init__.py +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/policy/config.py +131 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/policy/config.toml +30 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/policy/docs_shape.py +65 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/policy/gate-registry.alt.yaml +791 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/policy/gate-registry.schema.yaml +176 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/policy/gate-registry.yaml +791 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/policy/grants-registry.yaml +112 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/policy/grants.py +129 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/policy/registry.py +281 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/policy/root_shape.py +250 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/policy/severity-policy.yaml +114 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/providers/__init__.py +11 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/runner.py +371 -0
- package/packages/repo-controls/package/adl-compliance/uv.lock +199 -0
- package/packages/repo-controls/package.json +33 -0
- package/packages/repo-controls/scripts/hooks/commit-msg +63 -0
- package/packages/repo-controls/scripts/hooks/lib/hook-log.sh +62 -0
- package/packages/repo-controls/scripts/hooks/post-checkout +15 -0
- package/packages/repo-controls/scripts/hooks/post-commit +18 -0
- package/packages/repo-controls/scripts/hooks/pre-commit +82 -0
- package/packages/repo-controls/scripts/hooks/pre-push +144 -0
- package/packages/repo-controls/src/azdo-push.ts +463 -0
- package/packages/repo-controls/src/azure-devops-governance.ts +248 -0
- package/packages/repo-controls/src/azure-devops-remote.ts +61 -0
- package/packages/repo-controls/src/cli.ts +188 -0
- package/packages/repo-controls/src/compliance-config.ts +200 -0
- package/packages/repo-controls/src/config.ts +690 -0
- package/packages/repo-controls/src/constants.ts +97 -0
- package/packages/repo-controls/src/coverage-ratchet.ts +153 -0
- package/packages/repo-controls/src/doc-freshness.ts +172 -0
- package/packages/repo-controls/src/doctor.ts +304 -0
- package/packages/repo-controls/src/findings-ratchet.ts +163 -0
- package/packages/repo-controls/src/gitignore-block.ts +253 -0
- package/packages/repo-controls/src/hook-log.ts +72 -0
- package/packages/repo-controls/src/hook.ts +694 -0
- package/packages/repo-controls/src/install.ts +506 -0
- package/packages/repo-controls/src/integrity.ts +104 -0
- package/packages/repo-controls/src/promote.ts +25 -0
- package/packages/repo-controls/src/runtime.ts +110 -0
- package/packages/repo-controls/src/workflows-drift.ts +106 -0
- package/packages/repo-controls/src/worktree-guard.ts +272 -0
- package/packages/repo-controls/src/worktree-limit.ts +11 -0
- package/packages/repo-controls/tsconfig.json +14 -0
- package/packages/repo-controls/workflows/scripts/release/verify-npm-artifact.ts +119 -0
|
@@ -0,0 +1,403 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `adl.session-required-for-writes` — the managed baseline hook (docs/architecture/cli-design.md
|
|
3
|
+
* §2/§3, item 10).
|
|
4
|
+
*
|
|
5
|
+
* WIDENED 2026-09-28 (STATUS.md 12p, "The
|
|
6
|
+
* standard" / W2 build item 3): the name is kept for git-history continuity,
|
|
7
|
+
* but this rule's job is no longer "writes only". Every Azure DevOps access
|
|
8
|
+
* — reads included — needs a resolvable agent identity now: `adl run --as
|
|
9
|
+
* <agent>`'s session env, the machine default-agent file
|
|
10
|
+
* (`adl-identity.ts`'s `resolveFromEnvOrFile`, steps 2-3 of the standard),
|
|
11
|
+
* or a valid inline `ADL_AGENT_ID_AGENT=<agent>` override on the command
|
|
12
|
+
* itself (step 1, detected via `../shell/git-identity.ts`'s
|
|
13
|
+
* `commandHasValidInlineIdentity` — see `checkResolvableIdentity` below). With
|
|
14
|
+
* NONE of those present, this rule denies every identity-bearing command
|
|
15
|
+
* class (git network reads/writes, the azdo MCP tools including their reads,
|
|
16
|
+
* `adl mcp cli`/`adl repo doctor`/`adl repo controls azdo-push`/`adl id
|
|
17
|
+
* token`/`adl-agent-id exec`, and curl/wget/httpie/xh to
|
|
18
|
+
* dev.azure.com/*.visualstudio.com under any HTTP method) with the
|
|
19
|
+
* standard's own message; every other command is left alone. Once an
|
|
20
|
+
* identity resolves, this rule gets out of the way entirely — `git-ado`/
|
|
21
|
+
* `adl`'s own rules, and the role rules, police what an authenticated
|
|
22
|
+
* session may do.
|
|
23
|
+
*
|
|
24
|
+
* Four write surfaces, each inspected in the shape the shell/tool-call
|
|
25
|
+
* classifier already hands every other rule:
|
|
26
|
+
*
|
|
27
|
+
* - `git push` (`../shell/invocation.ts`'s `'git'` kind). The hook cannot run
|
|
28
|
+
* `git remote get-url` (it decides before the child runs, statically, off
|
|
29
|
+
* argv alone) the way the deployed `bin/git` front controller can — so an
|
|
30
|
+
* explicit `https://.../dev.azure.com/...` URL anywhere in the push's
|
|
31
|
+
* arguments is authoritative, and otherwise the destination is UNRESOLVED
|
|
32
|
+
* (a bare `git push`, or `git push origin main` naming a remote this rule
|
|
33
|
+
* cannot look up) and fails closed: unresolved is treated exactly like
|
|
34
|
+
* "proven Azure DevOps", because the rule cannot prove otherwise. Only an
|
|
35
|
+
* explicit NON-Azure-DevOps URL is provably safe and lets a write through
|
|
36
|
+
* without an identity. `git-verify.ts`'s `git.no-verify` corpus already
|
|
37
|
+
* anticipates this: its own `allow` list deliberately never contains a bare
|
|
38
|
+
* `git push` or `git push -n`, see the comment there and
|
|
39
|
+
* `rules-corpus-executed.test.ts`'s "corrected corpus entries" check.
|
|
40
|
+
* - `az devops|repos|pipelines|boards|artifacts ...` (the `'azure-devops'`
|
|
41
|
+
* kind). `tool.azure-devops` (`./tool-azure-devops.ts`) already denies
|
|
42
|
+
* EVERY direct invocation of this family outright, read or write,
|
|
43
|
+
* identity or not, steering everything at the MCP server — and it is
|
|
44
|
+
* registered ahead of this rule, so in the real engine it always reports
|
|
45
|
+
* first. This rule's own az-CLI classification (read verbs `list`/`show`/
|
|
46
|
+
* `get`/`query` vs. everything else, fail-closed to "write" when neither
|
|
47
|
+
* matches) is therefore defense in depth for a repository that disables
|
|
48
|
+
* `tool.azure-devops` (`[rules."tool.azure-devops"] enabled = false`), not
|
|
49
|
+
* something reachable through `decide()` today — see
|
|
50
|
+
* `tests/unit/rules-adl-session-required.test.ts`, which exercises it via
|
|
51
|
+
* a direct `match()` call rather than the shared corpus (which runs
|
|
52
|
+
* through the real engine and would otherwise always see `tool.azure-devops`
|
|
53
|
+
* win first).
|
|
54
|
+
* - `curl`/`wget`/httpie (`http`/`https`)/`xh` (the generic `'command'` kind)
|
|
55
|
+
* with a non-GET method against a `dev.azure.com` URL. curl's method is
|
|
56
|
+
* explicit (`-X`/`--request`) or implied by a data flag (`-d`/`--data*`,
|
|
57
|
+
* `-F`/`--form`, `--json`); wget's by `--method=`/`--post-data`/
|
|
58
|
+
* `--post-file`; httpie/xh's by an explicit leading method argument or a
|
|
59
|
+
* request-item/`--form`/`--raw` implying a body (httpie's own semantics:
|
|
60
|
+
* a request with data defaults to POST, one without defaults to GET).
|
|
61
|
+
* - An Azure DevOps MCP write tool (the `'tool-call'` kind), named
|
|
62
|
+
* `mcp__<prefix>__<tool>` where `<tool>` is one of the four mutating
|
|
63
|
+
* tools `packages/azdo/src/mcp-server.ts` actually registers:
|
|
64
|
+
* `pr_create_or_update`, `pr_review`, `build_run`, `workitem_create_or_update`. The
|
|
65
|
+
* match is on the TOOL NAME alone, not the server prefix — the package is
|
|
66
|
+
* `azdo`, P4 folds the server under `adl`, and Claude Code's plugin-scoped
|
|
67
|
+
* form (`mcp__plugin_<plugin>_<server>__<tool>`) adds a third spelling —
|
|
68
|
+
* so `mcp__azdo__...`, `mcp__adl__...`, `mcp__azure-devops-mcp__...` and
|
|
69
|
+
* `mcp__plugin_adl_azdo__...` are all matched the same way. Its three read
|
|
70
|
+
* tools (`pr_list_or_get`, `build_list_or_get`, `workitem_list_or_get`)
|
|
71
|
+
* are left alone under every one of those prefixes too.
|
|
72
|
+
*/
|
|
73
|
+
|
|
74
|
+
import type { Invocation } from '../shell/invocation.ts'
|
|
75
|
+
import type { Token } from '../shell/token.ts'
|
|
76
|
+
import { dynamicToken, tokenValue } from '../shell/token.ts'
|
|
77
|
+
import { commandHasValidInlineIdentity, isNetworkGitInvocation } from '../shell/git-identity.ts'
|
|
78
|
+
import type { EnvPort } from '../ports.ts'
|
|
79
|
+
import type { Finding, MessageContext, RuleContext, RuleSpec } from '../spec.ts'
|
|
80
|
+
import { noParams } from '../spec.ts'
|
|
81
|
+
import {
|
|
82
|
+
ADL_AGENT_ID_BINARY_NAMES,
|
|
83
|
+
ADL_AGENT_ID_COMMAND_SHAPES,
|
|
84
|
+
ADL_BINARY_NAMES,
|
|
85
|
+
ADL_IDENTITY_COMMAND_SHAPES,
|
|
86
|
+
classifyGitPushDestination,
|
|
87
|
+
containsIdentityBearingToken,
|
|
88
|
+
HTTP_CLIENT_BINARY_NAMES,
|
|
89
|
+
httpClientMethod,
|
|
90
|
+
isAdoUrl,
|
|
91
|
+
isHelpOnlyInvocation,
|
|
92
|
+
matchesIdentityShape,
|
|
93
|
+
skipLeadingDashFlags,
|
|
94
|
+
} from './git-helpers.ts'
|
|
95
|
+
import { NO_AGENT_IDENTITY_MESSAGE, resolveFromEnvOrFile } from './adl-identity.ts'
|
|
96
|
+
import { detailString } from './messages.ts'
|
|
97
|
+
import { mcpToolName } from './mcp-tool.ts'
|
|
98
|
+
|
|
99
|
+
const RULE_ID = 'adl.session-required-for-writes'
|
|
100
|
+
const ENV_VAR = 'ADL_AGENT_ID_AGENT'
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* M7 (STATUS.md 12p): whether an identity is
|
|
104
|
+
* resolvable for `command`, and if not, the EXACT message to show — the
|
|
105
|
+
* one standard `NO_AGENT_IDENTITY_MESSAGE` when nothing is configured at
|
|
106
|
+
* all, or the SPECIFIC named error when something IS configured but is
|
|
107
|
+
* invalid (an unrecognized `ADL_AGENT_ID_AGENT` value, or a default-agent
|
|
108
|
+
* file naming an agent outside `VALID_AGENTS`) — `resolveFromEnvOrFile`'s
|
|
109
|
+
* own `UnresolvedIdentity.message` already carries exactly the right text
|
|
110
|
+
* for either case (see `adl-identity.ts`'s `resolveFromEnvOrFile`: it is
|
|
111
|
+
* `NO_AGENT_IDENTITY_MESSAGE` verbatim for `reason: 'none'`, and the named
|
|
112
|
+
* `invalidAgentError` text for `reason: 'invalid'`), so this reads that
|
|
113
|
+
* message through rather than reporting the SAME generic "run the fleet
|
|
114
|
+
* reconcile" text regardless of which of the two actually happened — an
|
|
115
|
+
* invalid identity is a materially different, more actionable diagnosis
|
|
116
|
+
* than none configured at all, and reporting the generic text for both
|
|
117
|
+
* hid that distinction from the agent.
|
|
118
|
+
*
|
|
119
|
+
* A valid inline `ADL_AGENT_ID_AGENT=<agent>` override anywhere on the
|
|
120
|
+
* command line (step 1 of the standard — coarse, whole-command; see
|
|
121
|
+
* `commandHasValidInlineIdentity`'s own doc for what that trades off)
|
|
122
|
+
* resolves too, without needing the session env / machine default-agent
|
|
123
|
+
* file (steps 2-3) at all.
|
|
124
|
+
*/
|
|
125
|
+
type IdentityCheck = { readonly resolvable: true } | { readonly resolvable: false; readonly message: string }
|
|
126
|
+
|
|
127
|
+
function checkResolvableIdentity(command: string, env: EnvPort): IdentityCheck {
|
|
128
|
+
if (commandHasValidInlineIdentity(command)) return { resolvable: true }
|
|
129
|
+
const resolution = resolveFromEnvOrFile(env)
|
|
130
|
+
return resolution.ok ? { resolvable: true } : { resolvable: false, message: resolution.message }
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
const classifyPush = classifyGitPushDestination
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* az CLI verbs that only read. Fail-closed by design: anything NOT
|
|
137
|
+
* recognized here (including a verb this list simply does not know about
|
|
138
|
+
* yet) is treated as a write, never the reverse. Recognized against the
|
|
139
|
+
* FULL args after `az` (the subcommand group included, e.g. `repos pr
|
|
140
|
+
* list`) — a flag's VALUE (`--status active`) could in principle collide
|
|
141
|
+
* with a verb spelling, an accepted heuristic risk given `tool.azure-devops`
|
|
142
|
+
* denies the whole family outright regardless (see header).
|
|
143
|
+
*/
|
|
144
|
+
const AZ_READ_VERBS: ReadonlySet<string> = new Set(['list', 'show', 'get', 'query'])
|
|
145
|
+
|
|
146
|
+
function azCommandIsWrite(args: readonly Token[]): boolean {
|
|
147
|
+
for (const token of args) {
|
|
148
|
+
const value = tokenValue(token).toLowerCase()
|
|
149
|
+
if (value.startsWith('-')) continue
|
|
150
|
+
if (AZ_READ_VERBS.has(value)) return false
|
|
151
|
+
}
|
|
152
|
+
return true
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* M10 (STATUS.md 12p): the name set and the
|
|
157
|
+
* per-binary method detection both moved to `git-helpers.ts`'s
|
|
158
|
+
* `HTTP_CLIENT_BINARY_NAMES`/`httpClientMethod` — shared with
|
|
159
|
+
* `tool-azure-devops.ts`'s own new WRITE-outright deny (docs/operations/agent-permissions.md
|
|
160
|
+
* row 13), so the two cannot classify the same command two different ways.
|
|
161
|
+
*/
|
|
162
|
+
const HTTP_CLIENT_NAMES = HTTP_CLIENT_BINARY_NAMES
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* Azure DevOps MCP write tools, derived from `packages/azdo/src/mcp-server.ts`'s
|
|
166
|
+
* `ListToolsRequestSchema` handler (re-grepped 2026-09-27 for C3) — the
|
|
167
|
+
* complete tool roster there is `pr_list_or_get`/`pr_create_or_update`/
|
|
168
|
+
* `pr_review`, `build_list_or_get`/`build_run`, `workitem_list_or_get`/
|
|
169
|
+
* `workitem_create_or_update`; the three not in this set are the read half.
|
|
170
|
+
* `pr_review` (C3, docs/operations/agent-permissions.md rows 6-8: comment + vote) joined
|
|
171
|
+
* this set the same day `adl-pr-review-role.ts` started gating it by role —
|
|
172
|
+
* a caller with no session identity at all must be denied here FIRST, the
|
|
173
|
+
* same "no session, not merely the wrong role" ordering `adl-pr-role.ts`
|
|
174
|
+
* documents for `pr_create_or_update`.
|
|
175
|
+
*/
|
|
176
|
+
const ADO_MCP_WRITE_TOOLS: ReadonlySet<string> = new Set([
|
|
177
|
+
'pr_create_or_update',
|
|
178
|
+
'pr_review',
|
|
179
|
+
'build_run',
|
|
180
|
+
'workitem_create_or_update',
|
|
181
|
+
])
|
|
182
|
+
|
|
183
|
+
/**
|
|
184
|
+
* WIDENED 2026-09-28: the standard requires an identity for every Azure
|
|
185
|
+
* DevOps MCP tool call, reads included — the read half no longer gets a
|
|
186
|
+
* pass just because it cannot mutate anything. `mcp-server.ts`'s complete
|
|
187
|
+
* roster: `pr_list_or_get`, `build_list_or_get`, `workitem_list_or_get`
|
|
188
|
+
* (reads) alongside the four writes above.
|
|
189
|
+
*/
|
|
190
|
+
const ADO_MCP_ALL_TOOLS: ReadonlySet<string> = new Set([...ADO_MCP_WRITE_TOOLS, 'pr_list_or_get', 'build_list_or_get', 'workitem_list_or_get'])
|
|
191
|
+
|
|
192
|
+
/** `adl <...>` shapes that need an identity even with no HTTP client or git verb involved — see `git-helpers.ts`'s `ADL_IDENTITY_COMMAND_SHAPES`. */
|
|
193
|
+
const ADL_BINARY_ALL_NAMES: ReadonlySet<string> = ADL_BINARY_NAMES
|
|
194
|
+
const ADL_AGENT_ID_BINARY_ALL_NAMES: ReadonlySet<string> = ADL_AGENT_ID_BINARY_NAMES
|
|
195
|
+
|
|
196
|
+
/**
|
|
197
|
+
* R3 (STATUS.md 12p, re-review 2026-09-28 night): interpreter
|
|
198
|
+
* one-liners whose `-c`/`-e`/`--eval` code string names an identity-bearing
|
|
199
|
+
* operation — `../shell/invocation.ts`'s walker classifies these as a plain,
|
|
200
|
+
* unclassified `'command'` Invocation (it only re-parses `-c` as shell for
|
|
201
|
+
* `sh`/`bash`/`zsh`/`dash`/`ksh`/`fish`, never an interpreter's own code), so
|
|
202
|
+
* `python3 -c "import subprocess; subprocess.run(['git','push'])"` was
|
|
203
|
+
* previously invisible to this rule entirely. Deliberately coarse
|
|
204
|
+
* (`containsIdentityBearingToken`, textual) — precise parsing of arbitrary
|
|
205
|
+
* Python/JS/Perl/Ruby/AppleScript source is not this rule's job.
|
|
206
|
+
*/
|
|
207
|
+
const INTERPRETER_ONE_LINER_NAMES: ReadonlySet<string> = new Set([
|
|
208
|
+
'python', 'python.exe', 'python2', 'python2.exe', 'python3', 'python3.exe',
|
|
209
|
+
'node', 'node.exe', 'perl', 'perl.exe', 'ruby', 'ruby.exe', 'bun', 'bun.exe',
|
|
210
|
+
'osascript', 'osascript.exe',
|
|
211
|
+
])
|
|
212
|
+
const INTERPRETER_CODE_FLAGS: ReadonlySet<string> = new Set(['-c', '-e', '--eval'])
|
|
213
|
+
|
|
214
|
+
/** Every code string passed via `-c`/`-e`/`--eval` among `args` — the token immediately following the flag. */
|
|
215
|
+
function interpreterCodeStrings(args: readonly Token[]): readonly string[] {
|
|
216
|
+
const codes: string[] = []
|
|
217
|
+
for (let index = 0; index < args.length; index += 1) {
|
|
218
|
+
if (!INTERPRETER_CODE_FLAGS.has(tokenValue(args[index] as Token))) continue
|
|
219
|
+
const next = args[index + 1]
|
|
220
|
+
if (next !== undefined) codes.push(tokenValue(next))
|
|
221
|
+
}
|
|
222
|
+
return codes
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
/**
|
|
226
|
+
* Whether `inv` is a candidate this rule cares about at all, and if so, the
|
|
227
|
+
* "reason" text for its Finding — computed WITHOUT ever resolving an
|
|
228
|
+
* identity (see `match`'s own L4 comment for why the ordering matters). The
|
|
229
|
+
* four surfaces are exactly the ones documented in this file's header.
|
|
230
|
+
*/
|
|
231
|
+
/**
|
|
232
|
+
* Exported for `../../pre-tool-use/handler.ts`'s own broader net (R3,
|
|
233
|
+
* STATUS.md 12p): a walker-visible identity-bearing shape
|
|
234
|
+
* the narrow `adl.git-identity` rewrite scanner does not recognize (buried
|
|
235
|
+
* inside `if`/`!`/`for..do`/`xargs`/a heredoc or here-string/a piped-into
|
|
236
|
+
* shell) still needs denying when the resolved identity cannot actually
|
|
237
|
+
* reach THIS specific host/tool-class's child process — this rule alone
|
|
238
|
+
* cannot make that call (it has no host/tool-class in its `RuleContext`),
|
|
239
|
+
* but it IS the one place that already classifies every one of those shapes
|
|
240
|
+
* correctly (see this file's header), so the handler reuses this function
|
|
241
|
+
* rather than re-deriving the same walker-based classification a second
|
|
242
|
+
* time.
|
|
243
|
+
*/
|
|
244
|
+
export function identityBearingReason(inv: Invocation): string | null {
|
|
245
|
+
if (inv.kind === 'git') {
|
|
246
|
+
// F2 (independent review, 2026-09-29): widened from a plain
|
|
247
|
+
// `NETWORK_GIT_VERBS.has(inv.subcommand)` gate — see
|
|
248
|
+
// `isNetworkGitInvocation`'s own doc for the additional network-reaching
|
|
249
|
+
// shapes now covered (git remote show/prune/update/set-head -a, git
|
|
250
|
+
// maintenance run --task=prefetch, the remote-https/remote-http/
|
|
251
|
+
// http-fetch transport helpers, git submodule update/sync --recursive,
|
|
252
|
+
// git archive --remote).
|
|
253
|
+
if (!isNetworkGitInvocation(inv.subcommand, inv.rest.map(tokenValue))) return null
|
|
254
|
+
if (isHelpOnlyInvocation(inv.rest)) return null
|
|
255
|
+
const risk = classifyPush(inv.rest)
|
|
256
|
+
if (risk === 'non-ado') return null
|
|
257
|
+
const verbLabel = inv.subcommand === 'push' ? 'git push' : `git ${inv.subcommand}`
|
|
258
|
+
return risk === 'ado' ? `${verbLabel} against a dev.azure.com remote` : `${verbLabel} with an unresolved (implicit) remote destination`
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
if (inv.kind === 'azure-devops') {
|
|
262
|
+
// Defense in depth only — tool.azure-devops (registered ahead of this
|
|
263
|
+
// rule in ../registry.ts) already denies the whole `az devops|repos|
|
|
264
|
+
// pipelines|boards|artifacts` family outright, read or write, identity
|
|
265
|
+
// or not. See this file's header.
|
|
266
|
+
return azCommandIsWrite(inv.args) ? 'az CLI Azure DevOps write' : null
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
if (inv.kind === 'command') {
|
|
270
|
+
if (HTTP_CLIENT_NAMES.has(inv.name)) {
|
|
271
|
+
const targetsAdo = inv.args.some((token) => isAdoUrl(tokenValue(token)))
|
|
272
|
+
if (!targetsAdo) return null
|
|
273
|
+
// WIDENED: every method now needs an identity, GET included — the
|
|
274
|
+
// standard covers reads too, not only the mutating methods this rule
|
|
275
|
+
// used to single out.
|
|
276
|
+
const method = httpClientMethod(inv.name, inv.args)
|
|
277
|
+
return `${inv.name} ${method} to dev.azure.com/visualstudio.com`
|
|
278
|
+
}
|
|
279
|
+
if (ADL_BINARY_ALL_NAMES.has(inv.name)) {
|
|
280
|
+
const values = inv.args.map((token) => tokenValue(token))
|
|
281
|
+
if (inv.args.some((token) => dynamicToken(token))) return null
|
|
282
|
+
if (!matchesIdentityShape(values, ADL_IDENTITY_COMMAND_SHAPES)) return null
|
|
283
|
+
return `${inv.name} ${values.slice(0, 3).join(' ')}`
|
|
284
|
+
}
|
|
285
|
+
if (ADL_AGENT_ID_BINARY_ALL_NAMES.has(inv.name)) {
|
|
286
|
+
const values = inv.args.map((token) => tokenValue(token))
|
|
287
|
+
if (inv.args.some((token) => dynamicToken(token))) return null
|
|
288
|
+
// M5 (STATUS.md 12p): leading dash-prefixed
|
|
289
|
+
// global flags are skipped before matching the `['exec']` shape —
|
|
290
|
+
// see git-helpers.ts's skipLeadingDashFlags doc.
|
|
291
|
+
if (!matchesIdentityShape(skipLeadingDashFlags(values), ADL_AGENT_ID_COMMAND_SHAPES)) return null
|
|
292
|
+
return `${inv.name} ${values.slice(0, 3).join(' ')}`
|
|
293
|
+
}
|
|
294
|
+
if (INTERPRETER_ONE_LINER_NAMES.has(inv.name)) {
|
|
295
|
+
const identityBearing = interpreterCodeStrings(inv.args).some((code) => containsIdentityBearingToken(code))
|
|
296
|
+
return identityBearing ? `${inv.name} interpreter one-liner` : null
|
|
297
|
+
}
|
|
298
|
+
return null
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
if (inv.kind === 'tool-call') {
|
|
302
|
+
const toolName = mcpToolName(inv.tool)
|
|
303
|
+
if (toolName === null || !ADO_MCP_ALL_TOOLS.has(toolName)) return null
|
|
304
|
+
return `Azure DevOps MCP tool ${inv.tool}`
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
return null
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
export const adlSessionRequiredForWrites: RuleSpec = {
|
|
311
|
+
id: RULE_ID,
|
|
312
|
+
category: 'tool-call',
|
|
313
|
+
severity: 'deny',
|
|
314
|
+
enabledByDefault: true,
|
|
315
|
+
summary: 'Deny Azure DevOps access (git, az CLI, curl/wget/httpie, adl entry points, MCP tools) with no resolvable ADL agent identity.',
|
|
316
|
+
params: noParams,
|
|
317
|
+
match(inv: Invocation, ctx: RuleContext<Record<string, never>>): Finding | null {
|
|
318
|
+
// L4 (STATUS.md 12p): the shape check runs
|
|
319
|
+
// FIRST, entirely without touching `ctx.env` — `checkResolvableIdentity`
|
|
320
|
+
// can hit the real filesystem (the machine default-agent file) once
|
|
321
|
+
// neither the command's own inline override nor the session env
|
|
322
|
+
// resolves, so it must not run for every invocation this rule is asked
|
|
323
|
+
// about. The vast majority (ls, cat, git status, an unrelated tool
|
|
324
|
+
// call, …) are not identity-bearing at all and, with this ordering,
|
|
325
|
+
// never reach `checkResolvableIdentity` — only a genuine candidate does.
|
|
326
|
+
const reason = identityBearingReason(inv)
|
|
327
|
+
if (reason === null) return null
|
|
328
|
+
|
|
329
|
+
const identity = checkResolvableIdentity(ctx.command ?? '', ctx.env)
|
|
330
|
+
if (identity.resolvable) return null
|
|
331
|
+
// M7: the exact message this specific failure earns — NOT a fixed
|
|
332
|
+
// generic string — carried in the Finding so message() reports it
|
|
333
|
+
// faithfully instead of a constant that cannot distinguish "nothing
|
|
334
|
+
// configured" from "something IS configured but it's wrong".
|
|
335
|
+
return { ruleId: RULE_ID, severity: 'deny', detail: { reason, identityMessage: identity.message } }
|
|
336
|
+
},
|
|
337
|
+
message(finding: Finding, ctx: MessageContext) {
|
|
338
|
+
const reason = detailString(finding, 'reason')
|
|
339
|
+
const identityMessage = detailString(finding, 'identityMessage')
|
|
340
|
+
// R8 (STATUS.md 12p, re-review 2026-09-28 night):
|
|
341
|
+
// NO_AGENT_IDENTITY_MESSAGE (the "nothing configured at all" case) IS
|
|
342
|
+
// ALREADY "prefix the command with ADL_AGENT_ID_AGENT=<agent>, or start
|
|
343
|
+
// the session with `adl run <surface> --as <agent>`" — appending the
|
|
344
|
+
// same advice a second time, in slightly different wording, said it
|
|
345
|
+
// twice. The INVALID case (something IS configured, but names an agent
|
|
346
|
+
// outside VALID_AGENTS) has no such text at all, so the "how to fix it"
|
|
347
|
+
// sentence is the only place that advice appears for it and stays.
|
|
348
|
+
const advice = identityMessage === NO_AGENT_IDENTITY_MESSAGE ? '' : ` Prefix the command with ${ENV_VAR}=<agent>, or start the session with adl run --as <agent>.`
|
|
349
|
+
return {
|
|
350
|
+
user: identityMessage,
|
|
351
|
+
agent: `DENIED ${reason} without an ADL agent identity. ${identityMessage}${advice} Blocked: ${ctx.snippet}`,
|
|
352
|
+
}
|
|
353
|
+
},
|
|
354
|
+
corpus: {
|
|
355
|
+
deny: [
|
|
356
|
+
'git push https://dev.azure.com/org/project/_git/repo main',
|
|
357
|
+
'git push origin main',
|
|
358
|
+
'git push',
|
|
359
|
+
// WIDENED (2026-09-28): git network READS now need an identity too —
|
|
360
|
+
// every Azure DevOps access does, not only writes.
|
|
361
|
+
'git fetch origin main',
|
|
362
|
+
'git clone https://dev.azure.com/org/project/_git/repo',
|
|
363
|
+
'git ls-remote https://dev.azure.com/org/project/_git/repo',
|
|
364
|
+
'curl -X POST https://dev.azure.com/org/project/_apis/git/repositories',
|
|
365
|
+
'wget --method=POST https://dev.azure.com/org/project/_apis/git/repositories',
|
|
366
|
+
// WIDENED: a plain GET to dev.azure.com now needs an identity too.
|
|
367
|
+
'curl https://dev.azure.com/org/project/_apis/git/repositories',
|
|
368
|
+
'wget https://dev.azure.com/org/project/_apis/git/repositories',
|
|
369
|
+
// WIDENED: the adl entry points that reach Azure DevOps.
|
|
370
|
+
'adl mcp cli pr-list-or-get',
|
|
371
|
+
'adl repo doctor',
|
|
372
|
+
'adl repo controls azdo-push',
|
|
373
|
+
'adl id token agent-tarun',
|
|
374
|
+
'adl-agent-id exec --agent agent-tarun -- adl id token agent-tarun --json',
|
|
375
|
+
// Already denied outright by tool.azure-devops (steers at the MCP server) —
|
|
376
|
+
// kept here too so this rule's own corpus is non-empty and honest about
|
|
377
|
+
// az CLI being a write surface it cares about; see the header for why
|
|
378
|
+
// its OWN read/write split is exercised in a dedicated unit test instead.
|
|
379
|
+
'az repos pr create --title x',
|
|
380
|
+
],
|
|
381
|
+
allow: [
|
|
382
|
+
// Explicit non-ADO destination: provably safe without an identity.
|
|
383
|
+
'git push https://github.com/org/repo main',
|
|
384
|
+
'git fetch https://github.com/org/repo main',
|
|
385
|
+
'curl https://github.com/org/repo',
|
|
386
|
+
'wget https://github.com/org/repo',
|
|
387
|
+
// Non-identity-bearing local commands and adl subcommands are untouched.
|
|
388
|
+
'git status',
|
|
389
|
+
'ls -la',
|
|
390
|
+
'adl run -- claude',
|
|
391
|
+
'adl repo controls compliance --repo .',
|
|
392
|
+
// A valid inline override supplies its own identity. A feature-branch
|
|
393
|
+
// destination (not `main`/`integration`) is used here so this stays a
|
|
394
|
+
// clean example of THIS rule's own concern — since W2 build item 2
|
|
395
|
+
// widened adl.git-push-branch-policy to grade the command's EFFECTIVE
|
|
396
|
+
// identity too, an inline-only override no longer bypasses branch
|
|
397
|
+
// protection: `ADL_AGENT_ID_AGENT=agent-tarun git push origin main`
|
|
398
|
+
// is correctly denied by that rule now, not allowed by this one.
|
|
399
|
+
'ADL_AGENT_ID_AGENT=agent-tarun git push origin feat/x',
|
|
400
|
+
'ADL_AGENT_ID_AGENT=agent-tarun adl id token agent-tarun',
|
|
401
|
+
],
|
|
402
|
+
},
|
|
403
|
+
}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `adl.token-minting-role` — W2 build item 1
|
|
3
|
+
* (STATUS.md 12p): an agent may mint a bearer
|
|
4
|
+
* token, or exec as an agent identity, only for its OWN effective identity —
|
|
5
|
+
* never for a different agent whose passport happens to be installed on the
|
|
6
|
+
* same machine. Covers the two token-minting entry points the standard
|
|
7
|
+
* names: `adl id token <agent>` and `adl-agent-id exec --agent <agent> --
|
|
8
|
+
* ...` (`--agent=<agent>` too).
|
|
9
|
+
*
|
|
10
|
+
* "Effective identity" for a specific command is the same definition
|
|
11
|
+
* `adl.git-identity`'s rewrite stage uses: a valid inline
|
|
12
|
+
* `ADL_AGENT_ID_AGENT=<value>` on the command wins (step 1); otherwise the
|
|
13
|
+
* session's resolved identity, env then the machine default-agent file
|
|
14
|
+
* (`adl-identity.ts`'s `resolveFromEnvOrFile`, steps 2-3). With no identity
|
|
15
|
+
* at all, this rule stays silent — `adl.session-required-for-writes` denies
|
|
16
|
+
* the call first (no session, not the wrong agent); with an invalid/empty
|
|
17
|
+
* inline override or an unrewritable sudo/doas wrapper, `adl.git-identity`
|
|
18
|
+
* denies first (registered ahead of this rule — see `../registry.ts`). This
|
|
19
|
+
* rule only ever sees a command that already carries SOME resolvable,
|
|
20
|
+
* conflict-free identity, and denies it when the token it asks for names a
|
|
21
|
+
* DIFFERENT agent than that identity.
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
import type { Invocation } from '../shell/invocation.ts'
|
|
25
|
+
import { scanGitIdentityConflicts, scanTokenMintingPieces } from '../shell/git-identity.ts'
|
|
26
|
+
import type { Finding, MessageContext, RuleContext, RuleSpec } from '../spec.ts'
|
|
27
|
+
import { noParams } from '../spec.ts'
|
|
28
|
+
import { ADL_AGENT_ID_ENV_VAR, resolveFromEnvOrFile } from './adl-identity.ts'
|
|
29
|
+
import { detailString } from './messages.ts'
|
|
30
|
+
|
|
31
|
+
const RULE_ID = 'adl.token-minting-role'
|
|
32
|
+
|
|
33
|
+
const LABELS: Readonly<Record<string, string>> = {
|
|
34
|
+
'adl-id-token': 'adl id token',
|
|
35
|
+
'adl-agent-id-exec': 'adl-agent-id exec --agent',
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export const adlTokenMintingRole: RuleSpec = {
|
|
39
|
+
id: RULE_ID,
|
|
40
|
+
category: 'tool-call',
|
|
41
|
+
severity: 'deny',
|
|
42
|
+
enabledByDefault: true,
|
|
43
|
+
summary: 'Deny adl id token / adl-agent-id exec --agent for any agent other than the effective session identity.',
|
|
44
|
+
params: noParams,
|
|
45
|
+
match(inv: Invocation, ctx: RuleContext<Record<string, never>>): Finding | null {
|
|
46
|
+
if (inv.kind !== 'command') return null
|
|
47
|
+
|
|
48
|
+
const command = ctx.command ?? ''
|
|
49
|
+
const resolution = resolveFromEnvOrFile(ctx.env)
|
|
50
|
+
const fallback = resolution.ok ? resolution.agent : null
|
|
51
|
+
|
|
52
|
+
// A conflicting/invalid inline override, or an unrewritable sudo/doas
|
|
53
|
+
// wrapper, is adl.git-identity's problem to report (registered ahead of
|
|
54
|
+
// this rule) — this rule only inspects commands that are otherwise
|
|
55
|
+
// clean of that.
|
|
56
|
+
if (scanGitIdentityConflicts(command, fallback) !== null) return null
|
|
57
|
+
|
|
58
|
+
for (const piece of scanTokenMintingPieces(command, fallback)) {
|
|
59
|
+
if (piece.effectiveAgent === null) continue // adl.session-required-for-writes's job
|
|
60
|
+
if (piece.effectiveAgent === piece.requestedAgent) continue
|
|
61
|
+
return {
|
|
62
|
+
ruleId: RULE_ID,
|
|
63
|
+
severity: 'deny',
|
|
64
|
+
detail: { kind: piece.kind, requested: piece.requestedAgent, effective: piece.effectiveAgent },
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return null
|
|
68
|
+
},
|
|
69
|
+
message(finding: Finding, ctx: MessageContext) {
|
|
70
|
+
const requested = detailString(finding, 'requested')
|
|
71
|
+
const effective = detailString(finding, 'effective')
|
|
72
|
+
const label = LABELS[detailString(finding, 'kind')] ?? 'adl id token'
|
|
73
|
+
const user = `${label} may only mint/run as this session's own agent identity (${effective}), not ${requested}`
|
|
74
|
+
return {
|
|
75
|
+
user,
|
|
76
|
+
agent:
|
|
77
|
+
`DENIED ${label} for '${requested}': the session's effective identity is '${effective}' (${ADL_AGENT_ID_ENV_VAR}), ` +
|
|
78
|
+
"and an agent may only mint a token for, or exec as, its own identity — never a different agent's, even when " +
|
|
79
|
+
`that agent's passport is installed on this machine. Blocked: ${ctx.snippet}`,
|
|
80
|
+
}
|
|
81
|
+
},
|
|
82
|
+
corpus: {
|
|
83
|
+
// Every real case needs a specific session identity, same pattern as
|
|
84
|
+
// adl.git-identity / adl.git-push-branch-policy — the shared corpus
|
|
85
|
+
// fixture (tests/fixtures/decide.ts) is hermetically identity-less, so
|
|
86
|
+
// even a bare `adl id token`/`adl-agent-id exec` there is denied by
|
|
87
|
+
// adl.session-required-for-writes first, not usable as an allow entry
|
|
88
|
+
// here. Real coverage is tests/unit/rules-adl-token-minting-role.test.ts.
|
|
89
|
+
deny: [],
|
|
90
|
+
allow: ['ls -la', 'git status'],
|
|
91
|
+
},
|
|
92
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `adl.workitem-requires-tarun-or-vivek` — docs/operations/agent-permissions.md row 10
|
|
3
|
+
* (work item create/update): `agent-tarun`/`agent-vivek` ALLOW,
|
|
4
|
+
* `agent-reviewer` DENY. The mirror image of adl-pr-role.ts's row 5 — Azure
|
|
5
|
+
* DevOps' Reader role has no edit-work-item permission (see
|
|
6
|
+
* docs/enact/handoff-enact-vps-global-tools-2026-09-25.md's "Azure DevOps
|
|
7
|
+
* permissions are the backstop"), so this rule replaces that eventual 403
|
|
8
|
+
* with the same identity message up front.
|
|
9
|
+
*
|
|
10
|
+
* The row's REWRITE half (`az boards work-item create/update` → `adl wit
|
|
11
|
+
* create/update`) is a LATER stream (docs/operations/agent-permissions.md "Build
|
|
12
|
+
* order"); `tool.azure-devops` keeps denying the raw `az` form unchanged.
|
|
13
|
+
*
|
|
14
|
+
* Requires an identity to already be present (`ADL_AGENT_ID_AGENT`
|
|
15
|
+
* non-blank) — with no identity at all, `adl.session-required-for-writes`
|
|
16
|
+
* denies the call first, so this rule returns null when the env var is
|
|
17
|
+
* absent or blank.
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
import type { Invocation } from '../shell/invocation.ts'
|
|
21
|
+
import type { Finding, MessageContext, RuleContext, RuleSpec } from '../spec.ts'
|
|
22
|
+
import { noParams } from '../spec.ts'
|
|
23
|
+
import { AGENT_REVIEWER, resolveFromEnvOrFile } from './adl-identity.ts'
|
|
24
|
+
import { detailString } from './messages.ts'
|
|
25
|
+
import { mcpToolName } from './mcp-tool.ts'
|
|
26
|
+
import { effectiveIdentityForMcpCli, toolCallFor } from './adl-mcp-cli.ts'
|
|
27
|
+
|
|
28
|
+
const RULE_ID = 'adl.workitem-requires-tarun-or-vivek'
|
|
29
|
+
|
|
30
|
+
export const adlWorkitemRequiresTarunOrVivek: RuleSpec = {
|
|
31
|
+
id: RULE_ID,
|
|
32
|
+
category: 'tool-call',
|
|
33
|
+
severity: 'deny',
|
|
34
|
+
enabledByDefault: true,
|
|
35
|
+
summary: 'Deny workitem_create_or_update for agent-reviewer (docs/operations/agent-permissions.md row 10) — the MCP tool AND its adl mcp cli equivalent (M4).',
|
|
36
|
+
params: noParams,
|
|
37
|
+
match(inv: Invocation, ctx: RuleContext<Record<string, never>>): Finding | null {
|
|
38
|
+
// M4 (STATUS.md 12p): `adl mcp cli
|
|
39
|
+
// workitem-create-or-update` dispatches to the same tool the MCP server
|
|
40
|
+
// calls — graded identically, not only the tool-call payload shape.
|
|
41
|
+
const call = toolCallFor(inv)
|
|
42
|
+
if (call === null) return null
|
|
43
|
+
if (mcpToolName(call.tool) !== 'workitem_create_or_update') return null
|
|
44
|
+
|
|
45
|
+
// R5 (STATUS.md 12p, re-review 2026-09-28 night):
|
|
46
|
+
// grade the EFFECTIVE identity for THIS specific piece — a valid inline
|
|
47
|
+
// `ADL_AGENT_ID_AGENT=` override on the same `adl mcp cli` invocation
|
|
48
|
+
// still wins, exactly like M3 already does for `git push`
|
|
49
|
+
// (effectiveIdentityForMcpCli's own doc has the full "why"). A real MCP
|
|
50
|
+
// tool-call payload carries no command text at all (no inline override
|
|
51
|
+
// possible), so this still resolves to the plain session identity for
|
|
52
|
+
// that shape — env, else the machine default-agent file
|
|
53
|
+
// (adl-identity.ts's resolveFromEnvOrFile).
|
|
54
|
+
const resolution = resolveFromEnvOrFile(ctx.env)
|
|
55
|
+
const fallback = resolution.ok ? resolution.agent : null
|
|
56
|
+
const agent = effectiveIdentityForMcpCli(inv, ctx.command ?? '', fallback)
|
|
57
|
+
if (agent === null) return null // no identity at all: adl.session-required-for-writes's job
|
|
58
|
+
if (agent !== AGENT_REVIEWER) return null
|
|
59
|
+
|
|
60
|
+
return { ruleId: RULE_ID, severity: 'deny', detail: { tool: call.tool } }
|
|
61
|
+
},
|
|
62
|
+
message(finding: Finding, ctx: MessageContext) {
|
|
63
|
+
const tool = detailString(finding, 'tool')
|
|
64
|
+
const user = 'this operation can only be done with agent-tarun or agent-vivek'
|
|
65
|
+
return {
|
|
66
|
+
user,
|
|
67
|
+
agent: `DENIED ${tool}: ${user}. \`agent-reviewer\` is an Azure DevOps Reader and cannot edit work items. Blocked: ${ctx.snippet}`,
|
|
68
|
+
}
|
|
69
|
+
},
|
|
70
|
+
corpus: {
|
|
71
|
+
deny: [],
|
|
72
|
+
allow: ['ls -la', 'git status'],
|
|
73
|
+
},
|
|
74
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The live backend-coverage-floor advisory.
|
|
3
|
+
*
|
|
4
|
+
* Ported from `coverageAdvisory` in deny.mjs:86-116. In the original this
|
|
5
|
+
* text is only ever appended to a DENIAL's agent message (cargo's and the
|
|
6
|
+
* dropped noncanonical-test's) — never shown on an allow. tool-cargo.ts's
|
|
7
|
+
* `message()` still appends it directly, exactly as the original did, so
|
|
8
|
+
* that behaviour needs no engine-level plumbing to stay correct.
|
|
9
|
+
*
|
|
10
|
+
* This is registered as its own `advisory` rule anyway, matching the same
|
|
11
|
+
* `cargo` invocation, so the capability is addressable and testable on its
|
|
12
|
+
* own (`[rules."advisory.coverage"] enabled = false` turns off just the
|
|
13
|
+
* advisory text without touching the deny) rather than living solely as a
|
|
14
|
+
* string concatenation inside another rule's message.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import type { Invocation } from '../shell/invocation.ts'
|
|
18
|
+
import type { Finding, MessageContext, RuleSpec } from '../spec.ts'
|
|
19
|
+
import { noParams } from '../spec.ts'
|
|
20
|
+
import { coverageAdvisory, detailString } from './messages.ts'
|
|
21
|
+
|
|
22
|
+
export const advisoryCoverage: RuleSpec = {
|
|
23
|
+
id: 'advisory.coverage',
|
|
24
|
+
category: 'advisory',
|
|
25
|
+
severity: 'advise',
|
|
26
|
+
enabledByDefault: true,
|
|
27
|
+
summary: 'Surface the live backend coverage floor alongside a denied cargo invocation.',
|
|
28
|
+
params: noParams,
|
|
29
|
+
match(inv: Invocation): Finding | null {
|
|
30
|
+
if (inv.kind !== 'cargo') return null
|
|
31
|
+
const text = coverageAdvisory(process.cwd())
|
|
32
|
+
if (!text) return null
|
|
33
|
+
return { ruleId: 'advisory.coverage', severity: 'advise', detail: { text } }
|
|
34
|
+
},
|
|
35
|
+
message(finding: Finding, _ctx: MessageContext) {
|
|
36
|
+
const text = detailString(finding, 'text')
|
|
37
|
+
return { user: text, agent: text }
|
|
38
|
+
},
|
|
39
|
+
corpus: {
|
|
40
|
+
deny: [],
|
|
41
|
+
allow: ['cargo --version'],
|
|
42
|
+
},
|
|
43
|
+
}
|