projscan 1.5.0 → 1.6.1
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 +13 -3
- package/dist/cli/commands/applyFix.d.ts +7 -0
- package/dist/cli/commands/applyFix.js +113 -0
- package/dist/cli/commands/applyFix.js.map +1 -0
- package/dist/cli/commands/coverage.js +13 -0
- package/dist/cli/commands/coverage.js.map +1 -1
- package/dist/cli/commands/impact.js +25 -1
- package/dist/cli/commands/impact.js.map +1 -1
- package/dist/cli/commands/init.d.ts +6 -0
- package/dist/cli/commands/init.js +70 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/installHook.d.ts +9 -0
- package/dist/cli/commands/installHook.js +90 -0
- package/dist/cli/commands/installHook.js.map +1 -0
- package/dist/cli/commands/taint.d.ts +6 -0
- package/dist/cli/commands/taint.js +74 -0
- package/dist/cli/commands/taint.js.map +1 -0
- package/dist/cli/commands/workspace.d.ts +11 -0
- package/dist/cli/commands/workspace.js +115 -0
- package/dist/cli/commands/workspace.js.map +1 -0
- package/dist/cli/index.js +10 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/core/applyFix.d.ts +52 -0
- package/dist/core/applyFix.js +220 -0
- package/dist/core/applyFix.js.map +1 -0
- package/dist/core/ast.d.ts +9 -0
- package/dist/core/ast.js +35 -4
- package/dist/core/ast.js.map +1 -1
- package/dist/core/fixSuggest.d.ts +6 -0
- package/dist/core/fixSuggest.js +195 -0
- package/dist/core/fixSuggest.js.map +1 -1
- package/dist/core/impact.d.ts +8 -0
- package/dist/core/impact.js +41 -3
- package/dist/core/impact.js.map +1 -1
- package/dist/core/indexCache.js +4 -1
- package/dist/core/indexCache.js.map +1 -1
- package/dist/core/review.js +67 -3
- package/dist/core/review.js.map +1 -1
- package/dist/core/taint.d.ts +100 -0
- package/dist/core/taint.js +185 -0
- package/dist/core/taint.js.map +1 -0
- package/dist/core/workspace.d.ts +62 -0
- package/dist/core/workspace.js +127 -0
- package/dist/core/workspace.js.map +1 -0
- package/dist/mcp/prompts.js +7 -5
- package/dist/mcp/prompts.js.map +1 -1
- package/dist/mcp/tools/applyFix.d.ts +16 -0
- package/dist/mcp/tools/applyFix.js +91 -0
- package/dist/mcp/tools/applyFix.js.map +1 -0
- package/dist/mcp/tools/impact.js +34 -1
- package/dist/mcp/tools/impact.js.map +1 -1
- package/dist/mcp/tools/taint.d.ts +15 -0
- package/dist/mcp/tools/taint.js +67 -0
- package/dist/mcp/tools/taint.js.map +1 -0
- package/dist/mcp/tools/workspaceGraph.d.ts +18 -0
- package/dist/mcp/tools/workspaceGraph.js +188 -0
- package/dist/mcp/tools/workspaceGraph.js.map +1 -0
- package/dist/mcp/tools.js +6 -0
- package/dist/mcp/tools.js.map +1 -1
- package/dist/tool-manifest.json +89 -3
- package/dist/types.d.ts +46 -0
- package/dist/utils/config.js +15 -0
- package/dist/utils/config.js.map +1 -1
- package/package.json +2 -2
- package/dist/core/telemetry.d.ts +0 -90
- package/dist/core/telemetry.js +0 -199
- package/dist/core/telemetry.js.map +0 -1
- package/dist/utils/cache.d.ts +0 -3
- package/dist/utils/cache.js +0 -51
- package/dist/utils/cache.js.map +0 -1
package/dist/tool-manifest.json
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "projscan",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.6.1",
|
|
4
4
|
"mcpProtocolVersion": "2025-03-26",
|
|
5
|
-
"generatedAt": "2026-05-
|
|
6
|
-
"toolCount":
|
|
5
|
+
"generatedAt": "2026-05-06T18:24:42.605Z",
|
|
6
|
+
"toolCount": 25,
|
|
7
7
|
"tools": [
|
|
8
8
|
{
|
|
9
9
|
"name": "projscan_analyze",
|
|
@@ -425,6 +425,10 @@
|
|
|
425
425
|
"type": "number",
|
|
426
426
|
"description": "Maximum BFS hops from the target. Default 10. Reports `truncated: true` when exceeded."
|
|
427
427
|
},
|
|
428
|
+
"cross_repo": {
|
|
429
|
+
"type": "boolean",
|
|
430
|
+
"description": "1.6+ — when true, also fold in callers from sibling repos registered via `projscan workspace add`. Each cross-repo file is annotated with its repo name. Symbol-mode only; file-mode cross-repo requires path resolution that this first cut does not perform."
|
|
431
|
+
},
|
|
428
432
|
"cursor": {
|
|
429
433
|
"type": "string",
|
|
430
434
|
"description": "Opaque cursor from a previous response."
|
|
@@ -555,6 +559,88 @@
|
|
|
555
559
|
}
|
|
556
560
|
}
|
|
557
561
|
}
|
|
562
|
+
},
|
|
563
|
+
{
|
|
564
|
+
"name": "projscan_workspace_graph",
|
|
565
|
+
"description": "Cross-repo intelligence over sibling repos registered via `projscan workspace add`. Use to answer \"what other repos import this file/symbol?\" or \"what symbols are shared across the workspace?\" Read-only.",
|
|
566
|
+
"inputSchema": {
|
|
567
|
+
"type": "object",
|
|
568
|
+
"properties": {
|
|
569
|
+
"action": {
|
|
570
|
+
"type": "string",
|
|
571
|
+
"enum": [
|
|
572
|
+
"list",
|
|
573
|
+
"graph",
|
|
574
|
+
"file_importers"
|
|
575
|
+
],
|
|
576
|
+
"description": "Subaction. Default \"list\" returns the registered repos with file counts. \"graph\" returns every symbol exported by ≥ 2 repos. \"file_importers\" needs `file` (and optionally `repo`); returns the cross-repo importers list."
|
|
577
|
+
},
|
|
578
|
+
"file": {
|
|
579
|
+
"type": "string",
|
|
580
|
+
"description": "\"file_importers\" only — repo-relative path inside the source repo (e.g. \"src/auth.ts\")."
|
|
581
|
+
},
|
|
582
|
+
"repo": {
|
|
583
|
+
"type": "string",
|
|
584
|
+
"description": "\"file_importers\" only — registered repo name (defaults to the cwd if registered)."
|
|
585
|
+
}
|
|
586
|
+
}
|
|
587
|
+
}
|
|
588
|
+
},
|
|
589
|
+
{
|
|
590
|
+
"name": "projscan_apply_fix",
|
|
591
|
+
"description": "Apply a mechanical fix for an open issue (1.6+). Default is dry-run; pass confirm:true to write. Every applied change records a rollback id usable via action:'rollback'. Mechanical templates only — semantic rewrites and codemods stay agent-driven.",
|
|
592
|
+
"inputSchema": {
|
|
593
|
+
"type": "object",
|
|
594
|
+
"properties": {
|
|
595
|
+
"action": {
|
|
596
|
+
"type": "string",
|
|
597
|
+
"enum": [
|
|
598
|
+
"apply",
|
|
599
|
+
"rollback"
|
|
600
|
+
],
|
|
601
|
+
"description": "Default \"apply\". Pass \"rollback\" with `rollback_id` to reverse a previous apply."
|
|
602
|
+
},
|
|
603
|
+
"issue_id": {
|
|
604
|
+
"type": "string",
|
|
605
|
+
"description": "\"apply\" only — the issue id to fix (from projscan_doctor / projscan_analyze). Required for action:\"apply\"."
|
|
606
|
+
},
|
|
607
|
+
"confirm": {
|
|
608
|
+
"type": "boolean",
|
|
609
|
+
"description": "\"apply\" only — when true, write to disk. When false (default), return the would-change list without writing (dry-run)."
|
|
610
|
+
},
|
|
611
|
+
"rollback_id": {
|
|
612
|
+
"type": "string",
|
|
613
|
+
"description": "\"rollback\" only — the id from a prior apply's ApplyResult."
|
|
614
|
+
}
|
|
615
|
+
}
|
|
616
|
+
}
|
|
617
|
+
},
|
|
618
|
+
{
|
|
619
|
+
"name": "projscan_taint",
|
|
620
|
+
"description": "Source-to-sink reachability over the per-function call graph (1.6+). Surfaces \"this function reads `process.env`/`req.body` and calls `exec`/`eval`/raw SQL\" patterns. Defaults cover common JS / Python sources + sinks; project-specific names go in `.projscanrc.json` `taint`.",
|
|
621
|
+
"inputSchema": {
|
|
622
|
+
"type": "object",
|
|
623
|
+
"properties": {
|
|
624
|
+
"sources": {
|
|
625
|
+
"type": "array",
|
|
626
|
+
"items": {
|
|
627
|
+
"type": "string"
|
|
628
|
+
},
|
|
629
|
+
"description": "Additional source names to merge with the defaults. Match is by bare name (rightmost identifier), so `customSecretReader()` adds the literal \"customSecretReader\"."
|
|
630
|
+
},
|
|
631
|
+
"sinks": {
|
|
632
|
+
"type": "array",
|
|
633
|
+
"items": {
|
|
634
|
+
"type": "string"
|
|
635
|
+
},
|
|
636
|
+
"description": "Additional sink names to merge with the defaults. Useful for project-specific dangerous wrappers like `runRawSql` or `dangerouslyEval`."
|
|
637
|
+
},
|
|
638
|
+
"max_flows": {
|
|
639
|
+
"type": "number",
|
|
640
|
+
"description": "Cap the number of flows returned (most-direct first; same-function flows lead). Default 50."
|
|
641
|
+
}
|
|
642
|
+
}
|
|
643
|
+
}
|
|
558
644
|
}
|
|
559
645
|
]
|
|
560
646
|
}
|
package/dist/types.d.ts
CHANGED
|
@@ -360,6 +360,17 @@ export interface ProjscanConfig {
|
|
|
360
360
|
monorepo?: {
|
|
361
361
|
importPolicy?: ImportPolicyRule[];
|
|
362
362
|
};
|
|
363
|
+
/**
|
|
364
|
+
* Taint analysis tuning (1.6.0+). Both lists merge ON TOP of the
|
|
365
|
+
* built-in defaults — they don't replace them. Use this to add
|
|
366
|
+
* project-specific source/sink names: `customSecretReader`, `query`,
|
|
367
|
+
* `runRawSql`, etc. To suppress a default, list the rule id under
|
|
368
|
+
* `disableRules` (e.g. `taint-flow-detected`).
|
|
369
|
+
*/
|
|
370
|
+
taint?: {
|
|
371
|
+
sources?: string[];
|
|
372
|
+
sinks?: string[];
|
|
373
|
+
};
|
|
363
374
|
}
|
|
364
375
|
/**
|
|
365
376
|
* One cross-package import rule. `from` is the package name (matches
|
|
@@ -570,6 +581,22 @@ export interface ReviewFunction {
|
|
|
570
581
|
/** Why this function shows up. */
|
|
571
582
|
reason: 'added' | 'jumped' | 'crossed-threshold';
|
|
572
583
|
}
|
|
584
|
+
/**
|
|
585
|
+
* 1.6+ — A taint flow that is NEW at head (not present at base). Mirrors
|
|
586
|
+
* the core TaintFlow shape but is intentionally light — review summaries
|
|
587
|
+
* should be readable in a glance, so we drop the per-step file list and
|
|
588
|
+
* keep only the source/sink, the function pair, and the path length.
|
|
589
|
+
*/
|
|
590
|
+
export interface ReviewTaintFlow {
|
|
591
|
+
sourceFn: string;
|
|
592
|
+
sinkFn: string;
|
|
593
|
+
source: string;
|
|
594
|
+
sink: string;
|
|
595
|
+
/** Hop count from source function to sink function, inclusive of both ends. */
|
|
596
|
+
pathLength: number;
|
|
597
|
+
/** First and last files in the path; same value when length = 1. */
|
|
598
|
+
files: string[];
|
|
599
|
+
}
|
|
573
600
|
/** Workspace-package-scoped dependency change. Aggregates root + workspaces. */
|
|
574
601
|
export interface ReviewDependencyChange {
|
|
575
602
|
/** Workspace name; '' for the root manifest. */
|
|
@@ -621,6 +648,13 @@ export interface ReviewReport {
|
|
|
621
648
|
riskyFunctions: ReviewFunction[];
|
|
622
649
|
/** package.json deltas across root + workspaces. */
|
|
623
650
|
dependencyChanges: ReviewDependencyChange[];
|
|
651
|
+
/**
|
|
652
|
+
* 1.6+ — NEW source-to-sink taint flows introduced by this PR. Each
|
|
653
|
+
* entry is a flow that exists at head but didn't exist at base
|
|
654
|
+
* (matched by sourceFn + sinkFn pair). Empty when taint is unavailable
|
|
655
|
+
* (no per-function callSites at either side).
|
|
656
|
+
*/
|
|
657
|
+
newTaintFlows: ReviewTaintFlow[];
|
|
624
658
|
/** 'ok' = ship it; 'review' = needs careful look; 'block' = strongly suggests rework. */
|
|
625
659
|
verdict: 'ok' | 'review' | 'block';
|
|
626
660
|
/** One-line bullets explaining the verdict. */
|
|
@@ -639,6 +673,12 @@ export interface ReviewReport {
|
|
|
639
673
|
export interface ImpactNode {
|
|
640
674
|
file: string;
|
|
641
675
|
distance: number;
|
|
676
|
+
/**
|
|
677
|
+
* 1.6+ — name of the registered repo that contains this file.
|
|
678
|
+
* Present only when `cross_repo: true` was passed and the file
|
|
679
|
+
* lives outside the source repo. Absent for in-repo entries.
|
|
680
|
+
*/
|
|
681
|
+
repo?: string;
|
|
642
682
|
}
|
|
643
683
|
export interface ImpactReport {
|
|
644
684
|
available: boolean;
|
|
@@ -664,6 +704,12 @@ export interface ImpactReport {
|
|
|
664
704
|
reachable: ImpactNode[];
|
|
665
705
|
/** Convenience count of reachable files (== reachable.length). */
|
|
666
706
|
totalReachable: number;
|
|
707
|
+
/**
|
|
708
|
+
* 1.6+ — when cross-repo expansion ran, this is the per-repo
|
|
709
|
+
* breakdown of reachable file counts. Absent when `cross_repo`
|
|
710
|
+
* was false or the workspace had no siblings.
|
|
711
|
+
*/
|
|
712
|
+
totalReachableByRepo?: Record<string, number>;
|
|
667
713
|
/**
|
|
668
714
|
* True when traversal hit `maxDistance` before exhausting the graph.
|
|
669
715
|
* Items beyond the limit are omitted from `reachable`.
|
package/dist/utils/config.js
CHANGED
|
@@ -61,8 +61,23 @@ function normalize(input) {
|
|
|
61
61
|
applyDisableRules(obj, out);
|
|
62
62
|
applySeverityOverrides(obj, out);
|
|
63
63
|
applyMonorepo(obj, out);
|
|
64
|
+
applyTaint(obj, out);
|
|
64
65
|
return out;
|
|
65
66
|
}
|
|
67
|
+
function applyTaint(obj, out) {
|
|
68
|
+
if (!obj.taint || typeof obj.taint !== 'object')
|
|
69
|
+
return;
|
|
70
|
+
const t = obj.taint;
|
|
71
|
+
const taint = {};
|
|
72
|
+
if (Array.isArray(t.sources)) {
|
|
73
|
+
taint.sources = t.sources.filter((v) => typeof v === 'string' && v.length > 0);
|
|
74
|
+
}
|
|
75
|
+
if (Array.isArray(t.sinks)) {
|
|
76
|
+
taint.sinks = t.sinks.filter((v) => typeof v === 'string' && v.length > 0);
|
|
77
|
+
}
|
|
78
|
+
if (Object.keys(taint).length)
|
|
79
|
+
out.taint = taint;
|
|
80
|
+
}
|
|
66
81
|
function applyMinScore(obj, out) {
|
|
67
82
|
if (typeof obj.minScore === 'number' && Number.isFinite(obj.minScore)) {
|
|
68
83
|
out.minScore = Math.max(0, Math.min(100, Math.floor(obj.minScore)));
|
package/dist/utils/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "projscan",
|
|
3
3
|
"mcpName": "io.github.abhiyoheswaran1/projscan",
|
|
4
|
-
"version": "1.
|
|
5
|
-
"description": "Agent-first code intelligence. MCP server (2025-03-26) with AST parsing for JavaScript, TypeScript, Python, Go, Java, Ruby, Rust, PHP, and C#; code graph, file + per-function AST cyclomatic complexity, per-function fan-in + fan-out, coupling + cycle detection, structural PR diff with HTML reporter, coverage report with HTML reporter, one-call PR review (projscan_review), rule-driven fix suggestions (projscan_fix_suggest, projscan_explain_issue)
|
|
4
|
+
"version": "1.6.1",
|
|
5
|
+
"description": "Agent-first code intelligence. MCP server (2025-03-26) with AST parsing for JavaScript, TypeScript, Python, Go, Java, Ruby, Rust, PHP, and C#; code graph, file + per-function AST cyclomatic complexity, per-function fan-in + fan-out, coupling + cycle detection, structural PR diff with HTML reporter, coverage report with HTML reporter, one-call PR review (projscan_review) with new-taint-flow detection, rule-driven fix suggestions + mechanical apply layer with rollback (projscan_apply_fix, projscan_fix_suggest, projscan_explain_issue), source-to-sink taint analysis (projscan_taint), transitive blast-radius analysis with cross-repo mode (projscan_impact for files and symbols), cross-repo workspace registration + intelligence (projscan_workspace_graph), per-function semantic search chunks (sub-file embeddings), monorepo workspace awareness with cross-package import policy + per-package dependencies / outdated / audit, BM25 + optional semantic search, cursor pagination, progress notifications, context-budgeted output, and a stable-surface CI guard. CLI on the side.",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"main": "./dist/index.js",
|
|
8
8
|
"types": "./dist/index.d.ts",
|
package/dist/core/telemetry.d.ts
DELETED
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Opt-in, privacy-preserving telemetry (0.14).
|
|
3
|
-
*
|
|
4
|
-
* What it records: tool name, duration, success/failure, projscan version,
|
|
5
|
-
* iso timestamp. That's it. NO source content, NO file paths, NO arguments,
|
|
6
|
-
* NO repository identifiers, NO machine identifiers.
|
|
7
|
-
*
|
|
8
|
-
* What it does NOT do: send anything off the machine. The MVP sink is a
|
|
9
|
-
* local JSONL file the user controls. A remote sink may follow in a later
|
|
10
|
-
* release once we have a server worth pointing at.
|
|
11
|
-
*
|
|
12
|
-
* Discoverability: off by default. Enable via .projscanrc telemetry block,
|
|
13
|
-
* or PROJSCAN_TELEMETRY=1 env var (env wins). PROJSCAN_TELEMETRY=0 disables
|
|
14
|
-
* even when the config opts in (per-machine kill switch).
|
|
15
|
-
*/
|
|
16
|
-
export interface TelemetryConfig {
|
|
17
|
-
enabled: boolean;
|
|
18
|
-
/**
|
|
19
|
-
* Where to write events. Default: `~/.projscan/telemetry.jsonl`.
|
|
20
|
-
* Either a path or the literal string "stderr" (test/diagnostic use).
|
|
21
|
-
*/
|
|
22
|
-
sink: string;
|
|
23
|
-
}
|
|
24
|
-
export interface TelemetryEvent {
|
|
25
|
-
ts: string;
|
|
26
|
-
version: string;
|
|
27
|
-
tool: string;
|
|
28
|
-
durationMs: number;
|
|
29
|
-
ok: boolean;
|
|
30
|
-
errorCode?: string;
|
|
31
|
-
}
|
|
32
|
-
/**
|
|
33
|
-
* Resolve effective config. Env var takes precedence; .projscanrc supplies
|
|
34
|
-
* the sink and acts as the default. Non-throwing — bad config silently
|
|
35
|
-
* disables.
|
|
36
|
-
*/
|
|
37
|
-
export declare function resolveTelemetryConfig(rcConfig?: {
|
|
38
|
-
enabled?: boolean;
|
|
39
|
-
sink?: string;
|
|
40
|
-
}): TelemetryConfig;
|
|
41
|
-
/** Test-only: drop the cached config so tests can mutate env between cases. */
|
|
42
|
-
export declare function _resetTelemetryConfigForTests(): void;
|
|
43
|
-
/**
|
|
44
|
-
* Fire-and-forget event recorder. Catches every error path so an unwritable
|
|
45
|
-
* sink can never affect the calling tool. Does nothing when disabled.
|
|
46
|
-
*/
|
|
47
|
-
export declare function recordToolCall(tool: string, durationMs: number, ok: boolean, errorCode?: string, rcConfig?: {
|
|
48
|
-
enabled?: boolean;
|
|
49
|
-
sink?: string;
|
|
50
|
-
}): Promise<void>;
|
|
51
|
-
/** Returns the JSON used by `projscan_telemetry` to surface state to the user. */
|
|
52
|
-
export declare function describeTelemetryConfig(rcConfig?: {
|
|
53
|
-
enabled?: boolean;
|
|
54
|
-
sink?: string;
|
|
55
|
-
}): TelemetryConfig & {
|
|
56
|
-
defaultSink: string;
|
|
57
|
-
envOverride: string | null;
|
|
58
|
-
};
|
|
59
|
-
export interface ToolHistogram {
|
|
60
|
-
tool: string;
|
|
61
|
-
count: number;
|
|
62
|
-
errorCount: number;
|
|
63
|
-
errorRate: number;
|
|
64
|
-
/** Latency percentiles (ms). null when count is 0 (shouldn't happen post-filter). */
|
|
65
|
-
p50Ms: number | null;
|
|
66
|
-
p95Ms: number | null;
|
|
67
|
-
p99Ms: number | null;
|
|
68
|
-
meanMs: number;
|
|
69
|
-
minMs: number;
|
|
70
|
-
maxMs: number;
|
|
71
|
-
}
|
|
72
|
-
export interface TelemetryAggregate {
|
|
73
|
-
available: boolean;
|
|
74
|
-
reason?: string;
|
|
75
|
-
sink: string;
|
|
76
|
-
totalEvents: number;
|
|
77
|
-
windowFrom: string | null;
|
|
78
|
-
windowTo: string | null;
|
|
79
|
-
byTool: ToolHistogram[];
|
|
80
|
-
}
|
|
81
|
-
/**
|
|
82
|
-
* Read the JSONL sink and bucket events by tool, returning latency
|
|
83
|
-
* percentiles per tool. Returns available:false (with a reason) when the
|
|
84
|
-
* sink doesn't exist yet — typical case for users who haven't enabled
|
|
85
|
-
* telemetry or haven't run anything yet.
|
|
86
|
-
*/
|
|
87
|
-
export declare function aggregateTelemetry(rcConfig?: {
|
|
88
|
-
enabled?: boolean;
|
|
89
|
-
sink?: string;
|
|
90
|
-
}): Promise<TelemetryAggregate>;
|
package/dist/core/telemetry.js
DELETED
|
@@ -1,199 +0,0 @@
|
|
|
1
|
-
import fs from 'node:fs/promises';
|
|
2
|
-
import os from 'node:os';
|
|
3
|
-
import path from 'node:path';
|
|
4
|
-
import { readFileSync } from 'node:fs';
|
|
5
|
-
import { fileURLToPath } from 'node:url';
|
|
6
|
-
const DEFAULT_SINK_DIR = path.join(os.homedir(), '.projscan');
|
|
7
|
-
const DEFAULT_SINK_FILE = path.join(DEFAULT_SINK_DIR, 'telemetry.jsonl');
|
|
8
|
-
let cachedConfig;
|
|
9
|
-
let cachedVersion;
|
|
10
|
-
/**
|
|
11
|
-
* Resolve effective config. Env var takes precedence; .projscanrc supplies
|
|
12
|
-
* the sink and acts as the default. Non-throwing — bad config silently
|
|
13
|
-
* disables.
|
|
14
|
-
*/
|
|
15
|
-
export function resolveTelemetryConfig(rcConfig) {
|
|
16
|
-
if (cachedConfig)
|
|
17
|
-
return cachedConfig;
|
|
18
|
-
const envFlag = process.env.PROJSCAN_TELEMETRY;
|
|
19
|
-
let enabled = !!rcConfig?.enabled;
|
|
20
|
-
if (envFlag === '1' || envFlag?.toLowerCase() === 'true')
|
|
21
|
-
enabled = true;
|
|
22
|
-
if (envFlag === '0' || envFlag?.toLowerCase() === 'false')
|
|
23
|
-
enabled = false;
|
|
24
|
-
const sink = rcConfig?.sink || DEFAULT_SINK_FILE;
|
|
25
|
-
cachedConfig = { enabled, sink };
|
|
26
|
-
return cachedConfig;
|
|
27
|
-
}
|
|
28
|
-
/** Test-only: drop the cached config so tests can mutate env between cases. */
|
|
29
|
-
export function _resetTelemetryConfigForTests() {
|
|
30
|
-
cachedConfig = undefined;
|
|
31
|
-
cachedVersion = undefined;
|
|
32
|
-
}
|
|
33
|
-
function readVersion() {
|
|
34
|
-
if (cachedVersion)
|
|
35
|
-
return cachedVersion;
|
|
36
|
-
try {
|
|
37
|
-
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
38
|
-
const pkg = JSON.parse(readFileSync(path.resolve(__dirname, '../../package.json'), 'utf-8'));
|
|
39
|
-
cachedVersion = String(pkg.version ?? '0.0.0');
|
|
40
|
-
}
|
|
41
|
-
catch {
|
|
42
|
-
cachedVersion = '0.0.0';
|
|
43
|
-
}
|
|
44
|
-
return cachedVersion;
|
|
45
|
-
}
|
|
46
|
-
/**
|
|
47
|
-
* Fire-and-forget event recorder. Catches every error path so an unwritable
|
|
48
|
-
* sink can never affect the calling tool. Does nothing when disabled.
|
|
49
|
-
*/
|
|
50
|
-
export async function recordToolCall(tool, durationMs, ok, errorCode, rcConfig) {
|
|
51
|
-
const config = resolveTelemetryConfig(rcConfig);
|
|
52
|
-
if (!config.enabled)
|
|
53
|
-
return;
|
|
54
|
-
const event = {
|
|
55
|
-
ts: new Date().toISOString(),
|
|
56
|
-
version: readVersion(),
|
|
57
|
-
tool,
|
|
58
|
-
durationMs: Math.round(durationMs),
|
|
59
|
-
ok,
|
|
60
|
-
};
|
|
61
|
-
if (errorCode)
|
|
62
|
-
event.errorCode = errorCode;
|
|
63
|
-
try {
|
|
64
|
-
if (config.sink === 'stderr') {
|
|
65
|
-
process.stderr.write(`[telemetry] ${JSON.stringify(event)}\n`);
|
|
66
|
-
return;
|
|
67
|
-
}
|
|
68
|
-
await fs.mkdir(path.dirname(config.sink), { recursive: true });
|
|
69
|
-
await fs.appendFile(config.sink, JSON.stringify(event) + '\n', 'utf-8');
|
|
70
|
-
}
|
|
71
|
-
catch {
|
|
72
|
-
// Sink failures are silent by design. Telemetry must never break a tool.
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
/** Returns the JSON used by `projscan_telemetry` to surface state to the user. */
|
|
76
|
-
export function describeTelemetryConfig(rcConfig) {
|
|
77
|
-
const config = resolveTelemetryConfig(rcConfig);
|
|
78
|
-
const env = process.env.PROJSCAN_TELEMETRY ?? null;
|
|
79
|
-
return {
|
|
80
|
-
...config,
|
|
81
|
-
defaultSink: DEFAULT_SINK_FILE,
|
|
82
|
-
envOverride: env,
|
|
83
|
-
};
|
|
84
|
-
}
|
|
85
|
-
/**
|
|
86
|
-
* Read the JSONL sink and bucket events by tool, returning latency
|
|
87
|
-
* percentiles per tool. Returns available:false (with a reason) when the
|
|
88
|
-
* sink doesn't exist yet — typical case for users who haven't enabled
|
|
89
|
-
* telemetry or haven't run anything yet.
|
|
90
|
-
*/
|
|
91
|
-
export async function aggregateTelemetry(rcConfig) {
|
|
92
|
-
const config = resolveTelemetryConfig(rcConfig);
|
|
93
|
-
const sinkPath = config.sink === 'stderr' ? '' : config.sink;
|
|
94
|
-
if (!sinkPath) {
|
|
95
|
-
return {
|
|
96
|
-
available: false,
|
|
97
|
-
reason: 'Sink is "stderr"; nothing to aggregate from disk.',
|
|
98
|
-
sink: config.sink,
|
|
99
|
-
totalEvents: 0,
|
|
100
|
-
windowFrom: null,
|
|
101
|
-
windowTo: null,
|
|
102
|
-
byTool: [],
|
|
103
|
-
};
|
|
104
|
-
}
|
|
105
|
-
let raw;
|
|
106
|
-
try {
|
|
107
|
-
raw = await fs.readFile(sinkPath, 'utf-8');
|
|
108
|
-
}
|
|
109
|
-
catch {
|
|
110
|
-
return {
|
|
111
|
-
available: false,
|
|
112
|
-
reason: `No telemetry sink found at ${sinkPath}. Enable telemetry and run a few tools first.`,
|
|
113
|
-
sink: sinkPath,
|
|
114
|
-
totalEvents: 0,
|
|
115
|
-
windowFrom: null,
|
|
116
|
-
windowTo: null,
|
|
117
|
-
byTool: [],
|
|
118
|
-
};
|
|
119
|
-
}
|
|
120
|
-
const events = [];
|
|
121
|
-
for (const line of raw.split('\n')) {
|
|
122
|
-
const trimmed = line.trim();
|
|
123
|
-
if (!trimmed)
|
|
124
|
-
continue;
|
|
125
|
-
try {
|
|
126
|
-
const obj = JSON.parse(trimmed);
|
|
127
|
-
if (typeof obj?.tool === 'string' && typeof obj?.durationMs === 'number') {
|
|
128
|
-
events.push(obj);
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
catch {
|
|
132
|
-
// Skip malformed lines silently — JSONL files can be partially written
|
|
133
|
-
// when a process is killed mid-append.
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
if (events.length === 0) {
|
|
137
|
-
return {
|
|
138
|
-
available: true,
|
|
139
|
-
sink: sinkPath,
|
|
140
|
-
totalEvents: 0,
|
|
141
|
-
windowFrom: null,
|
|
142
|
-
windowTo: null,
|
|
143
|
-
byTool: [],
|
|
144
|
-
};
|
|
145
|
-
}
|
|
146
|
-
const byToolMap = new Map();
|
|
147
|
-
let windowFrom = events[0].ts;
|
|
148
|
-
let windowTo = events[0].ts;
|
|
149
|
-
for (const e of events) {
|
|
150
|
-
if (e.ts < windowFrom)
|
|
151
|
-
windowFrom = e.ts;
|
|
152
|
-
if (e.ts > windowTo)
|
|
153
|
-
windowTo = e.ts;
|
|
154
|
-
if (!byToolMap.has(e.tool))
|
|
155
|
-
byToolMap.set(e.tool, []);
|
|
156
|
-
byToolMap.get(e.tool).push(e);
|
|
157
|
-
}
|
|
158
|
-
const byTool = [];
|
|
159
|
-
for (const [tool, toolEvents] of byToolMap) {
|
|
160
|
-
const durations = toolEvents.map((e) => e.durationMs).sort((a, b) => a - b);
|
|
161
|
-
const errorCount = toolEvents.filter((e) => e.ok === false).length;
|
|
162
|
-
byTool.push({
|
|
163
|
-
tool,
|
|
164
|
-
count: toolEvents.length,
|
|
165
|
-
errorCount,
|
|
166
|
-
errorRate: Math.round((errorCount / toolEvents.length) * 1000) / 1000,
|
|
167
|
-
p50Ms: percentile(durations, 50),
|
|
168
|
-
p95Ms: percentile(durations, 95),
|
|
169
|
-
p99Ms: percentile(durations, 99),
|
|
170
|
-
meanMs: Math.round(durations.reduce((s, n) => s + n, 0) / durations.length),
|
|
171
|
-
minMs: durations[0],
|
|
172
|
-
maxMs: durations[durations.length - 1],
|
|
173
|
-
});
|
|
174
|
-
}
|
|
175
|
-
byTool.sort((a, b) => b.count - a.count);
|
|
176
|
-
return {
|
|
177
|
-
available: true,
|
|
178
|
-
sink: sinkPath,
|
|
179
|
-
totalEvents: events.length,
|
|
180
|
-
windowFrom,
|
|
181
|
-
windowTo,
|
|
182
|
-
byTool,
|
|
183
|
-
};
|
|
184
|
-
}
|
|
185
|
-
/** Linear-interpolation percentile over a pre-sorted ascending array. */
|
|
186
|
-
function percentile(sorted, p) {
|
|
187
|
-
if (sorted.length === 0)
|
|
188
|
-
return null;
|
|
189
|
-
if (sorted.length === 1)
|
|
190
|
-
return sorted[0];
|
|
191
|
-
const rank = (p / 100) * (sorted.length - 1);
|
|
192
|
-
const lo = Math.floor(rank);
|
|
193
|
-
const hi = Math.ceil(rank);
|
|
194
|
-
if (lo === hi)
|
|
195
|
-
return sorted[lo];
|
|
196
|
-
const frac = rank - lo;
|
|
197
|
-
return Math.round(sorted[lo] * (1 - frac) + sorted[hi] * frac);
|
|
198
|
-
}
|
|
199
|
-
//# sourceMappingURL=telemetry.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../../src/core/telemetry.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/cache.d.ts
DELETED
package/dist/utils/cache.js
DELETED
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
import fs from 'node:fs/promises';
|
|
2
|
-
import path from 'node:path';
|
|
3
|
-
import os from 'node:os';
|
|
4
|
-
import crypto from 'node:crypto';
|
|
5
|
-
const CACHE_DIR = path.join(os.tmpdir(), 'projscan-cache');
|
|
6
|
-
const DEFAULT_TTL_MS = 60_000; // 1 minute
|
|
7
|
-
async function ensureCacheDir() {
|
|
8
|
-
await fs.mkdir(CACHE_DIR, { recursive: true });
|
|
9
|
-
}
|
|
10
|
-
function getCacheFilePath(key) {
|
|
11
|
-
const hash = crypto.createHash('sha256').update(key).digest('hex').slice(0, 16);
|
|
12
|
-
return path.join(CACHE_DIR, `${hash}.json`);
|
|
13
|
-
}
|
|
14
|
-
export async function cacheGet(key) {
|
|
15
|
-
try {
|
|
16
|
-
const filePath = getCacheFilePath(key);
|
|
17
|
-
const raw = await fs.readFile(filePath, 'utf-8');
|
|
18
|
-
const entry = JSON.parse(raw);
|
|
19
|
-
if (Date.now() > entry.expiresAt) {
|
|
20
|
-
await fs.unlink(filePath).catch(() => { });
|
|
21
|
-
return null;
|
|
22
|
-
}
|
|
23
|
-
return entry.data;
|
|
24
|
-
}
|
|
25
|
-
catch {
|
|
26
|
-
return null;
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
export async function cacheSet(key, data, ttlMs = DEFAULT_TTL_MS) {
|
|
30
|
-
try {
|
|
31
|
-
await ensureCacheDir();
|
|
32
|
-
const filePath = getCacheFilePath(key);
|
|
33
|
-
const entry = {
|
|
34
|
-
data,
|
|
35
|
-
expiresAt: Date.now() + ttlMs,
|
|
36
|
-
};
|
|
37
|
-
await fs.writeFile(filePath, JSON.stringify(entry), 'utf-8');
|
|
38
|
-
}
|
|
39
|
-
catch {
|
|
40
|
-
// Cache write failure is non-critical
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
export async function cacheInvalidate(key) {
|
|
44
|
-
try {
|
|
45
|
-
await fs.unlink(getCacheFilePath(key));
|
|
46
|
-
}
|
|
47
|
-
catch {
|
|
48
|
-
// Ignore
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
//# sourceMappingURL=cache.js.map
|
package/dist/utils/cache.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/utils/cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,MAAM,MAAM,aAAa,CAAC;AAEjC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,gBAAgB,CAAC,CAAC;AAC3D,MAAM,cAAc,GAAG,MAAM,CAAC,CAAC,WAAW;AAE1C,KAAK,UAAU,cAAc;IAC3B,MAAM,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AACjD,CAAC;AAED,SAAS,gBAAgB,CAAC,GAAW;IACnC,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAChF,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,IAAI,OAAO,CAAC,CAAC;AAC9C,CAAC;AAOD,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAI,GAAW;IAC3C,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;QACvC,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACjD,MAAM,KAAK,GAAkB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAE7C,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;YACjC,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YAC1C,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,KAAK,CAAC,IAAI,CAAC;IACpB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAI,GAAW,EAAE,IAAO,EAAE,KAAK,GAAG,cAAc;IAC5E,IAAI,CAAC;QACH,MAAM,cAAc,EAAE,CAAC;QACvB,MAAM,QAAQ,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;QACvC,MAAM,KAAK,GAAkB;YAC3B,IAAI;YACJ,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;SAC9B,CAAC;QACF,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;IAC/D,CAAC;IAAC,MAAM,CAAC;QACP,sCAAsC;IACxC,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,GAAW;IAC/C,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC;IACzC,CAAC;IAAC,MAAM,CAAC;QACP,SAAS;IACX,CAAC;AACH,CAAC"}
|