projscan 4.6.0 → 4.8.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 +25 -12
- package/dist/cli/_shared.js +12 -44
- package/dist/cli/_shared.js.map +1 -1
- package/dist/cli/changedOnly.d.ts +16 -0
- package/dist/cli/changedOnly.js +28 -0
- package/dist/cli/changedOnly.js.map +1 -0
- package/dist/cli/commands/start.js +5 -28
- package/dist/cli/commands/start.js.map +1 -1
- package/dist/cli/commands/startOptionsRegistration.d.ts +2 -0
- package/dist/cli/commands/startOptionsRegistration.js +29 -0
- package/dist/cli/commands/startOptionsRegistration.js.map +1 -0
- package/dist/cli/formatOptions.d.ts +4 -0
- package/dist/cli/formatOptions.js +30 -0
- package/dist/cli/formatOptions.js.map +1 -0
- package/dist/core/agentBrief.js +6 -1
- package/dist/core/agentBrief.js.map +1 -1
- package/dist/core/ast.d.ts +2 -17
- package/dist/core/ast.js +4 -33
- package/dist/core/ast.js.map +1 -1
- package/dist/core/astBodySignals.js +2 -3
- package/dist/core/astBodySignals.js.map +1 -1
- package/dist/core/astMembers.d.ts +1 -0
- package/dist/core/astMembers.js +38 -9
- package/dist/core/astMembers.js.map +1 -1
- package/dist/core/astResult.d.ts +20 -0
- package/dist/core/astResult.js +39 -0
- package/dist/core/astResult.js.map +1 -0
- package/dist/core/bugHunt.js +2 -142
- package/dist/core/bugHunt.js.map +1 -1
- package/dist/core/bugHuntHotspotFindings.d.ts +2 -0
- package/dist/core/bugHuntHotspotFindings.js +68 -0
- package/dist/core/bugHuntHotspotFindings.js.map +1 -0
- package/dist/core/bugHuntPreflightFindings.d.ts +3 -0
- package/dist/core/bugHuntPreflightFindings.js +115 -0
- package/dist/core/bugHuntPreflightFindings.js.map +1 -0
- package/dist/core/codeGraph.d.ts +2 -24
- package/dist/core/codeGraph.js +8 -119
- package/dist/core/codeGraph.js.map +1 -1
- package/dist/core/codeGraphAdapterContexts.d.ts +8 -0
- package/dist/core/codeGraphAdapterContexts.js +14 -0
- package/dist/core/codeGraphAdapterContexts.js.map +1 -0
- package/dist/core/codeGraphFileSelection.d.ts +7 -0
- package/dist/core/codeGraphFileSelection.js +19 -0
- package/dist/core/codeGraphFileSelection.js.map +1 -0
- package/dist/core/codeGraphIncremental.d.ts +17 -0
- package/dist/core/codeGraphIncremental.js +64 -0
- package/dist/core/codeGraphIncremental.js.map +1 -0
- package/dist/core/codeGraphQueries.d.ts +9 -0
- package/dist/core/codeGraphQueries.js +25 -0
- package/dist/core/codeGraphQueries.js.map +1 -0
- package/dist/core/collisionDetector.d.ts +1 -0
- package/dist/core/collisionDetector.js +3 -0
- package/dist/core/collisionDetector.js.map +1 -1
- package/dist/core/coordination.js +23 -5
- package/dist/core/coordination.js.map +1 -1
- package/dist/core/coordinationEvidence.d.ts +1 -0
- package/dist/core/coordinationEvidence.js.map +1 -1
- package/dist/core/dataflow.js +3 -338
- package/dist/core/dataflow.js.map +1 -1
- package/dist/core/dataflowDatabaseSinks.d.ts +8 -0
- package/dist/core/dataflowDatabaseSinks.js +78 -0
- package/dist/core/dataflowDatabaseSinks.js.map +1 -0
- package/dist/core/dataflowRiskAssembly.d.ts +11 -0
- package/dist/core/dataflowRiskAssembly.js +117 -0
- package/dist/core/dataflowRiskAssembly.js.map +1 -0
- package/dist/core/dataflowTraversal.d.ts +25 -0
- package/dist/core/dataflowTraversal.js +200 -0
- package/dist/core/dataflowTraversal.js.map +1 -0
- package/dist/core/fileInspectionReport.d.ts +13 -0
- package/dist/core/fileInspectionReport.js +49 -0
- package/dist/core/fileInspectionReport.js.map +1 -0
- package/dist/core/fileInspector.d.ts +3 -11
- package/dist/core/fileInspector.js +2 -46
- package/dist/core/fileInspector.js.map +1 -1
- package/dist/core/fixSuggest.d.ts +1 -9
- package/dist/core/fixSuggest.js +2 -58
- package/dist/core/fixSuggest.js.map +1 -1
- package/dist/core/fixSuggestDependencyNames.d.ts +1 -0
- package/dist/core/fixSuggestDependencyNames.js +9 -0
- package/dist/core/fixSuggestDependencyNames.js.map +1 -0
- package/dist/core/fixSuggestPreview.d.ts +10 -0
- package/dist/core/fixSuggestPreview.js +87 -0
- package/dist/core/fixSuggestPreview.js.map +1 -0
- package/dist/core/frameworkExpressSources.js +6 -31
- package/dist/core/frameworkExpressSources.js.map +1 -1
- package/dist/core/frameworkFastifySources.js +5 -22
- package/dist/core/frameworkFastifySources.js.map +1 -1
- package/dist/core/frameworkHonoSources.js +12 -24
- package/dist/core/frameworkHonoSources.js.map +1 -1
- package/dist/core/frameworkKoaSources.js +5 -24
- package/dist/core/frameworkKoaSources.js.map +1 -1
- package/dist/core/frameworkNextRouteSources.d.ts +6 -1
- package/dist/core/frameworkNextRouteSources.js +31 -1
- package/dist/core/frameworkNextRouteSources.js.map +1 -1
- package/dist/core/frameworkRemixSources.d.ts +2 -0
- package/dist/core/frameworkRemixSources.js +63 -0
- package/dist/core/frameworkRemixSources.js.map +1 -0
- package/dist/core/frameworkSourceContext.d.ts +15 -0
- package/dist/core/frameworkSourceContext.js +2 -0
- package/dist/core/frameworkSourceContext.js.map +1 -0
- package/dist/core/frameworkSourceMatching.d.ts +6 -0
- package/dist/core/frameworkSourceMatching.js +29 -0
- package/dist/core/frameworkSourceMatching.js.map +1 -0
- package/dist/core/frameworkSourceResolvers.d.ts +2 -0
- package/dist/core/frameworkSourceResolvers.js +45 -0
- package/dist/core/frameworkSourceResolvers.js.map +1 -0
- package/dist/core/frameworkSources.d.ts +3 -3
- package/dist/core/frameworkSources.js +17 -15
- package/dist/core/frameworkSources.js.map +1 -1
- package/dist/core/frameworkSvelteKitSources.d.ts +2 -0
- package/dist/core/frameworkSvelteKitSources.js +118 -0
- package/dist/core/frameworkSvelteKitSources.js.map +1 -0
- package/dist/core/intentRouter.d.ts +4 -14
- package/dist/core/intentRouter.js +2 -33
- package/dist/core/intentRouter.js.map +1 -1
- package/dist/core/intentRouterCatalog.js +49 -0
- package/dist/core/intentRouterCatalog.js.map +1 -1
- package/dist/core/intentRouterKeywordToolGuards.js +5 -0
- package/dist/core/intentRouterKeywordToolGuards.js.map +1 -1
- package/dist/core/intentRouterKeywordWeights.js +36 -0
- package/dist/core/intentRouterKeywordWeights.js.map +1 -1
- package/dist/core/intentRouterReleaseSignals.js +104 -39
- package/dist/core/intentRouterReleaseSignals.js.map +1 -1
- package/dist/core/intentRouterResolution.d.ts +3 -0
- package/dist/core/intentRouterResolution.js +11 -0
- package/dist/core/intentRouterResolution.js.map +1 -0
- package/dist/core/intentRouterResult.d.ts +16 -0
- package/dist/core/intentRouterResult.js +34 -0
- package/dist/core/intentRouterResult.js.map +1 -0
- package/dist/core/intentRouterWorkSignals.js +18 -0
- package/dist/core/intentRouterWorkSignals.js.map +1 -1
- package/dist/core/languages/pythonLockfiles.d.ts +4 -0
- package/dist/core/languages/pythonLockfiles.js +6 -2
- package/dist/core/languages/pythonLockfiles.js.map +1 -1
- package/dist/core/languages/pythonManifests.js +11 -24
- package/dist/core/languages/pythonManifests.js.map +1 -1
- package/dist/core/languages/pythonPep508.js +1 -1
- package/dist/core/languages/pythonPep508.js.map +1 -1
- package/dist/core/languages/pythonProjectEvidence.js +4 -4
- package/dist/core/languages/pythonProjectEvidence.js.map +1 -1
- package/dist/core/languages/pythonPyproject.js +1 -1
- package/dist/core/languages/pythonPyproject.js.map +1 -1
- package/dist/core/languages/pythonPyprojectEvidence.d.ts +7 -0
- package/dist/core/languages/pythonPyprojectEvidence.js +23 -0
- package/dist/core/languages/pythonPyprojectEvidence.js.map +1 -0
- package/dist/core/languages/pythonRequirements.d.ts +2 -0
- package/dist/core/languages/pythonRequirements.js +215 -24
- package/dist/core/languages/pythonRequirements.js.map +1 -1
- package/dist/core/pluginAnalyzerLoading.d.ts +3 -0
- package/dist/core/pluginAnalyzerLoading.js +55 -0
- package/dist/core/pluginAnalyzerLoading.js.map +1 -0
- package/dist/core/pluginAnalyzerRunning.d.ts +10 -0
- package/dist/core/pluginAnalyzerRunning.js +32 -0
- package/dist/core/pluginAnalyzerRunning.js.map +1 -0
- package/dist/core/pluginIssueValidation.d.ts +2 -0
- package/dist/core/pluginIssueValidation.js +22 -0
- package/dist/core/pluginIssueValidation.js.map +1 -0
- package/dist/core/pluginManifestDiscovery.d.ts +25 -0
- package/dist/core/pluginManifestDiscovery.js +80 -0
- package/dist/core/pluginManifestDiscovery.js.map +1 -0
- package/dist/core/pluginManifestValidation.d.ts +41 -0
- package/dist/core/pluginManifestValidation.js +179 -0
- package/dist/core/pluginManifestValidation.js.map +1 -0
- package/dist/core/pluginModuleLoading.d.ts +8 -0
- package/dist/core/pluginModuleLoading.js +91 -0
- package/dist/core/pluginModuleLoading.js.map +1 -0
- package/dist/core/pluginReporterLoading.d.ts +41 -0
- package/dist/core/pluginReporterLoading.js +105 -0
- package/dist/core/pluginReporterLoading.js.map +1 -0
- package/dist/core/pluginRuntimeTypes.d.ts +20 -0
- package/dist/core/pluginRuntimeTypes.js +2 -0
- package/dist/core/pluginRuntimeTypes.js.map +1 -0
- package/dist/core/plugins.d.ts +11 -126
- package/dist/core/plugins.js +13 -478
- package/dist/core/plugins.js.map +1 -1
- package/dist/core/preflight.d.ts +1 -2
- package/dist/core/preflight.js +4 -91
- package/dist/core/preflight.js.map +1 -1
- package/dist/core/preflightEvidence.js +11 -0
- package/dist/core/preflightEvidence.js.map +1 -1
- package/dist/core/preflightInputs.d.ts +1 -0
- package/dist/core/preflightInputs.js.map +1 -1
- package/dist/core/preflightReasons.d.ts +21 -0
- package/dist/core/preflightReasons.js +28 -0
- package/dist/core/preflightReasons.js.map +1 -0
- package/dist/core/preflightReport.d.ts +9 -0
- package/dist/core/preflightReport.js +67 -0
- package/dist/core/preflightReport.js.map +1 -0
- package/dist/core/regressionPlan.d.ts +2 -1
- package/dist/core/regressionPlan.js +7 -1
- package/dist/core/regressionPlan.js.map +1 -1
- package/dist/core/releaseEvidence.js +6 -120
- package/dist/core/releaseEvidence.js.map +1 -1
- package/dist/core/releaseEvidenceArtifacts.d.ts +3 -0
- package/dist/core/releaseEvidenceArtifacts.js +65 -0
- package/dist/core/releaseEvidenceArtifacts.js.map +1 -0
- package/dist/core/releaseEvidenceVerdict.d.ts +6 -0
- package/dist/core/releaseEvidenceVerdict.js +54 -0
- package/dist/core/releaseEvidenceVerdict.js.map +1 -0
- package/dist/core/reportPathRedaction.d.ts +4 -0
- package/dist/core/reportPathRedaction.js +64 -0
- package/dist/core/reportPathRedaction.js.map +1 -0
- package/dist/core/reportScope.js +2 -163
- package/dist/core/reportScope.js.map +1 -1
- package/dist/core/reportScopeFiltering.d.ts +9 -0
- package/dist/core/reportScopeFiltering.js +102 -0
- package/dist/core/reportScopeFiltering.js.map +1 -0
- package/dist/core/review.js +2 -47
- package/dist/core/review.js.map +1 -1
- package/dist/core/reviewChangedReport.d.ts +13 -0
- package/dist/core/reviewChangedReport.js +38 -0
- package/dist/core/reviewChangedReport.js.map +1 -0
- package/dist/core/reviewComputation.d.ts +9 -0
- package/dist/core/reviewComputation.js +14 -0
- package/dist/core/reviewComputation.js.map +1 -0
- package/dist/core/reviewContractChanges.js +22 -8
- package/dist/core/reviewContractChanges.js.map +1 -1
- package/dist/core/reviewDataflow.js +18 -0
- package/dist/core/reviewDataflow.js.map +1 -1
- package/dist/core/roadmapCatalog.js +7 -203
- package/dist/core/roadmapCatalog.js.map +1 -1
- package/dist/core/roadmapCatalogPost44.d.ts +2 -0
- package/dist/core/roadmapCatalogPost44.js +205 -0
- package/dist/core/roadmapCatalogPost44.js.map +1 -0
- package/dist/core/roadmapCatalogTypes.d.ts +6 -0
- package/dist/core/roadmapCatalogTypes.js +2 -0
- package/dist/core/roadmapCatalogTypes.js.map +1 -0
- package/dist/core/searchIndex.d.ts +2 -14
- package/dist/core/searchIndex.js +4 -227
- package/dist/core/searchIndex.js.map +1 -1
- package/dist/core/searchIndexFiles.d.ts +1 -0
- package/dist/core/searchIndexFiles.js +26 -0
- package/dist/core/searchIndexFiles.js.map +1 -0
- package/dist/core/searchIndexText.d.ts +15 -0
- package/dist/core/searchIndexText.js +204 -0
- package/dist/core/searchIndexText.js.map +1 -0
- package/dist/core/start.js +5 -46
- package/dist/core/start.js.map +1 -1
- package/dist/core/startClaimRouteCriteria.d.ts +7 -0
- package/dist/core/startClaimRouteCriteria.js +16 -0
- package/dist/core/startClaimRouteCriteria.js.map +1 -0
- package/dist/core/startCouplingRouteCriteria.d.ts +2 -0
- package/dist/core/startCouplingRouteCriteria.js +13 -0
- package/dist/core/startCouplingRouteCriteria.js.map +1 -0
- package/dist/core/startDependencyRouteCriteria.d.ts +2 -0
- package/dist/core/startDependencyRouteCriteria.js +43 -0
- package/dist/core/startDependencyRouteCriteria.js.map +1 -0
- package/dist/core/startEvidence.d.ts +1 -1
- package/dist/core/startEvidence.js +16 -1
- package/dist/core/startEvidence.js.map +1 -1
- package/dist/core/startFileRouteCriteria.d.ts +2 -0
- package/dist/core/startFileRouteCriteria.js +56 -0
- package/dist/core/startFileRouteCriteria.js.map +1 -0
- package/dist/core/startFixedRouteCriteria.d.ts +1 -0
- package/dist/core/startFixedRouteCriteria.js +90 -0
- package/dist/core/startFixedRouteCriteria.js.map +1 -0
- package/dist/core/startImpactRouteCriteria.d.ts +7 -0
- package/dist/core/startImpactRouteCriteria.js +14 -0
- package/dist/core/startImpactRouteCriteria.js.map +1 -0
- package/dist/core/startInputs.d.ts +1 -0
- package/dist/core/startInputs.js +4 -1
- package/dist/core/startInputs.js.map +1 -1
- package/dist/core/startIntentTargets.d.ts +1 -0
- package/dist/core/startIntentTargets.js +28 -0
- package/dist/core/startIntentTargets.js.map +1 -1
- package/dist/core/startMissionControl.js +8 -2
- package/dist/core/startMissionControl.js.map +1 -1
- package/dist/core/startMissionPolicy.js +12 -0
- package/dist/core/startMissionPolicy.js.map +1 -1
- package/dist/core/startMode.d.ts +1 -0
- package/dist/core/startMode.js +10 -2
- package/dist/core/startMode.js.map +1 -1
- package/dist/core/startPreflightRouteCriteria.d.ts +11 -0
- package/dist/core/startPreflightRouteCriteria.js +29 -0
- package/dist/core/startPreflightRouteCriteria.js.map +1 -0
- package/dist/core/startProductPlanningRouteCriteria.d.ts +8 -0
- package/dist/core/startProductPlanningRouteCriteria.js +29 -0
- package/dist/core/startProductPlanningRouteCriteria.js.map +1 -0
- package/dist/core/startRegressionRouteCriteria.d.ts +3 -0
- package/dist/core/startRegressionRouteCriteria.js +62 -0
- package/dist/core/startRegressionRouteCriteria.js.map +1 -0
- package/dist/core/startReportBuilder.d.ts +1 -0
- package/dist/core/startReportBuilder.js +1 -0
- package/dist/core/startReportBuilder.js.map +1 -1
- package/dist/core/startReportContext.d.ts +23 -0
- package/dist/core/startReportContext.js +51 -0
- package/dist/core/startReportContext.js.map +1 -0
- package/dist/core/startRoadmapPreview.d.ts +2 -0
- package/dist/core/startRoadmapPreview.js +31 -0
- package/dist/core/startRoadmapPreview.js.map +1 -0
- package/dist/core/startRouteActions.js +39 -1
- package/dist/core/startRouteActions.js.map +1 -1
- package/dist/core/startSuccessCriteria.d.ts +2 -3
- package/dist/core/startSuccessCriteria.js +15 -419
- package/dist/core/startSuccessCriteria.js.map +1 -1
- package/dist/core/startUnderstandRouteCriteria.d.ts +3 -0
- package/dist/core/startUnderstandRouteCriteria.js +97 -0
- package/dist/core/startUnderstandRouteCriteria.js.map +1 -0
- package/dist/core/taint.d.ts +2 -67
- package/dist/core/taint.js +41 -164
- package/dist/core/taint.js.map +1 -1
- package/dist/core/taintIndex.d.ts +20 -0
- package/dist/core/taintIndex.js +81 -0
- package/dist/core/taintIndex.js.map +1 -0
- package/dist/core/taintTraversal.d.ts +8 -0
- package/dist/core/taintTraversal.js +113 -0
- package/dist/core/taintTraversal.js.map +1 -0
- package/dist/core/taintTypes.d.ts +67 -0
- package/dist/core/taintTypes.js +2 -0
- package/dist/core/taintTypes.js.map +1 -0
- package/dist/core/telemetry.d.ts +9 -89
- package/dist/core/telemetry.js +35 -387
- package/dist/core/telemetry.js.map +1 -1
- package/dist/core/telemetryConfig.d.ts +58 -0
- package/dist/core/telemetryConfig.js +171 -0
- package/dist/core/telemetryConfig.js.map +1 -0
- package/dist/core/telemetryEvents.d.ts +57 -0
- package/dist/core/telemetryEvents.js +143 -0
- package/dist/core/telemetryEvents.js.map +1 -0
- package/dist/core/telemetryFlushing.d.ts +10 -0
- package/dist/core/telemetryFlushing.js +42 -0
- package/dist/core/telemetryFlushing.js.map +1 -0
- package/dist/core/telemetryRecording.d.ts +26 -0
- package/dist/core/telemetryRecording.js +38 -0
- package/dist/core/telemetryRecording.js.map +1 -0
- package/dist/core/telemetrySender.d.ts +9 -0
- package/dist/core/telemetrySender.js +22 -0
- package/dist/core/telemetrySender.js.map +1 -0
- package/dist/core/upgradePreviewPython.js +1 -1
- package/dist/core/upgradePreviewPython.js.map +1 -1
- package/dist/index.d.ts +4 -60
- package/dist/index.js +4 -60
- package/dist/index.js.map +1 -1
- package/dist/mcp/server.js +2 -13
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/serverMessageHandling.d.ts +3 -0
- package/dist/mcp/serverMessageHandling.js +16 -0
- package/dist/mcp/serverMessageHandling.js.map +1 -0
- package/dist/mcp/toolDefinitions.d.ts +3 -0
- package/dist/mcp/toolDefinitions.js +15 -0
- package/dist/mcp/toolDefinitions.js.map +1 -0
- package/dist/mcp/tools.js +2 -13
- package/dist/mcp/tools.js.map +1 -1
- package/dist/projscan-sbom.cdx.json +6 -6
- package/dist/publicAgent.d.ts +22 -0
- package/dist/publicAgent.js +23 -0
- package/dist/publicAgent.js.map +1 -0
- package/dist/publicCore.d.ts +29 -0
- package/dist/publicCore.js +30 -0
- package/dist/publicCore.js.map +1 -0
- package/dist/publicLanguages.d.ts +1 -0
- package/dist/publicLanguages.js +2 -0
- package/dist/publicLanguages.js.map +1 -0
- package/dist/publicMcp.d.ts +8 -0
- package/dist/publicMcp.js +9 -0
- package/dist/publicMcp.js.map +1 -0
- package/dist/reporters/consoleFixReporter.d.ts +3 -0
- package/dist/reporters/consoleFixReporter.js +41 -0
- package/dist/reporters/consoleFixReporter.js.map +1 -0
- package/dist/reporters/consoleReporter.d.ts +1 -3
- package/dist/reporters/consoleReporter.js +1 -42
- package/dist/reporters/consoleReporter.js.map +1 -1
- package/dist/reporters/htmlAnalysisReporter.d.ts +3 -0
- package/dist/reporters/htmlAnalysisReporter.js +98 -0
- package/dist/reporters/htmlAnalysisReporter.js.map +1 -0
- package/dist/reporters/htmlCoverageReporter.d.ts +2 -0
- package/dist/reporters/htmlCoverageReporter.js +52 -0
- package/dist/reporters/htmlCoverageReporter.js.map +1 -0
- package/dist/reporters/htmlImpactReporter.d.ts +2 -0
- package/dist/reporters/htmlImpactReporter.js +41 -0
- package/dist/reporters/htmlImpactReporter.js.map +1 -0
- package/dist/reporters/htmlPrDiffReporter.d.ts +2 -0
- package/dist/reporters/htmlPrDiffReporter.js +84 -0
- package/dist/reporters/htmlPrDiffReporter.js.map +1 -0
- package/dist/reporters/htmlReporter.d.ts +20 -9
- package/dist/reporters/htmlReporter.js +7 -365
- package/dist/reporters/htmlReporter.js.map +1 -1
- package/dist/reporters/htmlReviewReporter.d.ts +2 -0
- package/dist/reporters/htmlReviewReporter.js +94 -0
- package/dist/reporters/htmlReviewReporter.js.map +1 -0
- package/dist/reporters/htmlShared.d.ts +7 -0
- package/dist/reporters/htmlShared.js +106 -0
- package/dist/reporters/htmlShared.js.map +1 -0
- package/dist/tool-manifest.json +2 -2
- package/dist/types/preflight.d.ts +19 -0
- package/dist/types/start.d.ts +7 -437
- package/dist/types/startCommon.d.ts +79 -0
- package/dist/types/startCommon.js +2 -0
- package/dist/types/startCommon.js.map +1 -0
- package/dist/types/startExecution.d.ts +44 -0
- package/dist/types/startExecution.js +2 -0
- package/dist/types/startExecution.js.map +1 -0
- package/dist/types/startMissionControl.d.ts +91 -0
- package/dist/types/startMissionControl.js +2 -0
- package/dist/types/startMissionControl.js.map +1 -0
- package/dist/types/startMissionProof.d.ts +91 -0
- package/dist/types/startMissionProof.js +2 -0
- package/dist/types/startMissionProof.js.map +1 -0
- package/dist/types/startMissionResume.d.ts +100 -0
- package/dist/types/startMissionResume.js +2 -0
- package/dist/types/startMissionResume.js.map +1 -0
- package/dist/types/startMissionReview.d.ts +45 -0
- package/dist/types/startMissionReview.js +2 -0
- package/dist/types/startMissionReview.js.map +1 -0
- package/dist/types/startMissionTooling.d.ts +16 -0
- package/dist/types/startMissionTooling.js +2 -0
- package/dist/types/startMissionTooling.js.map +1 -0
- package/dist/utils/changedFiles.d.ts +1 -0
- package/dist/utils/changedFiles.js +7 -4
- package/dist/utils/changedFiles.js.map +1 -1
- package/docs/GUIDE.md +9 -7
- package/docs/ROADMAP.md +18 -7
- package/docs/examples/adoption-workflows.md +12 -1
- package/docs/examples/swarm-coordination.md +11 -2
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pluginManifestDiscovery.js","sourceRoot":"","sources":["../../src/core/pluginManifestDiscovery.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
export declare const PLUGIN_SCHEMA_VERSION = 1;
|
|
2
|
+
export type PluginKind = 'analyzer' | 'reporter';
|
|
3
|
+
export type PluginReporterCommand = 'doctor' | 'analyze' | 'ci';
|
|
4
|
+
export declare const PLUGIN_REPORTER_COMMANDS: readonly ["doctor", "analyze", "ci"];
|
|
5
|
+
interface PluginManifestBase {
|
|
6
|
+
schemaVersion: number;
|
|
7
|
+
name: string;
|
|
8
|
+
kind: PluginKind;
|
|
9
|
+
/** Module entry point, relative to the manifest file. */
|
|
10
|
+
module: string;
|
|
11
|
+
/** Optional human-readable summary. */
|
|
12
|
+
description?: string;
|
|
13
|
+
}
|
|
14
|
+
export interface PluginAnalyzerManifest extends PluginManifestBase {
|
|
15
|
+
kind: 'analyzer';
|
|
16
|
+
/** Issue category emitted by this plugin (`Issue.category`). */
|
|
17
|
+
category: string;
|
|
18
|
+
}
|
|
19
|
+
export interface PluginReporterManifest extends PluginManifestBase {
|
|
20
|
+
kind: 'reporter';
|
|
21
|
+
/** CLI commands this reporter can render. */
|
|
22
|
+
commands: PluginReporterCommand[];
|
|
23
|
+
}
|
|
24
|
+
export type PluginManifest = PluginAnalyzerManifest | PluginReporterManifest;
|
|
25
|
+
export interface PluginDiagnostic {
|
|
26
|
+
code: 'invalid-manifest' | 'unsupported-schema-version' | 'invalid-name' | 'unsupported-kind' | 'invalid-module' | 'invalid-category' | 'invalid-commands' | 'invalid-description' | 'invalid-manifest-path' | 'invalid-json' | 'read-error' | 'plugins-disabled' | 'reporter-not-found' | 'reporter-unsupported-command' | 'invalid-reporter-export' | 'reporter-load-error' | 'reporter-render-error' | 'plugin-untrusted';
|
|
27
|
+
message: string;
|
|
28
|
+
field?: string;
|
|
29
|
+
hint?: string;
|
|
30
|
+
}
|
|
31
|
+
interface ValidationOk {
|
|
32
|
+
ok: true;
|
|
33
|
+
manifest: PluginManifest;
|
|
34
|
+
}
|
|
35
|
+
interface ValidationFail {
|
|
36
|
+
ok: false;
|
|
37
|
+
reason: string;
|
|
38
|
+
diagnostic: PluginDiagnostic;
|
|
39
|
+
}
|
|
40
|
+
export declare function validateManifest(input: unknown): ValidationOk | ValidationFail;
|
|
41
|
+
export {};
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
export const PLUGIN_SCHEMA_VERSION = 1;
|
|
3
|
+
export const PLUGIN_REPORTER_COMMANDS = ['doctor', 'analyze', 'ci'];
|
|
4
|
+
const BASE_MANIFEST_DIAGNOSTICS = [
|
|
5
|
+
schemaVersionDiagnostic,
|
|
6
|
+
nameDiagnostic,
|
|
7
|
+
kindDiagnostic,
|
|
8
|
+
moduleDiagnostic,
|
|
9
|
+
descriptionDiagnostic,
|
|
10
|
+
];
|
|
11
|
+
export function validateManifest(input) {
|
|
12
|
+
const validation = validateManifestBase(input);
|
|
13
|
+
if (!validation.ok)
|
|
14
|
+
return validation;
|
|
15
|
+
return validation.base.kind === 'analyzer'
|
|
16
|
+
? validateAnalyzerManifest(validation.obj, validation.base)
|
|
17
|
+
: validateReporterManifest(validation.obj, validation.base);
|
|
18
|
+
}
|
|
19
|
+
function validateManifestBase(input) {
|
|
20
|
+
const objectValidation = validateManifestObject(input);
|
|
21
|
+
if (!objectValidation.ok)
|
|
22
|
+
return objectValidation;
|
|
23
|
+
const diagnostic = BASE_MANIFEST_DIAGNOSTICS.map((check) => check(objectValidation.obj)).find((item) => item !== null);
|
|
24
|
+
if (diagnostic)
|
|
25
|
+
return failValidation(diagnostic);
|
|
26
|
+
return {
|
|
27
|
+
ok: true,
|
|
28
|
+
obj: objectValidation.obj,
|
|
29
|
+
base: manifestBaseFromObject(objectValidation.obj),
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
function validateManifestObject(input) {
|
|
33
|
+
if (input && typeof input === 'object')
|
|
34
|
+
return { ok: true, obj: input };
|
|
35
|
+
return failValidation({
|
|
36
|
+
code: 'invalid-manifest',
|
|
37
|
+
message: 'manifest must be a JSON object',
|
|
38
|
+
hint: 'Use an object with schemaVersion, name, kind, module, and category fields.',
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
function manifestBaseFromObject(obj) {
|
|
42
|
+
return {
|
|
43
|
+
schemaVersion: PLUGIN_SCHEMA_VERSION,
|
|
44
|
+
name: obj.name,
|
|
45
|
+
kind: obj.kind,
|
|
46
|
+
module: obj.module,
|
|
47
|
+
...(typeof obj.description === 'string' ? { description: obj.description } : {}),
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
function schemaVersionDiagnostic(obj) {
|
|
51
|
+
if (obj.schemaVersion === PLUGIN_SCHEMA_VERSION)
|
|
52
|
+
return null;
|
|
53
|
+
return {
|
|
54
|
+
code: 'unsupported-schema-version',
|
|
55
|
+
field: 'schemaVersion',
|
|
56
|
+
message: `unsupported schemaVersion ${String(obj.schemaVersion)}; expected ${PLUGIN_SCHEMA_VERSION}`,
|
|
57
|
+
hint: `Set "schemaVersion": ${PLUGIN_SCHEMA_VERSION}.`,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
function nameDiagnostic(obj) {
|
|
61
|
+
if (typeof obj.name === 'string' && /^[a-z0-9][a-z0-9._/-]{0,64}$/i.test(obj.name))
|
|
62
|
+
return null;
|
|
63
|
+
return {
|
|
64
|
+
code: 'invalid-name',
|
|
65
|
+
field: 'name',
|
|
66
|
+
message: 'name is required and must be 1-65 chars of [a-z0-9._/-]',
|
|
67
|
+
hint: 'Use a stable 1-65 character plugin id such as "team/no-console" or "my-plugin".',
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
function kindDiagnostic(obj) {
|
|
71
|
+
if (obj.kind === 'analyzer' || obj.kind === 'reporter')
|
|
72
|
+
return null;
|
|
73
|
+
return {
|
|
74
|
+
code: 'unsupported-kind',
|
|
75
|
+
field: 'kind',
|
|
76
|
+
message: 'kind must be "analyzer" or "reporter"',
|
|
77
|
+
hint: 'Set "kind": "analyzer" for issue-producing plugins or "kind": "reporter" for CLI output plugins.',
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
function moduleDiagnostic(obj) {
|
|
81
|
+
if (typeof obj.module !== 'string' || obj.module.length === 0) {
|
|
82
|
+
return {
|
|
83
|
+
code: 'invalid-module',
|
|
84
|
+
field: 'module',
|
|
85
|
+
message: 'module is required and must be a relative path',
|
|
86
|
+
hint: 'Point to a local module inside the same plugin directory, for example "./check.mjs".',
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
if (path.isAbsolute(obj.module) || obj.module.split(/[/\\]/).some((seg) => seg === '..')) {
|
|
90
|
+
return {
|
|
91
|
+
code: 'invalid-module',
|
|
92
|
+
field: 'module',
|
|
93
|
+
message: 'module must be a relative path inside the plugin dir',
|
|
94
|
+
hint: 'Do not use absolute paths or any ".." path segment.',
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
99
|
+
function descriptionDiagnostic(obj) {
|
|
100
|
+
if (obj.description === undefined || typeof obj.description === 'string')
|
|
101
|
+
return null;
|
|
102
|
+
return {
|
|
103
|
+
code: 'invalid-description',
|
|
104
|
+
field: 'description',
|
|
105
|
+
message: 'description must be a string when provided',
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
function validateAnalyzerManifest(obj, base) {
|
|
109
|
+
if (typeof obj.category !== 'string' || obj.category.length === 0) {
|
|
110
|
+
return failValidation({
|
|
111
|
+
code: 'invalid-category',
|
|
112
|
+
field: 'category',
|
|
113
|
+
message: 'category is required for analyzer plugins',
|
|
114
|
+
hint: 'Use the fallback Issue.category for this plugin, for example "custom" or "security".',
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
return {
|
|
118
|
+
ok: true,
|
|
119
|
+
manifest: {
|
|
120
|
+
schemaVersion: base.schemaVersion,
|
|
121
|
+
name: base.name,
|
|
122
|
+
kind: 'analyzer',
|
|
123
|
+
module: base.module,
|
|
124
|
+
category: obj.category,
|
|
125
|
+
...(base.description ? { description: base.description } : {}),
|
|
126
|
+
},
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
function validateReporterManifest(obj, base) {
|
|
130
|
+
const commandValidation = validateReporterCommands(obj.commands);
|
|
131
|
+
if (!commandValidation.ok)
|
|
132
|
+
return commandValidation;
|
|
133
|
+
return {
|
|
134
|
+
ok: true,
|
|
135
|
+
manifest: {
|
|
136
|
+
schemaVersion: base.schemaVersion,
|
|
137
|
+
name: base.name,
|
|
138
|
+
kind: 'reporter',
|
|
139
|
+
module: base.module,
|
|
140
|
+
commands: commandValidation.commands,
|
|
141
|
+
...(base.description ? { description: base.description } : {}),
|
|
142
|
+
},
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
function validateReporterCommands(input) {
|
|
146
|
+
if (!Array.isArray(input) || input.length === 0) {
|
|
147
|
+
return failValidation({
|
|
148
|
+
code: 'invalid-commands',
|
|
149
|
+
field: 'commands',
|
|
150
|
+
message: 'commands must be a non-empty array for reporter plugins',
|
|
151
|
+
hint: 'Use one or more supported commands: doctor, analyze, ci.',
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
const seen = new Set();
|
|
155
|
+
const invalid = [];
|
|
156
|
+
for (const value of input) {
|
|
157
|
+
if (typeof value !== 'string' || !isReporterCommand(value)) {
|
|
158
|
+
invalid.push(String(value));
|
|
159
|
+
continue;
|
|
160
|
+
}
|
|
161
|
+
seen.add(value);
|
|
162
|
+
}
|
|
163
|
+
if (invalid.length > 0) {
|
|
164
|
+
return failValidation({
|
|
165
|
+
code: 'invalid-commands',
|
|
166
|
+
field: 'commands',
|
|
167
|
+
message: `unsupported reporter command(s): ${invalid.join(', ')}`,
|
|
168
|
+
hint: 'Supported reporter commands are: doctor, analyze, ci.',
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
return { ok: true, commands: [...seen] };
|
|
172
|
+
}
|
|
173
|
+
function isReporterCommand(value) {
|
|
174
|
+
return PLUGIN_REPORTER_COMMANDS.includes(value);
|
|
175
|
+
}
|
|
176
|
+
function failValidation(diagnostic) {
|
|
177
|
+
return { ok: false, reason: diagnostic.message, diagnostic };
|
|
178
|
+
}
|
|
179
|
+
//# sourceMappingURL=pluginManifestValidation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pluginManifestValidation.js","sourceRoot":"","sources":["../../src/core/pluginManifestValidation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
type PluginManifestLabel = 'manifest' | 'reporter manifest';
|
|
2
|
+
export declare function assertPluginModuleReadable(manifestModule: string, modulePath: string): Promise<void>;
|
|
3
|
+
export declare function describePluginModuleLoadError(err: unknown, manifestModule: string, modulePath: string, manifestLabel: PluginManifestLabel): {
|
|
4
|
+
message: string;
|
|
5
|
+
hint?: string;
|
|
6
|
+
};
|
|
7
|
+
export declare function importPluginModule(modulePath: string): Promise<Record<string, unknown>>;
|
|
8
|
+
export {};
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import fs from 'node:fs/promises';
|
|
2
|
+
import { pathToFileURL } from 'node:url';
|
|
3
|
+
// Keep arbitrary plugin file URLs out of Vite/Vitest's static import transform.
|
|
4
|
+
const dynamicImport = new Function('specifier', 'return import(specifier)');
|
|
5
|
+
class PluginModuleMissingError extends Error {
|
|
6
|
+
manifestModule;
|
|
7
|
+
modulePath;
|
|
8
|
+
constructor(manifestModule, modulePath) {
|
|
9
|
+
super(`module "${manifestModule}" was not found at ${modulePath}`);
|
|
10
|
+
this.manifestModule = manifestModule;
|
|
11
|
+
this.modulePath = modulePath;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
class PluginModuleReadError extends Error {
|
|
15
|
+
manifestModule;
|
|
16
|
+
modulePath;
|
|
17
|
+
constructor(manifestModule, modulePath, err) {
|
|
18
|
+
super(`module "${manifestModule}" could not be read at ${modulePath}: ${formatError(err)}`);
|
|
19
|
+
this.manifestModule = manifestModule;
|
|
20
|
+
this.modulePath = modulePath;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
export async function assertPluginModuleReadable(manifestModule, modulePath) {
|
|
24
|
+
try {
|
|
25
|
+
await fs.access(modulePath);
|
|
26
|
+
}
|
|
27
|
+
catch (err) {
|
|
28
|
+
const code = typeof err === 'object' && err !== null && 'code' in err
|
|
29
|
+
? String(err.code)
|
|
30
|
+
: '';
|
|
31
|
+
if (code === 'ENOENT')
|
|
32
|
+
throw new PluginModuleMissingError(manifestModule, modulePath);
|
|
33
|
+
throw new PluginModuleReadError(manifestModule, modulePath, err);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
export function describePluginModuleLoadError(err, manifestModule, modulePath, manifestLabel) {
|
|
37
|
+
if (err instanceof PluginModuleMissingError) {
|
|
38
|
+
return {
|
|
39
|
+
message: err.message,
|
|
40
|
+
hint: `Check the ${manifestLabel} "module" path.`,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
if (err instanceof PluginModuleReadError) {
|
|
44
|
+
return {
|
|
45
|
+
message: err.message,
|
|
46
|
+
hint: `Check file permissions for the ${manifestLabel} "module" path.`,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
if (err instanceof SyntaxError) {
|
|
50
|
+
return {
|
|
51
|
+
message: `syntax error in module "${manifestModule}": ${formatError(err)}`,
|
|
52
|
+
hint: `Run node "${modulePath}" to reproduce the syntax error.`,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
return { message: formatError(err) };
|
|
56
|
+
}
|
|
57
|
+
export function importPluginModule(modulePath) {
|
|
58
|
+
return dynamicImport(pathToFileURL(modulePath).href).catch(async (err) => {
|
|
59
|
+
if (!isMissingDynamicImportCallback(err))
|
|
60
|
+
throw err;
|
|
61
|
+
return importPluginModuleFromSource(modulePath);
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
function isMissingDynamicImportCallback(err) {
|
|
65
|
+
return err instanceof TypeError && err.message.includes('dynamic import callback was not specified');
|
|
66
|
+
}
|
|
67
|
+
async function importPluginModuleFromSource(modulePath) {
|
|
68
|
+
const source = await fs.readFile(modulePath, 'utf-8');
|
|
69
|
+
const defaultMatch = source.match(/^\s*export\s+default\s+([\s\S]*?)\s*;?\s*$/);
|
|
70
|
+
if (defaultMatch) {
|
|
71
|
+
const expression = defaultMatch[1].trim().replace(/;$/, '');
|
|
72
|
+
return { default: new Function(`return (${expression});`)() };
|
|
73
|
+
}
|
|
74
|
+
const names = [];
|
|
75
|
+
let transformed = source.replace(/\bexport\s+(async\s+function|function)\s+([A-Za-z_$][\w$]*)/g, (_m, kind, name) => {
|
|
76
|
+
names.push(String(name));
|
|
77
|
+
return `${kind} ${name}`;
|
|
78
|
+
});
|
|
79
|
+
transformed = transformed.replace(/\bexport\s+const\s+([A-Za-z_$][\w$]*)\s*=/g, (_m, name) => {
|
|
80
|
+
names.push(String(name));
|
|
81
|
+
return `const ${name} =`;
|
|
82
|
+
});
|
|
83
|
+
if (names.length === 0) {
|
|
84
|
+
throw new Error('unsupported module syntax in Vitest VM fallback');
|
|
85
|
+
}
|
|
86
|
+
return new Function(`${transformed}\nreturn { ${names.join(', ')} };`)();
|
|
87
|
+
}
|
|
88
|
+
function formatError(err) {
|
|
89
|
+
return err instanceof Error ? err.message : String(err);
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=pluginModuleLoading.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pluginModuleLoading.js","sourceRoot":"","sources":["../../src/core/pluginModuleLoading.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { PluginDiagnostic, PluginReporterCommand, PluginReporterManifest } from './pluginManifestValidation.js';
|
|
2
|
+
export interface PluginReporterContext<TPayload = unknown> {
|
|
3
|
+
command: PluginReporterCommand;
|
|
4
|
+
rootPath: string;
|
|
5
|
+
manifest: PluginReporterManifest;
|
|
6
|
+
payload: TPayload;
|
|
7
|
+
}
|
|
8
|
+
export interface PluginReporterExports {
|
|
9
|
+
render: (context: PluginReporterContext) => Promise<string> | string;
|
|
10
|
+
}
|
|
11
|
+
export interface LoadedReporterPlugin {
|
|
12
|
+
manifest: PluginReporterManifest;
|
|
13
|
+
/** Absolute path to the manifest file on disk. */
|
|
14
|
+
manifestPath: string;
|
|
15
|
+
/** Absolute path to the resolved module entry point. */
|
|
16
|
+
modulePath: string;
|
|
17
|
+
exports: PluginReporterExports;
|
|
18
|
+
}
|
|
19
|
+
export type PluginReporterResolveResult = {
|
|
20
|
+
ok: true;
|
|
21
|
+
plugin: LoadedReporterPlugin;
|
|
22
|
+
} | {
|
|
23
|
+
ok: false;
|
|
24
|
+
reason: string;
|
|
25
|
+
diagnostic: PluginDiagnostic;
|
|
26
|
+
};
|
|
27
|
+
export type PluginReporterRenderResult = {
|
|
28
|
+
ok: true;
|
|
29
|
+
output: string;
|
|
30
|
+
} | {
|
|
31
|
+
ok: false;
|
|
32
|
+
reason: string;
|
|
33
|
+
diagnostic: PluginDiagnostic;
|
|
34
|
+
};
|
|
35
|
+
export interface PluginReporterResolveOptions {
|
|
36
|
+
pluginsEnabled: boolean;
|
|
37
|
+
previewFlag: string;
|
|
38
|
+
}
|
|
39
|
+
export declare function resolveReporterPlugin(rootPath: string, reporterName: string, command: PluginReporterCommand, options: PluginReporterResolveOptions): Promise<PluginReporterResolveResult>;
|
|
40
|
+
export declare function renderReporterPlugin(plugin: LoadedReporterPlugin, context: PluginReporterContext): Promise<PluginReporterRenderResult>;
|
|
41
|
+
export declare function loadReporterPlugin(manifest: PluginReporterManifest, manifestPath: string): Promise<PluginReporterResolveResult>;
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { discoverPluginManifests } from './pluginManifestDiscovery.js';
|
|
3
|
+
import { assertPluginModuleReadable, describePluginModuleLoadError, importPluginModule, } from './pluginModuleLoading.js';
|
|
4
|
+
import { getPluginTrustStatus } from './pluginTrust.js';
|
|
5
|
+
export async function resolveReporterPlugin(rootPath, reporterName, command, options) {
|
|
6
|
+
if (!options.pluginsEnabled) {
|
|
7
|
+
return pluginRuntimeFail({
|
|
8
|
+
code: 'plugins-disabled',
|
|
9
|
+
message: `reporter plugins require ${options.previewFlag}=1`,
|
|
10
|
+
hint: `Set ${options.previewFlag}=1 in the environment to enable plugin reporters.`,
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
const entries = await discoverPluginManifests(rootPath);
|
|
14
|
+
const reporters = entries.filter((entry) => entry.manifest?.kind === 'reporter');
|
|
15
|
+
const entry = reporters.find((candidate) => candidate.manifest.name === reporterName);
|
|
16
|
+
if (!entry) {
|
|
17
|
+
return pluginRuntimeFail({
|
|
18
|
+
code: 'reporter-not-found',
|
|
19
|
+
message: `reporter plugin "${reporterName}" was not found`,
|
|
20
|
+
hint: 'Run `projscan plugin list` to see discovered reporter plugins.',
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
if (!entry.manifest.commands.includes(command)) {
|
|
24
|
+
return pluginRuntimeFail({
|
|
25
|
+
code: 'reporter-unsupported-command',
|
|
26
|
+
message: `reporter plugin "${reporterName}" does not support command "${command}"`,
|
|
27
|
+
hint: `Add "${command}" to the reporter manifest's commands array or choose a different reporter.`,
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
return loadReporterPlugin(entry.manifest, entry.manifestPath);
|
|
31
|
+
}
|
|
32
|
+
export async function renderReporterPlugin(plugin, context) {
|
|
33
|
+
try {
|
|
34
|
+
const output = await plugin.exports.render(context);
|
|
35
|
+
if (typeof output !== 'string') {
|
|
36
|
+
return pluginRuntimeFail({
|
|
37
|
+
code: 'reporter-render-error',
|
|
38
|
+
message: `reporter plugin "${plugin.manifest.name}" returned ${typeof output}; expected string`,
|
|
39
|
+
hint: 'Reporter render(context) must return text for stdout.',
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
return { ok: true, output };
|
|
43
|
+
}
|
|
44
|
+
catch (err) {
|
|
45
|
+
return pluginRuntimeFail({
|
|
46
|
+
code: 'reporter-render-error',
|
|
47
|
+
message: `reporter plugin "${plugin.manifest.name}" failed during render: ${formatError(err)}`,
|
|
48
|
+
hint: 'Fix the reporter render(context) implementation and try again.',
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
export async function loadReporterPlugin(manifest, manifestPath) {
|
|
53
|
+
const modulePath = path.resolve(path.dirname(manifestPath), manifest.module);
|
|
54
|
+
try {
|
|
55
|
+
await assertPluginModuleReadable(manifest.module, modulePath);
|
|
56
|
+
// Importing a reporter executes local code, so trust must be checked first.
|
|
57
|
+
const trust = await getPluginTrustStatus(modulePath);
|
|
58
|
+
if (trust.status !== 'trusted') {
|
|
59
|
+
return pluginRuntimeFail(untrustedReporterDiagnostic(manifest.name, trust.status));
|
|
60
|
+
}
|
|
61
|
+
const mod = await importPluginModule(modulePath);
|
|
62
|
+
const exportsObj = (mod.default ?? mod);
|
|
63
|
+
if (typeof exportsObj.render !== 'function') {
|
|
64
|
+
return pluginRuntimeFail({
|
|
65
|
+
code: 'invalid-reporter-export',
|
|
66
|
+
message: `reporter plugin "${manifest.name}" missing required export "render"`,
|
|
67
|
+
hint: 'Use export default { render(context) { ... } } or export a named render function.',
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
return {
|
|
71
|
+
ok: true,
|
|
72
|
+
plugin: {
|
|
73
|
+
manifest,
|
|
74
|
+
manifestPath,
|
|
75
|
+
modulePath,
|
|
76
|
+
exports: { render: exportsObj.render },
|
|
77
|
+
},
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
catch (err) {
|
|
81
|
+
const detail = describePluginModuleLoadError(err, manifest.module, modulePath, 'reporter manifest');
|
|
82
|
+
return pluginRuntimeFail({
|
|
83
|
+
code: 'reporter-load-error',
|
|
84
|
+
message: `reporter plugin "${manifest.name}" failed to load: ${detail.message}`,
|
|
85
|
+
hint: detail.hint ?? 'Check the reporter module path and module syntax.',
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
function untrustedReporterDiagnostic(name, status) {
|
|
90
|
+
const changed = status === 'changed';
|
|
91
|
+
return {
|
|
92
|
+
code: 'plugin-untrusted',
|
|
93
|
+
message: changed
|
|
94
|
+
? `reporter plugin "${name}" changed since it was trusted; not executed`
|
|
95
|
+
: `reporter plugin "${name}" is not trusted; not executed`,
|
|
96
|
+
hint: `${changed ? 'Re-run' : 'Run'} \`projscan plugin trust ${name}\` to approve this reporter.`,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
function pluginRuntimeFail(diagnostic) {
|
|
100
|
+
return { ok: false, reason: diagnostic.message, diagnostic };
|
|
101
|
+
}
|
|
102
|
+
function formatError(err) {
|
|
103
|
+
return err instanceof Error ? err.message : String(err);
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=pluginReporterLoading.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pluginReporterLoading.js","sourceRoot":"","sources":["../../src/core/pluginReporterLoading.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAOvE,OAAO,EACL,0BAA0B,EAC1B,6BAA6B,EAC7B,kBAAkB,GACnB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,oBAAoB,EAA0B,MAAM,kBAAkB,CAAC;AAmChF,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,QAAgB,EAChB,YAAoB,EACpB,OAA8B,EAC9B,OAAqC;IAErC,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;QAC5B,OAAO,iBAAiB,CAAC;YACvB,IAAI,EAAE,kBAAkB;YACxB,OAAO,EAAE,4BAA4B,OAAO,CAAC,WAAW,IAAI;YAC5D,IAAI,EAAE,OAAO,OAAO,CAAC,WAAW,mDAAmD;SACpF,CAAC,CAAC;IACL,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,uBAAuB,CAAC,QAAQ,CAAC,CAAC;IACxD,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAC9B,CAAC,KAAK,EAAwE,EAAE,CAC9E,KAAK,CAAC,QAAQ,EAAE,IAAI,KAAK,UAAU,CACtC,CAAC;IACF,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC;IACtF,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,iBAAiB,CAAC;YACvB,IAAI,EAAE,oBAAoB;YAC1B,OAAO,EAAE,oBAAoB,YAAY,iBAAiB;YAC1D,IAAI,EAAE,gEAAgE;SACvE,CAAC,CAAC;IACL,CAAC;IAED,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAC/C,OAAO,iBAAiB,CAAC;YACvB,IAAI,EAAE,8BAA8B;YACpC,OAAO,EAAE,oBAAoB,YAAY,+BAA+B,OAAO,GAAG;YAClF,IAAI,EAAE,QAAQ,OAAO,6EAA6E;SACnG,CAAC,CAAC;IACL,CAAC;IAED,OAAO,kBAAkB,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC;AAChE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,MAA4B,EAC5B,OAA8B;IAE9B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACpD,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC/B,OAAO,iBAAiB,CAAC;gBACvB,IAAI,EAAE,uBAAuB;gBAC7B,OAAO,EAAE,oBAAoB,MAAM,CAAC,QAAQ,CAAC,IAAI,cAAc,OAAO,MAAM,mBAAmB;gBAC/F,IAAI,EAAE,uDAAuD;aAC9D,CAAC,CAAC;QACL,CAAC;QACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAC9B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,iBAAiB,CAAC;YACvB,IAAI,EAAE,uBAAuB;YAC7B,OAAO,EAAE,oBAAoB,MAAM,CAAC,QAAQ,CAAC,IAAI,2BAA2B,WAAW,CAAC,GAAG,CAAC,EAAE;YAC9F,IAAI,EAAE,gEAAgE;SACvE,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,QAAgC,EAChC,YAAoB;IAEpB,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC7E,IAAI,CAAC;QACH,MAAM,0BAA0B,CAAC,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QAC9D,4EAA4E;QAC5E,MAAM,KAAK,GAAG,MAAM,oBAAoB,CAAC,UAAU,CAAC,CAAC;QACrD,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC/B,OAAO,iBAAiB,CAAC,2BAA2B,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;QACrF,CAAC;QACD,MAAM,GAAG,GAAG,MAAM,kBAAkB,CAAC,UAAU,CAAC,CAAC;QACjD,MAAM,UAAU,GAAG,CAAC,GAAG,CAAC,OAAO,IAAI,GAAG,CAAmC,CAAC;QAC1E,IAAI,OAAO,UAAU,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;YAC5C,OAAO,iBAAiB,CAAC;gBACvB,IAAI,EAAE,yBAAyB;gBAC/B,OAAO,EAAE,oBAAoB,QAAQ,CAAC,IAAI,oCAAoC;gBAC9E,IAAI,EAAE,mFAAmF;aAC1F,CAAC,CAAC;QACL,CAAC;QACD,OAAO;YACL,EAAE,EAAE,IAAI;YACR,MAAM,EAAE;gBACN,QAAQ;gBACR,YAAY;gBACZ,UAAU;gBACV,OAAO,EAAE,EAAE,MAAM,EAAE,UAAU,CAAC,MAAyC,EAAE;aAC1E;SACF,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,MAAM,GAAG,6BAA6B,CAC1C,GAAG,EACH,QAAQ,CAAC,MAAM,EACf,UAAU,EACV,mBAAmB,CACpB,CAAC;QACF,OAAO,iBAAiB,CAAC;YACvB,IAAI,EAAE,qBAAqB;YAC3B,OAAO,EAAE,oBAAoB,QAAQ,CAAC,IAAI,qBAAqB,MAAM,CAAC,OAAO,EAAE;YAC/E,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,mDAAmD;SACzE,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED,SAAS,2BAA2B,CAAC,IAAY,EAAE,MAAyB;IAC1E,MAAM,OAAO,GAAG,MAAM,KAAK,SAAS,CAAC;IACrC,OAAO;QACL,IAAI,EAAE,kBAAkB;QACxB,OAAO,EAAE,OAAO;YACd,CAAC,CAAC,oBAAoB,IAAI,8CAA8C;YACxE,CAAC,CAAC,oBAAoB,IAAI,gCAAgC;QAC5D,IAAI,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,4BAA4B,IAAI,8BAA8B;KAClG,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CACxB,UAA4B;IAE5B,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,OAAO,EAAE,UAAU,EAAE,CAAC;AAC/D,CAAC;AAED,SAAS,WAAW,CAAC,GAAY;IAC/B,OAAO,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AAC1D,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { CodeGraph } from './codeGraph.js';
|
|
2
|
+
import type { DataflowReport, FileEntry, Issue, SemanticGraphReport } from '../types.js';
|
|
3
|
+
import type { PluginAnalyzerManifest } from './pluginManifestValidation.js';
|
|
4
|
+
export interface PluginAnalyzerContext {
|
|
5
|
+
schemaVersion: 1;
|
|
6
|
+
getCodeGraph: () => Promise<CodeGraph>;
|
|
7
|
+
getSemanticGraph: () => Promise<SemanticGraphReport>;
|
|
8
|
+
getDataflow: () => Promise<DataflowReport>;
|
|
9
|
+
}
|
|
10
|
+
export interface PluginAnalyzerExports {
|
|
11
|
+
check: (rootPath: string, files: FileEntry[], context?: PluginAnalyzerContext) => Promise<Issue[]> | Issue[];
|
|
12
|
+
}
|
|
13
|
+
export interface LoadedPlugin {
|
|
14
|
+
manifest: PluginAnalyzerManifest;
|
|
15
|
+
/** Absolute path to the manifest file on disk. */
|
|
16
|
+
manifestPath: string;
|
|
17
|
+
/** Absolute path to the resolved module entry point. */
|
|
18
|
+
modulePath: string;
|
|
19
|
+
exports: PluginAnalyzerExports;
|
|
20
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pluginRuntimeTypes.js","sourceRoot":"","sources":["../../src/core/pluginRuntimeTypes.ts"],"names":[],"mappings":""}
|