@phyzess/pappra 0.1.0-beta.12 → 0.1.0-beta.14
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 +2 -1
- package/assets/integrations/skills/pappra/references/operations.md +2 -0
- package/dist/app/collab-from.d.ts +35 -0
- package/dist/app/collab-from.js +84 -0
- package/dist/app/doctor.js +4 -2
- package/dist/app/host-mcp.d.ts +25 -0
- package/dist/app/host-mcp.js +227 -0
- package/dist/app/host-probe.d.ts +16 -0
- package/dist/app/host-probe.js +125 -0
- package/dist/app/task-pin.d.ts +23 -0
- package/dist/app/task-pin.js +113 -0
- package/dist/cli/commands/docs.js +12 -76
- package/dist/cli/commands/host.d.ts +3 -1
- package/dist/cli/commands/host.js +55 -1
- package/dist/cli/commands/mcp.d.ts +8 -0
- package/dist/cli/commands/mcp.js +13 -0
- package/dist/cli/commands/task.d.ts +10 -0
- package/dist/cli/commands/task.js +76 -0
- package/dist/cli/run.js +134 -4
- package/dist/hosts/integration/hook.js +4 -1
- package/dist/hosts/integration/pappra-extension-runtime.mjs +50 -8
- package/dist/hosts/integration/pappra-hook.mjs +50 -8
- package/dist/hosts/pilot.d.ts +77 -77
- package/dist/knowledge/scan.d.ts +30 -0
- package/dist/knowledge/scan.js +91 -0
- package/dist/mcp/server.d.ts +11 -0
- package/dist/mcp/server.js +518 -0
- package/dist/schemas/workspace.d.ts +6 -0
- package/dist/schemas/workspace.js +4 -0
- package/package.json +2 -1
- package/skills/pappra/references/operations.md +2 -0
package/dist/hosts/pilot.d.ts
CHANGED
|
@@ -26,13 +26,8 @@ export declare function readClaudeSessionId(file: string): string | null;
|
|
|
26
26
|
export declare function readPiSessionId(file: string): string | null;
|
|
27
27
|
export declare function runNativePilot({ harness, profile, cwd, promptFile, evidenceDir, sessionId, resume, timeoutMs, maxBudgetUsd, outputName, phase, trustProject, extraDirs, clock, assignmentFile, capabilitiesFile, taskRoot, maxAgeMinutes, launchKind, discovery, }: PilotOptions): Promise<{
|
|
28
28
|
reservation?: never;
|
|
29
|
-
settlement?: never;
|
|
30
|
-
reservation_id?: never;
|
|
31
29
|
refused: boolean;
|
|
32
30
|
admission: {
|
|
33
|
-
owner_epoch?: never;
|
|
34
|
-
detail?: never;
|
|
35
|
-
state?: never;
|
|
36
31
|
ok: false;
|
|
37
32
|
reason: string;
|
|
38
33
|
checks: Record<string, unknown>[];
|
|
@@ -41,6 +36,10 @@ export declare function runNativePilot({ harness, profile, cwd, promptFile, evid
|
|
|
41
36
|
required_skills?: never;
|
|
42
37
|
required_tools?: never;
|
|
43
38
|
preflight?: never;
|
|
39
|
+
state?: never;
|
|
40
|
+
detail?: never;
|
|
41
|
+
state_revision?: never;
|
|
42
|
+
owner_epoch?: never;
|
|
44
43
|
attempt_state?: never;
|
|
45
44
|
resources?: never;
|
|
46
45
|
mode?: never;
|
|
@@ -51,12 +50,7 @@ export declare function runNativePilot({ harness, profile, cwd, promptFile, evid
|
|
|
51
50
|
capability_evidence?: never;
|
|
52
51
|
assignment_digest?: never;
|
|
53
52
|
input_revision?: never;
|
|
54
|
-
state_revision?: never;
|
|
55
53
|
} | {
|
|
56
|
-
expected?: never;
|
|
57
|
-
actual?: never;
|
|
58
|
-
owner_epoch?: never;
|
|
59
|
-
state?: never;
|
|
60
54
|
ok: false;
|
|
61
55
|
reason: string;
|
|
62
56
|
checks: Record<string, unknown>[];
|
|
@@ -64,6 +58,11 @@ export declare function runNativePilot({ harness, profile, cwd, promptFile, evid
|
|
|
64
58
|
required_skills?: never;
|
|
65
59
|
required_tools?: never;
|
|
66
60
|
preflight?: never;
|
|
61
|
+
state?: never;
|
|
62
|
+
expected?: never;
|
|
63
|
+
actual?: never;
|
|
64
|
+
state_revision?: never;
|
|
65
|
+
owner_epoch?: never;
|
|
67
66
|
attempt_state?: never;
|
|
68
67
|
resources?: never;
|
|
69
68
|
mode?: never;
|
|
@@ -74,19 +73,19 @@ export declare function runNativePilot({ harness, profile, cwd, promptFile, evid
|
|
|
74
73
|
capability_evidence?: never;
|
|
75
74
|
assignment_digest?: never;
|
|
76
75
|
input_revision?: never;
|
|
77
|
-
state_revision?: never;
|
|
78
76
|
} | {
|
|
79
|
-
expected?: never;
|
|
80
|
-
actual?: never;
|
|
81
|
-
owner_epoch?: never;
|
|
82
|
-
detail?: never;
|
|
83
|
-
state?: never;
|
|
84
77
|
ok: false;
|
|
85
78
|
reason: string;
|
|
86
79
|
checks: Record<string, unknown>[];
|
|
87
80
|
required_skills?: never;
|
|
88
81
|
required_tools?: never;
|
|
89
82
|
preflight?: never;
|
|
83
|
+
state?: never;
|
|
84
|
+
detail?: never;
|
|
85
|
+
expected?: never;
|
|
86
|
+
actual?: never;
|
|
87
|
+
state_revision?: never;
|
|
88
|
+
owner_epoch?: never;
|
|
90
89
|
attempt_state?: never;
|
|
91
90
|
resources?: never;
|
|
92
91
|
mode?: never;
|
|
@@ -97,11 +96,7 @@ export declare function runNativePilot({ harness, profile, cwd, promptFile, evid
|
|
|
97
96
|
capability_evidence?: never;
|
|
98
97
|
assignment_digest?: never;
|
|
99
98
|
input_revision?: never;
|
|
100
|
-
state_revision?: never;
|
|
101
99
|
} | {
|
|
102
|
-
owner_epoch?: never;
|
|
103
|
-
detail?: never;
|
|
104
|
-
state?: never;
|
|
105
100
|
ok: false;
|
|
106
101
|
reason: string;
|
|
107
102
|
checks: Record<string, unknown>[];
|
|
@@ -110,6 +105,10 @@ export declare function runNativePilot({ harness, profile, cwd, promptFile, evid
|
|
|
110
105
|
required_skills?: never;
|
|
111
106
|
required_tools?: never;
|
|
112
107
|
preflight?: never;
|
|
108
|
+
state?: never;
|
|
109
|
+
detail?: never;
|
|
110
|
+
state_revision?: never;
|
|
111
|
+
owner_epoch?: never;
|
|
113
112
|
attempt_state?: never;
|
|
114
113
|
resources?: never;
|
|
115
114
|
mode?: never;
|
|
@@ -120,11 +119,7 @@ export declare function runNativePilot({ harness, profile, cwd, promptFile, evid
|
|
|
120
119
|
capability_evidence?: never;
|
|
121
120
|
assignment_digest?: never;
|
|
122
121
|
input_revision?: never;
|
|
123
|
-
state_revision?: never;
|
|
124
122
|
} | {
|
|
125
|
-
owner_epoch?: never;
|
|
126
|
-
detail?: never;
|
|
127
|
-
state?: never;
|
|
128
123
|
ok: false;
|
|
129
124
|
reason: string;
|
|
130
125
|
checks: Record<string, unknown>[];
|
|
@@ -138,6 +133,10 @@ export declare function runNativePilot({ harness, profile, cwd, promptFile, evid
|
|
|
138
133
|
required_skills?: never;
|
|
139
134
|
required_tools?: never;
|
|
140
135
|
preflight?: never;
|
|
136
|
+
state?: never;
|
|
137
|
+
detail?: never;
|
|
138
|
+
state_revision?: never;
|
|
139
|
+
owner_epoch?: never;
|
|
141
140
|
attempt_state?: never;
|
|
142
141
|
resources?: never;
|
|
143
142
|
mode?: never;
|
|
@@ -148,10 +147,7 @@ export declare function runNativePilot({ harness, profile, cwd, promptFile, evid
|
|
|
148
147
|
capability_evidence?: never;
|
|
149
148
|
assignment_digest?: never;
|
|
150
149
|
input_revision?: never;
|
|
151
|
-
state_revision?: never;
|
|
152
150
|
} | {
|
|
153
|
-
owner_epoch?: never;
|
|
154
|
-
state?: never;
|
|
155
151
|
ok: false;
|
|
156
152
|
reason: string;
|
|
157
153
|
checks: Record<string, unknown>[];
|
|
@@ -161,6 +157,9 @@ export declare function runNativePilot({ harness, profile, cwd, promptFile, evid
|
|
|
161
157
|
required_skills?: never;
|
|
162
158
|
required_tools?: never;
|
|
163
159
|
preflight?: never;
|
|
160
|
+
state?: never;
|
|
161
|
+
state_revision?: never;
|
|
162
|
+
owner_epoch?: never;
|
|
164
163
|
attempt_state?: never;
|
|
165
164
|
resources?: never;
|
|
166
165
|
mode?: never;
|
|
@@ -171,19 +170,19 @@ export declare function runNativePilot({ harness, profile, cwd, promptFile, evid
|
|
|
171
170
|
capability_evidence?: never;
|
|
172
171
|
assignment_digest?: never;
|
|
173
172
|
input_revision?: never;
|
|
174
|
-
state_revision?: never;
|
|
175
173
|
} | {
|
|
176
|
-
expected?: never;
|
|
177
|
-
actual?: never;
|
|
178
|
-
owner_epoch?: never;
|
|
179
|
-
detail?: never;
|
|
180
|
-
state?: never;
|
|
181
174
|
ok: false;
|
|
182
175
|
reason: string;
|
|
183
176
|
checks: Record<string, unknown>[];
|
|
184
177
|
required_skills: number;
|
|
185
178
|
required_tools: number;
|
|
186
179
|
preflight?: never;
|
|
180
|
+
state?: never;
|
|
181
|
+
detail?: never;
|
|
182
|
+
expected?: never;
|
|
183
|
+
actual?: never;
|
|
184
|
+
state_revision?: never;
|
|
185
|
+
owner_epoch?: never;
|
|
187
186
|
attempt_state?: never;
|
|
188
187
|
resources?: never;
|
|
189
188
|
mode?: never;
|
|
@@ -194,13 +193,7 @@ export declare function runNativePilot({ harness, profile, cwd, promptFile, evid
|
|
|
194
193
|
capability_evidence?: never;
|
|
195
194
|
assignment_digest?: never;
|
|
196
195
|
input_revision?: never;
|
|
197
|
-
state_revision?: never;
|
|
198
196
|
} | {
|
|
199
|
-
expected?: never;
|
|
200
|
-
actual?: never;
|
|
201
|
-
owner_epoch?: never;
|
|
202
|
-
detail?: never;
|
|
203
|
-
state?: never;
|
|
204
197
|
required_skills?: never;
|
|
205
198
|
required_tools?: never;
|
|
206
199
|
ok: false;
|
|
@@ -213,9 +206,9 @@ export declare function runNativePilot({ harness, profile, cwd, promptFile, evid
|
|
|
213
206
|
warnings: never[];
|
|
214
207
|
task_id?: never;
|
|
215
208
|
assignment_id?: never;
|
|
209
|
+
attempt?: never;
|
|
216
210
|
checked_at?: never;
|
|
217
211
|
limits?: never;
|
|
218
|
-
attempt?: never;
|
|
219
212
|
} | {
|
|
220
213
|
status: string;
|
|
221
214
|
task_id: string;
|
|
@@ -227,6 +220,12 @@ export declare function runNativePilot({ harness, profile, cwd, promptFile, evid
|
|
|
227
220
|
warnings: import("../collab/preflight.js").Check[];
|
|
228
221
|
limits: string[];
|
|
229
222
|
};
|
|
223
|
+
state?: never;
|
|
224
|
+
detail?: never;
|
|
225
|
+
expected?: never;
|
|
226
|
+
actual?: never;
|
|
227
|
+
state_revision?: never;
|
|
228
|
+
owner_epoch?: never;
|
|
230
229
|
attempt_state?: never;
|
|
231
230
|
resources?: never;
|
|
232
231
|
mode?: never;
|
|
@@ -237,12 +236,7 @@ export declare function runNativePilot({ harness, profile, cwd, promptFile, evid
|
|
|
237
236
|
capability_evidence?: never;
|
|
238
237
|
assignment_digest?: never;
|
|
239
238
|
input_revision?: never;
|
|
240
|
-
state_revision?: never;
|
|
241
239
|
} | {
|
|
242
|
-
expected?: never;
|
|
243
|
-
actual?: never;
|
|
244
|
-
owner_epoch?: never;
|
|
245
|
-
detail?: never;
|
|
246
240
|
required_skills?: never;
|
|
247
241
|
required_tools?: never;
|
|
248
242
|
preflight?: never;
|
|
@@ -250,6 +244,11 @@ export declare function runNativePilot({ harness, profile, cwd, promptFile, evid
|
|
|
250
244
|
reason: string;
|
|
251
245
|
checks: Record<string, unknown>[];
|
|
252
246
|
state: string;
|
|
247
|
+
detail?: never;
|
|
248
|
+
expected?: never;
|
|
249
|
+
actual?: never;
|
|
250
|
+
state_revision?: never;
|
|
251
|
+
owner_epoch?: never;
|
|
253
252
|
attempt_state?: never;
|
|
254
253
|
resources?: never;
|
|
255
254
|
mode?: never;
|
|
@@ -260,19 +259,19 @@ export declare function runNativePilot({ harness, profile, cwd, promptFile, evid
|
|
|
260
259
|
capability_evidence?: never;
|
|
261
260
|
assignment_digest?: never;
|
|
262
261
|
input_revision?: never;
|
|
263
|
-
state_revision?: never;
|
|
264
262
|
} | {
|
|
265
|
-
owner_epoch?: never;
|
|
266
|
-
detail?: never;
|
|
267
|
-
state?: never;
|
|
268
263
|
required_skills?: never;
|
|
269
264
|
required_tools?: never;
|
|
270
265
|
preflight?: never;
|
|
266
|
+
state?: never;
|
|
271
267
|
ok: false;
|
|
272
268
|
reason: string;
|
|
273
269
|
checks: Record<string, unknown>[];
|
|
274
270
|
expected: (string | null)[];
|
|
275
271
|
actual: string;
|
|
272
|
+
detail?: never;
|
|
273
|
+
state_revision?: never;
|
|
274
|
+
owner_epoch?: never;
|
|
276
275
|
attempt_state?: never;
|
|
277
276
|
resources?: never;
|
|
278
277
|
mode?: never;
|
|
@@ -283,20 +282,20 @@ export declare function runNativePilot({ harness, profile, cwd, promptFile, evid
|
|
|
283
282
|
capability_evidence?: never;
|
|
284
283
|
assignment_digest?: never;
|
|
285
284
|
input_revision?: never;
|
|
286
|
-
state_revision?: never;
|
|
287
285
|
} | {
|
|
288
|
-
expected?: never;
|
|
289
|
-
actual?: never;
|
|
290
|
-
owner_epoch?: never;
|
|
291
|
-
state?: never;
|
|
292
286
|
required_skills?: never;
|
|
293
287
|
required_tools?: never;
|
|
294
288
|
preflight?: never;
|
|
289
|
+
state?: never;
|
|
295
290
|
ok: false;
|
|
296
291
|
reason: string;
|
|
297
292
|
checks: Record<string, unknown>[];
|
|
298
293
|
resources: Record<string, unknown>[];
|
|
299
294
|
detail: string;
|
|
295
|
+
expected?: never;
|
|
296
|
+
actual?: never;
|
|
297
|
+
state_revision?: never;
|
|
298
|
+
owner_epoch?: never;
|
|
300
299
|
attempt_state?: never;
|
|
301
300
|
mode?: never;
|
|
302
301
|
launch_kind?: never;
|
|
@@ -306,20 +305,20 @@ export declare function runNativePilot({ harness, profile, cwd, promptFile, evid
|
|
|
306
305
|
capability_evidence?: never;
|
|
307
306
|
assignment_digest?: never;
|
|
308
307
|
input_revision?: never;
|
|
309
|
-
state_revision?: never;
|
|
310
308
|
} | {
|
|
311
|
-
owner_epoch?: never;
|
|
312
|
-
detail?: never;
|
|
313
|
-
state?: never;
|
|
314
309
|
required_skills?: never;
|
|
315
310
|
required_tools?: never;
|
|
316
311
|
preflight?: never;
|
|
312
|
+
state?: never;
|
|
313
|
+
detail?: never;
|
|
317
314
|
ok: false;
|
|
318
315
|
reason: string;
|
|
319
316
|
checks: Record<string, unknown>[];
|
|
320
317
|
resources: Record<string, unknown>[];
|
|
321
318
|
expected: number | undefined;
|
|
322
319
|
actual: number;
|
|
320
|
+
state_revision?: never;
|
|
321
|
+
owner_epoch?: never;
|
|
323
322
|
attempt_state?: never;
|
|
324
323
|
mode?: never;
|
|
325
324
|
launch_kind?: never;
|
|
@@ -329,20 +328,20 @@ export declare function runNativePilot({ harness, profile, cwd, promptFile, evid
|
|
|
329
328
|
capability_evidence?: never;
|
|
330
329
|
assignment_digest?: never;
|
|
331
330
|
input_revision?: never;
|
|
332
|
-
state_revision?: never;
|
|
333
331
|
} | {
|
|
334
|
-
expected?: never;
|
|
335
|
-
actual?: never;
|
|
336
|
-
owner_epoch?: never;
|
|
337
|
-
detail?: never;
|
|
338
|
-
state?: never;
|
|
339
332
|
required_skills?: never;
|
|
340
333
|
required_tools?: never;
|
|
341
334
|
preflight?: never;
|
|
335
|
+
state?: never;
|
|
336
|
+
detail?: never;
|
|
337
|
+
expected?: never;
|
|
338
|
+
actual?: never;
|
|
342
339
|
ok: false;
|
|
343
340
|
reason: string;
|
|
344
341
|
checks: Record<string, unknown>[];
|
|
345
342
|
resources: Record<string, unknown>[];
|
|
343
|
+
state_revision?: never;
|
|
344
|
+
owner_epoch?: never;
|
|
346
345
|
attempt_state?: never;
|
|
347
346
|
mode?: never;
|
|
348
347
|
launch_kind?: never;
|
|
@@ -352,7 +351,6 @@ export declare function runNativePilot({ harness, profile, cwd, promptFile, evid
|
|
|
352
351
|
capability_evidence?: never;
|
|
353
352
|
assignment_digest?: never;
|
|
354
353
|
input_revision?: never;
|
|
355
|
-
state_revision?: never;
|
|
356
354
|
};
|
|
357
355
|
reason: string;
|
|
358
356
|
process?: never;
|
|
@@ -363,19 +361,19 @@ export declare function runNativePilot({ harness, profile, cwd, promptFile, evid
|
|
|
363
361
|
stdoutFile?: never;
|
|
364
362
|
stderrFile?: never;
|
|
365
363
|
nativeEvidence?: never;
|
|
366
|
-
} | {
|
|
367
|
-
settlement?: never;
|
|
368
364
|
reservation_id?: never;
|
|
365
|
+
settlement?: never;
|
|
366
|
+
} | {
|
|
369
367
|
refused: boolean;
|
|
370
368
|
admission: {
|
|
371
|
-
reason?: never;
|
|
372
|
-
expected?: never;
|
|
373
|
-
actual?: never;
|
|
374
|
-
detail?: never;
|
|
375
|
-
state?: never;
|
|
376
369
|
required_skills?: never;
|
|
377
370
|
required_tools?: never;
|
|
378
371
|
preflight?: never;
|
|
372
|
+
state?: never;
|
|
373
|
+
detail?: never;
|
|
374
|
+
expected?: never;
|
|
375
|
+
actual?: never;
|
|
376
|
+
reason?: never;
|
|
379
377
|
ok: true;
|
|
380
378
|
checks: Record<string, unknown>[];
|
|
381
379
|
state_revision: number;
|
|
@@ -405,12 +403,13 @@ export declare function runNativePilot({ harness, profile, cwd, promptFile, evid
|
|
|
405
403
|
stdoutFile?: never;
|
|
406
404
|
stderrFile?: never;
|
|
407
405
|
nativeEvidence?: never;
|
|
406
|
+
reservation_id?: never;
|
|
407
|
+
settlement?: never;
|
|
408
408
|
} | {
|
|
409
409
|
reason?: never;
|
|
410
410
|
reservation?: never;
|
|
411
|
-
admission?: never;
|
|
412
411
|
refused?: never;
|
|
413
|
-
|
|
412
|
+
admission?: never;
|
|
414
413
|
execution: null;
|
|
415
414
|
evidenceError: string;
|
|
416
415
|
settlement: {
|
|
@@ -436,12 +435,12 @@ export declare function runNativePilot({ harness, profile, cwd, promptFile, evid
|
|
|
436
435
|
stdoutFile?: never;
|
|
437
436
|
stderrFile?: never;
|
|
438
437
|
nativeEvidence?: never;
|
|
438
|
+
reservation_id?: never;
|
|
439
439
|
} | {
|
|
440
440
|
reason?: never;
|
|
441
441
|
reservation?: never;
|
|
442
|
-
admission?: never;
|
|
443
442
|
refused?: never;
|
|
444
|
-
|
|
443
|
+
admission?: never;
|
|
445
444
|
process?: never;
|
|
446
445
|
execution: Record<string, unknown> | null;
|
|
447
446
|
evidenceError: string;
|
|
@@ -459,11 +458,12 @@ export declare function runNativePilot({ harness, profile, cwd, promptFile, evid
|
|
|
459
458
|
stdoutFile?: never;
|
|
460
459
|
stderrFile?: never;
|
|
461
460
|
nativeEvidence?: never;
|
|
461
|
+
reservation_id?: never;
|
|
462
462
|
} | {
|
|
463
463
|
reason?: never;
|
|
464
464
|
reservation?: never;
|
|
465
|
-
admission?: never;
|
|
466
465
|
refused?: never;
|
|
466
|
+
admission?: never;
|
|
467
467
|
process?: never;
|
|
468
468
|
evidenceError?: never;
|
|
469
469
|
execution: Record<string, unknown>;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { Diagnostic } from '../schemas/diagnostics.js';
|
|
2
|
+
import type { DocumentKind } from '../schemas/document.js';
|
|
3
|
+
export interface DocumentScanCandidate {
|
|
4
|
+
readonly path: string;
|
|
5
|
+
readonly kind: DocumentKind;
|
|
6
|
+
readonly visibility: 'private' | 'shareable';
|
|
7
|
+
}
|
|
8
|
+
export interface DocumentScanResult {
|
|
9
|
+
readonly ok: boolean;
|
|
10
|
+
readonly schema: 'pappra/docs-scan/1';
|
|
11
|
+
readonly mode: 'plan' | 'apply';
|
|
12
|
+
readonly workspaceRoot: string;
|
|
13
|
+
readonly candidates: readonly DocumentScanCandidate[];
|
|
14
|
+
readonly registered: readonly unknown[];
|
|
15
|
+
readonly skipped: number;
|
|
16
|
+
readonly nextActions: readonly string[];
|
|
17
|
+
readonly diagnostics: readonly Diagnostic[];
|
|
18
|
+
}
|
|
19
|
+
export type DocumentScanFailure = {
|
|
20
|
+
readonly ok: false;
|
|
21
|
+
readonly message: string;
|
|
22
|
+
} | DocumentScanResult;
|
|
23
|
+
export declare function classifyScannedDocumentKind(path: string): DocumentKind;
|
|
24
|
+
/**
|
|
25
|
+
* Registers documents discovered under the configured knowledge sources.
|
|
26
|
+
* Without apply this is read-only and reports the candidates.
|
|
27
|
+
*/
|
|
28
|
+
export declare function scanDiscoveredDocuments(root: string, options: {
|
|
29
|
+
readonly apply: boolean;
|
|
30
|
+
}): Promise<DocumentScanFailure>;
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { discoverWorkspace } from '../workspace/discover.js';
|
|
2
|
+
import { KnowledgeService } from './index.js';
|
|
3
|
+
export function classifyScannedDocumentKind(path) {
|
|
4
|
+
const lower = path.toLowerCase();
|
|
5
|
+
if (lower.endsWith('agents.md') || lower.endsWith('claude.md'))
|
|
6
|
+
return 'rule';
|
|
7
|
+
if (lower.includes('/research/'))
|
|
8
|
+
return 'research';
|
|
9
|
+
if (lower.includes('/adr/') || lower.includes('decision'))
|
|
10
|
+
return 'decision';
|
|
11
|
+
if (lower.includes('review') || lower.includes('retro'))
|
|
12
|
+
return 'review';
|
|
13
|
+
if (lower.includes('plan'))
|
|
14
|
+
return 'plan';
|
|
15
|
+
return 'architecture';
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Registers documents discovered under the configured knowledge sources.
|
|
19
|
+
* Without apply this is read-only and reports the candidates.
|
|
20
|
+
*/
|
|
21
|
+
export async function scanDiscoveredDocuments(root, options) {
|
|
22
|
+
const discovery = await discoverWorkspace(root);
|
|
23
|
+
const config = discovery.config;
|
|
24
|
+
if (config === null) {
|
|
25
|
+
return {
|
|
26
|
+
ok: false,
|
|
27
|
+
message: 'docs scan requires a valid .pappra/workspace.json; run pappra init first.',
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
const service = new KnowledgeService(root);
|
|
31
|
+
const listed = await service.list({ includePrivate: true });
|
|
32
|
+
const registered = new Set(listed.records.flatMap((record) => record.location.kind === 'workspace' ? [record.location.path] : []));
|
|
33
|
+
const sources = config.knowledge.sources;
|
|
34
|
+
const visibility = config.knowledge.taskVisibility === 'shared' ? 'shareable' : 'private';
|
|
35
|
+
const candidates = [];
|
|
36
|
+
for (const document of discovery.documents ?? []) {
|
|
37
|
+
const path = document.workspaceRelativePath;
|
|
38
|
+
if (path === null)
|
|
39
|
+
continue;
|
|
40
|
+
if (!sources.some((source) => path === source || path.startsWith(`${source}/`))) {
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
if (registered.has(path))
|
|
44
|
+
continue;
|
|
45
|
+
candidates.push({
|
|
46
|
+
path,
|
|
47
|
+
kind: classifyScannedDocumentKind(path),
|
|
48
|
+
visibility,
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
const diagnostics = [...listed.diagnostics];
|
|
52
|
+
if (!options.apply) {
|
|
53
|
+
return {
|
|
54
|
+
ok: true,
|
|
55
|
+
schema: 'pappra/docs-scan/1',
|
|
56
|
+
mode: 'plan',
|
|
57
|
+
workspaceRoot: root,
|
|
58
|
+
candidates,
|
|
59
|
+
registered: [],
|
|
60
|
+
skipped: candidates.length,
|
|
61
|
+
nextActions: [
|
|
62
|
+
'Rerun with apply: true to register these documents in the knowledge catalog.',
|
|
63
|
+
],
|
|
64
|
+
diagnostics,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
const registeredNow = [];
|
|
68
|
+
for (const candidate of candidates) {
|
|
69
|
+
const result = await service.register({
|
|
70
|
+
location: { kind: 'workspace', path: candidate.path },
|
|
71
|
+
kind: candidate.kind,
|
|
72
|
+
maturity: 'draft',
|
|
73
|
+
owner: 'human',
|
|
74
|
+
visibility: candidate.visibility,
|
|
75
|
+
});
|
|
76
|
+
diagnostics.push(...result.diagnostics);
|
|
77
|
+
if (result.ok)
|
|
78
|
+
registeredNow.push(result.record);
|
|
79
|
+
}
|
|
80
|
+
return {
|
|
81
|
+
ok: diagnostics.every((entry) => entry.severity !== 'error'),
|
|
82
|
+
schema: 'pappra/docs-scan/1',
|
|
83
|
+
mode: 'apply',
|
|
84
|
+
workspaceRoot: root,
|
|
85
|
+
candidates,
|
|
86
|
+
registered: registeredNow,
|
|
87
|
+
skipped: candidates.length - registeredNow.length,
|
|
88
|
+
nextActions: [],
|
|
89
|
+
diagnostics,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
export declare const MCP_SERVER_NAME = "pappra";
|
|
3
|
+
export interface PappraMcpServerOptions {
|
|
4
|
+
readonly root: string;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Builds the stdio MCP server for one workspace. Tools are read-only here; write
|
|
8
|
+
* operations are added separately and must stay behind apply/confirm gates.
|
|
9
|
+
*/
|
|
10
|
+
export declare function createPappraMcpServer(options: PappraMcpServerOptions): McpServer;
|
|
11
|
+
export declare function runMcpServer(root: string): Promise<void>;
|