projscan 1.3.0 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. package/README.md +98 -9
  2. package/dist/cli/commands/doctor.js +18 -2
  3. package/dist/cli/commands/doctor.js.map +1 -1
  4. package/dist/cli/commands/explain.js +1 -0
  5. package/dist/cli/commands/explain.js.map +1 -1
  6. package/dist/cli/commands/memory.d.ts +11 -0
  7. package/dist/cli/commands/memory.js +175 -0
  8. package/dist/cli/commands/memory.js.map +1 -0
  9. package/dist/cli/commands/session.d.ts +12 -0
  10. package/dist/cli/commands/session.js +200 -0
  11. package/dist/cli/commands/session.js.map +1 -0
  12. package/dist/cli/index.js +4 -0
  13. package/dist/cli/index.js.map +1 -1
  14. package/dist/core/codeGraph.js +190 -241
  15. package/dist/core/codeGraph.js.map +1 -1
  16. package/dist/core/fileInspector.js +40 -44
  17. package/dist/core/fileInspector.js.map +1 -1
  18. package/dist/core/hotspotAnalyzer.js +65 -19
  19. package/dist/core/hotspotAnalyzer.js.map +1 -1
  20. package/dist/core/issueEngine.js +24 -0
  21. package/dist/core/issueEngine.js.map +1 -1
  22. package/dist/core/languages/csharpImports.js +6 -4
  23. package/dist/core/languages/csharpImports.js.map +1 -1
  24. package/dist/core/memory.d.ts +154 -0
  25. package/dist/core/memory.js +277 -0
  26. package/dist/core/memory.js.map +1 -0
  27. package/dist/core/review.d.ts +25 -1
  28. package/dist/core/review.js +84 -0
  29. package/dist/core/review.js.map +1 -1
  30. package/dist/core/session.d.ts +94 -0
  31. package/dist/core/session.js +187 -0
  32. package/dist/core/session.js.map +1 -0
  33. package/dist/mcp/prompts.js +272 -0
  34. package/dist/mcp/prompts.js.map +1 -1
  35. package/dist/mcp/server.js +198 -128
  36. package/dist/mcp/server.js.map +1 -1
  37. package/dist/mcp/sessionTouchScanner.d.ts +16 -0
  38. package/dist/mcp/sessionTouchScanner.js +112 -0
  39. package/dist/mcp/sessionTouchScanner.js.map +1 -0
  40. package/dist/mcp/tokenBudget.d.ts +22 -0
  41. package/dist/mcp/tokenBudget.js +26 -0
  42. package/dist/mcp/tokenBudget.js.map +1 -1
  43. package/dist/mcp/tools/doctor.js +65 -2
  44. package/dist/mcp/tools/doctor.js.map +1 -1
  45. package/dist/mcp/tools/explain.js +4 -3
  46. package/dist/mcp/tools/explain.js.map +1 -1
  47. package/dist/mcp/tools/explainIssue.js +3 -2
  48. package/dist/mcp/tools/explainIssue.js.map +1 -1
  49. package/dist/mcp/tools/file.js +3 -2
  50. package/dist/mcp/tools/file.js.map +1 -1
  51. package/dist/mcp/tools/graph.js +16 -11
  52. package/dist/mcp/tools/graph.js.map +1 -1
  53. package/dist/mcp/tools/impact.js +2 -2
  54. package/dist/mcp/tools/impact.js.map +1 -1
  55. package/dist/mcp/tools/memory.d.ts +19 -0
  56. package/dist/mcp/tools/memory.js +134 -0
  57. package/dist/mcp/tools/memory.js.map +1 -0
  58. package/dist/mcp/tools/review.js +25 -4
  59. package/dist/mcp/tools/review.js.map +1 -1
  60. package/dist/mcp/tools/session.d.ts +22 -0
  61. package/dist/mcp/tools/session.js +140 -0
  62. package/dist/mcp/tools/session.js.map +1 -0
  63. package/dist/mcp/tools/upgrade.js +3 -2
  64. package/dist/mcp/tools/upgrade.js.map +1 -1
  65. package/dist/mcp/tools.js +4 -0
  66. package/dist/mcp/tools.js.map +1 -1
  67. package/dist/reporters/consoleReporter.d.ts +12 -1
  68. package/dist/reporters/consoleReporter.js +289 -179
  69. package/dist/reporters/consoleReporter.js.map +1 -1
  70. package/dist/reporters/markdownReporter.js +185 -128
  71. package/dist/reporters/markdownReporter.js.map +1 -1
  72. package/dist/tool-manifest.json +79 -6
  73. package/dist/types.d.ts +21 -0
  74. package/dist/utils/config.js +76 -51
  75. package/dist/utils/config.js.map +1 -1
  76. package/package.json +8 -1
@@ -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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"}
@@ -20,8 +20,9 @@ export const upgradeTool = {
20
20
  },
21
21
  handler: async (args, rootPath) => {
22
22
  const pkgName = typeof args.package === 'string' ? args.package : '';
23
- if (!pkgName)
24
- throw new Error('package argument is required');
23
+ if (!pkgName) {
24
+ throw new Error('package argument is required: pass an npm package name (e.g. "chalk" or "@types/node"). List candidates with projscan_outdated or projscan_dependencies.');
25
+ }
25
26
  const checkRegistry = args.check_registry === true;
26
27
  const scan = await scanRepository(rootPath);
27
28
  if (await isPythonDominated(rootPath, scan.files)) {
@@ -1 +1 @@
1
- {"version":3,"file":"upgrade.js","sourceRoot":"","sources":["../../../src/mcp/tools/upgrade.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAgB,MAAM,cAAc,CAAC;AAE/D,MAAM,CAAC,MAAM,WAAW,GAAY;IAClC,IAAI,EAAE,kBAAkB;IACxB,WAAW,EACT,2PAA2P;IAC7P,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,OAAO,EAAE;gBACP,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,iCAAiC;aAC/C;YACD,cAAc,EAAE;gBACd,IAAI,EAAE,SAAS;gBACf,WAAW,EACT,mJAAmJ;aACtJ;SACF;QACD,QAAQ,EAAE,CAAC,SAAS,CAAC;KACtB;IACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;QAChC,MAAM,OAAO,GAAG,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QACrE,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAC9D,MAAM,aAAa,GAAG,IAAI,CAAC,cAAc,KAAK,IAAI,CAAC;QACnD,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC,QAAQ,CAAC,CAAC;QAE5C,IAAI,MAAM,iBAAiB,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YAClD,OAAO;gBACL,SAAS,EAAE,KAAK;gBAChB,MAAM,EACJ,mHAAmH;gBACrH,IAAI,EAAE,OAAO;gBACb,QAAQ,EAAE,IAAI;gBACd,SAAS,EAAE,IAAI;gBACf,MAAM,EAAE,IAAI;gBACZ,KAAK,EAAE,SAAS;gBAChB,eAAe,EAAE,EAAE;gBACnB,SAAS,EAAE,EAAE;aACd,CAAC;QACJ,CAAC;QAED,OAAO,MAAM,cAAc,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,aAAa,EAAE,CAAC,CAAC;IAChF,CAAC;CACF,CAAC"}
1
+ {"version":3,"file":"upgrade.js","sourceRoot":"","sources":["../../../src/mcp/tools/upgrade.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAgB,MAAM,cAAc,CAAC;AAE/D,MAAM,CAAC,MAAM,WAAW,GAAY;IAClC,IAAI,EAAE,kBAAkB;IACxB,WAAW,EACT,2PAA2P;IAC7P,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,OAAO,EAAE;gBACP,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,iCAAiC;aAC/C;YACD,cAAc,EAAE;gBACd,IAAI,EAAE,SAAS;gBACf,WAAW,EACT,mJAAmJ;aACtJ;SACF;QACD,QAAQ,EAAE,CAAC,SAAS,CAAC;KACtB;IACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;QAChC,MAAM,OAAO,GAAG,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QACrE,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CACb,0JAA0J,CAC3J,CAAC;QACJ,CAAC;QACD,MAAM,aAAa,GAAG,IAAI,CAAC,cAAc,KAAK,IAAI,CAAC;QACnD,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC,QAAQ,CAAC,CAAC;QAE5C,IAAI,MAAM,iBAAiB,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YAClD,OAAO;gBACL,SAAS,EAAE,KAAK;gBAChB,MAAM,EACJ,mHAAmH;gBACrH,IAAI,EAAE,OAAO;gBACb,QAAQ,EAAE,IAAI;gBACd,SAAS,EAAE,IAAI;gBACf,MAAM,EAAE,IAAI;gBACZ,KAAK,EAAE,SAAS;gBAChB,eAAe,EAAE,EAAE;gBACnB,SAAS,EAAE,EAAE;aACd,CAAC;QACJ,CAAC;QAED,OAAO,MAAM,cAAc,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,aAAa,EAAE,CAAC,CAAC;IAChF,CAAC;CACF,CAAC"}
package/dist/mcp/tools.js CHANGED
@@ -28,6 +28,8 @@ 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';
32
+ import { memoryTool } from './tools/memory.js';
31
33
  const tools = [
32
34
  analyzeTool,
33
35
  doctorTool,
@@ -49,6 +51,8 @@ const tools = [
49
51
  explainIssueTool,
50
52
  impactTool,
51
53
  searchTool,
54
+ sessionTool,
55
+ memoryTool,
52
56
  ];
53
57
  export function getToolDefinitions() {
54
58
  return tools.map(({ name, description, inputSchema }) => ({ name, description, inputSchema }));
@@ -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;AAM/C,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;CACX,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"}
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;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAM/C,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;IACX,UAAU;CACX,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"}
@@ -1,6 +1,17 @@
1
1
  import type { AnalysisReport, AuditReport, CoverageJoinedReport, CouplingReport, Issue, Fix, FixResult, FileExplanation, FileInspection, ArchitectureLayer, DirectoryNode, DependencyReport, DiffResult, HotspotReport, OutdatedReport, PrDiffReport, ReviewReport, FixSuggestion, ImpactReport, IssueExplanation, UpgradePreview, WorkspaceInfo } from '../types.js';
2
2
  export declare function reportAnalysis(report: AnalysisReport): void;
3
- export declare function reportHealth(issues: Issue[], scanTimeMs?: number): void;
3
+ export interface ReportHealthOptions {
4
+ /** Scan duration in milliseconds; surfaced under the score line. */
5
+ scanTimeMs?: number;
6
+ /**
7
+ * 1.5+ — count of stable rules from Project Memory. When ≥ 1, doctor
8
+ * surfaces a one-line tip pointing at `projscan memory stable`.
9
+ * Caller (the doctor CLI) is responsible for loading memory and
10
+ * passing the count; reporters stay sync.
11
+ */
12
+ stableRuleCount?: number;
13
+ }
14
+ export declare function reportHealth(issues: Issue[], scanTimeMsOrOptions?: number | ReportHealthOptions): void;
4
15
  export declare function reportCi(issues: Issue[], threshold: number): void;
5
16
  export declare function reportDiff(diff: DiffResult): void;
6
17
  export declare function reportDetectedIssues(issues: Issue[], fixes: Fix[]): void;