@decibelsystems/tools 2.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 (478) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +342 -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 +32 -0
  28. package/dist/architectAdrs.d.ts.map +1 -0
  29. package/dist/architectAdrs.js +162 -0
  30. package/dist/architectAdrs.js.map +1 -0
  31. package/dist/client/facade-client.d.ts +41 -0
  32. package/dist/client/facade-client.d.ts.map +1 -0
  33. package/dist/client/facade-client.js +243 -0
  34. package/dist/client/facade-client.js.map +1 -0
  35. package/dist/client/index.d.ts +4 -0
  36. package/dist/client/index.d.ts.map +1 -0
  37. package/dist/client/index.js +18 -0
  38. package/dist/client/index.js.map +1 -0
  39. package/dist/client/transports.d.ts +78 -0
  40. package/dist/client/transports.d.ts.map +1 -0
  41. package/dist/client/transports.js +258 -0
  42. package/dist/client/transports.js.map +1 -0
  43. package/dist/client/types.d.ts +49 -0
  44. package/dist/client/types.d.ts.map +1 -0
  45. package/dist/client/types.js +8 -0
  46. package/dist/client/types.js.map +1 -0
  47. package/dist/config.d.ts +8 -0
  48. package/dist/config.d.ts.map +1 -0
  49. package/dist/config.js +19 -0
  50. package/dist/config.js.map +1 -0
  51. package/dist/daemon.d.ts +77 -0
  52. package/dist/daemon.d.ts.map +1 -0
  53. package/dist/daemon.js +374 -0
  54. package/dist/daemon.js.map +1 -0
  55. package/dist/daemonConfig.d.ts +43 -0
  56. package/dist/daemonConfig.d.ts.map +1 -0
  57. package/dist/daemonConfig.js +113 -0
  58. package/dist/daemonConfig.js.map +1 -0
  59. package/dist/dataRoot.d.ts +5 -0
  60. package/dist/dataRoot.d.ts.map +1 -0
  61. package/dist/dataRoot.js +23 -0
  62. package/dist/dataRoot.js.map +1 -0
  63. package/dist/decibelPaths.d.ts +42 -0
  64. package/dist/decibelPaths.d.ts.map +1 -0
  65. package/dist/decibelPaths.js +150 -0
  66. package/dist/decibelPaths.js.map +1 -0
  67. package/dist/facades/definitions.d.ts +6 -0
  68. package/dist/facades/definitions.d.ts.map +1 -0
  69. package/dist/facades/definitions.js +450 -0
  70. package/dist/facades/definitions.js.map +1 -0
  71. package/dist/facades/index.d.ts +27 -0
  72. package/dist/facades/index.d.ts.map +1 -0
  73. package/dist/facades/index.js +124 -0
  74. package/dist/facades/index.js.map +1 -0
  75. package/dist/facades/types.d.ts +38 -0
  76. package/dist/facades/types.d.ts.map +1 -0
  77. package/dist/facades/types.js +8 -0
  78. package/dist/facades/types.js.map +1 -0
  79. package/dist/httpServer.d.ts +66 -0
  80. package/dist/httpServer.d.ts.map +1 -0
  81. package/dist/httpServer.js +1723 -0
  82. package/dist/httpServer.js.map +1 -0
  83. package/dist/kernel.d.ts +87 -0
  84. package/dist/kernel.d.ts.map +1 -0
  85. package/dist/kernel.js +256 -0
  86. package/dist/kernel.js.map +1 -0
  87. package/dist/lib/agent-services/assumptions.d.ts +16 -0
  88. package/dist/lib/agent-services/assumptions.d.ts.map +1 -0
  89. package/dist/lib/agent-services/assumptions.js +284 -0
  90. package/dist/lib/agent-services/assumptions.js.map +1 -0
  91. package/dist/lib/agent-services/context-pack.d.ts +6 -0
  92. package/dist/lib/agent-services/context-pack.d.ts.map +1 -0
  93. package/dist/lib/agent-services/context-pack.js +354 -0
  94. package/dist/lib/agent-services/context-pack.js.map +1 -0
  95. package/dist/lib/agent-services/drift-guard.d.ts +14 -0
  96. package/dist/lib/agent-services/drift-guard.d.ts.map +1 -0
  97. package/dist/lib/agent-services/drift-guard.js +355 -0
  98. package/dist/lib/agent-services/drift-guard.js.map +1 -0
  99. package/dist/lib/agent-services/index.d.ts +5 -0
  100. package/dist/lib/agent-services/index.d.ts.map +1 -0
  101. package/dist/lib/agent-services/index.js +10 -0
  102. package/dist/lib/agent-services/index.js.map +1 -0
  103. package/dist/lib/benchmark.d.ts +110 -0
  104. package/dist/lib/benchmark.d.ts.map +1 -0
  105. package/dist/lib/benchmark.js +338 -0
  106. package/dist/lib/benchmark.js.map +1 -0
  107. package/dist/lib/supabase.d.ts +123 -0
  108. package/dist/lib/supabase.d.ts.map +1 -0
  109. package/dist/lib/supabase.js +91 -0
  110. package/dist/lib/supabase.js.map +1 -0
  111. package/dist/license.d.ts +30 -0
  112. package/dist/license.d.ts.map +1 -0
  113. package/dist/license.js +131 -0
  114. package/dist/license.js.map +1 -0
  115. package/dist/projectPaths.d.ts +27 -0
  116. package/dist/projectPaths.d.ts.map +1 -0
  117. package/dist/projectPaths.js +86 -0
  118. package/dist/projectPaths.js.map +1 -0
  119. package/dist/projectRegistry.d.ts +97 -0
  120. package/dist/projectRegistry.d.ts.map +1 -0
  121. package/dist/projectRegistry.js +374 -0
  122. package/dist/projectRegistry.js.map +1 -0
  123. package/dist/sentinelIssues.d.ts +65 -0
  124. package/dist/sentinelIssues.d.ts.map +1 -0
  125. package/dist/sentinelIssues.js +297 -0
  126. package/dist/sentinelIssues.js.map +1 -0
  127. package/dist/server.d.ts +3 -0
  128. package/dist/server.d.ts.map +1 -0
  129. package/dist/server.js +195 -0
  130. package/dist/server.js.map +1 -0
  131. package/dist/test.d.ts +7 -0
  132. package/dist/test.d.ts.map +1 -0
  133. package/dist/test.js +77 -0
  134. package/dist/test.js.map +1 -0
  135. package/dist/tools/agentic/index.d.ts +7 -0
  136. package/dist/tools/agentic/index.d.ts.map +1 -0
  137. package/dist/tools/agentic/index.js +203 -0
  138. package/dist/tools/agentic/index.js.map +1 -0
  139. package/dist/tools/architect/index.d.ts +11 -0
  140. package/dist/tools/architect/index.d.ts.map +1 -0
  141. package/dist/tools/architect/index.js +506 -0
  142. package/dist/tools/architect/index.js.map +1 -0
  143. package/dist/tools/architect.d.ts +19 -0
  144. package/dist/tools/architect.d.ts.map +1 -0
  145. package/dist/tools/architect.js +88 -0
  146. package/dist/tools/architect.js.map +1 -0
  147. package/dist/tools/auditor/index.d.ts +10 -0
  148. package/dist/tools/auditor/index.d.ts.map +1 -0
  149. package/dist/tools/auditor/index.js +310 -0
  150. package/dist/tools/auditor/index.js.map +1 -0
  151. package/dist/tools/auditor.d.ts +149 -0
  152. package/dist/tools/auditor.d.ts.map +1 -0
  153. package/dist/tools/auditor.js +775 -0
  154. package/dist/tools/auditor.js.map +1 -0
  155. package/dist/tools/bench/index.d.ts +3 -0
  156. package/dist/tools/bench/index.d.ts.map +1 -0
  157. package/dist/tools/bench/index.js +220 -0
  158. package/dist/tools/bench/index.js.map +1 -0
  159. package/dist/tools/bench.d.ts +89 -0
  160. package/dist/tools/bench.d.ts.map +1 -0
  161. package/dist/tools/bench.js +826 -0
  162. package/dist/tools/bench.js.map +1 -0
  163. package/dist/tools/context/index.d.ts +11 -0
  164. package/dist/tools/context/index.d.ts.map +1 -0
  165. package/dist/tools/context/index.js +482 -0
  166. package/dist/tools/context/index.js.map +1 -0
  167. package/dist/tools/context.d.ts +146 -0
  168. package/dist/tools/context.d.ts.map +1 -0
  169. package/dist/tools/context.js +481 -0
  170. package/dist/tools/context.js.map +1 -0
  171. package/dist/tools/coordinator/coordinator.d.ts +168 -0
  172. package/dist/tools/coordinator/coordinator.d.ts.map +1 -0
  173. package/dist/tools/coordinator/coordinator.js +535 -0
  174. package/dist/tools/coordinator/coordinator.js.map +1 -0
  175. package/dist/tools/coordinator/index.d.ts +12 -0
  176. package/dist/tools/coordinator/index.d.ts.map +1 -0
  177. package/dist/tools/coordinator/index.js +381 -0
  178. package/dist/tools/coordinator/index.js.map +1 -0
  179. package/dist/tools/corpus/index.d.ts +5 -0
  180. package/dist/tools/corpus/index.d.ts.map +1 -0
  181. package/dist/tools/corpus/index.js +105 -0
  182. package/dist/tools/corpus/index.js.map +1 -0
  183. package/dist/tools/corpus.d.ts +33 -0
  184. package/dist/tools/corpus.d.ts.map +1 -0
  185. package/dist/tools/corpus.js +180 -0
  186. package/dist/tools/corpus.js.map +1 -0
  187. package/dist/tools/crit.d.ts +63 -0
  188. package/dist/tools/crit.d.ts.map +1 -0
  189. package/dist/tools/crit.js +159 -0
  190. package/dist/tools/crit.js.map +1 -0
  191. package/dist/tools/data-inspector.d.ts +189 -0
  192. package/dist/tools/data-inspector.d.ts.map +1 -0
  193. package/dist/tools/data-inspector.js +669 -0
  194. package/dist/tools/data-inspector.js.map +1 -0
  195. package/dist/tools/deck.d.ts +11 -0
  196. package/dist/tools/deck.d.ts.map +1 -0
  197. package/dist/tools/deck.js +188 -0
  198. package/dist/tools/deck.js.map +1 -0
  199. package/dist/tools/designer/index.d.ts +11 -0
  200. package/dist/tools/designer/index.d.ts.map +1 -0
  201. package/dist/tools/designer/index.js +442 -0
  202. package/dist/tools/designer/index.js.map +1 -0
  203. package/dist/tools/designer/lateral-tools.d.ts +6 -0
  204. package/dist/tools/designer/lateral-tools.d.ts.map +1 -0
  205. package/dist/tools/designer/lateral-tools.js +190 -0
  206. package/dist/tools/designer/lateral-tools.js.map +1 -0
  207. package/dist/tools/designer.d.ts +122 -0
  208. package/dist/tools/designer.d.ts.map +1 -0
  209. package/dist/tools/designer.js +495 -0
  210. package/dist/tools/designer.js.map +1 -0
  211. package/dist/tools/dojo/index.d.ts +13 -0
  212. package/dist/tools/dojo/index.d.ts.map +1 -0
  213. package/dist/tools/dojo/index.js +613 -0
  214. package/dist/tools/dojo/index.js.map +1 -0
  215. package/dist/tools/dojo.d.ts +254 -0
  216. package/dist/tools/dojo.d.ts.map +1 -0
  217. package/dist/tools/dojo.js +933 -0
  218. package/dist/tools/dojo.js.map +1 -0
  219. package/dist/tools/dojoBench.d.ts +49 -0
  220. package/dist/tools/dojoBench.d.ts.map +1 -0
  221. package/dist/tools/dojoBench.js +205 -0
  222. package/dist/tools/dojoBench.js.map +1 -0
  223. package/dist/tools/dojoGraduated.d.ts +50 -0
  224. package/dist/tools/dojoGraduated.d.ts.map +1 -0
  225. package/dist/tools/dojoGraduated.js +174 -0
  226. package/dist/tools/dojoGraduated.js.map +1 -0
  227. package/dist/tools/dojoPolicy.d.ts +65 -0
  228. package/dist/tools/dojoPolicy.d.ts.map +1 -0
  229. package/dist/tools/dojoPolicy.js +263 -0
  230. package/dist/tools/dojoPolicy.js.map +1 -0
  231. package/dist/tools/feedback/index.d.ts +5 -0
  232. package/dist/tools/feedback/index.d.ts.map +1 -0
  233. package/dist/tools/feedback/index.js +153 -0
  234. package/dist/tools/feedback/index.js.map +1 -0
  235. package/dist/tools/feedback.d.ts +61 -0
  236. package/dist/tools/feedback.d.ts.map +1 -0
  237. package/dist/tools/feedback.js +209 -0
  238. package/dist/tools/feedback.js.map +1 -0
  239. package/dist/tools/forecast/index.d.ts +8 -0
  240. package/dist/tools/forecast/index.d.ts.map +1 -0
  241. package/dist/tools/forecast/index.js +283 -0
  242. package/dist/tools/forecast/index.js.map +1 -0
  243. package/dist/tools/forecast.d.ts +147 -0
  244. package/dist/tools/forecast.d.ts.map +1 -0
  245. package/dist/tools/forecast.js +417 -0
  246. package/dist/tools/forecast.js.map +1 -0
  247. package/dist/tools/friction/index.d.ts +7 -0
  248. package/dist/tools/friction/index.d.ts.map +1 -0
  249. package/dist/tools/friction/index.js +265 -0
  250. package/dist/tools/friction/index.js.map +1 -0
  251. package/dist/tools/friction.d.ts +82 -0
  252. package/dist/tools/friction.d.ts.map +1 -0
  253. package/dist/tools/friction.js +331 -0
  254. package/dist/tools/friction.js.map +1 -0
  255. package/dist/tools/git/index.d.ts +9 -0
  256. package/dist/tools/git/index.d.ts.map +1 -0
  257. package/dist/tools/git/index.js +237 -0
  258. package/dist/tools/git/index.js.map +1 -0
  259. package/dist/tools/git-sentinel/index.d.ts +7 -0
  260. package/dist/tools/git-sentinel/index.d.ts.map +1 -0
  261. package/dist/tools/git-sentinel/index.js +178 -0
  262. package/dist/tools/git-sentinel/index.js.map +1 -0
  263. package/dist/tools/git-sentinel.d.ts +78 -0
  264. package/dist/tools/git-sentinel.d.ts.map +1 -0
  265. package/dist/tools/git-sentinel.js +391 -0
  266. package/dist/tools/git-sentinel.js.map +1 -0
  267. package/dist/tools/git.d.ts +134 -0
  268. package/dist/tools/git.d.ts.map +1 -0
  269. package/dist/tools/git.js +374 -0
  270. package/dist/tools/git.js.map +1 -0
  271. package/dist/tools/guardian/index.d.ts +8 -0
  272. package/dist/tools/guardian/index.d.ts.map +1 -0
  273. package/dist/tools/guardian/index.js +171 -0
  274. package/dist/tools/guardian/index.js.map +1 -0
  275. package/dist/tools/guardian.d.ts +62 -0
  276. package/dist/tools/guardian.d.ts.map +1 -0
  277. package/dist/tools/guardian.js +332 -0
  278. package/dist/tools/guardian.js.map +1 -0
  279. package/dist/tools/hygiene/codebase-scanner.d.ts +38 -0
  280. package/dist/tools/hygiene/codebase-scanner.d.ts.map +1 -0
  281. package/dist/tools/hygiene/codebase-scanner.js +411 -0
  282. package/dist/tools/hygiene/codebase-scanner.js.map +1 -0
  283. package/dist/tools/hygiene/config-scanner.d.ts +33 -0
  284. package/dist/tools/hygiene/config-scanner.d.ts.map +1 -0
  285. package/dist/tools/hygiene/config-scanner.js +482 -0
  286. package/dist/tools/hygiene/config-scanner.js.map +1 -0
  287. package/dist/tools/hygiene/coverage-scanner.d.ts +41 -0
  288. package/dist/tools/hygiene/coverage-scanner.d.ts.map +1 -0
  289. package/dist/tools/hygiene/coverage-scanner.js +331 -0
  290. package/dist/tools/hygiene/coverage-scanner.js.map +1 -0
  291. package/dist/tools/hygiene/index.d.ts +7 -0
  292. package/dist/tools/hygiene/index.d.ts.map +1 -0
  293. package/dist/tools/hygiene/index.js +291 -0
  294. package/dist/tools/hygiene/index.js.map +1 -0
  295. package/dist/tools/hygiene/oracle-hygiene.d.ts +68 -0
  296. package/dist/tools/hygiene/oracle-hygiene.d.ts.map +1 -0
  297. package/dist/tools/hygiene/oracle-hygiene.js +324 -0
  298. package/dist/tools/hygiene/oracle-hygiene.js.map +1 -0
  299. package/dist/tools/index.d.ts +6 -0
  300. package/dist/tools/index.d.ts.map +1 -0
  301. package/dist/tools/index.js +130 -0
  302. package/dist/tools/index.js.map +1 -0
  303. package/dist/tools/lateral.d.ts +114 -0
  304. package/dist/tools/lateral.d.ts.map +1 -0
  305. package/dist/tools/lateral.js +536 -0
  306. package/dist/tools/lateral.js.map +1 -0
  307. package/dist/tools/learnings/index.d.ts +5 -0
  308. package/dist/tools/learnings/index.d.ts.map +1 -0
  309. package/dist/tools/learnings/index.js +138 -0
  310. package/dist/tools/learnings/index.js.map +1 -0
  311. package/dist/tools/learnings.d.ts +41 -0
  312. package/dist/tools/learnings.d.ts.map +1 -0
  313. package/dist/tools/learnings.js +149 -0
  314. package/dist/tools/learnings.js.map +1 -0
  315. package/dist/tools/oracle/index.d.ts +6 -0
  316. package/dist/tools/oracle/index.d.ts.map +1 -0
  317. package/dist/tools/oracle/index.js +217 -0
  318. package/dist/tools/oracle/index.js.map +1 -0
  319. package/dist/tools/oracle.d.ts +90 -0
  320. package/dist/tools/oracle.d.ts.map +1 -0
  321. package/dist/tools/oracle.js +529 -0
  322. package/dist/tools/oracle.js.map +1 -0
  323. package/dist/tools/policy.d.ts +119 -0
  324. package/dist/tools/policy.d.ts.map +1 -0
  325. package/dist/tools/policy.js +406 -0
  326. package/dist/tools/policy.js.map +1 -0
  327. package/dist/tools/provenance/index.d.ts +4 -0
  328. package/dist/tools/provenance/index.d.ts.map +1 -0
  329. package/dist/tools/provenance/index.js +63 -0
  330. package/dist/tools/provenance/index.js.map +1 -0
  331. package/dist/tools/provenance.d.ts +75 -0
  332. package/dist/tools/provenance.d.ts.map +1 -0
  333. package/dist/tools/provenance.js +224 -0
  334. package/dist/tools/provenance.js.map +1 -0
  335. package/dist/tools/rateLimiter.d.ts +45 -0
  336. package/dist/tools/rateLimiter.d.ts.map +1 -0
  337. package/dist/tools/rateLimiter.js +91 -0
  338. package/dist/tools/rateLimiter.js.map +1 -0
  339. package/dist/tools/registry/index.d.ts +10 -0
  340. package/dist/tools/registry/index.d.ts.map +1 -0
  341. package/dist/tools/registry/index.js +506 -0
  342. package/dist/tools/registry/index.js.map +1 -0
  343. package/dist/tools/registry.d.ts +3 -0
  344. package/dist/tools/registry.d.ts.map +1 -0
  345. package/dist/tools/registry.js +189 -0
  346. package/dist/tools/registry.js.map +1 -0
  347. package/dist/tools/roadmap/index.d.ts +11 -0
  348. package/dist/tools/roadmap/index.d.ts.map +1 -0
  349. package/dist/tools/roadmap/index.js +364 -0
  350. package/dist/tools/roadmap/index.js.map +1 -0
  351. package/dist/tools/roadmap.d.ts +103 -0
  352. package/dist/tools/roadmap.d.ts.map +1 -0
  353. package/dist/tools/roadmap.js +407 -0
  354. package/dist/tools/roadmap.js.map +1 -0
  355. package/dist/tools/senken.d.ts +11 -0
  356. package/dist/tools/senken.d.ts.map +1 -0
  357. package/dist/tools/senken.js +482 -0
  358. package/dist/tools/senken.js.map +1 -0
  359. package/dist/tools/sentinel/index.d.ts +21 -0
  360. package/dist/tools/sentinel/index.d.ts.map +1 -0
  361. package/dist/tools/sentinel/index.js +1067 -0
  362. package/dist/tools/sentinel/index.js.map +1 -0
  363. package/dist/tools/sentinel-scan-data.d.ts +90 -0
  364. package/dist/tools/sentinel-scan-data.d.ts.map +1 -0
  365. package/dist/tools/sentinel-scan-data.js +122 -0
  366. package/dist/tools/sentinel-scan-data.js.map +1 -0
  367. package/dist/tools/sentinel.d.ts +156 -0
  368. package/dist/tools/sentinel.d.ts.map +1 -0
  369. package/dist/tools/sentinel.js +603 -0
  370. package/dist/tools/sentinel.js.map +1 -0
  371. package/dist/tools/shared/index.d.ts +5 -0
  372. package/dist/tools/shared/index.d.ts.map +1 -0
  373. package/dist/tools/shared/index.js +8 -0
  374. package/dist/tools/shared/index.js.map +1 -0
  375. package/dist/tools/shared/project.d.ts +17 -0
  376. package/dist/tools/shared/project.d.ts.map +1 -0
  377. package/dist/tools/shared/project.js +36 -0
  378. package/dist/tools/shared/project.js.map +1 -0
  379. package/dist/tools/shared/response.d.ts +15 -0
  380. package/dist/tools/shared/response.d.ts.map +1 -0
  381. package/dist/tools/shared/response.js +77 -0
  382. package/dist/tools/shared/response.js.map +1 -0
  383. package/dist/tools/shared/runTracker.d.ts +87 -0
  384. package/dist/tools/shared/runTracker.d.ts.map +1 -0
  385. package/dist/tools/shared/runTracker.js +225 -0
  386. package/dist/tools/shared/runTracker.js.map +1 -0
  387. package/dist/tools/shared/validation.d.ts +10 -0
  388. package/dist/tools/shared/validation.d.ts.map +1 -0
  389. package/dist/tools/shared/validation.js +26 -0
  390. package/dist/tools/shared/validation.js.map +1 -0
  391. package/dist/tools/studio/cloud-spine.d.ts +27 -0
  392. package/dist/tools/studio/cloud-spine.d.ts.map +1 -0
  393. package/dist/tools/studio/cloud-spine.js +845 -0
  394. package/dist/tools/studio/cloud-spine.js.map +1 -0
  395. package/dist/tools/studio/index.d.ts +154 -0
  396. package/dist/tools/studio/index.d.ts.map +1 -0
  397. package/dist/tools/studio/index.js +541 -0
  398. package/dist/tools/studio/index.js.map +1 -0
  399. package/dist/tools/testSpec.d.ts +122 -0
  400. package/dist/tools/testSpec.d.ts.map +1 -0
  401. package/dist/tools/testSpec.js +525 -0
  402. package/dist/tools/testSpec.js.map +1 -0
  403. package/dist/tools/toolsIndex.d.ts +5 -0
  404. package/dist/tools/toolsIndex.d.ts.map +1 -0
  405. package/dist/tools/toolsIndex.js +37 -0
  406. package/dist/tools/toolsIndex.js.map +1 -0
  407. package/dist/tools/types.d.ts +47 -0
  408. package/dist/tools/types.d.ts.map +1 -0
  409. package/dist/tools/types.js +7 -0
  410. package/dist/tools/types.js.map +1 -0
  411. package/dist/tools/vector/index.d.ts +13 -0
  412. package/dist/tools/vector/index.d.ts.map +1 -0
  413. package/dist/tools/vector/index.js +592 -0
  414. package/dist/tools/vector/index.js.map +1 -0
  415. package/dist/tools/vector.d.ts +189 -0
  416. package/dist/tools/vector.d.ts.map +1 -0
  417. package/dist/tools/vector.js +570 -0
  418. package/dist/tools/vector.js.map +1 -0
  419. package/dist/tools/velocity/index.d.ts +9 -0
  420. package/dist/tools/velocity/index.d.ts.map +1 -0
  421. package/dist/tools/velocity/index.js +306 -0
  422. package/dist/tools/velocity/index.js.map +1 -0
  423. package/dist/tools/velocity.d.ts +143 -0
  424. package/dist/tools/velocity.d.ts.map +1 -0
  425. package/dist/tools/velocity.js +628 -0
  426. package/dist/tools/velocity.js.map +1 -0
  427. package/dist/tools/voice/index.d.ts +8 -0
  428. package/dist/tools/voice/index.d.ts.map +1 -0
  429. package/dist/tools/voice/index.js +203 -0
  430. package/dist/tools/voice/index.js.map +1 -0
  431. package/dist/tools/voice.d.ts +291 -0
  432. package/dist/tools/voice.d.ts.map +1 -0
  433. package/dist/tools/voice.js +734 -0
  434. package/dist/tools/voice.js.map +1 -0
  435. package/dist/tools/workflow/index.d.ts +8 -0
  436. package/dist/tools/workflow/index.d.ts.map +1 -0
  437. package/dist/tools/workflow/index.js +199 -0
  438. package/dist/tools/workflow/index.js.map +1 -0
  439. package/dist/tools/workflow.d.ts +123 -0
  440. package/dist/tools/workflow.d.ts.map +1 -0
  441. package/dist/tools/workflow.js +647 -0
  442. package/dist/tools/workflow.js.map +1 -0
  443. package/dist/transports/bridge.d.ts +22 -0
  444. package/dist/transports/bridge.d.ts.map +1 -0
  445. package/dist/transports/bridge.js +177 -0
  446. package/dist/transports/bridge.js.map +1 -0
  447. package/dist/transports/http.d.ts +9 -0
  448. package/dist/transports/http.d.ts.map +1 -0
  449. package/dist/transports/http.js +35 -0
  450. package/dist/transports/http.js.map +1 -0
  451. package/dist/transports/index.d.ts +6 -0
  452. package/dist/transports/index.d.ts.map +1 -0
  453. package/dist/transports/index.js +8 -0
  454. package/dist/transports/index.js.map +1 -0
  455. package/dist/transports/mcp.d.ts +9 -0
  456. package/dist/transports/mcp.d.ts.map +1 -0
  457. package/dist/transports/mcp.js +51 -0
  458. package/dist/transports/mcp.js.map +1 -0
  459. package/dist/transports/stdio.d.ts +9 -0
  460. package/dist/transports/stdio.d.ts.map +1 -0
  461. package/dist/transports/stdio.js +26 -0
  462. package/dist/transports/stdio.js.map +1 -0
  463. package/dist/transports/types.d.ts +27 -0
  464. package/dist/transports/types.d.ts.map +1 -0
  465. package/dist/transports/types.js +8 -0
  466. package/dist/transports/types.js.map +1 -0
  467. package/dist/types/agent-services.d.ts +193 -0
  468. package/dist/types/agent-services.d.ts.map +1 -0
  469. package/dist/types/agent-services.js +8 -0
  470. package/dist/types/agent-services.js.map +1 -0
  471. package/dist/types/index.d.ts +2 -0
  472. package/dist/types/index.d.ts.map +1 -0
  473. package/dist/types/index.js +7 -0
  474. package/dist/types/index.js.map +1 -0
  475. package/package.json +72 -0
  476. package/templates/AGENT.md +87 -0
  477. package/templates/com.decibel.daemon.plist +47 -0
  478. package/templates/sentinel/ISSUE_TEMPLATE.md +20 -0
@@ -0,0 +1,647 @@
1
+ // ============================================================================
2
+ // Workflow Domain Tools
3
+ // ============================================================================
4
+ // High-level workflow tools that chain existing Decibel tools.
5
+ // These are the primary interface for AI assistants.
6
+ // ============================================================================
7
+ import path from 'path';
8
+ import { resolveProjectPaths } from '../projectRegistry.js';
9
+ import { listRepoIssues, listEpics, isProjectResolutionError } from './sentinel.js';
10
+ import { getRoadmapHealth } from './roadmap.js';
11
+ import { listFriction } from './friction.js';
12
+ import { nextActions, roadmapProgress, isOracleError } from './oracle.js';
13
+ import { listIssuesForProject } from '../sentinelIssues.js';
14
+ import { listProvenance } from './provenance.js';
15
+ import { listLearnings } from './learnings.js';
16
+ import { scanData } from './sentinel-scan-data.js';
17
+ import { auditorTriage, auditorLogHealth, auditorHealthHistory, isAuditorError } from './auditor.js';
18
+ import { gitLogRecent, gitStatus, isGitErrorResult, } from './git.js';
19
+ // ============================================================================
20
+ // Helpers
21
+ // ============================================================================
22
+ function makeError(message, details) {
23
+ return { error: message, details };
24
+ }
25
+ function isError(result) {
26
+ return typeof result === 'object' && result !== null && 'error' in result;
27
+ }
28
+ // Minimum interval between automatic health snapshots (4 hours in ms)
29
+ const HEALTH_SNAPSHOT_MIN_INTERVAL_MS = 4 * 60 * 60 * 1000;
30
+ /**
31
+ * Check if enough time has passed since the last health snapshot.
32
+ * Returns true if a new snapshot should be taken.
33
+ */
34
+ async function shouldLogHealthSnapshot(projectId) {
35
+ try {
36
+ const historyResult = await auditorHealthHistory({ projectId, limit: 1 });
37
+ if ('error' in historyResult) {
38
+ // No history exists, should create first snapshot
39
+ return true;
40
+ }
41
+ if (historyResult.entries.length === 0) {
42
+ return true;
43
+ }
44
+ const lastTimestamp = new Date(historyResult.entries[historyResult.entries.length - 1].timestamp);
45
+ const now = new Date();
46
+ const elapsed = now.getTime() - lastTimestamp.getTime();
47
+ return elapsed >= HEALTH_SNAPSHOT_MIN_INTERVAL_MS;
48
+ }
49
+ catch {
50
+ // If we can't check, don't log (fail safe)
51
+ return false;
52
+ }
53
+ }
54
+ // ============================================================================
55
+ // workflow_status
56
+ // ============================================================================
57
+ export async function workflowStatus(input) {
58
+ let resolved;
59
+ try {
60
+ resolved = resolveProjectPaths(input.projectId);
61
+ }
62
+ catch {
63
+ return makeError('Failed to resolve project path');
64
+ }
65
+ const timestamp = new Date().toISOString();
66
+ const projectId = resolved.id || path.basename(resolved.projectPath);
67
+ // Git status
68
+ const gitResult = await gitStatus({ projectId: input.projectId });
69
+ const git = isGitErrorResult(gitResult)
70
+ ? { branch: 'unknown', hasChanges: false, ahead: 0, behind: 0 }
71
+ : {
72
+ branch: gitResult.branch,
73
+ hasChanges: gitResult.hasChanges,
74
+ ahead: gitResult.ahead,
75
+ behind: gitResult.behind,
76
+ };
77
+ // Issues
78
+ const issuesResult = await listRepoIssues({ projectId: input.projectId });
79
+ const issues = {
80
+ open: 0,
81
+ inProgress: 0,
82
+ blocked: 0,
83
+ recentlyUpdated: [],
84
+ };
85
+ if (!('error' in issuesResult)) {
86
+ for (const issue of issuesResult.issues) {
87
+ if (issue.status === 'open')
88
+ issues.open++;
89
+ if (issue.status === 'in_progress')
90
+ issues.inProgress++;
91
+ if (issue.status === 'blocked')
92
+ issues.blocked++;
93
+ }
94
+ issues.recentlyUpdated = issuesResult.issues
95
+ .slice(0, 5)
96
+ .map(i => ({ id: i.id, title: i.title, status: i.status }));
97
+ }
98
+ // Health
99
+ const healthResult = await getRoadmapHealth({ projectId: input.projectId || projectId });
100
+ const health = {
101
+ score: 0,
102
+ atRisk: [],
103
+ behind: [],
104
+ };
105
+ if (!('error' in healthResult) && healthResult.epics) {
106
+ const epics = healthResult.epics;
107
+ const scores = epics
108
+ .filter((e) => e.health_score !== undefined)
109
+ .map((e) => e.health_score);
110
+ health.score = scores.length > 0
111
+ ? Math.round(scores.reduce((a, b) => a + b, 0) / scores.length)
112
+ : 100;
113
+ health.atRisk = epics
114
+ .filter((e) => e.health_score !== undefined && e.health_score < 70)
115
+ .map((e) => e.epic_id);
116
+ }
117
+ // Friction
118
+ const frictionResult = await listFriction({ projectId: input.projectId });
119
+ const friction = {
120
+ total: 0,
121
+ topBySignal: [],
122
+ };
123
+ if (!('error' in frictionResult)) {
124
+ friction.total = frictionResult.friction.length;
125
+ friction.topBySignal = frictionResult.friction
126
+ .sort((a, b) => (b.signal_count || 0) - (a.signal_count || 0))
127
+ .slice(0, 3)
128
+ .map(f => ({ context: f.context, signal: f.signal_count || 1 }));
129
+ }
130
+ // Code Quality (via Auditor)
131
+ let codeQuality;
132
+ const auditResult = await auditorTriage({ projectId: input.projectId });
133
+ if (!isAuditorError(auditResult)) {
134
+ codeQuality = {
135
+ godFiles: auditResult.issues.filter(i => i.smell === 'god_file').length,
136
+ highSeverity: auditResult.summary.high,
137
+ mediumSeverity: auditResult.summary.medium,
138
+ };
139
+ }
140
+ // Recommendations
141
+ const oracleResult = await nextActions({ projectId: input.projectId });
142
+ const recommendations = !('error' in oracleResult)
143
+ ? oracleResult.actions.slice(0, 3).map(a => a.description)
144
+ : [];
145
+ return {
146
+ project: projectId,
147
+ timestamp,
148
+ git,
149
+ issues,
150
+ health,
151
+ friction,
152
+ codeQuality,
153
+ recommendations,
154
+ };
155
+ }
156
+ // ============================================================================
157
+ // workflow_preflight
158
+ // ============================================================================
159
+ export async function workflowPreflight(input) {
160
+ let resolved;
161
+ try {
162
+ resolved = resolveProjectPaths(input.projectId);
163
+ }
164
+ catch {
165
+ return makeError('Failed to resolve project path');
166
+ }
167
+ const timestamp = new Date().toISOString();
168
+ const checks = [];
169
+ const strict = input.strict ?? false;
170
+ // Check 1: Git status (uncommitted changes)
171
+ const gitResult = await gitStatus({ projectId: input.projectId });
172
+ if (isGitErrorResult(gitResult)) {
173
+ checks.push({
174
+ name: 'Git Status',
175
+ status: 'warn',
176
+ message: 'Could not check git status',
177
+ });
178
+ }
179
+ else if (gitResult.hasChanges) {
180
+ checks.push({
181
+ name: 'Git Status',
182
+ status: 'warn',
183
+ message: `Uncommitted changes: ${gitResult.staged} staged, ${gitResult.modified} modified, ${gitResult.untracked} untracked`,
184
+ });
185
+ }
186
+ else {
187
+ checks.push({
188
+ name: 'Git Status',
189
+ status: 'pass',
190
+ message: 'Working directory clean',
191
+ });
192
+ }
193
+ // Check 2: Sentinel scan
194
+ const scanResult = await scanData({
195
+ projectId: input.projectId || resolved.id,
196
+ flags: ['orphans', 'stale', 'invalid'],
197
+ });
198
+ if ('error' in scanResult) {
199
+ checks.push({
200
+ name: 'Data Validation',
201
+ status: 'warn',
202
+ message: 'Could not run sentinel scan',
203
+ });
204
+ }
205
+ else {
206
+ const orphanCount = (scanResult.orphans?.epics?.length || 0) + (scanResult.orphans?.issues?.length || 0);
207
+ const staleCount = (scanResult.stale?.epics?.length || 0) + (scanResult.stale?.issues?.length || 0);
208
+ const hasIssues = orphanCount > 0 || staleCount > 0;
209
+ checks.push({
210
+ name: 'Data Validation',
211
+ status: hasIssues ? 'warn' : 'pass',
212
+ message: hasIssues
213
+ ? `Found ${orphanCount} orphans, ${staleCount} stale items`
214
+ : 'All data validated',
215
+ details: [
216
+ ...(scanResult.orphans?.epics || []).map((o) => `Orphan epic: ${o}`),
217
+ ...(scanResult.orphans?.issues || []).map((o) => `Orphan issue: ${o}`),
218
+ ...(scanResult.stale?.epics || []).map((s) => `Stale epic: ${s}`),
219
+ ...(scanResult.stale?.issues || []).map((s) => `Stale issue: ${s}`),
220
+ ],
221
+ });
222
+ }
223
+ // Check 3: Code Quality (via Auditor)
224
+ const auditResult = await auditorTriage({ projectId: input.projectId });
225
+ if (isAuditorError(auditResult)) {
226
+ checks.push({
227
+ name: 'Code Quality',
228
+ status: 'warn',
229
+ message: 'Could not run code audit',
230
+ });
231
+ }
232
+ else {
233
+ const godFiles = auditResult.issues.filter(i => i.smell === 'god_file');
234
+ const highSeverity = auditResult.summary.high;
235
+ if (highSeverity > 0) {
236
+ checks.push({
237
+ name: 'Code Quality',
238
+ status: 'warn',
239
+ message: `${highSeverity} high-severity code issues`,
240
+ details: auditResult.issues
241
+ .filter(i => i.severity === 'high')
242
+ .slice(0, 5)
243
+ .map(i => `${i.file}: ${i.message}`),
244
+ });
245
+ }
246
+ else if (godFiles.length > 0) {
247
+ checks.push({
248
+ name: 'Code Quality',
249
+ status: 'warn',
250
+ message: `${godFiles.length} files over 400 lines`,
251
+ details: godFiles.slice(0, 5).map(i => i.file),
252
+ });
253
+ }
254
+ else {
255
+ checks.push({
256
+ name: 'Code Quality',
257
+ status: 'pass',
258
+ message: 'No major code quality issues',
259
+ });
260
+ }
261
+ }
262
+ // Check 4: Blocked issues
263
+ const issuesResult = await listRepoIssues({ projectId: input.projectId, status: 'blocked' });
264
+ const blockedCount = !('error' in issuesResult) ? issuesResult.issues.length : 0;
265
+ checks.push({
266
+ name: 'Blocked Issues',
267
+ status: blockedCount > 0 ? 'warn' : 'pass',
268
+ message: blockedCount > 0
269
+ ? `${blockedCount} blocked issues`
270
+ : 'No blocked issues',
271
+ });
272
+ // Calculate overall status
273
+ const hasFail = checks.some(c => c.status === 'fail');
274
+ const hasWarn = checks.some(c => c.status === 'warn');
275
+ const passed = !hasFail && (!strict || !hasWarn);
276
+ // Automatic health snapshot (if enough time has passed)
277
+ let healthSnapshot;
278
+ try {
279
+ const shouldLog = await shouldLogHealthSnapshot(input.projectId);
280
+ if (shouldLog) {
281
+ const logResult = await auditorLogHealth({ projectId: input.projectId });
282
+ if ('error' in logResult) {
283
+ healthSnapshot = { logged: false, reason: `skipped (${logResult.error})` };
284
+ }
285
+ else {
286
+ healthSnapshot = { logged: true, reason: 'recorded' };
287
+ }
288
+ }
289
+ else {
290
+ healthSnapshot = { logged: false, reason: 'skipped (recent snapshot exists)' };
291
+ }
292
+ }
293
+ catch {
294
+ healthSnapshot = { logged: false, reason: 'skipped (error)' };
295
+ }
296
+ return {
297
+ passed,
298
+ timestamp,
299
+ checks,
300
+ summary: passed
301
+ ? 'All checks passed'
302
+ : hasFail
303
+ ? 'Preflight failed - fix issues before committing'
304
+ : 'Preflight passed with warnings',
305
+ healthSnapshot,
306
+ };
307
+ }
308
+ // ============================================================================
309
+ // workflow_ship
310
+ // ============================================================================
311
+ export async function workflowShip(input) {
312
+ let resolved;
313
+ try {
314
+ resolved = resolveProjectPaths(input.projectId);
315
+ }
316
+ catch {
317
+ return makeError('Failed to resolve project path');
318
+ }
319
+ const timestamp = new Date().toISOString();
320
+ const blockers = [];
321
+ const warnings = [];
322
+ const checklist = [];
323
+ // Run preflight first
324
+ const preflightResult = await workflowPreflight({ projectId: input.projectId, strict: true });
325
+ if (isError(preflightResult)) {
326
+ blockers.push('Preflight check failed to run');
327
+ }
328
+ else {
329
+ for (const check of preflightResult.checks) {
330
+ if (check.status === 'fail') {
331
+ blockers.push(`${check.name}: ${check.message}`);
332
+ }
333
+ else if (check.status === 'warn') {
334
+ warnings.push(`${check.name}: ${check.message}`);
335
+ }
336
+ }
337
+ checklist.push({
338
+ item: 'Preflight checks',
339
+ status: preflightResult.passed ? 'done' : 'blocked',
340
+ });
341
+ }
342
+ // Check roadmap health
343
+ const healthResult = await getRoadmapHealth({ projectId: input.projectId || resolved.id });
344
+ if (!('error' in healthResult)) {
345
+ const epics = (healthResult.epics || []);
346
+ const unhealthy = epics.filter((e) => e.health_score !== undefined && e.health_score < 50);
347
+ if (unhealthy.length > 0) {
348
+ warnings.push(`${unhealthy.length} epics with health < 50%`);
349
+ }
350
+ checklist.push({
351
+ item: 'Roadmap health review',
352
+ status: unhealthy.length === 0 ? 'done' : 'pending',
353
+ });
354
+ }
355
+ // Check for open blockers
356
+ const issuesResult = await listRepoIssues({ projectId: input.projectId, status: 'blocked' });
357
+ if (!('error' in issuesResult) && issuesResult.issues.length > 0) {
358
+ blockers.push(`${issuesResult.issues.length} blocked issues must be resolved`);
359
+ checklist.push({
360
+ item: 'Resolve blocked issues',
361
+ status: 'blocked',
362
+ });
363
+ }
364
+ else {
365
+ checklist.push({
366
+ item: 'No blocked issues',
367
+ status: 'done',
368
+ });
369
+ }
370
+ // Git status
371
+ const gitResult = await gitStatus({ projectId: input.projectId });
372
+ if (!isGitErrorResult(gitResult)) {
373
+ if (gitResult.hasChanges) {
374
+ warnings.push('Uncommitted changes in working directory');
375
+ checklist.push({
376
+ item: 'Commit all changes',
377
+ status: 'pending',
378
+ });
379
+ }
380
+ else {
381
+ checklist.push({
382
+ item: 'All changes committed',
383
+ status: 'done',
384
+ });
385
+ }
386
+ if (gitResult.ahead > 0) {
387
+ checklist.push({
388
+ item: `Push ${gitResult.ahead} commit(s)`,
389
+ status: 'pending',
390
+ });
391
+ }
392
+ }
393
+ const ready = blockers.length === 0;
394
+ const nextSteps = [];
395
+ if (ready) {
396
+ nextSteps.push('Run final tests: npm test');
397
+ nextSteps.push('Create release tag: git tag -a vX.Y.Z -m "Release X.Y.Z"');
398
+ nextSteps.push('Push with tags: git push origin main --tags');
399
+ }
400
+ else {
401
+ nextSteps.push('Fix blockers before shipping');
402
+ for (const blocker of blockers) {
403
+ nextSteps.push(`→ ${blocker}`);
404
+ }
405
+ }
406
+ // Automatic health snapshot on ship (always log if ready, respects interval otherwise)
407
+ let healthSnapshot;
408
+ try {
409
+ // For ship, we always log if ready (this is a significant milestone)
410
+ // Otherwise, respect the minimum interval
411
+ const shouldLog = ready || await shouldLogHealthSnapshot(input.projectId);
412
+ if (shouldLog) {
413
+ const logResult = await auditorLogHealth({ projectId: input.projectId });
414
+ if ('error' in logResult) {
415
+ healthSnapshot = { logged: false, reason: `skipped (${logResult.error})` };
416
+ }
417
+ else {
418
+ healthSnapshot = { logged: true, reason: ready ? 'recorded (ship milestone)' : 'recorded' };
419
+ }
420
+ }
421
+ else {
422
+ healthSnapshot = { logged: false, reason: 'skipped (recent snapshot exists)' };
423
+ }
424
+ }
425
+ catch {
426
+ healthSnapshot = { logged: false, reason: 'skipped (error)' };
427
+ }
428
+ return {
429
+ ready,
430
+ timestamp,
431
+ blockers,
432
+ warnings,
433
+ checklist,
434
+ nextSteps,
435
+ healthSnapshot,
436
+ };
437
+ }
438
+ // ============================================================================
439
+ // workflow_investigate
440
+ // ============================================================================
441
+ export async function workflowInvestigate(input) {
442
+ let resolved;
443
+ try {
444
+ resolved = resolveProjectPaths(input.projectId);
445
+ }
446
+ catch {
447
+ return makeError('Failed to resolve project path');
448
+ }
449
+ const timestamp = new Date().toISOString();
450
+ // Recent commits
451
+ const gitLogResult = await gitLogRecent({
452
+ projectId: input.projectId,
453
+ count: 15,
454
+ grep: input.context, // If context provided, search commit messages
455
+ });
456
+ const recentCommits = isGitErrorResult(gitLogResult)
457
+ ? []
458
+ : gitLogResult.commits;
459
+ // Recent issues (IssueSummary doesn't have timestamps, so just take first 10)
460
+ const issuesResult = await listRepoIssues({ projectId: input.projectId });
461
+ const recentIssues = ('error' in issuesResult)
462
+ ? []
463
+ : issuesResult.issues
464
+ .slice(0, 10)
465
+ .map(i => ({
466
+ id: i.id,
467
+ title: i.title,
468
+ status: i.status,
469
+ updated: '', // Not available in IssueSummary
470
+ }));
471
+ // Related friction
472
+ const frictionResult = await listFriction({ projectId: input.projectId });
473
+ const relatedFriction = ('error' in frictionResult)
474
+ ? []
475
+ : frictionResult.friction
476
+ .filter(f => !input.context ||
477
+ f.context.toLowerCase().includes(input.context.toLowerCase()) ||
478
+ f.description.toLowerCase().includes(input.context.toLowerCase()))
479
+ .slice(0, 5)
480
+ .map(f => ({ context: f.context, description: f.description }));
481
+ // Recent learnings
482
+ const learningsResult = await listLearnings({ projectId: input.projectId });
483
+ const recentLearnings = ('error' in learningsResult)
484
+ ? []
485
+ : (learningsResult.entries || [])
486
+ .slice(0, 5)
487
+ .map((l) => ({
488
+ date: l.timestamp || '',
489
+ content: l.title || l.content || '',
490
+ }));
491
+ // Generate suggestions based on findings
492
+ const suggestions = [];
493
+ if (recentCommits.length > 0) {
494
+ suggestions.push(`Review recent commits - last change: "${recentCommits[0].message}"`);
495
+ }
496
+ if (relatedFriction.length > 0) {
497
+ suggestions.push(`Check friction points - ${relatedFriction.length} related issues found`);
498
+ }
499
+ if (recentIssues.some(i => i.status === 'blocked')) {
500
+ suggestions.push('Blocked issues may be related to the problem');
501
+ }
502
+ suggestions.push('Use git_find_removal to search for removed code');
503
+ suggestions.push('Use git_blame_context to check recent changes to specific files');
504
+ return {
505
+ timestamp,
506
+ recentCommits,
507
+ recentIssues,
508
+ relatedFriction,
509
+ recentLearnings,
510
+ suggestions,
511
+ };
512
+ }
513
+ export async function projectSnapshot(input) {
514
+ let resolved;
515
+ try {
516
+ resolved = resolveProjectPaths(input.projectId);
517
+ }
518
+ catch {
519
+ return makeError('Failed to resolve project path');
520
+ }
521
+ const projectId = resolved.id;
522
+ const depth = input.depth ?? 'full';
523
+ const lines = [];
524
+ const today = new Date().toISOString().slice(0, 10);
525
+ lines.push(`## Briefing: ${projectId} (${today})`);
526
+ // ---- Issues ----
527
+ try {
528
+ const issues = await listIssuesForProject(projectId);
529
+ const open = issues.filter(i => i.status === 'open');
530
+ const inProgress = issues.filter(i => i.status === 'in_progress');
531
+ const blocked = issues.filter(i => i.status === 'blocked');
532
+ lines.push(`Issues: ${open.length} open, ${inProgress.length} in progress, ${blocked.length} blocked`);
533
+ // Show high priority and blocked issues
534
+ const urgent = [
535
+ ...blocked,
536
+ ...open.filter(i => i.priority === 'high'),
537
+ ...inProgress.filter(i => i.priority === 'high'),
538
+ ];
539
+ if (urgent.length > 0) {
540
+ lines.push('');
541
+ lines.push('### Priorities');
542
+ for (const issue of urgent.slice(0, 5)) {
543
+ const badge = issue.status === 'blocked' ? 'BLOCKED' : issue.priority ?? 'med';
544
+ lines.push(`- ${issue.id} [${badge}] ${issue.title}`);
545
+ }
546
+ }
547
+ }
548
+ catch {
549
+ lines.push('Issues: (unavailable)');
550
+ }
551
+ // ---- Epics ----
552
+ try {
553
+ const epicsResult = await listEpics({ projectId });
554
+ if (!isProjectResolutionError(epicsResult) && epicsResult.epics.length > 0) {
555
+ const active = epicsResult.epics.filter(e => e.status === 'in_progress');
556
+ const planned = epicsResult.epics.filter(e => e.status === 'planned');
557
+ const shipped = epicsResult.epics.filter(e => e.status === 'shipped');
558
+ lines.push('');
559
+ lines.push(`### Epics (${active.length} active, ${planned.length} planned, ${shipped.length} shipped)`);
560
+ for (const epic of active) {
561
+ lines.push(`- ${epic.id} "${epic.title}" — ${epic.status}`);
562
+ }
563
+ }
564
+ }
565
+ catch { /* optional */ }
566
+ // ---- Roadmap Health ----
567
+ if (depth === 'full') {
568
+ try {
569
+ const roadmap = await roadmapProgress({ projectId, dryRun: true, noSignals: false });
570
+ if (!isOracleError(roadmap) && roadmap.milestones.length > 0) {
571
+ const atRisk = roadmap.milestones.filter(m => m.status === 'at_risk' || m.status === 'behind');
572
+ if (atRisk.length > 0) {
573
+ lines.push('');
574
+ lines.push('### Milestones at Risk');
575
+ for (const ms of atRisk) {
576
+ lines.push(`- ${ms.id} "${ms.label}" — ${ms.progress_percent}% (${ms.status.replace('_', ' ')})`);
577
+ }
578
+ }
579
+ if (roadmap.signals) {
580
+ const { blocking_issues, high_severity_issues, friction_points } = roadmap.signals;
581
+ if (blocking_issues > 0 || high_severity_issues > 0 || friction_points > 0) {
582
+ const parts = [];
583
+ if (blocking_issues > 0)
584
+ parts.push(`${blocking_issues} blocking`);
585
+ if (high_severity_issues > 0)
586
+ parts.push(`${high_severity_issues} high-severity`);
587
+ if (friction_points > 0)
588
+ parts.push(`${friction_points} friction`);
589
+ lines.push(`Signals: ${parts.join(', ')}`);
590
+ }
591
+ }
592
+ }
593
+ }
594
+ catch { /* optional */ }
595
+ }
596
+ // ---- Friction ----
597
+ try {
598
+ const frictionResult = await listFriction({ projectId, status: 'open', limit: 3 });
599
+ if (!('error' in frictionResult) && frictionResult.friction.length > 0) {
600
+ lines.push('');
601
+ lines.push('### Friction');
602
+ for (const f of frictionResult.friction) {
603
+ lines.push(`- ${f.id} "${f.context}" (${f.impact}, ${f.signal_count}x)`);
604
+ }
605
+ }
606
+ }
607
+ catch { /* optional */ }
608
+ // ---- Next Actions ----
609
+ try {
610
+ const actionsResult = await nextActions({ projectId });
611
+ if (!('error' in actionsResult) && actionsResult.actions.length > 0) {
612
+ lines.push('');
613
+ lines.push('### Recommended Next');
614
+ for (const action of actionsResult.actions.slice(0, 3)) {
615
+ lines.push(`- ${action.description}`);
616
+ }
617
+ }
618
+ }
619
+ catch { /* optional */ }
620
+ // ---- Recent Activity (full depth only) ----
621
+ if (depth === 'full') {
622
+ try {
623
+ const provResult = await listProvenance({ projectId, limit: 5 });
624
+ if (!('error' in provResult) && provResult.events.length > 0) {
625
+ lines.push('');
626
+ lines.push('### Recent Activity');
627
+ for (const evt of provResult.events.slice(0, 5)) {
628
+ const ts = evt.timestamp.slice(0, 10);
629
+ lines.push(`- [${ts}] ${evt.action}: ${evt.summary || evt.artifact_refs.join(', ')}`);
630
+ }
631
+ }
632
+ }
633
+ catch { /* optional */ }
634
+ }
635
+ return {
636
+ briefing: lines.join('\n'),
637
+ project_id: projectId,
638
+ generated_at: new Date().toISOString(),
639
+ };
640
+ }
641
+ // ============================================================================
642
+ // Exports
643
+ // ============================================================================
644
+ export function isWorkflowError(result) {
645
+ return typeof result === 'object' && result !== null && 'error' in result;
646
+ }
647
+ //# sourceMappingURL=workflow.js.map