obsidian-accomplishments-mcp 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +22 -0
- package/README.md +349 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +120 -0
- package/dist/index.js.map +1 -0
- package/dist/models/types.d.ts +136 -0
- package/dist/models/types.d.ts.map +1 -0
- package/dist/models/types.js +27 -0
- package/dist/models/types.js.map +1 -0
- package/dist/parsers/canvas-parser.d.ts +58 -0
- package/dist/parsers/canvas-parser.d.ts.map +1 -0
- package/dist/parsers/canvas-parser.js +136 -0
- package/dist/parsers/canvas-parser.js.map +1 -0
- package/dist/parsers/markdown-parser.d.ts +22 -0
- package/dist/parsers/markdown-parser.d.ts.map +1 -0
- package/dist/parsers/markdown-parser.js +254 -0
- package/dist/parsers/markdown-parser.js.map +1 -0
- package/dist/services/accomplishment-service.d.ts +33 -0
- package/dist/services/accomplishment-service.d.ts.map +1 -0
- package/dist/services/accomplishment-service.js +284 -0
- package/dist/services/accomplishment-service.js.map +1 -0
- package/dist/services/canvas-service.d.ts +52 -0
- package/dist/services/canvas-service.d.ts.map +1 -0
- package/dist/services/canvas-service.js +166 -0
- package/dist/services/canvas-service.js.map +1 -0
- package/dist/services/context-doc-service.d.ts +70 -0
- package/dist/services/context-doc-service.d.ts.map +1 -0
- package/dist/services/context-doc-service.js +229 -0
- package/dist/services/context-doc-service.js.map +1 -0
- package/dist/services/dependency-service.d.ts +22 -0
- package/dist/services/dependency-service.d.ts.map +1 -0
- package/dist/services/dependency-service.js +99 -0
- package/dist/services/dependency-service.js.map +1 -0
- package/dist/services/task-service.d.ts +32 -0
- package/dist/services/task-service.d.ts.map +1 -0
- package/dist/services/task-service.js +152 -0
- package/dist/services/task-service.js.map +1 -0
- package/dist/test-runner.d.ts +6 -0
- package/dist/test-runner.d.ts.map +1 -0
- package/dist/test-runner.js +130 -0
- package/dist/test-runner.js.map +1 -0
- package/dist/tools/get-accomplishment.d.ts +26 -0
- package/dist/tools/get-accomplishment.d.ts.map +1 -0
- package/dist/tools/get-accomplishment.js +53 -0
- package/dist/tools/get-accomplishment.js.map +1 -0
- package/dist/tools/get-blocked-items.d.ts +15 -0
- package/dist/tools/get-blocked-items.d.ts.map +1 -0
- package/dist/tools/get-blocked-items.js +72 -0
- package/dist/tools/get-blocked-items.js.map +1 -0
- package/dist/tools/get-current-work.d.ts +15 -0
- package/dist/tools/get-current-work.d.ts.map +1 -0
- package/dist/tools/get-current-work.js +67 -0
- package/dist/tools/get-current-work.js.map +1 -0
- package/dist/tools/get-project-status.d.ts +26 -0
- package/dist/tools/get-project-status.d.ts.map +1 -0
- package/dist/tools/get-project-status.js +92 -0
- package/dist/tools/get-project-status.js.map +1 -0
- package/dist/tools/get-ready-to-start.d.ts +15 -0
- package/dist/tools/get-ready-to-start.d.ts.map +1 -0
- package/dist/tools/get-ready-to-start.js +46 -0
- package/dist/tools/get-ready-to-start.js.map +1 -0
- package/dist/tools/index.d.ts +155 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +48 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/list-accomplishments.d.ts +34 -0
- package/dist/tools/list-accomplishments.d.ts.map +1 -0
- package/dist/tools/list-accomplishments.js +34 -0
- package/dist/tools/list-accomplishments.js.map +1 -0
- package/dist/tools/list-files.d.ts +26 -0
- package/dist/tools/list-files.d.ts.map +1 -0
- package/dist/tools/list-files.js +46 -0
- package/dist/tools/list-files.js.map +1 -0
- package/dist/tools/list-workspaces.d.ts +22 -0
- package/dist/tools/list-workspaces.d.ts.map +1 -0
- package/dist/tools/list-workspaces.js +22 -0
- package/dist/tools/list-workspaces.js.map +1 -0
- package/dist/tools/manage-accomplishment.d.ts +147 -0
- package/dist/tools/manage-accomplishment.d.ts.map +1 -0
- package/dist/tools/manage-accomplishment.js +138 -0
- package/dist/tools/manage-accomplishment.js.map +1 -0
- package/dist/tools/manage-dependency.d.ts +41 -0
- package/dist/tools/manage-dependency.d.ts.map +1 -0
- package/dist/tools/manage-dependency.js +61 -0
- package/dist/tools/manage-dependency.js.map +1 -0
- package/dist/tools/manage-task.d.ts +119 -0
- package/dist/tools/manage-task.d.ts.map +1 -0
- package/dist/tools/manage-task.js +121 -0
- package/dist/tools/manage-task.js.map +1 -0
- package/dist/tools/read-docs.d.ts +48 -0
- package/dist/tools/read-docs.d.ts.map +1 -0
- package/dist/tools/read-docs.js +90 -0
- package/dist/tools/read-docs.js.map +1 -0
- package/dist/tools/set-work-focus.d.ts +48 -0
- package/dist/tools/set-work-focus.d.ts.map +1 -0
- package/dist/tools/set-work-focus.js +75 -0
- package/dist/tools/set-work-focus.js.map +1 -0
- package/dist/tools/sync-dependencies.d.ts +33 -0
- package/dist/tools/sync-dependencies.d.ts.map +1 -0
- package/dist/tools/sync-dependencies.js +144 -0
- package/dist/tools/sync-dependencies.js.map +1 -0
- package/dist/tools/update-doc.d.ts +62 -0
- package/dist/tools/update-doc.d.ts.map +1 -0
- package/dist/tools/update-doc.js +196 -0
- package/dist/tools/update-doc.js.map +1 -0
- package/dist/utils/config.d.ts +27 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +106 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/file-utils.d.ts +29 -0
- package/dist/utils/file-utils.d.ts.map +1 -0
- package/dist/utils/file-utils.js +83 -0
- package/dist/utils/file-utils.js.map +1 -0
- package/dist/utils/positioning.d.ts +16 -0
- package/dist/utils/positioning.d.ts.map +1 -0
- package/dist/utils/positioning.js +126 -0
- package/dist/utils/positioning.js.map +1 -0
- package/package.json +56 -0
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { Config } from '../models/types.js';
|
|
3
|
+
export declare const setWorkFocusSchema: z.ZodObject<{
|
|
4
|
+
accomplishment_id: z.ZodString;
|
|
5
|
+
in_progress: z.ZodOptional<z.ZodBoolean>;
|
|
6
|
+
task_id: z.ZodOptional<z.ZodString>;
|
|
7
|
+
task_status: z.ZodOptional<z.ZodEnum<["Open", "InProgress", "Complete", "OnHold"]>>;
|
|
8
|
+
}, "strip", z.ZodTypeAny, {
|
|
9
|
+
accomplishment_id: string;
|
|
10
|
+
task_id?: string | undefined;
|
|
11
|
+
in_progress?: boolean | undefined;
|
|
12
|
+
task_status?: "Open" | "InProgress" | "Complete" | "OnHold" | undefined;
|
|
13
|
+
}, {
|
|
14
|
+
accomplishment_id: string;
|
|
15
|
+
task_id?: string | undefined;
|
|
16
|
+
in_progress?: boolean | undefined;
|
|
17
|
+
task_status?: "Open" | "InProgress" | "Complete" | "OnHold" | undefined;
|
|
18
|
+
}>;
|
|
19
|
+
export type SetWorkFocusInput = z.infer<typeof setWorkFocusSchema>;
|
|
20
|
+
export declare const setWorkFocusDefinition: {
|
|
21
|
+
name: string;
|
|
22
|
+
description: string;
|
|
23
|
+
inputSchema: {
|
|
24
|
+
type: string;
|
|
25
|
+
properties: {
|
|
26
|
+
accomplishment_id: {
|
|
27
|
+
type: string;
|
|
28
|
+
description: string;
|
|
29
|
+
};
|
|
30
|
+
in_progress: {
|
|
31
|
+
type: string;
|
|
32
|
+
description: string;
|
|
33
|
+
};
|
|
34
|
+
task_id: {
|
|
35
|
+
type: string;
|
|
36
|
+
description: string;
|
|
37
|
+
};
|
|
38
|
+
task_status: {
|
|
39
|
+
type: string;
|
|
40
|
+
enum: string[];
|
|
41
|
+
description: string;
|
|
42
|
+
};
|
|
43
|
+
};
|
|
44
|
+
required: string[];
|
|
45
|
+
};
|
|
46
|
+
};
|
|
47
|
+
export declare function handleSetWorkFocus(config: Config, input: SetWorkFocusInput): Promise<unknown>;
|
|
48
|
+
//# sourceMappingURL=set-work-focus.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"set-work-focus.d.ts","sourceRoot":"","sources":["../../src/tools/set-work-focus.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,MAAM,EAAY,MAAM,oBAAoB,CAAC;AAKtD,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;EAK7B,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAEnE,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;CA0BlC,CAAC;AAEF,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,iBAAiB,GACvB,OAAO,CAAC,OAAO,CAAC,CA0ClB"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { getAccomplishment, updateAccomplishment } from '../services/accomplishment-service.js';
|
|
3
|
+
import { setTaskStatus } from '../services/task-service.js';
|
|
4
|
+
// Schema for the tool
|
|
5
|
+
export const setWorkFocusSchema = z.object({
|
|
6
|
+
accomplishment_id: z.string(),
|
|
7
|
+
in_progress: z.boolean().optional(),
|
|
8
|
+
task_id: z.string().optional(),
|
|
9
|
+
task_status: z.enum(['Open', 'InProgress', 'Complete', 'OnHold']).optional(),
|
|
10
|
+
});
|
|
11
|
+
export const setWorkFocusDefinition = {
|
|
12
|
+
name: 'set_work_focus',
|
|
13
|
+
description: "Set an accomplishment's inProgress flag (red border in Obsidian) and/or update a task's status. Setting a task to InProgress automatically sets the accomplishment's inProgress to true.",
|
|
14
|
+
inputSchema: {
|
|
15
|
+
type: 'object',
|
|
16
|
+
properties: {
|
|
17
|
+
accomplishment_id: {
|
|
18
|
+
type: 'string',
|
|
19
|
+
description: 'ID of the accomplishment',
|
|
20
|
+
},
|
|
21
|
+
in_progress: {
|
|
22
|
+
type: 'boolean',
|
|
23
|
+
description: "Set the accomplishment's inProgress flag",
|
|
24
|
+
},
|
|
25
|
+
task_id: {
|
|
26
|
+
type: 'string',
|
|
27
|
+
description: 'Task ID to update (optional). Format: ACC-XXX:Task N:Name',
|
|
28
|
+
},
|
|
29
|
+
task_status: {
|
|
30
|
+
type: 'string',
|
|
31
|
+
enum: ['Open', 'InProgress', 'Complete', 'OnHold'],
|
|
32
|
+
description: 'New status for the task (required if task_id provided)',
|
|
33
|
+
},
|
|
34
|
+
},
|
|
35
|
+
required: ['accomplishment_id'],
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
export async function handleSetWorkFocus(config, input) {
|
|
39
|
+
const { accomplishment_id, in_progress, task_id, task_status } = input;
|
|
40
|
+
let accomplishment = await getAccomplishment(config, accomplishment_id);
|
|
41
|
+
let updatedTask = null;
|
|
42
|
+
// Handle task status update
|
|
43
|
+
if (task_id && task_status) {
|
|
44
|
+
const result = await setTaskStatus(config, accomplishment_id, task_id, task_status);
|
|
45
|
+
accomplishment = result.accomplishment;
|
|
46
|
+
updatedTask = result.task;
|
|
47
|
+
}
|
|
48
|
+
// Handle accomplishment inProgress update (if explicitly set and not already handled by task)
|
|
49
|
+
if (in_progress !== undefined) {
|
|
50
|
+
// Only update if different from current or if task didn't already set it
|
|
51
|
+
if (accomplishment.frontmatter.inProgress !== in_progress) {
|
|
52
|
+
accomplishment = await updateAccomplishment(config, accomplishment_id, {
|
|
53
|
+
inProgress: in_progress,
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
const response = {
|
|
58
|
+
success: true,
|
|
59
|
+
accomplishment: {
|
|
60
|
+
id: accomplishment.frontmatter.id,
|
|
61
|
+
title: accomplishment.frontmatter.title,
|
|
62
|
+
inProgress: accomplishment.frontmatter.inProgress,
|
|
63
|
+
status: accomplishment.frontmatter.status,
|
|
64
|
+
},
|
|
65
|
+
};
|
|
66
|
+
if (updatedTask) {
|
|
67
|
+
response.task = {
|
|
68
|
+
task_id,
|
|
69
|
+
name: updatedTask.name,
|
|
70
|
+
status: updatedTask.status,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
return response;
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=set-work-focus.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"set-work-focus.js","sourceRoot":"","sources":["../../src/tools/set-work-focus.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { Config } from '../models/types.js';
|
|
2
|
+
export declare const syncDependenciesDefinition: {
|
|
3
|
+
name: string;
|
|
4
|
+
description: string;
|
|
5
|
+
inputSchema: {
|
|
6
|
+
type: "object";
|
|
7
|
+
properties: {
|
|
8
|
+
canvas_source: {
|
|
9
|
+
type: string;
|
|
10
|
+
description: string;
|
|
11
|
+
};
|
|
12
|
+
};
|
|
13
|
+
required: never[];
|
|
14
|
+
};
|
|
15
|
+
};
|
|
16
|
+
export interface SyncDependenciesInput {
|
|
17
|
+
canvas_source?: string;
|
|
18
|
+
}
|
|
19
|
+
export interface SyncDependenciesResult {
|
|
20
|
+
success: boolean;
|
|
21
|
+
canvas_source: string;
|
|
22
|
+
total_accomplishments: number;
|
|
23
|
+
updated_count: number;
|
|
24
|
+
updates: Array<{
|
|
25
|
+
id: string;
|
|
26
|
+
title: string;
|
|
27
|
+
old_depends_on: string[];
|
|
28
|
+
new_depends_on: string[];
|
|
29
|
+
}>;
|
|
30
|
+
errors: string[];
|
|
31
|
+
}
|
|
32
|
+
export declare function handleSyncDependencies(config: Config, input: SyncDependenciesInput): Promise<SyncDependenciesResult>;
|
|
33
|
+
//# sourceMappingURL=sync-dependencies.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-dependencies.d.ts","sourceRoot":"","sources":["../../src/tools/sync-dependencies.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAO5C,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;CAqBtC,CAAC;AAEF,MAAM,WAAW,qBAAqB;IACpC,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,KAAK,CAAC;QACb,EAAE,EAAE,MAAM,CAAC;QACX,KAAK,EAAE,MAAM,CAAC;QACd,cAAc,EAAE,MAAM,EAAE,CAAC;QACzB,cAAc,EAAE,MAAM,EAAE,CAAC;KAC1B,CAAC,CAAC;IACH,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AA+CD,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,qBAAqB,GAC3B,OAAO,CAAC,sBAAsB,CAAC,CA+FjC"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import { loadCanvas } from '../services/canvas-service.js';
|
|
2
|
+
import { readFile, writeFileAtomic, listFiles } from '../utils/file-utils.js';
|
|
3
|
+
import { getAccomplishmentsPath } from '../utils/config.js';
|
|
4
|
+
import { parseAccomplishment, serializeAccomplishment } from '../parsers/markdown-parser.js';
|
|
5
|
+
import { getIncomingEdges } from '../parsers/canvas-parser.js';
|
|
6
|
+
export const syncDependenciesDefinition = {
|
|
7
|
+
name: 'sync_dependencies',
|
|
8
|
+
description: `Sync all dependencies from canvas edges to accomplishment frontmatter.
|
|
9
|
+
|
|
10
|
+
This reads all edges from the canvas file and updates the \`depends_on\` array in each
|
|
11
|
+
accomplishment's frontmatter to match. Use this to:
|
|
12
|
+
- Initialize dependencies after manually drawing arrows on canvas
|
|
13
|
+
- Fix any sync issues between canvas edges and MD files
|
|
14
|
+
- Batch update all accomplishments after importing a canvas
|
|
15
|
+
|
|
16
|
+
Returns a summary of what was updated.`,
|
|
17
|
+
inputSchema: {
|
|
18
|
+
type: 'object',
|
|
19
|
+
properties: {
|
|
20
|
+
canvas_source: {
|
|
21
|
+
type: 'string',
|
|
22
|
+
description: 'Canvas file path (relative to vault). Defaults to DEFAULT_CANVAS.',
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
required: [],
|
|
26
|
+
},
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* Build a map from file path to accomplishment ID
|
|
30
|
+
*/
|
|
31
|
+
async function buildFileToIdMap(config) {
|
|
32
|
+
const map = new Map();
|
|
33
|
+
const accomplishmentsPath = getAccomplishmentsPath(config);
|
|
34
|
+
const files = await listFiles(accomplishmentsPath);
|
|
35
|
+
for (const file of files) {
|
|
36
|
+
if (!file.endsWith('.md'))
|
|
37
|
+
continue;
|
|
38
|
+
const filePath = `${accomplishmentsPath}/${file}`;
|
|
39
|
+
try {
|
|
40
|
+
const content = await readFile(filePath);
|
|
41
|
+
const idMatch = content.match(/^id:\s*(.+)$/m);
|
|
42
|
+
if (idMatch) {
|
|
43
|
+
// Store with relative path (as used in canvas)
|
|
44
|
+
const relativePath = `${config.accomplishmentsFolder}/${file}`;
|
|
45
|
+
map.set(relativePath, idMatch[1].trim());
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
// Skip unreadable files
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return map;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Build a map from node ID to file path
|
|
56
|
+
*/
|
|
57
|
+
function buildNodeToFileMap(canvas) {
|
|
58
|
+
const map = new Map();
|
|
59
|
+
for (const node of canvas.nodes) {
|
|
60
|
+
if (node.type === 'file' && node.file) {
|
|
61
|
+
map.set(node.id, node.file);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return map;
|
|
65
|
+
}
|
|
66
|
+
export async function handleSyncDependencies(config, input) {
|
|
67
|
+
const { canvas_source } = input;
|
|
68
|
+
const canvasPath = canvas_source || config.defaultCanvas;
|
|
69
|
+
const errors = [];
|
|
70
|
+
const updates = [];
|
|
71
|
+
// Load canvas
|
|
72
|
+
const canvas = await loadCanvas(config, canvas_source);
|
|
73
|
+
// Build lookup maps
|
|
74
|
+
const fileToId = await buildFileToIdMap(config);
|
|
75
|
+
const nodeToFile = buildNodeToFileMap(canvas);
|
|
76
|
+
// For each file node, compute its dependencies from incoming edges
|
|
77
|
+
const accomplishmentsPath = getAccomplishmentsPath(config);
|
|
78
|
+
const files = await listFiles(accomplishmentsPath);
|
|
79
|
+
let updatedCount = 0;
|
|
80
|
+
for (const file of files) {
|
|
81
|
+
if (!file.endsWith('.md'))
|
|
82
|
+
continue;
|
|
83
|
+
const relativePath = `${config.accomplishmentsFolder}/${file}`;
|
|
84
|
+
const fullPath = `${accomplishmentsPath}/${file}`;
|
|
85
|
+
try {
|
|
86
|
+
// Find the node for this file
|
|
87
|
+
const node = canvas.nodes.find((n) => n.type === 'file' && n.file === relativePath);
|
|
88
|
+
if (!node) {
|
|
89
|
+
// File not on canvas, skip
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
// Get incoming edges (dependencies)
|
|
93
|
+
const incomingEdges = getIncomingEdges(canvas, node.id);
|
|
94
|
+
// Convert edge sources to accomplishment IDs
|
|
95
|
+
const newDependsOn = [];
|
|
96
|
+
for (const edge of incomingEdges) {
|
|
97
|
+
const blockerFile = nodeToFile.get(edge.fromNode);
|
|
98
|
+
if (blockerFile) {
|
|
99
|
+
const blockerId = fileToId.get(blockerFile);
|
|
100
|
+
if (blockerId) {
|
|
101
|
+
newDependsOn.push(blockerId);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
// Read and parse the accomplishment
|
|
106
|
+
const content = await readFile(fullPath);
|
|
107
|
+
const accomplishment = parseAccomplishment(content);
|
|
108
|
+
// Check if depends_on needs updating
|
|
109
|
+
const oldDependsOn = [...accomplishment.frontmatter.depends_on];
|
|
110
|
+
const oldSet = new Set(oldDependsOn);
|
|
111
|
+
const newSet = new Set(newDependsOn);
|
|
112
|
+
const needsUpdate = oldDependsOn.length !== newDependsOn.length ||
|
|
113
|
+
oldDependsOn.some((id) => !newSet.has(id)) ||
|
|
114
|
+
newDependsOn.some((id) => !oldSet.has(id));
|
|
115
|
+
if (needsUpdate) {
|
|
116
|
+
// Update frontmatter
|
|
117
|
+
accomplishment.frontmatter.depends_on = newDependsOn;
|
|
118
|
+
accomplishment.frontmatter.updated = new Date().toISOString();
|
|
119
|
+
// Write back
|
|
120
|
+
const newContent = serializeAccomplishment(accomplishment);
|
|
121
|
+
await writeFileAtomic(fullPath, newContent);
|
|
122
|
+
updates.push({
|
|
123
|
+
id: accomplishment.frontmatter.id,
|
|
124
|
+
title: accomplishment.frontmatter.title,
|
|
125
|
+
old_depends_on: oldDependsOn,
|
|
126
|
+
new_depends_on: newDependsOn,
|
|
127
|
+
});
|
|
128
|
+
updatedCount++;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
catch (e) {
|
|
132
|
+
errors.push(`Error processing ${file}: ${e}`);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
return {
|
|
136
|
+
success: errors.length === 0,
|
|
137
|
+
canvas_source: canvasPath,
|
|
138
|
+
total_accomplishments: fileToId.size,
|
|
139
|
+
updated_count: updatedCount,
|
|
140
|
+
updates,
|
|
141
|
+
errors,
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=sync-dependencies.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-dependencies.js","sourceRoot":"","sources":["../../src/tools/sync-dependencies.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { Config } from '../models/types.js';
|
|
2
|
+
export type UpdateDocOperation = 'create' | 'replace' | 'delete' | 'insert_at' | 'replace_at';
|
|
3
|
+
export interface UpdateDocInput {
|
|
4
|
+
workspace: string;
|
|
5
|
+
name: string;
|
|
6
|
+
operation: UpdateDocOperation;
|
|
7
|
+
content?: string;
|
|
8
|
+
start_line?: number;
|
|
9
|
+
end_line?: number;
|
|
10
|
+
}
|
|
11
|
+
export interface UpdateDocResult {
|
|
12
|
+
success: boolean;
|
|
13
|
+
operation: UpdateDocOperation;
|
|
14
|
+
workspace: string;
|
|
15
|
+
workspace_description: string;
|
|
16
|
+
doc_name: string;
|
|
17
|
+
message: string;
|
|
18
|
+
line_count?: number;
|
|
19
|
+
affected_range?: {
|
|
20
|
+
start_line: number;
|
|
21
|
+
end_line: number;
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
export declare const updateDocDefinition: {
|
|
25
|
+
name: string;
|
|
26
|
+
description: string;
|
|
27
|
+
inputSchema: {
|
|
28
|
+
type: string;
|
|
29
|
+
properties: {
|
|
30
|
+
workspace: {
|
|
31
|
+
type: string;
|
|
32
|
+
description: string;
|
|
33
|
+
};
|
|
34
|
+
name: {
|
|
35
|
+
type: string;
|
|
36
|
+
description: string;
|
|
37
|
+
};
|
|
38
|
+
operation: {
|
|
39
|
+
type: string;
|
|
40
|
+
enum: string[];
|
|
41
|
+
description: string;
|
|
42
|
+
};
|
|
43
|
+
content: {
|
|
44
|
+
type: string;
|
|
45
|
+
description: string;
|
|
46
|
+
};
|
|
47
|
+
start_line: {
|
|
48
|
+
type: string;
|
|
49
|
+
description: string;
|
|
50
|
+
minimum: number;
|
|
51
|
+
};
|
|
52
|
+
end_line: {
|
|
53
|
+
type: string;
|
|
54
|
+
description: string;
|
|
55
|
+
minimum: number;
|
|
56
|
+
};
|
|
57
|
+
};
|
|
58
|
+
required: string[];
|
|
59
|
+
};
|
|
60
|
+
};
|
|
61
|
+
export declare function handleUpdateDoc(config: Config, input: UpdateDocInput): Promise<UpdateDocResult>;
|
|
62
|
+
//# sourceMappingURL=update-doc.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-doc.d.ts","sourceRoot":"","sources":["../../src/tools/update-doc.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAiD,MAAM,oBAAoB,CAAC;AAI3F,MAAM,MAAM,kBAAkB,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,GAAG,WAAW,GAAG,YAAY,CAAC;AAE9F,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,kBAAkB,CAAC;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,kBAAkB,CAAC;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE;QACf,UAAU,EAAE,MAAM,CAAC;QACnB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;CACH;AAED,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwD/B,CAAC;AAEF,wBAAsB,eAAe,CACnC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,cAAc,GACpB,OAAO,CAAC,eAAe,CAAC,CAgJ1B"}
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
import { ValidationError, NotFoundError, ConflictError } from '../models/types.js';
|
|
2
|
+
import { getWorkspacePath, getWorkspaceDescription } from '../utils/config.js';
|
|
3
|
+
import { readFile, writeFileAtomic, deleteFile, fileExists } from '../utils/file-utils.js';
|
|
4
|
+
export const updateDocDefinition = {
|
|
5
|
+
name: 'update_doc',
|
|
6
|
+
description: `Create, update, or delete documents in a workspace.
|
|
7
|
+
|
|
8
|
+
Parameters:
|
|
9
|
+
- workspace: Name of the workspace (use list_workspaces to see available workspaces)
|
|
10
|
+
- name: Document filename (with or without .md extension)
|
|
11
|
+
- operation: One of create, replace, delete, insert_at, replace_at
|
|
12
|
+
- content: Content for create/replace/insert_at/replace_at operations
|
|
13
|
+
- start_line: Start line (0-based) for insert_at or replace_at
|
|
14
|
+
- end_line: End line (0-based, exclusive) for replace_at
|
|
15
|
+
|
|
16
|
+
Operations:
|
|
17
|
+
- create: Create a new document (error if exists)
|
|
18
|
+
- replace: Replace entire content of existing document (error if not exists)
|
|
19
|
+
- delete: Delete the document (error if not exists)
|
|
20
|
+
- insert_at: Insert content starting at start_line. Existing content shifts down.
|
|
21
|
+
- replace_at: Replace content from start_line to end_line with new content.
|
|
22
|
+
|
|
23
|
+
Line numbering is 0-based:
|
|
24
|
+
- Line 0 is the first line
|
|
25
|
+
- insert_at with start_line=0 inserts at the beginning
|
|
26
|
+
- replace_at with start_line=0, end_line=5 replaces lines 0-4`,
|
|
27
|
+
inputSchema: {
|
|
28
|
+
type: 'object',
|
|
29
|
+
properties: {
|
|
30
|
+
workspace: {
|
|
31
|
+
type: 'string',
|
|
32
|
+
description: 'Name of the workspace',
|
|
33
|
+
},
|
|
34
|
+
name: {
|
|
35
|
+
type: 'string',
|
|
36
|
+
description: 'Document filename (with or without .md extension)',
|
|
37
|
+
},
|
|
38
|
+
operation: {
|
|
39
|
+
type: 'string',
|
|
40
|
+
enum: ['create', 'replace', 'delete', 'insert_at', 'replace_at'],
|
|
41
|
+
description: 'Operation to perform',
|
|
42
|
+
},
|
|
43
|
+
content: {
|
|
44
|
+
type: 'string',
|
|
45
|
+
description: 'Content for create, replace, insert_at, or replace_at operations. Not needed for delete.',
|
|
46
|
+
},
|
|
47
|
+
start_line: {
|
|
48
|
+
type: 'integer',
|
|
49
|
+
description: 'Start line (0-based) for insert_at or replace_at operations',
|
|
50
|
+
minimum: 0,
|
|
51
|
+
},
|
|
52
|
+
end_line: {
|
|
53
|
+
type: 'integer',
|
|
54
|
+
description: 'End line (0-based, exclusive) for replace_at operation',
|
|
55
|
+
minimum: 0,
|
|
56
|
+
},
|
|
57
|
+
},
|
|
58
|
+
required: ['workspace', 'name', 'operation'],
|
|
59
|
+
},
|
|
60
|
+
};
|
|
61
|
+
export async function handleUpdateDoc(config, input) {
|
|
62
|
+
const { workspace, name, operation, content, start_line, end_line } = input;
|
|
63
|
+
if (!workspace) {
|
|
64
|
+
throw new ValidationError('workspace parameter is required');
|
|
65
|
+
}
|
|
66
|
+
if (!name) {
|
|
67
|
+
throw new ValidationError('name parameter is required');
|
|
68
|
+
}
|
|
69
|
+
const workspacePath = getWorkspacePath(config, workspace);
|
|
70
|
+
if (!workspacePath) {
|
|
71
|
+
throw new NotFoundError(`Workspace not found: ${workspace}`);
|
|
72
|
+
}
|
|
73
|
+
const workspaceDescription = getWorkspaceDescription(config, workspace) || '';
|
|
74
|
+
// Ensure .md extension
|
|
75
|
+
const filename = name.endsWith('.md') ? name : `${name}.md`;
|
|
76
|
+
const filePath = `${workspacePath}/${filename}`;
|
|
77
|
+
switch (operation) {
|
|
78
|
+
case 'create': {
|
|
79
|
+
if (content === undefined) {
|
|
80
|
+
throw new ValidationError('content is required for create operation');
|
|
81
|
+
}
|
|
82
|
+
if (await fileExists(filePath)) {
|
|
83
|
+
throw new ConflictError(`Document already exists: ${filename} in workspace ${workspace}`);
|
|
84
|
+
}
|
|
85
|
+
await writeFileAtomic(filePath, content);
|
|
86
|
+
const lines = content.split('\n');
|
|
87
|
+
return {
|
|
88
|
+
success: true,
|
|
89
|
+
operation,
|
|
90
|
+
workspace,
|
|
91
|
+
workspace_description: workspaceDescription,
|
|
92
|
+
doc_name: filename,
|
|
93
|
+
message: `Created document: ${filename}`,
|
|
94
|
+
line_count: lines.length,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
case 'replace': {
|
|
98
|
+
if (content === undefined) {
|
|
99
|
+
throw new ValidationError('content is required for replace operation');
|
|
100
|
+
}
|
|
101
|
+
if (!await fileExists(filePath)) {
|
|
102
|
+
throw new NotFoundError(`Document not found: ${filename} in workspace ${workspace}`);
|
|
103
|
+
}
|
|
104
|
+
await writeFileAtomic(filePath, content);
|
|
105
|
+
const lines = content.split('\n');
|
|
106
|
+
return {
|
|
107
|
+
success: true,
|
|
108
|
+
operation,
|
|
109
|
+
workspace,
|
|
110
|
+
workspace_description: workspaceDescription,
|
|
111
|
+
doc_name: filename,
|
|
112
|
+
message: `Replaced content of document: ${filename}`,
|
|
113
|
+
line_count: lines.length,
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
case 'delete': {
|
|
117
|
+
if (!await fileExists(filePath)) {
|
|
118
|
+
throw new NotFoundError(`Document not found: ${filename} in workspace ${workspace}`);
|
|
119
|
+
}
|
|
120
|
+
await deleteFile(filePath);
|
|
121
|
+
return {
|
|
122
|
+
success: true,
|
|
123
|
+
operation,
|
|
124
|
+
workspace,
|
|
125
|
+
workspace_description: workspaceDescription,
|
|
126
|
+
doc_name: filename,
|
|
127
|
+
message: `Deleted document: ${filename}`,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
case 'insert_at': {
|
|
131
|
+
if (content === undefined) {
|
|
132
|
+
throw new ValidationError('content is required for insert_at operation');
|
|
133
|
+
}
|
|
134
|
+
if (start_line === undefined) {
|
|
135
|
+
throw new ValidationError('start_line is required for insert_at operation');
|
|
136
|
+
}
|
|
137
|
+
if (!await fileExists(filePath)) {
|
|
138
|
+
throw new NotFoundError(`Document not found: ${filename} in workspace ${workspace}`);
|
|
139
|
+
}
|
|
140
|
+
const existingContent = await readFile(filePath);
|
|
141
|
+
const lines = existingContent.split('\n');
|
|
142
|
+
const newLines = content.split('\n');
|
|
143
|
+
lines.splice(start_line, 0, ...newLines);
|
|
144
|
+
await writeFileAtomic(filePath, lines.join('\n'));
|
|
145
|
+
return {
|
|
146
|
+
success: true,
|
|
147
|
+
operation,
|
|
148
|
+
workspace,
|
|
149
|
+
workspace_description: workspaceDescription,
|
|
150
|
+
doc_name: filename,
|
|
151
|
+
message: `Inserted ${newLines.length} line(s) at line ${start_line} in document: ${filename}`,
|
|
152
|
+
line_count: newLines.length,
|
|
153
|
+
affected_range: {
|
|
154
|
+
start_line,
|
|
155
|
+
end_line: start_line + newLines.length,
|
|
156
|
+
},
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
case 'replace_at': {
|
|
160
|
+
if (content === undefined) {
|
|
161
|
+
throw new ValidationError('content is required for replace_at operation');
|
|
162
|
+
}
|
|
163
|
+
if (start_line === undefined) {
|
|
164
|
+
throw new ValidationError('start_line is required for replace_at operation');
|
|
165
|
+
}
|
|
166
|
+
if (end_line === undefined) {
|
|
167
|
+
throw new ValidationError('end_line is required for replace_at operation');
|
|
168
|
+
}
|
|
169
|
+
if (!await fileExists(filePath)) {
|
|
170
|
+
throw new NotFoundError(`Document not found: ${filename} in workspace ${workspace}`);
|
|
171
|
+
}
|
|
172
|
+
const existingContent = await readFile(filePath);
|
|
173
|
+
const lines = existingContent.split('\n');
|
|
174
|
+
const newLines = content.split('\n');
|
|
175
|
+
const replacedLineCount = end_line - start_line;
|
|
176
|
+
lines.splice(start_line, replacedLineCount, ...newLines);
|
|
177
|
+
await writeFileAtomic(filePath, lines.join('\n'));
|
|
178
|
+
return {
|
|
179
|
+
success: true,
|
|
180
|
+
operation,
|
|
181
|
+
workspace,
|
|
182
|
+
workspace_description: workspaceDescription,
|
|
183
|
+
doc_name: filename,
|
|
184
|
+
message: `Replaced ${replacedLineCount} line(s) with ${newLines.length} line(s) at lines ${start_line}-${end_line} in document: ${filename}`,
|
|
185
|
+
line_count: newLines.length,
|
|
186
|
+
affected_range: {
|
|
187
|
+
start_line,
|
|
188
|
+
end_line: start_line + newLines.length,
|
|
189
|
+
},
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
default:
|
|
193
|
+
throw new ValidationError(`Unknown operation: ${operation}`);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
//# sourceMappingURL=update-doc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-doc.js","sourceRoot":"","sources":["../../src/tools/update-doc.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { Config, WorkspaceConfig } from '../models/types.js';
|
|
2
|
+
export declare function getConfig(): Config;
|
|
3
|
+
export declare function getAccomplishmentsPath(config: Config): string;
|
|
4
|
+
export declare function getCanvasPath(config: Config, canvasSource?: string): string;
|
|
5
|
+
export declare function getAccomplishmentFilePath(config: Config, title: string): string;
|
|
6
|
+
export declare function getRelativeAccomplishmentPath(config: Config, title: string): string;
|
|
7
|
+
/**
|
|
8
|
+
* Get workspace config by name
|
|
9
|
+
*/
|
|
10
|
+
export declare function getWorkspace(config: Config, workspaceName: string): WorkspaceConfig | undefined;
|
|
11
|
+
/**
|
|
12
|
+
* Get the absolute path for a workspace
|
|
13
|
+
*/
|
|
14
|
+
export declare function getWorkspacePath(config: Config, workspaceName: string): string | undefined;
|
|
15
|
+
/**
|
|
16
|
+
* Get workspace description
|
|
17
|
+
*/
|
|
18
|
+
export declare function getWorkspaceDescription(config: Config, workspaceName: string): string | undefined;
|
|
19
|
+
/**
|
|
20
|
+
* Get all workspace names
|
|
21
|
+
*/
|
|
22
|
+
export declare function getWorkspaceNames(config: Config): string[];
|
|
23
|
+
/**
|
|
24
|
+
* Get all workspaces with their configs
|
|
25
|
+
*/
|
|
26
|
+
export declare function getAllWorkspaces(config: Config): Record<string, WorkspaceConfig>;
|
|
27
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAU7D,wBAAgB,SAAS,IAAI,MAAM,CA4DlC;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAE7D;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAE3E;AAED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAE/E;AAED,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAEnF;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,CAE/F;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAE1F;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAEjG;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAE1D;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAEhF"}
|