@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
|
@@ -0,0 +1,328 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cache Store Module
|
|
3
|
+
* Stores and retrieves cached review results
|
|
4
|
+
* Uses GitHub Actions cache in CI, file-based cache locally
|
|
5
|
+
*/
|
|
6
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync, readdirSync, unlinkSync } from 'fs';
|
|
7
|
+
import { join, resolve, sep } from 'path';
|
|
8
|
+
import { homedir } from 'os';
|
|
9
|
+
import { AgentResultSchema } from '../agents/types.js';
|
|
10
|
+
import { AI_REVIEW_CACHE_PATH, CACHE_KEY_PREFIX, generateRestoreKeyPrefix } from './key.js';
|
|
11
|
+
import { buildRouterEnv } from '../agents/security.js';
|
|
12
|
+
/** Default TTL: 24 hours */
|
|
13
|
+
const DEFAULT_TTL_SECONDS = 24 * 60 * 60;
|
|
14
|
+
/** In-memory cache for current session */
|
|
15
|
+
const memoryCache = new Map();
|
|
16
|
+
/** Cache directory path */
|
|
17
|
+
function getCacheDir() {
|
|
18
|
+
// Use GITHUB_WORKSPACE in CI, otherwise ~/.ai-review-cache
|
|
19
|
+
const routerEnv = buildRouterEnv(process.env);
|
|
20
|
+
const base = routerEnv['GITHUB_WORKSPACE'] || homedir();
|
|
21
|
+
return join(base, AI_REVIEW_CACHE_PATH);
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Check if we're running in GitHub Actions
|
|
25
|
+
*/
|
|
26
|
+
function isGitHubActions() {
|
|
27
|
+
const routerEnv = buildRouterEnv(process.env);
|
|
28
|
+
return routerEnv['GITHUB_ACTIONS'] === 'true';
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Ensure cache directory exists
|
|
32
|
+
*/
|
|
33
|
+
function ensureCacheDir() {
|
|
34
|
+
const dir = getCacheDir();
|
|
35
|
+
if (!existsSync(dir)) {
|
|
36
|
+
mkdirSync(dir, { recursive: true });
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Validate cache key to prevent path traversal and injection attacks.
|
|
41
|
+
*
|
|
42
|
+
* Keys must match the format from generateCacheKey(): ai-review-v{N}-{prNumber}-{hash}
|
|
43
|
+
* Only alphanumeric characters and dashes are allowed.
|
|
44
|
+
*
|
|
45
|
+
* SECURITY: Explicit rejection of dangerous characters (defense in depth):
|
|
46
|
+
* - Path separators: / \ (directory traversal)
|
|
47
|
+
* - URL encoding: % (bypass via encoding)
|
|
48
|
+
* - Drive letters: : (Windows absolute paths)
|
|
49
|
+
* - Traversal sequences: .. (parent directory access)
|
|
50
|
+
* - Whitespace and control chars (injection vectors)
|
|
51
|
+
* - Shell metacharacters: ; & | ` $ ( ) (command injection)
|
|
52
|
+
*/
|
|
53
|
+
function isValidCacheKey(key) {
|
|
54
|
+
// Empty or excessively long keys are invalid
|
|
55
|
+
if (!key || key.length > 256) {
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
// Explicit rejection list (defense in depth)
|
|
59
|
+
const FORBIDDEN_CHARS = /[/\\%:\s;&|`$()]/;
|
|
60
|
+
if (FORBIDDEN_CHARS.test(key)) {
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
// Path traversal sequences
|
|
64
|
+
if (key.includes('..')) {
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
// Must match strict allowlist: alphanumeric + dashes only
|
|
68
|
+
// This matches generateCacheKey output: ai-review-v{N}-{prNumber}-{hash}
|
|
69
|
+
return /^[a-zA-Z0-9-]+$/.test(key);
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Get cache file path for a key.
|
|
73
|
+
* Validates key format and ensures resolved path stays under cache root.
|
|
74
|
+
*/
|
|
75
|
+
function getCacheFilePath(key) {
|
|
76
|
+
if (!isValidCacheKey(key)) {
|
|
77
|
+
throw new Error(`Invalid cache key format: ${key}`);
|
|
78
|
+
}
|
|
79
|
+
const cacheDir = getCacheDir();
|
|
80
|
+
const filePath = join(cacheDir, `${key}.json`);
|
|
81
|
+
// Ensure resolved path is under cache directory (defense in depth)
|
|
82
|
+
// Use cacheDir + sep to prevent prefix attacks (e.g., /cache vs /cache-evil)
|
|
83
|
+
const resolvedPath = resolve(filePath);
|
|
84
|
+
const resolvedCacheDir = resolve(cacheDir);
|
|
85
|
+
if (!resolvedPath.startsWith(resolvedCacheDir + sep)) {
|
|
86
|
+
throw new Error(`Cache path traversal detected: ${key}`);
|
|
87
|
+
}
|
|
88
|
+
return filePath;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Validate a cached result against AgentResultSchema
|
|
92
|
+
*
|
|
93
|
+
* (012-fix-agent-result-regressions) - Validates cache entries to handle:
|
|
94
|
+
* - Legacy cache entries (success: boolean format) → return null (cache miss)
|
|
95
|
+
* - Malformed/corrupted entries → return null (cache miss)
|
|
96
|
+
* - New-format entries (discriminated union with status field) → return result
|
|
97
|
+
*/
|
|
98
|
+
function validateCachedResult(result) {
|
|
99
|
+
const parseResult = AgentResultSchema.safeParse(result);
|
|
100
|
+
if (!parseResult.success) {
|
|
101
|
+
// Legacy or malformed cache entry - treat as cache miss
|
|
102
|
+
return null;
|
|
103
|
+
}
|
|
104
|
+
return parseResult.data;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Get a cached result
|
|
108
|
+
*/
|
|
109
|
+
export async function getCached(key) {
|
|
110
|
+
// Check memory cache first
|
|
111
|
+
const memEntry = memoryCache.get(key);
|
|
112
|
+
if (memEntry) {
|
|
113
|
+
if (new Date(memEntry.expiresAt) > new Date()) {
|
|
114
|
+
// Validate the cached result (012-fix-agent-result-regressions)
|
|
115
|
+
const validated = validateCachedResult(memEntry.result);
|
|
116
|
+
if (validated) {
|
|
117
|
+
console.log(`[cache] Memory hit: ${key}`);
|
|
118
|
+
return validated;
|
|
119
|
+
}
|
|
120
|
+
// Invalid format - treat as cache miss
|
|
121
|
+
console.warn(`[cache] Memory entry invalid format, treating as miss: ${key}`);
|
|
122
|
+
memoryCache.delete(key);
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
memoryCache.delete(key);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
// Check file cache
|
|
129
|
+
const filePath = getCacheFilePath(key);
|
|
130
|
+
if (existsSync(filePath)) {
|
|
131
|
+
try {
|
|
132
|
+
const content = readFileSync(filePath, 'utf-8');
|
|
133
|
+
const entry = JSON.parse(content);
|
|
134
|
+
if (new Date(entry.expiresAt) > new Date()) {
|
|
135
|
+
// Validate the cached result (012-fix-agent-result-regressions)
|
|
136
|
+
const validated = validateCachedResult(entry.result);
|
|
137
|
+
if (validated) {
|
|
138
|
+
console.log(`[cache] File hit: ${key}`);
|
|
139
|
+
// FR-007: Immutable update to avoid mutating parsed entry (spread creates new object)
|
|
140
|
+
const validatedEntry = { ...entry, result: validated };
|
|
141
|
+
memoryCache.set(key, validatedEntry);
|
|
142
|
+
return validated;
|
|
143
|
+
}
|
|
144
|
+
// Invalid format - treat as cache miss (remove stale file)
|
|
145
|
+
console.warn(`[cache] File entry invalid format, treating as miss: ${key}`);
|
|
146
|
+
unlinkSync(filePath);
|
|
147
|
+
return null;
|
|
148
|
+
}
|
|
149
|
+
// Expired, remove file
|
|
150
|
+
unlinkSync(filePath);
|
|
151
|
+
}
|
|
152
|
+
catch {
|
|
153
|
+
console.warn(`[cache] Failed to read cache file: ${filePath}`);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
return null;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Store a result in the cache
|
|
160
|
+
*/
|
|
161
|
+
export async function setCache(key, result, ttlSeconds = DEFAULT_TTL_SECONDS) {
|
|
162
|
+
const now = new Date();
|
|
163
|
+
const expiresAt = new Date(now.getTime() + ttlSeconds * 1000);
|
|
164
|
+
const entry = {
|
|
165
|
+
key,
|
|
166
|
+
result,
|
|
167
|
+
createdAt: now.toISOString(),
|
|
168
|
+
expiresAt: expiresAt.toISOString(),
|
|
169
|
+
};
|
|
170
|
+
// Store in memory
|
|
171
|
+
memoryCache.set(key, entry);
|
|
172
|
+
// Store to file
|
|
173
|
+
try {
|
|
174
|
+
ensureCacheDir();
|
|
175
|
+
const filePath = getCacheFilePath(key);
|
|
176
|
+
writeFileSync(filePath, JSON.stringify(entry, null, 2));
|
|
177
|
+
console.log(`[cache] Set: ${key} (expires: ${expiresAt.toISOString()})`);
|
|
178
|
+
}
|
|
179
|
+
catch (error) {
|
|
180
|
+
console.warn(`[cache] Failed to write cache file: ${error}`);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Clear the cache
|
|
185
|
+
*/
|
|
186
|
+
export async function clearCache() {
|
|
187
|
+
memoryCache.clear();
|
|
188
|
+
const dir = getCacheDir();
|
|
189
|
+
if (existsSync(dir)) {
|
|
190
|
+
try {
|
|
191
|
+
const files = readdirSync(dir);
|
|
192
|
+
for (const file of files) {
|
|
193
|
+
if (file.startsWith(CACHE_KEY_PREFIX) && file.endsWith('.json')) {
|
|
194
|
+
unlinkSync(join(dir, file));
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
console.log('[cache] Cleared');
|
|
198
|
+
}
|
|
199
|
+
catch (error) {
|
|
200
|
+
console.warn(`[cache] Failed to clear cache: ${error}`);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Clean up expired cache entries
|
|
206
|
+
*/
|
|
207
|
+
export async function cleanupExpired() {
|
|
208
|
+
let cleaned = 0;
|
|
209
|
+
const dir = getCacheDir();
|
|
210
|
+
if (!existsSync(dir))
|
|
211
|
+
return 0;
|
|
212
|
+
try {
|
|
213
|
+
const files = readdirSync(dir);
|
|
214
|
+
for (const file of files) {
|
|
215
|
+
if (!file.startsWith(CACHE_KEY_PREFIX) || !file.endsWith('.json'))
|
|
216
|
+
continue;
|
|
217
|
+
const filePath = join(dir, file);
|
|
218
|
+
try {
|
|
219
|
+
const content = readFileSync(filePath, 'utf-8');
|
|
220
|
+
const entry = JSON.parse(content);
|
|
221
|
+
if (new Date(entry.expiresAt) < new Date()) {
|
|
222
|
+
unlinkSync(filePath);
|
|
223
|
+
memoryCache.delete(entry.key);
|
|
224
|
+
cleaned++;
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
catch {
|
|
228
|
+
// Remove corrupted files
|
|
229
|
+
unlinkSync(filePath);
|
|
230
|
+
cleaned++;
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
catch (error) {
|
|
235
|
+
console.warn(`[cache] Cleanup failed: ${error}`);
|
|
236
|
+
}
|
|
237
|
+
if (cleaned > 0) {
|
|
238
|
+
console.log(`[cache] Cleaned up ${cleaned} expired entries`);
|
|
239
|
+
}
|
|
240
|
+
return cleaned;
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Find cached result for a PR (even with different SHA)
|
|
244
|
+
* Used for fallback when exact cache miss
|
|
245
|
+
*
|
|
246
|
+
* (012-fix-agent-result-regressions) - Now validates results through validateCachedResult()
|
|
247
|
+
* to ensure legacy/malformed entries are treated as cache misses.
|
|
248
|
+
*/
|
|
249
|
+
export async function findCachedForPR(prNumber) {
|
|
250
|
+
const prefix = generateRestoreKeyPrefix(prNumber);
|
|
251
|
+
const dir = getCacheDir();
|
|
252
|
+
if (!existsSync(dir))
|
|
253
|
+
return null;
|
|
254
|
+
try {
|
|
255
|
+
const files = readdirSync(dir)
|
|
256
|
+
.filter((f) => f.startsWith(prefix) && f.endsWith('.json'))
|
|
257
|
+
.sort()
|
|
258
|
+
.reverse(); // Most recent first
|
|
259
|
+
for (const file of files) {
|
|
260
|
+
const filePath = join(dir, file);
|
|
261
|
+
try {
|
|
262
|
+
const content = readFileSync(filePath, 'utf-8');
|
|
263
|
+
const entry = JSON.parse(content);
|
|
264
|
+
if (new Date(entry.expiresAt) > new Date()) {
|
|
265
|
+
// Validate the cached result (012-fix-agent-result-regressions)
|
|
266
|
+
const validated = validateCachedResult(entry.result);
|
|
267
|
+
if (validated) {
|
|
268
|
+
console.log(`[cache] Fallback hit for PR ${prNumber}: ${entry.key}`);
|
|
269
|
+
return validated;
|
|
270
|
+
}
|
|
271
|
+
// Invalid format - skip and try next file
|
|
272
|
+
console.warn(`[cache] Fallback entry invalid format, skipping: ${entry.key}`);
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
catch {
|
|
276
|
+
// Skip corrupted files
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
catch {
|
|
281
|
+
// Ignore errors
|
|
282
|
+
}
|
|
283
|
+
return null;
|
|
284
|
+
}
|
|
285
|
+
/**
|
|
286
|
+
* Save cache for GitHub Actions
|
|
287
|
+
* Call this at the end of a CI run to persist cache
|
|
288
|
+
*/
|
|
289
|
+
export async function saveGitHubActionsCache(key) {
|
|
290
|
+
if (!isGitHubActions()) {
|
|
291
|
+
return false;
|
|
292
|
+
}
|
|
293
|
+
try {
|
|
294
|
+
// Dynamic import to avoid bundling @actions/cache for non-CI use
|
|
295
|
+
const cache = await import('@actions/cache');
|
|
296
|
+
const paths = [getCacheDir()];
|
|
297
|
+
await cache.saveCache(paths, key);
|
|
298
|
+
console.log(`[cache] Saved to GitHub Actions cache: ${key}`);
|
|
299
|
+
return true;
|
|
300
|
+
}
|
|
301
|
+
catch (error) {
|
|
302
|
+
console.warn(`[cache] Failed to save GitHub Actions cache: ${error}`);
|
|
303
|
+
return false;
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* Restore cache from GitHub Actions
|
|
308
|
+
* Call this at the start of a CI run
|
|
309
|
+
*/
|
|
310
|
+
export async function restoreGitHubActionsCache(primaryKey, restoreKeys) {
|
|
311
|
+
if (!isGitHubActions()) {
|
|
312
|
+
return undefined;
|
|
313
|
+
}
|
|
314
|
+
try {
|
|
315
|
+
const cache = await import('@actions/cache');
|
|
316
|
+
const paths = [getCacheDir()];
|
|
317
|
+
const matchedKey = await cache.restoreCache(paths, primaryKey, restoreKeys);
|
|
318
|
+
if (matchedKey) {
|
|
319
|
+
console.log(`[cache] Restored from GitHub Actions cache: ${matchedKey}`);
|
|
320
|
+
}
|
|
321
|
+
return matchedKey;
|
|
322
|
+
}
|
|
323
|
+
catch (error) {
|
|
324
|
+
console.warn(`[cache] Failed to restore GitHub Actions cache: ${error}`);
|
|
325
|
+
return undefined;
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/cache/store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Check Command Module
|
|
3
|
+
*
|
|
4
|
+
* Provides the `ai-review check` command for validating external dependencies.
|
|
5
|
+
* Reports status of all known dependencies with version information.
|
|
6
|
+
*
|
|
7
|
+
* @module cli/commands/check
|
|
8
|
+
*/
|
|
9
|
+
import type { DependencyCheckResult } from '../dependencies/types.js';
|
|
10
|
+
/**
|
|
11
|
+
* Options for the check command
|
|
12
|
+
*/
|
|
13
|
+
export interface CheckOptions {
|
|
14
|
+
/** Show additional details (minimum version, docs URL) */
|
|
15
|
+
verbose?: boolean;
|
|
16
|
+
/** Output results in JSON format */
|
|
17
|
+
json?: boolean;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Result from running the check command
|
|
21
|
+
*/
|
|
22
|
+
export interface CheckResult {
|
|
23
|
+
/** Exit code (0=all available, 1=issues found) */
|
|
24
|
+
exitCode: number;
|
|
25
|
+
/** Individual dependency results */
|
|
26
|
+
results: DependencyCheckResult[];
|
|
27
|
+
/** Summary information */
|
|
28
|
+
summary: {
|
|
29
|
+
available: number;
|
|
30
|
+
missing: number;
|
|
31
|
+
unhealthy: number;
|
|
32
|
+
versionMismatch: number;
|
|
33
|
+
allAvailable: boolean;
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Run the check command to validate all known dependencies.
|
|
38
|
+
*
|
|
39
|
+
* @param _options - Command options (verbose, json flags)
|
|
40
|
+
* @returns Check result with exit code and dependency status
|
|
41
|
+
*/
|
|
42
|
+
export declare function runCheck(_options: CheckOptions): CheckResult;
|
|
43
|
+
/**
|
|
44
|
+
* Format check output for terminal display.
|
|
45
|
+
*
|
|
46
|
+
* @param results - Dependency check results
|
|
47
|
+
* @param options - Formatting options
|
|
48
|
+
* @returns Formatted output string
|
|
49
|
+
*/
|
|
50
|
+
export declare function formatCheckOutput(results: DependencyCheckResult[], options: {
|
|
51
|
+
verbose: boolean;
|
|
52
|
+
}): string;
|
|
53
|
+
/**
|
|
54
|
+
* Format check output as JSON.
|
|
55
|
+
*
|
|
56
|
+
* @param results - Dependency check results
|
|
57
|
+
* @returns JSON string
|
|
58
|
+
*/
|
|
59
|
+
export declare function formatCheckOutputJson(results: DependencyCheckResult[]): string;
|
|
60
|
+
//# sourceMappingURL=check.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/check.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAQH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAEtE;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,0DAA0D;IAC1D,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,oCAAoC;IACpC,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,kDAAkD;IAClD,QAAQ,EAAE,MAAM,CAAC;IACjB,oCAAoC;IACpC,OAAO,EAAE,qBAAqB,EAAE,CAAC;IACjC,0BAA0B;IAC1B,OAAO,EAAE;QACP,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC;QAClB,eAAe,EAAE,MAAM,CAAC;QACxB,YAAY,EAAE,OAAO,CAAC;KACvB,CAAC;CACH;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,YAAY,GAAG,WAAW,CA0C5D;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,qBAAqB,EAAE,EAChC,OAAO,EAAE;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,GAC5B,MAAM,CA2DR;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,qBAAqB,EAAE,GAAG,MAAM,CA6C9E"}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Check Command Module
|
|
3
|
+
*
|
|
4
|
+
* Provides the `ai-review check` command for validating external dependencies.
|
|
5
|
+
* Reports status of all known dependencies with version information.
|
|
6
|
+
*
|
|
7
|
+
* @module cli/commands/check
|
|
8
|
+
*/
|
|
9
|
+
import { getAllDependencyNames, checkAllDependencies, getDependencyInfo, detectPlatform, } from '../dependencies/index.js';
|
|
10
|
+
/**
|
|
11
|
+
* Run the check command to validate all known dependencies.
|
|
12
|
+
*
|
|
13
|
+
* @param _options - Command options (verbose, json flags)
|
|
14
|
+
* @returns Check result with exit code and dependency status
|
|
15
|
+
*/
|
|
16
|
+
export function runCheck(_options) {
|
|
17
|
+
// Get all known dependency names and check them
|
|
18
|
+
const depNames = getAllDependencyNames();
|
|
19
|
+
const results = checkAllDependencies(depNames);
|
|
20
|
+
// Build summary
|
|
21
|
+
const summary = {
|
|
22
|
+
available: 0,
|
|
23
|
+
missing: 0,
|
|
24
|
+
unhealthy: 0,
|
|
25
|
+
versionMismatch: 0,
|
|
26
|
+
allAvailable: true,
|
|
27
|
+
};
|
|
28
|
+
for (const result of results) {
|
|
29
|
+
switch (result.status) {
|
|
30
|
+
case 'available':
|
|
31
|
+
summary.available++;
|
|
32
|
+
break;
|
|
33
|
+
case 'missing':
|
|
34
|
+
summary.missing++;
|
|
35
|
+
summary.allAvailable = false;
|
|
36
|
+
break;
|
|
37
|
+
case 'unhealthy':
|
|
38
|
+
summary.unhealthy++;
|
|
39
|
+
summary.allAvailable = false;
|
|
40
|
+
break;
|
|
41
|
+
case 'version-mismatch':
|
|
42
|
+
summary.versionMismatch++;
|
|
43
|
+
summary.allAvailable = false;
|
|
44
|
+
break;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
// Exit code: 0 if all available, 1 otherwise
|
|
48
|
+
const exitCode = summary.allAvailable ? 0 : 1;
|
|
49
|
+
return {
|
|
50
|
+
exitCode,
|
|
51
|
+
results,
|
|
52
|
+
summary,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Format check output for terminal display.
|
|
57
|
+
*
|
|
58
|
+
* @param results - Dependency check results
|
|
59
|
+
* @param options - Formatting options
|
|
60
|
+
* @returns Formatted output string
|
|
61
|
+
*/
|
|
62
|
+
export function formatCheckOutput(results, options) {
|
|
63
|
+
const lines = [];
|
|
64
|
+
const platform = detectPlatform();
|
|
65
|
+
// Header
|
|
66
|
+
lines.push('');
|
|
67
|
+
lines.push('Dependency Status Check');
|
|
68
|
+
lines.push('─'.repeat(40));
|
|
69
|
+
lines.push('');
|
|
70
|
+
for (const result of results) {
|
|
71
|
+
const depInfo = getDependencyInfo(result.name);
|
|
72
|
+
const displayName = depInfo?.displayName ?? result.name;
|
|
73
|
+
// Status line
|
|
74
|
+
switch (result.status) {
|
|
75
|
+
case 'available':
|
|
76
|
+
lines.push(`✓ ${displayName} ${result.version}`);
|
|
77
|
+
break;
|
|
78
|
+
case 'missing':
|
|
79
|
+
lines.push(`✗ ${displayName} - missing`);
|
|
80
|
+
break;
|
|
81
|
+
case 'unhealthy':
|
|
82
|
+
lines.push(`⚠ ${displayName} - unhealthy`);
|
|
83
|
+
if (result.error) {
|
|
84
|
+
lines.push(` Error: ${result.error}`);
|
|
85
|
+
}
|
|
86
|
+
break;
|
|
87
|
+
case 'version-mismatch':
|
|
88
|
+
lines.push(`⚠ ${displayName} ${result.version} - version mismatch`);
|
|
89
|
+
if (depInfo?.minVersion) {
|
|
90
|
+
lines.push(` Required: ${depInfo.minVersion} or later`);
|
|
91
|
+
}
|
|
92
|
+
break;
|
|
93
|
+
}
|
|
94
|
+
// Verbose details
|
|
95
|
+
if (options.verbose && depInfo) {
|
|
96
|
+
if (depInfo.minVersion) {
|
|
97
|
+
lines.push(` Minimum version: ${depInfo.minVersion}`);
|
|
98
|
+
}
|
|
99
|
+
lines.push(` Documentation: ${depInfo.docsUrl}`);
|
|
100
|
+
// Install instructions for non-available dependencies
|
|
101
|
+
if (result.status !== 'available') {
|
|
102
|
+
const instructions = depInfo.installInstructions[platform];
|
|
103
|
+
if (instructions) {
|
|
104
|
+
lines.push(' Install:');
|
|
105
|
+
for (const line of instructions.split('\n')) {
|
|
106
|
+
lines.push(` ${line}`);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
lines.push('');
|
|
112
|
+
}
|
|
113
|
+
return lines.join('\n');
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Format check output as JSON.
|
|
117
|
+
*
|
|
118
|
+
* @param results - Dependency check results
|
|
119
|
+
* @returns JSON string
|
|
120
|
+
*/
|
|
121
|
+
export function formatCheckOutputJson(results) {
|
|
122
|
+
const platform = detectPlatform();
|
|
123
|
+
// Build summary counts
|
|
124
|
+
const summary = {
|
|
125
|
+
available: 0,
|
|
126
|
+
missing: 0,
|
|
127
|
+
unhealthy: 0,
|
|
128
|
+
versionMismatch: 0,
|
|
129
|
+
allAvailable: true,
|
|
130
|
+
};
|
|
131
|
+
for (const result of results) {
|
|
132
|
+
switch (result.status) {
|
|
133
|
+
case 'available':
|
|
134
|
+
summary.available++;
|
|
135
|
+
break;
|
|
136
|
+
case 'missing':
|
|
137
|
+
summary.missing++;
|
|
138
|
+
summary.allAvailable = false;
|
|
139
|
+
break;
|
|
140
|
+
case 'unhealthy':
|
|
141
|
+
summary.unhealthy++;
|
|
142
|
+
summary.allAvailable = false;
|
|
143
|
+
break;
|
|
144
|
+
case 'version-mismatch':
|
|
145
|
+
summary.versionMismatch++;
|
|
146
|
+
summary.allAvailable = false;
|
|
147
|
+
break;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
const output = {
|
|
151
|
+
timestamp: new Date().toISOString(),
|
|
152
|
+
platform,
|
|
153
|
+
dependencies: results.map((r) => ({
|
|
154
|
+
name: r.name,
|
|
155
|
+
status: r.status,
|
|
156
|
+
version: r.version,
|
|
157
|
+
error: r.error,
|
|
158
|
+
})),
|
|
159
|
+
summary,
|
|
160
|
+
};
|
|
161
|
+
return JSON.stringify(output, null, 2);
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=check.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check.js","sourceRoot":"","sources":["../../../src/cli/commands/check.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI Commands Module Exports
|
|
3
|
+
*
|
|
4
|
+
* Barrel export for CLI command handlers.
|
|
5
|
+
*/
|
|
6
|
+
export { runLocalReview, createDefaultDependencies, ExitCode, type LocalReviewDependencies, type LocalReviewResult, type DryRunResult, type CostEstimateResult, } from './local-review.js';
|
|
7
|
+
export { runCheck, formatCheckOutput, formatCheckOutputJson, type CheckOptions, type CheckResult, } from './check.js';
|
|
8
|
+
/**
|
|
9
|
+
* Command registry version - used for module loading verification
|
|
10
|
+
*/
|
|
11
|
+
export declare const COMMANDS_MODULE_VERSION: "1.0.0";
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,cAAc,EACd,yBAAyB,EACzB,QAAQ,EACR,KAAK,uBAAuB,EAC5B,KAAK,iBAAiB,EACtB,KAAK,YAAY,EACjB,KAAK,kBAAkB,GACxB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,QAAQ,EACR,iBAAiB,EACjB,qBAAqB,EACrB,KAAK,YAAY,EACjB,KAAK,WAAW,GACjB,MAAM,YAAY,CAAC;AAEpB;;GAEG;AACH,eAAO,MAAM,uBAAuB,EAAG,OAAgB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI Commands Module Exports
|
|
3
|
+
*
|
|
4
|
+
* Barrel export for CLI command handlers.
|
|
5
|
+
*/
|
|
6
|
+
export { runLocalReview, createDefaultDependencies, ExitCode, } from './local-review.js';
|
|
7
|
+
export { runCheck, formatCheckOutput, formatCheckOutputJson, } from './check.js';
|
|
8
|
+
/**
|
|
9
|
+
* Command registry version - used for module loading verification
|
|
10
|
+
*/
|
|
11
|
+
export const COMMANDS_MODULE_VERSION = '1.0.0';
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/commands/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,cAAc,EACd,yBAAyB,EACzB,QAAQ,GAKT,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,QAAQ,EACR,iBAAiB,EACjB,qBAAqB,GAGtB,MAAM,YAAY,CAAC;AAEpB;;GAEG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,OAAgB,CAAC"}
|