claude-flow 3.25.6 → 3.26.1

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 (309) hide show
  1. package/.claude/helpers/hook-handler.cjs +129 -0
  2. package/.claude/helpers/intelligence.cjs +10 -0
  3. package/.claude/helpers/statusline.cjs +310 -123
  4. package/.claude/proven-config.json +1 -1
  5. package/.claude/security-scans/scan-all-standard.json +321 -0
  6. package/.claude/security-scans/scan-code-deep.json +1209 -0
  7. package/.claude/security-scans/scan-deps-full.json +14 -0
  8. package/package.json +3 -1
  9. package/v3/@claude-flow/cli/catalog-manifest.json +12 -0
  10. package/v3/@claude-flow/cli/dist/src/commands/advisor.d.ts +15 -0
  11. package/v3/@claude-flow/cli/dist/src/commands/advisor.js +94 -0
  12. package/v3/@claude-flow/cli/dist/src/commands/doctor.js +77 -3
  13. package/v3/@claude-flow/cli/dist/src/commands/funnel.d.ts +13 -0
  14. package/v3/@claude-flow/cli/dist/src/commands/funnel.js +103 -0
  15. package/v3/@claude-flow/cli/dist/src/commands/hooks.js +112 -46
  16. package/v3/@claude-flow/cli/dist/src/commands/index.js +10 -0
  17. package/v3/@claude-flow/cli/dist/src/commands/init.js +44 -0
  18. package/v3/@claude-flow/cli/dist/src/commands/proxy.d.ts +21 -0
  19. package/v3/@claude-flow/cli/dist/src/commands/proxy.js +310 -0
  20. package/v3/@claude-flow/cli/dist/src/commands/security.js +29 -0
  21. package/v3/@claude-flow/cli/dist/src/commands/settings.d.ts +19 -0
  22. package/v3/@claude-flow/cli/dist/src/commands/settings.js +180 -0
  23. package/v3/@claude-flow/cli/dist/src/commands/version.d.ts +42 -0
  24. package/v3/@claude-flow/cli/dist/src/commands/version.js +106 -0
  25. package/v3/@claude-flow/cli/dist/src/funnel/advisor-tip.d.ts +58 -0
  26. package/v3/@claude-flow/cli/dist/src/funnel/advisor-tip.js +92 -0
  27. package/v3/@claude-flow/cli/dist/src/funnel/attribution.d.ts +37 -0
  28. package/v3/@claude-flow/cli/dist/src/funnel/attribution.js +101 -0
  29. package/v3/@claude-flow/cli/dist/src/funnel/consent.d.ts +22 -0
  30. package/v3/@claude-flow/cli/dist/src/funnel/consent.js +55 -0
  31. package/v3/@claude-flow/cli/dist/src/funnel/credit-errors.d.ts +31 -0
  32. package/v3/@claude-flow/cli/dist/src/funnel/credit-errors.js +88 -0
  33. package/v3/@claude-flow/cli/dist/src/funnel/credit-notifier.d.ts +44 -0
  34. package/v3/@claude-flow/cli/dist/src/funnel/credit-notifier.js +74 -0
  35. package/v3/@claude-flow/cli/dist/src/funnel/disclosure.d.ts +46 -0
  36. package/v3/@claude-flow/cli/dist/src/funnel/disclosure.js +97 -0
  37. package/v3/@claude-flow/cli/dist/src/funnel/enrollment.d.ts +36 -0
  38. package/v3/@claude-flow/cli/dist/src/funnel/enrollment.js +64 -0
  39. package/v3/@claude-flow/cli/dist/src/funnel/environment.d.ts +17 -0
  40. package/v3/@claude-flow/cli/dist/src/funnel/environment.js +39 -0
  41. package/v3/@claude-flow/cli/dist/src/funnel/event-transport.d.ts +51 -0
  42. package/v3/@claude-flow/cli/dist/src/funnel/event-transport.js +199 -0
  43. package/v3/@claude-flow/cli/dist/src/funnel/events.d.ts +42 -0
  44. package/v3/@claude-flow/cli/dist/src/funnel/events.js +150 -0
  45. package/v3/@claude-flow/cli/dist/src/funnel/index.d.ts +20 -0
  46. package/v3/@claude-flow/cli/dist/src/funnel/index.js +20 -0
  47. package/v3/@claude-flow/cli/dist/src/funnel/insights.d.ts +49 -0
  48. package/v3/@claude-flow/cli/dist/src/funnel/insights.js +120 -0
  49. package/v3/@claude-flow/cli/dist/src/funnel/local-signals.d.ts +15 -0
  50. package/v3/@claude-flow/cli/dist/src/funnel/local-signals.js +68 -0
  51. package/v3/@claude-flow/cli/dist/src/funnel/message-transport.d.ts +51 -0
  52. package/v3/@claude-flow/cli/dist/src/funnel/message-transport.js +149 -0
  53. package/v3/@claude-flow/cli/dist/src/funnel/messages.d.ts +55 -0
  54. package/v3/@claude-flow/cli/dist/src/funnel/messages.js +160 -0
  55. package/v3/@claude-flow/cli/dist/src/funnel/power-saver-notifier.d.ts +44 -0
  56. package/v3/@claude-flow/cli/dist/src/funnel/power-saver-notifier.js +92 -0
  57. package/v3/@claude-flow/cli/dist/src/funnel/precedence.d.ts +16 -0
  58. package/v3/@claude-flow/cli/dist/src/funnel/precedence.js +85 -0
  59. package/v3/@claude-flow/cli/dist/src/funnel/promo.d.ts +41 -0
  60. package/v3/@claude-flow/cli/dist/src/funnel/promo.js +144 -0
  61. package/v3/@claude-flow/cli/dist/src/funnel/rate-limit-notifier.d.ts +55 -0
  62. package/v3/@claude-flow/cli/dist/src/funnel/rate-limit-notifier.js +102 -0
  63. package/v3/@claude-flow/cli/dist/src/funnel/rotation.d.ts +19 -0
  64. package/v3/@claude-flow/cli/dist/src/funnel/rotation.js +70 -0
  65. package/v3/@claude-flow/cli/dist/src/funnel/state.d.ts +13 -0
  66. package/v3/@claude-flow/cli/dist/src/funnel/state.js +52 -0
  67. package/v3/@claude-flow/cli/dist/src/funnel/toggle-cooldown.d.ts +17 -0
  68. package/v3/@claude-flow/cli/dist/src/funnel/toggle-cooldown.js +32 -0
  69. package/v3/@claude-flow/cli/dist/src/funnel/types.d.ts +86 -0
  70. package/v3/@claude-flow/cli/dist/src/funnel/types.js +26 -0
  71. package/v3/@claude-flow/cli/dist/src/init/executor.js +9 -3
  72. package/v3/@claude-flow/cli/dist/src/init/helper-refresh.d.ts +33 -2
  73. package/v3/@claude-flow/cli/dist/src/init/helper-refresh.js +102 -12
  74. package/v3/@claude-flow/cli/dist/src/init/helpers-generator.js +52 -0
  75. package/v3/@claude-flow/cli/dist/src/init/statusline-generator.js +292 -116
  76. package/v3/@claude-flow/cli/dist/src/services/daemon-autostart.js +28 -5
  77. package/v3/@claude-flow/cli/dist/src/services/fable-harness.d.ts +39 -0
  78. package/v3/@claude-flow/cli/dist/src/services/fable-harness.js +41 -0
  79. package/v3/@claude-flow/cli/package.json +13 -4
  80. package/.claude/coordinator/config.json +0 -24
  81. package/.claude/coordinator/state.json +0 -37
  82. package/.claude/coordinator/tick-log/tick-01.json +0 -17
  83. package/.claude/coordinator/tick-log/tick-02.json +0 -17
  84. package/.claude/coordinator/tick-log/tick-03.json +0 -17
  85. package/.claude/coordinator/tick-log/tick-04.json +0 -14
  86. package/.claude/coordinator/tick-log/tick-05.json +0 -16
  87. package/.claude/settings.local.json +0 -11
  88. package/v3/@claude-flow/cli/dist/src/ruvector/lattice-wasm.d.ts +0 -14
  89. package/v3/@claude-flow/cli/dist/src/ruvector/lattice-wasm.js +0 -144
  90. package/v3/@claude-flow/guidance/dist/adversarial.d.ts +0 -284
  91. package/v3/@claude-flow/guidance/dist/adversarial.js +0 -572
  92. package/v3/@claude-flow/guidance/dist/analyzer.d.ts +0 -530
  93. package/v3/@claude-flow/guidance/dist/analyzer.js +0 -2587
  94. package/v3/@claude-flow/guidance/dist/artifacts.d.ts +0 -283
  95. package/v3/@claude-flow/guidance/dist/artifacts.js +0 -356
  96. package/v3/@claude-flow/guidance/dist/authority.d.ts +0 -290
  97. package/v3/@claude-flow/guidance/dist/authority.js +0 -558
  98. package/v3/@claude-flow/guidance/dist/capabilities.d.ts +0 -209
  99. package/v3/@claude-flow/guidance/dist/capabilities.js +0 -485
  100. package/v3/@claude-flow/guidance/dist/coherence.d.ts +0 -233
  101. package/v3/@claude-flow/guidance/dist/coherence.js +0 -372
  102. package/v3/@claude-flow/guidance/dist/compiler.d.ts +0 -87
  103. package/v3/@claude-flow/guidance/dist/compiler.js +0 -410
  104. package/v3/@claude-flow/guidance/dist/conformance-kit.d.ts +0 -225
  105. package/v3/@claude-flow/guidance/dist/conformance-kit.js +0 -629
  106. package/v3/@claude-flow/guidance/dist/continue-gate.d.ts +0 -214
  107. package/v3/@claude-flow/guidance/dist/continue-gate.js +0 -353
  108. package/v3/@claude-flow/guidance/dist/crypto-utils.d.ts +0 -17
  109. package/v3/@claude-flow/guidance/dist/crypto-utils.js +0 -24
  110. package/v3/@claude-flow/guidance/dist/evolution.d.ts +0 -282
  111. package/v3/@claude-flow/guidance/dist/evolution.js +0 -500
  112. package/v3/@claude-flow/guidance/dist/gates.d.ts +0 -79
  113. package/v3/@claude-flow/guidance/dist/gates.js +0 -302
  114. package/v3/@claude-flow/guidance/dist/gateway.d.ts +0 -206
  115. package/v3/@claude-flow/guidance/dist/gateway.js +0 -452
  116. package/v3/@claude-flow/guidance/dist/generators.d.ts +0 -153
  117. package/v3/@claude-flow/guidance/dist/generators.js +0 -682
  118. package/v3/@claude-flow/guidance/dist/headless.d.ts +0 -177
  119. package/v3/@claude-flow/guidance/dist/headless.js +0 -342
  120. package/v3/@claude-flow/guidance/dist/hooks.d.ts +0 -109
  121. package/v3/@claude-flow/guidance/dist/hooks.js +0 -347
  122. package/v3/@claude-flow/guidance/dist/index.d.ts +0 -205
  123. package/v3/@claude-flow/guidance/dist/index.js +0 -321
  124. package/v3/@claude-flow/guidance/dist/ledger.d.ts +0 -162
  125. package/v3/@claude-flow/guidance/dist/ledger.js +0 -375
  126. package/v3/@claude-flow/guidance/dist/manifest-validator.d.ts +0 -289
  127. package/v3/@claude-flow/guidance/dist/manifest-validator.js +0 -838
  128. package/v3/@claude-flow/guidance/dist/memory-gate.d.ts +0 -222
  129. package/v3/@claude-flow/guidance/dist/memory-gate.js +0 -382
  130. package/v3/@claude-flow/guidance/dist/meta-governance.d.ts +0 -265
  131. package/v3/@claude-flow/guidance/dist/meta-governance.js +0 -348
  132. package/v3/@claude-flow/guidance/dist/optimizer.d.ts +0 -104
  133. package/v3/@claude-flow/guidance/dist/optimizer.js +0 -329
  134. package/v3/@claude-flow/guidance/dist/persistence.d.ts +0 -189
  135. package/v3/@claude-flow/guidance/dist/persistence.js +0 -464
  136. package/v3/@claude-flow/guidance/dist/proof.d.ts +0 -185
  137. package/v3/@claude-flow/guidance/dist/proof.js +0 -238
  138. package/v3/@claude-flow/guidance/dist/retriever.d.ts +0 -172
  139. package/v3/@claude-flow/guidance/dist/retriever.js +0 -596
  140. package/v3/@claude-flow/guidance/dist/ruvbot-integration.d.ts +0 -370
  141. package/v3/@claude-flow/guidance/dist/ruvbot-integration.js +0 -738
  142. package/v3/@claude-flow/guidance/dist/temporal.d.ts +0 -426
  143. package/v3/@claude-flow/guidance/dist/temporal.js +0 -658
  144. package/v3/@claude-flow/guidance/dist/trust.d.ts +0 -283
  145. package/v3/@claude-flow/guidance/dist/trust.js +0 -473
  146. package/v3/@claude-flow/guidance/dist/truth-anchors.d.ts +0 -276
  147. package/v3/@claude-flow/guidance/dist/truth-anchors.js +0 -488
  148. package/v3/@claude-flow/guidance/dist/types.d.ts +0 -378
  149. package/v3/@claude-flow/guidance/dist/types.js +0 -10
  150. package/v3/@claude-flow/guidance/dist/uncertainty.d.ts +0 -372
  151. package/v3/@claude-flow/guidance/dist/uncertainty.js +0 -619
  152. package/v3/@claude-flow/guidance/dist/wasm-kernel.d.ts +0 -48
  153. package/v3/@claude-flow/guidance/dist/wasm-kernel.js +0 -158
  154. package/v3/@claude-flow/shared/dist/core/config/defaults.d.ts +0 -41
  155. package/v3/@claude-flow/shared/dist/core/config/defaults.js +0 -186
  156. package/v3/@claude-flow/shared/dist/core/config/index.d.ts +0 -8
  157. package/v3/@claude-flow/shared/dist/core/config/index.js +0 -12
  158. package/v3/@claude-flow/shared/dist/core/config/loader.d.ts +0 -45
  159. package/v3/@claude-flow/shared/dist/core/config/loader.js +0 -238
  160. package/v3/@claude-flow/shared/dist/core/config/schema.d.ts +0 -1728
  161. package/v3/@claude-flow/shared/dist/core/config/schema.js +0 -160
  162. package/v3/@claude-flow/shared/dist/core/config/validator.d.ts +0 -92
  163. package/v3/@claude-flow/shared/dist/core/config/validator.js +0 -147
  164. package/v3/@claude-flow/shared/dist/core/event-bus.d.ts +0 -31
  165. package/v3/@claude-flow/shared/dist/core/event-bus.js +0 -197
  166. package/v3/@claude-flow/shared/dist/core/index.d.ts +0 -15
  167. package/v3/@claude-flow/shared/dist/core/index.js +0 -19
  168. package/v3/@claude-flow/shared/dist/core/interfaces/agent.interface.d.ts +0 -200
  169. package/v3/@claude-flow/shared/dist/core/interfaces/agent.interface.js +0 -6
  170. package/v3/@claude-flow/shared/dist/core/interfaces/coordinator.interface.d.ts +0 -310
  171. package/v3/@claude-flow/shared/dist/core/interfaces/coordinator.interface.js +0 -7
  172. package/v3/@claude-flow/shared/dist/core/interfaces/event.interface.d.ts +0 -224
  173. package/v3/@claude-flow/shared/dist/core/interfaces/event.interface.js +0 -46
  174. package/v3/@claude-flow/shared/dist/core/interfaces/index.d.ts +0 -10
  175. package/v3/@claude-flow/shared/dist/core/interfaces/index.js +0 -15
  176. package/v3/@claude-flow/shared/dist/core/interfaces/memory.interface.d.ts +0 -298
  177. package/v3/@claude-flow/shared/dist/core/interfaces/memory.interface.js +0 -7
  178. package/v3/@claude-flow/shared/dist/core/interfaces/task.interface.d.ts +0 -185
  179. package/v3/@claude-flow/shared/dist/core/interfaces/task.interface.js +0 -6
  180. package/v3/@claude-flow/shared/dist/core/orchestrator/event-coordinator.d.ts +0 -35
  181. package/v3/@claude-flow/shared/dist/core/orchestrator/event-coordinator.js +0 -101
  182. package/v3/@claude-flow/shared/dist/core/orchestrator/health-monitor.d.ts +0 -60
  183. package/v3/@claude-flow/shared/dist/core/orchestrator/health-monitor.js +0 -166
  184. package/v3/@claude-flow/shared/dist/core/orchestrator/index.d.ts +0 -46
  185. package/v3/@claude-flow/shared/dist/core/orchestrator/index.js +0 -64
  186. package/v3/@claude-flow/shared/dist/core/orchestrator/lifecycle-manager.d.ts +0 -56
  187. package/v3/@claude-flow/shared/dist/core/orchestrator/lifecycle-manager.js +0 -195
  188. package/v3/@claude-flow/shared/dist/core/orchestrator/session-manager.d.ts +0 -83
  189. package/v3/@claude-flow/shared/dist/core/orchestrator/session-manager.js +0 -193
  190. package/v3/@claude-flow/shared/dist/core/orchestrator/task-manager.d.ts +0 -49
  191. package/v3/@claude-flow/shared/dist/core/orchestrator/task-manager.js +0 -253
  192. package/v3/@claude-flow/shared/dist/events/domain-events.d.ts +0 -282
  193. package/v3/@claude-flow/shared/dist/events/domain-events.js +0 -165
  194. package/v3/@claude-flow/shared/dist/events/event-store.d.ts +0 -126
  195. package/v3/@claude-flow/shared/dist/events/event-store.js +0 -427
  196. package/v3/@claude-flow/shared/dist/events/event-store.test.d.ts +0 -8
  197. package/v3/@claude-flow/shared/dist/events/event-store.test.js +0 -293
  198. package/v3/@claude-flow/shared/dist/events/example-usage.d.ts +0 -10
  199. package/v3/@claude-flow/shared/dist/events/example-usage.js +0 -193
  200. package/v3/@claude-flow/shared/dist/events/index.d.ts +0 -21
  201. package/v3/@claude-flow/shared/dist/events/index.js +0 -22
  202. package/v3/@claude-flow/shared/dist/events/projections.d.ts +0 -177
  203. package/v3/@claude-flow/shared/dist/events/projections.js +0 -421
  204. package/v3/@claude-flow/shared/dist/events/rvf-event-log.d.ts +0 -82
  205. package/v3/@claude-flow/shared/dist/events/rvf-event-log.js +0 -340
  206. package/v3/@claude-flow/shared/dist/events/state-reconstructor.d.ts +0 -101
  207. package/v3/@claude-flow/shared/dist/events/state-reconstructor.js +0 -263
  208. package/v3/@claude-flow/shared/dist/events.d.ts +0 -80
  209. package/v3/@claude-flow/shared/dist/events.js +0 -249
  210. package/v3/@claude-flow/shared/dist/hooks/example-usage.d.ts +0 -42
  211. package/v3/@claude-flow/shared/dist/hooks/example-usage.js +0 -351
  212. package/v3/@claude-flow/shared/dist/hooks/executor.d.ts +0 -100
  213. package/v3/@claude-flow/shared/dist/hooks/executor.js +0 -267
  214. package/v3/@claude-flow/shared/dist/hooks/hooks.test.d.ts +0 -9
  215. package/v3/@claude-flow/shared/dist/hooks/hooks.test.js +0 -322
  216. package/v3/@claude-flow/shared/dist/hooks/index.d.ts +0 -52
  217. package/v3/@claude-flow/shared/dist/hooks/index.js +0 -51
  218. package/v3/@claude-flow/shared/dist/hooks/registry.d.ts +0 -133
  219. package/v3/@claude-flow/shared/dist/hooks/registry.js +0 -277
  220. package/v3/@claude-flow/shared/dist/hooks/safety/bash-safety.d.ts +0 -105
  221. package/v3/@claude-flow/shared/dist/hooks/safety/bash-safety.js +0 -481
  222. package/v3/@claude-flow/shared/dist/hooks/safety/file-organization.d.ts +0 -144
  223. package/v3/@claude-flow/shared/dist/hooks/safety/file-organization.js +0 -328
  224. package/v3/@claude-flow/shared/dist/hooks/safety/git-commit.d.ts +0 -158
  225. package/v3/@claude-flow/shared/dist/hooks/safety/git-commit.js +0 -450
  226. package/v3/@claude-flow/shared/dist/hooks/safety/index.d.ts +0 -17
  227. package/v3/@claude-flow/shared/dist/hooks/safety/index.js +0 -17
  228. package/v3/@claude-flow/shared/dist/hooks/session-hooks.d.ts +0 -234
  229. package/v3/@claude-flow/shared/dist/hooks/session-hooks.js +0 -334
  230. package/v3/@claude-flow/shared/dist/hooks/task-hooks.d.ts +0 -163
  231. package/v3/@claude-flow/shared/dist/hooks/task-hooks.js +0 -326
  232. package/v3/@claude-flow/shared/dist/hooks/types.d.ts +0 -267
  233. package/v3/@claude-flow/shared/dist/hooks/types.js +0 -62
  234. package/v3/@claude-flow/shared/dist/hooks/verify-exports.test.d.ts +0 -9
  235. package/v3/@claude-flow/shared/dist/hooks/verify-exports.test.js +0 -93
  236. package/v3/@claude-flow/shared/dist/index.d.ts +0 -20
  237. package/v3/@claude-flow/shared/dist/index.js +0 -50
  238. package/v3/@claude-flow/shared/dist/mcp/connection-pool.d.ts +0 -98
  239. package/v3/@claude-flow/shared/dist/mcp/connection-pool.js +0 -364
  240. package/v3/@claude-flow/shared/dist/mcp/index.d.ts +0 -69
  241. package/v3/@claude-flow/shared/dist/mcp/index.js +0 -84
  242. package/v3/@claude-flow/shared/dist/mcp/server.d.ts +0 -166
  243. package/v3/@claude-flow/shared/dist/mcp/server.js +0 -590
  244. package/v3/@claude-flow/shared/dist/mcp/session-manager.d.ts +0 -136
  245. package/v3/@claude-flow/shared/dist/mcp/session-manager.js +0 -335
  246. package/v3/@claude-flow/shared/dist/mcp/tool-registry.d.ts +0 -178
  247. package/v3/@claude-flow/shared/dist/mcp/tool-registry.js +0 -439
  248. package/v3/@claude-flow/shared/dist/mcp/transport/http.d.ts +0 -104
  249. package/v3/@claude-flow/shared/dist/mcp/transport/http.js +0 -476
  250. package/v3/@claude-flow/shared/dist/mcp/transport/index.d.ts +0 -102
  251. package/v3/@claude-flow/shared/dist/mcp/transport/index.js +0 -238
  252. package/v3/@claude-flow/shared/dist/mcp/transport/stdio.d.ts +0 -104
  253. package/v3/@claude-flow/shared/dist/mcp/transport/stdio.js +0 -263
  254. package/v3/@claude-flow/shared/dist/mcp/transport/websocket.d.ts +0 -133
  255. package/v3/@claude-flow/shared/dist/mcp/transport/websocket.js +0 -396
  256. package/v3/@claude-flow/shared/dist/mcp/types.d.ts +0 -436
  257. package/v3/@claude-flow/shared/dist/mcp/types.js +0 -54
  258. package/v3/@claude-flow/shared/dist/plugin-interface.d.ts +0 -544
  259. package/v3/@claude-flow/shared/dist/plugin-interface.js +0 -23
  260. package/v3/@claude-flow/shared/dist/plugin-loader.d.ts +0 -139
  261. package/v3/@claude-flow/shared/dist/plugin-loader.js +0 -434
  262. package/v3/@claude-flow/shared/dist/plugin-registry.d.ts +0 -183
  263. package/v3/@claude-flow/shared/dist/plugin-registry.js +0 -457
  264. package/v3/@claude-flow/shared/dist/plugins/index.d.ts +0 -10
  265. package/v3/@claude-flow/shared/dist/plugins/index.js +0 -10
  266. package/v3/@claude-flow/shared/dist/plugins/official/hive-mind-plugin.d.ts +0 -106
  267. package/v3/@claude-flow/shared/dist/plugins/official/hive-mind-plugin.js +0 -241
  268. package/v3/@claude-flow/shared/dist/plugins/official/index.d.ts +0 -10
  269. package/v3/@claude-flow/shared/dist/plugins/official/index.js +0 -10
  270. package/v3/@claude-flow/shared/dist/plugins/official/maestro-plugin.d.ts +0 -121
  271. package/v3/@claude-flow/shared/dist/plugins/official/maestro-plugin.js +0 -355
  272. package/v3/@claude-flow/shared/dist/plugins/types.d.ts +0 -93
  273. package/v3/@claude-flow/shared/dist/plugins/types.js +0 -9
  274. package/v3/@claude-flow/shared/dist/resilience/bulkhead.d.ts +0 -105
  275. package/v3/@claude-flow/shared/dist/resilience/bulkhead.js +0 -206
  276. package/v3/@claude-flow/shared/dist/resilience/circuit-breaker.d.ts +0 -132
  277. package/v3/@claude-flow/shared/dist/resilience/circuit-breaker.js +0 -233
  278. package/v3/@claude-flow/shared/dist/resilience/index.d.ts +0 -19
  279. package/v3/@claude-flow/shared/dist/resilience/index.js +0 -19
  280. package/v3/@claude-flow/shared/dist/resilience/rate-limiter.d.ts +0 -168
  281. package/v3/@claude-flow/shared/dist/resilience/rate-limiter.js +0 -314
  282. package/v3/@claude-flow/shared/dist/resilience/retry.d.ts +0 -91
  283. package/v3/@claude-flow/shared/dist/resilience/retry.js +0 -159
  284. package/v3/@claude-flow/shared/dist/security/index.d.ts +0 -10
  285. package/v3/@claude-flow/shared/dist/security/index.js +0 -12
  286. package/v3/@claude-flow/shared/dist/security/input-validation.d.ts +0 -73
  287. package/v3/@claude-flow/shared/dist/security/input-validation.js +0 -201
  288. package/v3/@claude-flow/shared/dist/security/secure-random.d.ts +0 -92
  289. package/v3/@claude-flow/shared/dist/security/secure-random.js +0 -142
  290. package/v3/@claude-flow/shared/dist/services/index.d.ts +0 -7
  291. package/v3/@claude-flow/shared/dist/services/index.js +0 -7
  292. package/v3/@claude-flow/shared/dist/services/v3-progress.service.d.ts +0 -124
  293. package/v3/@claude-flow/shared/dist/services/v3-progress.service.js +0 -402
  294. package/v3/@claude-flow/shared/dist/types/agent.types.d.ts +0 -137
  295. package/v3/@claude-flow/shared/dist/types/agent.types.js +0 -6
  296. package/v3/@claude-flow/shared/dist/types/index.d.ts +0 -11
  297. package/v3/@claude-flow/shared/dist/types/index.js +0 -17
  298. package/v3/@claude-flow/shared/dist/types/mcp.types.d.ts +0 -266
  299. package/v3/@claude-flow/shared/dist/types/mcp.types.js +0 -7
  300. package/v3/@claude-flow/shared/dist/types/memory.types.d.ts +0 -236
  301. package/v3/@claude-flow/shared/dist/types/memory.types.js +0 -7
  302. package/v3/@claude-flow/shared/dist/types/swarm.types.d.ts +0 -186
  303. package/v3/@claude-flow/shared/dist/types/swarm.types.js +0 -65
  304. package/v3/@claude-flow/shared/dist/types/task.types.d.ts +0 -178
  305. package/v3/@claude-flow/shared/dist/types/task.types.js +0 -32
  306. package/v3/@claude-flow/shared/dist/types.d.ts +0 -197
  307. package/v3/@claude-flow/shared/dist/types.js +0 -21
  308. package/v3/@claude-flow/shared/dist/utils/secure-logger.d.ts +0 -69
  309. package/v3/@claude-flow/shared/dist/utils/secure-logger.js +0 -208
@@ -7,6 +7,41 @@ import { confirm, select, multiSelect, input } from '../prompt.js';
7
7
  import * as fs from 'fs';
8
8
  import * as path from 'path';
9
9
  import { executeInit, executeUpgrade, executeUpgradeWithMissing, DEFAULT_INIT_OPTIONS, MINIMAL_INIT_OPTIONS, FULL_INIT_OPTIONS, } from '../init/index.js';
10
+ import { ENROLLMENT_SCREEN, recordEnrollmentOutcome, shouldOfferEnrollment, } from '../funnel/enrollment.js';
11
+ /**
12
+ * ADR-302 post-init capability enrollment. One-time, interactive-TTY-only,
13
+ * skippable with --no-signup, auto-skipped in CI/automation. Never throws
14
+ * and never affects init's exit code. Accepting records the `account`
15
+ * consent receipt only — no other capability is enabled by this prompt.
16
+ */
17
+ async function offerCapabilityEnrollment(ctx) {
18
+ try {
19
+ const noSignup = Boolean(ctx.flags['no-signup'] || ctx.flags.noSignup);
20
+ if (ctx.flags.format === 'json')
21
+ return; // scripted output stays pure
22
+ if (!shouldOfferEnrollment({ noSignup, cwd: ctx.cwd }))
23
+ return;
24
+ output.writeln();
25
+ output.writeln(ENROLLMENT_SCREEN);
26
+ output.writeln();
27
+ const accepted = await confirm({
28
+ message: 'Create a free Cognitum account now?',
29
+ default: false,
30
+ });
31
+ recordEnrollmentOutcome(Boolean(accepted));
32
+ output.writeln();
33
+ if (accepted) {
34
+ output.printInfo('Create your free account at https://cognitum.one');
35
+ output.writeln(output.dim(' CLI sign-in (`ruflo auth login`) ships with the ADR-306 auth release.'));
36
+ }
37
+ else {
38
+ output.writeln(output.dim('You can enable later at https://cognitum.one — this prompt will not repeat.'));
39
+ }
40
+ }
41
+ catch {
42
+ // Enrollment is optional; init success is never affected.
43
+ }
44
+ }
10
45
  // Codex initialization action
11
46
  async function initCodexAction(ctx, options) {
12
47
  const { force, minimal, full, dualMode } = options;
@@ -445,6 +480,7 @@ const initAction = async (ctx) => {
445
480
  if (ctx.flags.format === 'json') {
446
481
  output.printJson(result);
447
482
  }
483
+ await offerCapabilityEnrollment(ctx);
448
484
  return { success: true, data: result };
449
485
  }
450
486
  catch (error) {
@@ -686,6 +722,7 @@ const wizardCommand = {
686
722
  { setting: 'Hooks', value: `${result.summary.hooksEnabled} enabled` },
687
723
  ],
688
724
  });
725
+ await offerCapabilityEnrollment(ctx);
689
726
  return { success: true, data: result };
690
727
  }
691
728
  catch (error) {
@@ -1017,6 +1054,13 @@ export const initCommand = {
1017
1054
  type: 'boolean',
1018
1055
  default: false,
1019
1056
  },
1057
+ {
1058
+ // ADR-302 — skip the one-time post-init capability enrollment prompt.
1059
+ name: 'no-signup',
1060
+ description: 'Skip the post-init Cognitum capability enrollment prompt',
1061
+ type: 'boolean',
1062
+ default: false,
1063
+ },
1020
1064
  {
1021
1065
  name: 'only-claude',
1022
1066
  description: 'Only create .claude/ directory (skip runtime)',
@@ -0,0 +1,21 @@
1
+ /**
2
+ * `ruflo proxy` — Meta LLM Proxy control surface (ADR-304/307/313).
3
+ *
4
+ * This command currently implements the ADR-313 sponsored-downtime
5
+ * subcommands only (`sponsor-enable` / `sponsor-disable` / `sponsor-status`).
6
+ * The full lifecycle command set ADR-307 specifies
7
+ * (`install|start|stop|status|logs|update|uninstall`) manages the proxy
8
+ * *process* itself and is out of scope here — this surface only manages
9
+ * the consent-gated sponsored-mode flag the already-running proxy reads
10
+ * from its config mirror.
11
+ *
12
+ * Consent (ADR-302/313): granting `sponsored-downtime` consent here writes
13
+ * BOTH the ruflo-side consent receipt (source of truth) AND a mirror flag
14
+ * into ~/.ruflo/proxy-config.toml (the file the Rust proxy binary reads).
15
+ * The proxy never writes this file — ruflo does, exactly once per
16
+ * enable/disable action.
17
+ */
18
+ import type { Command } from '../types.js';
19
+ export declare const proxyCommand: Command;
20
+ export default proxyCommand;
21
+ //# sourceMappingURL=proxy.d.ts.map
@@ -0,0 +1,310 @@
1
+ /**
2
+ * `ruflo proxy` — Meta LLM Proxy control surface (ADR-304/307/313).
3
+ *
4
+ * This command currently implements the ADR-313 sponsored-downtime
5
+ * subcommands only (`sponsor-enable` / `sponsor-disable` / `sponsor-status`).
6
+ * The full lifecycle command set ADR-307 specifies
7
+ * (`install|start|stop|status|logs|update|uninstall`) manages the proxy
8
+ * *process* itself and is out of scope here — this surface only manages
9
+ * the consent-gated sponsored-mode flag the already-running proxy reads
10
+ * from its config mirror.
11
+ *
12
+ * Consent (ADR-302/313): granting `sponsored-downtime` consent here writes
13
+ * BOTH the ruflo-side consent receipt (source of truth) AND a mirror flag
14
+ * into ~/.ruflo/proxy-config.toml (the file the Rust proxy binary reads).
15
+ * The proxy never writes this file — ruflo does, exactly once per
16
+ * enable/disable action.
17
+ */
18
+ import * as fs from 'fs';
19
+ import { output } from '../output.js';
20
+ import { hasConsent, recordConsent, revokeConsent, funnelStateDir } from '../funnel/index.js';
21
+ import { recordFunnelEvent } from '../funnel/events.js';
22
+ import { clearRateLimitStatus, readRateLimitStatus } from '../funnel/rate-limit-notifier.js';
23
+ import { clearQuotaLowStatus, readQuotaLowStatus } from '../funnel/power-saver-notifier.js';
24
+ import { getInstalledCliVersion } from '../init/helper-refresh.js';
25
+ import * as path from 'path';
26
+ const PROXY_CONFIG_FILE = 'proxy-config.toml';
27
+ /**
28
+ * Minimal hand-rolled TOML writer — this config has exactly one boolean
29
+ * field ruflo needs to set (`sponsored_consent_granted`); every other field
30
+ * the proxy binary defaults itself (ADR-307 "a malformed config must never
31
+ * crash the proxy — it degrades to safe defaults"). We read-modify-write
32
+ * the raw text so a user's own bind/backend customizations survive, only
33
+ * ever touching this one line. No TOML parser dependency needed for this.
34
+ */
35
+ function readProxyConfigRaw() {
36
+ try {
37
+ return fs.readFileSync(path.join(funnelStateDir(), PROXY_CONFIG_FILE), 'utf-8');
38
+ }
39
+ catch {
40
+ return '';
41
+ }
42
+ }
43
+ function writeConsentMirrorLine(field, value) {
44
+ const dir = funnelStateDir();
45
+ fs.mkdirSync(dir, { recursive: true, mode: 0o700 });
46
+ const target = path.join(dir, PROXY_CONFIG_FILE);
47
+ const raw = readProxyConfigRaw();
48
+ const line = `${field} = ${value}`;
49
+ const pattern = new RegExp(`^${field}\\s*=.*$`, 'm');
50
+ let next;
51
+ if (pattern.test(raw)) {
52
+ next = raw.replace(pattern, line);
53
+ }
54
+ else {
55
+ next = raw.length > 0 ? `${raw.trimEnd()}\n${line}\n` : `${line}\n`;
56
+ }
57
+ const tmp = `${target}.tmp`;
58
+ fs.writeFileSync(tmp, next, { encoding: 'utf-8', mode: 0o600 });
59
+ fs.renameSync(tmp, target);
60
+ }
61
+ function writeSponsoredConsentMirror(granted) {
62
+ writeConsentMirrorLine('sponsored_consent_granted', granted);
63
+ }
64
+ function writePowerSaverConsentMirror(granted) {
65
+ writeConsentMirrorLine('power_saver_consent_granted', granted);
66
+ }
67
+ function writeTrainingShareConsentMirror(granted) {
68
+ writeConsentMirrorLine('training_share_consent_granted', granted);
69
+ }
70
+ const SPONSOR_DISCLOSURE = [
71
+ 'Enabling sponsored downtime mode.',
72
+ '',
73
+ "While your Claude usage limit resets, requests can be routed through",
74
+ "Cognitum's own model capacity, sponsored at no cost to you. This is a",
75
+ 'separate data plane from your own cloud-routing config — Cognitum sees',
76
+ 'these prompts (server-side, same handling as any api.cognitum.one',
77
+ 'request), never your own Claude account.',
78
+ '',
79
+ 'Sponsored capacity is rate-limited and best-effort — Cognitum may',
80
+ 'throttle or decline requests under load. Disable anytime:',
81
+ ' ruflo proxy sponsor-disable',
82
+ ].join('\n');
83
+ const sponsorEnableSub = {
84
+ name: 'sponsor-enable',
85
+ description: "Opt into Cognitum-sponsored downtime capacity (ADR-313)",
86
+ options: [
87
+ { name: 'yes', description: 'Skip the confirmation prompt', type: 'boolean', default: false },
88
+ ],
89
+ action: async (ctx) => {
90
+ if (hasConsent('sponsored-downtime')) {
91
+ output.writeln('Sponsored downtime mode is already enabled.');
92
+ return { success: true, data: { alreadyEnabled: true } };
93
+ }
94
+ output.writeln(SPONSOR_DISCLOSURE);
95
+ output.writeln('');
96
+ if (!ctx.flags.yes) {
97
+ output.writeln('Re-run with --yes to confirm: ruflo proxy sponsor-enable --yes');
98
+ return { success: true, data: { confirmed: false } };
99
+ }
100
+ recordConsent('sponsored-downtime', true, 'proxy-sponsor-enable');
101
+ writeSponsoredConsentMirror(true);
102
+ recordFunnelEvent('sponsor_mode_enabled', 'statusline', getInstalledCliVersion());
103
+ output.printSuccess('Sponsored downtime mode enabled.');
104
+ output.writeln('The proxy will use it automatically while ruflo settings notices');
105
+ output.writeln('rate-limited is flagged. Disable anytime: ruflo proxy sponsor-disable');
106
+ return { success: true, data: { confirmed: true } };
107
+ },
108
+ };
109
+ const sponsorDisableSub = {
110
+ name: 'sponsor-disable',
111
+ description: 'Revoke sponsored-downtime consent and stop using sponsored capacity',
112
+ action: async () => {
113
+ revokeConsent('sponsored-downtime', 'proxy-sponsor-disable');
114
+ writeSponsoredConsentMirror(false);
115
+ recordFunnelEvent('sponsor_mode_disabled', 'statusline', getInstalledCliVersion());
116
+ output.printSuccess('Sponsored downtime mode disabled.');
117
+ return { success: true };
118
+ },
119
+ };
120
+ const sponsorStatusSub = {
121
+ name: 'sponsor-status',
122
+ description: 'Show sponsored-downtime consent + rate-limit flag state',
123
+ action: async () => {
124
+ const consented = hasConsent('sponsored-downtime');
125
+ const rateLimited = readRateLimitStatus();
126
+ output.writeln(`Sponsored downtime consent: ${consented ? 'granted' : 'not granted'}`);
127
+ output.writeln(`Rate-limit flag: ${rateLimited.limited ? `set (since ${rateLimited.since})` : 'not set'}`);
128
+ if (rateLimited.limited && !consented) {
129
+ output.writeln('');
130
+ output.writeln('You are flagged as rate-limited but have not enabled sponsored');
131
+ output.writeln('capacity. Enable it with: ruflo proxy sponsor-enable --yes');
132
+ }
133
+ return { success: true, data: { consented, rateLimited } };
134
+ },
135
+ };
136
+ /** Convenience: clear the rate-limited flag once you're back to normal. */
137
+ const sponsorClearSub = {
138
+ name: 'sponsor-clear',
139
+ description: 'Clear the rate-limited flag (your Claude limit has reset)',
140
+ action: async () => {
141
+ const changed = clearRateLimitStatus();
142
+ if (!changed) {
143
+ output.printError('Rate-limit flag was just toggled — try again in a few minutes (ADR-314 anti-abuse cooldown).');
144
+ return { success: false };
145
+ }
146
+ output.printSuccess('Rate-limit flag cleared.');
147
+ return { success: true };
148
+ },
149
+ };
150
+ const POWER_SAVER_DISCLOSURE = [
151
+ 'Enabling power saver mode.',
152
+ '',
153
+ "Everyday requests will route through Cognitum's own difficulty-based",
154
+ 'router (cognitum-auto) instead of your Claude subscription directly —',
155
+ 'simple messages stay cheap, genuinely hard reasoning still escalates to',
156
+ 'a comparable frontier model. This is billed to YOUR OWN Cognitum',
157
+ 'account (cloud-routing), not sponsored/free capacity — a separate',
158
+ 'decision from sponsored downtime mode.',
159
+ '',
160
+ 'Disable anytime: ruflo proxy power-saver-disable',
161
+ ].join('\n');
162
+ const powerSaverEnableSub = {
163
+ name: 'power-saver-enable',
164
+ description: 'Opt into power saver mode — route everyday requests through your own Cognitum account (ADR-314)',
165
+ options: [
166
+ { name: 'yes', description: 'Skip the confirmation prompt', type: 'boolean', default: false },
167
+ ],
168
+ action: async (ctx) => {
169
+ if (hasConsent('power-saver')) {
170
+ output.writeln('Power saver mode is already enabled.');
171
+ return { success: true, data: { alreadyEnabled: true } };
172
+ }
173
+ output.writeln(POWER_SAVER_DISCLOSURE);
174
+ output.writeln('');
175
+ if (!ctx.flags.yes) {
176
+ output.writeln('Re-run with --yes to confirm: ruflo proxy power-saver-enable --yes');
177
+ return { success: true, data: { confirmed: false } };
178
+ }
179
+ recordConsent('power-saver', true, 'proxy-power-saver-enable');
180
+ writePowerSaverConsentMirror(true);
181
+ recordFunnelEvent('power_saver_enabled', 'statusline', getInstalledCliVersion());
182
+ output.printSuccess('Power saver mode enabled.');
183
+ output.writeln('Flag it active with: ruflo settings notices quota-low');
184
+ output.writeln('Disable anytime: ruflo proxy power-saver-disable');
185
+ return { success: true, data: { confirmed: true } };
186
+ },
187
+ };
188
+ const powerSaverDisableSub = {
189
+ name: 'power-saver-disable',
190
+ description: 'Revoke power-saver consent and stop routing through Cognitum for cost savings',
191
+ action: async () => {
192
+ revokeConsent('power-saver', 'proxy-power-saver-disable');
193
+ writePowerSaverConsentMirror(false);
194
+ recordFunnelEvent('power_saver_disabled', 'statusline', getInstalledCliVersion());
195
+ output.printSuccess('Power saver mode disabled.');
196
+ return { success: true };
197
+ },
198
+ };
199
+ const powerSaverStatusSub = {
200
+ name: 'power-saver-status',
201
+ description: 'Show power-saver consent + quota-low flag state',
202
+ action: async () => {
203
+ const consented = hasConsent('power-saver');
204
+ const quotaLow = readQuotaLowStatus();
205
+ output.writeln(`Power saver consent: ${consented ? 'granted' : 'not granted'}`);
206
+ output.writeln(`Quota-low flag: ${quotaLow.low ? `set (since ${quotaLow.since})` : 'not set'}`);
207
+ if (quotaLow.low && !consented) {
208
+ output.writeln('');
209
+ output.writeln('You are flagged as running low but have not enabled power saver');
210
+ output.writeln('mode. Enable it with: ruflo proxy power-saver-enable --yes');
211
+ }
212
+ return { success: true, data: { consented, quotaLow } };
213
+ },
214
+ };
215
+ /** Convenience: clear the quota-low flag once you're back to normal. */
216
+ const powerSaverClearSub = {
217
+ name: 'power-saver-clear',
218
+ description: 'Clear the quota-low flag',
219
+ action: async () => {
220
+ const changed = clearQuotaLowStatus();
221
+ if (!changed) {
222
+ output.printError('Quota-low flag was just toggled — try again in a few minutes (ADR-314 anti-abuse cooldown).');
223
+ return { success: false };
224
+ }
225
+ output.printSuccess('Quota-low flag cleared.');
226
+ return { success: true };
227
+ },
228
+ };
229
+ const TRAINING_SHARE_DISCLOSURE = [
230
+ 'Enabling training-data sharing.',
231
+ '',
232
+ 'When a request runs on the sponsored plane, the proxy will attach a',
233
+ 'consent header telling Cognitum it may retain that interaction —',
234
+ '(post safety-scan) — as input to its MicroLoRA training pipeline',
235
+ '(meta-llm ADR-251), gated through its existing SHADOW/promotion-rule',
236
+ 'safety net; adaptations are never auto-served. This is content, not',
237
+ 'just metadata, and is entirely separate from sponsored-downtime',
238
+ 'consent — using free capacity never implicitly means this is on.',
239
+ '',
240
+ 'Declining has zero effect on sponsored-capacity access.',
241
+ '',
242
+ 'Disable anytime: ruflo proxy training-share-disable',
243
+ ].join('\n');
244
+ const trainingShareEnableSub = {
245
+ name: 'training-share-enable',
246
+ description: 'Opt into sharing sponsored-plane interaction content for meta-llm training (ADR-315)',
247
+ options: [
248
+ { name: 'yes', description: 'Skip the confirmation prompt', type: 'boolean', default: false },
249
+ ],
250
+ action: async (ctx) => {
251
+ if (hasConsent('training-data-sharing')) {
252
+ output.writeln('Training-data sharing is already enabled.');
253
+ return { success: true, data: { alreadyEnabled: true } };
254
+ }
255
+ output.writeln(TRAINING_SHARE_DISCLOSURE);
256
+ output.writeln('');
257
+ if (!ctx.flags.yes) {
258
+ output.writeln('Re-run with --yes to confirm: ruflo proxy training-share-enable --yes');
259
+ return { success: true, data: { confirmed: false } };
260
+ }
261
+ recordConsent('training-data-sharing', true, 'proxy-training-share-enable');
262
+ writeTrainingShareConsentMirror(true);
263
+ recordFunnelEvent('training_share_enabled', 'statusline', getInstalledCliVersion());
264
+ output.printSuccess('Training-data sharing enabled.');
265
+ output.writeln('Only sponsored-plane requests carry the consent header. Disable anytime:');
266
+ output.writeln(' ruflo proxy training-share-disable');
267
+ return { success: true, data: { confirmed: true } };
268
+ },
269
+ };
270
+ const trainingShareDisableSub = {
271
+ name: 'training-share-disable',
272
+ description: 'Revoke training-data-sharing consent — stop sending the training consent header',
273
+ action: async () => {
274
+ revokeConsent('training-data-sharing', 'proxy-training-share-disable');
275
+ writeTrainingShareConsentMirror(false);
276
+ recordFunnelEvent('training_share_disabled', 'statusline', getInstalledCliVersion());
277
+ output.printSuccess('Training-data sharing disabled.');
278
+ return { success: true };
279
+ },
280
+ };
281
+ const trainingShareStatusSub = {
282
+ name: 'training-share-status',
283
+ description: 'Show training-data-sharing consent state',
284
+ action: async () => {
285
+ const consented = hasConsent('training-data-sharing');
286
+ output.writeln(`Training-data sharing consent: ${consented ? 'granted' : 'not granted'}`);
287
+ if (consented) {
288
+ output.writeln('Sponsored-plane requests carry X-Cognitum-Training-Consent: true.');
289
+ }
290
+ return { success: true, data: { consented } };
291
+ },
292
+ };
293
+ export const proxyCommand = {
294
+ name: 'proxy',
295
+ description: 'Meta LLM Proxy — sponsored downtime + power saver + training-data sharing (ADR-304/307/313/314/315)',
296
+ subcommands: [
297
+ sponsorEnableSub, sponsorDisableSub, sponsorStatusSub, sponsorClearSub,
298
+ powerSaverEnableSub, powerSaverDisableSub, powerSaverStatusSub, powerSaverClearSub,
299
+ trainingShareEnableSub, trainingShareDisableSub, trainingShareStatusSub,
300
+ ],
301
+ examples: [
302
+ { command: 'ruflo proxy sponsor-status', description: 'Show current sponsored-mode state' },
303
+ { command: 'ruflo proxy sponsor-enable --yes', description: 'Opt into sponsored downtime capacity' },
304
+ { command: 'ruflo proxy power-saver-enable --yes', description: 'Opt into power saver mode' },
305
+ { command: 'ruflo proxy training-share-enable --yes', description: 'Opt into training-data sharing (ADR-315)' },
306
+ ],
307
+ action: sponsorStatusSub.action,
308
+ };
309
+ export default proxyCommand;
310
+ //# sourceMappingURL=proxy.js.map
@@ -218,6 +218,35 @@ const scanCommand = {
218
218
  `Critical: ${criticalCount} High: ${highCount} Medium: ${mediumCount} Low: ${lowCount}`,
219
219
  `Total Issues: ${findings.length}`,
220
220
  ].join('\n'), 'Scan Summary');
221
+ // Persist the scan result so downstream consumers (the statusline's
222
+ // getSecurityStatus in funnel/local-signals.ts, which reads
223
+ // `.claude/security-scans/*.json`) reflect real scan state. Best-effort:
224
+ // a failed write must never fail the scan itself.
225
+ try {
226
+ const scanDirOut = path.join(path.resolve(target), '.claude', 'security-scans');
227
+ fs.mkdirSync(scanDirOut, { recursive: true });
228
+ const record = {
229
+ timestamp: new Date().toISOString(),
230
+ target,
231
+ depth,
232
+ type: scanType,
233
+ summary: {
234
+ critical: criticalCount,
235
+ high: highCount,
236
+ medium: mediumCount,
237
+ low: lowCount,
238
+ total: findings.length,
239
+ },
240
+ findings,
241
+ };
242
+ // Deterministic name keyed on scan config so repeated runs overwrite
243
+ // rather than accumulate stale reports.
244
+ const outFile = path.join(scanDirOut, `scan-${scanType}-${depth}.json`);
245
+ fs.writeFileSync(outFile, JSON.stringify(record, null, 2));
246
+ }
247
+ catch {
248
+ // Persistence is advisory only — ignore write failures.
249
+ }
221
250
  // Auto-fix if requested
222
251
  if (fix && criticalCount + highCount > 0) {
223
252
  output.writeln();
@@ -0,0 +1,19 @@
1
+ /**
2
+ * `ruflo settings` — user-facing preferences router (ADR-311 amendment).
3
+ *
4
+ * The name change from `ruflo funnel …` is deliberate copy discipline:
5
+ * "funnel" is internal analytics terminology; it should not appear in the
6
+ * command surface end users see. Every subcommand here forwards to the
7
+ * existing `ruflo funnel` primitives so behavior stays identical — this
8
+ * is a friendlier wrapper, not a re-implementation.
9
+ *
10
+ * Subcommands:
11
+ * ruflo settings Show effective settings + how to change them
12
+ * ruflo settings notices status Show whether the notices row is on
13
+ * ruflo settings notices off Turn off the notices row (persistent)
14
+ * ruflo settings notices on Re-enable the notices row
15
+ * ruflo settings notices id Show the pseudonymous notices id
16
+ */
17
+ import type { Command } from '../types.js';
18
+ export declare const settingsCommand: Command;
19
+ //# sourceMappingURL=settings.d.ts.map
@@ -0,0 +1,180 @@
1
+ /**
2
+ * `ruflo settings` — user-facing preferences router (ADR-311 amendment).
3
+ *
4
+ * The name change from `ruflo funnel …` is deliberate copy discipline:
5
+ * "funnel" is internal analytics terminology; it should not appear in the
6
+ * command surface end users see. Every subcommand here forwards to the
7
+ * existing `ruflo funnel` primitives so behavior stays identical — this
8
+ * is a friendlier wrapper, not a re-implementation.
9
+ *
10
+ * Subcommands:
11
+ * ruflo settings Show effective settings + how to change them
12
+ * ruflo settings notices status Show whether the notices row is on
13
+ * ruflo settings notices off Turn off the notices row (persistent)
14
+ * ruflo settings notices on Re-enable the notices row
15
+ * ruflo settings notices id Show the pseudonymous notices id
16
+ */
17
+ import { output } from '../output.js';
18
+ import { deleteFunnelData, funnelStateDir, getDisclosure, getFunnelId, hasConsent, readConsents, recordDisclosureDeclined, recordDisclosureReenabled, resolveFunnelEnabled, } from '../funnel/index.js';
19
+ import { readStateJson, writeStateJson } from '../funnel/state.js';
20
+ import { clearRateLimitStatus, markRateLimited, rateLimitNotice, readRateLimitStatus, } from '../funnel/rate-limit-notifier.js';
21
+ import { clearQuotaLowStatus, markQuotaLow, quotaLowNotice, readQuotaLowStatus, } from '../funnel/power-saver-notifier.js';
22
+ function setUserConfigEnabled(enabled) {
23
+ const cfg = readStateJson('funnel.json') ?? {};
24
+ cfg.enabled = enabled;
25
+ writeStateJson('funnel.json', cfg);
26
+ }
27
+ const noticesStatusSub = {
28
+ name: 'status',
29
+ description: 'Show whether notices are on and which source decided it',
30
+ action: async () => {
31
+ const decision = resolveFunnelEnabled();
32
+ const disclosure = getDisclosure();
33
+ output.writeln(`Notices: ${decision.enabled ? 'enabled' : 'disabled'} (decided by: ${decision.decidedBy})`);
34
+ output.writeln(`Disclosure: ${disclosure.state}`);
35
+ output.writeln(`Telemetry: ${hasConsent('telemetry') ? 'consent granted' : 'no consent'}`);
36
+ return { success: true, data: { decision, disclosure: disclosure.state } };
37
+ },
38
+ };
39
+ const noticesOffSub = {
40
+ name: 'off',
41
+ description: 'Turn off statusline notices (persistent, user-level)',
42
+ action: async () => {
43
+ setUserConfigEnabled(false);
44
+ recordDisclosureDeclined();
45
+ deleteFunnelData();
46
+ output.printSuccess('Notices disabled. Local notice data deleted.');
47
+ return { success: true };
48
+ },
49
+ };
50
+ const noticesOnSub = {
51
+ name: 'on',
52
+ description: 'Re-enable statusline notices',
53
+ action: async () => {
54
+ setUserConfigEnabled(true);
55
+ recordDisclosureReenabled();
56
+ const decision = resolveFunnelEnabled();
57
+ if (decision.enabled) {
58
+ output.printSuccess('Notices enabled.');
59
+ }
60
+ else {
61
+ output.printWarning(`User preference recorded, but notices stay off (decided by: ${decision.decidedBy})`);
62
+ }
63
+ return { success: true, data: decision };
64
+ },
65
+ };
66
+ const noticesIdSub = {
67
+ name: 'id',
68
+ description: 'Print the pseudonymous notices ID (telemetry consent required)',
69
+ action: async () => {
70
+ const id = getFunnelId();
71
+ output.writeln(id ?? '(no id — telemetry consent not granted, or notices are off)');
72
+ return { success: true, data: { id } };
73
+ },
74
+ };
75
+ const rateLimitedSub = {
76
+ name: 'rate-limited',
77
+ description: 'Manually flag that you have hit a Claude usage limit (ADR-312 Phase 0)',
78
+ options: [
79
+ { name: 'clear', description: 'Clear the flag', type: 'boolean', default: false },
80
+ ],
81
+ action: async (ctx) => {
82
+ if (ctx.flags.clear) {
83
+ const changed = clearRateLimitStatus();
84
+ if (!changed) {
85
+ output.printError('Rate-limit flag was just toggled — try again in a few minutes (ADR-314 anti-abuse cooldown).');
86
+ return { success: false };
87
+ }
88
+ output.printSuccess('Rate-limit flag cleared.');
89
+ return { success: true };
90
+ }
91
+ const changed = markRateLimited();
92
+ if (!changed) {
93
+ output.printError('Rate-limit flag was just toggled — try again in a few minutes (ADR-314 anti-abuse cooldown).');
94
+ return { success: false };
95
+ }
96
+ output.printSuccess('Rate-limit flag set.');
97
+ output.writeln('');
98
+ output.writeln('This is a manual, self-reported flag — ruflo cannot detect Claude\'s');
99
+ output.writeln('usage-limit state automatically today (see ADR-312). While flagged,');
100
+ output.writeln('the notices row may suggest sponsored Cognitum capacity as a bridge');
101
+ output.writeln('until your own limit resets: ruflo proxy sponsor-enable');
102
+ output.writeln('');
103
+ output.writeln('Clear it any time: ruflo settings notices rate-limited --clear');
104
+ const notice = rateLimitNotice();
105
+ return { success: true, data: { notice, status: readRateLimitStatus() } };
106
+ },
107
+ };
108
+ const quotaLowSub = {
109
+ name: 'quota-low',
110
+ description: 'Manually flag that your Claude quota is running low (ADR-314 power saver)',
111
+ options: [
112
+ { name: 'clear', description: 'Clear the flag', type: 'boolean', default: false },
113
+ ],
114
+ action: async (ctx) => {
115
+ if (ctx.flags.clear) {
116
+ const changed = clearQuotaLowStatus();
117
+ if (!changed) {
118
+ output.printError('Quota-low flag was just toggled — try again in a few minutes (ADR-314 anti-abuse cooldown).');
119
+ return { success: false };
120
+ }
121
+ output.printSuccess('Quota-low flag cleared.');
122
+ return { success: true };
123
+ }
124
+ const changed = markQuotaLow();
125
+ if (!changed) {
126
+ output.printError('Quota-low flag was just toggled — try again in a few minutes (ADR-314 anti-abuse cooldown).');
127
+ return { success: false };
128
+ }
129
+ output.printSuccess('Quota-low flag set.');
130
+ output.writeln('');
131
+ output.writeln('This is a manual, self-reported flag — ruflo cannot read your actual');
132
+ output.writeln('quota percentage today (see ADR-312/314). While flagged, and once you');
133
+ output.writeln('enable power saver mode, everyday requests route through Cognitum\'s');
134
+ output.writeln('own difficulty-based router (billed to your own Cognitum account):');
135
+ output.writeln(' ruflo proxy power-saver-enable');
136
+ output.writeln('');
137
+ output.writeln('Clear it any time: ruflo settings notices quota-low --clear');
138
+ const notice = quotaLowNotice();
139
+ return { success: true, data: { notice, status: readQuotaLowStatus() } };
140
+ },
141
+ };
142
+ const noticesCommand = {
143
+ name: 'notices',
144
+ description: 'Control the statusline notices row',
145
+ subcommands: [noticesStatusSub, noticesOffSub, noticesOnSub, noticesIdSub, rateLimitedSub, quotaLowSub],
146
+ action: noticesStatusSub.action,
147
+ };
148
+ const overviewAction = async () => {
149
+ const decision = resolveFunnelEnabled();
150
+ const disclosure = getDisclosure();
151
+ const consents = readConsents();
152
+ output.writeln('ruflo settings — user preferences');
153
+ output.writeln('');
154
+ output.writeln('Notices (statusline tips + product updates)');
155
+ output.writeln(' ruflo settings notices status Show current state');
156
+ output.writeln(' ruflo settings notices off Turn off all notices');
157
+ output.writeln(' ruflo settings notices on Re-enable');
158
+ output.writeln(' ruflo settings notices id Show pseudonymous notices id');
159
+ output.writeln('');
160
+ output.writeln(` current: ${decision.enabled ? 'enabled' : 'disabled'} (${decision.decidedBy})`);
161
+ output.writeln(` disclosure: ${disclosure.state}`);
162
+ const domains = Object.keys(consents);
163
+ if (domains.length) {
164
+ output.writeln(` consents: ${domains.join(', ')}`);
165
+ }
166
+ output.writeln(` state dir: ${funnelStateDir()}`);
167
+ return { success: true, data: { decision, disclosure: disclosure.state, consents } };
168
+ };
169
+ export const settingsCommand = {
170
+ name: 'settings',
171
+ description: 'View and change user preferences (notices, consents)',
172
+ subcommands: [noticesCommand],
173
+ examples: [
174
+ { command: 'ruflo settings', description: 'Overview + current state' },
175
+ { command: 'ruflo settings notices off', description: 'Turn off statusline notices' },
176
+ { command: 'ruflo settings notices status', description: 'Show current notices state' },
177
+ ],
178
+ action: overviewAction,
179
+ };
180
+ //# sourceMappingURL=settings.js.map