From 560da32dad66aa182e0399aa1fadc8b1a022b355 Mon Sep 17 00:00:00 2001 From: Anthony Ettinger Date: Sun, 6 Sep 2026 12:08:23 +0000 Subject: [PATCH] feat(tools): /install crawlproof installs CrawlProof `/install crawlproof` printed "unknown engine or tool". The command existed on a box only as part of the `cli-tools` set, so getting it meant knowing that it travels with seven other commands, which is not something the pit should expect anyone to know. It is its own entry because `/install crawlproof` should install CrawlProof. Reachable two ways on purpose: the `cli-tools` set symlinks a wrapper of the same name, and this installs the package that wrapper vendors. Having both is safe, because the wrapper hands over to a `crawlproof` on PATH that is not its own and refuses to follow one that is, which would be an exec loop. An ordinary global npm package, so `npm install -g` is idempotent and the install is also the upgrade, the same as bo and railway. No upgrade key. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01HvWJ4336pxTFRdRbvsTQeD --- README.md | 38 ++++++++++++++++++++++++++++++++++++++ src/tools.mjs | 17 +++++++++++++++++ 2 files changed, 55 insertions(+) diff --git a/README.md b/README.md index 56e328f7..00c20964 100644 --- a/README.md +++ b/README.md @@ -723,6 +723,44 @@ login`. Publishing needs one, and `bo login` is a device-code exchange, so a terminal never handles a browser session. `bo mcp config` prints the MCP registration for a coding agent, which is the same graph over a different door. +### CrawlProof — what the fleet costs and what it returns + +[CrawlProof](https://crawlproof.com) knows who arrived on your sites and what +your ads delivered. `crawlproof` joins that to what the bank actually did, so +the terminal can answer the question a dashboard usually cannot: is any of this +paying for itself. + +```sh +moshcode install crawlproof # npm i -g @profullstack/crawlproof + +moshcode crawlproof # the live dashboard, last day, humans +moshcode crawlproof dashboard --range=1m +moshcode crawlproof stats site.com +moshcode crawlproof dashboard --json | jq .roi.derived +``` + +Five screens: ROI, Traffic, Ads, Money, Spend. Two rules run through the +arithmetic and both exist because breaking either produces a nicer number that +is false. Where an account advertises on its own slots, ad spend and ad earnings +are one dollar moving between two pockets, so they are reported under *Internal* +and counted as neither cost nor revenue. And a bank feed carries groceries next +to servers, so cost is the business scope only. + +It also says what it does not know, next to the number: a site that did not +answer is missing rather than zero, and a fleet whose visits run far above its +pageviews says so and offers the per-pageview figure instead. + +Needs a CrawlProof API token in `CRAWLPROOF_TOKEN` or the `token` field of +`~/.crawlproof.json`. The money screens want a CoinPay merchant session as well; +without one the other four still work and the money panels say what is missing. +The dashboard is a TUI and wants Node 22.6+, while `stats` and `--json` run +anywhere. + +`crawlproof` also ships in the `cli-tools` set, which symlinks a wrapper of the +same name that vendors this package. Installing both is fine: the wrapper hands +over to a `crawlproof` on PATH that is not its own, and refuses to follow one +that is. + ### Cloud + infra CLIs ```sh diff --git a/src/tools.mjs b/src/tools.mjs index 58d77efb..28ed70fe 100644 --- a/src/tools.mjs +++ b/src/tools.mjs @@ -88,6 +88,23 @@ export const TOOLS = { // where those words mean something else entirely. aliases: { cmd: "cli-tools", args: ["aliases", "--json"] }, }, + crawlproof: { + desc: "CrawlProof \u2014 what the fleet costs and what it returns: traffic, ad delivery and the bank behind it", + bin: "crawlproof", + // Reachable two ways on purpose. The `cli-tools` set above symlinks a + // wrapper of the same name, and this entry installs the package that + // wrapper vendors. Having both is safe: the wrapper hands over to a + // `crawlproof` on PATH that is not its own, and refuses to follow one that + // is, which would be an exec loop. It is its own entry because + // `/install crawlproof` should install CrawlProof rather than seven other + // commands that happen to travel with it. + // + // The dashboard is a TUI and wants Node 22.6+; `crawlproof stats` and + // `--json` run anywhere. An ordinary global npm package, and + // `npm install -g` is idempotent, so the install is also the upgrade \u2014 + // no `upgrade` key, the same as bo and railway. + install: { cmd: "npm", args: ["install", "-g", "@profullstack/crawlproof"] }, + }, timer: { desc: "Profullstack timer - track time against projects, for people and for agents", bin: "timer",