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,229 @@
1
+ import { NotFoundError, ValidationError, ConflictError } from '../models/types.js';
2
+ import { loadCanvas } from './canvas-service.js';
3
+ import { readFile, writeFileAtomic, deleteFile, fileExists, listFiles } from '../utils/file-utils.js';
4
+ import { getCanvasPath, getContextDocsFolderPath } from '../utils/config.js';
5
+ import { dirname } from 'path';
6
+ // Prefix used to identify docs from the context docs folder
7
+ const CONTEXT_FOLDER_PREFIX = 'context:';
8
+ /**
9
+ * Get the folder path where the canvas file is located
10
+ */
11
+ export function getCanvasFolderPath(config, canvasSource) {
12
+ const canvasPath = getCanvasPath(config, canvasSource);
13
+ return dirname(canvasPath);
14
+ }
15
+ /**
16
+ * Get all MD files in the canvas folder
17
+ */
18
+ export async function getAllMdFilesInCanvasFolder(config, canvasSource) {
19
+ const folderPath = getCanvasFolderPath(config, canvasSource);
20
+ const files = await listFiles(folderPath);
21
+ return files.filter(f => f.endsWith('.md'));
22
+ }
23
+ /**
24
+ * Get all MD files in the context docs folder (if configured)
25
+ */
26
+ export async function getAllMdFilesInContextDocsFolder(config) {
27
+ const folderPath = getContextDocsFolderPath(config);
28
+ if (!folderPath)
29
+ return [];
30
+ const files = await listFiles(folderPath);
31
+ return files.filter(f => f.endsWith('.md'));
32
+ }
33
+ /**
34
+ * Get all files referenced by the canvas
35
+ */
36
+ export async function getCanvasReferencedFiles(config, canvasSource) {
37
+ const canvas = await loadCanvas(config, canvasSource);
38
+ const referencedFiles = new Set();
39
+ for (const node of canvas.nodes) {
40
+ if (node.type === 'file' && node.file) {
41
+ // Extract just the filename from the path
42
+ const parts = node.file.split('/');
43
+ const filename = parts[parts.length - 1];
44
+ referencedFiles.add(filename);
45
+ }
46
+ }
47
+ return referencedFiles;
48
+ }
49
+ /**
50
+ * Get context documents from both sources:
51
+ * 1. MD files in canvas folder NOT referenced by canvas
52
+ * 2. All MD files in CONTEXT_DOCS_FOLDER (if configured)
53
+ *
54
+ * Files from context docs folder are prefixed with "context:" to distinguish them
55
+ */
56
+ export async function getContextDocuments(config, canvasSource) {
57
+ const result = [];
58
+ // 1. Get canvas folder context docs (not referenced by canvas)
59
+ const allMdFiles = await getAllMdFilesInCanvasFolder(config, canvasSource);
60
+ const referencedFiles = await getCanvasReferencedFiles(config, canvasSource);
61
+ const canvasFolderDocs = allMdFiles.filter(f => !referencedFiles.has(f));
62
+ result.push(...canvasFolderDocs);
63
+ // 2. Get context docs folder files (if configured)
64
+ const contextFolderDocs = await getAllMdFilesInContextDocsFolder(config);
65
+ // Prefix with "context:" to distinguish from canvas folder docs
66
+ result.push(...contextFolderDocs.map(f => `${CONTEXT_FOLDER_PREFIX}${f}`));
67
+ return result;
68
+ }
69
+ /**
70
+ * Parse doc name to determine source folder and actual filename
71
+ */
72
+ export function parseDocName(docName) {
73
+ if (docName.startsWith(CONTEXT_FOLDER_PREFIX)) {
74
+ const filename = docName.slice(CONTEXT_FOLDER_PREFIX.length);
75
+ return {
76
+ isContextFolder: true,
77
+ filename: filename.endsWith('.md') ? filename : `${filename}.md`,
78
+ };
79
+ }
80
+ return {
81
+ isContextFolder: false,
82
+ filename: docName.endsWith('.md') ? docName : `${docName}.md`,
83
+ };
84
+ }
85
+ /**
86
+ * Get full path to a context document
87
+ * Handles both canvas folder docs and context folder docs (prefixed with "context:")
88
+ */
89
+ export function getContextDocPath(config, docName, canvasSource) {
90
+ const { isContextFolder, filename } = parseDocName(docName);
91
+ if (isContextFolder) {
92
+ const contextFolderPath = getContextDocsFolderPath(config);
93
+ if (!contextFolderPath) {
94
+ throw new ValidationError('CONTEXT_DOCS_FOLDER is not configured');
95
+ }
96
+ return `${contextFolderPath}/${filename}`;
97
+ }
98
+ const folderPath = getCanvasFolderPath(config, canvasSource);
99
+ return `${folderPath}/${filename}`;
100
+ }
101
+ /**
102
+ * Check if a document is a valid context document (exists and not referenced by canvas)
103
+ */
104
+ export async function isContextDocument(config, docName, canvasSource) {
105
+ const contextDocs = await getContextDocuments(config, canvasSource);
106
+ const { isContextFolder, filename } = parseDocName(docName);
107
+ if (isContextFolder) {
108
+ return contextDocs.includes(`${CONTEXT_FOLDER_PREFIX}${filename}`);
109
+ }
110
+ return contextDocs.includes(filename);
111
+ }
112
+ /**
113
+ * Read a single context document
114
+ */
115
+ export async function readContextDocument(config, docName, canvasSource, startLine, endLine) {
116
+ const docPath = getContextDocPath(config, docName, canvasSource);
117
+ if (!(await fileExists(docPath))) {
118
+ throw new NotFoundError(`Context document not found: ${docName}`);
119
+ }
120
+ const content = await readFile(docPath);
121
+ // If no line range specified, return full content
122
+ if (startLine === undefined && endLine === undefined) {
123
+ return content;
124
+ }
125
+ // Split into lines and apply range (0-based, start inclusive, end exclusive)
126
+ const lines = content.split('\n');
127
+ const start = startLine ?? 0;
128
+ const end = endLine ?? lines.length;
129
+ // Validate range
130
+ if (start < 0 || start > lines.length) {
131
+ throw new ValidationError(`Invalid start_line: ${start}. File has ${lines.length} lines (0-${lines.length - 1})`);
132
+ }
133
+ if (end < start) {
134
+ throw new ValidationError(`end_line (${end}) must be >= start_line (${start})`);
135
+ }
136
+ return lines.slice(start, end).join('\n');
137
+ }
138
+ /**
139
+ * Read all context documents
140
+ */
141
+ export async function readAllContextDocuments(config, canvasSource) {
142
+ const contextDocs = await getContextDocuments(config, canvasSource);
143
+ const result = {};
144
+ for (const docName of contextDocs) {
145
+ const docPath = getContextDocPath(config, docName, canvasSource);
146
+ try {
147
+ result[docName] = await readFile(docPath);
148
+ }
149
+ catch {
150
+ // Skip files that can't be read
151
+ }
152
+ }
153
+ return result;
154
+ }
155
+ /**
156
+ * Create a new context document
157
+ */
158
+ export async function createContextDocument(config, docName, content, canvasSource) {
159
+ const docPath = getContextDocPath(config, docName, canvasSource);
160
+ if (await fileExists(docPath)) {
161
+ throw new ConflictError(`Document already exists: ${docName}. Use 'replace' operation to overwrite.`);
162
+ }
163
+ await writeFileAtomic(docPath, content);
164
+ }
165
+ /**
166
+ * Replace entire content of a context document
167
+ */
168
+ export async function replaceContextDocument(config, docName, content, canvasSource) {
169
+ const docPath = getContextDocPath(config, docName, canvasSource);
170
+ if (!(await fileExists(docPath))) {
171
+ throw new NotFoundError(`Context document not found: ${docName}`);
172
+ }
173
+ await writeFileAtomic(docPath, content);
174
+ }
175
+ /**
176
+ * Delete a context document
177
+ */
178
+ export async function deleteContextDocument(config, docName, canvasSource) {
179
+ const docPath = getContextDocPath(config, docName, canvasSource);
180
+ if (!(await fileExists(docPath))) {
181
+ throw new NotFoundError(`Context document not found: ${docName}`);
182
+ }
183
+ await deleteFile(docPath);
184
+ }
185
+ /**
186
+ * Insert content at a specific line in a context document
187
+ */
188
+ export async function insertAtLine(config, docName, content, startLine, canvasSource) {
189
+ const docPath = getContextDocPath(config, docName, canvasSource);
190
+ if (!(await fileExists(docPath))) {
191
+ throw new NotFoundError(`Context document not found: ${docName}`);
192
+ }
193
+ const existingContent = await readFile(docPath);
194
+ const lines = existingContent.split('\n');
195
+ // Validate line number (0-based)
196
+ if (startLine < 0 || startLine > lines.length) {
197
+ throw new ValidationError(`Invalid start_line: ${startLine}. File has ${lines.length} lines (valid range: 0-${lines.length})`);
198
+ }
199
+ // Insert content at the specified line
200
+ const newLines = content.split('\n');
201
+ lines.splice(startLine, 0, ...newLines);
202
+ await writeFileAtomic(docPath, lines.join('\n'));
203
+ }
204
+ /**
205
+ * Replace content in a specific line range in a context document
206
+ */
207
+ export async function replaceAtRange(config, docName, content, startLine, endLine, canvasSource) {
208
+ const docPath = getContextDocPath(config, docName, canvasSource);
209
+ if (!(await fileExists(docPath))) {
210
+ throw new NotFoundError(`Context document not found: ${docName}`);
211
+ }
212
+ const existingContent = await readFile(docPath);
213
+ const lines = existingContent.split('\n');
214
+ // Validate range (0-based, start inclusive, end exclusive)
215
+ if (startLine < 0 || startLine > lines.length) {
216
+ throw new ValidationError(`Invalid start_line: ${startLine}. File has ${lines.length} lines (valid range: 0-${lines.length - 1})`);
217
+ }
218
+ if (endLine < startLine) {
219
+ throw new ValidationError(`end_line (${endLine}) must be >= start_line (${startLine})`);
220
+ }
221
+ if (endLine > lines.length) {
222
+ throw new ValidationError(`Invalid end_line: ${endLine}. File has ${lines.length} lines (valid range: 0-${lines.length})`);
223
+ }
224
+ // Replace lines in range with new content
225
+ const newLines = content.split('\n');
226
+ lines.splice(startLine, endLine - startLine, ...newLines);
227
+ await writeFileAtomic(docPath, lines.join('\n'));
228
+ }
229
+ //# sourceMappingURL=context-doc-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-doc-service.js","sourceRoot":"","sources":["../../src/services/context-doc-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import { Config } from '../models/types.js';
2
+ /**
3
+ * Add a dependency between two accomplishments
4
+ */
5
+ export declare function addDependency(config: Config, blockerId: string, blockedId: string): Promise<{
6
+ position: {
7
+ x: number;
8
+ y: number;
9
+ };
10
+ }>;
11
+ /**
12
+ * Remove a dependency between two accomplishments
13
+ */
14
+ export declare function removeDependency(config: Config, blockerId: string, blockedId: string): Promise<void>;
15
+ /**
16
+ * Get all dependencies for an accomplishment
17
+ */
18
+ export declare function getDependencies(config: Config, accomplishmentId: string): Promise<{
19
+ blockers: string[];
20
+ blocking: string[];
21
+ }>;
22
+ //# sourceMappingURL=dependency-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependency-service.d.ts","sourceRoot":"","sources":["../../src/services/dependency-service.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,MAAM,EAGP,MAAM,oBAAoB,CAAC;AAY5B;;GAEG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC;IAAE,QAAQ,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAAC,CAqDjD;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,CAiCf;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,MAAM,EAAE,MAAM,EACd,gBAAgB,EAAE,MAAM,GACvB,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAgBrD"}
@@ -0,0 +1,99 @@
1
+ import { NotFoundError, ValidationError, } from '../models/types.js';
2
+ import { getAccomplishment, repositionAccomplishment } from './accomplishment-service.js';
3
+ import { serializeAccomplishment } from '../parsers/markdown-parser.js';
4
+ import { getAccomplishmentFilePath, getRelativeAccomplishmentPath } from '../utils/config.js';
5
+ import { writeFileAtomic } from '../utils/file-utils.js';
6
+ import { loadCanvas, addDependencyEdge, removeDependencyEdge, } from './canvas-service.js';
7
+ import { wouldCreateCycle, findNodeByFile } from '../parsers/canvas-parser.js';
8
+ /**
9
+ * Add a dependency between two accomplishments
10
+ */
11
+ export async function addDependency(config, blockerId, blockedId) {
12
+ // Validate both accomplishments exist
13
+ const blocker = await getAccomplishment(config, blockerId);
14
+ const blocked = await getAccomplishment(config, blockedId);
15
+ if (!blocker) {
16
+ throw new NotFoundError(`Blocker accomplishment not found: ${blockerId}`);
17
+ }
18
+ if (!blocked) {
19
+ throw new NotFoundError(`Blocked accomplishment not found: ${blockedId}`);
20
+ }
21
+ // Check for circular dependency
22
+ const canvasSource = blocked.frontmatter.canvas_source;
23
+ const canvas = await loadCanvas(config, canvasSource);
24
+ const blockerFilePath = getRelativeAccomplishmentPath(config, blocker.frontmatter.title);
25
+ const blockedFilePath = getRelativeAccomplishmentPath(config, blocked.frontmatter.title);
26
+ const blockerNode = findNodeByFile(canvas, blockerFilePath);
27
+ const blockedNode = findNodeByFile(canvas, blockedFilePath);
28
+ if (blockerNode && blockedNode) {
29
+ if (wouldCreateCycle(canvas, blockerNode.id, blockedNode.id)) {
30
+ throw new ValidationError(`Adding dependency would create a circular dependency: ${blockerId} -> ${blockedId}`);
31
+ }
32
+ }
33
+ // Check if dependency already exists
34
+ if (blocked.frontmatter.depends_on.includes(blockerId)) {
35
+ // Already exists, just return current position
36
+ const node = findNodeByFile(canvas, blockedFilePath);
37
+ return { position: { x: node?.x || 0, y: node?.y || 0 } };
38
+ }
39
+ // Add to depends_on array
40
+ blocked.frontmatter.depends_on.push(blockerId);
41
+ blocked.frontmatter.updated = new Date().toISOString();
42
+ // Save blocked accomplishment
43
+ const filePath = getAccomplishmentFilePath(config, blocked.frontmatter.title);
44
+ const content = serializeAccomplishment(blocked);
45
+ await writeFileAtomic(filePath, content);
46
+ // Add edge to canvas
47
+ await addDependencyEdge(config, blockerFilePath, blockedFilePath, canvasSource);
48
+ // Reposition blocked node
49
+ const position = await repositionAccomplishment(config, blockedId);
50
+ return { position };
51
+ }
52
+ /**
53
+ * Remove a dependency between two accomplishments
54
+ */
55
+ export async function removeDependency(config, blockerId, blockedId) {
56
+ // Get blocked accomplishment
57
+ const blocked = await getAccomplishment(config, blockedId);
58
+ const blocker = await getAccomplishment(config, blockerId);
59
+ if (!blocked) {
60
+ throw new NotFoundError(`Blocked accomplishment not found: ${blockedId}`);
61
+ }
62
+ // Remove from depends_on array
63
+ const index = blocked.frontmatter.depends_on.indexOf(blockerId);
64
+ if (index === -1) {
65
+ return; // Dependency doesn't exist
66
+ }
67
+ blocked.frontmatter.depends_on.splice(index, 1);
68
+ blocked.frontmatter.updated = new Date().toISOString();
69
+ // Save blocked accomplishment
70
+ const filePath = getAccomplishmentFilePath(config, blocked.frontmatter.title);
71
+ const content = serializeAccomplishment(blocked);
72
+ await writeFileAtomic(filePath, content);
73
+ // Remove edge from canvas
74
+ const canvasSource = blocked.frontmatter.canvas_source;
75
+ const blockerFilePath = blocker
76
+ ? getRelativeAccomplishmentPath(config, blocker.frontmatter.title)
77
+ : '';
78
+ const blockedFilePath = getRelativeAccomplishmentPath(config, blocked.frontmatter.title);
79
+ if (blockerFilePath) {
80
+ await removeDependencyEdge(config, blockerFilePath, blockedFilePath, canvasSource);
81
+ }
82
+ }
83
+ /**
84
+ * Get all dependencies for an accomplishment
85
+ */
86
+ export async function getDependencies(config, accomplishmentId) {
87
+ const accomplishment = await getAccomplishment(config, accomplishmentId);
88
+ // Get what this accomplishment depends on (blockers)
89
+ const blockers = accomplishment.frontmatter.depends_on;
90
+ // Get what this accomplishment blocks
91
+ // We need to scan all accomplishments to find ones that depend on this one
92
+ const { listAllAccomplishments } = await import('./accomplishment-service.js');
93
+ const allAccomplishments = await listAllAccomplishments(config);
94
+ const blocking = allAccomplishments
95
+ .filter(a => a.frontmatter.depends_on.includes(accomplishmentId))
96
+ .map(a => a.frontmatter.id);
97
+ return { blockers, blocking };
98
+ }
99
+ //# sourceMappingURL=dependency-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependency-service.js","sourceRoot":"","sources":["../../src/services/dependency-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import { Task, TaskData, TaskStatus, Config, Accomplishment } from '../models/types.js';
2
+ /**
3
+ * Add a task to an accomplishment
4
+ */
5
+ export declare function addTask(config: Config, accomplishmentId: string, data: TaskData): Promise<Task>;
6
+ /**
7
+ * Update a task
8
+ */
9
+ export declare function updateTask(config: Config, accomplishmentId: string, taskId: string, data: Partial<TaskData>): Promise<Task>;
10
+ /**
11
+ * Remove a task from an accomplishment
12
+ */
13
+ export declare function removeTask(config: Config, accomplishmentId: string, taskId: string): Promise<void>;
14
+ /**
15
+ * Get a task by ID
16
+ */
17
+ export declare function getTask(config: Config, accomplishmentId: string, taskId: string): Promise<Task>;
18
+ /**
19
+ * Set task status and optionally update accomplishment inProgress
20
+ */
21
+ export declare function setTaskStatus(config: Config, accomplishmentId: string, taskId: string, status: TaskStatus): Promise<{
22
+ task: Task;
23
+ accomplishment: Accomplishment;
24
+ }>;
25
+ /**
26
+ * Get all tasks with a specific status across all accomplishments
27
+ */
28
+ export declare function getTasksByStatus(config: Config, status: TaskStatus, accomplishments: Accomplishment[]): Promise<Array<{
29
+ accomplishmentId: string;
30
+ task: Task;
31
+ }>>;
32
+ //# sourceMappingURL=task-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-service.d.ts","sourceRoot":"","sources":["../../src/services/task-service.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,IAAI,EACJ,QAAQ,EACR,UAAU,EACV,MAAM,EAEN,cAAc,EACf,MAAM,oBAAoB,CAAC;AAM5B;;GAEG;AACH,wBAAsB,OAAO,CAC3B,MAAM,EAAE,MAAM,EACd,gBAAgB,EAAE,MAAM,EACxB,IAAI,EAAE,QAAQ,GACb,OAAO,CAAC,IAAI,CAAC,CA6Bf;AAED;;GAEG;AACH,wBAAsB,UAAU,CAC9B,MAAM,EAAE,MAAM,EACd,gBAAgB,EAAE,MAAM,EACxB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,GACtB,OAAO,CAAC,IAAI,CAAC,CAkCf;AAED;;GAEG;AACH,wBAAsB,UAAU,CAC9B,MAAM,EAAE,MAAM,EACd,gBAAgB,EAAE,MAAM,EACxB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CA4Bf;AAED;;GAEG;AACH,wBAAsB,OAAO,CAC3B,MAAM,EAAE,MAAM,EACd,gBAAgB,EAAE,MAAM,EACxB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CAcf;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,MAAM,EACd,gBAAgB,EAAE,MAAM,EACxB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,UAAU,GACjB,OAAO,CAAC;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,cAAc,EAAE,cAAc,CAAA;CAAE,CAAC,CA4BzD;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,UAAU,EAClB,eAAe,EAAE,cAAc,EAAE,GAChC,OAAO,CAAC,KAAK,CAAC;IAAE,gBAAgB,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,IAAI,CAAA;CAAE,CAAC,CAAC,CAe1D"}
@@ -0,0 +1,152 @@
1
+ import { NotFoundError, } from '../models/types.js';
2
+ import { parseTaskId, serializeAccomplishment } from '../parsers/markdown-parser.js';
3
+ import { getAccomplishment } from './accomplishment-service.js';
4
+ import { getAccomplishmentFilePath } from '../utils/config.js';
5
+ import { writeFileAtomic } from '../utils/file-utils.js';
6
+ /**
7
+ * Add a task to an accomplishment
8
+ */
9
+ export async function addTask(config, accomplishmentId, data) {
10
+ const accomplishment = await getAccomplishment(config, accomplishmentId);
11
+ // Determine next task number
12
+ const maxNumber = accomplishment.tasks.reduce((max, t) => Math.max(max, t.number), 0);
13
+ const task = {
14
+ number: maxNumber + 1,
15
+ name: data.name,
16
+ goal: data.goal,
17
+ description: data.description || '',
18
+ technical_notes: data.technical_notes,
19
+ estimate: data.estimate,
20
+ status: data.status || 'Open',
21
+ notes: data.notes,
22
+ };
23
+ accomplishment.tasks.push(task);
24
+ accomplishment.frontmatter.updated = new Date().toISOString();
25
+ // Save accomplishment
26
+ const filePath = getAccomplishmentFilePath(config, accomplishment.frontmatter.title);
27
+ const content = serializeAccomplishment(accomplishment);
28
+ await writeFileAtomic(filePath, content);
29
+ return task;
30
+ }
31
+ /**
32
+ * Update a task
33
+ */
34
+ export async function updateTask(config, accomplishmentId, taskId, data) {
35
+ const accomplishment = await getAccomplishment(config, accomplishmentId);
36
+ // Parse task ID to get task number
37
+ const parsed = parseTaskId(taskId);
38
+ if (!parsed) {
39
+ throw new NotFoundError(`Invalid task ID format: ${taskId}`);
40
+ }
41
+ // Find task by number
42
+ const taskIndex = accomplishment.tasks.findIndex(t => t.number === parsed.taskNumber);
43
+ if (taskIndex === -1) {
44
+ throw new NotFoundError(`Task not found: ${taskId}`);
45
+ }
46
+ const task = accomplishment.tasks[taskIndex];
47
+ // Update task fields
48
+ if (data.name !== undefined)
49
+ task.name = data.name;
50
+ if (data.goal !== undefined)
51
+ task.goal = data.goal;
52
+ if (data.description !== undefined)
53
+ task.description = data.description;
54
+ if (data.technical_notes !== undefined)
55
+ task.technical_notes = data.technical_notes;
56
+ if (data.estimate !== undefined)
57
+ task.estimate = data.estimate;
58
+ if (data.status !== undefined)
59
+ task.status = data.status;
60
+ if (data.notes !== undefined)
61
+ task.notes = data.notes;
62
+ accomplishment.frontmatter.updated = new Date().toISOString();
63
+ // Save accomplishment
64
+ const filePath = getAccomplishmentFilePath(config, accomplishment.frontmatter.title);
65
+ const content = serializeAccomplishment(accomplishment);
66
+ await writeFileAtomic(filePath, content);
67
+ return task;
68
+ }
69
+ /**
70
+ * Remove a task from an accomplishment
71
+ */
72
+ export async function removeTask(config, accomplishmentId, taskId) {
73
+ const accomplishment = await getAccomplishment(config, accomplishmentId);
74
+ // Parse task ID to get task number
75
+ const parsed = parseTaskId(taskId);
76
+ if (!parsed) {
77
+ throw new NotFoundError(`Invalid task ID format: ${taskId}`);
78
+ }
79
+ // Find and remove task
80
+ const taskIndex = accomplishment.tasks.findIndex(t => t.number === parsed.taskNumber);
81
+ if (taskIndex === -1) {
82
+ throw new NotFoundError(`Task not found: ${taskId}`);
83
+ }
84
+ accomplishment.tasks.splice(taskIndex, 1);
85
+ // Renumber remaining tasks
86
+ accomplishment.tasks.forEach((task, index) => {
87
+ task.number = index + 1;
88
+ });
89
+ accomplishment.frontmatter.updated = new Date().toISOString();
90
+ // Save accomplishment
91
+ const filePath = getAccomplishmentFilePath(config, accomplishment.frontmatter.title);
92
+ const content = serializeAccomplishment(accomplishment);
93
+ await writeFileAtomic(filePath, content);
94
+ }
95
+ /**
96
+ * Get a task by ID
97
+ */
98
+ export async function getTask(config, accomplishmentId, taskId) {
99
+ const accomplishment = await getAccomplishment(config, accomplishmentId);
100
+ const parsed = parseTaskId(taskId);
101
+ if (!parsed) {
102
+ throw new NotFoundError(`Invalid task ID format: ${taskId}`);
103
+ }
104
+ const task = accomplishment.tasks.find(t => t.number === parsed.taskNumber);
105
+ if (!task) {
106
+ throw new NotFoundError(`Task not found: ${taskId}`);
107
+ }
108
+ return task;
109
+ }
110
+ /**
111
+ * Set task status and optionally update accomplishment inProgress
112
+ */
113
+ export async function setTaskStatus(config, accomplishmentId, taskId, status) {
114
+ const accomplishment = await getAccomplishment(config, accomplishmentId);
115
+ const parsed = parseTaskId(taskId);
116
+ if (!parsed) {
117
+ throw new NotFoundError(`Invalid task ID format: ${taskId}`);
118
+ }
119
+ const task = accomplishment.tasks.find(t => t.number === parsed.taskNumber);
120
+ if (!task) {
121
+ throw new NotFoundError(`Task not found: ${taskId}`);
122
+ }
123
+ task.status = status;
124
+ // If task is set to InProgress, auto-set accomplishment inProgress
125
+ if (status === 'InProgress') {
126
+ accomplishment.frontmatter.inProgress = true;
127
+ }
128
+ accomplishment.frontmatter.updated = new Date().toISOString();
129
+ // Save accomplishment
130
+ const filePath = getAccomplishmentFilePath(config, accomplishment.frontmatter.title);
131
+ const content = serializeAccomplishment(accomplishment);
132
+ await writeFileAtomic(filePath, content);
133
+ return { task, accomplishment };
134
+ }
135
+ /**
136
+ * Get all tasks with a specific status across all accomplishments
137
+ */
138
+ export async function getTasksByStatus(config, status, accomplishments) {
139
+ const results = [];
140
+ for (const acc of accomplishments) {
141
+ for (const task of acc.tasks) {
142
+ if (task.status === status) {
143
+ results.push({
144
+ accomplishmentId: acc.frontmatter.id,
145
+ task,
146
+ });
147
+ }
148
+ }
149
+ }
150
+ return results;
151
+ }
152
+ //# sourceMappingURL=task-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-service.js","sourceRoot":"","sources":["../../src/services/task-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Simple test runner for the MCP server
3
+ * Run with: npx ts-node src/test-runner.ts
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=test-runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-runner.d.ts","sourceRoot":"","sources":["../src/test-runner.ts"],"names":[],"mappings":"AAAA;;;GAGG"}