preflight-dev 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (142) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +172 -0
  3. package/bin/cli.js +11 -0
  4. package/dist/cli/init.d.ts +2 -0
  5. package/dist/cli/init.js +154 -0
  6. package/dist/cli/init.js.map +1 -0
  7. package/dist/index.d.ts +2 -0
  8. package/dist/index.js +122 -0
  9. package/dist/index.js.map +1 -0
  10. package/dist/lib/config.d.ts +34 -0
  11. package/dist/lib/config.js +118 -0
  12. package/dist/lib/config.js.map +1 -0
  13. package/dist/lib/embeddings.d.ts +11 -0
  14. package/dist/lib/embeddings.js +88 -0
  15. package/dist/lib/embeddings.js.map +1 -0
  16. package/dist/lib/files.d.ts +15 -0
  17. package/dist/lib/files.js +60 -0
  18. package/dist/lib/files.js.map +1 -0
  19. package/dist/lib/git-extractor.d.ts +9 -0
  20. package/dist/lib/git-extractor.js +116 -0
  21. package/dist/lib/git-extractor.js.map +1 -0
  22. package/dist/lib/git.d.ts +29 -0
  23. package/dist/lib/git.js +86 -0
  24. package/dist/lib/git.js.map +1 -0
  25. package/dist/lib/session-parser.d.ts +45 -0
  26. package/dist/lib/session-parser.js +267 -0
  27. package/dist/lib/session-parser.js.map +1 -0
  28. package/dist/lib/state.d.ts +21 -0
  29. package/dist/lib/state.js +86 -0
  30. package/dist/lib/state.js.map +1 -0
  31. package/dist/lib/timeline-db.d.ts +67 -0
  32. package/dist/lib/timeline-db.js +380 -0
  33. package/dist/lib/timeline-db.js.map +1 -0
  34. package/dist/lib/triage.d.ts +29 -0
  35. package/dist/lib/triage.js +193 -0
  36. package/dist/lib/triage.js.map +1 -0
  37. package/dist/profiles.d.ts +3 -0
  38. package/dist/profiles.js +65 -0
  39. package/dist/profiles.js.map +1 -0
  40. package/dist/tools/audit-workspace.d.ts +2 -0
  41. package/dist/tools/audit-workspace.js +86 -0
  42. package/dist/tools/audit-workspace.js.map +1 -0
  43. package/dist/tools/checkpoint.d.ts +2 -0
  44. package/dist/tools/checkpoint.js +108 -0
  45. package/dist/tools/checkpoint.js.map +1 -0
  46. package/dist/tools/clarify-intent.d.ts +2 -0
  47. package/dist/tools/clarify-intent.js +180 -0
  48. package/dist/tools/clarify-intent.js.map +1 -0
  49. package/dist/tools/enrich-agent-task.d.ts +2 -0
  50. package/dist/tools/enrich-agent-task.js +97 -0
  51. package/dist/tools/enrich-agent-task.js.map +1 -0
  52. package/dist/tools/generate-scorecard.d.ts +2 -0
  53. package/dist/tools/generate-scorecard.js +617 -0
  54. package/dist/tools/generate-scorecard.js.map +1 -0
  55. package/dist/tools/log-correction.d.ts +2 -0
  56. package/dist/tools/log-correction.js +76 -0
  57. package/dist/tools/log-correction.js.map +1 -0
  58. package/dist/tools/onboard-project.d.ts +2 -0
  59. package/dist/tools/onboard-project.js +179 -0
  60. package/dist/tools/onboard-project.js.map +1 -0
  61. package/dist/tools/preflight-check.d.ts +2 -0
  62. package/dist/tools/preflight-check.js +229 -0
  63. package/dist/tools/preflight-check.js.map +1 -0
  64. package/dist/tools/prompt-score.d.ts +2 -0
  65. package/dist/tools/prompt-score.js +132 -0
  66. package/dist/tools/prompt-score.js.map +1 -0
  67. package/dist/tools/scan-sessions.d.ts +2 -0
  68. package/dist/tools/scan-sessions.js +182 -0
  69. package/dist/tools/scan-sessions.js.map +1 -0
  70. package/dist/tools/scope-work.d.ts +2 -0
  71. package/dist/tools/scope-work.js +214 -0
  72. package/dist/tools/scope-work.js.map +1 -0
  73. package/dist/tools/search-history.d.ts +2 -0
  74. package/dist/tools/search-history.js +130 -0
  75. package/dist/tools/search-history.js.map +1 -0
  76. package/dist/tools/sequence-tasks.d.ts +2 -0
  77. package/dist/tools/sequence-tasks.js +165 -0
  78. package/dist/tools/sequence-tasks.js.map +1 -0
  79. package/dist/tools/session-handoff.d.ts +2 -0
  80. package/dist/tools/session-handoff.js +113 -0
  81. package/dist/tools/session-handoff.js.map +1 -0
  82. package/dist/tools/session-health.d.ts +2 -0
  83. package/dist/tools/session-health.js +111 -0
  84. package/dist/tools/session-health.js.map +1 -0
  85. package/dist/tools/session-stats.d.ts +2 -0
  86. package/dist/tools/session-stats.js +112 -0
  87. package/dist/tools/session-stats.js.map +1 -0
  88. package/dist/tools/sharpen-followup.d.ts +2 -0
  89. package/dist/tools/sharpen-followup.js +192 -0
  90. package/dist/tools/sharpen-followup.js.map +1 -0
  91. package/dist/tools/timeline-view.d.ts +2 -0
  92. package/dist/tools/timeline-view.js +165 -0
  93. package/dist/tools/timeline-view.js.map +1 -0
  94. package/dist/tools/token-audit.d.ts +2 -0
  95. package/dist/tools/token-audit.js +227 -0
  96. package/dist/tools/token-audit.js.map +1 -0
  97. package/dist/tools/verify-completion.d.ts +2 -0
  98. package/dist/tools/verify-completion.js +154 -0
  99. package/dist/tools/verify-completion.js.map +1 -0
  100. package/dist/tools/what-changed.d.ts +2 -0
  101. package/dist/tools/what-changed.js +40 -0
  102. package/dist/tools/what-changed.js.map +1 -0
  103. package/dist/types.d.ts +78 -0
  104. package/dist/types.js +2 -0
  105. package/dist/types.js.map +1 -0
  106. package/package.json +52 -0
  107. package/src/cli/init.ts +133 -0
  108. package/src/index.ts +135 -0
  109. package/src/lib/config.ts +157 -0
  110. package/src/lib/embeddings.ts +118 -0
  111. package/src/lib/files.ts +59 -0
  112. package/src/lib/git-extractor.ts +137 -0
  113. package/src/lib/git.ts +89 -0
  114. package/src/lib/session-parser.ts +325 -0
  115. package/src/lib/state.ts +86 -0
  116. package/src/lib/timeline-db.ts +490 -0
  117. package/src/lib/triage.ts +255 -0
  118. package/src/profiles.ts +70 -0
  119. package/src/templates/config.yml +23 -0
  120. package/src/templates/triage.yml +27 -0
  121. package/src/tools/audit-workspace.ts +97 -0
  122. package/src/tools/checkpoint.ts +119 -0
  123. package/src/tools/clarify-intent.ts +191 -0
  124. package/src/tools/enrich-agent-task.ts +108 -0
  125. package/src/tools/generate-scorecard.ts +673 -0
  126. package/src/tools/log-correction.ts +89 -0
  127. package/src/tools/onboard-project.ts +214 -0
  128. package/src/tools/preflight-check.ts +263 -0
  129. package/src/tools/prompt-score.ts +150 -0
  130. package/src/tools/scan-sessions.ts +209 -0
  131. package/src/tools/scope-work.ts +238 -0
  132. package/src/tools/search-history.ts +145 -0
  133. package/src/tools/sequence-tasks.ts +182 -0
  134. package/src/tools/session-handoff.ts +125 -0
  135. package/src/tools/session-health.ts +107 -0
  136. package/src/tools/session-stats.ts +134 -0
  137. package/src/tools/sharpen-followup.ts +200 -0
  138. package/src/tools/timeline-view.ts +181 -0
  139. package/src/tools/token-audit.ts +259 -0
  140. package/src/tools/verify-completion.ts +159 -0
  141. package/src/tools/what-changed.ts +48 -0
  142. package/src/types.ts +87 -0
@@ -0,0 +1,380 @@
1
+ import * as lancedb from "@lancedb/lancedb";
2
+ import { randomUUID } from "node:crypto";
3
+ import { readFile, writeFile, mkdir } from "node:fs/promises";
4
+ import { createHash } from "node:crypto";
5
+ import { homedir } from "node:os";
6
+ import { join, basename, resolve } from "node:path";
7
+ import { createEmbeddingProvider } from "./embeddings.js";
8
+ // --- Types ---
9
+ export const EVENT_TYPES = [
10
+ "prompt", "assistant", "correction", "commit",
11
+ "tool_call", "compaction", "sub_agent_spawn", "error",
12
+ ];
13
+ // --- Paths ---
14
+ const PREFLIGHT_DIR = join(homedir(), ".preflight");
15
+ const PROJECTS_DIR = join(PREFLIGHT_DIR, "projects");
16
+ const CONFIG_PATH = join(PREFLIGHT_DIR, "config.json");
17
+ const INDEX_PATH = join(PROJECTS_DIR, "index.json");
18
+ // --- Utilities ---
19
+ /** Create deterministic hash for project directory */
20
+ function hashProjectDir(projectDir) {
21
+ const absolutePath = resolve(projectDir);
22
+ return createHash("sha256").update(absolutePath).digest("hex").slice(0, 12);
23
+ }
24
+ /** Get paths for a project's data */
25
+ function getProjectPaths(projectDir) {
26
+ const hash = hashProjectDir(projectDir);
27
+ const projectBase = join(PROJECTS_DIR, hash);
28
+ return {
29
+ hash,
30
+ projectDir: projectBase,
31
+ dbPath: join(projectBase, "timeline.lance"),
32
+ metaPath: join(projectBase, "meta.json"),
33
+ };
34
+ }
35
+ // --- Config ---
36
+ const DEFAULT_CONFIG = {
37
+ embedding_provider: "local",
38
+ embedding_model: "Xenova/all-MiniLM-L6-v2",
39
+ indexed_projects: {},
40
+ };
41
+ export async function loadConfig() {
42
+ try {
43
+ const raw = await readFile(CONFIG_PATH, "utf-8");
44
+ return { ...DEFAULT_CONFIG, ...JSON.parse(raw) };
45
+ }
46
+ catch {
47
+ return { ...DEFAULT_CONFIG };
48
+ }
49
+ }
50
+ export async function saveConfig(config) {
51
+ await mkdir(PREFLIGHT_DIR, { recursive: true });
52
+ await writeFile(CONFIG_PATH, JSON.stringify(config, null, 2));
53
+ }
54
+ // --- Project Registry ---
55
+ export async function loadProjectRegistry() {
56
+ try {
57
+ const raw = await readFile(INDEX_PATH, "utf-8");
58
+ return JSON.parse(raw);
59
+ }
60
+ catch {
61
+ return {};
62
+ }
63
+ }
64
+ export async function saveProjectRegistry(registry) {
65
+ await mkdir(PROJECTS_DIR, { recursive: true });
66
+ await writeFile(INDEX_PATH, JSON.stringify(registry, null, 2));
67
+ }
68
+ export async function registerProject(projectDir) {
69
+ const absoluteDir = resolve(projectDir);
70
+ const registry = await loadProjectRegistry();
71
+ const { hash } = getProjectPaths(absoluteDir);
72
+ if (!registry[absoluteDir]) {
73
+ registry[absoluteDir] = {
74
+ hash,
75
+ onboarded_at: new Date().toISOString(),
76
+ };
77
+ await saveProjectRegistry(registry);
78
+ }
79
+ }
80
+ // --- Project Metadata ---
81
+ export async function loadProjectMeta(projectDir) {
82
+ const { metaPath } = getProjectPaths(projectDir);
83
+ try {
84
+ const raw = await readFile(metaPath, "utf-8");
85
+ return JSON.parse(raw);
86
+ }
87
+ catch {
88
+ return null;
89
+ }
90
+ }
91
+ export async function saveProjectMeta(projectDir, meta) {
92
+ const { projectDir: projectBase, metaPath } = getProjectPaths(projectDir);
93
+ await mkdir(projectBase, { recursive: true });
94
+ await writeFile(metaPath, JSON.stringify(meta, null, 2));
95
+ }
96
+ // --- Database Manager ---
97
+ const _connections = new Map();
98
+ let _embedder = null;
99
+ export async function getDb(projectDir) {
100
+ const absoluteDir = resolve(projectDir);
101
+ const { dbPath } = getProjectPaths(absoluteDir);
102
+ if (!_connections.has(absoluteDir)) {
103
+ await mkdir(PROJECTS_DIR, { recursive: true });
104
+ const db = await lancedb.connect(dbPath);
105
+ _connections.set(absoluteDir, db);
106
+ }
107
+ return _connections.get(absoluteDir);
108
+ }
109
+ async function getEmbedder() {
110
+ if (!_embedder) {
111
+ const config = await loadConfig();
112
+ _embedder = createEmbeddingProvider({
113
+ provider: config.embedding_provider,
114
+ apiKey: config.openai_api_key,
115
+ });
116
+ }
117
+ return _embedder;
118
+ }
119
+ export async function getEventsTable(projectDir) {
120
+ const db = await getDb(projectDir);
121
+ try {
122
+ return await db.openTable("events");
123
+ }
124
+ catch {
125
+ // Create with a seed record then delete it — LanceDB needs data to infer schema
126
+ const embedder = await getEmbedder();
127
+ const zeroVector = new Array(embedder.dimensions).fill(0);
128
+ const seed = [{
129
+ id: "__seed__",
130
+ timestamp: new Date().toISOString(),
131
+ type: "prompt",
132
+ project: "",
133
+ project_name: "",
134
+ branch: "",
135
+ session_id: "",
136
+ source_file: "",
137
+ source_line: 0,
138
+ content: "",
139
+ content_preview: "",
140
+ vector: zeroVector,
141
+ metadata: "{}",
142
+ }];
143
+ const table = await db.createTable("events", seed);
144
+ await table.delete('id = "__seed__"');
145
+ return table;
146
+ }
147
+ }
148
+ // --- Core Operations ---
149
+ export async function insertEvents(events, projectDir) {
150
+ if (events.length === 0)
151
+ return;
152
+ // Group events by project if no specific projectDir provided
153
+ const eventsByProject = new Map();
154
+ for (const event of events) {
155
+ const targetProject = projectDir || event.project;
156
+ if (!targetProject)
157
+ throw new Error("Event must have project or projectDir must be specified");
158
+ if (!eventsByProject.has(targetProject)) {
159
+ eventsByProject.set(targetProject, []);
160
+ }
161
+ eventsByProject.get(targetProject).push({ ...event, project: targetProject });
162
+ }
163
+ const embedder = await getEmbedder();
164
+ for (const [proj, projEvents] of eventsByProject) {
165
+ const table = await getEventsTable(proj);
166
+ const contents = projEvents.map((e) => e.content);
167
+ const vectors = await embedder.embedBatch(contents);
168
+ const records = projEvents.map((e, i) => ({
169
+ id: e.id || randomUUID(),
170
+ timestamp: e.timestamp,
171
+ type: e.type,
172
+ project: e.project,
173
+ project_name: e.project_name || basename(e.project),
174
+ branch: e.branch,
175
+ session_id: e.session_id,
176
+ source_file: e.source_file,
177
+ source_line: e.source_line,
178
+ content: e.content,
179
+ content_preview: e.content_preview || e.content.slice(0, 200),
180
+ vector: vectors[i],
181
+ metadata: e.metadata || "{}",
182
+ }));
183
+ await table.add(records);
184
+ // Update project metadata
185
+ await registerProject(proj);
186
+ const meta = await loadProjectMeta(proj) || {
187
+ project_dir: resolve(proj),
188
+ onboarded_at: new Date().toISOString(),
189
+ event_count: 0,
190
+ };
191
+ meta.event_count += records.length;
192
+ await saveProjectMeta(proj, meta);
193
+ // Update legacy config for backward compatibility
194
+ const config = await loadConfig();
195
+ if (!config.indexed_projects[proj]) {
196
+ config.indexed_projects[proj] = {
197
+ last_session_index: records[records.length - 1].timestamp,
198
+ last_git_index: "1970-01-01T00:00:00Z",
199
+ event_count: meta.event_count,
200
+ };
201
+ }
202
+ else {
203
+ config.indexed_projects[proj].event_count += records.length;
204
+ }
205
+ await saveConfig(config);
206
+ }
207
+ }
208
+ function buildWhereFilter(opts) {
209
+ const clauses = [];
210
+ if (opts.project)
211
+ clauses.push(`project = '${opts.project}'`);
212
+ if (opts.branch)
213
+ clauses.push(`branch = '${opts.branch}'`);
214
+ if (opts.type)
215
+ clauses.push(`type = '${opts.type}'`);
216
+ if (opts.since)
217
+ clauses.push(`timestamp >= '${opts.since}'`);
218
+ if (opts.until)
219
+ clauses.push(`timestamp <= '${opts.until}'`);
220
+ return clauses.length > 0 ? clauses.join(" AND ") : undefined;
221
+ }
222
+ /** Search across multiple projects and merge results by score */
223
+ export async function searchSemantic(query, opts = {}) {
224
+ const embedder = await getEmbedder();
225
+ const queryVector = await embedder.embed(query);
226
+ const limit = opts.limit || 20;
227
+ // Determine which projects to search
228
+ let projectsToSearch = opts.project_dirs || [];
229
+ if (projectsToSearch.length === 0 && opts.project) {
230
+ projectsToSearch = [opts.project];
231
+ }
232
+ if (projectsToSearch.length === 0) {
233
+ // Default to current project if available
234
+ if (process.env.CLAUDE_PROJECT_DIR) {
235
+ projectsToSearch = [process.env.CLAUDE_PROJECT_DIR];
236
+ }
237
+ else {
238
+ // Fall back to all indexed projects
239
+ const registry = await loadProjectRegistry();
240
+ projectsToSearch = Object.keys(registry);
241
+ }
242
+ }
243
+ const allResults = [];
244
+ // Search each project
245
+ for (const projectDir of projectsToSearch) {
246
+ try {
247
+ const table = await getEventsTable(projectDir);
248
+ let search = table.search(queryVector).limit(limit * 2); // Over-fetch to allow for filtering
249
+ const where = buildWhereFilter(opts);
250
+ if (where)
251
+ search = search.where(where);
252
+ const results = await search.toArray();
253
+ for (const result of results) {
254
+ allResults.push({
255
+ ...result,
256
+ _score: 1 - (result._distance || 0),
257
+ });
258
+ }
259
+ }
260
+ catch (error) {
261
+ // Skip projects that don't exist or have issues
262
+ continue;
263
+ }
264
+ }
265
+ // Sort by score and take top results
266
+ allResults.sort((a, b) => b._score - a._score);
267
+ return allResults.slice(0, limit);
268
+ }
269
+ export async function searchExact(query, opts = {}) {
270
+ const limit = opts.limit || 50;
271
+ const likeClauses = [`content LIKE '%${query.replace(/'/g, "''")}%'`];
272
+ const where = buildWhereFilter(opts);
273
+ const fullWhere = where ? `${likeClauses[0]} AND ${where}` : likeClauses[0];
274
+ // Determine which projects to search
275
+ let projectsToSearch = opts.project_dirs || [];
276
+ if (projectsToSearch.length === 0 && opts.project) {
277
+ projectsToSearch = [opts.project];
278
+ }
279
+ if (projectsToSearch.length === 0) {
280
+ if (process.env.CLAUDE_PROJECT_DIR) {
281
+ projectsToSearch = [process.env.CLAUDE_PROJECT_DIR];
282
+ }
283
+ else {
284
+ const registry = await loadProjectRegistry();
285
+ projectsToSearch = Object.keys(registry);
286
+ }
287
+ }
288
+ const allResults = [];
289
+ for (const projectDir of projectsToSearch) {
290
+ try {
291
+ const table = await getEventsTable(projectDir);
292
+ const results = await table.query().where(fullWhere).limit(limit).toArray();
293
+ allResults.push(...results);
294
+ }
295
+ catch {
296
+ continue;
297
+ }
298
+ }
299
+ return allResults.slice(0, limit);
300
+ }
301
+ export async function getTimeline(opts = {}) {
302
+ const limit = opts.limit || 100;
303
+ const where = buildWhereFilter(opts);
304
+ // Determine which projects to search
305
+ let projectsToSearch = opts.project_dirs || [];
306
+ if (projectsToSearch.length === 0 && opts.project) {
307
+ projectsToSearch = [opts.project];
308
+ }
309
+ if (projectsToSearch.length === 0) {
310
+ if (process.env.CLAUDE_PROJECT_DIR) {
311
+ projectsToSearch = [process.env.CLAUDE_PROJECT_DIR];
312
+ }
313
+ else {
314
+ const registry = await loadProjectRegistry();
315
+ projectsToSearch = Object.keys(registry);
316
+ }
317
+ }
318
+ const allResults = [];
319
+ for (const projectDir of projectsToSearch) {
320
+ try {
321
+ const table = await getEventsTable(projectDir);
322
+ let q = table.query().limit(limit);
323
+ if (where)
324
+ q = q.where(where);
325
+ const results = await q.toArray();
326
+ allResults.push(...results);
327
+ }
328
+ catch {
329
+ continue;
330
+ }
331
+ }
332
+ // Sort chronologically
333
+ allResults.sort((a, b) => a.timestamp < b.timestamp ? -1 : a.timestamp > b.timestamp ? 1 : 0);
334
+ return allResults.slice(0, limit);
335
+ }
336
+ export async function listIndexedProjects() {
337
+ const registry = await loadProjectRegistry();
338
+ const projects = [];
339
+ for (const [projectPath, entry] of Object.entries(registry)) {
340
+ const meta = await loadProjectMeta(projectPath);
341
+ projects.push({
342
+ project: projectPath,
343
+ project_name: basename(projectPath),
344
+ hash: entry.hash,
345
+ event_count: meta?.event_count || 0,
346
+ last_session_index: undefined,
347
+ last_git_index: undefined,
348
+ });
349
+ }
350
+ return projects;
351
+ }
352
+ // Legacy compatibility functions
353
+ export async function getIndexedProjects() {
354
+ return listIndexedProjects();
355
+ }
356
+ export async function getLastIndexedTimestamp(project, source) {
357
+ const config = await loadConfig();
358
+ const info = config.indexed_projects[project];
359
+ if (!info)
360
+ return null;
361
+ return source === "session" ? info.last_session_index : info.last_git_index;
362
+ }
363
+ export async function updateLastIndexedTimestamp(project, source, timestamp) {
364
+ const config = await loadConfig();
365
+ if (!config.indexed_projects[project]) {
366
+ config.indexed_projects[project] = {
367
+ last_session_index: "1970-01-01T00:00:00Z",
368
+ last_git_index: "1970-01-01T00:00:00Z",
369
+ event_count: 0,
370
+ };
371
+ }
372
+ if (source === "session") {
373
+ config.indexed_projects[project].last_session_index = timestamp;
374
+ }
375
+ else {
376
+ config.indexed_projects[project].last_git_index = timestamp;
377
+ }
378
+ await saveConfig(config);
379
+ }
380
+ //# sourceMappingURL=timeline-db.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timeline-db.js","sourceRoot":"","sources":["../../src/lib/timeline-db.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Smart triage classification system for preflight MCP server.
3
+ * Classifies incoming prompts into categories and returns recommended action.
4
+ *
5
+ * Pure function, no side effects, no external dependencies.
6
+ *
7
+ * Example classifications:
8
+ * "commit" → trivial
9
+ * "fix the null check in src/auth/jwt.ts line 42" → clear
10
+ * "fix the auth bug" → ambiguous
11
+ * "add tiered rewards" (with rewards-api related) → cross-service
12
+ * "refactor auth to OAuth2 and update all API consumers" → multi-step
13
+ */
14
+ export type TriageLevel = 'trivial' | 'clear' | 'ambiguous' | 'cross-service' | 'multi-step';
15
+ export interface TriageResult {
16
+ level: TriageLevel;
17
+ confidence: number;
18
+ reasons: string[];
19
+ recommended_tools: string[];
20
+ cross_service_hits?: string[];
21
+ }
22
+ export interface TriageConfig {
23
+ alwaysCheck?: string[];
24
+ skip?: string[];
25
+ crossServiceKeywords?: string[];
26
+ strictness?: string;
27
+ relatedAliases?: string[];
28
+ }
29
+ export declare function triagePrompt(prompt: string, config?: TriageConfig): TriageResult;
@@ -0,0 +1,193 @@
1
+ /**
2
+ * Smart triage classification system for preflight MCP server.
3
+ * Classifies incoming prompts into categories and returns recommended action.
4
+ *
5
+ * Pure function, no side effects, no external dependencies.
6
+ *
7
+ * Example classifications:
8
+ * "commit" → trivial
9
+ * "fix the null check in src/auth/jwt.ts line 42" → clear
10
+ * "fix the auth bug" → ambiguous
11
+ * "add tiered rewards" (with rewards-api related) → cross-service
12
+ * "refactor auth to OAuth2 and update all API consumers" → multi-step
13
+ */
14
+ // ── Constants ──────────────────────────────────────────────────────────────
15
+ const TRIVIAL_COMMANDS = [
16
+ 'commit', 'format', 'lint', 'run tests', 'push', 'pull',
17
+ 'status', 'build', 'test', 'deploy', 'start', 'stop', 'restart',
18
+ ];
19
+ const VAGUE_PRONOUNS = /\b(it|them|the thing|those|these)\b/i;
20
+ const VAGUE_VERBS = ['fix', 'update', 'change'];
21
+ const CROSS_SERVICE_TERMS = [
22
+ 'schema', 'contract', 'interface', 'event',
23
+ ];
24
+ const FILE_PATH_RE = /(?:^|[\s,:(])([.\w\-/\\]+\.\w{1,6})\b/;
25
+ const LINE_NUMBER_RE = /\bline\s+\d+|:\d+\b/;
26
+ const MULTI_STEP_SEQUENTIAL = /\b(then|after that|first\b.*\bthen|finally)\b/i;
27
+ // ── Helpers ────────────────────────────────────────────────────────────────
28
+ function lower(s) {
29
+ return s.toLowerCase().trim();
30
+ }
31
+ function isTrivialCommand(prompt) {
32
+ const p = lower(prompt);
33
+ return TRIVIAL_COMMANDS.some((cmd) => p === cmd || p.startsWith(cmd + ' '));
34
+ }
35
+ function hasFileRefs(prompt) {
36
+ return FILE_PATH_RE.test(prompt);
37
+ }
38
+ function hasLineNumbers(prompt) {
39
+ return LINE_NUMBER_RE.test(prompt);
40
+ }
41
+ function hasVaguePronouns(prompt) {
42
+ return VAGUE_PRONOUNS.test(prompt);
43
+ }
44
+ /** Returns true when a vague verb appears without a concrete target after it. */
45
+ function hasVagueVerbs(prompt) {
46
+ const words = lower(prompt).split(/\s+/);
47
+ return VAGUE_VERBS.some((verb) => {
48
+ const idx = words.indexOf(verb);
49
+ if (idx === -1)
50
+ return false;
51
+ // Look at the next few words for something concrete
52
+ const tail = words.slice(idx + 1, idx + 4);
53
+ const hasTarget = tail.some((w) => /\.\w+/.test(w) || w.length > 6 || /[A-Z]/.test(w));
54
+ return !hasTarget;
55
+ });
56
+ }
57
+ function detectCrossService(prompt, config) {
58
+ const p = lower(prompt);
59
+ const hits = [];
60
+ for (const kw of config.crossServiceKeywords ?? []) {
61
+ if (p.includes(lower(kw)))
62
+ hits.push(`keyword: ${kw}`);
63
+ }
64
+ for (const alias of config.relatedAliases ?? []) {
65
+ if (p.includes(lower(alias)))
66
+ hits.push(`project: ${alias}`);
67
+ }
68
+ for (const term of CROSS_SERVICE_TERMS) {
69
+ if (p.includes(term))
70
+ hits.push(`term: ${term}`);
71
+ }
72
+ return hits;
73
+ }
74
+ function isMultiStep(prompt) {
75
+ const p = lower(prompt);
76
+ // "and" connecting distinct clauses (heuristic: split and check length)
77
+ if (p.includes(' and ') && p.split(' and ').length > 1) {
78
+ const parts = p.split(' and ');
79
+ // Both sides should be non-trivial (> 2 words each)
80
+ if (parts.every((part) => part.trim().split(/\s+/).length >= 2)) {
81
+ return true;
82
+ }
83
+ }
84
+ // Sequential language
85
+ if (MULTI_STEP_SEQUENTIAL.test(prompt))
86
+ return true;
87
+ // Numbered / bulleted lists
88
+ if (/\n\s*[1-9][.)]\s/.test(prompt) || /\n\s*[-*]\s/.test(prompt)) {
89
+ return true;
90
+ }
91
+ // Multiple file refs in different directories
92
+ const files = prompt.match(/[\w\-./\\]+\.\w{1,6}/g) ?? [];
93
+ if (files.length > 1) {
94
+ const dirs = new Set(files.map((f) => f.split('/')[0]));
95
+ if (dirs.size > 1)
96
+ return true;
97
+ }
98
+ return false;
99
+ }
100
+ // ── Main ───────────────────────────────────────────────────────────────────
101
+ export function triagePrompt(prompt, config) {
102
+ const cfg = config ?? {};
103
+ const len = prompt.trim().length;
104
+ const reasons = [];
105
+ const tools = [];
106
+ // 1. Skip keywords → trivial immediately
107
+ for (const kw of cfg.skip ?? []) {
108
+ if (lower(prompt).includes(lower(kw))) {
109
+ return {
110
+ level: 'trivial',
111
+ confidence: 0.95,
112
+ reasons: [`matches skip keyword: "${kw}"`],
113
+ recommended_tools: [],
114
+ };
115
+ }
116
+ }
117
+ // 2. Multi-step (check early — highest complexity)
118
+ if (isMultiStep(prompt)) {
119
+ reasons.push('contains multi-step indicators');
120
+ tools.push('clarify-intent', 'scope-work', 'sequence-tasks');
121
+ return { level: 'multi-step', confidence: 0.85, reasons, recommended_tools: tools };
122
+ }
123
+ // 3. Cross-service
124
+ const csHits = detectCrossService(prompt, cfg);
125
+ if (csHits.length > 0) {
126
+ reasons.push(`cross-service indicators: ${csHits.join(', ')}`);
127
+ tools.push('clarify-intent', 'scope-work', 'search-related-projects');
128
+ return {
129
+ level: 'cross-service',
130
+ confidence: 0.8,
131
+ reasons,
132
+ recommended_tools: tools,
133
+ cross_service_hits: csHits,
134
+ };
135
+ }
136
+ // 4. always_check keywords → at least ambiguous
137
+ for (const kw of cfg.alwaysCheck ?? []) {
138
+ if (lower(prompt).includes(lower(kw))) {
139
+ reasons.push(`matches always_check keyword: "${kw}"`);
140
+ tools.push('clarify-intent', 'scope-work');
141
+ return { level: 'ambiguous', confidence: 0.8, reasons, recommended_tools: tools };
142
+ }
143
+ }
144
+ // 5. Trivial: short common commands
145
+ if (len < 20 && isTrivialCommand(prompt)) {
146
+ return {
147
+ level: 'trivial',
148
+ confidence: 0.9,
149
+ reasons: ['short common command'],
150
+ recommended_tools: [],
151
+ };
152
+ }
153
+ // 6. Ambiguous signals
154
+ const ambiguousReasons = [];
155
+ if (len < 50 && !hasFileRefs(prompt)) {
156
+ ambiguousReasons.push('short prompt without file references');
157
+ }
158
+ if (hasVaguePronouns(prompt)) {
159
+ ambiguousReasons.push('contains vague pronouns');
160
+ }
161
+ if (hasVagueVerbs(prompt)) {
162
+ ambiguousReasons.push('contains vague verbs without specific targets');
163
+ }
164
+ if (ambiguousReasons.length > 0) {
165
+ return {
166
+ level: 'ambiguous',
167
+ confidence: 0.7,
168
+ reasons: ambiguousReasons,
169
+ recommended_tools: ['clarify-intent', 'scope-work'],
170
+ };
171
+ }
172
+ // 7. Clear — specific, well-formed prompt
173
+ if (hasFileRefs(prompt))
174
+ reasons.push('references specific file paths');
175
+ if (hasLineNumbers(prompt))
176
+ reasons.push('references specific line numbers');
177
+ if (len > 50)
178
+ reasons.push('detailed prompt with concrete nouns');
179
+ if (reasons.length === 0)
180
+ reasons.push('well-formed prompt with clear intent');
181
+ const clearTools = hasFileRefs(prompt) ? ['verify-files-exist'] : [];
182
+ // Strictness adjustment
183
+ if (cfg.strictness === 'strict' && clearTools.length === 0) {
184
+ clearTools.push('verify-files-exist');
185
+ }
186
+ return {
187
+ level: 'clear',
188
+ confidence: cfg.strictness === 'strict' ? 0.8 : 0.85,
189
+ reasons,
190
+ recommended_tools: clearTools,
191
+ };
192
+ }
193
+ //# sourceMappingURL=triage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"triage.js","sourceRoot":"","sources":["../../src/lib/triage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { type Profile } from "./lib/config.js";
2
+ export declare function getProfile(): Profile;
3
+ export declare function isToolEnabled(toolName: string): boolean;