@rubytech/taskmaster 1.13.4 → 1.16.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.
- package/dist/agents/apply-patch.js +3 -1
- package/dist/agents/bash-tools.exec.js +3 -1
- package/dist/agents/bash-tools.process.js +3 -1
- package/dist/agents/skills/frontmatter.js +1 -0
- package/dist/agents/skills/workspace.js +64 -22
- package/dist/agents/system-prompt.js +1 -1
- package/dist/agents/taskmaster-tools.js +6 -4
- package/dist/agents/tool-policy.js +2 -1
- package/dist/agents/tools/contact-create-tool.js +4 -3
- package/dist/agents/tools/contact-delete-tool.js +3 -2
- package/dist/agents/tools/contact-lookup-tool.js +5 -4
- package/dist/agents/tools/contact-update-tool.js +6 -3
- package/dist/agents/tools/memory-tool.js +3 -1
- package/dist/agents/tools/qr-generate-tool.js +45 -0
- package/dist/agents/workspace-migrations.js +479 -0
- package/dist/build-info.json +3 -3
- package/dist/cli/gateway-cli/run.js +36 -16
- package/dist/config/agent-tools-reconcile.js +47 -0
- package/dist/control-ui/assets/{index-BiGN9NNG.js → index-Bd75cI7J.js} +568 -592
- package/dist/control-ui/assets/index-Bd75cI7J.js.map +1 -0
- package/dist/control-ui/assets/index-BkymP95Y.css +1 -0
- package/dist/control-ui/index.html +2 -2
- package/dist/daemon/service-port.js +109 -0
- package/dist/gateway/server-http.js +5 -0
- package/dist/gateway/server-methods/config.js +44 -0
- package/dist/gateway/server-methods/web.js +13 -0
- package/dist/gateway/server.impl.js +15 -1
- package/dist/hooks/bundled/ride-dispatch/HOOK.md +57 -0
- package/dist/hooks/bundled/ride-dispatch/handler.js +450 -0
- package/dist/hooks/bundled/ride-dispatch/stripe-webhook.js +191 -0
- package/dist/infra/update-global.js +4 -1
- package/dist/infra/update-runner.js +8 -4
- package/dist/macos/gateway-daemon.js +26 -8
- package/dist/memory/internal.js +24 -1
- package/dist/memory/manager.js +15 -4
- package/dist/records/records-manager.js +7 -2
- package/package.json +1 -1
- package/skills/business-assistant/SKILL.md +1 -1
- package/skills/qr-code/SKILL.md +63 -0
- package/skills/sales-closer/SKILL.md +29 -0
- package/skills/sales-closer/references/close-tracking.md +86 -0
- package/skills/sales-closer/references/closing-framework.md +112 -0
- package/skills/sales-closer/references/objection-handling.md +101 -0
- package/templates/beagle-zanzibar/agents/admin/AGENTS.md +123 -5
- package/templates/beagle-zanzibar/agents/admin/BOOTSTRAP.md +34 -11
- package/templates/beagle-zanzibar/agents/admin/HEARTBEAT.md +1 -0
- package/templates/beagle-zanzibar/agents/public/AGENTS.md +110 -17
- package/templates/beagle-zanzibar/memory/public/knowledge-base.md +13 -0
- package/templates/beagle-zanzibar/memory/public/terms.md +81 -0
- package/templates/beagle-zanzibar/skills/beagle-zanzibar/SKILL.md +10 -7
- package/templates/beagle-zanzibar/skills/beagle-zanzibar/references/pin-qr.md +52 -0
- package/templates/beagle-zanzibar/skills/beagle-zanzibar/references/post-ride.md +13 -0
- package/templates/beagle-zanzibar/skills/beagle-zanzibar/references/ride-matching.md +46 -49
- package/templates/beagle-zanzibar/skills/beagle-zanzibar/references/route-learning.md +61 -0
- package/templates/beagle-zanzibar/skills/stripe/SKILL.md +28 -0
- package/templates/beagle-zanzibar/skills/stripe/references/payment-links.md +71 -0
- package/templates/customer/agents/admin/BOOTSTRAP.md +5 -1
- package/templates/customer/agents/public/AGENTS.md +1 -2
- package/templates/real-agent/skills/buyer-feedback/SKILL.md +111 -0
- package/templates/real-agent/skills/property-enquiry/SKILL.md +126 -0
- package/templates/real-agent/skills/valuation-booking/SKILL.md +182 -0
- package/templates/real-agent/skills/vendor-updates/SKILL.md +153 -0
- package/templates/real-agent/skills/viewing-management/SKILL.md +111 -0
- package/templates/taskmaster/agents/public/AGENTS.md +1 -1
- package/templates/taskmaster/agents/public/IDENTITY.md +1 -1
- package/templates/taskmaster/agents/public/SOUL.md +2 -2
- package/dist/control-ui/assets/index-BiGN9NNG.js.map +0 -1
- package/dist/control-ui/assets/index-l54GcTyj.css +0 -1
|
@@ -1,36 +1,42 @@
|
|
|
1
1
|
# Ride Matching — Booking Flow
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
> **This is a prescribed workflow.** AGENTS.md defines the step-by-step sequence. This reference provides detail for each step. The workflow has no discretionary exit points — execute every step unless the tourist cancels or no drivers are available.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
## Capture (AGENTS.md Steps 1–3)
|
|
6
|
+
|
|
7
|
+
Required fields:
|
|
6
8
|
|
|
7
9
|
1. **Pickup location** — airport, hotel name, area
|
|
8
10
|
2. **Destination** — where they're going
|
|
9
11
|
3. **Date and time** — when they need the ride
|
|
10
12
|
4. **Passengers** — how many people
|
|
11
|
-
5. **Luggage**
|
|
12
|
-
6. **Special
|
|
13
|
+
5. **Luggage** — how many pieces, anything oversized
|
|
14
|
+
6. **Special requests** — e.g. wheelchair access
|
|
15
|
+
|
|
16
|
+
Ask naturally, not as a form. If they give everything in one message, proceed immediately.
|
|
17
|
+
|
|
18
|
+
The knowledge base check (Step 2) is informational — it gives you fare context. Whether the route is covered or not, proceed to dispatch.
|
|
13
19
|
|
|
14
|
-
|
|
20
|
+
After capturing the request, generate a job ID (BGL-XXXX) by checking `shared/bookings/` for the next available number.
|
|
15
21
|
|
|
16
|
-
|
|
22
|
+
## Dispatch Trip Request (AGENTS.md Step 4)
|
|
17
23
|
|
|
18
|
-
|
|
24
|
+
Write a dispatch file to `shared/dispatch/{job-id}-trip-request.md` via `memory_write`. The operations agent will:
|
|
19
25
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
26
|
+
1. Look up the driver roster via `contact_lookup`
|
|
27
|
+
2. Check each driver's status in memory
|
|
28
|
+
3. Select up to 3 idle drivers, preferring those with route history
|
|
29
|
+
4. Message each driver in Swahili with route details, pickup time, passengers, and job ID
|
|
30
|
+
5. Message the tourist confirming drivers have been contacted
|
|
24
31
|
|
|
25
|
-
|
|
32
|
+
You do not perform these steps directly — the dispatch file triggers them automatically.
|
|
26
33
|
|
|
27
|
-
|
|
34
|
+
After writing the dispatch, tell the tourist you're reaching out to drivers (Step 5).
|
|
28
35
|
|
|
29
|
-
|
|
36
|
+
## Present Offers (AGENTS.md Step 6)
|
|
30
37
|
|
|
31
|
-
|
|
38
|
+
When driver offers appear in your conversation (injected by the operations agent via cross-agent echo), present up to 3 competing offers. For each:
|
|
32
39
|
|
|
33
|
-
Show up to 3 competing offers. For each:
|
|
34
40
|
- **Fare** (what the tourist pays the driver)
|
|
35
41
|
- **Driver rating** (aggregate score and trip count)
|
|
36
42
|
- **Vehicle** (type, AC availability)
|
|
@@ -42,49 +48,42 @@ Frame it as a choice: "Here are your options — which works best?" Don't pressu
|
|
|
42
48
|
|
|
43
49
|
If only one driver responded, present it honestly: "One driver available for this route. Here's the offer."
|
|
44
50
|
|
|
45
|
-
##
|
|
51
|
+
## Booking Confirmation (AGENTS.md Step 7)
|
|
46
52
|
|
|
47
53
|
When the tourist chooses an offer:
|
|
54
|
+
|
|
48
55
|
1. Confirm the details: route, time, fare, vehicle
|
|
49
|
-
2.
|
|
50
|
-
3. Send the Stripe payment link
|
|
51
|
-
4. Wait for payment confirmation — do not proceed until Stripe confirms
|
|
56
|
+
2. Write a booking confirmation dispatch to `shared/dispatch/{job-id}-booking-confirm.md` via `memory_write`
|
|
52
57
|
|
|
53
|
-
|
|
58
|
+
The operations agent will then:
|
|
59
|
+
- Generate a Stripe Checkout Session with the booking fee
|
|
60
|
+
- Send the payment link directly to the tourist
|
|
61
|
+
- Record booking details in `shared/bookings/{job-id}.md`
|
|
54
62
|
|
|
55
|
-
|
|
56
|
-
- Driver name
|
|
57
|
-
- Driver phone number
|
|
58
|
-
- Vehicle description and plate number
|
|
59
|
-
- Pickup PIN (4-digit code)
|
|
60
|
-
- Explanation: "Your driver has a QR code. Scan it with your phone camera to see the PIN, or ask the driver to quote it. If it matches your PIN, you've got the right driver. Works offline — no internet needed."
|
|
63
|
+
## Payment and Post-Payment (AGENTS.md Steps 8–9)
|
|
61
64
|
|
|
62
|
-
|
|
63
|
-
- Passenger name
|
|
64
|
-
- Pickup time and location
|
|
65
|
-
- Fare confirmed
|
|
66
|
-
- QR code (encodes the tourist's PIN)
|
|
65
|
+
Payment confirmation is automatic — Stripe sends a webhook when the tourist completes payment. The operations agent processes this and:
|
|
67
66
|
|
|
68
|
-
|
|
67
|
+
1. Generates the pickup PIN and QR code
|
|
68
|
+
2. Messages the tourist with driver details and PIN
|
|
69
|
+
3. Messages the driver with passenger details and QR code
|
|
70
|
+
4. Updates the booking record
|
|
69
71
|
|
|
70
|
-
|
|
72
|
+
You will see these messages appear in your conversation via cross-agent echo. Acknowledge the details to the tourist and explain the PIN verification process.
|
|
71
73
|
|
|
72
|
-
|
|
73
|
-
2. **2 hours before** — Message the driver: `[BGL-XXXX] Pickup in 2 hours at [location]. Passenger: [name]. Please confirm.`
|
|
74
|
-
3. **30 minutes before** — Final reminder: `[BGL-XXXX] Pickup in 30 minutes at [location]. Passenger [name] is expecting you.`
|
|
74
|
+
## Driver Pickup Reminders
|
|
75
75
|
|
|
76
|
-
|
|
77
|
-
- Attempt to reach the driver again
|
|
78
|
-
- If no response, begin sourcing a replacement driver immediately
|
|
79
|
-
- Notify the tourist only when you have a confirmed replacement or have exhausted options — don't create anxiety prematurely
|
|
76
|
+
The operations agent handles driver reminders for advance bookings via its periodic heartbeat:
|
|
80
77
|
|
|
81
|
-
|
|
78
|
+
1. **Evening before** — Reminder with pickup details, request confirmation
|
|
79
|
+
2. **2 hours before** — Second reminder, request confirmation
|
|
80
|
+
3. **30 minutes before** — Final reminder
|
|
82
81
|
|
|
83
|
-
|
|
82
|
+
If a driver doesn't confirm, the operations agent escalates — attempting to reach the driver again or sourcing a replacement. The tourist is notified only when there's actionable information (confirmed replacement or exhausted options).
|
|
84
83
|
|
|
85
|
-
##
|
|
84
|
+
## Booking Record
|
|
86
85
|
|
|
87
|
-
Every confirmed booking
|
|
86
|
+
Every confirmed booking is recorded by the operations agent at `shared/bookings/{job-id}.md`. Fields:
|
|
88
87
|
|
|
89
88
|
- **Job ID** (e.g. `BGL-0042`)
|
|
90
89
|
- **Tourist** — WhatsApp ID, name if given, number of passengers
|
|
@@ -95,9 +94,7 @@ Every confirmed booking must be recorded in memory for audit. Store:
|
|
|
95
94
|
- **PIN** — the 4-digit pickup code
|
|
96
95
|
- **Status** — one of: `confirmed`, `reminded`, `picked_up`, `completed`, `cancelled`, `no_show`
|
|
97
96
|
- **Timestamps** — when each status transition occurred
|
|
98
|
-
- **Rating** — post-ride ratings (added after
|
|
99
|
-
|
|
100
|
-
Write the booking record to memory at `bookings/{job-id}.md` on confirmation. Update the record at each lifecycle event (reminder sent, pickup, completion, rating). This creates a complete audit trail per booking.
|
|
97
|
+
- **Rating** — post-ride ratings (added after feedback)
|
|
101
98
|
|
|
102
99
|
The admin agent uses these records for operational oversight — booking summaries, driver reliability tracking, and dispute resolution.
|
|
103
100
|
|
|
@@ -105,7 +102,7 @@ The admin agent uses these records for operational oversight — booking summari
|
|
|
105
102
|
|
|
106
103
|
**Tourist wants to cancel after payment:** Explain the booking fee is non-refundable (commitment device for both sides). Offer to reschedule at no extra charge.
|
|
107
104
|
|
|
108
|
-
**Driver cancels:**
|
|
105
|
+
**Driver cancels:** The operations agent handles driver communication. It will notify you (via cross-agent echo) and attempt to source a replacement. Relay the status to the tourist.
|
|
109
106
|
|
|
110
107
|
**Tourist requests a route you don't know:** Be honest. Check the knowledge base. If it's not covered, explain you can still try to negotiate but can't give a reliable fare estimate.
|
|
111
108
|
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# Route Learning — Building Driver Route Affinity
|
|
2
|
+
|
|
3
|
+
## What This Is
|
|
4
|
+
|
|
5
|
+
Route affinity is the service's accumulated understanding of which drivers tend to perform best on which routes. It is not declared upfront — it emerges from booking outcomes and ratings over time. A driver who consistently earns strong ratings on airport-to-north-coast runs becomes a stronger candidate for that route in future negotiations. A driver with a poor completion record on east coast routes gets deprioritised for those bookings, even if they quote competitively.
|
|
6
|
+
|
|
7
|
+
## Where the Data Lives
|
|
8
|
+
|
|
9
|
+
Booking records in memory (`bookings/{job-id}.md`) contain the raw data:
|
|
10
|
+
- The route (pickup → destination)
|
|
11
|
+
- Which driver completed the ride
|
|
12
|
+
- The rating received
|
|
13
|
+
- Whether the booking completed or was cancelled/no-show
|
|
14
|
+
|
|
15
|
+
Driver memory profiles (`drivers/{name}.md`) contain the aggregated view. The Route History section builds as bookings complete:
|
|
16
|
+
|
|
17
|
+
```
|
|
18
|
+
## Route History
|
|
19
|
+
- 2026-02-14: Airport → Nungwi | BGL-0018 | Rating: 4.6
|
|
20
|
+
- 2026-02-28: Airport → Stone Town | BGL-0031 | Rating: 4.1
|
|
21
|
+
- 2026-03-01: Stone Town → Paje | BGL-0037 | Rating: 4.8
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## How Affinity is Used During Driver Selection (Phase 2)
|
|
25
|
+
|
|
26
|
+
When selecting ~3 drivers to contact for a negotiation, prefer drivers whose history shows:
|
|
27
|
+
- Completed rides on this specific route (or similar routes in the same area)
|
|
28
|
+
- Consistent ratings above 4.0 on those runs
|
|
29
|
+
|
|
30
|
+
New drivers (no history) are treated neutrally — they need the opportunity to build a record. Never exclude a driver solely for lacking route history.
|
|
31
|
+
|
|
32
|
+
Do not apply affinity rigidly. A great driver with no history on a route is still a viable choice. Route history is a signal that improves selection over time, not a gatekeeping rule.
|
|
33
|
+
|
|
34
|
+
## How the Public Agent Maintains Route History
|
|
35
|
+
|
|
36
|
+
After each completed booking, the public agent adds a route entry to the driver's memory profile:
|
|
37
|
+
|
|
38
|
+
```
|
|
39
|
+
- [date]: [Pickup] → [Destination] | [job-id] | Rating: [score]
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
If the ride was cancelled, a no-show, or ended in a complaint, note it:
|
|
43
|
+
|
|
44
|
+
```
|
|
45
|
+
- [date]: Airport → Nungwi | BGL-0052 | No-show
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
These entries are the raw material the admin agent uses to identify patterns.
|
|
49
|
+
|
|
50
|
+
## Admin Agent: Periodic Route Analysis
|
|
51
|
+
|
|
52
|
+
The admin agent should periodically review route history across the driver roster and surface meaningful patterns to the operator:
|
|
53
|
+
|
|
54
|
+
- Drivers consistently rated above 4.5 on a specific route — flag as strong matches worth prioritising
|
|
55
|
+
- Drivers consistently rated below 3.5 on a specific route — recommend exclusion from that route
|
|
56
|
+
- Routes where no driver achieves strong ratings — flag as a coverage or quality gap worth investigating
|
|
57
|
+
- Drivers whose ratings vary sharply by route — worth noting (excellent on airport runs, poor on east coast, for example)
|
|
58
|
+
|
|
59
|
+
## Limits
|
|
60
|
+
|
|
61
|
+
Patterns need volume to be meaningful. A driver with two rides on a route does not have a pattern — they have a sample. Apply judgement: five or more completed rides on a route with consistent ratings is a reliable signal. Fewer than that warrants patience rather than conclusions.
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: stripe
|
|
3
|
+
description: "Generates Stripe Checkout Session payment links for Beagle booking fees, and verifies payment status before releasing driver details."
|
|
4
|
+
metadata: {"taskmaster":{"always":false,"emoji":"💳","skillKey":"stripe"}}
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Stripe — Payment Links
|
|
8
|
+
|
|
9
|
+
## Your Role
|
|
10
|
+
|
|
11
|
+
Generate a Stripe Checkout Session link for each confirmed booking and verify payment before releasing driver details to the tourist.
|
|
12
|
+
|
|
13
|
+
## When to Activate
|
|
14
|
+
|
|
15
|
+
Load this skill when the tourist has chosen an offer and the booking is ready to confirm (Phase 4 of the ride-matching flow).
|
|
16
|
+
|
|
17
|
+
## Reference Table
|
|
18
|
+
|
|
19
|
+
| Task | When | Reference |
|
|
20
|
+
|------|------|-----------|
|
|
21
|
+
| Create payment link | Tourist confirms offer, booking fee needs collecting | `references/payment-links.md` |
|
|
22
|
+
|
|
23
|
+
## Key Rules
|
|
24
|
+
|
|
25
|
+
- **Never release driver details before payment is confirmed.** Always verify the Stripe session status before proceeding to Phase 5.
|
|
26
|
+
- **Minimum fee is $2, maximum is $5.** Calculate as 5% of the agreed fare, clamped to this range.
|
|
27
|
+
- **Each booking gets its own Checkout Session.** Never reuse a payment link between bookings.
|
|
28
|
+
- **Test mode is fine to start.** Use `sk_test_...` keys during setup. Switch to live keys when real bookings begin.
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# Stripe Payment Links — Checkout Session Creation
|
|
2
|
+
|
|
3
|
+
## Booking Fee Calculation
|
|
4
|
+
|
|
5
|
+
The tourist pays a booking fee to confirm their ride:
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
fee = max($2, min($5, fare × 0.05))
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
In cents (Stripe uses the smallest currency unit):
|
|
12
|
+
|
|
13
|
+
```
|
|
14
|
+
fee_cents = max(200, min(500, round(fare_usd × 5)))
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
Examples: $20 fare → $2.00 fee | $50 fare → $2.50 fee | $100 fare → $5.00 fee
|
|
18
|
+
|
|
19
|
+
## Creating a Checkout Session
|
|
20
|
+
|
|
21
|
+
Call the Stripe Checkout Sessions API:
|
|
22
|
+
|
|
23
|
+
```
|
|
24
|
+
POST https://api.stripe.com/v1/checkout/sessions
|
|
25
|
+
Authorization: Bearer {stripe_secret_key}
|
|
26
|
+
Content-Type: application/x-www-form-urlencoded
|
|
27
|
+
|
|
28
|
+
mode=payment
|
|
29
|
+
payment_method_types[]=card
|
|
30
|
+
line_items[0][price_data][currency]=usd
|
|
31
|
+
line_items[0][price_data][unit_amount]={fee_cents}
|
|
32
|
+
line_items[0][price_data][product_data][name]=Beagle booking fee — {job_id}
|
|
33
|
+
line_items[0][price_data][product_data][description]={route} on {date}
|
|
34
|
+
line_items[0][quantity]=1
|
|
35
|
+
metadata[booking_id]={job_id}
|
|
36
|
+
metadata[tourist_phone]={tourist_phone}
|
|
37
|
+
metadata[negotiated_fare]={fare_usd}
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
The Stripe secret key is the `stripe` key stored in your API key config (`sk_test_...` for test mode, `sk_live_...` for production).
|
|
41
|
+
|
|
42
|
+
The response includes a `url` field — this is the hosted checkout page to send the tourist.
|
|
43
|
+
|
|
44
|
+
## Sending the Link
|
|
45
|
+
|
|
46
|
+
Send the tourist the checkout URL with context:
|
|
47
|
+
|
|
48
|
+
> "To confirm your booking, pay the $[fee] booking fee here: [url]
|
|
49
|
+
> This locks in your ride. You pay $[fare] directly to your driver at the end of the journey."
|
|
50
|
+
|
|
51
|
+
## Verifying Payment
|
|
52
|
+
|
|
53
|
+
Before releasing driver details (Phase 5), verify the session is paid:
|
|
54
|
+
|
|
55
|
+
```
|
|
56
|
+
GET https://api.stripe.com/v1/checkout/sessions/{session_id}
|
|
57
|
+
Authorization: Bearer {stripe_secret_key}
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
Check `payment_status == "paid"`. If not yet paid, wait for the tourist to say they've paid — then verify. Do not take their word alone; always confirm with the API before proceeding.
|
|
61
|
+
|
|
62
|
+
## What to Store in the Booking Record
|
|
63
|
+
|
|
64
|
+
Add these fields to `bookings/{job-id}.md` when the session is created and confirmed:
|
|
65
|
+
|
|
66
|
+
```
|
|
67
|
+
stripe_session_id: cs_...
|
|
68
|
+
booking_fee_usd: 2.50
|
|
69
|
+
payment_status: pending → paid (update when confirmed)
|
|
70
|
+
paid_at: [timestamp from session]
|
|
71
|
+
```
|
|
@@ -21,6 +21,7 @@ Ask conversationally, one thing at a time:
|
|
|
21
21
|
- **Location**
|
|
22
22
|
- **Working hours**
|
|
23
23
|
- **Website** (if they have one)
|
|
24
|
+
- **Sales orientation** — Ask: "Would you like your assistant to actively help close enquiries — for example, suggesting next steps, offering to book, or nudging undecided customers? Or should it just handle questions and take messages?" This determines whether the public agent proactively guides customers toward commitment or stays in a passive enquiry-handling role.
|
|
24
25
|
|
|
25
26
|
## Step 4: Save Everything
|
|
26
27
|
|
|
@@ -39,7 +40,10 @@ Use your `write` tool to update workspace files and `memory_write` for memory fi
|
|
|
39
40
|
**Website summary** (if a website was provided):
|
|
40
41
|
5. **`memory/public/website.md`** — Use `document_read` to fetch the website, then `memory_write` to save a comprehensive summary covering: what the business does, services offered, pricing (if public), location and coverage area, contact details, opening hours, and any other customer-relevant information. This becomes a key knowledge source for the public agent when answering customer enquiries.
|
|
41
42
|
|
|
42
|
-
|
|
43
|
+
**Public agent personality** (only if sales orientation was chosen):
|
|
44
|
+
6. **`../public/SOUL.md`** — The default personality is a passive front desk that takes messages and answers questions. If the owner chose sales mode, use `read` to load the current file, then `write` to make the public agent purposeful about closing. The core change: the agent should view guiding customers toward the next step (booking, signing up, committing) as part of being genuinely helpful — not as being pushy. Update the tagline to include "purposeful", add to the core truths that asking for commitment is part of being helpful, and add "guide interested customers toward booking or next steps" to the capabilities list. Do not remove existing content — augment it.
|
|
45
|
+
|
|
46
|
+
All other files (AGENTS.md, etc.) are already generic and reference USER.md or shared memory — no changes needed.
|
|
43
47
|
|
|
44
48
|
## Step 5: Authorize Admin Devices
|
|
45
49
|
|
|
@@ -157,11 +157,10 @@ When something needs the business owner's direct attention:
|
|
|
157
157
|
- The business owner will get back to them
|
|
158
158
|
|
|
159
159
|
Escalate when:
|
|
160
|
-
- Questions you can't answer
|
|
160
|
+
- Questions you can't answer from memory or product knowledge
|
|
161
161
|
- Pricing negotiations or custom requests
|
|
162
162
|
- Complaints
|
|
163
163
|
- Urgent or emergency requests
|
|
164
|
-
- Anything you're uncertain about
|
|
165
164
|
|
|
166
165
|
---
|
|
167
166
|
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: buyer-feedback
|
|
3
|
+
description: Collect structured post-viewing feedback from property buyers via WhatsApp. Sends a conversational feedback request after viewings, captures sentiment, interest level, objections, and next steps. Stores feedback per-property and per-buyer for vendor reporting.
|
|
4
|
+
emoji: 🏠
|
|
5
|
+
always: false
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Buyer Feedback Collection
|
|
9
|
+
|
|
10
|
+
Collect post-viewing feedback from buyers in a natural, conversational way via WhatsApp. This is NOT a form — it's a friendly check-in that captures structured data.
|
|
11
|
+
|
|
12
|
+
## When to Trigger
|
|
13
|
+
|
|
14
|
+
This skill applies when:
|
|
15
|
+
- The agent (or a scheduled event) initiates a post-viewing feedback request
|
|
16
|
+
- A buyer messages after a viewing with unsolicited feedback
|
|
17
|
+
- The business owner asks you to collect feedback on a specific viewing
|
|
18
|
+
|
|
19
|
+
## Feedback Flow
|
|
20
|
+
|
|
21
|
+
### Step 1: Opening
|
|
22
|
+
|
|
23
|
+
Send a warm, brief message referencing the specific property and viewing date. Keep it personal — use the buyer's first name and the property address.
|
|
24
|
+
|
|
25
|
+
Example:
|
|
26
|
+
> Hi [Name]! Hope you're well. Just wanted to check in after your viewing at [Address] on [Date]. How did you find it? 😊
|
|
27
|
+
|
|
28
|
+
### Step 2: Capture Key Data Points
|
|
29
|
+
|
|
30
|
+
Through natural conversation (NOT a bullet list of questions), gather:
|
|
31
|
+
|
|
32
|
+
1. **Overall impression** — Did they like the property? First reaction.
|
|
33
|
+
2. **Interest level** — Are they considering making an offer? Scale: Hot / Warm / Cool / Not interested
|
|
34
|
+
3. **Positives** — What did they like most?
|
|
35
|
+
4. **Concerns/objections** — What put them off or gave them pause? (Price, condition, location, size, layout, parking, garden, neighbours, noise, etc.)
|
|
36
|
+
5. **Comparison** — How does it compare to others they've seen?
|
|
37
|
+
6. **Next steps** — Would they like a second viewing? Are they ready to make an offer? Need more information?
|
|
38
|
+
7. **Price perception** — Do they think it's fairly priced? (Don't ask directly — infer from conversation or ask tactfully: "How did you feel about the asking price?")
|
|
39
|
+
|
|
40
|
+
### Step 3: Follow-up Questions
|
|
41
|
+
|
|
42
|
+
Based on their responses, ask ONE follow-up at a time. Don't fire multiple questions. Match their energy — if they're brief, be brief. If they're chatty, engage.
|
|
43
|
+
|
|
44
|
+
If they express interest:
|
|
45
|
+
- "Would you like to book a second viewing?"
|
|
46
|
+
- "Is there anything else you'd like to know about the property?"
|
|
47
|
+
|
|
48
|
+
If they have concerns:
|
|
49
|
+
- Acknowledge the concern genuinely
|
|
50
|
+
- Offer context if you have it (e.g. "The vendor is open to offers" or "There's planning permission for an extension")
|
|
51
|
+
- Don't be pushy — respect their assessment
|
|
52
|
+
|
|
53
|
+
If not interested:
|
|
54
|
+
- Thank them warmly
|
|
55
|
+
- Ask what they ARE looking for (captures buyer criteria for future matching)
|
|
56
|
+
|
|
57
|
+
### Step 4: Store Feedback
|
|
58
|
+
|
|
59
|
+
After the conversation, save structured feedback to TWO locations:
|
|
60
|
+
|
|
61
|
+
**Property file** — `memory/shared/properties/[property-slug]/feedback/[date]-[buyer-name].md`
|
|
62
|
+
**Buyer profile** — `memory/users/[phone]/viewings/[date]-[property-slug].md`
|
|
63
|
+
|
|
64
|
+
Use this template:
|
|
65
|
+
|
|
66
|
+
```markdown
|
|
67
|
+
# Viewing Feedback
|
|
68
|
+
|
|
69
|
+
- **Property:** [Full address]
|
|
70
|
+
- **Date:** [Viewing date]
|
|
71
|
+
- **Buyer:** [Name] ([Phone])
|
|
72
|
+
- **Agent present:** [Name if known]
|
|
73
|
+
|
|
74
|
+
## Feedback
|
|
75
|
+
|
|
76
|
+
- **Overall impression:** [Their words / summary]
|
|
77
|
+
- **Interest level:** [Hot / Warm / Cool / Not interested]
|
|
78
|
+
- **Positives:** [What they liked]
|
|
79
|
+
- **Concerns:** [What they didn't like or worried about]
|
|
80
|
+
- **Price perception:** [Fair / Too high / Bargain / Not discussed]
|
|
81
|
+
- **Comparison:** [How it ranked vs other properties]
|
|
82
|
+
- **Next steps:** [Second viewing / Offer / Thinking / Declined]
|
|
83
|
+
|
|
84
|
+
## Quotes
|
|
85
|
+
> [Any notable direct quotes from the buyer]
|
|
86
|
+
|
|
87
|
+
## Notes
|
|
88
|
+
[Any additional context — body language cues mentioned, timing factors, chain status, etc.]
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
## Vendor Reporting
|
|
92
|
+
|
|
93
|
+
When the business owner or agent asks for a viewing feedback summary for a property:
|
|
94
|
+
|
|
95
|
+
1. Read all feedback files from `memory/shared/properties/[property-slug]/feedback/`
|
|
96
|
+
2. Compile a summary showing:
|
|
97
|
+
- Total viewings to date
|
|
98
|
+
- Interest breakdown (Hot/Warm/Cool/Not interested)
|
|
99
|
+
- Common positives (themes across multiple viewers)
|
|
100
|
+
- Common objections (recurring concerns)
|
|
101
|
+
- Price perception trend
|
|
102
|
+
- Actionable recommendations (e.g. "3 of 5 viewers mentioned the dated kitchen — consider adjusting marketing to acknowledge renovation potential")
|
|
103
|
+
|
|
104
|
+
## Rules
|
|
105
|
+
|
|
106
|
+
- **Never fabricate feedback.** Only report what buyers actually said.
|
|
107
|
+
- **Never share one buyer's feedback with another buyer.** Feedback goes to the vendor/agent only.
|
|
108
|
+
- **Be genuinely conversational.** Buyers who feel interrogated give shallow answers. Buyers who feel heard give honest ones.
|
|
109
|
+
- **Respect "no."** If a buyer doesn't want to give feedback, thank them and move on. Don't chase.
|
|
110
|
+
- **Timing matters.** Best results come 2-24 hours after the viewing. Same day is ideal. After 48 hours, response rates drop sharply.
|
|
111
|
+
- **One message at a time.** Never send a wall of questions. This is a conversation, not a survey.
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: property-enquiry
|
|
3
|
+
description: Structured intake for new buyer enquiries. Captures requirements, financial position, chain status, and timeline to enable property matching and prioritisation.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Property Enquiry
|
|
7
|
+
|
|
8
|
+
You handle initial buyer contact — capturing everything the agent needs to qualify them and match properties effectively.
|
|
9
|
+
|
|
10
|
+
## When This Skill Applies
|
|
11
|
+
|
|
12
|
+
- A new buyer contacts about a specific property
|
|
13
|
+
- A buyer registers interest without a specific property in mind
|
|
14
|
+
- A buyer's requirements or circumstances change and need updating
|
|
15
|
+
|
|
16
|
+
## Initial Enquiry — Specific Property
|
|
17
|
+
|
|
18
|
+
When someone contacts about a listed property:
|
|
19
|
+
|
|
20
|
+
1. **Acknowledge warmly** — confirm the property they're asking about
|
|
21
|
+
2. **Answer their immediate question first** — price, availability, key details. Don't interrogate before helping.
|
|
22
|
+
3. **Then gather qualification info** conversationally (not as a form):
|
|
23
|
+
|
|
24
|
+
### Must-Have Information
|
|
25
|
+
- **Full name**
|
|
26
|
+
- **Phone number** (if not already known)
|
|
27
|
+
- **Email** (for property details/brochures)
|
|
28
|
+
- **Current situation:** First-time buyer / homeowner selling / renting / investor / cash buyer
|
|
29
|
+
- **Chain status:** If selling, is their property on the market? Under offer? Sold subject to contract?
|
|
30
|
+
- **Budget:** What's their upper limit? Is this based on an Agreement in Principle (AIP)?
|
|
31
|
+
- **Mortgage:** Do they have an AIP? With which lender? (If not, suggest they get one)
|
|
32
|
+
- **Timeline:** When do they need/want to move?
|
|
33
|
+
|
|
34
|
+
### Nice-to-Have Information
|
|
35
|
+
- **Property requirements:** Beds, bathrooms, garden, parking, specific features
|
|
36
|
+
- **Area preferences:** Which towns/villages, school catchments, commute considerations
|
|
37
|
+
- **Deal-breakers:** What would rule a property out?
|
|
38
|
+
- **Other agents:** Are they registered with other agents in the area?
|
|
39
|
+
|
|
40
|
+
4. **Create/update buyer profile** at `memory/users/{phone}/profile.md` with all captured info
|
|
41
|
+
5. **Offer next steps:**
|
|
42
|
+
- Book a viewing if appropriate
|
|
43
|
+
- Send property details/brochure
|
|
44
|
+
- Suggest similar properties if this one doesn't match perfectly
|
|
45
|
+
- Recommend mortgage advisor if no AIP
|
|
46
|
+
|
|
47
|
+
## General Registration (No Specific Property)
|
|
48
|
+
|
|
49
|
+
When a buyer wants to register without a specific listing:
|
|
50
|
+
|
|
51
|
+
1. Capture the same qualification info above
|
|
52
|
+
2. Focus more on **requirements and preferences** since there's no anchor property
|
|
53
|
+
3. Save profile and confirm you'll notify them of matching properties
|
|
54
|
+
4. If any current listings match, suggest them immediately
|
|
55
|
+
|
|
56
|
+
## Buyer Profile Format
|
|
57
|
+
|
|
58
|
+
```markdown
|
|
59
|
+
---
|
|
60
|
+
type: buyer
|
|
61
|
+
status: active
|
|
62
|
+
registered: YYYY-MM-DD
|
|
63
|
+
last_contact: YYYY-MM-DD
|
|
64
|
+
qualified: true/false
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
# Buyer Profile — [Name]
|
|
68
|
+
|
|
69
|
+
**Phone:** [Number]
|
|
70
|
+
**Email:** [Email]
|
|
71
|
+
|
|
72
|
+
## Financial Position
|
|
73
|
+
- **Budget:** [Amount]
|
|
74
|
+
- **AIP:** [Yes/No — Lender, amount, expiry if known]
|
|
75
|
+
- **Buyer type:** [First-time / Selling / Cash / Investor]
|
|
76
|
+
- **Chain:** [Details of their chain position]
|
|
77
|
+
- **Deposit:** [If known]
|
|
78
|
+
|
|
79
|
+
## Requirements
|
|
80
|
+
- **Bedrooms:** [Min]
|
|
81
|
+
- **Bathrooms:** [Min]
|
|
82
|
+
- **Property type:** [House / flat / bungalow / any]
|
|
83
|
+
- **Areas:** [Preferred locations]
|
|
84
|
+
- **Must-haves:** [Garden, parking, garage, etc.]
|
|
85
|
+
- **Deal-breakers:** [What they won't accept]
|
|
86
|
+
- **School catchments:** [If relevant]
|
|
87
|
+
|
|
88
|
+
## Timeline
|
|
89
|
+
- **When to move:** [Date or timeframe]
|
|
90
|
+
- **Urgency:** [High / Medium / Low]
|
|
91
|
+
- **Chain dependent:** [Yes/No]
|
|
92
|
+
|
|
93
|
+
## Properties Viewed
|
|
94
|
+
- [Date] — [Address] — [Outcome / Feedback]
|
|
95
|
+
|
|
96
|
+
## Notes
|
|
97
|
+
[Agent observations, communication preferences, etc.]
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
## Qualification Rules
|
|
101
|
+
|
|
102
|
+
A buyer is **qualified** when you have:
|
|
103
|
+
- ✅ Name + contact details
|
|
104
|
+
- ✅ Budget confirmed (ideally with AIP)
|
|
105
|
+
- ✅ Chain status understood
|
|
106
|
+
- ✅ Timeline established
|
|
107
|
+
|
|
108
|
+
A buyer is **unqualified** until these are captured. Unqualified buyers can still view properties, but the agent should be informed of their status.
|
|
109
|
+
|
|
110
|
+
## Prioritisation
|
|
111
|
+
|
|
112
|
+
Flag high-priority buyers to the agent:
|
|
113
|
+
- **Cash buyers** — no chain, fast completion
|
|
114
|
+
- **First-time buyers with AIP** — no chain below them
|
|
115
|
+
- **Buyers under offer on their own property** — chain progressing
|
|
116
|
+
- **Investors** — often fast, but check funding source
|
|
117
|
+
|
|
118
|
+
## Privacy Rules
|
|
119
|
+
|
|
120
|
+
- Financial details are **confidential** — never share one buyer's budget or position with another buyer
|
|
121
|
+
- Mortgage details stay in the buyer's profile only
|
|
122
|
+
- If a vendor asks about a buyer's position, share only what the buyer has consented to (typically: qualified/unqualified, chain-free or not, mortgage arranged)
|
|
123
|
+
|
|
124
|
+
## Matching
|
|
125
|
+
|
|
126
|
+
When new properties come to market, check active buyer profiles for matches. Proactively notify buyers whose criteria match within 24 hours of a new instruction.
|