@rubytech/taskmaster 1.21.1 → 1.21.2

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.
@@ -10,6 +10,17 @@ const SkillPackInstallSchema = Type.Object({
10
10
  description: "Absolute path to the .skillpack.json file received as an attachment.",
11
11
  }),
12
12
  });
13
+ /**
14
+ * Resolve the workspace root from the agent workspace dir.
15
+ * Agent tools receive workspaceDir = agent CWD (e.g. ~/taskmaster/agents/admin/)
16
+ * but skills.create writes to the workspace root (e.g. ~/taskmaster/).
17
+ * Strip trailing /agents/<name> to match where skills actually live.
18
+ */
19
+ function resolveSkillsRoot(agentWorkspaceDir) {
20
+ const normalised = agentWorkspaceDir.replace(/\/+$/, "");
21
+ const match = normalised.match(/^(.+)\/agents\/[^/]+$/);
22
+ return match ? match[1] : normalised;
23
+ }
13
24
  export function createSkillPackInstallTool(opts) {
14
25
  return {
15
26
  label: "Skill Pack Install",
@@ -44,8 +55,10 @@ export function createSkillPackInstallTool(opts) {
44
55
  throw new Error("This skill pack is licensed for a different device. " +
45
56
  "It cannot be installed on this device.");
46
57
  }
58
+ // skills.create writes to workspace root, not agent subdir
59
+ const skillsRoot = resolveSkillsRoot(opts.workspaceDir);
47
60
  // Check if all skills in this pack version are already installed
48
- const allAlreadyInstalled = await allSkillsInstalled(opts.workspaceDir, payload.content.skills.map((s) => s.id), payload.pack.id, payload.pack.version);
61
+ const allAlreadyInstalled = await allSkillsInstalled(skillsRoot, payload.content.skills.map((s) => s.id), payload.pack.id, payload.pack.version);
49
62
  if (allAlreadyInstalled) {
50
63
  return jsonResult({
51
64
  ok: true,
@@ -67,8 +80,8 @@ export function createSkillPackInstallTool(opts) {
67
80
  skillContent: entry.skill,
68
81
  ...(references.length > 0 ? { references } : {}),
69
82
  });
70
- // Write marker file for each skill
71
- const skillDir = path.join(opts.workspaceDir, "skills", entry.id);
83
+ // Write marker file use workspace root where skills.create puts the skill
84
+ const skillDir = path.join(skillsRoot, "skills", entry.id);
72
85
  const marker = {
73
86
  packId: payload.pack.id,
74
87
  version: payload.pack.version,
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "1.21.1",
3
- "commit": "a9d05c02ef2f2cf9eb7cfb55ee76266fea595687",
4
- "builtAt": "2026-03-06T20:52:13.028Z"
2
+ "version": "1.21.2",
3
+ "commit": "ffd98ac2beb01992a243d3dee11c1a5c8dac870c",
4
+ "builtAt": "2026-03-06T21:01:06.591Z"
5
5
  }
@@ -2145,7 +2145,7 @@ export class MemoryIndexManager {
2145
2145
  throw err;
2146
2146
  }
2147
2147
  const waitMs = Math.min(EMBEDDING_RETRY_MAX_DELAY_MS, Math.round(delayMs * (1 + Math.random() * 0.2)));
2148
- log.warn(`memory embeddings rate limited; retrying in ${waitMs}ms`);
2148
+ log.warn(`memory embeddings error (retrying in ${waitMs}ms): ${message}`);
2149
2149
  await new Promise((resolve) => setTimeout(resolve, waitMs));
2150
2150
  delayMs *= 2;
2151
2151
  attempt += 1;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rubytech/taskmaster",
3
- "version": "1.21.1",
3
+ "version": "1.21.2",
4
4
  "description": "AI-powered business assistant for small businesses",
5
5
  "publishConfig": {
6
6
  "access": "public"