@sentry/warden 0.1.0 → 0.2.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/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +3 -1
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/setup-app/manifest.d.ts.map +1 -1
- package/dist/cli/commands/setup-app/manifest.js +3 -1
- package/dist/cli/commands/setup-app/manifest.js.map +1 -1
- package/dist/cli/commands/setup-app.js +1 -1
- package/dist/cli/commands/setup-app.js.map +1 -1
- package/dist/cli/files.d.ts +11 -1
- package/dist/cli/files.d.ts.map +1 -1
- package/dist/cli/files.js +145 -4
- package/dist/cli/files.js.map +1 -1
- package/dist/cli/git.d.ts.map +1 -1
- package/dist/cli/git.js +5 -9
- package/dist/cli/git.js.map +1 -1
- package/dist/cli/index.js +0 -0
- package/dist/cli/output/icons.d.ts +4 -0
- package/dist/cli/output/icons.d.ts.map +1 -1
- package/dist/cli/output/icons.js +4 -0
- package/dist/cli/output/icons.js.map +1 -1
- package/dist/cli/output/ink-runner.d.ts +20 -0
- package/dist/cli/output/ink-runner.d.ts.map +1 -1
- package/dist/cli/output/ink-runner.js +53 -19
- package/dist/cli/output/ink-runner.js.map +1 -1
- package/dist/cli/output/tasks.d.ts.map +1 -1
- package/dist/cli/output/tasks.js +5 -1
- package/dist/cli/output/tasks.js.map +1 -1
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +15 -1
- package/dist/config/schema.js.map +1 -1
- package/dist/diff/coalesce.d.ts +32 -2
- package/dist/diff/coalesce.d.ts.map +1 -1
- package/dist/diff/coalesce.js +174 -2
- package/dist/diff/coalesce.js.map +1 -1
- package/dist/output/dedup.d.ts.map +1 -1
- package/dist/output/dedup.js +8 -3
- package/dist/output/dedup.js.map +1 -1
- package/dist/output/renderer.d.ts.map +1 -1
- package/dist/output/renderer.js +49 -5
- package/dist/output/renderer.js.map +1 -1
- package/dist/output/stale.d.ts.map +1 -1
- package/dist/output/stale.js +7 -0
- package/dist/output/stale.js.map +1 -1
- package/dist/output/types.d.ts +15 -1
- package/dist/output/types.d.ts.map +1 -1
- package/dist/sdk/analyze.d.ts +18 -0
- package/dist/sdk/analyze.d.ts.map +1 -0
- package/dist/sdk/analyze.js +425 -0
- package/dist/sdk/analyze.js.map +1 -0
- package/dist/sdk/errors.d.ts +23 -0
- package/dist/sdk/errors.d.ts.map +1 -0
- package/dist/sdk/errors.js +72 -0
- package/dist/sdk/errors.js.map +1 -0
- package/dist/sdk/extract.d.ts +44 -0
- package/dist/sdk/extract.d.ts.map +1 -0
- package/dist/sdk/extract.js +224 -0
- package/dist/sdk/extract.js.map +1 -0
- package/dist/sdk/prepare.d.ts +13 -0
- package/dist/sdk/prepare.d.ts.map +1 -0
- package/dist/sdk/prepare.js +73 -0
- package/dist/sdk/prepare.js.map +1 -0
- package/dist/sdk/prompt.d.ts +30 -0
- package/dist/sdk/prompt.d.ts.map +1 -0
- package/dist/sdk/prompt.js +109 -0
- package/dist/sdk/prompt.js.map +1 -0
- package/dist/sdk/retry.d.ts +12 -0
- package/dist/sdk/retry.d.ts.map +1 -0
- package/dist/sdk/retry.js +31 -0
- package/dist/sdk/retry.js.map +1 -0
- package/dist/sdk/runner.d.ts +22 -199
- package/dist/sdk/runner.d.ts.map +1 -1
- package/dist/sdk/runner.js +26 -884
- package/dist/sdk/runner.js.map +1 -1
- package/dist/sdk/types.d.ts +127 -0
- package/dist/sdk/types.d.ts.map +1 -0
- package/dist/sdk/types.js +5 -0
- package/dist/sdk/types.js.map +1 -0
- package/dist/sdk/usage.d.ts +20 -0
- package/dist/sdk/usage.d.ts.map +1 -0
- package/dist/sdk/usage.js +44 -0
- package/dist/sdk/usage.js.map +1 -0
- package/dist/skills/remote.d.ts.map +1 -1
- package/dist/skills/remote.js +3 -7
- package/dist/skills/remote.js.map +1 -1
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -1
- package/dist/utils/exec.d.ts +61 -0
- package/dist/utils/exec.d.ts.map +1 -0
- package/dist/utils/exec.js +111 -0
- package/dist/utils/exec.js.map +1 -0
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +1 -0
- package/dist/utils/index.js.map +1 -1
- package/package.json +15 -16
- package/.agents/skills/find-bugs/SKILL.md +0 -75
- package/.agents/skills/vercel-react-best-practices/AGENTS.md +0 -2934
- package/.agents/skills/vercel-react-best-practices/SKILL.md +0 -136
- package/.agents/skills/vercel-react-best-practices/rules/advanced-event-handler-refs.md +0 -55
- package/.agents/skills/vercel-react-best-practices/rules/advanced-init-once.md +0 -42
- package/.agents/skills/vercel-react-best-practices/rules/advanced-use-latest.md +0 -39
- package/.agents/skills/vercel-react-best-practices/rules/async-api-routes.md +0 -38
- package/.agents/skills/vercel-react-best-practices/rules/async-defer-await.md +0 -80
- package/.agents/skills/vercel-react-best-practices/rules/async-dependencies.md +0 -51
- package/.agents/skills/vercel-react-best-practices/rules/async-parallel.md +0 -28
- package/.agents/skills/vercel-react-best-practices/rules/async-suspense-boundaries.md +0 -99
- package/.agents/skills/vercel-react-best-practices/rules/bundle-barrel-imports.md +0 -59
- package/.agents/skills/vercel-react-best-practices/rules/bundle-conditional.md +0 -31
- package/.agents/skills/vercel-react-best-practices/rules/bundle-defer-third-party.md +0 -49
- package/.agents/skills/vercel-react-best-practices/rules/bundle-dynamic-imports.md +0 -35
- package/.agents/skills/vercel-react-best-practices/rules/bundle-preload.md +0 -50
- package/.agents/skills/vercel-react-best-practices/rules/client-event-listeners.md +0 -74
- package/.agents/skills/vercel-react-best-practices/rules/client-localstorage-schema.md +0 -71
- package/.agents/skills/vercel-react-best-practices/rules/client-passive-event-listeners.md +0 -48
- package/.agents/skills/vercel-react-best-practices/rules/client-swr-dedup.md +0 -56
- package/.agents/skills/vercel-react-best-practices/rules/js-batch-dom-css.md +0 -107
- package/.agents/skills/vercel-react-best-practices/rules/js-cache-function-results.md +0 -80
- package/.agents/skills/vercel-react-best-practices/rules/js-cache-property-access.md +0 -28
- package/.agents/skills/vercel-react-best-practices/rules/js-cache-storage.md +0 -70
- package/.agents/skills/vercel-react-best-practices/rules/js-combine-iterations.md +0 -32
- package/.agents/skills/vercel-react-best-practices/rules/js-early-exit.md +0 -50
- package/.agents/skills/vercel-react-best-practices/rules/js-hoist-regexp.md +0 -45
- package/.agents/skills/vercel-react-best-practices/rules/js-index-maps.md +0 -37
- package/.agents/skills/vercel-react-best-practices/rules/js-length-check-first.md +0 -49
- package/.agents/skills/vercel-react-best-practices/rules/js-min-max-loop.md +0 -82
- package/.agents/skills/vercel-react-best-practices/rules/js-set-map-lookups.md +0 -24
- package/.agents/skills/vercel-react-best-practices/rules/js-tosorted-immutable.md +0 -57
- package/.agents/skills/vercel-react-best-practices/rules/rendering-activity.md +0 -26
- package/.agents/skills/vercel-react-best-practices/rules/rendering-animate-svg-wrapper.md +0 -47
- package/.agents/skills/vercel-react-best-practices/rules/rendering-conditional-render.md +0 -40
- package/.agents/skills/vercel-react-best-practices/rules/rendering-content-visibility.md +0 -38
- package/.agents/skills/vercel-react-best-practices/rules/rendering-hoist-jsx.md +0 -46
- package/.agents/skills/vercel-react-best-practices/rules/rendering-hydration-no-flicker.md +0 -82
- package/.agents/skills/vercel-react-best-practices/rules/rendering-hydration-suppress-warning.md +0 -30
- package/.agents/skills/vercel-react-best-practices/rules/rendering-svg-precision.md +0 -28
- package/.agents/skills/vercel-react-best-practices/rules/rendering-usetransition-loading.md +0 -75
- package/.agents/skills/vercel-react-best-practices/rules/rerender-defer-reads.md +0 -39
- package/.agents/skills/vercel-react-best-practices/rules/rerender-dependencies.md +0 -45
- package/.agents/skills/vercel-react-best-practices/rules/rerender-derived-state-no-effect.md +0 -40
- package/.agents/skills/vercel-react-best-practices/rules/rerender-derived-state.md +0 -29
- package/.agents/skills/vercel-react-best-practices/rules/rerender-functional-setstate.md +0 -74
- package/.agents/skills/vercel-react-best-practices/rules/rerender-lazy-state-init.md +0 -58
- package/.agents/skills/vercel-react-best-practices/rules/rerender-memo-with-default-value.md +0 -38
- package/.agents/skills/vercel-react-best-practices/rules/rerender-memo.md +0 -44
- package/.agents/skills/vercel-react-best-practices/rules/rerender-move-effect-to-event.md +0 -45
- package/.agents/skills/vercel-react-best-practices/rules/rerender-simple-expression-in-memo.md +0 -35
- package/.agents/skills/vercel-react-best-practices/rules/rerender-transitions.md +0 -40
- package/.agents/skills/vercel-react-best-practices/rules/rerender-use-ref-transient-values.md +0 -73
- package/.agents/skills/vercel-react-best-practices/rules/server-after-nonblocking.md +0 -73
- package/.agents/skills/vercel-react-best-practices/rules/server-auth-actions.md +0 -96
- package/.agents/skills/vercel-react-best-practices/rules/server-cache-lru.md +0 -41
- package/.agents/skills/vercel-react-best-practices/rules/server-cache-react.md +0 -76
- package/.agents/skills/vercel-react-best-practices/rules/server-dedup-props.md +0 -65
- package/.agents/skills/vercel-react-best-practices/rules/server-parallel-fetching.md +0 -83
- package/.agents/skills/vercel-react-best-practices/rules/server-serialization.md +0 -38
- package/.claude/settings.json +0 -57
- package/.claude/skills/agent-prompt/SKILL.md +0 -54
- package/.claude/skills/agent-prompt/references/agentic-patterns.md +0 -94
- package/.claude/skills/agent-prompt/references/anti-patterns.md +0 -140
- package/.claude/skills/agent-prompt/references/context-design.md +0 -124
- package/.claude/skills/agent-prompt/references/core-principles.md +0 -75
- package/.claude/skills/agent-prompt/references/model-guidance.md +0 -118
- package/.claude/skills/agent-prompt/references/output-formats.md +0 -98
- package/.claude/skills/agent-prompt/references/skill-structure.md +0 -115
- package/.claude/skills/agent-prompt/references/system-prompts.md +0 -115
- package/.claude/skills/notseer/SKILL.md +0 -131
- package/.claude/skills/skill-writer/SKILL.md +0 -140
- package/.claude/skills/testing-guidelines/SKILL.md +0 -132
- package/.claude/skills/warden-skill/SKILL.md +0 -250
- package/.claude/skills/warden-skill/references/config-schema.md +0 -133
- package/.dex/config.toml +0 -2
- package/.github/workflows/ci.yml +0 -33
- package/.github/workflows/release.yml +0 -59
- package/.github/workflows/warden.yml +0 -40
- package/AGENTS.md +0 -89
- package/CONTRIBUTING.md +0 -60
- package/SPEC.md +0 -263
- package/action.yml +0 -87
- package/assets/favicon.png +0 -0
- package/assets/warden-icon-bw.svg +0 -5
- package/assets/warden-icon-purple.png +0 -0
- package/assets/warden-icon-purple.svg +0 -5
- package/dist/action/159.index.js +0 -523
- package/dist/action/159.index.js.map +0 -1
- package/dist/action/action/index.d.ts +0 -2
- package/dist/action/action/index.d.ts.map +0 -1
- package/dist/action/action/main.d.ts +0 -2
- package/dist/action/action/main.d.ts.map +0 -1
- package/dist/action/cli/args.d.ts +0 -74
- package/dist/action/cli/args.d.ts.map +0 -1
- package/dist/action/cli/args.test.d.ts +0 -2
- package/dist/action/cli/args.test.d.ts.map +0 -1
- package/dist/action/cli/commands/add.d.ts +0 -7
- package/dist/action/cli/commands/add.d.ts.map +0 -1
- package/dist/action/cli/commands/init.d.ts +0 -10
- package/dist/action/cli/commands/init.d.ts.map +0 -1
- package/dist/action/cli/commands/init.test.d.ts +0 -2
- package/dist/action/cli/commands/init.test.d.ts.map +0 -1
- package/dist/action/cli/commands/setup-app/browser.d.ts +0 -9
- package/dist/action/cli/commands/setup-app/browser.d.ts.map +0 -1
- package/dist/action/cli/commands/setup-app/credentials.d.ts +0 -15
- package/dist/action/cli/commands/setup-app/credentials.d.ts.map +0 -1
- package/dist/action/cli/commands/setup-app/manifest.d.ts +0 -24
- package/dist/action/cli/commands/setup-app/manifest.d.ts.map +0 -1
- package/dist/action/cli/commands/setup-app/server.d.ts +0 -28
- package/dist/action/cli/commands/setup-app/server.d.ts.map +0 -1
- package/dist/action/cli/commands/setup-app.d.ts +0 -11
- package/dist/action/cli/commands/setup-app.d.ts.map +0 -1
- package/dist/action/cli/commands/sync.d.ts +0 -9
- package/dist/action/cli/commands/sync.d.ts.map +0 -1
- package/dist/action/cli/context.d.ts +0 -27
- package/dist/action/cli/context.d.ts.map +0 -1
- package/dist/action/cli/files.d.ts +0 -22
- package/dist/action/cli/files.d.ts.map +0 -1
- package/dist/action/cli/files.test.d.ts +0 -2
- package/dist/action/cli/files.test.d.ts.map +0 -1
- package/dist/action/cli/fix.d.ts +0 -41
- package/dist/action/cli/fix.d.ts.map +0 -1
- package/dist/action/cli/fix.test.d.ts +0 -2
- package/dist/action/cli/fix.test.d.ts.map +0 -1
- package/dist/action/cli/git.d.ts +0 -73
- package/dist/action/cli/git.d.ts.map +0 -1
- package/dist/action/cli/git.test.d.ts +0 -2
- package/dist/action/cli/git.test.d.ts.map +0 -1
- package/dist/action/cli/index.d.ts +0 -3
- package/dist/action/cli/index.d.ts.map +0 -1
- package/dist/action/cli/main.d.ts +0 -7
- package/dist/action/cli/main.d.ts.map +0 -1
- package/dist/action/cli/output/box.d.ts +0 -75
- package/dist/action/cli/output/box.d.ts.map +0 -1
- package/dist/action/cli/output/formatters.d.ts +0 -90
- package/dist/action/cli/output/formatters.d.ts.map +0 -1
- package/dist/action/cli/output/formatters.test.d.ts +0 -2
- package/dist/action/cli/output/formatters.test.d.ts.map +0 -1
- package/dist/action/cli/output/icons.d.ts +0 -11
- package/dist/action/cli/output/icons.d.ts.map +0 -1
- package/dist/action/cli/output/index.d.ts +0 -10
- package/dist/action/cli/output/index.d.ts.map +0 -1
- package/dist/action/cli/output/ink-runner.d.ts +0 -9
- package/dist/action/cli/output/ink-runner.d.ts.map +0 -1
- package/dist/action/cli/output/jsonl.d.ts +0 -43
- package/dist/action/cli/output/jsonl.d.ts.map +0 -1
- package/dist/action/cli/output/jsonl.test.d.ts +0 -2
- package/dist/action/cli/output/jsonl.test.d.ts.map +0 -1
- package/dist/action/cli/output/reporter.d.ts +0 -108
- package/dist/action/cli/output/reporter.d.ts.map +0 -1
- package/dist/action/cli/output/tasks.d.ts +0 -89
- package/dist/action/cli/output/tasks.d.ts.map +0 -1
- package/dist/action/cli/output/tty.d.ts +0 -21
- package/dist/action/cli/output/tty.d.ts.map +0 -1
- package/dist/action/cli/output/tty.test.d.ts +0 -2
- package/dist/action/cli/output/tty.test.d.ts.map +0 -1
- package/dist/action/cli/output/verbosity.d.ts +0 -20
- package/dist/action/cli/output/verbosity.d.ts.map +0 -1
- package/dist/action/cli/output/verbosity.test.d.ts +0 -2
- package/dist/action/cli/output/verbosity.test.d.ts.map +0 -1
- package/dist/action/cli/terminal.d.ts +0 -19
- package/dist/action/cli/terminal.d.ts.map +0 -1
- package/dist/action/cli/terminal.test.d.ts +0 -2
- package/dist/action/cli/terminal.test.d.ts.map +0 -1
- package/dist/action/config/index.d.ts +0 -4
- package/dist/action/config/index.d.ts.map +0 -1
- package/dist/action/config/loader.d.ts +0 -27
- package/dist/action/config/loader.d.ts.map +0 -1
- package/dist/action/config/loader.test.d.ts +0 -2
- package/dist/action/config/loader.test.d.ts.map +0 -1
- package/dist/action/config/schema.d.ts +0 -318
- package/dist/action/config/schema.d.ts.map +0 -1
- package/dist/action/config/writer.d.ts +0 -11
- package/dist/action/config/writer.d.ts.map +0 -1
- package/dist/action/config/writer.test.d.ts +0 -2
- package/dist/action/config/writer.test.d.ts.map +0 -1
- package/dist/action/diff/classify.d.ts +0 -29
- package/dist/action/diff/classify.d.ts.map +0 -1
- package/dist/action/diff/classify.test.d.ts +0 -2
- package/dist/action/diff/classify.test.d.ts.map +0 -1
- package/dist/action/diff/coalesce.d.ts +0 -42
- package/dist/action/diff/coalesce.d.ts.map +0 -1
- package/dist/action/diff/coalesce.test.d.ts +0 -2
- package/dist/action/diff/coalesce.test.d.ts.map +0 -1
- package/dist/action/diff/context.d.ts +0 -30
- package/dist/action/diff/context.d.ts.map +0 -1
- package/dist/action/diff/context.test.d.ts +0 -2
- package/dist/action/diff/context.test.d.ts.map +0 -1
- package/dist/action/diff/index.d.ts +0 -5
- package/dist/action/diff/index.d.ts.map +0 -1
- package/dist/action/diff/parser.d.ts +0 -52
- package/dist/action/diff/parser.d.ts.map +0 -1
- package/dist/action/diff/parser.test.d.ts +0 -2
- package/dist/action/diff/parser.test.d.ts.map +0 -1
- package/dist/action/event/context.d.ts +0 -9
- package/dist/action/event/context.d.ts.map +0 -1
- package/dist/action/event/index.d.ts +0 -3
- package/dist/action/event/index.d.ts.map +0 -1
- package/dist/action/event/schedule-context.d.ts +0 -30
- package/dist/action/event/schedule-context.d.ts.map +0 -1
- package/dist/action/examples/examples.integration.test.d.ts +0 -2
- package/dist/action/examples/examples.integration.test.d.ts.map +0 -1
- package/dist/action/examples/index.d.ts +0 -50
- package/dist/action/examples/index.d.ts.map +0 -1
- package/dist/action/examples/index.test.d.ts +0 -2
- package/dist/action/examples/index.test.d.ts.map +0 -1
- package/dist/action/examples/setup.d.ts +0 -2
- package/dist/action/examples/setup.d.ts.map +0 -1
- package/dist/action/index.d.ts +0 -11
- package/dist/action/index.d.ts.map +0 -1
- package/dist/action/index.js +0 -38231
- package/dist/action/index.js.map +0 -1
- package/dist/action/licenses.txt +0 -992
- package/dist/action/main.d.ts +0 -2
- package/dist/action/main.d.ts.map +0 -1
- package/dist/action/main.js +0 -707
- package/dist/action/main.js.map +0 -1
- package/dist/action/output/dedup.d.ts +0 -153
- package/dist/action/output/dedup.d.ts.map +0 -1
- package/dist/action/output/dedup.test.d.ts +0 -2
- package/dist/action/output/dedup.test.d.ts.map +0 -1
- package/dist/action/output/github-checks.d.ts +0 -106
- package/dist/action/output/github-checks.d.ts.map +0 -1
- package/dist/action/output/github-checks.test.d.ts +0 -2
- package/dist/action/output/github-checks.test.d.ts.map +0 -1
- package/dist/action/output/github-issues.d.ts +0 -35
- package/dist/action/output/github-issues.d.ts.map +0 -1
- package/dist/action/output/index.d.ts +0 -6
- package/dist/action/output/index.d.ts.map +0 -1
- package/dist/action/output/issue-renderer.d.ts +0 -20
- package/dist/action/output/issue-renderer.d.ts.map +0 -1
- package/dist/action/output/renderer.d.ts +0 -4
- package/dist/action/output/renderer.d.ts.map +0 -1
- package/dist/action/output/renderer.test.d.ts +0 -2
- package/dist/action/output/renderer.test.d.ts.map +0 -1
- package/dist/action/output/stale.d.ts +0 -31
- package/dist/action/output/stale.d.ts.map +0 -1
- package/dist/action/output/stale.test.d.ts +0 -2
- package/dist/action/output/stale.test.d.ts.map +0 -1
- package/dist/action/output/types.d.ts +0 -31
- package/dist/action/output/types.d.ts.map +0 -1
- package/dist/action/package.json +0 -3
- package/dist/action/sdk/index.d.ts +0 -2
- package/dist/action/sdk/index.d.ts.map +0 -1
- package/dist/action/sdk/runner.d.ts +0 -202
- package/dist/action/sdk/runner.d.ts.map +0 -1
- package/dist/action/sdk/runner.test.d.ts +0 -2
- package/dist/action/sdk/runner.test.d.ts.map +0 -1
- package/dist/action/skills/index.d.ts +0 -5
- package/dist/action/skills/index.d.ts.map +0 -1
- package/dist/action/skills/loader.d.ts +0 -111
- package/dist/action/skills/loader.d.ts.map +0 -1
- package/dist/action/skills/loader.test.d.ts +0 -2
- package/dist/action/skills/loader.test.d.ts.map +0 -1
- package/dist/action/skills/remote.d.ts +0 -117
- package/dist/action/skills/remote.d.ts.map +0 -1
- package/dist/action/skills/remote.test.d.ts +0 -2
- package/dist/action/skills/remote.test.d.ts.map +0 -1
- package/dist/action/sourcemap-register.cjs +0 -1
- package/dist/action/triggers/matcher.d.ts +0 -30
- package/dist/action/triggers/matcher.d.ts.map +0 -1
- package/dist/action/triggers/matcher.test.d.ts +0 -2
- package/dist/action/triggers/matcher.test.d.ts.map +0 -1
- package/dist/action/types/index.d.ts +0 -269
- package/dist/action/types/index.d.ts.map +0 -1
- package/dist/action/utils/async.d.ts +0 -5
- package/dist/action/utils/async.d.ts.map +0 -1
- package/dist/action/utils/index.d.ts +0 -16
- package/dist/action/utils/index.d.ts.map +0 -1
- package/dist/action/utils/index.test.d.ts +0 -2
- package/dist/action/utils/index.test.d.ts.map +0 -1
- package/dist/action/utils/version.d.ts +0 -3
- package/dist/action/utils/version.d.ts.map +0 -1
- package/dist/cli/args.test.d.ts +0 -2
- package/dist/cli/args.test.d.ts.map +0 -1
- package/dist/cli/args.test.js +0 -392
- package/dist/cli/args.test.js.map +0 -1
- package/dist/cli/commands/init.test.d.ts +0 -2
- package/dist/cli/commands/init.test.d.ts.map +0 -1
- package/dist/cli/commands/init.test.js +0 -117
- package/dist/cli/commands/init.test.js.map +0 -1
- package/dist/cli/files.test.d.ts +0 -2
- package/dist/cli/files.test.d.ts.map +0 -1
- package/dist/cli/files.test.js +0 -117
- package/dist/cli/files.test.js.map +0 -1
- package/dist/cli/fix.test.d.ts +0 -2
- package/dist/cli/fix.test.d.ts.map +0 -1
- package/dist/cli/fix.test.js +0 -251
- package/dist/cli/fix.test.js.map +0 -1
- package/dist/cli/git.test.d.ts +0 -2
- package/dist/cli/git.test.d.ts.map +0 -1
- package/dist/cli/git.test.js +0 -96
- package/dist/cli/git.test.js.map +0 -1
- package/dist/cli/output/formatters.test.d.ts +0 -2
- package/dist/cli/output/formatters.test.d.ts.map +0 -1
- package/dist/cli/output/formatters.test.js +0 -152
- package/dist/cli/output/formatters.test.js.map +0 -1
- package/dist/cli/output/jsonl.test.d.ts +0 -2
- package/dist/cli/output/jsonl.test.d.ts.map +0 -1
- package/dist/cli/output/jsonl.test.js +0 -284
- package/dist/cli/output/jsonl.test.js.map +0 -1
- package/dist/cli/output/tty.test.d.ts +0 -2
- package/dist/cli/output/tty.test.d.ts.map +0 -1
- package/dist/cli/output/tty.test.js +0 -105
- package/dist/cli/output/tty.test.js.map +0 -1
- package/dist/cli/output/verbosity.test.d.ts +0 -2
- package/dist/cli/output/verbosity.test.d.ts.map +0 -1
- package/dist/cli/output/verbosity.test.js +0 -35
- package/dist/cli/output/verbosity.test.js.map +0 -1
- package/dist/cli/terminal.test.d.ts +0 -2
- package/dist/cli/terminal.test.d.ts.map +0 -1
- package/dist/cli/terminal.test.js +0 -123
- package/dist/cli/terminal.test.js.map +0 -1
- package/dist/config/loader.test.d.ts +0 -2
- package/dist/config/loader.test.d.ts.map +0 -1
- package/dist/config/loader.test.js +0 -263
- package/dist/config/loader.test.js.map +0 -1
- package/dist/config/writer.test.d.ts +0 -2
- package/dist/config/writer.test.d.ts.map +0 -1
- package/dist/config/writer.test.js +0 -98
- package/dist/config/writer.test.js.map +0 -1
- package/dist/diff/classify.test.d.ts +0 -2
- package/dist/diff/classify.test.d.ts.map +0 -1
- package/dist/diff/classify.test.js +0 -140
- package/dist/diff/classify.test.js.map +0 -1
- package/dist/diff/coalesce.test.d.ts +0 -2
- package/dist/diff/coalesce.test.d.ts.map +0 -1
- package/dist/diff/coalesce.test.js +0 -159
- package/dist/diff/coalesce.test.js.map +0 -1
- package/dist/diff/context.test.d.ts +0 -2
- package/dist/diff/context.test.d.ts.map +0 -1
- package/dist/diff/context.test.js +0 -190
- package/dist/diff/context.test.js.map +0 -1
- package/dist/diff/parser.test.d.ts +0 -2
- package/dist/diff/parser.test.d.ts.map +0 -1
- package/dist/diff/parser.test.js +0 -178
- package/dist/diff/parser.test.js.map +0 -1
- package/dist/examples/examples.integration.test.d.ts +0 -2
- package/dist/examples/examples.integration.test.d.ts.map +0 -1
- package/dist/examples/examples.integration.test.js +0 -55
- package/dist/examples/examples.integration.test.js.map +0 -1
- package/dist/examples/index.test.d.ts +0 -2
- package/dist/examples/index.test.d.ts.map +0 -1
- package/dist/examples/index.test.js +0 -88
- package/dist/examples/index.test.js.map +0 -1
- package/dist/output/dedup.test.d.ts +0 -2
- package/dist/output/dedup.test.d.ts.map +0 -1
- package/dist/output/dedup.test.js +0 -357
- package/dist/output/dedup.test.js.map +0 -1
- package/dist/output/github-checks.test.d.ts +0 -2
- package/dist/output/github-checks.test.d.ts.map +0 -1
- package/dist/output/github-checks.test.js +0 -255
- package/dist/output/github-checks.test.js.map +0 -1
- package/dist/output/renderer.test.d.ts +0 -2
- package/dist/output/renderer.test.d.ts.map +0 -1
- package/dist/output/renderer.test.js +0 -645
- package/dist/output/renderer.test.js.map +0 -1
- package/dist/output/stale.test.d.ts +0 -2
- package/dist/output/stale.test.d.ts.map +0 -1
- package/dist/output/stale.test.js +0 -330
- package/dist/output/stale.test.js.map +0 -1
- package/dist/sdk/runner.test.d.ts +0 -2
- package/dist/sdk/runner.test.d.ts.map +0 -1
- package/dist/sdk/runner.test.js +0 -677
- package/dist/sdk/runner.test.js.map +0 -1
- package/dist/skills/loader.test.d.ts +0 -2
- package/dist/skills/loader.test.d.ts.map +0 -1
- package/dist/skills/loader.test.js +0 -241
- package/dist/skills/loader.test.js.map +0 -1
- package/dist/skills/remote.test.d.ts +0 -2
- package/dist/skills/remote.test.d.ts.map +0 -1
- package/dist/skills/remote.test.js +0 -582
- package/dist/skills/remote.test.js.map +0 -1
- package/dist/triggers/matcher.test.d.ts +0 -2
- package/dist/triggers/matcher.test.d.ts.map +0 -1
- package/dist/triggers/matcher.test.js +0 -234
- package/dist/triggers/matcher.test.js.map +0 -1
- package/dist/utils/index.test.d.ts +0 -2
- package/dist/utils/index.test.d.ts.map +0 -1
- package/dist/utils/index.test.js +0 -68
- package/dist/utils/index.test.js.map +0 -1
- package/docs/astro.config.mjs +0 -43
- package/docs/package.json +0 -19
- package/docs/pnpm-lock.yaml +0 -4000
- package/docs/public/favicon.svg +0 -5
- package/docs/src/components/Code.astro +0 -141
- package/docs/src/components/PackageManagerTabs.astro +0 -183
- package/docs/src/components/Terminal.astro +0 -212
- package/docs/src/layouts/Base.astro +0 -380
- package/docs/src/pages/cli.astro +0 -167
- package/docs/src/pages/config.astro +0 -395
- package/docs/src/pages/guide.astro +0 -450
- package/docs/src/pages/index.astro +0 -490
- package/docs/src/styles/global.css +0 -551
- package/docs/src/utils/version.ts +0 -6
- package/docs/tsconfig.json +0 -3
- package/docs/vercel.json +0 -5
- package/eslint.config.js +0 -33
- package/src/action/index.ts +0 -1
- package/src/action/main.ts +0 -868
- package/src/cli/args.test.ts +0 -477
- package/src/cli/args.ts +0 -414
- package/src/cli/commands/add.ts +0 -447
- package/src/cli/commands/init.test.ts +0 -137
- package/src/cli/commands/init.ts +0 -134
- package/src/cli/commands/setup-app/browser.ts +0 -38
- package/src/cli/commands/setup-app/credentials.ts +0 -45
- package/src/cli/commands/setup-app/manifest.ts +0 -48
- package/src/cli/commands/setup-app/server.ts +0 -172
- package/src/cli/commands/setup-app.ts +0 -156
- package/src/cli/commands/sync.ts +0 -114
- package/src/cli/context.ts +0 -131
- package/src/cli/files.test.ts +0 -155
- package/src/cli/files.ts +0 -89
- package/src/cli/fix.test.ts +0 -310
- package/src/cli/fix.ts +0 -387
- package/src/cli/git.test.ts +0 -119
- package/src/cli/git.ts +0 -318
- package/src/cli/index.ts +0 -14
- package/src/cli/main.ts +0 -672
- package/src/cli/output/box.ts +0 -235
- package/src/cli/output/formatters.test.ts +0 -187
- package/src/cli/output/formatters.ts +0 -269
- package/src/cli/output/icons.ts +0 -13
- package/src/cli/output/index.ts +0 -44
- package/src/cli/output/ink-runner.tsx +0 -337
- package/src/cli/output/jsonl.test.ts +0 -347
- package/src/cli/output/jsonl.ts +0 -126
- package/src/cli/output/reporter.ts +0 -434
- package/src/cli/output/tasks.ts +0 -374
- package/src/cli/output/tty.test.ts +0 -117
- package/src/cli/output/tty.ts +0 -60
- package/src/cli/output/verbosity.test.ts +0 -40
- package/src/cli/output/verbosity.ts +0 -31
- package/src/cli/terminal.test.ts +0 -148
- package/src/cli/terminal.ts +0 -301
- package/src/config/index.ts +0 -3
- package/src/config/loader.test.ts +0 -313
- package/src/config/loader.ts +0 -103
- package/src/config/schema.ts +0 -168
- package/src/config/writer.test.ts +0 -119
- package/src/config/writer.ts +0 -84
- package/src/diff/classify.test.ts +0 -162
- package/src/diff/classify.ts +0 -92
- package/src/diff/coalesce.test.ts +0 -208
- package/src/diff/coalesce.ts +0 -133
- package/src/diff/context.test.ts +0 -226
- package/src/diff/context.ts +0 -201
- package/src/diff/index.ts +0 -4
- package/src/diff/parser.test.ts +0 -212
- package/src/diff/parser.ts +0 -149
- package/src/event/context.ts +0 -132
- package/src/event/index.ts +0 -2
- package/src/event/schedule-context.ts +0 -101
- package/src/examples/examples.integration.test.ts +0 -66
- package/src/examples/index.test.ts +0 -101
- package/src/examples/index.ts +0 -122
- package/src/examples/setup.ts +0 -25
- package/src/index.ts +0 -115
- package/src/output/dedup.test.ts +0 -419
- package/src/output/dedup.ts +0 -607
- package/src/output/github-checks.test.ts +0 -300
- package/src/output/github-checks.ts +0 -476
- package/src/output/github-issues.ts +0 -329
- package/src/output/index.ts +0 -5
- package/src/output/issue-renderer.ts +0 -197
- package/src/output/renderer.test.ts +0 -727
- package/src/output/renderer.ts +0 -217
- package/src/output/stale.test.ts +0 -375
- package/src/output/stale.ts +0 -155
- package/src/output/types.ts +0 -34
- package/src/sdk/index.ts +0 -1
- package/src/sdk/runner.test.ts +0 -806
- package/src/sdk/runner.ts +0 -1232
- package/src/skills/index.ts +0 -36
- package/src/skills/loader.test.ts +0 -300
- package/src/skills/loader.ts +0 -423
- package/src/skills/remote.test.ts +0 -704
- package/src/skills/remote.ts +0 -604
- package/src/triggers/matcher.test.ts +0 -277
- package/src/triggers/matcher.ts +0 -152
- package/src/types/index.ts +0 -194
- package/src/utils/async.ts +0 -18
- package/src/utils/index.test.ts +0 -84
- package/src/utils/index.ts +0 -51
- package/src/utils/version.ts +0 -17
- package/tsconfig.json +0 -25
- package/vitest.config.ts +0 -8
- package/vitest.integration.config.ts +0 -11
- package/warden.toml +0 -19
package/dist/output/renderer.js
CHANGED
|
@@ -10,7 +10,7 @@ const SEVERITY_EMOJI = {
|
|
|
10
10
|
info: ':information_source:',
|
|
11
11
|
};
|
|
12
12
|
export function renderSkillReport(report, options = {}) {
|
|
13
|
-
const { includeSuggestions = true, maxFindings, groupByFile = true, commentOn, checkRunUrl, totalFindings } = options;
|
|
13
|
+
const { includeSuggestions = true, maxFindings, groupByFile = true, commentOn, failOn, checkRunUrl, totalFindings, allFindings, previousReviewState } = options;
|
|
14
14
|
// Filter by commentOn threshold first, then apply maxFindings limit
|
|
15
15
|
const filteredFindings = filterFindingsBySeverity(report.findings, commentOn);
|
|
16
16
|
const findings = maxFindings ? filteredFindings.slice(0, maxFindings) : filteredFindings;
|
|
@@ -18,13 +18,36 @@ export function renderSkillReport(report, options = {}) {
|
|
|
18
18
|
// Calculate how many findings were filtered out
|
|
19
19
|
const total = totalFindings ?? report.findings.length;
|
|
20
20
|
const hiddenCount = total - sortedFindings.length;
|
|
21
|
-
|
|
21
|
+
// Use allFindings for failOn evaluation if provided (e.g., when report.findings was modified for dedup)
|
|
22
|
+
const findingsForFailOn = allFindings ?? report.findings;
|
|
23
|
+
const review = renderReview(sortedFindings, report, includeSuggestions, failOn, findingsForFailOn, previousReviewState);
|
|
22
24
|
const summaryComment = renderSummaryComment(report, sortedFindings, groupByFile, checkRunUrl, hiddenCount);
|
|
23
25
|
return { review, summaryComment };
|
|
24
26
|
}
|
|
25
|
-
function renderReview(findings, report, includeSuggestions) {
|
|
27
|
+
function renderReview(findings, report, includeSuggestions, failOn, allFindings, previousReviewState) {
|
|
26
28
|
const findingsWithLocation = findings.filter((f) => f.location);
|
|
29
|
+
// Determine review event type based on failOn threshold against ALL findings.
|
|
30
|
+
// Use allFindings (or report.findings) so failOn operates independently of commentOn and deduplication.
|
|
31
|
+
const event = determineReviewEvent(allFindings ?? report.findings, failOn, previousReviewState);
|
|
32
|
+
// If no comments to post, only create a review if REQUEST_CHANGES or APPROVE is needed
|
|
33
|
+
// This ensures failOn can block the PR even when commentOn filters out all findings,
|
|
34
|
+
// and APPROVE can clear a previous REQUEST_CHANGES
|
|
27
35
|
if (findingsWithLocation.length === 0) {
|
|
36
|
+
if (event === 'REQUEST_CHANGES') {
|
|
37
|
+
return {
|
|
38
|
+
event,
|
|
39
|
+
// GitHub API requires non-empty body for REQUEST_CHANGES
|
|
40
|
+
body: 'Findings exceed the configured threshold. See the GitHub Check for details.',
|
|
41
|
+
comments: [],
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
if (event === 'APPROVE') {
|
|
45
|
+
return {
|
|
46
|
+
event,
|
|
47
|
+
body: 'All previously reported issues have been resolved.',
|
|
48
|
+
comments: [],
|
|
49
|
+
};
|
|
50
|
+
}
|
|
28
51
|
return undefined;
|
|
29
52
|
}
|
|
30
53
|
const comments = findingsWithLocation.map((finding) => {
|
|
@@ -53,14 +76,35 @@ function renderReview(findings, report, includeSuggestions) {
|
|
|
53
76
|
start_side: isMultiLine ? 'RIGHT' : undefined,
|
|
54
77
|
};
|
|
55
78
|
});
|
|
56
|
-
const hasBlockingSeverity = findings.some((f) => f.severity === 'critical' || f.severity === 'high');
|
|
57
|
-
const event = hasBlockingSeverity ? 'REQUEST_CHANGES' : 'COMMENT';
|
|
58
79
|
return {
|
|
59
80
|
event,
|
|
60
81
|
body: '',
|
|
61
82
|
comments,
|
|
62
83
|
};
|
|
63
84
|
}
|
|
85
|
+
/**
|
|
86
|
+
* Determine the PR review event type based on failOn threshold and previous review state.
|
|
87
|
+
* Returns:
|
|
88
|
+
* - REQUEST_CHANGES if failOn is set and findings meet/exceed the threshold
|
|
89
|
+
* - APPROVE if failOn is set, we previously requested changes, and no longer have blocking findings
|
|
90
|
+
* - COMMENT otherwise
|
|
91
|
+
*/
|
|
92
|
+
function determineReviewEvent(findings, failOn, previousReviewState) {
|
|
93
|
+
// failOn must be set (and not 'off') for REQUEST_CHANGES or APPROVE
|
|
94
|
+
const hasActiveThreshold = failOn && failOn !== 'off';
|
|
95
|
+
// Check if any finding meets or exceeds the failOn threshold
|
|
96
|
+
const hasBlockingFinding = hasActiveThreshold &&
|
|
97
|
+
findings.some((f) => SEVERITY_ORDER[f.severity] <= SEVERITY_ORDER[failOn]);
|
|
98
|
+
if (hasBlockingFinding) {
|
|
99
|
+
return 'REQUEST_CHANGES';
|
|
100
|
+
}
|
|
101
|
+
// Only approve if we have an active threshold configured.
|
|
102
|
+
// Without failOn, approval is meaningless (we never would have requested changes).
|
|
103
|
+
if (hasActiveThreshold && previousReviewState === 'CHANGES_REQUESTED') {
|
|
104
|
+
return 'APPROVE';
|
|
105
|
+
}
|
|
106
|
+
return 'COMMENT';
|
|
107
|
+
}
|
|
64
108
|
function renderSuggestion(description, diff) {
|
|
65
109
|
const suggestionLines = diff
|
|
66
110
|
.split('\n')
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderer.js","sourceRoot":"","sources":["../../src/output/renderer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAG7E,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAC7F,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C,MAAM,cAAc,GAA6B;IAC/C,QAAQ,EAAE,kBAAkB;IAC5B,IAAI,EAAE,WAAW;IACjB,MAAM,EAAE,iBAAiB;IACzB,GAAG,EAAE,qBAAqB;IAC1B,IAAI,EAAE,sBAAsB;CAC7B,CAAC;AAEF,MAAM,UAAU,iBAAiB,CAAC,MAAmB,EAAE,UAAyB,EAAE;IAChF,MAAM,EAAE,kBAAkB,GAAG,IAAI,EAAE,WAAW,EAAE,WAAW,GAAG,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"renderer.js","sourceRoot":"","sources":["../../src/output/renderer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stale.d.ts","sourceRoot":"","sources":["../../src/output/stale.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAG7D;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,8CAA8C;IAC9C,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CACpB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,UAAU,EAAE,GAAG,aAAa,CAI3E;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,aAAa,GAAG,OAAO,CAEzF;AAoCD;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,gBAAgB,EAAE,eAAe,EAAE,EACnC,WAAW,EAAE,OAAO,EAAE,EACtB,KAAK,EAAE,aAAa,GACnB,eAAe,EAAE,CAgCnB;AAgBD;;;;GAIG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,OAAO,EAChB,aAAa,EAAE,eAAe,EAAE,GAC/B,OAAO,CAAC,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"stale.d.ts","sourceRoot":"","sources":["../../src/output/stale.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAG7D;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,8CAA8C;IAC9C,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CACpB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,UAAU,EAAE,GAAG,aAAa,CAI3E;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,aAAa,GAAG,OAAO,CAEzF;AAoCD;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,gBAAgB,EAAE,eAAe,EAAE,EACnC,WAAW,EAAE,OAAO,EAAE,EACtB,KAAK,EAAE,aAAa,GACnB,eAAe,EAAE,CAgCnB;AAgBD;;;;GAIG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,OAAO,EAChB,aAAa,EAAE,eAAe,EAAE,GAC/B,OAAO,CAAC,MAAM,CAAC,CAmCjB"}
|
package/dist/output/stale.js
CHANGED
|
@@ -106,6 +106,13 @@ export async function resolveStaleComments(octokit, staleComments) {
|
|
|
106
106
|
resolvedCount++;
|
|
107
107
|
}
|
|
108
108
|
catch (error) {
|
|
109
|
+
const errorMessage = String(error);
|
|
110
|
+
if (errorMessage.includes('Resource not accessible')) {
|
|
111
|
+
// Permission error affects all threads; log once and stop trying
|
|
112
|
+
console.warn(`Failed to resolve thread: GitHub App may need 'contents:write' permission. ` +
|
|
113
|
+
`See: https://github.com/orgs/community/discussions/44650`);
|
|
114
|
+
break;
|
|
115
|
+
}
|
|
109
116
|
console.warn(`Failed to resolve thread for comment ${comment.id}: ${error}`);
|
|
110
117
|
}
|
|
111
118
|
}
|
package/dist/output/stale.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stale.js","sourceRoot":"","sources":["../../src/output/stale.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"stale.js","sourceRoot":"","sources":["../../src/output/stale.ts"],"names":[],"mappings":"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"}
|
package/dist/output/types.d.ts
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
import type { SeverityThreshold } from '../types/index.js';
|
|
1
|
+
import type { SeverityThreshold, Finding } from '../types/index.js';
|
|
2
|
+
/** GitHub PR review states that Warden tracks */
|
|
3
|
+
export type ReviewState = 'CHANGES_REQUESTED' | 'APPROVED' | 'COMMENTED';
|
|
2
4
|
export interface GitHubComment {
|
|
3
5
|
body: string;
|
|
4
6
|
path?: string;
|
|
@@ -23,9 +25,21 @@ export interface RenderOptions {
|
|
|
23
25
|
extraLabels?: string[];
|
|
24
26
|
/** Only include findings at or above this severity level in rendered output. Use 'off' to disable comments. */
|
|
25
27
|
commentOn?: SeverityThreshold;
|
|
28
|
+
/** Fail threshold - determines REQUEST_CHANGES vs COMMENT for PR reviews */
|
|
29
|
+
failOn?: SeverityThreshold;
|
|
26
30
|
/** URL to the GitHub Check run containing the full report (used when findings are filtered) */
|
|
27
31
|
checkRunUrl?: string;
|
|
28
32
|
/** Total number of findings before filtering (used to show "X more findings" link) */
|
|
29
33
|
totalFindings?: number;
|
|
34
|
+
/**
|
|
35
|
+
* Original findings for failOn evaluation. Use when report.findings has been
|
|
36
|
+
* modified (e.g., for deduplication) but failOn should evaluate against all findings.
|
|
37
|
+
*/
|
|
38
|
+
allFindings?: Finding[];
|
|
39
|
+
/**
|
|
40
|
+
* Previous Warden review state on this PR. When set to 'CHANGES_REQUESTED' and
|
|
41
|
+
* current run has no blocking findings, the review will be APPROVE to clear the block.
|
|
42
|
+
*/
|
|
43
|
+
previousReviewState?: ReviewState | null;
|
|
30
44
|
}
|
|
31
45
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/output/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/output/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAEpE,iDAAiD;AACjD,MAAM,MAAM,WAAW,GAAG,mBAAmB,GAAG,UAAU,GAAG,WAAW,CAAC;AAEzE,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CAC/B;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,SAAS,GAAG,iBAAiB,GAAG,SAAS,CAAC;IACjD,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,aAAa,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,+GAA+G;IAC/G,SAAS,CAAC,EAAE,iBAAiB,CAAC;IAC9B,4EAA4E;IAC5E,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAC3B,+FAA+F;IAC/F,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,sFAAsF;IACtF,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;OAGG;IACH,WAAW,CAAC,EAAE,OAAO,EAAE,CAAC;IACxB;;;OAGG;IACH,mBAAmB,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;CAC1C"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { SkillDefinition } from '../config/schema.js';
|
|
2
|
+
import type { Finding } from '../types/index.js';
|
|
3
|
+
import { type PRPromptContext } from './prompt.js';
|
|
4
|
+
import { type SkillRunnerOptions, type PreparedFile, type FileAnalysisCallbacks, type FileAnalysisResult } from './types.js';
|
|
5
|
+
import type { EventContext, SkillReport } from '../types/index.js';
|
|
6
|
+
/**
|
|
7
|
+
* Analyze a single prepared file's hunks.
|
|
8
|
+
*/
|
|
9
|
+
export declare function analyzeFile(skill: SkillDefinition, file: PreparedFile, repoPath: string, options?: SkillRunnerOptions, callbacks?: FileAnalysisCallbacks, prContext?: PRPromptContext): Promise<FileAnalysisResult>;
|
|
10
|
+
/**
|
|
11
|
+
* Generate a summary of findings.
|
|
12
|
+
*/
|
|
13
|
+
export declare function generateSummary(skillName: string, findings: Finding[]): string;
|
|
14
|
+
/**
|
|
15
|
+
* Run a skill on a PR, analyzing each hunk separately.
|
|
16
|
+
*/
|
|
17
|
+
export declare function runSkill(skill: SkillDefinition, context: EventContext, options?: SkillRunnerOptions): Promise<SkillReport>;
|
|
18
|
+
//# sourceMappingURL=analyze.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyze.d.ts","sourceRoot":"","sources":["../../src/sdk/analyze.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,KAAK,EAAE,OAAO,EAAe,MAAM,mBAAmB,CAAC;AAK9D,OAAO,EAA8C,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AAE/F,OAAO,EAKL,KAAK,kBAAkB,EACvB,KAAK,YAAY,EACjB,KAAK,qBAAqB,EAC1B,KAAK,kBAAkB,EACxB,MAAM,YAAY,CAAC;AAEpB,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAc,MAAM,mBAAmB,CAAC;AA4S/E;;GAEG;AACH,wBAAsB,WAAW,CAC/B,KAAK,EAAE,eAAe,EACtB,IAAI,EAAE,YAAY,EAClB,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,kBAAuB,EAChC,SAAS,CAAC,EAAE,qBAAqB,EACjC,SAAS,CAAC,EAAE,eAAe,GAC1B,OAAO,CAAC,kBAAkB,CAAC,CA8C7B;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,MAAM,CAkB9E;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAC5B,KAAK,EAAE,eAAe,EACtB,OAAO,EAAE,YAAY,EACrB,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,WAAW,CAAC,CAkKtB"}
|
|
@@ -0,0 +1,425 @@
|
|
|
1
|
+
import { query } from '@anthropic-ai/claude-agent-sdk';
|
|
2
|
+
import { SkillRunnerError, WardenAuthenticationError, isRetryableError, isAuthenticationError, isAuthenticationErrorMessage } from './errors.js';
|
|
3
|
+
import { DEFAULT_RETRY_CONFIG, calculateRetryDelay, sleep } from './retry.js';
|
|
4
|
+
import { extractUsage, aggregateUsage, emptyUsage, estimateTokens } from './usage.js';
|
|
5
|
+
import { buildHunkSystemPrompt, buildHunkUserPrompt } from './prompt.js';
|
|
6
|
+
import { extractFindingsJson, extractFindingsWithLLM, validateFindings, deduplicateFindings } from './extract.js';
|
|
7
|
+
import { LARGE_PROMPT_THRESHOLD_CHARS, DEFAULT_FILE_CONCURRENCY, } from './types.js';
|
|
8
|
+
import { prepareFiles } from './prepare.js';
|
|
9
|
+
/**
|
|
10
|
+
* Parse findings from a hunk analysis result.
|
|
11
|
+
* Uses a two-tier extraction strategy:
|
|
12
|
+
* 1. Regex-based extraction (fast, handles well-formed output)
|
|
13
|
+
* 2. LLM fallback using haiku (handles malformed output gracefully)
|
|
14
|
+
*/
|
|
15
|
+
async function parseHunkOutput(result, filename, apiKey) {
|
|
16
|
+
if (result.subtype !== 'success') {
|
|
17
|
+
// SDK error - not an extraction failure, just no findings
|
|
18
|
+
return { findings: [], extractionFailed: false };
|
|
19
|
+
}
|
|
20
|
+
// Tier 1: Try regex-based extraction first (fast)
|
|
21
|
+
const extracted = extractFindingsJson(result.result);
|
|
22
|
+
if (extracted.success) {
|
|
23
|
+
return { findings: validateFindings(extracted.findings, filename), extractionFailed: false };
|
|
24
|
+
}
|
|
25
|
+
// Tier 2: Try LLM fallback for malformed output
|
|
26
|
+
const fallback = await extractFindingsWithLLM(result.result, apiKey);
|
|
27
|
+
if (fallback.success) {
|
|
28
|
+
return { findings: validateFindings(fallback.findings, filename), extractionFailed: false };
|
|
29
|
+
}
|
|
30
|
+
// Both tiers failed - return extraction failure info
|
|
31
|
+
return {
|
|
32
|
+
findings: [],
|
|
33
|
+
extractionFailed: true,
|
|
34
|
+
extractionError: fallback.error,
|
|
35
|
+
extractionPreview: fallback.preview,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Execute a single SDK query attempt.
|
|
40
|
+
*/
|
|
41
|
+
async function executeQuery(systemPrompt, userPrompt, repoPath, options) {
|
|
42
|
+
const { maxTurns = 50, model, abortController, pathToClaudeCodeExecutable } = options;
|
|
43
|
+
const stream = query({
|
|
44
|
+
prompt: userPrompt,
|
|
45
|
+
options: {
|
|
46
|
+
maxTurns,
|
|
47
|
+
cwd: repoPath,
|
|
48
|
+
systemPrompt,
|
|
49
|
+
// Only allow read-only tools - context is already provided in the prompt
|
|
50
|
+
allowedTools: ['Read', 'Grep'],
|
|
51
|
+
// Explicitly block modification/side-effect tools as defense-in-depth
|
|
52
|
+
disallowedTools: ['Write', 'Edit', 'Bash', 'WebFetch', 'WebSearch', 'Task', 'TodoWrite'],
|
|
53
|
+
permissionMode: 'bypassPermissions',
|
|
54
|
+
model,
|
|
55
|
+
abortController,
|
|
56
|
+
pathToClaudeCodeExecutable,
|
|
57
|
+
},
|
|
58
|
+
});
|
|
59
|
+
let resultMessage;
|
|
60
|
+
let authError;
|
|
61
|
+
for await (const message of stream) {
|
|
62
|
+
if (message.type === 'result') {
|
|
63
|
+
resultMessage = message;
|
|
64
|
+
}
|
|
65
|
+
else if (message.type === 'auth_status' && message.error) {
|
|
66
|
+
// Capture authentication errors from auth_status messages
|
|
67
|
+
authError = message.error;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return { result: resultMessage, authError };
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Analyze a single hunk with retry logic for transient failures.
|
|
74
|
+
*/
|
|
75
|
+
async function analyzeHunk(skill, hunkCtx, repoPath, options, callbacks, prContext) {
|
|
76
|
+
const { apiKey, abortController, retry } = options;
|
|
77
|
+
const systemPrompt = buildHunkSystemPrompt(skill);
|
|
78
|
+
const userPrompt = buildHunkUserPrompt(skill, hunkCtx, prContext);
|
|
79
|
+
// Report prompt size information
|
|
80
|
+
const systemChars = systemPrompt.length;
|
|
81
|
+
const userChars = userPrompt.length;
|
|
82
|
+
const totalChars = systemChars + userChars;
|
|
83
|
+
const estimatedTokensCount = estimateTokens(totalChars);
|
|
84
|
+
// Always call onPromptSize if provided (for debug mode)
|
|
85
|
+
callbacks?.onPromptSize?.(callbacks.lineRange, systemChars, userChars, totalChars, estimatedTokensCount);
|
|
86
|
+
// Warn about large prompts
|
|
87
|
+
if (totalChars > LARGE_PROMPT_THRESHOLD_CHARS) {
|
|
88
|
+
callbacks?.onLargePrompt?.(callbacks.lineRange, totalChars, estimatedTokensCount);
|
|
89
|
+
}
|
|
90
|
+
// Merge retry config with defaults
|
|
91
|
+
const retryConfig = {
|
|
92
|
+
...DEFAULT_RETRY_CONFIG,
|
|
93
|
+
...retry,
|
|
94
|
+
};
|
|
95
|
+
let lastError;
|
|
96
|
+
// Track accumulated usage across retry attempts for accurate cost reporting
|
|
97
|
+
const accumulatedUsage = [];
|
|
98
|
+
for (let attempt = 0; attempt <= retryConfig.maxRetries; attempt++) {
|
|
99
|
+
// Check for abort before each attempt
|
|
100
|
+
if (abortController?.signal.aborted) {
|
|
101
|
+
return { findings: [], usage: aggregateUsage(accumulatedUsage), failed: true, extractionFailed: false };
|
|
102
|
+
}
|
|
103
|
+
try {
|
|
104
|
+
const { result: resultMessage, authError } = await executeQuery(systemPrompt, userPrompt, repoPath, options);
|
|
105
|
+
// Check for authentication errors from auth_status messages
|
|
106
|
+
if (authError) {
|
|
107
|
+
if (isAuthenticationErrorMessage(authError)) {
|
|
108
|
+
throw new WardenAuthenticationError();
|
|
109
|
+
}
|
|
110
|
+
// Non-auth error from auth_status - log and treat as failure
|
|
111
|
+
console.error(`SDK auth error: ${authError}`);
|
|
112
|
+
return { findings: [], usage: aggregateUsage(accumulatedUsage), failed: true, extractionFailed: false };
|
|
113
|
+
}
|
|
114
|
+
if (!resultMessage) {
|
|
115
|
+
console.error('SDK returned no result');
|
|
116
|
+
return { findings: [], usage: aggregateUsage(accumulatedUsage), failed: true, extractionFailed: false };
|
|
117
|
+
}
|
|
118
|
+
// Extract usage from the result, regardless of success/error status
|
|
119
|
+
const usage = extractUsage(resultMessage);
|
|
120
|
+
accumulatedUsage.push(usage);
|
|
121
|
+
// Check if the SDK returned an error result (e.g., max turns, budget exceeded)
|
|
122
|
+
const isError = resultMessage.is_error || resultMessage.subtype !== 'success';
|
|
123
|
+
if (isError) {
|
|
124
|
+
// Extract error messages from SDK result
|
|
125
|
+
const errorMessages = 'errors' in resultMessage ? resultMessage.errors : [];
|
|
126
|
+
// Check if any error indicates authentication failure
|
|
127
|
+
for (const err of errorMessages) {
|
|
128
|
+
if (isAuthenticationErrorMessage(err)) {
|
|
129
|
+
throw new WardenAuthenticationError();
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
// SDK error - log and return failure with error details
|
|
133
|
+
const errorSummary = errorMessages.length > 0
|
|
134
|
+
? errorMessages.join('; ')
|
|
135
|
+
: `SDK error: ${resultMessage.subtype}`;
|
|
136
|
+
console.error(`SDK execution failed: ${errorSummary}`);
|
|
137
|
+
return {
|
|
138
|
+
findings: [],
|
|
139
|
+
usage: aggregateUsage(accumulatedUsage),
|
|
140
|
+
failed: true,
|
|
141
|
+
extractionFailed: false,
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
const parseResult = await parseHunkOutput(resultMessage, hunkCtx.filename, apiKey);
|
|
145
|
+
// Notify about extraction failure if callback provided
|
|
146
|
+
if (parseResult.extractionFailed) {
|
|
147
|
+
callbacks?.onExtractionFailure?.(callbacks.lineRange, parseResult.extractionError ?? 'unknown_error', parseResult.extractionPreview ?? '');
|
|
148
|
+
}
|
|
149
|
+
return {
|
|
150
|
+
findings: parseResult.findings,
|
|
151
|
+
usage: aggregateUsage(accumulatedUsage),
|
|
152
|
+
failed: false,
|
|
153
|
+
extractionFailed: parseResult.extractionFailed,
|
|
154
|
+
extractionError: parseResult.extractionError,
|
|
155
|
+
extractionPreview: parseResult.extractionPreview,
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
catch (error) {
|
|
159
|
+
lastError = error;
|
|
160
|
+
// Re-throw authentication errors (they shouldn't be retried)
|
|
161
|
+
if (error instanceof WardenAuthenticationError) {
|
|
162
|
+
throw error;
|
|
163
|
+
}
|
|
164
|
+
// Authentication errors should surface immediately with helpful guidance
|
|
165
|
+
if (isAuthenticationError(error)) {
|
|
166
|
+
throw new WardenAuthenticationError();
|
|
167
|
+
}
|
|
168
|
+
// Don't retry if not a retryable error or we've exhausted retries
|
|
169
|
+
if (!isRetryableError(error) || attempt >= retryConfig.maxRetries) {
|
|
170
|
+
break;
|
|
171
|
+
}
|
|
172
|
+
// Calculate delay and wait before retry
|
|
173
|
+
const delayMs = calculateRetryDelay(attempt, retryConfig);
|
|
174
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
175
|
+
// Notify about retry in verbose mode
|
|
176
|
+
callbacks?.onRetry?.(callbacks.lineRange, attempt + 1, retryConfig.maxRetries, errorMessage, delayMs);
|
|
177
|
+
try {
|
|
178
|
+
await sleep(delayMs, abortController?.signal);
|
|
179
|
+
}
|
|
180
|
+
catch {
|
|
181
|
+
// Aborted during sleep
|
|
182
|
+
return { findings: [], usage: aggregateUsage(accumulatedUsage), failed: true, extractionFailed: false };
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
// All attempts failed - return failure with any accumulated usage
|
|
187
|
+
const finalError = lastError instanceof Error ? lastError.message : String(lastError);
|
|
188
|
+
// Log the final error
|
|
189
|
+
if (lastError) {
|
|
190
|
+
console.error(`All retry attempts failed: ${finalError}`);
|
|
191
|
+
}
|
|
192
|
+
// Also notify via callback if verbose
|
|
193
|
+
if (options.verbose) {
|
|
194
|
+
callbacks?.onRetry?.(callbacks.lineRange, retryConfig.maxRetries + 1, retryConfig.maxRetries, `Final failure: ${finalError}`, 0);
|
|
195
|
+
}
|
|
196
|
+
return { findings: [], usage: aggregateUsage(accumulatedUsage), failed: true, extractionFailed: false };
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Get line range string for a hunk.
|
|
200
|
+
*/
|
|
201
|
+
function getHunkLineRange(hunk) {
|
|
202
|
+
const start = hunk.hunk.newStart;
|
|
203
|
+
const end = start + hunk.hunk.newCount - 1;
|
|
204
|
+
return start === end ? `${start}` : `${start}-${end}`;
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Attach elapsed time to findings if skill start time is available.
|
|
208
|
+
*/
|
|
209
|
+
function attachElapsedTime(findings, skillStartTime) {
|
|
210
|
+
if (skillStartTime === undefined)
|
|
211
|
+
return;
|
|
212
|
+
const elapsedMs = Date.now() - skillStartTime;
|
|
213
|
+
for (const finding of findings) {
|
|
214
|
+
finding.elapsedMs = elapsedMs;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Analyze a single prepared file's hunks.
|
|
219
|
+
*/
|
|
220
|
+
export async function analyzeFile(skill, file, repoPath, options = {}, callbacks, prContext) {
|
|
221
|
+
const { abortController } = options;
|
|
222
|
+
const fileFindings = [];
|
|
223
|
+
const fileUsage = [];
|
|
224
|
+
let failedHunks = 0;
|
|
225
|
+
let failedExtractions = 0;
|
|
226
|
+
for (const [hunkIndex, hunk] of file.hunks.entries()) {
|
|
227
|
+
if (abortController?.signal.aborted)
|
|
228
|
+
break;
|
|
229
|
+
const lineRange = getHunkLineRange(hunk);
|
|
230
|
+
callbacks?.onHunkStart?.(hunkIndex + 1, file.hunks.length, lineRange);
|
|
231
|
+
const hunkCallbacks = callbacks
|
|
232
|
+
? {
|
|
233
|
+
lineRange,
|
|
234
|
+
onLargePrompt: callbacks.onLargePrompt,
|
|
235
|
+
onPromptSize: callbacks.onPromptSize,
|
|
236
|
+
onRetry: callbacks.onRetry,
|
|
237
|
+
onExtractionFailure: callbacks.onExtractionFailure,
|
|
238
|
+
}
|
|
239
|
+
: undefined;
|
|
240
|
+
const result = await analyzeHunk(skill, hunk, repoPath, options, hunkCallbacks, prContext);
|
|
241
|
+
if (result.failed) {
|
|
242
|
+
failedHunks++;
|
|
243
|
+
}
|
|
244
|
+
if (result.extractionFailed) {
|
|
245
|
+
failedExtractions++;
|
|
246
|
+
}
|
|
247
|
+
attachElapsedTime(result.findings, callbacks?.skillStartTime);
|
|
248
|
+
callbacks?.onHunkComplete?.(hunkIndex + 1, result.findings);
|
|
249
|
+
fileFindings.push(...result.findings);
|
|
250
|
+
fileUsage.push(result.usage);
|
|
251
|
+
}
|
|
252
|
+
return {
|
|
253
|
+
filename: file.filename,
|
|
254
|
+
findings: fileFindings,
|
|
255
|
+
usage: aggregateUsage(fileUsage),
|
|
256
|
+
failedHunks,
|
|
257
|
+
failedExtractions,
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Generate a summary of findings.
|
|
262
|
+
*/
|
|
263
|
+
export function generateSummary(skillName, findings) {
|
|
264
|
+
if (findings.length === 0) {
|
|
265
|
+
return `${skillName}: No issues found`;
|
|
266
|
+
}
|
|
267
|
+
const counts = {};
|
|
268
|
+
for (const f of findings) {
|
|
269
|
+
counts[f.severity] = (counts[f.severity] ?? 0) + 1;
|
|
270
|
+
}
|
|
271
|
+
const parts = [];
|
|
272
|
+
if (counts['critical'])
|
|
273
|
+
parts.push(`${counts['critical']} critical`);
|
|
274
|
+
if (counts['high'])
|
|
275
|
+
parts.push(`${counts['high']} high`);
|
|
276
|
+
if (counts['medium'])
|
|
277
|
+
parts.push(`${counts['medium']} medium`);
|
|
278
|
+
if (counts['low'])
|
|
279
|
+
parts.push(`${counts['low']} low`);
|
|
280
|
+
if (counts['info'])
|
|
281
|
+
parts.push(`${counts['info']} info`);
|
|
282
|
+
return `${skillName}: Found ${findings.length} issue${findings.length === 1 ? '' : 's'} (${parts.join(', ')})`;
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* Run a skill on a PR, analyzing each hunk separately.
|
|
286
|
+
*/
|
|
287
|
+
export async function runSkill(skill, context, options = {}) {
|
|
288
|
+
const { parallel = true, callbacks, abortController } = options;
|
|
289
|
+
const startTime = Date.now();
|
|
290
|
+
if (!context.pullRequest) {
|
|
291
|
+
throw new SkillRunnerError('Pull request context required for skill execution');
|
|
292
|
+
}
|
|
293
|
+
const { files: fileHunks, skippedFiles } = prepareFiles(context, {
|
|
294
|
+
contextLines: options.contextLines,
|
|
295
|
+
// Note: chunking config should come from the caller (e.g., from warden.toml defaults)
|
|
296
|
+
// For now, we use built-in defaults. The caller can pass explicit chunking config.
|
|
297
|
+
});
|
|
298
|
+
if (fileHunks.length === 0) {
|
|
299
|
+
const report = {
|
|
300
|
+
skill: skill.name,
|
|
301
|
+
summary: 'No code changes to analyze',
|
|
302
|
+
findings: [],
|
|
303
|
+
usage: emptyUsage(),
|
|
304
|
+
durationMs: Date.now() - startTime,
|
|
305
|
+
};
|
|
306
|
+
if (skippedFiles.length > 0) {
|
|
307
|
+
report.skippedFiles = skippedFiles;
|
|
308
|
+
}
|
|
309
|
+
return report;
|
|
310
|
+
}
|
|
311
|
+
const totalFiles = fileHunks.length;
|
|
312
|
+
const allFindings = [];
|
|
313
|
+
// Track all usage stats for aggregation
|
|
314
|
+
const allUsage = [];
|
|
315
|
+
// Track failed hunks across all files
|
|
316
|
+
let totalFailedHunks = 0;
|
|
317
|
+
let totalFailedExtractions = 0;
|
|
318
|
+
// Build PR context for inclusion in prompts (helps LLM understand the full scope of changes)
|
|
319
|
+
const prContext = {
|
|
320
|
+
changedFiles: context.pullRequest.files.map((f) => f.filename),
|
|
321
|
+
title: context.pullRequest.title,
|
|
322
|
+
body: context.pullRequest.body,
|
|
323
|
+
};
|
|
324
|
+
/**
|
|
325
|
+
* Process all hunks for a single file sequentially.
|
|
326
|
+
* Wraps analyzeFile with progress callbacks.
|
|
327
|
+
*/
|
|
328
|
+
async function processFile(fileHunkEntry, fileIndex) {
|
|
329
|
+
const { filename } = fileHunkEntry;
|
|
330
|
+
callbacks?.onFileStart?.(filename, fileIndex, totalFiles);
|
|
331
|
+
const fileCallbacks = {
|
|
332
|
+
skillStartTime: callbacks?.skillStartTime,
|
|
333
|
+
onHunkStart: (hunkNum, totalHunks, lineRange) => {
|
|
334
|
+
callbacks?.onHunkStart?.(filename, hunkNum, totalHunks, lineRange);
|
|
335
|
+
},
|
|
336
|
+
onHunkComplete: (hunkNum, findings) => {
|
|
337
|
+
callbacks?.onHunkComplete?.(filename, hunkNum, findings);
|
|
338
|
+
},
|
|
339
|
+
onLargePrompt: callbacks?.onLargePrompt
|
|
340
|
+
? (lineRange, chars, estTokens) => {
|
|
341
|
+
callbacks.onLargePrompt?.(filename, lineRange, chars, estTokens);
|
|
342
|
+
}
|
|
343
|
+
: undefined,
|
|
344
|
+
onPromptSize: callbacks?.onPromptSize
|
|
345
|
+
? (lineRange, systemChars, userChars, totalCharsVal, estTokens) => {
|
|
346
|
+
callbacks.onPromptSize?.(filename, lineRange, systemChars, userChars, totalCharsVal, estTokens);
|
|
347
|
+
}
|
|
348
|
+
: undefined,
|
|
349
|
+
onRetry: callbacks?.onRetry
|
|
350
|
+
? (lineRange, attemptNum, maxRetries, error, delayMs) => {
|
|
351
|
+
callbacks.onRetry?.(filename, lineRange, attemptNum, maxRetries, error, delayMs);
|
|
352
|
+
}
|
|
353
|
+
: undefined,
|
|
354
|
+
onExtractionFailure: callbacks?.onExtractionFailure
|
|
355
|
+
? (lineRange, error, preview) => {
|
|
356
|
+
callbacks.onExtractionFailure?.(filename, lineRange, error, preview);
|
|
357
|
+
}
|
|
358
|
+
: undefined,
|
|
359
|
+
};
|
|
360
|
+
const result = await analyzeFile(skill, fileHunkEntry, context.repoPath, options, fileCallbacks, prContext);
|
|
361
|
+
callbacks?.onFileComplete?.(filename, fileIndex, totalFiles);
|
|
362
|
+
return result;
|
|
363
|
+
}
|
|
364
|
+
// Process files - parallel or sequential based on options
|
|
365
|
+
if (parallel) {
|
|
366
|
+
// Process files in parallel with concurrency limit
|
|
367
|
+
const fileConcurrency = options.concurrency ?? DEFAULT_FILE_CONCURRENCY;
|
|
368
|
+
const batchDelayMs = options.batchDelayMs ?? 0;
|
|
369
|
+
for (let i = 0; i < fileHunks.length; i += fileConcurrency) {
|
|
370
|
+
// Check for abort before starting new batch
|
|
371
|
+
if (abortController?.signal.aborted)
|
|
372
|
+
break;
|
|
373
|
+
// Apply rate limiting delay between batches (not before the first batch)
|
|
374
|
+
if (i > 0 && batchDelayMs > 0) {
|
|
375
|
+
await new Promise((resolve) => setTimeout(resolve, batchDelayMs));
|
|
376
|
+
}
|
|
377
|
+
const batch = fileHunks.slice(i, i + fileConcurrency);
|
|
378
|
+
const batchPromises = batch.map((fileHunkEntry, batchIndex) => processFile(fileHunkEntry, i + batchIndex));
|
|
379
|
+
const batchResults = await Promise.all(batchPromises);
|
|
380
|
+
for (const result of batchResults) {
|
|
381
|
+
allFindings.push(...result.findings);
|
|
382
|
+
allUsage.push(result.usage);
|
|
383
|
+
totalFailedHunks += result.failedHunks;
|
|
384
|
+
totalFailedExtractions += result.failedExtractions;
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
else {
|
|
389
|
+
// Process files sequentially
|
|
390
|
+
for (const [fileIndex, fileHunkEntry] of fileHunks.entries()) {
|
|
391
|
+
// Check for abort before starting new file
|
|
392
|
+
if (abortController?.signal.aborted)
|
|
393
|
+
break;
|
|
394
|
+
const result = await processFile(fileHunkEntry, fileIndex);
|
|
395
|
+
allFindings.push(...result.findings);
|
|
396
|
+
allUsage.push(result.usage);
|
|
397
|
+
totalFailedHunks += result.failedHunks;
|
|
398
|
+
totalFailedExtractions += result.failedExtractions;
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
// Deduplicate findings
|
|
402
|
+
const uniqueFindings = deduplicateFindings(allFindings);
|
|
403
|
+
// Generate summary
|
|
404
|
+
const summary = generateSummary(skill.name, uniqueFindings);
|
|
405
|
+
// Aggregate usage across all hunks
|
|
406
|
+
const totalUsage = aggregateUsage(allUsage);
|
|
407
|
+
const report = {
|
|
408
|
+
skill: skill.name,
|
|
409
|
+
summary,
|
|
410
|
+
findings: uniqueFindings,
|
|
411
|
+
usage: totalUsage,
|
|
412
|
+
durationMs: Date.now() - startTime,
|
|
413
|
+
};
|
|
414
|
+
if (skippedFiles.length > 0) {
|
|
415
|
+
report.skippedFiles = skippedFiles;
|
|
416
|
+
}
|
|
417
|
+
if (totalFailedHunks > 0) {
|
|
418
|
+
report.failedHunks = totalFailedHunks;
|
|
419
|
+
}
|
|
420
|
+
if (totalFailedExtractions > 0) {
|
|
421
|
+
report.failedExtractions = totalFailedExtractions;
|
|
422
|
+
}
|
|
423
|
+
return report;
|
|
424
|
+
}
|
|
425
|
+
//# sourceMappingURL=analyze.js.map
|