@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 @@
|
|
|
1
|
+
declared
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
declared
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# index
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
declared
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
declared
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
stray file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
invented folder
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
"""DOC-010 — `docs/` is a closed set.
|
|
2
|
+
|
|
3
|
+
Ported in the same shape `layout/root_closed_set/test_check.py` uses: ONE
|
|
4
|
+
corpus, and the clean case is the same tree with the two violating entries
|
|
5
|
+
left out of the given set — exactly what a commit touching nothing undeclared
|
|
6
|
+
looks like in production.
|
|
7
|
+
|
|
8
|
+
This check is not yet wired into `checks/__init__.py` at file-creation time in
|
|
9
|
+
a concurrent close-out session (several other gates are landing in the same
|
|
10
|
+
wave), so — same reasoning as `root_closed_set/test_check.py` — every test
|
|
11
|
+
below calls `DocsClosedSet` directly rather than through `runner.run`/
|
|
12
|
+
`decide`, bypassing row-scope narrowing and registry lookup entirely.
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
17
|
+
from helpers import corpus, corpus_files
|
|
18
|
+
|
|
19
|
+
from adl_compliance.checks.docs.closed_set import DocsClosedSet
|
|
20
|
+
from adl_compliance.core.context import Context, FileSet
|
|
21
|
+
from adl_compliance.core.finding import Finding
|
|
22
|
+
from adl_compliance.policy.registry import load
|
|
23
|
+
|
|
24
|
+
CORPUS = corpus("docs", "closed-set")
|
|
25
|
+
ROW = load().by_id("DOC-010")
|
|
26
|
+
|
|
27
|
+
INVENTED_FOLDER = "docs/totally-made-up/nonsense.md"
|
|
28
|
+
STRAY_FILE = "docs/stray-root-file.md"
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def clean_set() -> tuple[str, ...]:
|
|
32
|
+
return tuple(
|
|
33
|
+
p for p in corpus_files(CORPUS)
|
|
34
|
+
if p != INVENTED_FOLDER and p != STRAY_FILE
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def findings_for(given: tuple[str, ...]) -> tuple[Finding, ...]:
|
|
39
|
+
ctx = Context(root=CORPUS, row=ROW, inputs={"docs_root": CORPUS / "docs"})
|
|
40
|
+
return tuple(DocsClosedSet().run(ctx, FileSet(paths=given)))
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def test_the_premise_holds() -> None:
|
|
44
|
+
"""Asserted, not assumed: a mistyped path would leave both sets identical
|
|
45
|
+
and every case below would agree for nothing."""
|
|
46
|
+
all_files = corpus_files(CORPUS)
|
|
47
|
+
assert INVENTED_FOLDER in all_files
|
|
48
|
+
assert STRAY_FILE in all_files
|
|
49
|
+
assert len(clean_set()) == len(all_files) - 2
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def test_the_closed_set_is_silent() -> None:
|
|
53
|
+
findings = findings_for(clean_set())
|
|
54
|
+
assert findings == (), tuple(f.render() for f in findings)
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def test_an_invented_subfolder_is_reported() -> None:
|
|
58
|
+
"""The gap this gate exists to close: DOC-007 filters to a fixed
|
|
59
|
+
collection list and skips everything else in silence (verified there by
|
|
60
|
+
creating `docs/totally-made-up/nonsense.md` and running the full armed
|
|
61
|
+
set: zero findings). This gate must name the path instead."""
|
|
62
|
+
findings = findings_for(corpus_files(CORPUS))
|
|
63
|
+
messages = tuple(f.render() for f in findings)
|
|
64
|
+
assert any(
|
|
65
|
+
"docs/totally-made-up" in m and "undeclared docs/ subfolder" in m
|
|
66
|
+
for m in messages
|
|
67
|
+
), messages
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def test_a_stray_root_file_is_reported() -> None:
|
|
71
|
+
findings = findings_for(corpus_files(CORPUS))
|
|
72
|
+
messages = tuple(f.render() for f in findings)
|
|
73
|
+
assert any(
|
|
74
|
+
"docs/stray-root-file.md" in m and "undeclared top-level docs/ file" in m
|
|
75
|
+
for m in messages
|
|
76
|
+
), messages
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
def test_every_finding_is_tagged_doc_010() -> None:
|
|
80
|
+
findings = findings_for(corpus_files(CORPUS))
|
|
81
|
+
assert findings
|
|
82
|
+
assert all(f.rule == "DOC-010" for f in findings), tuple(f.render() for f in findings)
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
def test_declared_dirs_and_files_stay_silent() -> None:
|
|
86
|
+
"""Without this, the invented-folder case above also passes against a
|
|
87
|
+
gate that calls every docs/ entry undeclared."""
|
|
88
|
+
text = "\n".join(f.render() for f in findings_for(corpus_files(CORPUS)))
|
|
89
|
+
for entry in ("architecture", "research", "compliance", "operations", "decisions"):
|
|
90
|
+
assert f"docs/{entry}: undeclared" not in text
|
|
91
|
+
for entry in ("AGENTS.md", "CLAUDE.md", "index.md"):
|
|
92
|
+
assert f"docs/{entry}: undeclared" not in text
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
def test_an_empty_set_grades_nothing() -> None:
|
|
96
|
+
"""Every undeclared entry is still on disk. A check that grades only what
|
|
97
|
+
it is handed must report none of them against an empty given set."""
|
|
98
|
+
findings = findings_for(())
|
|
99
|
+
assert findings == ()
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
def test_a_path_outside_docs_is_ignored() -> None:
|
|
103
|
+
"""This gate grades `docs/`'s own shape, not the whole repository root —
|
|
104
|
+
that is LAY-012's job."""
|
|
105
|
+
findings = findings_for(("plans/totally-made-up/nonsense.md",))
|
|
106
|
+
assert findings == ()
|
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
"""DOC-002 — reject non-English (Han) content and filenames.
|
|
2
|
+
|
|
3
|
+
Ported from `compliance_new/checks/docs/english-only/check.sh`. That script's
|
|
4
|
+
own header explains its shape: it takes NO arguments, reads exactly the given
|
|
5
|
+
set (`ADL_CHANGED_FILES`, already narrowed by the runner to the row's
|
|
6
|
+
`engine.scope`), performs no walk and no `git` call, and never echoes the
|
|
7
|
+
offending Han text into a report — only where it is, never what it is.
|
|
8
|
+
|
|
9
|
+
Five finding kinds, unchanged from the shell version:
|
|
10
|
+
|
|
11
|
+
"Han filename" a path component contains a Han character.
|
|
12
|
+
"raw Han text" a line contains a raw Han character.
|
|
13
|
+
"Han Unicode escape" a line contains a \\u/\\U escape that DECODES to
|
|
14
|
+
a Han codepoint (an escape for a non-Han
|
|
15
|
+
codepoint, e.g. \\u0041, is not a finding).
|
|
16
|
+
"Han archive filename" an OOXML (.docx/.xlsx/.pptx) member name is Han.
|
|
17
|
+
"unreadable Office archive" / "unreadable archive text"
|
|
18
|
+
the zip, or one member's text stream, could not
|
|
19
|
+
be read at all — a tool failure reported as a
|
|
20
|
+
finding, never silently skipped.
|
|
21
|
+
|
|
22
|
+
What check.sh needed and this class does not: `rg`/`unzip`/`iconv`/`od`
|
|
23
|
+
subprocess plumbing, its own ZIP central-directory parser (`read_archive_members`,
|
|
24
|
+
`read_le16/32`), and the fork-avoidance batching (`bulk_filename_scan`,
|
|
25
|
+
`classify_matches_awk`) that existed only because bash's own scanning is slow.
|
|
26
|
+
Python's `re` module scans full Unicode codepoints directly (no UTF-16
|
|
27
|
+
surrogate-pair handling needed, unlike the bash/rg version's `\\x{...}`
|
|
28
|
+
escapes for the supplementary-plane ranges), and `zipfile` is the stdlib
|
|
29
|
+
reader for the OOXML archives check.sh hand-parsed a ZIP central directory to
|
|
30
|
+
reach — so the same five findings are produced with much less machinery.
|
|
31
|
+
|
|
32
|
+
One finding per (path, line, kind), not per matched character or codepoint —
|
|
33
|
+
`graded` de-duplicates on that key exactly as check.sh's own
|
|
34
|
+
`sort | awk '!seen[key]++'` pass did, because the message text never repeats
|
|
35
|
+
the matched value (a two-character Han word on one line is one finding, not
|
|
36
|
+
two).
|
|
37
|
+
|
|
38
|
+
The row's `engine.scope` (`policy/gate-registry.yaml`, `DOC-002`) excludes
|
|
39
|
+
four specific frontend fixture files — SCOPE, decided by the row, not by this
|
|
40
|
+
check. `scan_excluded`'s three rules below are a different thing: SUBJECT-MATTER
|
|
41
|
+
exclusions this gate owns, because they say what kind of content Han text is
|
|
42
|
+
allowed to be (hidden paths, the one named i18n directory, any locale-named
|
|
43
|
+
data directory), not where in the tree it lives.
|
|
44
|
+
"""
|
|
45
|
+
|
|
46
|
+
from __future__ import annotations
|
|
47
|
+
|
|
48
|
+
import zipfile
|
|
49
|
+
from collections.abc import Iterable, Iterator
|
|
50
|
+
from pathlib import Path
|
|
51
|
+
from re import Pattern
|
|
52
|
+
from typing import ClassVar
|
|
53
|
+
|
|
54
|
+
import re as _re
|
|
55
|
+
|
|
56
|
+
from ....core.check import Check
|
|
57
|
+
from ....core.context import Context, FileSet
|
|
58
|
+
from ....core.finding import Finding
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
class DocsEnglishOnly(Check):
|
|
62
|
+
id: ClassVar[str] = "DOC-002"
|
|
63
|
+
rule: ClassVar[str] = "DOC-002"
|
|
64
|
+
|
|
65
|
+
OFFICE_SUFFIXES: ClassVar[frozenset[str]] = frozenset({".docx", ".pptx", ".xlsx"})
|
|
66
|
+
ARCHIVE_TEXT_SUFFIXES: ClassVar[frozenset[str]] = frozenset(
|
|
67
|
+
{".json", ".rels", ".txt", ".xml"}
|
|
68
|
+
)
|
|
69
|
+
# A suffix missing from this set is not a small gap: the file's raw bytes get
|
|
70
|
+
# decoded as UTF-8 and every byte that happens to land in a CJK range becomes
|
|
71
|
+
# a finding. One absent `.ogg` produced 536 of them, none about documentation.
|
|
72
|
+
BINARY_SUFFIXES: ClassVar[frozenset[str]] = frozenset(
|
|
73
|
+
{
|
|
74
|
+
".7z", ".avi", ".bin", ".bmp", ".bz2", ".class", ".dmg", ".doc", ".eot",
|
|
75
|
+
".exe", ".gif", ".gz", ".heic", ".ico", ".icns", ".jar", ".jpeg", ".jpg",
|
|
76
|
+
".lockb", ".mov", ".mp3", ".mp4", ".mpeg", ".oga", ".ogg", ".ogv",
|
|
77
|
+
".opus", ".otf", ".pdf", ".png", ".so", ".tar", ".tgz", ".tif", ".tiff",
|
|
78
|
+
".ttf", ".wasm", ".wav", ".webm", ".webp", ".woff", ".woff2", ".xls",
|
|
79
|
+
".zip",
|
|
80
|
+
}
|
|
81
|
+
)
|
|
82
|
+
ARCHIVE_THEME_PREFIXES: ClassVar[tuple[str, ...]] = (
|
|
83
|
+
"xl/theme/", "word/theme/", "ppt/theme/",
|
|
84
|
+
)
|
|
85
|
+
|
|
86
|
+
# Han/CJK-ideograph codepoint ranges: CJK Unified (+ Extension A), CJK
|
|
87
|
+
# Compatibility Ideographs, and Extensions B-G in the supplementary planes
|
|
88
|
+
# — the same set check.sh's HAN_CLASS/is_han_codepoint covered.
|
|
89
|
+
HAN_RANGES: ClassVar[tuple[tuple[int, int], ...]] = (
|
|
90
|
+
(0x3400, 0x4DBF),
|
|
91
|
+
(0x4E00, 0x9FFF),
|
|
92
|
+
(0xF900, 0xFAFF),
|
|
93
|
+
(0x20000, 0x2A6DF),
|
|
94
|
+
(0x2A700, 0x2B73F),
|
|
95
|
+
(0x2B740, 0x2B81F),
|
|
96
|
+
(0x2B820, 0x2CEAF),
|
|
97
|
+
(0x2CEB0, 0x2EBEF),
|
|
98
|
+
(0x30000, 0x3134F),
|
|
99
|
+
)
|
|
100
|
+
|
|
101
|
+
HAN_PATTERN: ClassVar[Pattern[str]] = _re.compile(
|
|
102
|
+
"[" + "".join(f"{chr(lo)}-{chr(hi)}" for lo, hi in HAN_RANGES) + "]"
|
|
103
|
+
)
|
|
104
|
+
"""Built from actual embedded Unicode characters, not `\\uXXXX` escapes in
|
|
105
|
+
the pattern text — `re` parsing `\\u`/`\\U` escapes itself would work too,
|
|
106
|
+
but this way the codepoints are literal Python string content and there is
|
|
107
|
+
nothing left for the regex engine to interpret."""
|
|
108
|
+
|
|
109
|
+
ESCAPE_PATTERN: ClassVar[Pattern[str]] = _re.compile(
|
|
110
|
+
r"\\(u[0-9A-Fa-f]{4}|u\{[0-9A-Fa-f]{1,6}\}|U[0-9A-Fa-f]{8})"
|
|
111
|
+
)
|
|
112
|
+
"""Textual `\\u`/`\\U` escapes that could encode a Han codepoint without
|
|
113
|
+
containing the raw character. Matches are validated numerically afterwards
|
|
114
|
+
— the pattern also matches escapes for non-Han codepoints (e.g. `\\u0041`)."""
|
|
115
|
+
|
|
116
|
+
CONTENT_PATTERN: ClassVar[Pattern[str]] = _re.compile(
|
|
117
|
+
HAN_PATTERN.pattern + "|" + ESCAPE_PATTERN.pattern
|
|
118
|
+
)
|
|
119
|
+
|
|
120
|
+
LOCALE_DIR: ClassVar[Pattern[str]] = _re.compile(
|
|
121
|
+
r"(^|/)i18n/(locales/)?[a-z]{2}(-[A-Za-z]{2,4})?/"
|
|
122
|
+
)
|
|
123
|
+
"""Locale DATA directories anywhere in the tree — `.../i18n/<locale>/...`
|
|
124
|
+
and `.../i18n/locales/<locale>/...` — where non-English text is the point,
|
|
125
|
+
not a defect. Mirrors check.sh's `scan_excluded` rule 3."""
|
|
126
|
+
|
|
127
|
+
inputs: ClassVar[dict[str, str]] = {"frontend_src": "<frontend>"}
|
|
128
|
+
"""FIXED 2026-09-16 (K-42 sweep, LOUD form, approved): `I18N_OWNER` was a
|
|
129
|
+
hardcoded `frontend/mobile/src/i18n` literal, matched against the given
|
|
130
|
+
set with `==`/`startswith` inside `_excluded` -- a rule 2 EXEMPTION, not a
|
|
131
|
+
filter over what gets scanned. A repository whose frontend root is not the
|
|
132
|
+
packaged default had its real i18n directory fail this match, so its
|
|
133
|
+
genuinely-translated strings were no longer exempt -- every one of them
|
|
134
|
+
became a false "raw Han text" finding. LOUD, not silent: the wrong path
|
|
135
|
+
does not go quiet, it makes real translated content look like a defect.
|
|
136
|
+
`mobile/src/i18n` stays literal below the resolved root: the settled
|
|
137
|
+
platform path, not a resolvable one, the same call TS-001's `MOBILE_SRC`
|
|
138
|
+
fix already made."""
|
|
139
|
+
|
|
140
|
+
FIX_BY_KIND: ClassVar[dict[str, str]] = {
|
|
141
|
+
"Han Unicode escape": "replace the \\u/\\U escape with the equivalent English text",
|
|
142
|
+
"raw Han text": "translate this Han-script text into English",
|
|
143
|
+
"Han filename": "rename this path component using ASCII/English characters",
|
|
144
|
+
"Han archive filename": (
|
|
145
|
+
"rename this archive member using ASCII/English characters and re-save the document"
|
|
146
|
+
),
|
|
147
|
+
"unreadable Office archive": (
|
|
148
|
+
"repair or re-export the Office file so it is a valid, readable ZIP archive"
|
|
149
|
+
),
|
|
150
|
+
"unreadable archive text": (
|
|
151
|
+
"repair the archive member or re-export the document so its text stream can be read"
|
|
152
|
+
),
|
|
153
|
+
}
|
|
154
|
+
"""One genuine, specific remediation per finding kind — check.sh's
|
|
155
|
+
`english_only_fix`. No catch-all default: every kind this class emits has
|
|
156
|
+
an entry here, and a kind added without one is a programming error, not a
|
|
157
|
+
generic message papering over it."""
|
|
158
|
+
|
|
159
|
+
# ------------------------------------------------------------- entrypoint
|
|
160
|
+
|
|
161
|
+
def graded(self, ctx: Context, files: FileSet) -> Iterable[Finding]:
|
|
162
|
+
seen: set[tuple[str, int | None, str]] = set()
|
|
163
|
+
for finding in self._raw_findings(ctx, files):
|
|
164
|
+
key = (finding.path, finding.line, finding.message)
|
|
165
|
+
if key in seen:
|
|
166
|
+
continue
|
|
167
|
+
seen.add(key)
|
|
168
|
+
yield finding
|
|
169
|
+
|
|
170
|
+
def _raw_findings(self, ctx: Context, files: FileSet) -> Iterator[Finding]:
|
|
171
|
+
# Filename scan runs over every path in the given set, whether or not
|
|
172
|
+
# it still exists on disk — check.sh's ALL_RELPATHS is filled before
|
|
173
|
+
# its own `[ -f "$rel" ]` guard, because a Han PATH is the finding
|
|
174
|
+
# there, distinct from Han CONTENT, which a deleted file no longer has.
|
|
175
|
+
i18n_owner = self._i18n_owner(ctx)
|
|
176
|
+
for relative in files:
|
|
177
|
+
if self._excluded(relative, i18n_owner):
|
|
178
|
+
continue
|
|
179
|
+
if self.HAN_PATTERN.search(relative):
|
|
180
|
+
yield self._finding(relative, "Han filename")
|
|
181
|
+
|
|
182
|
+
for relative in files.existing(ctx.root):
|
|
183
|
+
if self._excluded(relative, i18n_owner):
|
|
184
|
+
continue
|
|
185
|
+
suffix = self._path_suffix(relative).lower()
|
|
186
|
+
if suffix in self.OFFICE_SUFFIXES:
|
|
187
|
+
yield from self._archive_findings(ctx, relative)
|
|
188
|
+
elif suffix not in self.BINARY_SUFFIXES:
|
|
189
|
+
yield from self._scan_plain_file(ctx, relative)
|
|
190
|
+
|
|
191
|
+
# ------------------------------------------------------ subject-matter scope
|
|
192
|
+
|
|
193
|
+
def _i18n_owner(self, ctx: Context) -> str:
|
|
194
|
+
return f"{ctx.relative(ctx.inputs['frontend_src'])}/mobile/src/i18n"
|
|
195
|
+
|
|
196
|
+
def _excluded(self, relative: str, i18n_owner: str) -> bool:
|
|
197
|
+
# 1. Hidden paths, by decision. Every component is tested.
|
|
198
|
+
if any(part.startswith(".") for part in relative.split("/")):
|
|
199
|
+
return True
|
|
200
|
+
# 2. The one named i18n owner exemption.
|
|
201
|
+
if relative == i18n_owner or relative.startswith(i18n_owner + "/"):
|
|
202
|
+
return True
|
|
203
|
+
# 3. Any locale-named data directory, anywhere.
|
|
204
|
+
if self.LOCALE_DIR.search(relative):
|
|
205
|
+
return True
|
|
206
|
+
return False
|
|
207
|
+
|
|
208
|
+
# -------------------------------------------------------------- plain files
|
|
209
|
+
|
|
210
|
+
def _scan_plain_file(self, ctx: Context, relative: str) -> Iterator[Finding]:
|
|
211
|
+
body = self.text(ctx, relative)
|
|
212
|
+
if body is None:
|
|
213
|
+
return
|
|
214
|
+
for line_no, kind in self._scan_text(body):
|
|
215
|
+
yield self._finding(relative, kind, line=line_no)
|
|
216
|
+
|
|
217
|
+
def _scan_text(self, body: str) -> Iterator[tuple[int, str]]:
|
|
218
|
+
for line_no, line in enumerate(body.splitlines(), start=1):
|
|
219
|
+
for match in self.CONTENT_PATTERN.finditer(line):
|
|
220
|
+
value = match.group(0)
|
|
221
|
+
if value.startswith("\\"):
|
|
222
|
+
codepoint = self._escape_codepoint(value)
|
|
223
|
+
if codepoint is not None and self._is_han(codepoint):
|
|
224
|
+
yield line_no, "Han Unicode escape"
|
|
225
|
+
else:
|
|
226
|
+
yield line_no, "raw Han text"
|
|
227
|
+
|
|
228
|
+
@staticmethod
|
|
229
|
+
def _escape_codepoint(value: str) -> int | None:
|
|
230
|
+
stripped = value.lstrip("\\")
|
|
231
|
+
hex_text = stripped[2:-1] if stripped.startswith("u{") else stripped[1:]
|
|
232
|
+
try:
|
|
233
|
+
return int(hex_text, 16)
|
|
234
|
+
except ValueError:
|
|
235
|
+
return None
|
|
236
|
+
|
|
237
|
+
def _is_han(self, codepoint: int) -> bool:
|
|
238
|
+
return any(lo <= codepoint <= hi for lo, hi in self.HAN_RANGES)
|
|
239
|
+
|
|
240
|
+
# ---------------------------------------------------------------- archives
|
|
241
|
+
|
|
242
|
+
def _archive_findings(self, ctx: Context, relative: str) -> Iterator[Finding]:
|
|
243
|
+
abs_path: Path = ctx.path(relative)
|
|
244
|
+
try:
|
|
245
|
+
archive = zipfile.ZipFile(abs_path)
|
|
246
|
+
except (zipfile.BadZipFile, OSError):
|
|
247
|
+
yield self._finding(relative, "unreadable Office archive")
|
|
248
|
+
return
|
|
249
|
+
try:
|
|
250
|
+
for info in sorted(archive.infolist(), key=lambda entry: entry.filename):
|
|
251
|
+
member = info.filename
|
|
252
|
+
if member.endswith("/"):
|
|
253
|
+
continue
|
|
254
|
+
yield from self._archive_member_findings(ctx, archive, relative, member)
|
|
255
|
+
finally:
|
|
256
|
+
archive.close()
|
|
257
|
+
|
|
258
|
+
def _archive_member_findings(
|
|
259
|
+
self, ctx: Context, archive: zipfile.ZipFile, relative: str, member: str
|
|
260
|
+
) -> Iterator[Finding]:
|
|
261
|
+
shown = f"{relative}!/{member}"
|
|
262
|
+
if self.HAN_PATTERN.search(member):
|
|
263
|
+
yield self._finding(shown, "Han archive filename")
|
|
264
|
+
|
|
265
|
+
suffix = self._path_suffix(member).lower()
|
|
266
|
+
if suffix not in self.ARCHIVE_TEXT_SUFFIXES:
|
|
267
|
+
return
|
|
268
|
+
if member.startswith(self.ARCHIVE_THEME_PREFIXES):
|
|
269
|
+
return
|
|
270
|
+
try:
|
|
271
|
+
data = archive.read(member)
|
|
272
|
+
except (KeyError, RuntimeError, zipfile.BadZipFile):
|
|
273
|
+
yield self._finding(shown, "unreadable archive text")
|
|
274
|
+
return
|
|
275
|
+
body = data.decode("utf-8", errors="replace")
|
|
276
|
+
for line_no, kind in self._scan_text(body):
|
|
277
|
+
yield self._finding(shown, kind, line=line_no)
|
|
278
|
+
|
|
279
|
+
# ------------------------------------------------------------------ shared
|
|
280
|
+
|
|
281
|
+
@staticmethod
|
|
282
|
+
def _path_suffix(relative: str) -> str:
|
|
283
|
+
base = relative.rsplit("/", 1)[-1]
|
|
284
|
+
if base.startswith(".") and base.count(".") <= 1:
|
|
285
|
+
return ""
|
|
286
|
+
if "." in base:
|
|
287
|
+
return "." + base.rsplit(".", 1)[-1]
|
|
288
|
+
return ""
|
|
289
|
+
|
|
290
|
+
def _finding(self, path: str, kind: str, *, line: int | None = 1) -> Finding:
|
|
291
|
+
return self.report(path, f"{kind} on this line", self.FIX_BY_KIND[kind], line=line)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
English only.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export const strings = { greeting: "你好" };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
一
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
English only content; the filename itself is the finding.
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
"""DOC-002 — ported from `compliance_new/checks/docs/english-only/test.sh`.
|
|
2
|
+
|
|
3
|
+
Same three committed corpora, same relative paths and contents as the shell
|
|
4
|
+
test's fixtures (`fixtures/violation/backend/{raw.rs,escaped.rs,文件.rs}`,
|
|
5
|
+
`fixtures/clean/backend/clean.rs`,
|
|
6
|
+
`fixtures/excluded/frontend/mobile/src/i18n/locales/zh-CN/strings.ts`), and the
|
|
7
|
+
same four assertions: a violating tree reports all three finding kinds and
|
|
8
|
+
never echoes the offending Han text; a clean tree is silent; translated locale
|
|
9
|
+
data is excluded by subject matter, not by scope; and the row still declares
|
|
10
|
+
the script this class ports.
|
|
11
|
+
|
|
12
|
+
Not ported: test.sh's "no set: could not run" case. That is a property of the
|
|
13
|
+
shell CLI (`ADL_CHANGED_FILES` unset), not of this gate's rule logic — a
|
|
14
|
+
`Check.graded` is always called with a `FileSet` argument here, so there is no
|
|
15
|
+
"unset" state to assert, exactly as no other ported check's test re-asserts it.
|
|
16
|
+
|
|
17
|
+
`DocsEnglishOnly().graded(...)` is called directly, through `decide`, rather
|
|
18
|
+
than through `runner.run`: DOC-002 is not yet listed in `checks/__init__.py`
|
|
19
|
+
(a later step wires this whole wave in one shot — see this gate's own
|
|
20
|
+
AGENTS.md), and `runner.run` would report `COULD_NOT_RUN` for an unwired row.
|
|
21
|
+
This mirrors `typescript/no_eval/test_check.py`'s `graded_directly` helper,
|
|
22
|
+
which exercises the same direct path alongside its (already-wired) `runner.run`
|
|
23
|
+
assertions.
|
|
24
|
+
|
|
25
|
+
The archive-scanning behaviour (`.docx`/`.xlsx`/`.pptx` member text and member
|
|
26
|
+
filenames) IS ported in `check.py`, using stdlib `zipfile` rather than
|
|
27
|
+
check.sh's hand-rolled ZIP central-directory parser — a genuine simplification,
|
|
28
|
+
not a gap, since Python already has a real ZIP reader. It is exercised below
|
|
29
|
+
with small in-memory archives built at test time, which is not something
|
|
30
|
+
test.sh did (its own header records the shell version's archive path as
|
|
31
|
+
untested); this is additional coverage, not a substitute for anything test.sh
|
|
32
|
+
asserts.
|
|
33
|
+
"""
|
|
34
|
+
|
|
35
|
+
from __future__ import annotations
|
|
36
|
+
|
|
37
|
+
import pathlib
|
|
38
|
+
import zipfile
|
|
39
|
+
|
|
40
|
+
from helpers import corpus
|
|
41
|
+
|
|
42
|
+
from adl_compliance.checks.docs.english_only import DocsEnglishOnly
|
|
43
|
+
from adl_compliance.core.context import Context, FileSet
|
|
44
|
+
from adl_compliance.core.verdict import Outcome, decide
|
|
45
|
+
from adl_compliance.policy.registry import load
|
|
46
|
+
|
|
47
|
+
CORPORA = corpus("docs", "english-only")
|
|
48
|
+
VIOLATION = CORPORA / "violation"
|
|
49
|
+
CLEAN = CORPORA / "clean"
|
|
50
|
+
EXCLUDED = CORPORA / "excluded"
|
|
51
|
+
ROW = load().by_id("DOC-002")
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def graded_directly(root: pathlib.Path, paths: tuple[str, ...]):
|
|
55
|
+
# `frontend_src` is a RESOLVED INPUT now, not a class constant -- `frontend`
|
|
56
|
+
# bare, the packaged default `<frontend>` actually resolves to, which is
|
|
57
|
+
# also every committed corpus's real shape.
|
|
58
|
+
ctx = Context(root=root, row=ROW, inputs={"frontend_src": root / "frontend"})
|
|
59
|
+
findings = tuple(DocsEnglishOnly().graded(ctx, FileSet(paths=paths)))
|
|
60
|
+
return decide(ROW, findings, 0, ())
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def test_the_row_identifies_this_check() -> None:
|
|
64
|
+
"""The wiring proof the shell test's `dispatch_contract` covered: the row
|
|
65
|
+
genuinely addresses this check, not a renamed one."""
|
|
66
|
+
assert ROW.domain == "docs"
|
|
67
|
+
assert ROW.name == "english-only"
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def test_the_violating_fixture_reports_all_three_kinds() -> None:
|
|
71
|
+
verdict = graded_directly(
|
|
72
|
+
VIOLATION, ("backend/raw.rs", "backend/escaped.rs", "backend/文件.rs")
|
|
73
|
+
)
|
|
74
|
+
assert verdict.outcome is Outcome.FINDINGS, verdict.render()
|
|
75
|
+
assert len(verdict.findings) == 3
|
|
76
|
+
|
|
77
|
+
rendered = verdict.render()
|
|
78
|
+
assert "DOC-002 backend/raw.rs:1: raw Han text on this line" in rendered
|
|
79
|
+
assert "DOC-002 backend/escaped.rs:2: Han Unicode escape on this line" in rendered
|
|
80
|
+
assert "DOC-002 backend/文件.rs:1: Han filename on this line" in rendered
|
|
81
|
+
assert all(f.rule == "DOC-002" for f in verdict.findings)
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def test_the_offending_han_text_is_never_echoed() -> None:
|
|
85
|
+
"""check.sh's own rule: a report names WHERE, never WHAT. The Han-named
|
|
86
|
+
fixture still shows Han in its own path (the path IS the finding there);
|
|
87
|
+
this checks only that the raw content character (一, from raw.rs/escaped.rs)
|
|
88
|
+
never leaks into a message."""
|
|
89
|
+
verdict = graded_directly(
|
|
90
|
+
VIOLATION, ("backend/raw.rs", "backend/escaped.rs", "backend/文件.rs")
|
|
91
|
+
)
|
|
92
|
+
for finding in verdict.findings:
|
|
93
|
+
assert "一" not in finding.message
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
def test_the_clean_fixture_is_silent() -> None:
|
|
97
|
+
verdict = graded_directly(CLEAN, ("backend/clean.rs",))
|
|
98
|
+
assert verdict.outcome is Outcome.CLEAN, verdict.render()
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
def test_locale_data_is_excluded_by_subject_matter_not_scope() -> None:
|
|
102
|
+
"""`frontend/mobile/src/i18n/locales/zh-CN/` is Han BY DESIGN — translated
|
|
103
|
+
UI strings, not prose to flag. Proves `_excluded`'s subject-matter
|
|
104
|
+
exemption: the row's own scope is `**` (minus four unrelated files) and
|
|
105
|
+
would otherwise select this path."""
|
|
106
|
+
path = "frontend/mobile/src/i18n/locales/zh-CN/strings.ts"
|
|
107
|
+
verdict = graded_directly(EXCLUDED, (path,))
|
|
108
|
+
assert verdict.outcome is Outcome.CLEAN, verdict.render()
|
|
109
|
+
assert not any(f.rule == "DOC-002" for f in verdict.findings)
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
def test_a_redeclared_frontend_tree_still_exempts_the_i18n_owner(tmp_path: pathlib.Path) -> None:
|
|
113
|
+
"""The LOUD false-positive this check shipped with.
|
|
114
|
+
|
|
115
|
+
`I18N_OWNER = "frontend/mobile/src/i18n"` was matched against the given
|
|
116
|
+
set directly. A repository whose frontend root is not the packaged
|
|
117
|
+
default had its real, genuinely-translated i18n tree fail that match --
|
|
118
|
+
every translated string in it became a false "raw Han text" finding.
|
|
119
|
+
Unlike a SILENT filter this does not go quiet; it makes real, exempt
|
|
120
|
+
content look like a defect, which is what makes it LOUD."""
|
|
121
|
+
path = "web/mobile/src/i18n/locales/zh-CN/strings.ts"
|
|
122
|
+
root = tmp_path / "repo"
|
|
123
|
+
target = root / path
|
|
124
|
+
target.parent.mkdir(parents=True)
|
|
125
|
+
target.write_text("export const greeting = '一';\n", encoding="utf-8")
|
|
126
|
+
ctx = Context(root=root, row=ROW, inputs={"frontend_src": root / "web"})
|
|
127
|
+
findings = tuple(DocsEnglishOnly().graded(ctx, FileSet(paths=(path,))))
|
|
128
|
+
verdict = decide(ROW, findings, 0, ())
|
|
129
|
+
assert verdict.outcome is Outcome.CLEAN, (
|
|
130
|
+
f"genuinely-translated i18n content under a redeclared frontend root "
|
|
131
|
+
f"was falsely flagged: {verdict.render()}"
|
|
132
|
+
)
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
def test_a_deleted_paths_han_filename_still_reports_but_not_its_content(
|
|
136
|
+
tmp_path: pathlib.Path,
|
|
137
|
+
) -> None:
|
|
138
|
+
"""check.sh fills `ALL_RELPATHS` (filename scan) unconditionally, before
|
|
139
|
+
its own `[ -f "$rel" ]` guard on `ALL_FILE_ABS` (content scan) — a Han path
|
|
140
|
+
component is the finding even for a path the given set names but that no
|
|
141
|
+
longer exists on disk; there is simply nothing left to read for content."""
|
|
142
|
+
verdict = graded_directly(tmp_path, ("backend/文件.rs",))
|
|
143
|
+
assert verdict.outcome is Outcome.FINDINGS, verdict.render()
|
|
144
|
+
assert len(verdict.findings) == 1
|
|
145
|
+
assert verdict.findings[0].message == "Han filename on this line"
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
# ---------------------------------------------------------------- archives
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
def _write_docx(path: pathlib.Path, *, member_name: str, member_text: str) -> None:
|
|
152
|
+
with zipfile.ZipFile(path, "w") as archive:
|
|
153
|
+
archive.writestr("[Content_Types].xml", "<Types/>")
|
|
154
|
+
archive.writestr(member_name, member_text)
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
def test_an_office_archive_with_han_member_name_and_text_is_reported(
|
|
158
|
+
tmp_path: pathlib.Path,
|
|
159
|
+
) -> None:
|
|
160
|
+
_write_docx(tmp_path / "report.docx", member_name="word/文档.xml", member_text="一")
|
|
161
|
+
verdict = graded_directly(tmp_path, ("report.docx",))
|
|
162
|
+
assert verdict.outcome is Outcome.FINDINGS, verdict.render()
|
|
163
|
+
kinds = {f.message for f in verdict.findings}
|
|
164
|
+
assert "Han archive filename on this line" in kinds
|
|
165
|
+
assert "raw Han text on this line" in kinds
|
|
166
|
+
assert all(f.path.startswith("report.docx!/") for f in verdict.findings)
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
def test_an_office_archive_with_english_only_members_is_silent(
|
|
170
|
+
tmp_path: pathlib.Path,
|
|
171
|
+
) -> None:
|
|
172
|
+
_write_docx(tmp_path / "report.docx", member_name="word/document.xml", member_text="hello")
|
|
173
|
+
verdict = graded_directly(tmp_path, ("report.docx",))
|
|
174
|
+
assert verdict.outcome is Outcome.CLEAN, verdict.render()
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
def test_a_theme_member_is_excluded_from_archive_text_scanning(
|
|
178
|
+
tmp_path: pathlib.Path,
|
|
179
|
+
) -> None:
|
|
180
|
+
"""Mirrors check.sh's `xl/theme/* | word/theme/* | ppt/theme/*` skip."""
|
|
181
|
+
_write_docx(tmp_path / "report.docx", member_name="word/theme/theme1.xml", member_text="一")
|
|
182
|
+
verdict = graded_directly(tmp_path, ("report.docx",))
|
|
183
|
+
assert verdict.outcome is Outcome.CLEAN, verdict.render()
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
def test_an_unreadable_office_archive_is_reported_not_silently_skipped(
|
|
187
|
+
tmp_path: pathlib.Path,
|
|
188
|
+
) -> None:
|
|
189
|
+
broken = tmp_path / "broken.docx"
|
|
190
|
+
broken.write_bytes(b"not a zip file")
|
|
191
|
+
verdict = graded_directly(tmp_path, ("broken.docx",))
|
|
192
|
+
assert verdict.outcome is Outcome.FINDINGS, verdict.render()
|
|
193
|
+
assert verdict.findings[0].message == "unreadable Office archive on this line"
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"""The `docs.index-updated` gate.
|
|
2
|
+
|
|
3
|
+
A folder rather than a module because this gate GRADES A DOCUMENT (each
|
|
4
|
+
collection's `index.md` catalog) and the document belongs beside the check
|
|
5
|
+
that reads it.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
from .check import IndexUpdated
|
|
11
|
+
|
|
12
|
+
__all__ = ["IndexUpdated"]
|