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,340 @@
1
+ /**
2
+ * Agentic Pack Linter
3
+ *
4
+ * Validates rendered output against dialect constraints.
5
+ * Ensures semiotic clarity and consistency.
6
+ */
7
+ import { log } from '../config.js';
8
+ import { resolveProjectPaths } from '../projectRegistry.js';
9
+ import { getOrCompilePack } from './compiler.js';
10
+ /**
11
+ * Count emojis in text
12
+ */
13
+ function countEmojis(text) {
14
+ const emojiRegex = /[\u{1F300}-\u{1F9FF}]|[\u{2600}-\u{26FF}]|[\u{2700}-\u{27BF}]|[\u{1F600}-\u{1F64F}]|[\u{1F680}-\u{1F6FF}]/gu;
15
+ const matches = text.match(emojiRegex);
16
+ return matches ? matches.length : 0;
17
+ }
18
+ /**
19
+ * Find emoji positions in text
20
+ */
21
+ function findEmojiPositions(text) {
22
+ const positions = [];
23
+ const emojiRegex = /[\u{1F300}-\u{1F9FF}]|[\u{2600}-\u{26FF}]|[\u{2700}-\u{27BF}]|[\u{1F600}-\u{1F64F}]|[\u{1F680}-\u{1F6FF}]/gu;
24
+ let match;
25
+ while ((match = emojiRegex.exec(text)) !== null) {
26
+ const beforeMatch = text.substring(0, match.index);
27
+ const lines = beforeMatch.split('\n');
28
+ positions.push({
29
+ index: match.index,
30
+ line: lines.length,
31
+ column: lines[lines.length - 1].length + 1,
32
+ });
33
+ }
34
+ return positions;
35
+ }
36
+ const LINT_RULES = [
37
+ // Emoji count rule
38
+ {
39
+ id: 'max-emoji-count',
40
+ severity: 'error',
41
+ check: (rendered, renderer) => {
42
+ const max = renderer.constraints.max_emoji_count;
43
+ if (max === undefined)
44
+ return null;
45
+ const count = countEmojis(rendered);
46
+ if (count > max) {
47
+ return {
48
+ rule: 'max-emoji-count',
49
+ severity: 'error',
50
+ message: `Emoji count (${count}) exceeds maximum (${max})`,
51
+ suggestion: `Reduce emoji usage to ${max} or fewer`,
52
+ };
53
+ }
54
+ return null;
55
+ },
56
+ },
57
+ // Emoji position rule
58
+ {
59
+ id: 'emoji-position',
60
+ severity: 'warning',
61
+ check: (rendered, renderer) => {
62
+ const position = renderer.constraints.emoji_position;
63
+ if (!position || position === 'anywhere')
64
+ return null;
65
+ const emojiPositions = findEmojiPositions(rendered);
66
+ if (emojiPositions.length === 0)
67
+ return null;
68
+ if (position === 'none') {
69
+ return {
70
+ rule: 'emoji-position',
71
+ severity: 'warning',
72
+ message: 'Emojis are not allowed in this renderer',
73
+ line: emojiPositions[0].line,
74
+ column: emojiPositions[0].column,
75
+ suggestion: 'Remove all emojis from output',
76
+ };
77
+ }
78
+ if (position === 'header-only') {
79
+ // Emojis should only be on the first line
80
+ const nonHeaderEmojis = emojiPositions.filter((p) => p.line > 1);
81
+ if (nonHeaderEmojis.length > 0) {
82
+ return {
83
+ rule: 'emoji-position',
84
+ severity: 'warning',
85
+ message: 'Emojis found outside header (first line)',
86
+ line: nonHeaderEmojis[0].line,
87
+ column: nonHeaderEmojis[0].column,
88
+ suggestion: 'Move emojis to the header line only',
89
+ };
90
+ }
91
+ }
92
+ return null;
93
+ },
94
+ },
95
+ // Max lines rule
96
+ {
97
+ id: 'max-lines',
98
+ severity: 'warning',
99
+ check: (rendered, renderer) => {
100
+ const max = renderer.constraints.max_lines;
101
+ if (max === undefined)
102
+ return null;
103
+ const lineCount = rendered.split('\n').length;
104
+ if (lineCount > max) {
105
+ return {
106
+ rule: 'max-lines',
107
+ severity: 'warning',
108
+ message: `Line count (${lineCount}) exceeds maximum (${max})`,
109
+ suggestion: `Condense output to ${max} lines or fewer`,
110
+ };
111
+ }
112
+ return null;
113
+ },
114
+ },
115
+ // Banned words rule
116
+ {
117
+ id: 'banned-words',
118
+ severity: 'error',
119
+ check: (rendered, renderer) => {
120
+ const banned = renderer.constraints.banned_words;
121
+ if (!banned || banned.length === 0)
122
+ return null;
123
+ const lowerRendered = rendered.toLowerCase();
124
+ for (const word of banned) {
125
+ const index = lowerRendered.indexOf(word.toLowerCase());
126
+ if (index !== -1) {
127
+ const beforeMatch = rendered.substring(0, index);
128
+ const lines = beforeMatch.split('\n');
129
+ return {
130
+ rule: 'banned-words',
131
+ severity: 'error',
132
+ message: `Banned word "${word}" found in output`,
133
+ line: lines.length,
134
+ column: lines[lines.length - 1].length + 1,
135
+ suggestion: `Remove or replace the word "${word}"`,
136
+ };
137
+ }
138
+ }
139
+ return null;
140
+ },
141
+ },
142
+ // Banned punctuation rule
143
+ {
144
+ id: 'banned-punctuation',
145
+ severity: 'warning',
146
+ check: (rendered, renderer) => {
147
+ const banned = renderer.constraints.banned_punctuation;
148
+ if (!banned || banned.length === 0)
149
+ return null;
150
+ for (const punct of banned) {
151
+ const index = rendered.indexOf(punct);
152
+ if (index !== -1) {
153
+ const beforeMatch = rendered.substring(0, index);
154
+ const lines = beforeMatch.split('\n');
155
+ return {
156
+ rule: 'banned-punctuation',
157
+ severity: 'warning',
158
+ message: `Banned punctuation "${punct}" found in output`,
159
+ line: lines.length,
160
+ column: lines[lines.length - 1].length + 1,
161
+ suggestion: `Remove or replace "${punct}"`,
162
+ };
163
+ }
164
+ }
165
+ return null;
166
+ },
167
+ },
168
+ // Required sections rule
169
+ {
170
+ id: 'required-sections',
171
+ severity: 'error',
172
+ check: (rendered, renderer) => {
173
+ const required = renderer.constraints.required_sections;
174
+ if (!required || required.length === 0)
175
+ return null;
176
+ for (const section of required) {
177
+ // Look for section headers in various formats
178
+ const patterns = [
179
+ new RegExp(`^##?\\s*${section}`, 'im'), // Markdown headers
180
+ new RegExp(`^${section}:`, 'im'), // Key: format
181
+ new RegExp(`\\[${section}\\]`, 'i'), // [Section] format
182
+ ];
183
+ const found = patterns.some((p) => p.test(rendered));
184
+ if (!found) {
185
+ return {
186
+ rule: 'required-sections',
187
+ severity: 'error',
188
+ message: `Required section "${section}" not found`,
189
+ suggestion: `Add a "${section}" section to the output`,
190
+ };
191
+ }
192
+ }
193
+ return null;
194
+ },
195
+ },
196
+ // Max section lines rule
197
+ {
198
+ id: 'max-section-lines',
199
+ severity: 'info',
200
+ check: (rendered, renderer) => {
201
+ const max = renderer.constraints.max_section_lines;
202
+ if (max === undefined)
203
+ return null;
204
+ // Split by section headers and check each
205
+ const sections = rendered.split(/^(?=##?\s|\[)/m);
206
+ for (let i = 0; i < sections.length; i++) {
207
+ const section = sections[i];
208
+ const lineCount = section.split('\n').length;
209
+ if (lineCount > max) {
210
+ return {
211
+ rule: 'max-section-lines',
212
+ severity: 'info',
213
+ message: `Section ${i + 1} has ${lineCount} lines (max: ${max})`,
214
+ suggestion: 'Consider condensing this section',
215
+ };
216
+ }
217
+ }
218
+ return null;
219
+ },
220
+ },
221
+ // Payload consistency checks
222
+ {
223
+ id: 'missing-decision',
224
+ severity: 'warning',
225
+ check: (rendered, _renderer, payload) => {
226
+ if (!payload)
227
+ return null;
228
+ if (payload.role !== 'Overmind')
229
+ return null;
230
+ if (!payload.decision)
231
+ return null;
232
+ // Check if decision is reflected in output
233
+ const hasDecision = rendered.toLowerCase().includes('decision') ||
234
+ rendered.includes(payload.decision.toLowerCase());
235
+ if (!hasDecision) {
236
+ return {
237
+ rule: 'missing-decision',
238
+ severity: 'warning',
239
+ message: 'Overmind payload has decision but output may not reflect it',
240
+ suggestion: 'Ensure the decision is visible in the rendered output',
241
+ };
242
+ }
243
+ return null;
244
+ },
245
+ },
246
+ // Evidence check
247
+ {
248
+ id: 'missing-evidence',
249
+ severity: 'info',
250
+ check: (rendered, _renderer, payload) => {
251
+ if (!payload)
252
+ return null;
253
+ if (payload.evidence.length === 0)
254
+ return null;
255
+ const hasEvidence = rendered.toLowerCase().includes('evidence') ||
256
+ payload.evidence.some((e) => rendered.toLowerCase().includes(e.source.toLowerCase()));
257
+ if (!hasEvidence) {
258
+ return {
259
+ rule: 'missing-evidence',
260
+ severity: 'info',
261
+ message: 'Payload has evidence but output may not include it',
262
+ suggestion: 'Consider including evidence sources in output',
263
+ };
264
+ }
265
+ return null;
266
+ },
267
+ },
268
+ ];
269
+ // ============================================================================
270
+ // Core Lint Function
271
+ // ============================================================================
272
+ /**
273
+ * Lint rendered output against renderer constraints.
274
+ */
275
+ export function lint(rendered, renderer, payload) {
276
+ const violations = [];
277
+ for (const rule of LINT_RULES) {
278
+ const violation = rule.check(rendered, renderer, payload);
279
+ if (violation) {
280
+ violations.push(violation);
281
+ }
282
+ }
283
+ return {
284
+ valid: violations.filter((v) => v.severity === 'error').length === 0,
285
+ violations,
286
+ renderer_id: renderer.id,
287
+ checked_at: new Date().toISOString(),
288
+ };
289
+ }
290
+ /**
291
+ * Lint with just the renderer ID (loads from pack)
292
+ */
293
+ export function lintWithPack(rendered, rendererId, pack, payload) {
294
+ const renderer = pack.renderers[rendererId] || pack.renderers['default'];
295
+ if (!renderer) {
296
+ return {
297
+ valid: false,
298
+ violations: [
299
+ {
300
+ rule: 'renderer-not-found',
301
+ severity: 'error',
302
+ message: `Renderer '${rendererId}' not found`,
303
+ },
304
+ ],
305
+ renderer_id: rendererId,
306
+ checked_at: new Date().toISOString(),
307
+ };
308
+ }
309
+ return lint(rendered, renderer, payload);
310
+ }
311
+ // ============================================================================
312
+ // MCP Tool Handler
313
+ // ============================================================================
314
+ /**
315
+ * MCP tool handler for linting rendered output
316
+ */
317
+ export async function lintOutput(input) {
318
+ try {
319
+ const resolved = resolveProjectPaths(input.projectId);
320
+ const pack = await getOrCompilePack(resolved);
321
+ log(`agentic-linter: Linting output for renderer '${input.renderer_id}'`);
322
+ const result = lintWithPack(input.rendered, input.renderer_id, pack.content, input.payload);
323
+ const errorCount = result.violations.filter((v) => v.severity === 'error').length;
324
+ const warnCount = result.violations.filter((v) => v.severity === 'warning').length;
325
+ log(`agentic-linter: ${result.valid ? 'PASS' : 'FAIL'} - ${errorCount} errors, ${warnCount} warnings`);
326
+ return {
327
+ status: 'linted',
328
+ result,
329
+ };
330
+ }
331
+ catch (error) {
332
+ const message = error instanceof Error ? error.message : String(error);
333
+ log(`agentic-linter: Error: ${message}`);
334
+ return {
335
+ status: 'error',
336
+ error: message,
337
+ };
338
+ }
339
+ }
340
+ //# sourceMappingURL=linter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linter.js","sourceRoot":"","sources":["../../src/agentic/linter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Agentic Pack Renderer
3
+ *
4
+ * Transforms canonical payloads into rendered text using pack templates.
5
+ * Core invariant: Renderers NEVER change meaning. They change compression, typography, and stance.
6
+ */
7
+ import { CanonicalPayload, CompiledPack, RenderOutput, RenderTarget, RenderInput, RenderOutputResult } from './types.js';
8
+ /**
9
+ * Render a canonical payload to text using the specified renderer.
10
+ * Pure function - no side effects.
11
+ */
12
+ export declare function render(payload: CanonicalPayload, rendererId: string, pack: CompiledPack, target?: RenderTarget): RenderOutput;
13
+ /**
14
+ * MCP tool handler for rendering payloads
15
+ */
16
+ export declare function renderPayload(input: RenderInput): Promise<RenderOutputResult>;
17
+ //# sourceMappingURL=renderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../../src/agentic/renderer.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EACL,gBAAgB,EAChB,YAAY,EACZ,YAAY,EACZ,YAAY,EAEZ,WAAW,EACX,kBAAkB,EACnB,MAAM,YAAY,CAAC;AAmPpB;;;GAGG;AACH,wBAAgB,MAAM,CACpB,OAAO,EAAE,gBAAgB,EACzB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,YAAY,EAClB,MAAM,GAAE,YAAsB,GAC7B,YAAY,CAiDd;AAMD;;GAEG;AACH,wBAAsB,aAAa,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA4BnF"}
@@ -0,0 +1,277 @@
1
+ /**
2
+ * Agentic Pack Renderer
3
+ *
4
+ * Transforms canonical payloads into rendered text using pack templates.
5
+ * Core invariant: Renderers NEVER change meaning. They change compression, typography, and stance.
6
+ */
7
+ import { log } from '../config.js';
8
+ import { resolveProjectPaths } from '../projectRegistry.js';
9
+ import { getOrCompilePack } from './compiler.js';
10
+ // ============================================================================
11
+ // Template Engine
12
+ // ============================================================================
13
+ /**
14
+ * Simple Mustache-like template engine
15
+ * Supports: {{variable}}, {{#section}}...{{/section}}, {{^section}}...{{/section}}
16
+ */
17
+ function renderTemplate(template, context) {
18
+ let result = template;
19
+ // Handle sections: {{#section}}...{{/section}} (truthy) and {{^section}}...{{/section}} (falsy)
20
+ const sectionRegex = /\{\{([#^])(\w+)\}\}([\s\S]*?)\{\{\/\2\}\}/g;
21
+ result = result.replace(sectionRegex, (_, type, key, content) => {
22
+ const value = context[key];
23
+ const isTruthy = Array.isArray(value) ? value.length > 0 : Boolean(value);
24
+ if (type === '#') {
25
+ // Truthy section
26
+ if (!isTruthy)
27
+ return '';
28
+ if (Array.isArray(value)) {
29
+ // Iterate over array
30
+ return value
31
+ .map((item) => {
32
+ const itemContext = typeof item === 'object' ? { ...context, ...item } : { ...context, item };
33
+ return renderTemplate(content, itemContext);
34
+ })
35
+ .join('');
36
+ }
37
+ return renderTemplate(content, context);
38
+ }
39
+ else {
40
+ // Falsy section (^)
41
+ return isTruthy ? '' : renderTemplate(content, context);
42
+ }
43
+ });
44
+ // Handle nested items: {{#items}}...{{/items}}
45
+ const itemsRegex = /\{\{#items\}\}([\s\S]*?)\{\{\/items\}\}/g;
46
+ result = result.replace(itemsRegex, (_, content) => {
47
+ const items = context['items'];
48
+ if (!Array.isArray(items))
49
+ return '';
50
+ return items
51
+ .map((item) => {
52
+ const itemContext = typeof item === 'object' ? { ...context, ...item } : { ...context, item };
53
+ return renderTemplate(content, itemContext);
54
+ })
55
+ .join('');
56
+ });
57
+ // Handle simple variables: {{variable}}
58
+ const varRegex = /\{\{(\w+)\}\}/g;
59
+ result = result.replace(varRegex, (_, key) => {
60
+ const value = context[key];
61
+ if (value === undefined || value === null)
62
+ return '';
63
+ return String(value);
64
+ });
65
+ return result;
66
+ }
67
+ // ============================================================================
68
+ // Context Building
69
+ // ============================================================================
70
+ function buildRenderContext(payload, pack) {
71
+ const taxonomy = pack.taxonomy;
72
+ // Get role info
73
+ const roleInfo = taxonomy.roles[payload.role] || { emoji: '?', description: '' };
74
+ const statusInfo = taxonomy.statuses[payload.status] || { emoji: '?', color: 'white' };
75
+ const loadInfo = taxonomy.loads[payload.load] || { emoji: '?', color: 'white' };
76
+ // Build context object
77
+ const context = {
78
+ // Core fields
79
+ role: payload.role,
80
+ status: payload.status,
81
+ load: payload.load,
82
+ summary: payload.summary,
83
+ // Taxonomy lookups
84
+ role_emoji: roleInfo.emoji,
85
+ role_description: roleInfo.description,
86
+ status_emoji: statusInfo.emoji,
87
+ status_color: statusInfo.color,
88
+ load_emoji: loadInfo.emoji,
89
+ load_color: loadInfo.color,
90
+ // Evidence
91
+ evidence: payload.evidence.length > 0,
92
+ evidence_items: payload.evidence,
93
+ // Missing data
94
+ missing_data: payload.missing_data.length > 0,
95
+ missing_data_items: payload.missing_data,
96
+ // Overmind fields
97
+ decision: payload.decision,
98
+ guardrails: payload.guardrails,
99
+ dissent_summary: payload.dissent_summary,
100
+ // Specialist fields
101
+ specialist_id: payload.specialist_id,
102
+ specialist_name: payload.specialist_name,
103
+ // Metadata
104
+ pack_id: payload.metadata.pack_id,
105
+ pack_hash: payload.metadata.pack_hash,
106
+ created_at: payload.metadata.created_at,
107
+ };
108
+ // Flatten nested arrays for template iteration
109
+ if (payload.evidence.length > 0) {
110
+ context['evidence'] = { items: payload.evidence };
111
+ }
112
+ if (payload.missing_data.length > 0) {
113
+ context['missing_data'] = { items: payload.missing_data };
114
+ }
115
+ return context;
116
+ }
117
+ // ============================================================================
118
+ // ANSI Styling
119
+ // ============================================================================
120
+ const ANSI_CODES = {
121
+ reset: '\x1b[0m',
122
+ bold: '\x1b[1m',
123
+ dim: '\x1b[2m',
124
+ italic: '\x1b[3m',
125
+ underline: '\x1b[4m',
126
+ // Colors
127
+ black: '\x1b[30m',
128
+ red: '\x1b[31m',
129
+ green: '\x1b[32m',
130
+ yellow: '\x1b[33m',
131
+ blue: '\x1b[34m',
132
+ magenta: '\x1b[35m',
133
+ cyan: '\x1b[36m',
134
+ white: '\x1b[37m',
135
+ // Bright colors
136
+ brightBlack: '\x1b[90m',
137
+ brightRed: '\x1b[91m',
138
+ brightGreen: '\x1b[92m',
139
+ brightYellow: '\x1b[93m',
140
+ brightBlue: '\x1b[94m',
141
+ brightMagenta: '\x1b[95m',
142
+ brightCyan: '\x1b[96m',
143
+ brightWhite: '\x1b[97m',
144
+ // Background colors
145
+ bgBlack: '\x1b[40m',
146
+ bgRed: '\x1b[41m',
147
+ bgGreen: '\x1b[42m',
148
+ bgYellow: '\x1b[43m',
149
+ bgBlue: '\x1b[44m',
150
+ bgMagenta: '\x1b[45m',
151
+ bgCyan: '\x1b[46m',
152
+ bgWhite: '\x1b[47m',
153
+ };
154
+ function applyAnsiStyles(text, styles) {
155
+ if (!styles)
156
+ return text;
157
+ let result = text;
158
+ // Apply custom style rules
159
+ for (const [pattern, style] of Object.entries(styles)) {
160
+ const codes = style
161
+ .split(' ')
162
+ .map((s) => ANSI_CODES[s] || '')
163
+ .join('');
164
+ if (codes) {
165
+ const regex = new RegExp(`(${pattern})`, 'g');
166
+ result = result.replace(regex, `${codes}$1${ANSI_CODES.reset}`);
167
+ }
168
+ }
169
+ return result;
170
+ }
171
+ // ============================================================================
172
+ // Output Metrics
173
+ // ============================================================================
174
+ function countEmojis(text) {
175
+ // Unicode emoji regex (simplified)
176
+ const emojiRegex = /[\u{1F300}-\u{1F9FF}]|[\u{2600}-\u{26FF}]|[\u{2700}-\u{27BF}]|[\u{1F600}-\u{1F64F}]|[\u{1F680}-\u{1F6FF}]/gu;
177
+ const matches = text.match(emojiRegex);
178
+ return matches ? matches.length : 0;
179
+ }
180
+ function computeMetrics(text) {
181
+ return {
182
+ line_count: text.split('\n').length,
183
+ char_count: text.length,
184
+ emoji_count: countEmojis(text),
185
+ };
186
+ }
187
+ // ============================================================================
188
+ // Renderer Selection
189
+ // ============================================================================
190
+ function selectRenderer(rendererId, payload, pack) {
191
+ // If payload has specialist_id, check for specialist-specific renderer
192
+ if (payload.specialist_id) {
193
+ const specialistRendererId = `${payload.specialist_id}-${rendererId}`;
194
+ if (pack.renderers[specialistRendererId]) {
195
+ return pack.renderers[specialistRendererId];
196
+ }
197
+ }
198
+ // Use specified renderer or default
199
+ const renderer = pack.renderers[rendererId] || pack.renderers['default'];
200
+ if (!renderer) {
201
+ throw new Error(`Renderer '${rendererId}' not found and no default renderer available`);
202
+ }
203
+ return renderer;
204
+ }
205
+ // ============================================================================
206
+ // Core Render Function
207
+ // ============================================================================
208
+ /**
209
+ * Render a canonical payload to text using the specified renderer.
210
+ * Pure function - no side effects.
211
+ */
212
+ export function render(payload, rendererId, pack, target = 'plain') {
213
+ const warnings = [];
214
+ // Select renderer
215
+ const renderer = selectRenderer(rendererId, payload, pack);
216
+ // Build context
217
+ const context = buildRenderContext(payload, pack);
218
+ // Render template
219
+ let rendered = renderTemplate(renderer.template, context);
220
+ // Apply ANSI styles if target is ansi
221
+ if (target === 'ansi') {
222
+ const styles = renderer.ansi_styles || pack.ansi_styles;
223
+ rendered = applyAnsiStyles(rendered, styles);
224
+ }
225
+ // Clean up extra whitespace
226
+ rendered = rendered
227
+ .split('\n')
228
+ .map((line) => line.trimEnd())
229
+ .join('\n')
230
+ .replace(/\n{3,}/g, '\n\n')
231
+ .trim();
232
+ // Compute metrics
233
+ const metrics = computeMetrics(rendered);
234
+ // Check constraints and add warnings
235
+ const constraints = renderer.constraints;
236
+ if (constraints.max_emoji_count && metrics.emoji_count > constraints.max_emoji_count) {
237
+ warnings.push(`Emoji count (${metrics.emoji_count}) exceeds max (${constraints.max_emoji_count})`);
238
+ }
239
+ if (constraints.max_lines && metrics.line_count > constraints.max_lines) {
240
+ warnings.push(`Line count (${metrics.line_count}) exceeds max (${constraints.max_lines})`);
241
+ }
242
+ return {
243
+ rendered,
244
+ renderer_id: renderer.id,
245
+ target,
246
+ warnings,
247
+ metadata: metrics,
248
+ };
249
+ }
250
+ // ============================================================================
251
+ // MCP Tool Handler
252
+ // ============================================================================
253
+ /**
254
+ * MCP tool handler for rendering payloads
255
+ */
256
+ export async function renderPayload(input) {
257
+ try {
258
+ const resolved = resolveProjectPaths(input.projectId);
259
+ const pack = await getOrCompilePack(resolved);
260
+ log(`agentic-renderer: Rendering with renderer '${input.renderer_id}'`);
261
+ const result = render(input.payload, input.renderer_id, pack.content, input.target || 'plain');
262
+ log(`agentic-renderer: Rendered ${result.metadata.line_count} lines`);
263
+ return {
264
+ status: 'rendered',
265
+ result,
266
+ };
267
+ }
268
+ catch (error) {
269
+ const message = error instanceof Error ? error.message : String(error);
270
+ log(`agentic-renderer: Error: ${message}`);
271
+ return {
272
+ status: 'error',
273
+ error: message,
274
+ };
275
+ }
276
+ }
277
+ //# sourceMappingURL=renderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderer.js","sourceRoot":"","sources":["../../src/agentic/renderer.ts"],"names":[],"mappings":"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"}