@oddessentials/odd-ai-reviewers 1.0.0
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/README.md +190 -0
- package/dist/__tests__/hermetic-setup.d.ts +55 -0
- package/dist/__tests__/hermetic-setup.d.ts.map +1 -0
- package/dist/__tests__/hermetic-setup.js +62 -0
- package/dist/__tests__/hermetic-setup.js.map +1 -0
- package/dist/__tests__/test-utils/hermetic.d.ts +84 -0
- package/dist/__tests__/test-utils/hermetic.d.ts.map +1 -0
- package/dist/__tests__/test-utils/hermetic.js +147 -0
- package/dist/__tests__/test-utils/hermetic.js.map +1 -0
- package/dist/agents/ai_semantic_review.d.ts +12 -0
- package/dist/agents/ai_semantic_review.d.ts.map +1 -0
- package/dist/agents/ai_semantic_review.js +317 -0
- package/dist/agents/ai_semantic_review.js.map +1 -0
- package/dist/agents/control_flow/budget.d.ts +162 -0
- package/dist/agents/control_flow/budget.d.ts.map +1 -0
- package/dist/agents/control_flow/budget.js +331 -0
- package/dist/agents/control_flow/budget.js.map +1 -0
- package/dist/agents/control_flow/cfg-builder.d.ts +26 -0
- package/dist/agents/control_flow/cfg-builder.d.ts.map +1 -0
- package/dist/agents/control_flow/cfg-builder.js +776 -0
- package/dist/agents/control_flow/cfg-builder.js.map +1 -0
- package/dist/agents/control_flow/cfg-types.d.ts +186 -0
- package/dist/agents/control_flow/cfg-types.d.ts.map +1 -0
- package/dist/agents/control_flow/cfg-types.js +114 -0
- package/dist/agents/control_flow/cfg-types.js.map +1 -0
- package/dist/agents/control_flow/finding-generator.d.ts +118 -0
- package/dist/agents/control_flow/finding-generator.d.ts.map +1 -0
- package/dist/agents/control_flow/finding-generator.js +354 -0
- package/dist/agents/control_flow/finding-generator.js.map +1 -0
- package/dist/agents/control_flow/index.d.ts +39 -0
- package/dist/agents/control_flow/index.d.ts.map +1 -0
- package/dist/agents/control_flow/index.js +270 -0
- package/dist/agents/control_flow/index.js.map +1 -0
- package/dist/agents/control_flow/logger.d.ts +333 -0
- package/dist/agents/control_flow/logger.d.ts.map +1 -0
- package/dist/agents/control_flow/logger.js +607 -0
- package/dist/agents/control_flow/logger.js.map +1 -0
- package/dist/agents/control_flow/mitigation-detector.d.ts +207 -0
- package/dist/agents/control_flow/mitigation-detector.d.ts.map +1 -0
- package/dist/agents/control_flow/mitigation-detector.js +625 -0
- package/dist/agents/control_flow/mitigation-detector.js.map +1 -0
- package/dist/agents/control_flow/mitigation-patterns.d.ts +53 -0
- package/dist/agents/control_flow/mitigation-patterns.d.ts.map +1 -0
- package/dist/agents/control_flow/mitigation-patterns.js +620 -0
- package/dist/agents/control_flow/mitigation-patterns.js.map +1 -0
- package/dist/agents/control_flow/path-analyzer.d.ts +287 -0
- package/dist/agents/control_flow/path-analyzer.d.ts.map +1 -0
- package/dist/agents/control_flow/path-analyzer.js +695 -0
- package/dist/agents/control_flow/path-analyzer.js.map +1 -0
- package/dist/agents/control_flow/pattern-validator.d.ts +132 -0
- package/dist/agents/control_flow/pattern-validator.d.ts.map +1 -0
- package/dist/agents/control_flow/pattern-validator.js +420 -0
- package/dist/agents/control_flow/pattern-validator.js.map +1 -0
- package/dist/agents/control_flow/timeout-regex.d.ts +144 -0
- package/dist/agents/control_flow/timeout-regex.d.ts.map +1 -0
- package/dist/agents/control_flow/timeout-regex.js +339 -0
- package/dist/agents/control_flow/timeout-regex.js.map +1 -0
- package/dist/agents/control_flow/types.d.ts +782 -0
- package/dist/agents/control_flow/types.d.ts.map +1 -0
- package/dist/agents/control_flow/types.js +428 -0
- package/dist/agents/control_flow/types.js.map +1 -0
- package/dist/agents/control_flow/vulnerability-detector.d.ts +85 -0
- package/dist/agents/control_flow/vulnerability-detector.d.ts.map +1 -0
- package/dist/agents/control_flow/vulnerability-detector.js +493 -0
- package/dist/agents/control_flow/vulnerability-detector.js.map +1 -0
- package/dist/agents/date-utils.d.ts +19 -0
- package/dist/agents/date-utils.d.ts.map +1 -0
- package/dist/agents/date-utils.js +29 -0
- package/dist/agents/date-utils.js.map +1 -0
- package/dist/agents/index.d.ts +25 -0
- package/dist/agents/index.d.ts.map +1 -0
- package/dist/agents/index.js +50 -0
- package/dist/agents/index.js.map +1 -0
- package/dist/agents/json-utils.d.ts +34 -0
- package/dist/agents/json-utils.d.ts.map +1 -0
- package/dist/agents/json-utils.js +62 -0
- package/dist/agents/json-utils.js.map +1 -0
- package/dist/agents/local_llm.d.ts +24 -0
- package/dist/agents/local_llm.d.ts.map +1 -0
- package/dist/agents/local_llm.js +566 -0
- package/dist/agents/local_llm.js.map +1 -0
- package/dist/agents/metadata.d.ts +57 -0
- package/dist/agents/metadata.d.ts.map +1 -0
- package/dist/agents/metadata.js +45 -0
- package/dist/agents/metadata.js.map +1 -0
- package/dist/agents/opencode.d.ts +18 -0
- package/dist/agents/opencode.d.ts.map +1 -0
- package/dist/agents/opencode.js +364 -0
- package/dist/agents/opencode.js.map +1 -0
- package/dist/agents/path-filter.d.ts +25 -0
- package/dist/agents/path-filter.d.ts.map +1 -0
- package/dist/agents/path-filter.js +43 -0
- package/dist/agents/path-filter.js.map +1 -0
- package/dist/agents/pr_agent.d.ts +3 -0
- package/dist/agents/pr_agent.d.ts.map +1 -0
- package/dist/agents/pr_agent.js +312 -0
- package/dist/agents/pr_agent.js.map +1 -0
- package/dist/agents/retry.d.ts +12 -0
- package/dist/agents/retry.d.ts.map +1 -0
- package/dist/agents/retry.js +65 -0
- package/dist/agents/retry.js.map +1 -0
- package/dist/agents/reviewdog.d.ts +24 -0
- package/dist/agents/reviewdog.d.ts.map +1 -0
- package/dist/agents/reviewdog.js +259 -0
- package/dist/agents/reviewdog.js.map +1 -0
- package/dist/agents/security.d.ts +49 -0
- package/dist/agents/security.d.ts.map +1 -0
- package/dist/agents/security.js +302 -0
- package/dist/agents/security.js.map +1 -0
- package/dist/agents/semgrep.d.ts +8 -0
- package/dist/agents/semgrep.d.ts.map +1 -0
- package/dist/agents/semgrep.js +157 -0
- package/dist/agents/semgrep.js.map +1 -0
- package/dist/agents/types.d.ts +450 -0
- package/dist/agents/types.d.ts.map +1 -0
- package/dist/agents/types.js +127 -0
- package/dist/agents/types.js.map +1 -0
- package/dist/budget.d.ts +59 -0
- package/dist/budget.d.ts.map +1 -0
- package/dist/budget.js +82 -0
- package/dist/budget.js.map +1 -0
- package/dist/cache/key.d.ts +49 -0
- package/dist/cache/key.d.ts.map +1 -0
- package/dist/cache/key.js +71 -0
- package/dist/cache/key.js.map +1 -0
- package/dist/cache/store.d.ts +47 -0
- package/dist/cache/store.d.ts.map +1 -0
- package/dist/cache/store.js +328 -0
- package/dist/cache/store.js.map +1 -0
- package/dist/cli/commands/check.d.ts +60 -0
- package/dist/cli/commands/check.d.ts.map +1 -0
- package/dist/cli/commands/check.js +163 -0
- package/dist/cli/commands/check.js.map +1 -0
- package/dist/cli/commands/index.d.ts +12 -0
- package/dist/cli/commands/index.d.ts.map +1 -0
- package/dist/cli/commands/index.js +12 -0
- package/dist/cli/commands/index.js.map +1 -0
- package/dist/cli/commands/local-review.d.ts +149 -0
- package/dist/cli/commands/local-review.d.ts.map +1 -0
- package/dist/cli/commands/local-review.js +755 -0
- package/dist/cli/commands/local-review.js.map +1 -0
- package/dist/cli/config-wizard.d.ts +87 -0
- package/dist/cli/config-wizard.d.ts.map +1 -0
- package/dist/cli/config-wizard.js +240 -0
- package/dist/cli/config-wizard.js.map +1 -0
- package/dist/cli/dependencies/catalog.d.ts +44 -0
- package/dist/cli/dependencies/catalog.d.ts.map +1 -0
- package/dist/cli/dependencies/catalog.js +89 -0
- package/dist/cli/dependencies/catalog.js.map +1 -0
- package/dist/cli/dependencies/checker.d.ts +42 -0
- package/dist/cli/dependencies/checker.d.ts.map +1 -0
- package/dist/cli/dependencies/checker.js +240 -0
- package/dist/cli/dependencies/checker.js.map +1 -0
- package/dist/cli/dependencies/index.d.ts +16 -0
- package/dist/cli/dependencies/index.d.ts.map +1 -0
- package/dist/cli/dependencies/index.js +16 -0
- package/dist/cli/dependencies/index.js.map +1 -0
- package/dist/cli/dependencies/messages.d.ts +58 -0
- package/dist/cli/dependencies/messages.d.ts.map +1 -0
- package/dist/cli/dependencies/messages.js +183 -0
- package/dist/cli/dependencies/messages.js.map +1 -0
- package/dist/cli/dependencies/platform.d.ts +25 -0
- package/dist/cli/dependencies/platform.d.ts.map +1 -0
- package/dist/cli/dependencies/platform.js +42 -0
- package/dist/cli/dependencies/platform.js.map +1 -0
- package/dist/cli/dependencies/schemas.d.ts +65 -0
- package/dist/cli/dependencies/schemas.d.ts.map +1 -0
- package/dist/cli/dependencies/schemas.js +42 -0
- package/dist/cli/dependencies/schemas.js.map +1 -0
- package/dist/cli/dependencies/types.d.ts +112 -0
- package/dist/cli/dependencies/types.d.ts.map +1 -0
- package/dist/cli/dependencies/types.js +6 -0
- package/dist/cli/dependencies/types.js.map +1 -0
- package/dist/cli/dependencies/version.d.ts +67 -0
- package/dist/cli/dependencies/version.d.ts.map +1 -0
- package/dist/cli/dependencies/version.js +125 -0
- package/dist/cli/dependencies/version.js.map +1 -0
- package/dist/cli/git-context.d.ts +105 -0
- package/dist/cli/git-context.d.ts.map +1 -0
- package/dist/cli/git-context.js +313 -0
- package/dist/cli/git-context.js.map +1 -0
- package/dist/cli/interactive-prompts.d.ts +126 -0
- package/dist/cli/interactive-prompts.d.ts.map +1 -0
- package/dist/cli/interactive-prompts.js +128 -0
- package/dist/cli/interactive-prompts.js.map +1 -0
- package/dist/cli/options/index.d.ts +7 -0
- package/dist/cli/options/index.d.ts.map +1 -0
- package/dist/cli/options/index.js +11 -0
- package/dist/cli/options/index.js.map +1 -0
- package/dist/cli/options/local-review-options.d.ts +221 -0
- package/dist/cli/options/local-review-options.d.ts.map +1 -0
- package/dist/cli/options/local-review-options.js +332 -0
- package/dist/cli/options/local-review-options.js.map +1 -0
- package/dist/cli/output/colors.d.ts +154 -0
- package/dist/cli/output/colors.d.ts.map +1 -0
- package/dist/cli/output/colors.js +255 -0
- package/dist/cli/output/colors.js.map +1 -0
- package/dist/cli/output/errors.d.ts +157 -0
- package/dist/cli/output/errors.d.ts.map +1 -0
- package/dist/cli/output/errors.js +266 -0
- package/dist/cli/output/errors.js.map +1 -0
- package/dist/cli/output/index.d.ts +12 -0
- package/dist/cli/output/index.d.ts.map +1 -0
- package/dist/cli/output/index.js +15 -0
- package/dist/cli/output/index.js.map +1 -0
- package/dist/cli/output/progress.d.ts +237 -0
- package/dist/cli/output/progress.d.ts.map +1 -0
- package/dist/cli/output/progress.js +405 -0
- package/dist/cli/output/progress.js.map +1 -0
- package/dist/cli/signals.d.ts +145 -0
- package/dist/cli/signals.d.ts.map +1 -0
- package/dist/cli/signals.js +223 -0
- package/dist/cli/signals.js.map +1 -0
- package/dist/cli/validation-report.d.ts +106 -0
- package/dist/cli/validation-report.d.ts.map +1 -0
- package/dist/cli/validation-report.js +108 -0
- package/dist/cli/validation-report.js.map +1 -0
- package/dist/config/index.d.ts +9 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +12 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/mitigation-config.d.ts +94 -0
- package/dist/config/mitigation-config.d.ts.map +1 -0
- package/dist/config/mitigation-config.js +430 -0
- package/dist/config/mitigation-config.js.map +1 -0
- package/dist/config/providers.d.ts +118 -0
- package/dist/config/providers.d.ts.map +1 -0
- package/dist/config/providers.js +229 -0
- package/dist/config/providers.js.map +1 -0
- package/dist/config/schemas.d.ts +278 -0
- package/dist/config/schemas.d.ts.map +1 -0
- package/dist/config/schemas.js +111 -0
- package/dist/config/schemas.js.map +1 -0
- package/dist/config/zero-config.d.ts +126 -0
- package/dist/config/zero-config.d.ts.map +1 -0
- package/dist/config/zero-config.js +243 -0
- package/dist/config/zero-config.js.map +1 -0
- package/dist/config.d.ts +110 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +302 -0
- package/dist/config.js.map +1 -0
- package/dist/diff.d.ts +224 -0
- package/dist/diff.d.ts.map +1 -0
- package/dist/diff.js +832 -0
- package/dist/diff.js.map +1 -0
- package/dist/git-validators.d.ts +106 -0
- package/dist/git-validators.d.ts.map +1 -0
- package/dist/git-validators.js +224 -0
- package/dist/git-validators.js.map +1 -0
- package/dist/main.d.ts +61 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +704 -0
- package/dist/main.js.map +1 -0
- package/dist/phases/execute.d.ts +60 -0
- package/dist/phases/execute.d.ts.map +1 -0
- package/dist/phases/execute.js +168 -0
- package/dist/phases/execute.js.map +1 -0
- package/dist/phases/index.d.ts +9 -0
- package/dist/phases/index.d.ts.map +1 -0
- package/dist/phases/index.js +9 -0
- package/dist/phases/index.js.map +1 -0
- package/dist/phases/preflight.d.ts +40 -0
- package/dist/phases/preflight.d.ts.map +1 -0
- package/dist/phases/preflight.js +122 -0
- package/dist/phases/preflight.js.map +1 -0
- package/dist/phases/report.d.ts +51 -0
- package/dist/phases/report.d.ts.map +1 -0
- package/dist/phases/report.js +152 -0
- package/dist/phases/report.js.map +1 -0
- package/dist/policy.d.ts +33 -0
- package/dist/policy.d.ts.map +1 -0
- package/dist/policy.js +34 -0
- package/dist/policy.js.map +1 -0
- package/dist/preflight.d.ts +181 -0
- package/dist/preflight.d.ts.map +1 -0
- package/dist/preflight.js +627 -0
- package/dist/preflight.js.map +1 -0
- package/dist/report/ado.d.ts +53 -0
- package/dist/report/ado.d.ts.map +1 -0
- package/dist/report/ado.js +411 -0
- package/dist/report/ado.js.map +1 -0
- package/dist/report/agent-icons.d.ts +36 -0
- package/dist/report/agent-icons.d.ts.map +1 -0
- package/dist/report/agent-icons.js +46 -0
- package/dist/report/agent-icons.js.map +1 -0
- package/dist/report/base.d.ts +30 -0
- package/dist/report/base.d.ts.map +1 -0
- package/dist/report/base.js +64 -0
- package/dist/report/base.js.map +1 -0
- package/dist/report/formats.d.ts +206 -0
- package/dist/report/formats.d.ts.map +1 -0
- package/dist/report/formats.js +481 -0
- package/dist/report/formats.js.map +1 -0
- package/dist/report/github.d.ts +44 -0
- package/dist/report/github.d.ts.map +1 -0
- package/dist/report/github.js +409 -0
- package/dist/report/github.js.map +1 -0
- package/dist/report/line-resolver.d.ts +208 -0
- package/dist/report/line-resolver.d.ts.map +1 -0
- package/dist/report/line-resolver.js +578 -0
- package/dist/report/line-resolver.js.map +1 -0
- package/dist/report/resolution.d.ts +158 -0
- package/dist/report/resolution.d.ts.map +1 -0
- package/dist/report/resolution.js +272 -0
- package/dist/report/resolution.js.map +1 -0
- package/dist/report/sanitize.d.ts +32 -0
- package/dist/report/sanitize.d.ts.map +1 -0
- package/dist/report/sanitize.js +84 -0
- package/dist/report/sanitize.js.map +1 -0
- package/dist/report/terminal.d.ts +440 -0
- package/dist/report/terminal.d.ts.map +1 -0
- package/dist/report/terminal.js +840 -0
- package/dist/report/terminal.js.map +1 -0
- package/dist/reviewignore.d.ts +125 -0
- package/dist/reviewignore.d.ts.map +1 -0
- package/dist/reviewignore.js +335 -0
- package/dist/reviewignore.js.map +1 -0
- package/dist/security-logger.d.ts +178 -0
- package/dist/security-logger.d.ts.map +1 -0
- package/dist/security-logger.js +256 -0
- package/dist/security-logger.js.map +1 -0
- package/dist/telemetry/backends/console.d.ts +24 -0
- package/dist/telemetry/backends/console.d.ts.map +1 -0
- package/dist/telemetry/backends/console.js +54 -0
- package/dist/telemetry/backends/console.js.map +1 -0
- package/dist/telemetry/backends/jsonl.d.ts +31 -0
- package/dist/telemetry/backends/jsonl.d.ts.map +1 -0
- package/dist/telemetry/backends/jsonl.js +121 -0
- package/dist/telemetry/backends/jsonl.js.map +1 -0
- package/dist/telemetry/emitter.d.ts +43 -0
- package/dist/telemetry/emitter.d.ts.map +1 -0
- package/dist/telemetry/emitter.js +83 -0
- package/dist/telemetry/emitter.js.map +1 -0
- package/dist/telemetry/hook.d.ts +53 -0
- package/dist/telemetry/hook.d.ts.map +1 -0
- package/dist/telemetry/hook.js +118 -0
- package/dist/telemetry/hook.js.map +1 -0
- package/dist/telemetry/index.d.ts +58 -0
- package/dist/telemetry/index.d.ts.map +1 -0
- package/dist/telemetry/index.js +143 -0
- package/dist/telemetry/index.js.map +1 -0
- package/dist/telemetry/types.d.ts +139 -0
- package/dist/telemetry/types.d.ts.map +1 -0
- package/dist/telemetry/types.js +133 -0
- package/dist/telemetry/types.js.map +1 -0
- package/dist/trust.d.ts +65 -0
- package/dist/trust.d.ts.map +1 -0
- package/dist/trust.js +78 -0
- package/dist/trust.js.map +1 -0
- package/dist/types/assert-never.d.ts +30 -0
- package/dist/types/assert-never.d.ts.map +1 -0
- package/dist/types/assert-never.js +32 -0
- package/dist/types/assert-never.js.map +1 -0
- package/dist/types/branded.d.ts +172 -0
- package/dist/types/branded.d.ts.map +1 -0
- package/dist/types/branded.js +262 -0
- package/dist/types/branded.js.map +1 -0
- package/dist/types/errors.d.ts +320 -0
- package/dist/types/errors.d.ts.map +1 -0
- package/dist/types/errors.js +551 -0
- package/dist/types/errors.js.map +1 -0
- package/dist/types/index.d.ts +37 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +77 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/result.d.ts +323 -0
- package/dist/types/result.d.ts.map +1 -0
- package/dist/types/result.js +423 -0
- package/dist/types/result.js.map +1 -0
- package/package.json +63 -0
package/README.md
ADDED
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
# @oddessentials/odd-ai-reviewers
|
|
2
|
+
|
|
3
|
+
AI-powered code review CLI that runs locally or in CI/CD pipelines. Get instant feedback on your code changes using LLMs like GPT-4 and Claude.
|
|
4
|
+
|
|
5
|
+
## Quick Start
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
# Run local review on current changes
|
|
9
|
+
npx @oddessentials/odd-ai-reviewers .
|
|
10
|
+
|
|
11
|
+
# Or install globally
|
|
12
|
+
npm install -g @oddessentials/odd-ai-reviewers
|
|
13
|
+
ai-review .
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
## Features
|
|
17
|
+
|
|
18
|
+
- **Local Review Mode**: Get instant AI feedback before pushing
|
|
19
|
+
- **CI/CD Integration**: GitHub Actions and Azure DevOps support
|
|
20
|
+
- **Zero Configuration**: Works out of the box with sensible defaults
|
|
21
|
+
- **Multiple AI Providers**: OpenAI, Anthropic, Azure OpenAI, Ollama
|
|
22
|
+
- **Cost Control**: Built-in budget limits and cost estimation
|
|
23
|
+
- **Customizable**: Configure passes, agents, and output formats
|
|
24
|
+
|
|
25
|
+
## Prerequisites
|
|
26
|
+
|
|
27
|
+
- Node.js >= 22.0.0
|
|
28
|
+
- Git
|
|
29
|
+
- API key for your preferred AI provider
|
|
30
|
+
|
|
31
|
+
## Environment Variables
|
|
32
|
+
|
|
33
|
+
Set one of these API keys:
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
# OpenAI
|
|
37
|
+
export OPENAI_API_KEY=sk-...
|
|
38
|
+
|
|
39
|
+
# Anthropic
|
|
40
|
+
export ANTHROPIC_API_KEY=sk-ant-...
|
|
41
|
+
|
|
42
|
+
# Azure OpenAI
|
|
43
|
+
export AZURE_OPENAI_API_KEY=...
|
|
44
|
+
export AZURE_OPENAI_ENDPOINT=https://...
|
|
45
|
+
export AZURE_OPENAI_DEPLOYMENT=...
|
|
46
|
+
|
|
47
|
+
# Ollama (local)
|
|
48
|
+
export OLLAMA_BASE_URL=http://localhost:11434
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## Usage
|
|
52
|
+
|
|
53
|
+
### Local Review (Recommended for Development)
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
# Review uncommitted changes
|
|
57
|
+
ai-review .
|
|
58
|
+
|
|
59
|
+
# Review only staged changes (for pre-commit hooks)
|
|
60
|
+
ai-review . --staged
|
|
61
|
+
|
|
62
|
+
# Review changes between current branch and main
|
|
63
|
+
ai-review . --base main
|
|
64
|
+
|
|
65
|
+
# Dry run - see what would be reviewed
|
|
66
|
+
ai-review . --dry-run
|
|
67
|
+
|
|
68
|
+
# Cost estimate only
|
|
69
|
+
ai-review . --cost-only
|
|
70
|
+
|
|
71
|
+
# JSON output for tooling integration
|
|
72
|
+
ai-review . --format json
|
|
73
|
+
|
|
74
|
+
# SARIF output for IDE integration
|
|
75
|
+
ai-review . --format sarif
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
### CI Review Mode
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
# Review a specific commit range
|
|
82
|
+
ai-review review --repo . --base $BASE_SHA --head $HEAD_SHA
|
|
83
|
+
|
|
84
|
+
# With PR number for GitHub integration
|
|
85
|
+
ai-review review --repo . --base $BASE_SHA --head $HEAD_SHA --pr 123
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### Configuration
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
# Generate a new configuration file
|
|
92
|
+
ai-review config init
|
|
93
|
+
|
|
94
|
+
# Validate existing configuration
|
|
95
|
+
ai-review validate --repo .
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
## Configuration File
|
|
99
|
+
|
|
100
|
+
Create `.ai-review.yml` in your repository root:
|
|
101
|
+
|
|
102
|
+
```yaml
|
|
103
|
+
# AI Provider configuration
|
|
104
|
+
provider: openai
|
|
105
|
+
|
|
106
|
+
# Model selection
|
|
107
|
+
models:
|
|
108
|
+
default: gpt-4o-mini
|
|
109
|
+
|
|
110
|
+
# Review passes
|
|
111
|
+
passes:
|
|
112
|
+
- name: ai-review
|
|
113
|
+
enabled: true
|
|
114
|
+
agents:
|
|
115
|
+
- opencode
|
|
116
|
+
|
|
117
|
+
# Resource limits
|
|
118
|
+
limits:
|
|
119
|
+
max_files: 50
|
|
120
|
+
max_diff_lines: 5000
|
|
121
|
+
max_usd_per_pr: 0.50
|
|
122
|
+
|
|
123
|
+
# Gating (fail CI on findings)
|
|
124
|
+
gating:
|
|
125
|
+
enabled: true
|
|
126
|
+
fail_on_severity: error
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
## CLI Reference
|
|
130
|
+
|
|
131
|
+
### `ai-review local [path]`
|
|
132
|
+
|
|
133
|
+
Run AI review on local changes.
|
|
134
|
+
|
|
135
|
+
| Option | Description |
|
|
136
|
+
| ----------------- | --------------------------------------------- |
|
|
137
|
+
| `--base <ref>` | Base reference for comparison (auto-detected) |
|
|
138
|
+
| `--head <ref>` | Head reference (default: HEAD) |
|
|
139
|
+
| `--range <range>` | Git range (e.g., HEAD~3..) |
|
|
140
|
+
| `--staged` | Review only staged changes |
|
|
141
|
+
| `--uncommitted` | Include uncommitted changes (default: true) |
|
|
142
|
+
| `--pass <name>` | Run specific pass only |
|
|
143
|
+
| `--agent <id>` | Run specific agent only |
|
|
144
|
+
| `--format <fmt>` | Output format: pretty, json, sarif |
|
|
145
|
+
| `--no-color` | Disable colored output |
|
|
146
|
+
| `--quiet` | Minimal output (errors only) |
|
|
147
|
+
| `--verbose` | Show debug information |
|
|
148
|
+
| `--dry-run` | Preview without running agents |
|
|
149
|
+
| `--cost-only` | Estimate cost without running |
|
|
150
|
+
| `-c, --config` | Path to config file |
|
|
151
|
+
|
|
152
|
+
### Exit Codes
|
|
153
|
+
|
|
154
|
+
| Code | Meaning |
|
|
155
|
+
| ---- | ---------------------------------------------- |
|
|
156
|
+
| 0 | Success (no blocking findings) |
|
|
157
|
+
| 1 | Failure (blocking findings or execution error) |
|
|
158
|
+
| 2 | Invalid arguments or configuration |
|
|
159
|
+
|
|
160
|
+
## Pre-commit Hook Integration
|
|
161
|
+
|
|
162
|
+
Add to `.pre-commit-config.yaml`:
|
|
163
|
+
|
|
164
|
+
```yaml
|
|
165
|
+
repos:
|
|
166
|
+
- repo: local
|
|
167
|
+
hooks:
|
|
168
|
+
- id: ai-review
|
|
169
|
+
name: AI Code Review
|
|
170
|
+
entry: npx @oddessentials/odd-ai-reviewers . --staged --quiet
|
|
171
|
+
language: system
|
|
172
|
+
pass_filenames: false
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
Or use with Husky:
|
|
176
|
+
|
|
177
|
+
```bash
|
|
178
|
+
# .husky/pre-commit
|
|
179
|
+
npx @oddessentials/odd-ai-reviewers . --staged --quiet || exit 1
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
## Changelog
|
|
183
|
+
|
|
184
|
+
This package uses [semantic-release](https://semantic-release.gitbook.io/) for automated versioning and changelog generation. The changelog is auto-generated from conventional commit messages.
|
|
185
|
+
|
|
186
|
+
See [CHANGELOG.md](./CHANGELOG.md) for the full release history.
|
|
187
|
+
|
|
188
|
+
## License
|
|
189
|
+
|
|
190
|
+
MIT
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hermetic Test Setup Utilities
|
|
3
|
+
*
|
|
4
|
+
* Shared test infrastructure for deterministic, isolated tests.
|
|
5
|
+
* Located in __tests__/ directory which is classified as test code
|
|
6
|
+
* by dependency-cruiser, allowing legitimate vitest imports.
|
|
7
|
+
*
|
|
8
|
+
* Provides:
|
|
9
|
+
* - Frozen time (no wall-clock dependencies)
|
|
10
|
+
* - Deterministic teardown
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```typescript
|
|
14
|
+
* import { describe, it, beforeEach, afterEach } from 'vitest';
|
|
15
|
+
* import {
|
|
16
|
+
* FROZEN_TIMESTAMP,
|
|
17
|
+
* setupHermeticTest,
|
|
18
|
+
* teardownHermeticTest,
|
|
19
|
+
* } from '../hermetic-setup.js';
|
|
20
|
+
*
|
|
21
|
+
* describe('MyFeature', () => {
|
|
22
|
+
* beforeEach(() => setupHermeticTest());
|
|
23
|
+
* afterEach(() => teardownHermeticTest());
|
|
24
|
+
*
|
|
25
|
+
* it('works with frozen time', () => {
|
|
26
|
+
* expect(new Date().toISOString()).toBe(FROZEN_TIMESTAMP);
|
|
27
|
+
* });
|
|
28
|
+
* });
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
/**
|
|
32
|
+
* Frozen test timestamp - use consistently across all hermetic tests
|
|
33
|
+
*/
|
|
34
|
+
export declare const FROZEN_TIMESTAMP = "2026-01-29T00:00:00.000Z";
|
|
35
|
+
export declare const FROZEN_DATE: Date;
|
|
36
|
+
/**
|
|
37
|
+
* Setup hermetic test environment
|
|
38
|
+
*
|
|
39
|
+
* Configures:
|
|
40
|
+
* - Frozen system time to FROZEN_TIMESTAMP
|
|
41
|
+
*
|
|
42
|
+
* Call this in beforeEach()
|
|
43
|
+
*/
|
|
44
|
+
export declare function setupHermeticTest(): void;
|
|
45
|
+
/**
|
|
46
|
+
* Teardown hermetic test environment
|
|
47
|
+
*
|
|
48
|
+
* Restores:
|
|
49
|
+
* - Real system time
|
|
50
|
+
* - All mocks
|
|
51
|
+
*
|
|
52
|
+
* Call this in afterEach()
|
|
53
|
+
*/
|
|
54
|
+
export declare function teardownHermeticTest(): void;
|
|
55
|
+
//# sourceMappingURL=hermetic-setup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hermetic-setup.d.ts","sourceRoot":"","sources":["../../src/__tests__/hermetic-setup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAIH;;GAEG;AACH,eAAO,MAAM,gBAAgB,6BAA6B,CAAC;AAC3D,eAAO,MAAM,WAAW,MAA6B,CAAC;AAEtD;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAGxC;AAED;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,IAAI,IAAI,CAG3C"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hermetic Test Setup Utilities
|
|
3
|
+
*
|
|
4
|
+
* Shared test infrastructure for deterministic, isolated tests.
|
|
5
|
+
* Located in __tests__/ directory which is classified as test code
|
|
6
|
+
* by dependency-cruiser, allowing legitimate vitest imports.
|
|
7
|
+
*
|
|
8
|
+
* Provides:
|
|
9
|
+
* - Frozen time (no wall-clock dependencies)
|
|
10
|
+
* - Deterministic teardown
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```typescript
|
|
14
|
+
* import { describe, it, beforeEach, afterEach } from 'vitest';
|
|
15
|
+
* import {
|
|
16
|
+
* FROZEN_TIMESTAMP,
|
|
17
|
+
* setupHermeticTest,
|
|
18
|
+
* teardownHermeticTest,
|
|
19
|
+
* } from '../hermetic-setup.js';
|
|
20
|
+
*
|
|
21
|
+
* describe('MyFeature', () => {
|
|
22
|
+
* beforeEach(() => setupHermeticTest());
|
|
23
|
+
* afterEach(() => teardownHermeticTest());
|
|
24
|
+
*
|
|
25
|
+
* it('works with frozen time', () => {
|
|
26
|
+
* expect(new Date().toISOString()).toBe(FROZEN_TIMESTAMP);
|
|
27
|
+
* });
|
|
28
|
+
* });
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
import { vi } from 'vitest';
|
|
32
|
+
/**
|
|
33
|
+
* Frozen test timestamp - use consistently across all hermetic tests
|
|
34
|
+
*/
|
|
35
|
+
export const FROZEN_TIMESTAMP = '2026-01-29T00:00:00.000Z';
|
|
36
|
+
export const FROZEN_DATE = new Date(FROZEN_TIMESTAMP);
|
|
37
|
+
/**
|
|
38
|
+
* Setup hermetic test environment
|
|
39
|
+
*
|
|
40
|
+
* Configures:
|
|
41
|
+
* - Frozen system time to FROZEN_TIMESTAMP
|
|
42
|
+
*
|
|
43
|
+
* Call this in beforeEach()
|
|
44
|
+
*/
|
|
45
|
+
export function setupHermeticTest() {
|
|
46
|
+
vi.useFakeTimers();
|
|
47
|
+
vi.setSystemTime(FROZEN_DATE);
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Teardown hermetic test environment
|
|
51
|
+
*
|
|
52
|
+
* Restores:
|
|
53
|
+
* - Real system time
|
|
54
|
+
* - All mocks
|
|
55
|
+
*
|
|
56
|
+
* Call this in afterEach()
|
|
57
|
+
*/
|
|
58
|
+
export function teardownHermeticTest() {
|
|
59
|
+
vi.useRealTimers();
|
|
60
|
+
vi.restoreAllMocks();
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=hermetic-setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hermetic-setup.js","sourceRoot":"","sources":["../../src/__tests__/hermetic-setup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,OAAO,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE5B;;GAEG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,0BAA0B,CAAC;AAC3D,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,IAAI,CAAC,gBAAgB,CAAC,CAAC;AAEtD;;;;;;;GAOG;AACH,MAAM,UAAU,iBAAiB;IAC/B,EAAE,CAAC,aAAa,EAAE,CAAC;IACnB,EAAE,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;AAChC,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,oBAAoB;IAClC,EAAE,CAAC,aAAa,EAAE,CAAC;IACnB,EAAE,CAAC,eAAe,EAAE,CAAC;AACvB,CAAC"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hermetic Test Utilities
|
|
3
|
+
*
|
|
4
|
+
* Provides utilities for creating deterministic, isolated tests that:
|
|
5
|
+
* - Have frozen time (no wall-clock dependencies)
|
|
6
|
+
* - Have deterministic UUIDs
|
|
7
|
+
* - Have no real network access
|
|
8
|
+
* - Have no real git remote access
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```typescript
|
|
12
|
+
* import { describe, it, beforeEach, afterEach } from 'vitest';
|
|
13
|
+
* import { setupHermeticTest, teardownHermeticTest } from './test-utils/hermetic.js';
|
|
14
|
+
*
|
|
15
|
+
* describe('MyFeature', () => {
|
|
16
|
+
* beforeEach(() => {
|
|
17
|
+
* setupHermeticTest();
|
|
18
|
+
* });
|
|
19
|
+
*
|
|
20
|
+
* afterEach(() => {
|
|
21
|
+
* teardownHermeticTest();
|
|
22
|
+
* });
|
|
23
|
+
*
|
|
24
|
+
* it('works with frozen time', () => {
|
|
25
|
+
* expect(new Date().toISOString()).toBe('2026-01-29T00:00:00.000Z');
|
|
26
|
+
* });
|
|
27
|
+
* });
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
/**
|
|
31
|
+
* Frozen test timestamp - use consistently across all hermetic tests
|
|
32
|
+
*/
|
|
33
|
+
export declare const FROZEN_TIMESTAMP = "2026-01-29T00:00:00.000Z";
|
|
34
|
+
export declare const FROZEN_DATE: Date;
|
|
35
|
+
/**
|
|
36
|
+
* Generate a deterministic UUID for testing
|
|
37
|
+
* Returns UUIDs in format: test-uuid-NNNN where NNNN is a zero-padded counter
|
|
38
|
+
*/
|
|
39
|
+
export declare function generateTestUUID(): string;
|
|
40
|
+
/**
|
|
41
|
+
* Reset the UUID counter (call in afterEach if needed)
|
|
42
|
+
*/
|
|
43
|
+
export declare function resetUUIDCounter(): void;
|
|
44
|
+
/**
|
|
45
|
+
* Setup hermetic test environment
|
|
46
|
+
*
|
|
47
|
+
* Configures:
|
|
48
|
+
* - Frozen system time to FROZEN_TIMESTAMP
|
|
49
|
+
* - Deterministic crypto.randomUUID()
|
|
50
|
+
* - Stubbed fetch (returns 503 by default - must be mocked per test)
|
|
51
|
+
*
|
|
52
|
+
* Call this in beforeEach()
|
|
53
|
+
*/
|
|
54
|
+
export declare function setupHermeticTest(): void;
|
|
55
|
+
/**
|
|
56
|
+
* Teardown hermetic test environment
|
|
57
|
+
*
|
|
58
|
+
* Restores:
|
|
59
|
+
* - Real system time
|
|
60
|
+
* - Original global stubs
|
|
61
|
+
*
|
|
62
|
+
* Call this in afterEach()
|
|
63
|
+
*/
|
|
64
|
+
export declare function teardownHermeticTest(): void;
|
|
65
|
+
/**
|
|
66
|
+
* Create a mock response for testing fetch calls
|
|
67
|
+
*/
|
|
68
|
+
export declare function createMockResponse(body: unknown, options?: {
|
|
69
|
+
status?: number;
|
|
70
|
+
headers?: Record<string, string>;
|
|
71
|
+
}): Response;
|
|
72
|
+
/**
|
|
73
|
+
* Create a mock git exec function that returns stubbed output
|
|
74
|
+
*/
|
|
75
|
+
export declare function createMockGitExec(responses: Record<string, string | Error>): import("vitest").Mock<(command: string, args: string[]) => string>;
|
|
76
|
+
/**
|
|
77
|
+
* Advance time by specified milliseconds in hermetic tests
|
|
78
|
+
*/
|
|
79
|
+
export declare function advanceTime(ms: number): Promise<void>;
|
|
80
|
+
/**
|
|
81
|
+
* Run all pending timers in hermetic tests
|
|
82
|
+
*/
|
|
83
|
+
export declare function runAllTimers(): Promise<void>;
|
|
84
|
+
//# sourceMappingURL=hermetic.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hermetic.d.ts","sourceRoot":"","sources":["../../../src/__tests__/test-utils/hermetic.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAIH;;GAEG;AACH,eAAO,MAAM,gBAAgB,6BAA6B,CAAC;AAC3D,eAAO,MAAM,WAAW,MAA6B,CAAC;AAOtD;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAGzC;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC;AAED;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAmBxC;AAED;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,IAAI,IAAI,CAK3C;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,OAAO,EACb,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAO,GAClE,QAAQ,CASV;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC,mCAClD,MAAM,QAAQ,MAAM,EAAE,KAAG,MAAM,EA2BvD;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE3D;AAED;;GAEG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAElD"}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hermetic Test Utilities
|
|
3
|
+
*
|
|
4
|
+
* Provides utilities for creating deterministic, isolated tests that:
|
|
5
|
+
* - Have frozen time (no wall-clock dependencies)
|
|
6
|
+
* - Have deterministic UUIDs
|
|
7
|
+
* - Have no real network access
|
|
8
|
+
* - Have no real git remote access
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```typescript
|
|
12
|
+
* import { describe, it, beforeEach, afterEach } from 'vitest';
|
|
13
|
+
* import { setupHermeticTest, teardownHermeticTest } from './test-utils/hermetic.js';
|
|
14
|
+
*
|
|
15
|
+
* describe('MyFeature', () => {
|
|
16
|
+
* beforeEach(() => {
|
|
17
|
+
* setupHermeticTest();
|
|
18
|
+
* });
|
|
19
|
+
*
|
|
20
|
+
* afterEach(() => {
|
|
21
|
+
* teardownHermeticTest();
|
|
22
|
+
* });
|
|
23
|
+
*
|
|
24
|
+
* it('works with frozen time', () => {
|
|
25
|
+
* expect(new Date().toISOString()).toBe('2026-01-29T00:00:00.000Z');
|
|
26
|
+
* });
|
|
27
|
+
* });
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
import { vi } from 'vitest';
|
|
31
|
+
/**
|
|
32
|
+
* Frozen test timestamp - use consistently across all hermetic tests
|
|
33
|
+
*/
|
|
34
|
+
export const FROZEN_TIMESTAMP = '2026-01-29T00:00:00.000Z';
|
|
35
|
+
export const FROZEN_DATE = new Date(FROZEN_TIMESTAMP);
|
|
36
|
+
/**
|
|
37
|
+
* Deterministic UUID counter for generating predictable UUIDs
|
|
38
|
+
*/
|
|
39
|
+
let uuidCounter = 0;
|
|
40
|
+
/**
|
|
41
|
+
* Generate a deterministic UUID for testing
|
|
42
|
+
* Returns UUIDs in format: test-uuid-NNNN where NNNN is a zero-padded counter
|
|
43
|
+
*/
|
|
44
|
+
export function generateTestUUID() {
|
|
45
|
+
const counter = uuidCounter++;
|
|
46
|
+
return `test-uuid-${counter.toString().padStart(4, '0')}`;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Reset the UUID counter (call in afterEach if needed)
|
|
50
|
+
*/
|
|
51
|
+
export function resetUUIDCounter() {
|
|
52
|
+
uuidCounter = 0;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Setup hermetic test environment
|
|
56
|
+
*
|
|
57
|
+
* Configures:
|
|
58
|
+
* - Frozen system time to FROZEN_TIMESTAMP
|
|
59
|
+
* - Deterministic crypto.randomUUID()
|
|
60
|
+
* - Stubbed fetch (returns 503 by default - must be mocked per test)
|
|
61
|
+
*
|
|
62
|
+
* Call this in beforeEach()
|
|
63
|
+
*/
|
|
64
|
+
export function setupHermeticTest() {
|
|
65
|
+
// Freeze time
|
|
66
|
+
vi.useFakeTimers();
|
|
67
|
+
vi.setSystemTime(FROZEN_DATE);
|
|
68
|
+
// Reset UUID counter
|
|
69
|
+
resetUUIDCounter();
|
|
70
|
+
// Stub crypto.randomUUID with deterministic values
|
|
71
|
+
vi.stubGlobal('crypto', {
|
|
72
|
+
...globalThis.crypto,
|
|
73
|
+
randomUUID: generateTestUUID,
|
|
74
|
+
});
|
|
75
|
+
// Stub fetch to fail by default (tests must explicitly mock expected calls)
|
|
76
|
+
vi.stubGlobal('fetch', vi.fn().mockRejectedValue(new Error('Network access not allowed in hermetic tests')));
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Teardown hermetic test environment
|
|
80
|
+
*
|
|
81
|
+
* Restores:
|
|
82
|
+
* - Real system time
|
|
83
|
+
* - Original global stubs
|
|
84
|
+
*
|
|
85
|
+
* Call this in afterEach()
|
|
86
|
+
*/
|
|
87
|
+
export function teardownHermeticTest() {
|
|
88
|
+
vi.useRealTimers();
|
|
89
|
+
vi.unstubAllGlobals();
|
|
90
|
+
vi.restoreAllMocks();
|
|
91
|
+
resetUUIDCounter();
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Create a mock response for testing fetch calls
|
|
95
|
+
*/
|
|
96
|
+
export function createMockResponse(body, options = {}) {
|
|
97
|
+
const { status = 200, headers = {} } = options;
|
|
98
|
+
return new Response(JSON.stringify(body), {
|
|
99
|
+
status,
|
|
100
|
+
headers: {
|
|
101
|
+
'Content-Type': 'application/json',
|
|
102
|
+
...headers,
|
|
103
|
+
},
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Create a mock git exec function that returns stubbed output
|
|
108
|
+
*/
|
|
109
|
+
export function createMockGitExec(responses) {
|
|
110
|
+
return vi.fn((command, args) => {
|
|
111
|
+
const key = `${command} ${args.join(' ')}`;
|
|
112
|
+
// Check for exact match first
|
|
113
|
+
if (Object.prototype.hasOwnProperty.call(responses, key)) {
|
|
114
|
+
const response = responses[key];
|
|
115
|
+
if (response === undefined) {
|
|
116
|
+
throw new Error(`Unmocked git command: ${key}`);
|
|
117
|
+
}
|
|
118
|
+
if (response instanceof Error) {
|
|
119
|
+
throw response;
|
|
120
|
+
}
|
|
121
|
+
return response;
|
|
122
|
+
}
|
|
123
|
+
// Check for partial matches (command only)
|
|
124
|
+
for (const [pattern, response] of Object.entries(responses)) {
|
|
125
|
+
if (key.startsWith(pattern)) {
|
|
126
|
+
if (response instanceof Error) {
|
|
127
|
+
throw response;
|
|
128
|
+
}
|
|
129
|
+
return response;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
throw new Error(`Unmocked git command: ${key}`);
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Advance time by specified milliseconds in hermetic tests
|
|
137
|
+
*/
|
|
138
|
+
export async function advanceTime(ms) {
|
|
139
|
+
await vi.advanceTimersByTimeAsync(ms);
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Run all pending timers in hermetic tests
|
|
143
|
+
*/
|
|
144
|
+
export async function runAllTimers() {
|
|
145
|
+
await vi.runAllTimersAsync();
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=hermetic.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hermetic.js","sourceRoot":"","sources":["../../../src/__tests__/test-utils/hermetic.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI Semantic Review Agent
|
|
3
|
+
* Multi-provider AI semantic code review
|
|
4
|
+
*
|
|
5
|
+
* INVARIANTS:
|
|
6
|
+
* - Router owns provider/model resolution
|
|
7
|
+
* - Agent receives context.provider and context.effectiveModel
|
|
8
|
+
* - No per-agent defaults, no legacy key references
|
|
9
|
+
*/
|
|
10
|
+
import type { ReviewAgent } from './types.js';
|
|
11
|
+
export declare const aiSemanticReviewAgent: ReviewAgent;
|
|
12
|
+
//# sourceMappingURL=ai_semantic_review.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai_semantic_review.d.ts","sourceRoot":"","sources":["../../src/agents/ai_semantic_review.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAQH,OAAO,KAAK,EAAE,WAAW,EAAgD,MAAM,YAAY,CAAC;AAyK5F,eAAO,MAAM,qBAAqB,EAAE,WAiNnC,CAAC"}
|