@rubytech/taskmaster 1.0.6 → 1.0.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.
@@ -7,7 +7,9 @@ const log = createSubsystemLogger("gateway/skills");
7
7
  const listeners = new Set();
8
8
  const workspaceVersions = new Map();
9
9
  const watchers = new Map();
10
- let globalVersion = 0;
10
+ // Start at 1 so that any cached session snapshot with version 0 is treated as
11
+ // stale on the first message after a gateway restart.
12
+ let globalVersion = 1;
11
13
  export const DEFAULT_SKILLS_WATCH_IGNORED = [
12
14
  /(^|[\\/])\.git([\\/]|$)/,
13
15
  /(^|[\\/])node_modules([\\/]|$)/,
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "1.0.6",
3
- "commit": "f50bf4225d9f628ae369ac7b6d520687095a688d",
4
- "builtAt": "2026-02-15T08:03:07.343Z"
2
+ "version": "1.0.8",
3
+ "commit": "18b18df8a843681fe3d585bf38cb926ec68220c4",
4
+ "builtAt": "2026-02-15T08:55:24.911Z"
5
5
  }
@@ -22,6 +22,7 @@ export function registerProvisionCli(program) {
22
22
  .option("--port <port>", `Gateway port (default: ${DEFAULT_GATEWAY_PORT})`)
23
23
  .option("--workspace <path>", `Workspace path (default: ${DEFAULT_WORKSPACE})`)
24
24
  .option("--force", "Overwrite existing config and workspace")
25
+ .option("--skip-platform", "Skip platform setup (avahi, hostname, mDNS) — used by install.sh")
25
26
  .action(async (opts) => {
26
27
  await runProvision(opts);
27
28
  });
@@ -34,6 +35,7 @@ async function runProvision(opts) {
34
35
  }
35
36
  const workspace = opts.workspace ? path.resolve(opts.workspace) : DEFAULT_WORKSPACE;
36
37
  const force = Boolean(opts.force);
38
+ const skipPlatform = Boolean(opts.skipPlatform);
37
39
  const isLinux = process.platform === "linux";
38
40
  console.log("");
39
41
  console.log("Taskmaster Provision");
@@ -46,7 +48,12 @@ async function runProvision(opts) {
46
48
  // Step 3: Write agent list to config
47
49
  await writeAgentList(workspace);
48
50
  // Step 4-6: Linux-only mDNS setup
49
- if (isLinux) {
51
+ if (skipPlatform) {
52
+ console.log("[4/7] Avahi: handled by install script");
53
+ console.log("[5/7] Hostname: handled by install script");
54
+ console.log("[6/7] mDNS: handled by install script");
55
+ }
56
+ else if (isLinux) {
50
57
  await installAvahi();
51
58
  await setHostname();
52
59
  await registerMdnsService(port);
@@ -21,7 +21,6 @@ export function buildSeedConfig() {
21
21
  mode: "local",
22
22
  bind: "lan",
23
23
  controlUi: { allowInsecureAuth: true },
24
- auth: { mode: "token" },
25
24
  },
26
25
  agents: {
27
26
  defaults: {
@@ -87,11 +86,7 @@ export function buildDefaultAgentList(workspaceRoot) {
87
86
  ],
88
87
  },
89
88
  write: {
90
- include: [
91
- "memory/users/{peer}/**",
92
- "memory/groups/{peer}/**",
93
- "memory/shared/events/**",
94
- ],
89
+ include: ["memory/users/{peer}/**", "memory/groups/{peer}/**", "memory/shared/events/**"],
95
90
  },
96
91
  },
97
92
  },
@@ -15,7 +15,7 @@ async function findPackageRoot(startDir, maxDepth = 12) {
15
15
  let current = path.resolve(startDir);
16
16
  for (let i = 0; i < maxDepth; i += 1) {
17
17
  const name = await readPackageName(current);
18
- if (name === "taskmaster")
18
+ if (name === "taskmaster" || name === "@rubytech/taskmaster")
19
19
  return current;
20
20
  const parent = path.dirname(current);
21
21
  if (parent === current)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rubytech/taskmaster",
3
- "version": "1.0.6",
3
+ "version": "1.0.8",
4
4
  "description": "AI-powered business assistant for small businesses",
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -118,8 +118,79 @@ if [ -n "$PORT" ]; then
118
118
  PROVISION_ARGS="--port $PORT"
119
119
  fi
120
120
 
121
- # shellcheck disable=SC2086
122
- taskmaster provision $PROVISION_ARGS
121
+ REAL_USER="${SUDO_USER:-$(whoami)}"
122
+ MDNS_PORT="${PORT:-18789}"
123
+
124
+ if [ "$(id -u)" = "0" ] && [ "$REAL_USER" != "root" ]; then
125
+ # ── Running as root via sudo ──
126
+ # Platform setup needs root. Provision (config, workspace, daemon) needs
127
+ # to run as the real user so paths resolve to their home and systemctl
128
+ # --user has a D-Bus session.
129
+
130
+ if [ "$PLATFORM" = "linux" ]; then
131
+ echo "Platform setup..."
132
+
133
+ # Avahi / mDNS
134
+ apt-get install -y avahi-daemon avahi-utils >/dev/null 2>&1 \
135
+ && echo " avahi-daemon installed" \
136
+ || echo " avahi-daemon install failed (continuing)"
137
+
138
+ # Hostname
139
+ hostnamectl set-hostname taskmaster 2>/dev/null \
140
+ && echo " hostname set to 'taskmaster'" \
141
+ || echo " hostname set failed (continuing)"
142
+
143
+ # Ensure /etc/hosts resolves the new hostname (sudo warns otherwise)
144
+ if ! grep -q "taskmaster" /etc/hosts 2>/dev/null; then
145
+ echo "127.0.0.1 taskmaster" >> /etc/hosts
146
+ fi
147
+
148
+ # mDNS service file
149
+ mkdir -p /etc/avahi/services
150
+ cat > /etc/avahi/services/taskmaster.service << XMLEOF
151
+ <?xml version="1.0" standalone='no'?>
152
+ <!DOCTYPE service-group SYSTEM "avahi-service.dtd">
153
+ <service-group>
154
+ <name replace-wildcards="yes">Taskmaster on %h</name>
155
+ <service>
156
+ <type>_http._tcp</type>
157
+ <port>${MDNS_PORT}</port>
158
+ <txt-record>path=/</txt-record>
159
+ </service>
160
+ </service-group>
161
+ XMLEOF
162
+ systemctl restart avahi-daemon 2>/dev/null || true
163
+ echo " mDNS service registered on port $MDNS_PORT"
164
+
165
+ # Enable user services so systemctl --user works after logout
166
+ REAL_UID=$(id -u "$REAL_USER")
167
+ loginctl enable-linger "$REAL_USER" 2>/dev/null || true
168
+ systemctl start "user@${REAL_UID}.service" 2>/dev/null || true
169
+
170
+ # Wait for user D-Bus session bus
171
+ for _i in $(seq 1 10); do
172
+ [ -S "/run/user/$REAL_UID/bus" ] && break
173
+ sleep 0.5
174
+ done
175
+ fi
176
+
177
+ # Resolve real user's home
178
+ REAL_HOME=$(getent passwd "$REAL_USER" 2>/dev/null | cut -d: -f6)
179
+ [ -z "$REAL_HOME" ] && REAL_HOME="/home/$REAL_USER"
180
+ REAL_UID=$(id -u "$REAL_USER")
181
+
182
+ # Run provision as the real user
183
+ # shellcheck disable=SC2086
184
+ sudo -u "$REAL_USER" \
185
+ HOME="$REAL_HOME" \
186
+ XDG_RUNTIME_DIR="/run/user/$REAL_UID" \
187
+ DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/$REAL_UID/bus" \
188
+ taskmaster provision --skip-platform $PROVISION_ARGS
189
+ else
190
+ # Not root, or running as actual root — run provision normally
191
+ # shellcheck disable=SC2086
192
+ taskmaster provision $PROVISION_ARGS
193
+ fi
123
194
 
124
195
  echo ""
125
196
  echo "Installation complete."
@@ -1,3 +1,8 @@
1
+ ---
2
+ name: event-management
3
+ description: "Manage anything time-bound: appointments, meetings, reminders, follow-ups, callbacks, deadlines — any scheduled action between one or more parties."
4
+ ---
5
+
1
6
  # Event Management
2
7
 
3
8
  Applies when handling anything time-bound: appointments, meetings, reminders, follow-ups, callbacks, deadlines — any commitment or scheduled action between one or more parties.
@@ -1,15 +1,9 @@
1
- # Taskmaster Product Skill
2
-
3
- <description>
4
- Handle enquiries about Taskmaster — the AI business assistant for UK tradespeople.
5
- </description>
1
+ ---
2
+ name: taskmaster
3
+ description: "Handle enquiries about Taskmaster — the AI business assistant for small businesses. Product info, pricing, signup, licensing, and support."
4
+ ---
6
5
 
7
- <triggers>
8
- - Questions about Taskmaster, the product, pricing, or signup
9
- - "What is Taskmaster?", "How does it work?", "How much does it cost?"
10
- - Interest in AI assistant for trades business
11
- - Requests for demo, trial, or signup
12
- </triggers>
6
+ # Taskmaster Product Skill
13
7
 
14
8
  ---
15
9
 
@@ -43,9 +43,7 @@ curl -fsSL https://taskmaster.bot/install.sh | sudo bash
43
43
  ```
44
44
 
45
45
  3. Wait for it to finish (a few minutes — it installs Node.js if needed)
46
- 4. Open the Pi's web browser and go to: **http://localhost:18789/setup**
47
-
48
- You can also access the setup page from any other device on the same network at **http://taskmaster.local:18789/setup**.
46
+ 4. Open a browser on any device on the same Wi-Fi network and go to: **http://taskmaster.local:18789/setup**
49
47
 
50
48
  > After installation, Taskmaster runs in the background and starts automatically when the Pi restarts. You can disconnect the monitor and keyboard.
51
49
 
@@ -57,7 +55,7 @@ Open **Terminal** (search for "Terminal" in Spotlight) and run:
57
55
  curl -fsSL https://taskmaster.bot/install.sh | sudo bash
58
56
  ```
59
57
 
60
- This installs Node.js (if needed), Taskmaster, and sets up the background service. Once finished, open your browser and go to: **http://localhost:18789/setup**
58
+ This installs Node.js (if needed), Taskmaster, and sets up the background service. Once finished, open your browser and go to: **http://taskmaster.local:18789/setup**
61
59
 
62
60
  **Custom port:** If you're running multiple Taskmaster instances (e.g., one on a Pi and one on a Mac), give each a different port:
63
61
 
@@ -77,9 +75,9 @@ npm install -g ~/Downloads/rubytech-taskmaster-2026.2.14.tgz
77
75
  taskmaster provision
78
76
  ```
79
77
 
80
- 4. Open your browser and go to: **http://localhost:18789**
78
+ 4. Open your browser and go to: **http://taskmaster.local:18789/setup**
81
79
 
82
- > Taskmaster runs in the background and starts automatically when your Mac restarts. You can close Terminal after installation.
80
+ > Taskmaster runs in the background and starts automatically when your device restarts. You can close the terminal after installation.
83
81
 
84
82
  ---
85
83