decibel-tools-mcp 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (255) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +335 -0
  3. package/dist/agentic/compiler.d.ts +21 -0
  4. package/dist/agentic/compiler.d.ts.map +1 -0
  5. package/dist/agentic/compiler.js +267 -0
  6. package/dist/agentic/compiler.js.map +1 -0
  7. package/dist/agentic/golden.d.ts +25 -0
  8. package/dist/agentic/golden.d.ts.map +1 -0
  9. package/dist/agentic/golden.js +255 -0
  10. package/dist/agentic/golden.js.map +1 -0
  11. package/dist/agentic/index.d.ts +17 -0
  12. package/dist/agentic/index.d.ts.map +1 -0
  13. package/dist/agentic/index.js +153 -0
  14. package/dist/agentic/index.js.map +1 -0
  15. package/dist/agentic/linter.d.ts +20 -0
  16. package/dist/agentic/linter.d.ts.map +1 -0
  17. package/dist/agentic/linter.js +340 -0
  18. package/dist/agentic/linter.js.map +1 -0
  19. package/dist/agentic/renderer.d.ts +17 -0
  20. package/dist/agentic/renderer.d.ts.map +1 -0
  21. package/dist/agentic/renderer.js +277 -0
  22. package/dist/agentic/renderer.js.map +1 -0
  23. package/dist/agentic/types.d.ts +199 -0
  24. package/dist/agentic/types.d.ts.map +1 -0
  25. package/dist/agentic/types.js +8 -0
  26. package/dist/agentic/types.js.map +1 -0
  27. package/dist/architectAdrs.d.ts +19 -0
  28. package/dist/architectAdrs.d.ts.map +1 -0
  29. package/dist/architectAdrs.js +123 -0
  30. package/dist/architectAdrs.js.map +1 -0
  31. package/dist/config.d.ts +8 -0
  32. package/dist/config.d.ts.map +1 -0
  33. package/dist/config.js +19 -0
  34. package/dist/config.js.map +1 -0
  35. package/dist/dataRoot.d.ts +45 -0
  36. package/dist/dataRoot.d.ts.map +1 -0
  37. package/dist/dataRoot.js +201 -0
  38. package/dist/dataRoot.js.map +1 -0
  39. package/dist/decibelPaths.d.ts +42 -0
  40. package/dist/decibelPaths.d.ts.map +1 -0
  41. package/dist/decibelPaths.js +150 -0
  42. package/dist/decibelPaths.js.map +1 -0
  43. package/dist/httpServer.d.ts +49 -0
  44. package/dist/httpServer.d.ts.map +1 -0
  45. package/dist/httpServer.js +1472 -0
  46. package/dist/httpServer.js.map +1 -0
  47. package/dist/lib/benchmark.d.ts +110 -0
  48. package/dist/lib/benchmark.d.ts.map +1 -0
  49. package/dist/lib/benchmark.js +338 -0
  50. package/dist/lib/benchmark.js.map +1 -0
  51. package/dist/lib/supabase.d.ts +123 -0
  52. package/dist/lib/supabase.d.ts.map +1 -0
  53. package/dist/lib/supabase.js +91 -0
  54. package/dist/lib/supabase.js.map +1 -0
  55. package/dist/projectPaths.d.ts +27 -0
  56. package/dist/projectPaths.d.ts.map +1 -0
  57. package/dist/projectPaths.js +86 -0
  58. package/dist/projectPaths.js.map +1 -0
  59. package/dist/projectRegistry.d.ts +97 -0
  60. package/dist/projectRegistry.d.ts.map +1 -0
  61. package/dist/projectRegistry.js +362 -0
  62. package/dist/projectRegistry.js.map +1 -0
  63. package/dist/sentinelIssues.d.ts +44 -0
  64. package/dist/sentinelIssues.d.ts.map +1 -0
  65. package/dist/sentinelIssues.js +213 -0
  66. package/dist/sentinelIssues.js.map +1 -0
  67. package/dist/server.d.ts +3 -0
  68. package/dist/server.d.ts.map +1 -0
  69. package/dist/server.js +93 -0
  70. package/dist/server.js.map +1 -0
  71. package/dist/test.d.ts +7 -0
  72. package/dist/test.d.ts.map +1 -0
  73. package/dist/test.js +77 -0
  74. package/dist/test.js.map +1 -0
  75. package/dist/tools/agentic/index.d.ts +7 -0
  76. package/dist/tools/agentic/index.d.ts.map +1 -0
  77. package/dist/tools/agentic/index.js +180 -0
  78. package/dist/tools/agentic/index.js.map +1 -0
  79. package/dist/tools/architect/index.d.ts +9 -0
  80. package/dist/tools/architect/index.d.ts.map +1 -0
  81. package/dist/tools/architect/index.js +383 -0
  82. package/dist/tools/architect/index.js.map +1 -0
  83. package/dist/tools/architect.d.ts +19 -0
  84. package/dist/tools/architect.d.ts.map +1 -0
  85. package/dist/tools/architect.js +88 -0
  86. package/dist/tools/architect.js.map +1 -0
  87. package/dist/tools/bench.d.ts +89 -0
  88. package/dist/tools/bench.d.ts.map +1 -0
  89. package/dist/tools/bench.js +826 -0
  90. package/dist/tools/bench.js.map +1 -0
  91. package/dist/tools/context/index.d.ts +11 -0
  92. package/dist/tools/context/index.d.ts.map +1 -0
  93. package/dist/tools/context/index.js +439 -0
  94. package/dist/tools/context/index.js.map +1 -0
  95. package/dist/tools/context.d.ts +146 -0
  96. package/dist/tools/context.d.ts.map +1 -0
  97. package/dist/tools/context.js +481 -0
  98. package/dist/tools/context.js.map +1 -0
  99. package/dist/tools/crit.d.ts +63 -0
  100. package/dist/tools/crit.d.ts.map +1 -0
  101. package/dist/tools/crit.js +159 -0
  102. package/dist/tools/crit.js.map +1 -0
  103. package/dist/tools/data-inspector.d.ts +188 -0
  104. package/dist/tools/data-inspector.d.ts.map +1 -0
  105. package/dist/tools/data-inspector.js +650 -0
  106. package/dist/tools/data-inspector.js.map +1 -0
  107. package/dist/tools/deck.d.ts +11 -0
  108. package/dist/tools/deck.d.ts.map +1 -0
  109. package/dist/tools/deck.js +170 -0
  110. package/dist/tools/deck.js.map +1 -0
  111. package/dist/tools/designer/index.d.ts +6 -0
  112. package/dist/tools/designer/index.d.ts.map +1 -0
  113. package/dist/tools/designer/index.js +177 -0
  114. package/dist/tools/designer/index.js.map +1 -0
  115. package/dist/tools/designer.d.ts +20 -0
  116. package/dist/tools/designer.d.ts.map +1 -0
  117. package/dist/tools/designer.js +75 -0
  118. package/dist/tools/designer.js.map +1 -0
  119. package/dist/tools/dojo/index.d.ts +13 -0
  120. package/dist/tools/dojo/index.d.ts.map +1 -0
  121. package/dist/tools/dojo/index.js +547 -0
  122. package/dist/tools/dojo/index.js.map +1 -0
  123. package/dist/tools/dojo.d.ts +254 -0
  124. package/dist/tools/dojo.d.ts.map +1 -0
  125. package/dist/tools/dojo.js +933 -0
  126. package/dist/tools/dojo.js.map +1 -0
  127. package/dist/tools/dojoBench.d.ts +49 -0
  128. package/dist/tools/dojoBench.d.ts.map +1 -0
  129. package/dist/tools/dojoBench.js +205 -0
  130. package/dist/tools/dojoBench.js.map +1 -0
  131. package/dist/tools/dojoGraduated.d.ts +50 -0
  132. package/dist/tools/dojoGraduated.d.ts.map +1 -0
  133. package/dist/tools/dojoGraduated.js +174 -0
  134. package/dist/tools/dojoGraduated.js.map +1 -0
  135. package/dist/tools/dojoPolicy.d.ts +65 -0
  136. package/dist/tools/dojoPolicy.d.ts.map +1 -0
  137. package/dist/tools/dojoPolicy.js +263 -0
  138. package/dist/tools/dojoPolicy.js.map +1 -0
  139. package/dist/tools/friction/index.d.ts +7 -0
  140. package/dist/tools/friction/index.d.ts.map +1 -0
  141. package/dist/tools/friction/index.js +239 -0
  142. package/dist/tools/friction/index.js.map +1 -0
  143. package/dist/tools/friction.d.ts +82 -0
  144. package/dist/tools/friction.d.ts.map +1 -0
  145. package/dist/tools/friction.js +331 -0
  146. package/dist/tools/friction.js.map +1 -0
  147. package/dist/tools/index.d.ts +5 -0
  148. package/dist/tools/index.d.ts.map +1 -0
  149. package/dist/tools/index.js +52 -0
  150. package/dist/tools/index.js.map +1 -0
  151. package/dist/tools/learnings/index.d.ts +5 -0
  152. package/dist/tools/learnings/index.d.ts.map +1 -0
  153. package/dist/tools/learnings/index.js +123 -0
  154. package/dist/tools/learnings/index.js.map +1 -0
  155. package/dist/tools/learnings.d.ts +41 -0
  156. package/dist/tools/learnings.d.ts.map +1 -0
  157. package/dist/tools/learnings.js +149 -0
  158. package/dist/tools/learnings.js.map +1 -0
  159. package/dist/tools/oracle/index.d.ts +5 -0
  160. package/dist/tools/oracle/index.d.ts.map +1 -0
  161. package/dist/tools/oracle/index.js +97 -0
  162. package/dist/tools/oracle/index.js.map +1 -0
  163. package/dist/tools/oracle.d.ts +90 -0
  164. package/dist/tools/oracle.d.ts.map +1 -0
  165. package/dist/tools/oracle.js +529 -0
  166. package/dist/tools/oracle.js.map +1 -0
  167. package/dist/tools/policy.d.ts +119 -0
  168. package/dist/tools/policy.d.ts.map +1 -0
  169. package/dist/tools/policy.js +406 -0
  170. package/dist/tools/policy.js.map +1 -0
  171. package/dist/tools/provenance/index.d.ts +4 -0
  172. package/dist/tools/provenance/index.d.ts.map +1 -0
  173. package/dist/tools/provenance/index.js +58 -0
  174. package/dist/tools/provenance/index.js.map +1 -0
  175. package/dist/tools/provenance.d.ts +75 -0
  176. package/dist/tools/provenance.d.ts.map +1 -0
  177. package/dist/tools/provenance.js +197 -0
  178. package/dist/tools/provenance.js.map +1 -0
  179. package/dist/tools/rateLimiter.d.ts +45 -0
  180. package/dist/tools/rateLimiter.d.ts.map +1 -0
  181. package/dist/tools/rateLimiter.js +91 -0
  182. package/dist/tools/rateLimiter.js.map +1 -0
  183. package/dist/tools/registry/index.d.ts +10 -0
  184. package/dist/tools/registry/index.d.ts.map +1 -0
  185. package/dist/tools/registry/index.js +467 -0
  186. package/dist/tools/registry/index.js.map +1 -0
  187. package/dist/tools/registry.d.ts +3 -0
  188. package/dist/tools/registry.d.ts.map +1 -0
  189. package/dist/tools/registry.js +189 -0
  190. package/dist/tools/registry.js.map +1 -0
  191. package/dist/tools/roadmap/index.d.ts +9 -0
  192. package/dist/tools/roadmap/index.d.ts.map +1 -0
  193. package/dist/tools/roadmap/index.js +250 -0
  194. package/dist/tools/roadmap/index.js.map +1 -0
  195. package/dist/tools/roadmap.d.ts +88 -0
  196. package/dist/tools/roadmap.d.ts.map +1 -0
  197. package/dist/tools/roadmap.js +365 -0
  198. package/dist/tools/roadmap.js.map +1 -0
  199. package/dist/tools/sentinel/index.d.ts +19 -0
  200. package/dist/tools/sentinel/index.d.ts.map +1 -0
  201. package/dist/tools/sentinel/index.js +832 -0
  202. package/dist/tools/sentinel/index.js.map +1 -0
  203. package/dist/tools/sentinel-scan-data.d.ts +90 -0
  204. package/dist/tools/sentinel-scan-data.d.ts.map +1 -0
  205. package/dist/tools/sentinel-scan-data.js +122 -0
  206. package/dist/tools/sentinel-scan-data.js.map +1 -0
  207. package/dist/tools/sentinel.d.ts +156 -0
  208. package/dist/tools/sentinel.d.ts.map +1 -0
  209. package/dist/tools/sentinel.js +603 -0
  210. package/dist/tools/sentinel.js.map +1 -0
  211. package/dist/tools/shared/index.d.ts +4 -0
  212. package/dist/tools/shared/index.d.ts.map +1 -0
  213. package/dist/tools/shared/index.js +7 -0
  214. package/dist/tools/shared/index.js.map +1 -0
  215. package/dist/tools/shared/project.d.ts +17 -0
  216. package/dist/tools/shared/project.d.ts.map +1 -0
  217. package/dist/tools/shared/project.js +36 -0
  218. package/dist/tools/shared/project.js.map +1 -0
  219. package/dist/tools/shared/response.d.ts +10 -0
  220. package/dist/tools/shared/response.d.ts.map +1 -0
  221. package/dist/tools/shared/response.js +36 -0
  222. package/dist/tools/shared/response.js.map +1 -0
  223. package/dist/tools/shared/validation.d.ts +10 -0
  224. package/dist/tools/shared/validation.d.ts.map +1 -0
  225. package/dist/tools/shared/validation.js +26 -0
  226. package/dist/tools/shared/validation.js.map +1 -0
  227. package/dist/tools/studio/cloud-spine.d.ts +27 -0
  228. package/dist/tools/studio/cloud-spine.d.ts.map +1 -0
  229. package/dist/tools/studio/cloud-spine.js +773 -0
  230. package/dist/tools/studio/cloud-spine.js.map +1 -0
  231. package/dist/tools/studio/index.d.ts +154 -0
  232. package/dist/tools/studio/index.d.ts.map +1 -0
  233. package/dist/tools/studio/index.js +525 -0
  234. package/dist/tools/studio/index.js.map +1 -0
  235. package/dist/tools/testSpec.d.ts +122 -0
  236. package/dist/tools/testSpec.d.ts.map +1 -0
  237. package/dist/tools/testSpec.js +525 -0
  238. package/dist/tools/testSpec.js.map +1 -0
  239. package/dist/tools/toolsIndex.d.ts +5 -0
  240. package/dist/tools/toolsIndex.d.ts.map +1 -0
  241. package/dist/tools/toolsIndex.js +37 -0
  242. package/dist/tools/toolsIndex.js.map +1 -0
  243. package/dist/tools/types.d.ts +30 -0
  244. package/dist/tools/types.d.ts.map +1 -0
  245. package/dist/tools/types.js +7 -0
  246. package/dist/tools/types.js.map +1 -0
  247. package/dist/tools/voice/index.d.ts +8 -0
  248. package/dist/tools/voice/index.d.ts.map +1 -0
  249. package/dist/tools/voice/index.js +176 -0
  250. package/dist/tools/voice/index.js.map +1 -0
  251. package/dist/tools/voice.d.ts +291 -0
  252. package/dist/tools/voice.d.ts.map +1 -0
  253. package/dist/tools/voice.js +734 -0
  254. package/dist/tools/voice.js.map +1 -0
  255. package/package.json +54 -0
@@ -0,0 +1,603 @@
1
+ import fs from 'fs/promises';
2
+ import path from 'path';
3
+ import { log } from '../config.js';
4
+ import { ensureDir } from '../dataRoot.js';
5
+ import { resolveProjectPaths, validateWritePath } from '../projectRegistry.js';
6
+ import { emitCreateProvenance } from './provenance.js';
7
+ export function isProjectResolutionError(result) {
8
+ return (typeof result === 'object' &&
9
+ result !== null &&
10
+ 'error' in result &&
11
+ result.error === 'PROJECT_NOT_FOUND');
12
+ }
13
+ function makeProjectResolutionError(operation) {
14
+ return {
15
+ error: 'PROJECT_NOT_FOUND',
16
+ message: `Cannot ${operation}: No .decibel/ folder found in project directory.`,
17
+ suggestion: 'Run from a directory with a .decibel/ folder, set DECIBEL_PROJECT_ROOT environment variable, or initialize with `decibel init`.',
18
+ };
19
+ }
20
+ // ============================================================================
21
+ // Helpers
22
+ // ============================================================================
23
+ function slugify(text) {
24
+ return text
25
+ .toLowerCase()
26
+ .replace(/[^a-z0-9]+/g, '-')
27
+ .replace(/^-|-$/g, '')
28
+ .substring(0, 50);
29
+ }
30
+ function formatTimestampForFilename(date) {
31
+ const iso = date.toISOString();
32
+ return iso.replace(/:/g, '-').replace(/\.\d{3}Z$/, 'Z');
33
+ }
34
+ async function getNextEpicNumber(epicsDir) {
35
+ try {
36
+ const files = await fs.readdir(epicsDir);
37
+ const epicNumbers = files
38
+ .filter((f) => f.startsWith('EPIC-') && f.endsWith('.md'))
39
+ .map((f) => {
40
+ const match = f.match(/^EPIC-(\d+)/);
41
+ return match ? parseInt(match[1], 10) : 0;
42
+ });
43
+ return epicNumbers.length > 0 ? Math.max(...epicNumbers) + 1 : 1;
44
+ }
45
+ catch {
46
+ return 1;
47
+ }
48
+ }
49
+ function formatEpicId(num) {
50
+ return `EPIC-${num.toString().padStart(4, '0')}`;
51
+ }
52
+ async function parseEpicFile(filePath) {
53
+ try {
54
+ const content = await fs.readFile(filePath, 'utf-8');
55
+ const frontmatterMatch = content.match(/^---\n([\s\S]*?)\n---/);
56
+ if (!frontmatterMatch)
57
+ return null;
58
+ const frontmatter = {};
59
+ for (const line of frontmatterMatch[1].split('\n')) {
60
+ const colonIndex = line.indexOf(':');
61
+ if (colonIndex > 0) {
62
+ const key = line.slice(0, colonIndex).trim();
63
+ let value = line.slice(colonIndex + 1).trim();
64
+ // Handle arrays (simple format: [item1, item2])
65
+ if (value.startsWith('[') && value.endsWith(']')) {
66
+ frontmatter[key] = value
67
+ .slice(1, -1)
68
+ .split(',')
69
+ .map((s) => s.trim())
70
+ .filter((s) => s.length > 0);
71
+ }
72
+ else {
73
+ frontmatter[key] = value;
74
+ }
75
+ }
76
+ }
77
+ // Extract sections from body
78
+ const bodyMatch = content.match(/---\n\n([\s\S]*)/);
79
+ const body = bodyMatch ? bodyMatch[1] : '';
80
+ const extractList = (section) => {
81
+ const regex = new RegExp(`## ${section}\\n([\\s\\S]*?)(?=\\n## |$)`);
82
+ const match = body.match(regex);
83
+ if (!match)
84
+ return [];
85
+ return match[1]
86
+ .split('\n')
87
+ .filter((line) => line.startsWith('- '))
88
+ .map((line) => line.slice(2).trim());
89
+ };
90
+ return {
91
+ id: frontmatter.id || '',
92
+ title: frontmatter.title || '',
93
+ summary: frontmatter.summary || '',
94
+ status: frontmatter.status || 'planned',
95
+ priority: frontmatter.priority || 'medium',
96
+ motivation: extractList('Motivation'),
97
+ outcomes: extractList('Outcomes'),
98
+ acceptance_criteria: extractList('Acceptance Criteria'),
99
+ tags: frontmatter.tags || [],
100
+ owner: frontmatter.owner || '',
101
+ squad: frontmatter.squad || '',
102
+ created_at: frontmatter.created_at || '',
103
+ };
104
+ }
105
+ catch {
106
+ return null;
107
+ }
108
+ }
109
+ async function getAllEpics(projectId) {
110
+ const resolved = resolveProjectPaths(projectId);
111
+ const epicsDir = resolved.subPath('sentinel', 'epics');
112
+ const epics = [];
113
+ try {
114
+ const files = await fs.readdir(epicsDir);
115
+ for (const file of files) {
116
+ if (!file.endsWith('.md'))
117
+ continue;
118
+ const filePath = path.join(epicsDir, file);
119
+ const epic = await parseEpicFile(filePath);
120
+ if (epic) {
121
+ epics.push({
122
+ id: epic.id,
123
+ title: epic.title,
124
+ status: epic.status,
125
+ priority: epic.priority,
126
+ });
127
+ }
128
+ }
129
+ }
130
+ catch {
131
+ // Directory doesn't exist yet
132
+ }
133
+ return epics;
134
+ }
135
+ function calculateFuzzyScore(query, text) {
136
+ const q = query.toLowerCase();
137
+ const t = text.toLowerCase();
138
+ // Exact match
139
+ if (t === q)
140
+ return 1.0;
141
+ // Contains exact query
142
+ if (t.includes(q))
143
+ return 0.9;
144
+ // Word-by-word matching
145
+ const queryWords = q.split(/\s+/);
146
+ const textWords = t.split(/\s+/);
147
+ let matchedWords = 0;
148
+ for (const qWord of queryWords) {
149
+ if (textWords.some((tWord) => tWord.includes(qWord) || qWord.includes(tWord))) {
150
+ matchedWords++;
151
+ }
152
+ }
153
+ if (queryWords.length > 0) {
154
+ return (matchedWords / queryWords.length) * 0.8;
155
+ }
156
+ return 0;
157
+ }
158
+ async function parseIssueFile(filePath) {
159
+ try {
160
+ const content = await fs.readFile(filePath, 'utf-8');
161
+ const frontmatterMatch = content.match(/^---\n([\s\S]*?)\n---/);
162
+ if (!frontmatterMatch)
163
+ return null;
164
+ const frontmatter = {};
165
+ for (const line of frontmatterMatch[1].split('\n')) {
166
+ const colonIndex = line.indexOf(':');
167
+ if (colonIndex > 0) {
168
+ const key = line.slice(0, colonIndex).trim();
169
+ const value = line.slice(colonIndex + 1).trim();
170
+ frontmatter[key] = value;
171
+ }
172
+ }
173
+ // Extract title from first heading
174
+ const titleMatch = content.match(/^# (.+)$/m);
175
+ const title = titleMatch ? titleMatch[1] : path.basename(filePath, '.md');
176
+ return {
177
+ id: path.basename(filePath),
178
+ title,
179
+ severity: frontmatter.severity || 'low',
180
+ status: frontmatter.status || 'open',
181
+ };
182
+ }
183
+ catch {
184
+ return null;
185
+ }
186
+ }
187
+ async function findIssueFile(projectId, issueId) {
188
+ const resolved = resolveProjectPaths(projectId);
189
+ const issuesDir = resolved.subPath('sentinel', 'issues');
190
+ try {
191
+ const files = await fs.readdir(issuesDir);
192
+ // Try exact match first
193
+ if (files.includes(issueId)) {
194
+ return { filePath: path.join(issuesDir, issueId), filename: issueId };
195
+ }
196
+ // Try with .md extension
197
+ const withMd = issueId.endsWith('.md') ? issueId : `${issueId}.md`;
198
+ if (files.includes(withMd)) {
199
+ return { filePath: path.join(issuesDir, withMd), filename: withMd };
200
+ }
201
+ // Fuzzy match - find file containing the query
202
+ const match = files.find(f => f.toLowerCase().includes(issueId.toLowerCase()));
203
+ if (match) {
204
+ return { filePath: path.join(issuesDir, match), filename: match };
205
+ }
206
+ return null;
207
+ }
208
+ catch {
209
+ return null;
210
+ }
211
+ }
212
+ async function getProjectIssues(projectId) {
213
+ const resolved = resolveProjectPaths(projectId);
214
+ const issuesDir = resolved.subPath('sentinel', 'issues');
215
+ const issues = [];
216
+ try {
217
+ const files = await fs.readdir(issuesDir);
218
+ for (const file of files) {
219
+ if (!file.endsWith('.md'))
220
+ continue;
221
+ const filePath = path.join(issuesDir, file);
222
+ const issue = await parseIssueFile(filePath);
223
+ if (issue) {
224
+ issues.push({ id: issue.id, title: issue.title });
225
+ }
226
+ }
227
+ }
228
+ catch {
229
+ // Directory doesn't exist
230
+ }
231
+ return issues;
232
+ }
233
+ // ============================================================================
234
+ // Issue Functions
235
+ // ============================================================================
236
+ export async function createIssue(input) {
237
+ // Resolve project paths first - fail fast if no project
238
+ let resolved;
239
+ try {
240
+ resolved = resolveProjectPaths(input.projectId);
241
+ }
242
+ catch (err) {
243
+ return makeProjectResolutionError('create issue');
244
+ }
245
+ const issuesDir = resolved.subPath('sentinel', 'issues');
246
+ // Validate epic_id if provided
247
+ if (input.epic_id) {
248
+ const allEpics = await getAllEpics(input.projectId);
249
+ const epicExists = allEpics.some((e) => e.id === input.epic_id);
250
+ if (!epicExists) {
251
+ // Return structured error with suggestions
252
+ const suggested = allEpics
253
+ .slice(0, 5)
254
+ .map((e) => ({ id: e.id, title: e.title }));
255
+ return {
256
+ error: 'EPIC_NOT_FOUND',
257
+ epic_id: input.epic_id,
258
+ message: `Unknown epic_id ${input.epic_id}.`,
259
+ suggested_epics: suggested,
260
+ };
261
+ }
262
+ }
263
+ const now = new Date();
264
+ const timestamp = now.toISOString();
265
+ const fileTimestamp = formatTimestampForFilename(now);
266
+ const slug = slugify(input.title);
267
+ const filename = `${fileTimestamp}-${slug}.md`;
268
+ ensureDir(issuesDir);
269
+ const filePath = path.join(issuesDir, filename);
270
+ validateWritePath(filePath, resolved);
271
+ // Build frontmatter with optional epic_id
272
+ const frontmatterLines = [
273
+ '---',
274
+ `projectId: ${resolved.id}`,
275
+ `severity: ${input.severity}`,
276
+ `status: open`,
277
+ `created_at: ${timestamp}`,
278
+ ];
279
+ if (input.epic_id) {
280
+ frontmatterLines.push(`epic_id: ${input.epic_id}`);
281
+ }
282
+ frontmatterLines.push('---');
283
+ const frontmatter = frontmatterLines.join('\n');
284
+ const bodyLines = [
285
+ `# ${input.title}`,
286
+ '',
287
+ `**Severity:** ${input.severity}`,
288
+ `**Status:** open`,
289
+ ];
290
+ if (input.epic_id) {
291
+ bodyLines.push(`**Epic:** ${input.epic_id}`);
292
+ }
293
+ bodyLines.push('', '## Details', '', input.details);
294
+ const body = bodyLines.join('\n');
295
+ const content = `${frontmatter}\n\n${body}\n`;
296
+ await fs.writeFile(filePath, content, 'utf-8');
297
+ log(`Sentinel: Created issue at ${filePath} (project: ${resolved.id})`);
298
+ // Emit provenance event for this creation
299
+ await emitCreateProvenance(`sentinel:issue:${filename}`, content, `Created issue: ${input.title}`, input.projectId);
300
+ return {
301
+ id: filename,
302
+ timestamp,
303
+ path: filePath,
304
+ status: 'open',
305
+ epic_id: input.epic_id,
306
+ location: 'project',
307
+ };
308
+ }
309
+ export async function closeIssue(input) {
310
+ // Resolve project paths first
311
+ let resolved;
312
+ try {
313
+ resolved = resolveProjectPaths(input.projectId);
314
+ }
315
+ catch (err) {
316
+ return makeProjectResolutionError('close issue');
317
+ }
318
+ const found = await findIssueFile(input.projectId, input.issue_id);
319
+ if (!found) {
320
+ const available = await getProjectIssues(input.projectId);
321
+ return {
322
+ error: 'ISSUE_NOT_FOUND',
323
+ projectId: resolved.id,
324
+ issue_id: input.issue_id,
325
+ message: `Could not find issue matching "${input.issue_id}" in project "${resolved.id}".`,
326
+ available_issues: available.slice(0, 5),
327
+ };
328
+ }
329
+ const { filePath, filename } = found;
330
+ const content = await fs.readFile(filePath, 'utf-8');
331
+ const now = new Date();
332
+ const closedAt = now.toISOString();
333
+ const newStatus = input.status || 'closed';
334
+ // Update frontmatter
335
+ let updatedContent = content.replace(/^(---\n[\s\S]*?)status: \w+/m, `$1status: ${newStatus}`);
336
+ // Add closed_at to frontmatter if not present
337
+ if (!updatedContent.includes('closed_at:')) {
338
+ updatedContent = updatedContent.replace(/^(---\n[\s\S]*?)(---)$/m, `$1closed_at: ${closedAt}\n$2`);
339
+ }
340
+ else {
341
+ updatedContent = updatedContent.replace(/closed_at: .*/, `closed_at: ${closedAt}`);
342
+ }
343
+ // Update status in body
344
+ updatedContent = updatedContent.replace(/\*\*Status:\*\* \w+/, `**Status:** ${newStatus}`);
345
+ // Add resolution section if provided
346
+ if (input.resolution) {
347
+ if (updatedContent.includes('## Resolution')) {
348
+ // Replace existing resolution
349
+ updatedContent = updatedContent.replace(/## Resolution\n\n[\s\S]*?(?=\n## |$)/, `## Resolution\n\n${input.resolution}\n`);
350
+ }
351
+ else {
352
+ // Add resolution section at the end
353
+ updatedContent = updatedContent.trimEnd() + `\n\n## Resolution\n\n${input.resolution}\n`;
354
+ }
355
+ }
356
+ await fs.writeFile(filePath, updatedContent, 'utf-8');
357
+ log(`Sentinel: Closed issue at ${filePath}`);
358
+ return {
359
+ id: filename,
360
+ path: filePath,
361
+ status: newStatus,
362
+ closed_at: closedAt,
363
+ resolution: input.resolution,
364
+ };
365
+ }
366
+ export async function listRepoIssues(input) {
367
+ let resolved;
368
+ try {
369
+ resolved = resolveProjectPaths(input.projectId);
370
+ }
371
+ catch (err) {
372
+ return makeProjectResolutionError('list issues');
373
+ }
374
+ const issuesDir = resolved.subPath('sentinel', 'issues');
375
+ const issues = [];
376
+ try {
377
+ const files = await fs.readdir(issuesDir);
378
+ for (const file of files) {
379
+ if (!file.endsWith('.md'))
380
+ continue;
381
+ const filePath = path.join(issuesDir, file);
382
+ const issue = await parseIssueFile(filePath);
383
+ if (issue) {
384
+ // Apply status filter
385
+ if (input.status && issue.status !== input.status)
386
+ continue;
387
+ issues.push(issue);
388
+ }
389
+ }
390
+ }
391
+ catch {
392
+ // Directory doesn't exist
393
+ }
394
+ // Sort by filename (newest first based on timestamp)
395
+ issues.sort((a, b) => b.id.localeCompare(a.id));
396
+ return { issues };
397
+ }
398
+ // ============================================================================
399
+ // Epic Functions
400
+ // ============================================================================
401
+ export async function logEpic(input) {
402
+ let resolved;
403
+ try {
404
+ resolved = resolveProjectPaths(input.projectId);
405
+ }
406
+ catch (err) {
407
+ return makeProjectResolutionError('log epic');
408
+ }
409
+ const epicsDir = resolved.subPath('sentinel', 'epics');
410
+ const now = new Date();
411
+ const timestamp = now.toISOString();
412
+ ensureDir(epicsDir);
413
+ const epicNum = await getNextEpicNumber(epicsDir);
414
+ const epicId = formatEpicId(epicNum);
415
+ const slug = slugify(input.title);
416
+ const filename = `${epicId}-${slug}.md`;
417
+ const filePath = path.join(epicsDir, filename);
418
+ validateWritePath(filePath, resolved);
419
+ const priority = input.priority || 'medium';
420
+ const tags = input.tags || [];
421
+ const owner = input.owner || '';
422
+ const squad = input.squad || '';
423
+ // Build frontmatter
424
+ const frontmatter = [
425
+ '---',
426
+ `id: ${epicId}`,
427
+ `projectId: ${resolved.id}`,
428
+ `title: ${input.title}`,
429
+ `summary: ${input.summary}`,
430
+ `status: planned`,
431
+ `priority: ${priority}`,
432
+ `tags: [${tags.join(', ')}]`,
433
+ `owner: ${owner}`,
434
+ `squad: ${squad}`,
435
+ `created_at: ${timestamp}`,
436
+ '---',
437
+ ].join('\n');
438
+ // Build body sections
439
+ const sections = [];
440
+ sections.push(`# ${input.title}`, '', '## Summary', '', input.summary);
441
+ if (input.motivation && input.motivation.length > 0) {
442
+ sections.push('', '## Motivation', '');
443
+ for (const item of input.motivation) {
444
+ sections.push(`- ${item}`);
445
+ }
446
+ }
447
+ if (input.outcomes && input.outcomes.length > 0) {
448
+ sections.push('', '## Outcomes', '');
449
+ for (const item of input.outcomes) {
450
+ sections.push(`- ${item}`);
451
+ }
452
+ }
453
+ if (input.acceptance_criteria && input.acceptance_criteria.length > 0) {
454
+ sections.push('', '## Acceptance Criteria', '');
455
+ for (const item of input.acceptance_criteria) {
456
+ sections.push(`- [ ] ${item}`);
457
+ }
458
+ }
459
+ const content = `${frontmatter}\n\n${sections.join('\n')}\n`;
460
+ await fs.writeFile(filePath, content, 'utf-8');
461
+ log(`Sentinel: Created epic at ${filePath} (project: ${resolved.id})`);
462
+ // Emit provenance event for this creation
463
+ await emitCreateProvenance(`sentinel:epic:${epicId}`, content, `Created epic: ${input.title}`, input.projectId);
464
+ return {
465
+ epic_id: epicId,
466
+ timestamp,
467
+ path: filePath,
468
+ location: 'project',
469
+ };
470
+ }
471
+ export async function listEpics(input) {
472
+ let resolved;
473
+ try {
474
+ resolved = resolveProjectPaths(input.projectId);
475
+ }
476
+ catch (err) {
477
+ return makeProjectResolutionError('list epics');
478
+ }
479
+ const epicsDir = resolved.subPath('sentinel', 'epics');
480
+ const epics = [];
481
+ try {
482
+ const files = await fs.readdir(epicsDir);
483
+ for (const file of files) {
484
+ if (!file.endsWith('.md'))
485
+ continue;
486
+ const filePath = path.join(epicsDir, file);
487
+ const epic = await parseEpicFile(filePath);
488
+ if (!epic)
489
+ continue;
490
+ // Apply filters
491
+ if (input.status && epic.status !== input.status)
492
+ continue;
493
+ if (input.priority && epic.priority !== input.priority)
494
+ continue;
495
+ if (input.tags && input.tags.length > 0) {
496
+ const hasTag = input.tags.some((t) => epic.tags.includes(t));
497
+ if (!hasTag)
498
+ continue;
499
+ }
500
+ epics.push({
501
+ id: epic.id,
502
+ title: epic.title,
503
+ status: epic.status,
504
+ priority: epic.priority,
505
+ });
506
+ }
507
+ }
508
+ catch {
509
+ // Directory doesn't exist yet
510
+ }
511
+ // Sort by ID (newest first based on number)
512
+ epics.sort((a, b) => b.id.localeCompare(a.id));
513
+ return { epics };
514
+ }
515
+ export async function getEpic(input) {
516
+ let resolved;
517
+ try {
518
+ resolved = resolveProjectPaths(input.projectId);
519
+ }
520
+ catch (err) {
521
+ return makeProjectResolutionError('get epic');
522
+ }
523
+ const epicsDir = resolved.subPath('sentinel', 'epics');
524
+ try {
525
+ const files = await fs.readdir(epicsDir);
526
+ const epicFile = files.find((f) => f.startsWith(input.epic_id));
527
+ if (!epicFile) {
528
+ return { epic: null, error: `Epic not found: ${input.epic_id}` };
529
+ }
530
+ const filePath = path.join(epicsDir, epicFile);
531
+ const epic = await parseEpicFile(filePath);
532
+ if (!epic) {
533
+ return { epic: null, error: `Failed to parse epic: ${input.epic_id}` };
534
+ }
535
+ return { epic };
536
+ }
537
+ catch {
538
+ return { epic: null, error: `Epic not found: ${input.epic_id}` };
539
+ }
540
+ }
541
+ export async function getEpicIssues(input) {
542
+ let resolved;
543
+ try {
544
+ resolved = resolveProjectPaths(input.projectId);
545
+ }
546
+ catch (err) {
547
+ return makeProjectResolutionError('get epic issues');
548
+ }
549
+ const issuesDir = resolved.subPath('sentinel', 'issues');
550
+ const issues = [];
551
+ try {
552
+ const issueFiles = await fs.readdir(issuesDir);
553
+ for (const file of issueFiles) {
554
+ if (!file.endsWith('.md'))
555
+ continue;
556
+ const filePath = path.join(issuesDir, file);
557
+ const content = await fs.readFile(filePath, 'utf-8');
558
+ // Check if this issue belongs to the epic
559
+ if (content.includes(`epic_id: ${input.epic_id}`)) {
560
+ const issue = await parseIssueFile(filePath);
561
+ if (issue) {
562
+ issues.push(issue);
563
+ }
564
+ }
565
+ }
566
+ }
567
+ catch {
568
+ // Issues dir doesn't exist
569
+ }
570
+ return { issues };
571
+ }
572
+ export async function resolveEpic(input) {
573
+ let resolved;
574
+ try {
575
+ resolved = resolveProjectPaths(input.projectId);
576
+ }
577
+ catch (err) {
578
+ return makeProjectResolutionError('resolve epic');
579
+ }
580
+ const limit = input.limit || 5;
581
+ const allEpics = await getAllEpics(input.projectId);
582
+ // Score each epic against the query
583
+ const scored = allEpics.map((epic) => {
584
+ // Score against both ID and title
585
+ const idScore = calculateFuzzyScore(input.query, epic.id);
586
+ const titleScore = calculateFuzzyScore(input.query, epic.title);
587
+ const score = Math.max(idScore, titleScore);
588
+ return {
589
+ id: epic.id,
590
+ title: epic.title,
591
+ status: epic.status,
592
+ priority: epic.priority,
593
+ score: Math.round(score * 100) / 100, // Round to 2 decimals
594
+ };
595
+ });
596
+ // Filter out zero scores and sort by score descending
597
+ const matches = scored
598
+ .filter((m) => m.score > 0)
599
+ .sort((a, b) => b.score - a.score)
600
+ .slice(0, limit);
601
+ return { matches };
602
+ }
603
+ //# sourceMappingURL=sentinel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sentinel.js","sourceRoot":"","sources":["../../src/tools/sentinel.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export { toolSuccess, toolError } from './response.js';
2
+ export { withProject, withProjectResult } from './project.js';
3
+ export { requireFields, requireOneOf } from './validation.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/shared/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,7 @@
1
+ // ============================================================================
2
+ // Shared Helpers - Barrel Export
3
+ // ============================================================================
4
+ export { toolSuccess, toolError } from './response.js';
5
+ export { withProject, withProjectResult } from './project.js';
6
+ export { requireFields, requireOneOf } from './validation.js';
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/shared/index.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,iCAAiC;AACjC,+EAA+E;AAE/E,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC"}