@rubytech/create-maxy-code 0.1.29 → 0.1.30
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/__tests__/init-logging.test.js +85 -0
- package/dist/index.js +21 -10
- package/dist/init-logging.js +28 -0
- package/package.json +1 -1
- package/payload/platform/plugins/admin/.claude-plugin/plugin.json +1 -1
- package/payload/platform/plugins/admin/PLUGIN.md +1 -1
- package/payload/platform/plugins/admin/hooks/onboarding-skill-drift.sh +56 -54
- package/payload/platform/plugins/admin/references/contextual-ui.md +4 -2
- package/payload/platform/plugins/admin/skills/file-presentation/SKILL.md +16 -33
- package/payload/platform/plugins/admin/skills/plugin-management/SKILL.md +1 -1
- package/payload/platform/plugins/admin/skills/public-agent-manager/SKILL.md +1 -1
- package/payload/platform/plugins/brochures/PLUGIN.md +1 -1
- package/payload/platform/plugins/buyers/PLUGIN.md +1 -2
- package/payload/platform/plugins/deep-research/skills/book-mirror/SKILL.md +1 -1
- package/payload/platform/plugins/deep-research/skills/strategic-reading/SKILL.md +1 -1
- package/payload/platform/plugins/docs/references/plugins-guide.md +2 -2
- package/payload/platform/plugins/estate-business/PLUGIN.md +1 -2
- package/payload/platform/plugins/estate-coaching/PLUGIN.md +1 -2
- package/payload/platform/plugins/estate-onboarding/PLUGIN.md +1 -2
- package/payload/platform/plugins/estate-sales/PLUGIN.md +1 -2
- package/payload/platform/plugins/estate-teaching/PLUGIN.md +1 -2
- package/payload/platform/plugins/leads/PLUGIN.md +1 -2
- package/payload/platform/plugins/listings/PLUGIN.md +1 -2
- package/payload/platform/plugins/loop/PLUGIN.md +1 -1
- package/payload/platform/plugins/scheduling/PLUGIN.md +1 -1
- package/payload/platform/plugins/vendors/PLUGIN.md +1 -2
- package/payload/premium-plugins/real-agent/BUNDLE.md +5 -5
- package/payload/premium-plugins/real-agent/agents/compliance.md +1 -1
- package/payload/premium-plugins/real-agent/agents/negotiator.md +1 -1
- package/payload/premium-plugins/real-agent/agents/valuer.md +1 -1
- package/payload/premium-plugins/real-agent/plugins/brochures/PLUGIN.md +1 -1
- package/payload/premium-plugins/real-agent/plugins/buyers/PLUGIN.md +1 -2
- package/payload/premium-plugins/real-agent/plugins/estate-business/PLUGIN.md +1 -2
- package/payload/premium-plugins/real-agent/plugins/estate-coaching/PLUGIN.md +1 -2
- package/payload/premium-plugins/real-agent/plugins/estate-onboarding/PLUGIN.md +1 -2
- package/payload/premium-plugins/real-agent/plugins/estate-sales/PLUGIN.md +1 -2
- package/payload/premium-plugins/real-agent/plugins/estate-teaching/PLUGIN.md +1 -2
- package/payload/premium-plugins/real-agent/plugins/leads/PLUGIN.md +1 -2
- package/payload/premium-plugins/real-agent/plugins/listings/PLUGIN.md +1 -2
- package/payload/premium-plugins/real-agent/plugins/loop/PLUGIN.md +1 -1
- package/payload/premium-plugins/real-agent/plugins/vendors/PLUGIN.md +1 -2
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
// Coverage for runInitLogging's success and failure branches via injected
|
|
2
|
+
// fs / stderr / exit impls. Task 062 (maxy-code).
|
|
3
|
+
//
|
|
4
|
+
// Brief asked for vitest. Codebase convention is node:test (matches
|
|
5
|
+
// apt-resolve.test.ts, peer-brand-detect.test.ts, etc); the package has no
|
|
6
|
+
// vitest dep and the test runner stanza in package.json invokes
|
|
7
|
+
// `node --test 'dist/__tests__/*.test.js'`.
|
|
8
|
+
import test from "node:test";
|
|
9
|
+
import assert from "node:assert/strict";
|
|
10
|
+
import { runInitLogging } from "../init-logging.js";
|
|
11
|
+
const LOG_DIR = "/tmp/test-task-062-logs";
|
|
12
|
+
const LOG_FILE = "/tmp/test-task-062-logs/install-2026-01-01T00-00-00-000Z.log";
|
|
13
|
+
const PERSIST_DIR = "/tmp/test-task-062-persist";
|
|
14
|
+
test("success path: header written via injected impls, no stderr, no exit", () => {
|
|
15
|
+
const appendCalls = [];
|
|
16
|
+
let stderrOut = "";
|
|
17
|
+
let exitCode = null;
|
|
18
|
+
runInitLogging({
|
|
19
|
+
logDir: LOG_DIR,
|
|
20
|
+
logFile: LOG_FILE,
|
|
21
|
+
persistDir: PERSIST_DIR,
|
|
22
|
+
headerLines: ["", "===", " Maxy Code Install Log", "==="],
|
|
23
|
+
mkdirSyncImpl: () => { },
|
|
24
|
+
appendFileSyncImpl: (p, d) => { appendCalls.push([p, d]); },
|
|
25
|
+
stderrWriteImpl: (c) => { stderrOut += c; },
|
|
26
|
+
exitImpl: (c) => { exitCode = c; },
|
|
27
|
+
});
|
|
28
|
+
assert.equal(appendCalls.length, 1);
|
|
29
|
+
assert.equal(appendCalls[0][0], LOG_FILE);
|
|
30
|
+
assert.equal(appendCalls[0][1], "\n===\n Maxy Code Install Log\n===\n");
|
|
31
|
+
assert.equal(stderrOut, "");
|
|
32
|
+
assert.equal(exitCode, null);
|
|
33
|
+
});
|
|
34
|
+
test("failure path: appendFileSync throws → stderr emits FAILED line, exit(1) called", () => {
|
|
35
|
+
let stderrOut = "";
|
|
36
|
+
let exitCode = null;
|
|
37
|
+
runInitLogging({
|
|
38
|
+
logDir: LOG_DIR,
|
|
39
|
+
logFile: LOG_FILE,
|
|
40
|
+
persistDir: PERSIST_DIR,
|
|
41
|
+
headerLines: ["a"],
|
|
42
|
+
mkdirSyncImpl: () => { },
|
|
43
|
+
appendFileSyncImpl: () => { throw new Error("EACCES: permission denied"); },
|
|
44
|
+
stderrWriteImpl: (c) => { stderrOut += c; },
|
|
45
|
+
exitImpl: (c) => { exitCode = c; },
|
|
46
|
+
});
|
|
47
|
+
assert.ok(stderrOut.includes("[create-maxy] init-logging FAILED reason=EACCES"), `stderr should contain init-logging FAILED line; got: ${JSON.stringify(stderrOut)}`);
|
|
48
|
+
assert.ok(stderrOut.includes(`log=${LOG_FILE}`));
|
|
49
|
+
assert.ok(stderrOut.includes(`persist=${PERSIST_DIR}`));
|
|
50
|
+
assert.equal(exitCode, 1);
|
|
51
|
+
});
|
|
52
|
+
test("failure path: mkdirSync throws → stderr emits FAILED line, exit(1) called", () => {
|
|
53
|
+
let stderrOut = "";
|
|
54
|
+
let exitCode = null;
|
|
55
|
+
let appendCalled = false;
|
|
56
|
+
runInitLogging({
|
|
57
|
+
logDir: LOG_DIR,
|
|
58
|
+
logFile: LOG_FILE,
|
|
59
|
+
persistDir: PERSIST_DIR,
|
|
60
|
+
headerLines: ["a"],
|
|
61
|
+
mkdirSyncImpl: () => { throw new Error("EROFS: read-only file system"); },
|
|
62
|
+
appendFileSyncImpl: () => { appendCalled = true; },
|
|
63
|
+
stderrWriteImpl: (c) => { stderrOut += c; },
|
|
64
|
+
exitImpl: (c) => { exitCode = c; },
|
|
65
|
+
});
|
|
66
|
+
assert.equal(appendCalled, false, "appendFileSync must not be invoked when mkdirSync throws");
|
|
67
|
+
assert.ok(stderrOut.includes("[create-maxy] init-logging FAILED reason=EROFS"));
|
|
68
|
+
assert.equal(exitCode, 1);
|
|
69
|
+
});
|
|
70
|
+
test("failure path: non-Error thrown value still surfaces as reason", () => {
|
|
71
|
+
let stderrOut = "";
|
|
72
|
+
let exitCode = null;
|
|
73
|
+
runInitLogging({
|
|
74
|
+
logDir: LOG_DIR,
|
|
75
|
+
logFile: LOG_FILE,
|
|
76
|
+
persistDir: PERSIST_DIR,
|
|
77
|
+
headerLines: ["a"],
|
|
78
|
+
mkdirSyncImpl: () => { },
|
|
79
|
+
appendFileSyncImpl: () => { throw "raw-string"; },
|
|
80
|
+
stderrWriteImpl: (c) => { stderrOut += c; },
|
|
81
|
+
exitImpl: (c) => { exitCode = c; },
|
|
82
|
+
});
|
|
83
|
+
assert.ok(stderrOut.includes("reason=raw-string"));
|
|
84
|
+
assert.equal(exitCode, 1);
|
|
85
|
+
});
|
package/dist/index.js
CHANGED
|
@@ -7,6 +7,7 @@ import { resolveInstallPortFromFs, buildMaxyUnitFile, buildClaudeSessionManagerU
|
|
|
7
7
|
import { classifyOnboardingReadBack } from "./onboarding-readback.js";
|
|
8
8
|
import { parseOsRelease, isUbuntuLike as isUbuntuLikePure, parseAptCacheCandidate, decideAptResolution, } from "./apt-resolve.js";
|
|
9
9
|
import { findPeerBrandOnDefaultNeo4jPort } from "./peer-brand-detect.js";
|
|
10
|
+
import { runInitLogging } from "./init-logging.js";
|
|
10
11
|
import { requireSupportedPlatform } from "./platform-detect.js";
|
|
11
12
|
import { renderPlist } from "./launchd-plist.js";
|
|
12
13
|
import { installAllBrewPackages } from "./brew-install.js";
|
|
@@ -82,15 +83,19 @@ const NPM_NET_FLAGS = [
|
|
|
82
83
|
// Logging — timestamped to console AND persistent log file
|
|
83
84
|
// ---------------------------------------------------------------------------
|
|
84
85
|
function initLogging() {
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
86
|
+
runInitLogging({
|
|
87
|
+
logDir: LOG_DIR,
|
|
88
|
+
logFile: LOG_FILE,
|
|
89
|
+
persistDir: PERSIST_DIR,
|
|
90
|
+
headerLines: [
|
|
91
|
+
"",
|
|
92
|
+
"=".repeat(64),
|
|
93
|
+
` ${BRAND.productName} Install Log — ${new Date().toISOString()}`,
|
|
94
|
+
` Node ${process.version} | ${process.platform} ${process.arch}`,
|
|
95
|
+
"=".repeat(64),
|
|
96
|
+
"",
|
|
97
|
+
],
|
|
98
|
+
});
|
|
94
99
|
}
|
|
95
100
|
function logFile(msg) {
|
|
96
101
|
try {
|
|
@@ -3596,8 +3601,14 @@ if (PLATFORM === "darwin") {
|
|
|
3596
3601
|
const PLATFORM_HEADER = `[create-maxy] platform=${PLATFORM} arch=${process.arch}` +
|
|
3597
3602
|
(MACOS_VERSION ? ` macos=${MACOS_VERSION}` : ``) +
|
|
3598
3603
|
` version=${PKG_VERSION}`;
|
|
3599
|
-
|
|
3604
|
+
// Task 062 — emit platform header and the resolved log/persist paths to
|
|
3605
|
+
// stdout BEFORE the log file is opened. If initLogging's mkdir or first
|
|
3606
|
+
// appendFileSync throws, the operator still sees brand/version/arch and the
|
|
3607
|
+
// exact path the log file SHOULD live at, instead of a silent exit between
|
|
3608
|
+
// the LOG_DIR mkdir and the first log write.
|
|
3600
3609
|
console.log(PLATFORM_HEADER);
|
|
3610
|
+
console.log(`[create-maxy] log=${LOG_FILE} persist=${PERSIST_DIR}`);
|
|
3611
|
+
initLogging();
|
|
3601
3612
|
console.log("================================================================");
|
|
3602
3613
|
console.log(` ${BRAND.productName} — ${BRAND.tagline}. (${BRAND.hostname} v${PKG_VERSION})`);
|
|
3603
3614
|
console.log("================================================================");
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
// Installer log-file initialization with diagnostic stderr emission on
|
|
2
|
+
// failure. Extracted from index.ts so the failure path can be covered by
|
|
3
|
+
// node:test without bringing in the rest of the installer's import-time side
|
|
4
|
+
// effects.
|
|
5
|
+
//
|
|
6
|
+
// Task 062 (maxy-code) — operator-observed silent exit between
|
|
7
|
+
// `mkdirSync(LOG_DIR)` and the first `appendFileSync(LOG_FILE, header)`.
|
|
8
|
+
// Both writes are guarded inside the same try/catch; a failure emits a
|
|
9
|
+
// literal `[create-maxy] init-logging FAILED reason=<msg> log=<path>
|
|
10
|
+
// persist=<path>` line to stderr and exits 1 so the operator always has a
|
|
11
|
+
// forensic surface regardless of whether the log file ever opened.
|
|
12
|
+
import { mkdirSync as realMkdirSync, appendFileSync as realAppendFileSync, } from "node:fs";
|
|
13
|
+
export function runInitLogging(opts) {
|
|
14
|
+
const mkdir = opts.mkdirSyncImpl ?? ((p, o) => { realMkdirSync(p, o); });
|
|
15
|
+
const append = opts.appendFileSyncImpl ?? ((p, d) => { realAppendFileSync(p, d); });
|
|
16
|
+
const stderr = opts.stderrWriteImpl ?? ((c) => { process.stderr.write(c); });
|
|
17
|
+
const exit = opts.exitImpl ?? ((c) => { process.exit(c); });
|
|
18
|
+
try {
|
|
19
|
+
mkdir(opts.logDir, { recursive: true });
|
|
20
|
+
append(opts.logFile, opts.headerLines.join("\n") + "\n");
|
|
21
|
+
}
|
|
22
|
+
catch (err) {
|
|
23
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
24
|
+
stderr(`[create-maxy] init-logging FAILED reason=${msg} log=${opts.logFile} persist=${opts.persistDir}\n`);
|
|
25
|
+
exit(1);
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "admin",
|
|
3
|
-
"description": "Platform administration plugin. Provides system-status, public-hostname (deterministic Cloudflare public-URL resolver
|
|
3
|
+
"description": "Platform administration plugin. Provides system-status, public-hostname (deterministic Cloudflare public-URL resolver, single call returning the operator's canonical hostname so agents never guess property names on :CloudflareHostname nodes), brand-settings, account-manage, account-update, admin-add, admin-remove, admin-list, admin-update-pin, agent-list, agent-config-read, logs-read, plugin-read, skill-load (one-call resolve+read for SKILL.md by skill name, the canonical primitive for loading a named skill; plugin-read remains the reader for references/* and PLUGIN.md), store-skill (deterministic write counterpart to plugin-read; persists operator-authored skills as plugin files under the active account), session-reset, session-resume, file-attach, wifi, and action-approval tools (action-pending, action-approve, action-reject, action-edit) for managing the Maxy platform. The `render-component` MCP tool is also registered but is exposed to the public agent surface only (Anthropic API runtime); the admin agent on native Claude Code does not call it.",
|
|
4
4
|
"version": "0.1.0",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Rubytech LLC"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: admin
|
|
3
|
-
description: "Platform administration plugin. Provides system-status, public-hostname (deterministic Cloudflare public-URL resolver
|
|
3
|
+
description: "Platform administration plugin. Provides system-status, public-hostname (deterministic Cloudflare public-URL resolver, single call returning the operator's canonical hostname so agents never guess property names on :CloudflareHostname nodes), brand-settings, account-manage, account-update, admin-add, admin-remove, admin-list, admin-update-pin, agent-list, agent-config-read, logs-read, plugin-read, skill-load (one-call resolve+read for SKILL.md by skill name, the canonical primitive for loading a named skill; plugin-read remains the reader for references/* and PLUGIN.md), store-skill (deterministic write counterpart to plugin-read; persists operator-authored skills as plugin files under the active account), session-reset, session-resume, file-attach, wifi, and action-approval tools (action-pending, action-approve, action-reject, action-edit) for managing the Maxy platform. The `render-component` MCP tool is also registered but is exposed to the public agent surface only (Anthropic API runtime); the admin agent on native Claude Code does not call it."
|
|
4
4
|
tools:
|
|
5
5
|
- name: system-status
|
|
6
6
|
publicAllowlist: false
|
|
@@ -1,100 +1,102 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
|
-
# Task
|
|
3
|
-
#
|
|
4
|
-
#
|
|
5
|
-
#
|
|
2
|
+
# Task 063 / Task 049. Stop-event hook that flags admin agent onboarding
|
|
3
|
+
# drift on the native Claude Code (PTY) surface. Post-Task-049 there is no
|
|
4
|
+
# `render-component` tool, so the contract is no longer "called render-component";
|
|
5
|
+
# it is "the assistant ends its turn on a prompt the operator can answer".
|
|
6
6
|
#
|
|
7
7
|
# Behaviour:
|
|
8
|
-
# 1. Read
|
|
8
|
+
# 1. Read transcript_path from the Stop event JSON on stdin.
|
|
9
9
|
# 2. Walk the JSONL backwards. Find the most recent user event whose
|
|
10
|
-
# `message.content`
|
|
11
|
-
# `<onboarding-state ` marker — that is the injection signature.
|
|
10
|
+
# `message.content` contains the literal `<onboarding-state ` marker.
|
|
12
11
|
# 3. If no such user event exists in this transcript, fail-open (exit 0).
|
|
13
|
-
# 4. Otherwise, find the most recent assistant event after that injection
|
|
14
|
-
#
|
|
15
|
-
# 5.
|
|
16
|
-
#
|
|
17
|
-
#
|
|
18
|
-
#
|
|
12
|
+
# 4. Otherwise, find the most recent assistant event after that injection.
|
|
13
|
+
# Count assistant turns since the injection so the log line carries a turn number.
|
|
14
|
+
# 5. Evaluate the ends-with-prompt contract on the assistant text:
|
|
15
|
+
# - PASS when the last non-whitespace character is `?`, OR
|
|
16
|
+
# - PASS when the trailing block (last ~8 lines) contains a numbered
|
|
17
|
+
# or bulleted list item (`1. `, `2) `, `- `, `* `).
|
|
18
|
+
# - FAIL otherwise.
|
|
19
|
+
# 6. Emit `[onboarding-skill-drift] turn=<N> contract=ends-with-prompt
|
|
20
|
+
# result=<pass|fail> reason=<reason>` on stderr.
|
|
19
21
|
#
|
|
20
|
-
# Exit 0 always
|
|
21
|
-
#
|
|
22
|
-
#
|
|
23
|
-
# so a hook bug never blocks the agent's response.
|
|
22
|
+
# Exit 0 always: this hook is observation, not enforcement. Infrastructure
|
|
23
|
+
# failures (jq missing, transcript unreadable) also exit 0 so a hook bug
|
|
24
|
+
# never blocks the agent's response.
|
|
24
25
|
|
|
25
26
|
set -uo pipefail
|
|
26
|
-
LOG_TAG="[
|
|
27
|
+
LOG_TAG="[onboarding-skill-drift]"
|
|
27
28
|
|
|
28
|
-
# fail-open if jq is unavailable — the transcript shape demands JSON parse
|
|
29
29
|
if ! command -v jq >/dev/null 2>&1; then
|
|
30
|
-
echo "$LOG_TAG
|
|
30
|
+
echo "$LOG_TAG turn=0 contract=ends-with-prompt result=skip reason=jq-missing" >&2
|
|
31
31
|
exit 0
|
|
32
32
|
fi
|
|
33
33
|
|
|
34
34
|
INPUT=$(cat 2>/dev/null || echo '{}')
|
|
35
35
|
TRANSCRIPT=$(echo "$INPUT" | jq -r '.transcript_path // empty' 2>/dev/null)
|
|
36
36
|
if [ -z "$TRANSCRIPT" ] || [ ! -f "$TRANSCRIPT" ]; then
|
|
37
|
-
echo "$LOG_TAG
|
|
37
|
+
echo "$LOG_TAG turn=0 contract=ends-with-prompt result=skip reason=no-transcript" >&2
|
|
38
38
|
exit 0
|
|
39
39
|
fi
|
|
40
40
|
|
|
41
|
-
# Locate the most recent injection
|
|
42
|
-
# block is prepended verbatim to the operator's input on the
|
|
43
|
-
# of an eligible session, so it appears as the leading bytes of
|
|
44
|
-
# event's message text. Search backwards
|
|
45
|
-
# transcript window.
|
|
41
|
+
# Locate the most recent <onboarding-state ...> injection in a user event.
|
|
42
|
+
# The injection block is prepended verbatim to the operator's input on the
|
|
43
|
+
# first /input of an eligible session, so it appears as the leading bytes of
|
|
44
|
+
# the user event's message text. Search backwards for the last one.
|
|
46
45
|
INJECTION_LINE=$(grep -n '<onboarding-state ' "$TRANSCRIPT" 2>/dev/null \
|
|
47
46
|
| grep '"type":"user"' \
|
|
48
47
|
| tail -n 1 \
|
|
49
48
|
| cut -d: -f1)
|
|
50
49
|
|
|
51
50
|
if [ -z "$INJECTION_LINE" ]; then
|
|
52
|
-
# No injection in this transcript window
|
|
51
|
+
# No injection in this transcript window. Nothing to evaluate.
|
|
53
52
|
exit 0
|
|
54
53
|
fi
|
|
55
54
|
|
|
56
|
-
# Slice the file from just after the injection line
|
|
57
|
-
# assistant's response sits in that suffix.
|
|
55
|
+
# Slice the file from just after the injection line.
|
|
58
56
|
TAIL=$(tail -n "+$((INJECTION_LINE + 1))" "$TRANSCRIPT" 2>/dev/null)
|
|
59
57
|
|
|
60
|
-
#
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
| tail -n 1)
|
|
58
|
+
# Count assistant turns since the injection and pick the most recent.
|
|
59
|
+
ASSISTANT_TURNS=$(echo "$TAIL" | grep -c '"type":"assistant"')
|
|
60
|
+
ASSISTANT=$(echo "$TAIL" | grep '"type":"assistant"' | tail -n 1)
|
|
64
61
|
|
|
65
62
|
if [ -z "$ASSISTANT" ]; then
|
|
66
|
-
echo "$LOG_TAG
|
|
63
|
+
echo "$LOG_TAG turn=0 contract=ends-with-prompt result=skip reason=no-assistant-turn" >&2
|
|
67
64
|
exit 0
|
|
68
65
|
fi
|
|
69
66
|
|
|
70
|
-
#
|
|
71
|
-
|
|
72
|
-
.message.content // []
|
|
73
|
-
| map(select(.type == "tool_use") | .name)
|
|
74
|
-
| join(",")
|
|
75
|
-
' 2>/dev/null)
|
|
76
|
-
|
|
77
|
-
# Concatenated text content (final character matters for the `?` check).
|
|
67
|
+
# Concatenated text content (final character matters for the `?` check; final
|
|
68
|
+
# block matters for the enumerated-list check).
|
|
78
69
|
ASSISTANT_TEXT=$(echo "$ASSISTANT" | jq -r '
|
|
79
70
|
.message.content // []
|
|
80
71
|
| map(select(.type == "text") | .text)
|
|
81
|
-
| join("
|
|
72
|
+
| join("\n")
|
|
82
73
|
' 2>/dev/null)
|
|
83
74
|
|
|
84
|
-
|
|
85
|
-
case "$TOOL_USES" in
|
|
86
|
-
*render-component*) HAS_RENDER_COMPONENT=1 ;;
|
|
87
|
-
esac
|
|
88
|
-
|
|
89
|
-
# Trim trailing whitespace and check the last non-whitespace character.
|
|
75
|
+
# Trim trailing whitespace and find the last non-whitespace character.
|
|
90
76
|
TRIMMED=$(echo "$ASSISTANT_TEXT" | sed -E 's/[[:space:]]+$//')
|
|
91
77
|
LAST_CHAR=$(echo -n "$TRIMMED" | tail -c 1)
|
|
92
78
|
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
79
|
+
# Evaluate the ends-with-prompt contract.
|
|
80
|
+
ENDS_WITH_PROMPT=0
|
|
81
|
+
ENDS_WITH_PROMPT_REASON="neither-question-nor-list"
|
|
82
|
+
|
|
83
|
+
if [ "$LAST_CHAR" = "?" ]; then
|
|
84
|
+
ENDS_WITH_PROMPT=1
|
|
85
|
+
ENDS_WITH_PROMPT_REASON="trailing-question-mark"
|
|
86
|
+
else
|
|
87
|
+
# Take the last 8 lines and look for a numbered/bulleted list item.
|
|
88
|
+
TRAIL_LINES=$(echo "$TRIMMED" | tail -n 8)
|
|
89
|
+
if echo "$TRAIL_LINES" | grep -qE '^[[:space:]]*([0-9]+[.)]|[-*])[[:space:]]+'; then
|
|
90
|
+
ENDS_WITH_PROMPT=1
|
|
91
|
+
ENDS_WITH_PROMPT_REASON="trailing-enumerated-list"
|
|
92
|
+
fi
|
|
93
|
+
fi
|
|
94
|
+
|
|
95
|
+
if [ "$ENDS_WITH_PROMPT" = "1" ]; then
|
|
96
|
+
echo "$LOG_TAG turn=$ASSISTANT_TURNS contract=ends-with-prompt result=pass reason=$ENDS_WITH_PROMPT_REASON" >&2
|
|
97
|
+
else
|
|
98
|
+
SAMPLE=$(echo "$TRIMMED" | tail -c 120 | tr '\n' ' ' | sed 's/[[:space:]]\+/ /g')
|
|
99
|
+
echo "$LOG_TAG turn=$ASSISTANT_TURNS contract=ends-with-prompt result=fail reason=$ENDS_WITH_PROMPT_REASON sample='${SAMPLE}'" >&2
|
|
98
100
|
fi
|
|
99
101
|
|
|
100
102
|
exit 0
|
|
@@ -1,6 +1,8 @@
|
|
|
1
|
-
# Contextual UI Toolkit
|
|
1
|
+
# Contextual UI Toolkit (public agent surface only)
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
**Scope.** This file documents the `render-component` UI primitives available exclusively on the public agent surface (Anthropic API runtime). The admin agent on the native Claude Code (PTY) surface does not have `render-component` and must not call it; admin flows use plain markdown for review and `file-attach` for downloadable artefacts (see `skills/file-presentation/SKILL.md`). The MCP tool definition remains registered because the public agent depends on it.
|
|
4
|
+
|
|
5
|
+
A suite of UI primitives rendered inline in the conversation via `render-component`. The public agent uses these when structured interaction improves clarity, reduces ambiguity, or prevents errors, not for every exchange.
|
|
4
6
|
|
|
5
7
|
## Component Catalogue
|
|
6
8
|
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: file-presentation
|
|
3
|
-
description: "
|
|
3
|
+
description: "Deliver a file or document to the owner inside chat for review and download. Triggers when the owner asks to see, attach, or download a file, when content is generated that the owner needs to review (summary, report, draft), or when a downloadable artefact is the right output."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# File presentation
|
|
7
7
|
|
|
8
|
-
This skill makes a file visible and downloadable inside
|
|
8
|
+
This skill makes a file visible and downloadable inside chat on the native Claude Code surface. Two delivery paths cover every case: a fenced markdown block for editable text content, and the `file-attach` tool for any file the operator should be able to download.
|
|
9
9
|
|
|
10
10
|
## The trigger
|
|
11
11
|
|
|
12
|
-
The owner asks to view, review, attach, or download a file or a document, or the current turn produces a document
|
|
12
|
+
The owner asks to view, review, attach, or download a file or a document, or the current turn produces a document the owner needs to see. Example phrasings:
|
|
13
13
|
|
|
14
14
|
- "show me the file"
|
|
15
15
|
- "attach the report"
|
|
@@ -18,39 +18,23 @@ The owner asks to view, review, attach, or download a file or a document, or the
|
|
|
18
18
|
- "send me the brochure"
|
|
19
19
|
- "save that as a markdown file"
|
|
20
20
|
|
|
21
|
-
## How to
|
|
21
|
+
## How to deliver markdown text content
|
|
22
22
|
|
|
23
|
-
|
|
23
|
+
For a synthesised document (a summary, a report, a draft, a knowledge-base article), present the content as a single fenced markdown block in chat:
|
|
24
24
|
|
|
25
|
+
````
|
|
26
|
+
```markdown
|
|
27
|
+
<the file content as markdown>
|
|
25
28
|
```
|
|
26
|
-
|
|
27
|
-
data: {
|
|
28
|
-
title: "<owner-facing title>",
|
|
29
|
-
content: "<the file content as markdown>"
|
|
30
|
-
}
|
|
31
|
-
```
|
|
32
|
-
|
|
33
|
-
The component gives the owner a render-review-edit-download flow: they see the content inline, can edit it in place, and can download it as a `.md` file directly from the component. Do not use `memory-write`, `memory-ingest`, or other tools to deliver file content to the owner; those tools have different purposes and skipping the render-review-download flow takes control away from the owner.
|
|
34
|
-
|
|
35
|
-
## Character sanitisation: the silent-failure rule
|
|
36
|
-
|
|
37
|
-
The document-editor's markdown parser fails silently on these typographical characters:
|
|
29
|
+
````
|
|
38
30
|
|
|
39
|
-
|
|
40
|
-
|---|---|---|
|
|
41
|
-
| em-dash | U+2014 | hyphen with spaces |
|
|
42
|
-
| en-dash | U+2013 | hyphen with spaces |
|
|
43
|
-
| left curly double quote | U+201C | straight double quote |
|
|
44
|
-
| right curly double quote | U+201D | straight double quote |
|
|
45
|
-
| left curly single quote | U+2018 | straight single quote |
|
|
46
|
-
| right curly single quote | U+2019 | straight single quote |
|
|
47
|
-
| horizontal ellipsis | U+2026 | three periods |
|
|
31
|
+
The operator reads the block inline, copy-edits in their next message if changes are needed, and approves before any persistence step. Do not call `memory-write`, `memory-ingest`, or other writers before the operator has approved the content; those tools have different purposes and skipping the review step takes control away from the owner.
|
|
48
32
|
|
|
49
|
-
|
|
33
|
+
When the operator approves and the document should land on disk or in the graph, use the appropriate writer (`store-skill` for skill files under the active account, the relevant graph writer for `:KnowledgeDocument` nodes). Always state the destination before writing.
|
|
50
34
|
|
|
51
|
-
##
|
|
35
|
+
## How to deliver a downloadable file
|
|
52
36
|
|
|
53
|
-
For PDF, image, audio,
|
|
37
|
+
For any file the operator should be able to download (PDF, image, audio, a `.zip`, a `.md` artefact saved to disk, an `.ics` calendar export), call `file-attach` with the path. The tool returns the attachment reference and the chat client renders the download chip inline. No component wrapper is needed; `file-attach` is the delivery mechanism on the native Claude Code surface.
|
|
54
38
|
|
|
55
39
|
## For static-site delivery
|
|
56
40
|
|
|
@@ -58,10 +42,9 @@ When the owner has uploaded a `.zip` containing HTML and assets and wants it hos
|
|
|
58
42
|
|
|
59
43
|
## Failure modes
|
|
60
44
|
|
|
61
|
-
- **Content is too large for
|
|
62
|
-
- **`
|
|
63
|
-
- **The content contains characters the parser rejects after the sanitisation pass** (rare; usually a non-printable control character). Strip the offending characters and surface a one-line warning naming the position.
|
|
45
|
+
- **Content is too large for one chat block** (typically over 50,000 characters of markdown). Surface the size and offer to split into sections, save as a `.md` file and `file-attach` it, or present only the first section with a follow-up for the rest.
|
|
46
|
+
- **`file-attach` returns an error.** Surface the error literally. Do not paste binary contents or a base64 dump into chat as a fallback; the owner asked for a download, not a wall of bytes.
|
|
64
47
|
|
|
65
48
|
## What this skill does not do
|
|
66
49
|
|
|
67
|
-
It does not write
|
|
50
|
+
It does not write content to the graph or to disk on its own. The fenced-block path is a review surface; persistence is a separate, named tool call that follows operator approval.
|
|
@@ -42,7 +42,7 @@ Premium plugins are purchased separately and delivered from a staging area to th
|
|
|
42
42
|
|
|
43
43
|
### Browsing available premium plugins
|
|
44
44
|
|
|
45
|
-
Call `premium-list`. It returns structured data for every plugin in the staging area: name, type (standalone/bundle), description, purchase status, and delivery status (per sub-plugin for bundles). Present the results
|
|
45
|
+
Call `premium-list`. It returns structured data for every plugin in the staging area: name, type (standalone/bundle), description, purchase status, and delivery status (per sub-plugin for bundles). Present the results as a plain numbered list, one entry per plugin, naming the plugin, its type, its description, its purchase status, and (for bundles) the delivery status of each sub-plugin.
|
|
46
46
|
|
|
47
47
|
### Plugin info before purchase
|
|
48
48
|
|
|
@@ -92,7 +92,7 @@ Only present plugins from the curated list below. Before presenting, verify each
|
|
|
92
92
|
| `sales` | Buying signal detection, closing techniques, objection handling |
|
|
93
93
|
| `docs` | User guide and platform documentation |
|
|
94
94
|
|
|
95
|
-
**Premium — Real
|
|
95
|
+
**Premium — Real Agent (only when delivered):**
|
|
96
96
|
|
|
97
97
|
| Plugin | Description |
|
|
98
98
|
|--------|-------------|
|
|
@@ -5,7 +5,7 @@ tools: []
|
|
|
5
5
|
metadata: {"platform":{"optional":true,"embed":["admin"]}}
|
|
6
6
|
---
|
|
7
7
|
|
|
8
|
-
# Real
|
|
8
|
+
# Real Agent — Brochures
|
|
9
9
|
|
|
10
10
|
End-to-end estate-agent brochure pipeline. From an agent website URL and a property listing URL, the skills produce a print-ready A4 PDF brochure plus the live HTML used to author it. The pipeline is idempotent: each upstream step is skipped when its output already exists on disk for the requested source.
|
|
11
11
|
|
|
@@ -6,7 +6,7 @@ always: false
|
|
|
6
6
|
metadata: {"platform":{"optional":true,"embed":["public","admin"]}}
|
|
7
7
|
---
|
|
8
8
|
|
|
9
|
-
# Real
|
|
9
|
+
# Real Agent — Buyer Management
|
|
10
10
|
|
|
11
11
|
Five skills covering the complete buyer lifecycle from initial enquiry through viewing management and educational content.
|
|
12
12
|
|
|
@@ -28,7 +28,6 @@ The user is handling buyer enquiries, qualifying applicants, managing viewings,
|
|
|
28
28
|
|
|
29
29
|
No MCP server. Skills operate via existing platform tools:
|
|
30
30
|
- `memory-search` — retrieve domain knowledge from the knowledge base
|
|
31
|
-
- `render-component` — present structured choices during interactions
|
|
32
31
|
|
|
33
32
|
## References
|
|
34
33
|
|
|
@@ -50,7 +50,7 @@ If the anchor is missing, ask for it in one sentence: "Mirror against the busine
|
|
|
50
50
|
## Chapter 2: ...
|
|
51
51
|
```
|
|
52
52
|
|
|
53
|
-
|
|
53
|
+
Present the assembled pack as a single fenced markdown block in chat for owner review before saving. The owner reads the pack inline and can ask for chapter-level edits in their next message. Once the owner approves, write to the graph.
|
|
54
54
|
|
|
55
55
|
## Length discipline
|
|
56
56
|
|
|
@@ -52,7 +52,7 @@ If `lens` is missing, ask once: "Through which lens: a project, a goal, or a pro
|
|
|
52
52
|
... (three to seven items)
|
|
53
53
|
```
|
|
54
54
|
|
|
55
|
-
|
|
55
|
+
Present the assembled pack as a single fenced markdown block in chat for owner review before save. The owner reads it inline and can ask for section-level edits in their next message. On approval, write to the graph.
|
|
56
56
|
|
|
57
57
|
## Difference from book-mirror
|
|
58
58
|
|
|
@@ -81,11 +81,11 @@ Brand decides which premium plugins ship. Maxy installs ship only `platform/plug
|
|
|
81
81
|
|
|
82
82
|
**How it works:** Every boot {{productName}} delivers the brand's premium plugins from staging into `platform/plugins/` and stamps `enabledPlugins` against what is actually on disk. No conversation needed — the brand's full set is active from the first turn after install. Updates and reinstalls re-deliver from staging.
|
|
83
83
|
|
|
84
|
-
Some premium plugins are **bundles** — multiple sub-plugins shipped under one directory in `premium-plugins/`, each independently activatable. For example, Real
|
|
84
|
+
Some premium plugins are **bundles** — multiple sub-plugins shipped under one directory in `premium-plugins/`, each independently activatable. For example, Real Agent ships 11 sub-plugins covering different aspects of estate agency work. They are all enabled by default. Sub-plugins you don't want active can be turned off individually with "disable <name>"; enabling or disabling individual sub-plugins does not affect the others.
|
|
85
85
|
|
|
86
86
|
If you ask {{productName}} about a tool from a plugin your brand does not ship (for example, a Maxy install asking about a Real Agent Loop CRM tool), {{productName}} responds with a structured `<tool-surface-error>` envelope naming the missing plugin and the remedy, rather than improvising with a generic alternative.
|
|
87
87
|
|
|
88
|
-
**Public agent embedding:** Premium plugins marked as public-eligible have their full content (skills and reference knowledge) embedded in public agent prompts. This means a public agent for a Real
|
|
88
|
+
**Public agent embedding:** Premium plugins marked as public-eligible have their full content (skills and reference knowledge) embedded in public agent prompts. This means a public agent for a Real Agent member can handle buyer enquiries, book viewings, deliver coaching content, and onboard new applicants — all powered by the premium plugin's domain knowledge. Plugins marked admin-only (listings, vendors, leads, business) are only available to the account owner's admin agent.
|
|
89
89
|
|
|
90
90
|
Some premium plugins include specialist helpers that {{productName}} can dispatch for specific tasks (e.g. the writer-craft plugin includes a manuscript reviewer). These are activated automatically when the plugin is enabled.
|
|
91
91
|
|
|
@@ -30,7 +30,7 @@ always: false
|
|
|
30
30
|
metadata: {"platform":{"optional":true,"embed":["admin"]}}
|
|
31
31
|
---
|
|
32
32
|
|
|
33
|
-
# Real
|
|
33
|
+
# Real Agent, Month-End and Business Operations
|
|
34
34
|
|
|
35
35
|
Eight skills covering month-end close and commission (the master workflow plus three building blocks) and the existing business operations skills.
|
|
36
36
|
|
|
@@ -56,7 +56,6 @@ The user is asking for the monthly close, the commission run, reconciliation aga
|
|
|
56
56
|
No MCP server. Skills operate via existing platform tools:
|
|
57
57
|
|
|
58
58
|
- `memory-search` for domain knowledge
|
|
59
|
-
- `render-component` for structured choices
|
|
60
59
|
- `profile-read` and `profile-update` for the customisation profile
|
|
61
60
|
- `action-pending`, `action-approve`, `action-reject`, `action-edit` for the writeoff, journal, payment-batch, and accountant-pack approval gates
|
|
62
61
|
|
|
@@ -6,7 +6,7 @@ always: false
|
|
|
6
6
|
metadata: {"platform":{"optional":true,"embed":["public","admin"]}}
|
|
7
7
|
---
|
|
8
8
|
|
|
9
|
-
# Real
|
|
9
|
+
# Real Agent — Coaching & Development
|
|
10
10
|
|
|
11
11
|
Four skills covering people development — from individual coaching through team performance management and structured sales training.
|
|
12
12
|
|
|
@@ -48,7 +48,6 @@ Each skill inherits this boundary. When a conversation crosses from coaching int
|
|
|
48
48
|
|
|
49
49
|
No MCP server. Skills operate via existing platform tools:
|
|
50
50
|
- `memory-search` — retrieve domain knowledge from the knowledge base
|
|
51
|
-
- `render-component` — present structured choices during interactions
|
|
52
51
|
|
|
53
52
|
## References
|
|
54
53
|
|
|
@@ -6,7 +6,7 @@ always: false
|
|
|
6
6
|
metadata: {"platform":{"optional":true,"embed":["public","admin"]}}
|
|
7
7
|
---
|
|
8
8
|
|
|
9
|
-
# Real
|
|
9
|
+
# Real Agent — Onboarding
|
|
10
10
|
|
|
11
11
|
First-run member setup — turning a new conversation into a profiled member with a clear starting point in the curriculum.
|
|
12
12
|
|
|
@@ -24,7 +24,6 @@ The user is going through initial onboarding (career stage assessment, profile s
|
|
|
24
24
|
|
|
25
25
|
No MCP server. Skills operate via existing platform tools:
|
|
26
26
|
- `memory-search` — retrieve domain knowledge from the knowledge base
|
|
27
|
-
- `render-component` — present structured choices during interactions
|
|
28
27
|
|
|
29
28
|
## References
|
|
30
29
|
|
|
@@ -19,7 +19,7 @@ always: false
|
|
|
19
19
|
metadata: {"platform":{"optional":true,"embed":["public","admin"]}}
|
|
20
20
|
---
|
|
21
21
|
|
|
22
|
-
# Real
|
|
22
|
+
# Real Agent, Chase Progression and Sales
|
|
23
23
|
|
|
24
24
|
Seven skills covering chain progression (the headline workflow) and the existing sales cycle.
|
|
25
25
|
|
|
@@ -44,7 +44,6 @@ The user is working on stalled deals, chain progression, fall-through risk, sale
|
|
|
44
44
|
No MCP server. Skills operate via existing platform tools:
|
|
45
45
|
|
|
46
46
|
- `memory-search` for domain knowledge
|
|
47
|
-
- `render-component` for structured choices
|
|
48
47
|
- `profile-read` and `profile-update` for the customisation profile
|
|
49
48
|
- `action-pending`, `action-approve`, `action-reject`, `action-edit` for the per-message approval gates in chase-progression
|
|
50
49
|
|
|
@@ -6,7 +6,7 @@ always: false
|
|
|
6
6
|
metadata: {"platform":{"optional":true,"embed":["public","admin"]}}
|
|
7
7
|
---
|
|
8
8
|
|
|
9
|
-
# Real
|
|
9
|
+
# Real Agent — Teaching & Content
|
|
10
10
|
|
|
11
11
|
Structured content delivery from the Real Agency curriculum. Handles module browsing, topic search, interactive teaching, and progress tracking.
|
|
12
12
|
|
|
@@ -24,7 +24,6 @@ The user is browsing available content, asking about a topic, requesting a speci
|
|
|
24
24
|
|
|
25
25
|
No MCP server. Skills operate via existing platform tools:
|
|
26
26
|
- `memory-search` — retrieve domain knowledge from the knowledge base
|
|
27
|
-
- `render-component` — present structured choices during interactions
|
|
28
27
|
|
|
29
28
|
## References
|
|
30
29
|
|
|
@@ -29,7 +29,7 @@ always: false
|
|
|
29
29
|
metadata: {"platform":{"optional":true,"embed":["admin"]}}
|
|
30
30
|
---
|
|
31
31
|
|
|
32
|
-
# Real
|
|
32
|
+
# Real Agent, Lead Generation and Morning Round
|
|
33
33
|
|
|
34
34
|
Six skills: four covering the daily morning round (master plus building blocks) and two covering longer-horizon lead nurturing and prospecting.
|
|
35
35
|
|
|
@@ -53,7 +53,6 @@ The user is asking for the morning round, the daily brief, the day's diary, over
|
|
|
53
53
|
No MCP server. Skills operate via existing platform tools:
|
|
54
54
|
|
|
55
55
|
- `memory-search` to retrieve domain knowledge from the knowledge base
|
|
56
|
-
- `render-component` to present structured choices during interactions
|
|
57
56
|
- `profile-read` and `profile-update` for the customisation profile
|
|
58
57
|
- `task-create` to file an open task when a chase needs deferring
|
|
59
58
|
|
|
@@ -61,7 +61,7 @@ always: false
|
|
|
61
61
|
metadata: {"platform":{"optional":true,"embed":["admin"]}}
|
|
62
62
|
---
|
|
63
63
|
|
|
64
|
-
# Real
|
|
64
|
+
# Real Agent, Valuations and New Instructions
|
|
65
65
|
|
|
66
66
|
Fifteen skills covering the two listings-side master workflows (valuation-prep, new-instruction) plus the listing-presentation and marketing skills.
|
|
67
67
|
|
|
@@ -94,7 +94,6 @@ The user is preparing for a valuation or market appraisal, has just won an instr
|
|
|
94
94
|
No MCP server. Skills operate via existing platform tools:
|
|
95
95
|
|
|
96
96
|
- `memory-search` for domain knowledge
|
|
97
|
-
- `render-component` for structured choices
|
|
98
97
|
- `profile-read` and `profile-update` for the customisation profile
|
|
99
98
|
- `action-pending`, `action-approve`, `action-reject`, `action-edit` for the eight approval gates in new-instruction
|
|
100
99
|
|
|
@@ -73,7 +73,7 @@ always: false
|
|
|
73
73
|
metadata: {"platform":{"optional":true,"embed":["admin"]}}
|
|
74
74
|
---
|
|
75
75
|
|
|
76
|
-
# Real
|
|
76
|
+
# Real Agent — Loop CRM
|
|
77
77
|
|
|
78
78
|
Full integration with Loop CRM V2 API (api.loop.software). Covers all 73 endpoints across 8 resource groups — properties, people, viewings, feedback, team, marketing, customer preferences, and supplier operations. Supports both read and write operations.
|
|
79
79
|
|
|
@@ -104,7 +104,7 @@ The `sessionKey` parameter on `schedule-event` automatically creates the `PART_O
|
|
|
104
104
|
|
|
105
105
|
## ICS calendar files
|
|
106
106
|
|
|
107
|
-
Export events as `.ics` files so users can add them to Apple Calendar, Google Calendar, or Outlook. Use `schedule-export-ics` with the event IDs, then `file-attach` with the returned path
|
|
107
|
+
Export events as `.ics` files so users can add them to Apple Calendar, Google Calendar, or Outlook. Use `schedule-export-ics` with the event IDs, then `file-attach` with the returned path; the chat client renders the download chip inline.
|
|
108
108
|
|
|
109
109
|
Import `.ics` files uploaded by the user. Use `schedule-import-ics` with the attachment path. Present the extracted events for confirmation before creating them via `schedule-event`.
|
|
110
110
|
|
|
@@ -6,7 +6,7 @@ always: false
|
|
|
6
6
|
metadata: {"platform":{"optional":true,"embed":["admin"]}}
|
|
7
7
|
---
|
|
8
8
|
|
|
9
|
-
# Real
|
|
9
|
+
# Real Agent — Vendor Management
|
|
10
10
|
|
|
11
11
|
Four skills covering the active vendor lifecycle from valuation enquiry through offer negotiation.
|
|
12
12
|
|
|
@@ -27,7 +27,6 @@ The user is managing vendor relationships — handling valuation requests, provi
|
|
|
27
27
|
|
|
28
28
|
No MCP server. Skills operate via existing platform tools:
|
|
29
29
|
- `memory-search` — retrieve domain knowledge from the knowledge base
|
|
30
|
-
- `render-component` — present structured choices during interactions
|
|
31
30
|
|
|
32
31
|
## References
|
|
33
32
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: real-agent
|
|
3
|
-
description: "UK estate agency skills + Loop CRM integration — 11 sub-plugins covering sales, listings, vendor management, buyer management, lead generation, coaching, business operations, onboarding, teaching, Loop CRM, and property brochures. 3 specialist roles (negotiator, valuer, compliance). 32 skills +
|
|
3
|
+
description: "UK estate agency skills + Loop CRM integration — 11 sub-plugins covering sales, listings, vendor management, buyer management, lead generation, coaching, business operations, onboarding, teaching, Loop CRM, and property brochures. 3 specialist roles (negotiator, valuer, compliance). 32 skills + 23 MCP tools."
|
|
4
4
|
plugins:
|
|
5
5
|
- estate-sales
|
|
6
6
|
- listings
|
|
@@ -23,9 +23,9 @@ Premium plugin bundle for UK estate agency professionals. Shipped on every non-M
|
|
|
23
23
|
|
|
24
24
|
| Role | Agent file | Tools | Focus |
|
|
25
25
|
|---|---|---|---|
|
|
26
|
-
| Negotiator | `agents/negotiator.md` | All Loop CRM tools + memory-search
|
|
27
|
-
| Valuer | `agents/valuer.md` | Loop property/people tools + memory-search
|
|
28
|
-
| Compliance | `agents/compliance.md` | All Loop CRM tools + memory-search + perplexity-search
|
|
26
|
+
| Negotiator | `agents/negotiator.md` | All Loop CRM tools + memory-search | Buyer pipeline, viewings, feedback, offers, deal progression |
|
|
27
|
+
| Valuer | `agents/valuer.md` | Loop property/people tools + memory-search | Market appraisal preparation, comparable evidence analysis |
|
|
28
|
+
| Compliance | `agents/compliance.md` | All Loop CRM tools + memory-search + perplexity-search | UK estate agency law, listing audit, AML/KYC, regulatory compliance |
|
|
29
29
|
|
|
30
30
|
## Sub-Plugins
|
|
31
31
|
|
|
@@ -40,5 +40,5 @@ Premium plugin bundle for UK estate agency professionals. Shipped on every non-M
|
|
|
40
40
|
| `estate-business` | 4 | — | Business owner skills — growth, operations, brand, partnerships |
|
|
41
41
|
| `estate-onboarding` | 1 | — | First-run member onboarding |
|
|
42
42
|
| `estate-teaching` | 1 | — | Structured education module browsing and delivery |
|
|
43
|
-
| `loop` | — |
|
|
43
|
+
| `loop` | — | 23 | Loop CRM integration — properties, people, viewings, feedback, team, marketing, customer preferences, supplier |
|
|
44
44
|
| `brochures` | 5 | — | Property brochure pipeline — brand extract, property extract, A4 layout, print constraints |
|
|
@@ -3,7 +3,7 @@ name: compliance
|
|
|
3
3
|
description: "UK estate agency legal and compliance guidance — legislation, regulation, codes of practice, AML obligations, consumer protection, data protection, material information, advertising standards, and lettings law. Delegate when the task involves regulatory compliance, legal obligations, listing audit against legislative requirements, AML/KYC procedures, data handling questions, advertising rules, or any question about what the law requires of an estate agent or letting agent."
|
|
4
4
|
summary: "Your compliance officer — advises on UK estate agency law, audits listings against regulatory requirements, and cites current legislation."
|
|
5
5
|
model: claude-opus-4-7
|
|
6
|
-
tools: mcp__loop__loop-key-register, mcp__loop__loop-key-deregister, mcp__loop__loop-key-list, mcp__loop__loop-people-search, mcp__loop__loop-people-detail, mcp__loop__loop-property-search, mcp__loop__loop-property-detail, mcp__loop__loop-property-listed, mcp__loop__loop-property-request, mcp__loop__loop-viewing-search, mcp__loop__loop-viewing-detail, mcp__loop__loop-viewing-create, mcp__loop__loop-viewing-update, mcp__loop__loop-feedback-get, mcp__loop__loop-feedback-submit, mcp__loop__loop-team-info, mcp__loop__loop-team-availability, mcp__loop__loop-marketing-match, mcp__loop__loop-marketing-match-batch, mcp__loop__loop-marketing-match-request, mcp__loop__loop-marketing-enquiry, mcp__loop__loop-customer-preferences, mcp__loop__loop-supplier, mcp__memory__memory-search, mcp__deep-research__perplexity-search
|
|
6
|
+
tools: mcp__loop__loop-key-register, mcp__loop__loop-key-deregister, mcp__loop__loop-key-list, mcp__loop__loop-people-search, mcp__loop__loop-people-detail, mcp__loop__loop-property-search, mcp__loop__loop-property-detail, mcp__loop__loop-property-listed, mcp__loop__loop-property-request, mcp__loop__loop-viewing-search, mcp__loop__loop-viewing-detail, mcp__loop__loop-viewing-create, mcp__loop__loop-viewing-update, mcp__loop__loop-feedback-get, mcp__loop__loop-feedback-submit, mcp__loop__loop-team-info, mcp__loop__loop-team-availability, mcp__loop__loop-marketing-match, mcp__loop__loop-marketing-match-batch, mcp__loop__loop-marketing-match-request, mcp__loop__loop-marketing-enquiry, mcp__loop__loop-customer-preferences, mcp__loop__loop-supplier, mcp__memory__memory-search, mcp__deep-research__perplexity-search
|
|
7
7
|
---
|
|
8
8
|
|
|
9
9
|
# Compliance
|
|
@@ -3,7 +3,7 @@ name: negotiator
|
|
|
3
3
|
description: "CRM operations, buyer pipeline management, viewing coordination, feedback analysis, offer preparation, and deal progression. Delegate when the task involves querying or correlating CRM data, managing buyer interactions, preparing offer packages, or tracking deal status."
|
|
4
4
|
summary: "Your negotiator — manages buyer pipeline, viewings, feedback, offers, and deal progression using Loop CRM."
|
|
5
5
|
model: claude-sonnet-4-6
|
|
6
|
-
tools: mcp__loop__loop-key-register, mcp__loop__loop-key-deregister, mcp__loop__loop-key-list, mcp__loop__loop-people-search, mcp__loop__loop-people-detail, mcp__loop__loop-property-search, mcp__loop__loop-property-detail, mcp__loop__loop-property-listed, mcp__loop__loop-property-request, mcp__loop__loop-viewing-search, mcp__loop__loop-viewing-detail, mcp__loop__loop-viewing-create, mcp__loop__loop-viewing-update, mcp__loop__loop-feedback-get, mcp__loop__loop-feedback-submit, mcp__loop__loop-team-info, mcp__loop__loop-team-availability, mcp__loop__loop-marketing-match, mcp__loop__loop-marketing-match-batch, mcp__loop__loop-marketing-match-request, mcp__loop__loop-marketing-enquiry, mcp__loop__loop-customer-preferences, mcp__loop__loop-supplier, mcp__memory__memory-search
|
|
6
|
+
tools: mcp__loop__loop-key-register, mcp__loop__loop-key-deregister, mcp__loop__loop-key-list, mcp__loop__loop-people-search, mcp__loop__loop-people-detail, mcp__loop__loop-property-search, mcp__loop__loop-property-detail, mcp__loop__loop-property-listed, mcp__loop__loop-property-request, mcp__loop__loop-viewing-search, mcp__loop__loop-viewing-detail, mcp__loop__loop-viewing-create, mcp__loop__loop-viewing-update, mcp__loop__loop-feedback-get, mcp__loop__loop-feedback-submit, mcp__loop__loop-team-info, mcp__loop__loop-team-availability, mcp__loop__loop-marketing-match, mcp__loop__loop-marketing-match-batch, mcp__loop__loop-marketing-match-request, mcp__loop__loop-marketing-enquiry, mcp__loop__loop-customer-preferences, mcp__loop__loop-supplier, mcp__memory__memory-search
|
|
7
7
|
---
|
|
8
8
|
|
|
9
9
|
# Negotiator
|
|
@@ -3,7 +3,7 @@ name: valuer
|
|
|
3
3
|
description: "Market appraisal preparation, comparable evidence analysis, and valuation booking support. Delegate when the task involves preparing for a valuation appointment, assembling comparable sales data, analysing competing listings, or handling valuation enquiries."
|
|
4
4
|
summary: "Your valuer — prepares market appraisals, assembles comparable evidence, and analyses local market conditions using Loop CRM."
|
|
5
5
|
model: claude-sonnet-4-6
|
|
6
|
-
tools: mcp__loop__loop-property-search, mcp__loop__loop-property-detail, mcp__loop__loop-property-listed, mcp__loop__loop-people-search, mcp__memory__memory-search
|
|
6
|
+
tools: mcp__loop__loop-property-search, mcp__loop__loop-property-detail, mcp__loop__loop-property-listed, mcp__loop__loop-people-search, mcp__memory__memory-search
|
|
7
7
|
---
|
|
8
8
|
|
|
9
9
|
# Valuer
|
|
@@ -5,7 +5,7 @@ tools: []
|
|
|
5
5
|
metadata: {"platform":{"optional":true,"embed":["admin"]}}
|
|
6
6
|
---
|
|
7
7
|
|
|
8
|
-
# Real
|
|
8
|
+
# Real Agent — Brochures
|
|
9
9
|
|
|
10
10
|
End-to-end estate-agent brochure pipeline. From an agent website URL and a property listing URL, the skills produce a print-ready A4 PDF brochure plus the live HTML used to author it. The pipeline is idempotent: each upstream step is skipped when its output already exists on disk for the requested source.
|
|
11
11
|
|
|
@@ -6,7 +6,7 @@ always: false
|
|
|
6
6
|
metadata: {"platform":{"optional":true,"embed":["public","admin"]}}
|
|
7
7
|
---
|
|
8
8
|
|
|
9
|
-
# Real
|
|
9
|
+
# Real Agent — Buyer Management
|
|
10
10
|
|
|
11
11
|
Five skills covering the complete buyer lifecycle from initial enquiry through viewing management and educational content.
|
|
12
12
|
|
|
@@ -28,7 +28,6 @@ The user is handling buyer enquiries, qualifying applicants, managing viewings,
|
|
|
28
28
|
|
|
29
29
|
No MCP server. Skills operate via existing platform tools:
|
|
30
30
|
- `memory-search` — retrieve domain knowledge from the knowledge base
|
|
31
|
-
- `render-component` — present structured choices during interactions
|
|
32
31
|
|
|
33
32
|
## References
|
|
34
33
|
|
|
@@ -30,7 +30,7 @@ always: false
|
|
|
30
30
|
metadata: {"platform":{"optional":true,"embed":["admin"]}}
|
|
31
31
|
---
|
|
32
32
|
|
|
33
|
-
# Real
|
|
33
|
+
# Real Agent, Month-End and Business Operations
|
|
34
34
|
|
|
35
35
|
Eight skills covering month-end close and commission (the master workflow plus three building blocks) and the existing business operations skills.
|
|
36
36
|
|
|
@@ -56,7 +56,6 @@ The user is asking for the monthly close, the commission run, reconciliation aga
|
|
|
56
56
|
No MCP server. Skills operate via existing platform tools:
|
|
57
57
|
|
|
58
58
|
- `memory-search` for domain knowledge
|
|
59
|
-
- `render-component` for structured choices
|
|
60
59
|
- `profile-read` and `profile-update` for the customisation profile
|
|
61
60
|
- `action-pending`, `action-approve`, `action-reject`, `action-edit` for the writeoff, journal, payment-batch, and accountant-pack approval gates
|
|
62
61
|
|
|
@@ -6,7 +6,7 @@ always: false
|
|
|
6
6
|
metadata: {"platform":{"optional":true,"embed":["public","admin"]}}
|
|
7
7
|
---
|
|
8
8
|
|
|
9
|
-
# Real
|
|
9
|
+
# Real Agent — Coaching & Development
|
|
10
10
|
|
|
11
11
|
Four skills covering people development — from individual coaching through team performance management and structured sales training.
|
|
12
12
|
|
|
@@ -48,7 +48,6 @@ Each skill inherits this boundary. When a conversation crosses from coaching int
|
|
|
48
48
|
|
|
49
49
|
No MCP server. Skills operate via existing platform tools:
|
|
50
50
|
- `memory-search` — retrieve domain knowledge from the knowledge base
|
|
51
|
-
- `render-component` — present structured choices during interactions
|
|
52
51
|
|
|
53
52
|
## References
|
|
54
53
|
|
|
@@ -6,7 +6,7 @@ always: false
|
|
|
6
6
|
metadata: {"platform":{"optional":true,"embed":["public","admin"]}}
|
|
7
7
|
---
|
|
8
8
|
|
|
9
|
-
# Real
|
|
9
|
+
# Real Agent — Onboarding
|
|
10
10
|
|
|
11
11
|
First-run member setup — turning a new conversation into a profiled member with a clear starting point in the curriculum.
|
|
12
12
|
|
|
@@ -24,7 +24,6 @@ The user is going through initial onboarding (career stage assessment, profile s
|
|
|
24
24
|
|
|
25
25
|
No MCP server. Skills operate via existing platform tools:
|
|
26
26
|
- `memory-search` — retrieve domain knowledge from the knowledge base
|
|
27
|
-
- `render-component` — present structured choices during interactions
|
|
28
27
|
|
|
29
28
|
## References
|
|
30
29
|
|
|
@@ -19,7 +19,7 @@ always: false
|
|
|
19
19
|
metadata: {"platform":{"optional":true,"embed":["public","admin"]}}
|
|
20
20
|
---
|
|
21
21
|
|
|
22
|
-
# Real
|
|
22
|
+
# Real Agent, Chase Progression and Sales
|
|
23
23
|
|
|
24
24
|
Seven skills covering chain progression (the headline workflow) and the existing sales cycle.
|
|
25
25
|
|
|
@@ -44,7 +44,6 @@ The user is working on stalled deals, chain progression, fall-through risk, sale
|
|
|
44
44
|
No MCP server. Skills operate via existing platform tools:
|
|
45
45
|
|
|
46
46
|
- `memory-search` for domain knowledge
|
|
47
|
-
- `render-component` for structured choices
|
|
48
47
|
- `profile-read` and `profile-update` for the customisation profile
|
|
49
48
|
- `action-pending`, `action-approve`, `action-reject`, `action-edit` for the per-message approval gates in chase-progression
|
|
50
49
|
|
|
@@ -6,7 +6,7 @@ always: false
|
|
|
6
6
|
metadata: {"platform":{"optional":true,"embed":["public","admin"]}}
|
|
7
7
|
---
|
|
8
8
|
|
|
9
|
-
# Real
|
|
9
|
+
# Real Agent — Teaching & Content
|
|
10
10
|
|
|
11
11
|
Structured content delivery from the Real Agency curriculum. Handles module browsing, topic search, interactive teaching, and progress tracking.
|
|
12
12
|
|
|
@@ -24,7 +24,6 @@ The user is browsing available content, asking about a topic, requesting a speci
|
|
|
24
24
|
|
|
25
25
|
No MCP server. Skills operate via existing platform tools:
|
|
26
26
|
- `memory-search` — retrieve domain knowledge from the knowledge base
|
|
27
|
-
- `render-component` — present structured choices during interactions
|
|
28
27
|
|
|
29
28
|
## References
|
|
30
29
|
|
|
@@ -29,7 +29,7 @@ always: false
|
|
|
29
29
|
metadata: {"platform":{"optional":true,"embed":["admin"]}}
|
|
30
30
|
---
|
|
31
31
|
|
|
32
|
-
# Real
|
|
32
|
+
# Real Agent, Lead Generation and Morning Round
|
|
33
33
|
|
|
34
34
|
Six skills: four covering the daily morning round (master plus building blocks) and two covering longer-horizon lead nurturing and prospecting.
|
|
35
35
|
|
|
@@ -53,7 +53,6 @@ The user is asking for the morning round, the daily brief, the day's diary, over
|
|
|
53
53
|
No MCP server. Skills operate via existing platform tools:
|
|
54
54
|
|
|
55
55
|
- `memory-search` to retrieve domain knowledge from the knowledge base
|
|
56
|
-
- `render-component` to present structured choices during interactions
|
|
57
56
|
- `profile-read` and `profile-update` for the customisation profile
|
|
58
57
|
- `task-create` to file an open task when a chase needs deferring
|
|
59
58
|
|
|
@@ -61,7 +61,7 @@ always: false
|
|
|
61
61
|
metadata: {"platform":{"optional":true,"embed":["admin"]}}
|
|
62
62
|
---
|
|
63
63
|
|
|
64
|
-
# Real
|
|
64
|
+
# Real Agent, Valuations and New Instructions
|
|
65
65
|
|
|
66
66
|
Fifteen skills covering the two listings-side master workflows (valuation-prep, new-instruction) plus the listing-presentation and marketing skills.
|
|
67
67
|
|
|
@@ -94,7 +94,6 @@ The user is preparing for a valuation or market appraisal, has just won an instr
|
|
|
94
94
|
No MCP server. Skills operate via existing platform tools:
|
|
95
95
|
|
|
96
96
|
- `memory-search` for domain knowledge
|
|
97
|
-
- `render-component` for structured choices
|
|
98
97
|
- `profile-read` and `profile-update` for the customisation profile
|
|
99
98
|
- `action-pending`, `action-approve`, `action-reject`, `action-edit` for the eight approval gates in new-instruction
|
|
100
99
|
|
|
@@ -73,7 +73,7 @@ always: false
|
|
|
73
73
|
metadata: {"platform":{"optional":true,"embed":["admin"]}}
|
|
74
74
|
---
|
|
75
75
|
|
|
76
|
-
# Real
|
|
76
|
+
# Real Agent — Loop CRM
|
|
77
77
|
|
|
78
78
|
Full integration with Loop CRM V2 API (api.loop.software). Covers all 73 endpoints across 8 resource groups — properties, people, viewings, feedback, team, marketing, customer preferences, and supplier operations. Supports both read and write operations.
|
|
79
79
|
|
|
@@ -6,7 +6,7 @@ always: false
|
|
|
6
6
|
metadata: {"platform":{"optional":true,"embed":["admin"]}}
|
|
7
7
|
---
|
|
8
8
|
|
|
9
|
-
# Real
|
|
9
|
+
# Real Agent — Vendor Management
|
|
10
10
|
|
|
11
11
|
Four skills covering the active vendor lifecycle from valuation enquiry through offer negotiation.
|
|
12
12
|
|
|
@@ -27,7 +27,6 @@ The user is managing vendor relationships — handling valuation requests, provi
|
|
|
27
27
|
|
|
28
28
|
No MCP server. Skills operate via existing platform tools:
|
|
29
29
|
- `memory-search` — retrieve domain knowledge from the knowledge base
|
|
30
|
-
- `render-component` — present structured choices during interactions
|
|
31
30
|
|
|
32
31
|
## References
|
|
33
32
|
|