tor-to-proposal 2.1.5 → 2.1.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/bin/bid-pack.mjs CHANGED
@@ -240,6 +240,21 @@ function start() {
240
240
  const torAbs = path.resolve(String(args.tor));
241
241
  if (!fs.existsSync(torAbs)) fail(`--tor not found: ${torAbs}`, 2);
242
242
 
243
+ process.stdout.write(
244
+ `# Inputs checklist — what this bid needs from you\n\n` +
245
+ `HAVE NOW (verified before anything runs):\n` +
246
+ ` [x] ToR document — ${path.basename(torAbs)}\n` +
247
+ ` ${args.cv ? `[x] Master CV — ${path.basename(String(args.cv))}` : `[ ] Master CV — NOT provided (add --cv <file>; the tailored CV and CV gap report will be skipped without it)`}\n\n` +
248
+ `PRODUCED BY THE TOOL (automatic): bid screen, compliance matrix, CV gap report,\n` +
249
+ ` tailored CV, pricing, financial proposal, final PDFs + zip.\n\n` +
250
+ `PRODUCED BY YOU + YOUR AI ASSISTANT (the tool drafts nothing in your name, then\n` +
251
+ ` verifies every line — this is the honesty rule):\n` +
252
+ ` [ ] Cover letter (template: assets/templates.md) — needed before pack\n` +
253
+ ` [ ] Technical proposal (one section per scored criterion/deliverable) — needed before pack\n` +
254
+ ` [ ] Your answers to the bid questions — via: bid-pack ask --dir ${dir}\n\n` +
255
+ `You will see this exact checklist again at pack time; nothing can be packaged while a box is open.\n\n`
256
+ );
257
+
243
258
  // 0. ToR -> page-tagged text
244
259
  run('pdf-extract.mjs', [torAbs, '--out', path.join(outDir, 'tor.txt'), '--signals', path.join(outDir, 'tor-signals.json')], { fatal: true, label: 'pdf-extract (ToR)' });
245
260
  state.steps.torExtract = { status: 'done' };
@@ -395,15 +410,19 @@ function apply() {
395
410
  const stillYours = fresh.items.filter((i) => i.type !== 'client');
396
411
  const stillClient = fresh.items.filter((i) => i.type === 'client');
397
412
  const state = readState();
413
+ state.rounds = (state.rounds || 0) + 1;
414
+ const round = state.rounds;
398
415
  state.steps.questions = { status: 'done', open: fresh.openCount };
399
416
  state.steps.pricing = { status: inDir('pricing.json') ? 'done' : 'awaiting-user-numbers' };
400
417
  writeState(state);
401
418
  renderPreviews();
402
419
 
403
420
  process.stdout.write(
404
- `# Apply: ${applied} answer(s) recorded, ${fresh.openCount} still open\n\n` +
421
+ `# Apply (round ${round}): ${applied} answer(s) recorded, ${fresh.openCount} still open\n\n` +
405
422
  (stillYours.length
406
- ? `## Still open — answer these (bid-pack ask)\n${mdTable(['#', 'Question'], stillYours.map((i, ix) => [ix + 1, `**${i.id}** — ${i.question}`]))}\nNEXT STEP: run npx tor-to-proposal bid-pack ask --dir ${dir} — it asks each of these in plain language, one at a time.\n`
423
+ ? `## Still open — answer these (bid-pack ask)\n${mdTable(['#', 'Question'], stillYours.map((i, ix) => [ix + 1, `**${i.id}** — ${i.question}`]))}\n` +
424
+ `THIS IS NORMAL AND CONVERGES: answering one round can reveal new questions when a document is filled or rendered for the first time (your pricing answer just created the financial proposal, whose gaps are now questions). Each round has fewer questions than the last — keep going until zero.\n` +
425
+ `NEXT STEP: run npx tor-to-proposal bid-pack ask --dir ${dir} — it asks each of these in plain language, one at a time.\n`
407
426
  : `NEXT STEP: run npx tor-to-proposal bid-pack pack --dir ${dir} --fallback-pdf to build the submission pack.\n`) +
408
427
  (stillClient.length
409
428
  ? `## Reminders — ACTIONS for you, not answers\n(These describe things to DO outside the tool: contact the client, verify a fact. They never close by typing an answer here.)\n${mdTable(['#', 'Action'], stillClient.map((i, ix) => [ix + 1, `**${i.id}** — ${i.question}`]))}\n`
@@ -44,6 +44,16 @@ Gather these into one folder on your computer (e.g. `Documents/bids/UNDP-2026-04
44
44
  | 3 | Your **money numbers** | Your minimum acceptable yearly income, your monthly costs (for pricing) |
45
45
  | 4 | Your **calendar** | So you can honestly answer "can I start when they need me?" |
46
46
 
47
+ **Who produces what — important:** the tool prepares, verifies, and packages. It deliberately does not write two documents for you:
48
+
49
+ | Document | Who produces it |
50
+ | --- | --- |
51
+ | Bid screen, CV gap report, tailored CV, financial proposal, pricing | **The tool** — fully automatic |
52
+ | **Cover letter** and **technical proposal** | **You + your AI assistant** draft them (the tool gives you the template in `assets/templates.md`, the ToR extract, and your tailored CV; the tool then lints and audits every line) |
53
+ | Answers to the bid questions (price, dates, facts) | **You** — via the `bid-pack ask` wizard |
54
+
55
+ A submission can never be packaged while anything is missing — the `pack` gate will list exactly what is absent.
56
+
47
57
  ---
48
58
 
49
59
  ## 3. How you use it (one conversation)
package/mcp/server.mjs CHANGED
@@ -322,7 +322,7 @@ function handle(msg) {
322
322
  return {
323
323
  protocolVersion: typeof params?.protocolVersion === 'string' ? params.protocolVersion : '2024-11-05',
324
324
  capabilities: { tools: {} },
325
- serverInfo: { name: 'tor-to-proposal', version: '2.1.5' },
325
+ serverInfo: { name: 'tor-to-proposal', version: '2.1.7' },
326
326
  };
327
327
  }
328
328
  if (typeof method === 'string' && method.startsWith('notifications/')) return undefined;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tor-to-proposal",
3
- "version": "2.1.5",
3
+ "version": "2.1.7",
4
4
  "description": "The bid tool that refuses to lie. ToR + CV in -> verified bid pack out: cover letter, tailored CV, technical response, financial proposal, submission checklist. Deterministic CLI + agent skill for UN / NGO / government consultants.",
5
5
  "type": "module",
6
6
  "bin": {