maestro-flow 0.4.3 → 0.4.5

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 (263) hide show
  1. package/.claude/commands/maestro-collab.md +1 -1
  2. package/.claude/commands/maestro-composer.md +1 -1
  3. package/.claude/commands/maestro-impeccable.md +1 -1
  4. package/.claude/commands/maestro-learn.md +1 -1
  5. package/.claude/commands/maestro-overlay.md +1 -1
  6. package/.claude/commands/maestro-quick.md +1 -1
  7. package/.claude/commands/maestro-ralph.md +1 -1
  8. package/.claude/commands/maestro-tools-execute.md +1 -1
  9. package/.claude/commands/maestro-tools-register.md +1 -1
  10. package/.claude/commands/maestro.md +1 -1
  11. package/.claude/commands/manage-issue-discover.md +1 -1
  12. package/.claude/commands/manage-issue.md +1 -1
  13. package/.claude/commands/manage-knowhow-capture.md +3 -1
  14. package/.claude/commands/manage-knowhow.md +1 -1
  15. package/.claude/commands/manage-learn.md +1 -1
  16. package/.claude/commands/manage-status.md +1 -0
  17. package/.claude/commands/manage-wiki.md +1 -1
  18. package/.claude/commands/quality-auto-test.md +1 -2
  19. package/.claude/commands/quality-refactor.md +1 -1
  20. package/.claude/commands/quality-test.md +5 -0
  21. package/.claude/commands/security-audit.md +1 -0
  22. package/.claude/commands/spec-add.md +6 -3
  23. package/.claude/commands/spec-setup.md +0 -3
  24. package/dashboard/dist/assets/{ArtifactsPage-iJZtYsmR.js → ArtifactsPage-CVh0Z2I2.js} +3 -3
  25. package/dashboard/dist/assets/{ChatInput-DNnDLdQF.js → ChatInput-CBI3qHQQ.js} +2 -2
  26. package/dashboard/dist/assets/ChatPage-BjJ9CYox.js +22 -0
  27. package/dashboard/dist/assets/CollabPage-CprGGO9y.js +1 -0
  28. package/dashboard/dist/assets/{ExecutionPanel-BKV3GZ7Q.js → ExecutionPanel-CClxD7cH.js} +1 -1
  29. package/dashboard/dist/assets/KanbanPage-copqjdPg.js +16 -0
  30. package/dashboard/dist/assets/MaestroCoordinatePage-CioZjQ9N.js +4 -0
  31. package/dashboard/dist/assets/{MarkdownRenderer-cYFfe1uX.js → MarkdownRenderer-CtUhoxCT.js} +1 -1
  32. package/dashboard/dist/assets/McpPage-BcPPcJpr.js +21 -0
  33. package/dashboard/dist/assets/{MeetingRoomPage-wnvT7wlB.js → MeetingRoomPage-BgmAKxU-.js} +1 -1
  34. package/dashboard/dist/assets/{OutputPanel-DDL90Idy.js → OutputPanel-DgT3gMyp.js} +1 -1
  35. package/dashboard/dist/assets/{ProblemsPanel-zFN9IIs0.js → ProblemsPanel-BmG7rxoG.js} +1 -1
  36. package/dashboard/dist/assets/{RequirementBoardPage-DOPJoT0I.js → RequirementBoardPage-k8YoeQ0r.js} +1 -1
  37. package/dashboard/dist/assets/{RequirementPage-CEVquRgM.js → RequirementPage-Da2354px.js} +1 -1
  38. package/dashboard/dist/assets/{RoomsPage-D5USEWDh.js → RoomsPage-BtqDiYaU.js} +1 -1
  39. package/dashboard/dist/assets/SpecsPage-ByPVH_M3.js +36 -0
  40. package/dashboard/dist/assets/{TeamsPage-DlcEmr_Q.js → TeamsPage-sFDLN30L.js} +1 -1
  41. package/dashboard/dist/assets/{TreeBrowser-Y48Wz-QY.js → TreeBrowser-oEx8YJXV.js} +1 -1
  42. package/dashboard/dist/assets/WorkflowPage-JrX7CVHh.js +6 -0
  43. package/dashboard/dist/assets/{arrow-left-NCUOENvg.js → arrow-left-DYvgSdIH.js} +1 -1
  44. package/dashboard/dist/assets/{check-o7nfGNHf.js → check-jcgYBWVR.js} +1 -1
  45. package/dashboard/dist/assets/{chevron-right-BXySK2fn.js → chevron-right-DvZ5sMOg.js} +1 -1
  46. package/dashboard/dist/assets/{circle-cooAwnAR.js → circle-DYT-zoRZ.js} +1 -1
  47. package/dashboard/dist/assets/{circle-alert-DcSBokh4.js → circle-alert-Bfbv3gt4.js} +1 -1
  48. package/dashboard/dist/assets/{circle-check-Cd-jce4j.js → circle-check-D82WnpbI.js} +1 -1
  49. package/dashboard/dist/assets/{circle-check-big-BN7Mdp4i.js → circle-check-big-CPVD1GKF.js} +1 -1
  50. package/dashboard/dist/assets/{code-BQa9oL1n.js → code-B3bKFGI4.js} +1 -1
  51. package/dashboard/dist/assets/{columns-3-BzgxelGx.js → columns-3-BeMAQCix.js} +1 -1
  52. package/dashboard/dist/assets/{download-swRJnate.js → download-BCtpoWYB.js} +1 -1
  53. package/dashboard/dist/assets/en-2h6fD0j8.js +1 -0
  54. package/dashboard/dist/assets/{folder-DbGbLNFN.js → folder-CTj6SNNu.js} +1 -1
  55. package/dashboard/dist/assets/index-6-yE5Yl9.css +1 -0
  56. package/dashboard/dist/assets/{index-DIoMBMbv.js → index-BxR_3IbJ.js} +1 -1
  57. package/dashboard/dist/assets/{index-DLBN_7fb.js → index-CWBJLu42.js} +1 -1
  58. package/dashboard/dist/assets/index-DpcPd-UG.js +236 -0
  59. package/dashboard/dist/assets/{list-BTRAIvDq.js → list-BMv8pIQn.js} +1 -1
  60. package/dashboard/dist/assets/{loader-NHtB6Mdn.js → loader-DdM4VOgF.js} +1 -1
  61. package/dashboard/dist/assets/{minus-BjMxRTET.js → minus-D15s2E__.js} +1 -1
  62. package/dashboard/dist/assets/{pen-line-C4_O16H0.js → pen-line-DO6o4xWz.js} +1 -1
  63. package/dashboard/dist/assets/{pencil-DTmKhyDY.js → pencil-qGxg9jOe.js} +1 -1
  64. package/dashboard/dist/assets/{proxy-Dtx5p6IO.js → proxy-DOffTzwA.js} +1 -1
  65. package/dashboard/dist/assets/refresh-cw-C9UNdLCy.js +6 -0
  66. package/dashboard/dist/assets/{rows-2-GR1dZtRu.js → rows-2-CifAA5SL.js} +1 -1
  67. package/dashboard/dist/assets/{search-DVtgy2W7.js → search-pe7pU1YN.js} +1 -1
  68. package/dashboard/dist/assets/{shallow-BOmvDNsv.js → shallow-r7YynQYA.js} +1 -1
  69. package/dashboard/dist/assets/table-Bh772iIw.js +6 -0
  70. package/dashboard/dist/assets/{team-types-BPeOvVdA.js → team-types-C_HqX2p2.js} +1 -1
  71. package/dashboard/dist/assets/{terminal-CzogW4cl.js → terminal-EpmtGBlw.js} +1 -1
  72. package/dashboard/dist/assets/{trash-2-52LATVfW.js → trash-2-Xen46iNQ.js} +1 -1
  73. package/dashboard/dist/assets/{users-DLFE2voE.js → users-BLueDPxF.js} +1 -1
  74. package/dashboard/dist/assets/{zap-DhiYlgyZ.js → zap-DsQCPF61.js} +1 -1
  75. package/dashboard/dist/assets/zh-CN-r3AvxxOL.js +1 -0
  76. package/dashboard/dist/index.html +2 -2
  77. package/dashboard/dist-server/dashboard/src/server/routes/settings.js +70 -1
  78. package/dashboard/dist-server/dashboard/src/server/routes/settings.js.map +1 -1
  79. package/dashboard/dist-server/src/types/index.d.ts +48 -6
  80. package/dist/src/commands/coordinate.d.ts.map +1 -1
  81. package/dist/src/commands/coordinate.js +2 -0
  82. package/dist/src/commands/coordinate.js.map +1 -1
  83. package/dist/src/commands/hooks.d.ts.map +1 -1
  84. package/dist/src/commands/hooks.js +201 -6
  85. package/dist/src/commands/hooks.js.map +1 -1
  86. package/dist/src/commands/spec.d.ts.map +1 -1
  87. package/dist/src/commands/spec.js +466 -0
  88. package/dist/src/commands/spec.js.map +1 -1
  89. package/dist/src/config/index.d.ts +5 -1
  90. package/dist/src/config/index.d.ts.map +1 -1
  91. package/dist/src/config/index.js +42 -0
  92. package/dist/src/config/index.js.map +1 -1
  93. package/dist/src/hooks/keyword-spec-injector.d.ts.map +1 -1
  94. package/dist/src/hooks/keyword-spec-injector.js +106 -10
  95. package/dist/src/hooks/keyword-spec-injector.js.map +1 -1
  96. package/dist/src/hooks/plugins/spec-analytics-plugin.d.ts +13 -0
  97. package/dist/src/hooks/plugins/spec-analytics-plugin.d.ts.map +1 -0
  98. package/dist/src/hooks/plugins/spec-analytics-plugin.js +92 -0
  99. package/dist/src/hooks/plugins/spec-analytics-plugin.js.map +1 -0
  100. package/dist/src/hooks/plugins/spec-injection-plugin.d.ts.map +1 -1
  101. package/dist/src/hooks/plugins/spec-injection-plugin.js +57 -4
  102. package/dist/src/hooks/plugins/spec-injection-plugin.js.map +1 -1
  103. package/dist/src/hooks/spec-analytics.d.ts +128 -0
  104. package/dist/src/hooks/spec-analytics.d.ts.map +1 -0
  105. package/dist/src/hooks/spec-analytics.js +311 -0
  106. package/dist/src/hooks/spec-analytics.js.map +1 -0
  107. package/dist/src/hooks/spec-injector.d.ts.map +1 -1
  108. package/dist/src/hooks/spec-injector.js +140 -6
  109. package/dist/src/hooks/spec-injector.js.map +1 -1
  110. package/dist/src/tools/spec-keyword-index.d.ts.map +1 -1
  111. package/dist/src/tools/spec-keyword-index.js +23 -6
  112. package/dist/src/tools/spec-keyword-index.js.map +1 -1
  113. package/dist/src/tools/spec-loader.d.ts +20 -0
  114. package/dist/src/tools/spec-loader.d.ts.map +1 -1
  115. package/dist/src/tools/spec-loader.js +58 -7
  116. package/dist/src/tools/spec-loader.js.map +1 -1
  117. package/dist/src/tools/store-knowhow.d.ts.map +1 -1
  118. package/dist/src/tools/store-knowhow.js +26 -1
  119. package/dist/src/tools/store-knowhow.js.map +1 -1
  120. package/dist/src/tui/config-ui/ConfigHub.d.ts +1 -1
  121. package/dist/src/tui/config-ui/ConfigHub.d.ts.map +1 -1
  122. package/dist/src/tui/config-ui/ConfigHub.js +16 -10
  123. package/dist/src/tui/config-ui/ConfigHub.js.map +1 -1
  124. package/dist/src/tui/config-ui/ConfigSourcesView.d.ts.map +1 -1
  125. package/dist/src/tui/config-ui/ConfigSourcesView.js +3 -2
  126. package/dist/src/tui/config-ui/ConfigSourcesView.js.map +1 -1
  127. package/dist/src/tui/config-ui/HooksPanel.d.ts.map +1 -1
  128. package/dist/src/tui/config-ui/HooksPanel.js +15 -19
  129. package/dist/src/tui/config-ui/HooksPanel.js.map +1 -1
  130. package/dist/src/tui/config-ui/SkillConfigDashboard.d.ts.map +1 -1
  131. package/dist/src/tui/config-ui/SkillConfigDashboard.js +5 -9
  132. package/dist/src/tui/config-ui/SkillConfigDashboard.js.map +1 -1
  133. package/dist/src/tui/config-ui/SkillParamEditor.d.ts.map +1 -1
  134. package/dist/src/tui/config-ui/SkillParamEditor.js +1 -3
  135. package/dist/src/tui/config-ui/SkillParamEditor.js.map +1 -1
  136. package/dist/src/tui/config-ui/SkillsList.d.ts.map +1 -1
  137. package/dist/src/tui/config-ui/SkillsList.js +7 -9
  138. package/dist/src/tui/config-ui/SkillsList.js.map +1 -1
  139. package/dist/src/tui/config-ui/SpecAnalyticsPanel.d.ts +6 -0
  140. package/dist/src/tui/config-ui/SpecAnalyticsPanel.d.ts.map +1 -0
  141. package/dist/src/tui/config-ui/SpecAnalyticsPanel.js +164 -0
  142. package/dist/src/tui/config-ui/SpecAnalyticsPanel.js.map +1 -0
  143. package/dist/src/tui/config-ui/SpecPanel.d.ts.map +1 -1
  144. package/dist/src/tui/config-ui/SpecPanel.js +918 -20
  145. package/dist/src/tui/config-ui/SpecPanel.js.map +1 -1
  146. package/dist/src/tui/config-ui/index.d.ts +3 -1
  147. package/dist/src/tui/config-ui/index.d.ts.map +1 -1
  148. package/dist/src/tui/config-ui/index.js +4 -0
  149. package/dist/src/tui/config-ui/index.js.map +1 -1
  150. package/dist/src/tui/install-ui/BackupConfig.d.ts.map +1 -1
  151. package/dist/src/tui/install-ui/BackupConfig.js +3 -2
  152. package/dist/src/tui/install-ui/BackupConfig.js.map +1 -1
  153. package/dist/src/tui/install-ui/BlueprintPreview.d.ts.map +1 -1
  154. package/dist/src/tui/install-ui/BlueprintPreview.js +7 -6
  155. package/dist/src/tui/install-ui/BlueprintPreview.js.map +1 -1
  156. package/dist/src/tui/install-ui/ComponentGrid.d.ts.map +1 -1
  157. package/dist/src/tui/install-ui/ComponentGrid.js +3 -2
  158. package/dist/src/tui/install-ui/ComponentGrid.js.map +1 -1
  159. package/dist/src/tui/install-ui/ConfigPanel.d.ts.map +1 -1
  160. package/dist/src/tui/install-ui/ConfigPanel.js +4 -3
  161. package/dist/src/tui/install-ui/ConfigPanel.js.map +1 -1
  162. package/dist/src/tui/install-ui/CyberItem.d.ts.map +1 -1
  163. package/dist/src/tui/install-ui/CyberItem.js +7 -6
  164. package/dist/src/tui/install-ui/CyberItem.js.map +1 -1
  165. package/dist/src/tui/install-ui/CyberdeckBlueprint.d.ts.map +1 -1
  166. package/dist/src/tui/install-ui/CyberdeckBlueprint.js +2 -1
  167. package/dist/src/tui/install-ui/CyberdeckBlueprint.js.map +1 -1
  168. package/dist/src/tui/install-ui/ExecutionView.d.ts.map +1 -1
  169. package/dist/src/tui/install-ui/ExecutionView.js +3 -2
  170. package/dist/src/tui/install-ui/ExecutionView.js.map +1 -1
  171. package/dist/src/tui/install-ui/GradientHeader.d.ts.map +1 -1
  172. package/dist/src/tui/install-ui/GradientHeader.js +2 -1
  173. package/dist/src/tui/install-ui/GradientHeader.js.map +1 -1
  174. package/dist/src/tui/install-ui/HooksConfig.d.ts.map +1 -1
  175. package/dist/src/tui/install-ui/HooksConfig.js +8 -8
  176. package/dist/src/tui/install-ui/HooksConfig.js.map +1 -1
  177. package/dist/src/tui/install-ui/InstallConfirm.d.ts.map +1 -1
  178. package/dist/src/tui/install-ui/InstallConfirm.js +4 -3
  179. package/dist/src/tui/install-ui/InstallConfirm.js.map +1 -1
  180. package/dist/src/tui/install-ui/InstallExecution.d.ts.map +1 -1
  181. package/dist/src/tui/install-ui/InstallExecution.js +3 -2
  182. package/dist/src/tui/install-ui/InstallExecution.js.map +1 -1
  183. package/dist/src/tui/install-ui/InstallFlow.d.ts.map +1 -1
  184. package/dist/src/tui/install-ui/InstallFlow.js +3 -2
  185. package/dist/src/tui/install-ui/InstallFlow.js.map +1 -1
  186. package/dist/src/tui/install-ui/InstallHub.d.ts.map +1 -1
  187. package/dist/src/tui/install-ui/InstallHub.js +9 -8
  188. package/dist/src/tui/install-ui/InstallHub.js.map +1 -1
  189. package/dist/src/tui/install-ui/InstallResult.d.ts.map +1 -1
  190. package/dist/src/tui/install-ui/InstallResult.js +3 -2
  191. package/dist/src/tui/install-ui/InstallResult.js.map +1 -1
  192. package/dist/src/tui/install-ui/McpConfig.d.ts.map +1 -1
  193. package/dist/src/tui/install-ui/McpConfig.js +4 -3
  194. package/dist/src/tui/install-ui/McpConfig.js.map +1 -1
  195. package/dist/src/tui/install-ui/ResultDashboard.d.ts.map +1 -1
  196. package/dist/src/tui/install-ui/ResultDashboard.js +3 -2
  197. package/dist/src/tui/install-ui/ResultDashboard.js.map +1 -1
  198. package/dist/src/tui/install-ui/ReviewPanel.d.ts.map +1 -1
  199. package/dist/src/tui/install-ui/ReviewPanel.js +2 -1
  200. package/dist/src/tui/install-ui/ReviewPanel.js.map +1 -1
  201. package/dist/src/tui/install-ui/StatuslineConfig.d.ts.map +1 -1
  202. package/dist/src/tui/install-ui/StatuslineConfig.js +3 -2
  203. package/dist/src/tui/install-ui/StatuslineConfig.js.map +1 -1
  204. package/dist/src/tui/install-ui/StepSelector.d.ts.map +1 -1
  205. package/dist/src/tui/install-ui/StepSelector.js +11 -10
  206. package/dist/src/tui/install-ui/StepSelector.js.map +1 -1
  207. package/dist/src/tui/overlay-ui/OverlayList.d.ts.map +1 -1
  208. package/dist/src/tui/overlay-ui/OverlayList.js +8 -12
  209. package/dist/src/tui/overlay-ui/OverlayList.js.map +1 -1
  210. package/dist/src/tui/shared/components.d.ts +56 -0
  211. package/dist/src/tui/shared/components.d.ts.map +1 -0
  212. package/dist/src/tui/shared/components.js +55 -0
  213. package/dist/src/tui/shared/components.js.map +1 -0
  214. package/dist/src/tui/shared/helpers.d.ts +24 -0
  215. package/dist/src/tui/shared/helpers.d.ts.map +1 -0
  216. package/dist/src/tui/shared/helpers.js +49 -0
  217. package/dist/src/tui/shared/helpers.js.map +1 -0
  218. package/dist/src/tui/shared/index.d.ts +4 -0
  219. package/dist/src/tui/shared/index.d.ts.map +1 -0
  220. package/dist/src/tui/shared/index.js +7 -0
  221. package/dist/src/tui/shared/index.js.map +1 -0
  222. package/dist/src/tui/shared/tokens.d.ts +79 -0
  223. package/dist/src/tui/shared/tokens.d.ts.map +1 -0
  224. package/dist/src/tui/shared/tokens.js +81 -0
  225. package/dist/src/tui/shared/tokens.js.map +1 -0
  226. package/dist/src/tui/tools-ui/CommandReference.d.ts.map +1 -1
  227. package/dist/src/tui/tools-ui/CommandReference.js +2 -4
  228. package/dist/src/tui/tools-ui/CommandReference.js.map +1 -1
  229. package/dist/src/tui/tools-ui/ConfigSources.d.ts.map +1 -1
  230. package/dist/src/tui/tools-ui/ConfigSources.js +3 -2
  231. package/dist/src/tui/tools-ui/ConfigSources.js.map +1 -1
  232. package/dist/src/tui/tools-ui/RegisterSettings.d.ts.map +1 -1
  233. package/dist/src/tui/tools-ui/RegisterSettings.js +2 -1
  234. package/dist/src/tui/tools-ui/RegisterSettings.js.map +1 -1
  235. package/dist/src/tui/tools-ui/RoleMappings.d.ts.map +1 -1
  236. package/dist/src/tui/tools-ui/RoleMappings.js +3 -5
  237. package/dist/src/tui/tools-ui/RoleMappings.js.map +1 -1
  238. package/dist/src/tui/tools-ui/ToolsDashboard.d.ts.map +1 -1
  239. package/dist/src/tui/tools-ui/ToolsDashboard.js +3 -5
  240. package/dist/src/tui/tools-ui/ToolsDashboard.js.map +1 -1
  241. package/dist/src/tui/tools-ui/ToolsOverview.d.ts.map +1 -1
  242. package/dist/src/tui/tools-ui/ToolsOverview.js +3 -5
  243. package/dist/src/tui/tools-ui/ToolsOverview.js.map +1 -1
  244. package/dist/src/tui/uninstall-ui/UninstallFlow.d.ts.map +1 -1
  245. package/dist/src/tui/uninstall-ui/UninstallFlow.js +8 -7
  246. package/dist/src/tui/uninstall-ui/UninstallFlow.js.map +1 -1
  247. package/dist/src/types/index.d.ts +48 -6
  248. package/dist/src/types/index.d.ts.map +1 -1
  249. package/package.json +1 -1
  250. package/workflows/knowhow.md +15 -1
  251. package/workflows/specs-add.md +12 -4
  252. package/dashboard/dist/assets/ChatPage-BjBibfE4.js +0 -22
  253. package/dashboard/dist/assets/CollabPage-8lUMUol_.js +0 -1
  254. package/dashboard/dist/assets/KanbanPage-diY3QmGd.js +0 -21
  255. package/dashboard/dist/assets/McpPage-COjuIf7U.js +0 -21
  256. package/dashboard/dist/assets/SpecsPage-BOwBin_o.js +0 -36
  257. package/dashboard/dist/assets/SupervisorPage-5iRyMU5T.js +0 -6
  258. package/dashboard/dist/assets/WorkflowPage-CmQaRVgL.js +0 -6
  259. package/dashboard/dist/assets/en-C_BD3UCD.js +0 -1
  260. package/dashboard/dist/assets/index-BEUaOz_b.css +0 -1
  261. package/dashboard/dist/assets/index-uIqUCT8y.js +0 -236
  262. package/dashboard/dist/assets/table-DCzuJAFh.js +0 -6
  263. package/dashboard/dist/assets/zh-CN-DvQKfow3.js +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/config/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAqBpE,wBAAgB,UAAU,IAAI,aAAa,CAM1C;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAGtD;AAkBD,wBAAgB,eAAe,IAAI,WAAW,CA6C7C"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/config/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAqB9G,wBAAgB,UAAU,IAAI,aAAa,CAM1C;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAGtD;AAMD,wBAAgB,uBAAuB,CAAC,WAAW,EAAE,MAAM,GAAG,mBAAmB,CAShF;AAED,wBAAgB,uBAAuB,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,mBAAmB,GAAG,IAAI,CAU9F;AAMD,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,mBAAmB,CAG5E;AAED,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,mBAAmB,GAAG,IAAI,CAI1F;AAsBD,wBAAgB,eAAe,IAAI,WAAW,CA6C7C"}
@@ -30,6 +30,48 @@ export function saveConfig(config) {
30
30
  paths.ensure(paths.home);
31
31
  writeFileSync(paths.config, JSON.stringify(config, null, 2));
32
32
  }
33
+ // ---------------------------------------------------------------------------
34
+ // Spec Injection Config — project-level (.workflow/config.json)
35
+ // ---------------------------------------------------------------------------
36
+ export function loadSpecInjectionConfig(projectPath) {
37
+ const configPath = join(projectPath, '.workflow', 'config.json');
38
+ if (!existsSync(configPath))
39
+ return {};
40
+ try {
41
+ const raw = JSON.parse(readFileSync(configPath, 'utf-8'));
42
+ return raw.specInjection ?? {};
43
+ }
44
+ catch {
45
+ return {};
46
+ }
47
+ }
48
+ export function saveSpecInjectionConfig(projectPath, config) {
49
+ const configPath = join(projectPath, '.workflow', 'config.json');
50
+ let existing = {};
51
+ try {
52
+ existing = JSON.parse(readFileSync(configPath, 'utf-8'));
53
+ }
54
+ catch {
55
+ // Start fresh
56
+ }
57
+ existing['specInjection'] = config;
58
+ writeFileSync(configPath, JSON.stringify(existing, null, 2), 'utf-8');
59
+ }
60
+ // ---------------------------------------------------------------------------
61
+ // Spec Analytics Config — nested under specInjection.analytics
62
+ // ---------------------------------------------------------------------------
63
+ export function loadAnalyticsConfig(projectPath) {
64
+ const injConfig = loadSpecInjectionConfig(projectPath);
65
+ return injConfig.analytics ?? { enabled: true };
66
+ }
67
+ export function saveAnalyticsConfig(projectPath, config) {
68
+ const injConfig = loadSpecInjectionConfig(projectPath);
69
+ injConfig.analytics = config;
70
+ saveSpecInjectionConfig(projectPath, injConfig);
71
+ }
72
+ // ---------------------------------------------------------------------------
73
+ // Hooks Config
74
+ // ---------------------------------------------------------------------------
33
75
  const DEFAULT_HOOKS = {
34
76
  toggles: {},
35
77
  external: [],
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/config/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/config/index.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"keyword-spec-injector.d.ts","sourceRoot":"","sources":["../../../src/hooks/keyword-spec-injector.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AASH,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AA+BD;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,GAChB,sBAAsB,CAqCxB"}
1
+ {"version":3,"file":"keyword-spec-injector.d.ts","sourceRoot":"","sources":["../../../src/hooks/keyword-spec-injector.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAUH,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AA2CD;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,GAChB,sBAAsB,CAoGxB"}
@@ -6,11 +6,13 @@
6
6
  */
7
7
  import { buildKeywordIndex, lookupKeywords } from '../tools/spec-keyword-index.js';
8
8
  import { markInjected, filterUnjected } from './spec-bridge.js';
9
+ import { logInjectionEvent } from './spec-analytics.js';
9
10
  // ============================================================================
10
11
  // Config
11
12
  // ============================================================================
12
13
  const MIN_KEYWORD_LENGTH = 3;
13
- /** Common words to skip when tokenizing prompt */
14
+ const MIN_CJK_KEYWORD_LENGTH = 2;
15
+ /** Common English words to skip when tokenizing prompt */
14
16
  const STOP_WORDS = new Set([
15
17
  'the', 'and', 'for', 'are', 'but', 'not', 'you', 'all', 'can', 'had',
16
18
  'her', 'was', 'one', 'our', 'out', 'has', 'his', 'how', 'its', 'may',
@@ -25,6 +27,16 @@ const STOP_WORDS = new Set([
25
27
  'file', 'code', 'function', 'class', 'import', 'export', 'const', 'return',
26
28
  'true', 'false', 'null', 'undefined', 'string', 'number', 'type', 'interface',
27
29
  ]);
30
+ /** Common Chinese functional words to skip */
31
+ const CJK_STOP_WORDS = new Set([
32
+ '可以', '这个', '那个', '什么', '怎么', '如何', '为什么',
33
+ '已经', '还是', '或者', '但是', '因为', '所以', '如果',
34
+ '虽然', '然后', '就是', '不是', '没有', '可能', '应该',
35
+ '需要', '使用', '进行', '通过', '以及', '一个', '我们',
36
+ '他们', '这些', '那些', '所有', '其他', '目前', '现在',
37
+ '之后', '之前', '关于', '对于', '还有', '为了', '只是',
38
+ '这样', '那样', '一下', '一些', '看看', '帮我', '请问',
39
+ ]);
28
40
  /** Max entries to inject per prompt to avoid context bloat */
29
41
  const MAX_ENTRIES_PER_INJECTION = 5;
30
42
  // ============================================================================
@@ -40,20 +52,65 @@ const MAX_ENTRIES_PER_INJECTION = 5;
40
52
  export function evaluateKeywordInjection(prompt, projectPath, sessionId) {
41
53
  // 1. Tokenize prompt into candidate keywords
42
54
  const promptKeywords = tokenizePrompt(prompt);
43
- if (promptKeywords.length === 0)
55
+ if (promptKeywords.length === 0) {
56
+ logInjectionEvent(projectPath, {
57
+ source: 'keyword-spec-injector',
58
+ promptSnippet: prompt.slice(0, 300),
59
+ categories: [],
60
+ specCount: 0,
61
+ contentLength: 0,
62
+ inject: false,
63
+ reason: 'no-prompt-keywords',
64
+ totalPromptKeywords: 0,
65
+ });
44
66
  return { inject: false };
67
+ }
45
68
  // 2. Build keyword index from spec files
46
69
  const index = buildKeywordIndex(projectPath);
47
- if (index.size === 0)
70
+ if (index.size === 0) {
71
+ logInjectionEvent(projectPath, {
72
+ source: 'keyword-spec-injector',
73
+ promptSnippet: prompt.slice(0, 300),
74
+ categories: [],
75
+ specCount: 0,
76
+ contentLength: 0,
77
+ inject: false,
78
+ reason: 'empty-keyword-index',
79
+ totalPromptKeywords: promptKeywords.length,
80
+ });
48
81
  return { inject: false };
82
+ }
49
83
  // 3. Look up matching entries
50
84
  const matchedAll = lookupKeywords(index, promptKeywords);
51
- if (matchedAll.length === 0)
85
+ if (matchedAll.length === 0) {
86
+ logInjectionEvent(projectPath, {
87
+ source: 'keyword-spec-injector',
88
+ promptSnippet: prompt.slice(0, 300),
89
+ categories: [],
90
+ specCount: 0,
91
+ contentLength: 0,
92
+ inject: false,
93
+ reason: 'no-keyword-match',
94
+ totalPromptKeywords: promptKeywords.length,
95
+ });
52
96
  return { inject: false };
97
+ }
53
98
  // 4. Filter out already-injected entries (session dedup)
54
99
  const unjected = filterUnjected(sessionId, matchedAll);
55
- if (unjected.length === 0)
100
+ if (unjected.length === 0) {
101
+ logInjectionEvent(projectPath, {
102
+ source: 'keyword-spec-injector',
103
+ promptSnippet: prompt.slice(0, 300),
104
+ categories: [],
105
+ specCount: 0,
106
+ contentLength: 0,
107
+ inject: false,
108
+ reason: 'all-deduped',
109
+ totalPromptKeywords: promptKeywords.length,
110
+ dedupFilteredCount: matchedAll.length,
111
+ });
56
112
  return { inject: false };
113
+ }
57
114
  // 5. Limit to avoid context bloat
58
115
  const toInject = unjected.slice(0, MAX_ENTRIES_PER_INJECTION);
59
116
  // 6. Build injection content
@@ -64,6 +121,19 @@ export function evaluateKeywordInjection(prompt, projectPath, sessionId) {
64
121
  markInjected(sessionId, injectedKeywords, injectedIds);
65
122
  // 8. Determine which prompt keywords actually matched
66
123
  const matchedKws = promptKeywords.filter(kw => index.has(kw));
124
+ logInjectionEvent(projectPath, {
125
+ source: 'keyword-spec-injector',
126
+ promptSnippet: prompt.slice(0, 300),
127
+ categories: [],
128
+ specCount: toInject.length,
129
+ contentLength: content.length,
130
+ inject: true,
131
+ matchedKeywords: matchedKws,
132
+ matchedEntryIds: injectedIds,
133
+ matchedEntries: toInject.length,
134
+ totalPromptKeywords: promptKeywords.length,
135
+ dedupFilteredCount: matchedAll.length - unjected.length,
136
+ });
67
137
  return {
68
138
  inject: true,
69
139
  content,
@@ -76,15 +146,41 @@ export function evaluateKeywordInjection(prompt, projectPath, sessionId) {
76
146
  // ============================================================================
77
147
  /**
78
148
  * Tokenize prompt into candidate keywords for index lookup.
79
- * Lowercase, deduplicate, filter by length and stop words.
149
+ * Handles both English (space-split) and CJK (n-gram extraction).
80
150
  */
81
151
  function tokenizePrompt(prompt) {
82
- const words = prompt
83
- .toLowerCase()
84
- .replace(/[^a-z0-9\u4e00-\u9fff_-]/g, ' ')
152
+ const text = prompt.toLowerCase();
153
+ // English tokens: split by non-alphanumeric, filter by length and stop words
154
+ const englishWords = text
155
+ .replace(/[^a-z0-9_-]/g, ' ')
85
156
  .split(/\s+/)
86
157
  .filter(w => w.length >= MIN_KEYWORD_LENGTH && !STOP_WORDS.has(w));
87
- return [...new Set(words)];
158
+ // CJK tokens: extract n-grams (2-4 chars) from contiguous CJK sequences
159
+ const cjkTokens = extractCjkTokens(prompt)
160
+ .filter(w => !CJK_STOP_WORDS.has(w));
161
+ return [...new Set([...englishWords, ...cjkTokens])];
162
+ }
163
+ /**
164
+ * Extract keyword tokens from CJK text using n-gram segmentation.
165
+ * Generates 2-4 character n-grams from contiguous CJK sequences.
166
+ */
167
+ function extractCjkTokens(text) {
168
+ const tokens = [];
169
+ // Match contiguous CJK character runs (min 2 chars)
170
+ const cjkSeqs = text.match(/[\u4e00-\u9fff\u3400-\u4dbf]{2,}/g) ?? [];
171
+ for (const seq of cjkSeqs) {
172
+ // Full sequence if reasonable length (common phrase)
173
+ if (seq.length >= MIN_CJK_KEYWORD_LENGTH && seq.length <= 6) {
174
+ tokens.push(seq);
175
+ }
176
+ // Generate 2-gram, 3-gram, 4-gram
177
+ for (let n = 2; n <= Math.min(4, seq.length); n++) {
178
+ for (let i = 0; i <= seq.length - n; i++) {
179
+ tokens.push(seq.substring(i, i + n));
180
+ }
181
+ }
182
+ }
183
+ return tokens;
88
184
  }
89
185
  /**
90
186
  * Format matched entries for injection as context.
@@ -1 +1 @@
1
- {"version":3,"file":"keyword-spec-injector.js","sourceRoot":"","sources":["../../../src/hooks/keyword-spec-injector.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"keyword-spec-injector.js","sourceRoot":"","sources":["../../../src/hooks/keyword-spec-injector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { MaestroPlugin } from '../../types/index.js';
2
+ import type { WorkflowHookRegistry } from '../workflow-hooks.js';
3
+ /**
4
+ * Plugin that taps into all 9 workflow hooks to record invocations.
5
+ * Captures hook name, node context, timing, and outcome.
6
+ */
7
+ export declare class SpecAnalyticsPlugin implements MaestroPlugin {
8
+ private readonly projectPath;
9
+ readonly name = "specAnalytics";
10
+ constructor(projectPath?: string);
11
+ apply(registry: WorkflowHookRegistry): void;
12
+ }
13
+ //# sourceMappingURL=spec-analytics-plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spec-analytics-plugin.d.ts","sourceRoot":"","sources":["../../../../src/hooks/plugins/spec-analytics-plugin.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAGjE;;;GAGG;AACH,qBAAa,mBAAoB,YAAW,aAAa;IAG3C,OAAO,CAAC,QAAQ,CAAC,WAAW;IAFxC,QAAQ,CAAC,IAAI,mBAAmB;gBAEH,WAAW,GAAE,MAAsB;IAEhE,KAAK,CAAC,QAAQ,EAAE,oBAAoB,GAAG,IAAI;CAqF5C"}
@@ -0,0 +1,92 @@
1
+ // ---------------------------------------------------------------------------
2
+ // SpecAnalyticsPlugin — Tracks all workflow hook invocations
3
+ // ---------------------------------------------------------------------------
4
+ import { logHookInvocation } from '../spec-analytics.js';
5
+ /**
6
+ * Plugin that taps into all 9 workflow hooks to record invocations.
7
+ * Captures hook name, node context, timing, and outcome.
8
+ */
9
+ export class SpecAnalyticsPlugin {
10
+ projectPath;
11
+ name = 'specAnalytics';
12
+ constructor(projectPath = process.cwd()) {
13
+ this.projectPath = projectPath;
14
+ }
15
+ apply(registry) {
16
+ const pp = this.projectPath;
17
+ registry.beforeRun.tap(this.name, (ctx) => {
18
+ logHookInvocation(pp, {
19
+ hookName: 'beforeRun',
20
+ pluginName: this.name,
21
+ data: { sessionId: ctx.sessionId, graphId: ctx.graphId, intent: ctx.intent },
22
+ });
23
+ return undefined; // Don't bail
24
+ });
25
+ registry.afterRun.tap(this.name, (ctx, state) => {
26
+ logHookInvocation(pp, {
27
+ hookName: 'afterRun',
28
+ pluginName: this.name,
29
+ data: { sessionId: ctx.sessionId, status: state.status },
30
+ });
31
+ });
32
+ registry.beforeNode.tap(this.name, (ctx) => {
33
+ logHookInvocation(pp, {
34
+ hookName: 'beforeNode',
35
+ pluginName: this.name,
36
+ nodeId: ctx.nodeId,
37
+ data: { nodeType: ctx.node.type },
38
+ });
39
+ return undefined; // Don't bail
40
+ });
41
+ registry.afterNode.tap(this.name, (ctx, outcome) => {
42
+ logHookInvocation(pp, {
43
+ hookName: 'afterNode',
44
+ pluginName: this.name,
45
+ nodeId: ctx.nodeId,
46
+ outcome,
47
+ });
48
+ });
49
+ registry.beforeCommand.tap(this.name, (ctx) => {
50
+ logHookInvocation(pp, {
51
+ hookName: 'beforeCommand',
52
+ pluginName: this.name,
53
+ nodeId: ctx.nodeId,
54
+ data: { cmd: ctx.cmd },
55
+ });
56
+ return undefined; // Don't bail
57
+ });
58
+ registry.afterCommand.tap(this.name, (ctx) => {
59
+ logHookInvocation(pp, {
60
+ hookName: 'afterCommand',
61
+ pluginName: this.name,
62
+ nodeId: ctx.nodeId,
63
+ data: { cmd: ctx.cmd, success: ctx.result.success },
64
+ });
65
+ });
66
+ registry.onError.tap(this.name, (ctx) => {
67
+ logHookInvocation(pp, {
68
+ hookName: 'onError',
69
+ pluginName: this.name,
70
+ nodeId: ctx.nodeId ?? undefined,
71
+ data: { message: ctx.error.message },
72
+ });
73
+ });
74
+ registry.transformPrompt.tap(this.name, (prompt) => {
75
+ logHookInvocation(pp, {
76
+ hookName: 'transformPrompt',
77
+ pluginName: this.name,
78
+ data: { promptLength: prompt.length },
79
+ });
80
+ return prompt; // Pass-through, observation only
81
+ });
82
+ registry.onDecision.tap(this.name, (ctx) => {
83
+ logHookInvocation(pp, {
84
+ hookName: 'onDecision',
85
+ pluginName: this.name,
86
+ nodeId: ctx.nodeId,
87
+ data: { target: ctx.target },
88
+ });
89
+ });
90
+ }
91
+ }
92
+ //# sourceMappingURL=spec-analytics-plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spec-analytics-plugin.js","sourceRoot":"","sources":["../../../../src/hooks/plugins/spec-analytics-plugin.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"spec-injection-plugin.d.ts","sourceRoot":"","sources":["../../../../src/hooks/plugins/spec-injection-plugin.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAKjE;;;;;;GAMG;AACH,qBAAa,mBAAoB,YAAW,aAAa;IAIrD,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,SAAS;IAJ5B,QAAQ,CAAC,IAAI,mBAAmB;gBAGb,WAAW,GAAE,MAAsB,EACnC,SAAS,GAAE,MAAW;IAGzC,KAAK,CAAC,QAAQ,EAAE,oBAAoB,GAAG,IAAI;CAuB5C"}
1
+ {"version":3,"file":"spec-injection-plugin.d.ts","sourceRoot":"","sources":["../../../../src/hooks/plugins/spec-injection-plugin.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAuB,MAAM,sBAAsB,CAAC;AAC/E,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAOjE;;;;;;GAMG;AACH,qBAAa,mBAAoB,YAAW,aAAa;IAIrD,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,SAAS;IAJ5B,QAAQ,CAAC,IAAI,mBAAmB;gBAGb,WAAW,GAAE,MAAsB,EACnC,SAAS,GAAE,MAAW;IAGzC,KAAK,CAAC,QAAQ,EAAE,oBAAoB,GAAG,IAAI;CAyE5C"}
@@ -1,9 +1,11 @@
1
1
  // ---------------------------------------------------------------------------
2
2
  // SpecInjectionPlugin — Injects project specs into coordinator prompts
3
3
  // ---------------------------------------------------------------------------
4
- import { loadSpecs } from '../../tools/spec-loader.js';
4
+ import { loadSpecs, loadExtraDocs } from '../../tools/spec-loader.js';
5
+ import { loadSpecInjectionConfig } from '../../config/index.js';
5
6
  import { resolveSelf } from '../../tools/team-members.js';
6
7
  import { evaluateKeywordInjection } from '../keyword-spec-injector.js';
8
+ import { logInjectionEvent } from '../spec-analytics.js';
7
9
  /**
8
10
  * In-process plugin for `maestro coordinate` — injects relevant specs
9
11
  * into the prompt via the `transformPrompt` waterfall hook.
@@ -22,13 +24,51 @@ export class SpecInjectionPlugin {
22
24
  apply(registry) {
23
25
  registry.transformPrompt.tap(this.name, (prompt) => {
24
26
  const parts = [prompt];
25
- // Category-based injection
27
+ const config = loadSpecInjectionConfig(this.projectPath);
28
+ // Category-based injection with keyword filters
26
29
  const category = inferCategory(prompt);
27
30
  const uid = resolveUidSafe();
28
- const catResult = loadSpecs(this.projectPath, category, uid);
31
+ const loaderOpts = {};
32
+ if (config.keywordFilters?.include?.length)
33
+ loaderOpts.includeKeywords = config.keywordFilters.include;
34
+ if (config.keywordFilters?.exclude?.length)
35
+ loaderOpts.excludeKeywords = config.keywordFilters.exclude;
36
+ const catDocConfig = config.categoryDocs?.[category];
37
+ if (catDocConfig?.specFiles?.length)
38
+ loaderOpts.extraSpecFiles = catDocConfig.specFiles;
39
+ const catResult = loadSpecs(this.projectPath, category, uid, undefined, undefined, loaderOpts);
29
40
  if (catResult.content) {
30
41
  parts.push(catResult.content);
31
42
  }
43
+ // Load category-level extra documents
44
+ if (catDocConfig?.docs?.length) {
45
+ const docsResult = loadExtraDocs(this.projectPath, catDocConfig.docs);
46
+ if (docsResult.content)
47
+ parts.push(docsResult.content);
48
+ }
49
+ // Always-inject (session start): docs, keyword-matched entries, categories
50
+ if (config.always) {
51
+ if (config.always.docs?.length) {
52
+ const alwaysResult = loadExtraDocs(this.projectPath, config.always.docs);
53
+ if (alwaysResult.content)
54
+ parts.push(alwaysResult.content);
55
+ }
56
+ if (config.always.keywords?.length) {
57
+ const kwOpts = { includeKeywords: config.always.keywords };
58
+ const kwResult = loadSpecs(this.projectPath, undefined, uid, undefined, undefined, kwOpts);
59
+ if (kwResult.content)
60
+ parts.push(kwResult.content);
61
+ }
62
+ if (config.always.categories?.length) {
63
+ for (const cat of config.always.categories) {
64
+ if (cat === category)
65
+ continue;
66
+ const catRes = loadSpecs(this.projectPath, cat, uid);
67
+ if (catRes.content)
68
+ parts.push(catRes.content);
69
+ }
70
+ }
71
+ }
32
72
  // Keyword-based injection (with session dedup)
33
73
  if (this.sessionId) {
34
74
  const kwResult = evaluateKeywordInjection(prompt, this.projectPath, this.sessionId);
@@ -36,7 +76,20 @@ export class SpecInjectionPlugin {
36
76
  parts.push(kwResult.content);
37
77
  }
38
78
  }
39
- return parts.length > 1 ? parts.join('\n\n---\n\n') : prompt;
79
+ const injected = parts.length > 1;
80
+ const injectedContent = injected ? parts.slice(1).join('\n\n---\n\n') : '';
81
+ const inferredCat = category;
82
+ logInjectionEvent(this.projectPath, {
83
+ source: 'spec-injection-plugin',
84
+ promptSnippet: prompt.slice(0, 300),
85
+ inferredCategory: inferredCat,
86
+ categories: injected ? [inferredCat] : [],
87
+ specCount: catResult.totalLoaded,
88
+ contentLength: injectedContent.length,
89
+ inject: injected,
90
+ reason: injected ? undefined : 'no-content',
91
+ }, config.analytics);
92
+ return injected ? parts.join('\n\n---\n\n') : prompt;
40
93
  });
41
94
  }
42
95
  }
@@ -1 +1 @@
1
- {"version":3,"file":"spec-injection-plugin.js","sourceRoot":"","sources":["../../../../src/hooks/plugins/spec-injection-plugin.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,uEAAuE;AACvE,8EAA8E;AAI9E,OAAO,EAAE,SAAS,EAAqB,MAAM,4BAA4B,CAAC;AAC1E,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AAEvE;;;;;;GAMG;AACH,MAAM,OAAO,mBAAmB;IAIX;IACA;IAJV,IAAI,GAAG,eAAe,CAAC;IAEhC,YACmB,cAAsB,OAAO,CAAC,GAAG,EAAE,EACnC,YAAoB,EAAE;QADtB,gBAAW,GAAX,WAAW,CAAwB;QACnC,cAAS,GAAT,SAAS,CAAa;IACtC,CAAC;IAEJ,KAAK,CAAC,QAA8B;QAClC,QAAQ,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAc,EAAE,EAAE;YACzD,MAAM,KAAK,GAAa,CAAC,MAAM,CAAC,CAAC;YAEjC,2BAA2B;YAC3B,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;YACvC,MAAM,GAAG,GAAG,cAAc,EAAE,CAAC;YAC7B,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;YAC7D,IAAI,SAAS,CAAC,OAAO,EAAE,CAAC;gBACtB,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;YAChC,CAAC;YAED,+CAA+C;YAC/C,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;gBACnB,MAAM,QAAQ,GAAG,wBAAwB,CAAC,MAAM,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;gBACpF,IAAI,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;oBACxC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;gBAC/B,CAAC;YACH,CAAC;YAED,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QAC/D,CAAC,CAAC,CAAC;IACL,CAAC;CACF;AAED;;;GAGG;AACH,SAAS,cAAc;IACrB,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,WAAW,EAAE,CAAC;QAC3B,OAAO,IAAI,EAAE,GAAG,IAAI,SAAS,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,aAAa,CAAC,MAAc;IACnC,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;IACnC,IAAI,4EAA4E,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,QAAQ,CAAC;IAC9G,IAAI,mEAAmE,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC;IACnG,IAAI,2DAA2D,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,OAAO,CAAC;IAC5F,IAAI,oEAAoE,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC;IACpG,IAAI,+HAA+H,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAC7J,OAAO,QAAQ,CAAC,CAAC,kCAAkC;AACrD,CAAC"}
1
+ {"version":3,"file":"spec-injection-plugin.js","sourceRoot":"","sources":["../../../../src/hooks/plugins/spec-injection-plugin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,128 @@
1
+ /**
2
+ * Spec Analytics — Injection logging and statistics
3
+ *
4
+ * Records every spec injection call (spec-injector, keyword-spec-injector,
5
+ * spec-injection-plugin) and CLI endpoint usage. Provides aggregated
6
+ * statistics for improvement analysis.
7
+ *
8
+ * Design:
9
+ * - Reuses jsonl-log.ts (appendLine, readAll, tailLast, rotateIfLarge)
10
+ * - Synchronous, never throws — safe for hot-path hooks
11
+ * - Config cached with 30s TTL to avoid repeated file reads
12
+ * - Auto-rotation at configurable max file size
13
+ */
14
+ import type { SpecAnalyticsConfig } from '../types/index.js';
15
+ export type InjectionSource = 'spec-injector' | 'keyword-spec-injector' | 'spec-injection-plugin';
16
+ export interface SpecInjectionLogEntry {
17
+ id: string;
18
+ timestamp: string;
19
+ source: InjectionSource;
20
+ agentType?: string;
21
+ promptSnippet?: string;
22
+ categories: string[];
23
+ specCount: number;
24
+ budgetAction?: string;
25
+ contentLength: number;
26
+ inject: boolean;
27
+ reason?: string;
28
+ matchedKeywords?: string[];
29
+ matchedEntryIds?: string[];
30
+ matchedEntries?: number;
31
+ totalPromptKeywords?: number;
32
+ dedupFilteredCount?: number;
33
+ inferredCategory?: string;
34
+ }
35
+ export interface CliEndpointLogEntry {
36
+ id: string;
37
+ timestamp: string;
38
+ command: string;
39
+ args: Record<string, unknown>;
40
+ }
41
+ export interface HookInvocationLogEntry {
42
+ id: string;
43
+ timestamp: string;
44
+ hookName: string;
45
+ pluginName?: string;
46
+ nodeId?: string;
47
+ durationMs?: number;
48
+ outcome?: string;
49
+ data?: Record<string, unknown>;
50
+ }
51
+ export type AnalyticsLogEntry = ({
52
+ type: 'injection';
53
+ } & SpecInjectionLogEntry) | ({
54
+ type: 'cli';
55
+ } & CliEndpointLogEntry) | ({
56
+ type: 'hook';
57
+ } & HookInvocationLogEntry);
58
+ export interface SpecAnalyticsSummary {
59
+ totalInjections: number;
60
+ successfulInjections: number;
61
+ failedInjections: number;
62
+ hitRate: number;
63
+ bySource: Record<string, {
64
+ total: number;
65
+ injected: number;
66
+ }>;
67
+ byAgentType: Record<string, {
68
+ total: number;
69
+ injected: number;
70
+ }>;
71
+ byCategory: Record<string, number>;
72
+ byBudgetAction: Record<string, number>;
73
+ keywordStats: {
74
+ totalMatches: number;
75
+ topKeywords: Array<{
76
+ keyword: string;
77
+ count: number;
78
+ }>;
79
+ avgMatchedPerPrompt: number;
80
+ dedupFilteredTotal: number;
81
+ };
82
+ cliStats: Record<string, number>;
83
+ hookStats: {
84
+ totalInvocations: number;
85
+ byHook: Record<string, number>;
86
+ byPlugin: Record<string, number>;
87
+ avgDurationMs: number;
88
+ };
89
+ timeRange: {
90
+ earliest: string;
91
+ latest: string;
92
+ };
93
+ totalEntries: number;
94
+ logFileSize: number;
95
+ }
96
+ /**
97
+ * Log a spec injection event. Synchronous, never throws.
98
+ */
99
+ export declare function logInjectionEvent(projectPath: string, entry: Omit<SpecInjectionLogEntry, 'id' | 'timestamp'>, config?: SpecAnalyticsConfig): void;
100
+ /**
101
+ * Log a CLI endpoint call. Synchronous, never throws.
102
+ */
103
+ export declare function logCliEndpoint(projectPath: string, command: string, args: Record<string, unknown>, config?: SpecAnalyticsConfig): void;
104
+ /**
105
+ * Log a workflow hook invocation. Synchronous, never throws.
106
+ */
107
+ export declare function logHookInvocation(projectPath: string, entry: Omit<HookInvocationLogEntry, 'id' | 'timestamp'>, config?: SpecAnalyticsConfig): void;
108
+ /**
109
+ * Read all analytics entries.
110
+ */
111
+ export declare function readAnalytics(projectPath: string, config?: SpecAnalyticsConfig): AnalyticsLogEntry[];
112
+ /**
113
+ * Read last N analytics entries (efficient tail).
114
+ */
115
+ export declare function readRecentAnalytics(projectPath: string, n: number, config?: SpecAnalyticsConfig): AnalyticsLogEntry[];
116
+ /**
117
+ * Get log file size in bytes. Returns 0 if file doesn't exist.
118
+ */
119
+ export declare function getLogFileSize(projectPath: string, config?: SpecAnalyticsConfig): number;
120
+ /**
121
+ * Clear analytics log by rotating it to archive.
122
+ */
123
+ export declare function clearAnalyticsLog(projectPath: string, config?: SpecAnalyticsConfig): string | null;
124
+ /**
125
+ * Compute aggregated statistics from log entries. Pure function, no IO.
126
+ */
127
+ export declare function computeStats(entries: AnalyticsLogEntry[], logFileSize?: number): SpecAnalyticsSummary;
128
+ //# sourceMappingURL=spec-analytics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spec-analytics.d.ts","sourceRoot":"","sources":["../../../src/hooks/spec-analytics.ts"],"names":[],"mappings":"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"}