agentic-qe 3.14.4 → 3.14.6

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 (486) hide show
  1. package/.claude/skills/skills-manifest.json +1 -1
  2. package/CHANGELOG.md +169 -0
  3. package/assets/skills/skills-manifest.json +1 -1
  4. package/dist/adapters/ag-ui/event-types.d.ts +1 -1
  5. package/dist/audit/witness-chain-hash.d.ts +18 -0
  6. package/dist/audit/witness-chain-hash.js +37 -0
  7. package/dist/audit/witness-chain-repair.d.ts +71 -0
  8. package/dist/audit/witness-chain-repair.js +203 -0
  9. package/dist/audit/witness-chain-verifier.d.ts +152 -0
  10. package/dist/audit/witness-chain-verifier.js +293 -0
  11. package/dist/audit/witness-chain.d.ts +10 -43
  12. package/dist/audit/witness-chain.js +43 -126
  13. package/dist/audit/witness-findings.js +4 -1
  14. package/dist/cli/bundle.js +13 -10
  15. package/dist/cli/chunks/adapter-UYOJPTOX.js +2 -0
  16. package/dist/cli/chunks/agent-booster-wasm-2YGML6OU.js +2 -0
  17. package/dist/cli/chunks/{agent-handler-RDNTK4CA.js → agent-handler-D5SSQYNU.js} +2 -2
  18. package/dist/cli/chunks/{agent-memory-branch-NAAMBWIR.js → agent-memory-branch-YHPLTITV.js} +2 -2
  19. package/dist/cli/chunks/aqe-learning-engine-JR5AVQXR.js +2 -0
  20. package/dist/cli/chunks/{arena-KXFHRWX4.js → arena-7BGOXGXO.js} +2 -2
  21. package/dist/cli/chunks/{arena-HXTWJ5YY.js → arena-MCE6EU7K.js} +4 -4
  22. package/dist/cli/chunks/audit-BMWTQECB.js +4 -0
  23. package/dist/cli/chunks/base-DRZ2LS6X.js +2 -0
  24. package/dist/cli/chunks/{better-sqlite3-UICJZIDG.js → better-sqlite3-PMUNGASU.js} +2 -2
  25. package/dist/cli/chunks/brain-handler-QPUFYX7F.js +94 -0
  26. package/dist/cli/chunks/{branch-enumerator-SS7UNVIA.js → branch-enumerator-WKFDGRN4.js} +2 -2
  27. package/dist/cli/chunks/{browser-77GI6KBE.js → browser-VY5HKH5X.js} +2 -2
  28. package/dist/cli/chunks/browser-workflow-CJ7T3MXF.js +2 -0
  29. package/dist/cli/chunks/{chunk-PZJOPURC.js → chunk-257E2A5M.js} +5 -5
  30. package/dist/cli/chunks/{chunk-55RWDRJD.js → chunk-2JVWITNK.js} +4 -4
  31. package/dist/cli/chunks/{chunk-BOARZKU3.js → chunk-2NPKIBAZ.js} +2 -2
  32. package/dist/cli/chunks/chunk-2TMWAQQ3.js +13 -0
  33. package/dist/cli/chunks/{chunk-M4WJKGVK.js → chunk-2YXGBZWV.js} +1 -1
  34. package/dist/cli/chunks/{chunk-3VOQRIQM.js → chunk-3EA536JF.js} +2 -2
  35. package/dist/cli/chunks/{chunk-ZZDIMOOV.js → chunk-3EZOZN25.js} +2 -2
  36. package/dist/cli/chunks/{chunk-MNW6QGNJ.js → chunk-3HZS4M3O.js} +2 -2
  37. package/dist/cli/chunks/{chunk-EKQ673SA.js → chunk-3NIG7S5W.js} +1 -1
  38. package/dist/cli/chunks/{chunk-7D777LTF.js → chunk-4N23RFDU.js} +2 -2
  39. package/dist/cli/chunks/{chunk-BOZZYWCR.js → chunk-5J6W7SIA.js} +1 -1
  40. package/dist/cli/chunks/{chunk-HIVA55CJ.js → chunk-5OOMJGFN.js} +1 -1
  41. package/dist/cli/chunks/{chunk-W7BWUTVV.js → chunk-5QQSIGUA.js} +2 -2
  42. package/dist/cli/chunks/{chunk-PAWXJ73E.js → chunk-5VFPCSK7.js} +1 -1
  43. package/dist/cli/chunks/{chunk-KPA7MZ6C.js → chunk-62N4NUJH.js} +2 -2
  44. package/dist/cli/chunks/chunk-64VGZQLB.js +2 -0
  45. package/dist/cli/chunks/{chunk-64PFWE2F.js → chunk-66VWCR67.js} +2 -2
  46. package/dist/cli/chunks/{chunk-XRT2WRMS.js → chunk-6LIHFV7O.js} +2 -2
  47. package/dist/cli/chunks/{chunk-STJCATGN.js → chunk-6OS76PHI.js} +2 -2
  48. package/dist/cli/chunks/{chunk-ZNPKDCZR.js → chunk-6RE3X4V5.js} +2 -2
  49. package/dist/cli/chunks/{chunk-BFP7KO7P.js → chunk-6SH5VZUD.js} +2 -2
  50. package/dist/cli/chunks/chunk-6SQM2MUX.js +4 -0
  51. package/dist/cli/chunks/{chunk-IPR4QP3H.js → chunk-6U7LNMWZ.js} +2 -2
  52. package/dist/cli/chunks/{chunk-MIQTXNBG.js → chunk-72KXSMWI.js} +1 -1
  53. package/dist/cli/chunks/chunk-7CUQCCMD.js +27 -0
  54. package/dist/cli/chunks/chunk-7D3V65N5.js +2 -0
  55. package/dist/cli/chunks/{chunk-JZ3ORVZ3.js → chunk-7J6QC567.js} +3 -3
  56. package/dist/cli/chunks/{chunk-4OYFXLBK.js → chunk-7LPR6HJG.js} +2 -2
  57. package/dist/cli/chunks/{chunk-4MHXCAG2.js → chunk-7NITCZWD.js} +1 -1
  58. package/dist/cli/chunks/{chunk-M5QUBZY6.js → chunk-7Z5LHRC3.js} +2 -2
  59. package/dist/cli/chunks/{chunk-CSU5NYOX.js → chunk-AHKELLIO.js} +4 -4
  60. package/dist/cli/chunks/{chunk-DHJPWQBR.js → chunk-AIRGNL55.js} +2 -2
  61. package/dist/cli/chunks/{chunk-C2WU3533.js → chunk-AJRUJAAK.js} +1 -1
  62. package/dist/cli/chunks/{chunk-HIYXCDEP.js → chunk-AVBJYI5I.js} +1 -1
  63. package/dist/cli/chunks/{chunk-U5K45TFH.js → chunk-B6D2CHEH.js} +1 -1
  64. package/dist/cli/chunks/{chunk-FRH6VAUS.js → chunk-B6MOJC3X.js} +1 -1
  65. package/dist/cli/chunks/{chunk-HUWNIPZ5.js → chunk-BAMN2CHI.js} +1 -1
  66. package/dist/cli/chunks/{chunk-ONII3572.js → chunk-BBT64TII.js} +3 -3
  67. package/dist/cli/chunks/{chunk-KSKEF7LZ.js → chunk-BJTJLJRZ.js} +3 -3
  68. package/dist/cli/chunks/chunk-BMAPORJ7.js +15 -0
  69. package/dist/cli/chunks/{chunk-CIZ5JPDC.js → chunk-BPEDWS6O.js} +3 -3
  70. package/dist/cli/chunks/{chunk-Z3RHREWF.js → chunk-BVR7RMC5.js} +1 -1
  71. package/dist/cli/chunks/{chunk-HDSAM2RE.js → chunk-C6KWXUFJ.js} +2 -2
  72. package/dist/cli/chunks/{chunk-ZBAKA4YB.js → chunk-CCK4BF76.js} +1 -1
  73. package/dist/cli/chunks/{chunk-IFCLB7FJ.js → chunk-CD542DNJ.js} +1 -1
  74. package/dist/cli/chunks/{chunk-6KJABXAR.js → chunk-CF2ISEOJ.js} +2 -2
  75. package/dist/cli/chunks/chunk-CM7U6TAX.js +5 -0
  76. package/dist/cli/chunks/{chunk-3X3DJZJJ.js → chunk-D45SG6CP.js} +1 -1
  77. package/dist/cli/chunks/{chunk-DAEFDCJ4.js → chunk-D6CJIGRU.js} +89 -83
  78. package/dist/cli/chunks/{chunk-MVPCNSPY.js → chunk-DBDPRORT.js} +2 -2
  79. package/dist/cli/chunks/{chunk-AUXFKCQL.js → chunk-DHVX5UB2.js} +2 -2
  80. package/dist/cli/chunks/{chunk-GPLQ6DOK.js → chunk-DK4XN4CU.js} +2 -2
  81. package/dist/cli/chunks/{chunk-SRKETSFF.js → chunk-DPYSUDAO.js} +1 -1
  82. package/dist/cli/chunks/{chunk-CNG6GQEZ.js → chunk-DUYOVM5I.js} +2 -2
  83. package/dist/cli/chunks/{chunk-VIHTL3U2.js → chunk-DZ3AUAAB.js} +2 -2
  84. package/dist/cli/chunks/{chunk-CU46J64M.js → chunk-E6G2RD5H.js} +2 -2
  85. package/dist/cli/chunks/{chunk-5YPYDPBJ.js → chunk-EAY2JMZG.js} +2 -2
  86. package/dist/cli/chunks/{chunk-V3QLFNA2.js → chunk-ELLBS5RP.js} +4 -4
  87. package/dist/cli/chunks/chunk-ENGZ4D5V.js +2 -0
  88. package/dist/cli/chunks/chunk-FBMN7B46.js +4 -0
  89. package/dist/cli/chunks/{chunk-EDJ3O7RH.js → chunk-FWASDOT2.js} +2 -2
  90. package/dist/cli/chunks/{chunk-MDWCE7YW.js → chunk-FZOBD67M.js} +1 -1
  91. package/dist/cli/chunks/{chunk-A4FYONNU.js → chunk-GDSXITFH.js} +2 -2
  92. package/dist/cli/chunks/{chunk-2JW3BCGG.js → chunk-GGRHV6D7.js} +1 -1
  93. package/dist/cli/chunks/{chunk-ISDMD6EU.js → chunk-GPYVDFB3.js} +90 -90
  94. package/dist/cli/chunks/{chunk-CDKG6EI7.js → chunk-GSF6MB64.js} +2 -2
  95. package/dist/cli/chunks/{chunk-WLG5AJ4N.js → chunk-H52HZ67P.js} +2 -2
  96. package/dist/cli/chunks/{chunk-FGYMFUE2.js → chunk-H5BS5VH7.js} +2 -2
  97. package/dist/cli/chunks/{chunk-34WO57CW.js → chunk-H6ZM3PUT.js} +1 -1
  98. package/dist/cli/chunks/{chunk-6CQN24ZK.js → chunk-HM6ZSCPI.js} +1 -1
  99. package/dist/cli/chunks/{chunk-DPFRKBOG.js → chunk-HNFVJP4I.js} +2 -2
  100. package/dist/cli/chunks/{chunk-TPGED2IF.js → chunk-I33ERSGB.js} +2 -2
  101. package/dist/cli/chunks/{chunk-UEM7ZF5K.js → chunk-IAF6T27S.js} +2 -2
  102. package/dist/cli/chunks/{chunk-KCZR45PA.js → chunk-IB27QACC.js} +2 -2
  103. package/dist/cli/chunks/{chunk-SGYJ4NFZ.js → chunk-ICTXTNQZ.js} +1 -1
  104. package/dist/cli/chunks/chunk-IG5GNEC6.js +4 -0
  105. package/dist/cli/chunks/{chunk-KHFNNVJA.js → chunk-IQO7UCFR.js} +2 -2
  106. package/dist/cli/chunks/{chunk-3TW5W5LX.js → chunk-IV5UZOHH.js} +2 -2
  107. package/dist/cli/chunks/{chunk-7ZIOFPL3.js → chunk-JBTPOIAC.js} +2 -2
  108. package/dist/cli/chunks/{chunk-ZNEMGX5O.js → chunk-JIXUMYKZ.js} +1 -1
  109. package/dist/cli/chunks/{chunk-MTZH7AHC.js → chunk-JMONHE4B.js} +1 -1
  110. package/dist/cli/chunks/{chunk-TDZ53WO2.js → chunk-JVNTSNWU.js} +2 -2
  111. package/dist/cli/chunks/{chunk-PFR4G3DJ.js → chunk-JXGFRBUO.js} +2 -2
  112. package/dist/cli/chunks/chunk-JZOS5FCX.js +2 -0
  113. package/dist/cli/chunks/{chunk-STM3UDNO.js → chunk-KNNISEDY.js} +2 -2
  114. package/dist/cli/chunks/{chunk-TWAWHOP7.js → chunk-L4RUBPLR.js} +2 -2
  115. package/dist/cli/chunks/chunk-LL3IGZBI.js +2 -0
  116. package/dist/cli/chunks/{chunk-CIKSHTEQ.js → chunk-MBRHSU6W.js} +10 -10
  117. package/dist/cli/chunks/{chunk-G6T45OIC.js → chunk-MJS53PRX.js} +2 -2
  118. package/dist/cli/chunks/{chunk-PO3IXGMQ.js → chunk-MQROI74N.js} +2 -2
  119. package/dist/cli/chunks/{chunk-DOTK76IJ.js → chunk-MUOG6QXR.js} +2 -2
  120. package/dist/cli/chunks/{chunk-MVNP7GIR.js → chunk-MW2GGZZ5.js} +1 -1
  121. package/dist/cli/chunks/{chunk-FWGOHAAB.js → chunk-NHWGMJAP.js} +2 -2
  122. package/dist/cli/chunks/{chunk-ZBJ4XOOV.js → chunk-NMAIY4PX.js} +4 -4
  123. package/dist/cli/chunks/{chunk-CDHQFHRP.js → chunk-NQZ5AR3D.js} +2 -2
  124. package/dist/cli/chunks/{chunk-FLYOJOKN.js → chunk-P6OYS755.js} +1 -1
  125. package/dist/cli/chunks/{chunk-BGE6FOLM.js → chunk-PI7TJS62.js} +2 -2
  126. package/dist/cli/chunks/chunk-PX5YDCRH.js +4 -0
  127. package/dist/cli/chunks/{chunk-Q5DO24IJ.js → chunk-PZPWRQ2M.js} +3 -3
  128. package/dist/cli/chunks/{chunk-R4VL6E65.js → chunk-Q5XTSMWR.js} +2 -2
  129. package/dist/cli/chunks/{chunk-JBNEE5UH.js → chunk-Q7EAGKAE.js} +2 -2
  130. package/dist/cli/chunks/{chunk-R5NE6B2M.js → chunk-QDFTT3RF.js} +2 -2
  131. package/dist/cli/chunks/{chunk-DFZCKIGY.js → chunk-QGA55PFM.js} +3 -3
  132. package/dist/cli/chunks/{chunk-RJCYCLZV.js → chunk-QW6VMTBR.js} +2 -2
  133. package/dist/cli/chunks/{chunk-6VRA2QGL.js → chunk-QZANMBIT.js} +1 -1
  134. package/dist/cli/chunks/{chunk-MEGDYJPV.js → chunk-RETBYIAC.js} +4 -4
  135. package/dist/cli/chunks/{chunk-XJ7QNVI5.js → chunk-RFNPJK6N.js} +3 -3
  136. package/dist/cli/chunks/{chunk-NJBGXDQ7.js → chunk-RG52OKAM.js} +1 -1
  137. package/dist/cli/chunks/{chunk-DA5K5754.js → chunk-RSXXCL4A.js} +1 -1
  138. package/dist/cli/chunks/{chunk-HV2J7KKQ.js → chunk-RTFO5UQH.js} +2 -2
  139. package/dist/cli/chunks/{chunk-6UWGMOND.js → chunk-RZZCUIAI.js} +2 -2
  140. package/dist/cli/chunks/chunk-SDRHUMJB.js +2 -0
  141. package/dist/cli/chunks/{chunk-TSRSV3LD.js → chunk-SE4WIB26.js} +1 -1
  142. package/dist/cli/chunks/{chunk-ODKLFVYC.js → chunk-SESK3ARK.js} +2 -2
  143. package/dist/cli/chunks/{chunk-AWWNB2T7.js → chunk-SJUXE4IC.js} +2 -2
  144. package/dist/cli/chunks/{chunk-QGIU2WRL.js → chunk-SMDN3BQZ.js} +1 -1
  145. package/dist/cli/chunks/{chunk-VD6QRULW.js → chunk-SNOBH4AZ.js} +2 -2
  146. package/dist/cli/chunks/{chunk-OSLYSG3B.js → chunk-SPV2VKC5.js} +2 -2
  147. package/dist/cli/chunks/chunk-TCHGOB2N.js +2 -0
  148. package/dist/cli/chunks/{chunk-MOBNBMFW.js → chunk-TVYY3OCX.js} +1 -1
  149. package/dist/cli/chunks/{chunk-UGVHCMUN.js → chunk-UCFQALXO.js} +3 -3
  150. package/dist/cli/chunks/{chunk-3QHGWY7T.js → chunk-UKA2KOXE.js} +2 -2
  151. package/dist/cli/chunks/{chunk-MCUJEZT6.js → chunk-UNFFDHER.js} +16 -11
  152. package/dist/cli/chunks/{chunk-6QYNWR7U.js → chunk-UQ32JHES.js} +2 -2
  153. package/dist/cli/chunks/{chunk-OULHKEVH.js → chunk-V4DM6ELU.js} +2 -2
  154. package/dist/cli/chunks/{chunk-M2JBBZQB.js → chunk-VGFFFKGK.js} +2 -2
  155. package/dist/cli/chunks/{chunk-OCWWP5PL.js → chunk-VMNWDJIZ.js} +2 -2
  156. package/dist/cli/chunks/chunk-W6HXLH5G.js +180 -0
  157. package/dist/cli/chunks/{chunk-AIHDEEJO.js → chunk-WCJBU2KI.js} +2 -2
  158. package/dist/cli/chunks/{chunk-ZBQY5GLF.js → chunk-WGM35YWL.js} +2 -2
  159. package/dist/cli/chunks/chunk-WO4QMXIG.js +3 -0
  160. package/dist/cli/chunks/{chunk-3UPAMMCB.js → chunk-XAS3XRYM.js} +1 -1
  161. package/dist/cli/chunks/chunk-Y3LZ35OG.js +2 -0
  162. package/dist/cli/chunks/{chunk-5R3QL7WN.js → chunk-Y3UOUNHM.js} +2 -2
  163. package/dist/cli/chunks/{chunk-ZJ26AQA5.js → chunk-YFBSPLJG.js} +1 -1
  164. package/dist/cli/chunks/{chunk-BDESSCVR.js → chunk-YHKEDEAA.js} +3 -3
  165. package/dist/cli/chunks/{chunk-CXQPR5MY.js → chunk-YS4FCTWF.js} +1 -1
  166. package/dist/cli/chunks/{chunk-CLTMDCSE.js → chunk-YSLL6VSL.js} +2 -2
  167. package/dist/cli/chunks/chunk-Z6GGIRQQ.js +65 -0
  168. package/dist/cli/chunks/{chunk-F3SBRQC6.js → chunk-Z7WODOTH.js} +2 -2
  169. package/dist/cli/chunks/chunk-ZCRTRYXK.js +14 -0
  170. package/dist/cli/chunks/{chunk-XRYF6JV7.js → chunk-ZEV3YTO7.js} +2 -2
  171. package/dist/cli/chunks/{chunk-YNXS6CGV.js → chunk-ZL6SYKUK.js} +1 -1
  172. package/dist/cli/chunks/{chunk-5SJHQ2CO.js → chunk-ZSPU4MOS.js} +2 -2
  173. package/dist/cli/chunks/{chunk-UDHKLT4C.js → chunk-ZVWVV4EX.js} +1 -1
  174. package/dist/cli/chunks/{ci-464KPQNP.js → ci-W6K6G2KZ.js} +2 -2
  175. package/dist/cli/chunks/{ci-output-I7FX2RSO.js → ci-output-LDT24TS3.js} +2 -2
  176. package/dist/cli/chunks/{circuit-breaker-3FW237WW.js → circuit-breaker-F5V4KITU.js} +2 -2
  177. package/dist/cli/chunks/claude-flow-setup-DT6WQQVD.js +2 -0
  178. package/dist/cli/chunks/client-KHWJT6FB.js +2 -0
  179. package/dist/cli/chunks/{cline-installer-UWFHT6VY.js → cline-installer-G7TJOAEX.js} +2 -2
  180. package/dist/cli/chunks/{code-KQSUT3FS.js → code-PGE6A42V.js} +3 -3
  181. package/dist/cli/chunks/{code-index-extractor-PABBNUSC.js → code-index-extractor-RNITH372.js} +2 -2
  182. package/dist/cli/chunks/codex-installer-LBX77AI3.js +14 -0
  183. package/dist/cli/chunks/{completions-7RWHAUAR.js → completions-4AWLAARX.js} +2 -2
  184. package/dist/cli/chunks/{complexity-analyzer-XPOAF33E.js → complexity-analyzer-ZPNSS476.js} +2 -2
  185. package/dist/cli/chunks/{continuedev-installer-V4F2FIZP.js → continuedev-installer-UAPWX6OA.js} +2 -2
  186. package/dist/cli/chunks/{copilot-installer-JMICURQB.js → copilot-installer-BJN2YJGI.js} +2 -2
  187. package/dist/cli/chunks/core-handlers-HING5RRG.js +2 -0
  188. package/dist/cli/chunks/{cost-tracker-5OFHEYFJ.js → cost-tracker-MHP2VJ63.js} +2 -2
  189. package/dist/cli/chunks/{coverage-QKN57JDS.js → coverage-PQB4IEFG.js} +3 -3
  190. package/dist/cli/chunks/cross-domain-router-PQTD6AZN.js +2 -0
  191. package/dist/cli/chunks/{cursor-installer-GBJ7YXSM.js → cursor-installer-ZXBWYAS3.js} +2 -2
  192. package/dist/cli/chunks/{daemon-GKP7CMEK.js → daemon-64C7R6OJ.js} +3 -3
  193. package/dist/cli/chunks/{daemon-IAVSO6HK.js → daemon-N2BEGEFY.js} +4 -4
  194. package/dist/cli/chunks/{dag-attention-scheduler-S225TCI7.js → dag-attention-scheduler-SPZDAPNL.js} +2 -2
  195. package/dist/cli/chunks/{detect-IUYH422U.js → detect-LXJBSSZW.js} +2 -2
  196. package/dist/cli/chunks/{dist-node-2YRE6A7C.js → dist-node-U3TKZ2IZ.js} +2 -2
  197. package/dist/cli/chunks/{domain-handler-PL2TZC6H.js → domain-handler-3DDWUVSR.js} +2 -2
  198. package/dist/cli/chunks/{domain-plugins-HCGLXKIT.js → domain-plugins-JJVWI4OQ.js} +2 -2
  199. package/dist/cli/chunks/domain-transfer-M36KUJ2U.js +2 -0
  200. package/dist/cli/chunks/dream-WUGRSNCV.js +2 -0
  201. package/dist/cli/chunks/embed-and-insert-pattern-JPAR7TXX.js +3 -0
  202. package/dist/cli/chunks/{eval-WCK7KNFN.js → eval-SOLG23EA.js} +2 -2
  203. package/dist/cli/chunks/{experience-capture-middleware-2MSQWSAR.js → experience-capture-middleware-T7G2VOOD.js} +4 -4
  204. package/dist/cli/chunks/{fast-paths-VYOSIBKF.js → fast-paths-32N3ELI4.js} +2 -2
  205. package/dist/cli/chunks/{feature-flags-WCFUKHNQ.js → feature-flags-APJDQ4N7.js} +2 -2
  206. package/dist/cli/chunks/{feature-flags-UJRHFBRX.js → feature-flags-NAHKLDRN.js} +2 -2
  207. package/dist/cli/chunks/{file-discovery-JDGL4ZWS.js → file-discovery-YKVM3MDB.js} +2 -2
  208. package/dist/cli/chunks/{fleet-ROXVMZ2F.js → fleet-55M5CJS4.js} +3 -3
  209. package/dist/cli/chunks/{gnn-wrapper-NIO4ZCO3.js → gnn-wrapper-UD6E6S6Z.js} +2 -2
  210. package/dist/cli/chunks/{heartbeat-handler-PI42WD3C.js → heartbeat-handler-OYVW3VSC.js} +4 -4
  211. package/dist/cli/chunks/heartbeat-scheduler-33XX5XNQ.js +2 -0
  212. package/dist/cli/chunks/hnsw-adapter-XQPERX3H.js +2 -0
  213. package/dist/cli/chunks/hnsw-index-2GNXTWHH.js +2 -0
  214. package/dist/cli/chunks/{hnsw-legacy-bridge-YLC7SPK2.js → hnsw-legacy-bridge-HBYIS3ZW.js} +2 -2
  215. package/dist/cli/chunks/{hnswlib-node-LG6OS3B7.js → hnswlib-node-EQPM42OU.js} +2 -2
  216. package/dist/cli/chunks/{hooks-WVALP5GX.js → hooks-5ZSSJWO6.js} +10 -10
  217. package/dist/cli/chunks/hybrid-backend-CCF7URKI.js +2 -0
  218. package/dist/cli/chunks/{hypergraph-engine-GJEMW3EG.js → hypergraph-engine-XBGVQ4PD.js} +2 -2
  219. package/dist/cli/chunks/{hypergraph-handler-BLF6LXEV.js → hypergraph-handler-CAWAQ673.js} +3 -3
  220. package/dist/cli/chunks/impact-analyzer-HGKAZWIG.js +2 -0
  221. package/dist/cli/chunks/{init-handler-K25RWRYY.js → init-handler-PRHXSARK.js} +6 -6
  222. package/dist/cli/chunks/init-wizard-72MFBI3G.js +2 -0
  223. package/dist/cli/chunks/kernel-BRCBVMSK.js +2 -0
  224. package/dist/cli/chunks/{kilocode-installer-BXN6WZ7G.js → kilocode-installer-F7LXBM7I.js} +2 -2
  225. package/dist/cli/chunks/{kiro-installer-PM362DLN.js → kiro-installer-NM723ZRG.js} +2 -2
  226. package/dist/cli/chunks/knowledge-graph-DG44IPEI.js +2 -0
  227. package/dist/cli/chunks/{learning-CPERDDRG.js → learning-5QYIDHH3.js} +3 -3
  228. package/dist/cli/chunks/{llm-router-GOAV5FPI.js → llm-router-43HKWPSX.js} +4 -4
  229. package/dist/cli/chunks/llm-router-service-24KXFX32.js +2 -0
  230. package/dist/cli/chunks/{load-2BG6SHAK.js → load-5YDBWSCS.js} +2 -2
  231. package/dist/cli/chunks/load-test-N4TAYJY3.js +2 -0
  232. package/dist/cli/chunks/mcp-UMAPMNMY.js +2 -0
  233. package/dist/cli/chunks/{memory-4NHBYT6S.js → memory-FWCPCQFP.js} +6 -6
  234. package/dist/cli/chunks/memory-backend-NVYFYVAU.js +2 -0
  235. package/dist/cli/chunks/memory-handlers-UTWCNCHL.js +2 -0
  236. package/dist/cli/chunks/multi-model-executor-2XTBGLE4.js +14 -0
  237. package/dist/cli/chunks/{opencode-installer-ATZLLK74.js → opencode-installer-GIXOJ6NS.js} +2 -2
  238. package/dist/cli/chunks/orchestrator-VW6BKHLI.js +393 -0
  239. package/dist/cli/chunks/pattern-null-store-SBPNYDBR.js +2 -0
  240. package/dist/cli/chunks/{pattern-usage-recorder-7VE4XDAI.js → pattern-usage-recorder-7CEUC3J7.js} +2 -2
  241. package/dist/cli/chunks/{pipeline-LQZSNDD2.js → pipeline-IGUQPPPO.js} +2 -2
  242. package/dist/cli/chunks/platform-2P636I7B.js +2 -0
  243. package/dist/cli/chunks/{plugin-EJ6K2MGU.js → plugin-NY6SWDPE.js} +2 -2
  244. package/dist/cli/chunks/{prime-radiant-advanced-wasm-OIHTKJMN.js → prime-radiant-advanced-wasm-2UUDTIO2.js} +2 -2
  245. package/dist/cli/chunks/project-root-IOISG5KX.js +2 -0
  246. package/dist/cli/chunks/protocol-executor-IBYEII5Q.js +2 -0
  247. package/dist/cli/chunks/{protocol-handler-NRBROAU7.js → protocol-handler-ZTPCRQ5W.js} +2 -2
  248. package/dist/cli/chunks/{prove-EJOGEGD3.js → prove-SQX5A3IG.js} +2 -2
  249. package/dist/cli/chunks/qe-reasoning-bank-7IETWW6W.js +2 -0
  250. package/dist/cli/chunks/{quality-E55UC73D.js → quality-DROILKRY.js} +2 -2
  251. package/dist/cli/chunks/{quality-gate-OIQATNT3.js → quality-gate-PWKWDJY2.js} +3 -3
  252. package/dist/cli/chunks/queen-coordinator-NHUK2MWJ.js +2 -0
  253. package/dist/cli/chunks/real-embeddings-P5U3MGYC.js +2 -0
  254. package/dist/cli/chunks/{ref-validation-OPO6J7OL.js → ref-validation-KY73NQXD.js} +2 -2
  255. package/dist/cli/chunks/{roocode-installer-ODY5KRWU.js → roocode-installer-6JPPRB3W.js} +2 -2
  256. package/dist/cli/chunks/router-SRSO3IHF.js +2 -0
  257. package/dist/cli/chunks/routing-feedback-PASRE5HY.js +2 -0
  258. package/dist/cli/chunks/{routing-handler-KQM6VWLC.js → routing-handler-VTJIVFUO.js} +2 -2
  259. package/dist/cli/chunks/{ruvector-commands-U2GVV6PF.js → ruvector-commands-C6RPSJJO.js} +2 -2
  260. package/dist/cli/chunks/rvf-dual-writer-4M4J67OU.js +2 -0
  261. package/dist/cli/chunks/rvf-migration-adapter-TSXGT5LF.js +2 -0
  262. package/dist/cli/chunks/rvf-migration-coordinator-R53URRIO.js +2 -0
  263. package/dist/cli/chunks/rvf-native-adapter-MOF3E7BR.js +2 -0
  264. package/dist/cli/chunks/{rvf-store-integrity-KMIHD3LP.js → rvf-store-integrity-MMXN5TEJ.js} +2 -2
  265. package/dist/cli/chunks/safe-db-QJLFO33B.js +2 -0
  266. package/dist/cli/chunks/schedule-YIVXW5O2.js +2 -0
  267. package/dist/cli/chunks/scheduler-AON7DWSJ.js +2 -0
  268. package/dist/cli/chunks/{security-P5NM353C.js → security-3B3R2NL4.js} +3 -3
  269. package/dist/cli/chunks/shared-rvf-adapter-VIJB7JUS.js +2 -0
  270. package/dist/cli/chunks/{shared-rvf-dual-writer-2CSG7C4W.js → shared-rvf-dual-writer-UVWGDUWC.js} +2 -2
  271. package/dist/cli/chunks/sqlite-persistence-75VHKKQB.js +2 -0
  272. package/dist/cli/chunks/standalone-memory-M4LWAAYZ.js +2 -0
  273. package/dist/cli/chunks/{status-handler-6TU6O37R.js → status-handler-YYFV6OZL.js} +2 -2
  274. package/dist/cli/chunks/{structural-health-KBIJSTXJ.js → structural-health-27E6LLKB.js} +2 -2
  275. package/dist/cli/chunks/sync-26CEGSTC.js +2 -0
  276. package/dist/cli/chunks/{sync-LNHI5SB7.js → sync-J3LJ56WN.js} +2 -2
  277. package/dist/cli/chunks/task-handler-4MCEBQZL.js +54 -0
  278. package/dist/cli/chunks/task-handlers-GYBAWKE2.js +9 -0
  279. package/dist/cli/chunks/{test-DHAAI3DU.js → test-MPC5HRH5.js} +4 -4
  280. package/dist/cli/chunks/{test-scheduling-XDBZ3QC2.js → test-scheduling-ZJBFRZ3J.js} +3 -3
  281. package/dist/cli/chunks/token-bootstrap-2Y2XITBX.js +2 -0
  282. package/dist/cli/chunks/{token-usage-Q2YG5YQN.js → token-usage-3X5WMTG2.js} +2 -2
  283. package/dist/cli/chunks/{transformers-F5UQTQCY.js → transformers-MVL4C5IX.js} +2 -2
  284. package/dist/cli/chunks/tree-sitter-wasm-parser-SLW65ZFO.js +2 -0
  285. package/dist/cli/chunks/{types-JQ7EQO5Q.js → types-TG5P3CRS.js} +2 -2
  286. package/dist/cli/chunks/unified-memory-UCQ6AB32.js +2 -0
  287. package/dist/cli/chunks/unified-memory-hnsw-IXYUMKRR.js +2 -0
  288. package/dist/cli/chunks/unified-persistence-7E6JQ4FZ.js +2 -0
  289. package/dist/cli/chunks/{upgrade-TJRVGHGD.js → upgrade-ETBHDEPY.js} +2 -2
  290. package/dist/cli/chunks/{validate-BWPCVHBN.js → validate-C2A73LZK.js} +2 -2
  291. package/dist/cli/chunks/{validate-swarm-QVVKCQLP.js → validate-swarm-67XN42ML.js} +2 -2
  292. package/dist/cli/chunks/{vibium-ZFATIWHO.js → vibium-NILGKHLN.js} +2 -2
  293. package/dist/cli/chunks/visual-security-4VZXPEVG.js +2 -0
  294. package/dist/cli/chunks/{web-tree-sitter-KPLY7ONR.js → web-tree-sitter-USJN77P4.js} +2 -2
  295. package/dist/cli/chunks/{windsurf-installer-H7XM7ISA.js → windsurf-installer-5GGZXGJW.js} +2 -2
  296. package/dist/cli/chunks/witness-chain-IWS5ZHHL.js +2 -0
  297. package/dist/cli/chunks/witness-chain-JQA2VPZI.js +2 -0
  298. package/dist/cli/chunks/witness-chain-repair-4UA7IPS3.js +2 -0
  299. package/dist/cli/chunks/witness-chain-verifier-3GEADWPE.js +2 -0
  300. package/dist/cli/chunks/{witness-key-manager-DFRL42GE.js → witness-key-manager-ZWEIK3VJ.js} +2 -2
  301. package/dist/cli/chunks/{workflow-2ZQO6WYI.js → workflow-KHMVVBBA.js} +4 -4
  302. package/dist/cli/chunks/workflow-orchestrator-GI5NQH7C.js +2 -0
  303. package/dist/cli/chunks/wrappers-N6XIK5PT.js +2 -0
  304. package/dist/cli/commands/audit.d.ts +20 -2
  305. package/dist/cli/commands/audit.js +158 -16
  306. package/dist/cli/commands/claude-flow-setup.js +5 -4
  307. package/dist/cli/commands/mcp.js +6 -0
  308. package/dist/cli/commands/memory.d.ts +1 -1
  309. package/dist/cli/commands/memory.js +8 -8
  310. package/dist/cli/commands/platform.js +15 -2
  311. package/dist/cli/commands/upgrade.d.ts +3 -3
  312. package/dist/cli/commands/upgrade.js +3 -3
  313. package/dist/cli/handlers/init-handler.d.ts +10 -0
  314. package/dist/cli/handlers/task-handler.js +24 -3
  315. package/dist/cli/helpers/standalone-memory.d.ts +12 -0
  316. package/dist/cli/helpers/standalone-memory.js +46 -0
  317. package/dist/cli/index.js +39 -42
  318. package/dist/cli/log-gate.d.ts +66 -0
  319. package/dist/cli/log-gate.js +170 -0
  320. package/dist/init/agents-installer.d.ts +4 -0
  321. package/dist/init/agents-installer.js +24 -11
  322. package/dist/init/codex-installer.js +22 -8
  323. package/dist/init/idempotent-write.d.ts +53 -0
  324. package/dist/init/idempotent-write.js +160 -0
  325. package/dist/init/orchestrator.js +1 -0
  326. package/dist/init/phases/05-learning.js +3 -1
  327. package/dist/init/phases/07-hooks.js +32 -16
  328. package/dist/init/phases/08-mcp.js +4 -2
  329. package/dist/init/phases/09-assets.d.ts +10 -0
  330. package/dist/init/phases/09-assets.js +3 -0
  331. package/dist/init/phases/10-workers.js +7 -5
  332. package/dist/init/phases/12-verification.js +7 -2
  333. package/dist/init/project-analyzer.d.ts +9 -0
  334. package/dist/init/project-analyzer.js +20 -1
  335. package/dist/init/self-configurator.d.ts +5 -3
  336. package/dist/init/self-configurator.js +18 -29
  337. package/dist/init/skills-installer.js +4 -2
  338. package/dist/init/token-bootstrap.d.ts +1 -1
  339. package/dist/init/token-bootstrap.js +12 -2
  340. package/dist/init/types.d.ts +16 -0
  341. package/dist/init/types.js +20 -24
  342. package/dist/integrations/coherence/coherence-service.js +84 -24
  343. package/dist/integrations/coherence/vote-tally.d.ts +38 -0
  344. package/dist/integrations/coherence/vote-tally.js +39 -0
  345. package/dist/integrations/ruvector/brain-exporter.js +17 -0
  346. package/dist/integrations/ruvector/brain-import-audit.d.ts +20 -0
  347. package/dist/integrations/ruvector/brain-import-audit.js +22 -0
  348. package/dist/integrations/ruvector/brain-rvf-exporter.js +16 -0
  349. package/dist/integrations/ruvector/brain-shared.js +1 -1
  350. package/dist/integrations/ruvector/rvf-dual-writer.js +6 -1
  351. package/dist/integrations/ruvector/shared-rvf-adapter.d.ts +23 -0
  352. package/dist/integrations/ruvector/shared-rvf-adapter.js +24 -0
  353. package/dist/kernel/hybrid-backend.d.ts +6 -0
  354. package/dist/kernel/hybrid-backend.js +18 -0
  355. package/dist/kernel/kernel.js +12 -16
  356. package/dist/kernel/project-root.d.ts +1 -1
  357. package/dist/kernel/project-root.js +24 -3
  358. package/dist/learning/embedder-identity-store.js +4 -3
  359. package/dist/learning/pattern-store.d.ts +11 -0
  360. package/dist/learning/pattern-store.js +31 -9
  361. package/dist/learning/qe-patterns.d.ts +6 -0
  362. package/dist/learning/qe-patterns.js +7 -1
  363. package/dist/learning/qe-reasoning-bank.js +3 -0
  364. package/dist/learning/real-embeddings.d.ts +8 -0
  365. package/dist/learning/real-embeddings.js +16 -0
  366. package/dist/learning/rvf-pattern-store.js +30 -10
  367. package/dist/learning/sqlite-persistence.d.ts +8 -1
  368. package/dist/learning/sqlite-persistence.js +49 -9
  369. package/dist/logging/console-logger.d.ts +2 -5
  370. package/dist/logging/console-logger.js +10 -46
  371. package/dist/logging/index.d.ts +2 -0
  372. package/dist/logging/index.js +1 -0
  373. package/dist/logging/redaction.d.ts +27 -0
  374. package/dist/logging/redaction.js +170 -0
  375. package/dist/mcp/bundle.js +463 -449
  376. package/dist/mcp/entry.js +2 -0
  377. package/dist/mcp/handlers/core-handlers.js +5 -4
  378. package/dist/mcp/handlers/memory-handlers.d.ts +6 -1
  379. package/dist/mcp/handlers/memory-handlers.js +44 -22
  380. package/dist/mcp/handlers/task-handlers.js +14 -1
  381. package/dist/mcp/protocol-server.js +3 -1
  382. package/dist/mcp/services/session-store.js +5 -1
  383. package/dist/mcp/tools/base.d.ts +9 -2
  384. package/dist/mcp/tools/base.js +7 -0
  385. package/dist/mcp/tools/coherence/consensus.js +51 -2
  386. package/dist/mcp/tools/planning/goap-plan.d.ts +20 -7
  387. package/dist/mcp/tools/planning/goap-plan.js +92 -20
  388. package/dist/mcp/tools/planning/goap-status.d.ts +37 -12
  389. package/dist/mcp/tools/planning/goap-status.js +52 -23
  390. package/dist/mcp/tools/planning/world-state.d.ts +101 -0
  391. package/dist/mcp/tools/planning/world-state.js +274 -0
  392. package/dist/mcp/types.d.ts +4 -2
  393. package/dist/planning/goap-planner.d.ts +60 -4
  394. package/dist/planning/goap-planner.js +218 -60
  395. package/dist/planning/index.d.ts +1 -1
  396. package/dist/planning/index.js +1 -1
  397. package/dist/planning/plan-executor.d.ts +20 -1
  398. package/dist/planning/plan-executor.js +209 -100
  399. package/dist/planning/types.d.ts +16 -0
  400. package/dist/planning/types.js +17 -0
  401. package/dist/plugins/cache.d.ts +2 -0
  402. package/dist/plugins/cache.js +15 -2
  403. package/dist/plugins/lifecycle.js +15 -2
  404. package/dist/plugins/manifest.js +7 -5
  405. package/dist/plugins/resolver.d.ts +13 -22
  406. package/dist/plugins/resolver.js +169 -61
  407. package/dist/plugins/version-policy.d.ts +13 -0
  408. package/dist/plugins/version-policy.js +18 -0
  409. package/dist/shared/types/index.d.ts +6 -0
  410. package/dist/shared/types/index.js +8 -0
  411. package/package.json +2 -1
  412. package/dist/cli/chunks/adapter-TNNNJRDG.js +0 -2
  413. package/dist/cli/chunks/agent-booster-wasm-5PC7D2FW.js +0 -2
  414. package/dist/cli/chunks/aqe-learning-engine-5ZRMYJLB.js +0 -2
  415. package/dist/cli/chunks/audit-YSGA7UWT.js +0 -3
  416. package/dist/cli/chunks/base-KWZHOPSH.js +0 -2
  417. package/dist/cli/chunks/brain-handler-ET6YAP4B.js +0 -90
  418. package/dist/cli/chunks/browser-workflow-2FZTKDUL.js +0 -2
  419. package/dist/cli/chunks/chunk-33YYYWBQ.js +0 -4
  420. package/dist/cli/chunks/chunk-5Z6XZV7K.js +0 -65
  421. package/dist/cli/chunks/chunk-6J62K3SW.js +0 -2
  422. package/dist/cli/chunks/chunk-6TPKK7LD.js +0 -15
  423. package/dist/cli/chunks/chunk-DEYLEDJN.js +0 -27
  424. package/dist/cli/chunks/chunk-J6GNQS62.js +0 -5
  425. package/dist/cli/chunks/chunk-KGT36Z42.js +0 -14
  426. package/dist/cli/chunks/chunk-NA7B2QYB.js +0 -2
  427. package/dist/cli/chunks/chunk-NDPFGIMJ.js +0 -13
  428. package/dist/cli/chunks/chunk-OBAP2TXZ.js +0 -2
  429. package/dist/cli/chunks/chunk-PEPFCPES.js +0 -2
  430. package/dist/cli/chunks/chunk-T6BVLVI5.js +0 -2
  431. package/dist/cli/chunks/chunk-TT23RRB7.js +0 -2
  432. package/dist/cli/chunks/chunk-XC7DYDSY.js +0 -180
  433. package/dist/cli/chunks/chunk-XWMZ6D6N.js +0 -2
  434. package/dist/cli/chunks/chunk-Y3MW3YBC.js +0 -3
  435. package/dist/cli/chunks/claude-flow-setup-6JKMBPGU.js +0 -2
  436. package/dist/cli/chunks/client-7E4LM2WW.js +0 -2
  437. package/dist/cli/chunks/codex-installer-CQ24DTP5.js +0 -14
  438. package/dist/cli/chunks/core-handlers-IFG3757P.js +0 -2
  439. package/dist/cli/chunks/cross-domain-router-EK7W4PGP.js +0 -2
  440. package/dist/cli/chunks/domain-transfer-KQJRUPXA.js +0 -2
  441. package/dist/cli/chunks/dream-NFSCSLY7.js +0 -2
  442. package/dist/cli/chunks/embed-and-insert-pattern-ZPAG7235.js +0 -3
  443. package/dist/cli/chunks/heartbeat-scheduler-ZATCDJDK.js +0 -2
  444. package/dist/cli/chunks/hnsw-adapter-WXQABRCA.js +0 -2
  445. package/dist/cli/chunks/hnsw-index-TPSWLEA5.js +0 -2
  446. package/dist/cli/chunks/impact-analyzer-HNIU45P5.js +0 -2
  447. package/dist/cli/chunks/init-wizard-JUIPBMHG.js +0 -2
  448. package/dist/cli/chunks/kernel-5BOZQ754.js +0 -2
  449. package/dist/cli/chunks/knowledge-graph-EWDAENWM.js +0 -2
  450. package/dist/cli/chunks/llm-router-service-3YT7JGBS.js +0 -2
  451. package/dist/cli/chunks/load-test-BP2CPLIV.js +0 -2
  452. package/dist/cli/chunks/mcp-5TTB37DC.js +0 -2
  453. package/dist/cli/chunks/memory-backend-4PYQBPRM.js +0 -2
  454. package/dist/cli/chunks/memory-handlers-2B27NITS.js +0 -2
  455. package/dist/cli/chunks/multi-model-executor-KCWSGCDT.js +0 -14
  456. package/dist/cli/chunks/orchestrator-RKB7XJRG.js +0 -393
  457. package/dist/cli/chunks/pattern-null-store-OYOQOV2O.js +0 -2
  458. package/dist/cli/chunks/platform-OD5H5U6G.js +0 -2
  459. package/dist/cli/chunks/protocol-executor-3ATJTXWG.js +0 -2
  460. package/dist/cli/chunks/qe-reasoning-bank-LLMYZT4X.js +0 -2
  461. package/dist/cli/chunks/queen-coordinator-RN7L6KG5.js +0 -2
  462. package/dist/cli/chunks/real-embeddings-FPFFNOSZ.js +0 -2
  463. package/dist/cli/chunks/router-MDHITQ2V.js +0 -2
  464. package/dist/cli/chunks/routing-feedback-5XLNJ3Y3.js +0 -2
  465. package/dist/cli/chunks/rvf-dual-writer-JBW4O3II.js +0 -2
  466. package/dist/cli/chunks/rvf-migration-adapter-BPPQL4XJ.js +0 -2
  467. package/dist/cli/chunks/rvf-migration-coordinator-V2GHCJKN.js +0 -2
  468. package/dist/cli/chunks/rvf-native-adapter-S4562CG5.js +0 -2
  469. package/dist/cli/chunks/safe-db-FIRHSXVF.js +0 -2
  470. package/dist/cli/chunks/schedule-RVXFB4HK.js +0 -2
  471. package/dist/cli/chunks/scheduler-IKKAMAOO.js +0 -2
  472. package/dist/cli/chunks/shared-rvf-adapter-LVIUOO4S.js +0 -2
  473. package/dist/cli/chunks/sqlite-persistence-SQ3HCUQ7.js +0 -2
  474. package/dist/cli/chunks/sync-UHOX6RJW.js +0 -2
  475. package/dist/cli/chunks/task-handler-AVDHMLGI.js +0 -49
  476. package/dist/cli/chunks/task-handlers-KYK4VTRA.js +0 -9
  477. package/dist/cli/chunks/token-bootstrap-GUTTLPZX.js +0 -2
  478. package/dist/cli/chunks/tree-sitter-wasm-parser-DEGOHS6F.js +0 -2
  479. package/dist/cli/chunks/unified-memory-CXHLHB5I.js +0 -2
  480. package/dist/cli/chunks/unified-memory-hnsw-I7WAE54M.js +0 -2
  481. package/dist/cli/chunks/unified-persistence-6CPF65WI.js +0 -2
  482. package/dist/cli/chunks/visual-security-GNPHME5H.js +0 -2
  483. package/dist/cli/chunks/witness-chain-RRN6NDCH.js +0 -2
  484. package/dist/cli/chunks/witness-chain-VT4UHHBR.js +0 -2
  485. package/dist/cli/chunks/workflow-orchestrator-DB3HIECD.js +0 -2
  486. package/dist/cli/chunks/wrappers-SUS6XEJD.js +0 -2
@@ -0,0 +1,160 @@
1
+ /**
2
+ * Idempotent file writers for `aqe init` (#778).
3
+ *
4
+ * A repeat `aqe init` on an unchanged project must be a byte-stable
5
+ * convergence step: files whose content would not change are left alone (no
6
+ * rewrite, so the mtime is preserved too), and volatile fields such as
7
+ * generation timestamps are carried over from the existing file unless
8
+ * something else in that file actually changed.
9
+ */
10
+ import { copyFileSync, existsSync, readFileSync, writeFileSync } from 'fs';
11
+ import { safeJsonParse } from '../shared/safe-json.js';
12
+ /**
13
+ * Write `content` to `path` only when the bytes on disk differ.
14
+ * @returns true when the file was written.
15
+ */
16
+ export function writeFileIfChanged(path, content) {
17
+ const next = typeof content === 'string' ? Buffer.from(content, 'utf-8') : content;
18
+ try {
19
+ if (existsSync(path) && readFileSync(path).equals(next))
20
+ return false;
21
+ }
22
+ catch {
23
+ // Unreadable target — fall through and (re)write it.
24
+ }
25
+ if (typeof content === 'string')
26
+ writeFileSync(path, content, 'utf-8');
27
+ else
28
+ writeFileSync(path, content);
29
+ return true;
30
+ }
31
+ /**
32
+ * Copy `src` to `dest` only when `dest` is missing or its bytes differ.
33
+ * Uses copyFileSync for the actual copy so file-mode semantics are unchanged.
34
+ * @returns true when the file was copied.
35
+ */
36
+ export function copyFileIfChanged(src, dest) {
37
+ try {
38
+ if (existsSync(dest) && readFileSync(dest).equals(readFileSync(src)))
39
+ return false;
40
+ }
41
+ catch {
42
+ // Unreadable target — fall through and copy.
43
+ }
44
+ copyFileSync(src, dest);
45
+ return true;
46
+ }
47
+ /**
48
+ * Write a text file whose content embeds a volatile line (e.g. a generation
49
+ * timestamp). When the existing file matches `content` on every line except
50
+ * the lines matching `volatileLine`, the file is left untouched.
51
+ * @returns true when the file was written.
52
+ */
53
+ export function writeTextIfChangedIgnoring(path, content, volatileLine) {
54
+ try {
55
+ if (existsSync(path)) {
56
+ const strip = (text) => text.split('\n').filter((line) => !volatileLine.test(line)).join('\n');
57
+ if (strip(readFileSync(path, 'utf-8')) === strip(content))
58
+ return false;
59
+ }
60
+ }
61
+ catch {
62
+ // Unreadable target — fall through and write.
63
+ }
64
+ writeFileSync(path, content, 'utf-8');
65
+ return true;
66
+ }
67
+ /** The `*Generated by AQE v3 init on <ISO>*` footer of generated index docs. */
68
+ export const GENERATED_ON_LINE = /^\*Generated by AQE v3 init on [^*]+\*$/;
69
+ function isPlainObject(value) {
70
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
71
+ }
72
+ /** JSON serialization with object keys sorted, for order-insensitive comparison. */
73
+ export function canonicalJson(value) {
74
+ return JSON.stringify(value, (_key, v) => {
75
+ if (!isPlainObject(v))
76
+ return v;
77
+ const sorted = {};
78
+ for (const k of Object.keys(v).sort())
79
+ sorted[k] = v[k];
80
+ return sorted;
81
+ });
82
+ }
83
+ /** Deep structural equality of two JSON values, ignoring object key order. */
84
+ export function jsonEquivalent(a, b) {
85
+ return canonicalJson(a) === canonicalJson(b);
86
+ }
87
+ function getPath(obj, path) {
88
+ let cur = obj;
89
+ for (const key of path) {
90
+ if (!isPlainObject(cur))
91
+ return undefined;
92
+ cur = cur[key];
93
+ }
94
+ return cur;
95
+ }
96
+ function setPath(obj, path, value) {
97
+ let cur = obj;
98
+ for (const key of path.slice(0, -1)) {
99
+ if (!isPlainObject(cur[key]))
100
+ return;
101
+ cur = cur[key];
102
+ }
103
+ const last = path[path.length - 1];
104
+ if (last in cur)
105
+ cur[last] = value;
106
+ }
107
+ /**
108
+ * Carry volatile fields (timestamps) over from `previous` into `next` when
109
+ * `next` is otherwise identical to `previous`.
110
+ *
111
+ * - Unchanged (apart from the volatile fields): `next` is mutated to hold the
112
+ * previous values and `false` is returned — the caller should not write.
113
+ * - Changed, or no previous document: `next` keeps its fresh values and
114
+ * `true` is returned — the caller should write.
115
+ */
116
+ export function stabilizeVolatileFields(previous, next, volatilePaths) {
117
+ if (!isPlainObject(previous))
118
+ return true;
119
+ const candidate = JSON.parse(JSON.stringify(next));
120
+ for (const path of volatilePaths) {
121
+ const prevValue = getPath(previous, path);
122
+ if (prevValue !== undefined && getPath(candidate, path) !== undefined) {
123
+ setPath(candidate, path, prevValue);
124
+ }
125
+ }
126
+ if (!jsonEquivalent(previous, candidate))
127
+ return true;
128
+ for (const path of volatilePaths) {
129
+ const prevValue = getPath(previous, path);
130
+ if (prevValue !== undefined && getPath(next, path) !== undefined)
131
+ setPath(next, path, prevValue);
132
+ }
133
+ return false;
134
+ }
135
+ /** Read and parse a JSON file, or return undefined when missing/unparseable. */
136
+ export function readJsonIfPresent(path) {
137
+ if (!existsSync(path))
138
+ return undefined;
139
+ try {
140
+ return safeJsonParse(readFileSync(path, 'utf-8'));
141
+ }
142
+ catch {
143
+ return undefined;
144
+ }
145
+ }
146
+ /**
147
+ * Write a generated JSON document (2-space indent) unless it is equivalent to
148
+ * the one already on disk, preserving the existing values of `volatilePaths`
149
+ * (e.g. `[['createdAt']]`) when nothing else changed.
150
+ * @returns true when the file was written.
151
+ */
152
+ export function writeJsonIfChanged(path, doc, volatilePaths = []) {
153
+ const previous = readJsonIfPresent(path);
154
+ if (previous !== undefined && !stabilizeVolatileFields(previous, doc, volatilePaths)) {
155
+ return false;
156
+ }
157
+ writeFileSync(path, JSON.stringify(doc, null, 2), 'utf-8');
158
+ return true;
159
+ }
160
+ //# sourceMappingURL=idempotent-write.js.map
@@ -158,6 +158,7 @@ export class ModularInitOrchestrator {
158
158
  claudeMdGenerated: claudeMdResult?.data?.generated ?? false,
159
159
  workersStarted: workersResult?.data?.workersConfigured ?? 0,
160
160
  codexGuidance: assetsResult?.data?.codexGuidance,
161
+ codexComponents: assetsResult?.data?.codexComponents,
161
162
  },
162
163
  totalDurationMs: Date.now() - startTime,
163
164
  timestamp: new Date(),
@@ -3,6 +3,7 @@
3
3
  * Initializes the learning system with HNSW index and pattern storage
4
4
  */
5
5
  import { existsSync, mkdirSync, writeFileSync } from 'fs';
6
+ import { writeJsonIfChanged } from '../idempotent-write.js';
6
7
  import { join } from 'path';
7
8
  import { BasePhase, } from './phase-interface.js';
8
9
  import { getAQEVersion } from '../types.js';
@@ -54,7 +55,8 @@ export class LearningPhase extends BasePhase {
54
55
  hnswIndexPath: join(hnswDir, 'index.bin'),
55
56
  initialized: new Date().toISOString(),
56
57
  };
57
- writeFileSync(learningConfigPath, JSON.stringify(learningConfig, null, 2), 'utf-8');
58
+ // #778: leave an equivalent file (and its `initialized` stamp) untouched.
59
+ writeJsonIfChanged(learningConfigPath, learningConfig, [['initialized']]);
58
60
  // Load pre-trained patterns if available and not skipped
59
61
  let patternsLoaded = 0;
60
62
  if (config.learning.pretrainedPatterns && !options.skipPatterns) {
@@ -14,7 +14,10 @@ import { safeJsonParse } from '../../shared/safe-json.js';
14
14
  const __filename = fileURLToPath(import.meta.url);
15
15
  const __dirname = dirname(__filename);
16
16
  import { isAqeHookEntry, mergeHooksSmart, generateAqeEnvVars, generateV3SettingsSections, applyV3Sections, mergeAqeEnv, backupSettingsFile, } from '../settings-merge.js';
17
+ import { copyFileIfChanged, stabilizeVolatileFields } from '../idempotent-write.js';
17
18
  import { BasePhase, } from './phase-interface.js';
19
+ /** settings.json fields that change on every run without a real change (#778). */
20
+ const SETTINGS_VOLATILE_FIELDS = [['aqe', 'initialized']];
18
21
  /**
19
22
  * Hooks phase - configures Claude Code hooks
20
23
  */
@@ -53,13 +56,16 @@ export class HooksPhase extends BasePhase {
53
56
  if (!existsSync(hooksDir)) {
54
57
  mkdirSync(hooksDir, { recursive: true });
55
58
  }
56
- // Load existing settings
59
+ // Load existing settings. `previousSettings` is an untouched parse used to
60
+ // decide whether this run changes anything (#778); `settings` is mutated.
57
61
  const settingsPath = join(claudeDir, 'settings.json');
58
62
  let settings = {};
63
+ let previousSettings;
59
64
  if (existsSync(settingsPath)) {
60
65
  try {
61
66
  const content = readFileSync(settingsPath, 'utf-8');
62
67
  settings = safeJsonParse(content);
68
+ previousSettings = safeJsonParse(content);
63
69
  }
64
70
  catch {
65
71
  settings = {};
@@ -98,13 +104,23 @@ export class HooksPhase extends BasePhase {
98
104
  existingMcp.push('agentic-qe');
99
105
  }
100
106
  settings.enabledMcpjsonServers = existingMcp;
101
- // Back up the pristine original settings.json before writing (like CLAUDE.md)
102
- const backupPath = backupSettingsFile(settingsPath);
103
- if (backupPath) {
104
- context.services.log(` Backup created: ${backupPath}`);
107
+ // Converge instead of rewriting (#778): keep the original `aqe.initialized`
108
+ // stamp and skip the write (and the backup) entirely when the merged
109
+ // settings are equivalent to what is already on disk. Any real change —
110
+ // a version upgrade, a restored AQE hook, a new flag — still writes, and
111
+ // then records a fresh initialization timestamp.
112
+ const settingsChanged = stabilizeVolatileFields(previousSettings, settings, SETTINGS_VOLATILE_FIELDS);
113
+ if (settingsChanged) {
114
+ // Back up the pristine original settings.json before writing (like CLAUDE.md)
115
+ const backupPath = backupSettingsFile(settingsPath);
116
+ if (backupPath) {
117
+ context.services.log(` Backup created: ${backupPath}`);
118
+ }
119
+ writeFileSync(settingsPath, JSON.stringify(settings, null, 2), 'utf-8');
120
+ }
121
+ else {
122
+ context.services.log(' Settings unchanged — .claude/settings.json left as-is');
105
123
  }
106
- // Write settings
107
- writeFileSync(settingsPath, JSON.stringify(settings, null, 2), 'utf-8');
108
124
  // Write README and install hook assets (bridge script, cross-phase memory)
109
125
  this.writeHooksReadme(hooksDir, hookTypes);
110
126
  this.installHookAssets(hooksDir, context);
@@ -250,9 +266,9 @@ export class HooksPhase extends BasePhase {
250
266
  ];
251
267
  for (const src of sourcePaths) {
252
268
  if (existsSync(src) && src !== destPath) {
253
- const { copyFileSync } = require('fs');
254
- copyFileSync(src, destPath);
255
- context.services.log(' Installed brain-checkpoint.cjs (copied)');
269
+ if (copyFileIfChanged(src, destPath)) {
270
+ context.services.log(' Installed brain-checkpoint.cjs (copied)');
271
+ }
256
272
  return;
257
273
  }
258
274
  }
@@ -280,9 +296,9 @@ export class HooksPhase extends BasePhase {
280
296
  ];
281
297
  for (const src of sourcePaths) {
282
298
  if (existsSync(src) && src !== destPath) {
283
- const { copyFileSync } = require('fs');
284
- copyFileSync(src, destPath);
285
- context.services.log(' Installed statusline-v3.cjs (copied)');
299
+ if (copyFileIfChanged(src, destPath)) {
300
+ context.services.log(' Installed statusline-v3.cjs (copied)');
301
+ }
286
302
  return;
287
303
  }
288
304
  }
@@ -312,9 +328,9 @@ export class HooksPhase extends BasePhase {
312
328
  ];
313
329
  for (const src of sourcePaths) {
314
330
  if (existsSync(src) && src !== destPath) {
315
- const { copyFileSync } = require('fs');
316
- copyFileSync(src, destPath);
317
- context.services.log(' Installed aqe-hook.cjs (copied)');
331
+ if (copyFileIfChanged(src, destPath)) {
332
+ context.services.log(' Installed aqe-hook.cjs (copied)');
333
+ }
318
334
  return;
319
335
  }
320
336
  }
@@ -11,7 +11,8 @@
11
11
  * walks up looking for .agentic-qe/, .git/, or package.json. This
12
12
  * makes the config portable across machines, devcontainers, and CI.
13
13
  */
14
- import { existsSync, readFileSync, writeFileSync } from 'fs';
14
+ import { existsSync, readFileSync } from 'fs';
15
+ import { writeFileIfChanged } from '../idempotent-write.js';
15
16
  import { join } from 'path';
16
17
  import { safeJsonParse } from '../../shared/safe-json.js';
17
18
  import { BasePhase, } from './phase-interface.js';
@@ -85,7 +86,8 @@ export class MCPPhase extends BasePhase {
85
86
  }
86
87
  const rootServers = rootMcpConfig.mcpServers;
87
88
  rootServers['agentic-qe'] = aqeServerConfig;
88
- writeFileSync(rootMcpPath, JSON.stringify(rootMcpConfig, null, 2), 'utf-8');
89
+ // #778: no rewrite (mtime churn) when the merged config is unchanged.
90
+ writeFileIfChanged(rootMcpPath, JSON.stringify(rootMcpConfig, null, 2));
89
91
  context.services.log(` MCP config: ${rootMcpPath}`);
90
92
  context.services.log(` Server: agentic-qe`);
91
93
  if (dbFree) {
@@ -20,6 +20,16 @@ export interface AssetsResult {
20
20
  policy: 'full' | 'compact' | 'none';
21
21
  ownedBytes: number;
22
22
  };
23
+ codexComponents?: {
24
+ hooks: {
25
+ status: string;
26
+ error?: string;
27
+ };
28
+ skills: {
29
+ status: string;
30
+ error?: string;
31
+ };
32
+ };
23
33
  }
24
34
  /**
25
35
  * Assets phase - installs skills and agents
@@ -37,6 +37,7 @@ export class AssetsPhase extends BasePhase {
37
37
  let kiroSkills = 0;
38
38
  let kiroHooks = 0;
39
39
  let codexGuidance;
40
+ let codexComponents;
40
41
  if (options.upgrade) {
41
42
  context.services.log(` Upgrade mode: overwriting existing files`);
42
43
  }
@@ -303,6 +304,7 @@ export class AssetsPhase extends BasePhase {
303
304
  });
304
305
  const res = await installer.install();
305
306
  codexGuidance = { policy: res.guidancePolicy, ownedBytes: res.ownedGuidanceBytes };
307
+ codexComponents = { hooks: res.components.hooks, skills: res.components.skills };
306
308
  if (res.mcpConfigured)
307
309
  platformsConfigured.push('codex');
308
310
  if (res.errors.length > 0)
@@ -361,6 +363,7 @@ export class AssetsPhase extends BasePhase {
361
363
  platformsConfigured,
362
364
  browserEngine,
363
365
  codexGuidance,
366
+ codexComponents,
364
367
  };
365
368
  }
366
369
  /**
@@ -2,7 +2,8 @@
2
2
  * Phase 10: Workers
3
3
  * Configures background workers for continuous monitoring
4
4
  */
5
- import { existsSync, mkdirSync, writeFileSync } from 'fs';
5
+ import { existsSync, mkdirSync } from 'fs';
6
+ import { writeFileIfChanged, writeJsonIfChanged } from '../idempotent-write.js';
6
7
  import { join, dirname } from 'path';
7
8
  import { fileURLToPath } from 'url';
8
9
  import { BasePhase, } from './phase-interface.js';
@@ -86,7 +87,8 @@ export class WorkersPhase extends BasePhase {
86
87
  createdAt: new Date().toISOString(),
87
88
  daemonPid: null,
88
89
  };
89
- writeFileSync(registryPath, JSON.stringify(registryData, null, 2), 'utf-8');
90
+ // #778: an unchanged registry keeps its bytes and original createdAt.
91
+ writeJsonIfChanged(registryPath, registryData, [['createdAt']]);
90
92
  // Write individual worker configs
91
93
  for (const workerName of config.workers.enabled) {
92
94
  const workerConfigPath = join(workersDir, `${workerName}.json`);
@@ -98,7 +100,7 @@ export class WorkersPhase extends BasePhase {
98
100
  dataDir: join(projectRoot, '.agentic-qe', 'data'),
99
101
  createdAt: new Date().toISOString(),
100
102
  };
101
- writeFileSync(workerConfigPath, JSON.stringify(workerConfig, null, 2), 'utf-8');
103
+ writeJsonIfChanged(workerConfigPath, workerConfig, [['createdAt']]);
102
104
  }
103
105
  // Write cross-platform daemon startup script
104
106
  const daemonScriptPath = join(workersDir, 'start-daemon.cjs');
@@ -178,7 +180,7 @@ console.log('AQE v3 Worker Daemon started (PID: ' + child.pid + ')');
178
180
  console.log('Log file: ' + logFile);
179
181
  console.log('To stop: node ' + join(workersDir, 'stop-daemon.cjs'));
180
182
  `;
181
- writeFileSync(daemonScriptPath, daemonScript);
183
+ writeFileIfChanged(daemonScriptPath, daemonScript);
182
184
  // Also write a cross-platform stop script
183
185
  const stopScriptPath = join(workersDir, 'stop-daemon.cjs');
184
186
  const stopScript = `#!/usr/bin/env node
@@ -205,7 +207,7 @@ try {
205
207
  try { unlinkSync(pidFile); } catch {}
206
208
  }
207
209
  `;
208
- writeFileSync(stopScriptPath, stopScript);
210
+ writeFileIfChanged(stopScriptPath, stopScript);
209
211
  context.services.log(` Workers dir: ${workersDir}`);
210
212
  context.services.log(` Workers: ${config.workers.enabled.join(', ')}`);
211
213
  context.services.log(` Registry: ${registryPath}`);
@@ -7,9 +7,12 @@
7
7
  */
8
8
  import { existsSync, readFileSync } from 'fs';
9
9
  import { join, dirname } from 'path';
10
- import { mkdirSync, writeFileSync } from 'fs';
10
+ import { mkdirSync } from 'fs';
11
+ import { writeTextIfChangedIgnoring } from '../idempotent-write.js';
11
12
  import { BasePhase, } from './phase-interface.js';
12
13
  import { openDatabase } from '../../shared/safe-db.js';
14
+ /** The `# <ISO timestamp>` header line written by configToYAML(). */
15
+ const CONFIG_TIMESTAMP_LINE = /^# \d{4}-\d{2}-\d{2}T[\d:.]+Z$/;
13
16
  /**
14
17
  * Verification phase - verifies installation and writes markers
15
18
  */
@@ -135,7 +138,9 @@ export class VerificationPhase extends BasePhase {
135
138
  }
136
139
  }
137
140
  const yaml = this.configToYAML(config);
138
- writeFileSync(configPath, yaml, 'utf-8');
141
+ // #778: the header carries a generation timestamp; ignore that line when
142
+ // deciding whether the file actually changed, so a repeat init is a no-op.
143
+ writeTextIfChangedIgnoring(configPath, yaml, CONFIG_TIMESTAMP_LINE);
139
144
  }
140
145
  /**
141
146
  * Load existing config.yaml and parse it
@@ -5,6 +5,15 @@
5
5
  * Analyzes a project to detect frameworks, languages, tests, and configuration.
6
6
  */
7
7
  import type { ProjectAnalysis, DetectedFramework, DetectedLanguage, ExistingTests, CodeComplexity, CoverageMetrics } from './types.js';
8
+ /**
9
+ * Directories never scanned by the analyzer: build/vendor output plus the
10
+ * tool-generated trees that `aqe init` itself (and the agent platforms it
11
+ * configures) writes into the project. Scanning AQE's own installed skills,
12
+ * helpers and hook scripts made a repeat `aqe init` "see" a different project
13
+ * than the first run (new languages, tests, complexity) and silently change
14
+ * the generated configuration (#778).
15
+ */
16
+ export declare const ANALYZER_EXCLUDED_DIRS: readonly string[];
8
17
  export declare class ProjectAnalyzer {
9
18
  private projectRoot;
10
19
  constructor(projectRoot: string);
@@ -165,8 +165,27 @@ function getPackageVersion(root, packageName) {
165
165
  return undefined;
166
166
  return pkg.devDependencies?.[packageName] || pkg.dependencies?.[packageName];
167
167
  }
168
+ /**
169
+ * Directories never scanned by the analyzer: build/vendor output plus the
170
+ * tool-generated trees that `aqe init` itself (and the agent platforms it
171
+ * configures) writes into the project. Scanning AQE's own installed skills,
172
+ * helpers and hook scripts made a repeat `aqe init` "see" a different project
173
+ * than the first run (new languages, tests, complexity) and silently change
174
+ * the generated configuration (#778).
175
+ */
176
+ export const ANALYZER_EXCLUDED_DIRS = [
177
+ // build / vendor output
178
+ 'node_modules', '.git', 'dist', 'build', 'coverage', '.next', '__pycache__',
179
+ // AQE-generated state and assets
180
+ '.agentic-qe', '.claude',
181
+ // agent-platform trees written by `aqe init --with-<platform>`
182
+ '.agents', '.codex', '.opencode', '.kiro', '.cursor', '.roo', '.kilocode',
183
+ '.windsurf', '.continue', '.clinerules',
184
+ // companion tooling state (claude-flow / ruflo)
185
+ '.swarm', '.claude-flow', '.hive-mind',
186
+ ];
168
187
  function walkDir(dir, callback, options = {}) {
169
- const { maxDepth = 10, exclude = ['node_modules', '.git', 'dist', 'build', 'coverage', '.next', '__pycache__'] } = options;
188
+ const { maxDepth = 10, exclude = ANALYZER_EXCLUDED_DIRS } = options;
170
189
  function walk(currentDir, depth) {
171
190
  if (depth > maxDepth)
172
191
  return;
@@ -56,9 +56,11 @@ export declare class SelfConfigurator {
56
56
  /**
57
57
  * Recommend enabled domains
58
58
  *
59
- * IMPORTANT: Always enable ALL 12 domains by default.
60
- * Limiting domains causes "No factory registered" errors in fleet_init
61
- * when MCP tools try to use domains that aren't enabled.
59
+ * IMPORTANT: Always enable ALL default domains (init's ALL_DOMAINS, derived
60
+ * from the canonical shared domain list). Limiting domains causes "No factory
61
+ * registered" errors in fleet_init when MCP tools try to use domains that
62
+ * aren't enabled. A hand-maintained copy here previously omitted
63
+ * enterprise-integration, so fresh and repeat inits disagreed (#778).
62
64
  *
63
65
  * Project analysis is used for prioritization and worker selection,
64
66
  * but all domains remain available for users who need them.
@@ -51,7 +51,7 @@ const configurationRules = [
51
51
  // Complex code needs more careful testing
52
52
  config.autoTuning.parameters.push('complexity.analysisDepth');
53
53
  // Enable all quality domains
54
- config.domains.enabled = ALL_DOMAINS;
54
+ config.domains.enabled = [...ALL_DOMAINS];
55
55
  },
56
56
  },
57
57
  // Low coverage rules
@@ -136,10 +136,11 @@ const configurationRules = [
136
136
  // Focus on test generation - but keep ALL domains enabled
137
137
  // Limiting domains causes "No factory registered" errors in fleet_init
138
138
  config.workers.enabled = ['pattern-consolidator'];
139
- // Don't override domains.enabled - keep all 12 domains from createDefaultConfig
140
- // Lower thresholds for new projects
141
- config.learning.qualityThreshold = 0.5;
142
- config.learning.promotionThreshold = 2;
139
+ // Don't override domains.enabled - keep every default domain.
140
+ // Pattern-promotion thresholds are NOT lowered here: the learning
141
+ // runtime always enforces PROMOTION_THRESHOLD / PROMOTION_MIN_SUCCESS_RATE,
142
+ // so a per-project override only made the generated settings misreport
143
+ // the runtime and flip between fresh and repeat inits (#778).
143
144
  },
144
145
  },
145
146
  // Many existing tests
@@ -222,7 +223,7 @@ export class SelfConfigurator {
222
223
  * Recommend learning configuration
223
224
  */
224
225
  recommendLearning(analysis) {
225
- const config = { ...DEFAULT_LEARNING_CONFIG };
226
+ const config = structuredClone(DEFAULT_LEARNING_CONFIG);
226
227
  // Adjust HNSW based on project size
227
228
  if (analysis.codeComplexity.totalFiles > 1000) {
228
229
  config.hnswConfig = {
@@ -248,7 +249,7 @@ export class SelfConfigurator {
248
249
  * Recommend routing configuration
249
250
  */
250
251
  recommendRouting(analysis) {
251
- const config = { ...DEFAULT_ROUTING_CONFIG };
252
+ const config = structuredClone(DEFAULT_ROUTING_CONFIG);
252
253
  // ML routing for complex projects, rules for simple
253
254
  if (analysis.codeComplexity.recommendation === 'simple') {
254
255
  config.mode = 'rules';
@@ -265,7 +266,7 @@ export class SelfConfigurator {
265
266
  * Recommend workers configuration
266
267
  */
267
268
  recommendWorkers(analysis) {
268
- const config = { ...DEFAULT_WORKERS_CONFIG };
269
+ const config = structuredClone(DEFAULT_WORKERS_CONFIG);
269
270
  // Always enable core workers
270
271
  const workers = new Set(['pattern-consolidator', 'routing-accuracy-monitor']);
271
272
  // Add coverage scanner if coverage is low or missing
@@ -290,7 +291,7 @@ export class SelfConfigurator {
290
291
  * Recommend hooks configuration
291
292
  */
292
293
  recommendHooks(analysis) {
293
- const config = { ...DEFAULT_HOOKS_CONFIG };
294
+ const config = structuredClone(DEFAULT_HOOKS_CONFIG);
294
295
  // Enable CI integration if CI is configured
295
296
  config.ciIntegration = analysis.hasCIConfig;
296
297
  // Enable pre-commit for projects with many tests
@@ -301,7 +302,7 @@ export class SelfConfigurator {
301
302
  * Recommend skills configuration
302
303
  */
303
304
  recommendSkills(analysis) {
304
- const config = { ...DEFAULT_SKILLS_CONFIG };
305
+ const config = structuredClone(DEFAULT_SKILLS_CONFIG);
305
306
  // Always install by default
306
307
  config.install = true;
307
308
  // Install v2 methodology skills - version-agnostic best practices
@@ -316,7 +317,7 @@ export class SelfConfigurator {
316
317
  * Recommend auto-tuning configuration
317
318
  */
318
319
  recommendAutoTuning(analysis) {
319
- const config = { ...DEFAULT_AUTO_TUNING_CONFIG };
320
+ const config = structuredClone(DEFAULT_AUTO_TUNING_CONFIG);
320
321
  // Disable auto-tuning for small projects
321
322
  if (analysis.codeComplexity.totalFiles < 20) {
322
323
  config.enabled = false;
@@ -326,30 +327,18 @@ export class SelfConfigurator {
326
327
  /**
327
328
  * Recommend enabled domains
328
329
  *
329
- * IMPORTANT: Always enable ALL 12 domains by default.
330
- * Limiting domains causes "No factory registered" errors in fleet_init
331
- * when MCP tools try to use domains that aren't enabled.
330
+ * IMPORTANT: Always enable ALL default domains (init's ALL_DOMAINS, derived
331
+ * from the canonical shared domain list). Limiting domains causes "No factory
332
+ * registered" errors in fleet_init when MCP tools try to use domains that
333
+ * aren't enabled. A hand-maintained copy here previously omitted
334
+ * enterprise-integration, so fresh and repeat inits disagreed (#778).
332
335
  *
333
336
  * Project analysis is used for prioritization and worker selection,
334
337
  * but all domains remain available for users who need them.
335
338
  */
336
339
  recommendDomains(_analysis) {
337
- // All 12 DDD domains - always enabled to prevent fleet_init failures
338
340
  // Users can disable domains manually in config.yaml if needed
339
- return [
340
- 'test-generation',
341
- 'test-execution',
342
- 'coverage-analysis',
343
- 'quality-assessment',
344
- 'defect-intelligence',
345
- 'requirements-validation',
346
- 'code-intelligence',
347
- 'security-compliance',
348
- 'contract-testing',
349
- 'visual-accessibility',
350
- 'chaos-resilience',
351
- 'learning-optimization',
352
- ];
341
+ return [...ALL_DOMAINS];
353
342
  }
354
343
  /**
355
344
  * Recommend max concurrent agents
@@ -5,10 +5,11 @@
5
5
  * Installs AQE skills (both v2 methodology and v3 domain skills) to user projects.
6
6
  * Skills are copied from the bundled skills directory to the project's .claude/skills/.
7
7
  */
8
- import { existsSync, mkdirSync, readdirSync, statSync, readFileSync, writeFileSync, copyFileSync, unlinkSync, rmdirSync } from 'fs';
8
+ import { existsSync, mkdirSync, readdirSync, statSync, readFileSync, copyFileSync, unlinkSync, rmdirSync } from 'fs';
9
9
  import { join } from 'path';
10
10
  import { toErrorMessage } from '../shared/error-utils.js';
11
11
  import { findPackageRoot } from './find-package-root.js';
12
+ import { GENERATED_ON_LINE, writeTextIfChangedIgnoring } from './idempotent-write.js';
12
13
  // ============================================================================
13
14
  // Skill Categories (QE Skills Only - Claude Flow skills are managed separately)
14
15
  // ============================================================================
@@ -472,7 +473,8 @@ See \`.validation/README.md\` for usage instructions.
472
473
 
473
474
  *Generated by AQE v3 init on ${new Date().toISOString()}*
474
475
  `;
475
- writeFileSync(join(skillsDir, 'README.md'), indexContent, 'utf-8');
476
+ // #778: ignore the generation-timestamp footer when deciding to rewrite.
477
+ writeTextIfChangedIgnoring(join(skillsDir, 'README.md'), indexContent, GENERATED_ON_LINE);
476
478
  }
477
479
  /**
478
480
  * Scan the skills directory to get all present skills
@@ -13,7 +13,7 @@ export interface TokenBootstrapConfig {
13
13
  enableOptimization: boolean;
14
14
  /** Enable persistence (default: true) */
15
15
  enablePersistence: boolean;
16
- /** Storage directory for metrics (default: .aqe) */
16
+ /** Storage directory for metrics (default: <project>/.agentic-qe) */
17
17
  storagePath: string;
18
18
  /** Auto-save interval in ms (default: 60000 = 1 minute) */
19
19
  autoSaveIntervalMs: number;