content_round1.js
// Round 1 — Draft. One batch, 15 requests (custom_id = slug), prompt = the brief.
// Writes round1/<slug>.md. STOPS for user review before round 2.
//
// node content_round1.js [--slug <slug>] [--limit N]
const fs = require("fs");
const path = require("path");
const { parseBriefs } = require("./lib/briefs");
const { probeModel, runRound, WEB_SEARCH } = require("./lib/batch");
const P = require("./lib/prompts");
const { cleanArticle } = require("./lib/clean");
const OUT = path.join(__dirname, "round1");
function arg(name) {
const i = process.argv.indexOf(`--${name}`);
return i >= 0 ? process.argv[i + 1] : null;
}
async function main() {
fs.mkdirSync(OUT, { recursive: true });
const { standingRules, briefs } = parseBriefs();
let items = briefs;
if (arg("slug")) items = briefs.filter((b) => b.slug === arg("slug"));
else if (arg("limit")) items = briefs.slice(0, Number(arg("limit")));
const model = await probeModel();
console.log(`Round 1: drafting ${items.length} post(s) with ${model} (web search enabled)`);
const sys1 = P.round1System(standingRules);
const results = await runRound(model, items, (brief) => ({
system: sys1,
userContent: P.round1User(brief),
max_tokens: 16000,
tools: [WEB_SEARCH],
}));
let ok = 0;
for (const b of items) {
const r = results.get(b.slug);
if (r && r.ok) {
const article = cleanArticle(r.text);
fs.writeFileSync(path.join(OUT, `${b.slug}.md`), article);
console.log(` ✓ ${b.slug} (${r.model}, ${article.split(/\s+/).length}w)`);
ok++;
} else {
console.warn(` ✗ ${b.slug} — ${r ? r.error || r.stop_reason : "no result"}`);
}
}
console.log(`\nRound 1 done: ${ok}/${items.length} written to round1/. Review, then run content_round2.js.`);
}
main().catch((e) => {
console.error("FATAL:", e.stack || e);
process.exit(1);
});