@integrity-labs/agt-cli 0.28.658 → 0.28.660

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.
@@ -16,7 +16,7 @@ import {
16
16
  rotateDailySession,
17
17
  sessionFileExists,
18
18
  todayLocalIso
19
- } from "./chunk-RASKCVAA.js";
19
+ } from "./chunk-VR3VB3FR.js";
20
20
  import {
21
21
  reapOrphanChannelMcps
22
22
  } from "./chunk-XWVM4KPK.js";
@@ -4322,4 +4322,4 @@ export {
4322
4322
  stopAllSessionsAndWait,
4323
4323
  getProjectDir
4324
4324
  };
4325
- //# sourceMappingURL=chunk-LAYT5BNW.js.map
4325
+ //# sourceMappingURL=chunk-Y63W2XP5.js.map
@@ -100,7 +100,7 @@ async function spawnPairSession(session) {
100
100
  return { ok: true };
101
101
  } catch {
102
102
  }
103
- const { resolveClaudeBinary } = await import("./persistent-session-PG7POJ3L.js");
103
+ const { resolveClaudeBinary } = await import("./persistent-session-ADS4LIGF.js");
104
104
  const claudeBin = resolveClaudeBinary();
105
105
  const pairEnv = {
106
106
  ...process.env,
@@ -373,4 +373,4 @@ export {
373
373
  startClaudePair,
374
374
  submitClaudePairCode
375
375
  };
376
- //# sourceMappingURL=claude-pair-runtime-TRRXWBEM.js.map
376
+ //# sourceMappingURL=claude-pair-runtime-JMESZQPN.js.map
@@ -55,7 +55,7 @@ import {
55
55
  safeWriteJsonAtomic,
56
56
  setConfigHash,
57
57
  tripClass
58
- } from "../chunk-QIOFZ6EP.js";
58
+ } from "../chunk-ESEOTR5J.js";
59
59
  import {
60
60
  getProjectDir as getProjectDir2,
61
61
  getReadyTasks,
@@ -111,7 +111,7 @@ import {
111
111
  takeZombieDetection,
112
112
  toOpencodeModel,
113
113
  writeEgressAllowlist
114
- } from "../chunk-LAYT5BNW.js";
114
+ } from "../chunk-Y63W2XP5.js";
115
115
  import {
116
116
  ACCOUNT_ENFORCEMENT_MARKER_FILENAME,
117
117
  AnchorSessionClient,
@@ -192,7 +192,7 @@ import {
192
192
  subagentActivityAgeSeconds,
193
193
  sumTranscriptUsageInWindow,
194
194
  transcriptActivityAgeSeconds
195
- } from "../chunk-RASKCVAA.js";
195
+ } from "../chunk-VR3VB3FR.js";
196
196
  import {
197
197
  reapOrphanChannelMcps
198
198
  } from "../chunk-XWVM4KPK.js";
@@ -11609,7 +11609,7 @@ var pendingDayRolloverReset = /* @__PURE__ */ new Set();
11609
11609
  var dayRolloverInboundHold = /* @__PURE__ */ new Map();
11610
11610
  var INBOUND_HOLD_EPISODE_GAP_MS = 12e4;
11611
11611
  async function channelInboundActivityAgeSecondsFor(codeName) {
11612
- const { newestPendingInboundActivityMtimeMs } = await import("../responsiveness-probe-HP6SYFOJ.js");
11612
+ const { newestPendingInboundActivityMtimeMs } = await import("../responsiveness-probe-EII7QAGR.js");
11613
11613
  const newest = newestPendingInboundActivityMtimeMs(dirname10(paneLogPath(codeName)));
11614
11614
  if (newest === null) return null;
11615
11615
  return Math.max(0, Math.floor((Date.now() - newest) / 1e3));
@@ -12252,7 +12252,7 @@ var agentRestartTimezoneInputs = /* @__PURE__ */ new Map();
12252
12252
  var lastVersionCheckAt = 0;
12253
12253
  var VERSION_CHECK_INTERVAL_MS = 5 * 60 * 1e3;
12254
12254
  var lastResponsivenessProbeAt = 0;
12255
- var agtCliVersion = true ? "0.28.658" : "dev";
12255
+ var agtCliVersion = true ? "0.28.660" : "dev";
12256
12256
  function resolveBrewPath(execFileSync3) {
12257
12257
  try {
12258
12258
  const out = execFileSync3("which", ["brew"], { timeout: 5e3 }).toString().trim();
@@ -13562,7 +13562,7 @@ function flushRestartedAgentDiagnostics(hostId, codeNames) {
13562
13562
  if (codeNames.length === 0) return;
13563
13563
  void (async () => {
13564
13564
  try {
13565
- const { collectDiagnostics } = await import("../persistent-session-PG7POJ3L.js");
13565
+ const { collectDiagnostics } = await import("../persistent-session-ADS4LIGF.js");
13566
13566
  await api.post("/host/heartbeat", {
13567
13567
  host_id: hostId,
13568
13568
  agent_diagnostics: collectDiagnostics(codeNames, quarantineEntriesFor, claudeMdSizeFor, spawnOutcomeForDiagnostics, pidPressureFor)
@@ -13678,7 +13678,7 @@ async function pollCycleInner() {
13678
13678
  }
13679
13679
  try {
13680
13680
  const { detectHostSecurity } = await import("../host-security-6PDFG7F5.js");
13681
- const { collectDiagnostics } = await import("../persistent-session-PG7POJ3L.js");
13681
+ const { collectDiagnostics } = await import("../persistent-session-ADS4LIGF.js");
13682
13682
  const diagCodeNames = [...agentState.persistentSessionAgents];
13683
13683
  const agentDiagnostics = diagCodeNames.length > 0 ? collectDiagnostics(diagCodeNames, quarantineEntriesFor, claudeMdSizeFor, spawnOutcomeForDiagnostics, pidPressureFor) : void 0;
13684
13684
  let tailscaleHostname;
@@ -13801,7 +13801,7 @@ async function pollCycleInner() {
13801
13801
  collectPanelessActivityProbes,
13802
13802
  getResponsivenessIntervalMs,
13803
13803
  occupancyQualificationClassifications
13804
- } = await import("../responsiveness-probe-HP6SYFOJ.js");
13804
+ } = await import("../responsiveness-probe-EII7QAGR.js");
13805
13805
  const probeIntervalMs = getResponsivenessIntervalMs();
13806
13806
  if (now - lastResponsivenessProbeAt > probeIntervalMs) {
13807
13807
  const probeCodeNames = [...agentState.persistentSessionAgents];
@@ -13911,7 +13911,7 @@ async function pollCycleInner() {
13911
13911
  collectResponsivenessProbes,
13912
13912
  livePendingInboundOldestAgeSeconds,
13913
13913
  parkPendingInbound
13914
- } = await import("../responsiveness-probe-HP6SYFOJ.js");
13914
+ } = await import("../responsiveness-probe-EII7QAGR.js");
13915
13915
  const { getProjectDir: wedgeProjectDir } = await import("../scheduler-engine-NDP36U7O.js");
13916
13916
  const wedgeNow = /* @__PURE__ */ new Date();
13917
13917
  const liveAgents = agentState.persistentSessionAgents;
@@ -14067,7 +14067,7 @@ async function pollCycleInner() {
14067
14067
  }
14068
14068
  try {
14069
14069
  const { scrapeMcpFailedBannerCount } = await import("../pane-mcp-banner-scraper-JA437JIB.js");
14070
- const { probeSessionAuth } = await import("../session-auth-dead-RIAIWHHV.js");
14070
+ const { probeSessionAuth } = await import("../session-auth-dead-TY2WU55Z.js");
14071
14071
  const observations = [];
14072
14072
  const pendingCacheCommits = [];
14073
14073
  const modelApiErrorReportingOn = hostFlagStore().getBoolean("model-api-error-reporting");
@@ -17700,7 +17700,7 @@ async function handleRestartDoorbell(agentId, requestedAt, restartReason) {
17700
17700
  void api.post("/host/restart-ack", { host_id: hostId, agent_id: agentId, restart_requested_at: requestedAt }).catch((err) => log(`[restart-lane] ack failed for '${codeName}': ${err.message}`));
17701
17701
  void (async () => {
17702
17702
  try {
17703
- const { collectDiagnostics } = await import("../persistent-session-PG7POJ3L.js");
17703
+ const { collectDiagnostics } = await import("../persistent-session-ADS4LIGF.js");
17704
17704
  await api.post("/host/heartbeat", {
17705
17705
  host_id: hostId,
17706
17706
  agent_diagnostics: collectDiagnostics([codeName], quarantineEntriesFor, claudeMdSizeFor, spawnOutcomeForDiagnostics, pidPressureFor)
@@ -17751,7 +17751,7 @@ async function respawnAgentAfterMcpStop(codeName, reason) {
17751
17751
  }
17752
17752
  try {
17753
17753
  const hostId = await getHostId();
17754
- const { collectDiagnostics } = await import("../persistent-session-PG7POJ3L.js");
17754
+ const { collectDiagnostics } = await import("../persistent-session-ADS4LIGF.js");
17755
17755
  await api.post("/host/heartbeat", {
17756
17756
  host_id: hostId,
17757
17757
  agent_diagnostics: collectDiagnostics([codeName], quarantineEntriesFor, claudeMdSizeFor, spawnOutcomeForDiagnostics, pidPressureFor)
@@ -18348,7 +18348,7 @@ async function processClaudePairSessions(agents) {
18348
18348
  killPairSession,
18349
18349
  pairTmuxSession,
18350
18350
  finalizeClaudePairOnboarding
18351
- } = await import("../claude-pair-runtime-TRRXWBEM.js");
18351
+ } = await import("../claude-pair-runtime-JMESZQPN.js");
18352
18352
  for (const pairId of pendingResp.cancelled_pair_ids ?? []) {
18353
18353
  log(`[claude-pair] sweeping orphan tmux session for pair ${pairId.slice(0, 8)}`);
18354
18354
  const killed = await killPairSession(pairTmuxSession(pairId));
@@ -33419,6 +33419,69 @@ var INTEGRATION_REGISTRY = [
33419
33419
  args: ["mcp"]
33420
33420
  }
33421
33421
  },
33422
+ {
33423
+ // ENG-9244 / CS-1593. Framer is the first `cli_tool` integration whose CLI
33424
+ // does NOT authenticate from `env_key`, so read
33425
+ // `integrations/framer-credentials.ts` before changing anything here — the
33426
+ // env var below serves the SDK, and the CLI is served by a separate
33427
+ // `projects.json` the provisioner materialises.
33428
+ id: "framer",
33429
+ name: "Framer",
33430
+ category: "ui-generation",
33431
+ description: "Design, edit and publish a Framer website \u2014 update page copy and images, manage CMS collections, and publish deployments",
33432
+ supported_auth_types: ["api_key"],
33433
+ // Pre-1.0 on both halves (@framer/agent 0.0.44, framer-api 0.1.29) and
33434
+ // Framer bills the Server API itself as a preview. Expect churn.
33435
+ beta: true,
33436
+ installable: { category: "Website", authTypes: ["api_key"] },
33437
+ capabilities: [
33438
+ {
33439
+ id: "framer:read-site",
33440
+ name: "Read Site",
33441
+ description: "Read page text, structure, styles, fonts and CMS content",
33442
+ access: "read"
33443
+ },
33444
+ {
33445
+ id: "framer:edit-site",
33446
+ name: "Edit Site",
33447
+ description: "Update page text and images, create pages, manage CMS collections, redirects and localisation",
33448
+ access: "write"
33449
+ },
33450
+ {
33451
+ id: "framer:publish",
33452
+ name: "Publish",
33453
+ description: "Publish the site and promote a deployment to production",
33454
+ access: "write"
33455
+ }
33456
+ ],
33457
+ cli_tool: {
33458
+ package: "@framer/agent",
33459
+ // UPSTREAM HAZARD: the package's own bin name is `agent`. On a fleet whose
33460
+ // whole job is running agents, putting a global `agent` on PATH is asking
33461
+ // for a collision, so the binary we look for and invoke is the shimmed
33462
+ // `framer-agent`. `installer: 'script'` (rather than plain npm) is what
33463
+ // creates that shim — a bare `npm install -g @framer/agent` would publish
33464
+ // `agent` and we would have shipped the collision.
33465
+ binary: "framer-agent",
33466
+ // Serves the `framer-api` SDK, which DOES read this. The CLI does not —
33467
+ // see framer-credentials.ts for why that distinction matters.
33468
+ env_key: "FRAMER_API_KEY",
33469
+ skill_id: "framer",
33470
+ installer: "script",
33471
+ // The catalog is the trust boundary for this string (same contract as the
33472
+ // `gh` entry above). Installs into a private prefix and links ONLY the
33473
+ // renamed binary, so `agent` never lands on PATH.
33474
+ // VERSION IS PINNED ON PURPOSE. `framer-credentials.ts` mirrors this
33475
+ // CLI's pre-1.0 `projects.json` schema (already at version 2, with a
33476
+ // legacy credentials.json path still in its source — this format HAS
33477
+ // churned). An unpinned global install would let a future release land a
33478
+ // schema we do not write, leaving the CLI unauthenticated on a headless
33479
+ // host. Bump this only alongside a compatibility check of the config
33480
+ // format against the new release.
33481
+ script: "npm install -g --prefix /usr/local/framer-agent @framer/agent@0.0.44 && ln -sf /usr/local/framer-agent/bin/agent /usr/local/bin/framer-agent"
33482
+ },
33483
+ docs_url: "https://www.framer.com/developers/server-api-quick-start"
33484
+ },
33422
33485
  {
33423
33486
  id: "v0",
33424
33487
  name: "v0 by Vercel",
package/dist/mcp/index.js CHANGED
@@ -40801,6 +40801,69 @@ var INTEGRATION_REGISTRY = [
40801
40801
  args: ["mcp"]
40802
40802
  }
40803
40803
  },
40804
+ {
40805
+ // ENG-9244 / CS-1593. Framer is the first `cli_tool` integration whose CLI
40806
+ // does NOT authenticate from `env_key`, so read
40807
+ // `integrations/framer-credentials.ts` before changing anything here — the
40808
+ // env var below serves the SDK, and the CLI is served by a separate
40809
+ // `projects.json` the provisioner materialises.
40810
+ id: "framer",
40811
+ name: "Framer",
40812
+ category: "ui-generation",
40813
+ description: "Design, edit and publish a Framer website \u2014 update page copy and images, manage CMS collections, and publish deployments",
40814
+ supported_auth_types: ["api_key"],
40815
+ // Pre-1.0 on both halves (@framer/agent 0.0.44, framer-api 0.1.29) and
40816
+ // Framer bills the Server API itself as a preview. Expect churn.
40817
+ beta: true,
40818
+ installable: { category: "Website", authTypes: ["api_key"] },
40819
+ capabilities: [
40820
+ {
40821
+ id: "framer:read-site",
40822
+ name: "Read Site",
40823
+ description: "Read page text, structure, styles, fonts and CMS content",
40824
+ access: "read"
40825
+ },
40826
+ {
40827
+ id: "framer:edit-site",
40828
+ name: "Edit Site",
40829
+ description: "Update page text and images, create pages, manage CMS collections, redirects and localisation",
40830
+ access: "write"
40831
+ },
40832
+ {
40833
+ id: "framer:publish",
40834
+ name: "Publish",
40835
+ description: "Publish the site and promote a deployment to production",
40836
+ access: "write"
40837
+ }
40838
+ ],
40839
+ cli_tool: {
40840
+ package: "@framer/agent",
40841
+ // UPSTREAM HAZARD: the package's own bin name is `agent`. On a fleet whose
40842
+ // whole job is running agents, putting a global `agent` on PATH is asking
40843
+ // for a collision, so the binary we look for and invoke is the shimmed
40844
+ // `framer-agent`. `installer: 'script'` (rather than plain npm) is what
40845
+ // creates that shim — a bare `npm install -g @framer/agent` would publish
40846
+ // `agent` and we would have shipped the collision.
40847
+ binary: "framer-agent",
40848
+ // Serves the `framer-api` SDK, which DOES read this. The CLI does not —
40849
+ // see framer-credentials.ts for why that distinction matters.
40850
+ env_key: "FRAMER_API_KEY",
40851
+ skill_id: "framer",
40852
+ installer: "script",
40853
+ // The catalog is the trust boundary for this string (same contract as the
40854
+ // `gh` entry above). Installs into a private prefix and links ONLY the
40855
+ // renamed binary, so `agent` never lands on PATH.
40856
+ // VERSION IS PINNED ON PURPOSE. `framer-credentials.ts` mirrors this
40857
+ // CLI's pre-1.0 `projects.json` schema (already at version 2, with a
40858
+ // legacy credentials.json path still in its source — this format HAS
40859
+ // churned). An unpinned global install would let a future release land a
40860
+ // schema we do not write, leaving the CLI unauthenticated on a headless
40861
+ // host. Bump this only alongside a compatibility check of the config
40862
+ // format against the new release.
40863
+ script: "npm install -g --prefix /usr/local/framer-agent @framer/agent@0.0.44 && ln -sf /usr/local/framer-agent/bin/agent /usr/local/bin/framer-agent"
40864
+ },
40865
+ docs_url: "https://www.framer.com/developers/server-api-quick-start"
40866
+ },
40804
40867
  {
40805
40868
  id: "v0",
40806
40869
  name: "v0 by Vercel",
@@ -44429,6 +44492,48 @@ server.tool(
44429
44492
  }
44430
44493
  }
44431
44494
  );
44495
+ server.tool(
44496
+ "kanban_reopen",
44497
+ "Send a card you assigned back to the agent that did the work, WITH your review feedback. Use this when you delegated a task with kanban_assign, the agent completed it, and you reviewed the delivery and found something wrong. The card reopens on THEIR board in todo carrying your feedback, and they are notified on the card itself. This is the only way your review reaches them: their card is not on your board, so notes you write on your own card are invisible to them, and opening a NEW card reframes a correction as fresh work and loses the link to what it corrected. You may only reopen a card YOU assigned, to somebody else, on your own team, that is finished (done or failed). You cannot reopen your own card this way - that would be a way around the rule that closed work stays closed; open a new card instead. BOUNDED: two reopens per card. A third means the two of you have not converged, and the answer to that is a human, not another round - raise it with yours.",
44498
+ {
44499
+ item_id: external_exports.string().describe("The card id, as returned by kanban_assign or shown on the completion notice."),
44500
+ feedback: external_exports.string().trim().min(1, "feedback is required - a reopen with nothing attached just deletes a result nobody replaced").max(2e3, "feedback is too long - send the correction (the criterion, the file, the behaviour), not the whole review").describe(
44501
+ 'What is wrong and what you want changed. REQUIRED and it must say something - a reopen with nothing attached just deletes a result nobody replaced. Be specific enough to act on: name the acceptance criterion, the file, or the behaviour, not "needs work".'
44502
+ )
44503
+ },
44504
+ async (params) => {
44505
+ try {
44506
+ const data = await apiPost("/host/kanban/reopen", {
44507
+ agent_id: AGT_AGENT_ID,
44508
+ item_id: params.item_id,
44509
+ feedback: params.feedback
44510
+ });
44511
+ if (!data?.ok) {
44512
+ const detail = data?.error ?? `Could not reopen that card (${data?.reason ?? "unknown"}).`;
44513
+ return { content: [{ type: "text", text: detail }] };
44514
+ }
44515
+ const turns = data.is_last_turn ? " That was the last reopen this card allows - if it comes back wrong again, raise it with a human rather than sending it back." : "";
44516
+ const delivery = data.notified ? " They have been notified on the card." : ` NOTE: the card reopened but the notification did NOT go out${data.notify_error ? ` (${data.notify_error})` : ""}, so they may not know yet - tell them directly.`;
44517
+ return {
44518
+ content: [
44519
+ {
44520
+ type: "text",
44521
+ text: `Reopened "${data.title ?? params.item_id}" on the assignee's board with your feedback (reopen ${data.reopen_count ?? 1} of 2).${delivery}${turns}`
44522
+ }
44523
+ ]
44524
+ };
44525
+ } catch (err) {
44526
+ return {
44527
+ content: [
44528
+ {
44529
+ type: "text",
44530
+ text: `Could not reopen that card: ${err instanceof Error ? err.message : String(err)}`
44531
+ }
44532
+ ]
44533
+ };
44534
+ }
44535
+ }
44536
+ );
44432
44537
  server.tool(
44433
44538
  "kanban_recall",
44434
44539
  'Pull a card you assigned to a HUMAN teammate back onto your own board. Use this when a card shows under "Assigned to a person" in kanban_list and you need to act on it - typically because the person finished the work (or it is no longer needed) and the card has to be closed. While a card is assigned to a person, every kanban write to it is refused; recall makes it yours again so kanban_move / kanban_done / kanban_log work. Recall does NOT complete the card - after recalling, close it yourself with kanban_done and a result. You can only recall a card you assigned.',
@@ -46084,6 +46189,8 @@ var LOCAL_TOOL_NAMES = /* @__PURE__ */ new Set([
46084
46189
  // ENG-8281: the inverse of assign_kanban_to_human — take a human-assigned
46085
46190
  // card back so the agent can finally close it.
46086
46191
  "kanban_recall",
46192
+ // ENG-9050: the return path for delegated work.
46193
+ "kanban_reopen",
46087
46194
  // ENG-6953: agent + people directory lookup (always registered locally).
46088
46195
  "directory_lookup",
46089
46196
  "status_standup",
@@ -39639,6 +39639,69 @@ var INTEGRATION_REGISTRY = [
39639
39639
  args: ["mcp"]
39640
39640
  }
39641
39641
  },
39642
+ {
39643
+ // ENG-9244 / CS-1593. Framer is the first `cli_tool` integration whose CLI
39644
+ // does NOT authenticate from `env_key`, so read
39645
+ // `integrations/framer-credentials.ts` before changing anything here — the
39646
+ // env var below serves the SDK, and the CLI is served by a separate
39647
+ // `projects.json` the provisioner materialises.
39648
+ id: "framer",
39649
+ name: "Framer",
39650
+ category: "ui-generation",
39651
+ description: "Design, edit and publish a Framer website \u2014 update page copy and images, manage CMS collections, and publish deployments",
39652
+ supported_auth_types: ["api_key"],
39653
+ // Pre-1.0 on both halves (@framer/agent 0.0.44, framer-api 0.1.29) and
39654
+ // Framer bills the Server API itself as a preview. Expect churn.
39655
+ beta: true,
39656
+ installable: { category: "Website", authTypes: ["api_key"] },
39657
+ capabilities: [
39658
+ {
39659
+ id: "framer:read-site",
39660
+ name: "Read Site",
39661
+ description: "Read page text, structure, styles, fonts and CMS content",
39662
+ access: "read"
39663
+ },
39664
+ {
39665
+ id: "framer:edit-site",
39666
+ name: "Edit Site",
39667
+ description: "Update page text and images, create pages, manage CMS collections, redirects and localisation",
39668
+ access: "write"
39669
+ },
39670
+ {
39671
+ id: "framer:publish",
39672
+ name: "Publish",
39673
+ description: "Publish the site and promote a deployment to production",
39674
+ access: "write"
39675
+ }
39676
+ ],
39677
+ cli_tool: {
39678
+ package: "@framer/agent",
39679
+ // UPSTREAM HAZARD: the package's own bin name is `agent`. On a fleet whose
39680
+ // whole job is running agents, putting a global `agent` on PATH is asking
39681
+ // for a collision, so the binary we look for and invoke is the shimmed
39682
+ // `framer-agent`. `installer: 'script'` (rather than plain npm) is what
39683
+ // creates that shim — a bare `npm install -g @framer/agent` would publish
39684
+ // `agent` and we would have shipped the collision.
39685
+ binary: "framer-agent",
39686
+ // Serves the `framer-api` SDK, which DOES read this. The CLI does not —
39687
+ // see framer-credentials.ts for why that distinction matters.
39688
+ env_key: "FRAMER_API_KEY",
39689
+ skill_id: "framer",
39690
+ installer: "script",
39691
+ // The catalog is the trust boundary for this string (same contract as the
39692
+ // `gh` entry above). Installs into a private prefix and links ONLY the
39693
+ // renamed binary, so `agent` never lands on PATH.
39694
+ // VERSION IS PINNED ON PURPOSE. `framer-credentials.ts` mirrors this
39695
+ // CLI's pre-1.0 `projects.json` schema (already at version 2, with a
39696
+ // legacy credentials.json path still in its source — this format HAS
39697
+ // churned). An unpinned global install would let a future release land a
39698
+ // schema we do not write, leaving the CLI unauthenticated on a headless
39699
+ // host. Bump this only alongside a compatibility check of the config
39700
+ // format against the new release.
39701
+ script: "npm install -g --prefix /usr/local/framer-agent @framer/agent@0.0.44 && ln -sf /usr/local/framer-agent/bin/agent /usr/local/bin/framer-agent"
39702
+ },
39703
+ docs_url: "https://www.framer.com/developers/server-api-quick-start"
39704
+ },
39642
39705
  {
39643
39706
  id: "v0",
39644
39707
  name: "v0 by Vercel",
@@ -33705,6 +33705,69 @@ var INTEGRATION_REGISTRY = [
33705
33705
  args: ["mcp"]
33706
33706
  }
33707
33707
  },
33708
+ {
33709
+ // ENG-9244 / CS-1593. Framer is the first `cli_tool` integration whose CLI
33710
+ // does NOT authenticate from `env_key`, so read
33711
+ // `integrations/framer-credentials.ts` before changing anything here — the
33712
+ // env var below serves the SDK, and the CLI is served by a separate
33713
+ // `projects.json` the provisioner materialises.
33714
+ id: "framer",
33715
+ name: "Framer",
33716
+ category: "ui-generation",
33717
+ description: "Design, edit and publish a Framer website \u2014 update page copy and images, manage CMS collections, and publish deployments",
33718
+ supported_auth_types: ["api_key"],
33719
+ // Pre-1.0 on both halves (@framer/agent 0.0.44, framer-api 0.1.29) and
33720
+ // Framer bills the Server API itself as a preview. Expect churn.
33721
+ beta: true,
33722
+ installable: { category: "Website", authTypes: ["api_key"] },
33723
+ capabilities: [
33724
+ {
33725
+ id: "framer:read-site",
33726
+ name: "Read Site",
33727
+ description: "Read page text, structure, styles, fonts and CMS content",
33728
+ access: "read"
33729
+ },
33730
+ {
33731
+ id: "framer:edit-site",
33732
+ name: "Edit Site",
33733
+ description: "Update page text and images, create pages, manage CMS collections, redirects and localisation",
33734
+ access: "write"
33735
+ },
33736
+ {
33737
+ id: "framer:publish",
33738
+ name: "Publish",
33739
+ description: "Publish the site and promote a deployment to production",
33740
+ access: "write"
33741
+ }
33742
+ ],
33743
+ cli_tool: {
33744
+ package: "@framer/agent",
33745
+ // UPSTREAM HAZARD: the package's own bin name is `agent`. On a fleet whose
33746
+ // whole job is running agents, putting a global `agent` on PATH is asking
33747
+ // for a collision, so the binary we look for and invoke is the shimmed
33748
+ // `framer-agent`. `installer: 'script'` (rather than plain npm) is what
33749
+ // creates that shim — a bare `npm install -g @framer/agent` would publish
33750
+ // `agent` and we would have shipped the collision.
33751
+ binary: "framer-agent",
33752
+ // Serves the `framer-api` SDK, which DOES read this. The CLI does not —
33753
+ // see framer-credentials.ts for why that distinction matters.
33754
+ env_key: "FRAMER_API_KEY",
33755
+ skill_id: "framer",
33756
+ installer: "script",
33757
+ // The catalog is the trust boundary for this string (same contract as the
33758
+ // `gh` entry above). Installs into a private prefix and links ONLY the
33759
+ // renamed binary, so `agent` never lands on PATH.
33760
+ // VERSION IS PINNED ON PURPOSE. `framer-credentials.ts` mirrors this
33761
+ // CLI's pre-1.0 `projects.json` schema (already at version 2, with a
33762
+ // legacy credentials.json path still in its source — this format HAS
33763
+ // churned). An unpinned global install would let a future release land a
33764
+ // schema we do not write, leaving the CLI unauthenticated on a headless
33765
+ // host. Bump this only alongside a compatibility check of the config
33766
+ // format against the new release.
33767
+ script: "npm install -g --prefix /usr/local/framer-agent @framer/agent@0.0.44 && ln -sf /usr/local/framer-agent/bin/agent /usr/local/bin/framer-agent"
33768
+ },
33769
+ docs_url: "https://www.framer.com/developers/server-api-quick-start"
33770
+ },
33708
33771
  {
33709
33772
  id: "v0",
33710
33773
  name: "v0 by Vercel",
@@ -33849,6 +33849,69 @@ var INTEGRATION_REGISTRY = [
33849
33849
  args: ["mcp"]
33850
33850
  }
33851
33851
  },
33852
+ {
33853
+ // ENG-9244 / CS-1593. Framer is the first `cli_tool` integration whose CLI
33854
+ // does NOT authenticate from `env_key`, so read
33855
+ // `integrations/framer-credentials.ts` before changing anything here — the
33856
+ // env var below serves the SDK, and the CLI is served by a separate
33857
+ // `projects.json` the provisioner materialises.
33858
+ id: "framer",
33859
+ name: "Framer",
33860
+ category: "ui-generation",
33861
+ description: "Design, edit and publish a Framer website \u2014 update page copy and images, manage CMS collections, and publish deployments",
33862
+ supported_auth_types: ["api_key"],
33863
+ // Pre-1.0 on both halves (@framer/agent 0.0.44, framer-api 0.1.29) and
33864
+ // Framer bills the Server API itself as a preview. Expect churn.
33865
+ beta: true,
33866
+ installable: { category: "Website", authTypes: ["api_key"] },
33867
+ capabilities: [
33868
+ {
33869
+ id: "framer:read-site",
33870
+ name: "Read Site",
33871
+ description: "Read page text, structure, styles, fonts and CMS content",
33872
+ access: "read"
33873
+ },
33874
+ {
33875
+ id: "framer:edit-site",
33876
+ name: "Edit Site",
33877
+ description: "Update page text and images, create pages, manage CMS collections, redirects and localisation",
33878
+ access: "write"
33879
+ },
33880
+ {
33881
+ id: "framer:publish",
33882
+ name: "Publish",
33883
+ description: "Publish the site and promote a deployment to production",
33884
+ access: "write"
33885
+ }
33886
+ ],
33887
+ cli_tool: {
33888
+ package: "@framer/agent",
33889
+ // UPSTREAM HAZARD: the package's own bin name is `agent`. On a fleet whose
33890
+ // whole job is running agents, putting a global `agent` on PATH is asking
33891
+ // for a collision, so the binary we look for and invoke is the shimmed
33892
+ // `framer-agent`. `installer: 'script'` (rather than plain npm) is what
33893
+ // creates that shim — a bare `npm install -g @framer/agent` would publish
33894
+ // `agent` and we would have shipped the collision.
33895
+ binary: "framer-agent",
33896
+ // Serves the `framer-api` SDK, which DOES read this. The CLI does not —
33897
+ // see framer-credentials.ts for why that distinction matters.
33898
+ env_key: "FRAMER_API_KEY",
33899
+ skill_id: "framer",
33900
+ installer: "script",
33901
+ // The catalog is the trust boundary for this string (same contract as the
33902
+ // `gh` entry above). Installs into a private prefix and links ONLY the
33903
+ // renamed binary, so `agent` never lands on PATH.
33904
+ // VERSION IS PINNED ON PURPOSE. `framer-credentials.ts` mirrors this
33905
+ // CLI's pre-1.0 `projects.json` schema (already at version 2, with a
33906
+ // legacy credentials.json path still in its source — this format HAS
33907
+ // churned). An unpinned global install would let a future release land a
33908
+ // schema we do not write, leaving the CLI unauthenticated on a headless
33909
+ // host. Bump this only alongside a compatibility check of the config
33910
+ // format against the new release.
33911
+ script: "npm install -g --prefix /usr/local/framer-agent @framer/agent@0.0.44 && ln -sf /usr/local/framer-agent/bin/agent /usr/local/bin/framer-agent"
33912
+ },
33913
+ docs_url: "https://www.framer.com/developers/server-api-quick-start"
33914
+ },
33852
33915
  {
33853
33916
  id: "v0",
33854
33917
  name: "v0 by Vercel",
@@ -43,8 +43,8 @@ import {
43
43
  writeDirectChatSessionState,
44
44
  writeEgressAllowlist,
45
45
  writePersistentClaudeWrapper
46
- } from "./chunk-LAYT5BNW.js";
47
- import "./chunk-RASKCVAA.js";
46
+ } from "./chunk-Y63W2XP5.js";
47
+ import "./chunk-VR3VB3FR.js";
48
48
  import "./chunk-XWVM4KPK.js";
49
49
  export {
50
50
  EGRESS_BASELINE_DOMAINS,
@@ -92,4 +92,4 @@ export {
92
92
  writeEgressAllowlist,
93
93
  writePersistentClaudeWrapper
94
94
  };
95
- //# sourceMappingURL=persistent-session-PG7POJ3L.js.map
95
+ //# sourceMappingURL=persistent-session-ADS4LIGF.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  paneLogPath
3
- } from "./chunk-LAYT5BNW.js";
4
- import "./chunk-RASKCVAA.js";
3
+ } from "./chunk-Y63W2XP5.js";
4
+ import "./chunk-VR3VB3FR.js";
5
5
  import "./chunk-XWVM4KPK.js";
6
6
 
7
7
  // src/lib/responsiveness-probe.ts
@@ -727,4 +727,4 @@ export {
727
727
  readAndResetSlackReplyBindingClassifications,
728
728
  readAndResetSlackReplyTargetClassifications
729
729
  };
730
- //# sourceMappingURL=responsiveness-probe-HP6SYFOJ.js.map
730
+ //# sourceMappingURL=responsiveness-probe-EII7QAGR.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  sessionTranscriptDir
3
- } from "./chunk-RASKCVAA.js";
3
+ } from "./chunk-VR3VB3FR.js";
4
4
 
5
5
  // src/lib/session-auth-dead.ts
6
6
  import { closeSync, openSync, readSync, readdirSync, statSync } from "fs";
@@ -203,4 +203,4 @@ export {
203
203
  decideSessionAuthState,
204
204
  probeSessionAuth
205
205
  };
206
- //# sourceMappingURL=session-auth-dead-RIAIWHHV.js.map
206
+ //# sourceMappingURL=session-auth-dead-TY2WU55Z.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@integrity-labs/agt-cli",
3
- "version": "0.28.658",
3
+ "version": "0.28.660",
4
4
  "description": "Augmented Team CLI — agent provisioning and management",
5
5
  "type": "module",
6
6
  "engines": {