@rubytech/taskmaster 1.19.1 → 1.19.8
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/skills/frontmatter.js +79 -0
- package/dist/agents/skills-status.js +3 -3
- package/dist/agents/system-prompt.js +6 -4
- package/dist/build-info.json +3 -3
- package/dist/control-ui/assets/{index-mjAT1dyG.js → index-wJYMFZnC.js} +290 -284
- package/dist/control-ui/assets/index-wJYMFZnC.js.map +1 -0
- package/dist/control-ui/index.html +1 -1
- package/dist/gateway/protocol/schema/agents-models-skills.js +3 -0
- package/dist/gateway/server-methods/skills.js +7 -2
- package/dist/hooks/bundled/ride-dispatch/handler.js +1 -1
- package/package.json +1 -1
- package/skills/taskmaster/SKILL.md +2 -2
- package/taskmaster-docs/USER-GUIDE.md +8 -1
- package/templates/beagle-zanzibar/agents/public/AGENTS.md +2 -2
- package/dist/control-ui/assets/index-mjAT1dyG.js.map +0 -1
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
<title>Taskmaster Control</title>
|
|
7
7
|
<meta name="color-scheme" content="dark light" />
|
|
8
8
|
<link rel="icon" type="image/png" href="./favicon.png" />
|
|
9
|
-
<script type="module" crossorigin src="./assets/index-
|
|
9
|
+
<script type="module" crossorigin src="./assets/index-wJYMFZnC.js"></script>
|
|
10
10
|
<link rel="stylesheet" crossorigin href="./assets/index-0WHVrpg7.css">
|
|
11
11
|
</head>
|
|
12
12
|
<body>
|
|
@@ -60,6 +60,9 @@ export const SkillsCreateParamsSchema = Type.Object({
|
|
|
60
60
|
}),
|
|
61
61
|
skillContent: NonEmptyString,
|
|
62
62
|
references: Type.Optional(Type.Array(SkillReferenceFileSchema)),
|
|
63
|
+
alwaysActive: Type.Optional(Type.Boolean({
|
|
64
|
+
description: "When true, the skill is embedded in every conversation instead of loaded on demand",
|
|
65
|
+
})),
|
|
63
66
|
}, { additionalProperties: false });
|
|
64
67
|
export const SkillsDeleteParamsSchema = Type.Object({
|
|
65
68
|
name: NonEmptyString,
|
|
@@ -4,6 +4,7 @@ import { resolveAgentWorkspaceDir, resolveAgentWorkspaceRoot, resolveDefaultAgen
|
|
|
4
4
|
import { installSkill } from "../../agents/skills-install.js";
|
|
5
5
|
import { buildWorkspaceSkillStatus } from "../../agents/skills-status.js";
|
|
6
6
|
import { loadWorkspaceSkillEntries, resolveBundledSkillsDir, } from "../../agents/skills.js";
|
|
7
|
+
import { extractEmbedFlag, applyEmbedFlag } from "../../agents/skills/frontmatter.js";
|
|
7
8
|
import { bumpSkillsSnapshotVersion } from "../../agents/skills/refresh.js";
|
|
8
9
|
import { loadConfig, writeConfigFile } from "../../config/config.js";
|
|
9
10
|
import { getRemoteSkillEligibility } from "../../infra/skills-remote.js";
|
|
@@ -170,6 +171,7 @@ export const skillsHandlers = {
|
|
|
170
171
|
return;
|
|
171
172
|
}
|
|
172
173
|
const content = fs.readFileSync(skillFile, "utf-8");
|
|
174
|
+
const alwaysActive = extractEmbedFlag(content);
|
|
173
175
|
const references = [];
|
|
174
176
|
const refsDir = path.join(skillDir, "references");
|
|
175
177
|
if (fs.existsSync(refsDir) && fs.statSync(refsDir).isDirectory()) {
|
|
@@ -183,7 +185,7 @@ export const skillsHandlers = {
|
|
|
183
185
|
}
|
|
184
186
|
references.sort((a, b) => a.name.localeCompare(b.name));
|
|
185
187
|
}
|
|
186
|
-
respond(true, { name: p.name, content, references }, undefined);
|
|
188
|
+
respond(true, { name: p.name, content, references, alwaysActive }, undefined);
|
|
187
189
|
},
|
|
188
190
|
"skills.create": async ({ params, respond }) => {
|
|
189
191
|
if (!validateSkillsCreateParams(params)) {
|
|
@@ -203,7 +205,10 @@ export const skillsHandlers = {
|
|
|
203
205
|
fs.rmSync(skillDir, { recursive: true, force: true });
|
|
204
206
|
}
|
|
205
207
|
fs.mkdirSync(skillDir, { recursive: true });
|
|
206
|
-
|
|
208
|
+
const finalContent = typeof p.alwaysActive === "boolean"
|
|
209
|
+
? applyEmbedFlag(p.skillContent, p.alwaysActive)
|
|
210
|
+
: p.skillContent;
|
|
211
|
+
fs.writeFileSync(path.join(skillDir, "SKILL.md"), finalContent, "utf-8");
|
|
207
212
|
if (p.references && p.references.length > 0) {
|
|
208
213
|
const refsDir = path.join(skillDir, "references");
|
|
209
214
|
fs.mkdirSync(refsDir, { recursive: true });
|
|
@@ -375,7 +375,7 @@ function buildPaymentConfirmedInstruction(params) {
|
|
|
375
375
|
` body: "[${bookingId}] You have a confirmed booking.\n` +
|
|
376
376
|
`Pickup: [pickup] → [destination]\n` +
|
|
377
377
|
`Time: [time] on [date]\n` +
|
|
378
|
-
`Passenger: [tourist_name]\n` +
|
|
378
|
+
`Passenger: [tourist_name] — WhatsApp: +[tourist_phone]\n` +
|
|
379
379
|
`Fare: $[fare]\n` +
|
|
380
380
|
`\n` +
|
|
381
381
|
`Your pickup PIN is [pin]. When you meet your passenger, say: 'Your PIN is [pin].' They will confirm it matches theirs. The QR code above is a backup they can scan instead."\n\n` +
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: taskmaster
|
|
3
|
-
description: "Product knowledge for Taskmaster — answers questions about features, setup, channels, tools, skills, troubleshooting, and what's new by fetching live documentation."
|
|
3
|
+
description: "Product knowledge for Taskmaster — answers questions about features, setup, configuration, channels, tools, skills, troubleshooting (including Pi device issues like hostname, Chromium, networking, audio, display), architecture, and what's new by fetching live documentation."
|
|
4
4
|
metadata: {"taskmaster":{"always":true,"emoji":"📚","skillKey":"taskmaster"}}
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -10,7 +10,7 @@ You can answer questions about Taskmaster itself — the platform your assistant
|
|
|
10
10
|
|
|
11
11
|
## When This Applies
|
|
12
12
|
|
|
13
|
-
Activate when the user asks about Taskmaster features, setup, configuration, channels, tools, skills, troubleshooting, updates, or anything about the platform itself — not their business.
|
|
13
|
+
Activate when the user asks about Taskmaster features, setup, configuration, channels, tools, skills, troubleshooting, updates, or anything about the platform itself — not their business. This includes Pi device issues (hostname changes, Chromium, networking, audio, display, boot problems) since Taskmaster runs on a Pi and the user guide covers these topics.
|
|
14
14
|
|
|
15
15
|
## How to Answer
|
|
16
16
|
|
|
@@ -885,6 +885,13 @@ Each skill has a label:
|
|
|
885
885
|
| **Preloaded** | Ships with the product. Always active. Cannot be disabled or deleted. |
|
|
886
886
|
| **User** | Created by you (or by your assistant on your behalf). You can enable, disable, edit, or delete these. |
|
|
887
887
|
|
|
888
|
+
Each user skill also shows a chip on its card: **Always active** or **On demand**. Tap the chip to switch between modes:
|
|
889
|
+
|
|
890
|
+
- **Always active** — the skill is part of every conversation. Your assistant always follows its instructions, whether the topic comes up or not. Use this for skills that shape how your assistant communicates (e.g. a sales approach or customer service style).
|
|
891
|
+
- **On demand** (default) — your assistant loads the skill only when a relevant topic comes up. Most skills should stay on demand to keep conversations focused.
|
|
892
|
+
|
|
893
|
+
Changes take effect on the next message — no restart needed.
|
|
894
|
+
|
|
888
895
|
#### Filtering the list
|
|
889
896
|
|
|
890
897
|
Use the **All / Preloaded / User** chip buttons at the top of the list to show only the type you're interested in.
|
|
@@ -897,7 +904,7 @@ Tap any skill to open its detail view. The detail view has tabs — one for the
|
|
|
897
904
|
|
|
898
905
|
From the detail view, tap **Edit** to open the skill editor. The editor has the same tabs as the detail view (SKILL.md and any reference files), so you can edit each part independently. If you are already viewing a reference tab when you tap Edit, the editor opens directly on that reference.
|
|
899
906
|
|
|
900
|
-
When you save an installed skill, the changes take effect immediately.
|
|
907
|
+
When you save an installed skill, the changes take effect immediately — no restart needed.
|
|
901
908
|
|
|
902
909
|
#### Enable / Disable
|
|
903
910
|
|
|
@@ -61,7 +61,7 @@ All users are verified before they reach you — WhatsApp users by their phone n
|
|
|
61
61
|
|
|
62
62
|
### Step 1 — Capture the request
|
|
63
63
|
|
|
64
|
-
Gather: pickup location, destination, date/time, number of passengers, luggage, special requests. If the tourist gave everything in one message, proceed immediately. If anything is missing, ask —
|
|
64
|
+
Gather: first name, pickup location, destination, date/time, number of passengers, luggage, special requests. If the tourist gave everything in one message, proceed immediately. If anything is missing, ask — but do not ask for name as a separate question if the tourist has already provided it naturally in conversation. Then resume from Step 2 when they reply.
|
|
65
65
|
|
|
66
66
|
### Step 2 — Check knowledge base
|
|
67
67
|
|
|
@@ -80,7 +80,7 @@ Write a dispatch file via `memory_write` to `shared/dispatch/{job-id}-trip-reque
|
|
|
80
80
|
job_id: BGL-XXXX
|
|
81
81
|
phase: trip-request
|
|
82
82
|
tourist_phone: [the tourist's phone number — from WhatsApp session or OTP-verified phone]
|
|
83
|
-
tourist_name: [
|
|
83
|
+
tourist_name: [tourist's first name]
|
|
84
84
|
pickup: [pickup location]
|
|
85
85
|
destination: [destination]
|
|
86
86
|
date: [date]
|