newskit 0.1.7__tar.gz

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 (264) hide show
  1. newskit-0.1.7/.gitignore +20 -0
  2. newskit-0.1.7/CHANGELOG.md +79 -0
  3. newskit-0.1.7/LICENSE +21 -0
  4. newskit-0.1.7/PKG-INFO +210 -0
  5. newskit-0.1.7/README.fr.md +167 -0
  6. newskit-0.1.7/README.md +167 -0
  7. newskit-0.1.7/pyproject.toml +80 -0
  8. newskit-0.1.7/src/newskit/__init__.py +4 -0
  9. newskit-0.1.7/src/newskit/__main__.py +3 -0
  10. newskit-0.1.7/src/newskit/acuite.py +394 -0
  11. newskit-0.1.7/src/newskit/aiguilleur_cortexdb.py +536 -0
  12. newskit-0.1.7/src/newskit/angle_critique.py +343 -0
  13. newskit-0.1.7/src/newskit/archiver_skill.py +88 -0
  14. newskit-0.1.7/src/newskit/banc.py +1855 -0
  15. newskit-0.1.7/src/newskit/banc_croise.py +799 -0
  16. newskit-0.1.7/src/newskit/banc_decision.py +598 -0
  17. newskit-0.1.7/src/newskit/banc_injection.py +290 -0
  18. newskit-0.1.7/src/newskit/banc_session.py +226 -0
  19. newskit-0.1.7/src/newskit/banc_themes.py +572 -0
  20. newskit-0.1.7/src/newskit/cartes.py +701 -0
  21. newskit-0.1.7/src/newskit/cerveau_cortexdb.py +668 -0
  22. newskit-0.1.7/src/newskit/choisir_jalons.py +249 -0
  23. newskit-0.1.7/src/newskit/classement.py +136 -0
  24. newskit-0.1.7/src/newskit/cli.py +146 -0
  25. newskit-0.1.7/src/newskit/collecte_arxiv.py +708 -0
  26. newskit-0.1.7/src/newskit/collecte_continue.py +177 -0
  27. newskit-0.1.7/src/newskit/collecte_courriel.py +516 -0
  28. newskit-0.1.7/src/newskit/collecte_depots.py +246 -0
  29. newskit-0.1.7/src/newskit/collecte_dossier_local.py +243 -0
  30. newskit-0.1.7/src/newskit/collecte_linkedin.py +184 -0
  31. newskit-0.1.7/src/newskit/collecte_medium.py +546 -0
  32. newskit-0.1.7/src/newskit/collecte_openalex.py +227 -0
  33. newskit-0.1.7/src/newskit/collecte_pdf_local.py +426 -0
  34. newskit-0.1.7/src/newskit/collecte_revue.py +219 -0
  35. newskit-0.1.7/src/newskit/collecte_rss.py +1305 -0
  36. newskit-0.1.7/src/newskit/collecte_substack.py +216 -0
  37. newskit-0.1.7/src/newskit/collecte_textes.py +405 -0
  38. newskit-0.1.7/src/newskit/combler_canon.py +684 -0
  39. newskit-0.1.7/src/newskit/commun.py +290 -0
  40. newskit-0.1.7/src/newskit/config_sources.py +1685 -0
  41. newskit-0.1.7/src/newskit/contexte.py +341 -0
  42. newskit-0.1.7/src/newskit/controle_production.py +123 -0
  43. newskit-0.1.7/src/newskit/convertir_page_text.py +56 -0
  44. newskit-0.1.7/src/newskit/convertir_substack_page_text.py +74 -0
  45. newskit-0.1.7/src/newskit/convertir_transcription.py +47 -0
  46. newskit-0.1.7/src/newskit/couts.py +449 -0
  47. newskit-0.1.7/src/newskit/decision.py +275 -0
  48. newskit-0.1.7/src/newskit/demenager_gouvernance.py +495 -0
  49. newskit-0.1.7/src/newskit/deplacer_sources.py +122 -0
  50. newskit-0.1.7/src/newskit/deposer_session.py +238 -0
  51. newskit-0.1.7/src/newskit/depots.py +556 -0
  52. newskit-0.1.7/src/newskit/designations.py +170 -0
  53. newskit-0.1.7/src/newskit/diachronie.py +437 -0
  54. newskit-0.1.7/src/newskit/diffusion.py +67 -0
  55. newskit-0.1.7/src/newskit/digerer_graphe.py +311 -0
  56. newskit-0.1.7/src/newskit/donnees_temoin/__init__.py +1 -0
  57. newskit-0.1.7/src/newskit/donnees_temoin/dossier/apiculteur-et-pretre.md +3 -0
  58. newskit-0.1.7/src/newskit/donnees_temoin/dossier/cierge-pascal.md +3 -0
  59. newskit-0.1.7/src/newskit/donnees_temoin/dossier/cire-a-cacheter.md +3 -0
  60. newskit-0.1.7/src/newskit/donnees_temoin/dossier/cire-blanche.md +3 -0
  61. newskit-0.1.7/src/newskit/donnees_temoin/dossier/cire-des-moines.md +3 -0
  62. newskit-0.1.7/src/newskit/donnees_temoin/dossier/cire-et-chandelle.md +3 -0
  63. newskit-0.1.7/src/newskit/donnees_temoin/dossier/cire-et-eau-de-pluie.md +3 -0
  64. newskit-0.1.7/src/newskit/donnees_temoin/dossier/cire-et-miel.md +3 -0
  65. newskit-0.1.7/src/newskit/donnees_temoin/dossier/cire.md +3 -0
  66. newskit-0.1.7/src/newskit/donnees_temoin/dossier/compter-les-essaims.md +3 -0
  67. newskit-0.1.7/src/newskit/donnees_temoin/dossier/cueillir-un-essaim.md +3 -0
  68. newskit-0.1.7/src/newskit/donnees_temoin/dossier/distance-du-chemin.md +3 -0
  69. newskit-0.1.7/src/newskit/donnees_temoin/dossier/droit-des-ruchers.md +3 -0
  70. newskit-0.1.7/src/newskit/donnees_temoin/dossier/empecher-l-essaimage.md +3 -0
  71. newskit-0.1.7/src/newskit/donnees_temoin/dossier/essaim-de-la-saint-jean.md +3 -0
  72. newskit-0.1.7/src/newskit/donnees_temoin/dossier/essaim-et-frontiere.md +3 -0
  73. newskit-0.1.7/src/newskit/donnees_temoin/dossier/essaim-perdu.md +3 -0
  74. newskit-0.1.7/src/newskit/donnees_temoin/dossier/essaim-secondaire.md +3 -0
  75. newskit-0.1.7/src/newskit/donnees_temoin/dossier/essaim-sur-la-maison.md +3 -0
  76. newskit-0.1.7/src/newskit/donnees_temoin/dossier/essaimage-et-lune.md +3 -0
  77. newskit-0.1.7/src/newskit/donnees_temoin/dossier/essaimage-et-vent.md +3 -0
  78. newskit-0.1.7/src/newskit/donnees_temoin/dossier/essaimage.md +7 -0
  79. newskit-0.1.7/src/newskit/donnees_temoin/dossier/faux-cirier.md +3 -0
  80. newskit-0.1.7/src/newskit/donnees_temoin/dossier/heritage-des-ruches.md +3 -0
  81. newskit-0.1.7/src/newskit/donnees_temoin/dossier/impot-de-cire.md +3 -0
  82. newskit-0.1.7/src/newskit/donnees_temoin/dossier/jur/303/251-des-ruchers.md +3 -0
  83. newskit-0.1.7/src/newskit/donnees_temoin/dossier/marque-des-ruches.md +3 -0
  84. newskit-0.1.7/src/newskit/donnees_temoin/dossier/miel-de-dime.md +3 -0
  85. newskit-0.1.7/src/newskit/donnees_temoin/dossier/moules-a-chandelles.md +3 -0
  86. newskit-0.1.7/src/newskit/donnees_temoin/dossier/piqure-de-cheval.md +3 -0
  87. newskit-0.1.7/src/newskit/donnees_temoin/dossier/reine-de-paille.md +3 -0
  88. newskit-0.1.7/src/newskit/donnees_temoin/dossier/ruche-de-tronc.md +3 -0
  89. newskit-0.1.7/src/newskit/donnees_temoin/dossier/rucher-abandonne.md +3 -0
  90. newskit-0.1.7/src/newskit/donnees_temoin/dossier/ruches-et-moulin.md +3 -0
  91. newskit-0.1.7/src/newskit/donnees_temoin/dossier/vol-de-ruche.md +3 -0
  92. newskit-0.1.7/src/newskit/donnees_temoin/media_de_test.py +68 -0
  93. newskit-0.1.7/src/newskit/donnees_temoin/reponses/.gitkeep +0 -0
  94. newskit-0.1.7/src/newskit/donnees_temoin/reponses/060c0e01eb43eab297d6f52a85bc8d0e63a3489c87fa5b5bf84575a391c62962.json +1 -0
  95. newskit-0.1.7/src/newskit/donnees_temoin/reponses/0ed64d33eda777fe146b9e4ddcacd74c00ecdd03e082913a4091704df2b0ff57.json +1 -0
  96. newskit-0.1.7/src/newskit/donnees_temoin/reponses/1df4c2c5417c97016c19230588cf98d54dcc15deff0914fe4347651bc19d29ba.json +1 -0
  97. newskit-0.1.7/src/newskit/donnees_temoin/reponses/2681359cdb67e96404d50ae225f50392d39c5096bb56a9fb3ab8d1a323689fbd.json +1 -0
  98. newskit-0.1.7/src/newskit/donnees_temoin/reponses/26f6f46523e212e7ed1f9124fe7514e2b563ff78bbc924504673d4139a98b10d.json +1 -0
  99. newskit-0.1.7/src/newskit/donnees_temoin/reponses/31cade9fe3f2e72eaeb01fe29ee0fcd1533d536635ddaa97a7a9df2051a619ea.json +1 -0
  100. newskit-0.1.7/src/newskit/donnees_temoin/reponses/3c621999baa9aed4ffbfc3da7c10b3c32228ea64c8aa95a64d8f2cc9e6bcadab.json +1 -0
  101. newskit-0.1.7/src/newskit/donnees_temoin/reponses/47f5e61839201d78ac078a8993105a2d430446913b02ed76c978b51cf5afb240.json +1 -0
  102. newskit-0.1.7/src/newskit/donnees_temoin/reponses/67d94da8f05ff1392466c665982bfc86e220c5e6b92e4dfe01f935212b885911.json +1 -0
  103. newskit-0.1.7/src/newskit/donnees_temoin/reponses/6eebe892433ffaf75d43b4737fa3f6622e4eaba309382d6b00851ded14af99d4.json +1 -0
  104. newskit-0.1.7/src/newskit/donnees_temoin/reponses/724ec6b0efce74287726d511c39a2ca1f5d7ca006c28cdca0fd763d38502489c.json +1 -0
  105. newskit-0.1.7/src/newskit/donnees_temoin/reponses/742cea43c0090631d605a8d6035c3387c26aa71ffa38937ebe2c9caf389fa616.json +1 -0
  106. newskit-0.1.7/src/newskit/donnees_temoin/reponses/7b1d6f85638f5d76759bc69df17c3f70177856d1024368da940c93718c1c98c1.json +1 -0
  107. newskit-0.1.7/src/newskit/donnees_temoin/reponses/7c7653e704a2dbc8079078054128f2728ae4414eaf230dd4049d8ede48f54769.json +1 -0
  108. newskit-0.1.7/src/newskit/donnees_temoin/reponses/812933750d0f35202c502cab3dec8b3e93c66a26b43b39b70f0940ef00fc7727.json +1 -0
  109. newskit-0.1.7/src/newskit/donnees_temoin/reponses/83e9bbcd1b44ec16534ba4ecc36eedf252bab72e327e9fb73e689ccfa9cf052e.json +1 -0
  110. newskit-0.1.7/src/newskit/donnees_temoin/reponses/867ca7534835bc45c40fafae8a00c84cc90e4a7caabe6f49b877072b91db38b8.json +1 -0
  111. newskit-0.1.7/src/newskit/donnees_temoin/reponses/88c31641c99fcf7bae1c94fe02319eb06a3d92b8585ccf758952999389062be4.json +1 -0
  112. newskit-0.1.7/src/newskit/donnees_temoin/reponses/88dfba086495fe5f771091af9f77207bd6136e678165eb26839f5d8f04705f07.json +1 -0
  113. newskit-0.1.7/src/newskit/donnees_temoin/reponses/99f7aed5726d865f6f14cedf3e8bfd88b9e7bca4155dc1e16ba612aca4e36390.json +1 -0
  114. newskit-0.1.7/src/newskit/donnees_temoin/reponses/9f96acd3accfdc74bfa2940f7720fb9dc39b07f35db7d8478fdf7afae2e16749.json +1 -0
  115. newskit-0.1.7/src/newskit/donnees_temoin/reponses/a36a9073dbef0c6c1fca7aeee39b2fa9a1107d1e157be2fc7c4ea310e1fc2716.json +1 -0
  116. newskit-0.1.7/src/newskit/donnees_temoin/reponses/a78a46b99cb238b51c83c434e39b2bdc70c2d7fc33c52ca0fbc713a710327ec2.json +1 -0
  117. newskit-0.1.7/src/newskit/donnees_temoin/reponses/afbb982cf0c6c93b8e8cebc7fae5972f19821ffcfbb2321b3c085d94cf515a0e.json +1 -0
  118. newskit-0.1.7/src/newskit/donnees_temoin/reponses/bfaabb335129975948a93ac89fb97bf488cb2625ec93cbb455c6661288bce92e.json +1 -0
  119. newskit-0.1.7/src/newskit/donnees_temoin/reponses/c2c6bbb722258fc78ac580a3ba48ecd67f5b947e30f404852d6cecc8865ad556.json +1 -0
  120. newskit-0.1.7/src/newskit/donnees_temoin/reponses/c2eb7ddf698ab7b0ff4f5ff613f5505dd0ce51d678ad624f310a08e33a509945.json +1 -0
  121. newskit-0.1.7/src/newskit/donnees_temoin/reponses/c53a1a04bb7ecde0230389e031f797771631c5786301efc44bc80c17ff3f9aec.json +1 -0
  122. newskit-0.1.7/src/newskit/donnees_temoin/reponses/c6a3b4308cd5582b9e90f894a811b5bd366438d0619f99292993d759d420c1ee.json +1 -0
  123. newskit-0.1.7/src/newskit/donnees_temoin/reponses/c838178769ebf75e061f3026274f9aa688831e9c0278716a7f2cda2eab1e5b84.json +1 -0
  124. newskit-0.1.7/src/newskit/donnees_temoin/reponses/cad1f58dbfbe94bfa5f19df3ce2a49573852d99e6f3be23afb77b4b1b38948c5.json +1 -0
  125. newskit-0.1.7/src/newskit/donnees_temoin/reponses/d18274b00e9448112dae3beef82ee718eba39c65f3ae23334b50973e736ab41b.json +1 -0
  126. newskit-0.1.7/src/newskit/donnees_temoin/reponses/dbea2d4177941ce2caee1ae70a09c9a256f7ff16373d294a165b1d2527aafdc8.json +1 -0
  127. newskit-0.1.7/src/newskit/donnees_temoin/reponses/e0b6e3c2dcb95d24ef3f64233109e51bca7a972f088a2754f629d5b46fc55213.json +1 -0
  128. newskit-0.1.7/src/newskit/donnees_temoin/reponses/e1229a6cc2304bcf2e22247360b69ecabe50e99179b3c6defbd34d2597a00637.json +1 -0
  129. newskit-0.1.7/src/newskit/donnees_temoin/reponses/e2de5455db3aba1f9b4ae39ca99c390c19d2f42baab3a71e133bafd10000dc7f.json +1 -0
  130. newskit-0.1.7/src/newskit/donnees_temoin/reponses/e8023dd1da8106b8bc62a0da71229018c0d12074af195c55bc9a3c1da986b907.json +1 -0
  131. newskit-0.1.7/src/newskit/donnees_temoin/reponses/edbc6f1aa5c620e09cab0447d3375d8228693616b897070a59707e68fda583a5.json +1 -0
  132. newskit-0.1.7/src/newskit/donnees_temoin/tests/__init__.py +0 -0
  133. newskit-0.1.7/src/newskit/donnees_temoin/tests/conftest.py +158 -0
  134. newskit-0.1.7/src/newskit/donnees_temoin/tests/test_temoin_alias.py +112 -0
  135. newskit-0.1.7/src/newskit/donnees_temoin/tests/test_temoin_debris.py +86 -0
  136. newskit-0.1.7/src/newskit/donnees_temoin/tests/test_temoin_enregistrement.py +135 -0
  137. newskit-0.1.7/src/newskit/donnees_temoin/tests/test_temoin_etancheite.py +221 -0
  138. newskit-0.1.7/src/newskit/donnees_temoin/tests/test_temoin_limite.py +61 -0
  139. newskit-0.1.7/src/newskit/donnees_temoin/tests/test_temoin_nuit.py +135 -0
  140. newskit-0.1.7/src/newskit/donnees_temoin/tests/test_temoin_plafonds.py +58 -0
  141. newskit-0.1.7/src/newskit/donnees_temoin/tests/test_temoin_refus.py +81 -0
  142. newskit-0.1.7/src/newskit/donnees_temoin/tests/test_temoin_rejeu.py +86 -0
  143. newskit-0.1.7/src/newskit/donnees_temoin/tests/test_temoin_reprise.py +74 -0
  144. newskit-0.1.7/src/newskit/donnees_temoin/tests/test_temoin_routine.py +82 -0
  145. newskit-0.1.7/src/newskit/donnees_temoin/tests/test_temoin_sans_specifiques.py +77 -0
  146. newskit-0.1.7/src/newskit/doublons_d_identite.py +221 -0
  147. newskit-0.1.7/src/newskit/eclaireur.py +640 -0
  148. newskit-0.1.7/src/newskit/embeddings_locaux.py +67 -0
  149. newskit-0.1.7/src/newskit/encodeur.py +609 -0
  150. newskit-0.1.7/src/newskit/evenements.py +108 -0
  151. newskit-0.1.7/src/newskit/exemples_redaction.py +172 -0
  152. newskit-0.1.7/src/newskit/exporter_onnx.py +270 -0
  153. newskit-0.1.7/src/newskit/extraire_concepts.py +608 -0
  154. newskit-0.1.7/src/newskit/extraire_squelette.py +726 -0
  155. newskit-0.1.7/src/newskit/extraire_structure.py +100 -0
  156. newskit-0.1.7/src/newskit/extrait.py +32 -0
  157. newskit-0.1.7/src/newskit/fiche.py +713 -0
  158. newskit-0.1.7/src/newskit/fil.py +1649 -0
  159. newskit-0.1.7/src/newskit/fil_anglais.py +369 -0
  160. newskit-0.1.7/src/newskit/fil_fiche.py +196 -0
  161. newskit-0.1.7/src/newskit/fondre_doublons.py +552 -0
  162. newskit-0.1.7/src/newskit/fraicheur_github.py +316 -0
  163. newskit-0.1.7/src/newskit/francais.py +264 -0
  164. newskit-0.1.7/src/newskit/fusionner_graphe.py +530 -0
  165. newskit-0.1.7/src/newskit/garde_pousse.py +79 -0
  166. newskit-0.1.7/src/newskit/interroger.py +138 -0
  167. newskit-0.1.7/src/newskit/interroger_graphe.py +609 -0
  168. newskit-0.1.7/src/newskit/lacunes.py +328 -0
  169. newskit-0.1.7/src/newskit/launchd_graphe.plist.modele +67 -0
  170. newskit-0.1.7/src/newskit/lecture_cortexdb.py +179 -0
  171. newskit-0.1.7/src/newskit/lecture_web.py +891 -0
  172. newskit-0.1.7/src/newskit/lettre.py +3682 -0
  173. newskit-0.1.7/src/newskit/lettre_anglaise.py +109 -0
  174. newskit-0.1.7/src/newskit/lettre_semaine.py +237 -0
  175. newskit-0.1.7/src/newskit/media.py +306 -0
  176. newskit-0.1.7/src/newskit/mesure_pilote_cortexdb.py +304 -0
  177. newskit-0.1.7/src/newskit/mesure_serveur.py +66 -0
  178. newskit-0.1.7/src/newskit/mesurer_avance.py +417 -0
  179. newskit-0.1.7/src/newskit/mesurer_rejets.py +264 -0
  180. newskit-0.1.7/src/newskit/migrer_frontmatter.py +80 -0
  181. newskit-0.1.7/src/newskit/naissance.py +256 -0
  182. newskit-0.1.7/src/newskit/notifier_courriel.py +706 -0
  183. newskit-0.1.7/src/newskit/nouveau_graphe.py +323 -0
  184. newskit-0.1.7/src/newskit/nouvelles.py +232 -0
  185. newskit-0.1.7/src/newskit/ouvrir_session.py +453 -0
  186. newskit-0.1.7/src/newskit/partage_graphe.py +478 -0
  187. newskit-0.1.7/src/newskit/partage_sources.py +303 -0
  188. newskit-0.1.7/src/newskit/passe_partout.py +125 -0
  189. newskit-0.1.7/src/newskit/peu_couverts.py +332 -0
  190. newskit-0.1.7/src/newskit/politiques.py +78 -0
  191. newskit-0.1.7/src/newskit/poseur.py +279 -0
  192. newskit-0.1.7/src/newskit/prospecter_source.py +410 -0
  193. newskit-0.1.7/src/newskit/proxies_webshare.py +136 -0
  194. newskit-0.1.7/src/newskit/publier_cerveau.py +172 -0
  195. newskit-0.1.7/src/newskit/publier_fil.py +181 -0
  196. newskit-0.1.7/src/newskit/publier_graphes.py +171 -0
  197. newskit-0.1.7/src/newskit/publier_index.py +195 -0
  198. newskit-0.1.7/src/newskit/puits_cortexdb.py +1023 -0
  199. newskit-0.1.7/src/newskit/purger_fiches.py +128 -0
  200. newskit-0.1.7/src/newskit/recepteur_local.py +53 -0
  201. newskit-0.1.7/src/newskit/recuperer_tronquee.py +119 -0
  202. newskit-0.1.7/src/newskit/refus.py +104 -0
  203. newskit-0.1.7/src/newskit/reporter.py +3102 -0
  204. newskit-0.1.7/src/newskit/retirer_domaines.py +70 -0
  205. newskit-0.1.7/src/newskit/retouche_lettre.py +312 -0
  206. newskit-0.1.7/src/newskit/routine_assistee.py +261 -0
  207. newskit-0.1.7/src/newskit/routine_hebdo.py +2074 -0
  208. newskit-0.1.7/src/newskit/sante_sources.py +175 -0
  209. newskit-0.1.7/src/newskit/selectionneur.py +203 -0
  210. newskit-0.1.7/src/newskit/serveur_cortexdb.py +209 -0
  211. newskit-0.1.7/src/newskit/synthese.py +1877 -0
  212. newskit-0.1.7/src/newskit/temoin.py +617 -0
  213. newskit-0.1.7/src/newskit/themes_emergents.py +812 -0
  214. newskit-0.1.7/src/newskit/valider_fiches.py +75 -0
  215. newskit-0.1.7/src/newskit/vocabulaire_web2.txt.gz +0 -0
  216. newskit-0.1.7/tests/fixtures/lecture_web_algoritmeregister_fiche.html +1 -0
  217. newskit-0.1.7/tests/fixtures/lecture_web_algoritmeregister_kapelle.html +1 -0
  218. newskit-0.1.7/tests/fixtures/lecture_web_algoritmeregister_recherche.html +1 -0
  219. newskit-0.1.7/tests/fixtures/lecture_web_algoritmeregister_reimerswaal.html +1 -0
  220. newskit-0.1.7/tests/fixtures/lecture_web_bundestag_kw13.html +6245 -0
  221. newskit-0.1.7/tests/fixtures/lecture_web_cellar_32024R1689_debut.xhtml +311 -0
  222. newskit-0.1.7/tests/fixtures/lecture_web_eurlex_mur_aws.html +44 -0
  223. newskit-0.1.7/tests/fixtures/lecture_web_memo_notes.html +28 -0
  224. newskit-0.1.7/tests/fixtures/lecture_web_normattiva_dlgs_179_2026.html +1809 -0
  225. newskit-0.1.7/tests/fixtures/oai_1706.03762.xml +68 -0
  226. newskit-0.1.7/tests/fixtures/rss_sony_csl.xml +276 -0
  227. newskit-0.1.7/tests/plugin/test_documents.py +53 -0
  228. newskit-0.1.7/tests/plugin/test_garde_limite.py +118 -0
  229. newskit-0.1.7/tests/plugin/test_plugin.py +75 -0
  230. newskit-0.1.7/tests/test_banc_ecart_brutal.py +74 -0
  231. newskit-0.1.7/tests/test_cartes_notion_absente.py +38 -0
  232. newskit-0.1.7/tests/test_collecte_rss_lien_espaces.py +25 -0
  233. newskit-0.1.7/tests/test_collecte_substack_curseur.py +53 -0
  234. newskit-0.1.7/tests/test_collecteurs.py +590 -0
  235. newskit-0.1.7/tests/test_collecteurs_code_de_sortie.py +83 -0
  236. newskit-0.1.7/tests/test_combler_canon_file.py +27 -0
  237. newskit-0.1.7/tests/test_commande_test.py +40 -0
  238. newskit-0.1.7/tests/test_commandes_en_anglais.py +71 -0
  239. newskit-0.1.7/tests/test_couche2_ecrit_avant_l_appel_suivant.py +53 -0
  240. newskit-0.1.7/tests/test_datation.py +166 -0
  241. newskit-0.1.7/tests/test_deux_racines.py +92 -0
  242. newskit-0.1.7/tests/test_doublons_d_identite.py +214 -0
  243. newskit-0.1.7/tests/test_encodeur_evaluer_bancs.py +50 -0
  244. newskit-0.1.7/tests/test_encodeur_sans_graphe_par_defaut.py +34 -0
  245. newskit-0.1.7/tests/test_identifiant_du_moteur.py +45 -0
  246. newskit-0.1.7/tests/test_identite.py +282 -0
  247. newskit-0.1.7/tests/test_index_unique.py +120 -0
  248. newskit-0.1.7/tests/test_lecture_web.py +639 -0
  249. newskit-0.1.7/tests/test_lecture_web_editeur.py +41 -0
  250. newskit-0.1.7/tests/test_lecture_web_voisins.py +45 -0
  251. newskit-0.1.7/tests/test_medium.py +101 -0
  252. newskit-0.1.7/tests/test_naissance.py +118 -0
  253. newskit-0.1.7/tests/test_nouveau_graphe.py +23 -0
  254. newskit-0.1.7/tests/test_nouveau_graphe_media.py +87 -0
  255. newskit-0.1.7/tests/test_nouvelles_signature.py +108 -0
  256. newskit-0.1.7/tests/test_passages.py +160 -0
  257. newskit-0.1.7/tests/test_registre_des_graphes.py +77 -0
  258. newskit-0.1.7/tests/test_routine_courriel.py +69 -0
  259. newskit-0.1.7/tests/test_squelette.py +163 -0
  260. newskit-0.1.7/tests/test_synthese_construire.py +69 -0
  261. newskit-0.1.7/tests/test_synthese_droits.py +86 -0
  262. newskit-0.1.7/tests/test_synthese_faits_debuts.py +22 -0
  263. newskit-0.1.7/tests/test_traduction_sans_theme.py +33 -0
  264. newskit-0.1.7/tests/test_vocabulaire_livre.py +26 -0
@@ -0,0 +1,20 @@
1
+ __pycache__/
2
+ *.py[cod]
3
+ .venv/
4
+ .ruff_cache/
5
+ .pytest_cache/
6
+ .coverage
7
+ coverage.xml
8
+ htmlcov/
9
+ build/
10
+ dist/
11
+ *.egg-info/
12
+ .DS_Store
13
+ # Les données d'un média ne vivent jamais dans le dépôt du moteur.
14
+ /cache/
15
+ /graphe/
16
+ /sources/
17
+ /config.yaml
18
+ /sources.yaml
19
+ /EXTRAIT.json
20
+ /dist/
@@ -0,0 +1,79 @@
1
+ # Journal des versions
2
+
3
+ Le format suit [Keep a Changelog](https://keepachangelog.com/fr/1.1.0/) ; les versions suivent [SemVer](https://semver.org/lang/fr/).
4
+
5
+ ## [Non publié]
6
+
7
+ ## [0.1.7] - 2026-11-07
8
+
9
+ ### Modifié
10
+
11
+ - Newskit est publié sur PyPI : `pip install newskit`. Publication par Trusted Publishing à chaque tag, répétition sur TestPyPI (`testpypi.yml`). Description du paquet en anglais ; liens du README absolus, pour la page PyPI.
12
+ - Format du code vérifié en CI et au pre-push (`ruff format --check`) ; modèles d'issue et de PR en anglais ; Discussions.
13
+
14
+ ## [0.1.6] - 2026-11-07
15
+
16
+ ### Modifié
17
+
18
+ - Le mot « nuit » devient « passage » dans le skill, l'aide et les messages ; `newskit temoin passage`, `nuit` restant accepté.
19
+ - `media.passages: {tous_les, heures}` remplace `media.frequence` : plusieurs passages par jour, ou un tous les N jours. La tâche planifiée part à chaque heure avec `--planifie` ; un jour hors de l'intervalle, la routine s'arrête avant le témoin. `frequence` reste lue.
20
+ - Les commandes en anglais : `run`, `new-graph`, `query … search`, `costs --by`, `test`, avec leurs options (`--graph`, `--check`, `--label`, `--domain`, `--subjects`, `--since`, `--limit`, `--no-commit`, `--no-email`…). Les noms français restent acceptés.
21
+ - README en anglais (`README.md`) et en français (`README.fr.md`) : comment le graphe grandit, la répétition expliquée, les outils qui l'étendent. Descriptions du plugin en anglais.
22
+
23
+ ## [0.1.5] - 2026-11-07
24
+
25
+ ### Corrigé
26
+
27
+ - Couche 2 : un appel au modèle ne part plus avant que le résultat précédent soit écrit. Une étape tuée perdait des réponses payées, qui étaient repayées au passage suivant.
28
+
29
+ ## [0.1.4] - 2026-11-07
30
+
31
+ ### Modifié
32
+
33
+ - Le registre des graphes (libellés, résumés, sujets déclarés, que les thèmes émergents réécrivent chaque nuit) vit dans le dossier du média, `graphes.json` ; la clé `registre_des_graphes` de `config.yaml` le place ailleurs. Il était fixé au registre d'un skill de la première édition.
34
+
35
+ ## [0.1.3] - 2026-11-07
36
+
37
+ ### Modifié
38
+
39
+ - `newskit nouveau-graphe` écrit une tâche planifiée qui lance le moteur installé (`-m newskit.routine_hebdo`) sur le dossier du média, avec l'interpréteur qui porte le paquet ; sans installateur des daemons, elle est prête à poser sous `taches/`. Les pièces des installateurs ne sont demandées qu'au média qui les porte.
40
+ - La consigne de traduction des libellés nomme le graphe traduit (son libellé), plus un thème fixe.
41
+ - La métadonnée d'identifiant des entités versées dans CortexDB s'appelle `newskit_id` ; l'empreinte d'un versement la lit sous son ancien nom, si bien qu'aucun cerveau n'est reversé en entier. Le relevé des lacunes se présente au gateway comme `newskit-releve`.
42
+
43
+ ### Ajouté
44
+
45
+ - L'icône du plugin.
46
+
47
+ ## [0.1.2] - 2026-11-07
48
+
49
+ ### Corrigé
50
+
51
+ - Un article, une fiche, une langue : la collecte n'écrit plus une seconde fiche pour la version d'un article dans une autre langue. Le contrôle des doublons d'identité nomme les fiches d'un même document.
52
+
53
+ ## [0.1.1] - 2026-11-07
54
+
55
+ ### Corrigé
56
+
57
+ - pytest s'installe avec le paquet : le témoin, sans lequel aucune nuit ne part, tombait sur « No module named pytest » après un `pip install` simple. L'extra `temoin` disparaît.
58
+ - Le vocabulaire anglais est livré avec le moteur (web2) : sous Linux, sans liste de mots du système, le tri des libellés à traduire changeait.
59
+
60
+ ## [0.1.0] - 2026-11-07
61
+
62
+ Première version, sortie du dépôt de l'édition où le moteur est né.
63
+
64
+ ### Ajouté
65
+
66
+ - Le paquet `newskit` et la commande `newskit` : un module du moteur par sous-commande (`newskit routine`, `newskit nouveau-graphe`, `newskit graphe`, `newskit media`, `newskit temoin`, `newskit couts`).
67
+ - Le dossier du média : un `config.yaml` (identité, langue, traductions, heure de la nuit, un modèle par rôle, fichier des sources, module de diffusion, graphes), lu depuis `NEWSKIT_DONNEES` ou le dossier courant.
68
+ - Le témoin : une nuit entière sur un graphe sans rapport, rejouée de réponses enregistrées, sans appel payant (`newskit temoin nuit`) ; une nuit ne part pas sans un témoin vert du jour.
69
+ - Le plugin de Claude Code : le skill `newskit` (formulaire du média, sources et thèmes de départ, naissance, nuit, interrogation) et un crochet qui refuse les appels au modèle quand la fenêtre d'usage est fermée.
70
+
71
+ [Non publié]: https://github.com/lfoletti/newskit/compare/v0.1.7...HEAD
72
+ [0.1.7]: https://github.com/lfoletti/newskit/compare/v0.1.6...v0.1.7
73
+ [0.1.6]: https://github.com/lfoletti/newskit/compare/v0.1.5...v0.1.6
74
+ [0.1.5]: https://github.com/lfoletti/newskit/compare/v0.1.4...v0.1.5
75
+ [0.1.4]: https://github.com/lfoletti/newskit/compare/v0.1.3...v0.1.4
76
+ [0.1.3]: https://github.com/lfoletti/newskit/compare/v0.1.2...v0.1.3
77
+ [0.1.2]: https://github.com/lfoletti/newskit/compare/v0.1.1...v0.1.2
78
+ [0.1.1]: https://github.com/lfoletti/newskit/compare/v0.1.0...v0.1.1
79
+ [0.1.0]: https://github.com/lfoletti/newskit/releases/tag/v0.1.0
newskit-0.1.7/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Lauro Foletti
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
newskit-0.1.7/PKG-INFO ADDED
@@ -0,0 +1,210 @@
1
+ Metadata-Version: 2.5
2
+ Name: newskit
3
+ Version: 0.1.7
4
+ Summary: Automated topic monitoring for Claude Code: collects your sources, writes one cited note per item and keeps a knowledge graph up to date.
5
+ Project-URL: Source, https://github.com/lfoletti/newskit
6
+ Project-URL: Issues, https://github.com/lfoletti/newskit/issues
7
+ Project-URL: Changelog, https://github.com/lfoletti/newskit/blob/main/CHANGELOG.md
8
+ Author: Les mainteneurs de Newskit
9
+ License-Expression: MIT
10
+ License-File: LICENSE
11
+ Keywords: claude-code,knowledge-graph,monitoring,news,newsletter,rag
12
+ Classifier: Development Status :: 3 - Alpha
13
+ Classifier: Environment :: Console
14
+ Classifier: Intended Audience :: Developers
15
+ Classifier: Natural Language :: French
16
+ Classifier: Operating System :: MacOS
17
+ Classifier: Operating System :: POSIX :: Linux
18
+ Classifier: Programming Language :: Python :: 3
19
+ Classifier: Programming Language :: Python :: 3.12
20
+ Classifier: Programming Language :: Python :: 3.13
21
+ Classifier: Topic :: Scientific/Engineering :: Information Analysis
22
+ Requires-Python: >=3.12
23
+ Requires-Dist: graphifyy>=0.9
24
+ Requires-Dist: lxml>=5.0
25
+ Requires-Dist: networkx>=3.2
26
+ Requires-Dist: numpy>=1.26
27
+ Requires-Dist: pypdf>=4.0
28
+ Requires-Dist: pytest>=8.0
29
+ Requires-Dist: pyyaml>=6.0
30
+ Requires-Dist: trafilatura>=1.12
31
+ Provides-Extra: dev
32
+ Requires-Dist: pytest-cov>=5.0; extra == 'dev'
33
+ Requires-Dist: pytest>=8.0; extra == 'dev'
34
+ Requires-Dist: ruff>=0.6; extra == 'dev'
35
+ Provides-Extra: encodeur
36
+ Requires-Dist: fastembed>=0.3; extra == 'encodeur'
37
+ Requires-Dist: onnxruntime>=1.17; extra == 'encodeur'
38
+ Requires-Dist: sentence-transformers>=3.0; extra == 'encodeur'
39
+ Requires-Dist: tokenizers>=0.19; extra == 'encodeur'
40
+ Requires-Dist: torch>=2.2; extra == 'encodeur'
41
+ Requires-Dist: transformers>=4.40; extra == 'encodeur'
42
+ Description-Content-Type: text/markdown
43
+
44
+ # Newskit
45
+
46
+ [![ci](https://github.com/lfoletti/newskit/actions/workflows/ci.yml/badge.svg)](https://github.com/lfoletti/newskit/actions/workflows/ci.yml)
47
+ [![licence MIT](https://img.shields.io/badge/licence-MIT-blue.svg)](https://github.com/lfoletti/newskit/blob/main/LICENSE)
48
+ [![version](https://img.shields.io/github/v/tag/lfoletti/newskit?label=version)](https://github.com/lfoletti/newskit/blob/main/CHANGELOG.md)
49
+
50
+ English | [Français](https://github.com/lfoletti/newskit/blob/main/README.fr.md)
51
+
52
+ Automated topic monitoring for Claude Code. You name a subject and give a few sources; at regular intervals Newskit collects them, writes one note per item, extracts the concepts and how they relate, and keeps a knowledge graph up to date, within a spending cap. Two things set it apart from a feed reader: every answer drawn from the graph cites its note and its line, and the graph extends itself to new themes and new sources.
53
+
54
+ For developers who already use Claude Code: every model call goes through `claude -p`, under your own Claude subscription. Notes, feed and newsletter are written in French; an English translation can be added (`traductions: [en]`).
55
+
56
+ [![governance.news, an AI governance media built on Newskit](https://raw.githubusercontent.com/lfoletti/newskit/main/docs/governance-news-en.png)](https://governance.news/en/)
57
+
58
+ *[governance.news](https://governance.news/en/): a newsletter and a knowledge graph on AI governance in business, built on Newskit.*
59
+
60
+ ## What you get
61
+
62
+ All of it lives in your media folder, as plain files:
63
+
64
+ - **Notes**: one Markdown file per collected item, under `sources/`, with its title, author, date and address.
65
+ - **The graph**: `graphe/<name>/graphe.json`, its map (`carte.md`, the main themes and their concepts) and the report of each pass (`ROUTINE.md`).
66
+ - **Answers with their source**: `newskit query` searches the graph without any model call and gives, for each answer, the note and the line that support it.
67
+ - **A feed and a newsletter**: short posts on the latest items (`fil.json`) and a newsletter of the graph, sent through your own delivery module (`diffusion:` in `config.yaml`).
68
+
69
+ ```text
70
+ $ newskit query --graph ai-governance sources "general-purpose AI model"
71
+ Sources attestant « General-purpose AI models »
72
+ sources/ai_compliance/rss/ec_digital/2026-08-02_navigating-ai-act.md L211
73
+ ```
74
+
75
+ ## Quick start
76
+
77
+ You need Python 3.12 or later, git, macOS or Linux, and a logged-in Claude Code (`claude`).
78
+
79
+ The words used below: the **media** is your project folder; it holds one or more **graphs**; each graph follows **subjects**; a **pass** collects the graph's sources and writes one **note** per item.
80
+
81
+ 1. Install the engine and test it in an empty folder:
82
+
83
+ ```sh
84
+ pip install newskit
85
+ mkdir my-media && cd my-media
86
+ newskit test
87
+ ```
88
+
89
+ The test runs one full pass on a sample graph (medieval beekeeping), with model answers replayed from a recording: no paid call, about one minute. It must end with « témoin vert » (test passed).
90
+
91
+ 2. Open Claude Code in that folder (`claude`) and install the plugin:
92
+
93
+ ```text
94
+ /plugin marketplace add lfoletti/newskit
95
+ /plugin install newskit@newskit
96
+ ```
97
+
98
+ 3. Ask Claude to follow a subject: “start a monitoring graph on urban gardening”. The `newskit` skill asks its questions, writes `config.yaml` and `sources.yaml`, suggests themes drawn from the sources you give, creates the graph and runs a first pass in front of you.
99
+
100
+ 4. Read the result: `graphe/<name>/ROUTINE.md` for the report, `newskit query --graph <name> search "…"` for the graph.
101
+
102
+ 5. Schedule the next passes. `newskit new-graph` has written the graph's task under `taches/` and printed the two `sudo` lines that install it in launchd (macOS). On Linux, add a cron line at each time of `passages` that runs `newskit test` then `newskit run --graph <name> --scheduled`; on a day outside the interval, the scheduled run stops by itself.
103
+
104
+ ## Sources
105
+
106
+ Sources are declared in `sources.yaml`, next to `config.yaml`, one block per source, each tied to a graph. Supported: RSS feeds, sitemaps and listing pages (for sites without a feed), Substack, Medium, LinkedIn newsletters, arXiv, journals by ISSN, OpenAlex, GitHub and Hugging Face searches, an e-mail inbox, and local folders of Markdown or PDF files.
107
+
108
+ ```yaml
109
+ version: 1
110
+ sources:
111
+ - cle: city_farmer
112
+ plateforme: Flux RSS
113
+ nom: City Farmer News
114
+ dossier: potagers/rss
115
+ abonnement: gratuit
116
+ graphe: potagers-urbains
117
+ flux: https://cityfarmer.info/feed/
118
+ - cle: soil_papers
119
+ plateforme: OpenAlex
120
+ nom: OpenAlex, urban soil
121
+ dossier: potagers/openalex
122
+ abonnement: gratuit
123
+ graphe: potagers-urbains
124
+ requetes: ["urban allotment soil contamination"]
125
+ ```
126
+
127
+ The skill writes this file for you from the addresses you give; a source the engine cannot read is refused with its reason.
128
+
129
+ ## How the graph grows
130
+
131
+ The graph does not stay within the subjects you declared at the start: it expands.
132
+
133
+ - **New themes.** After each pass, the engine looks for clusters of concepts that none of the declared subjects covers. A candidate that comes back three passes in a row joins the subjects; the sources and searches follow it.
134
+ - **Auto-completion.** A question the graph could not answer becomes a search for the next pass. A web scout searches the declared subjects; a question agent probes the graph the way a practitioner would; what a language model considers essential and the graph lacks becomes a shopping list of sources to find.
135
+ - **The source list.** The engine assesses a candidate domain before it is declared, and keeps track of every source a user drops in (a link sent from the browser). A source that keeps failing is audited and, when a route exists, repaired on its own (see accesspath below).
136
+ - **Clean concepts.** The same concept found under several labels (a translation, an acronym, a variant) is merged after a model confirms it is exactly the same concept; refusals are kept and never asked again.
137
+
138
+ ## The media folder
139
+
140
+ The media is a folder that holds a `config.yaml`. The engine attaches to it: the `NEWSKIT_DONNEES` variable first, otherwise the current folder. The code stays in the installed package; the data (notes, graph, cost ledger) live in the media folder.
141
+
142
+ ```yaml
143
+ version: 1
144
+ media:
145
+ nom: potagers # name: lowercase, digits and hyphens
146
+ langue: fr # language of the prompts and of the publication
147
+ traductions: [en] # translated feed and newsletter; none by default
148
+ passages: {tous_les: 1, heures: ["05:30"]} # every N days, at these times
149
+ modeles: # one model per role; a missing role keeps its default
150
+ extraction: claude-opus-5-5
151
+ redaction: claude-sonnet-5-5
152
+ sources: sources.yaml # the source list, kept apart
153
+ # registre_des_graphes: graphes.json # labels and declared subjects, kept by the engine (default)
154
+ graphes:
155
+ potagers-urbains:
156
+ libelle: Potagers urbains # label
157
+ domaine: "urban gardening: allotments, soil, seed exchange" # the domain, in English, for extraction
158
+ ```
159
+
160
+ `newskit media` shows what was read; an unknown field is refused and named. The roles: `extraction` (reading a note and drawing its concepts), `analyse` (judging a whole graph), `redaction` (summaries and newsletter), `lecture` (deciding whether two labels are the same concept), `traduction` (translation), `questions` (training questions for the local encoder).
161
+
162
+ ## Cost
163
+
164
+ Every model call goes through your subscription and counts against its usage limits; the cost ledger records each one at its API-equivalent price, so you can see where the usage goes (`newskit costs --by graph`). Concept extraction is the main item: measured on governance.news, about $0.25 per note with the default model (Opus), so about $10 per pass at the default cap of 40 notes. The cap is set per graph (`--cap` of `newskit new-graph`).
165
+
166
+ ## Commands
167
+
168
+ | Command | What it does |
169
+ | :- | :- |
170
+ | `newskit` | the commands, one line each |
171
+ | `newskit media` | the media as read: language, translations, passages, model per role |
172
+ | `newskit new-graph <name>` | creates a graph, or says what it lacks (`--check`) |
173
+ | `newskit run --graph <name>` | one pass: collection, notes, concept extraction within the cap, graph |
174
+ | `newskit query --graph <name> search "…"` | queries the graph, no model call; each answer carries its provenance |
175
+ | `newskit costs --by graph` | spending over the last seven days |
176
+ | `newskit test` | tries the engine on a sample graph, at no cost; a real pass starts only after a successful test the same day |
177
+
178
+ ## Safeguards
179
+
180
+ - **The test.** Before the real pass, the engine runs `newskit test` on the sample graph with recorded answers. The real pass starts only if a test passed the same day with the same engine version. An engine update therefore cannot break a pass unnoticed: it stops before spending anything.
181
+ - **The caps.** Each step has its own cap on notes and on spending; every model call is written to the cost ledger, under a step and a graph.
182
+ - **The usage limit.** After three usage limits in a row, the engine sets a marker that lasts three hours. The plugin's hook then refuses any model call started from Claude Code.
183
+
184
+ ## Works with
185
+
186
+ Newskit relies on:
187
+
188
+ - **[graphify](https://github.com/Graphify-Labs/graphify)**, installed with the package. Reads the structure of the documents, validates each extraction against the schema, builds the graph and splits it into communities.
189
+ - **[trafilatura](https://trafilatura.readthedocs.io)**, installed with the package. Main text extraction from web pages.
190
+ - **[pytest](https://pytest.org)**, installed with the package: `newskit test` runs on it.
191
+
192
+ The following tools extend its features when they are installed:
193
+
194
+ - **[accesspath](https://github.com/lfoletti/accesspath)** (sap). Website access audit. When a source keeps failing, Newskit asks sap which route still reaches it (RSS feed, API, sitemap, plain HTML, browser) and repairs the source.
195
+ - **[cortexdb](https://github.com/lfoletti/cortexdb)**. AI memory and knowledge graph in one SQLite file. A graph can be loaded into a cortexdb brain, each relation tied to the passage that supports it, and queried from any MCP client.
196
+ - **[thalamus](https://github.com/lfoletti/thalamus)**. A governance layer over cortexdb for an organisation's shared knowledge. Questions left unanswered by its clients return to the engine as searches.
197
+
198
+ ## Limits of version 0.1
199
+
200
+ - The prompts to the models are written in French; the only translation is English.
201
+ - macOS and Linux. Scheduled passes run through launchd on macOS; on Linux, through a cron line.
202
+ - `newskit new-graph` writes the graph's scheduled task under `taches/`, ready to install in `/Library/LaunchDaemons`.
203
+
204
+ ## Contributing
205
+
206
+ See [CONTRIBUTING.md](https://github.com/lfoletti/newskit/blob/main/CONTRIBUTING.md). Report a vulnerability privately: [SECURITY.md](https://github.com/lfoletti/newskit/blob/main/SECURITY.md).
207
+
208
+ ## Licence
209
+
210
+ [MIT](https://github.com/lfoletti/newskit/blob/main/LICENSE).
@@ -0,0 +1,167 @@
1
+ # Newskit
2
+
3
+ [![ci](https://github.com/lfoletti/newskit/actions/workflows/ci.yml/badge.svg)](https://github.com/lfoletti/newskit/actions/workflows/ci.yml)
4
+ [![licence MIT](https://img.shields.io/badge/licence-MIT-blue.svg)](https://github.com/lfoletti/newskit/blob/main/LICENSE)
5
+ [![version](https://img.shields.io/github/v/tag/lfoletti/newskit?label=version)](https://github.com/lfoletti/newskit/blob/main/CHANGELOG.md)
6
+
7
+ [English](https://github.com/lfoletti/newskit/blob/main/README.md) | Français
8
+
9
+ Une veille automatique pour Claude Code. Vous nommez un sujet et donnez quelques sources ; à intervalles réguliers, Newskit les collecte, écrit une fiche par article, en extrait les notions et leurs relations et tient à jour un graphe de connaissances, sous plafond de dépense. Deux choses le distinguent d'un lecteur de flux : chaque réponse tirée du graphe cite sa fiche et sa ligne ; le graphe s'étend de lui-même à des thèmes et à des sources nouveaux.
10
+
11
+ Pour des développeurs qui ont déjà Claude Code : chaque appel au modèle passe par `claude -p`, sous votre abonnement Claude. Les fiches, le fil et la lettre s'écrivent en français ; une traduction anglaise peut s'y ajouter (`traductions: [en]`).
12
+
13
+ [![governance.news, un média sur la gouvernance de l'IA bâti sur Newskit](https://raw.githubusercontent.com/lfoletti/newskit/main/docs/governance-news-fr.png)](https://governance.news/)
14
+
15
+ *[governance.news](https://governance.news/) : un bulletin et un graphe de connaissances sur la gouvernance de l'IA en entreprise, bâtis sur Newskit.*
16
+
17
+ ## Ce que vous obtenez
18
+
19
+ Tout vit dans le dossier du média, en fichiers ordinaires :
20
+
21
+ - **Des fiches** : un fichier Markdown par article collecté, sous `sources/`, avec son titre, son auteur, sa date et son adresse.
22
+ - **Le graphe** : `graphe/<nom>/graphe.json`, sa carte (`carte.md`, les grands thèmes et leurs notions) et le bilan de chaque passage (`ROUTINE.md`).
23
+ - **Des réponses sourcées** : `newskit query` cherche dans le graphe sans appel au modèle et donne, pour chaque réponse, la fiche et la ligne qui l'attestent.
24
+ - **Un fil et une lettre** : des billets courts sur les derniers articles (`fil.json`) et une lettre du graphe, envoyée par votre propre module de diffusion (`diffusion:` dans `config.yaml`).
25
+
26
+ ```text
27
+ $ newskit query --graph ai-governance sources "general-purpose AI model"
28
+ Sources attestant « General-purpose AI models »
29
+ sources/ai_compliance/rss/ec_digital/2026-08-02_navigating-ai-act.md L211
30
+ ```
31
+
32
+ ## Démarrage rapide
33
+
34
+ Il faut Python 3.12 ou plus récent, git, macOS ou Linux et Claude Code (`claude`) connecté.
35
+
36
+ Les mots employés plus bas : le **média** est le dossier du projet ; il porte un ou plusieurs **graphes** ; chaque graphe suit des **sujets** ; un **passage** collecte les sources du graphe et écrit une **fiche** par article.
37
+
38
+ 1. Installer le moteur et l'essayer dans un dossier vide :
39
+
40
+ ```sh
41
+ pip install newskit
42
+ mkdir mon-media && cd mon-media
43
+ newskit test
44
+ ```
45
+
46
+ L'essai fait faire au moteur un passage entier sur un graphe d'exemple (l'apiculture médiévale), avec des réponses du modèle rejouées d'un enregistrement : aucun appel payant, une minute environ. Il doit finir par « témoin vert » (essai réussi).
47
+
48
+ 2. Ouvrir Claude Code dans ce dossier (`claude`) et installer le plugin :
49
+
50
+ ```text
51
+ /plugin marketplace add lfoletti/newskit
52
+ /plugin install newskit@newskit
53
+ ```
54
+
55
+ 3. Demander à Claude de suivre un sujet : « fais naître un graphe de veille sur les potagers urbains ». Le skill `newskit` pose ses questions, écrit `config.yaml` et `sources.yaml`, propose des thèmes tirés des sources que vous donnez, fait naître le graphe et lance un premier passage sous vos yeux.
56
+
57
+ 4. Lire le résultat : `graphe/<nom>/ROUTINE.md` pour le bilan, `newskit query --graph <nom> search "…"` pour le graphe.
58
+
59
+ 5. Planifier les passages suivants. `newskit new-graph` a écrit la tâche du graphe sous `taches/` et imprimé les deux lignes `sudo` qui la posent dans launchd (macOS). Sous Linux, ajouter une ligne de cron à chaque heure de `passages`, qui lance `newskit test` puis `newskit run --graph <nom> --scheduled` ; un jour hors de l'intervalle, le passage planifié s'arrête de lui-même.
60
+
61
+ ## Les sources
62
+
63
+ Les sources se déclarent dans `sources.yaml`, à côté de `config.yaml`, un bloc par source, chacune rattachée à un graphe. Pris en charge : flux RSS, plans de site et pages de liste (pour les sites sans flux), Substack, Medium, lettres LinkedIn, arXiv, revues par ISSN, OpenAlex, recherches GitHub et Hugging Face, une boîte de courriel, des dossiers locaux de fichiers Markdown ou PDF.
64
+
65
+ ```yaml
66
+ version: 1
67
+ sources:
68
+ - cle: city_farmer
69
+ plateforme: Flux RSS
70
+ nom: City Farmer News
71
+ dossier: potagers/rss
72
+ abonnement: gratuit
73
+ graphe: potagers-urbains
74
+ flux: https://cityfarmer.info/feed/
75
+ - cle: soil_papers
76
+ plateforme: OpenAlex
77
+ nom: OpenAlex, urban soil
78
+ dossier: potagers/openalex
79
+ abonnement: gratuit
80
+ graphe: potagers-urbains
81
+ requetes: ["urban allotment soil contamination"]
82
+ ```
83
+
84
+ Le skill écrit ce fichier pour vous à partir des adresses que vous donnez ; une source que le moteur ne sait pas lire est refusée avec sa raison.
85
+
86
+ ## Comment le graphe grandit
87
+
88
+ Le graphe ne reste pas dans les sujets déclarés au départ : il s'étend.
89
+
90
+ - **Thèmes nouveaux.** Après chaque passage, le moteur cherche les groupes de notions qu'aucun sujet déclaré ne couvre. Un candidat qui revient trois passages de suite entre parmi les sujets ; les sources et les recherches le suivent.
91
+ - **Auto-complétion.** Une question à laquelle le graphe n'a pas su répondre devient une recherche du passage suivant. Un éclaireur cherche sur le web autour des sujets déclarés ; un poseur de questions interroge le graphe comme le ferait un praticien ; ce qu'un modèle de langage tient pour essentiel et que le graphe n'a pas devient une liste de sources à trouver.
92
+ - **La liste des sources.** Le moteur étudie un domaine candidat avant de le déclarer et garde la mémoire de chaque source qu'un lecteur dépose (un lien envoyé depuis le navigateur). Une source qui échoue plusieurs fois est auditée et, quand une voie existe, réparée d'elle-même (voir accesspath plus bas).
93
+ - **Des notions nettes.** La même notion sous plusieurs libellés (traduction, sigle, variante) est fondue après qu'un modèle a confirmé qu'il s'agit exactement de la même ; les refus sont gardés et jamais redemandés.
94
+
95
+ ## Le dossier du média
96
+
97
+ Le média est un dossier qui porte un `config.yaml`. Le moteur s'y accroche : la variable `NEWSKIT_DONNEES` d'abord, sinon le dossier courant. Le code reste dans le paquet installé ; les données (fiches, graphe, registre des coûts) vivent dans le dossier du média.
98
+
99
+ ```yaml
100
+ version: 1
101
+ media:
102
+ nom: potagers # le nom : minuscules, chiffres et tirets
103
+ langue: fr # la langue des consignes et de la publication
104
+ traductions: [en] # fil et lettre traduits ; aucune par défaut
105
+ passages: {tous_les: 1, heures: ["05:30"]} # tous les N jours, à ces heures
106
+ modeles: # un modèle par rôle ; un rôle absent garde son défaut
107
+ extraction: claude-opus-5-5
108
+ redaction: claude-sonnet-5-5
109
+ sources: sources.yaml # le fichier des sources, à part
110
+ # registre_des_graphes: graphes.json # libellés et sujets déclarés, tenus par le moteur (défaut)
111
+ graphes:
112
+ potagers-urbains:
113
+ libelle: Potagers urbains # le libellé
114
+ domaine: "urban gardening: allotments, soil, seed exchange" # le domaine, en anglais, pour l'extraction
115
+ ```
116
+
117
+ `newskit media` dit ce qui est lu ; un champ inconnu est refusé et nommé. Les rôles : `extraction` (lire une fiche et en tirer les notions), `analyse` (juger un graphe entier), `redaction` (synthèses et lettre), `lecture` (trancher si deux libellés sont la même notion), `traduction`, `questions` (questions d'entraînement de l'encodeur local).
118
+
119
+ ## Le coût
120
+
121
+ Chaque appel au modèle passe par votre abonnement et compte dans ses limites d'usage ; le registre des coûts inscrit chacun à son prix d'API, pour voir où va l'usage (`newskit costs --by graph`). L'extraction des notions est le poste principal : mesurée sur governance.news, environ 0,25 $ par fiche avec le modèle par défaut (Opus), soit environ 10 $ par passage au plafond par défaut de 40 fiches. Le plafond se règle par graphe (`--cap` de `newskit new-graph`).
122
+
123
+ ## Les commandes
124
+
125
+ | Commande | Ce qu'elle fait |
126
+ | :- | :- |
127
+ | `newskit` | les commandes, une ligne chacune |
128
+ | `newskit media` | le média lu : langue, traductions, passages, modèle par rôle |
129
+ | `newskit new-graph <name>` | fait naître un graphe, ou dit ce qui lui manque (`--check`) |
130
+ | `newskit run --graph <name>` | un passage : collecte, fiches, extraction des notions sous plafond, graphe |
131
+ | `newskit query --graph <name> search "…"` | interroge le graphe, sans appel au modèle ; chaque réponse porte sa provenance |
132
+ | `newskit costs --by graph` | la dépense des sept derniers jours |
133
+ | `newskit test` | essaie le moteur sur un graphe d'exemple, sans frais ; un vrai passage ne part qu'après un essai réussi le même jour |
134
+
135
+ ## Les gardes
136
+
137
+ - **L'essai.** Avant le vrai passage, le moteur lance `newskit test` sur le graphe d'exemple, avec des réponses enregistrées. Le vrai passage ne part que si un essai a réussi le même jour avec la même version du moteur. Une mise à jour du moteur ne peut donc pas casser un passage sans qu'on le voie : il s'arrête avant de rien dépenser.
138
+ - **Les plafonds.** Chaque étape a son plafond de fiches et de dépense ; chaque appel au modèle entre au registre des coûts, sous une étape et un graphe.
139
+ - **La limite d'usage.** Après trois limites d'affilée, le moteur pose une marque qui vaut trois heures. Le crochet du plugin refuse alors tout appel au modèle lancé depuis Claude Code.
140
+
141
+ ## Avec d'autres outils
142
+
143
+ Newskit s'appuie sur :
144
+
145
+ - **[graphify](https://github.com/Graphify-Labs/graphify)**, installé avec le paquet. Lit la structure des documents, valide chaque extraction contre le schéma, compose le graphe et le découpe en communautés.
146
+ - **[trafilatura](https://trafilatura.readthedocs.io)**, installé avec le paquet. Extraction du texte principal des pages web.
147
+ - **[pytest](https://pytest.org)**, installé avec le paquet : `newskit test` tourne dessus.
148
+
149
+ Les outils suivants en étendent les fonctionnalités quand ils sont installés :
150
+
151
+ - **[accesspath](https://github.com/lfoletti/accesspath)** (sap). Audit d'accès aux sites web. Quand une source échoue plusieurs fois, Newskit demande à sap quelle voie l'atteint encore (flux RSS, API, plan du site, HTML simple, navigateur) et répare la source.
152
+ - **[cortexdb](https://github.com/lfoletti/cortexdb)**. Mémoire d'IA et graphe de connaissances dans un seul fichier SQLite. Un graphe peut être versé dans un cerveau cortexdb, chaque relation rattachée au passage qui la soutient, puis interrogé depuis tout client MCP.
153
+ - **[thalamus](https://github.com/lfoletti/thalamus)**. Une couche de gouvernance sur cortexdb pour le savoir partagé d'une organisation. Les questions restées sans réponse chez ses clients reviennent au moteur comme recherches.
154
+
155
+ ## Limites de la version 0.1
156
+
157
+ - Les consignes aux modèles sont écrites en français ; la seule traduction est l'anglais.
158
+ - macOS et Linux. Les passages planifiés passent par launchd sur macOS ; sous Linux, par une ligne de cron.
159
+ - `newskit new-graph` écrit la tâche planifiée du graphe sous `taches/`, prête à poser dans `/Library/LaunchDaemons`.
160
+
161
+ ## Contribuer
162
+
163
+ Voir [CONTRIBUTING.md](https://github.com/lfoletti/newskit/blob/main/CONTRIBUTING.md). Une faille se signale en privé : [SECURITY.md](https://github.com/lfoletti/newskit/blob/main/SECURITY.md).
164
+
165
+ ## Licence
166
+
167
+ [MIT](https://github.com/lfoletti/newskit/blob/main/LICENSE).