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 +35 -5
- package/SKILL.md +9 -0
- package/bin/bid-pack.mjs +126 -0
- package/bin/package.mjs +1 -1
- package/docs/CONVERSATION-SCRIPT.md +145 -0
- package/docs/PROMPT-GUIDE.md +25 -15
- package/docs/USER-GUIDE.md +24 -5
- package/mcp/server.mjs +1 -1
- package/package.json +1 -1
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
|
-
##
|
|
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
|
|
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).
|
package/docs/PROMPT-GUIDE.md
CHANGED
|
@@ -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
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
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
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
it
|
|
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
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
criterion,
|
|
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:**
|
package/docs/USER-GUIDE.md
CHANGED
|
@@ -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
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
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.
|
|
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.
|
|
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": {
|