@amsterdamdatalabs/adl-agent-control-linux-x64 0.1.12 → 0.1.28
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/adl +2 -2
- package/bin/git +16 -17
- package/bin/git-ado +25 -24
- package/bin/git-defaults +173 -0
- package/bin/health-check +8 -1
- package/bin/kimi-hooks +1 -1
- package/bin/lib/adl-package.sh +257 -0
- package/bin/lib/fleet-host.sh +8 -5
- package/bin/reconcile +482 -232
- package/bin/reconcile-host +30 -20
- package/bin/setup +20 -17
- package/bin/shell-path-policy +15 -5
- package/bin/sync-and-reconcile +62 -64
- package/bin/validate-manifest +33 -9
- package/package.json +2 -10
- package/packages/agent-hooks/README.md +14 -9
- package/packages/agent-hooks/assets/hooks.json +0 -20
- package/packages/agent-hooks/src/cli/args.ts +1 -1
- package/packages/agent-hooks/src/cli/doctor.ts +6 -58
- package/packages/agent-hooks/src/deploy/deploy.ts +12 -41
- package/packages/agent-hooks/src/deploy/doctor.ts +8 -11
- package/packages/agent-hooks/src/deploy/index.ts +14 -14
- package/packages/agent-hooks/src/deploy/json-merge.ts +7 -8
- package/packages/agent-hooks/src/deploy/legacy-lock.ts +2 -2
- package/packages/agent-hooks/src/deploy/list.ts +1 -1
- package/packages/agent-hooks/src/deploy/lock.ts +31 -12
- package/packages/agent-hooks/src/deploy/profile.ts +3 -4
- package/packages/agent-hooks/src/deploy/source.ts +1 -1
- package/packages/agent-hooks/src/gating/config.ts +12 -24
- package/packages/agent-hooks/src/gating/root.ts +3 -3
- package/packages/agent-hooks/src/hooks/briefing/handler.ts +2 -2
- package/packages/agent-hooks/src/hooks/briefing/index.ts +27 -287
- package/packages/agent-hooks/src/hooks/contract.ts +17 -17
- package/packages/agent-hooks/src/hooks/crg/background.ts +27 -0
- package/packages/agent-hooks/src/hooks/crg/index.ts +7 -6
- package/packages/agent-hooks/src/hooks/log.ts +8 -10
- package/packages/agent-hooks/src/hooks/user-prompt-submit/match.ts +1 -1
- package/packages/agent-hooks/src/hooks/user-prompt-submit/tokenizer.ts +1 -1
- package/packages/agent-hooks/src/hooks/user-prompt-submit/vector.ts +6 -5
- package/packages/agent-hooks/src/hosts/registry.ts +1 -1
- package/packages/agent-hooks/src/log/adl-dir.ts +44 -0
- package/packages/agent-hooks/src/log/writer.ts +16 -2
- package/packages/agent-hooks/src/main.ts +7 -41
- package/packages/agent-hooks/src/pre-tool-use/handler.ts +71 -82
- package/packages/agent-hooks/src/rules/engine.ts +13 -17
- package/packages/agent-hooks/src/rules/impl/adl-build-run-denied.ts +3 -3
- package/packages/agent-hooks/src/rules/impl/adl-git-credential-bypass.ts +12 -14
- package/packages/agent-hooks/src/rules/impl/adl-git-identity.ts +28 -28
- package/packages/agent-hooks/src/rules/impl/adl-git-push-policy.ts +8 -9
- package/packages/agent-hooks/src/rules/impl/adl-human-azdo-bypass.ts +56 -59
- package/packages/agent-hooks/src/rules/impl/adl-identity.ts +16 -23
- package/packages/agent-hooks/src/rules/impl/adl-mcp-cli.ts +19 -16
- package/packages/agent-hooks/src/rules/impl/adl-pr-complete-pending.ts +2 -2
- package/packages/agent-hooks/src/rules/impl/adl-pr-review-role.ts +9 -12
- package/packages/agent-hooks/src/rules/impl/adl-pr-role.ts +5 -7
- package/packages/agent-hooks/src/rules/impl/adl-run-required.ts +411 -0
- package/packages/agent-hooks/src/rules/impl/adl-token-minting-role.ts +4 -5
- package/packages/agent-hooks/src/rules/impl/adl-workitem-role.ts +6 -7
- package/packages/agent-hooks/src/rules/impl/agent-tamper-protection.ts +77 -70
- package/packages/agent-hooks/src/rules/impl/deny-allowlist.ts +131 -0
- package/packages/agent-hooks/src/rules/impl/git-helpers.ts +21 -23
- package/packages/agent-hooks/src/rules/impl/git-worktree.ts +14 -28
- package/packages/agent-hooks/src/rules/impl/mcp-tool.ts +3 -3
- package/packages/agent-hooks/src/rules/impl/messages.ts +1 -1
- package/packages/agent-hooks/src/rules/impl/pr-completion.ts +1 -1
- package/packages/agent-hooks/src/rules/impl/tool-azure-devops.ts +35 -46
- package/packages/agent-hooks/src/rules/impl/tool-find.ts +34 -7
- package/packages/agent-hooks/src/rules/impl/tool-grep.ts +33 -12
- package/packages/agent-hooks/src/rules/impl/tool-native-search.ts +52 -9
- package/packages/agent-hooks/src/rules/ports.ts +5 -7
- package/packages/agent-hooks/src/rules/registry.ts +4 -6
- package/packages/agent-hooks/src/rules/shell/git-identity.ts +86 -101
- package/packages/agent-hooks/src/rules/shell/git-internals.ts +1 -1
- package/packages/agent-hooks/src/rules/shell/invocation.ts +24 -118
- package/packages/agent-hooks/src/rules/shell/piped-script.ts +1 -1
- package/packages/agent-hooks/src/rules/shell/prefixes.ts +1 -1
- package/packages/agent-hooks/src/rules/shell/protected-carrier-writes.ts +11 -10
- package/packages/agent-hooks/src/rules/shell/protected-carriers.ts +26 -26
- package/packages/agent-hooks/src/rules/shell/substitution.ts +1 -1
- package/packages/agent-hooks/src/rules/shell/xargs.ts +2 -2
- package/packages/agent-hooks/src/rules/spec.ts +2 -2
- package/packages/agent-settings/README.md +287 -0
- package/packages/agent-settings/assets/GLOBAL-AGENTS.md +14 -16
- package/packages/agent-settings/assets/agents/architect.toml +2 -0
- package/packages/agent-settings/assets/agents/code-reviewer.toml +2 -0
- package/packages/agent-settings/assets/agents/executor.toml +2 -0
- package/packages/agent-settings/assets/agents/explore.toml +2 -0
- package/packages/agent-settings/assets/agents/planner.toml +2 -0
- package/packages/agent-settings/assets/mcp.json +0 -4
- package/packages/agent-settings/deploy-profile.json +139 -0
- package/packages/agent-settings/deploy-profile.schema.json +147 -0
- package/packages/agent-settings/managed/README.md +29 -30
- package/packages/agent-settings/managed/codex-requirements.toml +9 -9
- package/packages/agent-settings/package.json +20 -0
- package/packages/agent-settings/src/deploy/agent-render.ts +2 -2
- package/packages/agent-settings/src/deploy/agent-toml.ts +1 -1
- package/packages/agent-settings/src/deploy/agents-deploy.ts +17 -3
- package/packages/agent-settings/src/deploy/doctor.ts +3 -83
- package/packages/agent-settings/src/deploy/index.ts +6 -33
- package/packages/agent-settings/src/deploy/legacy-lock.ts +6 -6
- package/packages/agent-settings/src/deploy/list.ts +5 -19
- package/packages/agent-settings/src/deploy/lock.ts +8 -18
- package/packages/agent-settings/src/deploy/mcp-deploy.ts +10 -5
- package/packages/agent-settings/src/deploy/mcp-merge.ts +22 -3
- package/packages/agent-settings/src/deploy/mcp-source.ts +1 -1
- package/packages/agent-settings/src/deploy/profile.ts +11 -35
- package/packages/agent-settings/src/deploy/retire-lean-ctx.ts +184 -0
- package/packages/agent-settings/src/deploy/settings.ts +17 -22
- package/packages/agent-settings/src/global-surface-sweep.ts +0 -2
- package/packages/agent-settings/src/kimi-hooks.ts +339 -192
- package/packages/agent-settings/src/opencode-hooks.ts +1 -1
- package/packages/agent-settings/tsconfig.json +23 -0
- package/packages/agent-skills/assets/agent-search-tool-audit/SKILL.md +120 -0
- package/packages/agent-skills/assets/agent-search-tool-audit/scripts/audit.sh +276 -0
- package/packages/agent-skills/assets/debug-issue/SKILL.md +8 -7
- package/packages/agent-skills/assets/explore-codebase/SKILL.md +13 -13
- package/packages/agent-skills/assets/refactor-safely/SKILL.md +12 -11
- package/packages/agent-skills/assets/review-changes/SKILL.md +7 -7
- package/packages/agent-skills/assets/testing/references/e2e.md +37 -0
- package/packages/agent-skills/assets/testing/references/integration.md +37 -0
- package/packages/agent-skills/assets/testing/references/unit.md +32 -0
- package/packages/agent-skills/dist/deploy.d.ts +2 -0
- package/packages/agent-skills/dist/deploy.d.ts.map +1 -1
- package/packages/agent-skills/dist/deploy.js +27 -1
- package/packages/agent-skills/dist/deploy.js.map +1 -1
- package/packages/agent-skills/dist/doctor.d.ts +0 -2
- package/packages/agent-skills/dist/doctor.d.ts.map +1 -1
- package/packages/agent-skills/dist/doctor.js +1 -1
- package/packages/agent-skills/dist/doctor.js.map +1 -1
- package/packages/agent-skills/dist/fs-utils.d.ts +0 -1
- package/packages/agent-skills/dist/fs-utils.d.ts.map +1 -1
- package/packages/agent-skills/dist/fs-utils.js +1 -1
- package/packages/agent-skills/dist/fs-utils.js.map +1 -1
- package/packages/agent-skills/src/deploy.ts +29 -1
- package/packages/agent-skills/src/doctor.ts +1 -1
- package/packages/agent-skills/src/fs-utils.ts +1 -1
- package/packages/azdo/README.md +10 -9
- package/packages/azdo/package.json +1 -3
- package/packages/azdo/scripts/probe-ado-rules.ts +311 -0
- package/packages/azdo/src/azdo-pl.ts +2 -54
- package/packages/azdo/src/azdo-pr-review.ts +4 -4
- package/packages/azdo/src/azdo-repo-doctor.ts +101 -52
- package/packages/azdo/src/azdo-wit.ts +44 -2
- package/packages/azdo/src/lib/agent-identity.ts +12 -14
- package/packages/azdo/src/lib/agent-token.ts +2 -2
- package/packages/azdo/src/lib/client.ts +0 -5
- package/packages/azdo/src/lib/graph-identity.ts +4 -4
- package/packages/azdo/src/workflow-ladder.csv +241 -0
- package/packages/azdo/src/workflow-rules-matrix.csv +85 -0
- package/packages/azdo/src/workflow-rules.ts +194 -0
- package/packages/fleet/manifest.json +35 -11
- package/packages/fleet/manifest.schema.json +62 -10
- package/packages/fleet/src/default-agent-file.ts +3 -3
- package/packages/fleet/src/install-adl-package.ts +73 -15
- package/packages/fleet/src/install-embedding-model.ts +13 -13
- package/packages/fleet/src/managed-settings.ts +7 -7
- package/packages/fleet/src/repo-maintain.ts +91 -55
- package/packages/fleet/src/scratch-reap.ts +5 -5
- package/packages/fleet/src/vscode-settings.ts +5 -5
- package/packages/repo-controls/README.md +141 -43
- package/packages/repo-controls/assets/promote.ts +4 -4
- package/packages/repo-controls/assets/reconcile-guard.sh +10 -46
- package/packages/repo-controls/assets/version-bump.sh +31 -84
- package/packages/repo-controls/bunfig.toml +6 -7
- package/packages/repo-controls/package/adl-compliance/AGENTS.md +5 -6
- package/packages/repo-controls/package/adl-compliance/conftest.py +3 -1
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/__init__.py +4 -16
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/adr_lifecycle/test_check.py +9 -2
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/closed_set/fixtures/docs/notes.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/closed_set/test_check.py +11 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/__init__.py +7 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/check.py +266 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-assets/docs/guide/.drafts/c.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-assets/docs/guide/.drafts/d.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-assets/docs/guide/.hidden.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-assets/docs/guide/a.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-assets/docs/guide/b.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-assets/docs/guide/data.csv +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-assets/docs/guide/diagram.png +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-assets/docs/guide/mock.png +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-assets/docs/guide/sub/nested.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-assets/docs.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-assets/grants.yaml +4 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-assets/plans/deep/p1.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-assets/plans/deep/p2.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-assets/plans/deep/p3.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-assets/plans/deep/p4.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-assets/plans/deep/p5.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-clean/docs/architecture/build.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-clean/docs/architecture/overview.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-clean/docs/guide/install.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-clean/docs/guide/start.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-clean/grants.yaml +4 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-decisions/docs/decisions/adr-001-tenancy.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-decisions/docs/decisions/adr-002-carrier.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-decisions/docs/decisions/adr-003-cli.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-decisions/docs/decisions/archive/adr-000-old.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-decisions/docs/decisions/archive/adr-000-older.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-decisions/docs/guide/a.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-decisions/docs/guide/b.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-decisions/docs/guide/c.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-decisions/grants.yaml +4 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-default-cap/docs/guide/page-01.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-default-cap/docs/guide/page-02.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-default-cap/docs/guide/page-03.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-default-cap/docs/guide/page-04.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-default-cap/docs/guide/page-05.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-default-cap/docs/guide/page-06.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-default-cap/docs/guide/page-07.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-default-cap/docs/guide/page-08.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-default-cap/docs/guide/page-09.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-default-cap/docs/guide/page-10.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-default-cap/docs/guide/page-11.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-default-cap/docs/guide/page-12.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-default-cap/docs/guide/page-13.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-default-cap/docs/guide/page-14.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-default-cap/docs/guide/page-15.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-default-cap/docs/guide/page-16.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-default-cap/grants.yaml +4 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-exempt/docs/guide/a.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-exempt/docs/guide/b.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-exempt/docs/guide/c.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-exempt/grants.yaml +4 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-grew/docs/guide/a.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-grew/docs/guide/b.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-grew/docs/guide/c.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-grew/grants.yaml +4 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-no-section/docs/guide/a.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-no-section/docs/guide/b.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-no-section/docs/guide/c.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-no-section/docs/guide/d.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-no-section/docs/guide/e.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-no-section/grants.yaml +4 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-over-cap/docs/guide/a.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-over-cap/docs/guide/b.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-over-cap/docs/guide/c.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-over-cap/docs/short/only.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-over-cap/grants.yaml +4 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-stale/docs/held/a.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-stale/docs/held/b.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-stale/docs/held/c.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-stale/docs/held/d.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-stale/docs/shrunk/a.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-stale/docs/shrunk/b.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-stale/grants.yaml +6 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-unusable/docs/guide/a.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-unusable/docs/guide/b.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-unusable/docs/guide/c.md +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/fixtures/docs-size-unusable/grants.yaml +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/directory_size/test_check.py +345 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/english_only/check.py +18 -5
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/english_only/test_check.py +35 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/__init__.py +7 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/check.py +91 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/AGENTS.md +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/CLAUDE.md +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/architecture/-leading-hyphen.md +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/architecture/AGENTS.md +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/architecture/double--hyphen.md +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/architecture/getting started.md +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/architecture/nested/page-here.md +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/architecture/trailing-hyphen-.md +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/architecture/ui-contract.md +4 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/architecture/user_profile.md +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/assets/UI-CONTRACT.png +2 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/assets/diagram.png +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/index.md +4 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/notes.md +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/reference.html +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/research/2026-10-experiment.md +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs/research/UI-CONTRACT.md +6 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/fixtures/docs.md +5 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/filename/test_check.py +194 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/indexes/check.py +14 -2
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/indexes/docs-knowledge-indexes.yaml +5 -5
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/indexes/fixtures/knowledge-indexes-shipped-register-legacy/docs/compliance/index.md +10 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/indexes/fixtures/knowledge-indexes-shipped-register-type/docs/compliance/index.md +10 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/indexes/test_check.py +58 -6
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/ledger/test_check.py +0 -1
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/check.py +64 -17
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/docs-okf-profiles.yaml +60 -9
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-ledger-clean/docs/notes.md +17 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-ledger-no-lines/docs/notes.md +13 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-profile-clean/docs/architecture/demo.md +0 -1
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-profile-clean/docs-okf-profiles.yaml +0 -1
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-profile-untyped/docs/research/no-type.md +9 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-profile-untyped/docs/research/typed-experiment.md +10 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-profile-untyped/docs/research/typed-research.md +10 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-profile-untyped/docs-okf-profiles.yaml +5 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-profile-violation/docs/architecture/bad-status.md +0 -1
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-profile-violation/docs-okf-profiles.yaml +0 -1
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-research/docs/research/experiment-ok.md +15 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-research/docs/research/extra-key.md +15 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-research/docs/research/extra-keys.md +16 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-research/docs/research/missing-created.md +11 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-research/docs/research/missing-description.md +11 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-research/docs/research/missing-last-update.md +11 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-research/docs/research/missing-sources.md +10 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-research/docs/research/missing-status.md +11 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-research/docs/research/missing-title.md +11 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-research/docs/research/optional-keys.md +16 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-research/docs/research/research-ok.md +14 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-research-neighbours/docs/architecture/created-date.md +21 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-research-neighbours/docs/architecture/research-shaped.md +19 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/fixtures/okf-research-neighbours/docs/operations/runbook.md +26 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/okf_profile/test_check.py +228 -2
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/register.py +5 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/docs/semantics/test_check.py +11 -2
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/__init__.py +5 -3
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/check.py +160 -44
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-clean/grants.yaml +0 -2
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-empty-register/frontend/packages/desktop/src/a.ts +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-empty-register/frontend/packages/desktop/src/b.ts +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-empty-register/grants.yaml +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-excluded/grants.yaml +0 -2
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-missing-tree/frontend/packages/desktop/src/renderer/solo/item.ts +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-missing-tree/grants.yaml +5 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-no-ceilings/frontend/packages/desktop/src/a.ts +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-no-ceilings/frontend/packages/desktop/src/b.ts +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-no-ceilings/frontend/packages/desktop/src/c.ts +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-no-ceilings/grants.yaml +4 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-stale-entry/frontend/packages/desktop/src/renderer/solo/item.ts +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-stale-entry/grants.yaml +5 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-unbaselined/grants.yaml +0 -2
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-unusable-register/frontend/packages/desktop/src/renderer/solo/item.ts +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/fixtures/directory-ratchet-unusable-register/grants.yaml +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/register.py +127 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/directory_ratchet/test_check.py +265 -29
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/markdown_trees/check.py +75 -2
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/markdown_trees/test_check.py +194 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/open_work_cap/check.py +56 -10
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/open_work_cap/test_check.py +258 -2
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/placement/check.py +40 -12
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/placement/test_check.py +108 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/plan_metadata.py +9 -4
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/plans_layout/check.py +1 -1
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/plans_layout/fixtures/plans-layout-clean/plans/features/az347-test-coverage/items/az351-restore-entrypoint.md +1 -1
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/plans_layout/test_check.py +3 -3
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/references/check.py +2 -3
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/check.py +23 -6
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_closed_set/test_check.py +76 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_markdown_allowlist/check.py +58 -17
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/root_markdown_allowlist/test_check.py +161 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/scripts_size_depth/check.py +35 -3
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/layout/scripts_size_depth/test_check.py +108 -1
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/check.py +281 -61
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/absolute-path.yaml +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/backslash-path.yaml +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/baseline-is-a-list.yaml +2 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/boolean-size.yaml +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/dot-segment.yaml +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/duplicate-path.yaml +4 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/empty-file.yaml +0 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/empty-segment.yaml +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/float-size.yaml +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/negative-size.yaml +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/no-over-limit-baseline.yaml +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/no-schema-version.yaml +1 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/non-string-path.yaml +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/not-yaml.yaml +2 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/null-size.yaml +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/parent-segment.yaml +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/string-size.yaml +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/top-level-is-a-list.yaml +2 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/trailing-slash.yaml +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/unknown-key.yaml +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/wrong-schema-version.yaml +2 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/malformed/zero-size.yaml +3 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/fixtures/valid.yaml +4 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/lfs/integrity/test_check.py +758 -45
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/ignored_paths/check.py +4 -3
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/ignored_paths/test_check.py +2 -2
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/lockfile_integrity/cargo_lock.py +490 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/lockfile_integrity/check.py +368 -55
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/lockfile_integrity/test_check.py +4 -2
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/lockfile_integrity/test_declared_paths.py +523 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/checks/repository/lockfile_integrity/test_stale_lock.py +1179 -0
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/cli.py +122 -3
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/core/check.py +33 -1
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/core/constants.py +0 -11
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/core/context.py +16 -1
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/policy/config.py +1 -2
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/policy/docs_shape.py +12 -1
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/policy/gate-registry.alt.yaml +133 -147
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/policy/gate-registry.yaml +133 -147
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/policy/registry.py +1 -1
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/policy/root_shape.py +52 -10
- package/packages/repo-controls/package/adl-compliance/src/adl_compliance/runner.py +23 -4
- package/packages/repo-controls/package.json +2 -9
- package/packages/repo-controls/scripts/hooks/post-merge +13 -0
- package/packages/repo-controls/scripts/hooks/pre-push +3 -3
- package/packages/repo-controls/src/azdo-push.ts +64 -36
- package/packages/repo-controls/src/azure-devops-governance.ts +7 -9
- package/packages/repo-controls/src/azure-devops-remote.ts +1 -1
- package/packages/repo-controls/src/cli.ts +29 -8
- package/packages/repo-controls/src/compliance-config.ts +410 -2
- package/packages/repo-controls/src/config.ts +133 -60
- package/packages/repo-controls/src/constants.ts +13 -27
- package/packages/repo-controls/src/coverage-ratchet.ts +4 -4
- package/packages/repo-controls/src/doctor.ts +46 -19
- package/packages/repo-controls/src/gitignore-block.ts +5 -29
- package/packages/repo-controls/src/hook-log.ts +1 -2
- package/packages/repo-controls/src/hook.ts +201 -45
- package/packages/repo-controls/src/install.ts +14 -8
- package/packages/repo-controls/src/integrity.ts +3 -3
- package/packages/repo-controls/src/lfs.ts +111 -0
- package/packages/repo-controls/src/promote.ts +8 -8
- package/packages/repo-controls/src/runtime.ts +9 -1
- package/packages/repo-controls/src/workflows-drift.ts +4 -5
- package/packages/repo-controls/src/worktree-guard.ts +3 -3
|
@@ -51,7 +51,7 @@ function parseArgs(args: readonly string[]): { home: string; mode: "plan" | "rem
|
|
|
51
51
|
return { home, mode };
|
|
52
52
|
}
|
|
53
53
|
|
|
54
|
-
|
|
54
|
+
function main(args: readonly string[]): number {
|
|
55
55
|
const { home, mode } = parseArgs(args);
|
|
56
56
|
const path = pluginPath(home);
|
|
57
57
|
const state = classifyRetiredCarrier(home);
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
{
|
|
2
|
+
"extends": "../../tsconfig.base.json",
|
|
3
|
+
"compilerOptions": {
|
|
4
|
+
"lib": ["ESNext"],
|
|
5
|
+
"target": "ESNext",
|
|
6
|
+
"module": "Preserve",
|
|
7
|
+
"moduleResolution": "bundler",
|
|
8
|
+
"moduleDetection": "force",
|
|
9
|
+
"types": ["bun"],
|
|
10
|
+
"allowImportingTsExtensions": true,
|
|
11
|
+
"verbatimModuleSyntax": true,
|
|
12
|
+
"noEmit": true,
|
|
13
|
+
"noUncheckedIndexedAccess": true,
|
|
14
|
+
"exactOptionalPropertyTypes": true,
|
|
15
|
+
"noImplicitOverride": true,
|
|
16
|
+
"noImplicitReturns": true,
|
|
17
|
+
"noFallthroughCasesInSwitch": true,
|
|
18
|
+
"noUnusedLocals": true,
|
|
19
|
+
"noUnusedParameters": true,
|
|
20
|
+
"useUnknownInCatchVariables": true
|
|
21
|
+
},
|
|
22
|
+
"include": ["src/**/*.ts", "tests/**/*.ts"]
|
|
23
|
+
}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: agent-search-tool-audit
|
|
3
|
+
description: Measure how often each agent host (Claude Code, Codex, Kimi, OpenCode) reaches for `ast-grep` and `search query "<text>"` versus how often agent-hooks denies them for `grep`, `find`, or the host's native `Grep` / `Glob` / `Search` tool. Produces a dated research page under `docs/research/` with frontmatter and updates `docs/research/index.md`. Use when the user wants to audit search-tool behaviour across surfaces, when investigating why the deny messages aren't redirecting the model, or as a scheduled weekly check.
|
|
4
|
+
disable-model-invocation: false
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Agent Search-Tool Audit
|
|
8
|
+
|
|
9
|
+
Per-host, per-day tally of agent-hooks decisions in `.adl/logs/`,
|
|
10
|
+
grouped by surface (claude / codex / kimi / opencode). The same
|
|
11
|
+
audit that produced `docs/research/research-2026-10-02-search-tool-usage-across-surfaces.md`
|
|
12
|
+
and its evidence siblings.
|
|
13
|
+
|
|
14
|
+
## Use When
|
|
15
|
+
|
|
16
|
+
- The user wants to measure how often each agent host reaches for
|
|
17
|
+
`ast-grep` / `search query` vs how often they reach for `grep` /
|
|
18
|
+
`find` / native `Grep`.
|
|
19
|
+
- The user is investigating why the deny messages aren't
|
|
20
|
+
redirecting the model to the recommended tools.
|
|
21
|
+
- A weekly check is needed (the script runs in <30 s and writes a
|
|
22
|
+
dated `docs/research/research-YYYY-MM-DD-search-tool-usage-across-surfaces.md`).
|
|
23
|
+
|
|
24
|
+
## Do Not Use When
|
|
25
|
+
|
|
26
|
+
- The repo has no `.adl/logs/` (no agent-hooks hooks installed).
|
|
27
|
+
- The question is about a non-search tool (use a different audit
|
|
28
|
+
script).
|
|
29
|
+
- The repo is not a git repo and the script's `git rev-parse
|
|
30
|
+
--show-toplevel` fallback cannot find the project root — pass
|
|
31
|
+
`--out <absolute-dir>` to write the report elsewhere.
|
|
32
|
+
|
|
33
|
+
## Process
|
|
34
|
+
|
|
35
|
+
### 1. Locate the script
|
|
36
|
+
|
|
37
|
+
After deploy, the script lives at:
|
|
38
|
+
|
|
39
|
+
```
|
|
40
|
+
.agents/skills/agent-search-tool-audit/scripts/audit.sh
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
In dev (this repo's `packages/agent-skills/`), the equivalent path is
|
|
44
|
+
`packages/agent-skills/assets/agent-search-tool-audit/scripts/audit.sh`.
|
|
45
|
+
The script finds the project root via `git rev-parse --show-toplevel`,
|
|
46
|
+
so it works in both layouts.
|
|
47
|
+
|
|
48
|
+
### 2. Run with the desired window
|
|
49
|
+
|
|
50
|
+
```sh
|
|
51
|
+
.agents/skills/agent-search-tool-audit/scripts/audit.sh --days 7
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
Flags:
|
|
55
|
+
- `--days N` — trailing window in UTC days (default 7)
|
|
56
|
+
- `--out DIR` — output directory (default `docs/research`)
|
|
57
|
+
|
|
58
|
+
The script writes one markdown file per run:
|
|
59
|
+
|
|
60
|
+
```
|
|
61
|
+
docs/research/research-YYYY-MM-DD-search-tool-usage-across-surfaces.md
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
If a file with that name already exists, the script leaves it
|
|
65
|
+
untouched (it might be a hand-curated analysis from earlier in the
|
|
66
|
+
day) and only updates `docs/research/index.md`. Delete the existing
|
|
67
|
+
file to force regeneration.
|
|
68
|
+
|
|
69
|
+
### 3. Verify the page has frontmatter and is in the catalog
|
|
70
|
+
|
|
71
|
+
The script emits a valid research page (frontmatter included) and
|
|
72
|
+
appends one row to `docs/research/index.md`. Confirm both with:
|
|
73
|
+
|
|
74
|
+
```sh
|
|
75
|
+
head -10 docs/research/research-$(date -u +%Y-%m-%d)-search-tool-usage-across-surfaces.md
|
|
76
|
+
rg "$(date -u +%Y-%m-%d)-search-tool-usage" docs/research/index.md
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
### 4. (Optional) Schedule it
|
|
80
|
+
|
|
81
|
+
The cheapest repeatable cadence is `crontab` on the workstation:
|
|
82
|
+
|
|
83
|
+
```
|
|
84
|
+
0 9 * * 1 cd <repo-root> && .agents/skills/agent-search-tool-audit/scripts/audit.sh
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
Weekly Monday 09:00 local. The output lands in `docs/research/`,
|
|
88
|
+
ready for the next research-page review.
|
|
89
|
+
|
|
90
|
+
## What the script measures
|
|
91
|
+
|
|
92
|
+
| Metric | Source | Use |
|
|
93
|
+
| --- | --- | --- |
|
|
94
|
+
| Total decisions per host | `hooks.log` / `hooks.log.1` / `hooks-deny.log`, deduped by `(ts, command, rule)` | Volume baseline |
|
|
95
|
+
| Denials per host, broken down by `rule` field | same | Where the hook fires |
|
|
96
|
+
| Search-tool denials (`tool.grep` / `tool.native-search` / `tool.find`) | same | The hook category this skill cares about |
|
|
97
|
+
| `ast-grep` invocations (Bash command starting with `ast-grep`) | same | Whether the recommended tool is being used |
|
|
98
|
+
| `search query` invocations (Bash command starting with `search `) | same | Same |
|
|
99
|
+
| Session count per host/day | same | Volume sanity check |
|
|
100
|
+
|
|
101
|
+
The script does NOT compute the per-denial retry/pivot analysis
|
|
102
|
+
that's in the hand-curated research page. That step needs the model
|
|
103
|
+
itself (it requires reading the actual `command` strings and
|
|
104
|
+
classifying them by tool). For the retry analysis, follow the
|
|
105
|
+
"Process" steps in `docs/research/research-2026-10-02-search-tool-usage-across-surfaces.md`.
|
|
106
|
+
|
|
107
|
+
## Cost
|
|
108
|
+
|
|
109
|
+
- <30 s on a typical 2-3 MB log set
|
|
110
|
+
- No network, no new tools beyond `jq` + `python3` + the shell
|
|
111
|
+
- Read-only on `.adl/logs/`; writes one markdown file and one row
|
|
112
|
+
to `docs/research/index.md`
|
|
113
|
+
|
|
114
|
+
## Related
|
|
115
|
+
|
|
116
|
+
- `docs/research/research-2026-10-02-search-tool-usage-across-surfaces.md`
|
|
117
|
+
— the hand-curated analysis this script would generate for today
|
|
118
|
+
- `packages/agent-hooks/src/rules/impl/tool-grep.ts`,
|
|
119
|
+
`tool-find.ts`, `tool-native-search.ts` — the deny messages the
|
|
120
|
+
audit is measuring
|
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# scripts/audit.sh — part of the agent-search-tool-audit skill
|
|
3
|
+
# (packages/agent-skills/assets/agent-search-tool-audit/).
|
|
4
|
+
#
|
|
5
|
+
# Per-host, per-day tally of agent-hooks decisions in `.adl/logs/`,
|
|
6
|
+
# grouped by surface (claude / codex / kimi / opencode). Writes one
|
|
7
|
+
# dated markdown under `docs/research/` so the next weekly research
|
|
8
|
+
# page in the "agent search-tool behaviour" series can compare against
|
|
9
|
+
# the previous one. Reads only — never modifies the repo.
|
|
10
|
+
#
|
|
11
|
+
# Usage:
|
|
12
|
+
# scripts/audit.sh [--days N] [--out DIR]
|
|
13
|
+
#
|
|
14
|
+
# Defaults: --days 7, --out docs/research
|
|
15
|
+
#
|
|
16
|
+
# Output:
|
|
17
|
+
# <out>/research-YYYY-MM-DD-search-tool-usage-across-surfaces.md
|
|
18
|
+
# <out>/index.md (one new row appended for the new page)
|
|
19
|
+
#
|
|
20
|
+
# Source data:
|
|
21
|
+
# .adl/logs/hooks.log (current decision log)
|
|
22
|
+
# .adl/logs/hooks.log.1 (rotated decision log)
|
|
23
|
+
# .adl/logs/hooks-deny.log (dedicated deny stream)
|
|
24
|
+
# .adl/logs/agents/tool-calls.log (adl run lifecycle)
|
|
25
|
+
#
|
|
26
|
+
# Path discovery: this script lives in the agent-skills asset tree
|
|
27
|
+
# (5 levels deep in dev, 4 levels deep once deployed to
|
|
28
|
+
# `.agents/skills/`). Use `git rev-parse --show-toplevel` so it
|
|
29
|
+
# works in both layouts.
|
|
30
|
+
#
|
|
31
|
+
# Cost: <30 s on a typical 2-3 MB log set; no network, no new tools
|
|
32
|
+
# beyond jq + python3 + the shell.
|
|
33
|
+
|
|
34
|
+
set -euo pipefail
|
|
35
|
+
|
|
36
|
+
DAYS=7
|
|
37
|
+
OUT=docs/research
|
|
38
|
+
while [[ $# -gt 0 ]]; do
|
|
39
|
+
case "$1" in
|
|
40
|
+
--days) DAYS="$2"; shift 2;;
|
|
41
|
+
--out) OUT="$2"; shift 2;;
|
|
42
|
+
-h|--help)
|
|
43
|
+
sed -n '2,30p' "$0"
|
|
44
|
+
exit 0
|
|
45
|
+
;;
|
|
46
|
+
*)
|
|
47
|
+
echo "unknown arg: $1" >&2
|
|
48
|
+
exit 2
|
|
49
|
+
;;
|
|
50
|
+
esac
|
|
51
|
+
done
|
|
52
|
+
|
|
53
|
+
cd "$(dirname "$0")/../.."
|
|
54
|
+
|
|
55
|
+
# `git rev-parse --show-toplevel` works in both dev (5 levels deep
|
|
56
|
+
# under packages/agent-skills/assets/agent-search-tool-audit/scripts)
|
|
57
|
+
# and deployed (4 levels deep under .agents/skills/). Fall back to
|
|
58
|
+
# the dev layout if git is missing.
|
|
59
|
+
if command -v git >/dev/null 2>&1; then
|
|
60
|
+
if toplevel=$(git rev-parse --show-toplevel 2>/dev/null) && [[ -n "$toplevel" ]]; then
|
|
61
|
+
cd "$toplevel"
|
|
62
|
+
fi
|
|
63
|
+
fi
|
|
64
|
+
|
|
65
|
+
command -v jq >/dev/null 2>&1 || { echo "jq is required and is not on PATH" >&2; exit 1; }
|
|
66
|
+
command -v python3 >/dev/null 2>&1 || { echo "python3 is required and is not on PATH" >&2; exit 1; }
|
|
67
|
+
|
|
68
|
+
LOG_FILES=(
|
|
69
|
+
.adl/logs/hooks.log
|
|
70
|
+
.adl/logs/hooks.log.1
|
|
71
|
+
.adl/logs/hooks-deny.log
|
|
72
|
+
)
|
|
73
|
+
LOGS_PRESENT=()
|
|
74
|
+
for f in "${LOG_FILES[@]}"; do
|
|
75
|
+
[[ -f "$f" ]] && LOGS_PRESENT+=("$f")
|
|
76
|
+
done
|
|
77
|
+
[[ ${#LOGS_PRESENT[@]} -gt 0 ]] || { echo "no hook log files present under .adl/logs/" >&2; exit 1; }
|
|
78
|
+
|
|
79
|
+
TODAY="$(date -u +%Y-%m-%d)"
|
|
80
|
+
RUN_TS="$(date -u +%Y-%m-%dT%H:%M:%SZ)"
|
|
81
|
+
OUT_FILE="${OUT}/research-${TODAY}-search-tool-usage-across-surfaces.md"
|
|
82
|
+
|
|
83
|
+
# If today's page already exists, leave it alone — it might be a hand-curated
|
|
84
|
+
# analysis from earlier in the day. Append / update `index.md` either way so
|
|
85
|
+
# the catalog stays current.
|
|
86
|
+
if [[ -f "$OUT_FILE" ]]; then
|
|
87
|
+
echo "${OUT_FILE} already exists; leaving it untouched. Re-run after deleting it (or pass --out to a different dir)."
|
|
88
|
+
# Still touch index.md so the catalog row stays current (idempotent).
|
|
89
|
+
INDEX="${OUT}/index.md"
|
|
90
|
+
ROW="| [Search-tool usage across surfaces — ${TODAY}](research-${TODAY}-search-tool-usage-across-surfaces.md) | Auto-generated weekly audit of per-host search-tool denials and recommended-tool invocations |"
|
|
91
|
+
if [[ -f "$INDEX" ]] && ! grep -q "research-${TODAY}-search-tool-usage-across-surfaces.md" "$INDEX"; then
|
|
92
|
+
python3 - "$INDEX" "$ROW" <<'PYEOF' >/dev/null
|
|
93
|
+
import sys
|
|
94
|
+
path, row = sys.argv[1], sys.argv[2]
|
|
95
|
+
with open(path) as f:
|
|
96
|
+
body = f.read()
|
|
97
|
+
if body.endswith("\n\n"):
|
|
98
|
+
body = body.rstrip() + "\n" + row + "\n"
|
|
99
|
+
elif body.endswith("\n"):
|
|
100
|
+
body = body + row + "\n"
|
|
101
|
+
else:
|
|
102
|
+
body = body + "\n" + row + "\n"
|
|
103
|
+
with open(path, "w") as f:
|
|
104
|
+
f.write(body)
|
|
105
|
+
PYEOF
|
|
106
|
+
echo "appended row to ${INDEX}"
|
|
107
|
+
fi
|
|
108
|
+
exit 0
|
|
109
|
+
fi
|
|
110
|
+
|
|
111
|
+
python3 - "${DAYS}" "${RUN_TS}" "${TODAY}" "${LOGS_PRESENT[@]}" >"${OUT_FILE}" <<'PYEOF'
|
|
112
|
+
import json, sys, datetime, collections
|
|
113
|
+
|
|
114
|
+
days = int(sys.argv[1])
|
|
115
|
+
run_ts = sys.argv[2]
|
|
116
|
+
today = sys.argv[3]
|
|
117
|
+
log_files = sys.argv[4:]
|
|
118
|
+
|
|
119
|
+
cutoff = datetime.datetime.fromisoformat(today + "T00:00:00Z") - datetime.timedelta(days=days-1)
|
|
120
|
+
|
|
121
|
+
# Per (host, day), tally. Dedupe by (ts, command, rule) within each log.
|
|
122
|
+
per_host_day = collections.defaultdict(lambda: collections.Counter())
|
|
123
|
+
per_host_day_deny_rule = collections.defaultdict(lambda: collections.Counter())
|
|
124
|
+
per_host_day_ast_grep = collections.defaultdict(int)
|
|
125
|
+
per_host_day_search_query = collections.defaultdict(int)
|
|
126
|
+
per_host_day_session_ids = collections.defaultdict(set)
|
|
127
|
+
|
|
128
|
+
seen = set()
|
|
129
|
+
for path in log_files:
|
|
130
|
+
with open(path) as f:
|
|
131
|
+
for line in f:
|
|
132
|
+
try:
|
|
133
|
+
d = json.loads(line)
|
|
134
|
+
except json.JSONDecodeError:
|
|
135
|
+
continue
|
|
136
|
+
host = d.get("host")
|
|
137
|
+
ts = d.get("ts")
|
|
138
|
+
if host is None or ts is None:
|
|
139
|
+
continue
|
|
140
|
+
day = ts[:10]
|
|
141
|
+
try:
|
|
142
|
+
t = datetime.datetime.fromisoformat(ts.replace("Z", "+00:00"))
|
|
143
|
+
except ValueError:
|
|
144
|
+
continue
|
|
145
|
+
if t < cutoff:
|
|
146
|
+
continue
|
|
147
|
+
key = (ts, d.get("command"), d.get("rule"))
|
|
148
|
+
if key in seen:
|
|
149
|
+
continue
|
|
150
|
+
seen.add(key)
|
|
151
|
+
|
|
152
|
+
sess = d.get("session_id")
|
|
153
|
+
if sess:
|
|
154
|
+
per_host_day_session_ids[(host, day)].add(sess)
|
|
155
|
+
|
|
156
|
+
per_host_day[(host, day)][d.get("decision", "?")] += 1
|
|
157
|
+
|
|
158
|
+
if d.get("decision", "").startswith("DENY"):
|
|
159
|
+
per_host_day_deny_rule[(host, day)][d.get("rule", "?")] += 1
|
|
160
|
+
|
|
161
|
+
cmd = (d.get("command") or "").lower()
|
|
162
|
+
if "ast-grep" in cmd and cmd.lstrip().startswith("ast-grep"):
|
|
163
|
+
per_host_day_ast_grep[(host, day)] += 1
|
|
164
|
+
if cmd.lstrip().startswith("search "):
|
|
165
|
+
per_host_day_search_query[(host, day)] += 1
|
|
166
|
+
|
|
167
|
+
hosts = sorted({h for (h, _) in per_host_day})
|
|
168
|
+
days_sorted = sorted({d for (_, d) in per_host_day})
|
|
169
|
+
|
|
170
|
+
search_tool_rules = ("tool.grep", "tool.native-search", "tool.find")
|
|
171
|
+
|
|
172
|
+
lines = []
|
|
173
|
+
lines.append("---")
|
|
174
|
+
lines.append("title: Agent interface search-tool usage across surfaces ({0})".format(today))
|
|
175
|
+
lines.append("description: Auto-generated per-host, per-day tally of search-tool denials and recommended-tool invocations. Produced by `scripts/research/weekly-search-tool-audit.sh --days {n}` at {run_ts}.".format(today, n=days, run_ts=run_ts))
|
|
176
|
+
lines.append("type: Research")
|
|
177
|
+
lines.append("created: {0}".format(today))
|
|
178
|
+
lines.append("status: stable")
|
|
179
|
+
lines.append("last_update: {0}".format(run_ts))
|
|
180
|
+
lines.append("sources: .adl/logs/hooks.log, .adl/logs/hooks.log.1, .adl/logs/hooks-deny.log")
|
|
181
|
+
lines.append("related: ./index.md, ./research-2026-10-02-search-tool-usage-across-surfaces.md")
|
|
182
|
+
lines.append("---")
|
|
183
|
+
lines.append("")
|
|
184
|
+
lines.append("# Agent interface search-tool usage across surfaces ({0})".format(today))
|
|
185
|
+
lines.append("")
|
|
186
|
+
lines.append("Auto-generated weekly audit. Window: trailing {0} UTC days ending {1}. Source: `.adl/logs/hooks*.log` and `.adl/logs/hooks-deny.log`. Re-run with `just research/weekly-search-audit`.".format(days, today))
|
|
187
|
+
lines.append("")
|
|
188
|
+
lines.append("## Headline per host")
|
|
189
|
+
lines.append("")
|
|
190
|
+
lines.append("| Host | Decisions | Denials | Search-tool denials | ast-grep invocations | search query invocations |")
|
|
191
|
+
lines.append("| --- | --- | --- | --- | --- | --- |")
|
|
192
|
+
totals = collections.Counter()
|
|
193
|
+
for host in hosts:
|
|
194
|
+
d_total = sum(per_host_day[(host, d)]["PASS"] + per_host_day[(host, d)].get("DENY", 0) + per_host_day[(host, d)].get("ERROR", 0) + per_host_day[(host, d)].get("SKIP", 0) for d in days_sorted)
|
|
195
|
+
d_denials = sum(per_host_day_deny_rule[(host, d)][r] for d in days_sorted for r in per_host_day_deny_rule[(host, d)])
|
|
196
|
+
d_search = sum(per_host_day_deny_rule[(host, d)][r] for d in days_sorted for r in search_tool_rules)
|
|
197
|
+
d_ag = sum(per_host_day_ast_grep[(host, d)] for d in days_sorted)
|
|
198
|
+
d_sq = sum(per_host_day_search_query[(host, d)] for d in days_sorted)
|
|
199
|
+
totals["decisions"] += d_total
|
|
200
|
+
totals["denials"] += d_denials
|
|
201
|
+
totals["search_tool_denials"] += d_search
|
|
202
|
+
totals["ast_grep"] += d_ag
|
|
203
|
+
totals["search_query"] += d_sq
|
|
204
|
+
lines.append("| {0} | {1} | {2} | {3} | {4} | {5} |".format(host, d_total, d_denials, d_search, d_ag, d_sq))
|
|
205
|
+
|
|
206
|
+
if not hosts:
|
|
207
|
+
lines.append("| — | 0 | 0 | 0 | 0 | 0 | (no decisions in the window) |")
|
|
208
|
+
|
|
209
|
+
lines.append("")
|
|
210
|
+
lines.append("## Per-day, per-host breakdown")
|
|
211
|
+
lines.append("")
|
|
212
|
+
for host in hosts:
|
|
213
|
+
lines.append("### {0}".format(host))
|
|
214
|
+
lines.append("")
|
|
215
|
+
lines.append("| Date | Decisions | Denials | DENY tool.grep | DENY tool.native-search | DENY tool.find | ast-grep | search query | Sessions |")
|
|
216
|
+
lines.append("| --- | --- | --- | --- | --- | --- | --- | --- | --- |")
|
|
217
|
+
for d in days_sorted:
|
|
218
|
+
c = per_host_day[(host, d)]
|
|
219
|
+
r = per_host_day_deny_rule[(host, d)]
|
|
220
|
+
total = c["PASS"] + c.get("DENY", 0) + c.get("ERROR", 0) + c.get("SKIP", 0)
|
|
221
|
+
lines.append("| {0} | {1} | {2} | {3} | {4} | {5} | {6} | {7} | {8} |".format(
|
|
222
|
+
d, total, sum(r.values()), r.get("tool.grep", 0), r.get("tool.native-search", 0), r.get("tool.find", 0),
|
|
223
|
+
per_host_day_ast_grep[(host, d)], per_host_day_search_query[(host, d)], len(per_host_day_session_ids[(host, d)])
|
|
224
|
+
))
|
|
225
|
+
lines.append("")
|
|
226
|
+
|
|
227
|
+
lines.append("## Window totals")
|
|
228
|
+
lines.append("")
|
|
229
|
+
lines.append("- Decisions: {0}".format(totals["decisions"]))
|
|
230
|
+
lines.append("- Denials: {0}".format(totals["denials"]))
|
|
231
|
+
lines.append("- Search-tool denials (tool.grep + tool.native-search + tool.find): {0}".format(totals["search_tool_denials"]))
|
|
232
|
+
lines.append("- ast-grep invocations: {0}".format(totals["ast_grep"]))
|
|
233
|
+
lines.append("- search query invocations: {0}".format(totals["search_query"]))
|
|
234
|
+
lines.append("")
|
|
235
|
+
lines.append("If search-tool denials are non-zero AND ast-grep / search-query invocations are zero, the deny text in `packages/agent-hooks/src/rules/impl/` is not redirecting the agent. See `research-2026-10-02-search-tool-usage-across-surfaces.md` top-5 for the concrete edits.")
|
|
236
|
+
lines.append("")
|
|
237
|
+
|
|
238
|
+
sys.stdout.write("\n".join(lines))
|
|
239
|
+
PYEOF
|
|
240
|
+
|
|
241
|
+
# Append / update index.md with the new page row. We don't disturb
|
|
242
|
+
# other rows; we add one to the end of the table.
|
|
243
|
+
INDEX="${OUT}/index.md"
|
|
244
|
+
ROW="| [Search-tool usage across surfaces — ${TODAY}](research-${TODAY}-search-tool-usage-across-surfaces.md) | Auto-generated weekly audit of per-host search-tool denials and recommended-tool invocations |"
|
|
245
|
+
|
|
246
|
+
if [[ ! -f "$INDEX" ]]; then
|
|
247
|
+
echo "index.md not present at ${INDEX}; not updating" >&2
|
|
248
|
+
exit 0
|
|
249
|
+
fi
|
|
250
|
+
if grep -q "research-${TODAY}-search-tool-usage-across-surfaces.md" "$INDEX"; then
|
|
251
|
+
echo "index.md already has today's page; not appending"
|
|
252
|
+
else
|
|
253
|
+
# Insert before the closing fence (if any) or just append before EOF.
|
|
254
|
+
python3 - "$INDEX" "$ROW" <<'PYEOF'
|
|
255
|
+
import sys
|
|
256
|
+
path, row = sys.argv[1], sys.argv[2]
|
|
257
|
+
with open(path) as f:
|
|
258
|
+
body = f.read()
|
|
259
|
+
# Idempotent append: ensure exactly one matching row.
|
|
260
|
+
needle = row.split("|")[1].strip()
|
|
261
|
+
if needle in body:
|
|
262
|
+
sys.exit(0)
|
|
263
|
+
# Insert before final blank line(s).
|
|
264
|
+
if body.endswith("\n\n"):
|
|
265
|
+
body = body.rstrip() + "\n" + row + "\n"
|
|
266
|
+
elif body.endswith("\n"):
|
|
267
|
+
body = body + row + "\n"
|
|
268
|
+
else:
|
|
269
|
+
body = body + "\n" + row + "\n"
|
|
270
|
+
with open(path, "w") as f:
|
|
271
|
+
f.write(body)
|
|
272
|
+
PYEOF
|
|
273
|
+
echo "appended row to ${INDEX}"
|
|
274
|
+
fi
|
|
275
|
+
|
|
276
|
+
echo "wrote ${OUT_FILE}"
|
|
@@ -21,11 +21,11 @@ You already know the cause and are planning the fix — use `refactor-safely`.
|
|
|
21
21
|
|
|
22
22
|
## Steps
|
|
23
23
|
|
|
24
|
-
1.
|
|
25
|
-
2.
|
|
26
|
-
3.
|
|
27
|
-
4. Run `
|
|
28
|
-
5.
|
|
24
|
+
1. Run `crg search "<query>"` to find code related to the issue.
|
|
25
|
+
2. Run `crg query callers_of <target>` and `crg query callees_of <target>` to trace call chains.
|
|
26
|
+
3. Run `crg flow --name <n>` to see full execution paths through suspected areas.
|
|
27
|
+
4. Run `crg detect-changes --base <ref>` to check if recent changes caused the issue.
|
|
28
|
+
5. Run `crg impact --files <f…>` on suspected files to see what else is affected.
|
|
29
29
|
|
|
30
30
|
## Tips
|
|
31
31
|
|
|
@@ -36,5 +36,6 @@ You already know the cause and are planning the fix — use `refactor-safely`.
|
|
|
36
36
|
## Token Efficiency
|
|
37
37
|
|
|
38
38
|
Trace efficiently using `explore-codebase`'s **Token Efficiency Rules** —
|
|
39
|
-
start
|
|
40
|
-
suspected cause against real source
|
|
39
|
+
start with capped output (`--limit`, `--brief`), keep commands around 5 and
|
|
40
|
+
output around 800 tokens, then verify the suspected cause against real source
|
|
41
|
+
before proposing a fix.
|
|
@@ -6,7 +6,7 @@ disable-model-invocation: false
|
|
|
6
6
|
|
|
7
7
|
# Explore Codebase
|
|
8
8
|
|
|
9
|
-
Use the code-review-graph
|
|
9
|
+
Use the `crg` CLI (code-review-graph) to explore and understand the codebase.
|
|
10
10
|
|
|
11
11
|
## Use When
|
|
12
12
|
|
|
@@ -21,21 +21,21 @@ You already know where the problem is and need to trace a bug — use
|
|
|
21
21
|
|
|
22
22
|
## Steps
|
|
23
23
|
|
|
24
|
-
1. Run `
|
|
25
|
-
2. Run `
|
|
26
|
-
3.
|
|
27
|
-
4.
|
|
28
|
-
5.
|
|
29
|
-
6.
|
|
24
|
+
1. Run `crg status` to see overall codebase metrics.
|
|
25
|
+
2. Run `crg architecture` for high-level community structure.
|
|
26
|
+
3. Run `crg communities` to find major modules, then `crg community --name <n> --members` for details.
|
|
27
|
+
4. Run `crg search "<query>"` to find specific functions or classes (semantic only after a one-time `crg embed`; otherwise keyword fallback).
|
|
28
|
+
5. Run `crg query callers_of|callees_of|imports_of|importers_of <target>` to trace relationships.
|
|
29
|
+
6. Run `crg flows` and `crg flow --name <n>` to understand execution paths.
|
|
30
30
|
|
|
31
31
|
## Tips
|
|
32
32
|
|
|
33
|
-
- Start broad (
|
|
34
|
-
- Use `
|
|
35
|
-
- Use `
|
|
33
|
+
- Start broad (status, architecture) then narrow down to specific areas.
|
|
34
|
+
- Use `crg query children_of <file>` to see all its functions and classes.
|
|
35
|
+
- Use `crg large-functions` to identify complex code.
|
|
36
36
|
|
|
37
37
|
## Token Efficiency Rules
|
|
38
|
-
- Start with `
|
|
39
|
-
- Use `
|
|
40
|
-
- Target: complete any review/debug/refactor task in ≤5
|
|
38
|
+
- Start with `crg status` + `crg architecture --detail-level minimal` before other graph commands.
|
|
39
|
+
- Use `--limit N` on `crg search`/`crg flows`/`crg large-functions` and `--brief` on `crg detect-changes` to cap output. Only escalate to full output when the capped view is insufficient.
|
|
40
|
+
- Target: complete any review/debug/refactor task in ≤5 commands and ≤800 total output tokens.
|
|
41
41
|
- Read the implementation and its tests before changing code. The graph narrows scope; it does not replace the source.
|
|
@@ -24,21 +24,22 @@ use `explore-codebase`. You are chasing the cause of a live bug — use
|
|
|
24
24
|
|
|
25
25
|
## Steps
|
|
26
26
|
|
|
27
|
-
1.
|
|
28
|
-
2.
|
|
29
|
-
3. For renames,
|
|
30
|
-
4.
|
|
31
|
-
5. After changes, run `
|
|
27
|
+
1. Run `crg refactor suggest` for community-driven refactoring suggestions.
|
|
28
|
+
2. Run `crg refactor dead_code` (or `crg dead-code`) to find unreferenced code.
|
|
29
|
+
3. For renames, run `crg refactor rename --old-name X --new-name Y` to preview the full edit list.
|
|
30
|
+
4. Apply the rename with your own edit tools — the CLI previews the edit list but does not apply it.
|
|
31
|
+
5. After changes, run `crg detect-changes` to verify the refactoring impact.
|
|
32
32
|
|
|
33
33
|
## Safety Checks
|
|
34
34
|
|
|
35
35
|
- Always preview before applying (rename mode gives you an edit list).
|
|
36
|
-
-
|
|
37
|
-
-
|
|
38
|
-
- Run `
|
|
36
|
+
- Run `crg impact` before major refactors.
|
|
37
|
+
- Run `crg detect-changes` and read the full JSON's affected flows to ensure no critical paths are broken.
|
|
38
|
+
- Run `crg large-functions` to identify decomposition targets.
|
|
39
39
|
|
|
40
40
|
## Token Efficiency
|
|
41
41
|
|
|
42
|
-
Follow `explore-codebase`'s **Token Efficiency Rules** —
|
|
43
|
-
|
|
44
|
-
real source before
|
|
42
|
+
Follow `explore-codebase`'s **Token Efficiency Rules** — `crg status` and
|
|
43
|
+
`crg architecture --detail-level minimal` first, `--limit`/`--brief` to cap
|
|
44
|
+
output, a ≤5-command/≤800-token target, and read the real source before
|
|
45
|
+
editing.
|
|
@@ -23,10 +23,10 @@ You are planning your own refactor rather than reviewing one — use
|
|
|
23
23
|
|
|
24
24
|
## Steps
|
|
25
25
|
|
|
26
|
-
1. Run `
|
|
27
|
-
2. Run `
|
|
28
|
-
3. For each high-risk function, run `
|
|
29
|
-
4. Run `
|
|
26
|
+
1. Run `crg detect-changes` (`--base <ref>` to pick the diff base) for risk-scored change analysis — the full JSON embeds affected flows; add `--brief` for a summary.
|
|
27
|
+
2. Run `crg flow --name <n>` on each affected flow to see the impacted execution paths.
|
|
28
|
+
3. For each high-risk function, run `crg query tests_for <fn>` to check test coverage.
|
|
29
|
+
4. Run `crg impact` to understand the blast radius.
|
|
30
30
|
5. For any untested changes, suggest specific test cases.
|
|
31
31
|
|
|
32
32
|
## Output Format
|
|
@@ -40,6 +40,6 @@ Provide findings grouped by risk level (high/medium/low) with:
|
|
|
40
40
|
## Token Efficiency
|
|
41
41
|
|
|
42
42
|
Keep this review token-light per `explore-codebase`'s **Token Efficiency
|
|
43
|
-
Rules**: `
|
|
44
|
-
|
|
45
|
-
and tests.
|
|
43
|
+
Rules**: `crg status` + `crg architecture --detail-level minimal` first,
|
|
44
|
+
`--brief`/`--limit` on every command, ≤5 commands and ≤800 tokens, and
|
|
45
|
+
confirm findings against the actual source and tests.
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# End-to-end testing
|
|
2
|
+
|
|
3
|
+
## Purpose
|
|
4
|
+
|
|
5
|
+
End-to-end tests prove a complete business outcome from initiation to an
|
|
6
|
+
observable completion across the integrated system. They validate outcomes and
|
|
7
|
+
orchestration: UI state, sequencing, multi-system coordination, and the user
|
|
8
|
+
journey. They do not provide exhaustive contract or error-path coverage for
|
|
9
|
+
each boundary.
|
|
10
|
+
|
|
11
|
+
## Use it for
|
|
12
|
+
|
|
13
|
+
- Critical user journeys such as onboarding, checkout, order-to-cash, or
|
|
14
|
+
recovery flows.
|
|
15
|
+
- Business workflows that span app UI, backend services, persistence, and
|
|
16
|
+
permitted external integrations.
|
|
17
|
+
- Production-like load or timing scenarios where the complete workflow is the
|
|
18
|
+
thing being evaluated.
|
|
19
|
+
|
|
20
|
+
Keep E2E scenarios few and outcome-oriented. Put contract variants, malformed
|
|
21
|
+
data, retries, and service-boundary failures in integration tests unless the
|
|
22
|
+
workflow itself changes their user-visible outcome.
|
|
23
|
+
|
|
24
|
+
## Canonical location
|
|
25
|
+
|
|
26
|
+
This repository has one cross-workspace E2E location: `tests/e2e/`.
|
|
27
|
+
App workflows and package-contributed behaviour meet there; do not create
|
|
28
|
+
`apps/<app>/tests/e2e/` or `packages/<package>/tests/e2e/`. App and package
|
|
29
|
+
fixtures remain with their owning test trees unless they are shared fixtures
|
|
30
|
+
owned by the E2E workspace.
|
|
31
|
+
|
|
32
|
+
## Evidence
|
|
33
|
+
|
|
34
|
+
Run the whole journey through its real runtime in the CI-parity environment,
|
|
35
|
+
using production-like data and isolated dependencies. Assert the user-visible
|
|
36
|
+
completion and the durable business result. External live or billable calls
|
|
37
|
+
need explicit opt-in; without it, do not silently substitute a fake path.
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# Integration testing
|
|
2
|
+
|
|
3
|
+
## Purpose
|
|
4
|
+
|
|
5
|
+
Integration tests prove that two or more components communicate correctly at a
|
|
6
|
+
real boundary. They validate connections: contracts, transformations,
|
|
7
|
+
authentication, persistence, messages, retries, timeouts, and error handling.
|
|
8
|
+
They do not replace a complete user or business workflow test.
|
|
9
|
+
|
|
10
|
+
## Use it for
|
|
11
|
+
|
|
12
|
+
- Service-to-service APIs, database adapters, queues, files, and external
|
|
13
|
+
provider boundaries.
|
|
14
|
+
- Contract fields, response and error shapes, and data transformation edge
|
|
15
|
+
cases.
|
|
16
|
+
- Failure modes that happy-path journeys rarely exercise: expired credentials,
|
|
17
|
+
timeouts, retries, duplicate delivery, and transaction coordination.
|
|
18
|
+
|
|
19
|
+
Keep unrelated dependencies out of the scenario. A browser-driven checkout is
|
|
20
|
+
not an integration test merely because it crosses an API; test the specific
|
|
21
|
+
checkout-to-payment boundary directly when that contract is the subject.
|
|
22
|
+
|
|
23
|
+
## Canonical location
|
|
24
|
+
|
|
25
|
+
Place app-owned integration tests in `apps/<app>/tests/integration/` and
|
|
26
|
+
package-owned integration tests in `packages/<package>/tests/integration/`.
|
|
27
|
+
Use containerized or otherwise isolated real dependencies whenever the scenario
|
|
28
|
+
crosses a service, database, broker, streaming, or provider boundary. Do not
|
|
29
|
+
put integration scenarios in `tests/e2e/`; that workspace is reserved for
|
|
30
|
+
complete workflows.
|
|
31
|
+
|
|
32
|
+
## Evidence
|
|
33
|
+
|
|
34
|
+
Exercise the real interface with controlled data and assert both the boundary
|
|
35
|
+
response and the observable transformed result. Run through the repository's
|
|
36
|
+
CI-parity entrypoint; live or billable services require an explicit opt-in and
|
|
37
|
+
must fail loudly or skip cleanly when credentials are absent.
|