@cliangdev/conductor 0.12.1 → 0.14.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.
@@ -0,0 +1,400 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ import { basename, extname } from 'node:path';
3
+ import { apiGet, apiPost, apiPut, apiPatch, apiDelete, apiPostFile } from '../api.js';
4
+ /**
5
+ * Project Docs MCP tools — the project's own document tree (folders → Markdown docs → line comments →
6
+ * tickable checkboxes), distinct from Work Item documents (see documents.ts) and from Knowledge pages.
7
+ *
8
+ * Docs are addressed by path ("Plans/Q3 Roadmap"): folder segments plus the doc title. Flow:
9
+ * list_project_docs maps the tree, read_project_doc returns content plus a ready-made index of its task
10
+ * lines, write_project_doc upserts (creating folders on the way), set_project_doc_task ticks one box,
11
+ * and the comment tools read and answer human feedback. Every full-content write is versioned, so
12
+ * list_project_doc_versions / restore_project_doc_version can walk that history back.
13
+ */
14
+ const TITLE_SEPARATOR = '/';
15
+ /**
16
+ * One GFM task list item, kept in sync with {@code ProjectDocService.TASK_LIST_ITEM} on the backend and
17
+ * {@code toggleTaskLine} in the frontend. Group 1 is the checked-state character.
18
+ */
19
+ const TASK_LIST_ITEM = /^\s*(?:>\s*)*(?:[-*+]|\d{1,9}[.)])\s+\[([ xX])\]\s?(.*)$/;
20
+ function docsBase(config) {
21
+ return `/api/v1/projects/${config.projectId}/docs`;
22
+ }
23
+ async function listFolders(config) {
24
+ const raw = await apiGet(`${docsBase(config)}/folders`, config);
25
+ return Array.isArray(raw) ? raw : [];
26
+ }
27
+ async function listDocsIn(folderId, config) {
28
+ const query = folderId === null ? '' : `?folderId=${encodeURIComponent(folderId)}`;
29
+ const raw = await apiGet(`${docsBase(config)}${query}`, config);
30
+ return Array.isArray(raw) ? raw : [];
31
+ }
32
+ /** Every doc in the project in one call — the whole tree without a request per folder. */
33
+ async function listAllDocs(config) {
34
+ const raw = await apiGet(`${docsBase(config)}?recursive=true`, config);
35
+ return Array.isArray(raw) ? raw : [];
36
+ }
37
+ /** Full path of a folder, e.g. "Plans/Q3". */
38
+ function folderPath(folder, byId) {
39
+ const segments = [];
40
+ let current = folder;
41
+ // Guard against a cycle rather than hanging: the backend has no such data, but a path walk that can
42
+ // loop forever is not worth the risk in a tool an agent calls unattended.
43
+ const seen = new Set();
44
+ while (current && !seen.has(current.id)) {
45
+ seen.add(current.id);
46
+ segments.unshift(current.name);
47
+ current = current.parentId ? byId.get(current.parentId) : undefined;
48
+ }
49
+ return segments.join(TITLE_SEPARATOR);
50
+ }
51
+ function splitPath(path) {
52
+ const segments = path
53
+ .split(TITLE_SEPARATOR)
54
+ .map((s) => s.trim())
55
+ .filter((s) => s.length > 0);
56
+ if (segments.length === 0) {
57
+ throw new Error('Path is empty — expected something like "Plans/Q3 Roadmap"');
58
+ }
59
+ const title = segments.pop();
60
+ return { folderSegments: segments, title };
61
+ }
62
+ /** Walks folder segments, returning the id of the deepest one (null = project root). */
63
+ function resolveFolder(folderSegments, folders, path) {
64
+ let parentId = null;
65
+ for (const segment of folderSegments) {
66
+ const match = folders.find((f) => f.parentId === parentId && f.name === segment);
67
+ if (!match) {
68
+ throw new Error(`Folder "${segment}" not found in path "${path}"`);
69
+ }
70
+ parentId = match.id;
71
+ }
72
+ return parentId;
73
+ }
74
+ /** Creates any missing folder along the path and returns the deepest folder id (null = root). */
75
+ async function ensureFolder(folderSegments, config) {
76
+ let folders = await listFolders(config);
77
+ let parentId = null;
78
+ for (const segment of folderSegments) {
79
+ let match = folders.find((f) => f.parentId === parentId && f.name === segment);
80
+ if (!match) {
81
+ const created = await apiPost(`${docsBase(config)}/folders`, { name: segment, parentId }, config);
82
+ match = { id: created.id, parentId: created.parentId ?? null, name: created.name };
83
+ folders = [...folders, match];
84
+ }
85
+ parentId = match.id;
86
+ }
87
+ return parentId;
88
+ }
89
+ /**
90
+ * Resolves `path` to a doc id, or returns the folder it should live in when no such doc exists yet.
91
+ * A title containing "/" cannot be addressed this way — pass `docId` for those.
92
+ */
93
+ async function resolvePath(path, config) {
94
+ const { folderSegments, title } = splitPath(path);
95
+ const folders = await listFolders(config);
96
+ const folderId = resolveFolder(folderSegments, folders, path);
97
+ const docs = await listDocsIn(folderId, config);
98
+ const match = docs.find((d) => d.title === title);
99
+ return {
100
+ doc: match ? { docId: match.id, folderId: match.folderId ?? null, title: match.title } : null,
101
+ folderId,
102
+ title,
103
+ };
104
+ }
105
+ /** Every tool accepts either form; `docId` wins when both are given. */
106
+ async function requireDocId(params, config) {
107
+ if (params.docId)
108
+ return params.docId;
109
+ if (!params.path) {
110
+ throw new Error('Provide either path or docId');
111
+ }
112
+ const { doc } = await resolvePath(params.path, config);
113
+ if (!doc) {
114
+ throw new Error(`No document at path "${params.path}"`);
115
+ }
116
+ return doc.docId;
117
+ }
118
+ export function taskLines(content) {
119
+ if (!content)
120
+ return [];
121
+ const lines = [];
122
+ content.split('\n').forEach((line, index) => {
123
+ const match = line.match(TASK_LIST_ITEM);
124
+ if (match) {
125
+ lines.push({
126
+ lineNumber: index + 1,
127
+ checked: match[1].toLowerCase() === 'x',
128
+ text: match[2].trim(),
129
+ });
130
+ }
131
+ });
132
+ return lines;
133
+ }
134
+ export async function listProjectDocs(params, config) {
135
+ if (params.query) {
136
+ const results = await apiGet(`${docsBase(config)}/search?q=${encodeURIComponent(params.query)}`, config);
137
+ const folders = await listFolders(config);
138
+ const byId = new Map(folders.map((f) => [f.id, f]));
139
+ return {
140
+ matches: (Array.isArray(results) ? results : []).map((r) => ({
141
+ docId: r['id'],
142
+ path: joinPath(r['folderId'], r['title'], byId),
143
+ snippet: r['snippet'],
144
+ })),
145
+ };
146
+ }
147
+ const folders = await listFolders(config);
148
+ const byId = new Map(folders.map((f) => [f.id, f]));
149
+ // One recursive call rather than one per folder: this is the orientation call, so a project with
150
+ // thirty folders must not cost thirty-one serial round trips.
151
+ const all = params.folder === undefined
152
+ ? await listAllDocs(config)
153
+ : await listDocsIn(resolveFolder(splitPathAsFolders(params.folder), folders, params.folder), config);
154
+ const docs = all.map((doc) => ({
155
+ docId: doc.id,
156
+ path: joinPath(doc.folderId ?? null, doc.title, byId),
157
+ updatedAt: doc.updatedAt,
158
+ updatedByName: doc.updatedByName,
159
+ }));
160
+ return {
161
+ // docCount and lastUpdatedAt come free from the doc list, and answer the question an agent
162
+ // actually has when it looks at a tree: which of these folders carry weight, and which are stale
163
+ // or empty and worth reorganising.
164
+ folders: folders
165
+ .map((f) => {
166
+ const inFolder = all.filter((d) => d.folderId === f.id);
167
+ const timestamps = inFolder.map((d) => d.updatedAt).filter((t) => Boolean(t));
168
+ return {
169
+ path: folderPath(f, byId),
170
+ docCount: inFolder.length,
171
+ lastUpdatedAt: timestamps.length ? timestamps.sort()[timestamps.length - 1] : null,
172
+ };
173
+ })
174
+ .sort((a, b) => a.path.localeCompare(b.path)),
175
+ docs: docs.sort((a, b) => a.path.localeCompare(b.path)),
176
+ };
177
+ }
178
+ /** Like splitPath, but every segment is a folder (no trailing doc title). */
179
+ function splitPathAsFolders(path) {
180
+ return path
181
+ .split(TITLE_SEPARATOR)
182
+ .map((s) => s.trim())
183
+ .filter((s) => s.length > 0);
184
+ }
185
+ function joinPath(folderId, title, byId) {
186
+ const folder = folderId ? byId.get(folderId) : undefined;
187
+ return folder ? `${folderPath(folder, byId)}${TITLE_SEPARATOR}${title}` : title;
188
+ }
189
+ export async function readProjectDoc(params, config) {
190
+ const docId = await requireDocId(params, config);
191
+ const doc = await apiGet(`${docsBase(config)}/${docId}`, config);
192
+ const folders = await listFolders(config);
193
+ const byId = new Map(folders.map((f) => [f.id, f]));
194
+ // An earlier version is the same intent — "read this document" — so it rides on the same tool rather
195
+ // than a third one the agent has to learn.
196
+ let content = doc.content ?? '';
197
+ if (params.versionNumber !== undefined) {
198
+ const version = await findVersion(docId, params.versionNumber, config);
199
+ const full = await apiGet(`${docsBase(config)}/${docId}/versions/${version.id}`, config);
200
+ content = full.content ?? '';
201
+ }
202
+ return {
203
+ docId: doc.id,
204
+ path: joinPath(doc.folderId ?? null, doc.title, byId),
205
+ title: doc.title,
206
+ versionNumber: params.versionNumber,
207
+ content,
208
+ updatedByName: doc.updatedByName,
209
+ updatedAt: doc.updatedAt,
210
+ // Precomputed so a checkbox can be ticked by line number without the caller counting lines itself.
211
+ taskLines: taskLines(content),
212
+ };
213
+ }
214
+ async function findVersion(docId, versionNumber, config) {
215
+ const raw = await apiGet(`${docsBase(config)}/${docId}/versions`, config);
216
+ const versions = Array.isArray(raw) ? raw : [];
217
+ const match = versions.find((v) => v.versionNumber === versionNumber);
218
+ if (!match) {
219
+ const known = versions.map((v) => v.versionNumber).join(', ');
220
+ throw new Error(`No version ${versionNumber} for this document${known ? ` — available: ${known}` : ''}`);
221
+ }
222
+ return match;
223
+ }
224
+ export async function listProjectDocVersions(params, config) {
225
+ const docId = await requireDocId(params, config);
226
+ const raw = await apiGet(`${docsBase(config)}/${docId}/versions`, config);
227
+ return (Array.isArray(raw) ? raw : []).map((v) => ({
228
+ versionNumber: v.versionNumber,
229
+ authorName: v.authorName,
230
+ createdAt: v.createdAt,
231
+ }));
232
+ }
233
+ /**
234
+ * Restoring writes the old content as a *new* version rather than rewinding, so the history stays
235
+ * append-only and the restore itself is undoable.
236
+ */
237
+ export async function restoreProjectDocVersion(params, config) {
238
+ const docId = await requireDocId(params, config);
239
+ const version = await findVersion(docId, params.versionNumber, config);
240
+ const doc = await apiPost(`${docsBase(config)}/${docId}/versions/${version.id}/restore`, {}, config);
241
+ return {
242
+ docId,
243
+ restoredFromVersion: params.versionNumber,
244
+ content: doc.content ?? '',
245
+ };
246
+ }
247
+ const IMAGE_CONTENT_TYPES = {
248
+ '.png': 'image/png',
249
+ '.jpg': 'image/jpeg',
250
+ '.jpeg': 'image/jpeg',
251
+ '.gif': 'image/gif',
252
+ '.webp': 'image/webp',
253
+ };
254
+ /**
255
+ * Uploads a local image file and returns the Markdown to embed. The URL inside that snippet is
256
+ * short-lived, but writing it into a doc is safe: the backend stores a stable reference and re-signs on
257
+ * every read, so the embedded image does not expire.
258
+ */
259
+ export async function uploadProjectDocImage(params, config) {
260
+ const extension = extname(params.filePath).toLowerCase();
261
+ const contentType = IMAGE_CONTENT_TYPES[extension];
262
+ if (!contentType) {
263
+ throw new Error(`Unsupported image type "${extension || params.filePath}" — allowed: ${Object.keys(IMAGE_CONTENT_TYPES).join(', ')}`);
264
+ }
265
+ const docId = await requireDocId(params, config);
266
+ const bytes = await readFile(params.filePath);
267
+ const result = await apiPostFile(`${docsBase(config)}/${docId}/images`, {
268
+ fieldName: 'image',
269
+ filename: basename(params.filePath),
270
+ contentType,
271
+ bytes: new Uint8Array(bytes),
272
+ }, config);
273
+ return { docId, markdownSnippet: result.markdownSnippet };
274
+ }
275
+ export async function writeProjectDoc(params, config) {
276
+ const { folderSegments, title } = splitPath(params.path);
277
+ const folderId = await ensureFolder(folderSegments, config);
278
+ const existing = (await listDocsIn(folderId, config)).find((d) => d.title === title);
279
+ if (existing) {
280
+ await apiPut(`${docsBase(config)}/${existing.id}`, { content: params.content }, config);
281
+ return { docId: existing.id, path: params.path, created: false };
282
+ }
283
+ const created = await apiPost(`${docsBase(config)}`, { title, folderId, content: params.content }, config);
284
+ return { docId: created.id, path: params.path, created: true };
285
+ }
286
+ export async function moveProjectDoc(params, config) {
287
+ const docId = await requireDocId(params, config);
288
+ const { folderSegments, title } = splitPath(params.newPath);
289
+ const folderId = await ensureFolder(folderSegments, config);
290
+ // moveToRoot rather than folderId: null. The API cannot distinguish an omitted folderId from an
291
+ // explicit null, so sending null would rename the doc and silently leave it where it was — while
292
+ // this tool reported a move.
293
+ const body = folderId === null ? { title, moveToRoot: true } : { title, folderId };
294
+ const moved = await apiPatch(`${docsBase(config)}/${docId}`, body, config);
295
+ return { docId: moved.id, path: params.newPath };
296
+ }
297
+ /** Resolves a folder path to its id, requiring every segment to exist. */
298
+ async function requireFolderId(path, config) {
299
+ const segments = splitPathAsFolders(path);
300
+ if (segments.length === 0) {
301
+ throw new Error('Path is empty — expected a folder path like "Plans/Q3"');
302
+ }
303
+ const folders = await listFolders(config);
304
+ const folderId = resolveFolder(segments, folders, path);
305
+ if (folderId === null) {
306
+ throw new Error(`No folder at path "${path}"`);
307
+ }
308
+ return folderId;
309
+ }
310
+ /**
311
+ * Renames and/or reparents a folder, moving its whole subtree with it. Creating destination folders
312
+ * on the way mirrors write_project_doc, so "Plans/Q3" → "Archive/2026/Q3" works without pre-creating
313
+ * Archive/2026.
314
+ */
315
+ export async function moveProjectFolder(params, config) {
316
+ const folderId = await requireFolderId(params.path, config);
317
+ const segments = splitPathAsFolders(params.newPath);
318
+ if (segments.length === 0) {
319
+ throw new Error('newPath is empty — expected a folder path like "Archive/Q3"');
320
+ }
321
+ const name = segments.pop();
322
+ const parentId = await ensureFolder(segments, config);
323
+ const body = parentId === null ? { name, moveToRoot: true } : { name, parentId };
324
+ await apiPatch(`${docsBase(config)}/folders/${folderId}`, body, config);
325
+ return { folderId, path: params.newPath };
326
+ }
327
+ /**
328
+ * Deletes a folder and its subfolders. Documents inside are not deleted — they resurface at the
329
+ * project root — so this is a reorganisation, not a way to remove content.
330
+ */
331
+ export async function deleteProjectFolder(params, config) {
332
+ const folderId = await requireFolderId(params.path, config);
333
+ await apiDelete(`${docsBase(config)}/folders/${folderId}`, config);
334
+ return { folderId, deleted: true };
335
+ }
336
+ export async function deleteProjectDoc(params, config) {
337
+ const docId = await requireDocId(params, config);
338
+ await apiDelete(`${docsBase(config)}/${docId}`, config);
339
+ return { docId, deleted: true };
340
+ }
341
+ /**
342
+ * A 409 here means the addressed line is no longer a task item — the doc moved under the caller. That
343
+ * is information the agent can act on, so it comes back as data rather than an exception
344
+ * (docs/mcp-tool-guidelines.md § "no false promises"), mirroring knowledge.ts's conflict handling.
345
+ */
346
+ export async function setProjectDocTask(params, config) {
347
+ const docId = await requireDocId(params, config);
348
+ try {
349
+ const doc = await apiPatch(`${docsBase(config)}/${docId}/tasks/${params.lineNumber}`, { checked: params.checked }, config);
350
+ return { docId, lineNumber: params.lineNumber, checked: params.checked, taskLines: taskLines(doc.content) };
351
+ }
352
+ catch (err) {
353
+ if (err instanceof Error && /^API error 409:/.test(err.message)) {
354
+ return {
355
+ conflict: true,
356
+ docId,
357
+ lineNumber: params.lineNumber,
358
+ message: `Line ${params.lineNumber} is no longer a task list item — the document changed. Call ` +
359
+ 'read_project_doc to get current taskLines, then retry once with the right line number.',
360
+ };
361
+ }
362
+ throw err;
363
+ }
364
+ }
365
+ export async function listProjectDocComments(params, config) {
366
+ const docId = await requireDocId(params, config);
367
+ const raw = await apiGet(`${docsBase(config)}/${docId}/comments`, config);
368
+ const comments = Array.isArray(raw) ? raw : [];
369
+ if (params.includeResolved)
370
+ return comments;
371
+ return comments.filter((c) => c['resolvedAt'] == null);
372
+ }
373
+ export async function commentOnProjectDoc(params, config) {
374
+ const docId = await requireDocId(params, config);
375
+ const body = { content: params.content, lineNumber: params.lineNumber };
376
+ if (params.quotedText !== undefined)
377
+ body['quotedText'] = params.quotedText;
378
+ return apiPost(`${docsBase(config)}/${docId}/comments`, body, config);
379
+ }
380
+ /**
381
+ * Reply to and/or resolve one thread — the two halves of answering a review comment, which agents
382
+ * almost always do together.
383
+ */
384
+ export async function respondToProjectDocComment(params, config) {
385
+ if (params.reply === undefined && params.resolve !== true) {
386
+ throw new Error('Provide reply, resolve: true, or both');
387
+ }
388
+ const docId = await requireDocId(params, config);
389
+ const result = { docId, commentId: params.commentId };
390
+ if (params.reply !== undefined) {
391
+ await apiPost(`${docsBase(config)}/${docId}/comments/${params.commentId}/replies`, { content: params.reply }, config);
392
+ result['replied'] = true;
393
+ }
394
+ if (params.resolve === true) {
395
+ await apiPatch(`${docsBase(config)}/${docId}/comments/${params.commentId}/resolve`, {}, config);
396
+ result['resolved'] = true;
397
+ }
398
+ return result;
399
+ }
400
+ //# sourceMappingURL=project-docs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-docs.js","sourceRoot":"","sources":["../../../src/mcp/tools/project-docs.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cliangdev/conductor",
3
- "version": "0.12.1",
3
+ "version": "0.14.0",
4
4
  "description": "Agentic software development platform — AI-driven PRD, implementation, and beyond",
5
5
  "license": "SEE LICENSE IN ../LICENSE",
6
6
  "repository": {