Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
npx agentmods add commands/freshworks-developers/fw-dev-tools/fw-setup-upgradegit clone --depth 1 https://github.com/freshworks-developers/fw-dev-toolsWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/commands/freshworks-developers/fw-dev-tools/fw-setup-upgrade)<a href="https://agentmods.dev/commands/freshworks-developers/fw-dev-tools/fw-setup-upgrade"><img src="https://agentmods.dev/badge/commands/freshworks-developers/fw-dev-tools/fw-setup-upgrade.svg" alt="Measured on agentmods" height="20"></a>What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5 | $0.00033 | $0.01815 |
| Opus 5 | $0.00016 | $0.00907 |
| Sonnet 5 | $0.00007 | $0.00363 |
| Haiku 4.5 | $0.00003 | $0.00181 |
Grade C, and why
fw-setup-upgrade scanned grade C with 2 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 4d ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Recursive force deletehighDestructive command
rm -rf with a variable or a broad path is one typo away from removing the wrong tree.
rm -rf ~/.fdk Makes network callslowCapability
Not a fault in itself. Listed so you know the mod talks to something, and to what.
HTTP=$(curl -sS -o /dev/null -w "%{http_code}" -L -I "$FDK_URL" || echo "000") How it starts
The opening of the file, as written. The whole thing — 134 lines — stays where its author put it; the contents beside it link to each section on GitHub.
FDK setup — upgrade (/fw-setup-upgrade)
Matches /fw-setup upgrade with optional --to X.Y.Z.
Behaviour
| User intent | Action |
|---|---|
/fw-setup-upgrade or “upgrade fdk” (no version) |
Install latest FDK 10.x line from https://cdn.freshdev.io/fdk/latest-v24.tgz on Node 24.11.x. |
/fw-setup-upgrade --to 10.1.0 or “upgrade fdk to 10.1.0” |
Install exact semver from https://cdn.freshdev.io/fdk/v10.1.0.tgz (same pattern for other 10.x.y). |
--to 9.x.y |
Deprecated: FDK 9.x on Node 18 only; show May 31, 2026 + publishing warning before proceeding. |
Before building the Task prompt: read the user’s target from --to or phrases like “to 10.1.0”. Substitute FDK_TARGET in the shell block below:
- empty /
latest→FDK_TARGET=latest(uselatest-v24.tgz, Node 24.11) 10.x.y→FDK_TARGET=10.x.y(usev10.x.y.tgz, Node 24.11)9.x.y→FDK_TARGET=9.x.y(usev9.x.y.tgz, Node 18; deprecation flow)
Normalize: strip a leading v from semver (v10.1.0 → 10.1.0).
CDN rule (verified pattern): https://cdn.freshdev.io/fdk/v<SEMVER>.tgz for pinned versions; latest-v24.tgz for “latest 10.x line” on Node 24.
Agent pre-step
Replace __FDK_TARGET__ in the Task prompt with one of:
latest— user asked only “upgrade” / no--to(uselatest-v24.tgz+ Node 24.11).10.1.0— user passed--to 10.1.0or “to 10.1.0” (strip leadingvif present; usehttps://cdn.freshdev.io/fdk/v10.1.0.tgz+ Node 24.11).9.6.0— only if user explicitly asked for a 9.x target (deprecated path + Node 18).
Execution
Task({
subagent_type: "shell",
model: "fast",
description: "Upgrade FDK (optional --to semver)",
prompt: `
Upgrade FDK. User target is __FDK_TARGET__ (replace this token before running).
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"
CURRENT_FDK=$(fdk version 2>&1 || echo "not installed")
CURRENT_NODE=$(node --version 2>&1 || echo "not installed")
echo "Before: FDK=$CURRENT_FDK Node=$CURRENT_NODE"
TARGET="__FDK_TARGET__"
if [[ "$TARGET" == latest ]]; then
FDK_URL="https://cdn.freshdev.io/fdk/latest-v24.tgz"
nvm install 24.11 2>/dev/null || true
nvm use 24.11
nvm alias default 24.11
elif [[ "$TARGET" =~ ^9\\. ]]; then
echo "DEPRECATED: FDK 9.x ends May 31, 2026; publishing requires FDK 10.x + Node 24."
read -p "Continue install of FDK $TARGET on Node 18? (y/N): " ok
[[ "$ok" == [yY]* ]] || exit 1
FDK_URL="https://cdn.freshdev.io/fdk/v${TARGET}.tgz"
nvm install 18 2>/dev/null || true
nvm use 18
nvm alias default 18
else
FDK_URL="https://cdn.freshdev.io/fdk/v${TARGET}.tgz"
nvm install 24.11 2>/dev/null || true
nvm use 24.11
nvm alias default 24.11
fi
HTTP=$(curl -sS -o /dev/null -w "%{http_code}" -L -I "$FDK_URL" || echo "000")
[[ "$HTTP" == "200" ]] || { echo "FAILED: tarball not reachable (HTTP $HTTP): $FDK_URL"; exit 1; }
# Remove FDK from current Node
npm uninstall -g @freshworks/fdk 2>/dev/null || true
npm uninstall -g fdk 2>/dev/null || true
rm -rf ~/.fdk
npm cache clean --force
# If upgrading to FDK 10.x, remove FDK 9.x from Node 18 (exclusive operation)
if [[ "$TARGET" == latest ]] || [[ "$TARGET" =~ ^10\\. ]]; then
if nvm list | grep -q "v18"; then
nvm use 18 2>/dev/null || nvm use 18.20 2>/dev/null || true
# Only remove if FDK is actually installed on Node 18
if command -v fdk &> /dev/null && fdk version &> /dev/null; then
echo "Removing FDK 9.x from Node 18 (exclusive upgrade to FDK 10.x)..."
npm uninstall -g @freshworks/fdk 2>/dev/null || true
npm uninstall -g fdk 2>/dev/null || true
fi
nvm use 24.11
fi
fi
# If upgrading to FDK 9.x, remove FDK 10.x from Node 24 (exclusive downgrade)
if [[ "$TARGET" =~ ^9\\. ]]; then
if nvm list | grep -q "v24"; then
nvm use 24 2>/dev/null || nvm use 24.11 2>/dev/null || true
# Only remove if FDK is actually installed on Node 24
if command -v fdk &> /dev/null && fdk version &> /dev/null; then
echo "Removing FDK 10.x from Node 24 (exclusive downgrade to FDK 9.x)..."
npm uninstall -g @freshworks/fdk 2>/dev/null || true
npm uninstall -g fdk 2>/dev/null || true
fi
nvm use 18
fi
fi
npm install -g "$FDK_URL" || exit 1
fdk version
node --version
zsh -c 'export NVM_DIR="$HOME/.nvm"; [ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"; fdk version' || bash -c 'export NVM_DIR="$HOME/.nvm"; [ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"; fdk version'
if [[ "$TARGET" == latest ]] || [[ "$TARGET" =~ ^10\\. ]]; then
fdk version | grep -E '^10\\.' || echo "FAILED: expected FDK 10.x"
elif [[ "$TARGET" =~ ^9\\. ]]; then
fdk version | grep -E '^9\\.' || echo "FAILED: expected FDK 9.x"
fi
echo "REPORT: upgraded using $FDK_URL"
SLASH_COMMAND_CLOSEOUT: Return after verification. No fdk run/tunnel in this Task.
`
})
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 4d ago First seen · 134 lines · 33 tokens per session scan C c94817d740eb
fw-setup-upgrade is a command published in the GitHub repository freshworks-developers/fw-dev-tools (5 stars, last pushed yesterday), licensed MIT. It adds 33 tokens to every session and 1,815 once invoked, about $0.0002 per session on Opus 5. A static security scan graded it C with 2 findings (recursive force delete, makes network calls). No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-31.
Other commands, from other repositories
business-feature-map
Generate or refresh the business feature inventory.
master-test-plan
Generate or refresh the risk-ranked master test plan.
bottleneck-detect
Analyze performance bottlenecks in swarm operations and suggest optimizations.
swarm-init
Initialize a Ruflo swarm with specified topology and configuration.
post-task
Execute post-task cleanup, performance analysis, and memory storage.
auto-topology
Automatically select the optimal swarm topology based on task complexity analysis.