projscan 4.8.0 → 4.9.2
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 +102 -58
- package/dist/analyzers/deadCodeCheck.js +93 -0
- package/dist/analyzers/deadCodeCheck.js.map +1 -1
- package/dist/analyzers/unusedDependencyCheck.js +10 -10
- package/dist/analyzers/unusedDependencyCheck.js.map +1 -1
- package/dist/cli/commands/bugHunt.js +37 -8
- package/dist/cli/commands/bugHunt.js.map +1 -1
- package/dist/cli/commands/feedback.js +47 -1
- package/dist/cli/commands/feedback.js.map +1 -1
- package/dist/cli/commands/preflight.js +18 -2
- package/dist/cli/commands/preflight.js.map +1 -1
- package/dist/cli/commands/privacyCheck.js +5 -2
- package/dist/cli/commands/privacyCheck.js.map +1 -1
- package/dist/cli/commands/releaseTrain.js +9 -1
- package/dist/cli/commands/releaseTrain.js.map +1 -1
- package/dist/cli/commands/startAction.d.ts +2 -1
- package/dist/cli/commands/startAction.js +4 -4
- package/dist/cli/commands/startAction.js.map +1 -1
- package/dist/cli/commands/startConsole.d.ts +1 -0
- package/dist/cli/commands/startConsole.js +83 -7
- package/dist/cli/commands/startConsole.js.map +1 -1
- package/dist/cli/commands/startOptionsRegistration.js +1 -1
- package/dist/cli/commands/startOptionsRegistration.js.map +1 -1
- package/dist/core/adoption.js +13 -0
- package/dist/core/adoption.js.map +1 -1
- package/dist/core/bugHunt.js +62 -22
- package/dist/core/bugHunt.js.map +1 -1
- package/dist/core/bugHuntPreflightFindings.js +5 -2
- package/dist/core/bugHuntPreflightFindings.js.map +1 -1
- package/dist/core/evidenceComment.d.ts +2 -1
- package/dist/core/evidenceComment.js +45 -7
- package/dist/core/evidenceComment.js.map +1 -1
- package/dist/core/feedback.d.ts +2 -1
- package/dist/core/feedback.js +186 -0
- package/dist/core/feedback.js.map +1 -1
- package/dist/core/frameworkAstroSources.d.ts +2 -0
- package/dist/core/frameworkAstroSources.js +71 -0
- package/dist/core/frameworkAstroSources.js.map +1 -0
- package/dist/core/frameworkSourceResolvers.js +6 -0
- package/dist/core/frameworkSourceResolvers.js.map +1 -1
- package/dist/core/frameworkSources.js +2 -0
- package/dist/core/frameworkSources.js.map +1 -1
- package/dist/core/importGraph.d.ts +2 -0
- package/dist/core/importGraph.js +14 -5
- package/dist/core/importGraph.js.map +1 -1
- package/dist/core/intentRouterCatalog.js +8 -3
- package/dist/core/intentRouterCatalog.js.map +1 -1
- package/dist/core/intentRouterDependencySignals.d.ts +1 -0
- package/dist/core/intentRouterDependencySignals.js +14 -0
- package/dist/core/intentRouterDependencySignals.js.map +1 -1
- package/dist/core/intentRouterKeywordEarlyGuards.js +24 -1
- package/dist/core/intentRouterKeywordEarlyGuards.js.map +1 -1
- package/dist/core/intentRouterKeywordWeights.js +6 -0
- package/dist/core/intentRouterKeywordWeights.js.map +1 -1
- package/dist/core/intentRouterPreflightSignals.js +7 -2
- package/dist/core/intentRouterPreflightSignals.js.map +1 -1
- package/dist/core/intentRouterRegressionKeywordMatches.js +9 -2
- package/dist/core/intentRouterRegressionKeywordMatches.js.map +1 -1
- package/dist/core/intentRouterRegressionSignals.d.ts +1 -0
- package/dist/core/intentRouterRegressionSignals.js +11 -1
- package/dist/core/intentRouterRegressionSignals.js.map +1 -1
- package/dist/core/intentRouterReleaseSignals.js +2 -2
- package/dist/core/intentRouterReleaseSignals.js.map +1 -1
- package/dist/core/intentRouterVerificationSignals.js +5 -0
- package/dist/core/intentRouterVerificationSignals.js.map +1 -1
- package/dist/core/intentRouterWorkSignals.js +4 -2
- package/dist/core/intentRouterWorkSignals.js.map +1 -1
- package/dist/core/languages/LanguageAdapter.d.ts +2 -0
- package/dist/core/languages/javascriptAdapter.js +7 -28
- package/dist/core/languages/javascriptAdapter.js.map +1 -1
- package/dist/core/languages/javascriptProjectConfig.d.ts +20 -0
- package/dist/core/languages/javascriptProjectConfig.js +479 -0
- package/dist/core/languages/javascriptProjectConfig.js.map +1 -0
- package/dist/core/preflightCautionBudget.d.ts +2 -0
- package/dist/core/preflightCautionBudget.js +85 -0
- package/dist/core/preflightCautionBudget.js.map +1 -0
- package/dist/core/preflightInputs.d.ts +30 -2
- package/dist/core/preflightInputs.js +39 -12
- package/dist/core/preflightInputs.js.map +1 -1
- package/dist/core/preflightReasons.js +35 -9
- package/dist/core/preflightReasons.js.map +1 -1
- package/dist/core/preflightReleaseScale.js +16 -5
- package/dist/core/preflightReleaseScale.js.map +1 -1
- package/dist/core/preflightReport.js +3 -0
- package/dist/core/preflightReport.js.map +1 -1
- package/dist/core/preflightSuggestedActions.js +3 -1
- package/dist/core/preflightSuggestedActions.js.map +1 -1
- package/dist/core/preflightVerdict.js +3 -0
- package/dist/core/preflightVerdict.js.map +1 -1
- package/dist/core/qualityScorecard.js +39 -21
- package/dist/core/qualityScorecard.js.map +1 -1
- package/dist/core/releaseEvidence.d.ts +2 -2
- package/dist/core/releaseEvidence.js +3 -2
- package/dist/core/releaseEvidence.js.map +1 -1
- package/dist/core/releaseEvidenceArtifacts.js +12 -4
- package/dist/core/releaseEvidenceArtifacts.js.map +1 -1
- package/dist/core/releaseTrain.d.ts +11 -1
- package/dist/core/releaseTrain.js +54 -2
- package/dist/core/releaseTrain.js.map +1 -1
- package/dist/core/repositoryScanner.js +5 -2
- package/dist/core/repositoryScanner.js.map +1 -1
- package/dist/core/reviewVerdict.js +37 -5
- package/dist/core/reviewVerdict.js.map +1 -1
- package/dist/core/startAdoptionGaps.js +1 -1
- package/dist/core/startAdoptionGaps.js.map +1 -1
- package/dist/core/startClaimTargets.d.ts +2 -0
- package/dist/core/startClaimTargets.js +14 -0
- package/dist/core/startClaimTargets.js.map +1 -0
- package/dist/core/startDailyWorkflows.d.ts +2 -0
- package/dist/core/startDailyWorkflows.js +50 -0
- package/dist/core/startDailyWorkflows.js.map +1 -0
- package/dist/core/startEnvTargets.d.ts +1 -0
- package/dist/core/startEnvTargets.js +9 -0
- package/dist/core/startEnvTargets.js.map +1 -0
- package/dist/core/startFileTargets.d.ts +2 -0
- package/dist/core/startFileTargets.js +19 -0
- package/dist/core/startFileTargets.js.map +1 -0
- package/dist/core/startGeneratedConfigSearchTargets.d.ts +1 -0
- package/dist/core/startGeneratedConfigSearchTargets.js +22 -0
- package/dist/core/startGeneratedConfigSearchTargets.js.map +1 -0
- package/dist/core/startGraphTargets.d.ts +10 -0
- package/dist/core/startGraphTargets.js +82 -0
- package/dist/core/startGraphTargets.js.map +1 -0
- package/dist/core/startHighPrioritySearchTargets.d.ts +1 -0
- package/dist/core/startHighPrioritySearchTargets.js +24 -0
- package/dist/core/startHighPrioritySearchTargets.js.map +1 -0
- package/dist/core/startImpactTargets.d.ts +1 -0
- package/dist/core/startImpactTargets.js +18 -0
- package/dist/core/startImpactTargets.js.map +1 -0
- package/dist/core/startIntentApiContractQueries.d.ts +1 -0
- package/dist/core/startIntentApiContractQueries.js +50 -0
- package/dist/core/startIntentApiContractQueries.js.map +1 -0
- package/dist/core/startIntentAuthorizationQueries.d.ts +1 -0
- package/dist/core/startIntentAuthorizationQueries.js +29 -0
- package/dist/core/startIntentAuthorizationQueries.js.map +1 -0
- package/dist/core/startIntentBackgroundWorkQueries.d.ts +1 -0
- package/dist/core/startIntentBackgroundWorkQueries.js +23 -0
- package/dist/core/startIntentBackgroundWorkQueries.js.map +1 -0
- package/dist/core/startIntentCommunicationArtifactQueries.d.ts +1 -0
- package/dist/core/startIntentCommunicationArtifactQueries.js +25 -0
- package/dist/core/startIntentCommunicationArtifactQueries.js.map +1 -0
- package/dist/core/startIntentDataAccessQueries.d.ts +1 -0
- package/dist/core/startIntentDataAccessQueries.js +60 -0
- package/dist/core/startIntentDataAccessQueries.js.map +1 -0
- package/dist/core/startIntentDataContractQueries.d.ts +1 -0
- package/dist/core/startIntentDataContractQueries.js +75 -0
- package/dist/core/startIntentDataContractQueries.js.map +1 -0
- package/dist/core/startIntentDomainSearchQueries.d.ts +1 -0
- package/dist/core/startIntentDomainSearchQueries.js +47 -0
- package/dist/core/startIntentDomainSearchQueries.js.map +1 -0
- package/dist/core/startIntentDomainWorkflowQueries.d.ts +1 -0
- package/dist/core/startIntentDomainWorkflowQueries.js +28 -0
- package/dist/core/startIntentDomainWorkflowQueries.js.map +1 -0
- package/dist/core/startIntentFrontendPageRouteQueries.d.ts +1 -0
- package/dist/core/startIntentFrontendPageRouteQueries.js +26 -0
- package/dist/core/startIntentFrontendPageRouteQueries.js.map +1 -0
- package/dist/core/startIntentInfraArtifactQueries.d.ts +1 -0
- package/dist/core/startIntentInfraArtifactQueries.js +62 -0
- package/dist/core/startIntentInfraArtifactQueries.js.map +1 -0
- package/dist/core/startIntentIntegrationQueries.d.ts +1 -0
- package/dist/core/startIntentIntegrationQueries.js +96 -0
- package/dist/core/startIntentIntegrationQueries.js.map +1 -0
- package/dist/core/startIntentNavigationLayoutQueries.d.ts +1 -0
- package/dist/core/startIntentNavigationLayoutQueries.js +22 -0
- package/dist/core/startIntentNavigationLayoutQueries.js.map +1 -0
- package/dist/core/startIntentObservabilityQueries.d.ts +1 -0
- package/dist/core/startIntentObservabilityQueries.js +26 -0
- package/dist/core/startIntentObservabilityQueries.js.map +1 -0
- package/dist/core/startIntentReliabilityQueries.d.ts +1 -0
- package/dist/core/startIntentReliabilityQueries.js +85 -0
- package/dist/core/startIntentReliabilityQueries.js.map +1 -0
- package/dist/core/startIntentStateManagementQueries.d.ts +1 -0
- package/dist/core/startIntentStateManagementQueries.js +61 -0
- package/dist/core/startIntentStateManagementQueries.js.map +1 -0
- package/dist/core/startIntentStyleSystemQueries.d.ts +1 -0
- package/dist/core/startIntentStyleSystemQueries.js +26 -0
- package/dist/core/startIntentStyleSystemQueries.js.map +1 -0
- package/dist/core/startIntentTargetText.d.ts +2 -0
- package/dist/core/startIntentTargetText.js +9 -0
- package/dist/core/startIntentTargetText.js.map +1 -0
- package/dist/core/startIntentTargets.d.ts +10 -24
- package/dist/core/startIntentTargets.js +15 -1123
- package/dist/core/startIntentTargets.js.map +1 -1
- package/dist/core/startIntentTestDataQueries.d.ts +1 -0
- package/dist/core/startIntentTestDataQueries.js +28 -0
- package/dist/core/startIntentTestDataQueries.js.map +1 -0
- package/dist/core/startIntentToolingConfigQueries.d.ts +1 -0
- package/dist/core/startIntentToolingConfigQueries.js +31 -0
- package/dist/core/startIntentToolingConfigQueries.js.map +1 -0
- package/dist/core/startIntentUiInteractionQueries.d.ts +1 -0
- package/dist/core/startIntentUiInteractionQueries.js +71 -0
- package/dist/core/startIntentUiInteractionQueries.js.map +1 -0
- package/dist/core/startIssueTargets.d.ts +1 -0
- package/dist/core/startIssueTargets.js +19 -0
- package/dist/core/startIssueTargets.js.map +1 -0
- package/dist/core/startMissionPolicy.d.ts +2 -2
- package/dist/core/startMissionPolicy.js +63 -7
- package/dist/core/startMissionPolicy.js.map +1 -1
- package/dist/core/startMode.d.ts +3 -1
- package/dist/core/startMode.js +39 -7
- package/dist/core/startMode.js.map +1 -1
- package/dist/core/startOptions.d.ts +2 -2
- package/dist/core/startOptions.js +1 -1
- package/dist/core/startOptions.js.map +1 -1
- package/dist/core/startOwnershipSearchTargets.d.ts +2 -0
- package/dist/core/startOwnershipSearchTargets.js +23 -0
- package/dist/core/startOwnershipSearchTargets.js.map +1 -0
- package/dist/core/startPackageTargets.d.ts +4 -0
- package/dist/core/startPackageTargets.js +91 -0
- package/dist/core/startPackageTargets.js.map +1 -0
- package/dist/core/startQuotedTextTargets.d.ts +1 -0
- package/dist/core/startQuotedTextTargets.js +7 -0
- package/dist/core/startQuotedTextTargets.js.map +1 -0
- package/dist/core/startReportBuilder.d.ts +1 -0
- package/dist/core/startReportBuilder.js +2 -1
- package/dist/core/startReportBuilder.js.map +1 -1
- package/dist/core/startReportContext.d.ts +1 -0
- package/dist/core/startReportContext.js +3 -0
- package/dist/core/startReportContext.js.map +1 -1
- package/dist/core/startReportScopeTargets.d.ts +1 -0
- package/dist/core/startReportScopeTargets.js +56 -0
- package/dist/core/startReportScopeTargets.js.map +1 -0
- package/dist/core/startShellArgs.d.ts +4 -0
- package/dist/core/startShellArgs.js +19 -0
- package/dist/core/startShellArgs.js.map +1 -0
- package/dist/core/startSymbolTargets.d.ts +2 -0
- package/dist/core/startSymbolTargets.js +28 -0
- package/dist/core/startSymbolTargets.js.map +1 -0
- package/dist/core/startTestRouteSearchTargets.d.ts +1 -0
- package/dist/core/startTestRouteSearchTargets.js +34 -0
- package/dist/core/startTestRouteSearchTargets.js.map +1 -0
- package/dist/core/understand.js +20 -22
- package/dist/core/understand.js.map +1 -1
- package/dist/core/workplan.js +24 -12
- package/dist/core/workplan.js.map +1 -1
- package/dist/mcp/tools/workspaceGraph.js +12 -9
- package/dist/mcp/tools/workspaceGraph.js.map +1 -1
- package/dist/projscan-sbom.cdx.json +6 -6
- package/dist/publicAgent.d.ts +1 -1
- package/dist/publicAgent.js +1 -1
- package/dist/publicAgent.js.map +1 -1
- package/dist/tool-manifest.json +2 -2
- package/dist/types/bugHunt.d.ts +1 -1
- package/dist/types/dogfood.d.ts +17 -0
- package/dist/types/evidencePack.d.ts +8 -0
- package/dist/types/preflight.d.ts +18 -0
- package/dist/types/releaseTrain.d.ts +7 -0
- package/dist/types/startCommon.d.ts +8 -0
- package/dist/types/startMissionControl.d.ts +2 -1
- package/dist/utils/fileWalker.d.ts +1 -0
- package/dist/utils/fileWalker.js +6 -1
- package/dist/utils/fileWalker.js.map +1 -1
- package/dist/utils/formatSupport.d.ts +1 -0
- package/dist/utils/formatSupport.js +1 -0
- package/dist/utils/formatSupport.js.map +1 -1
- package/docs/GUIDE.md +50 -11
- package/docs/ROADMAP.md +41 -16
- package/docs/demos/projscan-4-1-demo.html +4 -4
- package/docs/examples/adoption-workflows.md +48 -0
- package/docs/projscan-mission-control.gif +0 -0
- package/docs/projscan-mission-control.png +0 -0
- package/docs/projscan-mission-proof.gif +0 -0
- package/docs/projscan-proof-router.png +0 -0
- package/package.json +12 -12
package/README.md
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
[](https://nodejs.org)
|
|
8
8
|
[](#quick-start)
|
|
9
9
|
|
|
10
|
-
**
|
|
10
|
+
**Local proof for AI-assisted engineering workflows.** An MCP server and CLI that helps agents and humans answer three review questions: what to read before editing, what to fix before handoff, and what needs review before a release candidate.
|
|
11
11
|
|
|
12
12
|
[AI Agent Quick Start](#ai-agent-integration-mcp) · [CLI Quick Start](#quick-start) · [Commands](#commands) · [Full Guide](docs/GUIDE.md) · [Roadmap](docs/ROADMAP.md)
|
|
13
13
|
|
|
@@ -19,15 +19,17 @@
|
|
|
19
19
|
|
|
20
20
|
## Why?
|
|
21
21
|
|
|
22
|
-
AI coding agents are becoming
|
|
22
|
+
AI coding agents are becoming a common interface to code. When you ask an agent _"which files implement auth?"_ or _"what breaks if I bump React from 18 to 19?"_, it needs structured repo context and proof commands, not a broad scan to summarize.
|
|
23
23
|
|
|
24
|
-
**projscan is
|
|
24
|
+
**projscan is a local evidence tool for agent-assisted engineering.** It is most useful in three daily workflows: before editing, before handoff or commit, and before release-candidate review. Start there before scanning the full command catalog.
|
|
25
25
|
|
|
26
|
-
|
|
26
|
+
MCP clients and humans can still query repo maps, semantic graph evidence, dataflow risks, review verdicts, hotspots, ownership, preflight gates, fix prompts, impact analysis, and session context. Those tools matter when they make one of the three workflows easier to verify.
|
|
27
|
+
|
|
28
|
+
For teams, projscan can turn the workflow into a repeatable PR habit. `projscan init team` creates policy, CI, ownership, and baseline memory. `projscan evidence-pack --pr-comment` gives reviewers a compact verdict with top risks, First Fix, owner routing, baseline trend memory, and exact next commands. `projscan feedback`, `projscan dogfood`, and `projscan trial` measure whether the loop saved time, prevented risky edits, and stayed trustworthy across real repos.
|
|
27
29
|
|
|
28
30
|
The local plugin platform lets teams add project-specific findings and render `doctor`, `analyze`, and `ci` in their own voice without changing the scan pipeline. Humans get the same information through the CLI.
|
|
29
31
|
|
|
30
|
-
**
|
|
32
|
+
**Core scans run locally by default. No source upload. No projscan account or API key. `.gitignore` is respected by default. `.env` values are path-only unless explicitly enabled. Anonymous product telemetry is off by default and only runs after explicit opt-in. Network-capable paths are explicit: `audit`, registry checks, opt-in telemetry, and optional semantic model downloads.**
|
|
31
33
|
|
|
32
34
|
```bash
|
|
33
35
|
npx projscan
|
|
@@ -35,29 +37,31 @@ npx projscan
|
|
|
35
37
|
|
|
36
38
|
<img src="docs/projscan-mission-control.gif" alt="projscan Mission Control turning a plain-language goal into shortcut commands, proof commands, and review gates" width="760">
|
|
37
39
|
|
|
38
|
-
## What's New in 4.
|
|
39
|
-
|
|
40
|
-
4.
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
40
|
+
## What's New in 4.9.2
|
|
41
|
+
|
|
42
|
+
4.9.2 is a trust patch for teams using projscan on real PRs. It reduces
|
|
43
|
+
unused-export noise in alias-heavy and Next.js apps, makes Start proof commands
|
|
44
|
+
explicit, and trims PR feedback prompts so reviewers can report usefulness or
|
|
45
|
+
noise without reading a wall of instructions.
|
|
46
|
+
|
|
47
|
+
- **Fewer unused-export false positives.** TypeScript path aliases, local
|
|
48
|
+
package aliases, and Next.js App Router entrypoints now count as real usage
|
|
49
|
+
where the framework or compiler owns the import path.
|
|
50
|
+
- **Explicit proof commands.** Start, workplan, handoff, CLI shortcut, and MCP
|
|
51
|
+
resume surfaces now use `projscan preflight --mode before_edit --format json`
|
|
52
|
+
for before-edit proof instead of the ambiguous generic preflight command.
|
|
53
|
+
- **Compact reviewer feedback.** Evidence-pack PR comments keep the Developer
|
|
54
|
+
Feedback section, but reduce it to three actions: record usefulness, minutes
|
|
55
|
+
saved, and noisy or false-positive signals.
|
|
56
|
+
- **Caution triage.** Preflight cautions now separate fix-now items,
|
|
57
|
+
review-only signals, and manual sign-off gates, which keeps release comments
|
|
58
|
+
from treating scale review as an actual defect.
|
|
59
|
+
- **Faster preflight input gathering.** Independent evidence collection runs in
|
|
60
|
+
parallel where it is safe, reducing local preflight wait time without changing
|
|
61
|
+
the report schema.
|
|
62
|
+
- **Release verification cleanup.** The source test suite and PR-comment
|
|
63
|
+
fixtures now validate the current compact feedback and explicit-proof
|
|
64
|
+
behavior before publishing.
|
|
61
65
|
|
|
62
66
|
<img src="docs/projscan-proof-router.png" alt="projscan intent router and proof workflow showing impact routing, setup discovery, dependency intelligence, and stable-surface guardrails" width="760">
|
|
63
67
|
|
|
@@ -155,7 +159,7 @@ Console output shows the same model for humans:
|
|
|
155
159
|
```text
|
|
156
160
|
Execution Plan
|
|
157
161
|
Run 1 ready step, resolve 2 input(s), then gather 4 proof command(s).
|
|
158
|
-
- [ready]
|
|
162
|
+
- [ready] Ready Commands
|
|
159
163
|
- Find exact target for impact analysis: projscan search "auth token loader" --format json
|
|
160
164
|
- [blocked] Resolve Inputs
|
|
161
165
|
- symbol: Replace <symbol-from-search> with an exported symbol returned by the search step.
|
|
@@ -274,6 +278,45 @@ Or run directly without installing:
|
|
|
274
278
|
npx projscan
|
|
275
279
|
```
|
|
276
280
|
|
|
281
|
+
## Daily workflows
|
|
282
|
+
|
|
283
|
+
Use these three workflows before scanning the full command catalog.
|
|
284
|
+
|
|
285
|
+
### Before editing a feature
|
|
286
|
+
|
|
287
|
+
```bash
|
|
288
|
+
projscan start --intent "what files do I need to change for auth?"
|
|
289
|
+
projscan understand --view change --intent "add auth token refresh" --format json
|
|
290
|
+
projscan preflight --mode before_edit --format json
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
Success criteria: the agent has a cited change map, likely touched files,
|
|
294
|
+
read-first context, and a before-edit gate before it writes code.
|
|
295
|
+
|
|
296
|
+
### Before handoff or commit
|
|
297
|
+
|
|
298
|
+
```bash
|
|
299
|
+
projscan bug-hunt --format json
|
|
300
|
+
projscan preflight --mode before_commit --format json
|
|
301
|
+
projscan evidence-pack --pr-comment
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
Success criteria: concrete defects are separated from manual review gates, the
|
|
305
|
+
handoff includes exact proof commands, and reviewers can see the next action
|
|
306
|
+
without reading an agent transcript.
|
|
307
|
+
|
|
308
|
+
### Before release-candidate review
|
|
309
|
+
|
|
310
|
+
```bash
|
|
311
|
+
projscan release-train --format json
|
|
312
|
+
projscan preflight --mode before_merge --format json
|
|
313
|
+
projscan evidence-pack --pr-comment
|
|
314
|
+
```
|
|
315
|
+
|
|
316
|
+
Success criteria: release-readiness output stays read-only, `caution` explains
|
|
317
|
+
whether the work needs fixes or manual sign-off, and no version, publish, tag,
|
|
318
|
+
or deploy step is implied.
|
|
319
|
+
|
|
277
320
|
## Quick Start
|
|
278
321
|
|
|
279
322
|
Run this path first inside a repository:
|
|
@@ -596,7 +639,7 @@ For maintainers changing trust-sensitive behavior:
|
|
|
596
639
|
npm run test:trust-smoke
|
|
597
640
|
```
|
|
598
641
|
|
|
599
|
-
The full command catalog is below. Most users should start with the
|
|
642
|
+
The full command catalog is below. Most users should start with the daily workflows above instead of scanning the catalog.
|
|
600
643
|
|
|
601
644
|
<img src="https://raw.githubusercontent.com/abhiyoheswaran1/projscan/v4.3.1/docs/npx%20projscan%20--help.gif" alt="npx projscan --help" width="700">
|
|
602
645
|
|
|
@@ -622,7 +665,7 @@ The report includes file/symbol-backed `claims`, `readFirst` files, entrypoints,
|
|
|
622
665
|
| ----------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
623
666
|
| `projscan analyze` | Full analysis - languages, frameworks, dependencies, issues |
|
|
624
667
|
| `projscan route` | Map a plain-language goal to the best projscan tool with weighted confidence and matched keywords |
|
|
625
|
-
| `projscan start` | First-60-seconds workflow orientation with setup diagnostics, Mission Control, top risks, and next commands. Add `--intent "<goal>"` to route a plain-language goal to route confidence, phased execution plan, ready actions, done criteria, and proof commands |
|
|
668
|
+
| `projscan start` | First-60-seconds workflow orientation with daily workflows, setup diagnostics, Mission Control, top risks, and next commands. Add `--intent "<goal>"` to route a plain-language goal to route confidence, phased execution plan, ready actions, done criteria, and proof commands |
|
|
626
669
|
| `projscan mission-proof` | Summarize saved Mission Control proof, reviewer decisions, reruns, failed gates, and optional manual-baseline comparison |
|
|
627
670
|
| `projscan first-run` | First-run setup diagnostics plus the shared `firstTenMinutes` command path |
|
|
628
671
|
| `projscan init mcp` | Ready-to-paste MCP client configs for popular agent clients |
|
|
@@ -632,7 +675,7 @@ The report includes file/symbol-backed `claims`, `readFirst` files, entrypoints,
|
|
|
632
675
|
| `projscan init github-action` | GitHub Actions PR workflow that validates and posts projscan evidence comments, then fails only on preflight blocks |
|
|
633
676
|
| `projscan recipes` | Agent workflow recipes for team bootstrap, PR automation, before edit, bug hunt, approval, handoff, and pre-merge |
|
|
634
677
|
| `projscan workplan` | Agent execution plan - prioritized tasks with evidence, tools, verification, and handoff text |
|
|
635
|
-
| `projscan bug-hunt` | Prioritized bug-hunt action queue from doctor, preflight, and session evidence,
|
|
678
|
+
| `projscan bug-hunt` | Prioritized bug-hunt action queue from doctor, preflight, and session evidence; manual sign-off-only queues print review wording while JSON verdict compatibility is preserved, and hotspot-only churn stays as a watchlist signal |
|
|
636
679
|
| `projscan agent-brief` | Compact next-agent context packet with focus items, coordination hints, guardrails, repo context, and next actions |
|
|
637
680
|
| `projscan quality-scorecard` | Dimensioned quality view with health, security, tests, maintainability, coordination, and top risks |
|
|
638
681
|
| `projscan understand` | Cited repo map, runtime flows, public contracts, change readiness, verification tiers, unknowns, and next commands |
|
|
@@ -715,6 +758,7 @@ projscan mission-proof --format markdown # Mission proof report for handoffs
|
|
|
715
758
|
projscan mission-proof --write reports/mission-proof.md # Save Markdown proof
|
|
716
759
|
projscan ci --format sarif # SARIF 2.1.0 for GitHub Code Scanning
|
|
717
760
|
projscan analyze --report-scope src/api --redact-paths --format json # Scoped, redacted shareable evidence
|
|
761
|
+
projscan analyze --report-scope "src/api,packages/backend" --redact-paths --format json # Multi-scope partner evidence
|
|
718
762
|
projscan doctor --report-policy apiEvidence --format markdown # Reuse a configured evidence policy
|
|
719
763
|
```
|
|
720
764
|
|
|
@@ -880,23 +924,23 @@ For real-world numbers against larger codebases, `npm run bench:references` shal
|
|
|
880
924
|
|
|
881
925
|
Run `npm run bench` against your own machine to recalibrate.
|
|
882
926
|
|
|
883
|
-
- **
|
|
884
|
-
- **
|
|
885
|
-
- **~21 MB of vendored tree-sitter grammars**, broken down:
|
|
886
|
-
|
|
887
|
-
|
|
|
888
|
-
|
|
|
889
|
-
| `web-tree-sitter` | ~190 KB | runtime, all tree-sitter languages |
|
|
890
|
-
| `tree-sitter-python` | ~450 KB | Python |
|
|
891
|
-
| `tree-sitter-go` | ~210 KB | Go |
|
|
892
|
-
| `tree-sitter-java` | ~405 KB | Java |
|
|
893
|
-
| `tree-sitter-ruby` | ~2.0 MB | Ruby |
|
|
894
|
-
| `tree-sitter-rust` | ~1.1 MB | Rust |
|
|
895
|
-
| `tree-sitter-php` | ~785 KB | PHP |
|
|
896
|
-
| `tree-sitter-
|
|
897
|
-
| `tree-sitter-cpp` | ~3.3 MB | C, C++ |
|
|
898
|
-
| `tree-sitter-kotlin` | ~3.9 MB | Kotlin |
|
|
899
|
-
| `tree-sitter-swift` | ~3.6 MB | Swift |
|
|
927
|
+
- **Local by default** — core scans run without network; `audit`, registry checks, opt-in telemetry, and optional semantic embeddings are explicit network-capable paths
|
|
928
|
+
- **7 direct runtime dependencies** — grammar packages are build-time sources, not global-install dependencies
|
|
929
|
+
- **~21 MB of vendored tree-sitter WASM grammars**, broken down:
|
|
930
|
+
|
|
931
|
+
| Vendored file | Size | Languages |
|
|
932
|
+
| -------------------------- | ------: | ---------------------------------- |
|
|
933
|
+
| `web-tree-sitter.wasm` | ~190 KB | runtime, all tree-sitter languages |
|
|
934
|
+
| `tree-sitter-python.wasm` | ~450 KB | Python |
|
|
935
|
+
| `tree-sitter-go.wasm` | ~210 KB | Go |
|
|
936
|
+
| `tree-sitter-java.wasm` | ~405 KB | Java |
|
|
937
|
+
| `tree-sitter-ruby.wasm` | ~2.0 MB | Ruby |
|
|
938
|
+
| `tree-sitter-rust.wasm` | ~1.1 MB | Rust |
|
|
939
|
+
| `tree-sitter-php.wasm` | ~785 KB | PHP |
|
|
940
|
+
| `tree-sitter-c_sharp.wasm` | ~5.2 MB | C# |
|
|
941
|
+
| `tree-sitter-cpp.wasm` | ~3.3 MB | C, C++ |
|
|
942
|
+
| `tree-sitter-kotlin.wasm` | ~3.9 MB | Kotlin |
|
|
943
|
+
| `tree-sitter-swift.wasm` | ~3.6 MB | Swift |
|
|
900
944
|
|
|
901
945
|
JavaScript and TypeScript use the bundled `@babel/parser` instead of a tree-sitter grammar, so they don't appear in this table.
|
|
902
946
|
|
|
@@ -940,7 +984,7 @@ projscan reads your source code so it can be useful; it does not send your sourc
|
|
|
940
984
|
|
|
941
985
|
### Patterns supply-chain scanners flag, and why they're benign here
|
|
942
986
|
|
|
943
|
-
|
|
987
|
+
projscan's [Socket report](https://socket.dev/npm/package/projscan) currently shows four supply-chain alerts. Each alert maps to one of these code paths:
|
|
944
988
|
|
|
945
989
|
- **"Network access"** — comes from `web-tree-sitter`'s internal API surface; we feed it local wasm files at `dist/grammars/`. No outbound traffic.
|
|
946
990
|
- **"Dynamic require" / runtime import** — optional dependencies lazy-load from literal module names; opt-in local plugins load validated manifest module paths under `.projscan-plugins/`. Plugin execution is local code execution by design, gated by `PROJSCAN_PLUGINS_PREVIEW=1`.
|
|
@@ -956,7 +1000,7 @@ If you read projscan's [Socket report](https://socket.dev/npm/package/projscan),
|
|
|
956
1000
|
|
|
957
1001
|
## Dogfooding
|
|
958
1002
|
|
|
959
|
-
projscan runs against itself in CI on every PR. The dogfood loop is the most direct evidence we can offer that the tool works on real code
|
|
1003
|
+
projscan runs against itself in CI on every PR. The dogfood loop is the most direct evidence we can offer that the tool works on real code instead of synthetic fixtures alone.
|
|
960
1004
|
|
|
961
1005
|
```sh
|
|
962
1006
|
# .github/workflows/ci.yml — runs after the unit tests
|
|
@@ -1102,7 +1146,7 @@ projscan diff --format markdown # Markdown diff for PRs
|
|
|
1102
1146
|
|
|
1103
1147
|
## Hotspots - Where to Fix First
|
|
1104
1148
|
|
|
1105
|
-
A flat health score doesn't tell you what to do. **`projscan hotspots`** combines `git log` churn, file complexity, open issues, recency, and **ownership** into a single risk score per file
|
|
1149
|
+
A flat health score doesn't tell you what to do. **`projscan hotspots`** combines `git log` churn, file complexity, open issues, recency, and **ownership** into a single risk score per file, so you know where refactoring or review will pay off.
|
|
1106
1150
|
|
|
1107
1151
|
<img src="https://abhiyoheswaran.com/images/projscan/hotspots-poster.png" alt="projscan hotspots output ranking files by composite risk score" width="700">
|
|
1108
1152
|
|
|
@@ -1132,11 +1176,11 @@ projscan diff --save-baseline # Snapshots health + hotspots
|
|
|
1132
1176
|
projscan diff # Shows which hotspots rose / fell
|
|
1133
1177
|
```
|
|
1134
1178
|
|
|
1135
|
-
The baseline file now captures top hotspots too, so `diff` surfaces files that are **getting worse**
|
|
1179
|
+
The baseline file now captures top hotspots too, so `diff` surfaces files that are **getting worse** alongside new issues.
|
|
1136
1180
|
|
|
1137
1181
|
## Dependency Health
|
|
1138
1182
|
|
|
1139
|
-
projscan ships
|
|
1183
|
+
projscan ships focused commands for checking your dependency graph. Drift and upgrade previews run **offline** by default; `audit` wraps `npm audit` and can contact the npm registry.
|
|
1140
1184
|
|
|
1141
1185
|
```bash
|
|
1142
1186
|
projscan outdated # Which declared deps drift from what's installed?
|
|
@@ -1185,11 +1229,11 @@ Coverage is also automatically joined into `projscan hotspots` when one of those
|
|
|
1185
1229
|
|
|
1186
1230
|
## AI Agent Integration (MCP)
|
|
1187
1231
|
|
|
1188
|
-
|
|
1232
|
+
Use MCP when an AI coding agent should call projscan directly. `projscan mcp` starts an [MCP](https://modelcontextprotocol.io) server over stdio and exposes the same local proof behind the daily workflows: repo context, impact, hotspots, review gates, and next commands.
|
|
1189
1233
|
|
|
1190
1234
|
<img src="https://raw.githubusercontent.com/abhiyoheswaran1/projscan/v4.3.1/docs/projscan-agent-demo.gif" alt="projscan answering two agent questions: what breaks if I rename buildCodeGraph (impact analysis with definitions, direct callers, transitive reach), and where should I fix first (ranked hotspots with cyclomatic complexity)" width="700">
|
|
1191
1235
|
|
|
1192
|
-
Two
|
|
1236
|
+
Two common agent questions: _"What breaks if I rename `buildCodeGraph`?"_ → 31 direct callers, 97 files reachable. _"Where should I fix first?"_ → ranked hotspots with AST cyclomatic complexity, churn, and ownership signals.
|
|
1193
1237
|
|
|
1194
1238
|
### Claude Code
|
|
1195
1239
|
|
|
@@ -1347,7 +1391,7 @@ Capability is advertised under `experimental.fileChanged` on `initialize` so cli
|
|
|
1347
1391
|
- **`projscan_start`** _(3.0.4)_ - first-60-seconds repo orientation. Composes setup diagnostics, `firstTenMinutes`, workflow recipes, workplan, quality scorecard, top risks, adoption gaps, next commands, and optional handoff payload.
|
|
1348
1392
|
- **`projscan_understand`** _(3.4)_ - cited repo-comprehension report with `map`, `flow`, `contracts`, `change`, and `verify` views, read-first files, unknowns, change readiness, verification tiers, and exact next commands.
|
|
1349
1393
|
- **`projscan_semantic_graph`** _(3.0; query mode 4.0)_ - the code graph, two ways. With no `query`: the stable v3 semantic graph contract (file, function, package, and symbol nodes plus `defines`, `imports`, `imports_package`, `exports`, and `calls` edges). With `query: { direction, file?, symbol? }`: one cheap targeted lookup — `imports`, `exports`, `importers`, `symbol_defs`, `package_importers` — with millisecond responses on a warm cache. (Subsumes the former `projscan_graph`, removed in 4.0.)
|
|
1350
|
-
- **`projscan_dataflow`** _(3.0)_ - focused direct, propagated, and bridge source-to-sink dataflow risks. Next.js route body readers and URL reads plus Remix, SvelteKit, Hono, Express, Fastify, and Koa request sources are framework-aware, DB/write sinks are receiver-sensitive, and defaults suppress test-file paths, broad readFile/writeFile noise, JavaScript RegExp.exec false positives, and generated-code anxiety; opt into broader scans with `include_tests` / `include_broad_file_io` / `include_generated` or the matching CLI flags.
|
|
1394
|
+
- **`projscan_dataflow`** _(3.0)_ - focused direct, propagated, and bridge source-to-sink dataflow risks. Next.js route body readers and URL reads plus Remix, SvelteKit, Astro, Hono, Express, Fastify, and Koa request sources are framework-aware, DB/write sinks are receiver-sensitive, and defaults suppress test-file paths, broad readFile/writeFile noise, JavaScript RegExp.exec false positives, and generated-code anxiety; opt into broader scans with `include_tests` / `include_broad_file_io` / `include_generated` or the matching CLI flags.
|
|
1351
1395
|
- **`projscan_search`** - fast search across `symbols` (exported names), `files` (path substring), or `content` (source substring with line + excerpt). Sub-file mode (`sub_file: true`) embeds per-function for sharper semantic results _(0.15)_.
|
|
1352
1396
|
- **`projscan_coupling`** _(0.11)_ - per-file fan-in / fan-out / instability + circular-import cycles (Tarjan SCC). Filter by `direction: cycles_only | high_fan_in | high_fan_out`.
|
|
1353
1397
|
- **`projscan_pr_diff`** _(0.11)_ - structural diff between two git refs. Returns added/removed/modified files with explicit lists of exports, imports, and call sites that changed, plus ΔCC and Δfan-in.
|
|
@@ -1361,7 +1405,7 @@ Capability is advertised under `experimental.fileChanged` on `initialize` so cli
|
|
|
1361
1405
|
- **`projscan_quality_scorecard`** _(2.3)_ - dimensioned quality view across health, security, tests, maintainability, coordination, top risks, and verification commands.
|
|
1362
1406
|
- **`projscan_adoption`** _(2.9)_ - adoption helper for MCP config snippets, workflow recipes, and first-run diagnostics with the shared `firstTenMinutes` path.
|
|
1363
1407
|
- **`projscan_fix_suggest`** _(0.14)_ - structured action prompt for any open issue: headline, why it matters, where, one-paragraph instruction, optional suggested test. Closes the diagnose → fix loop.
|
|
1364
|
-
- **`projscan_explain_issue`** _(0.14)_ -
|
|
1408
|
+
- **`projscan_explain_issue`** _(0.14)_ - focused context for one issue: code excerpt, related issues in the same file, similar past commits via `git log --grep`, plus the structured FixSuggestion.
|
|
1365
1409
|
- **`projscan_impact`** _(0.15)_ - transitive blast-radius for a file or symbol. BFS over reverse imports + symbol callsites. Use BEFORE renaming or deleting to see what breaks.
|
|
1366
1410
|
- **`projscan_collision`** _(3.6)_ - detect change collisions across the repo's in-flight git worktrees (parallel agents). Flags same-file edits and dependency overlaps (one worktree edits a file another's change imports) before the branches merge. Local-first; needs ≥2 worktrees.
|
|
1367
1411
|
- **`projscan_claim`** _(3.6)_ - advisory claims/leases over files, directories, or symbols, shared across the repo's worktrees. `add` returns contention when another agent already holds an overlapping target; `list` / `release` manage them. Local-first.
|
|
@@ -14,6 +14,16 @@ const SOURCE_EXTENSIONS = new Set([
|
|
|
14
14
|
'.py',
|
|
15
15
|
'.pyw',
|
|
16
16
|
]);
|
|
17
|
+
const JAVASCRIPT_SOURCE_EXTENSIONS = new Set([
|
|
18
|
+
'.ts',
|
|
19
|
+
'.tsx',
|
|
20
|
+
'.js',
|
|
21
|
+
'.jsx',
|
|
22
|
+
'.mjs',
|
|
23
|
+
'.cjs',
|
|
24
|
+
'.mts',
|
|
25
|
+
'.cts',
|
|
26
|
+
]);
|
|
17
27
|
// Never flag these - they're public API by definition (JS convention).
|
|
18
28
|
const PUBLIC_PATH_PREFIXES = ['src/index', 'index.'];
|
|
19
29
|
// Names (sans extension) that are barrel-equivalents and should never be
|
|
@@ -47,6 +57,8 @@ export async function check(rootPath, files) {
|
|
|
47
57
|
continue;
|
|
48
58
|
if (isPublicEntry(file.relativePath, publicEntries))
|
|
49
59
|
continue;
|
|
60
|
+
if (isFrameworkEntrypoint(file.relativePath))
|
|
61
|
+
continue;
|
|
50
62
|
// Any importer → file is used.
|
|
51
63
|
if ((graph.localImporters.get(file.relativePath)?.size ?? 0) > 0)
|
|
52
64
|
continue;
|
|
@@ -100,6 +112,87 @@ function isPublicEntry(relativePath, publicEntries) {
|
|
|
100
112
|
}
|
|
101
113
|
return false;
|
|
102
114
|
}
|
|
115
|
+
function isFrameworkEntrypoint(relativePath) {
|
|
116
|
+
if (!isJavaScriptSourcePath(relativePath))
|
|
117
|
+
return false;
|
|
118
|
+
const normalized = relativePath.replace(/\\/g, '/');
|
|
119
|
+
const basename = path.posix.basename(normalized, path.posix.extname(normalized));
|
|
120
|
+
const dirname = path.posix.dirname(normalized);
|
|
121
|
+
if ((dirname === '.' || dirname === 'src') &&
|
|
122
|
+
NEXT_ROOT_ENTRYPOINT_BASENAMES.has(basename)) {
|
|
123
|
+
return true;
|
|
124
|
+
}
|
|
125
|
+
if (isRemixFrameworkEntrypoint(normalized))
|
|
126
|
+
return true;
|
|
127
|
+
if (isSvelteKitFrameworkEntrypoint(normalized))
|
|
128
|
+
return true;
|
|
129
|
+
if (isAstroFrameworkEntrypoint(normalized))
|
|
130
|
+
return true;
|
|
131
|
+
const appRelativePath = normalized.startsWith('src/')
|
|
132
|
+
? normalized.slice('src/'.length)
|
|
133
|
+
: normalized;
|
|
134
|
+
if (!appRelativePath.startsWith('app/'))
|
|
135
|
+
return false;
|
|
136
|
+
const appBasename = path.posix.basename(appRelativePath, path.posix.extname(appRelativePath));
|
|
137
|
+
return NEXT_APP_ROUTER_ENTRYPOINT_BASENAMES.has(appBasename);
|
|
138
|
+
}
|
|
139
|
+
function isRemixFrameworkEntrypoint(relativePath) {
|
|
140
|
+
if (relativePath === 'app/root.tsx' ||
|
|
141
|
+
relativePath === 'app/root.jsx' ||
|
|
142
|
+
relativePath === 'app/entry.client.tsx' ||
|
|
143
|
+
relativePath === 'app/entry.client.jsx' ||
|
|
144
|
+
relativePath === 'app/entry.server.tsx' ||
|
|
145
|
+
relativePath === 'app/entry.server.jsx' ||
|
|
146
|
+
relativePath === 'app/routes.ts') {
|
|
147
|
+
return true;
|
|
148
|
+
}
|
|
149
|
+
return relativePath.startsWith('app/routes/');
|
|
150
|
+
}
|
|
151
|
+
function isSvelteKitFrameworkEntrypoint(relativePath) {
|
|
152
|
+
const routePath = relativePath.startsWith('src/')
|
|
153
|
+
? relativePath.slice('src/'.length)
|
|
154
|
+
: relativePath;
|
|
155
|
+
if (!routePath.startsWith('routes/'))
|
|
156
|
+
return false;
|
|
157
|
+
return path.posix.basename(routePath).startsWith('+');
|
|
158
|
+
}
|
|
159
|
+
function isAstroFrameworkEntrypoint(relativePath) {
|
|
160
|
+
const astroPath = relativePath.startsWith('src/')
|
|
161
|
+
? relativePath.slice('src/'.length)
|
|
162
|
+
: relativePath;
|
|
163
|
+
return astroPath.startsWith('pages/');
|
|
164
|
+
}
|
|
165
|
+
const NEXT_ROOT_ENTRYPOINT_BASENAMES = new Set([
|
|
166
|
+
'middleware',
|
|
167
|
+
'proxy',
|
|
168
|
+
'instrumentation',
|
|
169
|
+
'instrumentation-client',
|
|
170
|
+
'mdx-components',
|
|
171
|
+
]);
|
|
172
|
+
const NEXT_APP_ROUTER_ENTRYPOINT_BASENAMES = new Set([
|
|
173
|
+
'route',
|
|
174
|
+
'page',
|
|
175
|
+
'layout',
|
|
176
|
+
'template',
|
|
177
|
+
'default',
|
|
178
|
+
'loading',
|
|
179
|
+
'error',
|
|
180
|
+
'not-found',
|
|
181
|
+
'global-error',
|
|
182
|
+
'global-not-found',
|
|
183
|
+
'forbidden',
|
|
184
|
+
'unauthorized',
|
|
185
|
+
'sitemap',
|
|
186
|
+
'robots',
|
|
187
|
+
'manifest',
|
|
188
|
+
'icon',
|
|
189
|
+
'apple-icon',
|
|
190
|
+
'opengraph-image',
|
|
191
|
+
'twitter-image',
|
|
192
|
+
]);
|
|
193
|
+
function isJavaScriptSourcePath(relativePath) {
|
|
194
|
+
return JAVASCRIPT_SOURCE_EXTENSIONS.has(path.posix.extname(relativePath).toLowerCase());
|
|
195
|
+
}
|
|
103
196
|
function stripExtension(p) {
|
|
104
197
|
const ext = path.extname(p);
|
|
105
198
|
return ext ? p.slice(0, -ext.length) : p;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deadCodeCheck.js","sourceRoot":"","sources":["../../src/analyzers/deadCodeCheck.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAE9D,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC;IAChC,KAAK;IACL,MAAM;IACN,KAAK;IACL,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,KAAK;IACL,MAAM;CACP,CAAC,CAAC;AAEH,uEAAuE;AACvE,MAAM,oBAAoB,GAAG,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;AAErD,yEAAyE;AACzE,sEAAsE;AACtE,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC;AAUxD;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,KAAK,UAAU,KAAK,CAAC,QAAgB,EAAE,KAAkB;IAC9D,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;IAC5E,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAExC,MAAM,aAAa,GAAG,MAAM,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IACxD,MAAM,KAAK,GAAG,MAAM,cAAc,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IAE1D,MAAM,MAAM,GAAY,EAAE,CAAC;IAC3B,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;QAC/B,IAAI,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC;YAAE,SAAS;QAC5C,IAAI,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC;YAAE,SAAS;QAC9C,IAAI,aAAa,CAAC,IAAI,CAAC,YAAY,EAAE,aAAa,CAAC;YAAE,SAAS;
|
|
1
|
+
{"version":3,"file":"deadCodeCheck.js","sourceRoot":"","sources":["../../src/analyzers/deadCodeCheck.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAE9D,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC;IAChC,KAAK;IACL,MAAM;IACN,KAAK;IACL,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,KAAK;IACL,MAAM;CACP,CAAC,CAAC;AAEH,MAAM,4BAA4B,GAAG,IAAI,GAAG,CAAC;IAC3C,KAAK;IACL,MAAM;IACN,KAAK;IACL,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;CACP,CAAC,CAAC;AAEH,uEAAuE;AACvE,MAAM,oBAAoB,GAAG,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;AAErD,yEAAyE;AACzE,sEAAsE;AACtE,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC;AAUxD;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,KAAK,UAAU,KAAK,CAAC,QAAgB,EAAE,KAAkB;IAC9D,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;IAC5E,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAExC,MAAM,aAAa,GAAG,MAAM,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IACxD,MAAM,KAAK,GAAG,MAAM,cAAc,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IAE1D,MAAM,MAAM,GAAY,EAAE,CAAC;IAC3B,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;QAC/B,IAAI,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC;YAAE,SAAS;QAC5C,IAAI,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC;YAAE,SAAS;QAC9C,IAAI,aAAa,CAAC,IAAI,CAAC,YAAY,EAAE,aAAa,CAAC;YAAE,SAAS;QAC9D,IAAI,qBAAqB,CAAC,IAAI,CAAC,YAAY,CAAC;YAAE,SAAS;QAEvD,+BAA+B;QAC/B,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC;YAAE,SAAS;QAE3E,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACrD,IAAI,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,OAAO;YAAE,SAAS;QAE/C,MAAM,YAAY,GAAG,SAAS,CAAC,OAAO,CAAC,MAAM,CAC3C,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,CAAC,IAAI,KAAK,SAAS,CACpD,CAAC;QACF,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QAExC,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACjD,MAAM,aAAa,GAAG,OAAO,EAAE,EAAE,IAAI,MAAM,CAAC;QAC5C,MAAM,SAAS,GAAG,aAAa,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC;QAEjE,MAAM,CAAC,IAAI,CAAC;YACV,EAAE,EAAE,kBAAkB,IAAI,CAAC,YAAY,EAAE;YACzC,KAAK,EAAE,UAAU,SAAS,QAAQ,IAAI,CAAC,YAAY,EAAE;YACrD,WAAW,EAAE,GAAG,YAAY,CAAC,MAAM,UAAU,SAAS,GAAG,YAAY,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,YAAY;iBAC3G,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;iBACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;iBAClB,IAAI,CACH,IAAI,CACL,GAAG,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,+EAA+E;YACrJ,QAAQ,EAAE,MAAM;YAChB,QAAQ,EAAE,cAAc;YACxB,YAAY,EAAE,KAAK;YACnB,SAAS,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;SAClD,CAAC,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,UAAU,CAAC,YAAoB;IACtC,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;IACzC,OAAO,CACL,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAC/B,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAC/B,YAAY,CAAC,QAAQ,CAAC,WAAW,CAAC;QAClC,YAAY,CAAC,UAAU,CAAC,QAAQ,CAAC;QACjC,YAAY,CAAC,QAAQ,CAAC,SAAS,CAAC;QAChC,qBAAqB;QACrB,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC;QAC1B,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAC3B,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,YAAoB;IACxC,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC;IACrE,OAAO,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACpC,CAAC;AAED,SAAS,aAAa,CAAC,YAAoB,EAAE,aAA0B;IACrE,IAAI,aAAa,CAAC,GAAG,CAAC,YAAY,CAAC;QAAE,OAAO,IAAI,CAAC;IACjD,IAAI,aAAa,CAAC,GAAG,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACjE,KAAK,MAAM,MAAM,IAAI,oBAAoB,EAAE,CAAC;QAC1C,IAAI,YAAY,KAAK,MAAM,IAAI,YAAY,CAAC,UAAU,CAAC,MAAM,CAAC;YAAE,OAAO,IAAI,CAAC;IAC9E,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,qBAAqB,CAAC,YAAoB;IACjD,IAAI,CAAC,sBAAsB,CAAC,YAAY,CAAC;QAAE,OAAO,KAAK,CAAC;IAExD,MAAM,UAAU,GAAG,YAAY,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACpD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;IACjF,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC/C,IACE,CAAC,OAAO,KAAK,GAAG,IAAI,OAAO,KAAK,KAAK,CAAC;QACtC,8BAA8B,CAAC,GAAG,CAAC,QAAQ,CAAC,EAC5C,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,0BAA0B,CAAC,UAAU,CAAC;QAAE,OAAO,IAAI,CAAC;IACxD,IAAI,8BAA8B,CAAC,UAAU,CAAC;QAAE,OAAO,IAAI,CAAC;IAC5D,IAAI,0BAA0B,CAAC,UAAU,CAAC;QAAE,OAAO,IAAI,CAAC;IAExD,MAAM,eAAe,GAAG,UAAU,CAAC,UAAU,CAAC,MAAM,CAAC;QACnD,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC;QACjC,CAAC,CAAC,UAAU,CAAC;IACf,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO,KAAK,CAAC;IAEtD,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,eAAe,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC;IAC9F,OAAO,oCAAoC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;AAC/D,CAAC;AAED,SAAS,0BAA0B,CAAC,YAAoB;IACtD,IACE,YAAY,KAAK,cAAc;QAC/B,YAAY,KAAK,cAAc;QAC/B,YAAY,KAAK,sBAAsB;QACvC,YAAY,KAAK,sBAAsB;QACvC,YAAY,KAAK,sBAAsB;QACvC,YAAY,KAAK,sBAAsB;QACvC,YAAY,KAAK,eAAe,EAChC,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,YAAY,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAChD,CAAC;AAED,SAAS,8BAA8B,CAAC,YAAoB;IAC1D,MAAM,SAAS,GAAG,YAAY,CAAC,UAAU,CAAC,MAAM,CAAC;QAC/C,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC;QACnC,CAAC,CAAC,YAAY,CAAC;IACjB,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO,KAAK,CAAC;IACnD,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;AACxD,CAAC;AAED,SAAS,0BAA0B,CAAC,YAAoB;IACtD,MAAM,SAAS,GAAG,YAAY,CAAC,UAAU,CAAC,MAAM,CAAC;QAC/C,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC;QACnC,CAAC,CAAC,YAAY,CAAC;IACjB,OAAO,SAAS,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,8BAA8B,GAAG,IAAI,GAAG,CAAC;IAC7C,YAAY;IACZ,OAAO;IACP,iBAAiB;IACjB,wBAAwB;IACxB,gBAAgB;CACjB,CAAC,CAAC;AAEH,MAAM,oCAAoC,GAAG,IAAI,GAAG,CAAC;IACnD,OAAO;IACP,MAAM;IACN,QAAQ;IACR,UAAU;IACV,SAAS;IACT,SAAS;IACT,OAAO;IACP,WAAW;IACX,cAAc;IACd,kBAAkB;IAClB,WAAW;IACX,cAAc;IACd,SAAS;IACT,QAAQ;IACR,UAAU;IACV,MAAM;IACN,YAAY;IACZ,iBAAiB;IACjB,eAAe;CAChB,CAAC,CAAC;AAEH,SAAS,sBAAsB,CAAC,YAAoB;IAClD,OAAO,4BAA4B,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;AAC1F,CAAC;AAED,SAAS,cAAc,CAAC,CAAS;IAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC5B,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC3C,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,QAAgB;IAC/C,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;IACpD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAChD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAmB,CAAC;QAC9C,KAAK,MAAM,KAAK,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YACvD,IAAI,OAAO,KAAK,KAAK,QAAQ;gBAAE,aAAa,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAC/D,CAAC;QACD,IAAI,OAAO,GAAG,CAAC,GAAG,KAAK,QAAQ;YAAE,aAAa,CAAC,OAAO,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;aAC5D,IAAI,GAAG,CAAC,GAAG,IAAI,OAAO,GAAG,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;YAChD,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC;gBAAE,aAAa,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAC5E,CAAC;QACD,cAAc,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,0CAA0C;IAC5C,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,aAAa,CAAC,GAAgB,EAAE,KAAa;IACpD,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC9D,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACjB,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC;AACnC,CAAC;AAED,SAAS,cAAc,CAAC,YAAqB,EAAE,GAAgB;IAC7D,IAAI,CAAC,YAAY;QAAE,OAAO;IAC1B,IAAI,OAAO,YAAY,KAAK,QAAQ,EAAE,CAAC;QACrC,aAAa,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;QACjC,OAAO;IACT,CAAC;IACD,IAAI,OAAO,YAAY,KAAK,QAAQ;QAAE,OAAO;IAC7C,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,YAAuC,CAAC,EAAE,CAAC;QAC3E,cAAc,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC7B,CAAC;AACH,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import fs from 'node:fs/promises';
|
|
2
2
|
import path from 'node:path';
|
|
3
|
-
import { buildImportGraph
|
|
3
|
+
import { buildImportGraph } from '../core/importGraph.js';
|
|
4
4
|
import { detectWorkspaces } from '../core/monorepo.js';
|
|
5
5
|
import { findDependencyLines } from '../utils/packageJsonLocator.js';
|
|
6
6
|
/**
|
|
@@ -139,16 +139,16 @@ async function checkOnePackage(packageDir, locationPrefix, fullGraph, scopedFile
|
|
|
139
139
|
if (allDeclared.size === 0)
|
|
140
140
|
return [];
|
|
141
141
|
// Project per-package usage: walk only the files this manifest covers and
|
|
142
|
-
// collect
|
|
142
|
+
// collect external packages from the resolved package index. This avoids
|
|
143
|
+
// counting tsconfig path aliases as dependency imports.
|
|
143
144
|
const usedPackages = new Set();
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
usedPackages.add(name);
|
|
145
|
+
const scopedRelativePaths = new Set(scopedFiles.map((f) => f.relativePath));
|
|
146
|
+
for (const [pkgName, importers] of fullGraph.packageImporters ?? []) {
|
|
147
|
+
for (const importer of importers) {
|
|
148
|
+
if (scopedRelativePaths.has(importer)) {
|
|
149
|
+
usedPackages.add(pkgName);
|
|
150
|
+
break;
|
|
151
|
+
}
|
|
152
152
|
}
|
|
153
153
|
}
|
|
154
154
|
const scriptUsedBinaries = extractScriptBinaries(pkg);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"unusedDependencyCheck.js","sourceRoot":"","sources":["../../src/analyzers/unusedDependencyCheck.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,gBAAgB,EAAE,
|
|
1
|
+
{"version":3,"file":"unusedDependencyCheck.js","sourceRoot":"","sources":["../../src/analyzers/unusedDependencyCheck.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import chalk from 'chalk';
|
|
2
2
|
import { assertFormatSupported, getRootPath, maybeCompactBanner, program, setupLogLevel, } from '../_shared.js';
|
|
3
3
|
import { computeBugHunt } from '../../core/bugHunt.js';
|
|
4
|
+
const REVIEW_SIGNAL_FILE_PREVIEW_LIMIT = 3;
|
|
4
5
|
export function registerBugHunt() {
|
|
5
6
|
program
|
|
6
7
|
.command('bug-hunt')
|
|
@@ -29,26 +30,54 @@ export function registerBugHunt() {
|
|
|
29
30
|
});
|
|
30
31
|
}
|
|
31
32
|
function printBugHunt(report) {
|
|
32
|
-
const
|
|
33
|
-
|
|
33
|
+
const displayVerdict = bugHuntDisplayVerdict(report);
|
|
34
|
+
const color = report.verdict === 'block' ? chalk.red : displayVerdict === 'clean' ? chalk.green : chalk.yellow;
|
|
35
|
+
console.log(color(`Bug Hunt: ${displayVerdict}`));
|
|
34
36
|
console.log(report.summary);
|
|
35
37
|
console.log('');
|
|
36
|
-
|
|
37
|
-
for (const finding of report.fixQueue) {
|
|
38
|
-
printFinding(finding);
|
|
39
|
-
}
|
|
38
|
+
printFindingSection(report);
|
|
40
39
|
console.log('');
|
|
41
40
|
console.log(chalk.bold('Verify'));
|
|
42
41
|
for (const entry of report.verificationMatrix) {
|
|
43
42
|
console.log(`- ${entry.command}`);
|
|
44
43
|
}
|
|
45
44
|
}
|
|
46
|
-
function
|
|
47
|
-
|
|
45
|
+
function printFindingSection(report) {
|
|
46
|
+
if (report.fixQueue.length > 0) {
|
|
47
|
+
console.log(chalk.bold('Action Queue'));
|
|
48
|
+
for (const finding of report.fixQueue)
|
|
49
|
+
printFinding(finding);
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
const reviewSignals = report.verdict === 'review' ? report.topSuspects.filter(isReviewSignal) : [];
|
|
53
|
+
if (reviewSignals.length === 0)
|
|
54
|
+
return;
|
|
55
|
+
console.log(chalk.bold('Review Signals'));
|
|
56
|
+
for (const finding of reviewSignals)
|
|
57
|
+
printFinding(finding, { maxFiles: REVIEW_SIGNAL_FILE_PREVIEW_LIMIT });
|
|
58
|
+
}
|
|
59
|
+
function printFinding(finding, options = {}) {
|
|
60
|
+
const files = findingFileSummary(finding.files, options.maxFiles);
|
|
48
61
|
console.log(`- ${chalk.bold(`[${finding.priority}] ${finding.title}`)}${files}`);
|
|
49
62
|
console.log(` ${finding.why}`);
|
|
50
63
|
console.log(` verify: ${finding.verification.commands.join(' && ')}`);
|
|
51
64
|
}
|
|
65
|
+
function findingFileSummary(files, maxFiles) {
|
|
66
|
+
if (files.length === 0)
|
|
67
|
+
return '';
|
|
68
|
+
if (!maxFiles || files.length <= maxFiles)
|
|
69
|
+
return ` (${files.join(', ')})`;
|
|
70
|
+
return ` (${files.slice(0, maxFiles).join(', ')}, +${files.length - maxFiles} more)`;
|
|
71
|
+
}
|
|
72
|
+
function isReviewSignal(finding) {
|
|
73
|
+
return (finding.source === 'preflight' && finding.evidence.some((entry) => entry.source === 'release'));
|
|
74
|
+
}
|
|
75
|
+
function bugHuntDisplayVerdict(report) {
|
|
76
|
+
if (report.summary.startsWith('review:') && report.summary.includes('manual sign-off action')) {
|
|
77
|
+
return 'review';
|
|
78
|
+
}
|
|
79
|
+
return report.verdict;
|
|
80
|
+
}
|
|
52
81
|
function parsePositiveInt(value) {
|
|
53
82
|
const parsed = Number.parseInt(value, 10);
|
|
54
83
|
if (!Number.isFinite(parsed) || parsed <= 0) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bugHunt.js","sourceRoot":"","sources":["../../../src/cli/commands/bugHunt.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EACL,qBAAqB,EACrB,WAAW,EACX,kBAAkB,EAClB,OAAO,EACP,aAAa,GACd,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAGvD,MAAM,UAAU,eAAe;IAC7B,OAAO;SACJ,OAAO,CAAC,UAAU,CAAC;SACnB,WAAW,CACV,gGAAgG,CACjG;SACA,MAAM,CAAC,wBAAwB,EAAE,sCAAsC,EAAE,gBAAgB,CAAC;SAC1F,MAAM,CAAC,gBAAgB,EAAE,yCAAyC,CAAC;SACnE,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,aAAa,EAAE,CAAC;QAChB,kBAAkB,EAAE,CAAC;QACrB,MAAM,MAAM,GAAG,qBAAqB,CAAC,UAAU,CAAC,CAAC;QAEjD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,WAAW,EAAE,EAAE;gBACjD,WAAW,EAAE,OAAO,CAAC,WAAW;gBAChC,KAAK,EAAE,OAAO,CAAC,KAAK;aACrB,CAAC,CAAC;YAEH,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;gBACtB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;gBAC7C,OAAO;YACT,CAAC;YACD,YAAY,CAAC,MAAM,CAAC,CAAC;QACvB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAC3E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC;AAED,SAAS,YAAY,CAAC,MAAqB;IACzC,MAAM,KAAK,GACT,MAAM,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"bugHunt.js","sourceRoot":"","sources":["../../../src/cli/commands/bugHunt.ts"],"names":[],"mappings":"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"}
|