roadmap-skill 0.2.0 → 0.2.4
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/dist/index.js +500 -369
- package/dist/index.js.map +1 -1
- package/dist/web/app/assets/main-DE1dRfHs.js +9 -0
- package/dist/web/app/index.html +38 -0
- package/dist/web/server.js +526 -0
- package/dist/web/server.js.map +1 -0
- package/package.json +2 -2
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../node_modules/tsup/assets/esm_shims.js","../src/utils/file-helpers.ts","../src/index.ts","../src/server.ts","../src/tools/index.ts","../src/tools/project-tools.ts","../src/storage/index.ts","../src/utils/path-helpers.ts","../src/tools/task-tools.ts","../src/tools/tag-tools.ts","../src/tools/web-tools.ts","../src/web/server.ts","../src/tools/template-tools.ts","../src/resources/index.ts","../src/resources/project-resources.ts","../src/prompts/index.ts","../src/prompts/project-prompts.ts"],"sourcesContent":["// Shim globals in esm bundle\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nconst getFilename = () => fileURLToPath(import.meta.url)\nconst getDirname = () => path.dirname(getFilename())\n\nexport const __dirname = /* @__PURE__ */ getDirname()\nexport const __filename = /* @__PURE__ */ getFilename()\n","import * as fs from 'fs/promises';\n\n/**\n * Read and parse a JSON file\n * @param filePath - Path to the JSON file\n * @returns Parsed JSON data\n * @throws Error if file cannot be read or parsed\n */\nexport async function readJsonFile<T>(filePath: string): Promise<T> {\n try {\n const content = await fs.readFile(filePath, 'utf-8');\n return JSON.parse(content) as T;\n } catch (error) {\n if (error instanceof Error) {\n throw new Error(`Failed to read JSON file ${filePath}: ${error.message}`);\n }\n throw error;\n }\n}\n\n/**\n * Write data to a JSON file\n * @param filePath - Path to the JSON file\n * @param data - Data to serialize and write\n * @throws Error if file cannot be written\n */\nexport async function writeJsonFile<T>(filePath: string, data: T): Promise<void> {\n try {\n const content = JSON.stringify(data, null, 2);\n await fs.writeFile(filePath, content, 'utf-8');\n } catch (error) {\n if (error instanceof Error) {\n throw new Error(`Failed to write JSON file ${filePath}: ${error.message}`);\n }\n throw error;\n }\n}\n\n/**\n * Ensure a directory exists, creating it recursively if needed\n * @param dirPath - Path to the directory\n * @throws Error if directory cannot be created\n */\nexport async function ensureDir(dirPath: string): Promise<void> {\n try {\n await fs.mkdir(dirPath, { recursive: true });\n } catch (error) {\n if (error instanceof Error) {\n throw new Error(`Failed to create directory ${dirPath}: ${error.message}`);\n }\n throw error;\n }\n}\n","import { startServer } from './server.js';\n\nasync function main() {\n process.on('SIGINT', () => {\n console.error('Received SIGINT, shutting down gracefully...');\n process.exit(0);\n });\n\n process.on('SIGTERM', () => {\n console.error('Received SIGTERM, shutting down gracefully...');\n process.exit(0);\n });\n\n process.on('uncaughtException', (error) => {\n console.error('Uncaught exception:', error);\n process.exit(1);\n });\n\n process.on('unhandledRejection', (reason) => {\n console.error('Unhandled rejection:', reason);\n process.exit(1);\n });\n\n try {\n await startServer();\n } catch (error) {\n console.error('Failed to start server:', error);\n process.exit(1);\n }\n}\n\nmain();\n","import { Server } from \"@modelcontextprotocol/sdk/server/index.js\";\nimport {\n\tCallToolRequestSchema,\n\tListToolsRequestSchema,\n\tListResourcesRequestSchema,\n\tReadResourceRequestSchema,\n\tListPromptsRequestSchema,\n\tGetPromptRequestSchema,\n\ttype CallToolRequest,\n\ttype ListToolsRequest,\n\ttype ListResourcesRequest,\n\ttype ReadResourceRequest,\n\ttype ListPromptsRequest,\n\ttype GetPromptRequest,\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { zodToJsonSchema } from \"zod-to-json-schema\";\n\nimport {\n\tcreateProjectTool,\n\tlistProjectsTool,\n\tgetProjectTool,\n\tupdateProjectTool,\n\tdeleteProjectTool,\n\tcreateTaskTool,\n\tlistTasksTool,\n\tgetTaskTool,\n\tupdateTaskTool,\n\tdeleteTaskTool,\n\tbatchUpdateTasksTool,\n\tcreateTagTool,\n\tlistTagsTool,\n\tupdateTagTool,\n\tdeleteTagTool,\n\tgetTasksByTagTool,\n\topenWebInterfaceTool,\n\tcloseWebInterfaceTool,\n} from \"./tools/index.js\";\nimport { getAllResources, handleResourceRequest } from \"./resources/index.js\";\nimport { getAllPrompts, getPromptByName } from \"./prompts/index.js\";\n\nconst allTools = [\n\tcreateProjectTool,\n\tlistProjectsTool,\n\tgetProjectTool,\n\tupdateProjectTool,\n\tdeleteProjectTool,\n\tcreateTaskTool,\n\tlistTasksTool,\n\tgetTaskTool,\n\tupdateTaskTool,\n\tdeleteTaskTool,\n\tbatchUpdateTasksTool,\n\tcreateTagTool,\n\tlistTagsTool,\n\tupdateTagTool,\n\tdeleteTagTool,\n\tgetTasksByTagTool,\n\topenWebInterfaceTool,\n\tcloseWebInterfaceTool,\n];\n\nconst toolMap = new Map(allTools.map((tool) => [tool.name, tool]));\n\nexport function createServer(): Server {\n\tconst server = new Server(\n\t\t{\n\t\t\tname: \"roadmap-skill\",\n\t\t\tversion: \"0.2.0\",\n\t\t},\n\t\t{\n\t\t\tcapabilities: {\n\t\t\t\ttools: {},\n\t\t\t\tresources: {},\n\t\t\t\tprompts: {},\n\t\t\t},\n\t\t},\n\t);\n\n\tserver.setRequestHandler(\n\t\tListToolsRequestSchema,\n\t\tasync (_request: ListToolsRequest) => {\n\t\t\treturn {\n\t\t\t\ttools: allTools.map((tool) => {\n\t\t\t\t\tconst rawSchema =\n\t\t\t\t\t\t(tool as any).parameters || (tool as any).inputSchema;\n\t\t\t\t\tlet inputSchema: Record<string, unknown>;\n\n\t\t\t\t\tif (!rawSchema) {\n\t\t\t\t\t\tinputSchema = { type: \"object\" };\n\t\t\t\t\t} else if (rawSchema.type === \"object\") {\n\t\t\t\t\t\tinputSchema = rawSchema;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tinputSchema = zodToJsonSchema(rawSchema, {\n\t\t\t\t\t\t\tname: tool.name,\n\t\t\t\t\t\t\t$refStrategy: \"none\",\n\t\t\t\t\t\t}).definitions?.[tool.name] || { type: \"object\" };\n\t\t\t\t\t}\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tname: tool.name,\n\t\t\t\t\t\tdescription: tool.description,\n\t\t\t\t\t\tinputSchema,\n\t\t\t\t\t};\n\t\t\t\t}),\n\t\t\t};\n\t\t},\n\t);\n\n\tserver.setRequestHandler(\n\t\tCallToolRequestSchema,\n\t\tasync (request: CallToolRequest) => {\n\t\t\tconst { name, arguments: args } = request.params;\n\t\t\tconst tool = toolMap.get(name);\n\n\t\t\tif (!tool) {\n\t\t\t\tthrow new Error(`Unknown tool: ${name}`);\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst result = await tool.execute(args as never);\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\ttext: JSON.stringify(result, null, 2),\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t};\n\t\t\t} catch (error) {\n\t\t\t\tconst errorMessage =\n\t\t\t\t\terror instanceof Error ? error.message : String(error);\n\t\t\t\tthrow new Error(`Tool execution failed: ${errorMessage}`);\n\t\t\t}\n\t\t},\n\t);\n\n\tserver.setRequestHandler(\n\t\tListResourcesRequestSchema,\n\t\tasync (_request: ListResourcesRequest) => {\n\t\t\tconst resources = getAllResources();\n\t\t\treturn { resources };\n\t\t},\n\t);\n\n\tserver.setRequestHandler(\n\t\tReadResourceRequestSchema,\n\t\tasync (request: ReadResourceRequest) => {\n\t\t\tconst uri = request.params.uri;\n\t\t\tconst resourceContent = await handleResourceRequest(uri);\n\n\t\t\tif (!resourceContent) {\n\t\t\t\tthrow new Error(`Resource not found: ${uri}`);\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tcontents: [resourceContent],\n\t\t\t};\n\t\t},\n\t);\n\n\tserver.setRequestHandler(\n\t\tListPromptsRequestSchema,\n\t\tasync (_request: ListPromptsRequest) => {\n\t\t\tconst prompts = getAllPrompts();\n\t\t\treturn { prompts };\n\t\t},\n\t);\n\n\tserver.setRequestHandler(\n\t\tGetPromptRequestSchema,\n\t\tasync (request: GetPromptRequest) => {\n\t\t\tconst { name, arguments: args } = request.params;\n\t\t\tconst promptResult = getPromptByName(\n\t\t\t\tname,\n\t\t\t\targs as Record<string, string> | undefined,\n\t\t\t);\n\n\t\t\tif (!promptResult) {\n\t\t\t\tthrow new Error(`Prompt not found: ${name}`);\n\t\t\t}\n\n\t\t\treturn promptResult;\n\t\t},\n\t);\n\n\treturn server;\n}\n\nexport async function startServer(): Promise<void> {\n\tconst server = createServer();\n\tconst transport = new StdioServerTransport();\n\n\tconsole.error(\"Roadmap Skill MCP Server starting...\");\n\n\ttry {\n\t\tawait server.connect(transport);\n\t\tconsole.error(\"Roadmap Skill MCP Server connected and ready\");\n\t} catch (error) {\n\t\tconsole.error(\"Failed to start server:\", error);\n\t\tthrow error;\n\t}\n}\n","export {\n createProjectTool,\n listProjectsTool,\n getProjectTool,\n updateProjectTool,\n deleteProjectTool,\n} from './project-tools.js';\n\nexport {\n createTaskTool,\n listTasksTool,\n getTaskTool,\n updateTaskTool,\n deleteTaskTool,\n batchUpdateTasksTool,\n} from './task-tools.js';\n\nexport {\n createTagTool,\n listTagsTool,\n updateTagTool,\n deleteTagTool,\n getTasksByTagTool,\n} from './tag-tools.js';\n\nexport {\n openWebInterfaceTool,\n closeWebInterfaceTool,\n} from './web-tools.js';\n\nexport {\n listTemplatesTool,\n getTemplateTool,\n applyTemplateTool,\n} from './template-tools.js';\n","import { z } from 'zod';\nimport { storage } from '../storage/index.js';\nimport type { CreateProjectInput, UpdateProjectInput } from '../models/index.js';\n\nconst ProjectTypeEnum = z.enum(['roadmap', 'skill-tree', 'kanban']);\nconst ProjectStatusEnum = z.enum(['active', 'completed', 'archived']);\n\nexport const createProjectTool = {\n name: 'create_project',\n description: 'Create a new project roadmap',\n inputSchema: z.object({\n name: z.string().min(1, 'Project name is required'),\n description: z.string(),\n projectType: ProjectTypeEnum,\n startDate: z.string().regex(/^\\d{4}-\\d{2}-\\d{2}$/, 'Date must be in YYYY-MM-DD format'),\n targetDate: z.string().regex(/^\\d{4}-\\d{2}-\\d{2}$/, 'Date must be in YYYY-MM-DD format'),\n }),\n async execute(input: {\n name: string;\n description: string;\n projectType: 'roadmap' | 'skill-tree' | 'kanban';\n startDate: string;\n targetDate: string;\n }) {\n try {\n const projectInput: CreateProjectInput = {\n name: input.name,\n description: input.description,\n projectType: input.projectType,\n startDate: input.startDate,\n targetDate: input.targetDate,\n };\n\n const projectData = await storage.createProject(projectInput);\n return {\n success: true,\n data: projectData,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to create project',\n };\n }\n },\n};\n\nexport const listProjectsTool = {\n name: 'list_projects',\n description: 'List all projects with their task and milestone counts',\n inputSchema: z.object({}),\n async execute() {\n try {\n const projects = await storage.listProjects();\n return {\n success: true,\n data: projects,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to list projects',\n };\n }\n },\n};\n\nexport const getProjectTool = {\n name: 'get_project',\n description: 'Get a project by ID with all its data (tasks, tags, milestones)',\n inputSchema: z.object({\n projectId: z.string().min(1, 'Project ID is required'),\n }),\n async execute(input: { projectId: string }) {\n try {\n const projectData = await storage.readProject(input.projectId);\n if (!projectData) {\n return {\n success: false,\n error: `Project with ID '${input.projectId}' not found`,\n };\n }\n return {\n success: true,\n data: projectData,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to get project',\n };\n }\n },\n};\n\nexport const updateProjectTool = {\n name: 'update_project',\n description: 'Update an existing project',\n inputSchema: z.object({\n projectId: z.string().min(1, 'Project ID is required'),\n name: z.string().min(1).optional(),\n description: z.string().optional(),\n projectType: ProjectTypeEnum.optional(),\n status: ProjectStatusEnum.optional(),\n startDate: z.string().regex(/^\\d{4}-\\d{2}-\\d{2}$/).optional(),\n targetDate: z.string().regex(/^\\d{4}-\\d{2}-\\d{2}$/).optional(),\n }),\n async execute(input: {\n projectId: string;\n name?: string;\n description?: string;\n projectType?: 'roadmap' | 'skill-tree' | 'kanban';\n status?: 'active' | 'completed' | 'archived';\n startDate?: string;\n targetDate?: string;\n }) {\n try {\n const { projectId, ...updateData } = input;\n\n if (Object.keys(updateData).length === 0) {\n return {\n success: false,\n error: 'At least one field to update is required',\n };\n }\n\n const updateInput: UpdateProjectInput = updateData;\n const projectData = await storage.updateProject(projectId, updateInput);\n\n if (!projectData) {\n return {\n success: false,\n error: `Project with ID '${projectId}' not found`,\n };\n }\n\n return {\n success: true,\n data: projectData,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to update project',\n };\n }\n },\n};\n\nexport const deleteProjectTool = {\n name: 'delete_project',\n description: 'Delete a project by ID',\n inputSchema: z.object({\n projectId: z.string().min(1, 'Project ID is required'),\n }),\n async execute(input: { projectId: string }) {\n try {\n const deleted = await storage.deleteProject(input.projectId);\n\n if (!deleted) {\n return {\n success: false,\n error: `Project with ID '${input.projectId}' not found`,\n };\n }\n\n return {\n success: true,\n data: { deleted: true },\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to delete project',\n };\n }\n },\n};\n","import * as path from 'path';\nimport type {\n Project,\n ProjectData,\n Task,\n TaskSearchFilters,\n CreateProjectInput,\n UpdateProjectInput,\n} from '../models/index.js';\nimport { getStorageDir } from '../utils/path-helpers.js';\nimport { readJsonFile, writeJsonFile, ensureDir } from '../utils/file-helpers.js';\n\n/**\n * Storage class for managing roadmap-skill projects\n * Projects are stored as individual JSON files in ~/.roadmap-skill/projects/\n */\nexport class ProjectStorage {\n private storageDir: string;\n\n constructor() {\n this.storageDir = getStorageDir();\n }\n\n /**\n * Ensure the storage directory exists\n */\n async ensureDirectory(): Promise<void> {\n await ensureDir(this.storageDir);\n }\n\n /**\n * Get the file path for a project\n * @param projectId - The project ID\n * @returns Full path to the project JSON file\n */\n getFilePath(projectId: string): string {\n return path.join(this.storageDir, `${projectId}.json`);\n }\n\n /**\n * Create a new project\n * @param input - Project creation data\n * @returns The created project data\n */\n async createProject(input: CreateProjectInput): Promise<ProjectData> {\n await this.ensureDirectory();\n\n const now = new Date().toISOString();\n const projectId = `proj_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;\n\n const project: Project = {\n id: projectId,\n name: input.name,\n description: input.description,\n projectType: input.projectType,\n status: 'active',\n startDate: input.startDate,\n targetDate: input.targetDate,\n createdAt: now,\n updatedAt: now,\n };\n\n const projectData: ProjectData = {\n version: 1,\n project,\n milestones: [],\n tasks: [],\n tags: [],\n };\n\n const filePath = this.getFilePath(projectId);\n await writeJsonFile(filePath, projectData);\n\n return projectData;\n }\n\n /**\n * Read a project by ID\n * @param projectId - The project ID\n * @returns The project data or null if not found\n */\n async readProject(projectId: string): Promise<ProjectData | null> {\n try {\n const filePath = this.getFilePath(projectId);\n return await readJsonFile<ProjectData>(filePath);\n } catch (error) {\n if (error instanceof Error && error.message.includes('ENOENT')) {\n return null;\n }\n throw error;\n }\n }\n\n /**\n * Update an existing project\n * @param projectId - The project ID\n * @param input - Project update data\n * @returns The updated project data or null if not found\n */\n async updateProject(\n projectId: string,\n input: UpdateProjectInput\n ): Promise<ProjectData | null> {\n const projectData = await this.readProject(projectId);\n if (!projectData) {\n return null;\n }\n\n const now = new Date().toISOString();\n\n projectData.project = {\n ...projectData.project,\n ...input,\n updatedAt: now,\n };\n\n const filePath = this.getFilePath(projectId);\n await writeJsonFile(filePath, projectData);\n\n return projectData;\n }\n\n /**\n * Delete a project by ID\n * @param projectId - The project ID\n * @returns True if deleted, false if not found\n */\n async deleteProject(projectId: string): Promise<boolean> {\n try {\n const filePath = this.getFilePath(projectId);\n const fs = await import('fs/promises');\n await fs.unlink(filePath);\n return true;\n } catch (error) {\n if (error instanceof Error && error.message.includes('ENOENT')) {\n return false;\n }\n throw error;\n }\n }\n\n /**\n * List all projects sorted by updatedAt (descending)\n * @returns Array of project summaries (project + metadata)\n */\n async listProjects(): Promise<Array<{ project: Project; taskCount: number; milestoneCount: number }>> {\n await this.ensureDirectory();\n\n const fs = await import('fs/promises');\n const files = await fs.readdir(this.storageDir);\n const jsonFiles = files.filter((f) => f.endsWith('.json'));\n\n const projects: Array<{ project: Project; taskCount: number; milestoneCount: number }> = [];\n\n for (const file of jsonFiles) {\n try {\n const filePath = path.join(this.storageDir, file);\n const data = await readJsonFile<ProjectData>(filePath);\n projects.push({\n project: data.project,\n taskCount: data.tasks.length,\n milestoneCount: data.milestones.length,\n });\n } catch {\n // Skip invalid files\n continue;\n }\n }\n\n // Sort by updatedAt descending\n return projects.sort(\n (a, b) => new Date(b.project.updatedAt).getTime() - new Date(a.project.updatedAt).getTime()\n );\n }\n\n /**\n * Search tasks across all projects with filters\n * @param filters - Search filters\n * @returns Array of matching tasks with project context\n */\n async searchTasks(\n filters: TaskSearchFilters\n ): Promise<Array<{ task: Task; project: Project }>> {\n await this.ensureDirectory();\n\n const fs = await import('fs/promises');\n const files = await fs.readdir(this.storageDir);\n const jsonFiles = files.filter((f) => f.endsWith('.json'));\n\n const results: Array<{ task: Task; project: Project }> = [];\n\n for (const file of jsonFiles) {\n try {\n const filePath = path.join(this.storageDir, file);\n const data = await readJsonFile<ProjectData>(filePath);\n\n // Skip if project filter doesn't match\n if (filters.projectId && data.project.id !== filters.projectId) {\n continue;\n }\n\n for (const task of data.tasks) {\n // Apply filters\n if (filters.status && task.status !== filters.status) {\n continue;\n }\n if (filters.priority && task.priority !== filters.priority) {\n continue;\n }\n if (filters.assignee && task.assignee !== filters.assignee) {\n continue;\n }\n if (filters.dueBefore && task.dueDate && task.dueDate > filters.dueBefore) {\n continue;\n }\n if (filters.dueAfter && task.dueDate && task.dueDate < filters.dueAfter) {\n continue;\n }\n if (\n filters.tags &&\n filters.tags.length > 0 &&\n !filters.tags.some((tag) => task.tags.includes(tag))\n ) {\n continue;\n }\n if (\n filters.searchText &&\n !task.title.toLowerCase().includes(filters.searchText.toLowerCase()) &&\n !task.description.toLowerCase().includes(filters.searchText.toLowerCase())\n ) {\n continue;\n }\n\n results.push({ task, project: data.project });\n }\n } catch {\n // Skip invalid files\n continue;\n }\n }\n\n return results;\n }\n}\n\n// Export singleton instance\nexport const storage = new ProjectStorage();\n","import * as os from 'os';\nimport * as path from 'path';\n\n/**\n * Get the storage directory for roadmap-skill projects\n * Returns: ~/.roadmap-skill/projects\n */\nexport function getStorageDir(): string {\n const homeDir = os.homedir();\n return path.join(homeDir, '.roadmap-skill', 'projects');\n}\n","import { z } from 'zod';\nimport { storage } from '../storage/index.js';\nimport type { Task } from '../models/index.js';\n\nconst TaskStatusEnum = z.enum(['todo', 'in-progress', 'review', 'done']);\nconst TaskPriorityEnum = z.enum(['low', 'medium', 'high', 'critical']);\n\nfunction generateTaskId(): string {\n return `task_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;\n}\n\nexport const createTaskTool = {\n name: 'create_task',\n description: 'Create a new task in a project',\n inputSchema: z.object({\n projectId: z.string().min(1, 'Project ID is required'),\n title: z.string().min(1, 'Task title is required'),\n description: z.string(),\n priority: TaskPriorityEnum.default('medium'),\n tags: z.array(z.string()).default([]),\n dueDate: z.string().regex(/^\\d{4}-\\d{2}-\\d{2}$/).optional(),\n assignee: z.string().optional(),\n }),\n async execute(input: {\n projectId: string;\n title: string;\n description: string;\n priority: 'low' | 'medium' | 'high' | 'critical';\n tags: string[];\n dueDate?: string;\n assignee?: string;\n }) {\n try {\n const projectData = await storage.readProject(input.projectId);\n if (!projectData) {\n return {\n success: false,\n error: `Project with ID '${input.projectId}' not found`,\n };\n }\n\n const now = new Date().toISOString();\n const task: Task = {\n id: generateTaskId(),\n projectId: input.projectId,\n title: input.title,\n description: input.description,\n status: 'todo',\n priority: input.priority,\n tags: input.tags,\n dueDate: input.dueDate ?? null,\n assignee: input.assignee ?? null,\n createdAt: now,\n updatedAt: now,\n completedAt: null,\n };\n\n projectData.tasks.push(task);\n projectData.project.updatedAt = now;\n\n const filePath = storage.getFilePath(input.projectId);\n const { writeJsonFile } = await import('../utils/file-helpers.js');\n await writeJsonFile(filePath, projectData);\n\n return {\n success: true,\n data: task,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to create task',\n };\n }\n },\n};\n\nexport const listTasksTool = {\n name: 'list_tasks',\n description: 'List tasks with optional filters',\n inputSchema: z.object({\n projectId: z.string().optional(),\n status: TaskStatusEnum.optional(),\n priority: TaskPriorityEnum.optional(),\n tags: z.array(z.string()).optional(),\n assignee: z.string().optional(),\n dueBefore: z.string().regex(/^\\d{4}-\\d{2}-\\d{2}$/).optional(),\n dueAfter: z.string().regex(/^\\d{4}-\\d{2}-\\d{2}$/).optional(),\n }),\n async execute(input: {\n projectId?: string;\n status?: 'todo' | 'in-progress' | 'review' | 'done';\n priority?: 'low' | 'medium' | 'high' | 'critical';\n tags?: string[];\n assignee?: string;\n dueBefore?: string;\n dueAfter?: string;\n }) {\n try {\n const results = await storage.searchTasks({\n projectId: input.projectId,\n status: input.status,\n priority: input.priority,\n tags: input.tags,\n assignee: input.assignee,\n dueBefore: input.dueBefore,\n dueAfter: input.dueAfter,\n });\n\n return {\n success: true,\n data: results,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to list tasks',\n };\n }\n },\n};\n\nexport const getTaskTool = {\n name: 'get_task',\n description: 'Get a specific task by project ID and task ID',\n inputSchema: z.object({\n projectId: z.string().min(1, 'Project ID is required'),\n taskId: z.string().min(1, 'Task ID is required'),\n }),\n async execute(input: { projectId: string; taskId: string }) {\n try {\n const projectData = await storage.readProject(input.projectId);\n if (!projectData) {\n return {\n success: false,\n error: `Project with ID '${input.projectId}' not found`,\n };\n }\n\n const task = projectData.tasks.find((t) => t.id === input.taskId);\n if (!task) {\n return {\n success: false,\n error: `Task with ID '${input.taskId}' not found in project '${input.projectId}'`,\n };\n }\n\n return {\n success: true,\n data: task,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to get task',\n };\n }\n },\n};\n\nexport const updateTaskTool = {\n name: 'update_task',\n description: 'Update an existing task',\n inputSchema: z.object({\n projectId: z.string().min(1, 'Project ID is required'),\n taskId: z.string().min(1, 'Task ID is required'),\n title: z.string().min(1).optional(),\n description: z.string().optional(),\n status: TaskStatusEnum.optional(),\n priority: TaskPriorityEnum.optional(),\n tags: z.array(z.string()).optional(),\n dueDate: z.string().regex(/^\\d{4}-\\d{2}-\\d{2}$/).optional().nullable(),\n assignee: z.string().optional().nullable(),\n }),\n async execute(input: {\n projectId: string;\n taskId: string;\n title?: string;\n description?: string;\n status?: 'todo' | 'in-progress' | 'review' | 'done';\n priority?: 'low' | 'medium' | 'high' | 'critical';\n tags?: string[];\n dueDate?: string | null;\n assignee?: string | null;\n }) {\n try {\n const projectData = await storage.readProject(input.projectId);\n if (!projectData) {\n return {\n success: false,\n error: `Project with ID '${input.projectId}' not found`,\n };\n }\n\n const taskIndex = projectData.tasks.findIndex((t) => t.id === input.taskId);\n if (taskIndex === -1) {\n return {\n success: false,\n error: `Task with ID '${input.taskId}' not found in project '${input.projectId}'`,\n };\n }\n\n const { projectId, taskId, ...updateData } = input;\n\n if (Object.keys(updateData).length === 0) {\n return {\n success: false,\n error: 'At least one field to update is required',\n };\n }\n\n const now = new Date().toISOString();\n const existingTask = projectData.tasks[taskIndex];\n\n const updatedTask: Task = {\n ...existingTask,\n ...updateData,\n id: existingTask.id,\n projectId: existingTask.projectId,\n createdAt: existingTask.createdAt,\n updatedAt: now,\n completedAt: updateData.status === 'done' && existingTask.status !== 'done'\n ? now\n : updateData.status && updateData.status !== 'done'\n ? null\n : existingTask.completedAt,\n };\n\n projectData.tasks[taskIndex] = updatedTask;\n projectData.project.updatedAt = now;\n\n const filePath = storage.getFilePath(input.projectId);\n const { writeJsonFile } = await import('../utils/file-helpers.js');\n await writeJsonFile(filePath, projectData);\n\n return {\n success: true,\n data: updatedTask,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to update task',\n };\n }\n },\n};\n\nexport const deleteTaskTool = {\n name: 'delete_task',\n description: 'Delete a task by project ID and task ID',\n inputSchema: z.object({\n projectId: z.string().min(1, 'Project ID is required'),\n taskId: z.string().min(1, 'Task ID is required'),\n }),\n async execute(input: { projectId: string; taskId: string }) {\n try {\n const projectData = await storage.readProject(input.projectId);\n if (!projectData) {\n return {\n success: false,\n error: `Project with ID '${input.projectId}' not found`,\n };\n }\n\n const taskIndex = projectData.tasks.findIndex((t) => t.id === input.taskId);\n if (taskIndex === -1) {\n return {\n success: false,\n error: `Task with ID '${input.taskId}' not found in project '${input.projectId}'`,\n };\n }\n\n const now = new Date().toISOString();\n projectData.tasks.splice(taskIndex, 1);\n projectData.project.updatedAt = now;\n\n const filePath = storage.getFilePath(input.projectId);\n const { writeJsonFile } = await import('../utils/file-helpers.js');\n await writeJsonFile(filePath, projectData);\n\n return {\n success: true,\n data: { deleted: true },\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to delete task',\n };\n }\n },\n};\n\nexport const batchUpdateTasksTool = {\n name: 'batch_update_tasks',\n description: 'Update multiple tasks at once',\n inputSchema: z.object({\n projectId: z.string().min(1, 'Project ID is required'),\n taskIds: z.array(z.string()).min(1, 'At least one task ID is required'),\n status: TaskStatusEnum.optional(),\n priority: TaskPriorityEnum.optional(),\n tags: z.array(z.string()).optional(),\n tagOperation: z.enum(['add', 'remove', 'replace']).default('replace'),\n }),\n async execute(input: {\n projectId: string;\n taskIds: string[];\n status?: 'todo' | 'in-progress' | 'review' | 'done';\n priority?: 'low' | 'medium' | 'high' | 'critical';\n tags?: string[];\n tagOperation?: 'add' | 'remove' | 'replace';\n }) {\n try {\n const projectData = await storage.readProject(input.projectId);\n if (!projectData) {\n return {\n success: false,\n error: `Project with ID '${input.projectId}' not found`,\n };\n }\n\n const now = new Date().toISOString();\n const updatedTasks: Task[] = [];\n const notFoundIds: string[] = [];\n\n for (const taskId of input.taskIds) {\n const taskIndex = projectData.tasks.findIndex((t) => t.id === taskId);\n if (taskIndex === -1) {\n notFoundIds.push(taskId);\n continue;\n }\n\n const existingTask = projectData.tasks[taskIndex];\n let updatedTags = existingTask.tags;\n\n if (input.tags && input.tags.length > 0) {\n const existingTags = existingTask.tags || [];\n switch (input.tagOperation) {\n case 'add':\n updatedTags = [...new Set([...existingTags, ...input.tags])];\n break;\n case 'remove':\n updatedTags = existingTags.filter((tag) => !input.tags!.includes(tag));\n break;\n case 'replace':\n default:\n updatedTags = input.tags;\n break;\n }\n }\n\n const updatedTask: Task = {\n ...existingTask,\n ...(input.status && { status: input.status }),\n ...(input.priority && { priority: input.priority }),\n tags: updatedTags,\n updatedAt: now,\n ...(input.status === 'done' && existingTask.status !== 'done' && { completedAt: now }),\n ...(input.status && input.status !== 'done' && { completedAt: null }),\n };\n\n projectData.tasks[taskIndex] = updatedTask;\n updatedTasks.push(updatedTask);\n }\n\n if (updatedTasks.length === 0) {\n return {\n success: false,\n error: 'No tasks were found to update',\n notFoundIds,\n };\n }\n\n projectData.project.updatedAt = now;\n\n const filePath = storage.getFilePath(input.projectId);\n const { writeJsonFile } = await import('../utils/file-helpers.js');\n await writeJsonFile(filePath, projectData);\n\n return {\n success: true,\n data: {\n updatedTasks,\n updatedCount: updatedTasks.length,\n notFoundIds: notFoundIds.length > 0 ? notFoundIds : undefined,\n },\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to batch update tasks',\n };\n }\n },\n};\n","import { z } from 'zod';\nimport { storage } from '../storage/index.js';\nimport type { Tag } from '../models/index.js';\n\nfunction generateTagId(): string {\n return `tag_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;\n}\n\nexport const createTagTool = {\n name: 'create_tag',\n description: 'Create a new tag in a project',\n inputSchema: z.object({\n projectId: z.string().min(1, 'Project ID is required'),\n name: z.string().min(1, 'Tag name is required'),\n color: z.string().regex(/^#[0-9A-Fa-f]{6}$/, 'Color must be a valid hex code (e.g., #FF5733)'),\n description: z.string().default(''),\n }),\n async execute(input: {\n projectId: string;\n name: string;\n color: string;\n description: string;\n }) {\n try {\n const projectData = await storage.readProject(input.projectId);\n if (!projectData) {\n return {\n success: false,\n error: `Project with ID '${input.projectId}' not found`,\n };\n }\n\n // Check for duplicate tag name\n const existingTag = projectData.tags.find(\n (t) => t.name.toLowerCase() === input.name.toLowerCase()\n );\n if (existingTag) {\n return {\n success: false,\n error: `Tag with name '${input.name}' already exists in this project`,\n };\n }\n\n const now = new Date().toISOString();\n const tag: Tag = {\n id: generateTagId(),\n name: input.name,\n color: input.color,\n description: input.description,\n createdAt: now,\n };\n\n projectData.tags.push(tag);\n projectData.project.updatedAt = now;\n\n const filePath = storage.getFilePath(input.projectId);\n const { writeJsonFile } = await import('../utils/file-helpers.js');\n await writeJsonFile(filePath, projectData);\n\n return {\n success: true,\n data: tag,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to create tag',\n };\n }\n },\n};\n\nexport const listTagsTool = {\n name: 'list_tags',\n description: 'List all tags in a project',\n inputSchema: z.object({\n projectId: z.string().min(1, 'Project ID is required'),\n }),\n async execute(input: { projectId: string }) {\n try {\n const projectData = await storage.readProject(input.projectId);\n if (!projectData) {\n return {\n success: false,\n error: `Project with ID '${input.projectId}' not found`,\n };\n }\n\n return {\n success: true,\n data: projectData.tags,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to list tags',\n };\n }\n },\n};\n\nexport const updateTagTool = {\n name: 'update_tag',\n description: 'Update an existing tag',\n inputSchema: z.object({\n projectId: z.string().min(1, 'Project ID is required'),\n tagId: z.string().min(1, 'Tag ID is required'),\n name: z.string().min(1).optional(),\n color: z.string().regex(/^#[0-9A-Fa-f]{6}$/).optional(),\n description: z.string().optional(),\n }),\n async execute(input: {\n projectId: string;\n tagId: string;\n name?: string;\n color?: string;\n description?: string;\n }) {\n try {\n const projectData = await storage.readProject(input.projectId);\n if (!projectData) {\n return {\n success: false,\n error: `Project with ID '${input.projectId}' not found`,\n };\n }\n\n const tagIndex = projectData.tags.findIndex((t) => t.id === input.tagId);\n if (tagIndex === -1) {\n return {\n success: false,\n error: `Tag with ID '${input.tagId}' not found in project '${input.projectId}'`,\n };\n }\n\n const { projectId, tagId, ...updateData } = input;\n\n if (Object.keys(updateData).length === 0) {\n return {\n success: false,\n error: 'At least one field to update is required',\n };\n }\n\n // Check for duplicate name if updating name\n if (updateData.name) {\n const existingTag = projectData.tags.find(\n (t) => t.name.toLowerCase() === updateData.name!.toLowerCase() && t.id !== input.tagId\n );\n if (existingTag) {\n return {\n success: false,\n error: `Tag with name '${updateData.name}' already exists in this project`,\n };\n }\n }\n\n const now = new Date().toISOString();\n const existingTag = projectData.tags[tagIndex];\n\n const updatedTag: Tag = {\n ...existingTag,\n ...updateData,\n id: existingTag.id,\n createdAt: existingTag.createdAt,\n };\n\n projectData.tags[tagIndex] = updatedTag;\n projectData.project.updatedAt = now;\n\n const filePath = storage.getFilePath(input.projectId);\n const { writeJsonFile } = await import('../utils/file-helpers.js');\n await writeJsonFile(filePath, projectData);\n\n return {\n success: true,\n data: updatedTag,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to update tag',\n };\n }\n },\n};\n\nexport const deleteTagTool = {\n name: 'delete_tag',\n description: 'Delete a tag by project ID and tag ID',\n inputSchema: z.object({\n projectId: z.string().min(1, 'Project ID is required'),\n tagId: z.string().min(1, 'Tag ID is required'),\n }),\n async execute(input: { projectId: string; tagId: string }) {\n try {\n const projectData = await storage.readProject(input.projectId);\n if (!projectData) {\n return {\n success: false,\n error: `Project with ID '${input.projectId}' not found`,\n };\n }\n\n const tagIndex = projectData.tags.findIndex((t) => t.id === input.tagId);\n if (tagIndex === -1) {\n return {\n success: false,\n error: `Tag with ID '${input.tagId}' not found in project '${input.projectId}'`,\n };\n }\n\n const tag = projectData.tags[tagIndex];\n\n // Remove tag from all tasks that use it\n const now = new Date().toISOString();\n let tasksUpdated = 0;\n for (const task of projectData.tasks) {\n const tagIndexInTask = task.tags.indexOf(input.tagId);\n if (tagIndexInTask !== -1) {\n task.tags.splice(tagIndexInTask, 1);\n task.updatedAt = now;\n tasksUpdated++;\n }\n }\n\n projectData.tags.splice(tagIndex, 1);\n projectData.project.updatedAt = now;\n\n const filePath = storage.getFilePath(input.projectId);\n const { writeJsonFile } = await import('../utils/file-helpers.js');\n await writeJsonFile(filePath, projectData);\n\n return {\n success: true,\n data: {\n deleted: true,\n tag,\n tasksUpdated,\n },\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to delete tag',\n };\n }\n },\n};\n\nexport const getTasksByTagTool = {\n name: 'get_tasks_by_tag',\n description: 'Get all tasks that have a specific tag',\n inputSchema: z.object({\n projectId: z.string().min(1, 'Project ID is required'),\n tagName: z.string().min(1, 'Tag name is required'),\n }),\n async execute(input: { projectId: string; tagName: string }) {\n try {\n const projectData = await storage.readProject(input.projectId);\n if (!projectData) {\n return {\n success: false,\n error: `Project with ID '${input.projectId}' not found`,\n };\n }\n\n // Find tag by name\n const tag = projectData.tags.find(\n (t) => t.name.toLowerCase() === input.tagName.toLowerCase()\n );\n\n if (!tag) {\n return {\n success: false,\n error: `Tag with name '${input.tagName}' not found in project '${input.projectId}'`,\n };\n }\n\n // Find all tasks with this tag\n const tasks = projectData.tasks.filter((t) => t.tags.includes(tag.id));\n\n return {\n success: true,\n data: {\n tag,\n tasks,\n count: tasks.length,\n },\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to get tasks by tag',\n };\n }\n },\n};\n","import { createServer } from '../web/server.js';\nimport open from 'open';\nimport type { Server } from 'http';\n\nlet activeServer: Server | null = null;\n\nasync function openBrowser(url: string): Promise<void> {\n try {\n await open(url);\n } catch (error) {\n console.error('Failed to open browser:', error);\n }\n}\n\nexport const openWebInterfaceTool = {\n name: 'open_web_interface',\n description: 'Open web visualization interface',\n parameters: {\n type: 'object',\n properties: {\n port: {\n type: 'number',\n description: 'Port to run the web interface on (default: 7860)',\n },\n },\n },\n async execute(args: { port?: number }) {\n if (activeServer) {\n return { \n message: 'Web interface is already running',\n url: `http://localhost:${(activeServer.address() as any).port}`\n };\n }\n\n const port = args.port || 7860;\n activeServer = createServer(port);\n const url = `http://localhost:${port}`;\n\n void openBrowser(url);\n\n return {\n message: 'Web interface started successfully and opened in browser',\n url: url\n };\n }\n};\n\nexport const closeWebInterfaceTool = {\n name: 'close_web_interface',\n description: 'Close web visualization interface',\n parameters: {\n type: 'object',\n properties: {},\n },\n async execute() {\n if (!activeServer) {\n return { message: 'Web interface is not running' };\n }\n\n return new Promise((resolve) => {\n activeServer!.close(() => {\n activeServer = null;\n resolve({ message: 'Web interface stopped' });\n });\n });\n }\n};\n","import express from 'express';\nimport * as path from 'path';\nimport { storage } from '../storage/index.js';\n\nexport function createServer(port: number = 7860) {\n const app = express();\n\n app.use(express.json());\n\n app.get('/api/projects', async (_req, res) => {\n try {\n const projects = await storage.listProjects();\n res.json(projects);\n } catch (error) {\n res.status(500).json({ error: (error as Error).message });\n }\n });\n\n app.get('/api/projects/:id', async (req, res) => {\n try {\n const project = await storage.readProject(req.params.id);\n if (!project) {\n res.status(404).json({ error: 'Project not found' });\n return;\n }\n res.json(project);\n } catch (error) {\n res.status(500).json({ error: (error as Error).message });\n }\n });\n\n app.get('/api/tasks', async (req, res) => {\n try {\n const filters = req.query;\n const tasks = await storage.searchTasks(filters as any);\n res.json(tasks);\n } catch (error) {\n res.status(500).json({ error: (error as Error).message });\n }\n });\n\n app.post('/api/projects', async (req, res) => {\n try {\n const project = await storage.createProject(req.body);\n res.json({ success: true, data: project });\n } catch (error) {\n res.status(500).json({ error: (error as Error).message });\n }\n });\n\n app.put('/api/projects', async (req, res) => {\n try {\n const { projectId, ...updateData } = req.body;\n const project = await storage.updateProject(projectId, updateData);\n res.json({ success: true, data: project });\n } catch (error) {\n res.status(500).json({ error: (error as Error).message });\n }\n });\n\n app.delete('/api/projects', async (req, res) => {\n try {\n const { projectId } = req.query;\n await storage.deleteProject(projectId as string);\n res.json({ success: true });\n } catch (error) {\n res.status(500).json({ error: (error as Error).message });\n }\n });\n\n app.post('/api/tasks', async (req, res) => {\n try {\n const { projectId, ...taskData } = req.body;\n const projectData = await storage.readProject(projectId);\n if (!projectData) {\n res.status(404).json({ error: 'Project not found' });\n return;\n }\n const now = new Date().toISOString();\n const task = {\n id: `task_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`,\n projectId,\n ...taskData,\n status: taskData.status || 'todo',\n priority: taskData.priority || 'medium',\n tags: taskData.tags || [],\n dueDate: taskData.dueDate || null,\n assignee: taskData.assignee || null,\n createdAt: now,\n updatedAt: now,\n completedAt: null,\n };\n projectData.tasks.push(task);\n projectData.project.updatedAt = now;\n const filePath = storage.getFilePath(projectId);\n const { writeJsonFile } = await import('../utils/file-helpers.js');\n await writeJsonFile(filePath, projectData);\n res.json({ success: true, data: task });\n } catch (error) {\n res.status(500).json({ error: (error as Error).message });\n }\n });\n\n app.put('/api/tasks', async (req, res) => {\n try {\n const { projectId, taskId, ...updateData } = req.body;\n const projectData = await storage.readProject(projectId);\n if (!projectData) {\n res.status(404).json({ error: 'Project not found' });\n return;\n }\n const taskIndex = projectData.tasks.findIndex((t: any) => t.id === taskId);\n if (taskIndex === -1) {\n res.status(404).json({ error: 'Task not found' });\n return;\n }\n const now = new Date().toISOString();\n const existingTask = projectData.tasks[taskIndex];\n const updatedTask = {\n ...existingTask,\n ...updateData,\n id: existingTask.id,\n projectId: existingTask.projectId,\n createdAt: existingTask.createdAt,\n updatedAt: now,\n completedAt: updateData.status === 'done' && existingTask.status !== 'done'\n ? now\n : updateData.status && updateData.status !== 'done'\n ? null\n : existingTask.completedAt,\n };\n projectData.tasks[taskIndex] = updatedTask;\n projectData.project.updatedAt = now;\n const filePath = storage.getFilePath(projectId);\n const { writeJsonFile } = await import('../utils/file-helpers.js');\n await writeJsonFile(filePath, projectData);\n res.json({ success: true, data: updatedTask });\n } catch (error) {\n res.status(500).json({ error: (error as Error).message });\n }\n });\n\n app.delete('/api/tasks', async (req, res) => {\n try {\n const { projectId, taskId } = req.query;\n const projectData = await storage.readProject(projectId as string);\n if (!projectData) {\n res.status(404).json({ error: 'Project not found' });\n return;\n }\n const taskIndex = projectData.tasks.findIndex((t: any) => t.id === taskId);\n if (taskIndex === -1) {\n res.status(404).json({ error: 'Task not found' });\n return;\n }\n projectData.tasks.splice(taskIndex, 1);\n projectData.project.updatedAt = new Date().toISOString();\n const filePath = storage.getFilePath(projectId as string);\n const { writeJsonFile } = await import('../utils/file-helpers.js');\n await writeJsonFile(filePath, projectData);\n res.json({ success: true });\n } catch (error) {\n res.status(500).json({ error: (error as Error).message });\n }\n });\n\n const distPath = path.join(process.cwd(), 'dist', 'web', 'app');\n app.use(express.static(distPath));\n\n app.get('*', (req, res) => {\n if (req.path.startsWith('/api')) {\n res.status(404).json({ error: 'API not found' });\n return;\n }\n res.sendFile(path.join(distPath, 'index.html'));\n });\n\n const server = app.listen(port, '0.0.0.0', () => {\n console.log(`Web interface server running at http://0.0.0.0:${port}`);\n });\n\n return server;\n}\n","import { z } from 'zod';\nimport * as path from 'path';\nimport * as fs from 'fs/promises';\nimport { storage } from '../storage/index.js';\nimport type { CreateProjectInput, Tag, Task } from '../models/index.js';\n\nconst TEMPLATES_DIR = path.join(process.cwd(), 'templates');\n\ninterface TemplateMetadata {\n name: string;\n description: string;\n projectType: string;\n tasks: Array<{\n title: string;\n description: string;\n priority: 'low' | 'medium' | 'high' | 'critical';\n tags: string[];\n estimatedHours?: number;\n }>;\n tags: Array<{\n name: string;\n color: string;\n }>;\n}\n\nasync function getTemplateFiles(): Promise<string[]> {\n try {\n const files = await fs.readdir(TEMPLATES_DIR);\n return files.filter((f) => f.endsWith('.json'));\n } catch {\n return [];\n }\n}\n\nasync function loadTemplate(templateName: string): Promise<TemplateMetadata | null> {\n try {\n const fileName = templateName.endsWith('.json') ? templateName : `${templateName}.json`;\n const filePath = path.join(TEMPLATES_DIR, fileName);\n const content = await fs.readFile(filePath, 'utf-8');\n return JSON.parse(content) as TemplateMetadata;\n } catch {\n return null;\n }\n}\n\nfunction generateId(prefix: string): string {\n return `${prefix}_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;\n}\n\nexport const listTemplatesTool = {\n name: 'list_templates',\n description: 'List all available project templates',\n inputSchema: z.object({}),\n async execute() {\n try {\n const templateFiles = await getTemplateFiles();\n const templates = [];\n\n for (const file of templateFiles) {\n const template = await loadTemplate(file);\n if (template) {\n templates.push({\n name: file.replace('.json', ''),\n displayName: template.name,\n description: template.description,\n projectType: template.projectType,\n taskCount: template.tasks.length,\n tagCount: template.tags.length,\n });\n }\n }\n\n return {\n success: true,\n data: templates,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to list templates',\n };\n }\n },\n};\n\nexport const getTemplateTool = {\n name: 'get_template',\n description: 'Get detailed information about a specific template',\n inputSchema: z.object({\n templateName: z.string().min(1, 'Template name is required'),\n }),\n async execute(input: { templateName: string }) {\n try {\n const template = await loadTemplate(input.templateName);\n\n if (!template) {\n return {\n success: false,\n error: `Template '${input.templateName}' not found`,\n };\n }\n\n return {\n success: true,\n data: {\n name: template.name,\n description: template.description,\n projectType: template.projectType,\n tasks: template.tasks.map((t) => ({\n title: t.title,\n description: t.description,\n priority: t.priority,\n tags: t.tags,\n estimatedHours: t.estimatedHours,\n })),\n tags: template.tags,\n },\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to get template',\n };\n }\n },\n};\n\nexport const applyTemplateTool = {\n name: 'apply_template',\n description: 'Create a new project from a template',\n inputSchema: z.object({\n templateName: z.string().min(1, 'Template name is required'),\n projectName: z.string().min(1, 'Project name is required'),\n description: z.string().default(''),\n startDate: z.string().regex(/^\\d{4}-\\d{2}-\\d{2}$/, 'Date must be in YYYY-MM-DD format').optional(),\n targetDate: z.string().regex(/^\\d{4}-\\d{2}-\\d{2}$/, 'Date must be in YYYY-MM-DD format').optional(),\n }),\n async execute(input: {\n templateName: string;\n projectName: string;\n description: string;\n startDate?: string;\n targetDate?: string;\n }) {\n try {\n const template = await loadTemplate(input.templateName);\n\n if (!template) {\n return {\n success: false,\n error: `Template '${input.templateName}' not found`,\n };\n }\n\n const projectInput: CreateProjectInput = {\n name: input.projectName,\n description: input.description || template.description,\n projectType: template.projectType as 'roadmap' | 'skill-tree' | 'kanban',\n startDate: input.startDate || new Date().toISOString().split('T')[0],\n targetDate: input.targetDate || new Date().toISOString().split('T')[0],\n };\n\n const projectData = await storage.createProject(projectInput);\n const projectId = projectData.project.id;\n const now = new Date().toISOString();\n\n const tagNameToId: Map<string, string> = new Map();\n const tags: Tag[] = [];\n\n for (const templateTag of template.tags) {\n const tag: Tag = {\n id: generateId('tag'),\n name: templateTag.name,\n color: templateTag.color,\n description: '',\n createdAt: now,\n };\n tags.push(tag);\n tagNameToId.set(templateTag.name, tag.id);\n }\n\n const tasks: Task[] = [];\n\n for (const templateTask of template.tasks) {\n const taskTagIds = templateTask.tags\n .map((tagName) => tagNameToId.get(tagName))\n .filter((id): id is string => id !== undefined);\n\n const task: Task = {\n id: generateId('task'),\n projectId,\n title: templateTask.title,\n description: templateTask.description,\n status: 'todo',\n priority: templateTask.priority,\n tags: taskTagIds,\n dueDate: null,\n assignee: null,\n createdAt: now,\n updatedAt: now,\n completedAt: null,\n };\n tasks.push(task);\n }\n\n projectData.tags = tags;\n projectData.tasks = tasks;\n projectData.project.updatedAt = now;\n\n const filePath = storage.getFilePath(projectId);\n const { writeJsonFile } = await import('../utils/file-helpers.js');\n await writeJsonFile(filePath, projectData);\n\n return {\n success: true,\n data: {\n project: projectData.project,\n taskCount: tasks.length,\n tagCount: tags.length,\n tasksCreated: tasks.map((t) => ({\n id: t.id,\n title: t.title,\n priority: t.priority,\n })),\n tagsCreated: tags.map((t) => ({\n id: t.id,\n name: t.name,\n color: t.color,\n })),\n },\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to apply template',\n };\n }\n },\n};\n","export {\n projectResources,\n handleResourceRequest,\n getAllResources,\n} from './project-resources.js';\n","import type {\n Resource,\n TextResourceContents,\n} from '@modelcontextprotocol/sdk/types.js';\nimport { storage } from '../storage/index.js';\n\n/**\n * Resource definitions for roadmap projects\n */\nexport const projectResources: Resource[] = [\n {\n uri: 'roadmap://projects',\n name: 'Project List',\n mimeType: 'application/json',\n description: 'Returns a list of all projects with basic metadata',\n },\n {\n uri: 'roadmap://project/{projectId}',\n name: 'Project Details',\n mimeType: 'application/json',\n description: 'Returns detailed information about a specific project including tasks, milestones, and tags',\n },\n {\n uri: 'roadmap://project/{projectId}/tasks',\n name: 'Project Tasks',\n mimeType: 'application/json',\n description: 'Returns all tasks for a specific project',\n },\n {\n uri: 'roadmap://project/{projectId}/progress',\n name: 'Project Progress',\n mimeType: 'application/json',\n description: 'Returns progress statistics for a specific project',\n },\n];\n\n/**\n * Resource URI patterns for matching\n */\nconst RESOURCE_PATTERNS = {\n projectList: /^roadmap:\\/\\/projects$/,\n projectDetails: /^roadmap:\\/\\/project\\/([^/]+)$/,\n projectTasks: /^roadmap:\\/\\/project\\/([^/]+)\\/tasks$/,\n projectProgress: /^roadmap:\\/\\/project\\/([^/]+)\\/progress$/,\n};\n\n/**\n * Handle resource requests\n * @param uri - The resource URI\n * @returns Resource contents or null if not found\n */\nexport async function handleResourceRequest(\n uri: string\n): Promise<TextResourceContents | null> {\n // Project List: roadmap://projects\n if (RESOURCE_PATTERNS.projectList.test(uri)) {\n return await getProjectListResource(uri);\n }\n\n // Project Details: roadmap://project/{projectId}\n const projectDetailsMatch = uri.match(RESOURCE_PATTERNS.projectDetails);\n if (projectDetailsMatch && !uri.includes('/tasks') && !uri.includes('/progress')) {\n const projectId = projectDetailsMatch[1];\n return await getProjectDetailsResource(uri, projectId);\n }\n\n // Project Tasks: roadmap://project/{projectId}/tasks\n const projectTasksMatch = uri.match(RESOURCE_PATTERNS.projectTasks);\n if (projectTasksMatch) {\n const projectId = projectTasksMatch[1];\n return await getProjectTasksResource(uri, projectId);\n }\n\n // Project Progress: roadmap://project/{projectId}/progress\n const projectProgressMatch = uri.match(RESOURCE_PATTERNS.projectProgress);\n if (projectProgressMatch) {\n const projectId = projectProgressMatch[1];\n return await getProjectProgressResource(uri, projectId);\n }\n\n return null;\n}\n\n/**\n * Get project list resource\n */\nasync function getProjectListResource(uri: string): Promise<TextResourceContents> {\n const projects = await storage.listProjects();\n\n const data = {\n projects: projects.map(p => ({\n id: p.project.id,\n name: p.project.name,\n description: p.project.description,\n status: p.project.status,\n projectType: p.project.projectType,\n taskCount: p.taskCount,\n milestoneCount: p.milestoneCount,\n updatedAt: p.project.updatedAt,\n })),\n totalCount: projects.length,\n };\n\n return {\n uri,\n mimeType: 'application/json',\n text: JSON.stringify(data, null, 2),\n };\n}\n\n/**\n * Get project details resource\n */\nasync function getProjectDetailsResource(\n uri: string,\n projectId: string\n): Promise<TextResourceContents | null> {\n const projectData = await storage.readProject(projectId);\n\n if (!projectData) {\n return null;\n }\n\n const data = {\n project: projectData.project,\n milestones: projectData.milestones,\n tasks: projectData.tasks,\n tags: projectData.tags,\n stats: {\n taskCount: projectData.tasks.length,\n milestoneCount: projectData.milestones.length,\n tagCount: projectData.tags.length,\n completedTasks: projectData.tasks.filter(t => t.status === 'done').length,\n inProgressTasks: projectData.tasks.filter(t => t.status === 'in-progress').length,\n },\n };\n\n return {\n uri,\n mimeType: 'application/json',\n text: JSON.stringify(data, null, 2),\n };\n}\n\n/**\n * Get project tasks resource\n */\nasync function getProjectTasksResource(\n uri: string,\n projectId: string\n): Promise<TextResourceContents | null> {\n const projectData = await storage.readProject(projectId);\n\n if (!projectData) {\n return null;\n }\n\n const tasksByStatus = {\n todo: projectData.tasks.filter(t => t.status === 'todo'),\n inProgress: projectData.tasks.filter(t => t.status === 'in-progress'),\n review: projectData.tasks.filter(t => t.status === 'review'),\n done: projectData.tasks.filter(t => t.status === 'done'),\n };\n\n const data = {\n projectId,\n projectName: projectData.project.name,\n tasks: projectData.tasks,\n tasksByStatus,\n summary: {\n total: projectData.tasks.length,\n todo: tasksByStatus.todo.length,\n inProgress: tasksByStatus.inProgress.length,\n review: tasksByStatus.review.length,\n done: tasksByStatus.done.length,\n },\n };\n\n return {\n uri,\n mimeType: 'application/json',\n text: JSON.stringify(data, null, 2),\n };\n}\n\n/**\n * Get project progress resource\n */\nasync function getProjectProgressResource(\n uri: string,\n projectId: string\n): Promise<TextResourceContents | null> {\n const projectData = await storage.readProject(projectId);\n\n if (!projectData) {\n return null;\n }\n\n const tasks = projectData.tasks;\n const totalTasks = tasks.length;\n const completedTasks = tasks.filter(t => t.status === 'done').length;\n const inProgressTasks = tasks.filter(t => t.status === 'in-progress').length;\n const reviewTasks = tasks.filter(t => t.status === 'review').length;\n const todoTasks = tasks.filter(t => t.status === 'todo').length;\n\n const completionPercentage = totalTasks > 0 ? Math.round((completedTasks / totalTasks) * 100) : 0;\n\n const milestones = projectData.milestones;\n const completedMilestones = milestones.filter(m => m.completedAt !== null).length;\n const milestoneProgress = milestones.length > 0 ? Math.round((completedMilestones / milestones.length) * 100) : 0;\n\n // Calculate overdue tasks\n const now = new Date().toISOString();\n const overdueTasks = tasks.filter(t => \n t.dueDate && \n t.dueDate < now && \n t.status !== 'done'\n );\n\n // Priority breakdown\n const priorityBreakdown = {\n critical: tasks.filter(t => t.priority === 'critical').length,\n high: tasks.filter(t => t.priority === 'high').length,\n medium: tasks.filter(t => t.priority === 'medium').length,\n low: tasks.filter(t => t.priority === 'low').length,\n };\n\n const data = {\n projectId,\n projectName: projectData.project.name,\n projectStatus: projectData.project.status,\n dates: {\n startDate: projectData.project.startDate,\n targetDate: projectData.project.targetDate,\n daysRemaining: calculateDaysRemaining(projectData.project.targetDate),\n },\n taskProgress: {\n total: totalTasks,\n completed: completedTasks,\n inProgress: inProgressTasks,\n review: reviewTasks,\n todo: todoTasks,\n completionPercentage,\n },\n milestoneProgress: {\n total: milestones.length,\n completed: completedMilestones,\n percentage: milestoneProgress,\n },\n overdueTasks: {\n count: overdueTasks.length,\n tasks: overdueTasks.map(t => ({\n id: t.id,\n title: t.title,\n dueDate: t.dueDate,\n status: t.status,\n })),\n },\n priorityBreakdown,\n lastUpdated: projectData.project.updatedAt,\n };\n\n return {\n uri,\n mimeType: 'application/json',\n text: JSON.stringify(data, null, 2),\n };\n}\n\n/**\n * Calculate days remaining until target date\n */\nfunction calculateDaysRemaining(targetDate: string): number | null {\n const target = new Date(targetDate);\n const now = new Date();\n const diffTime = target.getTime() - now.getTime();\n const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24));\n return diffDays > 0 ? diffDays : null;\n}\n\n/**\n * Get all available resources\n */\nexport function getAllResources(): Resource[] {\n return projectResources;\n}\n","export {\n projectPrompts,\n getRecommendNextTasksPrompt,\n getAutoPrioritizePrompt,\n getEnhanceTaskDetailsPrompt,\n getQuickCapturePrompt,\n getPromptByName,\n getAllPrompts,\n} from './project-prompts.js';\n","import type {\n Prompt,\n GetPromptResult,\n} from '@modelcontextprotocol/sdk/types.js';\n\n/**\n * 精选Prompts - 帮助Agent更智能地使用Roadmap Skill\n */\nexport const projectPrompts: Prompt[] = [\n {\n name: 'recommendNextTasks',\n description: '智能推荐接下来要完成的优先任务,基于优先级、截止日期和项目状态',\n arguments: [\n {\n name: 'projectId',\n description: '特定项目的ID(可选,不提供则分析所有项目)',\n required: false,\n },\n {\n name: 'limit',\n description: '推荐任务数量(默认3个)',\n required: false,\n },\n ],\n },\n {\n name: 'autoPrioritize',\n description: '自动分析任务并智能调整优先级,考虑截止日期、任务依赖和项目重要性',\n arguments: [\n {\n name: 'projectId',\n description: '特定项目的ID(可选,不提供则分析所有项目)',\n required: false,\n },\n ],\n },\n {\n name: 'enhanceTaskDetails',\n description: '智能补充任务细节,包括描述、验收标准、子任务和所需资源',\n arguments: [\n {\n name: 'taskId',\n description: '要完善的任务ID',\n required: true,\n },\n ],\n },\n {\n name: 'quickCapture',\n description: '快速捕捉想法/任务,自动分类并建议优先级',\n arguments: [\n {\n name: 'idea',\n description: '要捕捉的想法或任务描述',\n required: true,\n },\n {\n name: 'projectId',\n description: '目标项目ID(可选)',\n required: false,\n },\n ],\n },\n];\n\n/**\n * 智能推荐下一步任务\n * 分析所有任务,基于优先级、截止日期、依赖关系推荐最优执行顺序\n */\nexport function getRecommendNextTasksPrompt(projectId?: string, limit?: string): GetPromptResult {\n const context = projectId\n ? `分析项目 ${projectId} 的任务`\n : '分析所有活跃项目的任务';\n\n const taskLimit = limit ? parseInt(limit, 10) : 3;\n\n return {\n description: '智能任务推荐助手',\n messages: [\n {\n role: 'user',\n content: {\n type: 'text',\n text: `${context},请帮我推荐接下来应该优先完成的${taskLimit}个任务。\n\n## 推荐逻辑(按优先级排序):\n\n### 1. 紧急且重要(Critical优先级 + 截止日期近)\n- 今天或明天到期的Critical任务\n- 已逾期的高优先级任务\n\n### 2. 高价值任务(High优先级 + 有明确截止日期)\n- 本周内到期的High优先级任务\n- 阻塞其他任务的关键路径任务\n\n### 3. 快速获胜(Medium优先级 + 预计耗时短)\n- 可以在1-2小时内完成的Medium任务\n- 能明显提升项目进度的任务\n\n### 4. 计划内工作\n- 已标记为\"in-progress\"但未完成的任务\n- 即将到期的Normal优先级任务\n\n## 请执行以下步骤:\n\n1. **列出所有待办任务**(status = todo 或 in-progress)\n2. **筛选出高优先级任务**:critical 和 high\n3. **检查截止日期**:找出即将到期或已逾期的任务\n4. **分析阻塞关系**:识别哪些任务阻塞了其他任务\n5. **生成推荐列表**:给出${taskLimit}个最应该优先处理的任务,包含理由\n\n## 输出格式:\n\n### 立即处理(Critical)\n1. **任务名** (项目名)\n - 原因:[为什么这个任务最紧急]\n - 建议行动:[具体做什么]\n\n### 今日重点(High)\n2. **任务名** (项目名)\n - 原因:[为什么这个任务重要]\n - 建议行动:[具体做什么]\n\n### 后续跟进\n3. **任务名** (项目名)\n - 原因:[为什么应该接下来做]\n - 建议行动:[具体做什么]\n\n 请使用 list_tasks 工具获取任务数据,然后给出智能推荐。\n\n## Important Reminder\nWhen you start working on recommended tasks, please:\n1. Use update_task to set task status to in-progress\n2. After completing the task, use update_task to set status to done\n3. If blocked or have issues, document in description and update status to review\n\nKeep task status synchronized with actual progress!`,\n },\n },\n ],\n };\n}\n\n/**\n * 自动优先级优化\n * 根据截止日期、项目进度、任务依赖自动调整优先级\n */\nexport function getAutoPrioritizePrompt(projectId?: string): GetPromptResult {\n const context = projectId\n ? `分析项目 ${projectId} 的任务优先级`\n : '分析所有项目的任务优先级';\n\n return {\n description: '智能优先级优化助手',\n messages: [\n {\n role: 'user',\n content: {\n type: 'text',\n text: `${context},请自动分析并建议优先级调整。\n\n## 优先级调整规则:\n\n### 升级为 Critical 的条件:\n- [ ] 截止日期在48小时内且未完成\n- [ ] 阻塞了其他high/critical任务\n- [ ] 是项目关键路径上的任务且进度落后\n- [ ] 有外部依赖(如客户、合作方)且时间紧迫\n\n### 升级为 High 的条件:\n- [ ] 截止日期在1周内\n- [ ] 是重要里程碑的前置任务\n- [ ] 长期卡在\"in-progress\"状态(超过3天)\n- [ ] 影响多个团队成员的工作\n\n### 降级为 Medium/Low 的条件:\n- [ ] 截止日期还很远(>2周)且没有依赖\n- [ ] 是\"nice to have\"功能而非核心功能\n- [ ] 当前阶段不需要,可以延后\n\n### 其他考虑因素:\n- **项目整体进度**:进度落后的项目任务应提升优先级\n- **资源可用性**:如果资源紧张,聚焦最高优先级\n- **风险因素**:风险高的任务应提前处理\n\n## 请执行以下步骤:\n\n1. **获取所有任务**:使用 list_tasks 获取任务列表\n2. **分析每个任务**:\n - 检查截止日期与当前日期的差距\n - 识别任务依赖关系\n - 评估项目整体健康度\n3. **生成调整建议**:列出需要调整优先级的任务及理由\n4. **批量更新**:使用 batch_update_tasks 执行优先级调整\n\n## 输出格式:\n\n### 建议升级为 Critical\n| 任务 | 当前优先级 | 建议优先级 | 理由 |\n|------|-----------|-----------|------|\n| XXX | high → critical | 明天到期 |\n\n### 建议升级为 High\n| 任务 | 当前优先级 | 建议优先级 | 理由 |\n|------|-----------|-----------|------|\n| XXX | medium → high | 阻塞后续任务 |\n\n### 建议降级\n| 任务 | 当前优先级 | 建议优先级 | 理由 |\n|------|-----------|-----------|------|\n| XXX | high → medium | 可延后处理 |\n\n### 保持不变(优先级合理)\n- 列出优先级设置合理的任务\n\n请给出分析结果,并在用户确认后执行批量更新。`,\n },\n },\n ],\n };\n}\n\n/**\n * 智能补充任务细节\n * 根据任务标题和上下文自动补充描述、验收标准等\n */\nexport function getEnhanceTaskDetailsPrompt(taskId: string): GetPromptResult {\n return {\n description: '任务细节完善助手',\n messages: [\n {\n role: 'user',\n content: {\n type: 'text',\n text: `请帮我完善任务 ${taskId} 的细节。\n\n## 完善内容:\n\n### 1. 详细描述\n- 任务的具体内容和背景\n- 为什么要做这个任务\n- 预期的业务价值或技术价值\n\n### 2. 验收标准(Definition of Done)\n列出明确的完成标准,例如:\n- [ ] 功能实现并本地测试通过\n- [ ] 代码通过Code Review\n- [ ] 相关文档已更新\n- [ ] 单元测试覆盖率>80%\n\n### 3. 技术/实现细节\n- 涉及的技术栈或模块\n- 可能需要修改的文件\n- 潜在的挑战或注意事项\n\n### 4. 相关资源\n- 相关文档链接\n- 参考实现或示例代码\n- 需要咨询的人员\n\n### 5. 子任务建议(如果需要)\n如果任务较复杂,建议拆分为子任务:\n- 子任务1:...\n- 子任务2:...\n- 子任务3:...\n\n## 请执行以下步骤:\n\n1. **获取任务信息**:使用 get_task 查看当前任务详情\n2. **获取项目上下文**:使用 get_project 了解项目背景\n3. **分析任务类型**:\n - 如果是开发任务:补充技术细节、代码位置\n - 如果是设计任务:补充设计规范、评审标准\n - 如果是文档任务:补充文档结构、参考资料\n - 如果是测试任务:补充测试场景、覆盖范围\n4. **生成完善内容**:使用 update_task 更新任务描述\n\n## 更新后任务应包含:\n\n\\`\\`\\`\n## 背景\n[任务背景和目的]\n\n## 验收标准\n- [ ] [标准1]\n- [ ] [标准2]\n- [ ] [标准3]\n\n## 技术细节\n- 涉及模块:[模块名]\n- 关键文件:[文件路径]\n- 注意事项:[重要提醒]\n\n## 相关资源\n- 文档:[链接]\n- 参考:[链接]\n\\`\\`\\`\n\n请获取任务信息后,给出详细的完善建议。`,\n },\n },\n ],\n };\n}\n\n/**\n * 快速捕捉想法\n * 自动分类、建议优先级、推荐项目\n */\nexport function getQuickCapturePrompt(idea: string, projectId?: string): GetPromptResult {\n const projectContext = projectId\n ? `添加到项目 ${projectId}`\n : '自动选择最合适的项目';\n\n return {\n description: '快速捕捉助手',\n messages: [\n {\n role: 'user',\n content: {\n type: 'text',\n text: `我要快速捕捉一个想法/任务:\"${idea}\"\n\n${projectContext}\n\n## 请帮我完成以下步骤:\n\n### 1. 任务信息提取\n从描述中提取:\n- **任务标题**:简洁明确的标题(动词开头)\n- **任务描述**:补充上下文和细节\n- **任务类型**:bug / feature / refactor / docs / chore\n- **预估优先级**:critical / high / medium / low(基于描述判断紧急程度)\n\n### 2. 项目推荐(如果未指定项目)\n如果用户没有指定项目,请:\n- 列出所有活跃项目\n- 分析任务内容与哪个项目最相关\n- 推荐最合适的项目\n\n### 3. 标签建议\n建议相关的标签:\n- 类型标签:bug, feature, refactor, docs\n- 优先级标签:urgent, important\n- 领域标签:frontend, backend, design, testing(如适用)\n\n### 4. 生成任务\n使用 create_task 创建任务\n\n### 5. Status Recommendation\nAfter creating the task, if you start working on it immediately, consider setting the status to in-progress. Use update_task to keep progress updated during work, and mark as done when completed.\n\n## 示例:\n\n**输入**:\"用户反馈登录页面在手机上显示不对\"\n\n**输出**:\n- 标题:修复登录页面移动端适配问题\n- 描述:用户反馈登录页面在移动设备上显示异常,需要检查响应式布局。\n- 类型:Bug\n- 优先级:High(影响用户体验)\n- 建议标签:bug, frontend, mobile\n- 推荐项目:[如果有web项目则推荐]\n\n## 当前想法分析:\n\n想法:\"${idea}\"\n\n请分析并生成任务建议。用户确认后,执行 create_task 创建任务。`,\n },\n },\n ],\n };\n}\n\n/**\n * 根据名称获取Prompt\n */\nexport function getPromptByName(name: string, args?: Record<string, string>): GetPromptResult | null {\n switch (name) {\n case 'recommendNextTasks':\n return getRecommendNextTasksPrompt(args?.projectId, args?.limit);\n case 'autoPrioritize':\n return getAutoPrioritizePrompt(args?.projectId);\n case 'enhanceTaskDetails':\n return getEnhanceTaskDetailsPrompt(args?.taskId || '');\n case 'quickCapture':\n return getQuickCapturePrompt(args?.idea || '', args?.projectId);\n default:\n return null;\n }\n}\n\n/**\n * 获取所有可用的Prompts\n */\nexport function getAllPrompts(): Prompt[] {\n return projectPrompts;\n}\n"],"mappings":"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","names":["path","path","fs","z","z","writeJsonFile","z","z","writeJsonFile","existingTag","path","writeJsonFile","z","path","fs","z","writeJsonFile","createServer"]}
|
|
1
|
+
{"version":3,"sources":["../node_modules/tsup/assets/esm_shims.js","../src/utils/file-helpers.ts","../src/index.ts","../src/server.ts","../src/tools/index.ts","../src/tools/project-tools.ts","../src/storage/index.ts","../src/utils/path-helpers.ts","../src/tools/task-tools.ts","../src/tools/tag-tools.ts","../src/tools/web-tools.ts","../src/web/server.ts","../src/tools/template-tools.ts","../src/resources/index.ts","../src/resources/project-resources.ts","../src/prompts/index.ts","../src/prompts/project-prompts.ts"],"sourcesContent":["// Shim globals in esm bundle\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nconst getFilename = () => fileURLToPath(import.meta.url)\nconst getDirname = () => path.dirname(getFilename())\n\nexport const __dirname = /* @__PURE__ */ getDirname()\nexport const __filename = /* @__PURE__ */ getFilename()\n","import * as fs from 'fs/promises';\n\n/**\n * Read and parse a JSON file\n * @param filePath - Path to the JSON file\n * @returns Parsed JSON data\n * @throws Error if file cannot be read or parsed\n */\nexport async function readJsonFile<T>(filePath: string): Promise<T> {\n try {\n const content = await fs.readFile(filePath, 'utf-8');\n return JSON.parse(content) as T;\n } catch (error) {\n if (error instanceof Error) {\n throw new Error(`Failed to read JSON file ${filePath}: ${error.message}`);\n }\n throw error;\n }\n}\n\n/**\n * Write data to a JSON file\n * @param filePath - Path to the JSON file\n * @param data - Data to serialize and write\n * @throws Error if file cannot be written\n */\nexport async function writeJsonFile<T>(filePath: string, data: T): Promise<void> {\n try {\n const content = JSON.stringify(data, null, 2);\n await fs.writeFile(filePath, content, 'utf-8');\n } catch (error) {\n if (error instanceof Error) {\n throw new Error(`Failed to write JSON file ${filePath}: ${error.message}`);\n }\n throw error;\n }\n}\n\n/**\n * Ensure a directory exists, creating it recursively if needed\n * @param dirPath - Path to the directory\n * @throws Error if directory cannot be created\n */\nexport async function ensureDir(dirPath: string): Promise<void> {\n try {\n await fs.mkdir(dirPath, { recursive: true });\n } catch (error) {\n if (error instanceof Error) {\n throw new Error(`Failed to create directory ${dirPath}: ${error.message}`);\n }\n throw error;\n }\n}\n","import { startServer } from './server.js';\n\nasync function main() {\n process.on('SIGINT', () => {\n console.error('Received SIGINT, shutting down gracefully...');\n process.exit(0);\n });\n\n process.on('SIGTERM', () => {\n console.error('Received SIGTERM, shutting down gracefully...');\n process.exit(0);\n });\n\n process.on('uncaughtException', (error) => {\n console.error('Uncaught exception:', error);\n process.exit(1);\n });\n\n process.on('unhandledRejection', (reason) => {\n console.error('Unhandled rejection:', reason);\n process.exit(1);\n });\n\n try {\n await startServer();\n } catch (error) {\n console.error('Failed to start server:', error);\n process.exit(1);\n }\n}\n\nmain();\n","import { Server } from \"@modelcontextprotocol/sdk/server/index.js\";\nimport {\n\tCallToolRequestSchema,\n\tListToolsRequestSchema,\n\tListResourcesRequestSchema,\n\tReadResourceRequestSchema,\n\tListPromptsRequestSchema,\n\tGetPromptRequestSchema,\n\ttype CallToolRequest,\n\ttype ListToolsRequest,\n\ttype ListResourcesRequest,\n\ttype ReadResourceRequest,\n\ttype ListPromptsRequest,\n\ttype GetPromptRequest,\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { zodToJsonSchema } from \"zod-to-json-schema\";\n\nimport {\n\tcreateProjectTool,\n\tlistProjectsTool,\n\tgetProjectTool,\n\tupdateProjectTool,\n\tdeleteProjectTool,\n\tcreateTaskTool,\n\tlistTasksTool,\n\tgetTaskTool,\n\tupdateTaskTool,\n\tdeleteTaskTool,\n\tbatchUpdateTasksTool,\n\tcreateTagTool,\n\tlistTagsTool,\n\tupdateTagTool,\n\tdeleteTagTool,\n\tgetTasksByTagTool,\n\topenWebInterfaceTool,\n\tcloseWebInterfaceTool,\n} from \"./tools/index.js\";\nimport { getAllResources, handleResourceRequest } from \"./resources/index.js\";\nimport { getAllPrompts, getPromptByName } from \"./prompts/index.js\";\n\nconst allTools = [\n\tcreateProjectTool,\n\tlistProjectsTool,\n\tgetProjectTool,\n\tupdateProjectTool,\n\tdeleteProjectTool,\n\tcreateTaskTool,\n\tlistTasksTool,\n\tgetTaskTool,\n\tupdateTaskTool,\n\tdeleteTaskTool,\n\tbatchUpdateTasksTool,\n\tcreateTagTool,\n\tlistTagsTool,\n\tupdateTagTool,\n\tdeleteTagTool,\n\tgetTasksByTagTool,\n\topenWebInterfaceTool,\n\tcloseWebInterfaceTool,\n];\n\nconst toolMap = new Map(allTools.map((tool) => [tool.name, tool]));\n\nexport function createServer(): Server {\n\tconst server = new Server(\n\t\t{\n\t\t\tname: \"roadmap-skill\",\n\t\t\tversion: \"0.2.1\",\n\t\t},\n\t\t{\n\t\t\tcapabilities: {\n\t\t\t\ttools: {},\n\t\t\t\tresources: {},\n\t\t\t\tprompts: {},\n\t\t\t},\n\t\t},\n\t);\n\n\tserver.setRequestHandler(\n\t\tListToolsRequestSchema,\n\t\tasync (_request: ListToolsRequest) => {\n\t\t\treturn {\n\t\t\t\ttools: allTools.map((tool) => {\n\t\t\t\t\tconst rawSchema =\n\t\t\t\t\t\t(tool as any).parameters || (tool as any).inputSchema;\n\t\t\t\t\tlet inputSchema: Record<string, unknown>;\n\n\t\t\t\t\tif (!rawSchema) {\n\t\t\t\t\t\tinputSchema = { type: \"object\" };\n\t\t\t\t\t} else if (rawSchema.type === \"object\") {\n\t\t\t\t\t\tinputSchema = rawSchema;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tinputSchema = zodToJsonSchema(rawSchema, {\n\t\t\t\t\t\t\tname: tool.name,\n\t\t\t\t\t\t\t$refStrategy: \"none\",\n\t\t\t\t\t\t}).definitions?.[tool.name] || { type: \"object\" };\n\t\t\t\t\t}\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tname: tool.name,\n\t\t\t\t\t\tdescription: tool.description,\n\t\t\t\t\t\tinputSchema,\n\t\t\t\t\t};\n\t\t\t\t}),\n\t\t\t};\n\t\t},\n\t);\n\n\tserver.setRequestHandler(\n\t\tCallToolRequestSchema,\n\t\tasync (request: CallToolRequest) => {\n\t\t\tconst { name, arguments: args } = request.params;\n\t\t\tconst tool = toolMap.get(name);\n\n\t\t\tif (!tool) {\n\t\t\t\tthrow new Error(`Unknown tool: ${name}`);\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst result = await tool.execute(args as never);\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\ttext: JSON.stringify(result, null, 2),\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t};\n\t\t\t} catch (error) {\n\t\t\t\tconst errorMessage =\n\t\t\t\t\terror instanceof Error ? error.message : String(error);\n\t\t\t\tthrow new Error(`Tool execution failed: ${errorMessage}`);\n\t\t\t}\n\t\t},\n\t);\n\n\tserver.setRequestHandler(\n\t\tListResourcesRequestSchema,\n\t\tasync (_request: ListResourcesRequest) => {\n\t\t\tconst resources = getAllResources();\n\t\t\treturn { resources };\n\t\t},\n\t);\n\n\tserver.setRequestHandler(\n\t\tReadResourceRequestSchema,\n\t\tasync (request: ReadResourceRequest) => {\n\t\t\tconst uri = request.params.uri;\n\t\t\tconst resourceContent = await handleResourceRequest(uri);\n\n\t\t\tif (!resourceContent) {\n\t\t\t\tthrow new Error(`Resource not found: ${uri}`);\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tcontents: [resourceContent],\n\t\t\t};\n\t\t},\n\t);\n\n\tserver.setRequestHandler(\n\t\tListPromptsRequestSchema,\n\t\tasync (_request: ListPromptsRequest) => {\n\t\t\tconst prompts = getAllPrompts();\n\t\t\treturn { prompts };\n\t\t},\n\t);\n\n\tserver.setRequestHandler(\n\t\tGetPromptRequestSchema,\n\t\tasync (request: GetPromptRequest) => {\n\t\t\tconst { name, arguments: args } = request.params;\n\t\t\tconst promptResult = getPromptByName(\n\t\t\t\tname,\n\t\t\t\targs as Record<string, string> | undefined,\n\t\t\t);\n\n\t\t\tif (!promptResult) {\n\t\t\t\tthrow new Error(`Prompt not found: ${name}`);\n\t\t\t}\n\n\t\t\treturn promptResult;\n\t\t},\n\t);\n\n\treturn server;\n}\n\nexport async function startServer(): Promise<void> {\n\tconst server = createServer();\n\tconst transport = new StdioServerTransport();\n\n\tconsole.error(\"Roadmap Skill MCP Server starting...\");\n\n\ttry {\n\t\tawait server.connect(transport);\n\t\tconsole.error(\"Roadmap Skill MCP Server connected and ready\");\n\t} catch (error) {\n\t\tconsole.error(\"Failed to start server:\", error);\n\t\tthrow error;\n\t}\n}\n","export {\n createProjectTool,\n listProjectsTool,\n getProjectTool,\n updateProjectTool,\n deleteProjectTool,\n} from './project-tools.js';\n\nexport {\n createTaskTool,\n listTasksTool,\n getTaskTool,\n updateTaskTool,\n deleteTaskTool,\n batchUpdateTasksTool,\n} from './task-tools.js';\n\nexport {\n createTagTool,\n listTagsTool,\n updateTagTool,\n deleteTagTool,\n getTasksByTagTool,\n} from './tag-tools.js';\n\nexport {\n openWebInterfaceTool,\n closeWebInterfaceTool,\n} from './web-tools.js';\n\nexport {\n listTemplatesTool,\n getTemplateTool,\n applyTemplateTool,\n} from './template-tools.js';\n","import { z } from 'zod';\nimport { storage } from '../storage/index.js';\nimport type { CreateProjectInput, UpdateProjectInput } from '../models/index.js';\n\nconst ProjectTypeEnum = z.enum(['roadmap', 'skill-tree', 'kanban']);\nconst ProjectStatusEnum = z.enum(['active', 'completed', 'archived']);\n\nexport const createProjectTool = {\n name: 'create_project',\n description: 'Create a new project roadmap',\n inputSchema: z.object({\n name: z.string().min(1, 'Project name is required'),\n description: z.string(),\n projectType: ProjectTypeEnum,\n startDate: z.string().regex(/^\\d{4}-\\d{2}-\\d{2}$/, 'Date must be in YYYY-MM-DD format'),\n targetDate: z.string().regex(/^\\d{4}-\\d{2}-\\d{2}$/, 'Date must be in YYYY-MM-DD format'),\n }),\n async execute(input: {\n name: string;\n description: string;\n projectType: 'roadmap' | 'skill-tree' | 'kanban';\n startDate: string;\n targetDate: string;\n }) {\n try {\n const projectInput: CreateProjectInput = {\n name: input.name,\n description: input.description,\n projectType: input.projectType,\n startDate: input.startDate,\n targetDate: input.targetDate,\n };\n\n const projectData = await storage.createProject(projectInput);\n return {\n success: true,\n data: projectData,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to create project',\n };\n }\n },\n};\n\nexport const listProjectsTool = {\n name: 'list_projects',\n description: 'List all projects with their task and milestone counts',\n inputSchema: z.object({}),\n async execute() {\n try {\n const projects = await storage.listProjects();\n return {\n success: true,\n data: projects,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to list projects',\n };\n }\n },\n};\n\nexport const getProjectTool = {\n name: 'get_project',\n description: 'Get a project by ID with all its data (tasks, tags, milestones)',\n inputSchema: z.object({\n projectId: z.string().min(1, 'Project ID is required'),\n }),\n async execute(input: { projectId: string }) {\n try {\n const projectData = await storage.readProject(input.projectId);\n if (!projectData) {\n return {\n success: false,\n error: `Project with ID '${input.projectId}' not found`,\n };\n }\n return {\n success: true,\n data: projectData,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to get project',\n };\n }\n },\n};\n\nexport const updateProjectTool = {\n name: 'update_project',\n description: 'Update an existing project',\n inputSchema: z.object({\n projectId: z.string().min(1, 'Project ID is required'),\n name: z.string().min(1).optional(),\n description: z.string().optional(),\n projectType: ProjectTypeEnum.optional(),\n status: ProjectStatusEnum.optional(),\n startDate: z.string().regex(/^\\d{4}-\\d{2}-\\d{2}$/).optional(),\n targetDate: z.string().regex(/^\\d{4}-\\d{2}-\\d{2}$/).optional(),\n }),\n async execute(input: {\n projectId: string;\n name?: string;\n description?: string;\n projectType?: 'roadmap' | 'skill-tree' | 'kanban';\n status?: 'active' | 'completed' | 'archived';\n startDate?: string;\n targetDate?: string;\n }) {\n try {\n const { projectId, ...updateData } = input;\n\n if (Object.keys(updateData).length === 0) {\n return {\n success: false,\n error: 'At least one field to update is required',\n };\n }\n\n const updateInput: UpdateProjectInput = updateData;\n const projectData = await storage.updateProject(projectId, updateInput);\n\n if (!projectData) {\n return {\n success: false,\n error: `Project with ID '${projectId}' not found`,\n };\n }\n\n return {\n success: true,\n data: projectData,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to update project',\n };\n }\n },\n};\n\nexport const deleteProjectTool = {\n name: 'delete_project',\n description: 'Delete a project by ID',\n inputSchema: z.object({\n projectId: z.string().min(1, 'Project ID is required'),\n }),\n async execute(input: { projectId: string }) {\n try {\n const deleted = await storage.deleteProject(input.projectId);\n\n if (!deleted) {\n return {\n success: false,\n error: `Project with ID '${input.projectId}' not found`,\n };\n }\n\n return {\n success: true,\n data: { deleted: true },\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to delete project',\n };\n }\n },\n};\n","import * as path from 'path';\nimport type {\n Project,\n ProjectData,\n Task,\n TaskSearchFilters,\n CreateProjectInput,\n UpdateProjectInput,\n} from '../models/index.js';\nimport { getStorageDir } from '../utils/path-helpers.js';\nimport { readJsonFile, writeJsonFile, ensureDir } from '../utils/file-helpers.js';\n\n/**\n * Storage class for managing roadmap-skill projects\n * Projects are stored as individual JSON files in ~/.roadmap-skill/projects/\n */\nexport class ProjectStorage {\n private storageDir: string;\n\n constructor() {\n this.storageDir = getStorageDir();\n }\n\n /**\n * Ensure the storage directory exists\n */\n async ensureDirectory(): Promise<void> {\n await ensureDir(this.storageDir);\n }\n\n /**\n * Get the file path for a project\n * @param projectId - The project ID\n * @returns Full path to the project JSON file\n */\n getFilePath(projectId: string): string {\n return path.join(this.storageDir, `${projectId}.json`);\n }\n\n /**\n * Create a new project\n * @param input - Project creation data\n * @returns The created project data\n */\n async createProject(input: CreateProjectInput): Promise<ProjectData> {\n await this.ensureDirectory();\n\n const now = new Date().toISOString();\n const projectId = `proj_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;\n\n const project: Project = {\n id: projectId,\n name: input.name,\n description: input.description,\n projectType: input.projectType,\n status: 'active',\n startDate: input.startDate,\n targetDate: input.targetDate,\n createdAt: now,\n updatedAt: now,\n };\n\n const projectData: ProjectData = {\n version: 1,\n project,\n milestones: [],\n tasks: [],\n tags: [],\n };\n\n const filePath = this.getFilePath(projectId);\n await writeJsonFile(filePath, projectData);\n\n return projectData;\n }\n\n /**\n * Read a project by ID\n * @param projectId - The project ID\n * @returns The project data or null if not found\n */\n async readProject(projectId: string): Promise<ProjectData | null> {\n try {\n const filePath = this.getFilePath(projectId);\n return await readJsonFile<ProjectData>(filePath);\n } catch (error) {\n if (error instanceof Error && error.message.includes('ENOENT')) {\n return null;\n }\n throw error;\n }\n }\n\n /**\n * Update an existing project\n * @param projectId - The project ID\n * @param input - Project update data\n * @returns The updated project data or null if not found\n */\n async updateProject(\n projectId: string,\n input: UpdateProjectInput\n ): Promise<ProjectData | null> {\n const projectData = await this.readProject(projectId);\n if (!projectData) {\n return null;\n }\n\n const now = new Date().toISOString();\n\n projectData.project = {\n ...projectData.project,\n ...input,\n updatedAt: now,\n };\n\n const filePath = this.getFilePath(projectId);\n await writeJsonFile(filePath, projectData);\n\n return projectData;\n }\n\n /**\n * Delete a project by ID\n * @param projectId - The project ID\n * @returns True if deleted, false if not found\n */\n async deleteProject(projectId: string): Promise<boolean> {\n try {\n const filePath = this.getFilePath(projectId);\n const fs = await import('fs/promises');\n await fs.unlink(filePath);\n return true;\n } catch (error) {\n if (error instanceof Error && error.message.includes('ENOENT')) {\n return false;\n }\n throw error;\n }\n }\n\n /**\n * List all projects sorted by updatedAt (descending)\n * @returns Array of project summaries (project + metadata)\n */\n async listProjects(): Promise<Array<{ project: Project; taskCount: number; milestoneCount: number }>> {\n await this.ensureDirectory();\n\n const fs = await import('fs/promises');\n const files = await fs.readdir(this.storageDir);\n const jsonFiles = files.filter((f) => f.endsWith('.json'));\n\n const projects: Array<{ project: Project; taskCount: number; milestoneCount: number }> = [];\n\n for (const file of jsonFiles) {\n try {\n const filePath = path.join(this.storageDir, file);\n const data = await readJsonFile<ProjectData>(filePath);\n projects.push({\n project: data.project,\n taskCount: data.tasks.length,\n milestoneCount: data.milestones.length,\n });\n } catch {\n // Skip invalid files\n continue;\n }\n }\n\n // Sort by updatedAt descending\n return projects.sort(\n (a, b) => new Date(b.project.updatedAt).getTime() - new Date(a.project.updatedAt).getTime()\n );\n }\n\n /**\n * Search tasks across all projects with filters\n * @param filters - Search filters\n * @returns Array of matching tasks with project context\n */\n async searchTasks(\n filters: TaskSearchFilters\n ): Promise<Array<{ task: Task; project: Project }>> {\n await this.ensureDirectory();\n\n const fs = await import('fs/promises');\n const files = await fs.readdir(this.storageDir);\n const jsonFiles = files.filter((f) => f.endsWith('.json'));\n\n const results: Array<{ task: Task; project: Project }> = [];\n\n for (const file of jsonFiles) {\n try {\n const filePath = path.join(this.storageDir, file);\n const data = await readJsonFile<ProjectData>(filePath);\n\n // Skip if project filter doesn't match\n if (filters.projectId && data.project.id !== filters.projectId) {\n continue;\n }\n\n for (const task of data.tasks) {\n // Apply filters\n if (filters.status && task.status !== filters.status) {\n continue;\n }\n if (filters.priority && task.priority !== filters.priority) {\n continue;\n }\n if (filters.assignee && task.assignee !== filters.assignee) {\n continue;\n }\n if (filters.dueBefore && task.dueDate && task.dueDate > filters.dueBefore) {\n continue;\n }\n if (filters.dueAfter && task.dueDate && task.dueDate < filters.dueAfter) {\n continue;\n }\n if (\n filters.tags &&\n filters.tags.length > 0 &&\n !filters.tags.some((tag) => task.tags.includes(tag))\n ) {\n continue;\n }\n if (\n filters.searchText &&\n !task.title.toLowerCase().includes(filters.searchText.toLowerCase()) &&\n !task.description.toLowerCase().includes(filters.searchText.toLowerCase())\n ) {\n continue;\n }\n\n // Filter completed tasks (done status) when includeCompleted is false\n if (filters.includeCompleted === false && task.status === 'done') {\n continue;\n }\n\n results.push({ task, project: data.project });\n }\n } catch {\n // Skip invalid files\n continue;\n }\n }\n\n return results;\n }\n\n async exportAllData(): Promise<{\n version: number;\n exportedAt: string;\n projects: ProjectData[];\n }> {\n await this.ensureDirectory();\n\n const fs = await import('fs/promises');\n const files = await fs.readdir(this.storageDir);\n const jsonFiles = files.filter((f) => f.endsWith('.json'));\n\n const projects: ProjectData[] = [];\n\n for (const file of jsonFiles) {\n try {\n const filePath = path.join(this.storageDir, file);\n const data = await readJsonFile<ProjectData>(filePath);\n projects.push(data);\n } catch {\n continue;\n }\n }\n\n return {\n version: 1,\n exportedAt: new Date().toISOString(),\n projects,\n };\n }\n\n async importAllData(data: {\n version: number;\n exportedAt: string;\n projects: ProjectData[];\n }): Promise<{\n success: boolean;\n imported: number;\n errors: number;\n errorDetails: string[];\n }> {\n await this.ensureDirectory();\n\n let imported = 0;\n let errors = 0;\n const errorDetails: string[] = [];\n\n if (!data.projects || !Array.isArray(data.projects)) {\n throw new Error('Invalid backup data: projects array is required');\n }\n\n for (const projectData of data.projects) {\n try {\n if (!projectData.project || !projectData.project.id) {\n errors++;\n errorDetails.push('Skipping invalid project: missing project or id');\n continue;\n }\n\n const filePath = this.getFilePath(projectData.project.id);\n await writeJsonFile(filePath, projectData);\n imported++;\n } catch (error) {\n errors++;\n const errorMessage = error instanceof Error ? error.message : String(error);\n errorDetails.push(`Failed to import project ${projectData.project?.id || 'unknown'}: ${errorMessage}`);\n }\n }\n\n return {\n success: errors === 0,\n imported,\n errors,\n errorDetails,\n };\n }\n}\n\nexport const storage = new ProjectStorage();\n","import * as os from 'os';\nimport * as path from 'path';\n\n/**\n * Get the storage directory for roadmap-skill projects\n * Returns: ~/.roadmap-skill/projects\n */\nexport function getStorageDir(): string {\n const homeDir = os.homedir();\n return path.join(homeDir, '.roadmap-skill', 'projects');\n}\n","import { z } from 'zod';\nimport { storage } from '../storage/index.js';\nimport type { Task } from '../models/index.js';\n\nconst TaskStatusEnum = z.enum(['todo', 'in-progress', 'review', 'done']);\nconst TaskPriorityEnum = z.enum(['low', 'medium', 'high', 'critical']);\n\nfunction generateTaskId(): string {\n return `task_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;\n}\n\nexport const createTaskTool = {\n name: 'create_task',\n description: 'Create a new task in a project',\n inputSchema: z.object({\n projectId: z.string().min(1, 'Project ID is required'),\n title: z.string().min(1, 'Task title is required'),\n description: z.string(),\n priority: TaskPriorityEnum.default('medium'),\n tags: z.array(z.string()).default([]),\n dueDate: z.string().regex(/^\\d{4}-\\d{2}-\\d{2}$/).optional(),\n assignee: z.string().optional(),\n }),\n async execute(input: {\n projectId: string;\n title: string;\n description: string;\n priority: 'low' | 'medium' | 'high' | 'critical';\n tags: string[];\n dueDate?: string;\n assignee?: string;\n }) {\n try {\n const projectData = await storage.readProject(input.projectId);\n if (!projectData) {\n return {\n success: false,\n error: `Project with ID '${input.projectId}' not found`,\n };\n }\n\n const now = new Date().toISOString();\n const task: Task = {\n id: generateTaskId(),\n projectId: input.projectId,\n title: input.title,\n description: input.description,\n status: 'todo',\n priority: input.priority,\n tags: input.tags,\n dueDate: input.dueDate ?? null,\n assignee: input.assignee ?? null,\n createdAt: now,\n updatedAt: now,\n completedAt: null,\n };\n\n projectData.tasks.push(task);\n projectData.project.updatedAt = now;\n\n const filePath = storage.getFilePath(input.projectId);\n const { writeJsonFile } = await import('../utils/file-helpers.js');\n await writeJsonFile(filePath, projectData);\n\n return {\n success: true,\n data: task,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to create task',\n };\n }\n },\n};\n\nexport const listTasksTool = {\n name: 'list_tasks',\n description: 'List tasks with optional filters',\n inputSchema: z.object({\n projectId: z.string().optional(),\n status: TaskStatusEnum.optional(),\n priority: TaskPriorityEnum.optional(),\n tags: z.array(z.string()).optional(),\n assignee: z.string().optional(),\n dueBefore: z.string().regex(/^\\d{4}-\\d{2}-\\d{2}$/).optional(),\n dueAfter: z.string().regex(/^\\d{4}-\\d{2}-\\d{2}$/).optional(),\n includeCompleted: z.boolean().optional(),\n }),\n async execute(input: {\n projectId?: string;\n status?: 'todo' | 'in-progress' | 'review' | 'done';\n priority?: 'low' | 'medium' | 'high' | 'critical';\n tags?: string[];\n assignee?: string;\n dueBefore?: string;\n dueAfter?: string;\n includeCompleted?: boolean;\n }) {\n try {\n const results = await storage.searchTasks({\n projectId: input.projectId,\n status: input.status,\n priority: input.priority,\n tags: input.tags,\n assignee: input.assignee,\n dueBefore: input.dueBefore,\n dueAfter: input.dueAfter,\n includeCompleted: input.includeCompleted,\n });\n\n return {\n success: true,\n data: results,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to list tasks',\n };\n }\n },\n};\n\nexport const getTaskTool = {\n name: 'get_task',\n description: 'Get a specific task by project ID and task ID',\n inputSchema: z.object({\n projectId: z.string().min(1, 'Project ID is required'),\n taskId: z.string().min(1, 'Task ID is required'),\n }),\n async execute(input: { projectId: string; taskId: string }) {\n try {\n const projectData = await storage.readProject(input.projectId);\n if (!projectData) {\n return {\n success: false,\n error: `Project with ID '${input.projectId}' not found`,\n };\n }\n\n const task = projectData.tasks.find((t) => t.id === input.taskId);\n if (!task) {\n return {\n success: false,\n error: `Task with ID '${input.taskId}' not found in project '${input.projectId}'`,\n };\n }\n\n return {\n success: true,\n data: task,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to get task',\n };\n }\n },\n};\n\nexport const updateTaskTool = {\n name: 'update_task',\n description: 'Update an existing task',\n inputSchema: z.object({\n projectId: z.string().min(1, 'Project ID is required'),\n taskId: z.string().min(1, 'Task ID is required'),\n title: z.string().min(1).optional(),\n description: z.string().optional(),\n status: TaskStatusEnum.optional(),\n priority: TaskPriorityEnum.optional(),\n tags: z.array(z.string()).optional(),\n dueDate: z.string().regex(/^\\d{4}-\\d{2}-\\d{2}$/).optional().nullable(),\n assignee: z.string().optional().nullable(),\n }),\n async execute(input: {\n projectId: string;\n taskId: string;\n title?: string;\n description?: string;\n status?: 'todo' | 'in-progress' | 'review' | 'done';\n priority?: 'low' | 'medium' | 'high' | 'critical';\n tags?: string[];\n dueDate?: string | null;\n assignee?: string | null;\n }) {\n try {\n const projectData = await storage.readProject(input.projectId);\n if (!projectData) {\n return {\n success: false,\n error: `Project with ID '${input.projectId}' not found`,\n };\n }\n\n const taskIndex = projectData.tasks.findIndex((t) => t.id === input.taskId);\n if (taskIndex === -1) {\n return {\n success: false,\n error: `Task with ID '${input.taskId}' not found in project '${input.projectId}'`,\n };\n }\n\n const { projectId, taskId, ...updateData } = input;\n\n if (Object.keys(updateData).length === 0) {\n return {\n success: false,\n error: 'At least one field to update is required',\n };\n }\n\n const now = new Date().toISOString();\n const existingTask = projectData.tasks[taskIndex];\n\n const updatedTask: Task = {\n ...existingTask,\n ...updateData,\n id: existingTask.id,\n projectId: existingTask.projectId,\n createdAt: existingTask.createdAt,\n updatedAt: now,\n completedAt: updateData.status === 'done' && existingTask.status !== 'done'\n ? now\n : updateData.status && updateData.status !== 'done'\n ? null\n : existingTask.completedAt,\n };\n\n projectData.tasks[taskIndex] = updatedTask;\n projectData.project.updatedAt = now;\n\n const filePath = storage.getFilePath(input.projectId);\n const { writeJsonFile } = await import('../utils/file-helpers.js');\n await writeJsonFile(filePath, projectData);\n\n return {\n success: true,\n data: updatedTask,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to update task',\n };\n }\n },\n};\n\nexport const deleteTaskTool = {\n name: 'delete_task',\n description: 'Delete a task by project ID and task ID',\n inputSchema: z.object({\n projectId: z.string().min(1, 'Project ID is required'),\n taskId: z.string().min(1, 'Task ID is required'),\n }),\n async execute(input: { projectId: string; taskId: string }) {\n try {\n const projectData = await storage.readProject(input.projectId);\n if (!projectData) {\n return {\n success: false,\n error: `Project with ID '${input.projectId}' not found`,\n };\n }\n\n const taskIndex = projectData.tasks.findIndex((t) => t.id === input.taskId);\n if (taskIndex === -1) {\n return {\n success: false,\n error: `Task with ID '${input.taskId}' not found in project '${input.projectId}'`,\n };\n }\n\n const now = new Date().toISOString();\n projectData.tasks.splice(taskIndex, 1);\n projectData.project.updatedAt = now;\n\n const filePath = storage.getFilePath(input.projectId);\n const { writeJsonFile } = await import('../utils/file-helpers.js');\n await writeJsonFile(filePath, projectData);\n\n return {\n success: true,\n data: { deleted: true },\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to delete task',\n };\n }\n },\n};\n\nexport const batchUpdateTasksTool = {\n name: 'batch_update_tasks',\n description: 'Update multiple tasks at once',\n inputSchema: z.object({\n projectId: z.string().min(1, 'Project ID is required'),\n taskIds: z.array(z.string()).min(1, 'At least one task ID is required'),\n status: TaskStatusEnum.optional(),\n priority: TaskPriorityEnum.optional(),\n tags: z.array(z.string()).optional(),\n tagOperation: z.enum(['add', 'remove', 'replace']).default('replace'),\n }),\n async execute(input: {\n projectId: string;\n taskIds: string[];\n status?: 'todo' | 'in-progress' | 'review' | 'done';\n priority?: 'low' | 'medium' | 'high' | 'critical';\n tags?: string[];\n tagOperation?: 'add' | 'remove' | 'replace';\n }) {\n try {\n const projectData = await storage.readProject(input.projectId);\n if (!projectData) {\n return {\n success: false,\n error: `Project with ID '${input.projectId}' not found`,\n };\n }\n\n const now = new Date().toISOString();\n const updatedTasks: Task[] = [];\n const notFoundIds: string[] = [];\n\n for (const taskId of input.taskIds) {\n const taskIndex = projectData.tasks.findIndex((t) => t.id === taskId);\n if (taskIndex === -1) {\n notFoundIds.push(taskId);\n continue;\n }\n\n const existingTask = projectData.tasks[taskIndex];\n let updatedTags = existingTask.tags;\n\n if (input.tags && input.tags.length > 0) {\n const existingTags = existingTask.tags || [];\n switch (input.tagOperation) {\n case 'add':\n updatedTags = [...new Set([...existingTags, ...input.tags])];\n break;\n case 'remove':\n updatedTags = existingTags.filter((tag) => !input.tags!.includes(tag));\n break;\n case 'replace':\n default:\n updatedTags = input.tags;\n break;\n }\n }\n\n const updatedTask: Task = {\n ...existingTask,\n ...(input.status && { status: input.status }),\n ...(input.priority && { priority: input.priority }),\n tags: updatedTags,\n updatedAt: now,\n ...(input.status === 'done' && existingTask.status !== 'done' && { completedAt: now }),\n ...(input.status && input.status !== 'done' && { completedAt: null }),\n };\n\n projectData.tasks[taskIndex] = updatedTask;\n updatedTasks.push(updatedTask);\n }\n\n if (updatedTasks.length === 0) {\n return {\n success: false,\n error: 'No tasks were found to update',\n notFoundIds,\n };\n }\n\n projectData.project.updatedAt = now;\n\n const filePath = storage.getFilePath(input.projectId);\n const { writeJsonFile } = await import('../utils/file-helpers.js');\n await writeJsonFile(filePath, projectData);\n\n return {\n success: true,\n data: {\n updatedTasks,\n updatedCount: updatedTasks.length,\n notFoundIds: notFoundIds.length > 0 ? notFoundIds : undefined,\n },\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to batch update tasks',\n };\n }\n },\n};\n","import { z } from 'zod';\nimport { storage } from '../storage/index.js';\nimport type { Tag } from '../models/index.js';\n\nfunction generateTagId(): string {\n return `tag_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;\n}\n\nexport const createTagTool = {\n name: 'create_tag',\n description: 'Create a new tag in a project',\n inputSchema: z.object({\n projectId: z.string().min(1, 'Project ID is required'),\n name: z.string().min(1, 'Tag name is required'),\n color: z.string().regex(/^#[0-9A-Fa-f]{6}$/, 'Color must be a valid hex code (e.g., #FF5733)'),\n description: z.string().default(''),\n }),\n async execute(input: {\n projectId: string;\n name: string;\n color: string;\n description: string;\n }) {\n try {\n const projectData = await storage.readProject(input.projectId);\n if (!projectData) {\n return {\n success: false,\n error: `Project with ID '${input.projectId}' not found`,\n };\n }\n\n // Check for duplicate tag name\n const existingTag = projectData.tags.find(\n (t) => t.name.toLowerCase() === input.name.toLowerCase()\n );\n if (existingTag) {\n return {\n success: false,\n error: `Tag with name '${input.name}' already exists in this project`,\n };\n }\n\n const now = new Date().toISOString();\n const tag: Tag = {\n id: generateTagId(),\n name: input.name,\n color: input.color,\n description: input.description,\n createdAt: now,\n };\n\n projectData.tags.push(tag);\n projectData.project.updatedAt = now;\n\n const filePath = storage.getFilePath(input.projectId);\n const { writeJsonFile } = await import('../utils/file-helpers.js');\n await writeJsonFile(filePath, projectData);\n\n return {\n success: true,\n data: tag,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to create tag',\n };\n }\n },\n};\n\nexport const listTagsTool = {\n name: 'list_tags',\n description: 'List all tags in a project',\n inputSchema: z.object({\n projectId: z.string().min(1, 'Project ID is required'),\n }),\n async execute(input: { projectId: string }) {\n try {\n const projectData = await storage.readProject(input.projectId);\n if (!projectData) {\n return {\n success: false,\n error: `Project with ID '${input.projectId}' not found`,\n };\n }\n\n return {\n success: true,\n data: projectData.tags,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to list tags',\n };\n }\n },\n};\n\nexport const updateTagTool = {\n name: 'update_tag',\n description: 'Update an existing tag',\n inputSchema: z.object({\n projectId: z.string().min(1, 'Project ID is required'),\n tagId: z.string().min(1, 'Tag ID is required'),\n name: z.string().min(1).optional(),\n color: z.string().regex(/^#[0-9A-Fa-f]{6}$/).optional(),\n description: z.string().optional(),\n }),\n async execute(input: {\n projectId: string;\n tagId: string;\n name?: string;\n color?: string;\n description?: string;\n }) {\n try {\n const projectData = await storage.readProject(input.projectId);\n if (!projectData) {\n return {\n success: false,\n error: `Project with ID '${input.projectId}' not found`,\n };\n }\n\n const tagIndex = projectData.tags.findIndex((t) => t.id === input.tagId);\n if (tagIndex === -1) {\n return {\n success: false,\n error: `Tag with ID '${input.tagId}' not found in project '${input.projectId}'`,\n };\n }\n\n const { projectId, tagId, ...updateData } = input;\n\n if (Object.keys(updateData).length === 0) {\n return {\n success: false,\n error: 'At least one field to update is required',\n };\n }\n\n // Check for duplicate name if updating name\n if (updateData.name) {\n const existingTag = projectData.tags.find(\n (t) => t.name.toLowerCase() === updateData.name!.toLowerCase() && t.id !== input.tagId\n );\n if (existingTag) {\n return {\n success: false,\n error: `Tag with name '${updateData.name}' already exists in this project`,\n };\n }\n }\n\n const now = new Date().toISOString();\n const existingTag = projectData.tags[tagIndex];\n\n const updatedTag: Tag = {\n ...existingTag,\n ...updateData,\n id: existingTag.id,\n createdAt: existingTag.createdAt,\n };\n\n projectData.tags[tagIndex] = updatedTag;\n projectData.project.updatedAt = now;\n\n const filePath = storage.getFilePath(input.projectId);\n const { writeJsonFile } = await import('../utils/file-helpers.js');\n await writeJsonFile(filePath, projectData);\n\n return {\n success: true,\n data: updatedTag,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to update tag',\n };\n }\n },\n};\n\nexport const deleteTagTool = {\n name: 'delete_tag',\n description: 'Delete a tag by project ID and tag ID',\n inputSchema: z.object({\n projectId: z.string().min(1, 'Project ID is required'),\n tagId: z.string().min(1, 'Tag ID is required'),\n }),\n async execute(input: { projectId: string; tagId: string }) {\n try {\n const projectData = await storage.readProject(input.projectId);\n if (!projectData) {\n return {\n success: false,\n error: `Project with ID '${input.projectId}' not found`,\n };\n }\n\n const tagIndex = projectData.tags.findIndex((t) => t.id === input.tagId);\n if (tagIndex === -1) {\n return {\n success: false,\n error: `Tag with ID '${input.tagId}' not found in project '${input.projectId}'`,\n };\n }\n\n const tag = projectData.tags[tagIndex];\n\n // Remove tag from all tasks that use it\n const now = new Date().toISOString();\n let tasksUpdated = 0;\n for (const task of projectData.tasks) {\n const tagIndexInTask = task.tags.indexOf(input.tagId);\n if (tagIndexInTask !== -1) {\n task.tags.splice(tagIndexInTask, 1);\n task.updatedAt = now;\n tasksUpdated++;\n }\n }\n\n projectData.tags.splice(tagIndex, 1);\n projectData.project.updatedAt = now;\n\n const filePath = storage.getFilePath(input.projectId);\n const { writeJsonFile } = await import('../utils/file-helpers.js');\n await writeJsonFile(filePath, projectData);\n\n return {\n success: true,\n data: {\n deleted: true,\n tag,\n tasksUpdated,\n },\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to delete tag',\n };\n }\n },\n};\n\nexport const getTasksByTagTool = {\n name: 'get_tasks_by_tag',\n description: 'Get all tasks that have a specific tag',\n inputSchema: z.object({\n projectId: z.string().min(1, 'Project ID is required'),\n tagName: z.string().min(1, 'Tag name is required'),\n }),\n async execute(input: { projectId: string; tagName: string }) {\n try {\n const projectData = await storage.readProject(input.projectId);\n if (!projectData) {\n return {\n success: false,\n error: `Project with ID '${input.projectId}' not found`,\n };\n }\n\n // Find tag by name\n const tag = projectData.tags.find(\n (t) => t.name.toLowerCase() === input.tagName.toLowerCase()\n );\n\n if (!tag) {\n return {\n success: false,\n error: `Tag with name '${input.tagName}' not found in project '${input.projectId}'`,\n };\n }\n\n // Find all tasks with this tag\n const tasks = projectData.tasks.filter((t) => t.tags.includes(tag.id));\n\n return {\n success: true,\n data: {\n tag,\n tasks,\n count: tasks.length,\n },\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to get tasks by tag',\n };\n }\n },\n};\n","import { createServer } from '../web/server.js';\nimport open from 'open';\nimport type { Server } from 'http';\n\nlet activeServer: Server | null = null;\nlet activePort: number | null = null;\n\nfunction getServerPort(server: Server): number | null {\n const address = server.address();\n\n if (address && typeof address === 'object' && 'port' in address) {\n return typeof address.port === 'number' ? address.port : null;\n }\n\n return null;\n}\n\nasync function closeServer(server: Server): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n server.close((error) => {\n if (error) {\n reject(error);\n return;\n }\n\n resolve();\n });\n\n const forceCloseServer = server as {\n closeAllConnections?: () => void;\n closeIdleConnections?: () => void;\n };\n forceCloseServer.closeIdleConnections?.();\n forceCloseServer.closeAllConnections?.();\n });\n}\n\nasync function openBrowser(url: string): Promise<void> {\n try {\n await open(url);\n } catch (error) {\n console.error('Failed to open browser:', error);\n }\n}\n\nexport const openWebInterfaceTool = {\n name: 'open_web_interface',\n description: 'Open web visualization interface',\n parameters: {\n type: 'object',\n properties: {\n port: {\n type: 'number',\n description: 'Port to run the web interface on (default: 7860)',\n },\n },\n },\n async execute(args: { port?: number }) {\n const requestedPort = args.port || 7860;\n\n if (activeServer) {\n const runningPort = getServerPort(activeServer) ?? activePort;\n\n if (runningPort !== requestedPort) {\n throw new Error(`Web interface is already running on port ${runningPort ?? 'unknown'}. Please close it before opening a different port.`);\n }\n\n const url = `http://localhost:${runningPort ?? requestedPort}`;\n await openBrowser(url);\n\n return { \n message: 'Web interface is already running',\n url,\n };\n }\n\n const url = `http://localhost:${requestedPort}`;\n\n try {\n activeServer = await createServer(requestedPort);\n activePort = requestedPort;\n await openBrowser(url);\n\n return {\n message: 'Web interface started successfully and opened in browser',\n url,\n };\n } catch (error) {\n activeServer = null;\n activePort = null;\n\n const errorMessage = error instanceof Error ? error.message : String(error);\n throw new Error(`Failed to start web interface: ${errorMessage}`);\n }\n }\n};\n\nexport const closeWebInterfaceTool = {\n name: 'close_web_interface',\n description: 'Close web visualization interface',\n parameters: {\n type: 'object',\n properties: {},\n },\n async execute() {\n if (!activeServer) {\n return { message: 'Web interface is not running' };\n }\n\n try {\n await closeServer(activeServer);\n activeServer = null;\n activePort = null;\n return { message: 'Web interface stopped' };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n throw new Error(`Failed to stop web interface: ${errorMessage}`);\n }\n }\n};\n","import express from 'express';\nimport * as path from 'path';\nimport type { Server } from 'http';\nimport { storage } from '../storage/index.js';\n\nexport function createServer(port: number = 7860): Promise<Server> {\n return new Promise((resolve, reject) => {\n const app = express();\n\n app.use(express.json());\n\n app.get('/api/projects', async (_req, res) => {\n try {\n const projects = await storage.listProjects();\n res.json(projects);\n } catch (error) {\n res.status(500).json({ error: (error as Error).message });\n }\n });\n\n app.get('/api/projects/:id', async (req, res) => {\n try {\n const project = await storage.readProject(req.params.id);\n if (!project) {\n res.status(404).json({ error: 'Project not found' });\n return;\n }\n res.json(project);\n } catch (error) {\n res.status(500).json({ error: (error as Error).message });\n }\n });\n\n app.get('/api/tasks', async (req, res) => {\n try {\n const filters: Record<string, unknown> = { ...req.query };\n\n // Convert includeCompleted from string to boolean\n if (filters.includeCompleted !== undefined) {\n filters.includeCompleted = filters.includeCompleted === 'true';\n }\n\n const tasks = await storage.searchTasks(filters as any);\n res.json(tasks);\n } catch (error) {\n res.status(500).json({ error: (error as Error).message });\n }\n });\n\n app.post('/api/projects', async (req, res) => {\n try {\n const project = await storage.createProject(req.body);\n res.json({ success: true, data: project });\n } catch (error) {\n res.status(500).json({ error: (error as Error).message });\n }\n });\n\n app.put('/api/projects', async (req, res) => {\n try {\n const { projectId, ...updateData } = req.body;\n const project = await storage.updateProject(projectId, updateData);\n res.json({ success: true, data: project });\n } catch (error) {\n res.status(500).json({ error: (error as Error).message });\n }\n });\n\n app.delete('/api/projects', async (req, res) => {\n try {\n const { projectId } = req.query;\n await storage.deleteProject(projectId as string);\n res.json({ success: true });\n } catch (error) {\n res.status(500).json({ error: (error as Error).message });\n }\n });\n\n app.post('/api/tasks', async (req, res) => {\n try {\n const { projectId, ...taskData } = req.body;\n const projectData = await storage.readProject(projectId);\n if (!projectData) {\n res.status(404).json({ error: 'Project not found' });\n return;\n }\n const now = new Date().toISOString();\n const task = {\n id: `task_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`,\n projectId,\n ...taskData,\n status: taskData.status || 'todo',\n priority: taskData.priority || 'medium',\n tags: taskData.tags || [],\n dueDate: taskData.dueDate || null,\n assignee: taskData.assignee || null,\n createdAt: now,\n updatedAt: now,\n completedAt: null,\n };\n projectData.tasks.push(task);\n projectData.project.updatedAt = now;\n const filePath = storage.getFilePath(projectId);\n const { writeJsonFile } = await import('../utils/file-helpers.js');\n await writeJsonFile(filePath, projectData);\n res.json({ success: true, data: task });\n } catch (error) {\n res.status(500).json({ error: (error as Error).message });\n }\n });\n\n app.put('/api/tasks', async (req, res) => {\n try {\n const { projectId, taskId, ...updateData } = req.body;\n const projectData = await storage.readProject(projectId);\n if (!projectData) {\n res.status(404).json({ error: 'Project not found' });\n return;\n }\n const taskIndex = projectData.tasks.findIndex((t: any) => t.id === taskId);\n if (taskIndex === -1) {\n res.status(404).json({ error: 'Task not found' });\n return;\n }\n const now = new Date().toISOString();\n const existingTask = projectData.tasks[taskIndex];\n const updatedTask = {\n ...existingTask,\n ...updateData,\n id: existingTask.id,\n projectId: existingTask.projectId,\n createdAt: existingTask.createdAt,\n updatedAt: now,\n completedAt: updateData.status === 'done' && existingTask.status !== 'done'\n ? now\n : updateData.status && updateData.status !== 'done'\n ? null\n : existingTask.completedAt,\n };\n projectData.tasks[taskIndex] = updatedTask;\n projectData.project.updatedAt = now;\n const filePath = storage.getFilePath(projectId);\n const { writeJsonFile } = await import('../utils/file-helpers.js');\n await writeJsonFile(filePath, projectData);\n res.json({ success: true, data: updatedTask });\n } catch (error) {\n res.status(500).json({ error: (error as Error).message });\n }\n });\n\n app.delete('/api/tasks', async (req, res) => {\n try {\n const { projectId, taskId } = req.query;\n const projectData = await storage.readProject(projectId as string);\n if (!projectData) {\n res.status(404).json({ error: 'Project not found' });\n return;\n }\n const taskIndex = projectData.tasks.findIndex((t: any) => t.id === taskId);\n if (taskIndex === -1) {\n res.status(404).json({ error: 'Task not found' });\n return;\n }\n projectData.tasks.splice(taskIndex, 1);\n projectData.project.updatedAt = new Date().toISOString();\n const filePath = storage.getFilePath(projectId as string);\n const { writeJsonFile } = await import('../utils/file-helpers.js');\n await writeJsonFile(filePath, projectData);\n res.json({ success: true });\n } catch (error) {\n res.status(500).json({ error: (error as Error).message });\n }\n });\n\n app.get('/api/backup', async (_req, res) => {\n try {\n const backup = await storage.exportAllData();\n const filename = `roadmap-skill-backup-${new Date().toISOString().split('T')[0]}.json`;\n res.setHeader('Content-Type', 'application/json');\n res.setHeader('Content-Disposition', `attachment; filename=\"${filename}\"`);\n res.json(backup);\n } catch (error) {\n res.status(500).json({ error: (error as Error).message });\n }\n });\n\n app.post('/api/backup', async (req, res) => {\n try {\n const result = await storage.importAllData(req.body);\n res.json(result);\n } catch (error) {\n res.status(400).json({\n success: false,\n error: (error as Error).message,\n });\n }\n });\n\n const distPath = path.join(process.cwd(), 'dist', 'web', 'app');\n app.use(express.static(distPath));\n\n app.get('*', (req, res) => {\n if (req.path.startsWith('/api')) {\n res.status(404).json({ error: 'API not found' });\n return;\n }\n res.sendFile(path.join(distPath, 'index.html'));\n });\n\n const server = app.listen(port, '127.0.0.1');\n\n server.once('listening', () => {\n console.log(`Web interface server running at http://localhost:${port}`);\n resolve(server);\n });\n\n server.once('error', (error: NodeJS.ErrnoException) => {\n if (error.code === 'EADDRINUSE') {\n reject(new Error(`Port ${port} is already in use`));\n return;\n }\n\n reject(error);\n });\n });\n}\n","import { z } from 'zod';\nimport * as path from 'path';\nimport * as fs from 'fs/promises';\nimport { storage } from '../storage/index.js';\nimport type { CreateProjectInput, Tag, Task } from '../models/index.js';\n\nconst TEMPLATES_DIR = path.join(process.cwd(), 'templates');\n\ninterface TemplateMetadata {\n name: string;\n description: string;\n projectType: string;\n tasks: Array<{\n title: string;\n description: string;\n priority: 'low' | 'medium' | 'high' | 'critical';\n tags: string[];\n estimatedHours?: number;\n }>;\n tags: Array<{\n name: string;\n color: string;\n }>;\n}\n\nasync function getTemplateFiles(): Promise<string[]> {\n try {\n const files = await fs.readdir(TEMPLATES_DIR);\n return files.filter((f) => f.endsWith('.json'));\n } catch {\n return [];\n }\n}\n\nasync function loadTemplate(templateName: string): Promise<TemplateMetadata | null> {\n try {\n const fileName = templateName.endsWith('.json') ? templateName : `${templateName}.json`;\n const filePath = path.join(TEMPLATES_DIR, fileName);\n const content = await fs.readFile(filePath, 'utf-8');\n return JSON.parse(content) as TemplateMetadata;\n } catch {\n return null;\n }\n}\n\nfunction generateId(prefix: string): string {\n return `${prefix}_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;\n}\n\nexport const listTemplatesTool = {\n name: 'list_templates',\n description: 'List all available project templates',\n inputSchema: z.object({}),\n async execute() {\n try {\n const templateFiles = await getTemplateFiles();\n const templates = [];\n\n for (const file of templateFiles) {\n const template = await loadTemplate(file);\n if (template) {\n templates.push({\n name: file.replace('.json', ''),\n displayName: template.name,\n description: template.description,\n projectType: template.projectType,\n taskCount: template.tasks.length,\n tagCount: template.tags.length,\n });\n }\n }\n\n return {\n success: true,\n data: templates,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to list templates',\n };\n }\n },\n};\n\nexport const getTemplateTool = {\n name: 'get_template',\n description: 'Get detailed information about a specific template',\n inputSchema: z.object({\n templateName: z.string().min(1, 'Template name is required'),\n }),\n async execute(input: { templateName: string }) {\n try {\n const template = await loadTemplate(input.templateName);\n\n if (!template) {\n return {\n success: false,\n error: `Template '${input.templateName}' not found`,\n };\n }\n\n return {\n success: true,\n data: {\n name: template.name,\n description: template.description,\n projectType: template.projectType,\n tasks: template.tasks.map((t) => ({\n title: t.title,\n description: t.description,\n priority: t.priority,\n tags: t.tags,\n estimatedHours: t.estimatedHours,\n })),\n tags: template.tags,\n },\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to get template',\n };\n }\n },\n};\n\nexport const applyTemplateTool = {\n name: 'apply_template',\n description: 'Create a new project from a template',\n inputSchema: z.object({\n templateName: z.string().min(1, 'Template name is required'),\n projectName: z.string().min(1, 'Project name is required'),\n description: z.string().default(''),\n startDate: z.string().regex(/^\\d{4}-\\d{2}-\\d{2}$/, 'Date must be in YYYY-MM-DD format').optional(),\n targetDate: z.string().regex(/^\\d{4}-\\d{2}-\\d{2}$/, 'Date must be in YYYY-MM-DD format').optional(),\n }),\n async execute(input: {\n templateName: string;\n projectName: string;\n description: string;\n startDate?: string;\n targetDate?: string;\n }) {\n try {\n const template = await loadTemplate(input.templateName);\n\n if (!template) {\n return {\n success: false,\n error: `Template '${input.templateName}' not found`,\n };\n }\n\n const projectInput: CreateProjectInput = {\n name: input.projectName,\n description: input.description || template.description,\n projectType: template.projectType as 'roadmap' | 'skill-tree' | 'kanban',\n startDate: input.startDate || new Date().toISOString().split('T')[0],\n targetDate: input.targetDate || new Date().toISOString().split('T')[0],\n };\n\n const projectData = await storage.createProject(projectInput);\n const projectId = projectData.project.id;\n const now = new Date().toISOString();\n\n const tagNameToId: Map<string, string> = new Map();\n const tags: Tag[] = [];\n\n for (const templateTag of template.tags) {\n const tag: Tag = {\n id: generateId('tag'),\n name: templateTag.name,\n color: templateTag.color,\n description: '',\n createdAt: now,\n };\n tags.push(tag);\n tagNameToId.set(templateTag.name, tag.id);\n }\n\n const tasks: Task[] = [];\n\n for (const templateTask of template.tasks) {\n const taskTagIds = templateTask.tags\n .map((tagName) => tagNameToId.get(tagName))\n .filter((id): id is string => id !== undefined);\n\n const task: Task = {\n id: generateId('task'),\n projectId,\n title: templateTask.title,\n description: templateTask.description,\n status: 'todo',\n priority: templateTask.priority,\n tags: taskTagIds,\n dueDate: null,\n assignee: null,\n createdAt: now,\n updatedAt: now,\n completedAt: null,\n };\n tasks.push(task);\n }\n\n projectData.tags = tags;\n projectData.tasks = tasks;\n projectData.project.updatedAt = now;\n\n const filePath = storage.getFilePath(projectId);\n const { writeJsonFile } = await import('../utils/file-helpers.js');\n await writeJsonFile(filePath, projectData);\n\n return {\n success: true,\n data: {\n project: projectData.project,\n taskCount: tasks.length,\n tagCount: tags.length,\n tasksCreated: tasks.map((t) => ({\n id: t.id,\n title: t.title,\n priority: t.priority,\n })),\n tagsCreated: tags.map((t) => ({\n id: t.id,\n name: t.name,\n color: t.color,\n })),\n },\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to apply template',\n };\n }\n },\n};\n","export {\n projectResources,\n handleResourceRequest,\n getAllResources,\n} from './project-resources.js';\n","import type {\n Resource,\n TextResourceContents,\n} from '@modelcontextprotocol/sdk/types.js';\nimport { storage } from '../storage/index.js';\n\n/**\n * Resource definitions for roadmap projects\n */\nexport const projectResources: Resource[] = [\n {\n uri: 'roadmap://projects',\n name: 'Project List',\n mimeType: 'application/json',\n description: 'Returns a list of all projects with basic metadata',\n },\n {\n uri: 'roadmap://project/{projectId}',\n name: 'Project Details',\n mimeType: 'application/json',\n description: 'Returns detailed information about a specific project including tasks, milestones, and tags',\n },\n {\n uri: 'roadmap://project/{projectId}/tasks',\n name: 'Project Tasks',\n mimeType: 'application/json',\n description: 'Returns all tasks for a specific project',\n },\n {\n uri: 'roadmap://project/{projectId}/progress',\n name: 'Project Progress',\n mimeType: 'application/json',\n description: 'Returns progress statistics for a specific project',\n },\n];\n\n/**\n * Resource URI patterns for matching\n */\nconst RESOURCE_PATTERNS = {\n projectList: /^roadmap:\\/\\/projects$/,\n projectDetails: /^roadmap:\\/\\/project\\/([^/]+)$/,\n projectTasks: /^roadmap:\\/\\/project\\/([^/]+)\\/tasks$/,\n projectProgress: /^roadmap:\\/\\/project\\/([^/]+)\\/progress$/,\n};\n\n/**\n * Handle resource requests\n * @param uri - The resource URI\n * @returns Resource contents or null if not found\n */\nexport async function handleResourceRequest(\n uri: string\n): Promise<TextResourceContents | null> {\n // Project List: roadmap://projects\n if (RESOURCE_PATTERNS.projectList.test(uri)) {\n return await getProjectListResource(uri);\n }\n\n // Project Details: roadmap://project/{projectId}\n const projectDetailsMatch = uri.match(RESOURCE_PATTERNS.projectDetails);\n if (projectDetailsMatch && !uri.includes('/tasks') && !uri.includes('/progress')) {\n const projectId = projectDetailsMatch[1];\n return await getProjectDetailsResource(uri, projectId);\n }\n\n // Project Tasks: roadmap://project/{projectId}/tasks\n const projectTasksMatch = uri.match(RESOURCE_PATTERNS.projectTasks);\n if (projectTasksMatch) {\n const projectId = projectTasksMatch[1];\n return await getProjectTasksResource(uri, projectId);\n }\n\n // Project Progress: roadmap://project/{projectId}/progress\n const projectProgressMatch = uri.match(RESOURCE_PATTERNS.projectProgress);\n if (projectProgressMatch) {\n const projectId = projectProgressMatch[1];\n return await getProjectProgressResource(uri, projectId);\n }\n\n return null;\n}\n\n/**\n * Get project list resource\n */\nasync function getProjectListResource(uri: string): Promise<TextResourceContents> {\n const projects = await storage.listProjects();\n\n const data = {\n projects: projects.map(p => ({\n id: p.project.id,\n name: p.project.name,\n description: p.project.description,\n status: p.project.status,\n projectType: p.project.projectType,\n taskCount: p.taskCount,\n milestoneCount: p.milestoneCount,\n updatedAt: p.project.updatedAt,\n })),\n totalCount: projects.length,\n };\n\n return {\n uri,\n mimeType: 'application/json',\n text: JSON.stringify(data, null, 2),\n };\n}\n\n/**\n * Get project details resource\n */\nasync function getProjectDetailsResource(\n uri: string,\n projectId: string\n): Promise<TextResourceContents | null> {\n const projectData = await storage.readProject(projectId);\n\n if (!projectData) {\n return null;\n }\n\n const data = {\n project: projectData.project,\n milestones: projectData.milestones,\n tasks: projectData.tasks,\n tags: projectData.tags,\n stats: {\n taskCount: projectData.tasks.length,\n milestoneCount: projectData.milestones.length,\n tagCount: projectData.tags.length,\n completedTasks: projectData.tasks.filter(t => t.status === 'done').length,\n inProgressTasks: projectData.tasks.filter(t => t.status === 'in-progress').length,\n },\n };\n\n return {\n uri,\n mimeType: 'application/json',\n text: JSON.stringify(data, null, 2),\n };\n}\n\n/**\n * Get project tasks resource\n */\nasync function getProjectTasksResource(\n uri: string,\n projectId: string\n): Promise<TextResourceContents | null> {\n const projectData = await storage.readProject(projectId);\n\n if (!projectData) {\n return null;\n }\n\n const tasksByStatus = {\n todo: projectData.tasks.filter(t => t.status === 'todo'),\n inProgress: projectData.tasks.filter(t => t.status === 'in-progress'),\n review: projectData.tasks.filter(t => t.status === 'review'),\n done: projectData.tasks.filter(t => t.status === 'done'),\n };\n\n const data = {\n projectId,\n projectName: projectData.project.name,\n tasks: projectData.tasks,\n tasksByStatus,\n summary: {\n total: projectData.tasks.length,\n todo: tasksByStatus.todo.length,\n inProgress: tasksByStatus.inProgress.length,\n review: tasksByStatus.review.length,\n done: tasksByStatus.done.length,\n },\n };\n\n return {\n uri,\n mimeType: 'application/json',\n text: JSON.stringify(data, null, 2),\n };\n}\n\n/**\n * Get project progress resource\n */\nasync function getProjectProgressResource(\n uri: string,\n projectId: string\n): Promise<TextResourceContents | null> {\n const projectData = await storage.readProject(projectId);\n\n if (!projectData) {\n return null;\n }\n\n const tasks = projectData.tasks;\n const totalTasks = tasks.length;\n const completedTasks = tasks.filter(t => t.status === 'done').length;\n const inProgressTasks = tasks.filter(t => t.status === 'in-progress').length;\n const reviewTasks = tasks.filter(t => t.status === 'review').length;\n const todoTasks = tasks.filter(t => t.status === 'todo').length;\n\n const completionPercentage = totalTasks > 0 ? Math.round((completedTasks / totalTasks) * 100) : 0;\n\n const milestones = projectData.milestones;\n const completedMilestones = milestones.filter(m => m.completedAt !== null).length;\n const milestoneProgress = milestones.length > 0 ? Math.round((completedMilestones / milestones.length) * 100) : 0;\n\n // Calculate overdue tasks\n const now = new Date().toISOString();\n const overdueTasks = tasks.filter(t => \n t.dueDate && \n t.dueDate < now && \n t.status !== 'done'\n );\n\n // Priority breakdown\n const priorityBreakdown = {\n critical: tasks.filter(t => t.priority === 'critical').length,\n high: tasks.filter(t => t.priority === 'high').length,\n medium: tasks.filter(t => t.priority === 'medium').length,\n low: tasks.filter(t => t.priority === 'low').length,\n };\n\n const data = {\n projectId,\n projectName: projectData.project.name,\n projectStatus: projectData.project.status,\n dates: {\n startDate: projectData.project.startDate,\n targetDate: projectData.project.targetDate,\n daysRemaining: calculateDaysRemaining(projectData.project.targetDate),\n },\n taskProgress: {\n total: totalTasks,\n completed: completedTasks,\n inProgress: inProgressTasks,\n review: reviewTasks,\n todo: todoTasks,\n completionPercentage,\n },\n milestoneProgress: {\n total: milestones.length,\n completed: completedMilestones,\n percentage: milestoneProgress,\n },\n overdueTasks: {\n count: overdueTasks.length,\n tasks: overdueTasks.map(t => ({\n id: t.id,\n title: t.title,\n dueDate: t.dueDate,\n status: t.status,\n })),\n },\n priorityBreakdown,\n lastUpdated: projectData.project.updatedAt,\n };\n\n return {\n uri,\n mimeType: 'application/json',\n text: JSON.stringify(data, null, 2),\n };\n}\n\n/**\n * Calculate days remaining until target date\n */\nfunction calculateDaysRemaining(targetDate: string): number | null {\n const target = new Date(targetDate);\n const now = new Date();\n const diffTime = target.getTime() - now.getTime();\n const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24));\n return diffDays > 0 ? diffDays : null;\n}\n\n/**\n * Get all available resources\n */\nexport function getAllResources(): Resource[] {\n return projectResources;\n}\n","export {\n projectPrompts,\n getRecommendNextTasksPrompt,\n getAutoPrioritizePrompt,\n getEnhanceTaskDetailsPrompt,\n getQuickCapturePrompt,\n getPromptByName,\n getAllPrompts,\n} from './project-prompts.js';\n","import type {\n Prompt,\n GetPromptResult,\n} from '@modelcontextprotocol/sdk/types.js';\n\n/**\n * Curated Prompts - Help Agents use Roadmap Skill more intelligently\n */\nexport const projectPrompts: Prompt[] = [\n {\n name: 'recommendNextTasks',\n description: 'Intelligently recommend the next priority tasks based on urgency, due dates, and project status',\n arguments: [\n {\n name: 'projectId',\n description: 'Specific project ID (optional; if not provided, analyze all projects)',\n required: false,\n },\n {\n name: 'limit',\n description: 'Number of tasks to recommend (default: 3)',\n required: false,\n },\n ],\n },\n {\n name: 'autoPrioritize',\n description: 'Automatically analyze tasks and intelligently adjust priorities, considering due dates, dependencies, and project importance',\n arguments: [\n {\n name: 'projectId',\n description: 'Specific project ID (optional; if not provided, analyze all projects)',\n required: false,\n },\n ],\n },\n {\n name: 'enhanceTaskDetails',\n description: 'Intelligently enhance task details, including description, acceptance criteria, subtasks, and required resources',\n arguments: [\n {\n name: 'taskId',\n description: 'Task ID to be enhanced',\n required: true,\n },\n ],\n },\n {\n name: 'quickCapture',\n description: 'Quickly capture ideas/tasks, auto-categorize and suggest priorities',\n arguments: [\n {\n name: 'idea',\n description: 'Idea or task description to be captured',\n required: true,\n },\n {\n name: 'projectId',\n description: 'Target project ID (optional)',\n required: false,\n },\n ],\n },\n];\n\n/**\n * Intelligently recommend next tasks\n * Analyze all tasks and recommend optimal execution order based on priority, due dates, and dependencies\n */\nexport function getRecommendNextTasksPrompt(projectId?: string, limit?: string): GetPromptResult {\n const context = projectId\n ? `Analyze tasks for project ${projectId}`\n : 'Analyze tasks for all active projects';\n\n const taskLimit = limit ? parseInt(limit, 10) : 3;\n\n return {\n description: 'Intelligent Task Recommendation Assistant',\n messages: [\n {\n role: 'user',\n content: {\n type: 'text',\n text: `${context}, please recommend the ${taskLimit} tasks I should prioritize next.\n\n## Recommendation Logic (sorted by priority):\n\n### 1. Urgent and Important (Critical priority + Near due date)\n- Critical tasks due today or tomorrow\n- Overdue high-priority tasks\n\n### 2. High-Value Tasks (High priority + Clear due date)\n- High priority tasks due this week\n- Critical path tasks blocking other work\n\n### 3. Quick Wins (Medium priority + Short estimated time)\n- Medium tasks completable in 1-2 hours\n- Tasks that can significantly boost project progress\n\n### 4. Planned Work\n- Tasks marked \"in-progress\" but not yet completed\n- Normal priority tasks due soon\n\n## Please perform the following steps:\n\n1. **List all pending tasks** (status = todo or in-progress)\n2. **Filter high-priority tasks**: critical and high\n3. **Check due dates**: Identify tasks due soon or overdue\n4. **Analyze blocking relationships**: Identify tasks blocking others\n5. **Generate recommendation list**: Provide ${taskLimit} tasks to prioritize with reasons\n\n## Output Format:\n\n### Immediate Action (Critical)\n1. **Task Name** (Project Name)\n - Reason: [Why this task is most urgent]\n - Suggested Action: [What specifically to do]\n\n### Today's Focus (High)\n2. **Task Name** (Project Name)\n - Reason: [Why this task is important]\n - Suggested Action: [What specifically to do]\n\n### Follow-up\n3. **Task Name** (Project Name)\n - Reason: [Why this should be done next]\n - Suggested Action: [What specifically to do]\n\nPlease use the list_tasks tool to fetch task data, then provide intelligent recommendations.\n\n## Important Reminder\nWhen you start working on recommended tasks, please:\n1. Use update_task to set task status to in-progress\n2. After completing the task, use update_task to set status to done\n3. If blocked or have issues, document in description and update status to review\n\nKeep task status synchronized with actual progress!`,\n },\n },\n ],\n };\n}\n\n/**\n * Automatic Priority Optimization\n * Automatically adjust priorities based on due dates, project progress, and task dependencies\n */\nexport function getAutoPrioritizePrompt(projectId?: string): GetPromptResult {\n const context = projectId\n ? `Analyze task priorities for project ${projectId}`\n : 'Analyze task priorities for all projects';\n\n return {\n description: 'Intelligent Priority Optimization Assistant',\n messages: [\n {\n role: 'user',\n content: {\n type: 'text',\n text: `${context}, please automatically analyze and suggest priority adjustments.\n\n## Priority Adjustment Rules:\n\n### Conditions to Upgrade to Critical:\n- [ ] Due within 48 hours and not completed\n- [ ] Blocking other high/critical tasks\n- [ ] On project critical path and behind schedule\n- [ ] Has external dependencies (e.g., clients, partners) and time is tight\n\n### Conditions to Upgrade to High:\n- [ ] Due within 1 week\n- [ ] Prerequisite for important milestone\n- [ ] Stuck in \"in-progress\" state for too long (over 3 days)\n- [ ] Affects work of multiple team members\n\n### Conditions to Downgrade to Medium/Low:\n- [ ] Due date is far away (>2 weeks) and no dependencies\n- [ ] \"Nice to have\" feature rather than core functionality\n- [ ] Not needed in current phase, can be postponed\n\n### Other Considerations:\n- **Overall project progress**: Tasks for behind-schedule projects should be prioritized higher\n- **Resource availability**: If resources are tight, focus on highest priority\n- **Risk factors**: High-risk tasks should be addressed earlier\n\n## Please perform the following steps:\n\n1. **Get all tasks**: Use list_tasks to fetch task list\n2. **Analyze each task**:\n - Check gap between due date and current date\n - Identify task dependency relationships\n - Evaluate overall project health\n3. **Generate adjustment suggestions**: List tasks needing priority changes with reasons\n4. **Batch update**: Use batch_update_tasks to execute priority adjustments\n\n## Output Format:\n\n### Suggested Upgrade to Critical\n| Task | Current Priority | Suggested Priority | Reason |\n|------|-----------------|-------------------|--------|\n| XXX | high → critical | Due tomorrow |\n\n### Suggested Upgrade to High\n| Task | Current Priority | Suggested Priority | Reason |\n|------|-----------------|-------------------|--------|\n| XXX | medium → high | Blocking follow-up tasks |\n\n### Suggested Downgrade\n| Task | Current Priority | Suggested Priority | Reason |\n|------|-----------------|-------------------|--------|\n| XXX | high → medium | Can be postponed |\n\n### Keep Unchanged (Priorities are reasonable)\n- List tasks with reasonable priority settings\n\nPlease provide analysis results, then execute batch update after user confirmation.`,\n },\n },\n ],\n };\n}\n\n/**\n * Intelligent Task Detail Enhancement\n * Auto-complete descriptions, acceptance criteria, etc. based on task title and context\n */\nexport function getEnhanceTaskDetailsPrompt(taskId: string): GetPromptResult {\n return {\n description: 'Task Detail Enhancement Assistant',\n messages: [\n {\n role: 'user',\n content: {\n type: 'text',\n text: `Please help me enhance the details for task ${taskId}.\n\n## Enhancement Content:\n\n### 1. Detailed Description\n- Specific content and background of the task\n- Why this task needs to be done\n- Expected business or technical value\n\n### 2. Acceptance Criteria (Definition of Done)\nList clear completion standards, for example:\n- [ ] Feature implemented and locally tested\n- [ ] Code passes Code Review\n- [ ] Related documentation updated\n- [ ] Unit test coverage > 80%\n\n### 3. Technical/Implementation Details\n- Tech stack or modules involved\n- Files that may need modification\n- Potential challenges or considerations\n\n### 4. Related Resources\n- Related documentation links\n- Reference implementations or example code\n- People to consult\n\n### 5. Subtask Suggestions (if needed)\nIf the task is complex, suggest breaking it down:\n- Subtask 1: ...\n- Subtask 2: ...\n- Subtask 3: ...\n\n## Please perform the following steps:\n\n1. **Get task info**: Use get_task to view current task details\n2. **Get project context**: Use get_project to understand project background\n3. **Analyze task type**:\n - If development task: Add technical details, code locations\n - If design task: Add design specs, review criteria\n - If documentation task: Add doc structure, references\n - If testing task: Add test scenarios, coverage scope\n4. **Generate enhancement content**: Use update_task to update task description\n\n## Updated task should include:\n\n\\`\\`\\`\n## Background\n[Task background and purpose]\n\n## Acceptance Criteria\n- [ ] [Standard 1]\n- [ ] [Standard 2]\n- [ ] [Standard 3]\n\n## Technical Details\n- Modules: [module name]\n- Key files: [file path]\n- Notes: [important reminders]\n\n## Related Resources\n- Documentation: [link]\n- References: [link]\n\\`\\`\\`\n\nPlease fetch task info first, then provide detailed enhancement suggestions.`,\n },\n },\n ],\n };\n}\n\n/**\n * Quick Idea Capture\n * Auto-categorize, suggest priorities, recommend projects\n */\nexport function getQuickCapturePrompt(idea: string, projectId?: string): GetPromptResult {\n const projectContext = projectId\n ? `Add to project ${projectId}`\n : 'Auto-select the most suitable project';\n\n return {\n description: 'Quick Capture Assistant',\n messages: [\n {\n role: 'user',\n content: {\n type: 'text',\n text: `I want to quickly capture an idea/task: \"${idea}\"\n\n${projectContext}\n\n## Please help me complete the following steps:\n\n### 1. Task Information Extraction\nExtract from description:\n- **Task Title**: Concise and clear title (start with verb)\n- **Task Description**: Add context and details\n- **Task Type**: bug / feature / refactor / docs / chore\n- **Estimated Priority**: critical / high / medium / low (based on urgency in description)\n\n### 2. Project Recommendation (if no project specified)\nIf user didn't specify a project, please:\n- List all active projects\n- Analyze which project the task content is most relevant to\n- Recommend the most suitable project\n\n### 3. Tag Suggestions\nSuggest relevant tags:\n- Type tags: bug, feature, refactor, docs\n- Priority tags: urgent, important\n- Domain tags: frontend, backend, design, testing (if applicable)\n\n### 4. Generate Task\nUse create_task to create the task\n\n### 5. Status Recommendation\nAfter creating the task, if you start working on it immediately, consider setting the status to in-progress. Use update_task to keep progress updated during work, and mark as done when completed.\n\n## Example:\n\n**Input**: \"User reported login page doesn't display correctly on mobile\"\n\n**Output**:\n- Title: Fix login page mobile responsiveness issue\n- Description: User reported the login page displays abnormally on mobile devices, need to check responsive layout.\n- Type: Bug\n- Priority: High (affects user experience)\n- Suggested Tags: bug, frontend, mobile\n- Recommended Project: [Recommend if there's a web project]\n\n## Current Idea Analysis:\n\nIdea: \"${idea}\"\n\nPlease analyze and generate task suggestions. After user confirmation, execute create_task to create the task.`,\n },\n },\n ],\n };\n}\n\n/**\n * Get Prompt by name\n */\nexport function getPromptByName(name: string, args?: Record<string, string>): GetPromptResult | null {\n switch (name) {\n case 'recommendNextTasks':\n return getRecommendNextTasksPrompt(args?.projectId, args?.limit);\n case 'autoPrioritize':\n return getAutoPrioritizePrompt(args?.projectId);\n case 'enhanceTaskDetails':\n return getEnhanceTaskDetailsPrompt(args?.taskId || '');\n case 'quickCapture':\n return getQuickCapturePrompt(args?.idea || '', args?.projectId);\n default:\n return null;\n }\n}\n\n/**\n * Get all available Prompts\n */\nexport function getAllPrompts(): Prompt[] {\n return projectPrompts;\n}\n"],"mappings":"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","names":["path","path","fs","z","z","writeJsonFile","z","z","writeJsonFile","existingTag","path","writeJsonFile","url","z","path","fs","z","writeJsonFile","createServer"]}
|