@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,594 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `tool.lean-ctx-global-state` — deny a `lean-ctx` subcommand that writes
|
|
3
|
+
* GLOBAL/user state instead of the repo-scoped state this estate actually
|
|
4
|
+
* enforces.
|
|
5
|
+
*
|
|
6
|
+
* Tarun's standing rule (`.scratchpad/FINISH_BRIEF.md`, this session):
|
|
7
|
+
* lean-ctx is REPO-LOCAL. Its config is per repository
|
|
8
|
+
* (`.agents/lean-ctx/config/lean-ctx/config.toml` by default, or wherever
|
|
9
|
+
* `[hooks] lean_ctx_dir` in `adl-config.toml` names — reached via
|
|
10
|
+
* `LEAN_CTX_CONFIG_DIR`, which `adl hook lean-ctx …` sets — see
|
|
11
|
+
* `../../lean-ctx/env.ts`), and no lean-ctx hook, shell hook, skill or MCP
|
|
12
|
+
* entry may live at user/global level. Global state kept coming back because
|
|
13
|
+
* lean-ctx's OWN subcommands re-inject it:
|
|
14
|
+
* - `lean-ctx setup` (2026-09-14) injected an `exec lean-ctx -c
|
|
15
|
+
* "$BASH_EXECUTION_STRING"` shell hook into `~/.bashenv` and wrote raw
|
|
16
|
+
* `lean-ctx hook observe|rewrite|redirect|read-dedup` entries into
|
|
17
|
+
* `~/.claude/settings.json`. `observe` must never run — Tarun does not
|
|
18
|
+
* want data leaving the machine.
|
|
19
|
+
* - The same setup put global `SKILL.md` copies into `~/.claude/skills`,
|
|
20
|
+
* `~/.codex/skills`, `~/.cursor/skills` and `~/.config/opencode/skills`.
|
|
21
|
+
* - `lean-ctx allow <cmd>` run with no `LEAN_CTX_CONFIG_DIR` writes the
|
|
22
|
+
* GLOBAL `~/.config/lean-ctx/config.toml`, not the repo config that is
|
|
23
|
+
* actually enforced — lean-ctx's own "blocked" message tells agents to
|
|
24
|
+
* run exactly that.
|
|
25
|
+
*
|
|
26
|
+
* Independent review (this session) found and this file now closes six
|
|
27
|
+
* further gaps beyond the original pass — see each numbered comment below
|
|
28
|
+
* for the specific fix:
|
|
29
|
+
* 1. `-c`/`-t`/`exec`/`raw`/`bypass` ran an ARBITRARY command this rule
|
|
30
|
+
* (and every OTHER rule) never inspected — fixed at the source, in
|
|
31
|
+
* `../shell/invocation.ts`'s `walkLeanCtxExec`, not here: see that
|
|
32
|
+
* file's own doc. `shell-invocation-lean-ctx-exec.test.ts` covers it.
|
|
33
|
+
* 2. A wrapper AFTER a valid `LEAN_CTX_CONFIG_DIR=` assignment (`env -u`,
|
|
34
|
+
* `env -i`, `sudo`, …) defeated the `allow` exemption — see
|
|
35
|
+
* `prefixHonorsExemption` below.
|
|
36
|
+
* 3. A redirection before the subcommand (`lean-ctx >/dev/null setup`)
|
|
37
|
+
* bypassed the subcommand scan entirely — see the `withoutRedirections`
|
|
38
|
+
* call in `match()` below.
|
|
39
|
+
* 4. (Closed for free by #1: once `-c`/`-t`/`exec`/`raw`/`bypass`'s
|
|
40
|
+
* argument is parsed as the real inner script, this rule never sees a
|
|
41
|
+
* `{kind:'command', name:'lean-ctx', args:['-c','npm','install']}`
|
|
42
|
+
* shape to misread `install` out of at all.)
|
|
43
|
+
* 5. Several more global/account-state subcommands were unchecked
|
|
44
|
+
* entirely — see `DENY_UNCONDITIONALLY`'s new entries and the
|
|
45
|
+
* `security`/`daemon`/`filter`/`gain`/`cloud` two-level checks below.
|
|
46
|
+
* `config set`/`tools <level>`/`profile set|create`/`compression
|
|
47
|
+
* <level>`/`theme set|import` now join `allow` under the same
|
|
48
|
+
* per-invocation repo-config-dir exemption.
|
|
49
|
+
* 6. The `LEAN_CTX_CONFIG_DIR` path exemption was suffix-only (`ends with
|
|
50
|
+
* .agents/lean-ctx/config/lean-ctx` accepted ANY prefix, including
|
|
51
|
+
* `..`-escaping ones and another repository's absolute path) — see
|
|
52
|
+
* `isRepoScopedConfigDir` below, and `suffixFor`, which derives the
|
|
53
|
+
* suffix from `[hooks] lean_ctx_dir` via `resolveLeanCtxDir`
|
|
54
|
+
* (`../../lean-ctx/env.ts`) instead of a hard-coded constant.
|
|
55
|
+
*
|
|
56
|
+
* Not fixed here (documented, not silently dropped — see
|
|
57
|
+
* `docs/operations/agent-permissions.md` row 19's "Not covered yet"):
|
|
58
|
+
* `echo setup | xargs lean-ctx` (finding 7, LOW — pinned as a known gap,
|
|
59
|
+
* `rules-tool-lean-ctx-global.test.ts`); a handful of `lean-ctx`
|
|
60
|
+
* subcommands that touch a network account or a local proxy but were never
|
|
61
|
+
* named in the review (`proxy start`, `knowledge import`, `cloud pull`) —
|
|
62
|
+
* not guessed at, per "check each name against the real `help all`, don't
|
|
63
|
+
* guess"; a `LEAN_CTX_CONFIG_DIR=` value that is syntactically an
|
|
64
|
+
* assignment only because THIS scanner's `isAssignment` does not
|
|
65
|
+
* distinguish a fully-quoted word (`"NAME=value"`, which real bash does
|
|
66
|
+
* NOT treat as an assignment prefix at all) from a partially-quoted one
|
|
67
|
+
* (`NAME="value"`, which it does) — a narrower, separate tokenizer nuance,
|
|
68
|
+
* not one of the eight findings, outside this pass's scope; and `cd
|
|
69
|
+
* ../other && LEAN_CTX_CONFIG_DIR=$PWD/…`, where `$PWD` is textually
|
|
70
|
+
* accepted but this static scanner cannot know an earlier `cd` in the same
|
|
71
|
+
* chained command already moved it.
|
|
72
|
+
*
|
|
73
|
+
* Subcommand list is `lean-ctx help all`, v3.10.5 (every name below
|
|
74
|
+
* verified against the real binary this session, not guessed):
|
|
75
|
+
* - `wrap`/`unwrap`/`onboard`/`setup`/`install` (incl. `install --repair`)/
|
|
76
|
+
* `bootstrap` — the "setup family": every one of these can (re-)inject a
|
|
77
|
+
* global shell hook, host settings entry, or skill copy.
|
|
78
|
+
* - `init`, in any form (`init`, `init --global`, `init --agent X`,
|
|
79
|
+
* `init --prompt`) — always denied regardless of its own flags.
|
|
80
|
+
* - `doctor --fix`/`--fix=VALUE` only — plain `doctor`/`doctor --json` are
|
|
81
|
+
* read-only and stay allowed (`../../cli/doctor.ts` itself runs
|
|
82
|
+
* `lean-ctx doctor --json`).
|
|
83
|
+
* - `update`/`uninstall`/`dev-install`/`enable-gpu`/`codesign-setup`.
|
|
84
|
+
* - `plugin enable|disable|init` (`plugin list`/other subcommands allowed).
|
|
85
|
+
* - `rules sync|init` (`rules list`/other subcommands allowed).
|
|
86
|
+
* - `yolo` ("Disable containment: any path + any command"), `secure`
|
|
87
|
+
* ("Restore secure defaults" — still a global security-posture toggle,
|
|
88
|
+
* either direction, denied unconditionally), `security secrets <on|off>`
|
|
89
|
+
* (a WRITE; bare `security`/`security status`, a READ, stays allowed),
|
|
90
|
+
* `daemon enable|disable` (auto-start on login; `daemon
|
|
91
|
+
* start|stop|restart|status` — process control, not global CONFIG state
|
|
92
|
+
* — stays allowed), `filter init` (`filter list|validate` stay allowed),
|
|
93
|
+
* `gain --reset`/`gain --publish` (every other `gain` flag is a local
|
|
94
|
+
* read), `login <email>`, `register <email>`, `sync` (bare — "Sync
|
|
95
|
+
* stats, plus your context when your plan includes synchronization"),
|
|
96
|
+
* `cloud autosync <on|off>` (`cloud autosync status`/`cloud
|
|
97
|
+
* status`/`cloud pull` stay allowed — see "Not fixed here" above for why
|
|
98
|
+
* `pull` specifically is out of scope), `contribute` ("Share anonymized
|
|
99
|
+
* compression data").
|
|
100
|
+
* - `allow <cmd>`, `config set …`, `tools <level>` (`tools show`/`tools
|
|
101
|
+
* list` stay allowed), `profile set|create …` (`profile
|
|
102
|
+
* list|show|diff|suggest` stay allowed), `compression <level>`, `theme
|
|
103
|
+
* set|import …` (`theme list|export` stay allowed) — ALL of these join
|
|
104
|
+
* ONE shared exemption: allowed UNLESS THIS SPECIFIC invocation carries
|
|
105
|
+
* its own inline `LEAN_CTX_CONFIG_DIR=` assignment resolving to the
|
|
106
|
+
* repo-scoped config directory — see `exemptionKind` below. The
|
|
107
|
+
* exemption is per-invocation, not per-command-line:
|
|
108
|
+
* `LEAN_CTX_CONFIG_DIR=… lean-ctx allow a && lean-ctx allow b` denies
|
|
109
|
+
* the SECOND call (it has no assignment of its own); a wrapper after
|
|
110
|
+
* the assignment (finding 2) or a path outside the repo (finding 6)
|
|
111
|
+
* voids it too.
|
|
112
|
+
*
|
|
113
|
+
* Read-only shapes are deliberately NOT matched at all (no branch below
|
|
114
|
+
* reaches them, so they fall through to allow, same as tool.azure-devops'
|
|
115
|
+
* `az account show`): `read`, `grep`, `find`, `ls`, `doctor`/`doctor
|
|
116
|
+
* --json`, `status`, `config` (bare, show), `--version`, `help`, `gain`
|
|
117
|
+
* (bare or with a read-only flag), `hook …` (the hook runner itself).
|
|
118
|
+
* `-c`/`-t`/`exec`/`raw`/`bypass` are NOT this rule's to judge AT ALL any
|
|
119
|
+
* more (finding 1) — their argument is parsed as the real inner command
|
|
120
|
+
* one level deeper, in `../shell/invocation.ts`, before this rule ever
|
|
121
|
+
* sees an Invocation for them.
|
|
122
|
+
*
|
|
123
|
+
* Invocation forms: `lean-ctx`, `/usr/local/bin/lean-ctx`, any path ending
|
|
124
|
+
* in `/lean-ctx` (e.g. `.agents/bin/lean-ctx`) all classify to the same
|
|
125
|
+
* `{kind:'command', name:'lean-ctx', ...}` for free — `shell/invocation.ts`'s
|
|
126
|
+
* `classify()` names a command by `basename()` (`../shell/token.ts`), which
|
|
127
|
+
* already strips any directory prefix and lowercases. `&&`/`;`/pipes,
|
|
128
|
+
* `env`/`sudo`/`command`/`exec` wrappers, and nested `bash -c`/`sh -c` are
|
|
129
|
+
* likewise already handled by the shared scanner (`shell/prefixes.ts`'s
|
|
130
|
+
* `skipPrefixes`, and `shell/invocation.ts`'s own recursive `parseScript`)
|
|
131
|
+
* before this rule ever sees an Invocation — nothing here re-parses any of
|
|
132
|
+
* that.
|
|
133
|
+
*
|
|
134
|
+
* `Invocation`'s `'command'` kind carries `prefix`: the exact tokens
|
|
135
|
+
* `skipPrefixes` consumed ahead of `lean-ctx` for THIS occurrence — a
|
|
136
|
+
* leading `NAME=value` assignment, a wrapper command and its own flags, or
|
|
137
|
+
* both. `&&`/`;` split into separate top-level pieces (each walked, and so
|
|
138
|
+
* each classified, on its own — `shell/invocation.ts`'s `parse()`), and a
|
|
139
|
+
* nested `bash -c '…'` script is walked the same way one level deeper
|
|
140
|
+
* (`parseScript`), so `prefix` is always scoped to the ONE `lean-ctx`
|
|
141
|
+
* occurrence this `Invocation` represents, never leaked from a sibling
|
|
142
|
+
* occurrence earlier or later on the same command line.
|
|
143
|
+
*/
|
|
144
|
+
|
|
145
|
+
import type { Invocation } from '../shell/invocation.ts'
|
|
146
|
+
import { withoutRedirections } from '../shell/git-internals.ts'
|
|
147
|
+
import type { Token } from '../shell/token.ts'
|
|
148
|
+
import { isAssignment, tokenValue } from '../shell/token.ts'
|
|
149
|
+
import type { Finding, MessageContext, RuleContext, RuleSpec } from '../spec.ts'
|
|
150
|
+
import { noParams } from '../spec.ts'
|
|
151
|
+
import { detailString } from './messages.ts'
|
|
152
|
+
import { DEFAULT_LEAN_CTX_DIR, resolveLeanCtxDir } from '../../lean-ctx/env.ts'
|
|
153
|
+
|
|
154
|
+
const LEAN_CTX_NAMES: ReadonlySet<string> = new Set(['lean-ctx', 'lean-ctx.exe'])
|
|
155
|
+
|
|
156
|
+
/** Subcommands denied outright, regardless of any flag they carry — `install --repair` is still just `install`. */
|
|
157
|
+
const DENY_UNCONDITIONALLY: ReadonlySet<string> = new Set([
|
|
158
|
+
'wrap',
|
|
159
|
+
'unwrap',
|
|
160
|
+
'onboard',
|
|
161
|
+
'setup',
|
|
162
|
+
'install',
|
|
163
|
+
'bootstrap',
|
|
164
|
+
'init',
|
|
165
|
+
'update',
|
|
166
|
+
'uninstall',
|
|
167
|
+
'dev-install',
|
|
168
|
+
'enable-gpu',
|
|
169
|
+
'codesign-setup',
|
|
170
|
+
// Finding 5 — every name below verified against the real `lean-ctx help
|
|
171
|
+
// all` (v3.10.5) this session.
|
|
172
|
+
'yolo',
|
|
173
|
+
'secure',
|
|
174
|
+
'login',
|
|
175
|
+
'register',
|
|
176
|
+
'sync',
|
|
177
|
+
'contribute',
|
|
178
|
+
])
|
|
179
|
+
|
|
180
|
+
/** The subset of `DENY_UNCONDITIONALLY` that specifically (re-)injects a global hook/shell-hook/skill — gets its own message. */
|
|
181
|
+
const SETUP_FAMILY: ReadonlySet<string> = new Set(['wrap', 'unwrap', 'onboard', 'setup', 'install', 'bootstrap'])
|
|
182
|
+
|
|
183
|
+
const PLUGIN_DENY_SUBCOMMANDS: ReadonlySet<string> = new Set(['enable', 'disable', 'init'])
|
|
184
|
+
const RULES_DENY_SUBCOMMANDS: ReadonlySet<string> = new Set(['sync', 'init'])
|
|
185
|
+
/** `daemon enable|disable` (auto-start on login) — `start|stop|restart|status` is process control, not this rule's concern. */
|
|
186
|
+
const DAEMON_DENY_SUBCOMMANDS: ReadonlySet<string> = new Set(['enable', 'disable'])
|
|
187
|
+
/** `tools [minimal|standard|power|show|list]` — `show`/`list` are reads; any other value sets the level. */
|
|
188
|
+
const TOOLS_READ_SUBCOMMANDS: ReadonlySet<string> = new Set(['show', 'list'])
|
|
189
|
+
/** `profile [list|show|diff|create|set|suggest]` — only `create`/`set` write. */
|
|
190
|
+
const PROFILE_WRITE_SUBCOMMANDS: ReadonlySet<string> = new Set(['create', 'set'])
|
|
191
|
+
/** `theme [list|set|export|import]` — only `set`/`import` write. */
|
|
192
|
+
const THEME_WRITE_SUBCOMMANDS: ReadonlySet<string> = new Set(['set', 'import'])
|
|
193
|
+
|
|
194
|
+
interface Positional {
|
|
195
|
+
readonly value: string
|
|
196
|
+
readonly index: number
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/**
|
|
200
|
+
* The first non-flag word in `args` from `from` onward, lower-cased. Every
|
|
201
|
+
* flag-shaped word is skipped on its own (coarse — lean-ctx has no
|
|
202
|
+
* value-taking global left for this scan to special-case: `-c`/`-t` are no
|
|
203
|
+
* longer reachable here at all, see the module doc's finding 1/4).
|
|
204
|
+
*/
|
|
205
|
+
function firstPositional(args: readonly Token[], from = 0): Positional | null {
|
|
206
|
+
let index = from
|
|
207
|
+
while (index < args.length) {
|
|
208
|
+
const value = tokenValue(args[index] as Token)
|
|
209
|
+
if (value.startsWith('-')) {
|
|
210
|
+
index += 1
|
|
211
|
+
continue
|
|
212
|
+
}
|
|
213
|
+
return { value: value.toLowerCase(), index }
|
|
214
|
+
}
|
|
215
|
+
return null
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
/**
|
|
219
|
+
* The value of the LAST `LEAN_CTX_CONFIG_DIR=` assignment among `prefix`
|
|
220
|
+
* (this invocation's own leading-assignment/wrapper tokens — see the module
|
|
221
|
+
* doc), or null when none is present. "Last wins" mirrors real shell
|
|
222
|
+
* semantics for repeated `NAME=value NAME=value cmd` assignments and for
|
|
223
|
+
* `env`'s own left-to-right operand processing.
|
|
224
|
+
*/
|
|
225
|
+
function leanCtxConfigDirValue(prefix: readonly Token[] | undefined): string | null {
|
|
226
|
+
if (prefix === undefined) return null
|
|
227
|
+
let value: string | null = null
|
|
228
|
+
for (const token of prefix) {
|
|
229
|
+
const text = tokenValue(token)
|
|
230
|
+
if (text.startsWith('LEAN_CTX_CONFIG_DIR=')) value = text.slice('LEAN_CTX_CONFIG_DIR='.length)
|
|
231
|
+
}
|
|
232
|
+
return value
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
/**
|
|
236
|
+
* Finding 2 (HIGH): "Honour the assignment only when every prefix token is
|
|
237
|
+
* an assignment, or a literal `env` followed only by assignments. Any
|
|
238
|
+
* other wrapper, or any env flag, voids the exemption." (coordinator, this
|
|
239
|
+
* session.)
|
|
240
|
+
*
|
|
241
|
+
* Implemented as: strip every assignment-shaped token from `prefix`
|
|
242
|
+
* (reusing `../shell/token.ts`'s own `isAssignment` — no second regex);
|
|
243
|
+
* what remains must be EMPTY (every token was an assignment) or exactly
|
|
244
|
+
* `['env']` (one literal wrapper name, nothing else — no flag, no other
|
|
245
|
+
* wrapper). Position-independent by design: `A=1 LEAN_CTX_CONFIG_DIR=…
|
|
246
|
+
* env B=2 lean-ctx …` honours the exemption exactly like `env
|
|
247
|
+
* LEAN_CTX_CONFIG_DIR=… lean-ctx …` does — `env`'s POSITION among a run of
|
|
248
|
+
* assignments does not matter, only that nothing ELSE is present.
|
|
249
|
+
*/
|
|
250
|
+
function prefixHonorsExemption(prefix: readonly Token[] | undefined): boolean {
|
|
251
|
+
if (prefix === undefined || prefix.length === 0) return false
|
|
252
|
+
const nonAssignments = prefix.filter((token) => !isAssignment(token)).map(tokenValue)
|
|
253
|
+
if (nonAssignments.length === 0) return true
|
|
254
|
+
return nonAssignments.length === 1 && nonAssignments[0] === 'env'
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
/**
|
|
258
|
+
* Finding 6 (MEDIUM): the suffix every accepted `LEAN_CTX_CONFIG_DIR` value
|
|
259
|
+
* must resolve to — DERIVED from `[hooks] lean_ctx_dir`
|
|
260
|
+
* (`resolveLeanCtxDir`, `../../lean-ctx/env.ts`) when a real repository
|
|
261
|
+
* root is known, never a hard-coded constant; falls back to
|
|
262
|
+
* `DEFAULT_LEAN_CTX_DIR` (no filesystem touched) only when `root` is empty
|
|
263
|
+
* or absent — a non-host caller (operator CLI, a test with no root) still
|
|
264
|
+
* gets a sensible, deterministic suffix rather than reading whatever
|
|
265
|
+
* `adl-config.toml` happens to sit under the current process's cwd.
|
|
266
|
+
*/
|
|
267
|
+
function suffixFor(root: string | undefined): string {
|
|
268
|
+
const dir = root !== undefined && root.length > 0 ? resolveLeanCtxDir(root) : DEFAULT_LEAN_CTX_DIR
|
|
269
|
+
return `${dir}/config/lean-ctx`
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
/**
|
|
273
|
+
* Finding 6 (MEDIUM): "Accept only: the bare suffix, `./<suffix>`,
|
|
274
|
+
* `$PWD/<suffix>`, `${PWD}/<suffix>`, or an absolute path equal to `<repo
|
|
275
|
+
* root>/<suffix>`. Take the repo root from the hook ctx." Plus: "Reject any
|
|
276
|
+
* `..` segment" — checked FIRST, unconditionally, so a value that only
|
|
277
|
+
* LOOKS like it ends in the suffix after a `..`-escape (`$HOME/.config/
|
|
278
|
+
* lean-ctx/../../.agents/lean-ctx/config/lean-ctx`) never reaches the
|
|
279
|
+
* per-form comparisons below at all.
|
|
280
|
+
*/
|
|
281
|
+
function isRepoScopedConfigDir(value: string, suffix: string, root: string | undefined): boolean {
|
|
282
|
+
if (value.split(/[\\/]/).some((segment) => segment === '..')) return false
|
|
283
|
+
const normalized = value.replace(/\/+$/, '')
|
|
284
|
+
if (normalized === suffix) return true
|
|
285
|
+
if (normalized === `./${suffix}`) return true
|
|
286
|
+
if (normalized === `$PWD/${suffix}`) return true
|
|
287
|
+
if (normalized === `\${PWD}/${suffix}`) return true
|
|
288
|
+
if (root !== undefined && root.length > 0) {
|
|
289
|
+
const repoPath = `${root.replace(/\/+$/, '')}/${suffix}`
|
|
290
|
+
if (normalized === repoPath) return true
|
|
291
|
+
}
|
|
292
|
+
return false
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
type ExemptionOutcome = 'exempt' | 'no-config-dir' | 'wrapper-voids' | 'wrong-config-dir'
|
|
296
|
+
|
|
297
|
+
/**
|
|
298
|
+
* Precedence: whether ANY `LEAN_CTX_CONFIG_DIR=` is present at all
|
|
299
|
+
* (finding-2-agnostic — a bare wrapper with no assignment anywhere is
|
|
300
|
+
* simply "no-config-dir", not "a wrapper voided it"), THEN whether the
|
|
301
|
+
* prefix shape honours it (finding 2), THEN whether the value itself names
|
|
302
|
+
* the repo-scoped directory (finding 6).
|
|
303
|
+
*/
|
|
304
|
+
function exemptionKind(prefix: readonly Token[] | undefined, root: string | undefined): ExemptionOutcome {
|
|
305
|
+
const value = leanCtxConfigDirValue(prefix)
|
|
306
|
+
if (value === null) return 'no-config-dir'
|
|
307
|
+
if (!prefixHonorsExemption(prefix)) return 'wrapper-voids'
|
|
308
|
+
return isRepoScopedConfigDir(value, suffixFor(root), root) ? 'exempt' : 'wrong-config-dir'
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
type DenyKind = 'setup-family' | 'global-state' | 'allow-no-config-dir' | 'allow-wrapper-voids' | 'allow-wrong-config-dir'
|
|
312
|
+
|
|
313
|
+
function findingFor(subcommand: string, kind: DenyKind, extra: Readonly<Record<string, string>> = {}): Finding {
|
|
314
|
+
return { ruleId: 'tool.lean-ctx-global-state', severity: 'deny', detail: { subcommand, kind, ...extra } }
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
/**
|
|
318
|
+
* The shared per-invocation repo-config-dir exemption — `allow`, `config
|
|
319
|
+
* set`, `tools <level>`, `profile set|create`, `compression <level>`,
|
|
320
|
+
* `theme set|import` all funnel through this one function (finding 5's
|
|
321
|
+
* "same exemption as allow"). `label` is the exact matched subcommand text
|
|
322
|
+
* shown in the message (`allow`, `config set`, `tools power`, …).
|
|
323
|
+
*/
|
|
324
|
+
function exemptableFinding(label: string, prefix: readonly Token[] | undefined, root: string | undefined): Finding | null {
|
|
325
|
+
const outcome = exemptionKind(prefix, root)
|
|
326
|
+
if (outcome === 'exempt') return null
|
|
327
|
+
const kind: DenyKind = outcome === 'no-config-dir' ? 'allow-no-config-dir' : outcome === 'wrapper-voids' ? 'allow-wrapper-voids' : 'allow-wrong-config-dir'
|
|
328
|
+
return findingFor(label, kind, { suffix: suffixFor(root) })
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
export const toolLeanCtxGlobalState: RuleSpec = {
|
|
332
|
+
id: 'tool.lean-ctx-global-state',
|
|
333
|
+
category: 'tool',
|
|
334
|
+
severity: 'deny',
|
|
335
|
+
enabledByDefault: true,
|
|
336
|
+
summary:
|
|
337
|
+
'Deny a lean-ctx subcommand that writes global/user state — the setup family, init, doctor --fix, update/uninstall/dev-install/enable-gpu/codesign-setup, plugin enable|disable|init, rules sync|init, yolo/secure/security secrets/daemon enable|disable/filter init/gain --reset|--publish/login/register/sync/cloud autosync/contribute, and allow/config set/tools/profile set|create/compression/theme set|import without a valid per-invocation LEAN_CTX_CONFIG_DIR= — lean-ctx is repo-local only.',
|
|
338
|
+
params: noParams,
|
|
339
|
+
match(inv: Invocation, ctx: RuleContext<Record<string, never>>): Finding | null {
|
|
340
|
+
if (inv.kind !== 'command' || !LEAN_CTX_NAMES.has(inv.name)) return null
|
|
341
|
+
// Finding 3 (MEDIUM): a redirection between `lean-ctx` and its first
|
|
342
|
+
// real argument must not hide the subcommand from either scan below.
|
|
343
|
+
const args = withoutRedirections(inv.args)
|
|
344
|
+
const sub = firstPositional(args)
|
|
345
|
+
if (sub === null) return null
|
|
346
|
+
|
|
347
|
+
if (DENY_UNCONDITIONALLY.has(sub.value)) {
|
|
348
|
+
return findingFor(sub.value, SETUP_FAMILY.has(sub.value) ? 'setup-family' : 'global-state')
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
if (sub.value === 'doctor') {
|
|
352
|
+
// Finding 8 (LOW): `--fix=true` must match too, not only the exact `--fix` token.
|
|
353
|
+
const hasFix = args.some((token) => tokenValue(token).startsWith('--fix'))
|
|
354
|
+
return hasFix ? findingFor('doctor --fix', 'global-state') : null
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
if (sub.value === 'plugin' || sub.value === 'rules') {
|
|
358
|
+
const second = firstPositional(args, sub.index + 1)
|
|
359
|
+
if (second === null) return null
|
|
360
|
+
const denySet = sub.value === 'plugin' ? PLUGIN_DENY_SUBCOMMANDS : RULES_DENY_SUBCOMMANDS
|
|
361
|
+
return denySet.has(second.value) ? findingFor(`${sub.value} ${second.value}`, 'global-state') : null
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
// Finding 5: `security secrets <on|off>` is a WRITE; bare `security`/`security status` is a READ.
|
|
365
|
+
if (sub.value === 'security') {
|
|
366
|
+
const second = firstPositional(args, sub.index + 1)
|
|
367
|
+
return second !== null && second.value === 'secrets' ? findingFor('security secrets', 'global-state') : null
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
// Finding 5: `daemon enable|disable` only — start/stop/restart/status is process control, not config state.
|
|
371
|
+
if (sub.value === 'daemon') {
|
|
372
|
+
const second = firstPositional(args, sub.index + 1)
|
|
373
|
+
return second !== null && DAEMON_DENY_SUBCOMMANDS.has(second.value) ? findingFor(`daemon ${second.value}`, 'global-state') : null
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
// Finding 5: `filter init` only — `filter list|validate` are reads.
|
|
377
|
+
if (sub.value === 'filter') {
|
|
378
|
+
const second = firstPositional(args, sub.index + 1)
|
|
379
|
+
return second !== null && second.value === 'init' ? findingFor('filter init', 'global-state') : null
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
// Finding 5: `gain --reset`/`gain --publish` only — every other gain flag is a local read.
|
|
383
|
+
if (sub.value === 'gain') {
|
|
384
|
+
const hit = args.some((token) => {
|
|
385
|
+
const value = tokenValue(token)
|
|
386
|
+
return value === '--reset' || value === '--publish' || value.startsWith('--publish=')
|
|
387
|
+
})
|
|
388
|
+
return hit ? findingFor('gain --reset/--publish', 'global-state') : null
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
// Finding 5: `cloud autosync <on|off>` only — `cloud autosync status`/`cloud status`/`cloud pull` are out of scope (see module doc).
|
|
392
|
+
if (sub.value === 'cloud') {
|
|
393
|
+
const second = firstPositional(args, sub.index + 1)
|
|
394
|
+
if (second === null || second.value !== 'autosync') return null
|
|
395
|
+
const third = firstPositional(args, second.index + 1)
|
|
396
|
+
return third !== null && third.value !== 'status' ? findingFor('cloud autosync', 'global-state') : null
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
// Finding 5: the shared per-invocation repo-config-dir exemption group.
|
|
400
|
+
if (sub.value === 'allow') return exemptableFinding('allow', inv.prefix, ctx.root)
|
|
401
|
+
|
|
402
|
+
if (sub.value === 'config') {
|
|
403
|
+
const second = firstPositional(args, sub.index + 1)
|
|
404
|
+
return second !== null && second.value === 'set' ? exemptableFinding('config set', inv.prefix, ctx.root) : null
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
if (sub.value === 'tools') {
|
|
408
|
+
const second = firstPositional(args, sub.index + 1)
|
|
409
|
+
return second !== null && !TOOLS_READ_SUBCOMMANDS.has(second.value) ? exemptableFinding(`tools ${second.value}`, inv.prefix, ctx.root) : null
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
if (sub.value === 'profile') {
|
|
413
|
+
const second = firstPositional(args, sub.index + 1)
|
|
414
|
+
return second !== null && PROFILE_WRITE_SUBCOMMANDS.has(second.value) ? exemptableFinding(`profile ${second.value}`, inv.prefix, ctx.root) : null
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
if (sub.value === 'compression') {
|
|
418
|
+
const second = firstPositional(args, sub.index + 1)
|
|
419
|
+
return second !== null ? exemptableFinding(`compression ${second.value}`, inv.prefix, ctx.root) : null
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
if (sub.value === 'theme') {
|
|
423
|
+
const second = firstPositional(args, sub.index + 1)
|
|
424
|
+
return second !== null && THEME_WRITE_SUBCOMMANDS.has(second.value) ? exemptableFinding(`theme ${second.value}`, inv.prefix, ctx.root) : null
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
return null
|
|
428
|
+
},
|
|
429
|
+
message(finding: Finding, ctx: MessageContext) {
|
|
430
|
+
const subcommand = detailString(finding, 'subcommand')
|
|
431
|
+
const kind = detailString(finding, 'kind') as DenyKind
|
|
432
|
+
|
|
433
|
+
if (kind === 'setup-family' || kind === 'global-state') {
|
|
434
|
+
const specific =
|
|
435
|
+
kind === 'setup-family'
|
|
436
|
+
? `\`lean-ctx ${subcommand}\` re-injects global hooks, shell hooks, or skills (~/.bashenv, ~/.claude/settings.json, ~/.claude/skills and the other hosts' skill directories) — that is Tarun's call only.`
|
|
437
|
+
: `\`lean-ctx ${subcommand}\` writes global/user lean-ctx state.`
|
|
438
|
+
return {
|
|
439
|
+
user: `Blocked \`lean-ctx ${subcommand}\`: global lean-ctx state is forbidden - lean-ctx is repo-local. ${specific}`,
|
|
440
|
+
agent:
|
|
441
|
+
`DENIED \`lean-ctx ${subcommand}\`. lean-ctx config is per-repository only ` +
|
|
442
|
+
'(reached via `LEAN_CTX_CONFIG_DIR` - see `packages/agent-hooks/src/lean-ctx/env.ts`); no lean-ctx ' +
|
|
443
|
+
`hook, shell hook, skill, or MCP entry may live at user/global level. ${specific} If a legitimate ` +
|
|
444
|
+
`global change is needed, ask the user to run it themselves. Blocked call: ${ctx.snippet}`,
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
// The three exemption-group kinds — all share the same repo-scoped remedy.
|
|
449
|
+
const suffix = detailString(finding, 'suffix')
|
|
450
|
+
const remedyTail = subcommand === 'allow' ? ' <cmd>' : ''
|
|
451
|
+
const remedyForm = `LEAN_CTX_CONFIG_DIR="$PWD/${suffix}" lean-ctx ${subcommand}${remedyTail}`
|
|
452
|
+
const specific =
|
|
453
|
+
kind === 'allow-no-config-dir'
|
|
454
|
+
? `\`lean-ctx ${subcommand}\` with no inline \`LEAN_CTX_CONFIG_DIR=\` on THIS call writes GLOBAL/user lean-ctx state, not the repo config that is actually enforced.`
|
|
455
|
+
: kind === 'allow-wrapper-voids'
|
|
456
|
+
? `\`LEAN_CTX_CONFIG_DIR\` is set earlier on the command line, but a wrapper after it (an \`env\` flag, \`sudo\`, or anything other than a literal \`env\` followed only by assignments) voids the exemption for THIS call.`
|
|
457
|
+
: `\`LEAN_CTX_CONFIG_DIR\` is set on THIS call, but does not resolve to the repo-scoped config directory (\`${suffix}\`) — that still writes state outside the repo config this estate enforces.`
|
|
458
|
+
const remedy =
|
|
459
|
+
` Run it as \`${remedyForm}\` instead — that writes only the repo config. Every \`lean-ctx ${subcommand}\` ` +
|
|
460
|
+
`call needs its OWN inline assignment; one earlier in a chained command does not cover a later call.`
|
|
461
|
+
return {
|
|
462
|
+
user: `Blocked \`lean-ctx ${subcommand}\`: global lean-ctx state is forbidden - lean-ctx is repo-local. ${specific}${remedy}`,
|
|
463
|
+
agent:
|
|
464
|
+
`DENIED \`lean-ctx ${subcommand}\`. lean-ctx config is per-repository only ` +
|
|
465
|
+
'(reached via `LEAN_CTX_CONFIG_DIR` - see `packages/agent-hooks/src/lean-ctx/env.ts`); no lean-ctx ' +
|
|
466
|
+
`hook, shell hook, skill, or MCP entry may live at user/global level. ${specific}${remedy} If a ` +
|
|
467
|
+
`legitimate global change is needed, ask the user to run it themselves. Blocked call: ${ctx.snippet}`,
|
|
468
|
+
}
|
|
469
|
+
},
|
|
470
|
+
corpus: {
|
|
471
|
+
deny: [
|
|
472
|
+
'lean-ctx wrap',
|
|
473
|
+
'lean-ctx unwrap',
|
|
474
|
+
'lean-ctx onboard',
|
|
475
|
+
'lean-ctx setup',
|
|
476
|
+
'lean-ctx install',
|
|
477
|
+
'lean-ctx install --repair',
|
|
478
|
+
'lean-ctx bootstrap',
|
|
479
|
+
'lean-ctx init',
|
|
480
|
+
'lean-ctx init --global',
|
|
481
|
+
'lean-ctx init --agent codex',
|
|
482
|
+
'lean-ctx init --prompt',
|
|
483
|
+
'lean-ctx doctor --fix',
|
|
484
|
+
'lean-ctx doctor --fix=true',
|
|
485
|
+
'lean-ctx update',
|
|
486
|
+
'lean-ctx uninstall',
|
|
487
|
+
'lean-ctx dev-install',
|
|
488
|
+
'lean-ctx enable-gpu',
|
|
489
|
+
'lean-ctx codesign-setup',
|
|
490
|
+
'lean-ctx plugin enable foo',
|
|
491
|
+
'lean-ctx plugin disable foo',
|
|
492
|
+
'lean-ctx plugin init',
|
|
493
|
+
'lean-ctx rules sync',
|
|
494
|
+
'lean-ctx rules init',
|
|
495
|
+
'lean-ctx allow "git status"',
|
|
496
|
+
'/usr/local/bin/lean-ctx setup',
|
|
497
|
+
'.agents/bin/lean-ctx setup',
|
|
498
|
+
'sudo lean-ctx setup',
|
|
499
|
+
"bash -c 'lean-ctx setup'",
|
|
500
|
+
'echo hi && lean-ctx allow "git status"',
|
|
501
|
+
'timeout 30 lean-ctx allow "git status"',
|
|
502
|
+
// Per-invocation exemption gap: the assignment on the FIRST `allow`
|
|
503
|
+
// call does not cover a SECOND one later in the same command line.
|
|
504
|
+
'LEAN_CTX_CONFIG_DIR="$PWD/.agents/lean-ctx/config/lean-ctx" lean-ctx allow a && lean-ctx allow b',
|
|
505
|
+
'env LEAN_CTX_CONFIG_DIR="$PWD/.agents/lean-ctx/config/lean-ctx" lean-ctx allow a; lean-ctx allow b',
|
|
506
|
+
'lean-ctx allow a; LEAN_CTX_CONFIG_DIR="$PWD/.agents/lean-ctx/config/lean-ctx" lean-ctx allow b',
|
|
507
|
+
"bash -c 'LEAN_CTX_CONFIG_DIR=\"$PWD/.agents/lean-ctx/config/lean-ctx\" lean-ctx allow a; lean-ctx allow b'",
|
|
508
|
+
// A `LEAN_CTX_CONFIG_DIR` that IS set on this exact call but does not
|
|
509
|
+
// end in the repo-scoped suffix still writes global/user state.
|
|
510
|
+
'LEAN_CTX_CONFIG_DIR=~/.config/lean-ctx lean-ctx allow "git status"',
|
|
511
|
+
'LEAN_CTX_CONFIG_DIR=/tmp/lean-ctx lean-ctx allow "git status"',
|
|
512
|
+
// Finding 2: a wrapper AFTER the assignment defeats it.
|
|
513
|
+
'LEAN_CTX_CONFIG_DIR=$PWD/.agents/lean-ctx/config/lean-ctx env -u LEAN_CTX_CONFIG_DIR lean-ctx allow x',
|
|
514
|
+
'LEAN_CTX_CONFIG_DIR=$PWD/.agents/lean-ctx/config/lean-ctx env -i lean-ctx allow x',
|
|
515
|
+
'LEAN_CTX_CONFIG_DIR=$PWD/.agents/lean-ctx/config/lean-ctx sudo lean-ctx allow x',
|
|
516
|
+
// Finding 3: a redirection before the subcommand.
|
|
517
|
+
'lean-ctx >/dev/null setup',
|
|
518
|
+
'lean-ctx 2>/dev/null allow x',
|
|
519
|
+
'lean-ctx 2>&1 setup',
|
|
520
|
+
// Finding 5: the new denylist.
|
|
521
|
+
'lean-ctx yolo',
|
|
522
|
+
'lean-ctx secure',
|
|
523
|
+
'lean-ctx security secrets off',
|
|
524
|
+
'lean-ctx daemon enable',
|
|
525
|
+
'lean-ctx filter init',
|
|
526
|
+
'lean-ctx gain --reset',
|
|
527
|
+
'lean-ctx gain --publish',
|
|
528
|
+
'lean-ctx login a@b.c',
|
|
529
|
+
'lean-ctx register a@b.c',
|
|
530
|
+
'lean-ctx sync',
|
|
531
|
+
'lean-ctx cloud autosync on',
|
|
532
|
+
'lean-ctx contribute',
|
|
533
|
+
'lean-ctx config set shell_hook true',
|
|
534
|
+
'lean-ctx tools power',
|
|
535
|
+
'lean-ctx profile set x',
|
|
536
|
+
'lean-ctx compression off',
|
|
537
|
+
'lean-ctx theme set x',
|
|
538
|
+
// Finding 6: path restrictions.
|
|
539
|
+
'LEAN_CTX_CONFIG_DIR=$HOME/.agents/lean-ctx/config/lean-ctx lean-ctx allow x',
|
|
540
|
+
'LEAN_CTX_CONFIG_DIR=~/.agents/lean-ctx/config/lean-ctx lean-ctx allow x',
|
|
541
|
+
'LEAN_CTX_CONFIG_DIR=/Users/x/Repos/other/.agents/lean-ctx/config/lean-ctx lean-ctx allow x',
|
|
542
|
+
'LEAN_CTX_CONFIG_DIR=$HOME/.config/lean-ctx/../../.agents/lean-ctx/config/lean-ctx lean-ctx allow x',
|
|
543
|
+
],
|
|
544
|
+
allow: [
|
|
545
|
+
'lean-ctx -c "$BASH_EXECUTION_STRING"',
|
|
546
|
+
'lean-ctx raw README.md',
|
|
547
|
+
'lean-ctx read README.md',
|
|
548
|
+
'lean-ctx grep pattern',
|
|
549
|
+
'lean-ctx doctor',
|
|
550
|
+
'lean-ctx doctor --json',
|
|
551
|
+
'lean-ctx status',
|
|
552
|
+
'lean-ctx config',
|
|
553
|
+
'lean-ctx --version',
|
|
554
|
+
'lean-ctx help',
|
|
555
|
+
'lean-ctx help all',
|
|
556
|
+
'lean-ctx gain',
|
|
557
|
+
'lean-ctx hook observe',
|
|
558
|
+
'lean-ctx plugin list',
|
|
559
|
+
'lean-ctx rules list',
|
|
560
|
+
'LEAN_CTX_CONFIG_DIR="$PWD/.agents/lean-ctx/config/lean-ctx" lean-ctx allow "git status"',
|
|
561
|
+
// `env NAME=value` wrapper form is exempted the same as a bare leading assignment.
|
|
562
|
+
'env LEAN_CTX_CONFIG_DIR="$PWD/.agents/lean-ctx/config/lean-ctx" lean-ctx allow "git status"',
|
|
563
|
+
// Chained/nested forms are allowed when EVERY occurrence carries its own valid assignment.
|
|
564
|
+
'LEAN_CTX_CONFIG_DIR="$PWD/.agents/lean-ctx/config/lean-ctx" lean-ctx allow a && LEAN_CTX_CONFIG_DIR="$PWD/.agents/lean-ctx/config/lean-ctx" lean-ctx allow b',
|
|
565
|
+
"bash -c 'LEAN_CTX_CONFIG_DIR=\"$PWD/.agents/lean-ctx/config/lean-ctx\" lean-ctx allow x'",
|
|
566
|
+
// Finding 5: reads stay allowed.
|
|
567
|
+
'lean-ctx security',
|
|
568
|
+
'lean-ctx security status',
|
|
569
|
+
'lean-ctx filter list',
|
|
570
|
+
'lean-ctx filter validate',
|
|
571
|
+
'lean-ctx daemon status',
|
|
572
|
+
'lean-ctx daemon start',
|
|
573
|
+
'lean-ctx cloud status',
|
|
574
|
+
'lean-ctx cloud autosync status',
|
|
575
|
+
'lean-ctx tools show',
|
|
576
|
+
'lean-ctx tools list',
|
|
577
|
+
'lean-ctx profile list',
|
|
578
|
+
'lean-ctx profile show',
|
|
579
|
+
'lean-ctx theme list',
|
|
580
|
+
'lean-ctx theme export',
|
|
581
|
+
// Finding 5: the exemption group WITH a valid assignment.
|
|
582
|
+
'LEAN_CTX_CONFIG_DIR="$PWD/.agents/lean-ctx/config/lean-ctx" lean-ctx config set shell_hook true',
|
|
583
|
+
'LEAN_CTX_CONFIG_DIR="$PWD/.agents/lean-ctx/config/lean-ctx" lean-ctx tools power',
|
|
584
|
+
'LEAN_CTX_CONFIG_DIR="$PWD/.agents/lean-ctx/config/lean-ctx" lean-ctx profile set x',
|
|
585
|
+
'LEAN_CTX_CONFIG_DIR="$PWD/.agents/lean-ctx/config/lean-ctx" lean-ctx compression off',
|
|
586
|
+
'LEAN_CTX_CONFIG_DIR="$PWD/.agents/lean-ctx/config/lean-ctx" lean-ctx theme set x',
|
|
587
|
+
// Finding 6: the accepted path forms.
|
|
588
|
+
'LEAN_CTX_CONFIG_DIR=${PWD}/.agents/lean-ctx/config/lean-ctx lean-ctx allow x',
|
|
589
|
+
'LEAN_CTX_CONFIG_DIR=./.agents/lean-ctx/config/lean-ctx lean-ctx allow x',
|
|
590
|
+
// Finding 7: the known, documented xargs gap (see module doc) — pinned as ALLOW.
|
|
591
|
+
'echo setup | xargs lean-ctx',
|
|
592
|
+
],
|
|
593
|
+
},
|
|
594
|
+
}
|