1. 23 Oct, 2026 3 commits
    • 郭阔's avatar
      feat(arch): site-shared browser profiles, auto-recycle and run watchdog · 155faf6a
      郭阔 authored
      - platform.sh: nh_ensure_instance/nh_entry_write now use per-SITE instance
        (port 9300+hash(site), profiles/<site>/) so one account logs in once per
        site; prevents same-account multi-login session kicking (digitimes/nikkei
        both enforce device limits)
      - harvest.sh: quit shared instance on EXIT with port-keyed reference counting
        ($WORK_DIR/runlocks, stale-PID cleanup) — last same-site run recycles
      - harvest.sh: hard watchdog kills a hung claude run after MAX_RUNTIME_MIN
        (default 60, per-source conf overridable) so launchd next-day trigger is
        never blocked
      155faf6a
    • 郭阔's avatar
      feat(panel): site-shared login model and list fixes · 12434efb
      郭阔 authored
      - index: unscheduled sources no longer link to /source (was 404); show 未排程 badge
      - index: sources with toggle ON sort first
      - logins page: split into per-source login-state table (site-shared instance
        column, per-source test via new /login-test-src route) + site-credential table
      - platform_layer: skill_sources() exposes method; login_sites() drops direct
        sources; new login_source_rows()
      12434efb
    • 郭阔's avatar
  2. 22 Oct, 2026 5 commits
    • 郭阔's avatar
      feat: recipe discovery for source-less sites · 7295d704
      郭阔 authored
      - platform.sh nh_login_autodiscover: no installed source for the site
        (bloomberg/statista) exports NH_LOGIN_URL from the credential's url
      - web: site rows without sources can run 自动配置配方/登录测试 (probe
        falls back to site name); credential url serves as discovery entry
      7295d704
    • 郭阔's avatar
      feat: site-level login credentials shared across channels · a17c0314
      郭阔 authored
      - platform.sh: credential lookup falls back site-level (logins/<site>.json,
        site = first segment of source name); nikkei-world/markets/tech share one
        nikkei account, single file to maintain
      - platform_layer: login_sites()/login_rows() site view (coverage, probe
        source, recipe status) for the panel
      - web: /logins page now site-based — save/delete/discover/test operate per
        site; discovery probes via the site's representative source
      a17c0314
    • 郭阔's avatar
      fix: login preflight auto-launches the source browser instance · acac322d
      郭阔 authored
      nh_login_preflight assumed the per-source Chromium was already running
      (panel login-test failed silently for sources whose window had been
      closed); extract nh_ensure_instance (no-op when alive) and use it in
      both preflight and autodiscover. Harvests were unaffected — harvest.js
      already runs ensure-chromium itself.
      acac322d
    • 郭阔's avatar
      feat: one-click recipe auto-discovery from the panel · 55ca6d6f
      郭阔 authored
      - nh_login_autodiscover (platform.sh): ensure the source's dedicated
        browser instance is up, load credentials, run skill discover
        (recipe generation + live login verification)
      - /login-discover route + 自动配置配方并测试 button for sources with
        credentials but no recipe; reuses the background-test polling UI
      55ca6d6f
    • 郭阔's avatar
      fix: login test output captures stderr too · 88a67a5f
      郭阔 authored
      88a67a5f
  3. 21 Oct, 2026 6 commits
    • 郭阔's avatar
      fix: remove last hardcoded user, panel refresh loop · 3e8496f6
      郭阔 authored
      - sudo -u yichu replaced by NH_RUN_USER env (linux panels running as
        root configure the execution user; empty = current user, darwin
        always direct) — last hardcode outside guarded legacy tools
      - logins.html: emit meta refresh only while a login test is running
        (content=0 caused an infinite reload loop)
      - deploy/migrate keep their overridable yichu defaults (legacy server
        tools, already parameterized via args/env)
      3e8496f6
    • 郭阔's avatar
      feat: web panel credential management for site logins · caf7cca6
      郭阔 authored
      - /logins page: per-source credentials CRUD (write-only password,
        masked display, 600-perm files in etc/news-harvester/logins/),
        recipe availability badge, one-click login test (background thread,
        page polls result)
      - nh_login_preflight auto-selects the source's dedicated browser
        instance (port+profile) when caller didn't set one
      - panel env carries SKILLS_DIR so recipe detection works in-process
      caf7cca6
    • 郭阔's avatar
      feat: login preflight before harvest · 6be2431a
      郭阔 authored
      - nh_login_preflight (platform.sh): sources with credentials at
        $CONF_DIR/logins/<source>.json (600) get a login check via the
        skill's login-tools.js before claude runs; auto-login on failure;
        harvest never blocked (paywall honestly reported by result contract)
      - harvest.sh invokes preflight after result contract preparation
      - SKILLS_DIR / SKILLS_REPO_URL documented in default.conf.example
      - test: preflight invoked when credentials configured (fake skill)
      6be2431a
    • 郭阔's avatar
      feat: per-source browser instance isolation · 776c3a9a
      郭阔 authored
      - nh_cdp_port: stable per-source CDP port (9300+name hash)
      - nh_entry_write: entry scripts now export CDP_PORT_OVERRIDE +
        CDP_PROFILE_OVERRIDE so parallel harvests each drive a dedicated
        Chromium (own port + own profile); regenerated idempotently
      - pairs with news-hub-skills CDP_PROFILE_OVERRIDE support
      - darwin test asserts isolation env in generated entry
      776c3a9a
    • 郭阔's avatar
      feat: setup.sh bootstrap and cross-platform web panel with harvest toggle · 5e5097d0
      郭阔 authored
      - bin/setup.sh: one-command machine bootstrap (auto platform detect) —
        directory layout, dependency check (brew install on consent), claude
        auth check, skills repo auto-clone from SKILLS_REPO_URL + npm install
        + full bundle import (all sources), dual skill symlink registration,
        default.conf/web.conf generation (random panel password), optional
        web panel service install, digest schedule, remaining-manual-steps
        summary; idempotent
      - web/app.py: platform_layer integration — paths/timer reads/trigger/
        active-harvest checks unified; add/edit/disable actions now work on
        darwin; per-source harvest toggle route (schedule load/unload +
        skill enable/disable; auto staggered schedule creation on first enable)
      - index.html: toggle switch column, unscheduled skill sources merged
        into list, platform-neutral labels
      - bin/platform_layer.py: python facade reusing platform.sh via
        'platform.sh call' dispatcher for all mutations; file reads native
      5e5097d0
    • 郭阔's avatar
      feat: platform abstraction layer (auto-detect darwin/linux) · 3ac999b0
      郭阔 authored
      - bin/platform.sh: single source of truth for platform differences —
        OS detection (NH_OS override for tests), PATH bootstrap without
        shadowing caller-injected commands, platform default paths, scheduler
        abstraction (systemd timer + systemctl <-> launchd plist + launchctl
        with named entry scripts), file-level disable on darwin (survives
        reboot, one-click recoverable), sed -i / GNU-sed shims, root check
        only on linux, conf loading (EnvironmentFile equivalent)
      - bin/schedule.py: plist parse/write + auto-detect by filename
        (timer/plist/.disabled); schedule sources listing subcommand
      - harvest/continue/daily-digest: drop hardcoded nvm//home/yichu paths,
        self-bootstrap via platform.sh, harvest now loads conf itself
        (run.sh wrapper no longer required)
      - add-source/modify-source: fully cross-platform schedule management
        (plist generation + launchctl on darwin, timer + systemctl on linux)
      - status.sh: cross-platform overview/detail/journal (launchd log on darwin)
      - deploy/migrate: linux-only guard with pointer to setup.sh
      - tests: env-synced platform simulation (NH_OS), fake launchctl suite,
        darwin plist/disable/enable roundtrip tests; new disable contract
        (unload + preserve times) replaces clear-times; 37 tests green
      3ac999b0
  4. 20 Oct, 2026 2 commits
    • 郭阔's avatar
      feat: macOS platform adaptation, concurrency guard and detail page redesign · ed91787c
      郭阔 authored
      - web/app.py: IS_DARWIN branches (launchctl kickstart for manual trigger,
        direct execution for digest/continue without sudo); _active_harvests()
        concurrency guard on /run and /continue; normalized detail state
        (last run time from log filename, next trigger computed from schedule)
      - detail.html: layout redesign — status badge header, real overview cards,
        merged duplicate run metadata, collapsible logs/config, history moved up
      - gitignore: exclude .zcode/
      ed91787c
    • 谢宇轩's avatar
      feat: new feature · 4e3e086a
      谢宇轩 authored
      4e3e086a
  5. 09 Sep, 2026 1 commit
  6. 07 Sep, 2026 1 commit
  7. 02 Sep, 2026 2 commits