@rubytech/taskmaster 1.44.4 → 1.44.6

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.
Files changed (46) hide show
  1. package/dist/agents/pi-embedded-subscribe.handlers.tools.js +4 -1
  2. package/dist/agents/pi-tools.js +44 -28
  3. package/dist/agents/system-prompt.js +1 -1
  4. package/dist/agents/tool-policy.js +2 -0
  5. package/dist/build-info.json +3 -3
  6. package/dist/gateway/server.impl.js +25 -2
  7. package/dist/license/revalidation.js +16 -0
  8. package/extensions/.npmignore +1 -0
  9. package/package.json +52 -62
  10. package/scripts/install.sh +0 -0
  11. package/templates/.DS_Store +0 -0
  12. package/templates/beacons/.DS_Store +0 -0
  13. package/templates/beacons/agents/.DS_Store +0 -0
  14. package/templates/beacons/memory/.DS_Store +0 -0
  15. package/templates/beacons/skills/.DS_Store +0 -0
  16. package/templates/beacons/skills/buyer-management/.DS_Store +0 -0
  17. package/templates/beagle-taxi/.DS_Store +0 -0
  18. package/templates/beagle-taxi/agents/.DS_Store +0 -0
  19. package/templates/beagle-taxi/memory/.DS_Store +0 -0
  20. package/templates/beagle-taxi/skills/.DS_Store +0 -0
  21. package/templates/beagle-zanzibar/.DS_Store +0 -0
  22. package/templates/beagle-zanzibar/agents/.DS_Store +0 -0
  23. package/templates/beagle-zanzibar/memory/.DS_Store +0 -0
  24. package/templates/beagle-zanzibar/skills/.DS_Store +0 -0
  25. package/templates/customer/.DS_Store +0 -0
  26. package/templates/customer/agents/.DS_Store +0 -0
  27. package/templates/education-hero/.DS_Store +0 -0
  28. package/templates/education-hero/agents/.DS_Store +0 -0
  29. package/templates/education-hero/agents/admin/.DS_Store +0 -0
  30. package/templates/education-hero/skills/.DS_Store +0 -0
  31. package/templates/education-hero/skills/education-hero/.DS_Store +0 -0
  32. package/templates/maxy/.DS_Store +0 -0
  33. package/templates/maxy/.gitignore +1 -0
  34. package/templates/maxy/agents/.DS_Store +0 -0
  35. package/templates/maxy/agents/admin/.DS_Store +0 -0
  36. package/templates/maxy/memory/.DS_Store +0 -0
  37. package/templates/maxy/skills/.DS_Store +0 -0
  38. package/templates/muvin/.DS_Store +0 -0
  39. package/templates/muvin/skills/.DS_Store +0 -0
  40. package/templates/muvin/skills/buyer-management/.DS_Store +0 -0
  41. package/templates/real-agent/.DS_Store +0 -0
  42. package/templates/real-agent/skills/.DS_Store +0 -0
  43. package/templates/real-agent/skills/buyer-management/.DS_Store +0 -0
  44. package/templates/taskmaster/.DS_Store +0 -0
  45. package/templates/taskmaster/.gitignore +1 -0
  46. package/templates/taskmaster/skills/.DS_Store +0 -0
@@ -166,7 +166,10 @@ export function handleToolExecutionEnd(ctx, evt) {
166
166
  isError: isToolError,
167
167
  },
168
168
  });
169
- ctx.log.debug(`embedded run tool end: runId=${ctx.params.runId} tool=${toolName} toolCallId=${toolCallId}`);
169
+ const errorSuffix = isToolError
170
+ ? ` error=${extractToolErrorMessage(sanitizedResult) ?? "unknown"}`
171
+ : "";
172
+ ctx.log.debug(`embedded run tool end: runId=${ctx.params.runId} tool=${toolName} toolCallId=${toolCallId} isError=${isToolError}${errorSuffix}`);
170
173
  if (ctx.params.onToolResult && ctx.shouldEmitToolOutput()) {
171
174
  const outputText = extractToolResultText(sanitizedResult);
172
175
  if (outputText) {
@@ -11,7 +11,7 @@ import { assertRequiredParams, CLAUDE_PARAM_GROUPS, createTaskmasterReadTool, cr
11
11
  import { cleanToolSchemaForGemini, normalizeToolParameters } from "./pi-tools.schema.js";
12
12
  import { buildPluginToolGroups, collectExplicitAllowlist, expandPolicyWithPluginGroups, normalizeToolName, resolveToolProfilePolicy, stripPluginOnlyAllowlist, } from "./tool-policy.js";
13
13
  import { getPluginToolMeta } from "../plugins/tools.js";
14
- import { logWarn } from "../logger.js";
14
+ import { logInfo, logWarn } from "../logger.js";
15
15
  function isOpenAIProvider(provider) {
16
16
  const normalized = provider?.trim().toLowerCase();
17
17
  return normalized === "openai" || normalized === "openai-codex";
@@ -254,33 +254,49 @@ export function createTaskmasterCodingTools(options) {
254
254
  const groupPolicyExpanded = resolvePolicy(groupPolicy, "group tools.allow");
255
255
  const sandboxPolicyExpanded = expandPolicyWithPluginGroups(sandbox?.tools, pluginGroups);
256
256
  const subagentPolicyExpanded = expandPolicyWithPluginGroups(subagentPolicy, pluginGroups);
257
- const toolsFiltered = profilePolicyExpanded
258
- ? filterToolsByPolicy(tools, profilePolicyExpanded)
259
- : tools;
260
- const providerProfileFiltered = providerProfileExpanded
261
- ? filterToolsByPolicy(toolsFiltered, providerProfileExpanded)
262
- : toolsFiltered;
263
- const globalFiltered = globalPolicyExpanded
264
- ? filterToolsByPolicy(providerProfileFiltered, globalPolicyExpanded)
265
- : providerProfileFiltered;
266
- const globalProviderFiltered = globalProviderExpanded
267
- ? filterToolsByPolicy(globalFiltered, globalProviderExpanded)
268
- : globalFiltered;
269
- const agentFiltered = agentPolicyExpanded
270
- ? filterToolsByPolicy(globalProviderFiltered, agentPolicyExpanded)
271
- : globalProviderFiltered;
272
- const agentProviderFiltered = agentProviderExpanded
273
- ? filterToolsByPolicy(agentFiltered, agentProviderExpanded)
274
- : agentFiltered;
275
- const groupFiltered = groupPolicyExpanded
276
- ? filterToolsByPolicy(agentProviderFiltered, groupPolicyExpanded)
277
- : agentProviderFiltered;
278
- const sandboxed = sandboxPolicyExpanded
279
- ? filterToolsByPolicy(groupFiltered, sandboxPolicyExpanded)
280
- : groupFiltered;
281
- const subagentFiltered = subagentPolicyExpanded
282
- ? filterToolsByPolicy(sandboxed, subagentPolicyExpanded)
283
- : sandboxed;
257
+ // ── Cascading tool filter with diagnostic logging ─────────────────────
258
+ const filterStage = (input, policy, label) => {
259
+ if (!policy)
260
+ return input;
261
+ const output = filterToolsByPolicy(input, policy);
262
+ const inputNames = new Set(input.map((t) => normalizeToolName(t.name)));
263
+ const outputNames = new Set(output.map((t) => normalizeToolName(t.name)));
264
+ const removed = [...inputNames].filter((n) => !outputNames.has(n));
265
+ if (removed.length > 0) {
266
+ const sessionLabel = options?.sessionKey ?? "unknown-session";
267
+ logInfo(`[tool-filter] ${sessionLabel} | ${label} removed ${removed.length} tools: ${removed.join(", ")}`);
268
+ }
269
+ return output;
270
+ };
271
+ // When the agent has an explicit allow list, merge it with the profile's
272
+ // allow list so the agent can grant tools beyond the profile baseline.
273
+ // The profile sets a default scope; the agent config can expand it.
274
+ // Deny lists and PROFILE_NEVER_GRANT still restrict regardless.
275
+ const effectiveProfilePolicy = (() => {
276
+ if (!profilePolicyExpanded || !agentPolicyExpanded?.allow?.length) {
277
+ return profilePolicyExpanded;
278
+ }
279
+ const mergedAllow = [
280
+ ...(profilePolicyExpanded.allow ?? []),
281
+ ...(agentPolicyExpanded.allow ?? []),
282
+ ];
283
+ return { ...profilePolicyExpanded, allow: mergedAllow };
284
+ })();
285
+ const toolsFiltered = filterStage(tools, effectiveProfilePolicy, `profile(${effectiveProfile ?? "none"})+agent`);
286
+ const providerProfileFiltered = filterStage(toolsFiltered, providerProfileExpanded, "providerProfile");
287
+ const globalFiltered = filterStage(providerProfileFiltered, globalPolicyExpanded, "global");
288
+ const globalProviderFiltered = filterStage(globalFiltered, globalProviderExpanded, "globalProvider");
289
+ const agentFiltered = filterStage(globalProviderFiltered, agentPolicyExpanded, `agent(${agentId ?? "?"})`);
290
+ const agentProviderFiltered = filterStage(agentFiltered, agentProviderExpanded, "agentProvider");
291
+ const groupFiltered = filterStage(agentProviderFiltered, groupPolicyExpanded, "group");
292
+ const sandboxed = filterStage(groupFiltered, sandboxPolicyExpanded, "sandbox");
293
+ const subagentFiltered = filterStage(sandboxed, subagentPolicyExpanded, "subagent");
294
+ // Log final tool set for observability.
295
+ {
296
+ const sessionLabel = options?.sessionKey ?? "unknown-session";
297
+ const finalNames = subagentFiltered.map((t) => normalizeToolName(t.name)).sort();
298
+ logInfo(`[tool-filter] ${sessionLabel} | profile=${effectiveProfile ?? "none"} | final tools (${finalNames.length}): ${finalNames.join(", ")}`);
299
+ }
284
300
  // Always normalize tool JSON Schemas before handing them to pi-agent/pi-ai.
285
301
  // Without this, some providers (notably OpenAI) will reject root-level union schemas.
286
302
  const normalized = subagentFiltered.map(normalizeToolParameters);
@@ -343,7 +343,7 @@ export function buildAgentSystemPrompt(params) {
343
343
  "- `spawn:documents` — read and produce documents: PDFs, spreadsheets, QR codes",
344
344
  "- `spawn:contacts` — manage contacts: lookup, create, update, verify",
345
345
  "- `spawn:web` — research online: web search, URL fetch, file access",
346
- "- `spawn:admin` — system administration and diagnostics: manage admins, status checks, settings, log review, error triage, performance analysis, automation",
346
+ "- `spawn:admin` — system administration, licensing, and diagnostics: manage admins, generate licenses, status checks, settings, log review, error triage, performance analysis, automation",
347
347
  "- `spawn:automation` — scheduled tasks: cron jobs, gateway management, updates, tunnel",
348
348
  "- `spawn:ui` — visual work: browser control, canvas",
349
349
  "- `spawn:worker` — general-purpose (files, memory, web, docs, images, skills)",
@@ -68,6 +68,7 @@ export const TOOL_GROUPS = {
68
68
  "account_manage",
69
69
  "access_manage",
70
70
  "license_manage",
71
+ "license_generate",
71
72
  ],
72
73
  // All Taskmaster native tools (excludes provider plugins).
73
74
  "group:taskmaster": [
@@ -123,6 +124,7 @@ export const TOOL_GROUPS = {
123
124
  "account_manage",
124
125
  "access_manage",
125
126
  "license_manage",
127
+ "license_generate",
126
128
  "tunnel_status",
127
129
  "tunnel_enable",
128
130
  "tunnel_disable",
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "1.44.4",
3
- "commit": "b8d7b214abfbb7854ac8d717f1d474cda32f8bf2",
4
- "builtAt": "2026-03-22T15:16:51.871Z"
2
+ "version": "1.44.6",
3
+ "commit": "31dc9e5ff41b22999649e64f27616ee768700bba",
4
+ "builtAt": "2026-03-26T15:26:35.627Z"
5
5
  }
@@ -68,9 +68,10 @@ import { loadGatewayTlsRuntime } from "./server/tls.js";
68
68
  import { isLoopbackHost } from "./net.js";
69
69
  import { createWizardSessionTracker } from "./server-wizard-sessions.js";
70
70
  import { attachGatewayWsHandlers } from "./server-ws-runtime.js";
71
- import { isLicenseValid } from "../license/validate.js";
71
+ import { isLicenseValid, validateLicenseKey } from "../license/validate.js";
72
72
  import { setLicensed } from "../license/state.js";
73
73
  import { startLicenseRevalidation, stopLicenseRevalidation } from "../license/revalidation.js";
74
+ import { getDeviceId } from "../license/device-id.js";
74
75
  export { __resetModelCatalogCacheForTest } from "./server-model-catalog.js";
75
76
  ensureTaskmasterCliOnPath();
76
77
  const log = createSubsystemLogger("gateway");
@@ -331,7 +332,29 @@ export async function startGatewayServer(port = 18789, opts = {}) {
331
332
  // License check — gateway always starts (so setup UI is reachable),
332
333
  // but pages other than /setup will redirect until a license is activated.
333
334
  const logLicense = log.child("license");
334
- const licenseOk = isLicenseValid(cfgAtStart);
335
+ let licenseOk = isLicenseValid(cfgAtStart);
336
+ // If stored state is stale but the token is cryptographically valid,
337
+ // refresh validatedAt so the license doesn't appear expired on restart.
338
+ if (!licenseOk && cfgAtStart.license?.key) {
339
+ const deviceId = getDeviceId();
340
+ const freshCheck = validateLicenseKey(cfgAtStart.license.key, deviceId);
341
+ if (freshCheck.valid) {
342
+ logLicense.info("refreshing stale validatedAt — token is still valid");
343
+ try {
344
+ const freshCfg = loadConfig();
345
+ if (freshCfg.license) {
346
+ void writeConfigFile({
347
+ ...freshCfg,
348
+ license: { ...freshCfg.license, validatedAt: new Date().toISOString() },
349
+ });
350
+ }
351
+ }
352
+ catch (err) {
353
+ logLicense.warn(`failed to refresh validatedAt: ${String(err)}`);
354
+ }
355
+ licenseOk = true;
356
+ }
357
+ }
335
358
  setLicensed(licenseOk);
336
359
  if (!licenseOk) {
337
360
  logLicense.warn("no valid license — setup wizard will require activation");
@@ -15,6 +15,22 @@ function revalidate(log, onChange) {
15
15
  const result = validateLicenseKey(lic.key, deviceId);
16
16
  if (result.valid) {
17
17
  log.info("license still valid");
18
+ // Refresh validatedAt so the 30-day staleness window doesn't expire
19
+ try {
20
+ const freshConfig = loadConfig();
21
+ if (freshConfig.license) {
22
+ void writeConfigFile({
23
+ ...freshConfig,
24
+ license: {
25
+ ...freshConfig.license,
26
+ validatedAt: new Date().toISOString(),
27
+ },
28
+ });
29
+ }
30
+ }
31
+ catch (err) {
32
+ log.warn(`failed to refresh validatedAt: ${String(err)}`);
33
+ }
18
34
  return;
19
35
  }
20
36
  // Token is no longer valid (expired, wrong device, bad signature)
@@ -0,0 +1 @@
1
+ node_modules/
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rubytech/taskmaster",
3
- "version": "1.44.4",
3
+ "version": "1.44.6",
4
4
  "description": "AI-powered business assistant for small businesses",
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -79,64 +79,12 @@
79
79
  "dist/license/**",
80
80
  "dist/suggestions/**"
81
81
  ],
82
- "scripts": {
83
- "dev": "node scripts/run-node.mjs",
84
- "postinstall": "node scripts/postinstall.js",
85
- "prepack": "pnpm build && pnpm ui:build",
86
- "docs:list": "node scripts/docs-list.js",
87
- "docs:bin": "node scripts/build-docs-list.mjs",
88
- "build": "tsc -p tsconfig.json && node --import tsx scripts/canvas-a2ui-copy.ts && node --import tsx scripts/copy-hook-metadata.ts && node --import tsx scripts/write-build-info.ts",
89
- "plugins:sync": "node --import tsx scripts/sync-plugin-versions.ts",
90
- "release:check": "node --import tsx scripts/release-check.ts",
91
- "ui:install": "node scripts/ui.js install",
92
- "ui:dev": "node scripts/ui.js dev",
93
- "ui:build": "node scripts/ui.js build",
94
- "start": "node scripts/run-node.mjs",
95
- "taskmaster": "node scripts/run-node.mjs",
96
- "gateway:watch": "node scripts/watch-node.mjs gateway --force",
97
- "logs": "npx tsx scripts/session-viewer.ts",
98
- "gateway:dev": "TASKMASTER_SKIP_CHANNELS=1 node scripts/run-node.mjs --dev gateway",
99
- "gateway:dev:reset": "TASKMASTER_SKIP_CHANNELS=1 node scripts/run-node.mjs --dev gateway --reset",
100
- "tui": "node scripts/run-node.mjs tui",
101
- "tui:dev": "TASKMASTER_PROFILE=dev node scripts/run-node.mjs tui",
102
- "taskmaster:rpc": "node scripts/run-node.mjs agent --mode rpc --json",
103
- "lint": "oxlint --type-aware src test",
104
- "lint:fix": "pnpm format:fix && oxlint --type-aware --fix src test",
105
- "format": "oxfmt --check src test",
106
- "format:fix": "oxfmt --write src test",
107
- "test": "node scripts/test-parallel.mjs",
108
- "test:watch": "vitest",
109
- "test:ui": "pnpm --dir ui test",
110
- "test:force": "node --import tsx scripts/test-force.ts",
111
- "test:coverage": "vitest run --coverage",
112
- "test:e2e": "vitest run --config vitest.e2e.config.ts",
113
- "test:live": "TASKMASTER_LIVE_TEST=1 vitest run --config vitest.live.config.ts",
114
- "test:docker:onboard": "bash scripts/e2e/onboard-docker.sh",
115
- "test:docker:gateway-network": "bash scripts/e2e/gateway-network-docker.sh",
116
- "test:docker:live-models": "bash scripts/test-live-models-docker.sh",
117
- "test:docker:live-gateway": "bash scripts/test-live-gateway-models-docker.sh",
118
- "test:docker:qr": "bash scripts/e2e/qr-import-docker.sh",
119
- "test:docker:doctor-switch": "bash scripts/e2e/doctor-install-switch-docker.sh",
120
- "test:docker:plugins": "bash scripts/e2e/plugins-docker.sh",
121
- "test:docker:cleanup": "bash scripts/test-cleanup-docker.sh",
122
- "test:docker:all": "pnpm test:docker:live-models && pnpm test:docker:live-gateway && pnpm test:docker:onboard && pnpm test:docker:gateway-network && pnpm test:docker:qr && pnpm test:docker:doctor-switch && pnpm test:docker:plugins && pnpm test:docker:cleanup",
123
- "test:all": "pnpm lint && pnpm build && pnpm test && pnpm test:e2e && pnpm test:live && pnpm test:docker:all",
124
- "test:install:e2e": "bash scripts/test-install-sh-e2e-docker.sh",
125
- "test:install:smoke": "bash scripts/test-install-sh-docker.sh",
126
- "test:install:e2e:openai": "TASKMASTER_E2E_MODELS=openai bash scripts/test-install-sh-e2e-docker.sh",
127
- "test:install:e2e:anthropic": "TASKMASTER_E2E_MODELS=anthropic bash scripts/test-install-sh-e2e-docker.sh",
128
- "protocol:gen": "node --import tsx scripts/protocol-gen.ts",
129
- "protocol:check": "pnpm protocol:gen && git diff --exit-code -- dist/protocol.schema.json",
130
- "canvas:a2ui:bundle": "bash scripts/bundle-a2ui.sh",
131
- "check:loc": "node --import tsx scripts/check-ts-max-loc.ts --max 500"
132
- },
133
82
  "keywords": [],
134
83
  "author": "",
135
84
  "license": "MIT",
136
85
  "engines": {
137
86
  "node": ">=22.12.0"
138
87
  },
139
- "packageManager": "pnpm@10.23.0",
140
88
  "dependencies": {
141
89
  "@agentclientprotocol/sdk": "0.13.1",
142
90
  "@aws-sdk/client-bedrock": "^3.975.0",
@@ -231,14 +179,6 @@
231
179
  "vitest": "^4.0.18",
232
180
  "wireit": "^0.14.12"
233
181
  },
234
- "pnpm": {
235
- "minimumReleaseAge": 2880,
236
- "overrides": {
237
- "@sinclair/typebox": "0.34.47",
238
- "hono": "4.11.4",
239
- "tar": "7.5.4"
240
- }
241
- },
242
182
  "vitest": {
243
183
  "coverage": {
244
184
  "provider": "v8",
@@ -267,5 +207,55 @@
267
207
  "**/vendor/**",
268
208
  "dist/Taskmaster.app/**"
269
209
  ]
210
+ },
211
+ "scripts": {
212
+ "dev": "node scripts/run-node.mjs",
213
+ "postinstall": "node scripts/postinstall.js",
214
+ "docs:list": "node scripts/docs-list.js",
215
+ "docs:bin": "node scripts/build-docs-list.mjs",
216
+ "build": "tsc -p tsconfig.json && node --import tsx scripts/canvas-a2ui-copy.ts && node --import tsx scripts/copy-hook-metadata.ts && node --import tsx scripts/write-build-info.ts",
217
+ "plugins:sync": "node --import tsx scripts/sync-plugin-versions.ts",
218
+ "release:check": "node --import tsx scripts/release-check.ts",
219
+ "ui:install": "node scripts/ui.js install",
220
+ "ui:dev": "node scripts/ui.js dev",
221
+ "ui:build": "node scripts/ui.js build",
222
+ "start": "node scripts/run-node.mjs",
223
+ "taskmaster": "node scripts/run-node.mjs",
224
+ "gateway:watch": "node scripts/watch-node.mjs gateway --force",
225
+ "logs": "npx tsx scripts/session-viewer.ts",
226
+ "gateway:dev": "TASKMASTER_SKIP_CHANNELS=1 node scripts/run-node.mjs --dev gateway",
227
+ "gateway:dev:reset": "TASKMASTER_SKIP_CHANNELS=1 node scripts/run-node.mjs --dev gateway --reset",
228
+ "tui": "node scripts/run-node.mjs tui",
229
+ "tui:dev": "TASKMASTER_PROFILE=dev node scripts/run-node.mjs tui",
230
+ "taskmaster:rpc": "node scripts/run-node.mjs agent --mode rpc --json",
231
+ "lint": "oxlint --type-aware src test",
232
+ "lint:fix": "pnpm format:fix && oxlint --type-aware --fix src test",
233
+ "format": "oxfmt --check src test",
234
+ "format:fix": "oxfmt --write src test",
235
+ "test": "node scripts/test-parallel.mjs",
236
+ "test:watch": "vitest",
237
+ "test:ui": "pnpm --dir ui test",
238
+ "test:force": "node --import tsx scripts/test-force.ts",
239
+ "test:coverage": "vitest run --coverage",
240
+ "test:e2e": "vitest run --config vitest.e2e.config.ts",
241
+ "test:live": "TASKMASTER_LIVE_TEST=1 vitest run --config vitest.live.config.ts",
242
+ "test:docker:onboard": "bash scripts/e2e/onboard-docker.sh",
243
+ "test:docker:gateway-network": "bash scripts/e2e/gateway-network-docker.sh",
244
+ "test:docker:live-models": "bash scripts/test-live-models-docker.sh",
245
+ "test:docker:live-gateway": "bash scripts/test-live-gateway-models-docker.sh",
246
+ "test:docker:qr": "bash scripts/e2e/qr-import-docker.sh",
247
+ "test:docker:doctor-switch": "bash scripts/e2e/doctor-install-switch-docker.sh",
248
+ "test:docker:plugins": "bash scripts/e2e/plugins-docker.sh",
249
+ "test:docker:cleanup": "bash scripts/test-cleanup-docker.sh",
250
+ "test:docker:all": "pnpm test:docker:live-models && pnpm test:docker:live-gateway && pnpm test:docker:onboard && pnpm test:docker:gateway-network && pnpm test:docker:qr && pnpm test:docker:doctor-switch && pnpm test:docker:plugins && pnpm test:docker:cleanup",
251
+ "test:all": "pnpm lint && pnpm build && pnpm test && pnpm test:e2e && pnpm test:live && pnpm test:docker:all",
252
+ "test:install:e2e": "bash scripts/test-install-sh-e2e-docker.sh",
253
+ "test:install:smoke": "bash scripts/test-install-sh-docker.sh",
254
+ "test:install:e2e:openai": "TASKMASTER_E2E_MODELS=openai bash scripts/test-install-sh-e2e-docker.sh",
255
+ "test:install:e2e:anthropic": "TASKMASTER_E2E_MODELS=anthropic bash scripts/test-install-sh-e2e-docker.sh",
256
+ "protocol:gen": "node --import tsx scripts/protocol-gen.ts",
257
+ "protocol:check": "pnpm protocol:gen && git diff --exit-code -- dist/protocol.schema.json",
258
+ "canvas:a2ui:bundle": "bash scripts/bundle-a2ui.sh",
259
+ "check:loc": "node --import tsx scripts/check-ts-max-loc.ts --max 500"
270
260
  }
271
- }
261
+ }
File without changes
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -0,0 +1 @@
1
+ .DS_Store
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -0,0 +1 @@
1
+ .DS_Store