tor-to-proposal 2.1.6 → 2.2.2

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/README.md CHANGED
@@ -21,7 +21,40 @@ dates, names or client facts. In a domain where one invented fact means
21
21
  disqualification (and vendor blacklisting), that is the feature, not a
22
22
  limitation.
23
23
 
24
- ## Install — one command, once
24
+ ## Choose your door
25
+
26
+ ### Door 1 — "I use Claude / ChatGPT / Gemini" (for consultants, not coders)
27
+
28
+ You never learn the CLI. You talk to your AI; the AI runs the machinery; you
29
+ answer plain questions and paste one brief into the chat per document. One-time
30
+ setup (about five minutes, a couple of copy-paste commands):
31
+
32
+ **Claude Code users:**
33
+ ```bash
34
+ npx skills add ahaomar/tor-to-proposal
35
+ ```
36
+
37
+ **Claude Desktop / other MCP apps** — add the MCP server (see the
38
+ [Technical Guide](docs/TECHNICAL-GUIDE.md) for per-app JSON/config):
39
+ ```bash
40
+ claude mcp add tor-to-proposal -- npx -y tor-to-proposal mcp-server
41
+ ```
42
+
43
+ **Any AI chat (no setup at all):** run `npx tor-to-proposal bid-pack start
44
+ --tor tor.pdf --cv cv.pdf --dir mybid/` once with help from the
45
+ [User Guide](docs/USER-GUIDE.md), then copy `out/brief-cover-letter.md` and
46
+ `out/brief-technical-proposal.md` — complete, ready-to-paste prompts — into
47
+ Claude/ChatGPT/Gemini, save the replies into the bid folder, and let the tool
48
+ audit the result. The AI writes; the tool refuses to let it lie.
49
+
50
+ Then, in your AI, just say: *"Run a bid pack on this folder"* and answer the
51
+ questions it asks you — one at a time, in plain language.
52
+
53
+ **Never sure what to type?** The full copy-paste conversation script — every
54
+ sentence to say at every stage of a bid — is in
55
+ [docs/CONVERSATION-SCRIPT.md](docs/CONVERSATION-SCRIPT.md).
56
+
57
+ ### Door 2 — "I live in the terminal" (for technical users)
25
58
 
26
59
  ```bash
27
60
  npx tor-to-proposal init
@@ -30,12 +63,9 @@ npx tor-to-proposal init
30
63
  That sets up your consultant profile (name, credentials, rates, master CV) at
31
64
  `.tor-to-proposal/profile.json` in the **current folder** (the legacy
32
65
  `~/.tor-to-proposal/profile.json` is still read if no local profile exists).
33
- Then use it with any AI assistant (Claude
34
- Desktop / Claude Code / Codex / ChatGPT) via the MCP server at
35
- `mcp/server.mjs`, or install the agent skill:
36
66
 
37
67
  ```bash
38
- npx skills add ahaomar/tor-to-proposal # agent users
68
+ npx skills add ahaomar/tor-to-proposal # install as an agent skill
39
69
  ```
40
70
 
41
71
  Local-first: no network calls carry your documents. The only optional outbound
package/SKILL.md CHANGED
@@ -101,6 +101,15 @@ Repeat until `0 still open`.
101
101
 
102
102
  ### Phase 3 — Draft all four documents (you draft, tools gate)
103
103
 
104
+ **Non-technical users:** the tool writes ready-to-paste AI briefs at
105
+ `out/brief-cover-letter.md` and `out/brief-technical-proposal.md` after
106
+ `start` and `apply` — each is a self-contained prompt (ToR facts with page
107
+ tags, compliance rows, verified CV evidence, structure, honesty rules). The
108
+ user pastes one into any AI chat, saves the reply as `cover-letter.md` /
109
+ `technical-proposal.md` in `<bid-dir>/`, and the tool audits it. The brief is
110
+ the canonical drafting path for laymen; the manual route below is for agents
111
+ drafting directly.
112
+
104
113
  Write drafts to `<bid-dir>/` as `cover-letter.md`, `technical-proposal.md`
105
114
  (`cv-tailored.md` already exists from Phase 1; edit it only with master-CV
106
115
  material or user evidence answers).
package/bin/bid-pack.mjs CHANGED
@@ -202,6 +202,115 @@ function renderPreviews() {
202
202
  }
203
203
  }
204
204
 
205
+ // ---------------- AI briefs ----------------
206
+ // The tool never drafts the cover letter or technical proposal (honesty rule:
207
+ // prose about the user's career must come from the user or their assistant).
208
+ // These briefs make that step concrete: a self-contained prompt the user
209
+ // pastes into ANY AI, containing the ToR facts, requirements, verified CV
210
+ // evidence, the required structure, and the honesty rules. The tool audits
211
+ // the result afterward either way.
212
+ function writeBriefs() {
213
+ const extractPath = inDir('tor-extract.json');
214
+ if (!extractPath) return;
215
+ const extract = JSON.parse(fs.readFileSync(extractPath, 'utf8'));
216
+ const profile = loadProfile();
217
+ const context = writeContext();
218
+ const id = profile?.identity || {};
219
+ const consultant = `${id.name || '[YOUR NAME]'}${id.credentials ? `, ${id.credentials}` : ''}`;
220
+ const v = (x) => (x && x.value ? `${x.value}${x.page ? ` (p.${x.page})` : ''}` : 'not stated in the ToR text');
221
+ const tailoredPath = inDir('cv-tailored.md');
222
+ const tailored = tailoredPath ? fs.readFileSync(tailoredPath, 'utf8') : '';
223
+ const matrixPath = inDir('compliance-matrix.md');
224
+ const matrix = matrixPath ? fs.readFileSync(matrixPath, 'utf8').split('\n').filter((l) => l.trim().startsWith('|') && !/^\|\s*[-:\s|]+\|/.test(l) && !/requirement/i.test(l.split('|')[1] ?? '')).join('\n') : '';
225
+ const deliverables = (extract.deliverables || []).map((d, i) => `${i + 1}. ${d.value || JSON.stringify(d)}${d.page ? ` (p.${d.page})` : ''}`).join('\n') || '(see compliance matrix below)';
226
+
227
+ const shared = `# RULES the drafted document MUST obey (the tool audits every line afterward)
228
+ 1. NO superlatives — never write: leading, world-class, renowned, premier, cutting-edge, state-of-the-art, best-in-class, unparalleled, top-tier, foremost, "exceptional expertise", "vast experience". Show evidence instead.
229
+ 2. Every fact about the assignment needs a page tag like (p.2). Every fact about the consultant's experience must come ONLY from the VERIFIED EVIDENCE section below — if it is not there, do not write it.
230
+ 3. If a required fact is missing, write [FILL: what is missing] instead of inventing it.
231
+ 4. Use the client's own vocabulary and terms exactly as they appear in the ToR.
232
+ 5. Output ONLY the finished document in markdown. No commentary, no explanation.
233
+ `;
234
+
235
+ // ---- cover letter brief ----
236
+ const cl = `# AI BRIEF — Cover Letter (copy this ENTIRE file into Claude, ChatGPT, Gemini, or any AI)
237
+
238
+ You are drafting a one-page cover letter for a consultant bidding on the assignment below.
239
+ Consultant: ${consultant}${id.email ? ` | ${id.email}` : ''}${id.phone ? ` | ${id.phone}` : ''}${id.location ? ` | ${id.location}` : ''}
240
+
241
+ # ASSIGNMENT FACTS (from the ToR — cite these page tags as given)
242
+ - Title: ${v(extract.title)}
243
+ - Reference: ${v(extract.referenceNumber)}
244
+ - Client: ${v(extract.client)}
245
+ - Duration: ${v(extract.duration)}
246
+ - Duty station: ${v(extract.dutyStation)}
247
+ - Submission deadline: ${v(extract.deadline)}${!extract.deadline ? ' — the letter should say the deadline will be confirmed with the client' : ''}
248
+ - Deliverables and dates:
249
+ ${deliverables}
250
+
251
+ # REQUIREMENTS TO ADDRESS (verbatim from the compliance matrix)
252
+ ${matrix || '(run bid-pack start first to generate the compliance matrix)'}
253
+
254
+ # VERIFIED EVIDENCE (the consultant's master CV, already tailored to this ToR — the ONLY experience facts you may use)
255
+ ${tailored ? tailored.slice(0, 6000) : '(no CV provided — ask the user for their master CV; do not invent experience)'}
256
+
257
+ # DECLARED FACTS (the consultant confirmed these; use them verbatim)
258
+ - Availability: ${context.availabilityDate || '[FILL: ask the consultant]'}
259
+ - Proposal validity: ${context.validity || '[FILL: e.g. 90 days from submission]'}
260
+ - Tax treatment: ${context.taxes || '[FILL: ask the consultant]'}
261
+ - Reimbursables: ${context.reimbursables || '[FILL: ask the consultant]'}
262
+
263
+ ${shared}
264
+ # REQUIRED STRUCTURE
265
+ Dear [client committee],
266
+ RE: [exact assignment title] — Reference: [exact ref] (p.X)
267
+ [1 short paragraph: understanding of the assignment, facts only, page-tagged]
268
+ [3–4 short blocks, each: a verbatim requirement (p.X) + matching evidence from VERIFIED EVIDENCE]
269
+ [Compliance paragraph: validity, GCC acceptance, tax, reimbursables]
270
+ [Availability + contact line]
271
+ Sincerely,
272
+ ${consultant}
273
+ Keep it under 550 words.
274
+ `;
275
+
276
+ // ---- technical proposal brief ----
277
+ const tp = `# AI BRIEF — Technical Proposal (copy this ENTIRE file into Claude, ChatGPT, Gemini, or any AI)
278
+
279
+ You are drafting a technical proposal for the same consultant and assignment as the cover letter brief.
280
+ Consultant: ${consultant}
281
+
282
+ # ASSIGNMENT FACTS (from the ToR — cite these page tags as given)
283
+ - Title: ${v(extract.title)}
284
+ - Reference: ${v(extract.referenceNumber)}
285
+ - Duration: ${v(extract.duration)}
286
+ - Deliverables and dates:
287
+ ${deliverables}
288
+
289
+ # REQUIREMENTS (verbatim from the compliance matrix — cover EVERY row)
290
+ ${matrix || '(run bid-pack start first to generate the compliance matrix)'}
291
+
292
+ # VERIFIED EVIDENCE (master CV — the ONLY experience facts you may use)
293
+ ${tailored ? tailored.slice(0, 6000) : '(no CV provided — ask the user for their master CV; do not invent experience)'}
294
+
295
+ # DECLARED FACTS
296
+ - Availability: ${context.availabilityDate || '[FILL: ask the consultant]'}
297
+ - Validity: ${context.validity || '[FILL]'}
298
+ - Tax: ${context.taxes || '[FILL]'}; Reimbursables: ${context.reimbursables || '[FILL]'}
299
+
300
+ ${shared}
301
+ # REQUIRED STRUCTURE
302
+ # Technical Response — [assignment title] ([reference])
303
+ One section PER DELIVERABLE above (keep the client's own numbering, titles, and dates).
304
+ Each section: Approach (what will be done and why it fits the ToR) -> Steps (numbered) ->
305
+ Quality control (how correctness is checked) -> Relevant experience (ONLY from VERIFIED EVIDENCE).
306
+ End with a short Payment terms section referencing the ToR payment schedule (p.X).
307
+ `;
308
+
309
+ writeOut(path.join(outDir, 'brief-cover-letter.md'), cl);
310
+ writeOut(path.join(outDir, 'brief-technical-proposal.md'), tp);
311
+ process.stderr.write(`AI briefs written: out/brief-cover-letter.md, out/brief-technical-proposal.md — paste one into any AI chat, save the reply as cover-letter.md / technical-proposal.md in ${dir}\n`);
312
+ }
313
+
205
314
  // ---------------- context ----------------
206
315
  function writeContext() {
207
316
  const extractPath = inDir('tor-extract.json');
@@ -240,6 +349,21 @@ function start() {
240
349
  const torAbs = path.resolve(String(args.tor));
241
350
  if (!fs.existsSync(torAbs)) fail(`--tor not found: ${torAbs}`, 2);
242
351
 
352
+ process.stdout.write(
353
+ `# Inputs checklist — what this bid needs from you\n\n` +
354
+ `HAVE NOW (verified before anything runs):\n` +
355
+ ` [x] ToR document — ${path.basename(torAbs)}\n` +
356
+ ` ${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` +
357
+ `PRODUCED BY THE TOOL (automatic): bid screen, compliance matrix, CV gap report,\n` +
358
+ ` tailored CV, pricing, financial proposal, final PDFs + zip.\n\n` +
359
+ `PRODUCED BY YOU + YOUR AI ASSISTANT (the tool drafts nothing in your name, then\n` +
360
+ ` verifies every line — this is the honesty rule):\n` +
361
+ ` [ ] Cover letter — paste out/brief-cover-letter.md into any AI chat, save the reply as cover-letter.md\n` +
362
+ ` [ ] Technical proposal — paste out/brief-technical-proposal.md, save the reply as technical-proposal.md\n` +
363
+ ` [ ] Your answers to the bid questions — via: bid-pack ask --dir ${dir}\n\n` +
364
+ `You will see this exact checklist again at pack time; nothing can be packaged while a box is open.\n\n`
365
+ );
366
+
243
367
  // 0. ToR -> page-tagged text
244
368
  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
369
  state.steps.torExtract = { status: 'done' };
@@ -273,6 +397,7 @@ function start() {
273
397
  state.steps.questions = { status: 'done', open: q.openCount };
274
398
  writeState(state);
275
399
  renderPreviews();
400
+ writeBriefs();
276
401
 
277
402
  // report
278
403
  const extract = JSON.parse(fs.readFileSync(path.join(outDir, 'tor-extract.json'), 'utf8'));
@@ -401,6 +526,7 @@ function apply() {
401
526
  state.steps.pricing = { status: inDir('pricing.json') ? 'done' : 'awaiting-user-numbers' };
402
527
  writeState(state);
403
528
  renderPreviews();
529
+ writeBriefs();
404
530
 
405
531
  process.stdout.write(
406
532
  `# Apply (round ${round}): ${applied} answer(s) recorded, ${fresh.openCount} still open\n\n` +
package/bin/package.mjs CHANGED
@@ -130,7 +130,7 @@ const verifyMd = (file, key) => {
130
130
 
131
131
  for (const doc of DOCS) {
132
132
  const a = inv[doc.key];
133
- if (!a) { checks.push([doc.name, 'MISSING', '—', `produce ${doc.key}.(pdf|docx|xlsx|md) in ${dir} or ${dir}/out`]); hard++; continue; }
133
+ if (!a) { checks.push([doc.name, 'MISSING', '—', (doc.key === 'cover-letter' || doc.key === 'technical-proposal') ? `paste out/brief-${doc.key}.md into any AI chat, save the reply as ${doc.key}.md in ${dir} or ${dir}/out` : `produce ${doc.key}.(pdf|docx|xlsx|md) in ${dir} or ${dir}/out`]); hard++; continue; }
134
134
  let v;
135
135
  try {
136
136
  v = a.ext === 'pdf' ? await verifyPdf(a.path, doc.key) : a.ext === 'docx' ? await verifyDocx(a.path, doc.key) : a.ext === 'xlsx' ? await verifyXlsx(a.path, doc.key) : verifyMd(a.path, doc.key);
@@ -0,0 +1,145 @@
1
+ # The conversation script — what to say, step by step
2
+
3
+ For consultants using Door 1: you live in Claude, ChatGPT, or Gemini, and the
4
+ tool does the verification underneath. This page gives you the **exact
5
+ sentences to type** at every stage of a bid, what you should see back, and
6
+ what to do next. Replace anything in `⟨angle brackets⟩` with your own values.
7
+
8
+ If a step doesn't behave as described, jump to the [trouble table](#if-something-doesnt-work)
9
+ at the bottom.
10
+
11
+ ---
12
+
13
+ ## Step 0 — One-time setup (5 minutes, once ever)
14
+
15
+ **Claude Code** (terminal AI) — paste in Terminal:
16
+ ```bash
17
+ npx skills add ahaomar/tor-to-proposal
18
+ ```
19
+
20
+ **Claude Desktop / other MCP apps** — paste in Terminal:
21
+ ```bash
22
+ claude mcp add tor-to-proposal -- npx -y tor-to-proposal mcp-server
23
+ ```
24
+ (or add the JSON from the Prompt Guide to Claude Desktop's config file).
25
+
26
+ **Then, in your AI chat, say:**
27
+ > List the tor-to-proposal tools you have.
28
+
29
+ **You should see:** a list of around twenty tools with names like
30
+ `bid_pack_start`, `pricing_model`, `cv_tailor`.
31
+ **If not:** see [USER-GUIDE §7](USER-GUIDE.md) — or skip setup entirely and use
32
+ the zero-setup path in Step 5.
33
+
34
+ ## Step 1 — Your consultant profile (once ever)
35
+
36
+ > Set up my consultant profile. My name is ⟨Ayesha Khan, PhD⟩, email
37
+ > ⟨ayesha@example.com⟩, my minimum acceptable income is ⟨60000⟩ per year
38
+ > across about ⟨180⟩ billable days, my typical base rate is ⟨400⟩ per day in
39
+ > ⟨USD⟩, and my master CV is at ⟨/Users/me/Documents/cv-master.pdf⟩.
40
+
41
+ **You should see:** the tool saving `profile.json` (in the current folder) and
42
+ a summary. Your AI will offer these numbers for one-word confirmation on every
43
+ future bid — they are never used without your "yes".
44
+
45
+ ## Step 2 — Start a bid
46
+
47
+ Put the ToR (PDF or Word) and your master CV in one folder, then say:
48
+
49
+ > I want to bid on a new assignment. The ToR is ⟨tor.pdf⟩ and my CV is
50
+ > ⟨cv.pdf⟩, both in this folder. Run a bid pack.
51
+
52
+ **You should see:** a bid screen (title, client, deadline, duration, how you'll
53
+ be scored, red flags) and a set of open questions.
54
+
55
+ ## Step 3 — Go / no-go (your decision, always)
56
+
57
+ > Show me the bid screen and explain it in plain words. What are the red
58
+ > flags, and is anything unusual?
59
+
60
+ **You decide:** continue or stop. Nothing is drafted until you say go.
61
+
62
+ ## Step 4 — Answer the questions
63
+
64
+ > Ask me the open questions one at a time in plain language, then apply my
65
+ > answers. Never suggest a number — ask me for mine.
66
+
67
+ **You should see:** one question at a time, each with a "how to answer" hint.
68
+ Pricing runs only after you confirm numbers. Answering one round can reveal a
69
+ few more questions when a document is generated for the first time — that is
70
+ normal and converges.
71
+
72
+ *(Claude Code users can alternatively run `npx tor-to-proposal bid-pack ask --dir .`
73
+ in the Terminal — the wizard asks the same questions.)*
74
+
75
+ ## Step 5 — The drafts (briefs: paste one into any AI)
76
+
77
+ The tool never writes about your career in your name. Instead it writes a
78
+ **brief** — a complete prompt containing the ToR facts, the requirements, and
79
+ your verified CV evidence.
80
+
81
+ **With Claude Code or an MCP file-writing assistant, say:**
82
+ > Read out/brief-cover-letter.md and draft my cover letter from it. Follow the
83
+ > brief's rules exactly, save the result as cover-letter.md in the bid folder,
84
+ > then run the cover-letter lint and fix everything you can fix yourself.
85
+
86
+ > Now do the same with out/brief-technical-proposal.md → technical-proposal.md.
87
+
88
+ **Zero-setup variant (any AI chat, nothing installed):** open
89
+ `out/brief-cover-letter.md` in any text editor, copy the whole file, paste it
90
+ into Claude/ChatGPT/Gemini, save the reply as `cover-letter.md` in the bid
91
+ folder. Same for the technical brief. The tool audits whatever you save.
92
+
93
+ ## Step 6 — The verification loop
94
+
95
+ > Lint my cover letter and technical proposal. Fix every problem you can fix
96
+ > yourself, and list anything only I can supply (facts, decisions, missing
97
+ > ToR details) as plain questions.
98
+
99
+ **You should see:** PASS on both lints, or a short list of remaining items.
100
+ Repeat until the lists are empty. `[FILL]` markers mean "a real fact goes
101
+ here — yours"; the pack refuses to build while any remain.
102
+
103
+ ## Step 7 — Build the submission pack
104
+
105
+ > Run the final pack. Tell me exactly where the PDFs and the zip are, and
106
+ > whether the audit passed.
107
+
108
+ **You should see:** `PACK READY`, the audit line **PASS**, and the locations:
109
+ `pack/` (four verified documents + submission checklist + calendar file) and
110
+ `⟨ref⟩-bid-pack.zip`.
111
+
112
+ ## Step 8 — Pre-submit checklist (before you upload anything)
113
+
114
+ > What must I still confirm with the client before submitting? List anything
115
+ > not verified from the ToR: deadline, submission channel, clarifications, and
116
+ > any date conflicts (for example my availability vs their deliverable dates).
117
+
118
+ **You should see:** a short, honest list. Typical items: a deadline the ToR
119
+ text didn't state, the submission channel, and evaluation weights that don't
120
+ sum. Send these to the client BEFORE their clarification cutoff.
121
+
122
+ ## Step 9 — Submit, then record the outcome
123
+
124
+ Submit the zip through the confirmed channel, in their time zone. When the
125
+ client announces the decision:
126
+
127
+ > The result came out: ⟨won / lost⟩ at ⟨the fee⟩. Save a one-paragraph outcome
128
+ > note (assignment, ref, fee, result, what I quoted) in the bid folder so I
129
+ > keep a record of my pricing history.
130
+
131
+ ---
132
+
133
+ ## If something doesn't work
134
+
135
+ | Symptom | First thing to say to your AI |
136
+ | --- | --- |
137
+ | Tool list is empty after setup | "Reconnect the tor-to-proposal MCP server and list your tools again." (Check the Prompt Guide's config for your app.) |
138
+ | "OCR required" / scanned PDF error | "The PDF seems scanned. Tell me how to OCR it, then retry." |
139
+ | A question you can't answer | "Mark it [FILL] and move on — I'll come back to it." |
140
+ | The pack says FAIL or MISSING | "Show me the pack report and explain each failed line in plain words, with the exact next action." |
141
+ | Your AI invents a number or fact | "That has no source. Mark it [FILL] and ask me instead." |
142
+
143
+ Everything in this script maps to the commands documented in the
144
+ [Technical Guide](TECHNICAL-GUIDE.md); the plain-language background is in the
145
+ [User Guide](USER-GUIDE.md).
@@ -9,6 +9,10 @@ The working pattern is always the same:
9
9
  the tools enforce the honesty rules.** When you see `[FILL]`, that's a
10
10
  question addressed to you.
11
11
 
12
+ **New to this? Start with the [Conversation Script](CONVERSATION-SCRIPT.md)** —
13
+ the exact sentences to type at every stage of a bid, in order. This guide is
14
+ the deeper prompt library behind it.
15
+
12
16
  ---
13
17
 
14
18
  ## 1. Setup per assistant (one-time)
@@ -82,10 +86,14 @@ I am bidding on a consultancy. Run the full tor-to-proposal bid pack
82
86
 
83
87
  Rules for you:
84
88
  - Start with bid_pack_start, then show me the bid screen — I decide go/no-go.
85
- - Then put EVERY question from out/questions.md to me in ONE message. I answer
86
- once; write my answers to answers.json and run bid_pack_apply. Repeat until
87
- zero open. Never invent an answer, never ask questions one by one.
88
- - Drafts get linted/simulated/audited with the tools; fix and loop until they pass.
89
+ - Then ask me the open questions ONE AT A TIME in plain language (each has a
90
+ "how to answer" hint in questions.md). I answer in words; write my answers
91
+ to answers.json and run bid_pack_apply. Repeat until zero open — new
92
+ questions can appear when a document is first rendered; that is normal.
93
+ Never invent an answer and never suggest a number.
94
+ - Drafts come from the AI briefs: draft from out/brief-cover-letter.md and
95
+ out/brief-technical-proposal.md, then lint/simulate/audit with the tools;
96
+ fix and loop until they pass.
89
97
  - Finish with the four PDFs rendered per references/render-specs.md and
90
98
  bid_pack_pack. Deliver pack/ + submission-checklist.md. Nothing is "done"
91
99
  while pack exits non-zero.
@@ -142,21 +150,23 @@ show every formula. Finally position my rate against the cited band.
142
150
 
143
151
  **Cover letter:**
144
152
  ```text
145
- Draft a one-page cover letter per assets/templates.md: verbatim title + ref +
146
- deadline block, 2-sentence understanding from Background/Objectives only, fit
147
- section quoting 3–5 JD requirements (p.X) with my CV evidence — mark [FILL]
148
- where I haven't given you evidence yet — compliance declarations, availability
149
- per the ToR start date. Then lint it with cover_letter_lint and fix everything
150
- it flags. No superlatives.
153
+ Draft my cover letter from the brief: read out/brief-cover-letter.md and
154
+ follow it exactly — it already contains the ToR facts, the compliance rows,
155
+ my verified CV evidence, the required structure, and the honesty rules.
156
+ Save the result as cover-letter.md in the bid folder, then lint it with
157
+ cover_letter_lint and fix everything it flags. Where the brief says [FILL],
158
+ ask me for the fact instead of inventing it. No superlatives.
151
159
  ```
152
160
 
153
161
  **Technical response + self-score:**
154
162
  ```text
155
- Draft the technical response: one section per scored criterion, highest weight
156
- first, in the client's vocabulary, every deliverable addressed. Extract the
157
- sub-elements of each criterion verbatim into sub-elements.json, then run
158
- simulate and give me the at-risk points. Loop with me: rewrite the weakest
159
- criterion, re-simulate, until at-risk ≈ 0.
163
+ Draft my technical proposal from the brief: read out/brief-technical-proposal.md
164
+ and follow it exactly — one section per deliverable/criterion, in the client's
165
+ vocabulary, experience facts only from the brief's VERIFIED EVIDENCE section.
166
+ Save it as technical-proposal.md, then extract the sub-elements of each
167
+ criterion verbatim into sub-elements.json, run simulate, and give me the
168
+ at-risk points. Loop with me: rewrite the weakest criterion, re-simulate,
169
+ until at-risk ≈ 0.
160
170
  ```
161
171
 
162
172
  **Their forms:**
@@ -44,13 +44,25 @@ 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)
50
60
 
51
61
  You talk to Claude (or ChatGPT, Codex, or similar) in normal English. The AI
52
62
  runs everything and explains the results. You never see a command line unless
53
- you want to.
63
+ you want to. (Not sure what to say at each step? The
64
+ [Conversation Script](CONVERSATION-SCRIPT.md) gives you the exact sentences,
65
+ in order.)
54
66
 
55
67
  **One-time setup (5 minutes):** install once with a single command and connect
56
68
  your AI assistant (exact keystrokes in §4). Then say things like:
@@ -152,10 +164,17 @@ a green ✔ MATCH table and red **"GAP — do not claim"** lines. Those GAP line
152
164
  must not appear anywhere in your bid, no matter how tempting — the tool
153
165
  enforces it.
154
166
 
155
- **Step 4 — The drafts.** A one-page cover letter and a technical response with
156
- **one section per scoring criterion**, quoting the ToR with page numbers.
157
- Places it can't fill honestly appear as `[FILL]` — answer them and the drafts
158
- are re-checked automatically.
167
+ **Step 4 — The drafts (paste a brief into your AI).** The tool never writes a
168
+ cover letter or technical proposal in your name — a document about YOUR career
169
+ must come from YOUR facts. Instead it writes two **AI briefs** for you:
170
+ `out/brief-cover-letter.md` and `out/brief-technical-proposal.md`. Each brief
171
+ is a complete, ready-to-paste prompt containing the ToR facts with page
172
+ numbers, every requirement, your verified CV evidence, the required structure,
173
+ and the honesty rules. **Copy the whole file, paste it into Claude/ChatGPT/
174
+ Gemini, save the reply as `cover-letter.md` / `technical-proposal.md` in your
175
+ bid folder.** The tool then lints and audits every line of what the AI wrote —
176
+ superlatives, invented facts, and untraceable claims are rejected with the
177
+ exact line number.
159
178
 
160
179
  **Step 5 — The self-score.** The tool scores your draft against their grid:
161
180
  *"Criterion 3 (25 pts): 2 of 3 sub-elements covered; missing: sustainability
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.6' },
325
+ serverInfo: { name: 'tor-to-proposal', version: '2.2.2' },
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.6",
3
+ "version": "2.2.2",
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": {