@meltstudio/meltctl 5.9.0 → 5.11.0

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 (2) hide show
  1. package/dist/index.js +106 -11
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -7450,7 +7450,7 @@ var CLI_VERSION;
7450
7450
  var init_version = __esm({
7451
7451
  "src/utils/version.ts"() {
7452
7452
  "use strict";
7453
- CLI_VERSION = "5.9.0";
7453
+ CLI_VERSION = "5.11.0";
7454
7454
  }
7455
7455
  });
7456
7456
 
@@ -27935,6 +27935,32 @@ function createProfileAuditsResource(config2) {
27935
27935
  };
27936
27936
  }
27937
27937
 
27938
+ // ../sdk/dist/resources/support-effort.js
27939
+ function createSupportEffortResource(config2) {
27940
+ return {
27941
+ /**
27942
+ * Get the by-project + by-architect rollups, the week/month trend, and the
27943
+ * actionable missing-time worklist. `period` selects the trend granularity
27944
+ * (default 'week').
27945
+ */
27946
+ async get(opts = {}) {
27947
+ const params = new URLSearchParams();
27948
+ if (opts.period)
27949
+ params.set("period", opts.period);
27950
+ const query = params.toString();
27951
+ const path10 = query ? `/support-effort?${query}` : "/support-effort";
27952
+ const { data, status } = await apiFetch(config2, path10);
27953
+ if (status === 403)
27954
+ throw new Error("Access denied. Only Team Managers can view support effort.");
27955
+ if (status !== 200) {
27956
+ const msg = data && typeof data === "object" && "error" in data ? data.error : void 0;
27957
+ throw new Error(msg ?? `Failed to fetch support effort (${status})`);
27958
+ }
27959
+ return data;
27960
+ }
27961
+ };
27962
+ }
27963
+
27938
27964
  // ../sdk/dist/client.js
27939
27965
  var DEFAULT_TIMEOUT_MS = 1e4;
27940
27966
  var RETRYABLE_STATUS = /* @__PURE__ */ new Set([502, 503, 504]);
@@ -28006,7 +28032,8 @@ function createMeltClient(config2) {
28006
28032
  me: createMeResource(config2),
28007
28033
  developers: createDevelopersResource(config2),
28008
28034
  endpointChecks: createEndpointChecksResource(config2),
28009
- profileAudits: createProfileAuditsResource(config2)
28035
+ profileAudits: createProfileAuditsResource(config2),
28036
+ supportEffort: createSupportEffortResource(config2)
28010
28037
  };
28011
28038
  }
28012
28039
 
@@ -42569,6 +42596,13 @@ var MARKER_FILE = ".melt-skills.json";
42569
42596
  function getSkillsRoot() {
42570
42597
  return path5.join(os5.homedir(), ".claude", "skills");
42571
42598
  }
42599
+ function getSkillsRoots() {
42600
+ const roots = [getSkillsRoot()];
42601
+ if (import_fs_extra3.default.existsSync(path5.join(os5.homedir(), ".cursor"))) {
42602
+ roots.push(path5.join(os5.homedir(), ".cursor", "skills"));
42603
+ }
42604
+ return roots;
42605
+ }
42572
42606
  function computeSkillHash(files) {
42573
42607
  const hash2 = createHash("sha256");
42574
42608
  for (const filePath of Object.keys(files).sort()) {
@@ -42671,9 +42705,9 @@ async function skillsInstallCommand(opts) {
42671
42705
  );
42672
42706
  process.exit(1);
42673
42707
  }
42674
- const skillsRoot = getSkillsRoot();
42675
- const existing = readMarker(skillsRoot);
42676
- if (existing && existing.version === manifest.version && !opts.force) {
42708
+ const roots = getSkillsRoots();
42709
+ const stale = opts.force ? roots : roots.filter((root) => readMarker(root)?.version !== manifest.version);
42710
+ if (stale.length === 0) {
42677
42711
  console.log(
42678
42712
  source_default.dim(
42679
42713
  `
@@ -42683,16 +42717,19 @@ async function skillsInstallCommand(opts) {
42683
42717
  );
42684
42718
  return;
42685
42719
  }
42686
- applyDevSkills(manifest, skillsRoot);
42720
+ for (const root of stale) {
42721
+ applyDevSkills(manifest, root);
42722
+ }
42723
+ const where = stale.map((root) => `${root.replace(os5.homedir(), "~")}/`).join(" and ");
42687
42724
  console.log(
42688
42725
  source_default.green(
42689
42726
  `
42690
- \u2713 Installed ${manifest.skills.length} Melt dev skills (v${manifest.version}) to ~/.claude/skills/.`
42727
+ \u2713 Installed ${manifest.skills.length} Melt dev skills (v${manifest.version}) to ${where}.`
42691
42728
  )
42692
42729
  );
42693
42730
  console.log(
42694
42731
  source_default.dim(
42695
- " Restart Claude Code to load them (they appear as /melt-dev-plan, /melt-dev-review, \u2026).\n"
42732
+ " Restart Claude Code / Cursor to load them (they appear as /melt-dev-plan, /melt-dev-review, \u2026).\n"
42696
42733
  )
42697
42734
  );
42698
42735
  }
@@ -42754,7 +42791,11 @@ async function maybeSyncSkills(commandName) {
42754
42791
  return;
42755
42792
  }
42756
42793
  const oldVersion = marker.version;
42757
- const diff = applyDevSkills(manifest, skillsRoot);
42794
+ let diff = { added: [], changed: [], removed: [] };
42795
+ for (const root of getSkillsRoots()) {
42796
+ const rootDiff = applyDevSkills(manifest, root);
42797
+ if (root === skillsRoot) diff = rootDiff;
42798
+ }
42758
42799
  console.log(source_default.dim(source_default.green(formatSyncNotice(oldVersion, manifest.version, diff))));
42759
42800
  debugLog(`Skills sync: updated ${oldVersion} \u2192 ${manifest.version}`);
42760
42801
  } catch (e) {
@@ -54496,6 +54537,30 @@ function createProfileAuditsResource2(config2) {
54496
54537
  }
54497
54538
  };
54498
54539
  }
54540
+ function createSupportEffortResource2(config2) {
54541
+ return {
54542
+ /**
54543
+ * Get the by-project + by-architect rollups, the week/month trend, and the
54544
+ * actionable missing-time worklist. `period` selects the trend granularity
54545
+ * (default 'week').
54546
+ */
54547
+ async get(opts = {}) {
54548
+ const params = new URLSearchParams();
54549
+ if (opts.period)
54550
+ params.set("period", opts.period);
54551
+ const query = params.toString();
54552
+ const path22 = query ? `/support-effort?${query}` : "/support-effort";
54553
+ const { data, status } = await apiFetch2(config2, path22);
54554
+ if (status === 403)
54555
+ throw new Error("Access denied. Only Team Managers can view support effort.");
54556
+ if (status !== 200) {
54557
+ const msg = data && typeof data === "object" && "error" in data ? data.error : void 0;
54558
+ throw new Error(msg ?? `Failed to fetch support effort (${status})`);
54559
+ }
54560
+ return data;
54561
+ }
54562
+ };
54563
+ }
54499
54564
  var DEFAULT_TIMEOUT_MS2 = 1e4;
54500
54565
  var RETRYABLE_STATUS2 = /* @__PURE__ */ new Set([502, 503, 504]);
54501
54566
  function delay2(ms) {
@@ -54566,7 +54631,8 @@ function createMeltClient2(config2) {
54566
54631
  me: createMeResource2(config2),
54567
54632
  developers: createDevelopersResource2(config2),
54568
54633
  endpointChecks: createEndpointChecksResource2(config2),
54569
- profileAudits: createProfileAuditsResource2(config2)
54634
+ profileAudits: createProfileAuditsResource2(config2),
54635
+ supportEffort: createSupportEffortResource2(config2)
54570
54636
  };
54571
54637
  }
54572
54638
  var auditFindingSchema2 = external_exports.object({
@@ -55833,6 +55899,34 @@ function registerEndpointCheckTools(server, getClient2) {
55833
55899
  withClientArgs(getClient2, submitEndpointCheck)
55834
55900
  );
55835
55901
  }
55902
+ async function getSupportEffort(client, input) {
55903
+ return safe(async () => {
55904
+ const data = await client.supportEffort.get({ period: input.period });
55905
+ const totalMissingTime = data.missingTimeTickets.length;
55906
+ return {
55907
+ asOf: data.asOf,
55908
+ byProject: data.byProject,
55909
+ byArchitect: data.byArchitect,
55910
+ trend: data.trend,
55911
+ // Surface the count prominently; the full actionable list is available via
55912
+ // the read API / dashboard page (Slice 2) rather than flooding the tool.
55913
+ missingTimeCount: totalMissingTime
55914
+ };
55915
+ });
55916
+ }
55917
+ function registerSupportEffortTools(server, getClient2) {
55918
+ server.registerTool(
55919
+ "get_support_effort",
55920
+ {
55921
+ title: "Get tech-support effort",
55922
+ description: "Tech-support / DevOps effort rollup for the 'Tech Support Ops' Linear team (key DEV). Returns logged hours (parsed from each ticket's self-reported 'Time Spent' label \u2014 the architect's active effort, NOT cycle time) and ticket counts rolled up two ways: `byProject` (which client/product the support load lands on) and `byArchitect` (who is carrying it). Each rollup entry has ticketCount, totalLoggedMinutes, avgLoggedMinutes, and missingTimeCount. Also returns `missingTimeCount`: the number of Done tickets with no time label (a data-quality gap that makes the hours less trustworthy \u2014 the dashboard page surfaces the actionable list). `period` selects the trend granularity (week|month, default week). Manager-gated. Use for 'how much support work did <project> need?', 'who's carrying the support load?', and 'is our support time logged completely?'.",
55923
+ inputSchema: {
55924
+ period: external_exports.enum(["week", "month"]).optional().describe("Trend bucket granularity. Default week.")
55925
+ }
55926
+ },
55927
+ withClientArgs(getClient2, getSupportEffort)
55928
+ );
55929
+ }
55836
55930
  var VERSION = "0.0.0";
55837
55931
  function createMcpServer(clientOrProvider) {
55838
55932
  const getClient2 = typeof clientOrProvider === "function" ? clientOrProvider : () => Promise.resolve(clientOrProvider);
@@ -55851,6 +55945,7 @@ function createMcpServer(clientOrProvider) {
55851
55945
  registerFindingsTools(server, getClient2);
55852
55946
  registerDailyPlanTools(server, getClient2);
55853
55947
  registerEndpointCheckTools(server, getClient2);
55948
+ registerSupportEffortTools(server, getClient2);
55854
55949
  return server;
55855
55950
  }
55856
55951
  async function startServer() {
@@ -55900,7 +55995,7 @@ ${source_default.dim(" /melt-dev-security-audit Run a security posture audit
55900
55995
  ${source_default.dim(" /melt-dev-help Answer questions about the development playbook")}
55901
55996
 
55902
55997
  ${source_default.bold("Setup")}
55903
- ${source_default.dim(" skills install Install the dev skills (/melt-dev-*) into Claude Code")}
55998
+ ${source_default.dim(" skills install Install the dev skills (/melt-dev-*) into Claude Code (+ Cursor)")}
55904
55999
 
55905
56000
  ${source_default.bold("Admin Commands")} ${source_default.dim("(used by skills and team managers):")}
55906
56001
  ${source_default.dim(" audit submit [file] Submit an audit report")}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@meltstudio/meltctl",
3
- "version": "5.9.0",
3
+ "version": "5.11.0",
4
4
  "description": "AI-first development tooling for Melt teams — companion CLI for the org-distributed Claude Code dev skills",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",