proofscan 0.2.0 → 0.3.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 +205 -281
- package/dist/analyzers/IAnalyzer.d.ts +87 -0
- package/dist/analyzers/IAnalyzer.d.ts.map +1 -0
- package/dist/analyzers/IAnalyzer.js +48 -0
- package/dist/analyzers/IAnalyzer.js.map +1 -0
- package/dist/analyzers/NoopAnalyzer.d.ts +24 -0
- package/dist/analyzers/NoopAnalyzer.d.ts.map +1 -0
- package/dist/analyzers/NoopAnalyzer.js +50 -0
- package/dist/analyzers/NoopAnalyzer.js.map +1 -0
- package/dist/analyzers/index.d.ts +13 -0
- package/dist/analyzers/index.d.ts.map +1 -0
- package/dist/analyzers/index.js +23 -0
- package/dist/analyzers/index.js.map +1 -0
- package/dist/cli.d.ts +15 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +131 -9
- package/dist/cli.js.map +1 -1
- package/dist/commands/events.d.ts +7 -0
- package/dist/commands/events.d.ts.map +1 -0
- package/dist/commands/events.js +185 -0
- package/dist/commands/events.js.map +1 -0
- package/dist/commands/explore.d.ts +9 -0
- package/dist/commands/explore.d.ts.map +1 -0
- package/dist/commands/explore.js +345 -0
- package/dist/commands/explore.js.map +1 -0
- package/dist/commands/index.d.ts +5 -0
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +7 -0
- package/dist/commands/index.js.map +1 -1
- package/dist/commands/monitor.d.ts +1 -0
- package/dist/commands/monitor.d.ts.map +1 -1
- package/dist/commands/monitor.js +70 -12
- package/dist/commands/monitor.js.map +1 -1
- package/dist/commands/scan.d.ts.map +1 -1
- package/dist/commands/scan.js +12 -7
- package/dist/commands/scan.js.map +1 -1
- package/dist/commands/status.d.ts +7 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +108 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/tree.d.ts +7 -0
- package/dist/commands/tree.d.ts.map +1 -0
- package/dist/commands/tree.js +184 -0
- package/dist/commands/tree.js.map +1 -0
- package/dist/commands/view.d.ts +9 -0
- package/dist/commands/view.d.ts.map +1 -0
- package/dist/commands/view.js +210 -0
- package/dist/commands/view.js.map +1 -0
- package/dist/db/connection.d.ts.map +1 -1
- package/dist/db/connection.js +45 -4
- package/dist/db/connection.js.map +1 -1
- package/dist/db/events-store.d.ts +3 -0
- package/dist/db/events-store.d.ts.map +1 -1
- package/dist/db/events-store.js +6 -3
- package/dist/db/events-store.js.map +1 -1
- package/dist/db/schema.d.ts +8 -2
- package/dist/db/schema.d.ts.map +1 -1
- package/dist/db/schema.js +29 -3
- package/dist/db/schema.js.map +1 -1
- package/dist/db/types.d.ts +3 -0
- package/dist/db/types.d.ts.map +1 -1
- package/dist/eventline/index.d.ts +8 -0
- package/dist/eventline/index.d.ts.map +1 -0
- package/dist/eventline/index.js +8 -0
- package/dist/eventline/index.js.map +1 -0
- package/dist/eventline/normalizer.d.ts +79 -0
- package/dist/eventline/normalizer.d.ts.map +1 -0
- package/dist/eventline/normalizer.js +418 -0
- package/dist/eventline/normalizer.js.map +1 -0
- package/dist/eventline/schema-discovery.d.ts +79 -0
- package/dist/eventline/schema-discovery.d.ts.map +1 -0
- package/dist/eventline/schema-discovery.js +154 -0
- package/dist/eventline/schema-discovery.js.map +1 -0
- package/dist/eventline/store.d.ts +88 -0
- package/dist/eventline/store.d.ts.map +1 -0
- package/dist/eventline/store.js +358 -0
- package/dist/eventline/store.js.map +1 -0
- package/dist/eventline/types.d.ts +112 -0
- package/dist/eventline/types.d.ts.map +1 -0
- package/dist/eventline/types.js +67 -0
- package/dist/eventline/types.js.map +1 -0
- package/dist/protocols/A2aAdapter.d.ts +39 -0
- package/dist/protocols/A2aAdapter.d.ts.map +1 -0
- package/dist/protocols/A2aAdapter.js +48 -0
- package/dist/protocols/A2aAdapter.js.map +1 -0
- package/dist/protocols/IProtocolAdapter.d.ts +106 -0
- package/dist/protocols/IProtocolAdapter.d.ts.map +1 -0
- package/dist/protocols/IProtocolAdapter.js +57 -0
- package/dist/protocols/IProtocolAdapter.js.map +1 -0
- package/dist/protocols/McpAdapter.d.ts +23 -0
- package/dist/protocols/McpAdapter.d.ts.map +1 -0
- package/dist/protocols/McpAdapter.js +162 -0
- package/dist/protocols/McpAdapter.js.map +1 -0
- package/dist/protocols/index.d.ts +14 -0
- package/dist/protocols/index.d.ts.map +1 -0
- package/dist/protocols/index.js +24 -0
- package/dist/protocols/index.js.map +1 -0
- package/dist/scanner/index.d.ts +1 -0
- package/dist/scanner/index.d.ts.map +1 -1
- package/dist/scanner/index.js +97 -60
- package/dist/scanner/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Analyzer Interface
|
|
3
|
+
*
|
|
4
|
+
* Phase 2.1: Skeleton for event analysis hooks
|
|
5
|
+
* Full implementation in Phase 3
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Analyzer registry
|
|
9
|
+
*/
|
|
10
|
+
export class AnalyzerRegistry {
|
|
11
|
+
analyzers = new Map();
|
|
12
|
+
/**
|
|
13
|
+
* Register an analyzer
|
|
14
|
+
*/
|
|
15
|
+
register(analyzer) {
|
|
16
|
+
this.analyzers.set(analyzer.name, analyzer);
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Get analyzer by name
|
|
20
|
+
*/
|
|
21
|
+
get(name) {
|
|
22
|
+
return this.analyzers.get(name);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Get all registered analyzers
|
|
26
|
+
*/
|
|
27
|
+
getAll() {
|
|
28
|
+
return Array.from(this.analyzers.values());
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Run all analyzers on events
|
|
32
|
+
*/
|
|
33
|
+
async analyzeAll(events) {
|
|
34
|
+
const results = [];
|
|
35
|
+
for (const analyzer of this.analyzers.values()) {
|
|
36
|
+
try {
|
|
37
|
+
const result = await analyzer.analyze(events);
|
|
38
|
+
results.push(result);
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
// Log error but continue with other analyzers
|
|
42
|
+
console.error(`Analyzer ${analyzer.name} failed:`, error);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return results;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=IAnalyzer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IAnalyzer.js","sourceRoot":"","sources":["../../src/analyzers/IAnalyzer.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA6EH;;GAEG;AACH,MAAM,OAAO,gBAAgB;IACnB,SAAS,GAA2B,IAAI,GAAG,EAAE,CAAC;IAEtD;;OAEG;IACH,QAAQ,CAAC,QAAmB;QAC1B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC9C,CAAC;IAED;;OAEG;IACH,GAAG,CAAC,IAAY;QACd,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;IAED;;OAEG;IACH,MAAM;QACJ,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU,CAAC,MAAmB;QAClC,MAAM,OAAO,GAAqB,EAAE,CAAC;QAErC,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC;YAC/C,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;gBAC9C,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACvB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,8CAA8C;gBAC9C,OAAO,CAAC,KAAK,CAAC,YAAY,QAAQ,CAAC,IAAI,UAAU,EAAE,KAAK,CAAC,CAAC;YAC5D,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;CACF"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Noop Analyzer
|
|
3
|
+
*
|
|
4
|
+
* Phase 2.1: Placeholder analyzer that does nothing
|
|
5
|
+
* Used as a template and for testing the analyzer infrastructure
|
|
6
|
+
*/
|
|
7
|
+
import type { IAnalyzer, AnalysisResult } from './IAnalyzer.js';
|
|
8
|
+
import type { EventLine, EventLinePair } from '../eventline/types.js';
|
|
9
|
+
/**
|
|
10
|
+
* Noop Analyzer - does nothing, returns empty results
|
|
11
|
+
*
|
|
12
|
+
* This serves as:
|
|
13
|
+
* 1. A template for creating new analyzers
|
|
14
|
+
* 2. A test fixture for the analyzer infrastructure
|
|
15
|
+
* 3. A way to verify the hook system works
|
|
16
|
+
*/
|
|
17
|
+
export declare class NoopAnalyzer implements IAnalyzer {
|
|
18
|
+
readonly name = "noop";
|
|
19
|
+
readonly version = "1.0.0";
|
|
20
|
+
readonly description = "No-operation analyzer (placeholder)";
|
|
21
|
+
analyze(events: EventLine[]): Promise<AnalysisResult>;
|
|
22
|
+
analyzePairs(pairs: EventLinePair[]): Promise<AnalysisResult>;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=NoopAnalyzer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NoopAnalyzer.d.ts","sourceRoot":"","sources":["../../src/analyzers/NoopAnalyzer.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChE,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAEtE;;;;;;;GAOG;AACH,qBAAa,YAAa,YAAW,SAAS;IAC5C,QAAQ,CAAC,IAAI,UAAU;IACvB,QAAQ,CAAC,OAAO,WAAW;IAC3B,QAAQ,CAAC,WAAW,yCAAyC;IAEvD,OAAO,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,cAAc,CAAC;IAgBrD,YAAY,CAAC,KAAK,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,cAAc,CAAC;CAepE"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Noop Analyzer
|
|
3
|
+
*
|
|
4
|
+
* Phase 2.1: Placeholder analyzer that does nothing
|
|
5
|
+
* Used as a template and for testing the analyzer infrastructure
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Noop Analyzer - does nothing, returns empty results
|
|
9
|
+
*
|
|
10
|
+
* This serves as:
|
|
11
|
+
* 1. A template for creating new analyzers
|
|
12
|
+
* 2. A test fixture for the analyzer infrastructure
|
|
13
|
+
* 3. A way to verify the hook system works
|
|
14
|
+
*/
|
|
15
|
+
export class NoopAnalyzer {
|
|
16
|
+
name = 'noop';
|
|
17
|
+
version = '1.0.0';
|
|
18
|
+
description = 'No-operation analyzer (placeholder)';
|
|
19
|
+
async analyze(events) {
|
|
20
|
+
return {
|
|
21
|
+
analyzer: this.name,
|
|
22
|
+
ts_ms: Date.now(),
|
|
23
|
+
findings: [],
|
|
24
|
+
stats: {
|
|
25
|
+
events_processed: events.length,
|
|
26
|
+
findings_count: 0,
|
|
27
|
+
},
|
|
28
|
+
meta: {
|
|
29
|
+
version: this.version,
|
|
30
|
+
description: this.description,
|
|
31
|
+
},
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
async analyzePairs(pairs) {
|
|
35
|
+
return {
|
|
36
|
+
analyzer: this.name,
|
|
37
|
+
ts_ms: Date.now(),
|
|
38
|
+
findings: [],
|
|
39
|
+
stats: {
|
|
40
|
+
pairs_processed: pairs.length,
|
|
41
|
+
findings_count: 0,
|
|
42
|
+
},
|
|
43
|
+
meta: {
|
|
44
|
+
version: this.version,
|
|
45
|
+
description: this.description,
|
|
46
|
+
},
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=NoopAnalyzer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NoopAnalyzer.js","sourceRoot":"","sources":["../../src/analyzers/NoopAnalyzer.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH;;;;;;;GAOG;AACH,MAAM,OAAO,YAAY;IACd,IAAI,GAAG,MAAM,CAAC;IACd,OAAO,GAAG,OAAO,CAAC;IAClB,WAAW,GAAG,qCAAqC,CAAC;IAE7D,KAAK,CAAC,OAAO,CAAC,MAAmB;QAC/B,OAAO;YACL,QAAQ,EAAE,IAAI,CAAC,IAAI;YACnB,KAAK,EAAE,IAAI,CAAC,GAAG,EAAE;YACjB,QAAQ,EAAE,EAAE;YACZ,KAAK,EAAE;gBACL,gBAAgB,EAAE,MAAM,CAAC,MAAM;gBAC/B,cAAc,EAAE,CAAC;aAClB;YACD,IAAI,EAAE;gBACJ,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,WAAW,EAAE,IAAI,CAAC,WAAW;aAC9B;SACF,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,KAAsB;QACvC,OAAO;YACL,QAAQ,EAAE,IAAI,CAAC,IAAI;YACnB,KAAK,EAAE,IAAI,CAAC,GAAG,EAAE;YACjB,QAAQ,EAAE,EAAE;YACZ,KAAK,EAAE;gBACL,eAAe,EAAE,KAAK,CAAC,MAAM;gBAC7B,cAAc,EAAE,CAAC;aAClB;YACD,IAAI,EAAE;gBACJ,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,WAAW,EAAE,IAAI,CAAC,WAAW;aAC9B;SACF,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Analyzers
|
|
3
|
+
*
|
|
4
|
+
* Export all analyzers and utilities
|
|
5
|
+
*/
|
|
6
|
+
export * from './IAnalyzer.js';
|
|
7
|
+
export * from './NoopAnalyzer.js';
|
|
8
|
+
import { AnalyzerRegistry } from './IAnalyzer.js';
|
|
9
|
+
/**
|
|
10
|
+
* Create a default registry with all built-in analyzers
|
|
11
|
+
*/
|
|
12
|
+
export declare function createDefaultAnalyzerRegistry(): AnalyzerRegistry;
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/analyzers/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAElC,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAGlD;;GAEG;AACH,wBAAgB,6BAA6B,IAAI,gBAAgB,CAYhE"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Analyzers
|
|
3
|
+
*
|
|
4
|
+
* Export all analyzers and utilities
|
|
5
|
+
*/
|
|
6
|
+
export * from './IAnalyzer.js';
|
|
7
|
+
export * from './NoopAnalyzer.js';
|
|
8
|
+
import { AnalyzerRegistry } from './IAnalyzer.js';
|
|
9
|
+
import { NoopAnalyzer } from './NoopAnalyzer.js';
|
|
10
|
+
/**
|
|
11
|
+
* Create a default registry with all built-in analyzers
|
|
12
|
+
*/
|
|
13
|
+
export function createDefaultAnalyzerRegistry() {
|
|
14
|
+
const registry = new AnalyzerRegistry();
|
|
15
|
+
// Register built-in analyzers
|
|
16
|
+
registry.register(new NoopAnalyzer());
|
|
17
|
+
// Future analyzers will be registered here:
|
|
18
|
+
// registry.register(new LatencyAnalyzer());
|
|
19
|
+
// registry.register(new ErrorPatternAnalyzer());
|
|
20
|
+
// registry.register(new SecurityAnalyzer());
|
|
21
|
+
return registry;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/analyzers/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAElC,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD;;GAEG;AACH,MAAM,UAAU,6BAA6B;IAC3C,MAAM,QAAQ,GAAG,IAAI,gBAAgB,EAAE,CAAC;IAExC,8BAA8B;IAC9B,QAAQ,CAAC,QAAQ,CAAC,IAAI,YAAY,EAAE,CAAC,CAAC;IAEtC,4CAA4C;IAC5C,4CAA4C;IAC5C,iDAAiD;IACjD,6CAA6C;IAE7C,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
package/dist/cli.d.ts
CHANGED
|
@@ -1,7 +1,21 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
/**
|
|
3
|
-
* proofscan CLI
|
|
3
|
+
* proofscan CLI - Phase 2.1
|
|
4
4
|
* MCP Server scanner - eliminate black boxes
|
|
5
|
+
*
|
|
6
|
+
* Command structure (git-style flat):
|
|
7
|
+
* pfscan view # View events (default)
|
|
8
|
+
* pfscan tree # Structure overview
|
|
9
|
+
* pfscan explore # Interactive browse
|
|
10
|
+
* pfscan scan # Run scan
|
|
11
|
+
* pfscan status # System status
|
|
12
|
+
* pfscan archive # Archive/prune data
|
|
13
|
+
* pfscan config # Configuration
|
|
14
|
+
* pfscan connectors # Connector management
|
|
15
|
+
*
|
|
16
|
+
* Shortcuts:
|
|
17
|
+
* v = view, t = tree, e = explore, s = scan
|
|
18
|
+
* st = status, a = archive, c = config
|
|
5
19
|
*/
|
|
6
20
|
export {};
|
|
7
21
|
//# sourceMappingURL=cli.d.ts.map
|
package/dist/cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;GAiBG"}
|
package/dist/cli.js
CHANGED
|
@@ -1,25 +1,60 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
/**
|
|
3
|
-
* proofscan CLI
|
|
3
|
+
* proofscan CLI - Phase 2.1
|
|
4
4
|
* MCP Server scanner - eliminate black boxes
|
|
5
|
+
*
|
|
6
|
+
* Command structure (git-style flat):
|
|
7
|
+
* pfscan view # View events (default)
|
|
8
|
+
* pfscan tree # Structure overview
|
|
9
|
+
* pfscan explore # Interactive browse
|
|
10
|
+
* pfscan scan # Run scan
|
|
11
|
+
* pfscan status # System status
|
|
12
|
+
* pfscan archive # Archive/prune data
|
|
13
|
+
* pfscan config # Configuration
|
|
14
|
+
* pfscan connectors # Connector management
|
|
15
|
+
*
|
|
16
|
+
* Shortcuts:
|
|
17
|
+
* v = view, t = tree, e = explore, s = scan
|
|
18
|
+
* st = status, a = archive, c = config
|
|
5
19
|
*/
|
|
6
20
|
import { Command } from 'commander';
|
|
7
21
|
import { resolveConfigPath } from './utils/config-path.js';
|
|
8
22
|
import { setOutputOptions } from './utils/output.js';
|
|
9
|
-
import { createConfigCommand, createConnectorsCommand, createScanCommand, createMonitorCommand, createSessionsCommand, createArchiveCommand, } from './commands/index.js';
|
|
23
|
+
import { createConfigCommand, createConnectorsCommand, createScanCommand, createMonitorCommand, createSessionsCommand, createArchiveCommand, createViewCommand, createTreeCommand, createExploreCommand, createStatusCommand, createEventsCommand, } from './commands/index.js';
|
|
10
24
|
const program = new Command();
|
|
11
25
|
// Global state for config path
|
|
12
26
|
let globalConfigPath;
|
|
13
27
|
function getConfigPath() {
|
|
14
28
|
return resolveConfigPath({ configPath: globalConfigPath });
|
|
15
29
|
}
|
|
30
|
+
// Custom help formatting
|
|
31
|
+
const HELP_HEADER = `
|
|
32
|
+
proofscan - MCP Server scanner
|
|
33
|
+
Eliminate black boxes by capturing JSON-RPC communication.
|
|
34
|
+
|
|
35
|
+
Common Commands:
|
|
36
|
+
view, v View recent events timeline (default)
|
|
37
|
+
tree, t Show connector → session → rpc structure
|
|
38
|
+
explore, e Interactive data browser
|
|
39
|
+
scan, s Run a new scan
|
|
40
|
+
status, st Show system status
|
|
41
|
+
|
|
42
|
+
Management:
|
|
43
|
+
archive, a Archive and prune old data
|
|
44
|
+
config, c Configuration management
|
|
45
|
+
connectors Connector management
|
|
46
|
+
|
|
47
|
+
Shortcuts:
|
|
48
|
+
v=view t=tree e=explore s=scan st=status a=archive c=config
|
|
49
|
+
`;
|
|
16
50
|
program
|
|
17
51
|
.name('pfscan')
|
|
18
|
-
.description('MCP Server scanner - eliminate black boxes by capturing JSON-RPC
|
|
19
|
-
.version('0.
|
|
52
|
+
.description('MCP Server scanner - eliminate black boxes by capturing JSON-RPC')
|
|
53
|
+
.version('0.3.1')
|
|
20
54
|
.option('-c, --config <path>', 'Path to config file')
|
|
21
55
|
.option('--json', 'Output in JSON format')
|
|
22
56
|
.option('-v, --verbose', 'Verbose output')
|
|
57
|
+
.addHelpText('before', HELP_HEADER)
|
|
23
58
|
.hook('preAction', (thisCommand) => {
|
|
24
59
|
const opts = thisCommand.opts();
|
|
25
60
|
globalConfigPath = opts.config;
|
|
@@ -28,13 +63,100 @@ program
|
|
|
28
63
|
verbose: opts.verbose,
|
|
29
64
|
});
|
|
30
65
|
});
|
|
31
|
-
//
|
|
32
|
-
|
|
66
|
+
// ============================================================
|
|
67
|
+
// Primary commands (Phase 2.1 - git style)
|
|
68
|
+
// ============================================================
|
|
69
|
+
// view (default command)
|
|
70
|
+
const viewCmd = createViewCommand(getConfigPath);
|
|
71
|
+
program.addCommand(viewCmd);
|
|
72
|
+
// Alias: v = view
|
|
73
|
+
const vCmd = createViewCommand(getConfigPath);
|
|
74
|
+
vCmd.name('v').description('Alias for view');
|
|
75
|
+
program.addCommand(vCmd);
|
|
76
|
+
// tree
|
|
77
|
+
const treeCmd = createTreeCommand(getConfigPath);
|
|
78
|
+
program.addCommand(treeCmd);
|
|
79
|
+
// Alias: t = tree
|
|
80
|
+
const tCmd = createTreeCommand(getConfigPath);
|
|
81
|
+
tCmd.name('t').description('Alias for tree');
|
|
82
|
+
program.addCommand(tCmd);
|
|
83
|
+
// explore
|
|
84
|
+
const exploreCmd = createExploreCommand(getConfigPath);
|
|
85
|
+
program.addCommand(exploreCmd);
|
|
86
|
+
// Alias: e = explore
|
|
87
|
+
const eCmd = createExploreCommand(getConfigPath);
|
|
88
|
+
eCmd.name('e').description('Alias for explore');
|
|
89
|
+
program.addCommand(eCmd);
|
|
90
|
+
// status
|
|
91
|
+
const statusCmd = createStatusCommand(getConfigPath);
|
|
92
|
+
program.addCommand(statusCmd);
|
|
93
|
+
// Alias: st = status
|
|
94
|
+
const stCmd = createStatusCommand(getConfigPath);
|
|
95
|
+
stCmd.name('st').description('Alias for status');
|
|
96
|
+
program.addCommand(stCmd);
|
|
97
|
+
// ============================================================
|
|
98
|
+
// Existing commands (maintained for compatibility)
|
|
99
|
+
// ============================================================
|
|
100
|
+
// scan
|
|
101
|
+
const scanCmd = createScanCommand(getConfigPath);
|
|
102
|
+
program.addCommand(scanCmd);
|
|
103
|
+
// Alias: s = scan
|
|
104
|
+
const sCmd = createScanCommand(getConfigPath);
|
|
105
|
+
sCmd.name('s').description('Alias for scan');
|
|
106
|
+
program.addCommand(sCmd);
|
|
107
|
+
// archive
|
|
108
|
+
const archiveCmd = createArchiveCommand(getConfigPath);
|
|
109
|
+
program.addCommand(archiveCmd);
|
|
110
|
+
// Alias: a = archive
|
|
111
|
+
const aCmd = createArchiveCommand(getConfigPath);
|
|
112
|
+
aCmd.name('a').description('Alias for archive');
|
|
113
|
+
program.addCommand(aCmd);
|
|
114
|
+
// config
|
|
115
|
+
const configCmd = createConfigCommand(getConfigPath);
|
|
116
|
+
program.addCommand(configCmd);
|
|
117
|
+
// Alias: c = config
|
|
118
|
+
const cCmd = createConfigCommand(getConfigPath);
|
|
119
|
+
cCmd.name('c').description('Alias for config');
|
|
120
|
+
program.addCommand(cCmd);
|
|
121
|
+
// connectors (no short alias - too long)
|
|
33
122
|
program.addCommand(createConnectorsCommand(getConfigPath));
|
|
34
|
-
|
|
35
|
-
program.addCommand(createMonitorCommand(getConfigPath));
|
|
123
|
+
// sessions (kept for compatibility, but sessions list → view --with-sessions)
|
|
36
124
|
program.addCommand(createSessionsCommand(getConfigPath));
|
|
37
|
-
|
|
125
|
+
// monitor (kept for compatibility, but monitor tail → view)
|
|
126
|
+
program.addCommand(createMonitorCommand(getConfigPath));
|
|
127
|
+
// events (Phase 2.1: events ls, export events)
|
|
128
|
+
program.addCommand(createEventsCommand(getConfigPath));
|
|
129
|
+
// ============================================================
|
|
130
|
+
// Default action: pfscan → pfscan view
|
|
131
|
+
// ============================================================
|
|
132
|
+
// Check if no subcommand is provided (only options like --config, --json)
|
|
133
|
+
function hasSubcommand() {
|
|
134
|
+
const knownCommands = new Set([
|
|
135
|
+
'view', 'v', 'tree', 't', 'explore', 'e', 'status', 'st',
|
|
136
|
+
'scan', 's', 'archive', 'a', 'config', 'c',
|
|
137
|
+
'connectors', 'sessions', 'monitor', 'events', 'help'
|
|
138
|
+
]);
|
|
139
|
+
for (let i = 2; i < process.argv.length; i++) {
|
|
140
|
+
const arg = process.argv[i];
|
|
141
|
+
// Skip option flags and their values
|
|
142
|
+
if (arg.startsWith('-')) {
|
|
143
|
+
// If it's --config, skip the next arg too
|
|
144
|
+
if (arg === '-c' || arg === '--config') {
|
|
145
|
+
i++;
|
|
146
|
+
}
|
|
147
|
+
continue;
|
|
148
|
+
}
|
|
149
|
+
// This is a positional argument - check if it's a command
|
|
150
|
+
if (knownCommands.has(arg)) {
|
|
151
|
+
return true;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
return false;
|
|
155
|
+
}
|
|
156
|
+
// If no subcommand, insert 'view' right after program name (before any options)
|
|
157
|
+
if (!hasSubcommand()) {
|
|
158
|
+
process.argv.splice(2, 0, 'view');
|
|
159
|
+
}
|
|
38
160
|
// Parse and run
|
|
39
161
|
program.parse();
|
|
40
162
|
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/commands/events.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAqFpC,wBAAgB,mBAAmB,CAAC,aAAa,EAAE,MAAM,MAAM,GAAG,OAAO,CA0HxE"}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Events command - list and export events
|
|
3
|
+
* Phase 2.1: events ls and export events commands
|
|
4
|
+
*/
|
|
5
|
+
import { Command } from 'commander';
|
|
6
|
+
import { createWriteStream } from 'fs';
|
|
7
|
+
import { ConfigManager } from '../config/index.js';
|
|
8
|
+
import { EventLineStore } from '../eventline/store.js';
|
|
9
|
+
import { formatTimestamp, formatBytes, getKindSymbol, shortenId, } from '../eventline/types.js';
|
|
10
|
+
import { output, getOutputOptions } from '../utils/output.js';
|
|
11
|
+
/**
|
|
12
|
+
* Format EventLine for terminal display
|
|
13
|
+
*/
|
|
14
|
+
function formatEventLine(event, options = {}) {
|
|
15
|
+
const ts = formatTimestamp(event.ts_ms, options.fulltime);
|
|
16
|
+
const symbol = getKindSymbol(event.kind);
|
|
17
|
+
const status = event.status === 'OK' ? '✓' : event.status === 'ERR' ? '✗' : ' ';
|
|
18
|
+
const dir = event.direction || ' ';
|
|
19
|
+
const method = event.label.slice(0, 30).padEnd(30);
|
|
20
|
+
const session = event.session_id ? `ses=${shortenId(event.session_id, 6)}` : '';
|
|
21
|
+
const parts = [ts, symbol, dir, status, method, session];
|
|
22
|
+
// Add extra info
|
|
23
|
+
if (event.seq) {
|
|
24
|
+
parts.push(`#${event.seq}`);
|
|
25
|
+
}
|
|
26
|
+
if (event.latency_ms !== undefined) {
|
|
27
|
+
parts.push(`${event.latency_ms}ms`);
|
|
28
|
+
}
|
|
29
|
+
if (event.size_bytes !== undefined) {
|
|
30
|
+
parts.push(formatBytes(event.size_bytes));
|
|
31
|
+
}
|
|
32
|
+
return parts.join(' ');
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Convert EventLine to CSV row
|
|
36
|
+
*/
|
|
37
|
+
function eventToCSV(event) {
|
|
38
|
+
const fields = [
|
|
39
|
+
event.ts_ms,
|
|
40
|
+
event.seq || '',
|
|
41
|
+
event.kind,
|
|
42
|
+
event.direction || '',
|
|
43
|
+
event.label,
|
|
44
|
+
event.status,
|
|
45
|
+
event.connector_id || '',
|
|
46
|
+
event.session_id || '',
|
|
47
|
+
event.rpc_id || '',
|
|
48
|
+
event.latency_ms || '',
|
|
49
|
+
event.size_bytes || '',
|
|
50
|
+
event.payload_hash || '',
|
|
51
|
+
event.summary || '',
|
|
52
|
+
event.error_code || '',
|
|
53
|
+
];
|
|
54
|
+
return fields.map(f => {
|
|
55
|
+
const str = String(f);
|
|
56
|
+
// Escape quotes and wrap in quotes if contains comma, quote, or newline
|
|
57
|
+
if (str.includes(',') || str.includes('"') || str.includes('\n')) {
|
|
58
|
+
return `"${str.replace(/"/g, '""')}"`;
|
|
59
|
+
}
|
|
60
|
+
return str;
|
|
61
|
+
}).join(',');
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Get CSV header
|
|
65
|
+
*/
|
|
66
|
+
function getCSVHeader() {
|
|
67
|
+
return 'ts_ms,seq,kind,direction,label,status,connector_id,session_id,rpc_id,latency_ms,size_bytes,payload_hash,summary,error_code';
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Convert EventLine to JSONL
|
|
71
|
+
*/
|
|
72
|
+
function eventToJSONL(event) {
|
|
73
|
+
return JSON.stringify(event);
|
|
74
|
+
}
|
|
75
|
+
export function createEventsCommand(getConfigPath) {
|
|
76
|
+
const cmd = new Command('events')
|
|
77
|
+
.description('List and export events');
|
|
78
|
+
// events ls
|
|
79
|
+
cmd
|
|
80
|
+
.command('ls')
|
|
81
|
+
.description('List events across sessions')
|
|
82
|
+
.option('--limit <n>', 'Number of events to show', '50')
|
|
83
|
+
.option('--since <time>', 'Show events since (24h, 7d, YYYY-MM-DD)')
|
|
84
|
+
.option('--connector <id>', 'Filter by connector ID')
|
|
85
|
+
.option('--session <id>', 'Filter by session ID (partial match)')
|
|
86
|
+
.option('--method <pattern>', 'Filter by method name')
|
|
87
|
+
.option('--errors', 'Show only errors')
|
|
88
|
+
.option('--fulltime', 'Show full timestamp')
|
|
89
|
+
.action(async (options) => {
|
|
90
|
+
try {
|
|
91
|
+
const manager = new ConfigManager(getConfigPath());
|
|
92
|
+
const store = new EventLineStore(manager.getConfigDir());
|
|
93
|
+
const events = store.getRecentEvents({
|
|
94
|
+
limit: parseInt(options.limit, 10),
|
|
95
|
+
since: options.since,
|
|
96
|
+
connector: options.connector,
|
|
97
|
+
session: options.session,
|
|
98
|
+
method: options.method,
|
|
99
|
+
errors: options.errors,
|
|
100
|
+
});
|
|
101
|
+
if (events.length === 0) {
|
|
102
|
+
console.log('No events found.');
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
if (getOutputOptions().json) {
|
|
106
|
+
output(events);
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
// Print header
|
|
110
|
+
console.log(`Events (${events.length}):\n`);
|
|
111
|
+
const header = options.fulltime
|
|
112
|
+
? 'Time Sym Dir St Method Session Extra'
|
|
113
|
+
: 'Time Sym Dir St Method Session Extra';
|
|
114
|
+
console.log(header);
|
|
115
|
+
console.log('-'.repeat(header.length));
|
|
116
|
+
// Print events
|
|
117
|
+
for (const event of events) {
|
|
118
|
+
console.log(formatEventLine(event, { fulltime: options.fulltime }));
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
catch (error) {
|
|
122
|
+
if (error instanceof Error && error.message.includes('no such table')) {
|
|
123
|
+
console.log('No data yet. Run a scan first.');
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
throw error;
|
|
127
|
+
}
|
|
128
|
+
});
|
|
129
|
+
// export events
|
|
130
|
+
cmd
|
|
131
|
+
.command('export')
|
|
132
|
+
.description('Export events to file')
|
|
133
|
+
.requiredOption('-o, --output <file>', 'Output file path')
|
|
134
|
+
.option('--format <format>', 'Output format: jsonl, csv', 'jsonl')
|
|
135
|
+
.option('--limit <n>', 'Maximum number of events', '1000')
|
|
136
|
+
.option('--since <time>', 'Export events since (24h, 7d, YYYY-MM-DD)')
|
|
137
|
+
.option('--connector <id>', 'Filter by connector ID')
|
|
138
|
+
.option('--session <id>', 'Filter by session ID')
|
|
139
|
+
.option('--method <pattern>', 'Filter by method name')
|
|
140
|
+
.option('--errors', 'Export only errors')
|
|
141
|
+
.action(async (options) => {
|
|
142
|
+
try {
|
|
143
|
+
const manager = new ConfigManager(getConfigPath());
|
|
144
|
+
const store = new EventLineStore(manager.getConfigDir());
|
|
145
|
+
const events = store.getRecentEvents({
|
|
146
|
+
limit: parseInt(options.limit, 10),
|
|
147
|
+
since: options.since,
|
|
148
|
+
connector: options.connector,
|
|
149
|
+
session: options.session,
|
|
150
|
+
method: options.method,
|
|
151
|
+
errors: options.errors,
|
|
152
|
+
});
|
|
153
|
+
if (events.length === 0) {
|
|
154
|
+
console.log('No events to export.');
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
// Create output stream
|
|
158
|
+
const stream = createWriteStream(options.output);
|
|
159
|
+
// Write based on format
|
|
160
|
+
if (options.format === 'csv') {
|
|
161
|
+
stream.write(getCSVHeader() + '\n');
|
|
162
|
+
for (const event of events) {
|
|
163
|
+
stream.write(eventToCSV(event) + '\n');
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
// Default: JSONL
|
|
168
|
+
for (const event of events) {
|
|
169
|
+
stream.write(eventToJSONL(event) + '\n');
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
stream.end();
|
|
173
|
+
console.log(`Exported ${events.length} events to ${options.output} (${options.format})`);
|
|
174
|
+
}
|
|
175
|
+
catch (error) {
|
|
176
|
+
if (error instanceof Error && error.message.includes('no such table')) {
|
|
177
|
+
console.log('No data yet. Run a scan first.');
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
throw error;
|
|
181
|
+
}
|
|
182
|
+
});
|
|
183
|
+
return cmd;
|
|
184
|
+
}
|
|
185
|
+
//# sourceMappingURL=events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/commands/events.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Explore command - interactive navigation through data
|
|
3
|
+
*
|
|
4
|
+
* Simple stdin/stdout TUI for exploring connector → session → rpc → detail
|
|
5
|
+
*/
|
|
6
|
+
import { Command } from 'commander';
|
|
7
|
+
export declare function createExploreCommand(getConfigPath: () => string): Command;
|
|
8
|
+
export { createExploreCommand as createECommand };
|
|
9
|
+
//# sourceMappingURL=explore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"explore.d.ts","sourceRoot":"","sources":["../../src/commands/explore.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAyWpC,wBAAgB,oBAAoB,CAAC,aAAa,EAAE,MAAM,MAAM,GAAG,OAAO,CA6BzE;AAGD,OAAO,EAAE,oBAAoB,IAAI,cAAc,EAAE,CAAC"}
|