@cliangdev/conductor 0.13.0 → 0.17.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.
- package/assets/cli-manifest.json +304 -53
- package/dist/mcp/api.d.ts +16 -0
- package/dist/mcp/api.d.ts.map +1 -1
- package/dist/mcp/api.js +45 -1
- package/dist/mcp/api.js.map +1 -1
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/index.js +422 -2
- package/dist/mcp/index.js.map +1 -1
- package/dist/mcp/tools/issues.d.ts +5 -0
- package/dist/mcp/tools/issues.d.ts.map +1 -1
- package/dist/mcp/tools/issues.js +25 -2
- package/dist/mcp/tools/issues.js.map +1 -1
- package/dist/mcp/tools/marketing.d.ts +57 -0
- package/dist/mcp/tools/marketing.d.ts.map +1 -0
- package/dist/mcp/tools/marketing.js +169 -0
- package/dist/mcp/tools/marketing.js.map +1 -0
- package/dist/mcp/tools/project-docs.d.ts +103 -0
- package/dist/mcp/tools/project-docs.d.ts.map +1 -0
- package/dist/mcp/tools/project-docs.js +400 -0
- package/dist/mcp/tools/project-docs.js.map +1 -0
- package/dist/mcp/tools/workflows.d.ts.map +1 -1
- package/dist/mcp/tools/workflows.js +16 -1
- package/dist/mcp/tools/workflows.js.map +1 -1
- package/package.json +3 -3
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { Config } from '../config.js';
|
|
2
|
+
export interface DocTaskLine {
|
|
3
|
+
lineNumber: number;
|
|
4
|
+
checked: boolean;
|
|
5
|
+
text: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function taskLines(content: string | null | undefined): DocTaskLine[];
|
|
8
|
+
export declare function listProjectDocs(params: {
|
|
9
|
+
folder?: string;
|
|
10
|
+
query?: string;
|
|
11
|
+
}, config: Config): Promise<Record<string, unknown>>;
|
|
12
|
+
export declare function readProjectDoc(params: {
|
|
13
|
+
path?: string;
|
|
14
|
+
docId?: string;
|
|
15
|
+
versionNumber?: number;
|
|
16
|
+
}, config: Config): Promise<Record<string, unknown>>;
|
|
17
|
+
export declare function listProjectDocVersions(params: {
|
|
18
|
+
path?: string;
|
|
19
|
+
docId?: string;
|
|
20
|
+
}, config: Config): Promise<Record<string, unknown>[]>;
|
|
21
|
+
/**
|
|
22
|
+
* Restoring writes the old content as a *new* version rather than rewinding, so the history stays
|
|
23
|
+
* append-only and the restore itself is undoable.
|
|
24
|
+
*/
|
|
25
|
+
export declare function restoreProjectDocVersion(params: {
|
|
26
|
+
path?: string;
|
|
27
|
+
docId?: string;
|
|
28
|
+
versionNumber: number;
|
|
29
|
+
}, config: Config): Promise<Record<string, unknown>>;
|
|
30
|
+
/**
|
|
31
|
+
* Uploads a local image file and returns the Markdown to embed. The URL inside that snippet is
|
|
32
|
+
* short-lived, but writing it into a doc is safe: the backend stores a stable reference and re-signs on
|
|
33
|
+
* every read, so the embedded image does not expire.
|
|
34
|
+
*/
|
|
35
|
+
export declare function uploadProjectDocImage(params: {
|
|
36
|
+
path?: string;
|
|
37
|
+
docId?: string;
|
|
38
|
+
filePath: string;
|
|
39
|
+
}, config: Config): Promise<Record<string, unknown>>;
|
|
40
|
+
export declare function writeProjectDoc(params: {
|
|
41
|
+
path: string;
|
|
42
|
+
content: string;
|
|
43
|
+
}, config: Config): Promise<Record<string, unknown>>;
|
|
44
|
+
export declare function moveProjectDoc(params: {
|
|
45
|
+
path?: string;
|
|
46
|
+
docId?: string;
|
|
47
|
+
newPath: string;
|
|
48
|
+
}, config: Config): Promise<Record<string, unknown>>;
|
|
49
|
+
/**
|
|
50
|
+
* Renames and/or reparents a folder, moving its whole subtree with it. Creating destination folders
|
|
51
|
+
* on the way mirrors write_project_doc, so "Plans/Q3" → "Archive/2026/Q3" works without pre-creating
|
|
52
|
+
* Archive/2026.
|
|
53
|
+
*/
|
|
54
|
+
export declare function moveProjectFolder(params: {
|
|
55
|
+
path: string;
|
|
56
|
+
newPath: string;
|
|
57
|
+
}, config: Config): Promise<Record<string, unknown>>;
|
|
58
|
+
/**
|
|
59
|
+
* Deletes a folder and its subfolders. Documents inside are not deleted — they resurface at the
|
|
60
|
+
* project root — so this is a reorganisation, not a way to remove content.
|
|
61
|
+
*/
|
|
62
|
+
export declare function deleteProjectFolder(params: {
|
|
63
|
+
path: string;
|
|
64
|
+
}, config: Config): Promise<Record<string, unknown>>;
|
|
65
|
+
export declare function deleteProjectDoc(params: {
|
|
66
|
+
path?: string;
|
|
67
|
+
docId?: string;
|
|
68
|
+
}, config: Config): Promise<Record<string, unknown>>;
|
|
69
|
+
/**
|
|
70
|
+
* A 409 here means the addressed line is no longer a task item — the doc moved under the caller. That
|
|
71
|
+
* is information the agent can act on, so it comes back as data rather than an exception
|
|
72
|
+
* (docs/mcp-tool-guidelines.md § "no false promises"), mirroring knowledge.ts's conflict handling.
|
|
73
|
+
*/
|
|
74
|
+
export declare function setProjectDocTask(params: {
|
|
75
|
+
path?: string;
|
|
76
|
+
docId?: string;
|
|
77
|
+
lineNumber: number;
|
|
78
|
+
checked: boolean;
|
|
79
|
+
}, config: Config): Promise<Record<string, unknown>>;
|
|
80
|
+
export declare function listProjectDocComments(params: {
|
|
81
|
+
path?: string;
|
|
82
|
+
docId?: string;
|
|
83
|
+
includeResolved?: boolean;
|
|
84
|
+
}, config: Config): Promise<unknown[]>;
|
|
85
|
+
export declare function commentOnProjectDoc(params: {
|
|
86
|
+
path?: string;
|
|
87
|
+
docId?: string;
|
|
88
|
+
lineNumber: number;
|
|
89
|
+
content: string;
|
|
90
|
+
quotedText?: string;
|
|
91
|
+
}, config: Config): Promise<Record<string, unknown>>;
|
|
92
|
+
/**
|
|
93
|
+
* Reply to and/or resolve one thread — the two halves of answering a review comment, which agents
|
|
94
|
+
* almost always do together.
|
|
95
|
+
*/
|
|
96
|
+
export declare function respondToProjectDocComment(params: {
|
|
97
|
+
path?: string;
|
|
98
|
+
docId?: string;
|
|
99
|
+
commentId: string;
|
|
100
|
+
reply?: string;
|
|
101
|
+
resolve?: boolean;
|
|
102
|
+
}, config: Config): Promise<Record<string, unknown>>;
|
|
103
|
+
//# sourceMappingURL=project-docs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-docs.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/project-docs.ts"],"names":[],"mappings":"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"}
|
|
@@ -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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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflows.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/workflows.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAIrC;;;;;GAKG;AAEH;;;;;GAKG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE;IAAE,IAAI,CAAC,EAAE,WAAW,GAAG,YAAY,CAAA;CAAE,EAC7C,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,OAAO,EAAE,CAAC,CA0BpB;AAED,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,EAC3B,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAKlC;AAED,wBAAsB,kBAAkB,CACtC,MAAM,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,EAC7C,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"workflows.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/workflows.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { apiGet, apiPost, apiPatch, apiPut, apiDelete } from '../api.js';
|
|
1
|
+
import { apiGet, apiPost, apiPatch, apiPut, apiDelete, isClientError } from '../api.js';
|
|
2
2
|
import { queueChange } from '../queue.js';
|
|
3
3
|
/**
|
|
4
4
|
* COND-18 workflow-aware MCP tools. The surface stays GENERIC + discovery-based: the agent calls
|
|
@@ -48,6 +48,11 @@ export async function transitionWorkItem(params, config) {
|
|
|
48
48
|
return await apiPatch(path, body, config);
|
|
49
49
|
}
|
|
50
50
|
catch (err) {
|
|
51
|
+
// A 4xx (validation, permission, unknown id) is permanent — surface it rather than
|
|
52
|
+
// queuing a replay that can never succeed. Publishing validators reject this way by design.
|
|
53
|
+
if (isClientError(err)) {
|
|
54
|
+
return { error: `Transition refused: ${err instanceof Error ? err.message : String(err)}` };
|
|
55
|
+
}
|
|
51
56
|
const size = queueChange({ method: 'PATCH', path, body, timestamp: new Date().toISOString() });
|
|
52
57
|
return {
|
|
53
58
|
issueId: params.issueId,
|
|
@@ -70,6 +75,11 @@ export async function recordAsset(params, config) {
|
|
|
70
75
|
return await apiPost(path, body, config);
|
|
71
76
|
}
|
|
72
77
|
catch (err) {
|
|
78
|
+
// A 4xx (validation, permission, unknown id) is permanent — surface it rather than
|
|
79
|
+
// queuing a replay that can never succeed. Publishing validators reject this way by design.
|
|
80
|
+
if (isClientError(err)) {
|
|
81
|
+
return { error: `Asset not recorded: ${err instanceof Error ? err.message : String(err)}` };
|
|
82
|
+
}
|
|
73
83
|
const size = queueChange({ method: 'POST', path, body, timestamp: new Date().toISOString() });
|
|
74
84
|
return {
|
|
75
85
|
warning: `Sync failed — change queued: ${err instanceof Error ? err.message : String(err)}`,
|
|
@@ -164,6 +174,11 @@ export async function reportStepRun(params, config) {
|
|
|
164
174
|
return await apiPost(path, rest, config);
|
|
165
175
|
}
|
|
166
176
|
catch (err) {
|
|
177
|
+
// A 4xx (validation, permission, unknown id) is permanent — surface it rather than
|
|
178
|
+
// queuing a replay that can never succeed. Publishing validators reject this way by design.
|
|
179
|
+
if (isClientError(err)) {
|
|
180
|
+
return { error: `Step run not reported: ${err instanceof Error ? err.message : String(err)}` };
|
|
181
|
+
}
|
|
167
182
|
const size = queueChange({ method: 'POST', path, body: rest, timestamp: new Date().toISOString() });
|
|
168
183
|
return {
|
|
169
184
|
warning: `Sync failed — change queued: ${err instanceof Error ? err.message : String(err)}`,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflows.js","sourceRoot":"","sources":["../../../src/mcp/tools/workflows.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"workflows.js","sourceRoot":"","sources":["../../../src/mcp/tools/workflows.ts"],"names":[],"mappings":"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"}
|