@vkenliu/adit-cloud 0.2.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 (98) hide show
  1. package/LICENSE +21 -0
  2. package/dist/auth/credentials.d.ts +62 -0
  3. package/dist/auth/credentials.d.ts.map +1 -0
  4. package/dist/auth/credentials.js +151 -0
  5. package/dist/auth/credentials.js.map +1 -0
  6. package/dist/auth/device-auth.d.ts +40 -0
  7. package/dist/auth/device-auth.d.ts.map +1 -0
  8. package/dist/auth/device-auth.js +84 -0
  9. package/dist/auth/device-auth.js.map +1 -0
  10. package/dist/config.d.ts +48 -0
  11. package/dist/config.d.ts.map +1 -0
  12. package/dist/config.js +80 -0
  13. package/dist/config.js.map +1 -0
  14. package/dist/http/client.d.ts +28 -0
  15. package/dist/http/client.d.ts.map +1 -0
  16. package/dist/http/client.js +229 -0
  17. package/dist/http/client.js.map +1 -0
  18. package/dist/http/errors.d.ts +19 -0
  19. package/dist/http/errors.d.ts.map +1 -0
  20. package/dist/http/errors.js +31 -0
  21. package/dist/http/errors.js.map +1 -0
  22. package/dist/index.d.ts +20 -0
  23. package/dist/index.d.ts.map +1 -0
  24. package/dist/index.js +25 -0
  25. package/dist/index.js.map +1 -0
  26. package/dist/project-link/auto-link.d.ts +30 -0
  27. package/dist/project-link/auto-link.d.ts.map +1 -0
  28. package/dist/project-link/auto-link.js +91 -0
  29. package/dist/project-link/auto-link.js.map +1 -0
  30. package/dist/project-link/bulk-task.d.ts +15 -0
  31. package/dist/project-link/bulk-task.d.ts.map +1 -0
  32. package/dist/project-link/bulk-task.js +107 -0
  33. package/dist/project-link/bulk-task.js.map +1 -0
  34. package/dist/project-link/cache.d.ts +22 -0
  35. package/dist/project-link/cache.d.ts.map +1 -0
  36. package/dist/project-link/cache.js +82 -0
  37. package/dist/project-link/cache.js.map +1 -0
  38. package/dist/project-link/doc-discovery.d.ts +35 -0
  39. package/dist/project-link/doc-discovery.d.ts.map +1 -0
  40. package/dist/project-link/doc-discovery.js +260 -0
  41. package/dist/project-link/doc-discovery.js.map +1 -0
  42. package/dist/project-link/git-collector.d.ts +88 -0
  43. package/dist/project-link/git-collector.d.ts.map +1 -0
  44. package/dist/project-link/git-collector.js +250 -0
  45. package/dist/project-link/git-collector.js.map +1 -0
  46. package/dist/project-link/index.d.ts +15 -0
  47. package/dist/project-link/index.d.ts.map +1 -0
  48. package/dist/project-link/index.js +20 -0
  49. package/dist/project-link/index.js.map +1 -0
  50. package/dist/project-link/intent-command.d.ts +23 -0
  51. package/dist/project-link/intent-command.d.ts.map +1 -0
  52. package/dist/project-link/intent-command.js +104 -0
  53. package/dist/project-link/intent-command.js.map +1 -0
  54. package/dist/project-link/link-command.d.ts +26 -0
  55. package/dist/project-link/link-command.d.ts.map +1 -0
  56. package/dist/project-link/link-command.js +350 -0
  57. package/dist/project-link/link-command.js.map +1 -0
  58. package/dist/project-link/qualify.d.ts +25 -0
  59. package/dist/project-link/qualify.d.ts.map +1 -0
  60. package/dist/project-link/qualify.js +45 -0
  61. package/dist/project-link/qualify.js.map +1 -0
  62. package/dist/project-link/types.d.ts +254 -0
  63. package/dist/project-link/types.d.ts.map +1 -0
  64. package/dist/project-link/types.js +8 -0
  65. package/dist/project-link/types.js.map +1 -0
  66. package/dist/sync/auto-sync.d.ts +42 -0
  67. package/dist/sync/auto-sync.d.ts.map +1 -0
  68. package/dist/sync/auto-sync.js +136 -0
  69. package/dist/sync/auto-sync.js.map +1 -0
  70. package/dist/sync/conflicts.d.ts +27 -0
  71. package/dist/sync/conflicts.d.ts.map +1 -0
  72. package/dist/sync/conflicts.js +28 -0
  73. package/dist/sync/conflicts.js.map +1 -0
  74. package/dist/sync/engine.d.ts +76 -0
  75. package/dist/sync/engine.d.ts.map +1 -0
  76. package/dist/sync/engine.js +152 -0
  77. package/dist/sync/engine.js.map +1 -0
  78. package/dist/sync/serializer.d.ts +123 -0
  79. package/dist/sync/serializer.d.ts.map +1 -0
  80. package/dist/sync/serializer.js +280 -0
  81. package/dist/sync/serializer.js.map +1 -0
  82. package/dist/transcript/auto-upload.d.ts +25 -0
  83. package/dist/transcript/auto-upload.d.ts.map +1 -0
  84. package/dist/transcript/auto-upload.js +75 -0
  85. package/dist/transcript/auto-upload.js.map +1 -0
  86. package/dist/transcript/index.d.ts +4 -0
  87. package/dist/transcript/index.d.ts.map +1 -0
  88. package/dist/transcript/index.js +4 -0
  89. package/dist/transcript/index.js.map +1 -0
  90. package/dist/transcript/manager.d.ts +63 -0
  91. package/dist/transcript/manager.d.ts.map +1 -0
  92. package/dist/transcript/manager.js +143 -0
  93. package/dist/transcript/manager.js.map +1 -0
  94. package/dist/transcript/uploader.d.ts +135 -0
  95. package/dist/transcript/uploader.d.ts.map +1 -0
  96. package/dist/transcript/uploader.js +235 -0
  97. package/dist/transcript/uploader.js.map +1 -0
  98. package/package.json +29 -0
@@ -0,0 +1,350 @@
1
+ /**
2
+ * Project link command handler — orchestrates the 6-step link flow.
3
+ *
4
+ * Steps:
5
+ * 1. Check credentials (handled by caller)
6
+ * 2. Negotiate project ID with server
7
+ * 3. Upload git metadata (branches + commits)
8
+ * 4. Discover project documents
9
+ * 5. Upload documents (with user confirmation in interactive mode)
10
+ * 6. Quality check (and optional AI summary generation)
11
+ */
12
+ import { collectRemoteUrl, collectDefaultBranch, collectBranches, collectCommitLogs, collectCommitCount, resolveCommitBranches, projectNameFromRemoteUrl, } from "./git-collector.js";
13
+ import { discoverDocuments, loadDocSettings } from "./doc-discovery.js";
14
+ import { getProjectLinkCache, upsertProjectLinkCache, clearProjectLinkCache, updateCachedCommitSha, updateCachedDocHashes, updateCachedQualified, } from "./cache.js";
15
+ import { checkQuality, formatQualityFeedback } from "./qualify.js";
16
+ /** Maximum number of commits per upload batch */
17
+ const COMMIT_BATCH_SIZE = 1000;
18
+ /** Minimum staleness before re-uploading branches (1 hour) */
19
+ const BRANCH_STALE_MS = 60 * 60 * 1000;
20
+ /**
21
+ * Execute the project link flow.
22
+ *
23
+ * The caller is responsible for:
24
+ * - Loading credentials and verifying authentication
25
+ * - Creating the CloudClient with a valid server URL
26
+ * - Opening the database
27
+ *
28
+ * Returns a LinkResult summarizing what was done.
29
+ */
30
+ export async function linkCommand(db, client, projectRoot, projectId, serverUrl, options = {}) {
31
+ // In JSON mode, suppress progress output
32
+ const log = options.json ? (() => { }) : console.log.bind(console);
33
+ // Step timing tracker
34
+ const totalStart = performance.now();
35
+ const stepTimings = [];
36
+ function startStep() {
37
+ return performance.now();
38
+ }
39
+ function endStep(stepName, stepStart) {
40
+ stepTimings.push({ step: stepName, durationMs: Math.round(performance.now() - stepStart) });
41
+ }
42
+ // Handle --force: clear local cache and server data
43
+ if (options.force) {
44
+ log("Clearing cached link data...");
45
+ clearProjectLinkCache(db, projectId, serverUrl);
46
+ try {
47
+ await client.delete(`/api/project-link/reset?projectId=${encodeURIComponent(projectId)}`);
48
+ log("Server link data cleared.");
49
+ }
50
+ catch {
51
+ // Server reset may fail if no link exists yet — that's fine
52
+ }
53
+ }
54
+ // Load or initialize cache
55
+ let cache = getProjectLinkCache(db, projectId, serverUrl);
56
+ // ──────────────────────────────────────────────────────────
57
+ // Step 2: Negotiate project ID
58
+ // ──────────────────────────────────────────────────────────
59
+ log("\n[Step 1/6] Negotiating project ID with server...");
60
+ const step1Start = startStep();
61
+ const remoteUrl = await collectRemoteUrl(projectRoot);
62
+ const projectName = projectNameFromRemoteUrl(remoteUrl);
63
+ let confirmedProjectId = cache?.confirmedProjectId ?? null;
64
+ if (!confirmedProjectId || options.force) {
65
+ const negotiate = await client.post("/api/project-link/negotiate", { projectId, remoteUrl, projectName });
66
+ confirmedProjectId = negotiate.confirmedProjectId;
67
+ if (negotiate.status === "id_mismatch") {
68
+ log(` Server found existing project with different ID. Adopting: ${confirmedProjectId}`);
69
+ }
70
+ log(` Project confirmed: ${negotiate.projectName} (${confirmedProjectId.slice(0, 12)}...)`);
71
+ // Initialize or update cache
72
+ const now = new Date().toISOString();
73
+ if (!cache) {
74
+ cache = {
75
+ projectId,
76
+ serverUrl,
77
+ confirmedProjectId,
78
+ lastCommitSha: null,
79
+ lastBranchSyncAt: null,
80
+ lastDocSyncAt: null,
81
+ docHashes: {},
82
+ qualified: false,
83
+ initializedAt: now,
84
+ updatedAt: now,
85
+ };
86
+ upsertProjectLinkCache(db, cache);
87
+ }
88
+ else {
89
+ cache.confirmedProjectId = confirmedProjectId;
90
+ cache.updatedAt = now;
91
+ upsertProjectLinkCache(db, cache);
92
+ }
93
+ }
94
+ else {
95
+ log(` Project confirmed: ${projectName} (${confirmedProjectId.slice(0, 12)}...)`);
96
+ }
97
+ // At this point cache is guaranteed non-null: either loaded from DB
98
+ // (else branch) or freshly created (if branch). Assert for TypeScript.
99
+ if (!cache) {
100
+ throw new Error("Internal error: project link cache not initialized after negotiate");
101
+ }
102
+ // Use the confirmed project ID for all subsequent API calls
103
+ const effectiveProjectId = confirmedProjectId;
104
+ endStep("Negotiate project ID", step1Start);
105
+ // ──────────────────────────────────────────────────────────
106
+ // Step 3: Upload git metadata (branches + commits)
107
+ // ──────────────────────────────────────────────────────────
108
+ log("\n[Step 2/6] Uploading git metadata...");
109
+ const step2Start = startStep();
110
+ // 3a. Branches — collect once and reuse for commit branch resolution
111
+ const branchesStale = !cache.lastBranchSyncAt ||
112
+ (Date.now() - new Date(cache.lastBranchSyncAt).getTime() > BRANCH_STALE_MS) ||
113
+ options.force;
114
+ const allBranches = await collectBranches(projectRoot);
115
+ const defaultBranch = await collectDefaultBranch(projectRoot);
116
+ let branchCount = 0;
117
+ if (branchesStale) {
118
+ if (options.dryRun) {
119
+ log(` [dry-run] Would upload ${allBranches.length} branches, default: ${defaultBranch ?? "unknown"}`);
120
+ branchCount = allBranches.length;
121
+ }
122
+ else {
123
+ const initResponse = await client.post("/api/project-link/init", {
124
+ projectId: effectiveProjectId,
125
+ remoteUrl,
126
+ defaultBranch,
127
+ branches: allBranches.map((b) => ({
128
+ name: b.name,
129
+ headSha: b.headSha,
130
+ })),
131
+ });
132
+ branchCount = initResponse.projectLink.branchCount;
133
+ cache.lastBranchSyncAt = new Date().toISOString();
134
+ upsertProjectLinkCache(db, cache);
135
+ log(` ${branchCount} branches, default: ${defaultBranch ?? "unknown"}`);
136
+ }
137
+ }
138
+ else {
139
+ log(" Branches up to date (synced < 1 hour ago)");
140
+ }
141
+ // 3b. Commits
142
+ let commitCount = 0;
143
+ if (!options.skipCommits) {
144
+ // Collect commits and resolve per-commit branch assignment by checking
145
+ // which branches each commit is reachable from. Non-default branches
146
+ // take priority so merged feature-branch commits keep their origin.
147
+ const commits = await collectCommitLogs(projectRoot, {
148
+ sinceCommitSha: cache.lastCommitSha,
149
+ });
150
+ const totalCommits = await collectCommitCount(projectRoot);
151
+ // Resolve branch for each commit using collected branch data
152
+ if (commits.length > 0) {
153
+ await resolveCommitBranches(projectRoot, commits, allBranches, defaultBranch);
154
+ }
155
+ if (commits.length === 0) {
156
+ log(" No new commits to upload.");
157
+ commitCount = totalCommits;
158
+ }
159
+ else if (options.dryRun) {
160
+ log(` [dry-run] Would upload ${commits.length} commits (${totalCommits} total)`);
161
+ commitCount = totalCommits;
162
+ }
163
+ else {
164
+ // Upload in batches
165
+ let uploaded = 0;
166
+ for (let i = 0; i < commits.length; i += COMMIT_BATCH_SIZE) {
167
+ const batch = commits.slice(i, i + COMMIT_BATCH_SIZE);
168
+ const response = await client.post("/api/project-link/commits", {
169
+ projectId: effectiveProjectId,
170
+ sinceCommitSha: cache.lastCommitSha,
171
+ commits: batch.map((c) => ({
172
+ sha: c.sha,
173
+ authorName: c.authorName,
174
+ authorEmail: c.authorEmail,
175
+ date: c.date,
176
+ message: c.message,
177
+ branch: c.branch,
178
+ })),
179
+ });
180
+ uploaded += response.accepted;
181
+ commitCount = response.totalCommits;
182
+ // Show progress for large uploads
183
+ if (commits.length > COMMIT_BATCH_SIZE) {
184
+ const done = Math.min(i + COMMIT_BATCH_SIZE, commits.length);
185
+ log(` Uploading commits... ${done}/${commits.length}`);
186
+ }
187
+ }
188
+ // Update cache with latest commit SHA
189
+ if (commits.length > 0) {
190
+ updateCachedCommitSha(db, effectiveProjectId, serverUrl, commits[0].sha);
191
+ cache.lastCommitSha = commits[0].sha;
192
+ }
193
+ log(` ${uploaded} new commits uploaded (${commitCount} total)`);
194
+ }
195
+ }
196
+ else {
197
+ log(" Skipping commit history (--skip-commits)");
198
+ }
199
+ endStep("Upload git metadata", step2Start);
200
+ // ──────────────────────────────────────────────────────────
201
+ // Step 4: Discover project documents
202
+ // ──────────────────────────────────────────────────────────
203
+ let documentCount = 0;
204
+ let discoveredDocs = [];
205
+ const step3Start = startStep();
206
+ if (!options.skipDocs) {
207
+ log("\n[Step 3/6] Discovering project documents...");
208
+ const docSettings = loadDocSettings(projectRoot);
209
+ discoveredDocs = discoverDocuments(projectRoot, cache.docHashes, docSettings);
210
+ if (discoveredDocs.length === 0) {
211
+ log(" No documents found matching patterns.");
212
+ }
213
+ else {
214
+ log(` Found ${discoveredDocs.length} document${discoveredDocs.length !== 1 ? "s" : ""}:`);
215
+ for (const doc of discoveredDocs) {
216
+ const sizeKB = (doc.sizeBytes / 1024).toFixed(1);
217
+ const tag = doc.status === "new" ? "[NEW] " :
218
+ doc.status === "changed" ? "[CHANGED]" :
219
+ "[SKIP] ";
220
+ log(` ${tag} ${doc.sourcePath} (${sizeKB} KB)`);
221
+ }
222
+ // Warn if many documents matched
223
+ if (discoveredDocs.length > 50) {
224
+ log(`\n Warning: ${discoveredDocs.length} documents found. Consider narrowing patterns in settings.json`);
225
+ }
226
+ }
227
+ // ──────────────────────────────────────────────────────────
228
+ // Step 5: Upload documents
229
+ // ──────────────────────────────────────────────────────────
230
+ const toUpload = discoveredDocs.filter((d) => d.status !== "unchanged");
231
+ if (toUpload.length === 0) {
232
+ log("\n[Step 4/6] All documents up to date.");
233
+ documentCount = discoveredDocs.length;
234
+ }
235
+ else if (options.dryRun) {
236
+ log(`\n[Step 4/6] [dry-run] Would upload ${toUpload.length} document${toUpload.length !== 1 ? "s" : ""}`);
237
+ documentCount = discoveredDocs.length;
238
+ }
239
+ else {
240
+ log(`\n[Step 4/6] Uploading ${toUpload.length} document${toUpload.length !== 1 ? "s" : ""}...`);
241
+ const response = await client.post("/api/project-link/documents", {
242
+ projectId: effectiveProjectId,
243
+ documents: toUpload.map((d) => ({
244
+ fileName: d.fileName,
245
+ sourcePath: d.sourcePath,
246
+ content: d.content,
247
+ contentHash: d.contentHash,
248
+ })),
249
+ });
250
+ const s = response.summary;
251
+ log(` ${s.total} documents processed (${s.created} new, ${s.updated} updated, ${s.unchanged} unchanged)`);
252
+ documentCount = discoveredDocs.length;
253
+ // Update cached hashes
254
+ const newHashes = { ...cache.docHashes };
255
+ for (const doc of discoveredDocs) {
256
+ newHashes[doc.sourcePath] = doc.contentHash;
257
+ }
258
+ updateCachedDocHashes(db, effectiveProjectId, serverUrl, newHashes);
259
+ cache.docHashes = newHashes;
260
+ }
261
+ }
262
+ else {
263
+ log("\n[Step 3/6] Skipping document upload (--skip-docs)");
264
+ log("\n[Step 4/6] Skipping document upload (--skip-docs)");
265
+ }
266
+ endStep("Discover & upload documents", step3Start);
267
+ // ──────────────────────────────────────────────────────────
268
+ // Step 6: Quality check
269
+ // ──────────────────────────────────────────────────────────
270
+ let qualified = cache.qualified;
271
+ let score = null;
272
+ const step5Start = startStep();
273
+ if (!options.skipDocs && !options.dryRun && !options.skipQualify) {
274
+ log("\n[Step 5/6] Checking document quality...");
275
+ const qualifyResult = await checkQuality(client, effectiveProjectId);
276
+ qualified = qualifyResult.qualified;
277
+ score = qualifyResult.score;
278
+ if (qualified) {
279
+ log(` Documents qualified (score: ${score.toFixed(2)})`);
280
+ }
281
+ else {
282
+ log(` Documents not yet qualified (score: ${score.toFixed(2)})`);
283
+ const feedback = formatQualityFeedback(qualifyResult);
284
+ if (feedback) {
285
+ log(feedback);
286
+ }
287
+ // In CLI context: show the summary prompt for the user
288
+ if (qualifyResult.feedback?.summaryPrompt) {
289
+ log("");
290
+ log(" To improve quality, generate a project summary by running this");
291
+ log(" prompt in your AI coding CLI, then re-run '/adit link':");
292
+ log("");
293
+ log(` "${qualifyResult.feedback.summaryPrompt}"`);
294
+ }
295
+ }
296
+ updateCachedQualified(db, effectiveProjectId, serverUrl, qualified);
297
+ cache.qualified = qualified;
298
+ }
299
+ else {
300
+ log("\n[Step 5/6] Skipping quality check");
301
+ }
302
+ endStep("Quality check", step5Start);
303
+ const totalDurationMs = Math.round(performance.now() - totalStart);
304
+ // ──────────────────────────────────────────────────────────
305
+ // Final: Summary
306
+ // ──────────────────────────────────────────────────────────
307
+ const qualifiedLabel = qualified ? "qualified" : "not qualified";
308
+ log("");
309
+ log("══════════════════════════════════════════");
310
+ log("Project link complete!");
311
+ log(`Project: ${projectName}`);
312
+ log(`Server: ${serverUrl}`);
313
+ log(`Branches: ${branchCount}`);
314
+ log(`Commits: ${commitCount}`);
315
+ log(`Documents: ${documentCount} (${qualifiedLabel})`);
316
+ log("──────────────────────────────────────────");
317
+ for (const t of stepTimings) {
318
+ log(` ${t.step.padEnd(28)} ${formatDuration(t.durationMs)}`);
319
+ }
320
+ log(` ${"Total".padEnd(28)} ${formatDuration(totalDurationMs)}`);
321
+ log("══════════════════════════════════════════");
322
+ return {
323
+ projectId: effectiveProjectId,
324
+ projectName,
325
+ serverUrl,
326
+ branchCount,
327
+ commitCount,
328
+ documentCount,
329
+ qualified,
330
+ score,
331
+ stepTimings,
332
+ totalDurationMs,
333
+ };
334
+ }
335
+ /**
336
+ * Format a duration in milliseconds to a human-readable string.
337
+ *
338
+ * Examples: "42ms", "1.2s", "2m 3s"
339
+ */
340
+ function formatDuration(ms) {
341
+ if (ms < 1000)
342
+ return `${ms}ms`;
343
+ const seconds = ms / 1000;
344
+ if (seconds < 60)
345
+ return `${seconds.toFixed(1)}s`;
346
+ const minutes = Math.floor(seconds / 60);
347
+ const remainingSeconds = Math.round(seconds % 60);
348
+ return `${minutes}m ${remainingSeconds}s`;
349
+ }
350
+ //# sourceMappingURL=link-command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"link-command.js","sourceRoot":"","sources":["../../src/project-link/link-command.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Document quality check and feedback formatting.
3
+ *
4
+ * Calls the server's qualify endpoint to evaluate whether uploaded
5
+ * project documents provide sufficient context for IDD planning.
6
+ * If not qualified, formats the server's feedback for display and
7
+ * returns the summaryPrompt for the AI agent to use.
8
+ */
9
+ import type { CloudClient } from "../http/client.js";
10
+ import type { QualifyResponse } from "./types.js";
11
+ /**
12
+ * Check document quality with the server.
13
+ *
14
+ * Returns the server's qualify response including score, qualification
15
+ * status, and feedback with a summary prompt if not qualified.
16
+ */
17
+ export declare function checkQuality(client: CloudClient, projectId: string): Promise<QualifyResponse>;
18
+ /**
19
+ * Format quality feedback for human-readable display.
20
+ *
21
+ * Returns a multi-line string describing what's missing and
22
+ * suggestions for improvement. Returns null if already qualified.
23
+ */
24
+ export declare function formatQualityFeedback(response: QualifyResponse): string | null;
25
+ //# sourceMappingURL=qualify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qualify.d.ts","sourceRoot":"","sources":["../../src/project-link/qualify.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD;;;;;GAKG;AACH,wBAAsB,YAAY,CAChC,MAAM,EAAE,WAAW,EACnB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,eAAe,CAAC,CAI1B;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,eAAe,GAAG,MAAM,GAAG,IAAI,CAuB9E"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Document quality check and feedback formatting.
3
+ *
4
+ * Calls the server's qualify endpoint to evaluate whether uploaded
5
+ * project documents provide sufficient context for IDD planning.
6
+ * If not qualified, formats the server's feedback for display and
7
+ * returns the summaryPrompt for the AI agent to use.
8
+ */
9
+ /**
10
+ * Check document quality with the server.
11
+ *
12
+ * Returns the server's qualify response including score, qualification
13
+ * status, and feedback with a summary prompt if not qualified.
14
+ */
15
+ export async function checkQuality(client, projectId) {
16
+ return client.get(`/api/project-link/qualify?projectId=${encodeURIComponent(projectId)}`);
17
+ }
18
+ /**
19
+ * Format quality feedback for human-readable display.
20
+ *
21
+ * Returns a multi-line string describing what's missing and
22
+ * suggestions for improvement. Returns null if already qualified.
23
+ */
24
+ export function formatQualityFeedback(response) {
25
+ if (response.qualified || !response.feedback)
26
+ return null;
27
+ const lines = [];
28
+ lines.push(` Score: ${response.score.toFixed(2)} (needs 0.60 to qualify)`);
29
+ lines.push("");
30
+ if (response.feedback.missing.length > 0) {
31
+ lines.push(" Missing:");
32
+ for (const item of response.feedback.missing) {
33
+ lines.push(` - ${item}`);
34
+ }
35
+ lines.push("");
36
+ }
37
+ if (response.feedback.suggestions.length > 0) {
38
+ lines.push(" Suggestions:");
39
+ for (const item of response.feedback.suggestions) {
40
+ lines.push(` - ${item}`);
41
+ }
42
+ }
43
+ return lines.join("\n");
44
+ }
45
+ //# sourceMappingURL=qualify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qualify.js","sourceRoot":"","sources":["../../src/project-link/qualify.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,MAAmB,EACnB,SAAiB;IAEjB,OAAO,MAAM,CAAC,GAAG,CACf,uCAAuC,kBAAkB,CAAC,SAAS,CAAC,EAAE,CACvE,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAC,QAAyB;IAC7D,IAAI,QAAQ,CAAC,SAAS,IAAI,CAAC,QAAQ,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAE1D,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,YAAY,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,0BAA0B,CAAC,CAAC;IAC5E,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,IAAI,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACzB,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;YAC7C,KAAK,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;QAC9B,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,IAAI,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7C,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAC7B,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;YACjD,KAAK,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}