argo-search 1.0.1 → 2.9.8

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 (472) hide show
  1. package/LICENSE +201 -21
  2. package/README.en.md +735 -0
  3. package/README.es.md +777 -0
  4. package/README.ja.md +777 -0
  5. package/README.ko.md +777 -0
  6. package/README.md +778 -320
  7. package/SKILL.md +135 -0
  8. package/assets/readme/hero.svg +121 -0
  9. package/assets/readme/made-with-beautify.svg +10 -0
  10. package/assets/readme/proof-routes.svg +73 -0
  11. package/assets/readme/why-better.svg +104 -0
  12. package/assets/readme/workflow.svg +83 -0
  13. package/backends/domain_profiles.json +2356 -96
  14. package/backends/engine_registry.yaml +3428 -503
  15. package/backends/query_synonyms_cn.json +35 -0
  16. package/backends/quota_profiles.json +2488 -160
  17. package/backends/source_types_cn.json +109 -0
  18. package/backends/text_lexicon.json +44 -0
  19. package/bin/argo +772 -0
  20. package/bin/argo.js +102 -39
  21. package/config.yaml +5139 -367
  22. package/cordis.patch.yml +21 -0
  23. package/data/countries.json +40 -0
  24. package/data/lang_matrix/lang_capability.json +842 -0
  25. package/data/lang_matrix/matrix_2026-09-10.json +11921 -0
  26. package/data/regions_cn.json +1 -0
  27. package/docs/ADDING_NEW_ENGINE.md +184 -0
  28. package/docs/ARGO_INTRO.md +124 -0
  29. package/docs/DATA_SOURCE_GAPS.md +81 -0
  30. package/docs/DESIGN_LOCAL_DATA_FUSION.md +90 -0
  31. package/docs/ENGINE_CATALOG.md +575 -0
  32. package/docs/MCP_SETUP.md +108 -0
  33. package/docs/PLATFORM_PATHS.md +111 -0
  34. package/docs/RELEASE_NOTES_v2.8.0.md +71 -0
  35. package/docs/RELEASE_NOTES_v2.8.2.md +63 -0
  36. package/docs/RELEASE_NOTES_v2.8.3.md +55 -0
  37. package/docs/RELEASE_NOTES_v2.8.4.md +79 -0
  38. package/docs/RELEASE_NOTES_v2.8.5.md +102 -0
  39. package/docs/RELEASE_NOTES_v2.8.6.md +66 -0
  40. package/docs/RELEASE_NOTES_v2.8.7.md +65 -0
  41. package/docs/RELEASE_NOTES_v2.8.8.md +67 -0
  42. package/docs/RELEASE_NOTES_v2.8.9.md +67 -0
  43. package/docs/RELEASE_NOTES_v2.9.0.md +64 -0
  44. package/docs/RELEASE_NOTES_v2.9.8.md +73 -0
  45. package/docs/SEARCH_ARCHIVE.md +115 -0
  46. package/docs/assets/architecture.svg +104 -0
  47. package/docs/assets/hero.svg +98 -0
  48. package/docs/engines/bangumi.md +27 -0
  49. package/docs/engines/biorxiv.md +27 -0
  50. package/docs/engines/clawhub.md +27 -0
  51. package/docs/engines/crt_sh.md +27 -0
  52. package/docs/engines/datacite.md +27 -0
  53. package/docs/engines/deps_dev.md +27 -0
  54. package/docs/engines/douban_movie.md +27 -0
  55. package/docs/engines/endoflife.md +27 -0
  56. package/docs/engines/flk_law.md +27 -0
  57. package/docs/engines/fxtwitter.md +27 -0
  58. package/docs/engines/google_news.md +27 -0
  59. package/docs/engines/gov_regulations.md +27 -0
  60. package/docs/engines/guqian.md +27 -0
  61. package/docs/engines/hackernews.md +27 -0
  62. package/docs/engines/iplant.md +27 -0
  63. package/docs/engines/keenable.md +27 -0
  64. package/docs/engines/met_museum.md +27 -0
  65. package/docs/engines/nasa_images.md +27 -0
  66. package/docs/engines/netease_music.md +27 -0
  67. package/docs/engines/npm.md +27 -0
  68. package/docs/engines/nvd.md +27 -0
  69. package/docs/engines/openreview.md +27 -0
  70. package/docs/engines/openstd.md +27 -0
  71. package/docs/engines/parallel_free.md +27 -0
  72. package/docs/engines/people_daily.md +27 -0
  73. package/docs/engines/realtime_index.md +27 -0
  74. package/docs/engines/sec_edgar.md +27 -0
  75. package/docs/engines/seltz.md +27 -0
  76. package/docs/engines/skillsmp.md +27 -0
  77. package/docs/engines/sspai.md +27 -0
  78. package/docs/engines/std_samr.md +27 -0
  79. package/docs/engines/train.md +27 -0
  80. package/docs/engines/un_comtrade.md +27 -0
  81. package/docs/engines/wikisource.md +27 -0
  82. package/docs/engines/zdic.md +27 -0
  83. package/docs/engines/zenodo.md +27 -0
  84. package/docs/engines/zhihu_hot_app.md +27 -0
  85. package/docs//344/270/272/344/273/200/344/271/210/351/200/211/346/213/251argo.md +176 -0
  86. package/engines/README.md +10 -0
  87. package/engines/_template_cli.yaml +39 -0
  88. package/engines/_template_http.yaml +37 -0
  89. package/engines/plugins/_template_plugin.py +50 -0
  90. package/engines/specs/_cisa_kev.yaml +54 -0
  91. package/engines/specs/_osv.yaml +63 -0
  92. package/engines/specs/aljazeera.yaml +43 -0
  93. package/engines/specs/antara.yaml +43 -0
  94. package/engines/specs/artic.yaml +20 -0
  95. package/engines/specs/aviation_weather.yaml +39 -0
  96. package/engines/specs/bangumi.yaml +21 -0
  97. package/engines/specs/biorxiv.yaml +24 -0
  98. package/engines/specs/carbon_intensity.yaml +32 -0
  99. package/engines/specs/cfets.yaml +41 -0
  100. package/engines/specs/cinii.yaml +44 -0
  101. package/engines/specs/clawhub.yaml +49 -0
  102. package/engines/specs/cleveland.yaml +19 -0
  103. package/engines/specs/cn_ai_news.yaml +43 -0
  104. package/engines/specs/core.yaml +35 -0
  105. package/engines/specs/crt_sh.yaml +38 -0
  106. package/engines/specs/ct24.yaml +43 -0
  107. package/engines/specs/datacite.yaml +27 -0
  108. package/engines/specs/datagov_uk.yaml +41 -0
  109. package/engines/specs/ddgs_images.yaml +45 -0
  110. package/engines/specs/deepseek_search.yaml +74 -0
  111. package/engines/specs/deezer.yaml +20 -0
  112. package/engines/specs/defillama.yaml +38 -0
  113. package/engines/specs/deps_dev.yaml +21 -0
  114. package/engines/specs/digup.yaml +36 -0
  115. package/engines/specs/doi.yaml +39 -0
  116. package/engines/specs/douban_movie.yaml +22 -0
  117. package/engines/specs/dw_news.yaml +47 -0
  118. package/engines/specs/egov_law.yaml +21 -0
  119. package/engines/specs/elpais.yaml +43 -0
  120. package/engines/specs/endoflife.yaml +21 -0
  121. package/engines/specs/energy_charts.yaml +21 -0
  122. package/engines/specs/factcheck_org.yaml +52 -0
  123. package/engines/specs/faz.yaml +43 -0
  124. package/engines/specs/federal_register.yaml +57 -0
  125. package/engines/specs/firecrawl.yaml +53 -0
  126. package/engines/specs/flk_law.yaml +24 -0
  127. package/engines/specs/folha.yaml +43 -0
  128. package/engines/specs/france24.yaml +44 -0
  129. package/engines/specs/full_fact.yaml +47 -0
  130. package/engines/specs/fxtwitter.yaml +36 -0
  131. package/engines/specs/gbfs_nyc.yaml +32 -0
  132. package/engines/specs/gdacs.yaml +21 -0
  133. package/engines/specs/gdelt.yaml +64 -0
  134. package/engines/specs/gleif.yaml +55 -0
  135. package/engines/specs/google_news.yaml +22 -0
  136. package/engines/specs/gov_regulations.yaml +38 -0
  137. package/engines/specs/guardian_rss.yaml +59 -0
  138. package/engines/specs/hkex.yaml +40 -0
  139. package/engines/specs/hurriyet.yaml +43 -0
  140. package/engines/specs/iplant.yaml +25 -0
  141. package/engines/specs/jikan.yaml +24 -0
  142. package/engines/specs/jolpica.yaml +20 -0
  143. package/engines/specs/k10plus.yaml +20 -0
  144. package/engines/specs/keenable.yaml +44 -0
  145. package/engines/specs/keenable_free.yaml +36 -0
  146. package/engines/specs/lefigaro.yaml +43 -0
  147. package/engines/specs/listenbrainz.yaml +19 -0
  148. package/engines/specs/matichon.yaml +43 -0
  149. package/engines/specs/met_museum.yaml +21 -0
  150. package/engines/specs/nasa_images.yaml +45 -0
  151. package/engines/specs/netease_music.yaml +38 -0
  152. package/engines/specs/nhk.yaml +43 -0
  153. package/engines/specs/nhtsa_vpic.yaml +20 -0
  154. package/engines/specs/noaa_swpc.yaml +20 -0
  155. package/engines/specs/nvd.yaml +38 -0
  156. package/engines/specs/obis.yaml +20 -0
  157. package/engines/specs/opencitations.yaml +52 -0
  158. package/engines/specs/openf1.yaml +21 -0
  159. package/engines/specs/openfoodfacts.yaml +45 -0
  160. package/engines/specs/openligadb.yaml +20 -0
  161. package/engines/specs/openreview.yaml +37 -0
  162. package/engines/specs/openstd.yaml +21 -0
  163. package/engines/specs/people_daily.yaml +22 -0
  164. package/engines/specs/realtime_index.yaml +34 -0
  165. package/engines/specs/ror.yaml +20 -0
  166. package/engines/specs/satnogs.yaml +20 -0
  167. package/engines/specs/sec_edgar.yaml +46 -0
  168. package/engines/specs/shfe.yaml +39 -0
  169. package/engines/specs/skillsmp.yaml +50 -0
  170. package/engines/specs/sogou_weixin_browser.yaml +30 -0
  171. package/engines/specs/soilgrids.yaml +25 -0
  172. package/engines/specs/sspai.yaml +36 -0
  173. package/engines/specs/stackexchange.yaml +46 -0
  174. package/engines/specs/std_samr.yaml +21 -0
  175. package/engines/specs/tass.yaml +43 -0
  176. package/engines/specs/tavily_free.yaml +56 -0
  177. package/engines/specs/tle_mirror.yaml +21 -0
  178. package/engines/specs/train.yaml +37 -0
  179. package/engines/specs/tvmaze.yaml +20 -0
  180. package/engines/specs/twitter_syndication.yaml +31 -0
  181. package/engines/specs/un_comtrade.yaml +23 -0
  182. package/engines/specs/unpaywall.yaml +54 -0
  183. package/engines/specs/vnpress.yaml +43 -0
  184. package/engines/specs/weather.yaml +32 -0
  185. package/engines/specs/who_don.yaml +21 -0
  186. package/engines/specs/who_gho.yaml +20 -0
  187. package/engines/specs/wikimedia_commons.yaml +34 -0
  188. package/engines/specs/wikisource.yaml +22 -0
  189. package/engines/specs/worms.yaml +19 -0
  190. package/engines/specs/x_trending.yaml +34 -0
  191. package/engines/specs/yna.yaml +43 -0
  192. package/engines/specs/ynet.yaml +43 -0
  193. package/engines/specs/yuanbao.yaml +93 -0
  194. package/engines/specs/zbmath.yaml +40 -0
  195. package/engines/specs/zdic.yaml +22 -0
  196. package/engines/specs/zenodo.yaml +27 -0
  197. package/engines/specs/zhihu_hot_app.yaml +35 -0
  198. package/mcp/clients.yaml +106 -0
  199. package/package.json +55 -12
  200. package/packages/dsh-plugin/README.md +152 -0
  201. package/packages/dsh-plugin/cordis.patch.yml +48 -0
  202. package/packages/dsh-plugin/dsh/client.js +1533 -0
  203. package/packages/dsh-plugin/dsh/diagnostics.js +54 -0
  204. package/packages/dsh-plugin/dsh/index.js +527 -0
  205. package/packages/dsh-plugin/dsh/native-tools.mjs +749 -0
  206. package/packages/dsh-plugin/dsh/runner.js +666 -0
  207. package/packages/dsh-plugin/dsh/wide-research.js +878 -0
  208. package/packages/dsh-plugin/package.json +38 -0
  209. package/packages/dsh-plugin/scripts/sync-local.sh +70 -0
  210. package/packages/dsh-plugin/test/client.test.js +406 -0
  211. package/packages/dsh-plugin/test/config.test.js +30 -0
  212. package/packages/dsh-plugin/test/diagnostics.test.js +28 -0
  213. package/packages/dsh-plugin/test/index.test.js +1382 -0
  214. package/references/query-templates.md +96 -0
  215. package/references/query-templates.yaml +118 -0
  216. package/scripts/ab_eval.py +219 -0
  217. package/scripts/ab_eval_p0p1.py +266 -0
  218. package/scripts/adaptive.py +294 -70
  219. package/scripts/answer.py +154 -0
  220. package/scripts/archive_run.py +591 -0
  221. package/scripts/argo_engine_registry.py +172 -0
  222. package/scripts/argo_paths.py +728 -0
  223. package/scripts/article.py +136 -0
  224. package/scripts/article_meta.py +131 -0
  225. package/scripts/arxiv_source.py +201 -0
  226. package/scripts/badcase_ledger.py +252 -0
  227. package/scripts/batch_probe.py +241 -0
  228. package/scripts/benchmark.py +19 -0
  229. package/scripts/bounded_run.py +144 -0
  230. package/scripts/browser_auth.py +323 -0
  231. package/scripts/budget.py +247 -0
  232. package/scripts/budget_cli.py +93 -0
  233. package/scripts/build_release_assets.sh +65 -0
  234. package/scripts/burstiness_detector.py +147 -0
  235. package/scripts/cache.py +1066 -67
  236. package/scripts/cache_guard.py +271 -0
  237. package/scripts/cache_key_vdom.py +56 -0
  238. package/scripts/cache_similarity.py +170 -0
  239. package/scripts/caliber_isolation.py +195 -0
  240. package/scripts/calibrate_lowquality.py +210 -0
  241. package/scripts/candidate_envelope.py +366 -0
  242. package/scripts/chrome_cdp.py +871 -0
  243. package/scripts/ci_drift_gate.py +90 -0
  244. package/scripts/circuit_breaker.py +389 -0
  245. package/scripts/citations.py +334 -0
  246. package/scripts/cite_cli.py +59 -0
  247. package/scripts/cjk_tokens.py +95 -0
  248. package/scripts/clarify.py +47 -24
  249. package/scripts/cli_io.py +240 -0
  250. package/scripts/config.py +683 -45
  251. package/scripts/config_cache.py +402 -0
  252. package/scripts/conn_pool.py +220 -0
  253. package/scripts/content_boundary.py +46 -0
  254. package/scripts/content_security.py +685 -0
  255. package/scripts/content_signals.py +751 -0
  256. package/scripts/crawl.py +74 -35
  257. package/scripts/cross_lingual_trace.py +293 -0
  258. package/scripts/daemon.py +866 -0
  259. package/scripts/digup_bridge.py +214 -0
  260. package/scripts/dispatch_result.py +98 -0
  261. package/scripts/engine_admission.py +366 -0
  262. package/scripts/engine_dispatch.py +982 -0
  263. package/scripts/engine_env.py +539 -0
  264. package/scripts/engine_failure.py +411 -0
  265. package/scripts/engine_families.py +738 -0
  266. package/scripts/engine_policy.py +218 -0
  267. package/scripts/engine_requires.py +190 -0
  268. package/scripts/engine_status.py +322 -0
  269. package/scripts/engine_validate.py +638 -0
  270. package/scripts/engines.py +799 -294
  271. package/scripts/engines_base.py +1521 -0
  272. package/scripts/engines_builders.py +310 -0
  273. package/scripts/engines_builders_batch10.py +204 -0
  274. package/scripts/engines_builders_batch11.py +174 -0
  275. package/scripts/engines_builders_batch12.py +103 -0
  276. package/scripts/engines_builders_batch13.py +340 -0
  277. package/scripts/engines_builders_batch14.py +656 -0
  278. package/scripts/engines_builders_batch15.py +249 -0
  279. package/scripts/engines_builders_batch9.py +1468 -0
  280. package/scripts/engines_builders_cn.py +2283 -0
  281. package/scripts/engines_builders_data.py +2923 -0
  282. package/scripts/engines_builders_data_macro.py +775 -0
  283. package/scripts/engines_builders_feeds.py +255 -0
  284. package/scripts/engines_builders_intl.py +1239 -0
  285. package/scripts/engines_builders_keyless.py +111 -0
  286. package/scripts/engines_builders_search.py +440 -0
  287. package/scripts/engines_builders_tech.py +1359 -0
  288. package/scripts/evidence.py +620 -166
  289. package/scripts/evidence_loop.py +624 -0
  290. package/scripts/evidence_tier.py +298 -0
  291. package/scripts/except_sets.py +25 -0
  292. package/scripts/extract.py +55 -16
  293. package/scripts/fact_align.py +207 -0
  294. package/scripts/fact_crosscheck.py +230 -0
  295. package/scripts/fetch.py +25 -12
  296. package/scripts/fetch_browser.py +87 -0
  297. package/scripts/fetch_jsrun.py +122 -0
  298. package/scripts/fetch_quality.py +225 -0
  299. package/scripts/fetch_render_tinyfish.py +117 -0
  300. package/scripts/fetch_v3.py +1804 -0
  301. package/scripts/focus_extract.py +350 -0
  302. package/scripts/fulltext_store.py +169 -0
  303. package/scripts/fxtwitter_api.py +325 -0
  304. package/scripts/gen_engine_catalog.py +364 -0
  305. package/scripts/gen_native_tools.py +91 -0
  306. package/scripts/gen_routing_snapshot.py +195 -0
  307. package/scripts/health_check.py +140 -402
  308. package/scripts/health_probe.py +23 -8
  309. package/scripts/hot_state.py +134 -0
  310. package/scripts/http_client.py +1053 -0
  311. package/scripts/image_ops.py +430 -0
  312. package/scripts/image_vision/vision_probe.swift +126 -0
  313. package/scripts/install.ps1 +166 -0
  314. package/scripts/install.sh +221 -0
  315. package/scripts/job.py +1186 -0
  316. package/scripts/jump_resolver.py +235 -0
  317. package/scripts/lang_capability.py +150 -0
  318. package/scripts/lang_detect.py +289 -0
  319. package/scripts/lang_matrix_probe.py +329 -0
  320. package/scripts/lang_pref.py +311 -0
  321. package/scripts/link_source.py +340 -0
  322. package/scripts/local_image.py +970 -0
  323. package/scripts/local_seek.py +402 -0
  324. package/scripts/macro_countries.py +97 -0
  325. package/scripts/matrix_search_eval.py +1187 -0
  326. package/scripts/mcp_compact.py +234 -0
  327. package/scripts/mcp_diag.py +8 -3
  328. package/scripts/mcp_handlers.py +492 -0
  329. package/scripts/mcp_handlers_surface.py +157 -0
  330. package/scripts/mcp_launch.sh +124 -0
  331. package/scripts/mcp_local.py +241 -0
  332. package/scripts/mcp_server.py +125 -419
  333. package/scripts/mcp_setup.py +431 -0
  334. package/scripts/mcp_tools.py +331 -0
  335. package/scripts/mcp_transport.py +191 -0
  336. package/scripts/mcp_warm.py +127 -0
  337. package/scripts/min_version_scan.py +335 -0
  338. package/scripts/net_proxy.py +258 -0
  339. package/scripts/network_aware.py +152 -0
  340. package/scripts/output_transparency.py +200 -0
  341. package/scripts/paid_policy.py +98 -0
  342. package/scripts/paper.py +274 -0
  343. package/scripts/pdf_extract.py +518 -0
  344. package/scripts/phrase_filter.py +66 -0
  345. package/scripts/plan.py +422 -0
  346. package/scripts/postprocess_signals.py +150 -0
  347. package/scripts/pre-commit +48 -0
  348. package/scripts/query_enhance.py +157 -0
  349. package/scripts/query_operators.py +196 -0
  350. package/scripts/query_rewriter.py +116 -7
  351. package/scripts/query_signals.py +300 -0
  352. package/scripts/query_templates.py +167 -0
  353. package/scripts/query_understanding.py +411 -0
  354. package/scripts/query_variants.py +298 -0
  355. package/scripts/quota.py +633 -76
  356. package/scripts/rank_signals.py +775 -0
  357. package/scripts/ranking_eval.py +319 -0
  358. package/scripts/readability_extract.py +433 -0
  359. package/scripts/recompute.py +415 -0
  360. package/scripts/recovery.py +616 -0
  361. package/scripts/recovery_l0.py +160 -0
  362. package/scripts/recovery_runner.py +150 -0
  363. package/scripts/redskill/redskill_engine.py +332 -0
  364. package/scripts/regression_p0p1.py +318 -0
  365. package/scripts/replay_eval.py +658 -0
  366. package/scripts/rerank_tfidf.py +225 -0
  367. package/scripts/research.py +607 -403
  368. package/scripts/research_cli.py +361 -0
  369. package/scripts/research_dossier.py +492 -0
  370. package/scripts/research_expand.py +169 -0
  371. package/scripts/research_gates.py +272 -0
  372. package/scripts/research_report.py +209 -0
  373. package/scripts/research_strategy.py +37 -0
  374. package/scripts/research_work_packages.py +195 -0
  375. package/scripts/result_lang.py +311 -0
  376. package/scripts/retry_policy.py +76 -0
  377. package/scripts/robots_guard.py +259 -0
  378. package/scripts/route.py +921 -254
  379. package/scripts/route_bangs.py +40 -0
  380. package/scripts/route_cache.py +243 -0
  381. package/scripts/route_combo.py +917 -0
  382. package/scripts/route_domains.py +341 -0
  383. package/scripts/route_lang.py +605 -0
  384. package/scripts/route_log.py +63 -0
  385. package/scripts/route_policy.py +250 -0
  386. package/scripts/rrf_classic.py +66 -0
  387. package/scripts/screenshot.py +73 -0
  388. package/scripts/search.py +886 -406
  389. package/scripts/search_attribution.py +185 -0
  390. package/scripts/search_benchmark.py +407 -0
  391. package/scripts/search_cli.py +640 -0
  392. package/scripts/search_entry.py +395 -0
  393. package/scripts/search_output.py +690 -0
  394. package/scripts/search_pipeline.py +926 -0
  395. package/scripts/search_rank.py +991 -0
  396. package/scripts/search_types.py +129 -16
  397. package/scripts/seek_locator.py +68 -0
  398. package/scripts/semantic_evidence.py +391 -0
  399. package/scripts/serp_guard.py +336 -0
  400. package/scripts/serp_kill_log.py +74 -0
  401. package/scripts/single_flight.py +120 -0
  402. package/scripts/social_engines/__init__.py +10 -0
  403. package/scripts/social_engines/bilibili_engine.py +131 -0
  404. package/scripts/social_engines/hackernews_engine.py +113 -0
  405. package/scripts/social_engines/reddit_engine.py +172 -0
  406. package/scripts/social_engines/twitter_engine.py +397 -0
  407. package/scripts/social_engines/v2ex_engine.py +101 -0
  408. package/scripts/social_engines/weibo_engine.py +128 -0
  409. package/scripts/social_engines/xiaohongshu_engine.py +137 -0
  410. package/scripts/social_engines/zhihu_engine.py +139 -0
  411. package/scripts/social_research.py +201 -0
  412. package/scripts/sogou_weixin_browser.py +318 -0
  413. package/scripts/source_ledger.py +249 -0
  414. package/scripts/stage_timing.py +58 -0
  415. package/scripts/stats_cli.py +107 -0
  416. package/scripts/straggler_policy.py +60 -0
  417. package/scripts/stylometry_detector.py +231 -0
  418. package/scripts/sync_backends.py +353 -0
  419. package/scripts/sync_installs.py +29 -0
  420. package/scripts/template_cli.py +127 -0
  421. package/scripts/text_lexicon.py +72 -0
  422. package/scripts/tfidf_router.py +109 -37
  423. package/scripts/time_utils.py +233 -0
  424. package/scripts/topic_research_profiles.py +643 -0
  425. package/scripts/train.py +737 -0
  426. package/scripts/tweet.py +596 -0
  427. package/scripts/url_canon.py +217 -0
  428. package/scripts/url_optimize.py +56 -0
  429. package/scripts/url_safety.py +236 -0
  430. package/scripts/usage_log.py +116 -0
  431. package/scripts/usage_log_clean.py +113 -0
  432. package/scripts/v2ex_nodes.py +311 -0
  433. package/scripts/variant_recall.py +188 -0
  434. package/scripts/watch.py +205 -0
  435. package/scripts/wechat_article.py +258 -0
  436. package/scripts/wide_research.py +447 -0
  437. package/scripts/wx.py +349 -0
  438. package/scripts/x_article_fetch.py +141 -0
  439. package/scripts/x_search.py +234 -0
  440. package/scripts/x_trending.py +189 -0
  441. package/scripts/yaml_load.py +67 -0
  442. package/scripts/zhihu_quota.py +139 -0
  443. package/sub-skills/ego-search/SKILL.md +253 -0
  444. package/sub-skills/ego-search/scripts/ego_search.py +800 -0
  445. package/sub-skills/ego-search/scripts/merge.py +226 -0
  446. package/sub-skills/ego-search/scripts/quality.py +64 -0
  447. package/sub-skills/ego-search/scripts/runtime.py +172 -0
  448. package/sub-skills/ego-search/scripts/safety.py +109 -0
  449. package/sub-skills/ego-search/scripts/serp_spec.py +109 -0
  450. package/sub-skills/ego-search/scripts/webbridge_adapter.py +374 -0
  451. package/sub-skills/js-run/SKILL.md +67 -0
  452. package/sub-skills/js-run/scripts/jsrun.py +112 -0
  453. package/sub-skills/js-run/scripts/shim.js +188 -0
  454. package/sub-skills/local-search/SKILL.md +50 -53
  455. package/sub-skills/local-search/bm25.py +186 -0
  456. package/sub-skills/local-search/cli_runner.py +331 -0
  457. package/sub-skills/local-search/config.yaml +152 -55
  458. package/sub-skills/local-search/engine_registry.py +91 -26
  459. package/sub-skills/local-search/{health_check.py → local_health_check.py} +140 -10
  460. package/sub-skills/local-search/local_search_adapter.py +13 -2
  461. package/sub-skills/local-search/parse_maps.yaml +40 -42
  462. package/sub-skills/local-search/parsers.py +328 -0
  463. package/sub-skills/local-search/search_v3.py +716 -242
  464. package/sub-skills/local-search/smart_router.py +47 -7
  465. package/sub-skills/local-seek/SKILL.md +110 -0
  466. package/sub-skills/local-seek/config/domains.yaml +20 -0
  467. package/sub-skills/local-seek/scripts/eval_rank.py +216 -0
  468. package/sub-skills/local-seek/scripts/eval_seek.py +224 -0
  469. package/sub-skills/local-seek/scripts/seek.py +1465 -0
  470. package/sub-skills/local-seek/scripts/seek_frecency.py +126 -0
  471. package/sub-skills/local-seek/scripts/seek_fts.py +430 -0
  472. package/sub-skills/local-seek/scripts/seek_rank.py +197 -0
@@ -0,0 +1,166 @@
1
+ # Argo 一键安装脚本(Windows PowerShell 版)
2
+ # 与 install.sh 对齐:克隆/更新真源 + 依赖 + 可选 Skill 链接
3
+ # 用法:
4
+ # powershell -ExecutionPolicy RemoteSigned -File scripts/install.ps1
5
+ # powershell -ExecutionPolicy RemoteSigned -File scripts/install.ps1 --link C:\path\to\skill
6
+ # $env:ARGO_HOME = "C:\path\to\argo"; powershell -ExecutionPolicy RemoteSigned -File scripts/install.ps1
7
+ #
8
+ # 安全提示:
9
+ # - 本脚本经 git clone 落地(非网络下载),RemoteSigned 已足够放行本地脚本。
10
+ # 若因下载文件的 MOTW 被拦,先 `Unblock-File scripts\install.ps1` 再运行,
11
+ # 避免使用 `-ExecutionPolicy Bypass`(微软安全基线明确反对完全绕过执行策略)。
12
+ # - 供应链加固:设 ARGO_PIN=<commit SHA> 使克隆后校验 HEAD 一致(与 install.sh 对齐)。
13
+ #
14
+ # 环境变量:
15
+ # ARGO_HOME 安装目录,默认 $env:USERPROFILE\.local\share\argo
16
+ # ARGO_REPO 仓库地址,默认 https://github.com/taxueseek/argo.git
17
+ # ARGO_BRANCH 分支,默认 main
18
+ # ARGO_SKIP_PIP 设为 1 则跳过 pip 安装
19
+ # ARGO_LINK_TARGETS 分号分隔的 Skill 入口路径(可选)
20
+
21
+ $ErrorActionPreference = "Stop"
22
+
23
+ $Repo = if ($env:ARGO_REPO) { $env:ARGO_REPO } else { "https://github.com/taxueseek/argo.git" }
24
+ $Branch = if ($env:ARGO_BRANCH) { $env:ARGO_BRANCH } else { "main" }
25
+ $InstallDir = if ($env:ARGO_HOME) { $env:ARGO_HOME } else { Join-Path $env:USERPROFILE ".local\share\argo" }
26
+ $SkipPip = ($env:ARGO_SKIP_PIP -eq "1")
27
+ $Pin = if ($env:ARGO_PIN) { $env:ARGO_PIN } else { "" }
28
+ $LinkTargets = @()
29
+ # 逐个参数解析:--link <path> / --to <path> 收集其值,其他未知参数跳过
30
+ for ($i = 0; $i -lt $args.Count; $i++) {
31
+ $a = $args[$i]
32
+ if ($a -eq "--link" -or $a -eq "--to") {
33
+ if ($i + 1 -lt $args.Count) { $LinkTargets += $args[$i + 1]; $i++ }
34
+ continue
35
+ }
36
+ # 裸路径参数(未带开关)视为链接目标
37
+ $LinkTargets += $a
38
+ }
39
+ if ($env:ARGO_LINK_TARGETS) {
40
+ $LinkTargets += ($env:ARGO_LINK_TARGETS -split ";")
41
+ }
42
+
43
+ Write-Host "==> Argo 安装目录: $InstallDir"
44
+
45
+ if (-not (Get-Command git -ErrorAction SilentlyContinue)) {
46
+ Write-Error "需要 git,请先安装后再试。"
47
+ exit 1
48
+ }
49
+ if (-not (Get-Command python -ErrorAction SilentlyContinue)) {
50
+ Write-Error "需要 Python 3.9+,请先安装后再试。"
51
+ exit 1
52
+ }
53
+
54
+ # 版本下限与 bin/argo 的 MIN_PYTHON、install.sh 保持一致:改一处就要改另外两处。
55
+ # 探测 python;无别名时回退 Windows 官方 py 启动器(bin/argo 候选链同样支持)
56
+ $script:py = @("python")
57
+ $pyOk = (python -c "import sys; print(1 if sys.version_info >= (3, 9) else 0)" 2>$null).Trim()
58
+ if ($pyOk -ne "1") {
59
+ $py3Ok = (py -3 -c "import sys; print(1 if sys.version_info >= (3, 9) else 0)" 2>$null).Trim()
60
+ if ($py3Ok -eq "1") {
61
+ $script:py = @("py", "-3")
62
+ } else {
63
+ Write-Error "当前 Python 版本低于 3.9,或 python/py 启动器不在 PATH。"
64
+ exit 1
65
+ }
66
+ }
67
+
68
+ if (Test-Path (Join-Path $InstallDir ".git")) {
69
+ Write-Host "==> 已有仓库,拉取更新 ($Branch)…"
70
+ git -C $InstallDir fetch --depth 1 origin $Branch
71
+ git -C $InstallDir checkout $Branch
72
+ git -C $InstallDir pull --ff-only origin $Branch
73
+ if ($LASTEXITCODE -ne 0) { Write-Host "[warn] pull --ff-only 失败,跳过" }
74
+ } elseif ((Test-Path $InstallDir) -and (Test-Path (Join-Path $InstallDir "scripts\search.py"))) {
75
+ Write-Host "==> 目录已存在且含 Argo 源码,跳过克隆: $InstallDir"
76
+ } else {
77
+ Write-Host "==> 克隆仓库…"
78
+ New-Item -ItemType Directory -Force -Path (Split-Path $InstallDir) | Out-Null
79
+ git clone --depth 1 --branch $Branch $Repo $InstallDir
80
+ if ($LASTEXITCODE -ne 0 -and $Repo -like "*github.com*") {
81
+ $MirrorRepo = "https://ghfast.top/" + $Repo
82
+ Write-Host "[warn] 直连 GitHub 失败,尝试加速镜像: $MirrorRepo …"
83
+ git clone --depth 1 --branch $Branch $MirrorRepo $InstallDir
84
+ if ($LASTEXITCODE -ne 0) {
85
+ Write-Error "克隆失败。若处于受限网络环境,可尝试手动克隆或设置 ARGO_REPO 环境变量。"
86
+ exit 1
87
+ }
88
+ }
89
+ }
90
+
91
+ # 供应链加固:固定 commit 校验(ARGO_PIN),与 install.sh 对齐
92
+ if ($Pin) {
93
+ $actualHead = if (Test-Path (Join-Path $InstallDir ".git")) {
94
+ (git -C $InstallDir rev-parse HEAD 2>$null)
95
+ } else { "unknown" }
96
+ if ($actualHead.Trim() -ne $Pin) {
97
+ Write-Error "供应链校验失败:固定 commit 为 $Pin,实际 HEAD 为 $actualHead。请人工核查仓库来源。"
98
+ exit 1
99
+ }
100
+ Write-Host "==> 供应链校验通过: HEAD=$Pin"
101
+ }
102
+
103
+ if (-not $SkipPip) {
104
+ Write-Host "==> 安装依赖 (PyYAML)…"
105
+ & $script:py -m pip install pyyaml
106
+ if ($LASTEXITCODE -ne 0) {
107
+ & $script:py -m pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyyaml
108
+ }
109
+ if ($LASTEXITCODE -ne 0) { Write-Host "[warn] pip 安装 PyYAML 失败,可手动: pip install pyyaml" }
110
+ Write-Host "==> 安装可选增强 (curl_cffi: TLS 指纹伪造;rapidfuzz: 去重模糊近重复复核;缺失不影响核心功能)…"
111
+ & $script:py -m pip install curl_cffi
112
+ if ($LASTEXITCODE -ne 0) {
113
+ & $script:py -m pip install -i https://pypi.tuna.tsinghua.edu.cn/simple curl_cffi
114
+ }
115
+ if ($LASTEXITCODE -ne 0) { Write-Host "[warn] pip 安装 curl_cffi 失败(可选依赖)" }
116
+ & $script:py -m pip install rapidfuzz
117
+ if ($LASTEXITCODE -ne 0) {
118
+ & $script:py -m pip install -i https://pypi.tuna.tsinghua.edu.cn/simple rapidfuzz
119
+ }
120
+ if ($LASTEXITCODE -ne 0) { Write-Host "[warn] pip 安装 rapidfuzz 失败(可选依赖,缺失时去重回退纯 minhash)" }
121
+ }
122
+
123
+ if ($LinkTargets.Count -gt 0 -or (Test-Path (Join-Path $InstallDir "installs.local.yaml"))) {
124
+ Write-Host "==> 链接 Skill 入口(符号链接回真源,不复制)…"
125
+ $linkArgs = @()
126
+ foreach ($t in $LinkTargets) { if ($t) { $linkArgs += @("--to", $t) } }
127
+ & $script:py (Join-Path $InstallDir "scripts\link_source.py") @linkArgs
128
+ if ($LASTEXITCODE -ne 0) {
129
+ Write-Host "[warn] 链接未完成。可稍后手动:"
130
+ Write-Host " python $InstallDir\scripts\link_source.py --to C:\Users\you\.claude\skills\argo"
131
+ }
132
+ }
133
+
134
+ Write-Host ""
135
+ Write-Host "==> 安装完成"
136
+ Write-Host ""
137
+ $pyLabel = $script:py -join " "
138
+ Write-Host "快速验证:"
139
+ Write-Host " & $pyLabel $InstallDir\scripts\search.py ""Python asyncio"" --json"
140
+ Write-Host " & $pyLabel $InstallDir\scripts\search.py --list-engines"
141
+ Write-Host ""
142
+ Write-Host "启动 MCP(给 Claude / Kimi / Cursor 等用):"
143
+ Write-Host " & $pyLabel $InstallDir\scripts\mcp_server.py"
144
+ Write-Host ""
145
+ Write-Host "或用 npx(需 Node.js 18+,推荐,不依赖 npm 发版):"
146
+ Write-Host " npx -y github:taxueseek/argo"
147
+ Write-Host ""
148
+ Write-Host "客户端 MCP 配置示例(command 用解释器绝对路径:GUI 宿主的子进程 PATH 常缺 python):"
149
+ $pythonExe = (Get-Command $script:py[0] -ErrorAction SilentlyContinue).Source
150
+ if (-not $pythonExe) { $pythonExe = $script:py[0] }
151
+ Write-Host @"
152
+ {
153
+ "mcpServers": {
154
+ "argo": {
155
+ "command": "$pythonExe",
156
+ "args": ["$InstallDir\scripts\mcp_server.py"]
157
+ }
158
+ }
159
+ }
160
+ "@
161
+ Write-Host ""
162
+ Write-Host "可选:把 Skill 挂到本机 Agent 目录(不复制代码):"
163
+ Write-Host " python $InstallDir\scripts\link_source.py --to $env:USERPROFILE\.claude\skills\argo"
164
+ Write-Host " python $InstallDir\scripts\link_source.py --to $env:USERPROFILE\.agents\skills\argo"
165
+ Write-Host ""
166
+ Write-Host "文档: https://github.com/taxueseek/argo"
@@ -0,0 +1,221 @@
1
+ #!/usr/bin/env bash
2
+ # Argo 一键安装脚本(克隆/更新真源 + 依赖 + 可选 Skill 链接)
3
+ # 用法:
4
+ # curl -fsSL https://raw.githubusercontent.com/taxueseek/argo/main/scripts/install.sh | bash
5
+ # ARGO_HOME=/path/to/argo bash scripts/install.sh
6
+ # bash scripts/install.sh --link ~/.claude/skills/argo
7
+ #
8
+ # 环境变量:
9
+ # ARGO_HOME 安装目录,默认 ~/.local/share/argo
10
+ # ARGO_REPO 仓库地址,默认 https://github.com/taxueseek/argo.git
11
+ # ARGO_BRANCH 分支,默认 main
12
+ # ARGO_SKIP_PIP 设为 1 则跳过 pip 安装
13
+ # ARGO_LINK_TARGETS 冒号分隔的 Skill 入口路径(可选)
14
+ # ARGO_PIN 固定 commit(供应链加固:克隆后校验 HEAD,推荐生产使用)
15
+
16
+ set -euo pipefail
17
+
18
+ # 本脚本用 bash 语法(数组、[[ ]]),在 sh/dash/ksh 下会在解析期报一堆语法错误、
19
+ # 且看不出真正原因。FreeBSD/OpenBSD/精简容器里 /bin/sh 不是 bash,所以先自证运行
20
+ # 环境:不是 bash 就尝试用 bash 重跑,找不到 bash 则给出一句可执行的指引。
21
+ if [ -z "${BASH_VERSION:-}" ]; then
22
+ if command -v bash >/dev/null 2>&1; then
23
+ exec bash "$0" "$@"
24
+ fi
25
+ echo "install.sh 需要 bash(本脚本使用数组与 [[ ]] 语法)。" >&2
26
+ echo " Debian/Ubuntu: sudo apt-get install -y bash" >&2
27
+ echo " Alpine: apk add bash" >&2
28
+ echo " FreeBSD: pkg install -y bash" >&2
29
+ echo " OpenBSD: pkg_add bash" >&2
30
+ echo " macOS/多数 Linux 自带 bash,可直接: curl -fsSL <url> | bash" >&2
31
+ exit 1
32
+ fi
33
+
34
+ REPO="${ARGO_REPO:-https://github.com/taxueseek/argo.git}"
35
+ BRANCH="${ARGO_BRANCH:-main}"
36
+ PIN="${ARGO_PIN:-}"
37
+ HOME_DIR="${HOME:-$(eval echo ~)}"
38
+ INSTALL_DIR="${ARGO_HOME:-$HOME_DIR/.local/share/argo}"
39
+ SKIP_PIP="${ARGO_SKIP_PIP:-0}"
40
+
41
+ LINK_ARGS=()
42
+ while [[ $# -gt 0 ]]; do
43
+ case "$1" in
44
+ --home)
45
+ INSTALL_DIR="$2"
46
+ shift 2
47
+ ;;
48
+ --link)
49
+ LINK_ARGS+=(--to "$2")
50
+ shift 2
51
+ ;;
52
+ --skip-pip)
53
+ SKIP_PIP=1
54
+ shift
55
+ ;;
56
+ --pin)
57
+ PIN="$2"
58
+ shift 2
59
+ ;;
60
+ -h|--help)
61
+ sed -n '2,14p' "$0" | sed 's/^# \{0,1\}//'
62
+ exit 0
63
+ ;;
64
+ *)
65
+ echo "未知参数: $1" >&2
66
+ exit 1
67
+ ;;
68
+ esac
69
+ done
70
+
71
+ echo "==> Argo 安装目录: $INSTALL_DIR"
72
+ echo "==> 仓库来源: $REPO (分支 $BRANCH)"
73
+ echo " 提示: 若以 curl|bash 方式执行,请确认来源为 trusted 仓库;生产环境建议 ARGO_PIN 固定 commit。"
74
+
75
+ if ! command -v git >/dev/null 2>&1; then
76
+ echo "需要 git,请先安装后再试。" >&2
77
+ exit 1
78
+ fi
79
+
80
+ if ! command -v python3 >/dev/null 2>&1; then
81
+ echo "需要 Python 3.9+,请先安装后再试。" >&2
82
+ exit 1
83
+ fi
84
+
85
+ # 版本下限与 bin/argo 的 MIN_PYTHON 必须一致:改一处就要改另一处。
86
+ # 为什么是 3.9:唯一的必需第三方依赖 PyYAML 早已支持 3.9,脚本也几乎都带
87
+ # `from __future__ import annotations`;早期这里写 3.10 的理由是「用了 X | None
88
+ # 语法」,但实测全仓 0 处该写法。抬高门槛只会把 macOS 原生 python3、老 Debian
89
+ # 和 python:3.9 容器这些环境挡在门外。
90
+ PY_VER=$(python3 -c 'import sys; print(f"{sys.version_info.major}.{sys.version_info.minor}")')
91
+ PY_OK=$(python3 -c 'import sys; print(1 if sys.version_info >= (3, 9) else 0)')
92
+ if [[ "$PY_OK" != "1" ]]; then
93
+ echo "当前 Python 为 ${PY_VER},需要 3.9+。" >&2
94
+ exit 1
95
+ fi
96
+
97
+ if [[ -d "$INSTALL_DIR/.git" ]]; then
98
+ echo "==> 已有仓库,拉取更新 ($BRANCH)…"
99
+ git -C "$INSTALL_DIR" fetch --depth 1 origin "$BRANCH"
100
+ git -C "$INSTALL_DIR" checkout "$BRANCH"
101
+ git -C "$INSTALL_DIR" pull --ff-only origin "$BRANCH" || true
102
+ elif [[ -d "$INSTALL_DIR" ]] && [[ -f "$INSTALL_DIR/scripts/search.py" ]]; then
103
+ echo "==> 目录已存在且含 Argo 源码,跳过克隆: $INSTALL_DIR"
104
+ else
105
+ echo "==> 克隆仓库…"
106
+ mkdir -p "$(dirname "$INSTALL_DIR")"
107
+ if ! git clone --depth 1 --branch "$BRANCH" "$REPO" "$INSTALL_DIR"; then
108
+ if [[ "$REPO" == *"github.com"* ]]; then
109
+ MIRROR_REPO="https://ghfast.top/${REPO}"
110
+ echo "[warn] 从 GitHub 直连克隆失败,尝试加速镜像: $MIRROR_REPO …"
111
+ if ! git clone --depth 1 --branch "$BRANCH" "$MIRROR_REPO" "$INSTALL_DIR"; then
112
+ echo "!! 克隆失败。若处于受限网络环境,可尝试手动克隆或设置 ARGO_REPO 环境变量。" >&2
113
+ exit 1
114
+ fi
115
+ else
116
+ echo "!! 克隆失败,请检查网络连接。" >&2
117
+ exit 1
118
+ fi
119
+ fi
120
+ fi
121
+
122
+ # 供应链加固:校验 HEAD 与预期 commit 一致(ARGO_PIN 固定)
123
+ if [[ -n "$PIN" ]]; then
124
+ ACTUAL_HEAD=$(git -C "$INSTALL_DIR" rev-parse HEAD 2>/dev/null || echo "unknown")
125
+ if [[ "$ACTUAL_HEAD" != "$PIN" ]]; then
126
+ echo "!! 供应链校验失败:固定 commit 为 ${PIN},实际 HEAD 为 ${ACTUAL_HEAD}" >&2
127
+ echo "!! 仓库内容与预期不一致,拒绝继续。请人工核查仓库来源。" >&2
128
+ exit 1
129
+ fi
130
+ echo "==> 供应链校验通过: HEAD=$PIN"
131
+ fi
132
+
133
+ if [[ "$SKIP_PIP" != "1" ]]; then
134
+ echo "==> 安装依赖 (PyYAML)…"
135
+ python3 -m pip install --user -q pyyaml 2>/dev/null \
136
+ || python3 -m pip install -q pyyaml 2>/dev/null \
137
+ || python3 -m pip install --user -q -i https://pypi.tuna.tsinghua.edu.cn/simple pyyaml 2>/dev/null \
138
+ || echo "[warn] pip 安装 PyYAML 失败,可手动: pip install pyyaml"
139
+ echo "==> 安装可选增强 (curl_cffi: TLS 指纹伪造;rapidfuzz: 去重模糊近重复复核;缺失不影响核心功能)…"
140
+ python3 -m pip install --user -q curl_cffi 2>/dev/null \
141
+ || python3 -m pip install -q curl_cffi 2>/dev/null \
142
+ || python3 -m pip install --user -q -i https://pypi.tuna.tsinghua.edu.cn/simple curl_cffi 2>/dev/null \
143
+ || echo "[warn] pip 安装 curl_cffi 失败(可选依赖)。需要反爬 TLS 指纹伪造时手动: pip install curl_cffi"
144
+ python3 -m pip install --user -q rapidfuzz 2>/dev/null \
145
+ || python3 -m pip install -q rapidfuzz 2>/dev/null \
146
+ || python3 -m pip install --user -q -i https://pypi.tuna.tsinghua.edu.cn/simple rapidfuzz 2>/dev/null \
147
+ || echo "[warn] pip 安装 rapidfuzz 失败(可选依赖)。缺失时去重回退纯 minhash,需要模糊近重复复核时手动: pip install rapidfuzz"
148
+ fi
149
+
150
+ # ── pre-commit 快门禁 hook(2026-10-16 流程洞实证后新增) ──────────────────
151
+ # 背景:并发代理接线没跑测试,6 道门禁红 + 阻塞全量收集,故障在树里躺了几小时
152
+ # 才被人工发现。拦截点放在提交层:只跑四道快门禁(~8s),全量回归留给手动。
153
+ # 链式而非覆盖:hooks/pre-commit 可能已是 privacy-guard 等用户自有防线
154
+ # (2026-10-17 实测本机就是),argo 门禁装成独立文件 pre-commit-argo,再向
155
+ # 既有 hook 追一行调用(幂等:grep 到标记行才追加)。既有 hook 先exit 1 时
156
+ # 我们的不会跑到——隐私/密钥防线优先,正确。
157
+ if command -v git >/dev/null 2>&1 && { [ -d "$INSTALL_DIR/.git" ] || [ -f "$INSTALL_DIR/.git" ]; }; then
158
+ _common=$(cd "$INSTALL_DIR" && git rev-parse --git-common-dir 2>/dev/null || true)
159
+ case "$_common" in
160
+ /*) ;;
161
+ "") _common="" ;;
162
+ *) _common="$INSTALL_DIR/$_common" ;;
163
+ esac
164
+ if [ -n "$_common" ] && [ -d "$_common" ]; then
165
+ _hooks_dir="$_common/hooks"
166
+ mkdir -p "$_hooks_dir"
167
+ cp "$INSTALL_DIR/scripts/pre-commit" "$_hooks_dir/pre-commit-argo" \
168
+ && chmod +x "$_hooks_dir/pre-commit-argo" || {
169
+ echo "[warn] pre-commit-argo 安装失败(不影响 argo 本体使用)"
170
+ }
171
+ if [ ! -e "$_hooks_dir/pre-commit" ]; then
172
+ cp "$_hooks_dir/pre-commit-argo" "$_hooks_dir/pre-commit"
173
+ echo "==> 已装 pre-commit 快门禁 hook(~8s;git commit --no-verify 可跳过)"
174
+ elif grep -q "pre-commit-argo" "$_hooks_dir/pre-commit" 2>/dev/null; then
175
+ echo "==> pre-commit 已接入 argo 快门禁(无需重复追加)"
176
+ else
177
+ printf '\n# argo 快门禁(2026-10-17 追加;独立文件,删掉下面一行即可解链)\n[ -x "$(dirname "$0")/pre-commit-argo" ] && "$(dirname "$0")/pre-commit-argo"\n' >> "$_hooks_dir/pre-commit" \
178
+ && echo "==> argo 快门禁已链入既有 pre-commit(未覆盖你的 hook)"
179
+ fi
180
+ fi
181
+ fi
182
+
183
+
184
+ if [[ ${#LINK_ARGS[@]} -gt 0 ]] || [[ -n "${ARGO_LINK_TARGETS:-}" ]] || [[ -f "$INSTALL_DIR/installs.local.yaml" ]]; then
185
+ echo "==> 链接 Skill 入口(符号链接回真源,不复制)…"
186
+ python3 "$INSTALL_DIR/scripts/link_source.py" "${LINK_ARGS[@]+"${LINK_ARGS[@]}"}" || {
187
+ echo "[warn] 链接未完成。可稍后手动:"
188
+ echo " python3 $INSTALL_DIR/scripts/link_source.py --to ~/.claude/skills/argo"
189
+ }
190
+ fi
191
+
192
+ echo ""
193
+ echo "==> 安装完成"
194
+ echo ""
195
+ echo "快速验证:"
196
+ echo " python3 $INSTALL_DIR/scripts/search.py \"Python asyncio\" --json"
197
+ echo " python3 $INSTALL_DIR/scripts/search.py --list-engines"
198
+ echo ""
199
+ echo "启动 MCP(给 Claude / Kimi / Cursor 等用):"
200
+ echo " python3 $INSTALL_DIR/scripts/mcp_server.py"
201
+ echo ""
202
+ echo "或用 npx(需 Node.js 18+):"
203
+ echo " npx -y github:taxueseek/argo"
204
+ echo ""
205
+ echo "客户端 MCP 配置示例(路径请按本机替换):"
206
+ cat <<EOF
207
+ {
208
+ "mcpServers": {
209
+ "argo": {
210
+ "command": "python3",
211
+ "args": ["$INSTALL_DIR/scripts/mcp_server.py"]
212
+ }
213
+ }
214
+ }
215
+ EOF
216
+ echo ""
217
+ echo "可选:把 Skill 挂到本机 Agent 目录(不复制代码):"
218
+ echo " python3 $INSTALL_DIR/scripts/link_source.py --to ~/.claude/skills/argo"
219
+ echo " python3 $INSTALL_DIR/scripts/link_source.py --to ~/.agents/skills/argo"
220
+ echo ""
221
+ echo "文档: https://github.com/taxueseek/argo"