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,529 @@
1
+ import fs from 'fs/promises';
2
+ import path from 'path';
3
+ import { parse as parseYaml, stringify as stringifyYaml } from 'yaml';
4
+ import { log } from '../config.js';
5
+ import { resolveProjectPaths } from '../projectRegistry.js';
6
+ function makeProjectError(operation) {
7
+ return {
8
+ error: 'PROJECT_NOT_FOUND',
9
+ message: `Cannot ${operation}: No project context available.`,
10
+ hint: 'Specify project_id parameter, set DECIBEL_PROJECT_ROOT env var, or run from a directory with .decibel/',
11
+ };
12
+ }
13
+ export function isOracleError(result) {
14
+ return (typeof result === 'object' &&
15
+ result !== null &&
16
+ 'error' in result &&
17
+ 'message' in result);
18
+ }
19
+ async function getFilesFromDir(dirPath, type, location, recursive = false) {
20
+ const files = [];
21
+ try {
22
+ const entries = await fs.readdir(dirPath, { withFileTypes: true });
23
+ for (const entry of entries) {
24
+ const fullPath = path.join(dirPath, entry.name);
25
+ // Recursively scan subdirectories if enabled
26
+ if (entry.isDirectory() && recursive) {
27
+ const subFiles = await getFilesFromDir(fullPath, type, location, true);
28
+ files.push(...subFiles);
29
+ continue;
30
+ }
31
+ if (entry.isFile() && entry.name.endsWith('.md')) {
32
+ const filePath = fullPath;
33
+ const content = await fs.readFile(filePath, 'utf-8');
34
+ // Parse timestamp from filename (YYYY-MM-DDTHH-mm-ssZ-slug.md)
35
+ const timestampMatch = entry.name.match(/^(\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-\d{2})/);
36
+ let timestamp = new Date();
37
+ if (timestampMatch) {
38
+ const isoTimestamp = timestampMatch[1].replace(/-/g, (match, offset) => {
39
+ // Only replace the hyphens after the date part (position > 10)
40
+ if (offset > 10 && offset < 19)
41
+ return ':';
42
+ return match;
43
+ });
44
+ timestamp = new Date(isoTimestamp);
45
+ }
46
+ // Extract summary from frontmatter or first heading
47
+ let summary;
48
+ let severity;
49
+ const summaryMatch = content.match(/^summary:\s*(.+)$/m);
50
+ if (summaryMatch)
51
+ summary = summaryMatch[1];
52
+ const changeMatch = content.match(/^change:\s*(.+)$/m);
53
+ if (changeMatch && !summary)
54
+ summary = changeMatch[1];
55
+ const titleMatch = content.match(/^#\s+(.+)$/m);
56
+ if (titleMatch && !summary)
57
+ summary = titleMatch[1];
58
+ const severityMatch = content.match(/^severity:\s*(.+)$/m);
59
+ if (severityMatch)
60
+ severity = severityMatch[1];
61
+ files.push({
62
+ filename: entry.name,
63
+ path: filePath,
64
+ timestamp,
65
+ type,
66
+ summary,
67
+ severity,
68
+ location,
69
+ });
70
+ }
71
+ }
72
+ }
73
+ catch (error) {
74
+ // Directory might not exist, that's OK
75
+ log(`Oracle: Could not read ${dirPath}:`, error);
76
+ }
77
+ return files;
78
+ }
79
+ async function getFrictionFiles(resolved) {
80
+ // Friction is in project .decibel/friction/
81
+ const frictionDir = resolved.subPath('friction');
82
+ const frictionList = [];
83
+ try {
84
+ const entries = await fs.readdir(frictionDir, { withFileTypes: true });
85
+ for (const entry of entries) {
86
+ if (entry.isFile() && entry.name.endsWith('.md')) {
87
+ const filePath = path.join(frictionDir, entry.name);
88
+ const content = await fs.readFile(filePath, 'utf-8');
89
+ // Parse frontmatter
90
+ const contextMatch = content.match(/^context:\s*(.+)$/m);
91
+ const impactMatch = content.match(/^impact:\s*(.+)$/m);
92
+ const statusMatch = content.match(/^status:\s*(.+)$/m);
93
+ const signalMatch = content.match(/^signal_count:\s*(\d+)$/m);
94
+ const lastReportedMatch = content.match(/^last_reported:\s*(.+)$/m);
95
+ const titleMatch = content.match(/^#\s+(.+)$/m);
96
+ const status = statusMatch?.[1] || 'open';
97
+ // Only include open friction
98
+ if (status !== 'open' && status !== 'acknowledged' && status !== 'solving') {
99
+ continue;
100
+ }
101
+ frictionList.push({
102
+ filename: entry.name,
103
+ path: filePath,
104
+ context: contextMatch?.[1] || 'unknown',
105
+ description: titleMatch?.[1] || entry.name,
106
+ impact: impactMatch?.[1] || 'medium',
107
+ status,
108
+ signal_count: parseInt(signalMatch?.[1] || '1', 10),
109
+ last_reported: new Date(lastReportedMatch?.[1] || Date.now()),
110
+ });
111
+ }
112
+ }
113
+ }
114
+ catch (error) {
115
+ log(`Oracle: Could not read friction directory:`, error);
116
+ }
117
+ return frictionList;
118
+ }
119
+ async function collectRecentFiles(resolved) {
120
+ const allFiles = [];
121
+ // Sentinel issues from project .decibel/sentinel/issues/
122
+ const projectIssuesDir = resolved.subPath('sentinel', 'issues');
123
+ const projectIssues = await getFilesFromDir(projectIssuesDir, 'sentinel', 'project');
124
+ allFiles.push(...projectIssues);
125
+ // Architect ADRs from project .decibel/architect/adrs/
126
+ const projectArchitectDir = resolved.subPath('architect', 'adrs');
127
+ const projectArchitect = await getFilesFromDir(projectArchitectDir, 'architect', 'project');
128
+ allFiles.push(...projectArchitect);
129
+ // Designer from project .decibel/designer/ (recursively scan area subdirectories)
130
+ const projectDesignerDir = resolved.subPath('designer');
131
+ const projectDesigner = await getFilesFromDir(projectDesignerDir, 'designer', 'project', true);
132
+ allFiles.push(...projectDesigner);
133
+ // Sort by timestamp descending and take last 10
134
+ allFiles.sort((a, b) => b.timestamp.getTime() - a.timestamp.getTime());
135
+ return allFiles.slice(0, 10);
136
+ }
137
+ function inferPriority(file) {
138
+ // Sentinel issues with high/critical severity get high priority
139
+ if (file.type === 'sentinel') {
140
+ if (file.severity === 'critical' || file.severity === 'high') {
141
+ return 'high';
142
+ }
143
+ if (file.severity === 'med') {
144
+ return 'med';
145
+ }
146
+ return 'low';
147
+ }
148
+ // Architect decisions are typically medium-high priority
149
+ if (file.type === 'architect') {
150
+ return 'med';
151
+ }
152
+ // Designer decisions are typically medium-low priority
153
+ return 'low';
154
+ }
155
+ function inferFrictionPriority(friction) {
156
+ // Blocking = always high
157
+ if (friction.impact === 'blocking')
158
+ return 'high';
159
+ // High signal (3+) elevates priority
160
+ if (friction.signal_count >= 3) {
161
+ if (friction.impact === 'high')
162
+ return 'high';
163
+ return 'med';
164
+ }
165
+ // High impact with any signal
166
+ if (friction.impact === 'high')
167
+ return 'med';
168
+ // Medium signal (2) with medium impact
169
+ if (friction.signal_count >= 2 && friction.impact === 'medium')
170
+ return 'med';
171
+ return 'low';
172
+ }
173
+ function generateActionDescription(file) {
174
+ const prefix = {
175
+ designer: 'Review design decision',
176
+ architect: 'Implement architecture change',
177
+ sentinel: 'Address issue',
178
+ };
179
+ const summary = file.summary || file.filename;
180
+ return `${prefix[file.type]}: ${summary}`;
181
+ }
182
+ export async function nextActions(input) {
183
+ let resolved;
184
+ try {
185
+ resolved = resolveProjectPaths(input.projectId);
186
+ }
187
+ catch {
188
+ return makeProjectError('get next actions');
189
+ }
190
+ log(`Oracle: Getting next actions for project ${resolved.id}`);
191
+ const recentFiles = await collectRecentFiles(resolved);
192
+ const allFriction = await getFrictionFiles(resolved);
193
+ // Filter friction by project context (or include all if no specific match)
194
+ const projectFriction = allFriction.filter(f => f.context === resolved.id ||
195
+ f.context.toLowerCase().includes(resolved.id.toLowerCase()));
196
+ // Also get high-signal friction from any context
197
+ const highSignalFriction = allFriction.filter(f => f.signal_count >= 3 || f.impact === 'blocking');
198
+ // Combine and dedupe
199
+ const relevantFriction = Array.from(new Map([...projectFriction, ...highSignalFriction].map(f => [f.filename, f])).values());
200
+ // Build friction summary
201
+ const frictionSummary = {
202
+ total_open: allFriction.length,
203
+ high_signal: allFriction.filter(f => f.signal_count >= 3).length,
204
+ blocking: allFriction.filter(f => f.impact === 'blocking').length,
205
+ };
206
+ const dataLocations = {
207
+ project_local: true,
208
+ global: false,
209
+ };
210
+ if (recentFiles.length === 0 && relevantFriction.length === 0) {
211
+ return {
212
+ actions: [{
213
+ description: `No recent activity found for project ${resolved.id}. Start by recording design decisions or architecture changes.`,
214
+ source: 'oracle',
215
+ priority: 'low',
216
+ }],
217
+ friction_summary: frictionSummary,
218
+ data_locations: dataLocations,
219
+ };
220
+ }
221
+ // Generate actions based on recent files
222
+ const actions = [];
223
+ // Filter by focus if provided
224
+ let filesToProcess = recentFiles;
225
+ if (input.focus) {
226
+ const focusLower = input.focus.toLowerCase();
227
+ filesToProcess = recentFiles.filter(f => f.type === focusLower ||
228
+ f.summary?.toLowerCase().includes(focusLower) ||
229
+ f.filename.toLowerCase().includes(focusLower));
230
+ // If no matches, fall back to all files
231
+ if (filesToProcess.length === 0) {
232
+ filesToProcess = recentFiles;
233
+ }
234
+ }
235
+ // Add friction actions FIRST (they're often the most actionable)
236
+ const sortedFriction = relevantFriction.sort((a, b) => {
237
+ // Sort by: blocking first, then signal count, then impact
238
+ if (a.impact === 'blocking' && b.impact !== 'blocking')
239
+ return -1;
240
+ if (b.impact === 'blocking' && a.impact !== 'blocking')
241
+ return 1;
242
+ if (b.signal_count !== a.signal_count)
243
+ return b.signal_count - a.signal_count;
244
+ const impactOrder = { blocking: 4, high: 3, medium: 2, low: 1 };
245
+ return (impactOrder[b.impact] || 0) - (impactOrder[a.impact] || 0);
246
+ });
247
+ for (const friction of sortedFriction.slice(0, 2)) {
248
+ actions.push({
249
+ description: `Resolve friction (signal: ${friction.signal_count}): ${friction.description}`,
250
+ source: friction.path,
251
+ priority: inferFrictionPriority(friction),
252
+ domain: 'friction',
253
+ location: 'project',
254
+ });
255
+ }
256
+ // Prioritize sentinel issues first
257
+ const sentinelFiles = filesToProcess.filter(f => f.type === 'sentinel');
258
+ const architectFiles = filesToProcess.filter(f => f.type === 'architect');
259
+ const designerFiles = filesToProcess.filter(f => f.type === 'designer');
260
+ // Add sentinel issues (high priority items first)
261
+ for (const file of sentinelFiles.slice(0, 3)) {
262
+ actions.push({
263
+ description: generateActionDescription(file),
264
+ source: file.path,
265
+ priority: inferPriority(file),
266
+ domain: 'sentinel',
267
+ location: file.location,
268
+ });
269
+ }
270
+ // Add architect decisions
271
+ for (const file of architectFiles.slice(0, 2)) {
272
+ actions.push({
273
+ description: generateActionDescription(file),
274
+ source: file.path,
275
+ priority: inferPriority(file),
276
+ domain: 'architect',
277
+ location: file.location,
278
+ });
279
+ }
280
+ // Add designer decisions
281
+ for (const file of designerFiles.slice(0, 2)) {
282
+ actions.push({
283
+ description: generateActionDescription(file),
284
+ source: file.path,
285
+ priority: inferPriority(file),
286
+ domain: 'designer',
287
+ location: file.location,
288
+ });
289
+ }
290
+ // Ensure we have at least 3 and at most 7 actions
291
+ if (actions.length < 3 && filesToProcess.length > actions.length) {
292
+ for (const file of filesToProcess) {
293
+ if (actions.length >= 7)
294
+ break;
295
+ if (!actions.find(a => a.source === file.path)) {
296
+ actions.push({
297
+ description: generateActionDescription(file),
298
+ source: file.path,
299
+ priority: inferPriority(file),
300
+ domain: file.type,
301
+ location: file.location,
302
+ });
303
+ }
304
+ }
305
+ }
306
+ // Sort by priority (high > med > low)
307
+ const priorityOrder = { high: 0, med: 1, low: 2 };
308
+ actions.sort((a, b) => priorityOrder[a.priority] - priorityOrder[b.priority]);
309
+ return {
310
+ actions: actions.slice(0, 7),
311
+ friction_summary: frictionSummary,
312
+ data_locations: dataLocations,
313
+ };
314
+ }
315
+ async function loadRoadmap(resolved) {
316
+ const roadmapPath = resolved.subPath('architect', 'roadmap', 'roadmap.yaml');
317
+ try {
318
+ const content = await fs.readFile(roadmapPath, 'utf-8');
319
+ return parseYaml(content);
320
+ }
321
+ catch {
322
+ return null;
323
+ }
324
+ }
325
+ async function loadSentinelIssues(resolved) {
326
+ const issuesDir = resolved.subPath('sentinel', 'issues');
327
+ const issues = [];
328
+ try {
329
+ const entries = await fs.readdir(issuesDir, { withFileTypes: true });
330
+ for (const entry of entries) {
331
+ if (entry.isFile() && (entry.name.endsWith('.yaml') || entry.name.endsWith('.yml'))) {
332
+ const filePath = path.join(issuesDir, entry.name);
333
+ const content = await fs.readFile(filePath, 'utf-8');
334
+ const data = parseYaml(content);
335
+ issues.push({
336
+ id: data.id || entry.name.replace(/\.(yaml|yml)$/, ''),
337
+ epic_id: data.epic_id,
338
+ status: data.status || 'open',
339
+ severity: data.severity || 'medium',
340
+ });
341
+ }
342
+ }
343
+ }
344
+ catch {
345
+ // Issues directory might not exist
346
+ }
347
+ return issues;
348
+ }
349
+ async function loadEpicStatuses(resolved) {
350
+ const epicsDir = resolved.subPath('sentinel', 'epics');
351
+ const statuses = new Map();
352
+ try {
353
+ const entries = await fs.readdir(epicsDir, { withFileTypes: true });
354
+ for (const entry of entries) {
355
+ if (entry.isFile() && (entry.name.endsWith('.yaml') || entry.name.endsWith('.yml') || entry.name.endsWith('.md'))) {
356
+ const filePath = path.join(epicsDir, entry.name);
357
+ const content = await fs.readFile(filePath, 'utf-8');
358
+ // Try YAML first
359
+ if (entry.name.endsWith('.yaml') || entry.name.endsWith('.yml')) {
360
+ const data = parseYaml(content);
361
+ const epicId = data.id || data.epic_id || entry.name.replace(/\.(yaml|yml)$/, '');
362
+ const status = data.status || 'not_started';
363
+ statuses.set(epicId, status);
364
+ }
365
+ else {
366
+ // Try to parse frontmatter from markdown
367
+ const statusMatch = content.match(/^status:\s*(.+)$/m);
368
+ const idMatch = content.match(/^(?:id|epic_id):\s*(.+)$/m);
369
+ const epicId = idMatch?.[1] || entry.name.replace(/\.md$/, '');
370
+ const status = statusMatch?.[1] || 'not_started';
371
+ statuses.set(epicId, status);
372
+ }
373
+ }
374
+ }
375
+ }
376
+ catch {
377
+ // Epics directory might not exist
378
+ }
379
+ return statuses;
380
+ }
381
+ function calculateMilestoneStatus(milestone, epicsCompleted, epicsTotal, epicsBlocked) {
382
+ if (epicsTotal > 0 && epicsCompleted === epicsTotal) {
383
+ return 'completed';
384
+ }
385
+ const targetDate = new Date(milestone.target_date);
386
+ const now = new Date();
387
+ const daysRemaining = Math.ceil((targetDate.getTime() - now.getTime()) / (1000 * 60 * 60 * 24));
388
+ if (daysRemaining < 0) {
389
+ return 'behind';
390
+ }
391
+ const progressPercent = epicsTotal > 0 ? (epicsCompleted / epicsTotal) * 100 : 0;
392
+ // If we have blocked epics or low progress with little time, we're at risk
393
+ if (epicsBlocked > 0) {
394
+ return 'at_risk';
395
+ }
396
+ // Calculate expected progress based on time
397
+ const totalDays = 90; // Assume 90 day milestones as baseline
398
+ const expectedProgress = Math.min(100, ((totalDays - daysRemaining) / totalDays) * 100);
399
+ if (progressPercent < expectedProgress - 20) {
400
+ return 'behind';
401
+ }
402
+ if (progressPercent < expectedProgress - 10) {
403
+ return 'at_risk';
404
+ }
405
+ return 'on_track';
406
+ }
407
+ export async function roadmapProgress(input) {
408
+ let resolved;
409
+ try {
410
+ resolved = resolveProjectPaths(input.projectId);
411
+ }
412
+ catch {
413
+ return makeProjectError('evaluate roadmap progress');
414
+ }
415
+ log(`Oracle: Evaluating roadmap progress for project ${resolved.id}`);
416
+ // Load roadmap
417
+ const roadmap = await loadRoadmap(resolved);
418
+ if (!roadmap) {
419
+ return {
420
+ error: 'ROADMAP_NOT_FOUND',
421
+ message: 'No roadmap.yaml found in .decibel/architect/roadmap/',
422
+ hint: 'Initialize a roadmap with roadmap_init tool or create roadmap.yaml manually',
423
+ };
424
+ }
425
+ // Load epic statuses and issues
426
+ const epicStatuses = await loadEpicStatuses(resolved);
427
+ const issues = input.noSignals ? [] : await loadSentinelIssues(resolved);
428
+ // Build epic status list
429
+ const epics = [];
430
+ for (const [epicId, context] of Object.entries(roadmap.epic_context)) {
431
+ const statusStr = epicStatuses.get(epicId) || 'not_started';
432
+ const epicIssues = issues.filter(i => i.epic_id === epicId);
433
+ const openIssues = epicIssues.filter(i => i.status === 'open' || i.status === 'in_progress');
434
+ let status = 'not_started';
435
+ if (statusStr === 'completed' || statusStr === 'done') {
436
+ status = 'completed';
437
+ }
438
+ else if (statusStr === 'blocked') {
439
+ status = 'blocked';
440
+ }
441
+ else if (statusStr === 'in_progress' || statusStr === 'active') {
442
+ status = 'in_progress';
443
+ }
444
+ epics.push({
445
+ epic_id: epicId,
446
+ status,
447
+ issue_count: epicIssues.length,
448
+ open_issues: openIssues.length,
449
+ });
450
+ }
451
+ // Calculate milestone progress
452
+ const milestones = roadmap.milestones.map(ms => {
453
+ const msEpics = ms.epics || [];
454
+ const epicStatusList = msEpics.map(eid => epics.find(e => e.epic_id === eid));
455
+ const total = msEpics.length;
456
+ const completed = epicStatusList.filter(e => e?.status === 'completed').length;
457
+ const inProgress = epicStatusList.filter(e => e?.status === 'in_progress').length;
458
+ const blocked = epicStatusList.filter(e => e?.status === 'blocked').length;
459
+ const targetDate = new Date(ms.target_date);
460
+ const now = new Date();
461
+ const daysRemaining = Math.ceil((targetDate.getTime() - now.getTime()) / (1000 * 60 * 60 * 24));
462
+ return {
463
+ id: ms.id,
464
+ label: ms.label,
465
+ target_date: ms.target_date,
466
+ epics_total: total,
467
+ epics_completed: completed,
468
+ epics_in_progress: inProgress,
469
+ epics_blocked: blocked,
470
+ progress_percent: total > 0 ? Math.round((completed / total) * 100) : 0,
471
+ status: calculateMilestoneStatus(ms, completed, total, blocked),
472
+ days_remaining: daysRemaining,
473
+ };
474
+ });
475
+ // Calculate objective progress (simplified - just count linked epics)
476
+ const objectives = roadmap.objectives.map(obj => {
477
+ const linkedEpics = Object.values(roadmap.epic_context)
478
+ .filter(ec => ec.objectives?.includes(obj.id));
479
+ const completedEpics = linkedEpics.filter(ec => epics.find(e => e.epic_id === ec.epic_id)?.status === 'completed');
480
+ return {
481
+ id: obj.id,
482
+ title: obj.title,
483
+ timeframe: obj.timeframe,
484
+ key_results: obj.key_results || [],
485
+ overall_progress: linkedEpics.length > 0
486
+ ? Math.round((completedEpics.length / linkedEpics.length) * 100)
487
+ : 0,
488
+ };
489
+ });
490
+ // Build signals summary
491
+ const signals = input.noSignals ? undefined : {
492
+ blocking_issues: issues.filter(i => i.severity === 'critical' || i.severity === 'blocking').length,
493
+ high_severity_issues: issues.filter(i => i.severity === 'high').length,
494
+ friction_points: 0, // Would need to load friction files
495
+ };
496
+ // Summary
497
+ const summary = {
498
+ total_milestones: milestones.length,
499
+ on_track: milestones.filter(m => m.status === 'on_track').length,
500
+ at_risk: milestones.filter(m => m.status === 'at_risk').length,
501
+ behind: milestones.filter(m => m.status === 'behind').length,
502
+ completed: milestones.filter(m => m.status === 'completed').length,
503
+ };
504
+ const output = {
505
+ project_id: resolved.id,
506
+ evaluated_at: new Date().toISOString(),
507
+ milestones,
508
+ objectives,
509
+ epics,
510
+ signals,
511
+ summary,
512
+ };
513
+ // Save progress file unless dry run
514
+ if (!input.dryRun) {
515
+ const progressDir = resolved.subPath('oracle');
516
+ const progressPath = path.join(progressDir, 'progress.yaml');
517
+ try {
518
+ await fs.mkdir(progressDir, { recursive: true });
519
+ await fs.writeFile(progressPath, stringifyYaml(output), 'utf-8');
520
+ output.progress_file = progressPath;
521
+ log(`Oracle: Saved progress to ${progressPath}`);
522
+ }
523
+ catch (err) {
524
+ log(`Oracle: Could not save progress file:`, err);
525
+ }
526
+ }
527
+ return output;
528
+ }
529
+ //# sourceMappingURL=oracle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oracle.js","sourceRoot":"","sources":["../../src/tools/oracle.ts"],"names":[],"mappings":"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"}