@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,117 @@
|
|
|
1
|
+
"""REP-004 — ported from `compliance_new/checks/repository/no-banned-commands/test.sh`.
|
|
2
|
+
|
|
3
|
+
One corpus, nine files, one property apiece — see `fixtures/no-banned-commands/`.
|
|
4
|
+
Two sets over it: the WHOLE corpus, handed straight to `graded()` (bypassing the
|
|
5
|
+
row's scope narrowing entirely, the same way the shell test invoked `check.sh`
|
|
6
|
+
directly), and the NARROWED set — the seven paths under `compliance/` — through
|
|
7
|
+
`runner.run()` with the real row, exactly what `gate-runner.sh` would hand over
|
|
8
|
+
in production.
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from __future__ import annotations
|
|
12
|
+
|
|
13
|
+
import pathlib
|
|
14
|
+
|
|
15
|
+
from adl_compliance import runner
|
|
16
|
+
from adl_compliance.checks.repository.banned_commands import BannedCommands
|
|
17
|
+
from adl_compliance.core.context import Context, FileSet
|
|
18
|
+
from adl_compliance.core.verdict import Outcome, decide
|
|
19
|
+
from fixture_trees import fixture_trees
|
|
20
|
+
from adl_compliance.policy.registry import load
|
|
21
|
+
|
|
22
|
+
CORPUS = pathlib.Path(__file__).parent / "fixtures" / "no-banned-commands"
|
|
23
|
+
ROW = load().by_id("REP-004")
|
|
24
|
+
|
|
25
|
+
# The row's real scope is `<compliance>/**`. The fixture's own subdirectory is
|
|
26
|
+
# named to match whatever that resolves to TODAY (see the sibling directory on
|
|
27
|
+
# disk) — resolved here rather than spelled, so a future remap fails this test
|
|
28
|
+
# loudly (file not found) instead of silently narrowing to nothing.
|
|
29
|
+
COMPLIANCE = fixture_trees()["compliance"]
|
|
30
|
+
|
|
31
|
+
WHOLE = (
|
|
32
|
+
f"{COMPLIANCE}/checks/git-bad.sh",
|
|
33
|
+
f"{COMPLIANCE}/checks/git-note.sh",
|
|
34
|
+
f"{COMPLIANCE}/checks/grep-bad.sh",
|
|
35
|
+
f"{COMPLIANCE}/checks/grep-trailing.sh",
|
|
36
|
+
f"{COMPLIANCE}/checks/grep-note.sh",
|
|
37
|
+
f"{COMPLIANCE}/checks/good.sh",
|
|
38
|
+
f"{COMPLIANCE}/checks/notes.md",
|
|
39
|
+
"elsewhere/loose-git.sh",
|
|
40
|
+
"elsewhere/loose-grep.sh",
|
|
41
|
+
)
|
|
42
|
+
NARROWED = tuple(p for p in WHOLE if p.startswith(f"{COMPLIANCE}/"))
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def graded_directly(paths: tuple[str, ...]):
|
|
46
|
+
"""Bypasses row-scope narrowing entirely — the check's OWN filtering only.
|
|
47
|
+
Mirrors the shell test's direct `check.sh` invocation, which is how it
|
|
48
|
+
proved check.sh performs no location filtering of its own."""
|
|
49
|
+
ctx = Context(root=CORPUS, row=ROW)
|
|
50
|
+
findings = tuple(BannedCommands().graded(ctx, FileSet(paths=paths)))
|
|
51
|
+
return decide(ROW, findings, 0, ())
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def test_the_whole_set_is_graded_with_no_location_filtering() -> None:
|
|
55
|
+
"""Both elsewhere/ files are in the set, so both must be reported —
|
|
56
|
+
including the pair a hand-rolled path filter inside check.py would have
|
|
57
|
+
suppressed."""
|
|
58
|
+
verdict = graded_directly(WHOLE)
|
|
59
|
+
assert verdict.outcome is Outcome.FINDINGS
|
|
60
|
+
paths = {f.path for f in verdict.findings}
|
|
61
|
+
assert "elsewhere/loose-git.sh" in paths
|
|
62
|
+
assert "elsewhere/loose-grep.sh" in paths
|
|
63
|
+
assert sum(f.rule == "GIT-001" for f in verdict.findings) == 2
|
|
64
|
+
assert sum(f.rule == "GRP-001" for f in verdict.findings) == 3
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def test_the_narrowed_set_excludes_elsewhere_by_scope_not_by_the_check() -> None:
|
|
68
|
+
"""The row's real `<compliance>/**` scope, through `runner.run()` — what
|
|
69
|
+
production actually hands the check."""
|
|
70
|
+
verdict = runner.run(ROW, CORPUS, NARROWED)
|
|
71
|
+
assert verdict.outcome is Outcome.FINDINGS
|
|
72
|
+
paths = {f.path for f in verdict.findings}
|
|
73
|
+
assert "elsewhere/loose-git.sh" not in paths
|
|
74
|
+
assert "elsewhere/loose-grep.sh" not in paths
|
|
75
|
+
assert f"{COMPLIANCE}/checks/git-bad.sh" in paths
|
|
76
|
+
assert f"{COMPLIANCE}/checks/grep-bad.sh" in paths
|
|
77
|
+
assert f"{COMPLIANCE}/checks/grep-trailing.sh" in paths
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
def test_a_whole_line_comment_naming_the_word_is_not_a_violation() -> None:
|
|
81
|
+
verdict = runner.run(ROW, CORPUS, NARROWED)
|
|
82
|
+
paths = {f.path for f in verdict.findings}
|
|
83
|
+
assert f"{COMPLIANCE}/checks/git-note.sh" not in paths
|
|
84
|
+
assert f"{COMPLIANCE}/checks/grep-note.sh" not in paths
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
def test_prose_and_a_clean_script_are_not_graded() -> None:
|
|
88
|
+
verdict = runner.run(ROW, CORPUS, NARROWED)
|
|
89
|
+
paths = {f.path for f in verdict.findings}
|
|
90
|
+
assert f"{COMPLIANCE}/checks/notes.md" not in paths
|
|
91
|
+
assert f"{COMPLIANCE}/checks/good.sh" not in paths
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
def test_no_set_is_could_not_run() -> None:
|
|
95
|
+
verdict = runner.run(ROW, CORPUS, (), exhaustive=True)
|
|
96
|
+
assert verdict.outcome is Outcome.COULD_NOT_RUN
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
def test_this_gate_does_not_report_itself() -> None:
|
|
100
|
+
"""A check that forbids a string necessarily contains it. Both words are
|
|
101
|
+
assembled from fragments, so neither appears in the source as one token."""
|
|
102
|
+
source = pathlib.Path(__file__).parent / "check.py"
|
|
103
|
+
body = source.read_text(encoding="utf-8")
|
|
104
|
+
for entry in BannedCommands().banned():
|
|
105
|
+
assert entry.word not in body, f"{entry.word!r} appears literally in {source.name}"
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
def test_the_assembled_words_are_still_the_right_ones() -> None:
|
|
109
|
+
words = {entry.word for entry in BannedCommands().banned()}
|
|
110
|
+
assert words == {"g" + "it", "g" + "rep"}
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
def test_a_justfile_is_graded_by_name_not_suffix() -> None:
|
|
114
|
+
check = BannedCommands()
|
|
115
|
+
assert check._is_shell("compliance/justfile")
|
|
116
|
+
assert check._is_shell("nested/dir/justfile")
|
|
117
|
+
assert not check._is_shell("compliance/justfile.md")
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"""The `repository.ignored-paths` gate.
|
|
2
|
+
|
|
3
|
+
A folder even though this gate grades no single named document of its own:
|
|
4
|
+
uniform depth means every `check.py` sits at exactly `checks/*/*/check.py`,
|
|
5
|
+
so a relative import out of a check is right for all of them or wrong for
|
|
6
|
+
all of them.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
from .check import IgnoredPaths
|
|
12
|
+
|
|
13
|
+
__all__ = ["IgnoredPaths"]
|
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
"""REP-005 -- a path entering the repository that .gitignore says is never
|
|
2
|
+
tracked.
|
|
3
|
+
|
|
4
|
+
Ported from `compliance_new/checks/repository/ignored-paths/check.sh` and
|
|
5
|
+
`test.sh`. IGN-001 is the only rule.
|
|
6
|
+
|
|
7
|
+
THE SOURCE IS CORRUPTED THE SAME WAY OTHER PORTED FILES DOCUMENT ALREADY
|
|
8
|
+
(see `checks/framework/agent_hook_wiring/check.py`'s module docstring, and
|
|
9
|
+
`checks/framework/fixture_roots/check.py` /
|
|
10
|
+
`checks/layout/root_closed_set/check.py`): the literal word "git" is missing
|
|
11
|
+
throughout both files. Verified directly -- `python3 -c "'git' in
|
|
12
|
+
open(path).read()"` -> `False` for both `check.sh` and `test.sh` -- and
|
|
13
|
+
actually RUNNING `test.sh` (with a `compliance` symlink pointed at
|
|
14
|
+
`compliance_new/`, since the shell tree addresses itself as `compliance/`
|
|
15
|
+
internally) confirms it cannot execute even once: `env: init: No such file or
|
|
16
|
+
directory`, from `fixture_() { env ... "$@"; }` being called as `fixture_
|
|
17
|
+
init -q`, i.e. `env -C "$FIXTURE" init -q` -- the missing word is the command
|
|
18
|
+
name itself. This is a harder case than `checks/coverage/config_committed`'s:
|
|
19
|
+
that gate's shell tool could still run and its broken behaviour was directly
|
|
20
|
+
observed and ported; here nothing runs even once, so there is no executed
|
|
21
|
+
behaviour to carry forward, only the intent the surrounding text still states
|
|
22
|
+
unambiguously.
|
|
23
|
+
|
|
24
|
+
What survives unambiguous, from converging evidence rather than assumption
|
|
25
|
+
(K-07): the gate-registry row's own title -- "Never commit a path .gitignore
|
|
26
|
+
excludes" -- names the ignore file `.gitignore`, not `.ignore`; git recognises
|
|
27
|
+
no `.ignore` file at all, so `test.sh`'s `cat > "$FIXTURE/.ignore"` line is
|
|
28
|
+
the same corruption, not a real second convention; every other stripped
|
|
29
|
+
command in check.sh/test.sh (` check-ignore`, ` restore --staged`, ` add`,
|
|
30
|
+
` commit`, ` status`, ` config`, ` init`) is a git subcommand missing exactly
|
|
31
|
+
`git`, matching the pattern already confirmed in the three sibling files
|
|
32
|
+
above; and check.sh's own comment reads "The authority is 's own ignore
|
|
33
|
+
resolution" -- restoring the missing token gives "git's own ignore
|
|
34
|
+
resolution", which is exactly IGN-001's documented rule. This port therefore
|
|
35
|
+
writes correct `git` / `.gitignore` throughout -- recovering the one
|
|
36
|
+
unambiguous original, not inventing a scenario (C-09) -- rather than
|
|
37
|
+
reproducing "` check-ignore`" or "`.ignore`" as literal broken artifacts: what
|
|
38
|
+
is corrupted here is the EXECUTABLE SCAFFOLDING the fixture itself needs to
|
|
39
|
+
exist at all, not a FIX STRING a test asserts byte-for-byte the way
|
|
40
|
+
`agent_hook_wiring`'s ported guard-path text is. A fixture literally named
|
|
41
|
+
`.ignore`, driving a nonexistent `check-ignore` binary, could never
|
|
42
|
+
demonstrate the rule it is supposedly proving, in either language.
|
|
43
|
+
|
|
44
|
+
WHY THIS CHECK DOES NOT CALL GIT: `AGENTS.md` and K-31 are unambiguous -- no
|
|
45
|
+
check calls git, resolves a root, or performs a discovery walk; `cli.py` is
|
|
46
|
+
the one caller that does (P-11). `git check-ignore` is therefore not portable
|
|
47
|
+
to this architecture as a subprocess call the way `cargo` / `shellcheck` /
|
|
48
|
+
`ast-grep` are elsewhere (those are not banned; only the version-control tool
|
|
49
|
+
is -- see `checks/repository/banned_commands` GIT-001, which this package
|
|
50
|
+
enforces on itself). This gate's rule logic is reimplemented instead:
|
|
51
|
+
`.gitignore` files are DATA a check reads like any other named document
|
|
52
|
+
(`gitignore(5)`'s pattern grammar), never a `git` invocation.
|
|
53
|
+
|
|
54
|
+
Every `.gitignore` this gate can see is exactly the `.gitignore` files
|
|
55
|
+
present in the GIVEN SET (K-29) -- which, in a real, exhaustive run, is every
|
|
56
|
+
one of them, because `cli.py`'s own
|
|
57
|
+
`git ls-files --cached --others --exclude-standard` returns every tracked
|
|
58
|
+
file including every tracked `.gitignore`, and a force-added, now-ignored
|
|
59
|
+
file (the exact case IGN-001 exists to catch) is `--cached` regardless of
|
|
60
|
+
whether it currently matches an ignore rule. A `.gitignore` outside the given
|
|
61
|
+
set (a caller handing over a narrow diff slice with no `.gitignore` in it) is
|
|
62
|
+
invisible to this port, same as any other gate reading only what it is
|
|
63
|
+
handed -- a real, stated reduction in reach versus the shell tool's
|
|
64
|
+
filesystem-wide `git check-ignore`, not a silent one.
|
|
65
|
+
|
|
66
|
+
ONE KNOWN GAP, STATED RATHER THAN SILENTLY HANDLED: git's real precedence
|
|
67
|
+
also blocks re-inclusion of a file whose ANCESTOR directory is excluded by an
|
|
68
|
+
unnegated directory rule (`gitignore(5)`: "It is not possible to re-include a
|
|
69
|
+
file if a parent directory of that file is excluded"). Nothing in
|
|
70
|
+
`test.sh`'s own scenario exercises that interaction (its one negation,
|
|
71
|
+
`!keep.log`, sits at the .gitignore's own root, with no excluded ancestor
|
|
72
|
+
directory), so `_decide` below matches each candidate against the combined,
|
|
73
|
+
ordered pattern list (last match wins) without also re-testing every
|
|
74
|
+
ancestor directory through the same ruleset. A gate that needs that exact
|
|
75
|
+
interaction covered needs that walk added, not assumed already present.
|
|
76
|
+
|
|
77
|
+
IGN-001 a given path matches an ignore rule that was never negated.
|
|
78
|
+
"""
|
|
79
|
+
|
|
80
|
+
from __future__ import annotations
|
|
81
|
+
|
|
82
|
+
import re
|
|
83
|
+
from collections.abc import Iterable
|
|
84
|
+
from typing import ClassVar, NamedTuple
|
|
85
|
+
|
|
86
|
+
from ....core.check import Check
|
|
87
|
+
from ....core.context import Context, FileSet
|
|
88
|
+
from ....core.finding import Report
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
class _Rule(NamedTuple):
|
|
92
|
+
origin: str
|
|
93
|
+
"""The `.gitignore`'s own repository-relative path."""
|
|
94
|
+
|
|
95
|
+
lineno: int
|
|
96
|
+
"""1-based line number inside that file."""
|
|
97
|
+
|
|
98
|
+
text: str
|
|
99
|
+
"""The pattern exactly as written on that line, for the finding message."""
|
|
100
|
+
|
|
101
|
+
negated: bool
|
|
102
|
+
directory: str
|
|
103
|
+
"""The `.gitignore`'s containing directory; `""` for the repository root."""
|
|
104
|
+
|
|
105
|
+
regex: re.Pattern[str]
|
|
106
|
+
"""Matched against a candidate path already made relative to `directory`."""
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
def _strip_trailing_unescaped_spaces(line: str) -> str:
|
|
110
|
+
return re.sub(r"(?<!\\) +$", "", line)
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
def _translate(pattern: str) -> str:
|
|
114
|
+
"""`gitignore(5)`'s glob grammar -> a regex fragment.
|
|
115
|
+
|
|
116
|
+
`*` and `?` never cross `/`; `**` does, in each of its three documented
|
|
117
|
+
shapes (leading `**/`, trailing `/**`, and a bracketing `/**/`). Every
|
|
118
|
+
other character is escaped; a backslash unescapes the character after it
|
|
119
|
+
literally, which is how a pattern spells a literal `#`, `!`, or space.
|
|
120
|
+
"""
|
|
121
|
+
out: list[str] = []
|
|
122
|
+
i, n = 0, len(pattern)
|
|
123
|
+
while i < n:
|
|
124
|
+
if pattern.startswith("**/", i):
|
|
125
|
+
out.append(r"(?:.*/)?")
|
|
126
|
+
i += 3
|
|
127
|
+
elif pattern.startswith("/**/", i):
|
|
128
|
+
out.append(r"/(?:.*/)?")
|
|
129
|
+
i += 4
|
|
130
|
+
elif i + 3 == n and pattern.endswith("/**"):
|
|
131
|
+
out.append(r"/.*")
|
|
132
|
+
i = n
|
|
133
|
+
elif pattern.startswith("**", i):
|
|
134
|
+
out.append(r".*")
|
|
135
|
+
i += 2
|
|
136
|
+
elif pattern[i] == "*":
|
|
137
|
+
out.append(r"[^/]*")
|
|
138
|
+
i += 1
|
|
139
|
+
elif pattern[i] == "?":
|
|
140
|
+
out.append(r"[^/]")
|
|
141
|
+
i += 1
|
|
142
|
+
elif pattern[i] == "[":
|
|
143
|
+
close = pattern.find("]", i + 1)
|
|
144
|
+
if close == -1:
|
|
145
|
+
out.append(re.escape("["))
|
|
146
|
+
i += 1
|
|
147
|
+
else:
|
|
148
|
+
out.append(pattern[i : close + 1])
|
|
149
|
+
i = close + 1
|
|
150
|
+
elif pattern[i] == "\\" and i + 1 < n:
|
|
151
|
+
out.append(re.escape(pattern[i + 1]))
|
|
152
|
+
i += 2
|
|
153
|
+
else:
|
|
154
|
+
out.append(re.escape(pattern[i]))
|
|
155
|
+
i += 1
|
|
156
|
+
return "".join(out)
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
def _compile_rule(origin: str, lineno: int, raw: str, directory: str) -> _Rule | None:
|
|
160
|
+
"""One `.gitignore` line -> a `_Rule`, or `None` for blank/comment lines."""
|
|
161
|
+
line = _strip_trailing_unescaped_spaces(raw)
|
|
162
|
+
if not line:
|
|
163
|
+
return None
|
|
164
|
+
if line.startswith("\\#"):
|
|
165
|
+
line = line[1:]
|
|
166
|
+
elif line.startswith("#"):
|
|
167
|
+
return None
|
|
168
|
+
|
|
169
|
+
negated = False
|
|
170
|
+
if line.startswith("\\!"):
|
|
171
|
+
line = line[1:]
|
|
172
|
+
elif line.startswith("!"):
|
|
173
|
+
negated = True
|
|
174
|
+
line = line[1:]
|
|
175
|
+
if not line:
|
|
176
|
+
return None
|
|
177
|
+
|
|
178
|
+
dir_only = line.endswith("/") and not line.endswith("\\/")
|
|
179
|
+
if dir_only:
|
|
180
|
+
line = line[:-1]
|
|
181
|
+
|
|
182
|
+
anchored = "/" in line
|
|
183
|
+
if line.startswith("/"):
|
|
184
|
+
line = line[1:]
|
|
185
|
+
anchored = True
|
|
186
|
+
|
|
187
|
+
body = _translate(line)
|
|
188
|
+
if dir_only:
|
|
189
|
+
# A directory rule matches everything UNDER that directory; it never
|
|
190
|
+
# matches a plain file candidate that only shares the directory's name.
|
|
191
|
+
body += r"/.*"
|
|
192
|
+
fragment = f"^{body}$" if anchored else f"^(?:.*/)?{body}$"
|
|
193
|
+
return _Rule(
|
|
194
|
+
origin=origin, lineno=lineno, text=raw.strip(), negated=negated,
|
|
195
|
+
directory=directory, regex=re.compile(fragment),
|
|
196
|
+
)
|
|
197
|
+
|
|
198
|
+
|
|
199
|
+
def _parse(origin: str, directory: str, body: str) -> list[_Rule]:
|
|
200
|
+
rules = []
|
|
201
|
+
for lineno, raw in enumerate(body.splitlines(), start=1):
|
|
202
|
+
rule = _compile_rule(origin, lineno, raw, directory)
|
|
203
|
+
if rule is not None:
|
|
204
|
+
rules.append(rule)
|
|
205
|
+
return rules
|
|
206
|
+
|
|
207
|
+
|
|
208
|
+
def _relative_to(directory: str, path: str) -> str | None:
|
|
209
|
+
"""`path` expressed relative to `directory`, or `None` when it is not under it."""
|
|
210
|
+
if not directory:
|
|
211
|
+
return path
|
|
212
|
+
prefix = f"{directory}/"
|
|
213
|
+
return path[len(prefix) :] if path.startswith(prefix) else None
|
|
214
|
+
|
|
215
|
+
|
|
216
|
+
class IgnoredPaths(Check):
|
|
217
|
+
id: ClassVar[str] = "REP-005"
|
|
218
|
+
rule: ClassVar[str] = "IGN-001"
|
|
219
|
+
|
|
220
|
+
IGNORE_FILENAME: ClassVar[str] = ".gitignore"
|
|
221
|
+
|
|
222
|
+
def graded(self, ctx: Context, files: FileSet) -> Iterable[Report]:
|
|
223
|
+
given = tuple(files)
|
|
224
|
+
# Shallowest .gitignore first, deepest last: `_decide` keeps the LAST
|
|
225
|
+
# matching rule, which is exactly git's own precedence -- a deeper
|
|
226
|
+
# .gitignore's rules override a shallower one's for paths under it.
|
|
227
|
+
ignore_paths = sorted(
|
|
228
|
+
(p for p in given if self._is_gitignore(p)), key=lambda p: p.count("/"),
|
|
229
|
+
)
|
|
230
|
+
rules: list[_Rule] = []
|
|
231
|
+
for path in ignore_paths:
|
|
232
|
+
body = self.text(ctx, path)
|
|
233
|
+
if body is None:
|
|
234
|
+
continue
|
|
235
|
+
directory = path.rsplit("/", 1)[0] if "/" in path else ""
|
|
236
|
+
rules.extend(_parse(path, directory, body))
|
|
237
|
+
if not rules:
|
|
238
|
+
return
|
|
239
|
+
|
|
240
|
+
for candidate in sorted(given):
|
|
241
|
+
if self._is_gitignore(candidate):
|
|
242
|
+
continue
|
|
243
|
+
decision = self._decide(candidate, rules)
|
|
244
|
+
if decision is None or decision.negated:
|
|
245
|
+
continue
|
|
246
|
+
yield self.report(
|
|
247
|
+
candidate,
|
|
248
|
+
f"{candidate} is staged, but {decision.origin}:{decision.lineno} "
|
|
249
|
+
f"({decision.text}) says it is never tracked",
|
|
250
|
+
f"unstage it with 'git restore --staged {candidate}'; if it truly "
|
|
251
|
+
f"belongs in the repository, remove or negate the rule at "
|
|
252
|
+
f"{decision.origin}:{decision.lineno} rather than forcing the add",
|
|
253
|
+
)
|
|
254
|
+
|
|
255
|
+
def _is_gitignore(self, path: str) -> bool:
|
|
256
|
+
return path == self.IGNORE_FILENAME or path.endswith(f"/{self.IGNORE_FILENAME}")
|
|
257
|
+
|
|
258
|
+
def _decide(self, candidate: str, rules: list[_Rule]) -> _Rule | None:
|
|
259
|
+
"""The LAST rule (in combined, ordered precedence) that matches, if any."""
|
|
260
|
+
matched: _Rule | None = None
|
|
261
|
+
for entry in rules:
|
|
262
|
+
rel = _relative_to(entry.directory, candidate)
|
|
263
|
+
if rel is not None and entry.regex.match(rel):
|
|
264
|
+
matched = entry
|
|
265
|
+
return matched
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
kept
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
fn main() {}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
"""REP-005 -- ported from
|
|
2
|
+
`compliance_new/checks/repository/ignored-paths/test.sh`.
|
|
3
|
+
|
|
4
|
+
One committed fixture (`fixtures/ignored-paths/`), byte-for-byte the shell
|
|
5
|
+
test's inline `mktemp`/heredoc scenario: a root `.gitignore` excluding
|
|
6
|
+
`node_modules/`, `*.log` (with `!keep.log` readmitting one file), and
|
|
7
|
+
`reports/`, plus one ordinary source file. See `check.py`'s module docstring
|
|
8
|
+
for why the fixture is named `.gitignore` (not `.ignore`, which is what
|
|
9
|
+
`test.sh`'s own corrupted source literally writes) and why this test drives
|
|
10
|
+
`IgnoredPaths` directly rather than through `runner.run()`/the row id:
|
|
11
|
+
REP-005 is not yet listed in `checks/__init__.py` (a later step wires this
|
|
12
|
+
whole wave in one shot), so dispatch-by-id would report `COULD_NOT_RUN` for
|
|
13
|
+
every case regardless of this check's own behaviour -- the same reason
|
|
14
|
+
`coverage/config_committed` and `layout/plans_layout`'s own test suites give
|
|
15
|
+
for the identical choice.
|
|
16
|
+
|
|
17
|
+
Every scenario below hands `.gitignore` itself in the given set alongside the
|
|
18
|
+
candidate paths, because this check reads `.gitignore` content from the GIVEN
|
|
19
|
+
SET (K-29) rather than walking for it -- see `check.py`'s "WHY THIS CHECK
|
|
20
|
+
DOES NOT CALL GIT" for the reasoning, and
|
|
21
|
+
`test_a_gitignore_outside_the_given_set_is_invisible` for the stated reach
|
|
22
|
+
reduction that follows from it.
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
from __future__ import annotations
|
|
26
|
+
|
|
27
|
+
import re
|
|
28
|
+
|
|
29
|
+
from helpers import corpus
|
|
30
|
+
|
|
31
|
+
from adl_compliance.checks.repository.ignored_paths import IgnoredPaths
|
|
32
|
+
from adl_compliance.checks.repository.ignored_paths.check import _compile_rule, _translate
|
|
33
|
+
from adl_compliance.core.context import Context, FileSet
|
|
34
|
+
from adl_compliance.core.finding import Finding
|
|
35
|
+
from adl_compliance.core.verdict import Outcome, decide
|
|
36
|
+
from adl_compliance.policy.registry import load
|
|
37
|
+
|
|
38
|
+
CORPUS = corpus("repository", "ignored-paths") / "ignored-paths"
|
|
39
|
+
ROW = load().by_id("REP-005")
|
|
40
|
+
GITIGNORE = ".gitignore"
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def graded_directly(paths: tuple[str, ...]):
|
|
44
|
+
"""Bypasses row-scope narrowing entirely -- the check's OWN behaviour only,
|
|
45
|
+
the same division `repository/banned_commands`'s own test uses for the
|
|
46
|
+
identical reason (REP-005 not yet wired, see the module docstring)."""
|
|
47
|
+
ctx = Context(root=CORPUS, row=ROW)
|
|
48
|
+
findings = tuple(IgnoredPaths().run(ctx, FileSet(paths=paths)))
|
|
49
|
+
return decide(ROW, findings, 0, ())
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def test_the_row_identifies_this_check() -> None:
|
|
53
|
+
assert ROW.domain == "repository"
|
|
54
|
+
assert ROW.name == "ignored-paths"
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
# --- IGN-001: staged paths the ignore rules exclude ---------------------------
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def test_an_ignored_directory_and_extension_are_both_reported() -> None:
|
|
61
|
+
verdict = graded_directly((GITIGNORE, "node_modules/pkg/index.js", "debug.log"))
|
|
62
|
+
assert verdict.outcome is Outcome.FINDINGS, verdict.render()
|
|
63
|
+
paths = {f.path for f in verdict.findings}
|
|
64
|
+
assert "node_modules/pkg/index.js" in paths
|
|
65
|
+
assert "debug.log" in paths
|
|
66
|
+
assert all(f.rule == "IGN-001" for f in verdict.findings)
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def test_the_finding_names_the_deciding_rule_and_its_line() -> None:
|
|
70
|
+
"""The diagnostic names the rule that decided it, not just the path --
|
|
71
|
+
otherwise the reader has every `.gitignore` in the tree to search by
|
|
72
|
+
hand."""
|
|
73
|
+
verdict = graded_directly((GITIGNORE, "node_modules/pkg/index.js"))
|
|
74
|
+
(finding,) = verdict.findings
|
|
75
|
+
assert isinstance(finding, Finding)
|
|
76
|
+
assert ".gitignore:1 (node_modules/)" in finding.message
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
# --- a negation is NOT a violation --------------------------------------------
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
def test_a_path_readmitted_by_a_negation_rule_passes() -> None:
|
|
83
|
+
"""`keep.log` matches `*.log` and is then readmitted by `!keep.log`. The
|
|
84
|
+
LAST matching rule decides, and that rule is the negation."""
|
|
85
|
+
verdict = graded_directly((GITIGNORE, "keep.log"))
|
|
86
|
+
assert verdict.outcome is Outcome.CLEAN, verdict.render()
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
# --- an already-tracked ignored file is still caught --------------------------
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
def test_an_already_tracked_ignored_file_is_reported() -> None:
|
|
93
|
+
"""`reports/` is ignored, but `reports/run.csv` sits in the given set
|
|
94
|
+
regardless -- exactly the force-added, now-ignored case IGN-001 exists to
|
|
95
|
+
catch (see `check.py`'s module docstring: `cli.py`'s own `git ls-files
|
|
96
|
+
--cached` returns a tracked path whether or not it currently matches an
|
|
97
|
+
ignore rule)."""
|
|
98
|
+
verdict = graded_directly((GITIGNORE, "reports/run.csv"))
|
|
99
|
+
assert verdict.outcome is Outcome.FINDINGS, verdict.render()
|
|
100
|
+
assert verdict.rules == ["IGN-001"]
|
|
101
|
+
assert verdict.findings[0].path == "reports/run.csv"
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
# --- a clean scope stays silent ------------------------------------------------
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
def test_an_ordinary_source_file_is_not_reported() -> None:
|
|
108
|
+
verdict = graded_directly((GITIGNORE, "src/main.rs"))
|
|
109
|
+
assert verdict.outcome is Outcome.CLEAN, verdict.render()
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
def test_the_whole_corpus_reports_exactly_the_three_ignored_paths() -> None:
|
|
113
|
+
whole = (
|
|
114
|
+
GITIGNORE,
|
|
115
|
+
"src/main.rs",
|
|
116
|
+
"node_modules/pkg/index.js",
|
|
117
|
+
"debug.log",
|
|
118
|
+
"keep.log",
|
|
119
|
+
"reports/run.csv",
|
|
120
|
+
)
|
|
121
|
+
verdict = graded_directly(whole)
|
|
122
|
+
assert verdict.outcome is Outcome.FINDINGS, verdict.render()
|
|
123
|
+
paths = {f.path for f in verdict.findings}
|
|
124
|
+
assert paths == {"node_modules/pkg/index.js", "debug.log", "reports/run.csv"}
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
# --- reach: this check reads .gitignore from the GIVEN SET, not a walk --------
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
def test_a_gitignore_outside_the_given_set_is_invisible() -> None:
|
|
131
|
+
"""Stated in `check.py`'s module docstring as a real, deliberate reduction
|
|
132
|
+
in reach versus the shell tool's filesystem-wide `git check-ignore`: with
|
|
133
|
+
no `.gitignore` in the given set, this check has no rule to grade against
|
|
134
|
+
and reports clean even for a path that IS ignored on disk."""
|
|
135
|
+
verdict = graded_directly(("node_modules/pkg/index.js",))
|
|
136
|
+
assert verdict.outcome is Outcome.CLEAN, verdict.render()
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
def test_no_set_is_a_clean_pass() -> None:
|
|
140
|
+
verdict = graded_directly(())
|
|
141
|
+
assert verdict.outcome is Outcome.CLEAN, verdict.render()
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
# --- the pattern engine itself -------------------------------------------------
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
def test_a_directory_pattern_matches_only_paths_beneath_it() -> None:
|
|
148
|
+
rule = _compile_rule(GITIGNORE, 1, "node_modules/", "")
|
|
149
|
+
assert rule is not None
|
|
150
|
+
assert rule.regex.match("node_modules/pkg/index.js")
|
|
151
|
+
assert not rule.regex.match("node_modules")
|
|
152
|
+
assert not rule.regex.match("not-node_modules/x")
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
def test_a_slash_free_pattern_matches_at_any_depth() -> None:
|
|
156
|
+
rule = _compile_rule(GITIGNORE, 1, "*.log", "")
|
|
157
|
+
assert rule is not None
|
|
158
|
+
assert rule.regex.match("debug.log")
|
|
159
|
+
assert rule.regex.match("nested/dir/debug.log")
|
|
160
|
+
assert not rule.regex.match("debug.logx")
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
def test_a_comment_and_a_blank_line_compile_to_nothing() -> None:
|
|
164
|
+
assert _compile_rule(GITIGNORE, 1, "# a comment", "") is None
|
|
165
|
+
assert _compile_rule(GITIGNORE, 2, "", "") is None
|
|
166
|
+
assert _compile_rule(GITIGNORE, 3, " ", "") is None
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
def test_a_leading_bang_negates_and_a_leading_escaped_bang_does_not() -> None:
|
|
170
|
+
negated = _compile_rule(GITIGNORE, 1, "!keep.log", "")
|
|
171
|
+
literal = _compile_rule(GITIGNORE, 2, "\\!literal-bang", "")
|
|
172
|
+
assert negated is not None and negated.negated is True
|
|
173
|
+
assert literal is not None and literal.negated is False
|
|
174
|
+
assert literal.regex.match("!literal-bang")
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
def test_star_never_crosses_a_path_separator() -> None:
|
|
178
|
+
assert _translate("*") == "[^/]*"
|
|
179
|
+
assert re.compile(f"^{_translate('*')}$").match("a") is not None
|
|
180
|
+
assert re.compile(f"^{_translate('*')}$").match("a/b") is None
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"""The `repository.license-declared` gate.
|
|
2
|
+
|
|
3
|
+
A folder rather than a module because this gate GRADES A DOCUMENT, and the
|
|
4
|
+
document belongs beside the check that reads it. `check.py` is the rule;
|
|
5
|
+
anything else in here is what it grades.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
from .check import LicenseDeclared
|
|
11
|
+
|
|
12
|
+
__all__ = ["LicenseDeclared"]
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
"""REP-001 — the repository ships the licence it declares.
|
|
2
|
+
|
|
3
|
+
The gate asks two things and no more: is there a LICENSE at the repository root,
|
|
4
|
+
and is it the type `[controls.compliance].license` names.
|
|
5
|
+
|
|
6
|
+
It used to ask something else. Until 2026-09-15 it required the full Apache
|
|
7
|
+
License 2.0 text, rejected a manifest declaring MIT, demanded an Apache
|
|
8
|
+
attribution line in NOTICE, and carried a regex for a donor brand
|
|
9
|
+
(`aionui|aioncore|aionrs|aion`) from the repository it was ported out of. That is
|
|
10
|
+
not a gate enforcing a rule — it is a gate choosing a company's licensing, and
|
|
11
|
+
the estate it chose for ships proprietary. Owner ruling: the licence is the
|
|
12
|
+
repository's declaration, the same way its trees are; the package checks the
|
|
13
|
+
repository against what it declared.
|
|
14
|
+
|
|
15
|
+
Structural only. LICENSE-MISSING is about a file's ABSENCE, and an absent file
|
|
16
|
+
appears in no file set — a rule that only iterated the set could never report it.
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
from __future__ import annotations
|
|
20
|
+
|
|
21
|
+
from collections.abc import Iterable
|
|
22
|
+
from typing import ClassVar
|
|
23
|
+
|
|
24
|
+
from ....core.check import Check
|
|
25
|
+
from ....core.context import Context
|
|
26
|
+
from ....core.finding import Report
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class LicenseDeclared(Check):
|
|
30
|
+
id: ClassVar[str] = "REP-001"
|
|
31
|
+
|
|
32
|
+
KEY: ClassVar[str] = "license"
|
|
33
|
+
|
|
34
|
+
# What each licence looks like on disk, keyed by the declared name. A name
|
|
35
|
+
# absent from this table is not an error: the declaration itself is then the
|
|
36
|
+
# marker, so an estate may declare a licence this package has never heard of
|
|
37
|
+
# and still be graded against it. The table is a convenience for the common
|
|
38
|
+
# ones, never a list of permitted answers.
|
|
39
|
+
PROFILES: ClassVar[dict[str, tuple[str, ...]]] = {
|
|
40
|
+
"Proprietary": ("Proprietary", "All rights reserved"),
|
|
41
|
+
"Apache-2.0": ("Apache License", "Version 2.0"),
|
|
42
|
+
"MIT": ("MIT License", "Permission is hereby granted"),
|
|
43
|
+
"BSD-3-Clause": ("BSD 3-Clause", "Redistribution and use"),
|
|
44
|
+
"GPL-3.0": ("GNU GENERAL PUBLIC LICENSE", "Version 3"),
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
def markers(self, declared: str) -> tuple[str, ...]:
|
|
48
|
+
return self.PROFILES.get(declared, (declared,))
|
|
49
|
+
|
|
50
|
+
def structural(self, ctx: Context) -> Iterable[Report]:
|
|
51
|
+
declared = ctx.declarations.get(self.KEY, "").strip()
|
|
52
|
+
if not declared:
|
|
53
|
+
# Undeclared is a finding against the repository, not a silent pass
|
|
54
|
+
# and not a default of ours. Choosing one here is the defect this
|
|
55
|
+
# rewrite removed.
|
|
56
|
+
yield self.report(
|
|
57
|
+
"adl-config.toml",
|
|
58
|
+
"[controls.compliance] declares no `license`, so the repository "
|
|
59
|
+
"states no licence for LICENSE to be checked against",
|
|
60
|
+
'add `license = "Proprietary"` (or the licence this repository '
|
|
61
|
+
"ships under) to [controls.compliance] in adl-config.toml",
|
|
62
|
+
rule="LICENSE-UNDECLARED",
|
|
63
|
+
)
|
|
64
|
+
return
|
|
65
|
+
|
|
66
|
+
body = self.text(ctx, "LICENSE")
|
|
67
|
+
if body is None:
|
|
68
|
+
yield self.report(
|
|
69
|
+
"LICENSE",
|
|
70
|
+
f"missing repository-root LICENSE (adl-config.toml declares {declared})",
|
|
71
|
+
f"create a LICENSE file at the repository root carrying the {declared} terms",
|
|
72
|
+
rule="LICENSE-MISSING",
|
|
73
|
+
)
|
|
74
|
+
return
|
|
75
|
+
|
|
76
|
+
missing = self.missing_markers(body, self.markers(declared))
|
|
77
|
+
if missing:
|
|
78
|
+
yield self.report(
|
|
79
|
+
"LICENSE",
|
|
80
|
+
f"LICENSE is not {declared} (missing: {', '.join(missing)})",
|
|
81
|
+
f"replace LICENSE with the {declared} terms, or correct the "
|
|
82
|
+
"`license` declaration in adl-config.toml to match the file",
|
|
83
|
+
rule="LICENSE-CONTENT",
|
|
84
|
+
)
|