obsidian-accomplishments-mcp 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +22 -0
- package/README.md +349 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +120 -0
- package/dist/index.js.map +1 -0
- package/dist/models/types.d.ts +136 -0
- package/dist/models/types.d.ts.map +1 -0
- package/dist/models/types.js +27 -0
- package/dist/models/types.js.map +1 -0
- package/dist/parsers/canvas-parser.d.ts +58 -0
- package/dist/parsers/canvas-parser.d.ts.map +1 -0
- package/dist/parsers/canvas-parser.js +136 -0
- package/dist/parsers/canvas-parser.js.map +1 -0
- package/dist/parsers/markdown-parser.d.ts +22 -0
- package/dist/parsers/markdown-parser.d.ts.map +1 -0
- package/dist/parsers/markdown-parser.js +254 -0
- package/dist/parsers/markdown-parser.js.map +1 -0
- package/dist/services/accomplishment-service.d.ts +33 -0
- package/dist/services/accomplishment-service.d.ts.map +1 -0
- package/dist/services/accomplishment-service.js +284 -0
- package/dist/services/accomplishment-service.js.map +1 -0
- package/dist/services/canvas-service.d.ts +52 -0
- package/dist/services/canvas-service.d.ts.map +1 -0
- package/dist/services/canvas-service.js +166 -0
- package/dist/services/canvas-service.js.map +1 -0
- package/dist/services/context-doc-service.d.ts +70 -0
- package/dist/services/context-doc-service.d.ts.map +1 -0
- package/dist/services/context-doc-service.js +229 -0
- package/dist/services/context-doc-service.js.map +1 -0
- package/dist/services/dependency-service.d.ts +22 -0
- package/dist/services/dependency-service.d.ts.map +1 -0
- package/dist/services/dependency-service.js +99 -0
- package/dist/services/dependency-service.js.map +1 -0
- package/dist/services/task-service.d.ts +32 -0
- package/dist/services/task-service.d.ts.map +1 -0
- package/dist/services/task-service.js +152 -0
- package/dist/services/task-service.js.map +1 -0
- package/dist/test-runner.d.ts +6 -0
- package/dist/test-runner.d.ts.map +1 -0
- package/dist/test-runner.js +130 -0
- package/dist/test-runner.js.map +1 -0
- package/dist/tools/get-accomplishment.d.ts +26 -0
- package/dist/tools/get-accomplishment.d.ts.map +1 -0
- package/dist/tools/get-accomplishment.js +53 -0
- package/dist/tools/get-accomplishment.js.map +1 -0
- package/dist/tools/get-blocked-items.d.ts +15 -0
- package/dist/tools/get-blocked-items.d.ts.map +1 -0
- package/dist/tools/get-blocked-items.js +72 -0
- package/dist/tools/get-blocked-items.js.map +1 -0
- package/dist/tools/get-current-work.d.ts +15 -0
- package/dist/tools/get-current-work.d.ts.map +1 -0
- package/dist/tools/get-current-work.js +67 -0
- package/dist/tools/get-current-work.js.map +1 -0
- package/dist/tools/get-project-status.d.ts +26 -0
- package/dist/tools/get-project-status.d.ts.map +1 -0
- package/dist/tools/get-project-status.js +92 -0
- package/dist/tools/get-project-status.js.map +1 -0
- package/dist/tools/get-ready-to-start.d.ts +15 -0
- package/dist/tools/get-ready-to-start.d.ts.map +1 -0
- package/dist/tools/get-ready-to-start.js +46 -0
- package/dist/tools/get-ready-to-start.js.map +1 -0
- package/dist/tools/index.d.ts +155 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +48 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/list-accomplishments.d.ts +34 -0
- package/dist/tools/list-accomplishments.d.ts.map +1 -0
- package/dist/tools/list-accomplishments.js +34 -0
- package/dist/tools/list-accomplishments.js.map +1 -0
- package/dist/tools/list-files.d.ts +26 -0
- package/dist/tools/list-files.d.ts.map +1 -0
- package/dist/tools/list-files.js +46 -0
- package/dist/tools/list-files.js.map +1 -0
- package/dist/tools/list-workspaces.d.ts +22 -0
- package/dist/tools/list-workspaces.d.ts.map +1 -0
- package/dist/tools/list-workspaces.js +22 -0
- package/dist/tools/list-workspaces.js.map +1 -0
- package/dist/tools/manage-accomplishment.d.ts +147 -0
- package/dist/tools/manage-accomplishment.d.ts.map +1 -0
- package/dist/tools/manage-accomplishment.js +138 -0
- package/dist/tools/manage-accomplishment.js.map +1 -0
- package/dist/tools/manage-dependency.d.ts +41 -0
- package/dist/tools/manage-dependency.d.ts.map +1 -0
- package/dist/tools/manage-dependency.js +61 -0
- package/dist/tools/manage-dependency.js.map +1 -0
- package/dist/tools/manage-task.d.ts +119 -0
- package/dist/tools/manage-task.d.ts.map +1 -0
- package/dist/tools/manage-task.js +121 -0
- package/dist/tools/manage-task.js.map +1 -0
- package/dist/tools/read-docs.d.ts +48 -0
- package/dist/tools/read-docs.d.ts.map +1 -0
- package/dist/tools/read-docs.js +90 -0
- package/dist/tools/read-docs.js.map +1 -0
- package/dist/tools/set-work-focus.d.ts +48 -0
- package/dist/tools/set-work-focus.d.ts.map +1 -0
- package/dist/tools/set-work-focus.js +75 -0
- package/dist/tools/set-work-focus.js.map +1 -0
- package/dist/tools/sync-dependencies.d.ts +33 -0
- package/dist/tools/sync-dependencies.d.ts.map +1 -0
- package/dist/tools/sync-dependencies.js +144 -0
- package/dist/tools/sync-dependencies.js.map +1 -0
- package/dist/tools/update-doc.d.ts +62 -0
- package/dist/tools/update-doc.d.ts.map +1 -0
- package/dist/tools/update-doc.js +196 -0
- package/dist/tools/update-doc.js.map +1 -0
- package/dist/utils/config.d.ts +27 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +106 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/file-utils.d.ts +29 -0
- package/dist/utils/file-utils.d.ts.map +1 -0
- package/dist/utils/file-utils.js +83 -0
- package/dist/utils/file-utils.js.map +1 -0
- package/dist/utils/positioning.d.ts +16 -0
- package/dist/utils/positioning.d.ts.map +1 -0
- package/dist/utils/positioning.js +126 -0
- package/dist/utils/positioning.js.map +1 -0
- package/package.json +56 -0
|
@@ -0,0 +1,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":"AAAA,OAAO,EAEL,aAAa,EACb,eAAe,GAChB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AAC1F,OAAO,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AACxE,OAAO,EAAE,yBAAyB,EAAE,6BAA6B,EAAE,MAAM,oBAAoB,CAAC;AAC9F,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EACL,UAAU,EACV,iBAAiB,EACjB,oBAAoB,GACrB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAE/E;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,MAAc,EACd,SAAiB,EACjB,SAAiB;IAEjB,sCAAsC;IACtC,MAAM,OAAO,GAAG,MAAM,iBAAiB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAC3D,MAAM,OAAO,GAAG,MAAM,iBAAiB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAE3D,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,aAAa,CAAC,qCAAqC,SAAS,EAAE,CAAC,CAAC;IAC5E,CAAC;IACD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,aAAa,CAAC,qCAAqC,SAAS,EAAE,CAAC,CAAC;IAC5E,CAAC;IAED,gCAAgC;IAChC,MAAM,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,aAAa,CAAC;IACvD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAEtD,MAAM,eAAe,GAAG,6BAA6B,CAAC,MAAM,EAAE,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IACzF,MAAM,eAAe,GAAG,6BAA6B,CAAC,MAAM,EAAE,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IAEzF,MAAM,WAAW,GAAG,cAAc,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IAC5D,MAAM,WAAW,GAAG,cAAc,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IAE5D,IAAI,WAAW,IAAI,WAAW,EAAE,CAAC;QAC/B,IAAI,gBAAgB,CAAC,MAAM,EAAE,WAAW,CAAC,EAAE,EAAE,WAAW,CAAC,EAAE,CAAC,EAAE,CAAC;YAC7D,MAAM,IAAI,eAAe,CACvB,yDAAyD,SAAS,OAAO,SAAS,EAAE,CACrF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,qCAAqC;IACrC,IAAI,OAAO,CAAC,WAAW,CAAC,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QACvD,+CAA+C;QAC/C,MAAM,IAAI,GAAG,cAAc,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;QACrD,OAAO,EAAE,QAAQ,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;IAC5D,CAAC;IAED,0BAA0B;IAC1B,OAAO,CAAC,WAAW,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC/C,OAAO,CAAC,WAAW,CAAC,OAAO,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAEvD,8BAA8B;IAC9B,MAAM,QAAQ,GAAG,yBAAyB,CAAC,MAAM,EAAE,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IAC9E,MAAM,OAAO,GAAG,uBAAuB,CAAC,OAAO,CAAC,CAAC;IACjD,MAAM,eAAe,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAEzC,qBAAqB;IACrB,MAAM,iBAAiB,CAAC,MAAM,EAAE,eAAe,EAAE,eAAe,EAAE,YAAY,CAAC,CAAC;IAEhF,0BAA0B;IAC1B,MAAM,QAAQ,GAAG,MAAM,wBAAwB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAEnE,OAAO,EAAE,QAAQ,EAAE,CAAC;AACtB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,MAAc,EACd,SAAiB,EACjB,SAAiB;IAEjB,6BAA6B;IAC7B,MAAM,OAAO,GAAG,MAAM,iBAAiB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAC3D,MAAM,OAAO,GAAG,MAAM,iBAAiB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAE3D,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,aAAa,CAAC,qCAAqC,SAAS,EAAE,CAAC,CAAC;IAC5E,CAAC;IAED,+BAA+B;IAC/B,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,CAAC,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChE,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;QACjB,OAAO,CAAC,2BAA2B;IACrC,CAAC;IAED,OAAO,CAAC,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAChD,OAAO,CAAC,WAAW,CAAC,OAAO,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAEvD,8BAA8B;IAC9B,MAAM,QAAQ,GAAG,yBAAyB,CAAC,MAAM,EAAE,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IAC9E,MAAM,OAAO,GAAG,uBAAuB,CAAC,OAAO,CAAC,CAAC;IACjD,MAAM,eAAe,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAEzC,0BAA0B;IAC1B,MAAM,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,aAAa,CAAC;IACvD,MAAM,eAAe,GAAG,OAAO;QAC7B,CAAC,CAAC,6BAA6B,CAAC,MAAM,EAAE,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC;QAClE,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,eAAe,GAAG,6BAA6B,CAAC,MAAM,EAAE,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IAEzF,IAAI,eAAe,EAAE,CAAC;QACpB,MAAM,oBAAoB,CAAC,MAAM,EAAE,eAAe,EAAE,eAAe,EAAE,YAAY,CAAC,CAAC;IACrF,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,MAAc,EACd,gBAAwB;IAExB,MAAM,cAAc,GAAG,MAAM,iBAAiB,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IAEzE,qDAAqD;IACrD,MAAM,QAAQ,GAAG,cAAc,CAAC,WAAW,CAAC,UAAU,CAAC;IAEvD,sCAAsC;IACtC,2EAA2E;IAC3E,MAAM,EAAE,sBAAsB,EAAE,GAAG,MAAM,MAAM,CAAC,6BAA6B,CAAC,CAAC;IAC/E,MAAM,kBAAkB,GAAG,MAAM,sBAAsB,CAAC,MAAM,CAAC,CAAC;IAEhE,MAAM,QAAQ,GAAG,kBAAkB;SAChC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,UAAU,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC;SAChE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;IAE9B,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;AAChC,CAAC"}
|
|
@@ -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 @@
|
|
|
1
|
+
{"version":3,"file":"test-runner.d.ts","sourceRoot":"","sources":["../src/test-runner.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|