用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/clowlove/Hermes-House --skill cf-b2b-website命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
基于 SOC 职业分类
正在显示 SKILL.md
| name | cf-b2b-website |
| description | Cloudflare Workers + D1 e-commerce site for Shengtuo Tractor. Deploy, DB ops, SEO, product sync. |
| triggers | ["cf-b2b-website","shengtuo tractor website","wrangler deploy","D1 database","sitemap.xml"] |
| Item | Value |
|---|---|
| Worker | cf-b2b-website |
| D1 DB | b2b_database (remote) |
| KV | b2b_kv (contact form) |
| Deploy token | cfut_ZENfTsTx1akFdl... |
| URL | https://cf-b2b-website.sdtractor.workers.dev |
| Src | /home/ubuntu/cf_b2b/ |
cd /home/ubuntu/cf_b2b && CLOUDFLARE_API_TOKEN="cfut_..." npx wrangler deploy
npx wrangler deploy --force
⚠️ Pitfall:
wrangler deploycan exit 0 with NO visible output even on syntax errors. Always check output containsUploadedandDeployedlines. If output is empty, check for JS syntax errors (e.g., duplicateconstdeclarations) before retrying.
npx wrangler d1 execute b2b_database --file=/tmp/sql.sql --remote
⚠️ Pitfall: D1 does NOT support
BEGIN;...COMMIT;in file mode. Execute statements individually — eachUPDATE/SETon its own line. No transactions.
npx wrangler d1 execute b2b_database --command="SELECT id, name FROM products LIMIT 5;" --remote
Site is Error 1016 (partially down) but browser still loads content — product images remain valid at shengtuo-tractor.com/uploadfile/ URLs.
[...document.querySelectorAll('ul.products_list li')].map(li => {
const a = li.querySelector('a[href$=".html"]');
const img = li.querySelector('img');
return a ? { name: a.title, href: a.href, img: img ? img.src : null } : null;
}).filter(Boolean)
Extract ST\d+[A-Z]* pattern from name to map site products → DB products by ID.
UPDATE products SET image_url = 'https://www.shengtuo-tractor.com/uploadfile/FILE.jpg' WHERE id = N;
-- One statement per line, no BEGIN/COMMIT
⚠️ NEVER use
sedon.jsfiles — corrupts template literal backtick nesting (\`` → raw ````). ⚠️ NEVER useecho heredocto write.jsfiles — same backtick corruption risk.
Always use patch() or write_file() only.
Common error this causes: inline <script> tags inside template literals get mangled, producing "has already been declared" or "unexpected token" build errors.
Organized in src/pages/layout.js:
createLayout uses isHome = (title === 'Home') to set special SEO title. When passing site_name (e.g. 'China Shengtuo Farm Tractor Manufacturer') instead of 'Home', pageTitlePrefix won't trigger and canonical breaks.
Always do this for homepage:
const homeTitle = 'China Shengtuo Farm Tractor Manufacturer | 25HP-260HP Agricultural Tractors & Farm Equipment';
const html = createLayout('Home', content, scripts, desc, false);
const finalHtml = html.replace('<title>Shengtuo Tractor</title>', `<title>${homeTitle}</title>`);
return new Response(finalHtml, { ... });
const isHome = title === 'Home';
const canonicalPath = isHome ? '/' : '/' + title.toLowerCase().replace(/\s+/g,'-').replace(/[^a-z0-9-/]/g,'');
Both generated by src/pages/sitemap.js:
/sitemap.xml — 42 product URLs + 4 static pages/robots.txt — allows all except /api/ and /admin/Products should show Tractors first, then Equipment. Both of these need the same SQL ORDER BY CASE pattern:
src/pages/products.js — server-rendered pagesrc/api/handlers/products.js — API endpointSQL pattern:
ORDER BY CASE WHEN category = 'SHENGTUO TRACTOR' THEN 1
WHEN category = 'SHENGTUO FARM EQUIPMENT' THEN 2
ELSE 3 END, name
⚠️ Pitfall: Even if products.js is fixed, if the API returns wrong order, pages that rely on API data will show wrong order. Fix BOTH files.
Build from DB fields dynamically:
const hp = product.hp_range || '';
const spec = product.key_spec || '';
metaKeywords = `${product.name}, Shengtuo ${category}, farm equipment, ${hp} tractor, agricultural machinery China, ${spec}`;
router.js).js files