@rubytech/taskmaster 1.0.42 → 1.0.44
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/refresh.js +7 -1
- package/dist/agents/skills/workspace.js +47 -11
- package/dist/agents/system-prompt.js +2 -2
- package/dist/agents/tools/web-search.js +1 -1
- package/dist/build-info.json +3 -3
- package/dist/cli/provision-seed.js +4 -1
- package/dist/control-ui/assets/{index-kKBJzIuf.js → index-CpAWYZjj.js} +55 -48
- package/dist/control-ui/assets/index-CpAWYZjj.js.map +1 -0
- package/dist/control-ui/assets/{index-BfV0Mtl7.css → index-D5w5UtCL.css} +1 -1
- package/dist/control-ui/index.html +2 -2
- package/dist/gateway/server/ws-connection/message-handler.js +1 -0
- package/dist/gateway/server-broadcast.js +15 -1
- package/dist/gateway/server-constants.js +1 -1
- package/dist/gateway/server-methods/apikeys.js +3 -3
- package/dist/gateway/server.impl.js +32 -1
- package/dist/memory/manager.js +37 -1
- package/extensions/diagnostics-otel/node_modules/.bin/acorn +0 -0
- package/extensions/googlechat/node_modules/.bin/taskmaster +0 -0
- package/extensions/line/node_modules/.bin/taskmaster +0 -0
- package/extensions/matrix/node_modules/.bin/markdown-it +0 -0
- package/extensions/matrix/node_modules/.bin/taskmaster +0 -0
- package/extensions/memory-lancedb/node_modules/.bin/arrow2csv +0 -0
- package/extensions/memory-lancedb/node_modules/.bin/openai +0 -0
- package/extensions/msteams/node_modules/.bin/taskmaster +0 -0
- package/extensions/nostr/node_modules/.bin/taskmaster +0 -0
- package/extensions/nostr/node_modules/.bin/tsc +0 -0
- package/extensions/nostr/node_modules/.bin/tsserver +0 -0
- package/extensions/zalo/node_modules/.bin/taskmaster +0 -0
- package/extensions/zalouser/node_modules/.bin/taskmaster +0 -0
- package/package.json +54 -64
- package/scripts/install.sh +0 -0
- package/skills/google-ai/SKILL.md +29 -0
- package/skills/google-ai/references/browser-setup.md +90 -0
- package/skills/tavily/SKILL.md +28 -0
- package/skills/tavily/references/browser-setup.md +100 -0
- package/taskmaster-docs/USER-GUIDE.md +36 -10
- package/templates/.DS_Store +0 -0
- package/templates/customer/.DS_Store +0 -0
- package/templates/customer/agents/.DS_Store +0 -0
- package/templates/customer/agents/admin/BOOTSTRAP.md +20 -8
- package/templates/taskmaster/.gitignore +1 -0
- package/templates/tradesupport/agents/admin/BOOTSTRAP.md +13 -2
- package/dist/control-ui/assets/index-kKBJzIuf.js.map +0 -1
|
@@ -32,7 +32,13 @@ function emit(event) {
|
|
|
32
32
|
function resolveWatchPaths(workspaceDir, config) {
|
|
33
33
|
const paths = [];
|
|
34
34
|
if (workspaceDir.trim()) {
|
|
35
|
-
|
|
35
|
+
// Agent workspace dirs may be subdirs (e.g. ~/taskmaster/agents/public) but
|
|
36
|
+
// skills/ lives at the workspace root (e.g. ~/taskmaster/skills/).
|
|
37
|
+
const rootMatch = workspaceDir.replace(/\/+$/, "").match(/^(.+)\/agents\/[^/]+$/);
|
|
38
|
+
const skillsDir = rootMatch
|
|
39
|
+
? path.join(rootMatch[1], "skills")
|
|
40
|
+
: path.join(workspaceDir, "skills");
|
|
41
|
+
paths.push(skillsDir);
|
|
36
42
|
}
|
|
37
43
|
paths.push(path.join(CONFIG_DIR, "skills"));
|
|
38
44
|
const extraDirsRaw = config?.skills?.load?.extraDirs ?? [];
|
|
@@ -110,8 +110,13 @@ function loadSkillEntries(workspaceDir, opts) {
|
|
|
110
110
|
return [];
|
|
111
111
|
};
|
|
112
112
|
const managedSkillsDir = opts?.managedSkillsDir ?? path.join(CONFIG_DIR, "skills");
|
|
113
|
-
|
|
114
|
-
|
|
113
|
+
// Agent workspace dirs may be subdirs (e.g. ~/taskmaster/agents/public) but
|
|
114
|
+
// skills/ lives at the workspace root (e.g. ~/taskmaster/skills/).
|
|
115
|
+
// Resolve the root by stripping a trailing /agents/{id} suffix.
|
|
116
|
+
const rootMatch = workspaceDir.replace(/\/+$/, "").match(/^(.+)\/agents\/[^/]+$/);
|
|
117
|
+
const workspaceSkillsDir = rootMatch
|
|
118
|
+
? path.join(rootMatch[1], "skills")
|
|
119
|
+
: path.join(workspaceDir, "skills");
|
|
115
120
|
const extraDirsRaw = opts?.config?.skills?.load?.extraDirs ?? [];
|
|
116
121
|
const extraDirs = extraDirsRaw
|
|
117
122
|
.map((d) => (typeof d === "string" ? d.trim() : ""))
|
|
@@ -121,12 +126,9 @@ function loadSkillEntries(workspaceDir, opts) {
|
|
|
121
126
|
config: opts?.config,
|
|
122
127
|
});
|
|
123
128
|
const mergedExtraDirs = [...extraDirs, ...pluginSkillDirs];
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
source: "taskmaster-bundled",
|
|
128
|
-
})
|
|
129
|
-
: [];
|
|
129
|
+
// Bundled skills are NOT loaded at runtime. They are synced to the workspace
|
|
130
|
+
// on gateway startup (syncBundledSkillsToWorkspace). Agents read skills
|
|
131
|
+
// exclusively from the workspace.
|
|
130
132
|
const extraSkills = mergedExtraDirs.flatMap((dir) => {
|
|
131
133
|
const resolved = resolveUserPath(dir);
|
|
132
134
|
return loadSkills({
|
|
@@ -143,11 +145,9 @@ function loadSkillEntries(workspaceDir, opts) {
|
|
|
143
145
|
source: "taskmaster-workspace",
|
|
144
146
|
});
|
|
145
147
|
const merged = new Map();
|
|
146
|
-
// Precedence: extra <
|
|
148
|
+
// Precedence: extra < managed < workspace
|
|
147
149
|
for (const skill of extraSkills)
|
|
148
150
|
merged.set(skill.name, skill);
|
|
149
|
-
for (const skill of bundledSkills)
|
|
150
|
-
merged.set(skill.name, skill);
|
|
151
151
|
for (const skill of managedSkills)
|
|
152
152
|
merged.set(skill.name, skill);
|
|
153
153
|
for (const skill of workspaceSkills)
|
|
@@ -243,6 +243,42 @@ export async function syncSkillsToWorkspace(params) {
|
|
|
243
243
|
}
|
|
244
244
|
});
|
|
245
245
|
}
|
|
246
|
+
/**
|
|
247
|
+
* Copy bundled skills into a workspace's `skills/` directory.
|
|
248
|
+
* Only copies skills whose target directory does not already exist,
|
|
249
|
+
* preserving any user modifications to existing workspace skills.
|
|
250
|
+
*/
|
|
251
|
+
export async function syncBundledSkillsToWorkspace(workspaceDir, opts) {
|
|
252
|
+
const bundledDir = opts?.bundledSkillsDir ?? resolveBundledSkillsDir();
|
|
253
|
+
if (!bundledDir)
|
|
254
|
+
return { synced: [] };
|
|
255
|
+
let entries;
|
|
256
|
+
try {
|
|
257
|
+
entries = await fsp
|
|
258
|
+
.readdir(bundledDir, { withFileTypes: true })
|
|
259
|
+
.then((dirents) => dirents.filter((d) => d.isDirectory()).map((d) => d.name));
|
|
260
|
+
}
|
|
261
|
+
catch {
|
|
262
|
+
return { synced: [] };
|
|
263
|
+
}
|
|
264
|
+
const targetSkillsDir = path.join(workspaceDir, "skills");
|
|
265
|
+
await fsp.mkdir(targetSkillsDir, { recursive: true });
|
|
266
|
+
const synced = [];
|
|
267
|
+
for (const name of entries) {
|
|
268
|
+
const dest = path.join(targetSkillsDir, name);
|
|
269
|
+
if (fs.existsSync(dest))
|
|
270
|
+
continue;
|
|
271
|
+
try {
|
|
272
|
+
await fsp.cp(path.join(bundledDir, name), dest, { recursive: true });
|
|
273
|
+
synced.push(name);
|
|
274
|
+
}
|
|
275
|
+
catch (error) {
|
|
276
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
277
|
+
skillsLogger.warn(`failed to sync bundled skill "${name}" to workspace: ${message}`);
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
return { synced };
|
|
281
|
+
}
|
|
246
282
|
export function filterWorkspaceSkillEntries(entries, config) {
|
|
247
283
|
return filterSkillEntries(entries, config);
|
|
248
284
|
}
|
|
@@ -25,7 +25,7 @@ function buildMemorySection(params) {
|
|
|
25
25
|
}
|
|
26
26
|
return [
|
|
27
27
|
"## Memory Recall",
|
|
28
|
-
"
|
|
28
|
+
"Memory is your knowledge base — customer profiles, business data, preferences, prior interactions, lessons, and instructions all live there. Proactively use memory_search whenever a topic might have stored context: who a person is, what was discussed before, business rules, pricing, product details, or anything that could have been recorded. Do not rely on conversation history alone — it only covers the current session. Use memory_get to pull specific lines when you know the file. If a search returns no results, say you checked.",
|
|
29
29
|
"",
|
|
30
30
|
];
|
|
31
31
|
}
|
|
@@ -120,7 +120,7 @@ export function buildAgentSystemPrompt(params) {
|
|
|
120
120
|
ls: "List directory contents",
|
|
121
121
|
exec: "Run shell commands (pty available for TTY-required CLIs)",
|
|
122
122
|
process: "Manage background exec sessions",
|
|
123
|
-
web_search: "Search the web
|
|
123
|
+
web_search: "Search the web",
|
|
124
124
|
web_fetch: "Fetch and extract readable content from a URL",
|
|
125
125
|
// Channel docking: add login tools here when a channel needs interactive linking.
|
|
126
126
|
browser: "Control web browser",
|
package/dist/build-info.json
CHANGED
|
@@ -118,6 +118,9 @@ export function buildDefaultAgentList(workspaceRoot) {
|
|
|
118
118
|
},
|
|
119
119
|
tools: {
|
|
120
120
|
allow: [
|
|
121
|
+
"read",
|
|
122
|
+
"write",
|
|
123
|
+
"edit",
|
|
121
124
|
"message",
|
|
122
125
|
"memory_search",
|
|
123
126
|
"memory_get",
|
|
@@ -143,7 +146,7 @@ export function buildDefaultAgentList(workspaceRoot) {
|
|
|
143
146
|
"browser",
|
|
144
147
|
"skill_read",
|
|
145
148
|
],
|
|
146
|
-
deny: ["exec", "process", "group:
|
|
149
|
+
deny: ["exec", "process", "group:runtime", "canvas"],
|
|
147
150
|
},
|
|
148
151
|
};
|
|
149
152
|
return [publicAgent, adminAgent];
|