projscan 3.8.0 → 4.1.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 +337 -38
- package/dist/cli/commands/route.js +1 -0
- package/dist/cli/commands/route.js.map +1 -1
- package/dist/cli/commands/semanticGraph.js +27 -0
- package/dist/cli/commands/semanticGraph.js.map +1 -1
- package/dist/cli/commands/start.js +74 -1
- package/dist/cli/commands/start.js.map +1 -1
- package/dist/cli/index.js +0 -2
- package/dist/cli/index.js.map +1 -1
- package/dist/core/dependencyAnalyzer.js +172 -0
- package/dist/core/dependencyAnalyzer.js.map +1 -1
- package/dist/core/fixSuggest.js +5 -5
- package/dist/core/fixSuggest.js.map +1 -1
- package/dist/core/graphQuery.d.ts +23 -0
- package/dist/core/graphQuery.js +48 -0
- package/dist/core/graphQuery.js.map +1 -0
- package/dist/core/intentRouter.d.ts +8 -1
- package/dist/core/intentRouter.js +2186 -22
- package/dist/core/intentRouter.js.map +1 -1
- package/dist/core/issueEngine.js +6 -7
- package/dist/core/issueEngine.js.map +1 -1
- package/dist/core/onboarding.d.ts +2 -2
- package/dist/core/onboarding.js +29 -5
- package/dist/core/onboarding.js.map +1 -1
- package/dist/core/start.d.ts +1 -0
- package/dist/core/start.js +2010 -10
- package/dist/core/start.js.map +1 -1
- package/dist/mcp/server.d.ts +1 -1
- package/dist/mcp/server.js +14 -5
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tools/costSummary.js +0 -2
- package/dist/mcp/tools/costSummary.js.map +1 -1
- package/dist/mcp/tools/semanticGraph.js +28 -3
- package/dist/mcp/tools/semanticGraph.js.map +1 -1
- package/dist/mcp/tools/start.js +6 -1
- package/dist/mcp/tools/start.js.map +1 -1
- package/dist/mcp/tools.js +0 -4
- package/dist/mcp/tools.js.map +1 -1
- package/dist/projscan-sbom.cdx.json +6 -6
- package/dist/reporters/consoleReporter.js +19 -0
- package/dist/reporters/consoleReporter.js.map +1 -1
- package/dist/reporters/markdownReporter.js +19 -0
- package/dist/reporters/markdownReporter.js.map +1 -1
- package/dist/tool-manifest.json +41 -60
- package/dist/types.d.ts +83 -0
- package/docs/GUIDE.md +1565 -0
- package/docs/ROADMAP.md +219 -0
- package/docs/demos/projscan-4-1-demo.html +648 -0
- package/docs/projscan-mission-control.png +0 -0
- package/docs/projscan-proof-router.png +0 -0
- package/package.json +8 -1
- package/scripts/capture-readme-assets.mjs +60 -0
- package/dist/cli/commands/explain.d.ts +0 -1
- package/dist/cli/commands/explain.js +0 -48
- package/dist/cli/commands/explain.js.map +0 -1
- package/dist/mcp/tools/explain.d.ts +0 -2
- package/dist/mcp/tools/explain.js +0 -34
- package/dist/mcp/tools/explain.js.map +0 -1
- package/dist/mcp/tools/graph.d.ts +0 -2
- package/dist/mcp/tools/graph.js +0 -79
- package/dist/mcp/tools/graph.js.map +0 -1
package/dist/tool-manifest.json
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "projscan",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "4.1.0",
|
|
4
4
|
"mcpProtocolVersion": "2025-03-26",
|
|
5
|
-
"generatedAt": "2026-06-
|
|
6
|
-
"toolCount":
|
|
5
|
+
"generatedAt": "2026-06-09T11:31:15.828Z",
|
|
6
|
+
"toolCount": 45,
|
|
7
7
|
"tools": [
|
|
8
8
|
{
|
|
9
9
|
"name": "projscan_analyze",
|
|
@@ -76,22 +76,6 @@
|
|
|
76
76
|
}
|
|
77
77
|
}
|
|
78
78
|
},
|
|
79
|
-
{
|
|
80
|
-
"name": "projscan_explain",
|
|
81
|
-
"description": "[DEPRECATED since 3.8.0, removed in 4.0 — use projscan_file] Explain a single file: purpose, imports, exports, and potential issues. Useful for understanding unfamiliar code before editing.",
|
|
82
|
-
"inputSchema": {
|
|
83
|
-
"type": "object",
|
|
84
|
-
"properties": {
|
|
85
|
-
"file": {
|
|
86
|
-
"type": "string",
|
|
87
|
-
"description": "Path to the file relative to the project root."
|
|
88
|
-
}
|
|
89
|
-
},
|
|
90
|
-
"required": [
|
|
91
|
-
"file"
|
|
92
|
-
]
|
|
93
|
-
}
|
|
94
|
-
},
|
|
95
79
|
{
|
|
96
80
|
"name": "projscan_file",
|
|
97
81
|
"description": "Drill into a single file: purpose, imports, exports, churn/risk/ownership, related health issues, AST cyclomatic complexity, coupling (fan-in / fan-out), and per-function CC ranked by complexity. Use this after projscan_hotspots when deciding how to approach a specific risky file.",
|
|
@@ -226,57 +210,50 @@
|
|
|
226
210
|
}
|
|
227
211
|
},
|
|
228
212
|
{
|
|
229
|
-
"name": "
|
|
230
|
-
"description": "
|
|
213
|
+
"name": "projscan_semantic_graph",
|
|
214
|
+
"description": "The code graph, two ways. With no `query`: returns the stable v3 semantic graph (file/function/package/symbol nodes plus imports, exports, defines, and calls edges). With `query`: answers one cheap, targeted question instead of serializing the whole graph — who imports a file, what a file imports/exports, where a symbol is defined, or which files import a package. (The targeted mode subsumes the former projscan_graph tool, removed in 4.0.)",
|
|
231
215
|
"inputSchema": {
|
|
232
216
|
"type": "object",
|
|
233
217
|
"properties": {
|
|
234
|
-
"
|
|
235
|
-
"type": "
|
|
236
|
-
"description": "
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
"
|
|
250
|
-
|
|
218
|
+
"query": {
|
|
219
|
+
"type": "object",
|
|
220
|
+
"description": "Optional. Ask one targeted question instead of returning the whole graph.",
|
|
221
|
+
"properties": {
|
|
222
|
+
"direction": {
|
|
223
|
+
"type": "string",
|
|
224
|
+
"enum": [
|
|
225
|
+
"imports",
|
|
226
|
+
"exports",
|
|
227
|
+
"importers",
|
|
228
|
+
"symbol_defs",
|
|
229
|
+
"package_importers"
|
|
230
|
+
],
|
|
231
|
+
"description": "\"imports\" (what the file imports), \"exports\" (what the file exports), \"importers\" (who imports the file), \"symbol_defs\" (files defining the symbol), \"package_importers\" (files importing a package by name)."
|
|
232
|
+
},
|
|
233
|
+
"file": {
|
|
234
|
+
"type": "string",
|
|
235
|
+
"description": "Repo-relative file path (for imports/exports/importers)."
|
|
236
|
+
},
|
|
237
|
+
"symbol": {
|
|
238
|
+
"type": "string",
|
|
239
|
+
"description": "Symbol or package name (for symbol_defs/package_importers)."
|
|
240
|
+
},
|
|
241
|
+
"limit": {
|
|
242
|
+
"type": "number",
|
|
243
|
+
"description": "Max entries returned (default 50, max 500)."
|
|
244
|
+
}
|
|
245
|
+
},
|
|
246
|
+
"required": [
|
|
247
|
+
"direction"
|
|
251
248
|
]
|
|
252
249
|
},
|
|
253
|
-
"limit": {
|
|
254
|
-
"type": "number",
|
|
255
|
-
"description": "Max entries returned (default 50)."
|
|
256
|
-
},
|
|
257
|
-
"max_tokens": {
|
|
258
|
-
"type": "number",
|
|
259
|
-
"description": "Cap the response to roughly this many tokens."
|
|
260
|
-
}
|
|
261
|
-
},
|
|
262
|
-
"required": [
|
|
263
|
-
"direction"
|
|
264
|
-
]
|
|
265
|
-
}
|
|
266
|
-
},
|
|
267
|
-
{
|
|
268
|
-
"name": "projscan_semantic_graph",
|
|
269
|
-
"description": "Return the stable v3 semantic graph: file/function/package/symbol nodes plus imports, exports, defines, and calls edges. Use when an agent needs one normalized graph contract instead of several targeted graph queries.",
|
|
270
|
-
"inputSchema": {
|
|
271
|
-
"type": "object",
|
|
272
|
-
"properties": {
|
|
273
250
|
"max_nodes": {
|
|
274
251
|
"type": "number",
|
|
275
|
-
"description": "Maximum graph nodes to return. Default 10000."
|
|
252
|
+
"description": "Full-graph mode only. Maximum graph nodes to return. Default 10000."
|
|
276
253
|
},
|
|
277
254
|
"max_edges": {
|
|
278
255
|
"type": "number",
|
|
279
|
-
"description": "Maximum graph edges to return. Default 25000."
|
|
256
|
+
"description": "Full-graph mode only. Maximum graph edges to return. Default 25000."
|
|
280
257
|
},
|
|
281
258
|
"max_tokens": {
|
|
282
259
|
"type": "number",
|
|
@@ -1070,6 +1047,10 @@
|
|
|
1070
1047
|
],
|
|
1071
1048
|
"description": "Workflow mode to orient around. Default: before_edit."
|
|
1072
1049
|
},
|
|
1050
|
+
"intent": {
|
|
1051
|
+
"type": "string",
|
|
1052
|
+
"description": "Plain-language goal to route into the next best action and proof commands."
|
|
1053
|
+
},
|
|
1073
1054
|
"max_tasks": {
|
|
1074
1055
|
"type": "number",
|
|
1075
1056
|
"description": "Maximum workplan tasks to inspect. Default: 5, max: 12."
|
package/dist/types.d.ts
CHANGED
|
@@ -54,6 +54,8 @@ export interface DependencyReport {
|
|
|
54
54
|
dependencies: Record<string, string>;
|
|
55
55
|
devDependencies: Record<string, string>;
|
|
56
56
|
risks: DependencyRisk[];
|
|
57
|
+
licenses?: DependencyLicenseSummary;
|
|
58
|
+
sizes?: DependencySizeSummary;
|
|
57
59
|
/**
|
|
58
60
|
* Per-workspace breakdown when scanning a monorepo (0.13.0+). Absent for
|
|
59
61
|
* single-package repos. The top-level `totalDependencies`,
|
|
@@ -70,6 +72,36 @@ export interface DependencyReport {
|
|
|
70
72
|
risks: DependencyRisk[];
|
|
71
73
|
}>;
|
|
72
74
|
}
|
|
75
|
+
export interface DependencyLicenseEntry {
|
|
76
|
+
name: string;
|
|
77
|
+
version: string;
|
|
78
|
+
scope: 'production' | 'development';
|
|
79
|
+
license: string | null;
|
|
80
|
+
workspace?: string;
|
|
81
|
+
}
|
|
82
|
+
export interface DependencyLicenseSummary {
|
|
83
|
+
packages: DependencyLicenseEntry[];
|
|
84
|
+
byLicense: Record<string, number>;
|
|
85
|
+
unknown: string[];
|
|
86
|
+
copyleft: DependencyLicenseEntry[];
|
|
87
|
+
noticeCandidates: DependencyLicenseEntry[];
|
|
88
|
+
}
|
|
89
|
+
export interface DependencySizeEntry {
|
|
90
|
+
name: string;
|
|
91
|
+
version: string;
|
|
92
|
+
scope: 'production' | 'development';
|
|
93
|
+
bytes: number | null;
|
|
94
|
+
formatted: string;
|
|
95
|
+
installed: boolean;
|
|
96
|
+
workspace?: string;
|
|
97
|
+
}
|
|
98
|
+
export interface DependencySizeSummary {
|
|
99
|
+
packages: DependencySizeEntry[];
|
|
100
|
+
largest: DependencySizeEntry[];
|
|
101
|
+
totalBytes: number;
|
|
102
|
+
formattedTotal: string;
|
|
103
|
+
missing: string[];
|
|
104
|
+
}
|
|
73
105
|
export interface DependencyRisk {
|
|
74
106
|
name: string;
|
|
75
107
|
reason: string;
|
|
@@ -668,11 +700,61 @@ export interface StartFirstTenMinutes {
|
|
|
668
700
|
outcome: string;
|
|
669
701
|
commands: StartFirstTenMinutesStep[];
|
|
670
702
|
}
|
|
703
|
+
export type StartModeSource = 'explicit' | 'intent' | 'default';
|
|
704
|
+
export type StartMissionControlStatus = 'ready' | 'needs_setup' | 'needs_attention' | 'blocked';
|
|
705
|
+
export interface StartRoutedIntent {
|
|
706
|
+
intent: string;
|
|
707
|
+
category: string;
|
|
708
|
+
tool: string;
|
|
709
|
+
cli: string;
|
|
710
|
+
why: string;
|
|
711
|
+
example: string;
|
|
712
|
+
confidence: 'high' | 'medium' | 'low';
|
|
713
|
+
rank: number;
|
|
714
|
+
score: number;
|
|
715
|
+
matchedKeywords: string[];
|
|
716
|
+
}
|
|
717
|
+
export interface StartUnresolvedInput {
|
|
718
|
+
name: string;
|
|
719
|
+
placeholder: string;
|
|
720
|
+
sourceAction: string;
|
|
721
|
+
instruction: string;
|
|
722
|
+
}
|
|
723
|
+
export interface StartMissionHandoff {
|
|
724
|
+
nextAction: PreflightSuggestedAction;
|
|
725
|
+
readyActions: PreflightSuggestedAction[];
|
|
726
|
+
needsInput: StartUnresolvedInput[];
|
|
727
|
+
doneWhen: string[];
|
|
728
|
+
readyProof: {
|
|
729
|
+
summary: string;
|
|
730
|
+
commands: string[];
|
|
731
|
+
};
|
|
732
|
+
}
|
|
733
|
+
export interface StartMissionControl {
|
|
734
|
+
intent?: string;
|
|
735
|
+
status: StartMissionControlStatus;
|
|
736
|
+
headline: string;
|
|
737
|
+
whyNow: string;
|
|
738
|
+
primaryAction: PreflightSuggestedAction;
|
|
739
|
+
actionPlan: PreflightSuggestedAction[];
|
|
740
|
+
readyActions: PreflightSuggestedAction[];
|
|
741
|
+
routedIntent?: StartRoutedIntent;
|
|
742
|
+
alternatives?: StartRoutedIntent[];
|
|
743
|
+
unresolvedInputs: StartUnresolvedInput[];
|
|
744
|
+
guardrails: PreflightSuggestedAction[];
|
|
745
|
+
successCriteria: string[];
|
|
746
|
+
proofSummary: string;
|
|
747
|
+
proofCommands: string[];
|
|
748
|
+
handoff: StartMissionHandoff;
|
|
749
|
+
handoffPrompt: string;
|
|
750
|
+
}
|
|
671
751
|
export interface StartReport {
|
|
672
752
|
schemaVersion: 1;
|
|
673
753
|
readOnly: true;
|
|
674
754
|
rootPath: string;
|
|
675
755
|
mode: WorkplanMode;
|
|
756
|
+
modeSource: StartModeSource;
|
|
757
|
+
modeReason: string;
|
|
676
758
|
summary: string;
|
|
677
759
|
setup: {
|
|
678
760
|
overall: 'pass' | 'warn' | 'fail' | 'info';
|
|
@@ -687,6 +769,7 @@ export interface StartReport {
|
|
|
687
769
|
};
|
|
688
770
|
recommendedWorkflow: StartWorkflowRecommendation;
|
|
689
771
|
firstTenMinutes: StartFirstTenMinutes;
|
|
772
|
+
missionControl: StartMissionControl;
|
|
690
773
|
coordinationHints: SessionCoordinationHint[];
|
|
691
774
|
evidence: {
|
|
692
775
|
workplanVerdict: PreflightVerdict;
|