@langadventurellc/task-trellis-mcp 1.2.2 → 1.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (191) hide show
  1. package/README.md +5 -4
  2. package/dist/__tests__/copyBasicClaudeAgents.test.d.ts +2 -0
  3. package/dist/__tests__/copyBasicClaudeAgents.test.d.ts.map +1 -0
  4. package/dist/__tests__/copyBasicClaudeAgents.test.js +24 -0
  5. package/dist/__tests__/copyBasicClaudeAgents.test.js.map +1 -0
  6. package/dist/__tests__/e2e/crud/createObject.e2e.test.js +4 -4
  7. package/dist/__tests__/e2e/crud/createObject.e2e.test.js.map +1 -1
  8. package/dist/__tests__/e2e/crud/fileValidation.e2e.test.js +4 -4
  9. package/dist/__tests__/e2e/crud/fileValidation.e2e.test.js.map +1 -1
  10. package/dist/__tests__/e2e/crud/getObject.e2e.test.js +3 -3
  11. package/dist/__tests__/e2e/crud/getObject.e2e.test.js.map +1 -1
  12. package/dist/__tests__/e2e/workflow/appendLog.e2e.test.js +10 -10
  13. package/dist/__tests__/e2e/workflow/appendLog.e2e.test.js.map +1 -1
  14. package/dist/__tests__/e2e/workflow/appendModifiedFiles.e2e.test.js +1 -1
  15. package/dist/__tests__/e2e/workflow/appendModifiedFiles.e2e.test.js.map +1 -1
  16. package/dist/__tests__/e2e/workflow/getNextAvailableIssue.e2e.test.d.ts +2 -0
  17. package/dist/__tests__/e2e/workflow/getNextAvailableIssue.e2e.test.d.ts.map +1 -0
  18. package/dist/__tests__/e2e/workflow/getNextAvailableIssue.e2e.test.js +806 -0
  19. package/dist/__tests__/e2e/workflow/getNextAvailableIssue.e2e.test.js.map +1 -0
  20. package/dist/__tests__/e2e/workflow/taskLifecycle.e2e.test.js +7 -7
  21. package/dist/__tests__/e2e/workflow/taskLifecycle.e2e.test.js.map +1 -1
  22. package/dist/__tests__/serverStartup.test.js +138 -0
  23. package/dist/__tests__/serverStartup.test.js.map +1 -1
  24. package/dist/models/TrellisObject.d.ts +1 -1
  25. package/dist/models/TrellisObject.d.ts.map +1 -1
  26. package/dist/models/TrellisObjectSummary.d.ts +1 -1
  27. package/dist/models/TrellisObjectSummary.d.ts.map +1 -1
  28. package/dist/models/__tests__/isClaimable.test.js +1 -0
  29. package/dist/models/__tests__/isClaimable.test.js.map +1 -1
  30. package/dist/models/__tests__/isClosed.test.js +3 -1
  31. package/dist/models/__tests__/isClosed.test.js.map +1 -1
  32. package/dist/models/__tests__/isOpen.test.js +3 -1
  33. package/dist/models/__tests__/isOpen.test.js.map +1 -1
  34. package/dist/prompts/PromptArgument.d.ts +16 -0
  35. package/dist/prompts/PromptArgument.d.ts.map +1 -0
  36. package/dist/prompts/PromptArgument.js +3 -0
  37. package/dist/prompts/PromptArgument.js.map +1 -0
  38. package/dist/prompts/PromptManager.d.ts +48 -0
  39. package/dist/prompts/PromptManager.d.ts.map +1 -0
  40. package/dist/prompts/PromptManager.js +151 -0
  41. package/dist/prompts/PromptManager.js.map +1 -0
  42. package/dist/prompts/PromptMessage.d.ts +11 -0
  43. package/dist/prompts/PromptMessage.d.ts.map +1 -0
  44. package/dist/prompts/PromptMessage.js +3 -0
  45. package/dist/prompts/PromptMessage.js.map +1 -0
  46. package/dist/prompts/PromptParser.d.ts +7 -0
  47. package/dist/prompts/PromptParser.d.ts.map +1 -0
  48. package/dist/prompts/PromptParser.js +141 -0
  49. package/dist/prompts/PromptParser.js.map +1 -0
  50. package/dist/prompts/PromptRenderer.d.ts +38 -0
  51. package/dist/prompts/PromptRenderer.d.ts.map +1 -0
  52. package/dist/prompts/PromptRenderer.js +128 -0
  53. package/dist/prompts/PromptRenderer.js.map +1 -0
  54. package/dist/prompts/PromptsRegistry.d.ts +43 -0
  55. package/dist/prompts/PromptsRegistry.d.ts.map +1 -0
  56. package/dist/prompts/PromptsRegistry.js +76 -0
  57. package/dist/prompts/PromptsRegistry.js.map +1 -0
  58. package/dist/prompts/TrellisPrompt.d.ts +19 -0
  59. package/dist/prompts/TrellisPrompt.d.ts.map +1 -0
  60. package/dist/prompts/TrellisPrompt.js +3 -0
  61. package/dist/prompts/TrellisPrompt.js.map +1 -0
  62. package/dist/prompts/__tests__/PromptArgument.test.d.ts +2 -0
  63. package/dist/prompts/__tests__/PromptArgument.test.d.ts.map +1 -0
  64. package/dist/prompts/__tests__/PromptArgument.test.js +60 -0
  65. package/dist/prompts/__tests__/PromptArgument.test.js.map +1 -0
  66. package/dist/prompts/__tests__/PromptManager.test.d.ts +2 -0
  67. package/dist/prompts/__tests__/PromptManager.test.d.ts.map +1 -0
  68. package/dist/prompts/__tests__/PromptManager.test.js +364 -0
  69. package/dist/prompts/__tests__/PromptManager.test.js.map +1 -0
  70. package/dist/prompts/__tests__/PromptParser.test.d.ts +2 -0
  71. package/dist/prompts/__tests__/PromptParser.test.d.ts.map +1 -0
  72. package/dist/prompts/__tests__/PromptParser.test.js +237 -0
  73. package/dist/prompts/__tests__/PromptParser.test.js.map +1 -0
  74. package/dist/prompts/__tests__/PromptRenderer.test.d.ts +2 -0
  75. package/dist/prompts/__tests__/PromptRenderer.test.d.ts.map +1 -0
  76. package/dist/prompts/__tests__/PromptRenderer.test.js +325 -0
  77. package/dist/prompts/__tests__/PromptRenderer.test.js.map +1 -0
  78. package/dist/prompts/__tests__/TrellisPrompt.test.d.ts +2 -0
  79. package/dist/prompts/__tests__/TrellisPrompt.test.d.ts.map +1 -0
  80. package/dist/prompts/__tests__/TrellisPrompt.test.js +107 -0
  81. package/dist/prompts/__tests__/TrellisPrompt.test.js.map +1 -0
  82. package/dist/prompts/index.d.ts +9 -0
  83. package/dist/prompts/index.d.ts.map +1 -0
  84. package/dist/prompts/index.js +14 -0
  85. package/dist/prompts/index.js.map +1 -0
  86. package/dist/prompts/registry.d.ts +6 -0
  87. package/dist/prompts/registry.d.ts.map +1 -0
  88. package/dist/prompts/registry.js +60 -0
  89. package/dist/prompts/registry.js.map +1 -0
  90. package/dist/repositories/local/__tests__/getObjectByFilePath.test.js +5 -5
  91. package/dist/repositories/local/__tests__/getObjectByFilePath.test.js.map +1 -1
  92. package/dist/repositories/local/__tests__/getObjectFilePath.test.js +2 -2
  93. package/dist/repositories/local/__tests__/getObjectFilePath.test.js.map +1 -1
  94. package/dist/resources/basic/prompts/create-epics.md +177 -0
  95. package/dist/resources/basic/prompts/create-features.md +172 -0
  96. package/dist/resources/basic/prompts/create-project.md +128 -0
  97. package/dist/resources/basic/prompts/create-tasks.md +225 -0
  98. package/dist/resources/basic/prompts/implement-task.md +170 -0
  99. package/dist/resources/basic-claude/agents/implementation-planner.md +187 -0
  100. package/dist/resources/basic-claude/agents/issue-verifier.md +154 -0
  101. package/dist/resources/basic-claude/prompts/create-epics.md +204 -0
  102. package/dist/resources/basic-claude/prompts/create-features.md +199 -0
  103. package/dist/resources/basic-claude/prompts/create-project.md +155 -0
  104. package/dist/resources/basic-claude/prompts/create-tasks.md +252 -0
  105. package/dist/resources/basic-claude/prompts/implement-task.md +179 -0
  106. package/dist/server.js +59 -2
  107. package/dist/server.js.map +1 -1
  108. package/dist/services/TaskTrellisService.d.ts +9 -0
  109. package/dist/services/TaskTrellisService.d.ts.map +1 -1
  110. package/dist/services/local/LocalTaskTrellisService.d.ts +6 -0
  111. package/dist/services/local/LocalTaskTrellisService.d.ts.map +1 -1
  112. package/dist/services/local/LocalTaskTrellisService.js +24 -0
  113. package/dist/services/local/LocalTaskTrellisService.js.map +1 -1
  114. package/dist/services/local/__tests__/appendAffectedFiles.test.js +9 -9
  115. package/dist/services/local/__tests__/appendAffectedFiles.test.js.map +1 -1
  116. package/dist/services/local/__tests__/appendModifiedFiles.test.js +1 -1
  117. package/dist/services/local/__tests__/appendModifiedFiles.test.js.map +1 -1
  118. package/dist/services/local/__tests__/claimTask.test.js +1 -0
  119. package/dist/services/local/__tests__/claimTask.test.js.map +1 -1
  120. package/dist/services/local/__tests__/completeTask.test.js +3 -3
  121. package/dist/services/local/__tests__/completeTask.test.js.map +1 -1
  122. package/dist/services/local/__tests__/createObject.test.js +7 -4
  123. package/dist/services/local/__tests__/createObject.test.js.map +1 -1
  124. package/dist/services/local/__tests__/getNextAvailableIssue.test.d.ts +2 -0
  125. package/dist/services/local/__tests__/getNextAvailableIssue.test.d.ts.map +1 -0
  126. package/dist/services/local/__tests__/getNextAvailableIssue.test.js +314 -0
  127. package/dist/services/local/__tests__/getNextAvailableIssue.test.js.map +1 -0
  128. package/dist/services/local/__tests__/listObjects.test.js +1 -0
  129. package/dist/services/local/__tests__/listObjects.test.js.map +1 -1
  130. package/dist/services/local/__tests__/pruneClosed.test.js +1 -0
  131. package/dist/services/local/__tests__/pruneClosed.test.js.map +1 -1
  132. package/dist/services/local/__tests__/updateObject.test.js +2 -2
  133. package/dist/services/local/__tests__/updateObject.test.js.map +1 -1
  134. package/dist/services/local/createObject.d.ts +1 -1
  135. package/dist/services/local/createObject.d.ts.map +1 -1
  136. package/dist/services/local/createObject.js +1 -1
  137. package/dist/services/local/createObject.js.map +1 -1
  138. package/dist/services/local/getNextAvailableIssue.d.ts +14 -0
  139. package/dist/services/local/getNextAvailableIssue.d.ts.map +1 -0
  140. package/dist/services/local/getNextAvailableIssue.js +28 -0
  141. package/dist/services/local/getNextAvailableIssue.js.map +1 -0
  142. package/dist/tools/__tests__/claimTaskTool.test.js +1 -0
  143. package/dist/tools/__tests__/claimTaskTool.test.js.map +1 -1
  144. package/dist/tools/__tests__/completeTaskTool.test.js +1 -0
  145. package/dist/tools/__tests__/completeTaskTool.test.js.map +1 -1
  146. package/dist/tools/__tests__/getObjectTool.test.js +1 -0
  147. package/dist/tools/__tests__/getObjectTool.test.js.map +1 -1
  148. package/dist/tools/__tests__/listObjectsTool.test.js +1 -0
  149. package/dist/tools/__tests__/listObjectsTool.test.js.map +1 -1
  150. package/dist/tools/getNextAvailableIssueTool.d.ts +34 -0
  151. package/dist/tools/getNextAvailableIssueTool.d.ts.map +1 -0
  152. package/dist/tools/getNextAvailableIssueTool.js +94 -0
  153. package/dist/tools/getNextAvailableIssueTool.js.map +1 -0
  154. package/dist/tools/index.d.ts +1 -0
  155. package/dist/tools/index.d.ts.map +1 -1
  156. package/dist/tools/index.js +4 -1
  157. package/dist/tools/index.js.map +1 -1
  158. package/dist/utils/__tests__/checkHierarchicalPrerequisitesComplete.test.js +3 -3
  159. package/dist/utils/__tests__/checkHierarchicalPrerequisitesComplete.test.js.map +1 -1
  160. package/dist/utils/__tests__/checkPrerequisitesComplete.test.js +1 -0
  161. package/dist/utils/__tests__/checkPrerequisitesComplete.test.js.map +1 -1
  162. package/dist/utils/__tests__/deserializeTrellisObject.test.js +23 -1
  163. package/dist/utils/__tests__/deserializeTrellisObject.test.js.map +1 -1
  164. package/dist/utils/__tests__/filterUnavailableObjects.test.js +1 -1
  165. package/dist/utils/__tests__/filterUnavailableObjects.test.js.map +1 -1
  166. package/dist/utils/__tests__/isRequiredForOtherObjects.test.js +1 -0
  167. package/dist/utils/__tests__/isRequiredForOtherObjects.test.js.map +1 -1
  168. package/dist/utils/__tests__/serializationRoundTrip.test.js +35 -0
  169. package/dist/utils/__tests__/serializationRoundTrip.test.js.map +1 -1
  170. package/dist/utils/__tests__/serializeTrellisObject.test.js +8 -2
  171. package/dist/utils/__tests__/serializeTrellisObject.test.js.map +1 -1
  172. package/dist/utils/__tests__/sortTrellisObjects.test.js +1 -0
  173. package/dist/utils/__tests__/sortTrellisObjects.test.js.map +1 -1
  174. package/dist/utils/__tests__/updateParentHierarchy.test.js +4 -4
  175. package/dist/utils/__tests__/updateParentHierarchy.test.js.map +1 -1
  176. package/dist/utils/deserializeTrellisObject.d.ts.map +1 -1
  177. package/dist/utils/deserializeTrellisObject.js +1 -1
  178. package/dist/utils/deserializeTrellisObject.js.map +1 -1
  179. package/dist/utils/serializeTrellisObject.js +1 -1
  180. package/dist/utils/serializeTrellisObject.js.map +1 -1
  181. package/dist/utils/updateParentHierarchy.d.ts +1 -1
  182. package/dist/utils/updateParentHierarchy.d.ts.map +1 -1
  183. package/dist/utils/updateParentHierarchy.js.map +1 -1
  184. package/dist/validation/__tests__/validateObjectCreation.test.js +3 -3
  185. package/dist/validation/__tests__/validateObjectCreation.test.js.map +1 -1
  186. package/dist/validation/__tests__/validateParentExists.test.js +2 -1
  187. package/dist/validation/__tests__/validateParentExists.test.js.map +1 -1
  188. package/dist/validation/validateParentExists.d.ts +1 -1
  189. package/dist/validation/validateParentExists.d.ts.map +1 -1
  190. package/dist/validation/validateParentExists.js.map +1 -1
  191. package/package.json +3 -2
@@ -0,0 +1,151 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.PromptManager = void 0;
37
+ const fs = __importStar(require("fs/promises"));
38
+ const path = __importStar(require("path"));
39
+ const PromptParser_js_1 = require("./PromptParser.js");
40
+ /**
41
+ * Manages the lifecycle and caching of prompt templates
42
+ */
43
+ class PromptManager {
44
+ prompts;
45
+ loaded;
46
+ promptPackage;
47
+ constructor(promptPackage = "basic") {
48
+ this.prompts = new Map();
49
+ this.loaded = false;
50
+ this.promptPackage = promptPackage;
51
+ }
52
+ /**
53
+ * Loads all prompts from the configured prompt package directory
54
+ * This method should be called once during application startup
55
+ */
56
+ async load() {
57
+ if (this.loaded) {
58
+ return;
59
+ }
60
+ const promptsDir = path.join(__dirname, "..", "resources", this.promptPackage, "prompts");
61
+ if (!(await this.checkDirectoryExists(promptsDir))) {
62
+ this.loaded = true;
63
+ return;
64
+ }
65
+ await this.loadPromptsFromDirectory(promptsDir);
66
+ }
67
+ /**
68
+ * Checks if the prompts directory exists
69
+ */
70
+ async checkDirectoryExists(promptsDir) {
71
+ try {
72
+ await fs.access(promptsDir);
73
+ return true;
74
+ }
75
+ catch {
76
+ console.error(`Prompts directory does not exist for package '${this.promptPackage}': ${promptsDir}`);
77
+ return false;
78
+ }
79
+ }
80
+ /**
81
+ * Loads all prompt files from the specified directory
82
+ */
83
+ async loadPromptsFromDirectory(promptsDir) {
84
+ try {
85
+ const files = await fs.readdir(promptsDir);
86
+ const mdFiles = files.filter((file) => file.endsWith(".md"));
87
+ for (const file of mdFiles) {
88
+ await this.loadSinglePrompt(path.join(promptsDir, file), file);
89
+ }
90
+ this.loaded = true;
91
+ console.error(`Loaded ${this.prompts.size} prompts from package '${this.promptPackage}' (${mdFiles.length} files)`);
92
+ }
93
+ catch (error) {
94
+ console.error("Failed to read prompts directory:", error);
95
+ this.loaded = true;
96
+ }
97
+ }
98
+ /**
99
+ * Loads a single prompt file
100
+ */
101
+ async loadSinglePrompt(filePath, fileName) {
102
+ try {
103
+ const prompt = await (0, PromptParser_js_1.parsePromptFile)(filePath);
104
+ if (!prompt.name) {
105
+ console.error(`Invalid prompt file ${fileName}: missing name`);
106
+ return;
107
+ }
108
+ if (this.prompts.has(prompt.name)) {
109
+ console.error(`Duplicate prompt name "${prompt.name}" found in file ${fileName}`);
110
+ return;
111
+ }
112
+ this.prompts.set(prompt.name, prompt);
113
+ }
114
+ catch (error) {
115
+ console.error(`Failed to parse prompt file ${fileName}:`, error);
116
+ }
117
+ }
118
+ /**
119
+ * Returns all loaded prompts
120
+ */
121
+ list() {
122
+ return Array.from(this.prompts.values());
123
+ }
124
+ /**
125
+ * Gets a specific prompt by name
126
+ */
127
+ get(name) {
128
+ return this.prompts.get(name);
129
+ }
130
+ /**
131
+ * Checks if a prompt exists
132
+ */
133
+ has(name) {
134
+ return this.prompts.has(name);
135
+ }
136
+ /**
137
+ * Returns the number of loaded prompts
138
+ */
139
+ size() {
140
+ return this.prompts.size;
141
+ }
142
+ /**
143
+ * Clears all cached prompts (mainly for testing)
144
+ */
145
+ clear() {
146
+ this.prompts.clear();
147
+ this.loaded = false;
148
+ }
149
+ }
150
+ exports.PromptManager = PromptManager;
151
+ //# sourceMappingURL=PromptManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PromptManager.js","sourceRoot":"","sources":["../../src/prompts/PromptManager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Represents a message in a prompt response for MCP API consumption
3
+ */
4
+ export interface PromptMessage {
5
+ role: "system" | "user";
6
+ content: {
7
+ type: "text";
8
+ text: string;
9
+ };
10
+ }
11
+ //# sourceMappingURL=PromptMessage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PromptMessage.d.ts","sourceRoot":"","sources":["../../src/prompts/PromptMessage.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,QAAQ,GAAG,MAAM,CAAC;IACxB,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CACzC"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=PromptMessage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PromptMessage.js","sourceRoot":"","sources":["../../src/prompts/PromptMessage.ts"],"names":[],"mappings":""}
@@ -0,0 +1,7 @@
1
+ import { TrellisPrompt } from "./TrellisPrompt";
2
+ /**
3
+ * Parses a markdown prompt file with YAML frontmatter into a TrellisPrompt object.
4
+ * Extracts frontmatter metadata and validates the structure.
5
+ */
6
+ export declare function parsePromptFile(filePath: string): Promise<TrellisPrompt>;
7
+ //# sourceMappingURL=PromptParser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PromptParser.d.ts","sourceRoot":"","sources":["../../src/prompts/PromptParser.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAGhD;;;GAGG;AACH,wBAAsB,eAAe,CACnC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,aAAa,CAAC,CAgBxB"}
@@ -0,0 +1,141 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parsePromptFile = parsePromptFile;
4
+ const promises_1 = require("fs/promises");
5
+ const path_1 = require("path");
6
+ const yaml_1 = require("yaml");
7
+ /**
8
+ * Parses a markdown prompt file with YAML frontmatter into a TrellisPrompt object.
9
+ * Extracts frontmatter metadata and validates the structure.
10
+ */
11
+ async function parsePromptFile(filePath) {
12
+ try {
13
+ const fileContent = await (0, promises_1.readFile)(filePath, "utf-8");
14
+ const promptName = generatePromptName(filePath);
15
+ const { frontmatter, body } = extractFrontmatterAndBody(fileContent);
16
+ const promptData = buildPromptData(promptName, frontmatter, body);
17
+ validatePromptData(promptData, filePath);
18
+ return promptData;
19
+ }
20
+ catch (error) {
21
+ const errorMessage = error instanceof Error ? error.message : "Unknown error";
22
+ throw new Error(`Failed to parse prompt file ${filePath}: ${errorMessage}`);
23
+ }
24
+ }
25
+ // Helper functions (private, not exported)
26
+ /**
27
+ * Validates that parsed prompt data meets all requirements.
28
+ * Throws descriptive errors for invalid prompts.
29
+ */
30
+ function validatePromptData(data, filePath) {
31
+ // Validate required fields
32
+ if (!data.name) {
33
+ throw new Error(`Missing prompt name in ${filePath}`);
34
+ }
35
+ if (!data.description) {
36
+ throw new Error(`Missing required 'description' field in frontmatter for ${filePath}`);
37
+ }
38
+ if (!data.userTemplate || data.userTemplate.trim().length === 0) {
39
+ throw new Error(`Empty prompt body in ${filePath}`);
40
+ }
41
+ // Validate kebab-case name
42
+ if (!/^[a-z]+(-[a-z]+)*$/.test(data.name)) {
43
+ throw new Error(`Invalid prompt name '${data.name}' in ${filePath}. Must be kebab-case.`);
44
+ }
45
+ // Validate unique argument names
46
+ const argNames = new Set();
47
+ for (const arg of data.arguments) {
48
+ if (!arg.name) {
49
+ throw new Error(`Missing argument name in ${filePath}`);
50
+ }
51
+ if (argNames.has(arg.name)) {
52
+ throw new Error(`Duplicate argument name '${arg.name}' in ${filePath}`);
53
+ }
54
+ argNames.add(arg.name);
55
+ // Validate argument fields
56
+ if (arg.type && arg.type !== "string" && arg.type !== "boolean") {
57
+ throw new Error(`Invalid argument type '${String(arg.type)}' for '${arg.name}' in ${filePath}`);
58
+ }
59
+ if (typeof arg.required !== "boolean") {
60
+ throw new Error(`Invalid 'required' value for argument '${arg.name}' in ${filePath}`);
61
+ }
62
+ if (!arg.description) {
63
+ throw new Error(`Missing description for argument '${arg.name}' in ${filePath}`);
64
+ }
65
+ }
66
+ }
67
+ function extractFrontmatterAndBody(content) {
68
+ const frontmatterRegex = /^---\n([\s\S]*?)\n---\n([\s\S]*)$/;
69
+ const match = content.match(frontmatterRegex);
70
+ if (!match) {
71
+ throw new Error("Invalid format: Expected YAML frontmatter delimited by --- markers");
72
+ }
73
+ const [, yamlContent, bodyContent] = match;
74
+ let frontmatter;
75
+ try {
76
+ frontmatter = (0, yaml_1.parse)(yamlContent);
77
+ }
78
+ catch (error) {
79
+ throw new Error(`Invalid YAML frontmatter: ${error instanceof Error ? error.message : "Unknown error"}`);
80
+ }
81
+ if (!frontmatter ||
82
+ typeof frontmatter !== "object" ||
83
+ Array.isArray(frontmatter)) {
84
+ throw new Error("Invalid YAML frontmatter: Expected an object");
85
+ }
86
+ return {
87
+ frontmatter: frontmatter,
88
+ body: bodyContent.trim(),
89
+ };
90
+ }
91
+ function generatePromptName(filePath) {
92
+ const fileName = (0, path_1.basename)(filePath, ".md");
93
+ return fileName.toLowerCase().replace(/_/g, "-");
94
+ }
95
+ function buildPromptData(name, frontmatter, userTemplate) {
96
+ // Build arguments array with default if not specified
97
+ const args = parseArguments(frontmatter.args);
98
+ return {
99
+ name,
100
+ title: typeof frontmatter.title === "string" ? frontmatter.title : undefined,
101
+ description: typeof frontmatter.description === "string"
102
+ ? frontmatter.description
103
+ : "",
104
+ arguments: args,
105
+ userTemplate,
106
+ };
107
+ }
108
+ function parseArguments(args) {
109
+ // Default to single 'input' argument if not specified
110
+ if (!args) {
111
+ return [
112
+ {
113
+ name: "input",
114
+ required: false,
115
+ description: "Free-text input",
116
+ },
117
+ ];
118
+ }
119
+ if (!Array.isArray(args)) {
120
+ throw new Error("Invalid 'args' field: Expected an array");
121
+ }
122
+ return args.map((arg, index) => {
123
+ if (!arg || typeof arg !== "object" || Array.isArray(arg)) {
124
+ throw new Error(`Invalid argument at index ${index}: Expected an object`);
125
+ }
126
+ const argObj = arg;
127
+ const argType = argObj.type;
128
+ const validatedType = argType === "boolean"
129
+ ? "boolean"
130
+ : argType === "string"
131
+ ? "string"
132
+ : argType;
133
+ return {
134
+ name: typeof argObj.name === "string" ? argObj.name : "",
135
+ type: validatedType,
136
+ required: Boolean(argObj.required),
137
+ description: typeof argObj.description === "string" ? argObj.description : "",
138
+ };
139
+ });
140
+ }
141
+ //# sourceMappingURL=PromptParser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PromptParser.js","sourceRoot":"","sources":["../../src/prompts/PromptParser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ import { TrellisPrompt } from "./index";
2
+ import { PromptMessage } from "./PromptMessage";
3
+ /**
4
+ * Renders prompt templates by substituting placeholders with provided arguments.
5
+ * Handles both $ARGUMENTS blocks and individual ${argName} substitutions.
6
+ */
7
+ export declare class PromptRenderer {
8
+ /**
9
+ * Main entry point for rendering a prompt with arguments.
10
+ * Returns structured messages suitable for MCP API consumption.
11
+ */
12
+ renderPrompt(prompt: TrellisPrompt, args: Record<string, string>): PromptMessage[];
13
+ /**
14
+ * Validates that all required arguments are present and non-empty after trimming
15
+ */
16
+ private validateRequiredArguments;
17
+ /**
18
+ * Handles $ARGUMENTS placeholder substitution.
19
+ * Single 'input' argument: inject raw value
20
+ * Multiple arguments: create formatted "Inputs" section
21
+ */
22
+ private substituteArguments;
23
+ /**
24
+ * Handles individual ${argName} placeholder substitution
25
+ */
26
+ private substitutePlaceholders;
27
+ /**
28
+ * Formats multiple arguments as a readable "Inputs" section
29
+ */
30
+ private formatArgumentsBlock;
31
+ /**
32
+ * Sanitizes argument values to prevent injection attacks.
33
+ * Escapes special characters that could break markdown formatting
34
+ * or introduce unwanted content.
35
+ */
36
+ private sanitizeValue;
37
+ }
38
+ //# sourceMappingURL=PromptRenderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PromptRenderer.d.ts","sourceRoot":"","sources":["../../src/prompts/PromptRenderer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD;;;GAGG;AACH,qBAAa,cAAc;IACzB;;;OAGG;IACH,YAAY,CACV,MAAM,EAAE,aAAa,EACrB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC3B,aAAa,EAAE;IA6BlB;;OAEG;IACH,OAAO,CAAC,yBAAyB;IAmBjC;;;;OAIG;IACH,OAAO,CAAC,mBAAmB;IAyB3B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAoC9B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IA2B5B;;;;OAIG;IACH,OAAO,CAAC,aAAa;CAStB"}
@@ -0,0 +1,128 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PromptRenderer = void 0;
4
+ /**
5
+ * Renders prompt templates by substituting placeholders with provided arguments.
6
+ * Handles both $ARGUMENTS blocks and individual ${argName} substitutions.
7
+ */
8
+ class PromptRenderer {
9
+ /**
10
+ * Main entry point for rendering a prompt with arguments.
11
+ * Returns structured messages suitable for MCP API consumption.
12
+ */
13
+ renderPrompt(prompt, args) {
14
+ // Validate required arguments
15
+ this.validateRequiredArguments(prompt, args);
16
+ // Process template
17
+ let renderedTemplate = prompt.userTemplate;
18
+ // Handle $ARGUMENTS substitution
19
+ renderedTemplate = this.substituteArguments(renderedTemplate, prompt, args);
20
+ // Handle ${argName} placeholders
21
+ renderedTemplate = this.substitutePlaceholders(renderedTemplate, prompt, args);
22
+ // Build response messages
23
+ const messages = [];
24
+ // Add user message with rendered template
25
+ messages.push({
26
+ role: "user",
27
+ content: { type: "text", text: renderedTemplate },
28
+ });
29
+ return messages;
30
+ }
31
+ /**
32
+ * Validates that all required arguments are present and non-empty after trimming
33
+ */
34
+ validateRequiredArguments(prompt, args) {
35
+ if (!prompt.arguments)
36
+ return;
37
+ for (const arg of prompt.arguments) {
38
+ if (arg.required) {
39
+ const value = args[arg.name];
40
+ if (!value || value.trim() === "") {
41
+ throw new Error(`Missing required argument: ${arg.name}. ` +
42
+ `Description: ${arg.description || "No description provided"}`);
43
+ }
44
+ }
45
+ }
46
+ }
47
+ /**
48
+ * Handles $ARGUMENTS placeholder substitution.
49
+ * Single 'input' argument: inject raw value
50
+ * Multiple arguments: create formatted "Inputs" section
51
+ */
52
+ substituteArguments(template, prompt, args) {
53
+ const argumentsRegex = /\$ARGUMENTS/g;
54
+ if (!argumentsRegex.test(template)) {
55
+ return template;
56
+ }
57
+ // Special case: single 'input' argument
58
+ if (prompt.arguments?.length === 1 &&
59
+ prompt.arguments[0].name === "input") {
60
+ const value = args.input || "";
61
+ return template.replace(/\$ARGUMENTS/g, this.sanitizeValue(value));
62
+ }
63
+ // Multiple arguments: format as block
64
+ const argumentsBlock = this.formatArgumentsBlock(prompt, args);
65
+ return template.replace(/\$ARGUMENTS/g, argumentsBlock);
66
+ }
67
+ /**
68
+ * Handles individual ${argName} placeholder substitution
69
+ */
70
+ substitutePlaceholders(template, prompt, args) {
71
+ // Match ${argName} placeholders
72
+ const placeholderRegex = /\$\{([^}]+)\}/g;
73
+ return template.replace(placeholderRegex, (match, argName) => {
74
+ const trimmedName = argName.trim();
75
+ // Check if argument is defined in prompt
76
+ const argDef = prompt.arguments?.find((a) => a.name === trimmedName);
77
+ if (trimmedName in args) {
78
+ const value = args[trimmedName];
79
+ return value ? this.sanitizeValue(value) : "";
80
+ }
81
+ // Handle missing optional arguments
82
+ if (argDef && !argDef.required) {
83
+ return "(not provided)";
84
+ }
85
+ // If argument not defined in prompt schema, leave placeholder as-is
86
+ if (!argDef) {
87
+ return match;
88
+ }
89
+ // This shouldn't happen if validateRequiredArguments was called
90
+ throw new Error(`Missing required argument in placeholder: ${trimmedName}`);
91
+ });
92
+ }
93
+ /**
94
+ * Formats multiple arguments as a readable "Inputs" section
95
+ */
96
+ formatArgumentsBlock(prompt, args) {
97
+ if (!prompt.arguments || prompt.arguments.length === 0) {
98
+ return "";
99
+ }
100
+ const lines = ["## Inputs", ""];
101
+ for (const arg of prompt.arguments) {
102
+ const value = args[arg.name];
103
+ const displayValue = value && value.trim() ? this.sanitizeValue(value) : "(not provided)";
104
+ lines.push(`**${arg.name}**: ${displayValue}`);
105
+ if (arg.description) {
106
+ lines.push(`*${arg.description}*`);
107
+ }
108
+ lines.push("");
109
+ }
110
+ return lines.join("\n").trim();
111
+ }
112
+ /**
113
+ * Sanitizes argument values to prevent injection attacks.
114
+ * Escapes special characters that could break markdown formatting
115
+ * or introduce unwanted content.
116
+ */
117
+ sanitizeValue(value) {
118
+ return value
119
+ .replace(/\\/g, "\\\\") // Escape backslashes first
120
+ .replace(/`/g, "\\`") // Escape backticks
121
+ .replace(/\$/g, "\\$") // Escape dollar signs
122
+ .replace(/</g, "&lt;") // Escape HTML tags
123
+ .replace(/>/g, "&gt;")
124
+ .replace(/\n{3,}/g, "\n\n"); // Limit consecutive newlines
125
+ }
126
+ }
127
+ exports.PromptRenderer = PromptRenderer;
128
+ //# sourceMappingURL=PromptRenderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PromptRenderer.js","sourceRoot":"","sources":["../../src/prompts/PromptRenderer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Registry for MCP prompts that integrates PromptManager and PromptRenderer
3
+ * to provide slash command functionality in Claude Code.
4
+ */
5
+ export declare class PromptsRegistry {
6
+ private manager;
7
+ private renderer;
8
+ private promptPackage;
9
+ constructor(promptPackage?: string);
10
+ /**
11
+ * Initialize the registry by loading all prompts
12
+ */
13
+ initialize(): Promise<void>;
14
+ /**
15
+ * Handle prompts/list endpoint - returns catalog of available prompts
16
+ * Omits internal-only fields like title, systemRules, and userTemplate
17
+ */
18
+ listPrompts(): {
19
+ prompts: Array<{
20
+ name: string;
21
+ description: string;
22
+ arguments?: Array<{
23
+ name: string;
24
+ description: string;
25
+ required: boolean;
26
+ }>;
27
+ }>;
28
+ };
29
+ /**
30
+ * Handle prompts/get endpoint - renders template with arguments and returns messages
31
+ */
32
+ getPrompt(name: string, args?: Record<string, string>): {
33
+ description?: string;
34
+ messages: Array<{
35
+ role: "system" | "user";
36
+ content: {
37
+ type: "text";
38
+ text: string;
39
+ };
40
+ }>;
41
+ };
42
+ }
43
+ //# sourceMappingURL=PromptsRegistry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PromptsRegistry.d.ts","sourceRoot":"","sources":["../../src/prompts/PromptsRegistry.ts"],"names":[],"mappings":"AAIA;;;GAGG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,QAAQ,CAAiB;IACjC,OAAO,CAAC,aAAa,CAAS;gBAElB,aAAa,GAAE,MAAgB;IAM3C;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAIjC;;;OAGG;IACH,WAAW,IAAI;QACb,OAAO,EAAE,KAAK,CAAC;YACb,IAAI,EAAE,MAAM,CAAC;YACb,WAAW,EAAE,MAAM,CAAC;YACpB,SAAS,CAAC,EAAE,KAAK,CAAC;gBAChB,IAAI,EAAE,MAAM,CAAC;gBACb,WAAW,EAAE,MAAM,CAAC;gBACpB,QAAQ,EAAE,OAAO,CAAC;aACnB,CAAC,CAAC;SACJ,CAAC,CAAC;KACJ;IAiBD;;OAEG;IACH,SAAS,CACP,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC5B;QACD,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,QAAQ,EAAE,KAAK,CAAC;YACd,IAAI,EAAE,QAAQ,GAAG,MAAM,CAAC;YACxB,OAAO,EAAE;gBAAE,IAAI,EAAE,MAAM,CAAC;gBAAC,IAAI,EAAE,MAAM,CAAA;aAAE,CAAC;SACzC,CAAC,CAAC;KACJ;CAoCF"}
@@ -0,0 +1,76 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PromptsRegistry = void 0;
4
+ const types_js_1 = require("@modelcontextprotocol/sdk/types.js");
5
+ const PromptManager_js_1 = require("./PromptManager.js");
6
+ const PromptRenderer_js_1 = require("./PromptRenderer.js");
7
+ /**
8
+ * Registry for MCP prompts that integrates PromptManager and PromptRenderer
9
+ * to provide slash command functionality in Claude Code.
10
+ */
11
+ class PromptsRegistry {
12
+ manager;
13
+ renderer;
14
+ promptPackage;
15
+ constructor(promptPackage = "basic") {
16
+ this.promptPackage = promptPackage;
17
+ this.manager = new PromptManager_js_1.PromptManager(promptPackage);
18
+ this.renderer = new PromptRenderer_js_1.PromptRenderer();
19
+ }
20
+ /**
21
+ * Initialize the registry by loading all prompts
22
+ */
23
+ async initialize() {
24
+ await this.manager.load();
25
+ }
26
+ /**
27
+ * Handle prompts/list endpoint - returns catalog of available prompts
28
+ * Omits internal-only fields like title, systemRules, and userTemplate
29
+ */
30
+ listPrompts() {
31
+ const allPrompts = this.manager.list();
32
+ // Convert to catalog entries, filtering out internal fields
33
+ const prompts = allPrompts.map((prompt) => ({
34
+ name: prompt.name,
35
+ description: prompt.description,
36
+ arguments: prompt.arguments.map((arg) => ({
37
+ name: arg.name,
38
+ description: arg.description || "",
39
+ required: arg.required || false,
40
+ })),
41
+ }));
42
+ return { prompts };
43
+ }
44
+ /**
45
+ * Handle prompts/get endpoint - renders template with arguments and returns messages
46
+ */
47
+ getPrompt(name, args) {
48
+ // Get the prompt
49
+ const prompt = this.manager.get(name);
50
+ if (!prompt) {
51
+ throw new types_js_1.McpError(types_js_1.ErrorCode.InvalidRequest, `Prompt not found: ${name}`);
52
+ }
53
+ // Validate required arguments
54
+ if (prompt.arguments) {
55
+ for (const arg of prompt.arguments) {
56
+ if (arg.required &&
57
+ (!args || !args[arg.name] || !args[arg.name].trim())) {
58
+ throw new types_js_1.McpError(types_js_1.ErrorCode.InvalidRequest, `Missing required argument: ${arg.name}. Description: ${arg.description || "No description provided"}`);
59
+ }
60
+ }
61
+ }
62
+ // Render the prompt with provided arguments
63
+ const messages = this.renderer.renderPrompt(prompt, args || {});
64
+ // Convert to MCP format with rich text blocks
65
+ const mcpMessages = messages.map((msg) => ({
66
+ role: msg.role,
67
+ content: msg.content,
68
+ }));
69
+ return {
70
+ description: prompt.description,
71
+ messages: mcpMessages,
72
+ };
73
+ }
74
+ }
75
+ exports.PromptsRegistry = PromptsRegistry;
76
+ //# sourceMappingURL=PromptsRegistry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PromptsRegistry.js","sourceRoot":"","sources":["../../src/prompts/PromptsRegistry.ts"],"names":[],"mappings":";;;AAAA,iEAAyE;AACzE,yDAAmD;AACnD,2DAAqD;AAErD;;;GAGG;AACH,MAAa,eAAe;IAClB,OAAO,CAAgB;IACvB,QAAQ,CAAiB;IACzB,aAAa,CAAS;IAE9B,YAAY,gBAAwB,OAAO;QACzC,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACnC,IAAI,CAAC,OAAO,GAAG,IAAI,gCAAa,CAAC,aAAa,CAAC,CAAC;QAChD,IAAI,CAAC,QAAQ,GAAG,IAAI,kCAAc,EAAE,CAAC;IACvC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU;QACd,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;IAC5B,CAAC;IAED;;;OAGG;IACH,WAAW;QAWT,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAEvC,4DAA4D;QAC5D,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YAC1C,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;gBACxC,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,WAAW,EAAE,GAAG,CAAC,WAAW,IAAI,EAAE;gBAClC,QAAQ,EAAE,GAAG,CAAC,QAAQ,IAAI,KAAK;aAChC,CAAC,CAAC;SACJ,CAAC,CAAC,CAAC;QAEJ,OAAO,EAAE,OAAO,EAAE,CAAC;IACrB,CAAC;IAED;;OAEG;IACH,SAAS,CACP,IAAY,EACZ,IAA6B;QAQ7B,iBAAiB;QACjB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACtC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,mBAAQ,CAAC,oBAAS,CAAC,cAAc,EAAE,qBAAqB,IAAI,EAAE,CAAC,CAAC;QAC5E,CAAC;QAED,8BAA8B;QAC9B,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YACrB,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;gBACnC,IACE,GAAG,CAAC,QAAQ;oBACZ,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,EACpD,CAAC;oBACD,MAAM,IAAI,mBAAQ,CAChB,oBAAS,CAAC,cAAc,EACxB,8BAA8B,GAAG,CAAC,IAAI,kBAAkB,GAAG,CAAC,WAAW,IAAI,yBAAyB,EAAE,CACvG,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;QAED,4CAA4C;QAC5C,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;QAEhE,8CAA8C;QAC9C,MAAM,WAAW,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YACzC,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,OAAO,EAAE,GAAG,CAAC,OAAO;SACrB,CAAC,CAAC,CAAC;QAEJ,OAAO;YACL,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,QAAQ,EAAE,WAAW;SACtB,CAAC;IACJ,CAAC;CACF;AAjGD,0CAiGC"}