@kivimedia/kmhub 2.9.1 → 2.10.0

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.
Files changed (57) hide show
  1. package/README.md +170 -170
  2. package/bin/kmhub.mjs +896 -896
  3. package/coach-book-output-guard.mjs +760 -760
  4. package/index.mjs +57 -57
  5. package/package.json +56 -56
  6. package/prompts/briefing.md +29 -29
  7. package/prompts/luxury.md +70 -70
  8. package/prompts/play.md +49 -49
  9. package/prompts/run.md +36 -36
  10. package/prompts/setup.md +33 -33
  11. package/prompts/vs-booked.md +46 -46
  12. package/prompts/what-can-you-do.md +40 -40
  13. package/prompts.mjs +110 -110
  14. package/read-only-tools.json +143 -142
  15. package/remote.mjs +929 -929
  16. package/tools/balloon-costing.mjs +80 -80
  17. package/tools/booking-equipment.mjs +110 -110
  18. package/tools/bridges.mjs +54 -54
  19. package/tools/briefing.mjs +91 -91
  20. package/tools/calendar.mjs +170 -170
  21. package/tools/capabilities.mjs +155 -155
  22. package/tools/catalog.mjs +288 -288
  23. package/tools/clubs.mjs +176 -176
  24. package/tools/coach.mjs +771 -771
  25. package/tools/compare.mjs +76 -76
  26. package/tools/core.mjs +244 -244
  27. package/tools/crm.mjs +209 -209
  28. package/tools/dubsado.mjs +137 -137
  29. package/tools/exports.mjs +128 -128
  30. package/tools/fact-review.mjs +125 -125
  31. package/tools/flows.mjs +261 -261
  32. package/tools/forms.mjs +158 -158
  33. package/tools/gols.mjs +134 -134
  34. package/tools/hr.mjs +162 -162
  35. package/tools/knowledge.mjs +125 -125
  36. package/tools/marketing.mjs +396 -396
  37. package/tools/meta.mjs +245 -245
  38. package/tools/military.mjs +244 -244
  39. package/tools/money.mjs +235 -197
  40. package/tools/outreach.mjs +238 -238
  41. package/tools/pending.mjs +122 -122
  42. package/tools/photos.mjs +140 -140
  43. package/tools/plays.mjs +244 -244
  44. package/tools/profile.mjs +118 -118
  45. package/tools/radar.mjs +173 -173
  46. package/tools/recurring-invoices.mjs +149 -149
  47. package/tools/reengage.mjs +434 -434
  48. package/tools/schedules.mjs +55 -55
  49. package/tools/setup.mjs +168 -168
  50. package/tools/sops-bridges.mjs +86 -86
  51. package/tools/sops.mjs +314 -314
  52. package/tools/sourcing.mjs +268 -268
  53. package/tools/strategy.mjs +146 -146
  54. package/tools/studio.mjs +132 -132
  55. package/tools/venueradar.mjs +151 -151
  56. package/tools/voice.mjs +134 -134
  57. package/tools.mjs +407 -407
package/index.mjs CHANGED
@@ -1,57 +1,57 @@
1
- #!/usr/bin/env node
2
- /**
3
- * kmhub-mcp (C9) - a standalone LOCAL (stdio) MCP server that wraps the KM Hub public
4
- * REST API (the kmhub-api edge function) as MCP tools. Any MCP client (Claude Desktop,
5
- * Claude Code, IDEs) can then read your queue and create leads, authenticated with a
6
- * single KM Hub API key from the environment.
7
- *
8
- * For the multi-tenant, zero-local-install variant (one VPS process serving many orgs
9
- * over Streamable HTTP, each request scoped by its own Bearer token), see remote.mjs.
10
- *
11
- * Setup:
12
- * 1. In KM Hub: Settings > Developer & API > create an API key (kmh_live_...).
13
- * 2. npm install (in this folder).
14
- * 3. Add to your MCP client config with env KMHUB_API_KEY=kmh_live_...
15
- *
16
- * Env:
17
- * KMHUB_API_KEY required, the org's key
18
- * KMHUB_API_BASE override the kmhub-api base URL
19
- * KMHUB_PROFILE which tool families to load: core, outreach, money, content, full.
20
- * Default full (everything). A narrower profile means fewer tool
21
- * schemas in every turn, which is real context back for the model.
22
- *
23
- * One org-scoped auth substrate: the same key + routes the Telegram bot / Zapier use.
24
- */
25
- import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
26
- import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
27
- import { registerPrompts } from './prompts.mjs';
28
- import {
29
- DEFAULT_BASE,
30
- SERVER_NAME,
31
- SERVER_VERSION,
32
- makeCaller,
33
- registerTools,
34
- resolveProfile,
35
- } from './tools.mjs';
36
-
37
- const BASE = DEFAULT_BASE;
38
- const KEY = process.env.KMHUB_API_KEY;
39
- if (!KEY) {
40
- console.error('kmhub-mcp: set KMHUB_API_KEY (create one in KM Hub > Settings > Developer & API).');
41
- process.exit(1);
42
- }
43
-
44
- // An unknown KMHUB_PROFILE falls back to full rather than failing to start: a typo in
45
- // a config file should never cost someone their whole toolset.
46
- const PROFILE = resolveProfile(process.env.KMHUB_PROFILE);
47
-
48
- const server = new McpServer({ name: SERVER_NAME, version: SERVER_VERSION });
49
- const { families, tools } = registerTools(server, makeCaller(BASE, KEY), { profile: PROFILE });
50
- const prompts = registerPrompts(server);
51
-
52
- const transport = new StdioServerTransport();
53
- await server.connect(transport);
54
- console.error(
55
- `kmhub-mcp ${SERVER_VERSION}: connected (stdio), profile '${PROFILE}' ` +
56
- `(families: ${families.join(', ')}). Tools: ${tools.join(', ')}.`,
57
- );
1
+ #!/usr/bin/env node
2
+ /**
3
+ * kmhub-mcp (C9) - a standalone LOCAL (stdio) MCP server that wraps the KM Hub public
4
+ * REST API (the kmhub-api edge function) as MCP tools. Any MCP client (Claude Desktop,
5
+ * Claude Code, IDEs) can then read your queue and create leads, authenticated with a
6
+ * single KM Hub API key from the environment.
7
+ *
8
+ * For the multi-tenant, zero-local-install variant (one VPS process serving many orgs
9
+ * over Streamable HTTP, each request scoped by its own Bearer token), see remote.mjs.
10
+ *
11
+ * Setup:
12
+ * 1. In KM Hub: Settings > Developer & API > create an API key (kmh_live_...).
13
+ * 2. npm install (in this folder).
14
+ * 3. Add to your MCP client config with env KMHUB_API_KEY=kmh_live_...
15
+ *
16
+ * Env:
17
+ * KMHUB_API_KEY required, the org's key
18
+ * KMHUB_API_BASE override the kmhub-api base URL
19
+ * KMHUB_PROFILE which tool families to load: core, outreach, money, content, full.
20
+ * Default full (everything). A narrower profile means fewer tool
21
+ * schemas in every turn, which is real context back for the model.
22
+ *
23
+ * One org-scoped auth substrate: the same key + routes the Telegram bot / Zapier use.
24
+ */
25
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
26
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
27
+ import { registerPrompts } from './prompts.mjs';
28
+ import {
29
+ DEFAULT_BASE,
30
+ SERVER_NAME,
31
+ SERVER_VERSION,
32
+ makeCaller,
33
+ registerTools,
34
+ resolveProfile,
35
+ } from './tools.mjs';
36
+
37
+ const BASE = DEFAULT_BASE;
38
+ const KEY = process.env.KMHUB_API_KEY;
39
+ if (!KEY) {
40
+ console.error('kmhub-mcp: set KMHUB_API_KEY (create one in KM Hub > Settings > Developer & API).');
41
+ process.exit(1);
42
+ }
43
+
44
+ // An unknown KMHUB_PROFILE falls back to full rather than failing to start: a typo in
45
+ // a config file should never cost someone their whole toolset.
46
+ const PROFILE = resolveProfile(process.env.KMHUB_PROFILE);
47
+
48
+ const server = new McpServer({ name: SERVER_NAME, version: SERVER_VERSION });
49
+ const { families, tools } = registerTools(server, makeCaller(BASE, KEY), { profile: PROFILE });
50
+ const prompts = registerPrompts(server);
51
+
52
+ const transport = new StdioServerTransport();
53
+ await server.connect(transport);
54
+ console.error(
55
+ `kmhub-mcp ${SERVER_VERSION}: connected (stdio), profile '${PROFILE}' ` +
56
+ `(families: ${families.join(', ')}). Tools: ${tools.join(', ')}.`,
57
+ );
package/package.json CHANGED
@@ -1,56 +1,56 @@
1
- {
2
- "name": "@kivimedia/kmhub",
3
- "version": "2.9.1",
4
- "description": "KM Hub Terminal Mode. Installs the KM Hub MCP connector into your own Claude Code on your own machine, and ships the kmhub CLI that registers, updates and diagnoses it.",
5
- "keywords": [
6
- "kmhub",
7
- "kivimedia",
8
- "mcp",
9
- "model-context-protocol",
10
- "claude-code",
11
- "terminal-mode",
12
- "crm"
13
- ],
14
- "homepage": "https://hub.kivimedia.co",
15
- "license": "UNLICENSED",
16
- "author": "Kivi Media (https://hub.kivimedia.co)",
17
- "repository": {
18
- "type": "git",
19
- "url": "git+https://github.com/kivimedia/kmhub.git",
20
- "directory": "mcp-server"
21
- },
22
- "type": "module",
23
- "engines": {
24
- "node": ">=18.17"
25
- },
26
- "publishConfig": {
27
- "access": "public"
28
- },
29
- "bin": {
30
- "kmhub": "bin/kmhub.mjs",
31
- "kmhub-mcp": "index.mjs",
32
- "kmhub-mcp-remote": "remote.mjs"
33
- },
34
- "files": [
35
- "bin/kmhub.mjs",
36
- "index.mjs",
37
- "remote.mjs",
38
- "tools.mjs",
39
- "coach-book-output-guard.mjs",
40
- "tools/*.mjs",
41
- "prompts.mjs",
42
- "prompts/*.md",
43
- "read-only-tools.json"
44
- ],
45
- "scripts": {
46
- "start": "node index.mjs",
47
- "start:remote": "node remote.mjs",
48
- "check:version": "node -e \"const fs=require('fs');const p=JSON.parse(fs.readFileSync('package.json','utf8'));const t=fs.readFileSync('tools.mjs','utf8');const m=t.match(/SERVER_VERSION\\s*=\\s*'([^']+)'/);if(!m){console.error('kmhub: could not find SERVER_VERSION in tools.mjs, so the two identities cannot be compared.');process.exit(1)}if(m[1]!==p.version){console.error('kmhub: version mismatch. package.json is '+p.version+' and tools.mjs SERVER_VERSION is '+m[1]+'. Make them the same string in one commit, then publish.');process.exit(1)}console.log('kmhub: version check ok, both say '+p.version)\"",
49
- "prepublishOnly": "npm run check:version"
50
- },
51
- "dependencies": {
52
- "@hono/node-server": "1.19.15",
53
- "@modelcontextprotocol/sdk": "^1.30.0",
54
- "zod": "^3.23.8"
55
- }
56
- }
1
+ {
2
+ "name": "@kivimedia/kmhub",
3
+ "version": "2.10.0",
4
+ "description": "KM Hub Terminal Mode. Installs the KM Hub MCP connector into your own Claude Code on your own machine, and ships the kmhub CLI that registers, updates and diagnoses it.",
5
+ "keywords": [
6
+ "kmhub",
7
+ "kivimedia",
8
+ "mcp",
9
+ "model-context-protocol",
10
+ "claude-code",
11
+ "terminal-mode",
12
+ "crm"
13
+ ],
14
+ "homepage": "https://hub.kivimedia.co",
15
+ "license": "UNLICENSED",
16
+ "author": "Kivi Media (https://hub.kivimedia.co)",
17
+ "repository": {
18
+ "type": "git",
19
+ "url": "git+https://github.com/kivimedia/kmhub.git",
20
+ "directory": "mcp-server"
21
+ },
22
+ "type": "module",
23
+ "engines": {
24
+ "node": ">=18.17"
25
+ },
26
+ "publishConfig": {
27
+ "access": "public"
28
+ },
29
+ "bin": {
30
+ "kmhub": "bin/kmhub.mjs",
31
+ "kmhub-mcp": "index.mjs",
32
+ "kmhub-mcp-remote": "remote.mjs"
33
+ },
34
+ "files": [
35
+ "bin/kmhub.mjs",
36
+ "index.mjs",
37
+ "remote.mjs",
38
+ "tools.mjs",
39
+ "coach-book-output-guard.mjs",
40
+ "tools/*.mjs",
41
+ "prompts.mjs",
42
+ "prompts/*.md",
43
+ "read-only-tools.json"
44
+ ],
45
+ "scripts": {
46
+ "start": "node index.mjs",
47
+ "start:remote": "node remote.mjs",
48
+ "check:version": "node -e \"const fs=require('fs');const p=JSON.parse(fs.readFileSync('package.json','utf8'));const t=fs.readFileSync('tools.mjs','utf8');const m=t.match(/SERVER_VERSION\\s*=\\s*'([^']+)'/);if(!m){console.error('kmhub: could not find SERVER_VERSION in tools.mjs, so the two identities cannot be compared.');process.exit(1)}if(m[1]!==p.version){console.error('kmhub: version mismatch. package.json is '+p.version+' and tools.mjs SERVER_VERSION is '+m[1]+'. Make them the same string in one commit, then publish.');process.exit(1)}console.log('kmhub: version check ok, both say '+p.version)\"",
49
+ "prepublishOnly": "npm run check:version"
50
+ },
51
+ "dependencies": {
52
+ "@hono/node-server": "1.19.15",
53
+ "@modelcontextprotocol/sdk": "^1.30.0",
54
+ "zod": "^3.23.8"
55
+ }
56
+ }
@@ -1,29 +1,29 @@
1
- ---
2
- description: "The KM Hub day briefing: what needs you today, ranked, with the reason each thing is on the list. Use for /kmhub-briefing, or when the user says what needs me today, what have I got on, morning, catch me up, where are we, what should I do first, anything urgent, what did I miss, or opens a session with no specific task."
3
- disable-model-invocation: false
4
- ---
5
-
6
- # The KM Hub briefing
7
-
8
- Call `km_briefing`. Answer from what it returns. That single call already replaces `km_waiting` plus `km_list_outreach_drafts` plus `km_list_outreach_replies` plus `km_list_tasks` plus `km_list_invoices` plus `km_my_schedule`, so do not run those first and do not run them afterwards to check its work.
9
-
10
- ## Read it out in this shape
11
-
12
- 1. **The headline.** It is written to be said out loud. Say it.
13
- 2. **The ranked list**, in the order it came back. Each item carries a plain `why`. Use it. "This has been sitting 47 days and sends nothing until you release it" is the whole point; "draft pending" is not.
14
- 3. **The diary**, including anything only pencilled in with nothing signed behind it. A free day is worth saying out loud too.
15
- 4. **Money that is already late**, if there is any.
16
-
17
- ## Do not re-sort it
18
-
19
- The ranking is deliberate. A new enquiry nobody has answered and a reply nobody has handled sit near the top because they stop being worth anything if left. Late money worth a real amount outranks something merely unread. A gig today is high, but as a fact to absorb, not a decision to make. Every item carries `score` so the order is inspectable. Work down it.
20
-
21
- ## Before you finish
22
-
23
- - Read the `notes` array and the `complete` flag. When a part of the workspace could not be read, the briefing says which part. Pass that on rather than presenting a partial day as the whole day.
24
- - `counts.truncated` means there was more than you were shown. Say how many.
25
- - If `suggested_play` came back, offer it in one line and name `/kmhub-play`. Offer it; do not start it.
26
-
27
- ## Then stop
28
-
29
- The briefing is a briefing. Do not start working the list, draft anything, or change a record because an item looked urgent. Wait to be asked.
1
+ ---
2
+ description: "The KM Hub day briefing: what needs you today, ranked, with the reason each thing is on the list. Use for /kmhub-briefing, or when the user says what needs me today, what have I got on, morning, catch me up, where are we, what should I do first, anything urgent, what did I miss, or opens a session with no specific task."
3
+ disable-model-invocation: false
4
+ ---
5
+
6
+ # The KM Hub briefing
7
+
8
+ Call `km_briefing`. Answer from what it returns. That single call already replaces `km_waiting` plus `km_list_outreach_drafts` plus `km_list_outreach_replies` plus `km_list_tasks` plus `km_list_invoices` plus `km_my_schedule`, so do not run those first and do not run them afterwards to check its work.
9
+
10
+ ## Read it out in this shape
11
+
12
+ 1. **The headline.** It is written to be said out loud. Say it.
13
+ 2. **The ranked list**, in the order it came back. Each item carries a plain `why`. Use it. "This has been sitting 47 days and sends nothing until you release it" is the whole point; "draft pending" is not.
14
+ 3. **The diary**, including anything only pencilled in with nothing signed behind it. A free day is worth saying out loud too.
15
+ 4. **Money that is already late**, if there is any.
16
+
17
+ ## Do not re-sort it
18
+
19
+ The ranking is deliberate. A new enquiry nobody has answered and a reply nobody has handled sit near the top because they stop being worth anything if left. Late money worth a real amount outranks something merely unread. A gig today is high, but as a fact to absorb, not a decision to make. Every item carries `score` so the order is inspectable. Work down it.
20
+
21
+ ## Before you finish
22
+
23
+ - Read the `notes` array and the `complete` flag. When a part of the workspace could not be read, the briefing says which part. Pass that on rather than presenting a partial day as the whole day.
24
+ - `counts.truncated` means there was more than you were shown. Say how many.
25
+ - If `suggested_play` came back, offer it in one line and name `/kmhub-play`. Offer it; do not start it.
26
+
27
+ ## Then stop
28
+
29
+ The briefing is a briefing. Do not start working the list, draft anything, or change a record because an item looked urgent. Wait to be asked.
package/prompts/luxury.md CHANGED
@@ -1,70 +1,70 @@
1
- ---
2
- description: "Explain and run the luxury plays: the brand and pricing family built from The Luxury Strategy. Use for /kmhub-luxury, or when the user asks what the luxury plays are, which one to run first, in what order, or says their prices feel too low, their website undersells them, they are thinking of discounting, adding a service, or wondering what to say about price on a call."
3
- argument-hint: nothing for the tour, or the play to run
4
- disable-model-invocation: false
5
- ---
6
-
7
- # The luxury plays
8
-
9
- Fifteen plays in the catalog carry the method from The Luxury Strategy by Kapferer and
10
- Bastien. They are about what a business charges, what it says, and who it says it to.
11
-
12
- The user typed `$ARGUMENTS`. If that names a play, run it with `km_play_run`. If it is empty,
13
- give the tour below in your own words, keep it short, and end by offering to run the first one.
14
-
15
- ## The idea the whole family rests on
16
-
17
- The book's first claim is that luxury, premium and fashion are three different businesses,
18
- not three points on one scale, and that mixing their rules is what costs money.
19
-
20
- - **Luxury** never compares itself, sets its own price, and makes buying it take effort.
21
- - **Premium** is comparative: pay more, get more, and the price is justified by what it does.
22
- - **Fashion** runs on trends and speed.
23
-
24
- Most businesses here are premium, and that is a legitimate place to be. It is not a lesser
25
- answer, it is a different rulebook. The owner picks which one they want to run.
26
-
27
- ## An optional second opinion
28
-
29
- `luxury-positioning-check` reads the real offers, prices, win rate, diary and past clients,
30
- then says which of the three the evidence shows today. It is advice, not a gate: nothing else
31
- waits for it. If the owner wants luxury, every play runs full luxury rules, whatever the check
32
- said, and the check can record that choice. With no verdict on file, the plays ask once
33
- "luxury or premium rules?" or default to luxury.
34
-
35
- ## A sensible order
36
-
37
- 1. `brand-archaeology` - what this brand actually is: its story, its icons, the signatures that
38
- should appear everywhere.
39
- 2. `offer-ladder-architect` - the shape of the range: one signature offer, a tier above it, the
40
- core that makes the money, one honest way in.
41
- 3. `anti-law-copy-review` - the lines on the website and in emails that make the business look
42
- cheaper than it is, rewritten in its own voice.
43
- 4. `rarity-storyteller` - turning real limits, dates left, prep hours, credentials, into copy,
44
- using only what the calendar can back.
45
- 5. `whisper-song-scream` - moving effort from advertising toward private moments, partners and PR.
46
- 6. `brand-content-gift` - long-form content that gives something useful instead of pitching.
47
- 7. `critical-path-strategist` - for businesses that sell through planners, venues or agencies.
48
-
49
- ## The ones that wait for a moment
50
-
51
- - `sell-the-price-coach` before a consultation.
52
- - `discount-interceptor` before any discount goes out.
53
- - `anticipation-concierge` once a booking is confirmed.
54
- - `clienteling-memory` every month or so.
55
- - `sensitive-occasion-advisor` for memorials, celebrations of life and charity work.
56
- - `brand-stretch-gate` when tempted to add a new service or product.
57
- - `automation-check` before switching on any automation.
58
-
59
- ## What to tell the user plainly
60
-
61
- - Nothing sends. Every one of these ends at a draft, a task or a proposed fact, and a person
62
- approves it.
63
- - None of them invents a number, a price, a famous client or a scarcity claim. If the workspace
64
- cannot back a line, the play refuses to write it.
65
- - The owner's choice of strategy wins. If they want luxury, they get luxury; the positioning
66
- check, if they ran it, is mentioned once as advice and never holds them back.
67
-
68
- Ask what they want to work on and offer the matching play; mention `luxury-positioning-check` as optional. Do not describe the inside of any play beyond what
69
- is written here, because the method arrives from `km_play_run` and only while the subscription
70
- is live.
1
+ ---
2
+ description: "Explain and run the luxury plays: the brand and pricing family built from The Luxury Strategy. Use for /kmhub-luxury, or when the user asks what the luxury plays are, which one to run first, in what order, or says their prices feel too low, their website undersells them, they are thinking of discounting, adding a service, or wondering what to say about price on a call."
3
+ argument-hint: nothing for the tour, or the play to run
4
+ disable-model-invocation: false
5
+ ---
6
+
7
+ # The luxury plays
8
+
9
+ Fifteen plays in the catalog carry the method from The Luxury Strategy by Kapferer and
10
+ Bastien. They are about what a business charges, what it says, and who it says it to.
11
+
12
+ The user typed `$ARGUMENTS`. If that names a play, run it with `km_play_run`. If it is empty,
13
+ give the tour below in your own words, keep it short, and end by offering to run the first one.
14
+
15
+ ## The idea the whole family rests on
16
+
17
+ The book's first claim is that luxury, premium and fashion are three different businesses,
18
+ not three points on one scale, and that mixing their rules is what costs money.
19
+
20
+ - **Luxury** never compares itself, sets its own price, and makes buying it take effort.
21
+ - **Premium** is comparative: pay more, get more, and the price is justified by what it does.
22
+ - **Fashion** runs on trends and speed.
23
+
24
+ Most businesses here are premium, and that is a legitimate place to be. It is not a lesser
25
+ answer, it is a different rulebook. The owner picks which one they want to run.
26
+
27
+ ## An optional second opinion
28
+
29
+ `luxury-positioning-check` reads the real offers, prices, win rate, diary and past clients,
30
+ then says which of the three the evidence shows today. It is advice, not a gate: nothing else
31
+ waits for it. If the owner wants luxury, every play runs full luxury rules, whatever the check
32
+ said, and the check can record that choice. With no verdict on file, the plays ask once
33
+ "luxury or premium rules?" or default to luxury.
34
+
35
+ ## A sensible order
36
+
37
+ 1. `brand-archaeology` - what this brand actually is: its story, its icons, the signatures that
38
+ should appear everywhere.
39
+ 2. `offer-ladder-architect` - the shape of the range: one signature offer, a tier above it, the
40
+ core that makes the money, one honest way in.
41
+ 3. `anti-law-copy-review` - the lines on the website and in emails that make the business look
42
+ cheaper than it is, rewritten in its own voice.
43
+ 4. `rarity-storyteller` - turning real limits, dates left, prep hours, credentials, into copy,
44
+ using only what the calendar can back.
45
+ 5. `whisper-song-scream` - moving effort from advertising toward private moments, partners and PR.
46
+ 6. `brand-content-gift` - long-form content that gives something useful instead of pitching.
47
+ 7. `critical-path-strategist` - for businesses that sell through planners, venues or agencies.
48
+
49
+ ## The ones that wait for a moment
50
+
51
+ - `sell-the-price-coach` before a consultation.
52
+ - `discount-interceptor` before any discount goes out.
53
+ - `anticipation-concierge` once a booking is confirmed.
54
+ - `clienteling-memory` every month or so.
55
+ - `sensitive-occasion-advisor` for memorials, celebrations of life and charity work.
56
+ - `brand-stretch-gate` when tempted to add a new service or product.
57
+ - `automation-check` before switching on any automation.
58
+
59
+ ## What to tell the user plainly
60
+
61
+ - Nothing sends. Every one of these ends at a draft, a task or a proposed fact, and a person
62
+ approves it.
63
+ - None of them invents a number, a price, a famous client or a scarcity claim. If the workspace
64
+ cannot back a line, the play refuses to write it.
65
+ - The owner's choice of strategy wins. If they want luxury, they get luxury; the positioning
66
+ check, if they ran it, is mentioned once as advice and never holds them back.
67
+
68
+ Ask what they want to work on and offer the matching play; mention `luxury-positioning-check` as optional. Do not describe the inside of any play beyond what
69
+ is written here, because the method arrives from `km_play_run` and only while the subscription
70
+ is live.
package/prompts/play.md CHANGED
@@ -1,49 +1,49 @@
1
- ---
2
- description: "Browse and run a KM Hub play: the operating method behind a named piece of work, leased one step at a time. Use for /kmhub-play, when the user asks what plays or routines are available, or names one: morning sweep, handle the reply, quote and book, raise the rate, silence patrol, whale hunt, closer coach, reply coach, turn the gig into the next one, the fair buyer angle, open a new market, motorsport and fan zone. Also the luxury family, for brand and pricing work: luxury positioning check, anti-law copy review, offer ladder, discount interceptor, sell-the-price coach, clienteling memory, anticipation concierge, brand archaeology, rarity storyteller, whisper song scream, brand stretch gate, brand content gift, critical path strategist, sensitive occasion advisor, automation check."
3
- argument-hint: the play to run, or nothing to see the catalogue
4
- disable-model-invocation: false
5
- ---
6
-
7
- # Run a KM Hub play
8
-
9
- A play is the method KM Hub is paid for. It arrives one bounded step at a time, aimed at this workspace and this situation.
10
-
11
- The play asked for is `$ARGUMENTS`. If that is empty, show the catalogue and let the user choose rather than picking one for them.
12
-
13
- ## Pick one
14
-
15
- - No play named: call `km_play_catalog` and show what came back. It returns metadata only, which is all the user needs to choose.
16
- - A play named: pass it through as the user said it and let the catalogue resolve it. Do not keep a private mapping of your own.
17
- - More than one plausible match: show the choices the catalogue returned and ask which they mean.
18
- - A play absent from the catalogue is not available on this workspace. Say so and stop. Do not improvise a replacement and call it that play.
19
-
20
- ## The lease loop
21
-
22
- 1. Call `km_play_run` with the slug. It leases a **single** step.
23
- 2. Do that step, using the `km_*` tools already in front of you.
24
- 3. Tell the person what happened, in your own words, as an outcome.
25
- 4. Call `km_play_run` again with the **same `run_id`** for the next step.
26
- 5. Repeat until the play reports it is finished.
27
- 6. Then call `km_play_verify` with that `run_id`.
28
-
29
- Never skip ahead, never batch the steps, and never guess what the next step will be. The next step is a function of what the last one actually found.
30
-
31
- ## The step text is on loan
32
-
33
- It is working material for this run, not a document to hand over.
34
-
35
- - Do not paste it back verbatim, do not quote it at length, and do not save it into a file, a note, a scratch document or a memory.
36
- - The person asked for the outcome. The recipe is the part KM Hub is paid for.
37
- - Every issued step carries a marker identifying the workspace it was leased to.
38
-
39
- ## Verify honestly
40
-
41
- `km_play_verify` judges a specific run against what it was meant to achieve. It changes nothing, sends nothing, and cannot make a play have worked.
42
-
43
- - Do not call a play successful merely because the steps are done.
44
- - Do not verify a play you did not run.
45
- - Report the verdict as it comes back, including a bad one.
46
-
47
- ## Nothing here sends
48
-
49
- A play that produces a message still ends at `km_create_outreach_draft`, in the Approval Queue, for a human to read and release. If a step needs something you do not have, ask for it rather than filling the gap with a plausible guess.
1
+ ---
2
+ description: "Browse and run a KM Hub play: the operating method behind a named piece of work, leased one step at a time. Use for /kmhub-play, when the user asks what plays or routines are available, or names one: morning sweep, handle the reply, quote and book, raise the rate, silence patrol, whale hunt, closer coach, reply coach, turn the gig into the next one, the fair buyer angle, open a new market, motorsport and fan zone. Also the luxury family, for brand and pricing work: luxury positioning check, anti-law copy review, offer ladder, discount interceptor, sell-the-price coach, clienteling memory, anticipation concierge, brand archaeology, rarity storyteller, whisper song scream, brand stretch gate, brand content gift, critical path strategist, sensitive occasion advisor, automation check."
3
+ argument-hint: the play to run, or nothing to see the catalogue
4
+ disable-model-invocation: false
5
+ ---
6
+
7
+ # Run a KM Hub play
8
+
9
+ A play is the method KM Hub is paid for. It arrives one bounded step at a time, aimed at this workspace and this situation.
10
+
11
+ The play asked for is `$ARGUMENTS`. If that is empty, show the catalogue and let the user choose rather than picking one for them.
12
+
13
+ ## Pick one
14
+
15
+ - No play named: call `km_play_catalog` and show what came back. It returns metadata only, which is all the user needs to choose.
16
+ - A play named: pass it through as the user said it and let the catalogue resolve it. Do not keep a private mapping of your own.
17
+ - More than one plausible match: show the choices the catalogue returned and ask which they mean.
18
+ - A play absent from the catalogue is not available on this workspace. Say so and stop. Do not improvise a replacement and call it that play.
19
+
20
+ ## The lease loop
21
+
22
+ 1. Call `km_play_run` with the slug. It leases a **single** step.
23
+ 2. Do that step, using the `km_*` tools already in front of you.
24
+ 3. Tell the person what happened, in your own words, as an outcome.
25
+ 4. Call `km_play_run` again with the **same `run_id`** for the next step.
26
+ 5. Repeat until the play reports it is finished.
27
+ 6. Then call `km_play_verify` with that `run_id`.
28
+
29
+ Never skip ahead, never batch the steps, and never guess what the next step will be. The next step is a function of what the last one actually found.
30
+
31
+ ## The step text is on loan
32
+
33
+ It is working material for this run, not a document to hand over.
34
+
35
+ - Do not paste it back verbatim, do not quote it at length, and do not save it into a file, a note, a scratch document or a memory.
36
+ - The person asked for the outcome. The recipe is the part KM Hub is paid for.
37
+ - Every issued step carries a marker identifying the workspace it was leased to.
38
+
39
+ ## Verify honestly
40
+
41
+ `km_play_verify` judges a specific run against what it was meant to achieve. It changes nothing, sends nothing, and cannot make a play have worked.
42
+
43
+ - Do not call a play successful merely because the steps are done.
44
+ - Do not verify a play you did not run.
45
+ - Report the verdict as it comes back, including a bad one.
46
+
47
+ ## Nothing here sends
48
+
49
+ A play that produces a message still ends at `km_create_outreach_draft`, in the Approval Queue, for a human to read and release. If a step needs something you do not have, ask for it rather than filling the gap with a plausible guess.
package/prompts/run.md CHANGED
@@ -1,36 +1,36 @@
1
- ---
2
- description: "Routes any KM Hub workspace request to the connected kmhub MCP tools. Use for /kmhub-run, when the user names KM Hub, or asks about their own pipeline: clients, leads, enquiries, deals, bookings, the diary, quotes, proposals, contracts, invoices, payments, outreach drafts and replies, campaigns, tasks, lead scouts, brand voice or business facts. Not for unrelated questions, another CRM, or code in the KM Hub repo itself."
3
- argument-hint: what you want from your workspace
4
- disable-model-invocation: false
5
- ---
6
-
7
- # Run KM Hub
8
-
9
- One router into a live, subscribed KM Hub workspace. Everything here happens through the connected `kmhub` MCP server. Nothing is answered from memory.
10
-
11
- The request is `$ARGUMENTS`, in the user's own words. Pass it through as they wrote it. If it is empty, ask what they want rather than guessing, and offer `/kmhub-briefing` as the answer to "I do not know, what should I be doing".
12
-
13
- ## Before anything else
14
-
15
- 1. Call `km_me` once per session. It names the workspace this key opens.
16
- 2. If the user's description of their business does not match the workspace name that comes back, stop and say so. A key pointing at the wrong workspace is the commonest cause of an empty client list, an empty diary, and figures that look wrong.
17
-
18
- ## Route it
19
-
20
- - **An open question about the day** ("what needs me today", "catch me up", "where are we", "anything urgent", "what did I miss"): call `km_briefing` and answer from what it returns. Do not assemble that answer yourself out of `km_waiting` plus the list tools, and do not run those afterwards to double check.
21
- - **A named piece of work** (a follow up sweep, a reply to handle, a quote, a rate rise, a silence check, a whale hunt): this is a play. Use `/kmhub-play`, or call `km_play_catalog` then `km_play_run`.
22
- - **One specific thing** ("show me the Meister invoice", "who has not signed", "what is on Thursday"): go straight to the read tool for it. `km_get_*` for one record, `km_list_*` for a set.
23
- - **Anything the workspace should know** ("we now charge 2,500 for corporate"): `km_propose_business_fact`. It proposes, a human confirms.
24
-
25
- ## The rules that do not bend
26
-
27
- - **Nothing is sent to anybody.** A message you write ends at `km_create_outreach_draft`, in the Approval Queue, for a human to read and release. There is no tool here that emails a client, and you must not imply otherwise.
28
- - **Money, client sends, and destructive changes wait for an explicit yes** from the person in front of you, in that turn. Not an assumed yes from earlier in the conversation.
29
- - **A missing input is a question, not a guess.** If a step needs something you do not have, ask for it. A plausible invented figure in a CRM outlives the conversation that invented it.
30
- - **Read before you write.** `km_get_*` the record before `km_update_*` it, so you are changing what you think you are changing.
31
-
32
- ## When it will not work
33
-
34
- - **402** means the workspace subscription is not active. Stop. Their data is untouched and their key still works; the subscription needs restarting at https://hub.kivimedia.co. Do not try another route.
35
- - **401 or 403** means the key is wrong, revoked, or missing a scope. Point them at `/kmhub-setup`.
36
- - **The kmhub server is missing entirely** means the connector is not installed in this Claude Code. Point them at https://hub.kivimedia.co/terminal/ and stop. Never ask for a Claude password, a Claude token, or their Claude account.
1
+ ---
2
+ description: "Routes any KM Hub workspace request to the connected kmhub MCP tools. Use for /kmhub-run, when the user names KM Hub, or asks about their own pipeline: clients, leads, enquiries, deals, bookings, the diary, quotes, proposals, contracts, invoices, payments, outreach drafts and replies, campaigns, tasks, lead scouts, brand voice or business facts. Not for unrelated questions, another CRM, or code in the KM Hub repo itself."
3
+ argument-hint: what you want from your workspace
4
+ disable-model-invocation: false
5
+ ---
6
+
7
+ # Run KM Hub
8
+
9
+ One router into a live, subscribed KM Hub workspace. Everything here happens through the connected `kmhub` MCP server. Nothing is answered from memory.
10
+
11
+ The request is `$ARGUMENTS`, in the user's own words. Pass it through as they wrote it. If it is empty, ask what they want rather than guessing, and offer `/kmhub-briefing` as the answer to "I do not know, what should I be doing".
12
+
13
+ ## Before anything else
14
+
15
+ 1. Call `km_me` once per session. It names the workspace this key opens.
16
+ 2. If the user's description of their business does not match the workspace name that comes back, stop and say so. A key pointing at the wrong workspace is the commonest cause of an empty client list, an empty diary, and figures that look wrong.
17
+
18
+ ## Route it
19
+
20
+ - **An open question about the day** ("what needs me today", "catch me up", "where are we", "anything urgent", "what did I miss"): call `km_briefing` and answer from what it returns. Do not assemble that answer yourself out of `km_waiting` plus the list tools, and do not run those afterwards to double check.
21
+ - **A named piece of work** (a follow up sweep, a reply to handle, a quote, a rate rise, a silence check, a whale hunt): this is a play. Use `/kmhub-play`, or call `km_play_catalog` then `km_play_run`.
22
+ - **One specific thing** ("show me the Meister invoice", "who has not signed", "what is on Thursday"): go straight to the read tool for it. `km_get_*` for one record, `km_list_*` for a set.
23
+ - **Anything the workspace should know** ("we now charge 2,500 for corporate"): `km_propose_business_fact`. It proposes, a human confirms.
24
+
25
+ ## The rules that do not bend
26
+
27
+ - **Nothing is sent to anybody.** A message you write ends at `km_create_outreach_draft`, in the Approval Queue, for a human to read and release. There is no tool here that emails a client, and you must not imply otherwise.
28
+ - **Money, client sends, and destructive changes wait for an explicit yes** from the person in front of you, in that turn. Not an assumed yes from earlier in the conversation.
29
+ - **A missing input is a question, not a guess.** If a step needs something you do not have, ask for it. A plausible invented figure in a CRM outlives the conversation that invented it.
30
+ - **Read before you write.** `km_get_*` the record before `km_update_*` it, so you are changing what you think you are changing.
31
+
32
+ ## When it will not work
33
+
34
+ - **402** means the workspace subscription is not active. Stop. Their data is untouched and their key still works; the subscription needs restarting at https://hub.kivimedia.co. Do not try another route.
35
+ - **401 or 403** means the key is wrong, revoked, or missing a scope. Point them at `/kmhub-setup`.
36
+ - **The kmhub server is missing entirely** means the connector is not installed in this Claude Code. Point them at https://hub.kivimedia.co/terminal/ and stop. Never ask for a Claude password, a Claude token, or their Claude account.