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.
Files changed (119) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +349 -0
  3. package/dist/index.d.ts +3 -0
  4. package/dist/index.d.ts.map +1 -0
  5. package/dist/index.js +120 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/models/types.d.ts +136 -0
  8. package/dist/models/types.d.ts.map +1 -0
  9. package/dist/models/types.js +27 -0
  10. package/dist/models/types.js.map +1 -0
  11. package/dist/parsers/canvas-parser.d.ts +58 -0
  12. package/dist/parsers/canvas-parser.d.ts.map +1 -0
  13. package/dist/parsers/canvas-parser.js +136 -0
  14. package/dist/parsers/canvas-parser.js.map +1 -0
  15. package/dist/parsers/markdown-parser.d.ts +22 -0
  16. package/dist/parsers/markdown-parser.d.ts.map +1 -0
  17. package/dist/parsers/markdown-parser.js +254 -0
  18. package/dist/parsers/markdown-parser.js.map +1 -0
  19. package/dist/services/accomplishment-service.d.ts +33 -0
  20. package/dist/services/accomplishment-service.d.ts.map +1 -0
  21. package/dist/services/accomplishment-service.js +284 -0
  22. package/dist/services/accomplishment-service.js.map +1 -0
  23. package/dist/services/canvas-service.d.ts +52 -0
  24. package/dist/services/canvas-service.d.ts.map +1 -0
  25. package/dist/services/canvas-service.js +166 -0
  26. package/dist/services/canvas-service.js.map +1 -0
  27. package/dist/services/context-doc-service.d.ts +70 -0
  28. package/dist/services/context-doc-service.d.ts.map +1 -0
  29. package/dist/services/context-doc-service.js +229 -0
  30. package/dist/services/context-doc-service.js.map +1 -0
  31. package/dist/services/dependency-service.d.ts +22 -0
  32. package/dist/services/dependency-service.d.ts.map +1 -0
  33. package/dist/services/dependency-service.js +99 -0
  34. package/dist/services/dependency-service.js.map +1 -0
  35. package/dist/services/task-service.d.ts +32 -0
  36. package/dist/services/task-service.d.ts.map +1 -0
  37. package/dist/services/task-service.js +152 -0
  38. package/dist/services/task-service.js.map +1 -0
  39. package/dist/test-runner.d.ts +6 -0
  40. package/dist/test-runner.d.ts.map +1 -0
  41. package/dist/test-runner.js +130 -0
  42. package/dist/test-runner.js.map +1 -0
  43. package/dist/tools/get-accomplishment.d.ts +26 -0
  44. package/dist/tools/get-accomplishment.d.ts.map +1 -0
  45. package/dist/tools/get-accomplishment.js +53 -0
  46. package/dist/tools/get-accomplishment.js.map +1 -0
  47. package/dist/tools/get-blocked-items.d.ts +15 -0
  48. package/dist/tools/get-blocked-items.d.ts.map +1 -0
  49. package/dist/tools/get-blocked-items.js +72 -0
  50. package/dist/tools/get-blocked-items.js.map +1 -0
  51. package/dist/tools/get-current-work.d.ts +15 -0
  52. package/dist/tools/get-current-work.d.ts.map +1 -0
  53. package/dist/tools/get-current-work.js +67 -0
  54. package/dist/tools/get-current-work.js.map +1 -0
  55. package/dist/tools/get-project-status.d.ts +26 -0
  56. package/dist/tools/get-project-status.d.ts.map +1 -0
  57. package/dist/tools/get-project-status.js +92 -0
  58. package/dist/tools/get-project-status.js.map +1 -0
  59. package/dist/tools/get-ready-to-start.d.ts +15 -0
  60. package/dist/tools/get-ready-to-start.d.ts.map +1 -0
  61. package/dist/tools/get-ready-to-start.js +46 -0
  62. package/dist/tools/get-ready-to-start.js.map +1 -0
  63. package/dist/tools/index.d.ts +155 -0
  64. package/dist/tools/index.d.ts.map +1 -0
  65. package/dist/tools/index.js +48 -0
  66. package/dist/tools/index.js.map +1 -0
  67. package/dist/tools/list-accomplishments.d.ts +34 -0
  68. package/dist/tools/list-accomplishments.d.ts.map +1 -0
  69. package/dist/tools/list-accomplishments.js +34 -0
  70. package/dist/tools/list-accomplishments.js.map +1 -0
  71. package/dist/tools/list-files.d.ts +26 -0
  72. package/dist/tools/list-files.d.ts.map +1 -0
  73. package/dist/tools/list-files.js +46 -0
  74. package/dist/tools/list-files.js.map +1 -0
  75. package/dist/tools/list-workspaces.d.ts +22 -0
  76. package/dist/tools/list-workspaces.d.ts.map +1 -0
  77. package/dist/tools/list-workspaces.js +22 -0
  78. package/dist/tools/list-workspaces.js.map +1 -0
  79. package/dist/tools/manage-accomplishment.d.ts +147 -0
  80. package/dist/tools/manage-accomplishment.d.ts.map +1 -0
  81. package/dist/tools/manage-accomplishment.js +138 -0
  82. package/dist/tools/manage-accomplishment.js.map +1 -0
  83. package/dist/tools/manage-dependency.d.ts +41 -0
  84. package/dist/tools/manage-dependency.d.ts.map +1 -0
  85. package/dist/tools/manage-dependency.js +61 -0
  86. package/dist/tools/manage-dependency.js.map +1 -0
  87. package/dist/tools/manage-task.d.ts +119 -0
  88. package/dist/tools/manage-task.d.ts.map +1 -0
  89. package/dist/tools/manage-task.js +121 -0
  90. package/dist/tools/manage-task.js.map +1 -0
  91. package/dist/tools/read-docs.d.ts +48 -0
  92. package/dist/tools/read-docs.d.ts.map +1 -0
  93. package/dist/tools/read-docs.js +90 -0
  94. package/dist/tools/read-docs.js.map +1 -0
  95. package/dist/tools/set-work-focus.d.ts +48 -0
  96. package/dist/tools/set-work-focus.d.ts.map +1 -0
  97. package/dist/tools/set-work-focus.js +75 -0
  98. package/dist/tools/set-work-focus.js.map +1 -0
  99. package/dist/tools/sync-dependencies.d.ts +33 -0
  100. package/dist/tools/sync-dependencies.d.ts.map +1 -0
  101. package/dist/tools/sync-dependencies.js +144 -0
  102. package/dist/tools/sync-dependencies.js.map +1 -0
  103. package/dist/tools/update-doc.d.ts +62 -0
  104. package/dist/tools/update-doc.d.ts.map +1 -0
  105. package/dist/tools/update-doc.js +196 -0
  106. package/dist/tools/update-doc.js.map +1 -0
  107. package/dist/utils/config.d.ts +27 -0
  108. package/dist/utils/config.d.ts.map +1 -0
  109. package/dist/utils/config.js +106 -0
  110. package/dist/utils/config.js.map +1 -0
  111. package/dist/utils/file-utils.d.ts +29 -0
  112. package/dist/utils/file-utils.d.ts.map +1 -0
  113. package/dist/utils/file-utils.js +83 -0
  114. package/dist/utils/file-utils.js.map +1 -0
  115. package/dist/utils/positioning.d.ts +16 -0
  116. package/dist/utils/positioning.d.ts.map +1 -0
  117. package/dist/utils/positioning.js +126 -0
  118. package/dist/utils/positioning.js.map +1 -0
  119. 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"}