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,331 @@
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
+ function makeProjectResolutionError(operation) {
8
+ return {
9
+ error: 'project_resolution_failed',
10
+ message: `Cannot ${operation}: No project context available.`,
11
+ hint: 'Either specify projectId parameter, set DECIBEL_PROJECT_ROOT env var, or run from a directory containing .decibel/',
12
+ };
13
+ }
14
+ // ============================================================================
15
+ // Helpers
16
+ // ============================================================================
17
+ function slugify(text) {
18
+ return text
19
+ .toLowerCase()
20
+ .replace(/[^a-z0-9]+/g, '-')
21
+ .replace(/^-|-$/g, '')
22
+ .substring(0, 50);
23
+ }
24
+ function formatTimestampForFilename(date) {
25
+ const iso = date.toISOString();
26
+ return iso.replace(/:/g, '-').replace(/\.\d{3}Z$/, 'Z');
27
+ }
28
+ const impactOrder = {
29
+ low: 1,
30
+ medium: 2,
31
+ high: 3,
32
+ blocking: 4,
33
+ };
34
+ async function parseFrictionFile(filePath) {
35
+ try {
36
+ const content = await fs.readFile(filePath, 'utf-8');
37
+ const frontmatterMatch = content.match(/^---\n([\s\S]*?)\n---/);
38
+ if (!frontmatterMatch)
39
+ return null;
40
+ const frontmatter = {};
41
+ for (const line of frontmatterMatch[1].split('\n')) {
42
+ const colonIndex = line.indexOf(':');
43
+ if (colonIndex > 0) {
44
+ const key = line.slice(0, colonIndex).trim();
45
+ let value = line.slice(colonIndex + 1).trim();
46
+ if (value.startsWith('[') && value.endsWith(']')) {
47
+ frontmatter[key] = value
48
+ .slice(1, -1)
49
+ .split(',')
50
+ .map((s) => s.trim())
51
+ .filter((s) => s.length > 0);
52
+ }
53
+ else {
54
+ frontmatter[key] = value;
55
+ }
56
+ }
57
+ }
58
+ // Extract description from first paragraph after frontmatter
59
+ const bodyMatch = content.match(/---\n\n# .+\n\n([\s\S]*?)(?=\n## |$)/);
60
+ const description = bodyMatch ? bodyMatch[1].trim().split('\n')[0] : '';
61
+ return {
62
+ id: path.basename(filePath, '.md'),
63
+ context: frontmatter.context || '',
64
+ description,
65
+ frequency: frontmatter.frequency || 'occasional',
66
+ impact: frontmatter.impact || 'medium',
67
+ status: frontmatter.status || 'open',
68
+ signal_count: parseInt(frontmatter.signal_count, 10) || 1,
69
+ last_reported: frontmatter.last_reported || '',
70
+ tags: frontmatter.tags || [],
71
+ };
72
+ }
73
+ catch {
74
+ return null;
75
+ }
76
+ }
77
+ async function findFrictionFile(frictionId, projectId) {
78
+ let resolved;
79
+ try {
80
+ resolved = resolveProjectPaths(projectId);
81
+ }
82
+ catch {
83
+ return null;
84
+ }
85
+ const frictionDir = resolved.subPath('friction');
86
+ try {
87
+ const files = await fs.readdir(frictionDir);
88
+ // Exact match
89
+ const exact = files.find(f => f === frictionId || f === `${frictionId}.md`);
90
+ if (exact)
91
+ return path.join(frictionDir, exact);
92
+ // Partial match
93
+ const partial = files.find(f => f.toLowerCase().includes(frictionId.toLowerCase()));
94
+ if (partial)
95
+ return path.join(frictionDir, partial);
96
+ return null;
97
+ }
98
+ catch {
99
+ return null;
100
+ }
101
+ }
102
+ // ============================================================================
103
+ // Functions
104
+ // ============================================================================
105
+ export async function logFriction(input) {
106
+ let resolved;
107
+ try {
108
+ resolved = resolveProjectPaths(input.projectId);
109
+ }
110
+ catch (err) {
111
+ return makeProjectResolutionError('log friction');
112
+ }
113
+ const now = new Date();
114
+ const timestamp = now.toISOString();
115
+ const fileTimestamp = formatTimestampForFilename(now);
116
+ const frictionDir = resolved.subPath('friction');
117
+ ensureDir(frictionDir);
118
+ const slug = slugify(input.description);
119
+ const filename = `${fileTimestamp}-${slug}.md`;
120
+ const filePath = path.join(frictionDir, filename);
121
+ const frequency = input.frequency || 'occasional';
122
+ const impact = input.impact || 'medium';
123
+ const source = input.source || 'human';
124
+ const tags = input.tags || [];
125
+ // Check for similar existing friction (same context + similar description)
126
+ let signalStrength = 1;
127
+ try {
128
+ const existingFiles = await fs.readdir(frictionDir);
129
+ for (const file of existingFiles) {
130
+ if (!file.endsWith('.md'))
131
+ continue;
132
+ const existing = await parseFrictionFile(path.join(frictionDir, file));
133
+ if (existing &&
134
+ existing.context === input.context &&
135
+ existing.status === 'open' &&
136
+ (existing.description.toLowerCase().includes(slug.replace(/-/g, ' ')) ||
137
+ slug.replace(/-/g, ' ').includes(existing.description.toLowerCase().substring(0, 20)))) {
138
+ signalStrength++;
139
+ }
140
+ }
141
+ }
142
+ catch {
143
+ // Directory doesn't exist yet
144
+ }
145
+ // Build frontmatter
146
+ const frontmatter = [
147
+ '---',
148
+ `context: ${input.context}`,
149
+ `frequency: ${frequency}`,
150
+ `impact: ${impact}`,
151
+ `status: open`,
152
+ `source: ${source}`,
153
+ `signal_count: 1`,
154
+ `created_at: ${timestamp}`,
155
+ `last_reported: ${timestamp}`,
156
+ `tags: [${tags.join(', ')}]`,
157
+ '---',
158
+ ].join('\n');
159
+ // Build body
160
+ const bodyLines = [
161
+ `# ${input.description}`,
162
+ '',
163
+ input.description,
164
+ '',
165
+ '## Context',
166
+ '',
167
+ `**Where:** ${input.context}`,
168
+ `**Frequency:** ${frequency}`,
169
+ `**Impact:** ${impact}`,
170
+ `**Reported by:** ${source}`,
171
+ ];
172
+ if (input.workaround) {
173
+ bodyLines.push('', '## Current Workaround', '', input.workaround);
174
+ }
175
+ bodyLines.push('', '## Signal Log', '', `- ${timestamp} [${source}] Initial report`);
176
+ const content = `${frontmatter}\n\n${bodyLines.join('\n')}\n`;
177
+ validateWritePath(filePath, resolved);
178
+ await fs.writeFile(filePath, content, 'utf-8');
179
+ log(`Friction: Logged friction at ${filePath} (project: ${resolved.id})`);
180
+ // Emit provenance event for this creation
181
+ await emitCreateProvenance(`friction:log:${filename.replace('.md', '')}`, content, `Logged friction: ${input.description}`, input.projectId);
182
+ return {
183
+ id: filename.replace('.md', ''),
184
+ timestamp,
185
+ path: filePath,
186
+ context: input.context,
187
+ signal_strength: signalStrength,
188
+ };
189
+ }
190
+ export async function listFriction(input) {
191
+ let resolved;
192
+ try {
193
+ resolved = resolveProjectPaths(input.projectId);
194
+ }
195
+ catch (err) {
196
+ return makeProjectResolutionError('list friction');
197
+ }
198
+ const frictionDir = resolved.subPath('friction');
199
+ const limit = input.limit || 20;
200
+ let frictionList = [];
201
+ try {
202
+ const files = await fs.readdir(frictionDir);
203
+ for (const file of files) {
204
+ if (!file.endsWith('.md'))
205
+ continue;
206
+ const filePath = path.join(frictionDir, file);
207
+ const friction = await parseFrictionFile(filePath);
208
+ if (!friction)
209
+ continue;
210
+ // Apply filters
211
+ if (input.context && friction.context !== input.context)
212
+ continue;
213
+ if (input.status && friction.status !== input.status)
214
+ continue;
215
+ if (input.source) {
216
+ // Would need to check file content for source filter
217
+ }
218
+ if (input.min_impact && impactOrder[friction.impact] < impactOrder[input.min_impact])
219
+ continue;
220
+ frictionList.push(friction);
221
+ }
222
+ }
223
+ catch {
224
+ // Directory doesn't exist
225
+ }
226
+ const totalCount = frictionList.length;
227
+ // Sort by impact (desc), then signal_count (desc), then last_reported (desc)
228
+ frictionList.sort((a, b) => {
229
+ const impactDiff = impactOrder[b.impact] - impactOrder[a.impact];
230
+ if (impactDiff !== 0)
231
+ return impactDiff;
232
+ const signalDiff = b.signal_count - a.signal_count;
233
+ if (signalDiff !== 0)
234
+ return signalDiff;
235
+ return b.last_reported.localeCompare(a.last_reported);
236
+ });
237
+ // Apply limit
238
+ frictionList = frictionList.slice(0, limit);
239
+ return {
240
+ friction: frictionList,
241
+ total_count: totalCount,
242
+ };
243
+ }
244
+ export async function resolveFriction(input) {
245
+ let resolved;
246
+ try {
247
+ resolved = resolveProjectPaths(input.projectId);
248
+ }
249
+ catch (err) {
250
+ return makeProjectResolutionError('resolve friction');
251
+ }
252
+ const filePath = await findFrictionFile(input.friction_id, input.projectId);
253
+ if (!filePath) {
254
+ return { error: `Friction not found: ${input.friction_id}` };
255
+ }
256
+ const content = await fs.readFile(filePath, 'utf-8');
257
+ const now = new Date();
258
+ const resolvedAt = now.toISOString();
259
+ const newStatus = input.status || 'resolved';
260
+ // Update frontmatter
261
+ let updatedContent = content.replace(/^(---\n[\s\S]*?)status: \w+/m, `$1status: ${newStatus}`);
262
+ // Add resolved_at to frontmatter
263
+ if (!updatedContent.includes('resolved_at:')) {
264
+ updatedContent = updatedContent.replace(/^(---\n[\s\S]*?)(---)$/m, `$1resolved_at: ${resolvedAt}\n$2`);
265
+ }
266
+ // Add resolution section
267
+ const resolutionSection = [
268
+ '',
269
+ '## Resolution',
270
+ '',
271
+ input.resolution,
272
+ ];
273
+ if (input.solution_ref) {
274
+ resolutionSection.push('', `**Solution Reference:** ${input.solution_ref}`);
275
+ }
276
+ resolutionSection.push('', `**Resolved:** ${resolvedAt}`);
277
+ if (updatedContent.includes('## Resolution')) {
278
+ updatedContent = updatedContent.replace(/## Resolution[\s\S]*$/, resolutionSection.join('\n') + '\n');
279
+ }
280
+ else {
281
+ updatedContent = updatedContent.trimEnd() + '\n' + resolutionSection.join('\n') + '\n';
282
+ }
283
+ validateWritePath(filePath, resolved);
284
+ await fs.writeFile(filePath, updatedContent, 'utf-8');
285
+ log(`Friction: Resolved friction at ${filePath} (project: ${resolved.id})`);
286
+ return {
287
+ id: path.basename(filePath, '.md'),
288
+ path: filePath,
289
+ status: newStatus,
290
+ resolved_at: resolvedAt,
291
+ };
292
+ }
293
+ export async function bumpFriction(input) {
294
+ let resolved;
295
+ try {
296
+ resolved = resolveProjectPaths(input.projectId);
297
+ }
298
+ catch (err) {
299
+ return makeProjectResolutionError('bump friction');
300
+ }
301
+ const filePath = await findFrictionFile(input.friction_id, input.projectId);
302
+ if (!filePath) {
303
+ return { error: `Friction not found: ${input.friction_id}` };
304
+ }
305
+ const content = await fs.readFile(filePath, 'utf-8');
306
+ const now = new Date();
307
+ const timestamp = now.toISOString();
308
+ const source = input.source || 'human';
309
+ // Parse current signal_count
310
+ const signalMatch = content.match(/signal_count: (\d+)/);
311
+ const currentCount = signalMatch ? parseInt(signalMatch[1], 10) : 1;
312
+ const newCount = currentCount + 1;
313
+ // Update frontmatter
314
+ let updatedContent = content
315
+ .replace(/signal_count: \d+/, `signal_count: ${newCount}`)
316
+ .replace(/last_reported: .+/, `last_reported: ${timestamp}`);
317
+ // Add to signal log
318
+ const logEntry = input.note
319
+ ? `- ${timestamp} [${source}] ${input.note}`
320
+ : `- ${timestamp} [${source}] Bump`;
321
+ updatedContent = updatedContent.replace(/(## Signal Log\n\n)([\s\S]*?)(\n\n## |$)/, `$1$2\n${logEntry}$3`);
322
+ validateWritePath(filePath, resolved);
323
+ await fs.writeFile(filePath, updatedContent, 'utf-8');
324
+ log(`Friction: Bumped friction at ${filePath} (project: ${resolved.id}, signal: ${newCount})`);
325
+ return {
326
+ id: path.basename(filePath, '.md'),
327
+ signal_count: newCount,
328
+ last_reported: timestamp,
329
+ };
330
+ }
331
+ //# sourceMappingURL=friction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"friction.js","sourceRoot":"","sources":["../../src/tools/friction.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { ToolSpec } from './types.js';
2
+ export declare const modularTools: ToolSpec[];
3
+ export declare const modularToolMap: Map<string, ToolSpec>;
4
+ export declare function getModularToolNames(): string[];
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAqBtC,eAAO,MAAM,YAAY,EAAE,QAAQ,EAgBlC,CAAC;AAMF,eAAO,MAAM,cAAc,uBAE1B,CAAC;AAMF,wBAAgB,mBAAmB,IAAI,MAAM,EAAE,CAE9C"}
@@ -0,0 +1,52 @@
1
+ // ============================================================================
2
+ // Tools Aggregator
3
+ // ============================================================================
4
+ // Central registry of all modular tools.
5
+ // Domains are added here as they are migrated from server.ts.
6
+ // ============================================================================
7
+ import { registryTools } from './registry/index.js';
8
+ import { sentinelTools } from './sentinel/index.js';
9
+ import { dojoTools } from './dojo/index.js';
10
+ import { provenanceTools } from './provenance/index.js';
11
+ import { oracleTools } from './oracle/index.js';
12
+ import { learningsTools } from './learnings/index.js';
13
+ import { frictionTools } from './friction/index.js';
14
+ import { designerTools } from './designer/index.js';
15
+ import { voiceTools } from './voice/index.js';
16
+ import { contextTools } from './context/index.js';
17
+ import { agenticTools } from './agentic/index.js';
18
+ import { roadmapTools } from './roadmap/index.js';
19
+ import { architectTools } from './architect/index.js';
20
+ import { studioTools } from './studio/index.js';
21
+ import { deckTools } from './deck.js';
22
+ // ============================================================================
23
+ // Aggregate All Tools
24
+ // ============================================================================
25
+ export const modularTools = [
26
+ ...registryTools,
27
+ ...sentinelTools,
28
+ ...dojoTools,
29
+ ...provenanceTools,
30
+ ...oracleTools,
31
+ ...learningsTools,
32
+ ...frictionTools,
33
+ ...designerTools,
34
+ ...voiceTools,
35
+ ...contextTools,
36
+ ...agenticTools,
37
+ ...roadmapTools,
38
+ ...architectTools,
39
+ ...studioTools,
40
+ ...deckTools,
41
+ ];
42
+ // ============================================================================
43
+ // Tool Map for Fast Lookup
44
+ // ============================================================================
45
+ export const modularToolMap = new Map(modularTools.map(t => [t.definition.name, t]));
46
+ // ============================================================================
47
+ // Helper to get tool names (for debugging)
48
+ // ============================================================================
49
+ export function getModularToolNames() {
50
+ return modularTools.map(t => t.definition.name);
51
+ }
52
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,mBAAmB;AACnB,+EAA+E;AAC/E,yCAAyC;AACzC,8DAA8D;AAC9D,+EAA+E;AAG/E,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,+EAA+E;AAC/E,sBAAsB;AACtB,+EAA+E;AAE/E,MAAM,CAAC,MAAM,YAAY,GAAe;IACtC,GAAG,aAAa;IAChB,GAAG,aAAa;IAChB,GAAG,SAAS;IACZ,GAAG,eAAe;IAClB,GAAG,WAAW;IACd,GAAG,cAAc;IACjB,GAAG,aAAa;IAChB,GAAG,aAAa;IAChB,GAAG,UAAU;IACb,GAAG,YAAY;IACf,GAAG,YAAY;IACf,GAAG,YAAY;IACf,GAAG,cAAc;IACjB,GAAG,WAAW;IACd,GAAG,SAAS;CACb,CAAC;AAEF,+EAA+E;AAC/E,2BAA2B;AAC3B,+EAA+E;AAE/E,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,GAAG,CACnC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAC9C,CAAC;AAEF,+EAA+E;AAC/E,2CAA2C;AAC3C,+EAA+E;AAE/E,MAAM,UAAU,mBAAmB;IACjC,OAAO,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;AAClD,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { ToolSpec } from '../types.js';
2
+ export declare const learningsAppendTool: ToolSpec;
3
+ export declare const learningsListTool: ToolSpec;
4
+ export declare const learningsTools: ToolSpec[];
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/learnings/index.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AA8BvC,eAAO,MAAM,mBAAmB,EAAE,QAmDjC,CAAC;AAMF,eAAO,MAAM,iBAAiB,EAAE,QAwC/B,CAAC;AAMF,eAAO,MAAM,cAAc,EAAE,QAAQ,EAGpC,CAAC"}
@@ -0,0 +1,123 @@
1
+ // ============================================================================
2
+ // Learnings Domain Tools
3
+ // ============================================================================
4
+ // Tools for tracking technical learnings and insights.
5
+ // ============================================================================
6
+ import { toolSuccess, toolError, requireFields } from '../shared/index.js';
7
+ import { appendLearning, listLearnings, } from '../learnings.js';
8
+ // ============================================================================
9
+ // Types
10
+ // ============================================================================
11
+ const VALID_CATEGORIES = ['debug', 'integration', 'architecture', 'tooling', 'process', 'other'];
12
+ // ============================================================================
13
+ // Helper: Normalize project_id → projectId
14
+ // ============================================================================
15
+ function normalizeProjectId(args) {
16
+ if (!args.projectId && args.project_id) {
17
+ args.projectId = args.project_id;
18
+ }
19
+ }
20
+ // ============================================================================
21
+ // Append Learning Tool
22
+ // ============================================================================
23
+ export const learningsAppendTool = {
24
+ definition: {
25
+ name: 'learnings_append',
26
+ description: "Append a new entry to a project's technical learnings document. Creates a living document that accumulates lessons learned, gotchas, and insights over time.",
27
+ inputSchema: {
28
+ type: 'object',
29
+ properties: {
30
+ project_id: {
31
+ type: 'string',
32
+ description: 'The project identifier (creates learnings/{project_id}.md)',
33
+ },
34
+ category: {
35
+ type: 'string',
36
+ enum: ['debug', 'integration', 'architecture', 'tooling', 'process', 'other'],
37
+ description: 'Category of the learning',
38
+ },
39
+ title: {
40
+ type: 'string',
41
+ description: 'Brief title for this learning entry',
42
+ },
43
+ content: {
44
+ type: 'string',
45
+ description: 'The learning content - what happened, what was learned, how to avoid/replicate',
46
+ },
47
+ tags: {
48
+ type: 'array',
49
+ items: { type: 'string' },
50
+ description: 'Optional tags for searchability (e.g., ["mcp", "auth", "tokens"])',
51
+ },
52
+ },
53
+ required: ['project_id', 'category', 'title', 'content'],
54
+ },
55
+ },
56
+ handler: async (args) => {
57
+ try {
58
+ const rawInput = args;
59
+ normalizeProjectId(rawInput);
60
+ const input = rawInput;
61
+ requireFields(input, 'category', 'title', 'content');
62
+ if (!VALID_CATEGORIES.includes(input.category)) {
63
+ throw new Error(`Invalid category. Must be one of: ${VALID_CATEGORIES.join(', ')}`);
64
+ }
65
+ const result = await appendLearning(input);
66
+ return toolSuccess(result);
67
+ }
68
+ catch (err) {
69
+ return toolError(err instanceof Error ? err.message : String(err));
70
+ }
71
+ },
72
+ };
73
+ // ============================================================================
74
+ // List Learnings Tool
75
+ // ============================================================================
76
+ export const learningsListTool = {
77
+ definition: {
78
+ name: 'learnings_list',
79
+ description: "List entries from a project's technical learnings document, optionally filtered by category.",
80
+ inputSchema: {
81
+ type: 'object',
82
+ properties: {
83
+ project_id: {
84
+ type: 'string',
85
+ description: 'The project identifier',
86
+ },
87
+ category: {
88
+ type: 'string',
89
+ enum: ['debug', 'integration', 'architecture', 'tooling', 'process', 'other'],
90
+ description: 'Optional category filter',
91
+ },
92
+ limit: {
93
+ type: 'integer',
94
+ description: 'Maximum number of entries to return (most recent first)',
95
+ },
96
+ },
97
+ required: ['project_id'],
98
+ },
99
+ },
100
+ handler: async (args) => {
101
+ try {
102
+ const rawInput = args;
103
+ normalizeProjectId(rawInput);
104
+ const input = rawInput;
105
+ if (input.category && !VALID_CATEGORIES.includes(input.category)) {
106
+ throw new Error(`Invalid category. Must be one of: ${VALID_CATEGORIES.join(', ')}`);
107
+ }
108
+ const result = await listLearnings(input);
109
+ return toolSuccess(result);
110
+ }
111
+ catch (err) {
112
+ return toolError(err instanceof Error ? err.message : String(err));
113
+ }
114
+ },
115
+ };
116
+ // ============================================================================
117
+ // Export All Tools
118
+ // ============================================================================
119
+ export const learningsTools = [
120
+ learningsAppendTool,
121
+ learningsListTool,
122
+ ];
123
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/learnings/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ export interface LearningsError {
2
+ error: string;
3
+ message: string;
4
+ hint?: string;
5
+ }
6
+ export declare function isLearningsError(result: unknown): result is LearningsError;
7
+ export type LearningCategory = 'debug' | 'integration' | 'architecture' | 'tooling' | 'process' | 'other';
8
+ export interface AppendLearningInput {
9
+ projectId?: string;
10
+ category: LearningCategory;
11
+ title: string;
12
+ content: string;
13
+ tags?: string[];
14
+ }
15
+ export interface AppendLearningOutput {
16
+ timestamp: string;
17
+ path: string;
18
+ entry_count: number;
19
+ location: 'project' | 'global';
20
+ }
21
+ export interface ListLearningsInput {
22
+ projectId?: string;
23
+ category?: LearningCategory;
24
+ limit?: number;
25
+ }
26
+ export interface LearningEntry {
27
+ timestamp: string;
28
+ category: LearningCategory;
29
+ title: string;
30
+ content: string;
31
+ tags: string[];
32
+ }
33
+ export interface ListLearningsOutput {
34
+ path: string;
35
+ entries: LearningEntry[];
36
+ total_count: number;
37
+ location: 'project' | 'global';
38
+ }
39
+ export declare function appendLearning(input: AppendLearningInput): Promise<AppendLearningOutput | LearningsError>;
40
+ export declare function listLearnings(input: ListLearningsInput): Promise<ListLearningsOutput | LearningsError>;
41
+ //# sourceMappingURL=learnings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"learnings.d.ts","sourceRoot":"","sources":["../../src/tools/learnings.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAUD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,IAAI,cAAc,CAO1E;AAED,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,aAAa,GAAG,cAAc,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;AAE1G,MAAM,WAAW,mBAAmB;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,SAAS,GAAG,QAAQ,CAAC;CAChC;AAED,MAAM,WAAW,kBAAkB;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,gBAAgB,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,SAAS,GAAG,QAAQ,CAAC;CAChC;AA+BD,wBAAsB,cAAc,CAClC,KAAK,EAAE,mBAAmB,GACzB,OAAO,CAAC,oBAAoB,GAAG,cAAc,CAAC,CAqEhD;AAED,wBAAsB,aAAa,CACjC,KAAK,EAAE,kBAAkB,GACxB,OAAO,CAAC,mBAAmB,GAAG,cAAc,CAAC,CAsD/C"}