actions: 使用缓存机制,避免每次运行的时候都拉取依赖,降低 action 运行时间#284
Closed
expoli wants to merge 2075 commits intosansan0:masterfrom
Closed
actions: 使用缓存机制,避免每次运行的时候都拉取依赖,降低 action 运行时间#284expoli wants to merge 2075 commits intosansan0:masterfrom
expoli wants to merge 2075 commits intosansan0:masterfrom
Conversation
Author
Author
karlorz
pushed a commit
to karlorz/TrendRadar
that referenced
this pull request
Mar 31, 2026
karlorz
added a commit
to karlorz/TrendRadar
that referenced
this pull request
Mar 31, 2026
…urce (#9) * feat(scripts): add install-deps skill target (#267) * chore(make): document install-deps skill target (#268) * fix(scripts): validate install-deps skill target early (#269) * chore(docs): document install-deps skill target (#270) * chore(skill): document trends-cli bootstrap flow (#271) * fix(make): align convenience skill targets (#272) * chore(make): document check-agent-skill target (#273) * chore(make): document sync-agent-governance target (#274) * chore(docs): document target-aware governance checks (#275) * chore(docs): document sync-agent-governance usage (#276) * chore(docs): document target-aware make check (#277) * chore(docs): document target-aware check-build (#278) * chore(make): align governance comment (#279) * chore(skills): clarify installer help (#280) * chore(make): mention skill env overrides (#281) * chore(skill): mention skill root env overrides (#282) * chore(scripts): add install-deps help (#283) * fix(scripts): validate install-deps mirror mode (#284) * chore(scripts): add prefetch-convex help (#285) * chore(docs): document prefetch-convex env knobs (#286) * chore(scripts): expand install-deps prefetch help (#287) * chore(docs): document install-deps prefetch env knobs (#288) * chore(skill): document trends-cli prefetch knobs (#289) * fix(scripts): make dev help path side-effect free (#290) * chore(scripts): add install.sh help surface (#291) * chore(make): document install.sh help surface (#292) * chore(docs): add deployment runbook section (#293) * chore(make): document seeded deploy targets (#294) * chore(docs): document seeded deployment paths (#295) * chore(make): document dev help surface (#296) * chore(docs): link dev help surface (#297) * chore(make): align shared prefetch env wording (#298) * chore(scripts): clarify install-deps prefetch defaults (#299) * chore(docs): align install-deps help references (#300) * chore(make): align prefetch help contract wording (#301) * chore(scripts): clarify install prefetch defaults (#302) * chore(docs): align install help references (#303) * chore(scripts): clarify dev prefetch defaults (#304) * chore(docs): align dev help references (#305) * chore(make): document shared prefetch defaults (#306) * chore(scripts): align prefetch CI wording (#307) * chore(scripts): document CI prefetch env (#308) * chore(scripts): align shared prefetch CI line (#309) * chore(make): document CI env in help (#310) * chore(make): align dependency CI help pointers (#311) * chore(skill): align trends-cli CI wording (#312) * chore(docs): align wrapper CI wording (#313) * chore(make): align prefetch comment wording (#314) * fix(scripts): support CI=1 for prefetch flow (#315) * chore(help): align CI=true/1 wording (#316) * fix(make): support CI=1 branches (#317) * chore(docs): align CI=true/1 wording (#318) * chore(docs): simplify prefetch contract wording (#319) * chore(skill): simplify trends-cli agent prompt wording (#320) * feat: backfill resume location hierarchy (#321) * feat: preserve district in location hierarchy (#322) * feat: add market-aware keyword and workflow seeds (#323) * feat: make CN seed China-wide (#325) * feat: add market-aware keyword and workflow seeds * feat: make CN seed China-wide * Fix CNC sales AI scoring false positives (#324) * Fix CNC sales AI scoring false positives * Fix web test fixtures for prompt version guard * fix: use canonical location labels on debug page (#326) * feat: add market-aware keyword and workflow seeds * feat: make CN seed China-wide * fix: use canonical location labels on debug page * fix: prebuild shared before dev startup (#327) * fix: prebuild shared before dev startup (#328) * feat: add resume backup and restore flows (#329) * feat: harden deploy upgrade flow (#330) * feat: harden deploy upgrade flow * fix: resolve deploy repo from workspace * Feat/deploy failsafe rollback (#331) * feat: harden deploy upgrade flow * fix: resolve deploy repo from workspace * fix: stop no-op evidence backfill batches (#333) * feat: harden deploy upgrade flow * fix: resolve deploy repo from workspace * fix: stop no-op evidence backfill batches * Feat/deploy failsafe rollback (#332) * feat: harden deploy upgrade flow * fix: resolve deploy repo from workspace * fix: stop no-op evidence backfill batches * fix: quiet deploy migration logs (#334) * fix: quiet deploy migration logs (#335) * Paginate resume backups; add deploy-backup CLI Support paginated resume backups and add a deploy-backup workflow in the CLI. The API route now calls the Convex query in pages until done, with helpers to normalize resume/source filters and to validate paginated responses. Added Convex-side tests for listForBackup and updated API route tests to assert pagination behavior. The CLI gains deploy-backup subcommands to write/restore backups into a run directory (with helpers for resolving latest/run dirs and formatting outputs), plus unit tests and shared test helpers. Also updated Makefile help text to mention best-effort resume dump during deploy. * Update Makefile * Add tar.gz support to resume backup scripts. (#336) Keep the existing make wrapper workflow intact while letting operators read and write portable resume backups as either JSON or gzip-compressed tar archives. * fix: remove real DOCX sample from manual import regression (#337) Replace the manual import fallback regression with an in-memory DOCX fixture and deterministic Mammoth failure so coverage no longer depends on an ad hoc sample file with candidate-identifying content. * Fix Convex seed status read limit (#338) * feat: add manual 51job resume import flow (#339) * fix: remove real DOCX sample from manual import regression Replace the manual import fallback regression with an in-memory DOCX fixture and deterministic Mammoth failure so coverage no longer depends on an ad hoc sample file with candidate-identifying content. * feat: add manual 51job resume import flow Add the manual upload route, schema contract, UI entry points, generated API types, and focused dialog coverage so HR users can import 51job resume files directly from the web app. * fix: handle failed manual import batches correctly (#340) Only show the manual import success toast when at least one file is imported, so failed-only batches no longer trigger refreshes. Add dialog regressions for failed-only and mixed imported-plus-skipped responses, and ignore local tool-results artifacts. * feat: compress deploy resume backups (#341) * fix(api): batch resume imports (#342) * fix: preserve phrase-aware resume keyword queries (#343) Keep multi-word keyword phrases intact across shared parsing, web URL/editor flows, and resume search so SEEK Malaysia workflow seeds retain explicit OR semantics end to end. * Update .gitignore * fix 51job manual import completeness (#344) * fix: tighten 51job manual resume repair flow Keep the 51job DOCX fallback lane operator-safe while improving shared parsing, migration repair, and import batching so legacy manual resumes can be repaired and reingested consistently. * fix: improve 51job manual resume normalization Handle summary-style 51job exports and allow legacy placeholder work history to be reparsed so manual imports repair mixed-up resumes more reliably. * fix: harden 51job manual import completeness Reject unreadable manual 51job PDF extracts before import, improve salary and inline location parsing for real export shapes, and tighten migration repair/reingest behavior so repaired records stay consistent without unnecessary follow-up work. * fix: repair malformed manual 51job work history Prevent narrative/duration noise from being promoted into company/title fields, and reparse malformed-but-present workHistory during Convex repair using the shared plausibility gates. * test(cli): cover command and MCP execution paths (#345) Add a shared Convex execution seam and focused JD, worker, crawl, and MCP tests so the remaining CLI release follow-up is limited to versioning and publish usage. * fix(seek): generate correct candidate detail link with jobId and openProfileId (#346) Update buildSeekProfileUrl to accept an optional jobId and produce the recommended URL format (/candidates/recommended?jobId=...&openProfileId=...) when available. Wire jobId derivation (from GraphQL request input or page URL) into extractSeekResumes() and extractSeekProfileResume(). Update normalizeSeekProfileUrlForIdentity to handle the new URL format by extracting openProfileId query param before falling back to path-based matching, so both formats resolve to the same identity key and deduplication is preserved. Add test for openProfileId URL format normalization. Co-authored-by: karlcc <3255660+karlcc@users.noreply.github.com> * feat(debug): add per-resume and bulk-delete to Ingest Diagnostics (#347) Adds a Delete button per row and a bulk-delete toolbar action to the Ingest Diagnostics page. The new `deleteResumes` Convex mutation removes resume documents, their AI tagging results, and patches stale reviewed-session references while preserving candidate workflow state. Selection state uses Set<string> throughout for O(1) lookups. * fix(scoring): recompute score from guarded breakdown to maintain score=sum(breakdown) invariant (#348) normalizeKeywordSalesAnalysis caps breakdown.related_exp and score independently, producing score != related_exp + industry_db. Fix by reading the final breakdown values after the guard and recomputing score from them. * fix(scoring): recompute score from guarded breakdown to maintain score=sum(breakdown) invariant (#349) normalizeKeywordSalesAnalysis caps breakdown.related_exp and score independently, producing score != related_exp + industry_db. Fix by reading the final breakdown values after the guard and recomputing score from them. * feat(search-profile): add required_keywords AND filter support (#350) - Search profiles now support required_keywords field; candidates must match at least one required keyword (OR semantics within the required set) in their resume text to pass the hard filter - New rkw URL param persists required keywords in the URL state - seek-malaysia-sales profile separates role keywords (Sales Engineer, Sales Manager) from required industry keywords (CNC, machine tools) - Fixes the workflow inability to add AND logic for domain keywords like CNC alongside OR-mode role title queries * refactor(required-keywords): normalizeFilterToken + camelCase rename (#351) * feat(search-profile): add required_keywords AND filter support - Search profiles now support required_keywords field; candidates must match at least one required keyword (OR semantics within the required set) in their resume text to pass the hard filter - New rkw URL param persists required keywords in the URL state - seek-malaysia-sales profile separates role keywords (Sales Engineer, Sales Manager) from required industry keywords (CNC, machine tools) - Fixes the workflow inability to add AND logic for domain keywords like CNC alongside OR-mode role title queries * refactor(required-keywords): use normalizeFilterToken and rename to camelCase - Filter block now uses the existing normalizeFilterToken helper instead of inline kw.trim().toLowerCase() - Rename required_keywords -> requiredKeywords throughout to match the camelCase convention used by all other SearchProfile optional fields (jobDescription, filterPreset, etc.) - YAML parser accepts both requiredKeywords and required_keywords for backward compatibility; YAML config updated to camelCase * fix(resume): preserve rkw URL param when profile has no requiredKeywords (#352) Guard setRequiredKeywords in handleQuickStartApply so it only fires when config.requiredKeywords is explicitly defined. Previously, undefined was coerced to [] and cleared the URL-parsed required keywords, causing the rkw param to be stripped on page load when a profile auto-matched. * feat(ai-locale): enforce English for Seek resumes + store locale in analysis (#353) * fix(resume): preserve rkw URL param when profile has no requiredKeywords Guard setRequiredKeywords in handleQuickStartApply so it only fires when config.requiredKeywords is explicitly defined. Previously, undefined was coerced to [] and cleared the URL-parsed required keywords, causing the rkw param to be stripped on page load when a profile auto-matched. * feat(ai-locale): enforce English for Seek resumes + store locale in analysis Seek resumes were being analyzed with Chinese prompts because resolveAIOutputLocale() had no awareness of the resume source. - Add inferSourceKey(source) helper: maps *.employer.seek.com → "seek" - Update resolveAIOutputLocale(scope?) to return "en" for seek sources when AI_OUTPUT_LOCALE env var is not explicitly set - Store resolved locale on every analysis record (updateAnalysis + updateAnalysisBatch validators, both analyzed and auto-filtered paths) - Propagate locale through ConvexResumeAnalysis → MatchingResult → ResumeDetail UI as "Language: English / Simplified Chinese / ..." - Reuse SEEK_HOST_SUFFIX from lib/resume_identity.ts (exported) instead of redefining it; use RESUME_AI_PROMPT_LOCALE_TO_NATURAL_LANGUAGE from @trends/shared for canonical locale display labels * Fix keyword case-insensitive chip identity (#355) * fix(resume): preserve rkw URL param when profile has no requiredKeywords Guard setRequiredKeywords in handleQuickStartApply so it only fires when config.requiredKeywords is explicitly defined. Previously, undefined was coerced to [] and cleared the URL-parsed required keywords, causing the rkw param to be stripped on page load when a profile auto-matched. * feat(ai-locale): enforce English for Seek resumes + store locale in analysis Seek resumes were being analyzed with Chinese prompts because resolveAIOutputLocale() had no awareness of the resume source. - Add inferSourceKey(source) helper: maps *.employer.seek.com → "seek" - Update resolveAIOutputLocale(scope?) to return "en" for seek sources when AI_OUTPUT_LOCALE env var is not explicitly set - Store resolved locale on every analysis record (updateAnalysis + updateAnalysisBatch validators, both analyzed and auto-filtered paths) - Propagate locale through ConvexResumeAnalysis → MatchingResult → ResumeDetail UI as "Language: English / Simplified Chinese / ..." - Reuse SEEK_HOST_SUFFIX from lib/resume_identity.ts (exported) instead of redefining it; use RESUME_AI_PROMPT_LOCALE_TO_NATURAL_LANGUAGE from @trends/shared for canonical locale display labels * fix keyword case-insensitive chip identity * Fix/keyword case fingerprint (#357) * fix(resume): preserve rkw URL param when profile has no requiredKeywords Guard setRequiredKeywords in handleQuickStartApply so it only fires when config.requiredKeywords is explicitly defined. Previously, undefined was coerced to [] and cleared the URL-parsed required keywords, causing the rkw param to be stripped on page load when a profile auto-matched. * feat(ai-locale): enforce English for Seek resumes + store locale in analysis Seek resumes were being analyzed with Chinese prompts because resolveAIOutputLocale() had no awareness of the resume source. - Add inferSourceKey(source) helper: maps *.employer.seek.com → "seek" - Update resolveAIOutputLocale(scope?) to return "en" for seek sources when AI_OUTPUT_LOCALE env var is not explicitly set - Store resolved locale on every analysis record (updateAnalysis + updateAnalysisBatch validators, both analyzed and auto-filtered paths) - Propagate locale through ConvexResumeAnalysis → MatchingResult → ResumeDetail UI as "Language: English / Simplified Chinese / ..." - Reuse SEEK_HOST_SUFFIX from lib/resume_identity.ts (exported) instead of redefining it; use RESUME_AI_PROMPT_LOCALE_TO_NATURAL_LANGUAGE from @trends/shared for canonical locale display labels * fix keyword case-insensitive chip identity * update * update * update * Fix/51job import warning follow up (#356) * fix: tighten 51job manual resume repair flow Keep the 51job DOCX fallback lane operator-safe while improving shared parsing, migration repair, and import batching so legacy manual resumes can be repaired and reingested consistently. * fix: improve 51job manual resume normalization Handle summary-style 51job exports and allow legacy placeholder work history to be reparsed so manual imports repair mixed-up resumes more reliably. * fix: harden 51job manual import completeness Reject unreadable manual 51job PDF extracts before import, improve salary and inline location parsing for real export shapes, and tighten migration repair/reingest behavior so repaired records stay consistent without unnecessary follow-up work. * fix: repair malformed manual 51job work history Prevent narrative/duration noise from being promoted into company/title fields, and reparse malformed-but-present workHistory during Convex repair using the shared plausibility gates. * update * update * fix: align resume locale prompt hydration (#358) * fix(resume): preserve rkw URL param when profile has no requiredKeywords Guard setRequiredKeywords in handleQuickStartApply so it only fires when config.requiredKeywords is explicitly defined. Previously, undefined was coerced to [] and cleared the URL-parsed required keywords, causing the rkw param to be stripped on page load when a profile auto-matched. * feat(ai-locale): enforce English for Seek resumes + store locale in analysis Seek resumes were being analyzed with Chinese prompts because resolveAIOutputLocale() had no awareness of the resume source. - Add inferSourceKey(source) helper: maps *.employer.seek.com → "seek" - Update resolveAIOutputLocale(scope?) to return "en" for seek sources when AI_OUTPUT_LOCALE env var is not explicitly set - Store resolved locale on every analysis record (updateAnalysis + updateAnalysisBatch validators, both analyzed and auto-filtered paths) - Propagate locale through ConvexResumeAnalysis → MatchingResult → ResumeDetail UI as "Language: English / Simplified Chinese / ..." - Reuse SEEK_HOST_SUFFIX from lib/resume_identity.ts (exported) instead of redefining it; use RESUME_AI_PROMPT_LOCALE_TO_NATURAL_LANGUAGE from @trends/shared for canonical locale display labels * fix keyword case-insensitive chip identity * update * update * update * fix: align resume locale prompt hydration * fix: enforce latest-three work history across resume flows (#359) Keep raw work history stored in full while using only the latest three entries for tagging, AI payloads, search text, and web presentation so downstream analysis stays aligned with the visible resume context. * feat: centralize resume field usage policy (#360) * Feat/resume source snapshots (#361) * update * Refactor manual resume import & clean content.js Introduce a two-stage manual-resume import flow (build payload + submit) with new types, import limit handling, parsed-summary builders, and batched file parsing in apps/api. Update Makefile to use `bun run` (instead of bunx) and improve restore-resumes help text and param handling. Large cleanup and hardening of browser extension content.js: normalize string/quote styles, stricter null/type checks, safer parsing/formatting, and small logic/stability fixes for Job5156/Seek extraction and auto-sync helpers. Add resume/CDP tooling and tests (new scripts and dev-docs release note) and tweak various resume-related scripts and worker utilities. * chore: refactor skill bootstrap flow (#362) * update * Refactor manual resume import & clean content.js Introduce a two-stage manual-resume import flow (build payload + submit) with new types, import limit handling, parsed-summary builders, and batched file parsing in apps/api. Update Makefile to use `bun run` (instead of bunx) and improve restore-resumes help text and param handling. Large cleanup and hardening of browser extension content.js: normalize string/quote styles, stricter null/type checks, safer parsing/formatting, and small logic/stability fixes for Job5156/Seek extraction and auto-sync helpers. Add resume/CDP tooling and tests (new scripts and dev-docs release note) and tweak various resume-related scripts and worker utilities. * chore: refactor skill bootstrap flow * fix: install global skills into agent roots (#363) * Refactor global skill bootstrap to use skills CLI (#364) * chore(codex-gpt-5-4): please review why the make dev unable to start (#365) Co-authored-by: karlcc <3255660+karlcc@users.noreply.github.com> * update * feat(cli): add resume snapshot restore and 51job manual import (#366) * feat(cli): add resume snapshot and directory restore * feat(cli): add 51job manual import command * feat(review): separate source-aware analysis lanes (#367) * fix: harden demo resume seeding and workflow verification (#368) * fix: keep demo resumes out of Malaysia workflows * refactor: simplify workflow dataset verification * fix: bootstrap Go and build CLI in install-deps (#369) * fix: bootstrap Go and build CLI in install-deps * fix: skip codecov upload on fork pull requests --------- Co-authored-by: karl <3255660+karlcc@users.noreply.github.com> * fix(web): sync session location on filter reset (#370) * Fix/manual keyword ai score (#371) * fix(web): restore ai scores for manual keyword search * fix(shared): map manual 51job resumes to job5156 workflow * fix(web): replace form-based export with fetch+blob download (#372) - Replace synchronous form POST with async fetch+blob approach - Parse Content-Disposition header for filename (RFC 5987 UTF-8 encoding) - Include workspace headers in export request - Proper error handling with JSON/text response body inspection * fix: resume analysis batching, convex restart, and backup improvements (#373) * fix: batch resume analysis reset for large restores * fix: preserve resume state across backups * fix: paginate large resume dataset verification * fix: batch JD usage loading for large resume datasets * fix: preserve computed fields in resume backups * fix: safe local convex startup with timezone env * fix: add safe make target for local convex dev * fix: add convex-only restart make targets * fix: stop full convex wrapper process groups * fix: add convex status make target * fix: point worker convex errors to status and restart * fix: add restart wrapper for resume analysis clear * fix: add restart wrapper for resume restore * docs: clarify foreground convex restart wrappers * fix: add tmux-backed convex refresh * fix: ensure resume maintenance boots convex * fix: clean up convex status output * docs: clarify convex memory operator guidance * feat: surface convex state size in status * docs: point worker convex errors to refresh path * docs: reuse convex recovery hint in worker logs * fix: rate-limit worker convex outage logs * chore(deps): bump codecov/codecov-action from 4 to 5 (#89) Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 4 to 5. - [Release notes](https://github.com/codecov/codecov-action/releases) - [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/codecov/codecov-action/compare/v4...v5) --- updated-dependencies: - dependency-name: codecov/codecov-action dependency-version: '5' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps): bump actions/upload-artifact from 4 to 7 (#114) Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 4 to 7. - [Release notes](https://github.com/actions/upload-artifact/releases) - [Commits](https://github.com/actions/upload-artifact/compare/v4...v7) --- updated-dependencies: - dependency-name: actions/upload-artifact dependency-version: '7' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps): update websockets requirement (#90) Updates the requirements on [websockets](https://github.com/python-websockets/websockets) to permit the latest version. - [Release notes](https://github.com/python-websockets/websockets/releases) - [Commits](https://github.com/python-websockets/websockets/compare/13.0...16.0) --- updated-dependencies: - dependency-name: websockets dependency-version: '16.0' dependency-type: direct:production ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps): bump actions/upload-pages-artifact from 3 to 4 (#93) Bumps [actions/upload-pages-artifact](https://github.com/actions/upload-pages-artifact) from 3 to 4. - [Release notes](https://github.com/actions/upload-pages-artifact/releases) - [Commits](https://github.com/actions/upload-pages-artifact/compare/v3...v4) --- updated-dependencies: - dependency-name: actions/upload-pages-artifact dependency-version: '4' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps-dev): update pytest requirement (#96) Updates the requirements on [pytest](https://github.com/pytest-dev/pytest) to permit the latest version. - [Release notes](https://github.com/pytest-dev/pytest/releases) - [Changelog](https://github.com/pytest-dev/pytest/blob/main/CHANGELOG.rst) - [Commits](https://github.com/pytest-dev/pytest/compare/8.0.0...9.0.2) --- updated-dependencies: - dependency-name: pytest dependency-version: 9.0.2 dependency-type: direct:development ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps): bump tenacity from 8.5.0 to 9.1.4 (#97) Bumps [tenacity](https://github.com/jd/tenacity) from 8.5.0 to 9.1.4. - [Release notes](https://github.com/jd/tenacity/releases) - [Commits](https://github.com/jd/tenacity/compare/8.5.0...9.1.4) --- updated-dependencies: - dependency-name: tenacity dependency-version: 9.1.4 dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps): bump i18next from 23.16.8 to 25.8.13 (#98) Bumps [i18next](https://github.com/i18next/i18next) from 23.16.8 to 25.8.13. - [Release notes](https://github.com/i18next/i18next/releases) - [Changelog](https://github.com/i18next/i18next/blob/master/CHANGELOG.md) - [Commits](https://github.com/i18next/i18next/compare/v23.16.8...v25.8.13) --- updated-dependencies: - dependency-name: i18next dependency-version: 25.8.13 dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps): bump react-router-dom from 6.30.3 to 7.13.1 (#99) Bumps [react-router-dom](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router-dom) from 6.30.3 to 7.13.1. - [Release notes](https://github.com/remix-run/react-router/releases) - [Changelog](https://github.com/remix-run/react-router/blob/main/packages/react-router-dom/CHANGELOG.md) - [Commits](https://github.com/remix-run/react-router/commits/react-router-dom@7.13.1/packages/react-router-dom) --- updated-dependencies: - dependency-name: react-router-dom dependency-version: 7.13.1 dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps-dev): bump eslint-plugin-react-refresh from 0.4.26 to 0.5.2 (#100) Bumps [eslint-plugin-react-refresh](https://github.com/ArnaudBarre/eslint-plugin-react-refresh) from 0.4.26 to 0.5.2. - [Release notes](https://github.com/ArnaudBarre/eslint-plugin-react-refresh/releases) - [Changelog](https://github.com/ArnaudBarre/eslint-plugin-react-refresh/blob/main/CHANGELOG.md) - [Commits](https://github.com/ArnaudBarre/eslint-plugin-react-refresh/compare/v0.4.26...v0.5.2) --- updated-dependencies: - dependency-name: eslint-plugin-react-refresh dependency-version: 0.5.2 dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps-dev): bump tailwindcss from 3.4.19 to 4.2.1 (#101) Bumps [tailwindcss](https://github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/tailwindcss) from 3.4.19 to 4.2.1. - [Release notes](https://github.com/tailwindlabs/tailwindcss/releases) - [Changelog](https://github.com/tailwindlabs/tailwindcss/blob/main/CHANGELOG.md) - [Commits](https://github.com/tailwindlabs/tailwindcss/commits/v4.2.1/packages/tailwindcss) --- updated-dependencies: - dependency-name: tailwindcss dependency-version: 4.2.1 dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps-dev): bump @types/node from 22.19.11 to 25.3.0 (#102) Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 22.19.11 to 25.3.0. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node) --- updated-dependencies: - dependency-name: "@types/node" dependency-version: 25.3.0 dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps): bump astral-sh/setup-uv from 5 to 7 (#115) Bumps [astral-sh/setup-uv](https://github.com/astral-sh/setup-uv) from 5 to 7. - [Release notes](https://github.com/astral-sh/setup-uv/releases) - [Commits](https://github.com/astral-sh/setup-uv/compare/v5...v7) --- updated-dependencies: - dependency-name: astral-sh/setup-uv dependency-version: '7' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps): update fastmcp requirement (#94) Updates the requirements on [fastmcp](https://github.com/PrefectHQ/fastmcp) to permit the latest version. - [Release notes](https://github.com/PrefectHQ/fastmcp/releases) - [Changelog](https://github.com/PrefectHQ/fastmcp/blob/main/docs/changelog.mdx) - [Commits](https://github.com/PrefectHQ/fastmcp/compare/v2.12.0...v3.0.2) --- updated-dependencies: - dependency-name: fastmcp dependency-version: 3.0.2 dependency-type: direct:production ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(ci): bump actions/checkout from v4 to v6 (#374) * fix(ci): repair web checks (#382) * fix: update export hook tests for fetch download * fix(ci): repair web checks * fix(web): restore tailwindcss v3 (#386) * fix(ci): align root vitest tooling (#387) * test(ci): fix api vitest4 harnesses (#388) * chore(deps): bump actions/setup-python from 5 to 6 (#375) Bumps [actions/setup-python](https://github.com/actions/setup-python) from 5 to 6. - [Release notes](https://github.com/actions/setup-python/releases) - [Commits](https://github.com/actions/setup-python/compare/v5...v6) --- updated-dependencies: - dependency-name: actions/setup-python dependency-version: '6' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps): bump docker/build-push-action from 5 to 7 (#376) Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 5 to 7. - [Release notes](https://github.com/docker/build-push-action/releases) - [Commits](https://github.com/docker/build-push-action/compare/v5...v7) --- updated-dependencies: - dependency-name: docker/build-push-action dependency-version: '7' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps): bump actions/setup-node from 4 to 6 (#377) Bumps [actions/setup-node](https://github.com/actions/setup-node) from 4 to 6. - [Release notes](https://github.com/actions/setup-node/releases) - [Commits](https://github.com/actions/setup-node/compare/v4...v6) --- updated-dependencies: - dependency-name: actions/setup-node dependency-version: '6' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: karlcc <3255660+karlcc@users.noreply.github.com> * chore(deps): bump i18next-browser-languagedetector from 7.2.2 to 8.2.1 (#380) Bumps [i18next-browser-languagedetector](https://github.com/i18next/i18next-browser-languageDetector) from 7.2.2 to 8.2.1. - [Changelog](https://github.com/i18next/i18next-browser-languageDetector/blob/master/CHANGELOG.md) - [Commits](https://github.com/i18next/i18next-browser-languageDetector/compare/v7.2.2...v8.2.1) --- updated-dependencies: - dependency-name: i18next-browser-languagedetector dependency-version: 8.2.1 dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: karlcc <3255660+karlcc@users.noreply.github.com> * chore(deps-dev): bump globals from 15.15.0 to 17.4.0 (#384) Bumps [globals](https://github.com/sindresorhus/globals) from 15.15.0 to 17.4.0. - [Release notes](https://github.com/sindresorhus/globals/releases) - [Commits](https://github.com/sindresorhus/globals/compare/v15.15.0...v17.4.0) --- updated-dependencies: - dependency-name: globals dependency-version: 17.4.0 dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: karlcc <3255660+karlcc@users.noreply.github.com> * chore(deps): bump docker/login-action from 3 to 4 (#378) Bumps [docker/login-action](https://github.com/docker/login-action) from 3 to 4. - [Release notes](https://github.com/docker/login-action/releases) - [Commits](https://github.com/docker/login-action/compare/v3...v4) --- updated-dependencies: - dependency-name: docker/login-action dependency-version: '4' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: karlcc <3255660+karlcc@users.noreply.github.com> * chore(deps): bump docker/setup-buildx-action from 3 to 4 (#379) Bumps [docker/setup-buildx-action](https://github.com/docker/setup-buildx-action) from 3 to 4. - [Release notes](https://github.com/docker/setup-buildx-action/releases) - [Commits](https://github.com/docker/setup-buildx-action/compare/v3...v4) --- updated-dependencies: - dependency-name: docker/setup-buildx-action dependency-version: '4' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: karlcc <3255660+karlcc@users.noreply.github.com> * chore(deps-dev): bump eslint from 9.39.4 to 10.1.0 (#381) * chore(deps-dev): bump eslint from 9.39.4 to 10.1.0 Bumps [eslint](https://github.com/eslint/eslint) from 9.39.4 to 10.1.0. - [Release notes](https://github.com/eslint/eslint/releases) - [Commits](https://github.com/eslint/eslint/compare/v9.39.4...v10.1.0) --- updated-dependencies: - dependency-name: eslint dependency-version: 10.1.0 dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] <support@github.com> * fix: align react hooks lint config with eslint 10 --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: karlcc <3255660+karlcc@users.noreply.github.com> * chore(deps): bump react from 18.3.1 to 19.2.4 (#385) * chore(deps): bump react from 18.3.1 to 19.2.4 Bumps [react](https://github.com/facebook/react/tree/HEAD/packages/react) from 18.3.1 to 19.2.4. - [Release notes](https://github.com/facebook/react/releases) - [Changelog](https://github.com/facebook/react/blob/main/CHANGELOG.md) - [Commits](https://github.com/facebook/react/commits/v19.2.4/packages/react) --- updated-dependencies: - dependency-name: react dependency-version: 19.2.4 dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] <support@github.com> * fix: align react 19 companion deps --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: karlcc <3255660+karlcc@users.noreply.github.com> * Improve resume list UI performance (#389) * fix(api): paginate convex resume windows (#390) * perf(api): page convex resume queries (#391) * perf(api): push convex resume filters into page queries (#392) * perf(api): push convex sorts into page queries (#393) * perf(web): push convex sort windows (#394) * perf(web): paginate convex resume hook (#395) * perf(web): push convex base filters (#396) * fix(web): align ai skills and salary filters (#397) * perf(api,convex): native Convex pagination and match-storage paging for resume list (#398) Use native Convex withIndex().paginate() for the default unfiltered listWithIngestDataPaginated path, avoiding the overfetch/take() pattern that can exceed Convex's 16 MB read limit on large datasets. Add MatchStorage.getMatchesPageForJob() to page score-sorted, minMatchScore-filtered, and recommendation-filtered resume queries through SQLite match storage instead of fetching all matches into memory. Skip redundant JS post-filtering and re-sorting when results are already filtered and ordered by the match-storage SQL query. * fix(convex): use native paginate() with post-filtering for resume filters (#399) Extend the native paginate() fast-path in listWithIngestDataPaginated to also handle the filtered case (locations, education, skills, etc.) when no jobDescriptionId or custom sortBy is set. Previously, any active filter fell back to the overfetch/take() path which reads up to 4000 docs at once, exceeding Convex's 16 MB read limit. Now filters are applied as a post-filter on each paginated page. Pages may be smaller than requested when items are filtered out, but usePaginatedQuery on the client side handles this by loading additional pages automatically. * perf(convex,web): add pagination debug instrumentation (#400) Add dev-only performance logging to diagnose slow filtered pagination: - Convex: log per-page rejection rate when filters are active - Web: track round-trip count and total elapsed time in auto-load loop * perf(convex): overfetch 3x on native paginate when filters are active (#401) When resume filters (location, education, skills, salary) are active, increase the native paginate() page size by 3x to compensate for high rejection rates. This reduces round-trips from 12 to 4 for selective filters like "Kuala Lumpur MY" (97% rejection rate), cutting total load time from ~5.5s to ~3.2s. The offset-based path with take() cannot be used here because it hits the Convex 16MB read limit on large datasets. * perf(convex): 3x overfetch for filtered native paginate + instrumentation cleanup (#402) * perf(convex): overfetch 3x on native paginate when filters are active When resume filters (location, education, skills, salary) are active, increase the native paginate() page size by 3x to compensate for high rejection rates. This reduces round-trips from 12 to 4 for selective filters like "Kuala Lumpur MY" (97% rejection rate), cutting total load time from ~5.5s to ~3.2s. The offset-based path with take() cannot be used here because it hits the Convex 16MB read limit on large datasets. * refactor(web): clean up pagination perf instrumentation - Extract stats ref assignment once before both branches - Unify log prefix to [perf:paginate] across Convex and web * chore(convex,web): remove pagination perf instrumentation (#403) The [perf:paginate] logging served its purpose validating the 3x overfetch filtered pagination (PRs #398-#402). Convex-side logs had no dev guard and would have appeared in production. Web-side stats ref/effects added ~40 lines of scaffolding no longer needed. * fix(web): enforce every() semantics for requiredKeywords filter (#404) The requiredKeywords filter used .some() which matched resumes containing ANY required keyword. Changed to .every() so resumes must contain ALL required keywords to pass the filter, matching the "required" semantics expected by search profiles. Added unit tests verifying every() behavior for multi-keyword, single-keyword, and empty required keyword cases. * fix(tests): repair 3 pre-existing test failures and exclude bun-only test (#405) - field-usage-policy: account for resumeSnippet now disallowed on analysis surface - job-descriptions: replace deprecated list_with_usage query test with direct normalizeIndustryTags unit test - migrations-evidence-text: relax salary and cross-page assertions to use targeted field checks instead of strict toContainEqual, add searchText to ResumeRecord type - vitest.config: exclude scripts/test-notifications.test.ts (uses bun:test imports) All 461 tests now pass across 74 test files. * feat(api): add review-packet storage foundation (Feedback Loop V1 slice 1) (#406) Add SQLite review_packet_runs table and ReviewPacketStorage service for tracking exported resume review packets through the feedback loop: create → feedback_imported → summary_sent lifecycle. This is the first small slice extracted from the deferred Feedback Loop V1 PR (#354). Storage only — no routes or UI wiring yet. * feat(api): add feedback import service (Feedback Loop V1 slice 2) (#407) Add FeedbackImportService for importing CSV/XLSX review feedback into the resume screening pipeline. Supports: - Resume ID primary matching with Profile URL fallback - Job5156 and SEEK URL identity normalization - Name mismatch tolerance with warnings - Candidate status and action callbacks - Duplicate row deduplication Builds on the review-packet storage from slice 1 (PR #406). * feat(api): add feedback summary service (Feedback Loop V1 slice 3) (#408) Add FeedbackSummaryService for building review-packet feedback summaries with status/action breakdowns. Supports: - Status and action count aggregation from candidate records - Labeled breakdown entries sorted by count - Conversion to ReviewPacketSummaryStats for storage Builds on slices 1-2 (review-packet storage + feedback import). * feat(api): add review packet wechat template rendering (#409) * feat(api): add review packet routes (#410) * fix(api): harden database schema init (#411) * feat(api): add review packet routes * fix(api): harden database schema init * fix(deps): patch critical/high security vulnerabilities (#412) - fastmcp >=2.14.2 (3 CVEs: OAuth proxy token reuse, auth confused deputy, MCP update) - authlib >=1.6.9 (critical: JWS header injection bypass, 3 high: OIDC/JWE/alg-none) - cryptography >=46.0.5 (high: SECT curve subgroup attack) - python-multipart >=0.0.22 (high: arbitrary file write) - mcp >=1.23.0 (high: DNS rebinding) — pulled transitively via fastmcp 3.1.1 - go-viper/mapstructure v2.4.0 (medium: info leak in logs) Resolves 13 of 15 Dependabot alerts (2 remaining are medium fastmcp Windows-only). * chore: remove stale test:worker:resume-tasks script (#413) The script referenced tests/test_resume_tasks.py which does not exist, causing the npm script to always fail with file-not-found. * fix(cli): fully clear resume data before replace restore (#414) * feat(web): add review packet ops page (#415) * feat(web): add resume bulk handoff to review packets (#416) * test(web): wait for review packet summary action (#417) * perf(web): speed up dev resume first paint (#418) * fix(dev): harden convex refresh startup (#419) * feat(dev): add resume latency refresh benchmark (#420) * feat(dev): add resume latency baseline gate (#421) * feat(dev): add auto-baseline resume latency check (#422) * feat(api): add workspace summary preview core (#423) * feat(api): add summary dispatch and telegram bridge (#424) * feat(worker): add workspace summary trigger (#425) * fix(worker): align profile schedule runtime (#426) * feat(summary): add workspace run history (#427) * fix(worker): align profile schedule runtime * feat(summary): add workspace run history * fix(summary): harden telegram bridge output (#428) * fix(worker): align profile schedule runtime * feat(summary): add workspace run history * fix(summary): harden telegram bridge output * feat(summary): clarify shared vs workspace metrics (#429) * feat(summary): enrich telegram delivery audit (#430) * feat(cli): show summary delivery audit (#431) * feat(web): add summary runs history page (#432) * feat(summary): add weekly summary periods (#433) * chore(deps): sync bun lockfile (#434) * feat(web): add summary run controls (#435) * feat(api): add summary profile routes (#436) * feat(worker): schedule summary profiles at startup (#437) * feat(web): add summary profile admin UI (#438) * feat(cli): expose worker schedule metadata (#439) * fix(worker): persist startup status before crawl (#440) * feat(web): clarify summary profile restart checks (#441) * feat(web): pass search history into review packets (#442) * fix(web): keep review packet session ids manual (#443) * feat(web): bridge review packet session ids (#444) * feat(web): simplify resume search shell (#445) * feat(web): add durable resume share sessions (#446) * feat(web): improve tablet resume shell (#447) * feat(web): add resume search assistant drawer (#448) * fix(resumes): recover JD-backed searches from empty keyword results (#449) * feat(web): add resume search continue cards (#450) * feat(web): surface resume search session summary (#451) * feat(web): promote copied resume share links (#452) * feat(web): add resume share fallback dialog (#453) * fix: rebuild stale deployed web dist (#454) * fix(web): preserve saved state on JD reopen (#455) * fix: keep reference note in shared resume sessions (#456) * feat: show active session context notes (#457) * fix: preload resume dialogs on touch (#458) * fix: harden convex refresh readiness (#459) * feat: expand seek english vocabulary coverage (#460) * fix: widen convex keyword search window (#461) * fix: push required keyword filters into paging (#462) * fix: push required keyword filters into paging * fix: align required keyword paging types * fix: widen convex post-filter fetch window (#463) * fix: page filtered convex score results via match storage (#464) * fix: page filtered keyword score results via convex scans (#465) * fix: generalize bounded keyword score pagination (#466) * fix: exact-scan oversized keyword score pages (#467) * fix: prefer best duplicate keyword match (#468) * fix: unify keyword match scan path (#469) * fix: align web JD keyword search with exact scan (#470) * feat: add search-first resume UI (#471) * feat: add search-first resume experience * feat: add taxonomy-backed resume search facets * feat: add jd keyword paste to resume search * test: harden search-first URL and JD interactions * fix: refresh search-first virtual rows * test: cover resume search page wiring * test: cover ai search summary hook * fix: keep taxonomy slug in sync * test: cover search-first shell components * fix: enforce mobile filter sidebar embedding * test: cover resume search snippet cards * test: cover resume search state hook * test: cover keyword expansion fallback * test: cover url search state flags * fix: scope search-first recent searches * fix: schedule ai summary cache cleanup * fix: scope ai summary cache by workspace * perf: index ai summary cache cleanup * test: harden taxonomy helper contracts * test: cover ai summary route cache branches * test: cover taxonomy route workspace access * test: cover jd keyword extraction route * test: cover taxonomy cluster convex handlers * test: cover search-first ai services * test: cover taxonomy delete route * fix: stabilize jd extraction route errors * fix: stabilize ai summary route errors * fix: stabilize taxonomy route errors * test: cover facet count hook limits * fix: cap min score facet counts * test: cover results list observer paths * test: cover search bar interactions * test: cover ai summary panel states (#472) * test: cover search hero forwarding (#473) * test: cover search header forwarding (#474) * test: cover resume search shell edges (#475) * test: cover mobile filter sheet dialog state (#476) * test: cover facet sidebar embedded mode (#477) * test: cover facet group collapse edges (#478) * test: cover ai summary lifecycle (#479) * fix: clear resume search state overrides (#480) * test: cover resume facet reset contract (#481) * test: cover url search sort clearing (#482) * test: cover resume search facet toggles (#483) * test: cover resume search facet clears (#484) * test: cover resume search relevance reset (#485) * test: cover resume search status toggles (#486) * feat: simplify resume landing page seeds (#487) * fix: limit landing hot keywords to system seeds (#488) * fix: restore search result export and score sort (#489) * fix: add ai summary fallback (#490) * fix: restore search-first resume ai analysis ui (#491) * feat: add search-first resume analysis dispatch (#492) * feat: unify landing quick starts with search profiles (#493) * fix: add quick-start-only search profiles view (#494) * fix: point migration banner to quick-start view (#495) * fix: add quick-start-only search profiles view * fix: point migration banner to quick-start view * fix: correct virtualized search result offset (#496) * fix: add quick-start-only search profiles view * fix: point migration banner to quick-start view * fix: correct virtualized search result offset * feat(search-profiles): unify quick starts into workspace-managed profiles (#497) * test(api): refresh aging scoring fixtures (#500) Co-authored-by: karlcc <3255660+karlcc@users.noreply.github.com> * docs: auto-update dev-docs from upstream sources * update * fix(collect): actually clear collectUrl when switching to non-Seek source The updater (current) => (current ?? undefined) === current ? current : undefined was tautological — the condition is always true for any string or undefined, so the stale collectUrl was never cleared on source switch. Replace with a direct setSessionCollectUrl(undefined) call. --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: Karl Chow <3255660+karlcc@users.noreply.github.com> Co-authored-by: cmux-client[bot] <248410710+cmux-client[bot]@users.noreply.github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.



No description provided.