@integrity-labs/agt-cli 0.28.136 → 0.28.137

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.
@@ -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-VQCCFN4M.js");
103
+ const { resolveClaudeBinary } = await import("./persistent-session-SVZCOP7I.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-ODRPKNKT.js.map
376
+ //# sourceMappingURL=claude-pair-runtime-7TJXAPIK.js.map
@@ -28,7 +28,7 @@ import {
28
28
  requireHost,
29
29
  safeWriteJsonAtomic,
30
30
  setConfigHash
31
- } from "../chunk-FDRT52UA.js";
31
+ } from "../chunk-PU44HJCM.js";
32
32
  import {
33
33
  getProjectDir as getProjectDir2,
34
34
  getReadyTasks,
@@ -72,7 +72,7 @@ import {
72
72
  takeZombieDetection,
73
73
  transcriptActivityAgeSeconds,
74
74
  writeEgressAllowlist
75
- } from "../chunk-2WWCHEQT.js";
75
+ } from "../chunk-NGES4EZD.js";
76
76
  import {
77
77
  FLAGS_SCHEMA_VERSION,
78
78
  FLAG_REGISTRY,
@@ -110,7 +110,7 @@ import {
110
110
  resolveDmTarget,
111
111
  sumTranscriptUsageInWindow,
112
112
  wrapScheduledTaskPrompt
113
- } from "../chunk-QKA46UNQ.js";
113
+ } from "../chunk-ROOFBKRE.js";
114
114
  import {
115
115
  parsePsRows,
116
116
  reapOrphanChannelMcps
@@ -7067,7 +7067,7 @@ var agentRestartTimezoneInputs = /* @__PURE__ */ new Map();
7067
7067
  var lastVersionCheckAt = 0;
7068
7068
  var VERSION_CHECK_INTERVAL_MS = 5 * 60 * 1e3;
7069
7069
  var lastResponsivenessProbeAt = 0;
7070
- var agtCliVersion = true ? "0.28.136" : "dev";
7070
+ var agtCliVersion = true ? "0.28.137" : "dev";
7071
7071
  function resolveBrewPath(execFileSync4) {
7072
7072
  try {
7073
7073
  const out = execFileSync4("which", ["brew"], { timeout: 5e3 }).toString().trim();
@@ -8197,7 +8197,7 @@ async function pollCycle() {
8197
8197
  }
8198
8198
  try {
8199
8199
  const { detectHostSecurity } = await import("../host-security-6PDFG7F5.js");
8200
- const { collectDiagnostics } = await import("../persistent-session-VQCCFN4M.js");
8200
+ const { collectDiagnostics } = await import("../persistent-session-SVZCOP7I.js");
8201
8201
  const diagCodeNames = [...agentState.persistentSessionAgents];
8202
8202
  const agentDiagnostics = diagCodeNames.length > 0 ? collectDiagnostics(diagCodeNames) : void 0;
8203
8203
  let tailscaleHostname;
@@ -8340,7 +8340,7 @@ async function pollCycle() {
8340
8340
  const {
8341
8341
  collectResponsivenessProbes,
8342
8342
  getResponsivenessIntervalMs
8343
- } = await import("../responsiveness-probe-FIXXJ7ZV.js");
8343
+ } = await import("../responsiveness-probe-AS7ASMDE.js");
8344
8344
  const probeIntervalMs = getResponsivenessIntervalMs();
8345
8345
  if (now - lastResponsivenessProbeAt > probeIntervalMs) {
8346
8346
  const probeCodeNames = [...agentState.persistentSessionAgents];
@@ -8372,7 +8372,7 @@ async function pollCycle() {
8372
8372
  collectResponsivenessProbes,
8373
8373
  livePendingInboundOldestAgeSeconds,
8374
8374
  parkPendingInbound
8375
- } = await import("../responsiveness-probe-FIXXJ7ZV.js");
8375
+ } = await import("../responsiveness-probe-AS7ASMDE.js");
8376
8376
  const { getProjectDir: wedgeProjectDir } = await import("../claude-scheduler-FATCLHDM.js");
8377
8377
  const wedgeNow = /* @__PURE__ */ new Date();
8378
8378
  const liveAgents = agentState.persistentSessionAgents;
@@ -11921,7 +11921,7 @@ async function processClaudePairSessions(agents) {
11921
11921
  killPairSession,
11922
11922
  pairTmuxSession,
11923
11923
  finalizeClaudePairOnboarding
11924
- } = await import("../claude-pair-runtime-ODRPKNKT.js");
11924
+ } = await import("../claude-pair-runtime-7TJXAPIK.js");
11925
11925
  for (const pairId of pendingResp.cancelled_pair_ids ?? []) {
11926
11926
  log(`[claude-pair] sweeping orphan tmux session for pair ${pairId.slice(0, 8)}`);
11927
11927
  const killed = await killPairSession(pairTmuxSession(pairId));
package/dist/mcp/index.js CHANGED
@@ -21612,7 +21612,7 @@ server.tool(
21612
21612
  source_external_id: external_exports.string().optional().describe('ID in the external system (e.g., "ENG-123")'),
21613
21613
  source_url: external_exports.string().optional().describe("Deep link URL to the external source"),
21614
21614
  project_id: external_exports.string().uuid().optional().describe(
21615
- "Optional project to file this task under (id from projects_list). Groups the task with related tasks/artefacts across agents. Projects are created by humans \u2014 you can tag but not create them."
21615
+ "Optional project to file this task under (id from projects_list). Groups the task with related tasks/artefacts across agents. Reuse an existing project where one fits; use projects_create only after checking projects_list and confirming with the human."
21616
21616
  )
21617
21617
  },
21618
21618
  async (params) => {
@@ -23052,10 +23052,15 @@ var LOCAL_TOOL_NAMES = /* @__PURE__ */ new Set([
23052
23052
  "artefacts_list",
23053
23053
  "artefacts_get",
23054
23054
  "artefacts_get_source_chunk",
23055
- // ADR-0017 Projects container (the reclaimed projects_* namespace read-only
23056
- // in v1; no projects_get_source_chunk, a project is a container not a document).
23055
+ // ADR-0017 Projects container (the reclaimed projects_* namespace). Read tools
23056
+ // shipped in v1; ENG-6769 adds agent-initiated create + post-creation tagging
23057
+ // of artefacts/tasks to a project. No projects_get_source_chunk — a project is
23058
+ // a container, not a document.
23057
23059
  "projects_list",
23058
23060
  "projects_get",
23061
+ "projects_create",
23062
+ "artefacts_assign_project",
23063
+ "kanban_assign_project",
23059
23064
  // ENG-6229: self-restart. Conditionally registered (dark unless
23060
23065
  // AGT_AGENT_SELF_RESTART_ENABLED), but the lockstep guard parses the
23061
23066
  // server.tool('request_restart', …) call statically, so it lives here too.
@@ -23195,7 +23200,7 @@ async function listProjectsText(params) {
23195
23200
  limit: params.limit
23196
23201
  });
23197
23202
  if (!data.projects.length) {
23198
- return "No projects yet. Projects are created by a human in the console; ask one to create a project to group your work under.";
23203
+ return "No projects yet. Create one with projects_create (ask the human first), or a human can create one in the console, to group your work under.";
23199
23204
  }
23200
23205
  return data.projects.map((p) => `- ${p.name} [${p.status}] (id: ${p.id}, created ${p.created_at})`).join("\n");
23201
23206
  }
@@ -23215,7 +23220,7 @@ async function getProjectText(projectId) {
23215
23220
  }
23216
23221
  server.tool(
23217
23222
  "projects_list",
23218
- "List the projects belonging to this agent's team. A project is a container that groups related tasks and published artefacts across agents under one unit of work. Read-only: projects are created by humans in the console.",
23223
+ "List the projects belonging to this agent's team. A project is a container that groups related tasks and published artefacts across agents under one unit of work. Call this before projects_create to reuse an existing project instead of opening a duplicate.",
23219
23224
  {
23220
23225
  status: external_exports.enum(["active", "archived"]).optional().describe("Filter by project status"),
23221
23226
  limit: external_exports.number().int().min(1).max(100).optional().describe("Maximum projects to return (default 50, max 100)")
@@ -23234,6 +23239,64 @@ server.tool(
23234
23239
  content: [{ type: "text", text: await getProjectText(params.project_id) }]
23235
23240
  })
23236
23241
  );
23242
+ async function createProjectText(params) {
23243
+ const data = await apiPost("/host/projects/create", {
23244
+ agent_id: AGT_AGENT_ID,
23245
+ name: params.name,
23246
+ status: params.status,
23247
+ linear_project_id: params.linear_project_id
23248
+ });
23249
+ const p = data.project;
23250
+ return `Created project "${p.name}" [${p.status}] (id: ${p.id}). Tag artefacts with artefacts_assign_project and tasks with kanban_assign_project.`;
23251
+ }
23252
+ server.tool(
23253
+ "projects_create",
23254
+ "Create a new team-scoped project (a container that groups related tasks and published artefacts). BEFORE calling this, you MUST: (1) call projects_list to see existing projects, and (2) if any could plausibly fit the work, ask the human whether to reuse one rather than creating a new project. Only create a new project when the human confirms none of the existing ones fit. Opening a project per task or session fragments the recall surface, so prefer reusing an existing container.",
23255
+ {
23256
+ name: external_exports.string().min(1).max(200).describe('Human-readable project name (e.g. "Q3 launch microsite")'),
23257
+ status: external_exports.enum(["active", "archived"]).optional().describe('Project status (default "active")'),
23258
+ linear_project_id: external_exports.string().optional().describe("Optional id of a Linear project to deep-link this project to")
23259
+ },
23260
+ async (params) => ({
23261
+ content: [{ type: "text", text: await createProjectText(params) }]
23262
+ })
23263
+ );
23264
+ async function assignArtefactProjectText(params) {
23265
+ const data = await apiPost(
23266
+ `/host/artefact/${encodeURIComponent(params.artefact_id)}/assign-project`,
23267
+ { agent_id: AGT_AGENT_ID, project_id: params.project_id }
23268
+ );
23269
+ return data.project_id ? `Assigned artefact ${data.artefact_id} to project ${data.project_id}.` : `Cleared the project link on artefact ${data.artefact_id}.`;
23270
+ }
23271
+ server.tool(
23272
+ "artefacts_assign_project",
23273
+ "Assign an already-published artefact to a project, or clear its project link. Pass the project_id from projects_list to assign, or null to remove the artefact from its current project. Use this to group existing work; to set a project when first publishing, pass project_id to the publish tool instead.",
23274
+ {
23275
+ artefact_id: external_exports.string().uuid().describe("The artefact id returned by artefacts_list"),
23276
+ project_id: external_exports.string().uuid().nullable().describe("Project id to assign (from projects_list), or null to clear the link")
23277
+ },
23278
+ async (params) => ({
23279
+ content: [{ type: "text", text: await assignArtefactProjectText(params) }]
23280
+ })
23281
+ );
23282
+ async function assignKanbanProjectText(params) {
23283
+ const data = await apiPost(
23284
+ `/host/kanban/${encodeURIComponent(params.kanban_item_id)}/assign-project`,
23285
+ { agent_id: AGT_AGENT_ID, project_id: params.project_id }
23286
+ );
23287
+ return data.project_id ? `Assigned task ${data.kanban_item_id} to project ${data.project_id}.` : `Cleared the project link on task ${data.kanban_item_id}.`;
23288
+ }
23289
+ server.tool(
23290
+ "kanban_assign_project",
23291
+ "Assign an existing kanban task to a project, or clear its project link. Pass the project_id from projects_list to assign, or null to remove the task from its current project. To set a project when first creating a task, pass project_id to kanban_add instead.",
23292
+ {
23293
+ kanban_item_id: external_exports.string().uuid().describe("The kanban task id returned by kanban_list"),
23294
+ project_id: external_exports.string().uuid().nullable().describe("Project id to assign (from projects_list), or null to clear the link")
23295
+ },
23296
+ async (params) => ({
23297
+ content: [{ type: "text", text: await assignKanbanProjectText(params) }]
23298
+ })
23299
+ );
23237
23300
  if (isSelfRestartEnabled(process.env) && AGT_AGENT_CODE_NAME) {
23238
23301
  const codeName = AGT_AGENT_CODE_NAME;
23239
23302
  server.tool(
@@ -34,8 +34,8 @@ import {
34
34
  writeDirectChatSessionState,
35
35
  writeEgressAllowlist,
36
36
  writePersistentClaudeWrapper
37
- } from "./chunk-2WWCHEQT.js";
38
- import "./chunk-QKA46UNQ.js";
37
+ } from "./chunk-NGES4EZD.js";
38
+ import "./chunk-ROOFBKRE.js";
39
39
  import "./chunk-XWVM4KPK.js";
40
40
  export {
41
41
  EGRESS_BASELINE_DOMAINS,
@@ -74,4 +74,4 @@ export {
74
74
  writeEgressAllowlist,
75
75
  writePersistentClaudeWrapper
76
76
  };
77
- //# sourceMappingURL=persistent-session-VQCCFN4M.js.map
77
+ //# sourceMappingURL=persistent-session-SVZCOP7I.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  paneLogPath
3
- } from "./chunk-2WWCHEQT.js";
4
- import "./chunk-QKA46UNQ.js";
3
+ } from "./chunk-NGES4EZD.js";
4
+ import "./chunk-ROOFBKRE.js";
5
5
  import "./chunk-XWVM4KPK.js";
6
6
 
7
7
  // src/lib/responsiveness-probe.ts
@@ -304,4 +304,4 @@ export {
304
304
  readAndResetChannelDeflections,
305
305
  readAndResetChannelLaneClassifications
306
306
  };
307
- //# sourceMappingURL=responsiveness-probe-FIXXJ7ZV.js.map
307
+ //# sourceMappingURL=responsiveness-probe-AS7ASMDE.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@integrity-labs/agt-cli",
3
- "version": "0.28.136",
3
+ "version": "0.28.137",
4
4
  "description": "Augmented Team CLI — agent provisioning and management",
5
5
  "type": "module",
6
6
  "engines": {