openclaw-deal-hunter
v1.0.0
Published
OpenClaw plugin: price watches, safe scans, and heuristic deal signals
Maintainers
Readme
OpenClaw Deal Hunter
OpenClaw plugin: watch product URLs, scan with conditional GET (ETag / Last-Modified), streaming byte caps, shared undici connection pooling, and TypeScript heuristic deal signals.
The extraction stack is layered:
- retailer-aware extractors for common HTML patterns
- JSON-LD / OpenGraph extraction
- bounded regex fallback for visible prices
Ethics & responsibility
- You are responsible for complying with each site’s terms of service and
robots.txt. This plugin does not bypass CAPTCHAs or anti-bot systems. - Built-in per-host spacing and global concurrency caps reduce accidental load; tune
defaultMaxRpsPerHostandmaxConcurrentfor your environment. - Examples in this readme are illustrative only.
Install
Requires Node >= 20 and OpenClaw Gateway with plugin loading enabled.
Source repo:
https://github.com/Cognostra/deal-finder
Important install note:
- For native OpenClaw plugins, the supported public install path is an npm package spec such as
openclaw plugins install <npm-spec>. - The OpenClaw CLI does not accept a GitHub repo URL as a native plugin install spec.
- GitHub should be treated as the source/support repo; npm is the easy end-user install path.
Primary install path:
openclaw plugins install openclaw-deal-hunterLocal source install for development:
cd /path/to/deal-finder
npm install
npm run build
openclaw plugins install -l .Enable the plugin and tools in your OpenClaw config, for example:
plugins: {
entries: {
"openclaw-deal-hunter": {
enabled: true,
config: {
maxConcurrent: 8,
maxBytesPerResponse: 1048576,
defaultMaxRpsPerHost: 1,
allowedHosts: ["*.example.com"],
blockedHosts: ["localhost"],
fetcher: "local"
}
}
}
}Update or remove:
openclaw plugins install openclaw-deal-hunter@latest
openclaw plugins remove openclaw-deal-hunterAllow-list tools for your agent (names must be explicitly allowed when using plugin-only tool policy):
agents: {
list: [
{
id: "main",
tools: {
allow: [
"openclaw-deal-hunter",
"deal_watch_list",
"deal_template_list",
"deal_watch_add",
"deal_watch_add_template",
"deal_watch_update",
"deal_watch_set_enabled",
"deal_watch_search",
"deal_watch_taxonomy",
"deal_host_report",
"deal_saved_view_list",
"deal_saved_view_create",
"deal_saved_view_update",
"deal_saved_view_run",
"deal_saved_view_dashboard",
"deal_saved_view_delete",
"deal_view_scan",
"deal_view_report",
"deal_watch_bulk_update",
"deal_view_bulk_update",
"deal_watch_tag",
"deal_watch_dedupe",
"deal_watch_export",
"deal_watch_import",
"deal_watch_import_url",
"deal_watch_remove",
"deal_scan",
"deal_fetch_url",
"deal_extraction_debug",
"deal_evaluate_text",
"deal_help",
"deal_quickstart",
"deal_report",
"deal_digest",
"deal_workflow_action_queue",
"deal_workflow_portfolio",
"deal_workflow_triage",
"deal_workflow_cleanup",
"deal_workflow_best_opportunities",
"deal_health",
"deal_history",
"deal_alerts",
"deal_trends",
"deal_top_drops",
"deal_market_check",
"deal_product_groups",
"deal_best_price_board",
"deal_llm_review_queue",
"deal_llm_review_run",
"deal_llm_review_apply",
"deal_watch_insights",
"deal_watch_provenance",
"deal_watch_identity",
"deal_schedule_advice",
"deal_doctor",
"deal_sample_setup"
]
}
}
]
}Tools
| Tool | Purpose |
|------|---------|
| deal_watch_list | List watches and last snapshots. |
| deal_template_list | List built-in watch templates for common deal and restock patterns. |
| deal_watch_add | Add a URL with optional maxPrice, percentDrop, keywords. |
| deal_watch_add_template | Create a watch from a built-in template, with dry-run preview support. |
| deal_watch_update | Update a watch’s URL, thresholds, label, keywords, or enabled state. |
| deal_watch_set_enabled | Enable or disable one or more watches in bulk. |
| deal_watch_search | Search/filter/sort watches by query, enabled state, snapshot state, signals, tag, group, or price. |
| deal_watch_taxonomy | Summarize groups, tags, organization gaps, and suggested saved views for larger watchlists. |
| deal_host_report | Summarize watches by host with signal density, alert load, and cadence recommendations. |
| deal_saved_view_list | List saved watch search views and their current match counts. |
| deal_saved_view_dashboard | Summarize all saved views at a glance with top alerts, best opportunities, and next actions. |
| deal_saved_view_create | Save a reusable watch search/filter view for larger watchlists. |
| deal_saved_view_update | Rename or retarget an existing saved view. |
| deal_saved_view_run | Run a saved view and return the current matching watches. |
| deal_saved_view_delete | Delete a saved watch search view. |
| deal_view_scan | Run deal_scan against the watches currently matched by one saved view. |
| deal_view_report | Generate alerts, trends, drops, and best-opportunity summaries for one saved view. |
| deal_watch_bulk_update | Bulk-update watches selected by ids or search filters; dry-run by default. |
| deal_view_bulk_update | Bulk-update all watches currently matched by one saved view; dry-run by default. |
| deal_watch_tag | Add, remove, or replace tags and assign groups across matching watches. |
| deal_watch_dedupe | Find or resolve likely duplicate watches using canonicalized URLs. |
| deal_watch_export | Export watches, optionally including snapshots and history, for backup or migration. |
| deal_watch_import | Import watches with append, upsert, replace, and dryRun support. |
| deal_watch_import_url | Fetch a remote JSON watchlist over HTTP(S), validate it, and import it with dry-run support. |
| deal_watch_remove | Remove by watchId. |
| deal_scan | Scan all enabled watches (or watchIds); commit: false dry-run. |
| deal_fetch_url | One-off capped fetch + heuristic extraction. |
| deal_extraction_debug | Show heuristic extraction candidates, chosen fields, and confidence reasons for one URL. |
| deal_evaluate_text | Score pasted text for “freebie / glitchy” wording (no network). |
| deal_help | Show install, tool, cron, and safety guidance from inside OpenClaw. |
| deal_quickstart | Show a first-run checklist, starter prompts, and privacy/safety reminders. |
| deal_report | Summarize the watchlist, price leaders, recent changes, noisy watches, and glitch candidates. |
| deal_digest | Produce a concise announcement-ready digest for the whole watchlist or one saved view. |
| deal_workflow_action_queue | Build a prioritized queue of the most important next actions across alerts, cleanup, discovery, and review. |
| deal_workflow_portfolio | Build a portfolio dashboard for the whole watchlist or a saved view. |
| deal_workflow_triage | Answer what changed, what matters, what looks noisy, and what to review first. |
| deal_workflow_cleanup | Surface duplicates, stale/disabled items, weak extraction cases, and noisy cleanup candidates. |
| deal_workflow_best_opportunities | Rank top likely-real deals, suspicious glitches, strongest alerts, and same-product price spreads. |
| deal_health | Show configuration, storage, safety posture, and operational recommendations. |
| deal_review_policy | Show the effective scan-time review mode, thresholds, rewrite rules, and whether automatic model review is active. |
| deal_history | Show per-watch price history, recent deltas, and lowest/highest seen prices. |
| deal_alerts | Rank current threshold, keyword, and recent high-severity watch signals. |
| deal_trends | Summarize falling, rising, flat, and volatile watches with compact sparklines. |
| deal_top_drops | Rank the strongest deals by discount from peak or the latest committed drop. |
| deal_market_check | Compare one watch against likely same-product watches already in the current store. |
| deal_market_check_candidates | Fetch explicit candidate URLs and compare them against one anchor watch before you add or import anything. |
| deal_discovery_backlog | Rank which enabled watches most need broader same-product coverage and explain why. |
| deal_discovery_policy | Show the effective discovery mode, budgets, trusted-host posture, and provider readiness. |
| deal_discovery_report | Run discovery and return a compact summary of the best candidates, duplicates, blocked results, and import recommendations. |
| deal_discovery_search | Run bounded provider-backed discovery search on explicit trusted retailer hosts and return candidate URLs. |
| deal_discovery_fetch | Fetch explicit candidate URLs, extract them safely, and rank likely same-product matches. |
| deal_discovery_run | Run bounded discovery search or explicit-candidate fetch/ranking, prepare import decisions, and include a compact report. |
| deal_discovery_import | Import approved discovery candidates as new watches, with dry-run preview and compact discovery report by default. |
| deal_product_groups | Cluster likely same-product watches across the store or a saved view and summarize group spreads. |
| deal_best_price_board | Rank grouped same-product opportunities by current internal spread and best-known watch. |
| deal_llm_review_queue | Prepare low-confidence extraction or identity cases for optional manual or llm-task JSON review. |
| deal_llm_review_run | Execute one queued extraction or identity review through the embedded OpenClaw runtime and return JSON. |
| deal_llm_review_apply | Apply reviewed extraction or identity fields back onto a watch snapshot with dry-run preview support. |
| deal_watch_insights | Explain one watch in depth: trend, volatility, glitch risk, and active signals. |
| deal_watch_provenance | Show how a watch entered the store, what the latest snapshot came from, and whether truncation or review touched it. |
| deal_watch_identity | Show stored product identifiers for a watch and any other watches sharing those identifiers. |
| deal_schedule_advice | Recommend scan cadence by host or watch from observed history timing. |
| deal_doctor | Run a lightweight sanity check for config and watchlist setup. |
| deal_sample_setup | Show install, config, allowlist, prompt, and cron examples. |
Side-effecting tools are registered as optional (except deal_watch_list / deal_evaluate_text) so you opt in via tools.allow.
Recommended first-run workflow:
deal_quickstartfor the shortest safe first-run checklist.deal_helpfor install/tool guidance and sample prompts.deal_sample_setupfor ready-to-copy install/config/cron examples.deal_template_listif you want an opinionated starter path instead of manually filling watch fields.deal_watch_add_templateindryRun: truemode to preview a watch built from a template before saving it.deal_watch_addwhen you want a fully custom watch instead of a template.deal_watch_searchto inspect watches and current threshold/keyword signals.deal_watch_taxonomyonce the list grows so you can see the dominant groups, tags, and best candidate saved views.deal_host_reportwhen you want a retailer-level view of watch density, active signals, and cadence pressure.deal_saved_view_createonce you have a search you expect to reuse, like "GPU alerts" or "disabled watches with snapshots".deal_saved_view_dashboardwhen you want to see which saved views are hot, empty, noisy, or action-worthy without opening each one.deal_saved_view_updateonce you know which saved slices actually deserve their own workflow.deal_watch_tag,deal_watch_bulk_update, ordeal_view_bulk_updateto organize watches into tags and groups as the list grows.deal_watch_dedupein dry-run mode before imports or cleanup work.deal_scanwithcommit: trueto capture snapshots, thendeal_view_scanwhen you want to scan only one saved slice.deal_view_report,deal_digest,deal_workflow_action_queue,deal_workflow_triage,deal_history,deal_alerts,deal_trends, anddeal_top_dropsto inspect recent movement and ranked opportunities.deal_market_check_candidateswhen you have a few explicit retailer URLs and want same-product evidence before adding them as watches.deal_discovery_backlogto decide which enabled watches most deserve discovery effort first.deal_discovery_policyif you want to verify the current discovery mode, host allowlists, and search/fetch budgets before running discovery tools.deal_discovery_reportwhen you want the smallest, decision-ready discovery summary before drilling into raw candidates.deal_discovery_searchfirst ifdiscovery.providerisfirecrawl-searchand you want bounded candidates from a few trusted retailer hosts.deal_discovery_runwhen you want bounded discovery scoring and import preview from either explicit candidate URLs or provider-backed search.deal_discovery_importindryRun: truemode before adding any discovery candidates as real watches.deal_product_groupsanddeal_best_price_boardonce you have multiple same-product watches across retailers.deal_workflow_best_opportunitieswhen you want the sharpest “what should I care about now?” answer.deal_llm_review_queueif weak extraction or identity cases still need optional model-assisted review.deal_llm_review_runwhen you want one queued review executed immediately through your current OpenClaw model setup.deal_llm_review_applyindryRun: truemode before writing reviewed extraction or identity fields back to a watch snapshot.deal_watch_provenancewhen you need to verify where a watch came from or whether a committed snapshot was truncated or manually reviewed.deal_workflow_cleanupwhen you want duplicates, stale items, weak extraction cases, and noisy watches surfaced in one pass.deal_watch_exportbefore major cleanup work or when moving watches to another workspace.deal_watch_importwithdryRun: truebefore applying migrated watchlists from a local export.deal_watch_import_urlwithdryRun: truebefore applying a shared remote watchlist.deal_watch_updateordeal_watch_set_enabledfor single-watch changes.deal_market_check,deal_watch_identity,deal_watch_insights,deal_watch_provenance,deal_schedule_advice,deal_report,deal_digest,deal_workflow_action_queue,deal_workflow_portfolio,deal_health, anddeal_doctorto audit the current state of the plugin.
deal_scan responses now include compact model-friendly fields per watch:
changed,changeType,changeReasonspreviousPrice,currentPrice,priceDelta,percentDeltaalertSeverity,alertScore,extractionConfidencefetchSource,fetchSourceNotereviewMode,reviewQueued,reviewApplied,reviewedFields,reviewWarningsresponseTruncatedsummaryLine- top-level
summary,rankedAlerts, and aggregatereviewWarnings
Snapshot and extraction metadata also include canonicalTitle, which normalizes cosmetic title differences for cleaner watch metadata and more stable agent summaries.
Snapshots can now also persist product identity hints when the page exposes them, including fields like:
brandmodelIdskumpngtinasin
Committed snapshots also persist fetch provenance for trust/debugging:
fetchSourceresponseBytesresponseTruncated
If a fetch hit the configured byte cap, the scan result and the committed snapshot now surface that explicitly so you can inspect it with deal_watch_provenance or deal_extraction_debug.
Reviewed snapshot updates can also persist field-level provenance when you apply an extraction or identity review:
- original value
- reviewed value
- review source
- review timestamp
- optional candidate type, provider, model, and reasons
deal_llm_review_apply now writes that provenance onto the snapshot, and still supports dryRun: true before any write.
The current retailer-aware extractor pack includes fixture-backed support for:
- Amazon-style product pages
- Best Buy-style product pages
- eBay-style product pages
- Target-style product pages
- Walmart-style product pages
- Newegg-style product pages
- Home Depot-style product pages
- Costco-style product pages
- Lowe's-style product pages
deal_extraction_debug now shows:
- which extractor matched, if any
- title and price candidates by source
- product identity candidates by source
- the chosen title/price source
- extraction confidence reasons
Committed scans now build bounded per-watch history so the plugin can report:
- lowest seen price
- highest seen price
- latest price delta
- recent alert-bearing changes
deal_report now also highlights:
recentChangesfor the latest committed movements across the watchlistnoisyWatchesfor products whose recent history looks unusually volatileglitchCandidatesfor near-zero or extreme-drop cases worth manual review
The analytics tools add:
deal_trendsfor compact per-watch direction and volatility summariesdeal_top_dropsfor ranking discounts against historical peaks or the latest committed movedeal_market_checkfor comparing likely same-product watches already in your own watch storedeal_market_check_candidatesfor testing a few explicit retailer URLs against an anchor watch before you import or add themdeal_discovery_backlogfor ranking which enabled watches most need broader same-product coveragedeal_discovery_policyfor checking whether discovery is off, manual-only, or provider-backed and what host/budget rules are activedeal_discovery_reportfor a compact discovery decision summary with best candidates, duplicates, and blocked resultsdeal_discovery_searchfor bounded provider-backed search across explicit trusted retailer hostsdeal_discovery_fetch,deal_discovery_run, anddeal_discovery_importfor bounded discovery workflows with explicit review before importdeal_product_groupsfor clustering likely same-product watches into explainable groupsdeal_best_price_boardfor ranking current best-known internal prices by grouped market spreaddeal_llm_review_queuefor preparing optional JSON-only review payloads when extraction or identity still looks ambiguousdeal_watch_insightsfor one-watch explanations with sparkline contextdeal_watch_identityfor stored product identifiers and same-product watch matching inside the current storedeal_schedule_advicefor host-level or watch-level scan cadence suggestions
Same-product matching is now more explicit in its evidence:
- shared identity fields
- conflicting identity fields
- match score and match strength
- match reasons and match warnings
deal_alerts now includes glitchScore and glitchReasons so small models can distinguish normal threshold hits from suspicious freebie-like results.
deal_health and deal_doctor now also surface discovery/review posture, including:
- whether discovery is off, manual, or
firecrawl-search - whether provider-backed discovery is missing a Firecrawl API key or explicit trusted hosts
- whether scan-time review is
off,queue, orauto_assist
Optional intelligence path
Deal Hunter now supports a scan-time review policy that is still off by default.
Modes:
off: normal safe default; scans never auto-invoke a modelqueue: low-confidence scans are marked for review, but no model is invokedauto_assist: low-confidence scans can trigger bounded automatic review with explicit provenance
Bounded same-product discovery is also available now in two explicit modes:
manual- enable
discovery.enabled - set
discovery.providerto"manual" - pass explicit candidate URLs to
deal_discovery_fetch,deal_discovery_run, ordeal_discovery_import
- enable
firecrawl-search- enable
discovery.enabled - set
discovery.providerto"firecrawl-search" - configure
firecrawlApiKey - provide explicit trusted retailer hosts through
discovery.allowedHostsor tool parameters - use
deal_discovery_policyto verify the active posture - use
deal_discovery_search,deal_discovery_run, ordeal_discovery_import
- enable
Even in firecrawl-search mode, discovery remains bounded:
- no recursive crawling
- no automatic import
- no provider-backed search without explicit trusted hosts
- all fetched result URLs still pass the normal URL and redirect safety policy
Imported discovery watches also retain provenance in importSource, including the anchor watch, provider mode, candidate URL, and any search query/rank metadata that led to the import.
deal_sample_setup now includes example config blocks for:
- baseline local fetch mode
- manual discovery mode
- Firecrawl-backed bounded discovery mode
- queue-only review policy
- bounded
auto_assistreview policy
That default posture is intentional:
- the clean built-in OpenClaw route is the bundled
llm-taskextension - current
llm-taskdocs describe it as a bundled extension, not a stable community-plugin dependency surface - this package stays install-safe and provider-agnostic by avoiding a hidden runtime dependency on another plugin
Instead, the plugin exposes explicit opt-in review paths:
deal_llm_review_queueprepares the exact cases that would benefit from optional reviewdeal_llm_review_runexecutes one queued case through the embedded OpenClaw runtime using your current provider/model setup or explicit overridesdeal_llm_review_applylets you write reviewed fields back to the watch snapshot with a dry-run-first previewdeal_review_policyshows the active scan-time review mode and thresholds
If you enable queue or auto-assist in plugin config, low-confidence scan results will now expose:
- whether review was queued
- whether review was applied
- which fields were reviewed
- any review warnings
- provider/model metadata when auto-assist actually ran
The queue still matters because it keeps the expensive path narrow and explainable. It identifies:
- weak extraction cases
- unresolved same-product identity cases
- a prompt, input payload, and suggested JSON Schema for each candidate
If you enable OpenClaw’s bundled llm-task separately, you can still feed those payloads into your own workflow without making Deal Hunter itself depend on the bundled tool.
deal_watch_import supports:
appendto always create new watchesupsertto match byidfirst, thenurlreplaceto swap the current watchlist with the imported onedryRunto preview the result before writing
deal_watch_import_url supports:
- remote JSON arrays of watches
- prior
deal_watch_exportpayloads with a top-levelwatchesarray dryRunby default so remote imports are previewed before writing- per-run
group,addTags, andenabledoverrides - recorded
importSourcemetadata so shared-list provenance stays visible on imported watches
Watch management now also includes:
- URL canonicalization that strips common tracking params before storage and dedupe checks
- built-in watch templates for price caps, percent-drop tracking, hybrid deal watches, restock signals, and clearance hunting
- optional
groupandtagsmetadata for organizing larger watchlists deal_watch_taxonomyfor summarizing group/tag coverage and suggesting the next saved views worth creatingdeal_host_reportfor retailer-level watch density, signal load, and cadence pressure- saved views for repeat watchlist searches and imported-list navigation
- saved-view execution targets for scanning, reporting, and bulk updates
- bulk update and tag tools that are dry-run-first for safer agent workflows
- dedupe reporting and duplicate resolution based on canonicalized URLs
Workflow-oriented tools now also include:
deal_view_reportfor one-call saved-view reportingdeal_workflow_triagefor change review and prioritizationdeal_workflow_cleanupfor list hygiene and extraction-quality reviewdeal_workflow_portfoliofor an executive dashboarddeal_workflow_best_opportunitiesfor decisive “best deal vs suspicious glitch” ranking
Network guardrails:
- Watch and fetch URLs must be
httporhttps. - Localhost and private-network IP literals are blocked by default.
- Hostnames that resolve to private or loopback IPs are blocked at fetch time.
allowedHostsandblockedHostscan further restrict where the plugin is allowed to connect.- Redirect targets are validated before the plugin follows them.
Privacy & data
- Watch metadata, the latest snapshot, and committed history are stored in the configured JSON store path.
- Saved watch-search views are stored alongside the watchlist so larger setups keep their navigation shortcuts.
- Exported watchlists may include URLs, thresholds, snapshots, and history if you choose to include them.
deal_watch_importsupportsdryRunso you can preview changes before writing them to disk.deal_watch_import_urlrecords the source URL and import timestamp on affected watches.allowedHostsis the best way to keep the plugin constrained to the domains you actually want it to touch.
Troubleshooting
- Use
deal_quickstartif you want the shortest safe first-run path. - Use
deal_doctorfor a quick sanity check. - Use
deal_healthto inspect active limits, fetcher choice, and host-policy posture. - Use
deal_fetch_urlwhen you need a quick raw preview. - Use
deal_extraction_debugwhen extraction quality looks weak and you want to inspect candidates, chosen fields, and confidence reasons. - If a URL is blocked, compare it against your
allowedHostsandblockedHostssettings first.
Proactive scans (cron)
Use OpenClaw’s scheduler so the agent runs a batch scan on a cadence, then announces to your channel. Example pattern:
openclaw cron add \
--name "Deal scan" \
--cron "0 * * * *" \
--tz "America/Los_Angeles" \
--session isolated \
--message "Run deal_scan with commit true for all enabled watches. If any result has non-empty alerts, summarize the best deals for me." \
--announce \
--channel telegram \
--to "user:YOUR_TARGET"Adjust --channel / --to for Discord, Slack, WhatsApp, or use webhook delivery per OpenClaw docs.
Optional Firecrawl fetcher
Set fetcher: "firecrawl" and provide firecrawlApiKey (and optionally firecrawlBaseUrl) to route listing retrieval through Firecrawl’s scrape API instead of direct GET.
Notes:
- Firecrawl is currently supported in the Node engine path.
deal_scannow loads the store under lock, releases the lock while network requests run, and re-locks only for commit/merge.
Publishing and listing
For a community-listed OpenClaw plugin, the expected public shape is:
- npm-published package
- public GitHub repository
- setup/use docs
- issue tracker
That means this repo should be the public source of truth, but end-user installs should point at the npm package, not the GitHub URL.
Local OpenClaw test harness
Development/testing only.
This repo includes an isolated harness that does not touch your main ~/.openclaw state:
./scripts/openclaw-test-cli.sh plugins list
./scripts/openclaw-test-cli.sh gateway --port 18789 --verbose
./scripts/openclaw-test-cli.sh gateway statusNotes:
- test config lives at
./.openclaw-test/openclaw.json - wrapper script syncs model/auth selection from your main
~/.openclaw/openclaw.jsoninto the repo-local test config before each run - by default the harness uses an isolated repo-local state dir at
./.openclaw-test, while inheriting the model/provider you chose during OpenClaw setup - the wrapper also seeds the repo-local test agent from your main OpenClaw agent state when per-agent model/auth files are available
- repo-local workspace and plugin store stay under
./.openclaw-test - the test agent id is
deal-finder-testto avoid colliding with your normalmainagent sessions - stop the foreground gateway with
Ctrl+C
Provider/model sanity commands:
ollama list
./scripts/openclaw-test-cli.sh models listSimple local agent/tool turn:
./scripts/openclaw-agent-smoke.shEquivalent direct command:
./scripts/openclaw-test-cli.sh agent \
--agent deal-finder-test \
--thinking low \
--message "Use deal_watch_list and tell me how many watches exist and whether any are enabled. Keep it to one short paragraph."If you want to point the harness at your real OpenClaw state dir instead of the repo-local isolated test state:
OPENCLAW_TEST_STATE_DIR="$HOME/.openclaw" ./scripts/openclaw-test-cli.sh ...Development
npm run build
npm test
npm run audit:prod
npm run audit:full
npm run release:verifyIf test execution ever hangs or exits oddly on your machine, run:
npm run test:diagnoseThat command prints the active node resolution and then runs Vitest with the hanging-process reporter under a real-Node-first PATH. This matters on systems where node is aliased or symlinked to Bun.
npm run release:verify builds a real tarball, installs it into a fresh temporary OpenClaw state using the local openclaw/ source checkout, and lists plugins to confirm the package installs cleanly as an archive.
npm run audit:prod checks the published runtime dependency tree only. npm run audit:full includes dev dependencies as well, which is useful for tracking issues inherited from the local OpenClaw test harness and other development-only tooling.
License
MIT
