projscan 1.3.0 → 1.4.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 +87 -5
- package/dist/cli/commands/session.d.ts +12 -0
- package/dist/cli/commands/session.js +200 -0
- package/dist/cli/commands/session.js.map +1 -0
- package/dist/cli/index.js +2 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/core/session.d.ts +94 -0
- package/dist/core/session.js +187 -0
- package/dist/core/session.js.map +1 -0
- package/dist/mcp/server.js +55 -1
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/sessionTouchScanner.d.ts +16 -0
- package/dist/mcp/sessionTouchScanner.js +112 -0
- package/dist/mcp/sessionTouchScanner.js.map +1 -0
- package/dist/mcp/tools/session.d.ts +22 -0
- package/dist/mcp/tools/session.js +140 -0
- package/dist/mcp/tools/session.js.map +1 -0
- package/dist/mcp/tools.js +2 -0
- package/dist/mcp/tools.js.map +1 -1
- package/dist/tool-manifest.json +39 -3
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
|
|
21
21
|
AI coding agents are becoming the primary interface to code. Today, when you ask your agent *"which files implement auth?"* or *"what breaks if I bump React from 18 to 19?"* - it either guesses from names, or it shells out to grep and reads raw output not built for it.
|
|
22
22
|
|
|
23
|
-
**projscan is the first code-intelligence tool built for agents, not for humans.** Your agent gets a fast, AST-accurate, context-budget-aware view of your codebase through
|
|
23
|
+
**projscan is the first code-intelligence tool built for agents, not for humans.** Your agent gets a fast, AST-accurate, context-budget-aware view of your codebase through 21 structured MCP tools. It can query the import graph, find symbol definitions, preview upgrades, rank hotspots, diff structural changes between refs, surface coupling/cycle hotspots, get a one-call PR review, request structured fix-action prompts for any open issue, ask "what breaks if I change this?" via transitive blast-radius analysis, and share a durable session across multiple agent invocations - without loading the file tree into its context.
|
|
24
24
|
|
|
25
25
|
Humans get the same thing through the CLI.
|
|
26
26
|
|
|
@@ -515,25 +515,104 @@ Coverage is also automatically joined into `projscan hotspots` when one of those
|
|
|
515
515
|
|
|
516
516
|
**This is the primary way to use projscan.** `projscan mcp` starts an [MCP](https://modelcontextprotocol.io) server over stdio so AI coding agents can query your codebase with real structural accuracy - not regex, not grep.
|
|
517
517
|
|
|
518
|
+
<img src="docs/projscan-agent-demo.gif" alt="projscan answering two agent questions: what breaks if I rename buildCodeGraph (impact analysis with definitions, direct callers, transitive reach), and where should I fix first (ranked hotspots with cyclomatic complexity)" width="700">
|
|
519
|
+
|
|
520
|
+
Two questions an agent asks; structural answers in milliseconds. *"What breaks if I rename `buildCodeGraph`?"* → 31 direct callers, 97 files reachable. *"Where should I fix first?"* → ranked hotspots with AST cyclomatic complexity, churn, and ownership signals.
|
|
521
|
+
|
|
518
522
|
### Claude Code
|
|
519
523
|
|
|
524
|
+
One-liner — adds projscan as an MCP server in the current project:
|
|
525
|
+
|
|
520
526
|
```bash
|
|
521
|
-
claude mcp add projscan -- npx projscan mcp
|
|
527
|
+
claude mcp add projscan -- npx -y projscan mcp
|
|
528
|
+
```
|
|
529
|
+
|
|
530
|
+
### Cursor
|
|
531
|
+
|
|
532
|
+
Add to `~/.cursor/mcp.json` (global) or `.cursor/mcp.json` (per-project):
|
|
533
|
+
|
|
534
|
+
```json
|
|
535
|
+
{
|
|
536
|
+
"mcpServers": {
|
|
537
|
+
"projscan": {
|
|
538
|
+
"command": "npx",
|
|
539
|
+
"args": ["-y", "projscan", "mcp"]
|
|
540
|
+
}
|
|
541
|
+
}
|
|
542
|
+
}
|
|
543
|
+
```
|
|
544
|
+
|
|
545
|
+
### Windsurf
|
|
546
|
+
|
|
547
|
+
Add to `~/.codeium/windsurf/mcp_config.json`:
|
|
548
|
+
|
|
549
|
+
```json
|
|
550
|
+
{
|
|
551
|
+
"mcpServers": {
|
|
552
|
+
"projscan": {
|
|
553
|
+
"command": "npx",
|
|
554
|
+
"args": ["-y", "projscan", "mcp"]
|
|
555
|
+
}
|
|
556
|
+
}
|
|
557
|
+
}
|
|
522
558
|
```
|
|
523
559
|
|
|
524
|
-
###
|
|
560
|
+
### Cline (VS Code extension)
|
|
561
|
+
|
|
562
|
+
In Cline's MCP settings panel (or the underlying `cline_mcp_settings.json`):
|
|
525
563
|
|
|
526
564
|
```json
|
|
527
565
|
{
|
|
528
566
|
"mcpServers": {
|
|
529
567
|
"projscan": {
|
|
530
568
|
"command": "npx",
|
|
531
|
-
"args": ["projscan", "mcp"]
|
|
569
|
+
"args": ["-y", "projscan", "mcp"]
|
|
532
570
|
}
|
|
533
571
|
}
|
|
534
572
|
}
|
|
535
573
|
```
|
|
536
574
|
|
|
575
|
+
### Continue.dev
|
|
576
|
+
|
|
577
|
+
Add to `~/.continue/config.yaml`:
|
|
578
|
+
|
|
579
|
+
```yaml
|
|
580
|
+
mcpServers:
|
|
581
|
+
- name: projscan
|
|
582
|
+
command: npx
|
|
583
|
+
args:
|
|
584
|
+
- -y
|
|
585
|
+
- projscan
|
|
586
|
+
- mcp
|
|
587
|
+
```
|
|
588
|
+
|
|
589
|
+
### Zed
|
|
590
|
+
|
|
591
|
+
Add to `~/.config/zed/settings.json` under `context_servers`:
|
|
592
|
+
|
|
593
|
+
```json
|
|
594
|
+
{
|
|
595
|
+
"context_servers": {
|
|
596
|
+
"projscan": {
|
|
597
|
+
"command": {
|
|
598
|
+
"path": "npx",
|
|
599
|
+
"args": ["-y", "projscan", "mcp"]
|
|
600
|
+
}
|
|
601
|
+
}
|
|
602
|
+
}
|
|
603
|
+
}
|
|
604
|
+
```
|
|
605
|
+
|
|
606
|
+
### Any other MCP-aware client
|
|
607
|
+
|
|
608
|
+
The transport is **stdio**. Wire your client to invoke `npx -y projscan mcp` as a subprocess; the server speaks JSON-RPC 2.0 over stdin/stdout. If your client wants `notifications/file_changed` push notifications when the repo changes, append `--watch`:
|
|
609
|
+
|
|
610
|
+
```bash
|
|
611
|
+
npx -y projscan mcp --watch
|
|
612
|
+
```
|
|
613
|
+
|
|
614
|
+
Capability is advertised under `experimental.fileChanged` on `initialize` so clients can detect support.
|
|
615
|
+
|
|
537
616
|
### What agents can ask
|
|
538
617
|
|
|
539
618
|
- *"Who imports `src/auth/jwt.ts`?"* → `projscan_graph { file, direction: "importers" }`
|
|
@@ -543,7 +622,7 @@ claude mcp add projscan -- npx projscan mcp
|
|
|
543
622
|
- *"What breaks if I bump chalk to 6?"* → `projscan_upgrade { package: "chalk" }`
|
|
544
623
|
- *"Where should I refactor first?"* → `projscan_hotspots`
|
|
545
624
|
|
|
546
|
-
### The
|
|
625
|
+
### The 21 MCP tools
|
|
547
626
|
|
|
548
627
|
**Structural (0.6.0 / 0.11 / 0.13 / 0.14 / 0.15 - agent-native):**
|
|
549
628
|
- **`projscan_graph`** - query the AST-based code graph. Directions: `imports`, `exports`, `importers`, `symbol_defs`, `package_importers`. Millisecond responses on a warm cache.
|
|
@@ -573,6 +652,9 @@ claude mcp add projscan -- npx projscan mcp
|
|
|
573
652
|
**Workspace (0.11):**
|
|
574
653
|
- `projscan_workspaces` - list monorepo packages (npm/yarn/pnpm/Nx/Turbo/Lerna). Use the `name` as the `package` arg on `projscan_hotspots` / `projscan_coupling` to scope.
|
|
575
654
|
|
|
655
|
+
**Session (1.4):**
|
|
656
|
+
- **`projscan_session`** *(1.4)* - durable cross-invocation session. Subactions: `current` (id + counts), `touched` (files touched this session, sorted by recency, filterable by source: `tool-result` / `fs-watch` / `explicit`), `events` (chronological log), `reset` (start a fresh session). Auto-populated from every tool result and from `notifications/file_changed` push events when `--watch` is on. Lets multiple agents in the same project see "what's been touched here" without re-running git.
|
|
657
|
+
|
|
576
658
|
### Context-window budgeting
|
|
577
659
|
|
|
578
660
|
**Every MCP tool accepts an optional `max_tokens` argument.** Set it and projscan serializes the result, and - if over budget - truncates the largest array field record-by-record until it fits. Responses include a `_budget` sidecar when truncated so your agent knows it got a partial view.
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `projscan session` — inspect the durable cross-invocation session that
|
|
3
|
+
* the MCP server populates as agents work. Mirrors the `projscan_session`
|
|
4
|
+
* MCP tool but for terminal use.
|
|
5
|
+
*
|
|
6
|
+
* Subcommands:
|
|
7
|
+
* projscan session — current session summary (default)
|
|
8
|
+
* projscan session touched — list files touched this session
|
|
9
|
+
* projscan session events — chronological event log
|
|
10
|
+
* projscan session reset — discard the current session
|
|
11
|
+
*/
|
|
12
|
+
export declare function registerSession(): void;
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { program, getRootPath, getFormat, setupLogLevel, maybeCompactBanner } from '../_shared.js';
|
|
3
|
+
import { loadSession, resetSession, } from '../../core/session.js';
|
|
4
|
+
/**
|
|
5
|
+
* `projscan session` — inspect the durable cross-invocation session that
|
|
6
|
+
* the MCP server populates as agents work. Mirrors the `projscan_session`
|
|
7
|
+
* MCP tool but for terminal use.
|
|
8
|
+
*
|
|
9
|
+
* Subcommands:
|
|
10
|
+
* projscan session — current session summary (default)
|
|
11
|
+
* projscan session touched — list files touched this session
|
|
12
|
+
* projscan session events — chronological event log
|
|
13
|
+
* projscan session reset — discard the current session
|
|
14
|
+
*/
|
|
15
|
+
export function registerSession() {
|
|
16
|
+
const session = program
|
|
17
|
+
.command('session')
|
|
18
|
+
.description('Inspect or reset the durable cross-invocation session (1.4+)')
|
|
19
|
+
.action(async () => {
|
|
20
|
+
await runSummary();
|
|
21
|
+
});
|
|
22
|
+
session
|
|
23
|
+
.command('touched')
|
|
24
|
+
.description('List files touched this session (sorted by last-touched desc)')
|
|
25
|
+
.option('--source <source>', 'restrict to tool-result | fs-watch | explicit')
|
|
26
|
+
.option('--limit <n>', 'show at most N entries', (v) => parseInt(v, 10))
|
|
27
|
+
.action(async (opts) => {
|
|
28
|
+
await runTouched(opts);
|
|
29
|
+
});
|
|
30
|
+
session
|
|
31
|
+
.command('events')
|
|
32
|
+
.description('Show the session event log, newest first')
|
|
33
|
+
.option('--limit <n>', 'show at most N entries', (v) => parseInt(v, 10))
|
|
34
|
+
.action(async (opts) => {
|
|
35
|
+
await runEvents(opts);
|
|
36
|
+
});
|
|
37
|
+
session
|
|
38
|
+
.command('reset')
|
|
39
|
+
.description('Discard the current session and start a fresh one')
|
|
40
|
+
.action(async () => {
|
|
41
|
+
await runReset();
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
async function runSummary() {
|
|
45
|
+
setupLogLevel();
|
|
46
|
+
maybeCompactBanner();
|
|
47
|
+
const rootPath = getRootPath();
|
|
48
|
+
const format = getFormat();
|
|
49
|
+
try {
|
|
50
|
+
const { session: sess, created } = await loadSession(rootPath);
|
|
51
|
+
if (format === 'json') {
|
|
52
|
+
console.log(JSON.stringify({ session: sess, created }, null, 2));
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
printSummary(sess, created);
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
console.error(chalk.red(error instanceof Error ? error.message : String(error)));
|
|
59
|
+
process.exit(1);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
async function runTouched(opts) {
|
|
63
|
+
setupLogLevel();
|
|
64
|
+
maybeCompactBanner();
|
|
65
|
+
const rootPath = getRootPath();
|
|
66
|
+
const format = getFormat();
|
|
67
|
+
try {
|
|
68
|
+
const { session: sess } = await loadSession(rootPath);
|
|
69
|
+
const all = Object.values(sess.touchedFiles);
|
|
70
|
+
const filtered = opts.source ? all.filter((t) => t.source === opts.source) : all;
|
|
71
|
+
filtered.sort((a, b) => b.lastTouchedAt.localeCompare(a.lastTouchedAt));
|
|
72
|
+
const limited = typeof opts.limit === 'number' && opts.limit > 0 ? filtered.slice(0, opts.limit) : filtered;
|
|
73
|
+
if (format === 'json') {
|
|
74
|
+
console.log(JSON.stringify({ sessionId: sess.id, total: filtered.length, touched: limited }, null, 2));
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
printTouched(sess, limited, filtered.length);
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
console.error(chalk.red(error instanceof Error ? error.message : String(error)));
|
|
81
|
+
process.exit(1);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
async function runEvents(opts) {
|
|
85
|
+
setupLogLevel();
|
|
86
|
+
maybeCompactBanner();
|
|
87
|
+
const rootPath = getRootPath();
|
|
88
|
+
const format = getFormat();
|
|
89
|
+
try {
|
|
90
|
+
const { session: sess } = await loadSession(rootPath);
|
|
91
|
+
const reversed = [...sess.events].reverse();
|
|
92
|
+
const limited = typeof opts.limit === 'number' && opts.limit > 0 ? reversed.slice(0, opts.limit) : reversed;
|
|
93
|
+
if (format === 'json') {
|
|
94
|
+
console.log(JSON.stringify({ sessionId: sess.id, total: reversed.length, events: limited }, null, 2));
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
printEvents(sess, limited, reversed.length);
|
|
98
|
+
}
|
|
99
|
+
catch (error) {
|
|
100
|
+
console.error(chalk.red(error instanceof Error ? error.message : String(error)));
|
|
101
|
+
process.exit(1);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
async function runReset() {
|
|
105
|
+
setupLogLevel();
|
|
106
|
+
maybeCompactBanner();
|
|
107
|
+
const rootPath = getRootPath();
|
|
108
|
+
const format = getFormat();
|
|
109
|
+
try {
|
|
110
|
+
const fresh = await resetSession(rootPath);
|
|
111
|
+
if (format === 'json') {
|
|
112
|
+
console.log(JSON.stringify({ reset: true, session: fresh }, null, 2));
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
console.log(chalk.green('✓ Session reset.'));
|
|
116
|
+
console.log(` New session id: ${fresh.id}`);
|
|
117
|
+
console.log(` Started at: ${fresh.startedAt}`);
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
console.error(chalk.red(error instanceof Error ? error.message : String(error)));
|
|
121
|
+
process.exit(1);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
function printSummary(session, created) {
|
|
125
|
+
const startedAtMs = Date.parse(session.startedAt);
|
|
126
|
+
const ageMs = Number.isFinite(startedAtMs) ? Date.now() - startedAtMs : null;
|
|
127
|
+
console.log('');
|
|
128
|
+
console.log(chalk.bold('Session'));
|
|
129
|
+
console.log(chalk.dim('────────────────────────────────────────'));
|
|
130
|
+
console.log(` id: ${session.id}`);
|
|
131
|
+
console.log(` status: ${created ? chalk.cyan('fresh (just created)') : chalk.green('active')}`);
|
|
132
|
+
console.log(` started: ${session.startedAt}`);
|
|
133
|
+
console.log(` last activity: ${session.lastActivityAt}`);
|
|
134
|
+
if (ageMs !== null) {
|
|
135
|
+
console.log(` age: ${formatDuration(ageMs)}`);
|
|
136
|
+
}
|
|
137
|
+
console.log('');
|
|
138
|
+
console.log(` touched files: ${Object.keys(session.touchedFiles).length}`);
|
|
139
|
+
console.log(` events: ${session.events.length}`);
|
|
140
|
+
console.log('');
|
|
141
|
+
console.log(chalk.dim(' Tip: run `projscan session touched` for the file list.'));
|
|
142
|
+
}
|
|
143
|
+
function printTouched(session, items, total) {
|
|
144
|
+
console.log('');
|
|
145
|
+
console.log(chalk.bold(`Touched files (${session.id.slice(0, 8)})`));
|
|
146
|
+
console.log(chalk.dim('────────────────────────────────────────'));
|
|
147
|
+
if (items.length === 0) {
|
|
148
|
+
console.log(chalk.dim(' No files touched in this session yet.'));
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
for (const t of items) {
|
|
152
|
+
const sourceTag = formatSourceTag(t.source);
|
|
153
|
+
console.log(` ${sourceTag} ${t.file} ${chalk.dim(`(×${t.count}, ${t.lastTouchedAt})`)}`);
|
|
154
|
+
}
|
|
155
|
+
if (items.length < total) {
|
|
156
|
+
console.log('');
|
|
157
|
+
console.log(chalk.dim(` ${total - items.length} more — pass --limit ${total} to see all.`));
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
function printEvents(session, items, total) {
|
|
161
|
+
console.log('');
|
|
162
|
+
console.log(chalk.bold(`Events (${session.id.slice(0, 8)})`));
|
|
163
|
+
console.log(chalk.dim('────────────────────────────────────────'));
|
|
164
|
+
if (items.length === 0) {
|
|
165
|
+
console.log(chalk.dim(' No events recorded in this session yet.'));
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
for (const e of items) {
|
|
169
|
+
console.log(` ${chalk.dim(e.at)} ${e.kind}`);
|
|
170
|
+
}
|
|
171
|
+
if (items.length < total) {
|
|
172
|
+
console.log('');
|
|
173
|
+
console.log(chalk.dim(` ${total - items.length} more — pass --limit ${total} to see all.`));
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
function formatSourceTag(source) {
|
|
177
|
+
switch (source) {
|
|
178
|
+
case 'tool-result':
|
|
179
|
+
return chalk.cyan('[tool] ');
|
|
180
|
+
case 'fs-watch':
|
|
181
|
+
return chalk.yellow('[fs-watch]');
|
|
182
|
+
case 'explicit':
|
|
183
|
+
return chalk.magenta('[explicit]');
|
|
184
|
+
default:
|
|
185
|
+
return chalk.dim('[unknown] ');
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
function formatDuration(ms) {
|
|
189
|
+
if (ms < 1000)
|
|
190
|
+
return `${ms}ms`;
|
|
191
|
+
const seconds = Math.floor(ms / 1000);
|
|
192
|
+
if (seconds < 60)
|
|
193
|
+
return `${seconds}s`;
|
|
194
|
+
const minutes = Math.floor(seconds / 60);
|
|
195
|
+
if (minutes < 60)
|
|
196
|
+
return `${minutes}m ${seconds % 60}s`;
|
|
197
|
+
const hours = Math.floor(minutes / 60);
|
|
198
|
+
return `${hours}h ${minutes % 60}m`;
|
|
199
|
+
}
|
|
200
|
+
//# sourceMappingURL=session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/cli/commands/session.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/index.js
CHANGED
|
@@ -25,6 +25,7 @@ import { registerUpgrade } from './commands/upgrade.js';
|
|
|
25
25
|
import { registerSearch } from './commands/search.js';
|
|
26
26
|
import { registerCoverage } from './commands/coverage.js';
|
|
27
27
|
import { registerMcp } from './commands/mcp.js';
|
|
28
|
+
import { registerSession } from './commands/session.js';
|
|
28
29
|
import { registerBadge } from './commands/badge.js';
|
|
29
30
|
import { registerHelp } from './commands/help.js';
|
|
30
31
|
registerAnalyze();
|
|
@@ -52,6 +53,7 @@ registerUpgrade();
|
|
|
52
53
|
registerSearch();
|
|
53
54
|
registerCoverage();
|
|
54
55
|
registerMcp();
|
|
56
|
+
registerSession();
|
|
55
57
|
registerBadge();
|
|
56
58
|
registerHelp();
|
|
57
59
|
program.parse();
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,eAAe,EAAE,CAAC;AAClB,cAAc,EAAE,CAAC;AACjB,UAAU,EAAE,CAAC;AACb,YAAY,EAAE,CAAC;AACf,WAAW,EAAE,CAAC;AACd,YAAY,EAAE,CAAC;AACf,eAAe,EAAE,CAAC;AAClB,eAAe,EAAE,CAAC;AAClB,iBAAiB,EAAE,CAAC;AACpB,oBAAoB,EAAE,CAAC;AACvB,gBAAgB,EAAE,CAAC;AACnB,gBAAgB,EAAE,CAAC;AACnB,cAAc,EAAE,CAAC;AACjB,cAAc,EAAE,CAAC;AACjB,kBAAkB,EAAE,CAAC;AACrB,oBAAoB,EAAE,CAAC;AACvB,cAAc,EAAE,CAAC;AACjB,aAAa,EAAE,CAAC;AAChB,kBAAkB,EAAE,CAAC;AACrB,gBAAgB,EAAE,CAAC;AACnB,aAAa,EAAE,CAAC;AAChB,eAAe,EAAE,CAAC;AAClB,cAAc,EAAE,CAAC;AACjB,gBAAgB,EAAE,CAAC;AACnB,WAAW,EAAE,CAAC;AACd,aAAa,EAAE,CAAC;AAChB,YAAY,EAAE,CAAC;AAEf,OAAO,CAAC,KAAK,EAAE,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,eAAe,EAAE,CAAC;AAClB,cAAc,EAAE,CAAC;AACjB,UAAU,EAAE,CAAC;AACb,YAAY,EAAE,CAAC;AACf,WAAW,EAAE,CAAC;AACd,YAAY,EAAE,CAAC;AACf,eAAe,EAAE,CAAC;AAClB,eAAe,EAAE,CAAC;AAClB,iBAAiB,EAAE,CAAC;AACpB,oBAAoB,EAAE,CAAC;AACvB,gBAAgB,EAAE,CAAC;AACnB,gBAAgB,EAAE,CAAC;AACnB,cAAc,EAAE,CAAC;AACjB,cAAc,EAAE,CAAC;AACjB,kBAAkB,EAAE,CAAC;AACrB,oBAAoB,EAAE,CAAC;AACvB,cAAc,EAAE,CAAC;AACjB,aAAa,EAAE,CAAC;AAChB,kBAAkB,EAAE,CAAC;AACrB,gBAAgB,EAAE,CAAC;AACnB,aAAa,EAAE,CAAC;AAChB,eAAe,EAAE,CAAC;AAClB,cAAc,EAAE,CAAC;AACjB,gBAAgB,EAAE,CAAC;AACnB,WAAW,EAAE,CAAC;AACd,eAAe,EAAE,CAAC;AAClB,aAAa,EAAE,CAAC;AAChB,YAAY,EAAE,CAAC;AAEf,OAAO,CAAC,KAAK,EAAE,CAAC"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session — durable cross-invocation state for projscan (1.4+).
|
|
3
|
+
*
|
|
4
|
+
* Persisted at `.projscan-cache/session.json`. A new session starts when
|
|
5
|
+
* the previous session has been idle for longer than `IDLE_TIMEOUT_MS`
|
|
6
|
+
* (default 1 hour) or when none exists. Multiple agents calling the MCP
|
|
7
|
+
* server against the same project share the same session as long as
|
|
8
|
+
* they're within the idle window.
|
|
9
|
+
*
|
|
10
|
+
* Session purpose: let one agent answer "what has been touched since I
|
|
11
|
+
* arrived?" without having to call git or grep. Touched files come from
|
|
12
|
+
* (a) tool results that surface file paths, and (b) `notifications/file_changed`
|
|
13
|
+
* push events from `projscan mcp --watch`.
|
|
14
|
+
*
|
|
15
|
+
* Schema is versioned (`schemaVersion`) so future evolution can detect
|
|
16
|
+
* and migrate older session files instead of crashing.
|
|
17
|
+
*/
|
|
18
|
+
export declare const SESSION_SCHEMA_VERSION = 1;
|
|
19
|
+
export declare const DEFAULT_IDLE_TIMEOUT_MS: number;
|
|
20
|
+
export type TouchSource = 'tool-result' | 'fs-watch' | 'explicit';
|
|
21
|
+
export interface SessionTouch {
|
|
22
|
+
/** Repo-relative path. Always POSIX-separator (`/`). */
|
|
23
|
+
file: string;
|
|
24
|
+
/** Where the touch came from. */
|
|
25
|
+
source: TouchSource;
|
|
26
|
+
/** ISO 8601 timestamp of the most recent touch. */
|
|
27
|
+
lastTouchedAt: string;
|
|
28
|
+
/** Total times this file has been touched in this session. */
|
|
29
|
+
count: number;
|
|
30
|
+
}
|
|
31
|
+
export interface SessionEvent {
|
|
32
|
+
/** ISO 8601 timestamp. */
|
|
33
|
+
at: string;
|
|
34
|
+
/** Free-form kind tag (e.g., "tool-call:projscan_hotspots"). */
|
|
35
|
+
kind: string;
|
|
36
|
+
/** Optional structured payload. */
|
|
37
|
+
data?: Record<string, unknown>;
|
|
38
|
+
}
|
|
39
|
+
export interface Session {
|
|
40
|
+
schemaVersion: number;
|
|
41
|
+
/** UUID assigned at session creation. Stable until idle expiry. */
|
|
42
|
+
id: string;
|
|
43
|
+
/** ISO 8601. */
|
|
44
|
+
startedAt: string;
|
|
45
|
+
/** ISO 8601. Updated on every recordTouch / recordEvent / save. */
|
|
46
|
+
lastActivityAt: string;
|
|
47
|
+
/** Map keyed by repo-relative file path. */
|
|
48
|
+
touchedFiles: Record<string, SessionTouch>;
|
|
49
|
+
/** Bounded event log. Caps at MAX_EVENTS most-recent. */
|
|
50
|
+
events: SessionEvent[];
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Load the session for `rootPath`. If the on-disk session has been idle
|
|
54
|
+
* for longer than `idleTimeoutMs`, returns a fresh session. If no session
|
|
55
|
+
* exists, returns a fresh session. Failures to read or parse the file
|
|
56
|
+
* (corruption, schema mismatch) also produce a fresh session — this
|
|
57
|
+
* function never throws under normal operation.
|
|
58
|
+
*
|
|
59
|
+
* Returns the session object PLUS a `created` flag so the caller can tell
|
|
60
|
+
* whether they're attaching to an existing session or starting a new one.
|
|
61
|
+
*/
|
|
62
|
+
export declare function loadSession(rootPath: string, idleTimeoutMs?: number): Promise<{
|
|
63
|
+
session: Session;
|
|
64
|
+
created: boolean;
|
|
65
|
+
}>;
|
|
66
|
+
/**
|
|
67
|
+
* Record a file touch in-place on the session. Updates the per-file
|
|
68
|
+
* count + lastTouchedAt and the session's lastActivityAt. Caller is
|
|
69
|
+
* responsible for `saveSession()` afterwards (batched persist).
|
|
70
|
+
*
|
|
71
|
+
* `file` should be repo-relative POSIX-separator. Paths with `..` or
|
|
72
|
+
* absolute paths are silently ignored — sessions only track in-repo state.
|
|
73
|
+
*/
|
|
74
|
+
export declare function recordTouch(session: Session, file: string, source: TouchSource): void;
|
|
75
|
+
/**
|
|
76
|
+
* Append an event to the session's bounded log. The log keeps the last
|
|
77
|
+
* MAX_EVENTS entries and drops the oldest when over capacity.
|
|
78
|
+
*/
|
|
79
|
+
export declare function recordEvent(session: Session, kind: string, data?: Record<string, unknown>): void;
|
|
80
|
+
/**
|
|
81
|
+
* Persist the session to disk. Best-effort; failures are swallowed so
|
|
82
|
+
* a transient write error doesn't break the calling tool.
|
|
83
|
+
*
|
|
84
|
+
* Last-write-wins semantics for now. If two MCP servers run against the
|
|
85
|
+
* same repo concurrently, the later writer overwrites the earlier; this
|
|
86
|
+
* is acceptable for the v1 scope (the multi-process case is rare and the
|
|
87
|
+
* downside is just a slightly stale touched-file count, not corruption).
|
|
88
|
+
*/
|
|
89
|
+
export declare function saveSession(rootPath: string, session: Session): Promise<void>;
|
|
90
|
+
/**
|
|
91
|
+
* Reset the session: discard the on-disk file and return a fresh one.
|
|
92
|
+
* Useful for the `projscan_session { action: "reset" }` MCP path.
|
|
93
|
+
*/
|
|
94
|
+
export declare function resetSession(rootPath: string): Promise<Session>;
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
import fs from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { randomUUID } from 'node:crypto';
|
|
4
|
+
/**
|
|
5
|
+
* Session — durable cross-invocation state for projscan (1.4+).
|
|
6
|
+
*
|
|
7
|
+
* Persisted at `.projscan-cache/session.json`. A new session starts when
|
|
8
|
+
* the previous session has been idle for longer than `IDLE_TIMEOUT_MS`
|
|
9
|
+
* (default 1 hour) or when none exists. Multiple agents calling the MCP
|
|
10
|
+
* server against the same project share the same session as long as
|
|
11
|
+
* they're within the idle window.
|
|
12
|
+
*
|
|
13
|
+
* Session purpose: let one agent answer "what has been touched since I
|
|
14
|
+
* arrived?" without having to call git or grep. Touched files come from
|
|
15
|
+
* (a) tool results that surface file paths, and (b) `notifications/file_changed`
|
|
16
|
+
* push events from `projscan mcp --watch`.
|
|
17
|
+
*
|
|
18
|
+
* Schema is versioned (`schemaVersion`) so future evolution can detect
|
|
19
|
+
* and migrate older session files instead of crashing.
|
|
20
|
+
*/
|
|
21
|
+
export const SESSION_SCHEMA_VERSION = 1;
|
|
22
|
+
export const DEFAULT_IDLE_TIMEOUT_MS = 60 * 60 * 1000; // 1 hour
|
|
23
|
+
const SESSION_DIR = '.projscan-cache';
|
|
24
|
+
const SESSION_FILENAME = 'session.json';
|
|
25
|
+
const MAX_EVENTS = 500;
|
|
26
|
+
/**
|
|
27
|
+
* Load the session for `rootPath`. If the on-disk session has been idle
|
|
28
|
+
* for longer than `idleTimeoutMs`, returns a fresh session. If no session
|
|
29
|
+
* exists, returns a fresh session. Failures to read or parse the file
|
|
30
|
+
* (corruption, schema mismatch) also produce a fresh session — this
|
|
31
|
+
* function never throws under normal operation.
|
|
32
|
+
*
|
|
33
|
+
* Returns the session object PLUS a `created` flag so the caller can tell
|
|
34
|
+
* whether they're attaching to an existing session or starting a new one.
|
|
35
|
+
*/
|
|
36
|
+
export async function loadSession(rootPath, idleTimeoutMs = DEFAULT_IDLE_TIMEOUT_MS) {
|
|
37
|
+
const filePath = sessionFilePath(rootPath);
|
|
38
|
+
const now = new Date();
|
|
39
|
+
let raw;
|
|
40
|
+
try {
|
|
41
|
+
raw = await fs.readFile(filePath, 'utf-8');
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
return { session: createFreshSession(now), created: true };
|
|
45
|
+
}
|
|
46
|
+
let parsed;
|
|
47
|
+
try {
|
|
48
|
+
parsed = JSON.parse(raw);
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
return { session: createFreshSession(now), created: true };
|
|
52
|
+
}
|
|
53
|
+
if (!isSessionShape(parsed)) {
|
|
54
|
+
return { session: createFreshSession(now), created: true };
|
|
55
|
+
}
|
|
56
|
+
// Schema-version gate: if a future writer bumps the version we don't
|
|
57
|
+
// understand, treat it as a fresh session rather than corrupting their
|
|
58
|
+
// newer data.
|
|
59
|
+
if (parsed.schemaVersion !== SESSION_SCHEMA_VERSION) {
|
|
60
|
+
return { session: createFreshSession(now), created: true };
|
|
61
|
+
}
|
|
62
|
+
const lastActivityMs = Date.parse(parsed.lastActivityAt);
|
|
63
|
+
if (!Number.isFinite(lastActivityMs) ||
|
|
64
|
+
now.getTime() - lastActivityMs > idleTimeoutMs) {
|
|
65
|
+
return { session: createFreshSession(now), created: true };
|
|
66
|
+
}
|
|
67
|
+
return { session: parsed, created: false };
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Record a file touch in-place on the session. Updates the per-file
|
|
71
|
+
* count + lastTouchedAt and the session's lastActivityAt. Caller is
|
|
72
|
+
* responsible for `saveSession()` afterwards (batched persist).
|
|
73
|
+
*
|
|
74
|
+
* `file` should be repo-relative POSIX-separator. Paths with `..` or
|
|
75
|
+
* absolute paths are silently ignored — sessions only track in-repo state.
|
|
76
|
+
*/
|
|
77
|
+
export function recordTouch(session, file, source) {
|
|
78
|
+
const normalized = normalizeFile(file);
|
|
79
|
+
if (!normalized)
|
|
80
|
+
return;
|
|
81
|
+
const nowIso = new Date().toISOString();
|
|
82
|
+
const existing = session.touchedFiles[normalized];
|
|
83
|
+
if (existing) {
|
|
84
|
+
existing.count += 1;
|
|
85
|
+
existing.lastTouchedAt = nowIso;
|
|
86
|
+
// First-seen source wins; promotes 'fs-watch' over a later 'tool-result'
|
|
87
|
+
// if the watcher saw the file first. This is mostly informational.
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
session.touchedFiles[normalized] = {
|
|
91
|
+
file: normalized,
|
|
92
|
+
source,
|
|
93
|
+
lastTouchedAt: nowIso,
|
|
94
|
+
count: 1,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
session.lastActivityAt = nowIso;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Append an event to the session's bounded log. The log keeps the last
|
|
101
|
+
* MAX_EVENTS entries and drops the oldest when over capacity.
|
|
102
|
+
*/
|
|
103
|
+
export function recordEvent(session, kind, data) {
|
|
104
|
+
const event = {
|
|
105
|
+
at: new Date().toISOString(),
|
|
106
|
+
kind,
|
|
107
|
+
...(data ? { data } : {}),
|
|
108
|
+
};
|
|
109
|
+
session.events.push(event);
|
|
110
|
+
if (session.events.length > MAX_EVENTS) {
|
|
111
|
+
session.events = session.events.slice(-MAX_EVENTS);
|
|
112
|
+
}
|
|
113
|
+
session.lastActivityAt = event.at;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Persist the session to disk. Best-effort; failures are swallowed so
|
|
117
|
+
* a transient write error doesn't break the calling tool.
|
|
118
|
+
*
|
|
119
|
+
* Last-write-wins semantics for now. If two MCP servers run against the
|
|
120
|
+
* same repo concurrently, the later writer overwrites the earlier; this
|
|
121
|
+
* is acceptable for the v1 scope (the multi-process case is rare and the
|
|
122
|
+
* downside is just a slightly stale touched-file count, not corruption).
|
|
123
|
+
*/
|
|
124
|
+
export async function saveSession(rootPath, session) {
|
|
125
|
+
try {
|
|
126
|
+
const dir = path.join(rootPath, SESSION_DIR);
|
|
127
|
+
await fs.mkdir(dir, { recursive: true });
|
|
128
|
+
const filePath = sessionFilePath(rootPath);
|
|
129
|
+
await fs.writeFile(filePath, JSON.stringify(session, null, 2), 'utf-8');
|
|
130
|
+
}
|
|
131
|
+
catch {
|
|
132
|
+
// Swallow — sessions are best-effort.
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Reset the session: discard the on-disk file and return a fresh one.
|
|
137
|
+
* Useful for the `projscan_session { action: "reset" }` MCP path.
|
|
138
|
+
*/
|
|
139
|
+
export async function resetSession(rootPath) {
|
|
140
|
+
const filePath = sessionFilePath(rootPath);
|
|
141
|
+
try {
|
|
142
|
+
await fs.unlink(filePath);
|
|
143
|
+
}
|
|
144
|
+
catch {
|
|
145
|
+
// Already absent; nothing to do.
|
|
146
|
+
}
|
|
147
|
+
const fresh = createFreshSession(new Date());
|
|
148
|
+
await saveSession(rootPath, fresh);
|
|
149
|
+
return fresh;
|
|
150
|
+
}
|
|
151
|
+
function createFreshSession(now) {
|
|
152
|
+
const iso = now.toISOString();
|
|
153
|
+
return {
|
|
154
|
+
schemaVersion: SESSION_SCHEMA_VERSION,
|
|
155
|
+
id: randomUUID(),
|
|
156
|
+
startedAt: iso,
|
|
157
|
+
lastActivityAt: iso,
|
|
158
|
+
touchedFiles: {},
|
|
159
|
+
events: [],
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
function sessionFilePath(rootPath) {
|
|
163
|
+
return path.join(rootPath, SESSION_DIR, SESSION_FILENAME);
|
|
164
|
+
}
|
|
165
|
+
function normalizeFile(file) {
|
|
166
|
+
if (typeof file !== 'string' || file.length === 0)
|
|
167
|
+
return null;
|
|
168
|
+
if (file.includes('..'))
|
|
169
|
+
return null;
|
|
170
|
+
if (path.isAbsolute(file))
|
|
171
|
+
return null;
|
|
172
|
+
// Convert any backslashes (Windows paths) to forward slashes for
|
|
173
|
+
// cross-platform consistency in the session file.
|
|
174
|
+
return file.split(path.sep).join('/').split('\\').join('/');
|
|
175
|
+
}
|
|
176
|
+
function isSessionShape(value) {
|
|
177
|
+
if (!value || typeof value !== 'object')
|
|
178
|
+
return false;
|
|
179
|
+
const v = value;
|
|
180
|
+
return (typeof v.schemaVersion === 'number' &&
|
|
181
|
+
typeof v.id === 'string' &&
|
|
182
|
+
typeof v.startedAt === 'string' &&
|
|
183
|
+
typeof v.lastActivityAt === 'string' &&
|
|
184
|
+
typeof v.touchedFiles === 'object' &&
|
|
185
|
+
Array.isArray(v.events));
|
|
186
|
+
}
|
|
187
|
+
//# sourceMappingURL=session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/core/session.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp/server.js
CHANGED
|
@@ -9,6 +9,8 @@ import { applyBudget } from './tokenBudget.js';
|
|
|
9
9
|
import { withProgress } from './progress.js';
|
|
10
10
|
import { toContentBlocks } from './chunker.js';
|
|
11
11
|
import { startWatcher } from '../core/watcher.js';
|
|
12
|
+
import { loadSession, recordTouch, recordEvent, saveSession, } from '../core/session.js';
|
|
13
|
+
import { extractTouchedPaths } from './sessionTouchScanner.js';
|
|
12
14
|
const SUPPORTED_PROTOCOL_VERSIONS = ['2025-03-26', '2024-11-05'];
|
|
13
15
|
const PROTOCOL_VERSION = SUPPORTED_PROTOCOL_VERSIONS[0];
|
|
14
16
|
const JSONRPC_ERROR = {
|
|
@@ -34,6 +36,25 @@ export function createMcpServer(rootPath, options = {}) {
|
|
|
34
36
|
let watchHandle = null;
|
|
35
37
|
let watchStartPromise = null;
|
|
36
38
|
const watchEnabled = options.watch === true && options.notify !== undefined;
|
|
39
|
+
// 1.4 — durable cross-invocation session. Lazily loaded on first
|
|
40
|
+
// tool call, persisted after every touch. Skipping pre-load on init
|
|
41
|
+
// because the server might never receive a tool call (e.g., the
|
|
42
|
+
// client only does tools/list and disconnects).
|
|
43
|
+
let session = null;
|
|
44
|
+
let sessionDirty = false;
|
|
45
|
+
async function ensureSession() {
|
|
46
|
+
if (session)
|
|
47
|
+
return session;
|
|
48
|
+
const { session: loaded } = await loadSession(rootPath);
|
|
49
|
+
session = loaded;
|
|
50
|
+
return session;
|
|
51
|
+
}
|
|
52
|
+
async function persistSessionIfDirty() {
|
|
53
|
+
if (!session || !sessionDirty)
|
|
54
|
+
return;
|
|
55
|
+
await saveSession(rootPath, session);
|
|
56
|
+
sessionDirty = false;
|
|
57
|
+
}
|
|
37
58
|
async function dispatch(request) {
|
|
38
59
|
const id = request.id ?? null;
|
|
39
60
|
// Notifications (no id) - no response expected.
|
|
@@ -110,6 +131,25 @@ export function createMcpServer(rootPath, options = {}) {
|
|
|
110
131
|
}
|
|
111
132
|
: undefined;
|
|
112
133
|
const result = await withProgress(emit, () => handler(args, rootPath));
|
|
134
|
+
// 1.4 — auto-record session touches from any file paths the
|
|
135
|
+
// tool returned, plus an event for the call itself. The
|
|
136
|
+
// session tool itself is excluded so reading the session
|
|
137
|
+
// doesn't pollute it.
|
|
138
|
+
if (name !== 'projscan_session') {
|
|
139
|
+
try {
|
|
140
|
+
const sess = await ensureSession();
|
|
141
|
+
recordEvent(sess, `tool-call:${name}`);
|
|
142
|
+
sessionDirty = true;
|
|
143
|
+
const paths = extractTouchedPaths(result);
|
|
144
|
+
for (const p of paths) {
|
|
145
|
+
recordTouch(sess, p, 'tool-result');
|
|
146
|
+
}
|
|
147
|
+
await persistSessionIfDirty();
|
|
148
|
+
}
|
|
149
|
+
catch {
|
|
150
|
+
// Session is best-effort — never break a tool call.
|
|
151
|
+
}
|
|
152
|
+
}
|
|
113
153
|
const rawMaxTokens = args.max_tokens;
|
|
114
154
|
const maxTokens = typeof rawMaxTokens === 'number' && Number.isFinite(rawMaxTokens) && rawMaxTokens > 0
|
|
115
155
|
? rawMaxTokens
|
|
@@ -215,7 +255,7 @@ export function createMcpServer(rootPath, options = {}) {
|
|
|
215
255
|
return;
|
|
216
256
|
const notify = options.notify;
|
|
217
257
|
watchHandle = startWatcher(rootPath, {
|
|
218
|
-
onChange: ({ paths, graph }) => {
|
|
258
|
+
onChange: async ({ paths, graph }) => {
|
|
219
259
|
// The watcher fires once on startup with `paths: []` (the initial
|
|
220
260
|
// graph build). Skip it — clients only care about deltas.
|
|
221
261
|
if (paths.length === 0)
|
|
@@ -230,6 +270,20 @@ export function createMcpServer(rootPath, options = {}) {
|
|
|
230
270
|
},
|
|
231
271
|
});
|
|
232
272
|
notify(payload);
|
|
273
|
+
// 1.4 — also record fs-watch touches in the session so an
|
|
274
|
+
// agent's later `projscan_session touched` query reflects what
|
|
275
|
+
// changed on disk during the session.
|
|
276
|
+
try {
|
|
277
|
+
const sess = await ensureSession();
|
|
278
|
+
for (const p of paths)
|
|
279
|
+
recordTouch(sess, p, 'fs-watch');
|
|
280
|
+
recordEvent(sess, 'fs-watch:batch', { count: paths.length });
|
|
281
|
+
sessionDirty = true;
|
|
282
|
+
await persistSessionIfDirty();
|
|
283
|
+
}
|
|
284
|
+
catch {
|
|
285
|
+
// Best-effort.
|
|
286
|
+
}
|
|
233
287
|
},
|
|
234
288
|
});
|
|
235
289
|
try {
|
package/dist/mcp/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Walk an arbitrary tool-result value and pull out repo-relative file
|
|
3
|
+
* paths. Used by the MCP server dispatcher to auto-record session
|
|
4
|
+
* touches after every tools/call response.
|
|
5
|
+
*
|
|
6
|
+
* Heuristic: collect string values found under any of TOUCH_KEYS, in
|
|
7
|
+
* arrays whose keys are TOUCH_KEYS, or as top-level entries in objects
|
|
8
|
+
* keyed by TOUCH_KEYS. Filter out paths that look absolute, contain
|
|
9
|
+
* `..`, are URLs, or are clearly not source files (no `/` and no
|
|
10
|
+
* recognized extension).
|
|
11
|
+
*
|
|
12
|
+
* The goal isn't to find *every* mention — it's to recognize the file
|
|
13
|
+
* paths that projscan tools structurally surface (relativePath fields,
|
|
14
|
+
* `paths` arrays from notifications, importer lists, etc.).
|
|
15
|
+
*/
|
|
16
|
+
export declare function extractTouchedPaths(value: unknown): string[];
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Walk an arbitrary tool-result value and pull out repo-relative file
|
|
3
|
+
* paths. Used by the MCP server dispatcher to auto-record session
|
|
4
|
+
* touches after every tools/call response.
|
|
5
|
+
*
|
|
6
|
+
* Heuristic: collect string values found under any of TOUCH_KEYS, in
|
|
7
|
+
* arrays whose keys are TOUCH_KEYS, or as top-level entries in objects
|
|
8
|
+
* keyed by TOUCH_KEYS. Filter out paths that look absolute, contain
|
|
9
|
+
* `..`, are URLs, or are clearly not source files (no `/` and no
|
|
10
|
+
* recognized extension).
|
|
11
|
+
*
|
|
12
|
+
* The goal isn't to find *every* mention — it's to recognize the file
|
|
13
|
+
* paths that projscan tools structurally surface (relativePath fields,
|
|
14
|
+
* `paths` arrays from notifications, importer lists, etc.).
|
|
15
|
+
*/
|
|
16
|
+
const TOUCH_KEYS = new Set([
|
|
17
|
+
'file',
|
|
18
|
+
'files',
|
|
19
|
+
'filePath',
|
|
20
|
+
'path',
|
|
21
|
+
'paths',
|
|
22
|
+
'relativePath',
|
|
23
|
+
'relativePaths',
|
|
24
|
+
'from',
|
|
25
|
+
'to',
|
|
26
|
+
'definitions',
|
|
27
|
+
'importers',
|
|
28
|
+
'reachable',
|
|
29
|
+
'changed',
|
|
30
|
+
'added',
|
|
31
|
+
'removed',
|
|
32
|
+
'modified',
|
|
33
|
+
]);
|
|
34
|
+
const KNOWN_EXTENSIONS = new Set([
|
|
35
|
+
'.ts',
|
|
36
|
+
'.tsx',
|
|
37
|
+
'.js',
|
|
38
|
+
'.jsx',
|
|
39
|
+
'.mjs',
|
|
40
|
+
'.cjs',
|
|
41
|
+
'.mts',
|
|
42
|
+
'.cts',
|
|
43
|
+
'.py',
|
|
44
|
+
'.go',
|
|
45
|
+
'.java',
|
|
46
|
+
'.rb',
|
|
47
|
+
'.rs',
|
|
48
|
+
'.php',
|
|
49
|
+
'.cs',
|
|
50
|
+
'.json',
|
|
51
|
+
'.yaml',
|
|
52
|
+
'.yml',
|
|
53
|
+
'.toml',
|
|
54
|
+
'.md',
|
|
55
|
+
]);
|
|
56
|
+
const MAX_DEPTH = 8;
|
|
57
|
+
const MAX_PATHS = 200;
|
|
58
|
+
export function extractTouchedPaths(value) {
|
|
59
|
+
const out = new Set();
|
|
60
|
+
walk(value, /* keyHint */ null, /* depth */ 0, out);
|
|
61
|
+
return [...out].slice(0, MAX_PATHS);
|
|
62
|
+
}
|
|
63
|
+
function walk(value, keyHint, depth, out) {
|
|
64
|
+
if (out.size >= MAX_PATHS)
|
|
65
|
+
return;
|
|
66
|
+
if (depth > MAX_DEPTH)
|
|
67
|
+
return;
|
|
68
|
+
if (value == null)
|
|
69
|
+
return;
|
|
70
|
+
if (typeof value === 'string') {
|
|
71
|
+
if (keyHint && TOUCH_KEYS.has(keyHint) && looksLikePath(value)) {
|
|
72
|
+
out.add(value);
|
|
73
|
+
}
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
if (Array.isArray(value)) {
|
|
77
|
+
// For an array, propagate the parent's key hint so `paths: [...]`
|
|
78
|
+
// captures every entry.
|
|
79
|
+
for (const item of value)
|
|
80
|
+
walk(item, keyHint, depth + 1, out);
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
if (typeof value === 'object') {
|
|
84
|
+
for (const [k, v] of Object.entries(value)) {
|
|
85
|
+
walk(v, k, depth + 1, out);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
function looksLikePath(s) {
|
|
90
|
+
if (s.length === 0 || s.length > 1024)
|
|
91
|
+
return false;
|
|
92
|
+
if (s.includes('..'))
|
|
93
|
+
return false;
|
|
94
|
+
if (s.startsWith('/'))
|
|
95
|
+
return false;
|
|
96
|
+
if (s.startsWith('http://') || s.startsWith('https://'))
|
|
97
|
+
return false;
|
|
98
|
+
if (s.startsWith('file://'))
|
|
99
|
+
return false;
|
|
100
|
+
// Disallow shell control chars and newlines.
|
|
101
|
+
if (/[\n\r\t]/.test(s))
|
|
102
|
+
return false;
|
|
103
|
+
// Accept either: contains `/` (suggests a path) OR has a known extension.
|
|
104
|
+
const dot = s.lastIndexOf('.');
|
|
105
|
+
const hasKnownExt = dot >= 0 && KNOWN_EXTENSIONS.has(s.slice(dot).toLowerCase());
|
|
106
|
+
if (hasKnownExt)
|
|
107
|
+
return true;
|
|
108
|
+
if (s.includes('/') && /^[A-Za-z0-9._/@-]+$/.test(s))
|
|
109
|
+
return true;
|
|
110
|
+
return false;
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=sessionTouchScanner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessionTouchScanner.js","sourceRoot":"","sources":["../../src/mcp/sessionTouchScanner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { McpTool } from './_shared.js';
|
|
2
|
+
import { type SessionTouch } from '../../core/session.js';
|
|
3
|
+
/**
|
|
4
|
+
* `projscan_session` (1.4+) — surface the current durable session so an
|
|
5
|
+
* agent (or a coordinated swarm of agents) can ask "what's been touched
|
|
6
|
+
* since I arrived?" without re-running git status / grep.
|
|
7
|
+
*
|
|
8
|
+
* Subactions:
|
|
9
|
+
* - "current" (default): session metadata (id, age, touched-file count, event count).
|
|
10
|
+
* - "touched": list of files touched in the current session. Sorted by
|
|
11
|
+
* last-touched descending. Filterable by source (`tool-result` /
|
|
12
|
+
* `fs-watch` / `explicit`) and supports cursor pagination.
|
|
13
|
+
* - "events": chronological event log. Bounded to the most recent 500.
|
|
14
|
+
* - "reset": discard the current session and start a fresh one. Useful
|
|
15
|
+
* when the agent is starting a new task and wants a clean slate.
|
|
16
|
+
*
|
|
17
|
+
* The session itself is populated by other paths in projscan (tool-call
|
|
18
|
+
* dispatcher records auto-touches; `mcp --watch` records fs.watch events).
|
|
19
|
+
* This tool is read-only except for the `reset` subaction.
|
|
20
|
+
*/
|
|
21
|
+
export declare const sessionTool: McpTool;
|
|
22
|
+
export type { SessionTouch };
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { loadSession, resetSession, saveSession, } from '../../core/session.js';
|
|
2
|
+
/**
|
|
3
|
+
* `projscan_session` (1.4+) — surface the current durable session so an
|
|
4
|
+
* agent (or a coordinated swarm of agents) can ask "what's been touched
|
|
5
|
+
* since I arrived?" without re-running git status / grep.
|
|
6
|
+
*
|
|
7
|
+
* Subactions:
|
|
8
|
+
* - "current" (default): session metadata (id, age, touched-file count, event count).
|
|
9
|
+
* - "touched": list of files touched in the current session. Sorted by
|
|
10
|
+
* last-touched descending. Filterable by source (`tool-result` /
|
|
11
|
+
* `fs-watch` / `explicit`) and supports cursor pagination.
|
|
12
|
+
* - "events": chronological event log. Bounded to the most recent 500.
|
|
13
|
+
* - "reset": discard the current session and start a fresh one. Useful
|
|
14
|
+
* when the agent is starting a new task and wants a clean slate.
|
|
15
|
+
*
|
|
16
|
+
* The session itself is populated by other paths in projscan (tool-call
|
|
17
|
+
* dispatcher records auto-touches; `mcp --watch` records fs.watch events).
|
|
18
|
+
* This tool is read-only except for the `reset` subaction.
|
|
19
|
+
*/
|
|
20
|
+
export const sessionTool = {
|
|
21
|
+
name: 'projscan_session',
|
|
22
|
+
description: 'Inspect the durable cross-invocation session: which files have been touched in this session, by what (tool result / fs watch / explicit), and the event log. Use to coordinate across multi-agent setups without re-querying git.',
|
|
23
|
+
inputSchema: {
|
|
24
|
+
type: 'object',
|
|
25
|
+
properties: {
|
|
26
|
+
action: {
|
|
27
|
+
type: 'string',
|
|
28
|
+
enum: ['current', 'touched', 'events', 'reset'],
|
|
29
|
+
description: 'Subaction. Default "current" returns session metadata. "touched" returns the touched-file list. "events" returns the event log. "reset" discards the current session and starts a fresh one.',
|
|
30
|
+
},
|
|
31
|
+
source: {
|
|
32
|
+
type: 'string',
|
|
33
|
+
enum: ['tool-result', 'fs-watch', 'explicit'],
|
|
34
|
+
description: '"touched" only — restrict to files added by this source. Omit for all sources.',
|
|
35
|
+
},
|
|
36
|
+
cursor: {
|
|
37
|
+
type: 'string',
|
|
38
|
+
description: 'Opaque cursor for pagination (touched / events lists).',
|
|
39
|
+
},
|
|
40
|
+
page_size: {
|
|
41
|
+
type: 'integer',
|
|
42
|
+
description: 'Page size for paginated lists. Default 50, max 500.',
|
|
43
|
+
},
|
|
44
|
+
},
|
|
45
|
+
},
|
|
46
|
+
handler: async (args, rootPath) => {
|
|
47
|
+
const action = typeof args.action === 'string' ? args.action : 'current';
|
|
48
|
+
const { session } = await loadSession(rootPath);
|
|
49
|
+
switch (action) {
|
|
50
|
+
case 'current':
|
|
51
|
+
return summarizeSession(session);
|
|
52
|
+
case 'touched':
|
|
53
|
+
return touchedView(session, args);
|
|
54
|
+
case 'events':
|
|
55
|
+
return eventsView(session, args);
|
|
56
|
+
case 'reset': {
|
|
57
|
+
const fresh = await resetSession(rootPath);
|
|
58
|
+
return {
|
|
59
|
+
action: 'reset',
|
|
60
|
+
previousSessionId: session.id,
|
|
61
|
+
newSession: summarizeSession(fresh),
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
default:
|
|
65
|
+
throw new Error(`Unknown action "${action}". Valid actions: current, touched, events, reset.`);
|
|
66
|
+
}
|
|
67
|
+
// Unreachable, but keeps the path that may add a `saveSession` later
|
|
68
|
+
// explicit. The current handler reads only; nothing to persist.
|
|
69
|
+
void saveSession;
|
|
70
|
+
},
|
|
71
|
+
};
|
|
72
|
+
function summarizeSession(session) {
|
|
73
|
+
const startedAtMs = Date.parse(session.startedAt);
|
|
74
|
+
const lastActivityMs = Date.parse(session.lastActivityAt);
|
|
75
|
+
const ageMs = Number.isFinite(lastActivityMs) ? Date.now() - startedAtMs : null;
|
|
76
|
+
return {
|
|
77
|
+
id: session.id,
|
|
78
|
+
startedAt: session.startedAt,
|
|
79
|
+
lastActivityAt: session.lastActivityAt,
|
|
80
|
+
ageMs,
|
|
81
|
+
touchedFileCount: Object.keys(session.touchedFiles).length,
|
|
82
|
+
eventCount: session.events.length,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
function touchedView(session, args) {
|
|
86
|
+
const sourceFilter = typeof args.source === 'string' ? args.source : undefined;
|
|
87
|
+
const all = Object.values(session.touchedFiles);
|
|
88
|
+
const filtered = sourceFilter ? all.filter((t) => t.source === sourceFilter) : all;
|
|
89
|
+
// Sort by lastTouchedAt descending (most recently touched first).
|
|
90
|
+
filtered.sort((a, b) => b.lastTouchedAt.localeCompare(a.lastTouchedAt));
|
|
91
|
+
const { items, nextCursor } = paginate(filtered, args);
|
|
92
|
+
return {
|
|
93
|
+
sessionId: session.id,
|
|
94
|
+
total: filtered.length,
|
|
95
|
+
touched: items,
|
|
96
|
+
...(nextCursor ? { nextCursor } : {}),
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
function eventsView(session, args) {
|
|
100
|
+
// Newest-first for the consumer; the underlying log is append-order.
|
|
101
|
+
const reversed = [...session.events].reverse();
|
|
102
|
+
const { items, nextCursor } = paginate(reversed, args);
|
|
103
|
+
return {
|
|
104
|
+
sessionId: session.id,
|
|
105
|
+
total: reversed.length,
|
|
106
|
+
events: items,
|
|
107
|
+
...(nextCursor ? { nextCursor } : {}),
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
function paginate(arr, args) {
|
|
111
|
+
const pageSize = clampPageSize(args.page_size);
|
|
112
|
+
const offset = decodeOffset(args.cursor);
|
|
113
|
+
const slice = arr.slice(offset, offset + pageSize);
|
|
114
|
+
const next = offset + pageSize;
|
|
115
|
+
const nextCursor = next < arr.length ? encodeOffset(next) : undefined;
|
|
116
|
+
return { items: slice, nextCursor };
|
|
117
|
+
}
|
|
118
|
+
function clampPageSize(raw) {
|
|
119
|
+
if (typeof raw !== 'number' || !Number.isFinite(raw))
|
|
120
|
+
return 50;
|
|
121
|
+
return Math.max(1, Math.min(500, Math.floor(raw)));
|
|
122
|
+
}
|
|
123
|
+
function encodeOffset(offset) {
|
|
124
|
+
return Buffer.from(JSON.stringify({ offset }), 'utf-8').toString('base64');
|
|
125
|
+
}
|
|
126
|
+
function decodeOffset(cursor) {
|
|
127
|
+
if (typeof cursor !== 'string' || cursor.length === 0)
|
|
128
|
+
return 0;
|
|
129
|
+
try {
|
|
130
|
+
const parsed = JSON.parse(Buffer.from(cursor, 'base64').toString('utf-8'));
|
|
131
|
+
if (parsed && typeof parsed.offset === 'number' && Number.isFinite(parsed.offset)) {
|
|
132
|
+
return Math.max(0, Math.floor(parsed.offset));
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
catch {
|
|
136
|
+
// Bad cursor — restart from offset 0.
|
|
137
|
+
}
|
|
138
|
+
return 0;
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/mcp/tools/session.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp/tools.js
CHANGED
|
@@ -28,6 +28,7 @@ import { fixSuggestTool } from './tools/fixSuggest.js';
|
|
|
28
28
|
import { explainIssueTool } from './tools/explainIssue.js';
|
|
29
29
|
import { impactTool } from './tools/impact.js';
|
|
30
30
|
import { searchTool } from './tools/search.js';
|
|
31
|
+
import { sessionTool } from './tools/session.js';
|
|
31
32
|
const tools = [
|
|
32
33
|
analyzeTool,
|
|
33
34
|
doctorTool,
|
|
@@ -49,6 +50,7 @@ const tools = [
|
|
|
49
50
|
explainIssueTool,
|
|
50
51
|
impactTool,
|
|
51
52
|
searchTool,
|
|
53
|
+
sessionTool,
|
|
52
54
|
];
|
|
53
55
|
export function getToolDefinitions() {
|
|
54
56
|
return tools.map(({ name, description, inputSchema }) => ({ name, description, inputSchema }));
|
package/dist/mcp/tools.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/mcp/tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/mcp/tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAMjD,MAAM,KAAK,GAAc;IACvB,WAAW;IACX,UAAU;IACV,YAAY;IACZ,WAAW;IACX,QAAQ;IACR,aAAa;IACb,gBAAgB;IAChB,YAAY;IACZ,SAAS;IACT,WAAW;IACX,YAAY;IACZ,SAAS;IACT,YAAY;IACZ,cAAc;IACd,UAAU;IACV,UAAU;IACV,cAAc;IACd,gBAAgB;IAChB,UAAU;IACV,UAAU;IACV,WAAW;CACZ,CAAC;AAEF,MAAM,UAAU,kBAAkB;IAChC,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;AACjG,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,OAAO,CAAC;AACrD,CAAC"}
|
package/dist/tool-manifest.json
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "projscan",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.4.0",
|
|
4
4
|
"mcpProtocolVersion": "2025-03-26",
|
|
5
|
-
"generatedAt": "2026-05-
|
|
6
|
-
"toolCount":
|
|
5
|
+
"generatedAt": "2026-05-05T10:19:16.805Z",
|
|
6
|
+
"toolCount": 21,
|
|
7
7
|
"tools": [
|
|
8
8
|
{
|
|
9
9
|
"name": "projscan_analyze",
|
|
@@ -482,6 +482,42 @@
|
|
|
482
482
|
"query"
|
|
483
483
|
]
|
|
484
484
|
}
|
|
485
|
+
},
|
|
486
|
+
{
|
|
487
|
+
"name": "projscan_session",
|
|
488
|
+
"description": "Inspect the durable cross-invocation session: which files have been touched in this session, by what (tool result / fs watch / explicit), and the event log. Use to coordinate across multi-agent setups without re-querying git.",
|
|
489
|
+
"inputSchema": {
|
|
490
|
+
"type": "object",
|
|
491
|
+
"properties": {
|
|
492
|
+
"action": {
|
|
493
|
+
"type": "string",
|
|
494
|
+
"enum": [
|
|
495
|
+
"current",
|
|
496
|
+
"touched",
|
|
497
|
+
"events",
|
|
498
|
+
"reset"
|
|
499
|
+
],
|
|
500
|
+
"description": "Subaction. Default \"current\" returns session metadata. \"touched\" returns the touched-file list. \"events\" returns the event log. \"reset\" discards the current session and starts a fresh one."
|
|
501
|
+
},
|
|
502
|
+
"source": {
|
|
503
|
+
"type": "string",
|
|
504
|
+
"enum": [
|
|
505
|
+
"tool-result",
|
|
506
|
+
"fs-watch",
|
|
507
|
+
"explicit"
|
|
508
|
+
],
|
|
509
|
+
"description": "\"touched\" only — restrict to files added by this source. Omit for all sources."
|
|
510
|
+
},
|
|
511
|
+
"cursor": {
|
|
512
|
+
"type": "string",
|
|
513
|
+
"description": "Opaque cursor for pagination (touched / events lists)."
|
|
514
|
+
},
|
|
515
|
+
"page_size": {
|
|
516
|
+
"type": "integer",
|
|
517
|
+
"description": "Page size for paginated lists. Default 50, max 500."
|
|
518
|
+
}
|
|
519
|
+
}
|
|
520
|
+
}
|
|
485
521
|
}
|
|
486
522
|
]
|
|
487
523
|
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "projscan",
|
|
3
3
|
"mcpName": "io.github.abhiyoheswaran1/projscan",
|
|
4
|
-
"version": "1.
|
|
4
|
+
"version": "1.4.0",
|
|
5
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) closing the diagnose-fix loop, transitive blast-radius analysis (projscan_impact for files and symbols), 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",
|