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,284 @@
1
+ import { NotFoundError, } from '../models/types.js';
2
+ import { parseAccomplishment, serializeAccomplishment } from '../parsers/markdown-parser.js';
3
+ import { readFile, writeFileAtomic, deleteFile, listFiles } from '../utils/file-utils.js';
4
+ import { getAccomplishmentsPath, getAccomplishmentFilePath, getRelativeAccomplishmentPath, } from '../utils/config.js';
5
+ import { generateAccomplishmentId, addAccomplishmentNode, removeAccomplishmentNode, loadCanvas, getNodeIdsByFilePaths, updateNodePosition, } from './canvas-service.js';
6
+ import { calculatePosition } from '../utils/positioning.js';
7
+ /**
8
+ * Create a new accomplishment
9
+ */
10
+ export async function createAccomplishment(config, data) {
11
+ const canvasSource = data.canvas_source || config.defaultCanvas;
12
+ // Generate ID
13
+ const id = await generateAccomplishmentId(config, canvasSource);
14
+ // Create frontmatter
15
+ const now = new Date().toISOString();
16
+ const frontmatter = {
17
+ type: 'accomplishment',
18
+ title: data.title,
19
+ id,
20
+ effort: data.effort,
21
+ status: data.status || 'Not Started',
22
+ priority: data.priority || 'High',
23
+ inProgress: false,
24
+ depends_on: data.depends_on || [],
25
+ created_by_plugin: true,
26
+ collapsed_height: 300,
27
+ expanded_height: 300,
28
+ expanded_width: 400,
29
+ created: now,
30
+ updated: now,
31
+ canvas_source: canvasSource,
32
+ vault_path: getRelativeAccomplishmentPath(config, data.title),
33
+ };
34
+ // Create accomplishment object
35
+ const accomplishment = {
36
+ frontmatter,
37
+ outcome: data.outcome || 'Describe the final state that will be true once this is done.',
38
+ acceptance_criteria: data.acceptance_criteria || [],
39
+ tasks: [],
40
+ notes: '',
41
+ };
42
+ // Write MD file
43
+ const filePath = getAccomplishmentFilePath(config, data.title);
44
+ const content = serializeAccomplishment(accomplishment);
45
+ await writeFileAtomic(filePath, content);
46
+ // Calculate position based on dependencies
47
+ const canvas = await loadCanvas(config, canvasSource);
48
+ let dependsOnNodeIds = [];
49
+ if (data.depends_on && data.depends_on.length > 0) {
50
+ // Get file paths for dependencies
51
+ const depFilePaths = await getFilePathsForIds(config, data.depends_on);
52
+ dependsOnNodeIds = await getNodeIdsByFilePaths(config, depFilePaths, canvasSource);
53
+ }
54
+ const position = calculatePosition(canvas, dependsOnNodeIds);
55
+ // Add node to canvas
56
+ await addAccomplishmentNode(config, getRelativeAccomplishmentPath(config, data.title), position, canvasSource);
57
+ return accomplishment;
58
+ }
59
+ /**
60
+ * Get an accomplishment by ID
61
+ */
62
+ export async function getAccomplishment(config, id) {
63
+ const filePath = await findAccomplishmentFileById(config, id);
64
+ if (!filePath) {
65
+ throw new NotFoundError(`Accomplishment not found: ${id}`);
66
+ }
67
+ const content = await readFile(filePath);
68
+ const accomplishment = parseAccomplishment(content);
69
+ // Compute is_blocked
70
+ accomplishment.is_blocked = await isAccomplishmentBlocked(config, accomplishment);
71
+ return accomplishment;
72
+ }
73
+ /**
74
+ * Update an accomplishment
75
+ */
76
+ export async function updateAccomplishment(config, id, data) {
77
+ const accomplishment = await getAccomplishment(config, id);
78
+ const oldTitle = accomplishment.frontmatter.title;
79
+ // Update frontmatter fields
80
+ if (data.title !== undefined)
81
+ accomplishment.frontmatter.title = data.title;
82
+ if (data.effort !== undefined)
83
+ accomplishment.frontmatter.effort = data.effort;
84
+ if (data.priority !== undefined)
85
+ accomplishment.frontmatter.priority = data.priority;
86
+ if (data.status !== undefined)
87
+ accomplishment.frontmatter.status = data.status;
88
+ if (data.inProgress !== undefined)
89
+ accomplishment.frontmatter.inProgress = data.inProgress;
90
+ // Update body sections
91
+ if (data.outcome !== undefined)
92
+ accomplishment.outcome = data.outcome;
93
+ if (data.acceptance_criteria !== undefined)
94
+ accomplishment.acceptance_criteria = data.acceptance_criteria;
95
+ if (data.notes !== undefined)
96
+ accomplishment.notes = data.notes;
97
+ // Update timestamp
98
+ accomplishment.frontmatter.updated = new Date().toISOString();
99
+ // Handle title change (file rename)
100
+ if (data.title && data.title !== oldTitle) {
101
+ const oldFilePath = getAccomplishmentFilePath(config, oldTitle);
102
+ const newFilePath = getAccomplishmentFilePath(config, data.title);
103
+ // Update vault_path in frontmatter
104
+ accomplishment.frontmatter.vault_path = getRelativeAccomplishmentPath(config, data.title);
105
+ // Write to new file
106
+ const content = serializeAccomplishment(accomplishment);
107
+ await writeFileAtomic(newFilePath, content);
108
+ // Delete old file
109
+ await deleteFile(oldFilePath);
110
+ // TODO: Update canvas node file reference
111
+ }
112
+ else {
113
+ // Write to existing file
114
+ const filePath = getAccomplishmentFilePath(config, accomplishment.frontmatter.title);
115
+ const content = serializeAccomplishment(accomplishment);
116
+ await writeFileAtomic(filePath, content);
117
+ }
118
+ return accomplishment;
119
+ }
120
+ /**
121
+ * Delete an accomplishment
122
+ */
123
+ export async function deleteAccomplishment(config, id) {
124
+ const accomplishment = await getAccomplishment(config, id);
125
+ const title = accomplishment.frontmatter.title;
126
+ const canvasSource = accomplishment.frontmatter.canvas_source;
127
+ // Delete MD file
128
+ const filePath = getAccomplishmentFilePath(config, title);
129
+ await deleteFile(filePath);
130
+ // Remove from canvas
131
+ await removeAccomplishmentNode(config, getRelativeAccomplishmentPath(config, title), canvasSource);
132
+ // Update other accomplishments that depend on this one
133
+ const allAccomplishments = await listAllAccomplishments(config);
134
+ for (const acc of allAccomplishments) {
135
+ if (acc.frontmatter.depends_on.includes(id)) {
136
+ acc.frontmatter.depends_on = acc.frontmatter.depends_on.filter(depId => depId !== id);
137
+ acc.frontmatter.updated = new Date().toISOString();
138
+ const accFilePath = getAccomplishmentFilePath(config, acc.frontmatter.title);
139
+ const content = serializeAccomplishment(acc);
140
+ await writeFileAtomic(accFilePath, content);
141
+ }
142
+ }
143
+ }
144
+ /**
145
+ * List all accomplishments
146
+ */
147
+ export async function listAllAccomplishments(config) {
148
+ const accomplishmentsPath = getAccomplishmentsPath(config);
149
+ const files = await listFiles(accomplishmentsPath);
150
+ const accomplishments = [];
151
+ for (const file of files) {
152
+ if (!file.endsWith('.md'))
153
+ continue;
154
+ try {
155
+ const filePath = `${accomplishmentsPath}/${file}`;
156
+ const content = await readFile(filePath);
157
+ const accomplishment = parseAccomplishment(content);
158
+ accomplishment.is_blocked = await isAccomplishmentBlocked(config, accomplishment);
159
+ accomplishments.push(accomplishment);
160
+ }
161
+ catch {
162
+ // Skip files that can't be parsed
163
+ }
164
+ }
165
+ return accomplishments;
166
+ }
167
+ /**
168
+ * List accomplishments with optional filtering
169
+ */
170
+ export async function listAccomplishments(config, status, canvasSource) {
171
+ const accomplishments = await listAllAccomplishments(config);
172
+ let filtered = accomplishments;
173
+ if (status) {
174
+ filtered = filtered.filter(a => a.frontmatter.status === status);
175
+ }
176
+ if (canvasSource) {
177
+ filtered = filtered.filter(a => a.frontmatter.canvas_source === canvasSource);
178
+ }
179
+ return filtered.map(a => toSummary(a));
180
+ }
181
+ /**
182
+ * Convert accomplishment to summary
183
+ */
184
+ function toSummary(accomplishment) {
185
+ const completedTasks = accomplishment.tasks.filter(t => t.status === 'Complete').length;
186
+ return {
187
+ id: accomplishment.frontmatter.id,
188
+ title: accomplishment.frontmatter.title,
189
+ status: accomplishment.frontmatter.status,
190
+ priority: accomplishment.frontmatter.priority,
191
+ effort: accomplishment.frontmatter.effort,
192
+ inProgress: accomplishment.frontmatter.inProgress,
193
+ is_blocked: accomplishment.is_blocked || false,
194
+ depends_on: accomplishment.frontmatter.depends_on,
195
+ task_count: accomplishment.tasks.length,
196
+ completed_task_count: completedTasks,
197
+ };
198
+ }
199
+ /**
200
+ * Check if an accomplishment is blocked by incomplete dependencies
201
+ */
202
+ async function isAccomplishmentBlocked(config, accomplishment) {
203
+ const dependsOn = accomplishment.frontmatter.depends_on;
204
+ if (!dependsOn || dependsOn.length === 0) {
205
+ return false;
206
+ }
207
+ for (const depId of dependsOn) {
208
+ try {
209
+ const dep = await getAccomplishmentById(config, depId);
210
+ if (dep && dep.frontmatter.status !== 'Completed') {
211
+ return true;
212
+ }
213
+ }
214
+ catch {
215
+ // Dependency not found - consider it blocking
216
+ return true;
217
+ }
218
+ }
219
+ return false;
220
+ }
221
+ /**
222
+ * Find accomplishment file path by ID
223
+ */
224
+ async function findAccomplishmentFileById(config, id) {
225
+ const accomplishmentsPath = getAccomplishmentsPath(config);
226
+ const files = await listFiles(accomplishmentsPath);
227
+ for (const file of files) {
228
+ if (!file.endsWith('.md'))
229
+ continue;
230
+ const filePath = `${accomplishmentsPath}/${file}`;
231
+ try {
232
+ const content = await readFile(filePath);
233
+ const idMatch = content.match(/^id:\s*(.+)$/m);
234
+ if (idMatch && idMatch[1].trim() === id) {
235
+ return filePath;
236
+ }
237
+ }
238
+ catch {
239
+ // Skip unreadable files
240
+ }
241
+ }
242
+ return null;
243
+ }
244
+ /**
245
+ * Get accomplishment by ID (internal helper)
246
+ */
247
+ async function getAccomplishmentById(config, id) {
248
+ const filePath = await findAccomplishmentFileById(config, id);
249
+ if (!filePath)
250
+ return null;
251
+ const content = await readFile(filePath);
252
+ return parseAccomplishment(content);
253
+ }
254
+ /**
255
+ * Get file paths for accomplishment IDs
256
+ */
257
+ async function getFilePathsForIds(config, ids) {
258
+ const paths = [];
259
+ for (const id of ids) {
260
+ const acc = await getAccomplishmentById(config, id);
261
+ if (acc) {
262
+ paths.push(getRelativeAccomplishmentPath(config, acc.frontmatter.title));
263
+ }
264
+ }
265
+ return paths;
266
+ }
267
+ /**
268
+ * Reposition an accomplishment based on its dependencies
269
+ */
270
+ export async function repositionAccomplishment(config, id) {
271
+ const accomplishment = await getAccomplishment(config, id);
272
+ const canvasSource = accomplishment.frontmatter.canvas_source;
273
+ // Get dependency node IDs
274
+ const depFilePaths = await getFilePathsForIds(config, accomplishment.frontmatter.depends_on);
275
+ const depNodeIds = await getNodeIdsByFilePaths(config, depFilePaths, canvasSource);
276
+ // Calculate new position
277
+ const canvas = await loadCanvas(config, canvasSource);
278
+ const position = calculatePosition(canvas, depNodeIds);
279
+ // Update node position
280
+ const filePath = getRelativeAccomplishmentPath(config, accomplishment.frontmatter.title);
281
+ await updateNodePosition(config, filePath, position, canvasSource);
282
+ return position;
283
+ }
284
+ //# sourceMappingURL=accomplishment-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accomplishment-service.js","sourceRoot":"","sources":["../../src/services/accomplishment-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ import { CanvasFile, CanvasNode, CanvasEdge, Config } from '../models/types.js';
2
+ /**
3
+ * Load a canvas file
4
+ */
5
+ export declare function loadCanvas(config: Config, canvasSource?: string): Promise<CanvasFile>;
6
+ /**
7
+ * Save a canvas file
8
+ */
9
+ export declare function saveCanvas(config: Config, canvas: CanvasFile, canvasSource?: string): Promise<void>;
10
+ /**
11
+ * Get all accomplishment IDs from canvas by reading file nodes
12
+ */
13
+ export declare function getAllAccomplishmentIds(config: Config, canvasSource?: string): Promise<string[]>;
14
+ /**
15
+ * Generate next accomplishment ID
16
+ */
17
+ export declare function generateAccomplishmentId(config: Config, canvasSource?: string): Promise<string>;
18
+ /**
19
+ * Add a node to canvas for an accomplishment
20
+ */
21
+ export declare function addAccomplishmentNode(config: Config, filePath: string, position: {
22
+ x: number;
23
+ y: number;
24
+ }, canvasSource?: string): Promise<CanvasNode>;
25
+ /**
26
+ * Remove an accomplishment node from canvas
27
+ */
28
+ export declare function removeAccomplishmentNode(config: Config, filePath: string, canvasSource?: string): Promise<void>;
29
+ /**
30
+ * Update node position
31
+ */
32
+ export declare function updateNodePosition(config: Config, filePath: string, position: {
33
+ x: number;
34
+ y: number;
35
+ }, canvasSource?: string): Promise<void>;
36
+ /**
37
+ * Add a dependency edge between two accomplishments
38
+ */
39
+ export declare function addDependencyEdge(config: Config, blockerFilePath: string, blockedFilePath: string, canvasSource?: string): Promise<CanvasEdge | null>;
40
+ /**
41
+ * Remove a dependency edge
42
+ */
43
+ export declare function removeDependencyEdge(config: Config, blockerFilePath: string, blockedFilePath: string, canvasSource?: string): Promise<void>;
44
+ /**
45
+ * Get node by file path
46
+ */
47
+ export declare function getNodeByFilePath(config: Config, filePath: string, canvasSource?: string): Promise<CanvasNode | undefined>;
48
+ /**
49
+ * Get node IDs for given file paths
50
+ */
51
+ export declare function getNodeIdsByFilePaths(config: Config, filePaths: string[], canvasSource?: string): Promise<string[]>;
52
+ //# sourceMappingURL=canvas-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canvas-service.d.ts","sourceRoot":"","sources":["../../src/services/canvas-service.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,UAAU,EACV,UAAU,EACV,MAAM,EAEP,MAAM,oBAAoB,CAAC;AAM5B;;GAEG;AACH,wBAAsB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAS3F;AAED;;GAEG;AACH,wBAAsB,UAAU,CAC9B,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,UAAU,EAClB,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,IAAI,CAAC,CAIf;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,MAAM,EACd,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,MAAM,EAAE,CAAC,CAsBnB;AAED;;GAEG;AACH,wBAAsB,wBAAwB,CAC5C,MAAM,EAAE,MAAM,EACd,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,MAAM,CAAC,CAYjB;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,EAClC,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,UAAU,CAAC,CAiBrB;AAED;;GAEG;AACH,wBAAsB,wBAAwB,CAC5C,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,IAAI,CAAC,CAWf;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,EAClC,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,IAAI,CAAC,CAUf;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,MAAM,EACd,eAAe,EAAE,MAAM,EACvB,eAAe,EAAE,MAAM,EACvB,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CA8B5B;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,MAAM,EACd,eAAe,EAAE,MAAM,EACvB,eAAe,EAAE,MAAM,EACvB,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,IAAI,CAAC,CAaf;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAGjC;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EAAE,EACnB,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,MAAM,EAAE,CAAC,CAYnB"}
@@ -0,0 +1,166 @@
1
+ import { NotFoundError, } from '../models/types.js';
2
+ import { parseCanvas, serializeCanvas, findNodeByFile } from '../parsers/canvas-parser.js';
3
+ import { readFile, writeFileAtomic, fileExists } from '../utils/file-utils.js';
4
+ import { getCanvasPath } from '../utils/config.js';
5
+ import { generateId } from '../utils/file-utils.js';
6
+ /**
7
+ * Load a canvas file
8
+ */
9
+ export async function loadCanvas(config, canvasSource) {
10
+ const canvasPath = getCanvasPath(config, canvasSource);
11
+ if (!(await fileExists(canvasPath))) {
12
+ throw new NotFoundError(`Canvas file not found: ${canvasPath}`);
13
+ }
14
+ const content = await readFile(canvasPath);
15
+ return parseCanvas(content);
16
+ }
17
+ /**
18
+ * Save a canvas file
19
+ */
20
+ export async function saveCanvas(config, canvas, canvasSource) {
21
+ const canvasPath = getCanvasPath(config, canvasSource);
22
+ const content = serializeCanvas(canvas);
23
+ await writeFileAtomic(canvasPath, content);
24
+ }
25
+ /**
26
+ * Get all accomplishment IDs from canvas by reading file nodes
27
+ */
28
+ export async function getAllAccomplishmentIds(config, canvasSource) {
29
+ const canvas = await loadCanvas(config, canvasSource);
30
+ const ids = [];
31
+ // Get all file nodes that are in the accomplishments folder
32
+ for (const node of canvas.nodes) {
33
+ if (node.type === 'file' && node.file?.startsWith(config.accomplishmentsFolder)) {
34
+ // Read the file to get the ID from frontmatter
35
+ try {
36
+ const filePath = `${config.vaultPath}/${node.file}`;
37
+ const content = await readFile(filePath);
38
+ const idMatch = content.match(/^id:\s*(.+)$/m);
39
+ if (idMatch) {
40
+ ids.push(idMatch[1].trim());
41
+ }
42
+ }
43
+ catch {
44
+ // File might not exist or be readable
45
+ }
46
+ }
47
+ }
48
+ return ids;
49
+ }
50
+ /**
51
+ * Generate next accomplishment ID
52
+ */
53
+ export async function generateAccomplishmentId(config, canvasSource) {
54
+ const existingIds = await getAllAccomplishmentIds(config, canvasSource);
55
+ const numbers = existingIds
56
+ .map(id => {
57
+ const match = id.match(/^ACC-(\d+)$/);
58
+ return match ? parseInt(match[1], 10) : 0;
59
+ })
60
+ .filter(n => !isNaN(n));
61
+ const maxNumber = numbers.length > 0 ? Math.max(...numbers) : 0;
62
+ return `ACC-${String(maxNumber + 1).padStart(3, '0')}`;
63
+ }
64
+ /**
65
+ * Add a node to canvas for an accomplishment
66
+ */
67
+ export async function addAccomplishmentNode(config, filePath, position, canvasSource) {
68
+ const canvas = await loadCanvas(config, canvasSource);
69
+ const node = {
70
+ id: generateId(),
71
+ type: 'file',
72
+ file: filePath,
73
+ x: position.x,
74
+ y: position.y,
75
+ width: 400,
76
+ height: 300,
77
+ };
78
+ canvas.nodes.push(node);
79
+ await saveCanvas(config, canvas, canvasSource);
80
+ return node;
81
+ }
82
+ /**
83
+ * Remove an accomplishment node from canvas
84
+ */
85
+ export async function removeAccomplishmentNode(config, filePath, canvasSource) {
86
+ const canvas = await loadCanvas(config, canvasSource);
87
+ const node = findNodeByFile(canvas, filePath);
88
+ if (!node)
89
+ return;
90
+ // Remove node and all associated edges
91
+ canvas.nodes = canvas.nodes.filter(n => n.id !== node.id);
92
+ canvas.edges = canvas.edges.filter(e => e.fromNode !== node.id && e.toNode !== node.id);
93
+ await saveCanvas(config, canvas, canvasSource);
94
+ }
95
+ /**
96
+ * Update node position
97
+ */
98
+ export async function updateNodePosition(config, filePath, position, canvasSource) {
99
+ const canvas = await loadCanvas(config, canvasSource);
100
+ const node = findNodeByFile(canvas, filePath);
101
+ if (!node)
102
+ return;
103
+ node.x = position.x;
104
+ node.y = position.y;
105
+ await saveCanvas(config, canvas, canvasSource);
106
+ }
107
+ /**
108
+ * Add a dependency edge between two accomplishments
109
+ */
110
+ export async function addDependencyEdge(config, blockerFilePath, blockedFilePath, canvasSource) {
111
+ const canvas = await loadCanvas(config, canvasSource);
112
+ const blockerNode = findNodeByFile(canvas, blockerFilePath);
113
+ const blockedNode = findNodeByFile(canvas, blockedFilePath);
114
+ if (!blockerNode || !blockedNode) {
115
+ return null;
116
+ }
117
+ // Check if edge already exists
118
+ const existingEdge = canvas.edges.find(e => e.fromNode === blockerNode.id && e.toNode === blockedNode.id);
119
+ if (existingEdge) {
120
+ return existingEdge;
121
+ }
122
+ const edge = {
123
+ id: generateId(),
124
+ fromNode: blockerNode.id,
125
+ toNode: blockedNode.id,
126
+ fromSide: 'right',
127
+ toSide: 'left',
128
+ };
129
+ canvas.edges.push(edge);
130
+ await saveCanvas(config, canvas, canvasSource);
131
+ return edge;
132
+ }
133
+ /**
134
+ * Remove a dependency edge
135
+ */
136
+ export async function removeDependencyEdge(config, blockerFilePath, blockedFilePath, canvasSource) {
137
+ const canvas = await loadCanvas(config, canvasSource);
138
+ const blockerNode = findNodeByFile(canvas, blockerFilePath);
139
+ const blockedNode = findNodeByFile(canvas, blockedFilePath);
140
+ if (!blockerNode || !blockedNode)
141
+ return;
142
+ canvas.edges = canvas.edges.filter(e => !(e.fromNode === blockerNode.id && e.toNode === blockedNode.id));
143
+ await saveCanvas(config, canvas, canvasSource);
144
+ }
145
+ /**
146
+ * Get node by file path
147
+ */
148
+ export async function getNodeByFilePath(config, filePath, canvasSource) {
149
+ const canvas = await loadCanvas(config, canvasSource);
150
+ return findNodeByFile(canvas, filePath);
151
+ }
152
+ /**
153
+ * Get node IDs for given file paths
154
+ */
155
+ export async function getNodeIdsByFilePaths(config, filePaths, canvasSource) {
156
+ const canvas = await loadCanvas(config, canvasSource);
157
+ const nodeIds = [];
158
+ for (const filePath of filePaths) {
159
+ const node = findNodeByFile(canvas, filePath);
160
+ if (node) {
161
+ nodeIds.push(node.id);
162
+ }
163
+ }
164
+ return nodeIds;
165
+ }
166
+ //# sourceMappingURL=canvas-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canvas-service.js","sourceRoot":"","sources":["../../src/services/canvas-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,70 @@
1
+ import { Config } from '../models/types.js';
2
+ /**
3
+ * Get the folder path where the canvas file is located
4
+ */
5
+ export declare function getCanvasFolderPath(config: Config, canvasSource?: string): string;
6
+ /**
7
+ * Get all MD files in the canvas folder
8
+ */
9
+ export declare function getAllMdFilesInCanvasFolder(config: Config, canvasSource?: string): Promise<string[]>;
10
+ /**
11
+ * Get all MD files in the context docs folder (if configured)
12
+ */
13
+ export declare function getAllMdFilesInContextDocsFolder(config: Config): Promise<string[]>;
14
+ /**
15
+ * Get all files referenced by the canvas
16
+ */
17
+ export declare function getCanvasReferencedFiles(config: Config, canvasSource?: string): Promise<Set<string>>;
18
+ /**
19
+ * Get context documents from both sources:
20
+ * 1. MD files in canvas folder NOT referenced by canvas
21
+ * 2. All MD files in CONTEXT_DOCS_FOLDER (if configured)
22
+ *
23
+ * Files from context docs folder are prefixed with "context:" to distinguish them
24
+ */
25
+ export declare function getContextDocuments(config: Config, canvasSource?: string): Promise<string[]>;
26
+ /**
27
+ * Parse doc name to determine source folder and actual filename
28
+ */
29
+ export declare function parseDocName(docName: string): {
30
+ isContextFolder: boolean;
31
+ filename: string;
32
+ };
33
+ /**
34
+ * Get full path to a context document
35
+ * Handles both canvas folder docs and context folder docs (prefixed with "context:")
36
+ */
37
+ export declare function getContextDocPath(config: Config, docName: string, canvasSource?: string): string;
38
+ /**
39
+ * Check if a document is a valid context document (exists and not referenced by canvas)
40
+ */
41
+ export declare function isContextDocument(config: Config, docName: string, canvasSource?: string): Promise<boolean>;
42
+ /**
43
+ * Read a single context document
44
+ */
45
+ export declare function readContextDocument(config: Config, docName: string, canvasSource?: string, startLine?: number, endLine?: number): Promise<string>;
46
+ /**
47
+ * Read all context documents
48
+ */
49
+ export declare function readAllContextDocuments(config: Config, canvasSource?: string): Promise<Record<string, string>>;
50
+ /**
51
+ * Create a new context document
52
+ */
53
+ export declare function createContextDocument(config: Config, docName: string, content: string, canvasSource?: string): Promise<void>;
54
+ /**
55
+ * Replace entire content of a context document
56
+ */
57
+ export declare function replaceContextDocument(config: Config, docName: string, content: string, canvasSource?: string): Promise<void>;
58
+ /**
59
+ * Delete a context document
60
+ */
61
+ export declare function deleteContextDocument(config: Config, docName: string, canvasSource?: string): Promise<void>;
62
+ /**
63
+ * Insert content at a specific line in a context document
64
+ */
65
+ export declare function insertAtLine(config: Config, docName: string, content: string, startLine: number, canvasSource?: string): Promise<void>;
66
+ /**
67
+ * Replace content in a specific line range in a context document
68
+ */
69
+ export declare function replaceAtRange(config: Config, docName: string, content: string, startLine: number, endLine: number, canvasSource?: string): Promise<void>;
70
+ //# sourceMappingURL=context-doc-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-doc-service.d.ts","sourceRoot":"","sources":["../../src/services/context-doc-service.ts"],"names":[],"mappings":"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"}