@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
|
@@ -0,0 +1,311 @@
|
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
// probe-ado-rules.ts — verify the LIVE Azure DevOps process rules against the
|
|
3
|
+
// pinned expectation (src/workflow-ladder.csv). Read-only metadata first,
|
|
4
|
+
// then an empirical matrix probe of a REAL item supplied by the operator
|
|
5
|
+
// (default 546): the item is reset (→ Removed → New, both verified open)
|
|
6
|
+
// and walked to each ladder state, where every CSV transition for that state
|
|
7
|
+
// is attempted via RAW json-patch — bypassing this repo's own fence on
|
|
8
|
+
// purpose (the probe tests ADO, not us). If an expected-refused edge turns
|
|
9
|
+
// out allowed and moves the item, the walk returns and continues. The item
|
|
10
|
+
// is restored to its original state at the end.
|
|
11
|
+
//
|
|
12
|
+
// Usage: bun packages/azdo/scripts/probe-ado-rules.ts [item-id] [--metadata-only]
|
|
13
|
+
import { AdoClient } from "../src/lib/client.ts";
|
|
14
|
+
import { readFileSync } from "node:fs";
|
|
15
|
+
import { join } from "node:path";
|
|
16
|
+
|
|
17
|
+
const ORG = "amsterdamdatalabs";
|
|
18
|
+
const PROJECT = "Infrastructure-AzDo";
|
|
19
|
+
const ORG_API = `https://dev.azure.com/${ORG}/_apis`;
|
|
20
|
+
const PROJECT_API = `https://dev.azure.com/${ORG}/${PROJECT}/_apis`;
|
|
21
|
+
const ITEM_ID = Number(process.argv.find((a) => /^\d+$/.test(a)) ?? 546);
|
|
22
|
+
const METADATA_ONLY = process.argv.includes("--metadata-only");
|
|
23
|
+
|
|
24
|
+
interface CsvRow {
|
|
25
|
+
workItemType: string;
|
|
26
|
+
fromState: string;
|
|
27
|
+
toState: string;
|
|
28
|
+
rule: string;
|
|
29
|
+
skippedStates: string;
|
|
30
|
+
owner: string;
|
|
31
|
+
note: string;
|
|
32
|
+
observed?: string;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const orgClient = new AdoClient({ baseUrl: ORG_API });
|
|
36
|
+
const projectClient = new AdoClient({ baseUrl: PROJECT_API });
|
|
37
|
+
|
|
38
|
+
function loadExpectations(type: string): CsvRow[] {
|
|
39
|
+
const csv = readFileSync(join(import.meta.dir, "../src/workflow-ladder.csv"), "utf8");
|
|
40
|
+
const rows: CsvRow[] = [];
|
|
41
|
+
for (const line of csv.trim().split("\n").slice(1)) {
|
|
42
|
+
const [workItemType, fromState, toState, rule, skippedStates, owner, note] = line.split(",");
|
|
43
|
+
if (workItemType !== type) continue;
|
|
44
|
+
rows.push({ workItemType, fromState, toState, rule, skippedStates, owner, note });
|
|
45
|
+
}
|
|
46
|
+
return rows;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
async function authToken(): Promise<string> {
|
|
50
|
+
const raw = projectClient as unknown as { acquireAccessToken(): Promise<string> };
|
|
51
|
+
return raw.acquireAccessToken();
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
async function patchState(id: number, state: string): Promise<{ ok: boolean; status: number; message: string }> {
|
|
55
|
+
const token = await authToken();
|
|
56
|
+
const resp = await fetch(`${PROJECT_API}/wit/workitems/${id}?api-version=7.1`, {
|
|
57
|
+
method: "PATCH",
|
|
58
|
+
headers: { Authorization: `Bearer ${token}`, "Content-Type": "application/json-patch+json" },
|
|
59
|
+
body: JSON.stringify([{ op: "add", path: "/fields/System.State", value: state }]),
|
|
60
|
+
});
|
|
61
|
+
const text = await resp.text();
|
|
62
|
+
return { ok: resp.ok, status: resp.status, message: text.replace(/\s+/g, " ").slice(0, 200) };
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
async function currentState(id: number): Promise<string> {
|
|
66
|
+
const item = await projectClient.get<any>(`/wit/workitems/${id}`, { "api-version": "7.1" });
|
|
67
|
+
return item.fields?.["System.State"] ?? "?";
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// forward main line per the CSV's edges — allowed AND human-only edges both
|
|
71
|
+
// count for ordering: G1/G3 are fence-only, so ADO still permits them and
|
|
72
|
+
// the walk uses them to traverse (their rows are probed like any other).
|
|
73
|
+
function forwardOrder(rows: CsvRow[]): string[] {
|
|
74
|
+
const edges = new Map<string, string>();
|
|
75
|
+
for (const r of rows) {
|
|
76
|
+
if ((r.rule === "allowed" || r.rule === "human-only") && r.fromState !== r.toState && !edges.has(r.fromState)) {
|
|
77
|
+
edges.set(r.fromState, r.toState);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
const order: string[] = [];
|
|
81
|
+
let s = "New";
|
|
82
|
+
const guard = new Set<string>();
|
|
83
|
+
while (s && !guard.has(s)) {
|
|
84
|
+
guard.add(s);
|
|
85
|
+
order.push(s);
|
|
86
|
+
s = edges.get(s) ?? "";
|
|
87
|
+
}
|
|
88
|
+
return order;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// The forward main line in order — the walk's map. ADO permits the fence-only
|
|
92
|
+
// hops (G1 etc.) for this identity, so traversal may use every adjacent edge.
|
|
93
|
+
const MAIN = [
|
|
94
|
+
"New",
|
|
95
|
+
"In Planning",
|
|
96
|
+
"Awaiting Approval",
|
|
97
|
+
"Approved",
|
|
98
|
+
"Spec Validation",
|
|
99
|
+
"In Implementation",
|
|
100
|
+
"In Testing",
|
|
101
|
+
"In Review",
|
|
102
|
+
"Updating Docs",
|
|
103
|
+
"Done",
|
|
104
|
+
];
|
|
105
|
+
|
|
106
|
+
async function resetToNew(id: number): Promise<void> {
|
|
107
|
+
for (let i = 0; i < 6; i++) {
|
|
108
|
+
const here = await currentState(id);
|
|
109
|
+
if (here === "New") return;
|
|
110
|
+
await patchState(id, here === "Parked for Removal" ? "Removed" : "New");
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
async function walkTo(id: number, rows: CsvRow[], target: string): Promise<boolean> {
|
|
115
|
+
for (let guard = 0; guard < 30; guard++) {
|
|
116
|
+
const here = await currentState(id);
|
|
117
|
+
if (here === target) return true;
|
|
118
|
+
let next: string;
|
|
119
|
+
if (target === "Committed") next = "Committed"; // retired state: enter directly to probe its exits
|
|
120
|
+
else if (target === "Parked for Removal") next = "Parked for Removal"; // parkable from anywhere
|
|
121
|
+
else if (target === "Removed") next = here === "Parked for Removal" ? "Removed" : "Parked for Removal";
|
|
122
|
+
else if (here === "Parked for Removal" || here === "Removed") next = "New";
|
|
123
|
+
else if (MAIN.indexOf(here) === -1) return false; // retired/unknown — cannot walk
|
|
124
|
+
else {
|
|
125
|
+
const hi = MAIN.indexOf(here);
|
|
126
|
+
const ti = MAIN.indexOf(target);
|
|
127
|
+
next = hi < ti ? MAIN[hi + 1]! : "New";
|
|
128
|
+
}
|
|
129
|
+
const res = await patchState(id, next);
|
|
130
|
+
if (!res.ok) return false;
|
|
131
|
+
}
|
|
132
|
+
return false;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
async function probeState(id: number, rows: CsvRow[], state: string): Promise<void> {
|
|
136
|
+
for (let round = 0; round < 24; round++) {
|
|
137
|
+
if ((await currentState(id)) !== state) {
|
|
138
|
+
if (!(await walkTo(id, rows, state))) {
|
|
139
|
+
for (const r of rows.filter((x) => x.fromState === state && x.toState !== "Committed" && x.observed === undefined)) {
|
|
140
|
+
r.observed = `UNREACHED (could not return to "${state}")`;
|
|
141
|
+
}
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
continue;
|
|
145
|
+
}
|
|
146
|
+
// deferred: → Committed rows are probed in the epilogue (they can strand
|
|
147
|
+
// the walk in the ruleless retired state mid-pass)
|
|
148
|
+
const candidates = rows.filter(
|
|
149
|
+
(r) => r.fromState === state && r.toState !== "Committed" && r.observed === undefined && r.fromState !== r.toState
|
|
150
|
+
);
|
|
151
|
+
const refusedFirst = [
|
|
152
|
+
...candidates.filter((r) => r.rule !== "allowed" && r.rule !== "human-only"),
|
|
153
|
+
...candidates.filter((r) => r.rule === "allowed" || r.rule === "human-only"),
|
|
154
|
+
];
|
|
155
|
+
const next = refusedFirst[0];
|
|
156
|
+
if (!next) return; // all rows for this state probed
|
|
157
|
+
const res = await patchState(id, next.toState);
|
|
158
|
+
next.observed = res.ok ? "allowed" : `refused ${res.status}: ${res.message}`;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
function verdictClass(observed: string | undefined): string {
|
|
163
|
+
if (!observed) return "?";
|
|
164
|
+
if (observed.startsWith("allowed")) return "allowed";
|
|
165
|
+
if (observed.startsWith("refused")) return "refused";
|
|
166
|
+
if (observed.startsWith("identity")) return "identity";
|
|
167
|
+
return "unreached";
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
function report(name: string, rows: CsvRow[]) {
|
|
171
|
+
console.log(`\n---- ${name}: observed vs expected ----`);
|
|
172
|
+
const holes: string[] = []; // expected allowed but ADO refused → blocks real flow
|
|
173
|
+
const fenceOnly: string[] = []; // expected refused but ADO allows → our fence is the only guard
|
|
174
|
+
const unreached: string[] = [];
|
|
175
|
+
for (const r of rows) {
|
|
176
|
+
const obs = verdictClass(r.observed);
|
|
177
|
+
const exp = r.rule === "allowed" ? "allowed" : "refused";
|
|
178
|
+
let mark = "OK ";
|
|
179
|
+
if (obs === "unreached" || obs === "?") { mark = "?? "; unreached.push(`${r.fromState} → ${r.toState} (expected ${r.rule})`); }
|
|
180
|
+
else if (exp === "allowed" && obs !== "allowed") { mark = "!! "; holes.push(`${r.fromState} → ${r.toState}: expected allowed, ADO ${obs} — ${r.observed}`); }
|
|
181
|
+
else if (exp === "refused" && obs === "allowed") { mark = "!! "; fenceOnly.push(`${r.fromState} → ${r.toState} (expected ${r.rule})`); }
|
|
182
|
+
console.log(`${mark}${r.fromState.padEnd(18)} → ${r.toState.padEnd(18)} expected=${r.rule.padEnd(12)} observed=${r.observed ?? "?"}`);
|
|
183
|
+
}
|
|
184
|
+
console.log(`\nWHITE SPOTS (${name})`);
|
|
185
|
+
console.log(` blockers (expected allowed, ADO refused): ${holes.length}`);
|
|
186
|
+
for (const h of holes) console.log(` !! ${h}`);
|
|
187
|
+
console.log(` our-fence-only (expected refused, ADO allows — ADO cannot enforce against this identity): ${fenceOnly.length}`);
|
|
188
|
+
for (const f of fenceOnly) console.log(` ** ${f}`);
|
|
189
|
+
console.log(` unreached: ${unreached.length}`);
|
|
190
|
+
for (const u of unreached) console.log(` ?? ${u}`);
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
// ---- Phase A: read-only metadata ----------------------------------------
|
|
194
|
+
console.log("== Phase A: process metadata ==");
|
|
195
|
+
let processId: string | null = null;
|
|
196
|
+
try {
|
|
197
|
+
const processes = await orgClient.get<any>("/work/processes", { "api-version": "7.1" });
|
|
198
|
+
const list = processes.value ?? [];
|
|
199
|
+
const adl = list.find((p: any) => String(p.name ?? "").trim() === "ADL-Product");
|
|
200
|
+
processId = adl?.typeId ?? adl?.id ?? null;
|
|
201
|
+
console.log(`processes: ${list.map((p: any) => `${JSON.stringify(p.name)}(${p.id})`).join(", ")}`);
|
|
202
|
+
console.log(`ADL-Product id: ${processId ?? "NOT FOUND"}`);
|
|
203
|
+
} catch (e) {
|
|
204
|
+
console.log(`processes list unreadable: ${String(e).slice(0, 140)}`);
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
if (processId) {
|
|
208
|
+
let wits: any[] = [];
|
|
209
|
+
try {
|
|
210
|
+
const list = await orgClient.get<any>(`/work/processes/${processId}/workitemtypes`, { "api-version": "7.1" });
|
|
211
|
+
wits = list.value ?? [];
|
|
212
|
+
} catch (e) {
|
|
213
|
+
console.log(`workitemtypes unreadable: ${String(e).slice(0, 140)}`);
|
|
214
|
+
}
|
|
215
|
+
for (const name of ["Bug", "Product Backlog Item"]) {
|
|
216
|
+
const wit = wits.find((w: any) => String(w.name).trim() === name);
|
|
217
|
+
if (!wit) { console.log(`${name}: NOT in workitemtypes list`); continue; }
|
|
218
|
+
const ref = encodeURIComponent(wit.referenceName ?? wit.id ?? name);
|
|
219
|
+
try {
|
|
220
|
+
const states = await orgClient.get<any>(`/work/processes/${processId}/workitemtypes/${ref}/states`, { "api-version": "7.1" });
|
|
221
|
+
const names = (states.value ?? []).map((s: any) => `${s.name}${s.isDisabled ? " (disabled)" : ""}`);
|
|
222
|
+
console.log(`${name} states (${names.length}): ${names.join(" | ")}`);
|
|
223
|
+
} catch (e) {
|
|
224
|
+
console.log(`${name} states unreadable: ${String(e).slice(0, 120)}`);
|
|
225
|
+
}
|
|
226
|
+
for (const api of ["7.2-preview.1", "7.1"]) {
|
|
227
|
+
try {
|
|
228
|
+
const rules = await orgClient.get<any>(`/work/processes/${processId}/workitemtypes/${ref}/rules`, { "api-version": api });
|
|
229
|
+
const rs = rules.value ?? [];
|
|
230
|
+
console.log(`${name} rules (${api}): READABLE, ${rs.length}`);
|
|
231
|
+
for (const r of rs.slice(0, 24)) console.log(` - [${r.isDisabled ? "off" : "on"}] ${r.name}`);
|
|
232
|
+
break;
|
|
233
|
+
} catch (e) {
|
|
234
|
+
console.log(`${name} rules (${api}): ${String(e).slice(0, 80)}`);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
// ---- Phase B: empirical matrix probe of the operator-supplied item -------
|
|
241
|
+
if (METADATA_ONLY) {
|
|
242
|
+
console.log("\n(metadata-only: skipping empirical probe)");
|
|
243
|
+
} else try {
|
|
244
|
+
const item = await getItemAny(ITEM_ID);
|
|
245
|
+
const type: string = item.fields?.["System.WorkItemType"];
|
|
246
|
+
const startState: string = item.fields?.["System.State"];
|
|
247
|
+
console.log(`\n== Phase B: probing #${ITEM_ID} (${type}, started at "${startState}") ==`);
|
|
248
|
+
const rows = loadExpectations(type);
|
|
249
|
+
await resetToNew(ITEM_ID);
|
|
250
|
+
const probeTargets = [...MAIN, "Parked for Removal", "Removed"];
|
|
251
|
+
for (const state of probeTargets) {
|
|
252
|
+
await probeState(ITEM_ID, rows, state);
|
|
253
|
+
await resetToNew(ITEM_ID); // clean slate between states
|
|
254
|
+
}
|
|
255
|
+
// Epilogue: → Committed rows, then Committed exits (the retired state has
|
|
256
|
+
// no ADO rules, so entering/exiting behaves differently — probe it last,
|
|
257
|
+
// reset whenever the walk strands).
|
|
258
|
+
const parkedTargets = [...probeTargets, "Committed"];
|
|
259
|
+
for (const state of parkedTargets) {
|
|
260
|
+
const row = rows.find((r) => r.fromState === state && r.toState === "Committed" && r.observed === undefined);
|
|
261
|
+
if (!row) continue;
|
|
262
|
+
const reached = await walkTo(ITEM_ID, rows, state);
|
|
263
|
+
console.log(`(epilogue: at "${await currentState(ITEM_ID)}", probing ${state} → Committed — walk ${reached ? "ok" : "FAILED"})`);
|
|
264
|
+
if (reached) {
|
|
265
|
+
const res = await patchState(ITEM_ID, "Committed");
|
|
266
|
+
row.observed = res.ok ? "allowed" : `refused ${res.status}: ${res.message}`;
|
|
267
|
+
console.log(`(epilogue: ${state} → Committed observed=${row.observed.slice(0, 60)})`);
|
|
268
|
+
} else {
|
|
269
|
+
row.observed = `UNREACHED (could not reach "${state}")`;
|
|
270
|
+
}
|
|
271
|
+
await resetToNew(ITEM_ID);
|
|
272
|
+
}
|
|
273
|
+
// Committed exits: enter from Done (empirically reachable), probe each row,
|
|
274
|
+
// escaping to New after every successful move.
|
|
275
|
+
if (rows.some((r) => r.fromState === "Committed" && r.observed === undefined)) {
|
|
276
|
+
if (await walkTo(ITEM_ID, rows, "Done")) {
|
|
277
|
+
await patchState(ITEM_ID, "Committed");
|
|
278
|
+
for (let round = 0; round < 20; round++) {
|
|
279
|
+
if ((await currentState(ITEM_ID)) !== "Committed") {
|
|
280
|
+
const back = await patchState(ITEM_ID, "Committed");
|
|
281
|
+
if (!back.ok) break;
|
|
282
|
+
}
|
|
283
|
+
const next = rows.find((r) => r.fromState === "Committed" && r.observed === undefined && r.fromState !== r.toState);
|
|
284
|
+
if (!next) break;
|
|
285
|
+
const res = await patchState(ITEM_ID, next.toState);
|
|
286
|
+
next.observed = res.ok ? "allowed" : `refused ${res.status}: ${res.message}`;
|
|
287
|
+
}
|
|
288
|
+
} else {
|
|
289
|
+
for (const r of rows.filter((x) => x.fromState === "Committed" && x.observed === undefined)) {
|
|
290
|
+
r.observed = 'UNREACHED (could not reach "Done" to enter Committed)';
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
await resetToNew(ITEM_ID);
|
|
295
|
+
for (const r of rows.filter((x) => x.observed === undefined)) {
|
|
296
|
+
r.observed = "UNREACHED (state never visited)";
|
|
297
|
+
}
|
|
298
|
+
report(type, rows);
|
|
299
|
+
// restore
|
|
300
|
+
await resetToNew(ITEM_ID);
|
|
301
|
+
const finalState = await currentState(ITEM_ID);
|
|
302
|
+
console.log(finalState === startState
|
|
303
|
+
? `\nrestored: #${ITEM_ID} back at "${startState}"`
|
|
304
|
+
: `\n!! RESTORE INCOMPLETE: at "${finalState}", expected "${startState}"`);
|
|
305
|
+
} catch (e) {
|
|
306
|
+
console.log(`probe failed: ${String(e).slice(0, 240)}`);
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
async function getItemAny(id: number): Promise<any> {
|
|
310
|
+
return projectClient.get<any>(`/wit/workitems/${id}`, { "api-version": "7.1" });
|
|
311
|
+
}
|
|
@@ -21,11 +21,6 @@ async function getClient(): Promise<AdoClient> {
|
|
|
21
21
|
return client
|
|
22
22
|
}
|
|
23
23
|
|
|
24
|
-
/** Test seam: forget the cached client — see azdo-wit.ts's resetClientForTests() for why. */
|
|
25
|
-
export function resetClientForTests(): void {
|
|
26
|
-
client = undefined
|
|
27
|
-
}
|
|
28
|
-
|
|
29
24
|
/** GET a JSON payload. */
|
|
30
25
|
async function getJson<T>(c: AdoClient, path: string, params?: Record<string, string>): Promise<T> {
|
|
31
26
|
return c.get<T>(path, { 'api-version': '7.1', ...params });
|
|
@@ -182,9 +177,9 @@ export async function buildRun(args: BuildRunArgs): Promise<string> {
|
|
|
182
177
|
}, null, 2);
|
|
183
178
|
}
|
|
184
179
|
|
|
185
|
-
|
|
180
|
+
type BuildRunDetailArgs = { buildId: string; tail?: string | undefined };
|
|
186
181
|
|
|
187
|
-
|
|
182
|
+
async function buildGetRunDetail(args: BuildRunDetailArgs): Promise<string> {
|
|
188
183
|
const buildId = Number(args.buildId);
|
|
189
184
|
if (!Number.isInteger(buildId) || buildId < 1) throw new Error(`buildId must be a positive integer; got '${args.buildId}'`);
|
|
190
185
|
const c = await getClient()
|
|
@@ -226,50 +221,3 @@ export async function buildGetRunDetail(args: BuildRunDetailArgs): Promise<strin
|
|
|
226
221
|
failedTaskLogs,
|
|
227
222
|
}, null, 2);
|
|
228
223
|
}
|
|
229
|
-
|
|
230
|
-
export type BuildStageDetailArgs = { buildId: string; stageName: string; tail?: string };
|
|
231
|
-
|
|
232
|
-
export async function buildGetStageDetail(args: BuildStageDetailArgs): Promise<string> {
|
|
233
|
-
const buildId = Number(args.buildId);
|
|
234
|
-
const stageName = args.stageName;
|
|
235
|
-
const tail = args.tail ? parseInt(args.tail) : undefined;
|
|
236
|
-
if (!buildId || !stageName) {
|
|
237
|
-
throw new Error('--build-id and --stage-name are required');
|
|
238
|
-
}
|
|
239
|
-
const c = await getClient()
|
|
240
|
-
const timeline = await getJson<any>(c, `/build/builds/${buildId}/timeline`);
|
|
241
|
-
const stage = timeline.records.find((r: any) => r.type === 'Stage' && r.name === stageName);
|
|
242
|
-
if (!stage) {
|
|
243
|
-
throw new Error(`Stage '${stageName}' not found`);
|
|
244
|
-
}
|
|
245
|
-
const nodes = buildTree(timeline.records);
|
|
246
|
-
const root = nodes.get(stage.id)!;
|
|
247
|
-
sortTree(root);
|
|
248
|
-
const failures = failedTasks(root);
|
|
249
|
-
|
|
250
|
-
let failedTaskLogs: Array<Record<string, unknown>> | undefined;
|
|
251
|
-
if (tail) {
|
|
252
|
-
failedTaskLogs = [];
|
|
253
|
-
const collect = async (node: TimelineNode): Promise<void> => {
|
|
254
|
-
if (node.type === 'Task' && node.result === 'failed' && node.logId != null) {
|
|
255
|
-
const lines = (await getText(c, `/build/builds/${buildId}/logs/${node.logId}`))
|
|
256
|
-
.split('\n')
|
|
257
|
-
.map((line) => line.replace(/\r/g, '').trim())
|
|
258
|
-
.filter(Boolean);
|
|
259
|
-
failedTaskLogs!.push({ task: node.name, logId: node.logId, tail: lines.slice(-tail) });
|
|
260
|
-
}
|
|
261
|
-
for (const child of node.children) await collect(child);
|
|
262
|
-
};
|
|
263
|
-
await collect(root);
|
|
264
|
-
}
|
|
265
|
-
|
|
266
|
-
return JSON.stringify({
|
|
267
|
-
stageName: root.name,
|
|
268
|
-
state: root.state,
|
|
269
|
-
result: root.result,
|
|
270
|
-
stage: root,
|
|
271
|
-
failedTaskCount: failures.length,
|
|
272
|
-
failures,
|
|
273
|
-
failedTaskLogs,
|
|
274
|
-
}, null, 2);
|
|
275
|
-
}
|
|
@@ -64,19 +64,19 @@ export type VoteName = keyof typeof VOTE_VALUES;
|
|
|
64
64
|
export const VOTE_NAMES = Object.keys(VOTE_VALUES) as readonly VoteName[];
|
|
65
65
|
|
|
66
66
|
/** Row 8's exact text — the hook (adl-pr-review-role.ts) uses the identical string; kept in sync by the shared test corpus, not by import (agent-hooks does not depend on this package). */
|
|
67
|
-
|
|
67
|
+
const NO_VOTE_GATE_ON_INTEGRATION_MESSAGE =
|
|
68
68
|
'no vote gate on integration — CI + auto-complete only, no human or agent review there';
|
|
69
69
|
|
|
70
70
|
/** Row 7's exact text. */
|
|
71
|
-
|
|
71
|
+
function voteRoleDeniedMessage(agent: string): string {
|
|
72
72
|
return `human approval gate — an agent vote does not substitute for Tarun's or Vivek's own review (docs/operations/agent-permissions.md row 7); '${agent}' may still comment`;
|
|
73
73
|
}
|
|
74
74
|
|
|
75
|
-
|
|
75
|
+
function targetBranchRequiredMessage(): string {
|
|
76
76
|
return "vote requires targetBranch (the pull request's real target branch) — refusing rather than casting a vote on a PR this call never named";
|
|
77
77
|
}
|
|
78
78
|
|
|
79
|
-
|
|
79
|
+
function targetBranchMismatchMessage(claimed: string, actual: string): string {
|
|
80
80
|
return `targetBranch '${claimed}' does not match this pull request's real target '${actual}' — refusing rather than trusting a stale or wrong claim`;
|
|
81
81
|
}
|
|
82
82
|
|