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.
Files changed (61) hide show
  1. package/README.md +337 -38
  2. package/dist/cli/commands/route.js +1 -0
  3. package/dist/cli/commands/route.js.map +1 -1
  4. package/dist/cli/commands/semanticGraph.js +27 -0
  5. package/dist/cli/commands/semanticGraph.js.map +1 -1
  6. package/dist/cli/commands/start.js +74 -1
  7. package/dist/cli/commands/start.js.map +1 -1
  8. package/dist/cli/index.js +0 -2
  9. package/dist/cli/index.js.map +1 -1
  10. package/dist/core/dependencyAnalyzer.js +172 -0
  11. package/dist/core/dependencyAnalyzer.js.map +1 -1
  12. package/dist/core/fixSuggest.js +5 -5
  13. package/dist/core/fixSuggest.js.map +1 -1
  14. package/dist/core/graphQuery.d.ts +23 -0
  15. package/dist/core/graphQuery.js +48 -0
  16. package/dist/core/graphQuery.js.map +1 -0
  17. package/dist/core/intentRouter.d.ts +8 -1
  18. package/dist/core/intentRouter.js +2186 -22
  19. package/dist/core/intentRouter.js.map +1 -1
  20. package/dist/core/issueEngine.js +6 -7
  21. package/dist/core/issueEngine.js.map +1 -1
  22. package/dist/core/onboarding.d.ts +2 -2
  23. package/dist/core/onboarding.js +29 -5
  24. package/dist/core/onboarding.js.map +1 -1
  25. package/dist/core/start.d.ts +1 -0
  26. package/dist/core/start.js +2010 -10
  27. package/dist/core/start.js.map +1 -1
  28. package/dist/mcp/server.d.ts +1 -1
  29. package/dist/mcp/server.js +14 -5
  30. package/dist/mcp/server.js.map +1 -1
  31. package/dist/mcp/tools/costSummary.js +0 -2
  32. package/dist/mcp/tools/costSummary.js.map +1 -1
  33. package/dist/mcp/tools/semanticGraph.js +28 -3
  34. package/dist/mcp/tools/semanticGraph.js.map +1 -1
  35. package/dist/mcp/tools/start.js +6 -1
  36. package/dist/mcp/tools/start.js.map +1 -1
  37. package/dist/mcp/tools.js +0 -4
  38. package/dist/mcp/tools.js.map +1 -1
  39. package/dist/projscan-sbom.cdx.json +6 -6
  40. package/dist/reporters/consoleReporter.js +19 -0
  41. package/dist/reporters/consoleReporter.js.map +1 -1
  42. package/dist/reporters/markdownReporter.js +19 -0
  43. package/dist/reporters/markdownReporter.js.map +1 -1
  44. package/dist/tool-manifest.json +41 -60
  45. package/dist/types.d.ts +83 -0
  46. package/docs/GUIDE.md +1565 -0
  47. package/docs/ROADMAP.md +219 -0
  48. package/docs/demos/projscan-4-1-demo.html +648 -0
  49. package/docs/projscan-mission-control.png +0 -0
  50. package/docs/projscan-proof-router.png +0 -0
  51. package/package.json +8 -1
  52. package/scripts/capture-readme-assets.mjs +60 -0
  53. package/dist/cli/commands/explain.d.ts +0 -1
  54. package/dist/cli/commands/explain.js +0 -48
  55. package/dist/cli/commands/explain.js.map +0 -1
  56. package/dist/mcp/tools/explain.d.ts +0 -2
  57. package/dist/mcp/tools/explain.js +0 -34
  58. package/dist/mcp/tools/explain.js.map +0 -1
  59. package/dist/mcp/tools/graph.d.ts +0 -2
  60. package/dist/mcp/tools/graph.js +0 -79
  61. package/dist/mcp/tools/graph.js.map +0 -1
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "name": "projscan",
3
- "version": "3.8.0",
3
+ "version": "4.1.0",
4
4
  "mcpProtocolVersion": "2025-03-26",
5
- "generatedAt": "2026-06-05T16:37:40.687Z",
6
- "toolCount": 47,
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": "projscan_graph",
230
- "description": "[DEPRECATED since 3.8.0, removed in 4.0 use projscan_semantic_graph] Query the AST-based code graph directly. Returns imports, exports, importers, or symbol definitions for a file or symbol. Agents should prefer this over analyze/doctor/explain for targeted structural questions - it is much cheaper and more accurate.",
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
- "file": {
235
- "type": "string",
236
- "description": "File path (relative to project root) to query."
237
- },
238
- "symbol": {
239
- "type": "string",
240
- "description": "Symbol name to query (e.g. a function or class). Use instead of `file` to find where a symbol is defined."
241
- },
242
- "direction": {
243
- "type": "string",
244
- "description": "What to return: \"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).",
245
- "enum": [
246
- "imports",
247
- "exports",
248
- "importers",
249
- "symbol_defs",
250
- "package_importers"
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;