mcp-task-server 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.
@@ -0,0 +1,259 @@
1
+ import { getWritingPreferences, getUserIdentity, getWorkflowPreferences, getAllMemoriesForPrompt, } from "./context.js";
2
+ /**
3
+ * Build a user context section for prompts if shared context is available
4
+ */
5
+ function buildUserContextSection() {
6
+ const sections = [];
7
+ const identity = getUserIdentity();
8
+ if (identity) {
9
+ sections.push(`**User Context**: ${identity}`);
10
+ }
11
+ const writing = getWritingPreferences();
12
+ if (writing) {
13
+ sections.push(`**Writing Preferences**: ${writing}`);
14
+ }
15
+ const workflow = getWorkflowPreferences();
16
+ if (workflow) {
17
+ sections.push(`**Workflow Preferences**: ${workflow}`);
18
+ }
19
+ if (sections.length === 0)
20
+ return "";
21
+ return `\n## User Preferences\n${sections.join("\n\n")}\n`;
22
+ }
23
+ /**
24
+ * Generate a prompt for expanding a task into subtasks
25
+ */
26
+ export function expandTaskPrompt(task) {
27
+ const userContext = buildUserContextSection();
28
+ return {
29
+ action: "expand",
30
+ task_id: task.id,
31
+ prompt: `Break down the following task into 3-7 actionable subtasks.
32
+
33
+ ## Task
34
+ **ID**: ${task.id}
35
+ **Title**: ${task.title}
36
+ ${task.description ? `**Description**: ${task.description}\n` : ""}**Priority**: ${task.priority}
37
+ ${userContext}
38
+ ## Instructions
39
+ 1. Analyze the task and identify the key steps needed to complete it
40
+ 2. Create 3-7 subtasks that are:
41
+ - Specific and actionable
42
+ - Small enough to complete in one session
43
+ - Ordered by dependency (what must be done first)
44
+ 3. For each subtask, provide:
45
+ - A clear, concise description
46
+ - Any dependencies on other subtasks
47
+
48
+ ## Response Format
49
+ After analyzing, call \`add_subtask\` for each subtask you identify, in order.
50
+
51
+ Example:
52
+ - add_subtask({ parent_id: "${task.id}", title: "First step description" })
53
+ - add_subtask({ parent_id: "${task.id}", title: "Second step description", dependencies: [1] })
54
+ `,
55
+ context: {
56
+ task_id: task.id,
57
+ task_title: task.title,
58
+ task_priority: task.priority,
59
+ },
60
+ callback: "add_subtask",
61
+ };
62
+ }
63
+ /**
64
+ * Generate a prompt for parsing a PRD into tasks
65
+ */
66
+ export function parsePrdPrompt(prdContent) {
67
+ const userContext = buildUserContextSection();
68
+ return {
69
+ action: "parse_prd",
70
+ prompt: `Parse the following PRD (Product Requirements Document) into actionable tasks.
71
+
72
+ ## PRD Content
73
+ ${prdContent}
74
+ ${userContext}
75
+ ## Instructions
76
+ 1. Read through the entire PRD
77
+ 2. Identify distinct features, requirements, and deliverables
78
+ 3. Create a task for each major item
79
+ 4. Set appropriate priorities based on:
80
+ - Critical: Core functionality, blocking other work
81
+ - High: Important features, should be done early
82
+ - Medium: Standard features
83
+ - Low: Nice-to-have, can be deferred
84
+ 5. Identify dependencies between tasks
85
+
86
+ ## Response Format
87
+ After analyzing, call \`add_task\` for each task you identify.
88
+
89
+ Example:
90
+ - add_task({ title: "Implement user authentication", priority: "critical" })
91
+ - add_task({ title: "Build dashboard UI", priority: "high", dependencies: ["<auth_task_id>"] })
92
+ `,
93
+ context: {
94
+ prd_length: prdContent.length,
95
+ },
96
+ callback: "add_task",
97
+ };
98
+ }
99
+ /**
100
+ * Generate a prompt for researching a task
101
+ */
102
+ export function researchTaskPrompt(task, topic) {
103
+ const researchTopic = topic || task.title;
104
+ const userContext = buildUserContextSection();
105
+ return {
106
+ action: "research",
107
+ task_id: task.id,
108
+ prompt: `Research the following topic to inform task implementation.
109
+
110
+ ## Task Context
111
+ **ID**: ${task.id}
112
+ **Title**: ${task.title}
113
+ ${task.description ? `**Description**: ${task.description}\n` : ""}
114
+ ## Research Topic
115
+ ${researchTopic}
116
+ ${userContext}
117
+ ## Instructions
118
+ 1. Identify key technical decisions needed
119
+ 2. Research best practices and common patterns
120
+ 3. Note any potential challenges or risks
121
+ 4. Suggest implementation approaches
122
+
123
+ ## Response Format
124
+ Provide your findings, then update the task with relevant notes:
125
+ - update_task({ task_id: "${task.id}", metadata: { research_notes: "..." } })
126
+
127
+ If you discover additional subtasks, add them:
128
+ - add_subtask({ parent_id: "${task.id}", title: "..." })
129
+ `,
130
+ context: {
131
+ task_id: task.id,
132
+ task_title: task.title,
133
+ research_topic: researchTopic,
134
+ },
135
+ callback: "update_task",
136
+ };
137
+ }
138
+ /**
139
+ * Generate a prompt for analyzing task complexity
140
+ */
141
+ export function analyzeComplexityPrompt(task) {
142
+ const userContext = buildUserContextSection();
143
+ return {
144
+ action: "analyze_complexity",
145
+ task_id: task.id,
146
+ prompt: `Analyze the complexity of the following task.
147
+
148
+ ## Task
149
+ **ID**: ${task.id}
150
+ **Title**: ${task.title}
151
+ ${task.description ? `**Description**: ${task.description}\n` : ""}**Priority**: ${task.priority}
152
+ ${userContext}
153
+ ## Analysis Criteria
154
+ 1. **Effort**: Estimate time needed (hours/days)
155
+ 2. **Technical Risk**: Unknown technologies, integration complexity
156
+ 3. **Dependencies**: External services, other teams, blocking tasks
157
+ 4. **Uncertainty**: How well-defined are the requirements?
158
+
159
+ ## Scoring
160
+ Rate each criterion from 1-5:
161
+ - 1: Trivial
162
+ - 2: Low
163
+ - 3: Medium
164
+ - 4: High
165
+ - 5: Very High
166
+
167
+ ## Response Format
168
+ Provide your analysis, then update the task with complexity metadata:
169
+ - update_task({
170
+ task_id: "${task.id}",
171
+ metadata: {
172
+ complexity: {
173
+ effort: <1-5>,
174
+ technical_risk: <1-5>,
175
+ dependencies: <1-5>,
176
+ uncertainty: <1-5>,
177
+ overall: <1-5>,
178
+ notes: "..."
179
+ }
180
+ }
181
+ })
182
+
183
+ If the task is too complex, recommend breaking it down:
184
+ - expand_task({ task_id: "${task.id}" })
185
+ `,
186
+ context: {
187
+ task_id: task.id,
188
+ task_title: task.title,
189
+ },
190
+ callback: "update_task",
191
+ };
192
+ }
193
+ /**
194
+ * Generate a prompt for checking compliance against user preferences
195
+ */
196
+ export function checkCompliancePrompt(path, content, fix) {
197
+ const allMemories = getAllMemoriesForPrompt();
198
+ if (!allMemories) {
199
+ return {
200
+ action: "check_compliance",
201
+ prompt: `No shared context found. Create ~/.cursor/shared-context.json with your preferences to use compliance checking.
202
+
203
+ See: https://github.com/yourusername/mcp-task-server/blob/main/docs/SHARED_CONTEXT.md`,
204
+ context: { path },
205
+ };
206
+ }
207
+ const fixInstructions = fix
208
+ ? `
209
+
210
+ ## Fix Mode
211
+ You are in FIX mode. After identifying issues:
212
+ 1. Edit the file(s) to fix each compliance issue
213
+ 2. Preserve the original meaning and intent
214
+ 3. Report what was changed`
215
+ : `
216
+
217
+ ## Review Mode
218
+ You are in REVIEW mode. Report findings but do not make changes.`;
219
+ return {
220
+ action: "check_compliance",
221
+ prompt: `Check the following content for compliance with user preferences.
222
+
223
+ ## Path
224
+ ${path}
225
+
226
+ ## Content to Check
227
+ \`\`\`
228
+ ${content}
229
+ \`\`\`
230
+
231
+ ## User Preferences
232
+ ${allMemories}
233
+ ${fixInstructions}
234
+
235
+ ## Compliance Checklist
236
+ Review against these categories:
237
+ 1. **Writing Style**: Tone, voice, formality level
238
+ 2. **Language**: British/American English, terminology
239
+ 3. **Formatting**: Dates, numbers, units, punctuation
240
+ 4. **Conventions**: Emojis, markdown style, structure
241
+ 5. **Values**: Alignment with stated principles
242
+
243
+ ## Response Format
244
+ For each issue found:
245
+ - **Location**: Line or section
246
+ - **Issue**: What doesn't comply
247
+ - **Preference**: The relevant preference
248
+ - **Suggestion**: How to fix it
249
+
250
+ If fully compliant, state: "Content complies with all preferences."
251
+ `,
252
+ context: {
253
+ path,
254
+ content_length: content.length,
255
+ fix_mode: fix,
256
+ },
257
+ };
258
+ }
259
+ //# sourceMappingURL=prompts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import { Config, Task, TaskStore, Subtask } from "./types.js";
2
+ /**
3
+ * Load tasks from JSON storage
4
+ */
5
+ export declare function loadTasks(config: Config): Promise<TaskStore>;
6
+ /**
7
+ * Save tasks to JSON storage, individual task files, and sync to markdown
8
+ */
9
+ export declare function saveTasks(config: Config, store: TaskStore): Promise<void>;
10
+ /**
11
+ * Generate a unique task ID
12
+ */
13
+ export declare function generateId(store: TaskStore): string;
14
+ /**
15
+ * Find a task by ID
16
+ */
17
+ export declare function findTask(store: TaskStore, id: string): Task | undefined;
18
+ /**
19
+ * Update a task in the store
20
+ */
21
+ export declare function updateTask(store: TaskStore, id: string, updates: Partial<Task>): Task | undefined;
22
+ /**
23
+ * Add a subtask to a task
24
+ */
25
+ export declare function addSubtaskToTask(task: Task, subtask: Omit<Subtask, "id">): Subtask;
26
+ //# sourceMappingURL=storage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AA2D9D;;GAEG;AACH,wBAAsB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAgBlE;AAED;;GAEG;AACH,wBAAsB,SAAS,CAC7B,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,SAAS,GACf,OAAO,CAAC,IAAI,CAAC,CAiBf;AAwND;;GAEG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAMnD;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAEvE;AAED;;GAEG;AACH,wBAAgB,UAAU,CACxB,KAAK,EAAE,SAAS,EAChB,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,GACrB,IAAI,GAAG,SAAS,CAMlB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,GAC3B,OAAO,CAaT"}
@@ -0,0 +1,293 @@
1
+ import { readFile, writeFile, mkdir } from "fs/promises";
2
+ import { existsSync } from "fs";
3
+ import { dirname } from "path";
4
+ import { resolvePath, getTaskFilePath } from "./config.js";
5
+ const CURRENT_VERSION = "2.0.0";
6
+ const OLD_JSON_PATH = ".taskmaster/tasks.json";
7
+ /**
8
+ * Create an empty task store
9
+ */
10
+ function createEmptyStore() {
11
+ return {
12
+ version: CURRENT_VERSION,
13
+ tasks: [],
14
+ agents: [],
15
+ updated_at: new Date().toISOString(),
16
+ };
17
+ }
18
+ /**
19
+ * Ensure directory exists for a file path
20
+ */
21
+ async function ensureDir(filePath) {
22
+ const dir = dirname(filePath);
23
+ if (!existsSync(dir)) {
24
+ await mkdir(dir, { recursive: true });
25
+ }
26
+ }
27
+ /**
28
+ * Check for and migrate old .taskmaster location
29
+ */
30
+ async function migrateOldLocation(config) {
31
+ const oldPath = resolvePath(config, OLD_JSON_PATH);
32
+ const newPath = resolvePath(config, config.jsonPath);
33
+ if (existsSync(oldPath) && !existsSync(newPath)) {
34
+ try {
35
+ const content = await readFile(oldPath, "utf-8");
36
+ const oldStore = JSON.parse(content);
37
+ // Ensure new directory exists
38
+ await ensureDir(newPath);
39
+ // Save to new location
40
+ await writeFile(newPath, JSON.stringify(oldStore, null, 2), "utf-8");
41
+ // Generate task files for existing tasks
42
+ for (const task of oldStore.tasks) {
43
+ await saveTaskFile(config, task);
44
+ }
45
+ return oldStore;
46
+ }
47
+ catch {
48
+ return null;
49
+ }
50
+ }
51
+ return null;
52
+ }
53
+ /**
54
+ * Load tasks from JSON storage
55
+ */
56
+ export async function loadTasks(config) {
57
+ // Try migration first
58
+ const migrated = await migrateOldLocation(config);
59
+ if (migrated) {
60
+ return migrated;
61
+ }
62
+ const jsonPath = resolvePath(config, config.jsonPath);
63
+ try {
64
+ const content = await readFile(jsonPath, "utf-8");
65
+ return JSON.parse(content);
66
+ }
67
+ catch {
68
+ // File doesn't exist or is invalid, return empty store
69
+ return createEmptyStore();
70
+ }
71
+ }
72
+ /**
73
+ * Save tasks to JSON storage, individual task files, and sync to markdown
74
+ */
75
+ export async function saveTasks(config, store) {
76
+ store.updated_at = new Date().toISOString();
77
+ store.version = CURRENT_VERSION;
78
+ // Save JSON registry
79
+ const jsonPath = resolvePath(config, config.jsonPath);
80
+ await ensureDir(jsonPath);
81
+ await writeFile(jsonPath, JSON.stringify(store, null, 2), "utf-8");
82
+ // Save individual task files (only for top-level tasks)
83
+ const topLevelTasks = store.tasks.filter((t) => !t.parent_id);
84
+ for (const task of topLevelTasks) {
85
+ await saveTaskFile(config, task);
86
+ }
87
+ // Sync to markdown summary
88
+ await syncToMarkdown(config, store);
89
+ }
90
+ /**
91
+ * Generate task file content (human-readable format)
92
+ */
93
+ function generateTaskFileContent(task) {
94
+ const lines = [];
95
+ lines.push(`# Task ID: ${task.id}`);
96
+ lines.push(`# Title: ${task.title}`);
97
+ lines.push(`# Status: ${task.status}`);
98
+ lines.push(`# Dependencies: ${task.dependencies?.length ? task.dependencies.join(", ") : "None"}`);
99
+ lines.push(`# Priority: ${task.priority}`);
100
+ if (task.description) {
101
+ lines.push(`# Description: ${task.description}`);
102
+ }
103
+ if (task.details) {
104
+ lines.push(`# Details:`);
105
+ lines.push(task.details);
106
+ lines.push("");
107
+ }
108
+ if (task.testStrategy) {
109
+ lines.push(`# Test Strategy:`);
110
+ lines.push(task.testStrategy);
111
+ lines.push("");
112
+ }
113
+ if (task.subtasks && task.subtasks.length > 0) {
114
+ lines.push(`# Subtasks:`);
115
+ for (const subtask of task.subtasks) {
116
+ lines.push(formatSubtask(subtask));
117
+ }
118
+ }
119
+ return lines.join("\n");
120
+ }
121
+ /**
122
+ * Format a subtask for the task file
123
+ */
124
+ function formatSubtask(subtask) {
125
+ const lines = [];
126
+ const statusTag = `[${subtask.status}]`;
127
+ lines.push(`## ${subtask.id}. ${subtask.title} ${statusTag}`);
128
+ if (subtask.dependencies && subtask.dependencies.length > 0) {
129
+ lines.push(`### Dependencies: ${subtask.dependencies.join(", ")}`);
130
+ }
131
+ else {
132
+ lines.push(`### Dependencies: None`);
133
+ }
134
+ if (subtask.description) {
135
+ lines.push(`### Description: ${subtask.description}`);
136
+ }
137
+ if (subtask.details) {
138
+ lines.push(`### Details:`);
139
+ lines.push(subtask.details);
140
+ }
141
+ lines.push("");
142
+ return lines.join("\n");
143
+ }
144
+ /**
145
+ * Save an individual task file
146
+ */
147
+ async function saveTaskFile(config, task) {
148
+ const filePath = getTaskFilePath(config, task.id);
149
+ await ensureDir(filePath);
150
+ const content = generateTaskFileContent(task);
151
+ await writeFile(filePath, content, "utf-8");
152
+ }
153
+ /**
154
+ * Generate markdown summary content from task store
155
+ */
156
+ function generateMarkdown(store) {
157
+ const lines = ["# Implementation Progress", ""];
158
+ // Status header
159
+ lines.push("## Status");
160
+ lines.push(`Last updated: ${store.updated_at}`);
161
+ lines.push("");
162
+ // Get top-level tasks only for summary
163
+ const topLevel = store.tasks.filter((t) => !t.parent_id);
164
+ // Count by status
165
+ const completed = topLevel.filter((t) => t.status === "completed" || t.status === "done");
166
+ const inProgress = topLevel.filter((t) => t.status === "in_progress" || t.status === "claimed");
167
+ const pending = topLevel.filter((t) => t.status === "pending");
168
+ const review = topLevel.filter((t) => t.status === "review" || t.status === "approved");
169
+ const blocked = topLevel.filter((t) => t.status === "rejected" || t.status === "cancelled");
170
+ const total = topLevel.length;
171
+ lines.push("## Task Completion Summary");
172
+ lines.push("");
173
+ // Completed
174
+ if (completed.length > 0) {
175
+ lines.push(`### Completed Tasks (${completed.length}/${total})`);
176
+ for (const task of completed) {
177
+ lines.push(`- ✅ Task ${task.id}: ${task.title}`);
178
+ }
179
+ lines.push("");
180
+ }
181
+ // In Progress
182
+ if (inProgress.length > 0) {
183
+ lines.push(`### In Progress Tasks (${inProgress.length}/${total})`);
184
+ for (const task of inProgress) {
185
+ const subtaskInfo = getSubtaskProgress(task);
186
+ lines.push(`- ⚠️ Task ${task.id}: ${task.title}${subtaskInfo}`);
187
+ }
188
+ lines.push("");
189
+ }
190
+ // In Review
191
+ if (review.length > 0) {
192
+ lines.push(`### In Review (${review.length}/${total})`);
193
+ for (const task of review) {
194
+ lines.push(`- 🔍 Task ${task.id}: ${task.title}`);
195
+ }
196
+ lines.push("");
197
+ }
198
+ // Pending
199
+ if (pending.length > 0) {
200
+ lines.push(`### Pending Tasks (${pending.length}/${total})`);
201
+ for (const task of pending) {
202
+ lines.push(`- ❌ Task ${task.id}: ${task.title}`);
203
+ }
204
+ lines.push("");
205
+ }
206
+ // Blocked/Cancelled
207
+ if (blocked.length > 0) {
208
+ lines.push(`### Blocked/Cancelled (${blocked.length}/${total})`);
209
+ for (const task of blocked) {
210
+ lines.push(`- 🚫 Task ${task.id}: ${task.title} (${task.status})`);
211
+ }
212
+ lines.push("");
213
+ }
214
+ // Recent updates section
215
+ lines.push("## Recent Updates");
216
+ lines.push("");
217
+ // Get last 5 updated tasks
218
+ const recentTasks = [...topLevel]
219
+ .sort((a, b) => new Date(b.updated_at).getTime() - new Date(a.updated_at).getTime())
220
+ .slice(0, 5);
221
+ for (const task of recentTasks) {
222
+ const date = task.updated_at.split("T")[0];
223
+ lines.push(`- ${date}: Task ${task.id} - ${task.title} (${task.status})`);
224
+ }
225
+ lines.push("");
226
+ lines.push("---");
227
+ lines.push("");
228
+ lines.push("*Task details are in `memory_bank/tasks/task_XXX.txt` files.*");
229
+ lines.push("*This summary is auto-generated from `memory_bank/tasks/tasks.json`.*");
230
+ return lines.join("\n");
231
+ }
232
+ /**
233
+ * Get subtask progress string for a task
234
+ */
235
+ function getSubtaskProgress(task) {
236
+ if (!task.subtasks || task.subtasks.length === 0) {
237
+ return "";
238
+ }
239
+ const completed = task.subtasks.filter((s) => s.status === "done" || s.status === "completed").length;
240
+ const total = task.subtasks.length;
241
+ return ` (${completed}/${total} subtasks)`;
242
+ }
243
+ /**
244
+ * Sync task store to markdown summary file
245
+ */
246
+ async function syncToMarkdown(config, store) {
247
+ const mdPath = resolvePath(config, config.markdownPath);
248
+ await ensureDir(mdPath);
249
+ const content = generateMarkdown(store);
250
+ await writeFile(mdPath, content, "utf-8");
251
+ }
252
+ /**
253
+ * Generate a unique task ID
254
+ */
255
+ export function generateId(store) {
256
+ const maxId = store.tasks.reduce((max, t) => {
257
+ const num = parseInt(t.id, 10);
258
+ return isNaN(num) ? max : Math.max(max, num);
259
+ }, 0);
260
+ return String(maxId + 1);
261
+ }
262
+ /**
263
+ * Find a task by ID
264
+ */
265
+ export function findTask(store, id) {
266
+ return store.tasks.find((t) => t.id === id);
267
+ }
268
+ /**
269
+ * Update a task in the store
270
+ */
271
+ export function updateTask(store, id, updates) {
272
+ const task = findTask(store, id);
273
+ if (!task)
274
+ return undefined;
275
+ Object.assign(task, updates, { updated_at: new Date().toISOString() });
276
+ return task;
277
+ }
278
+ /**
279
+ * Add a subtask to a task
280
+ */
281
+ export function addSubtaskToTask(task, subtask) {
282
+ if (!task.subtasks) {
283
+ task.subtasks = [];
284
+ }
285
+ const maxId = task.subtasks.reduce((max, s) => Math.max(max, s.id), 0);
286
+ const newSubtask = {
287
+ ...subtask,
288
+ id: maxId + 1,
289
+ };
290
+ task.subtasks.push(newSubtask);
291
+ return newSubtask;
292
+ }
293
+ //# sourceMappingURL=storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.js","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Template files for init_project tool
3
+ *
4
+ * All templates use <project> as a placeholder for the project name.
5
+ */
6
+ export interface TemplateFile {
7
+ path: string;
8
+ content: string;
9
+ }
10
+ /**
11
+ * Get all template files with placeholders replaced
12
+ */
13
+ export declare function getTemplateFiles(projectName: string): TemplateFile[];
14
+ /**
15
+ * Get the initial empty tasks.json content
16
+ */
17
+ export declare function getInitialTasksJson(): string;
18
+ //# sourceMappingURL=templates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../src/templates.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,YAAY,EAAE,CA2CpE;AAuYD;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAW5C"}