impel-cli 0.20.30 → 0.20.31

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/RELEASE_NOTES.md CHANGED
@@ -1,5 +1,15 @@
1
1
  # Release notes
2
2
 
3
+ ## 0.20.31 — Complete embedded Tasks controls
4
+
5
+ - Allows the guarded `delete_task` operation through the tenant desktop bridge
6
+ so the MCP App can complete the full task CRUD lifecycle.
7
+ - Keeps the embedded board below the macOS title-bar drag region so Board,
8
+ List, scope, refresh, create, and external-link controls receive pointer
9
+ input normally.
10
+ - Rebuilds managed Claude and ChatGPT bundles onto the corrected Tasks host
11
+ contract while preserving tenant profiles and app state.
12
+
3
13
  ## 0.20.30 — Stable Claude and Codex upgrades
4
14
 
5
15
  - Updates the reviewed native CLI pins to Claude Code 2.1.220 and Codex
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "impel-cli",
3
- "version": "0.20.30",
3
+ "version": "0.20.31",
4
4
  "description": "Prepare isolated Claude and Codex workspaces for every accessible Impel tenant",
5
5
  "type": "module",
6
6
  "bin": {
package/src/apps.js CHANGED
@@ -299,7 +299,7 @@ export const CURRENT_CONFIG_VERSION = 32;
299
299
  // — which is what made every `impel update` re-trigger macOS permission
300
300
  // prompts. Bump this ONLY when a code change alters the bytes of a built
301
301
  // bundle; leave it alone for changes that don't touch bundle contents.
302
- export const BUNDLE_BUILD_FINGERPRINT = "bundle-2026-08-08.3";
302
+ export const BUNDLE_BUILD_FINGERPRINT = "bundle-2026-08-08.4";
303
303
 
304
304
  /** Parse the tenant's install manifest, or null when absent/corrupt. */
305
305
  export function readTenantManifest(homeDir = os.homedir(), tenantId = null) {
@@ -509,12 +509,16 @@ if (
509
509
  const parseBounds = (url, window) => {
510
510
  const parsed = new URL(url);
511
511
  const content = window.getContentBounds();
512
+ const interactiveTop = process.platform === "darwin" ? 48 : 0;
512
513
  const number = (name, fallback) => {
513
514
  const value = Number.parseInt(parsed.searchParams.get(name) || "", 10);
514
515
  return Number.isFinite(value) ? value : fallback;
515
516
  };
516
517
  const x = Math.max(0, Math.min(content.width - 240, number("x", 0)));
517
- const y = Math.max(0, Math.min(content.height - 240, number("y", 0)));
518
+ const y = Math.max(
519
+ interactiveTop,
520
+ Math.min(content.height - 240, number("y", 0)),
521
+ );
518
522
  return {
519
523
  x,
520
524
  y,
@@ -606,7 +610,13 @@ if (
606
610
  const nativeBoardBounds = (window) => {
607
611
  const content = window.getContentBounds();
608
612
  const x = Math.min(296, Math.max(0, content.width - 240));
609
- return { x, y: 0, width: Math.max(240, content.width - x), height: Math.max(240, content.height) };
613
+ const interactiveTop = process.platform === "darwin" ? 48 : 0;
614
+ return {
615
+ x,
616
+ y: interactiveTop,
617
+ width: Math.max(240, content.width - x),
618
+ height: Math.max(240, content.height - interactiveTop),
619
+ };
610
620
  };
611
621
 
612
622
  const layoutNativeNav = (window) => {
@@ -825,7 +835,15 @@ if (
825
835
  }
826
836
  if (request?.method === "tools/call") {
827
837
  const name = request?.params?.name;
828
- const allowed = new Set(["show_tasks", "list_tasks", "get_task", "list_members", "create_task", "update_task"]);
838
+ const allowed = new Set([
839
+ "show_tasks",
840
+ "list_tasks",
841
+ "get_task",
842
+ "list_members",
843
+ "create_task",
844
+ "update_task",
845
+ "delete_task",
846
+ ]);
829
847
  if (!allowed.has(name)) throw new Error("Unsupported Tasks tool.");
830
848
  const args = request?.params?.arguments;
831
849
  if (args != null && (typeof args !== "object" || Array.isArray(args))) {