@mutmutco/cli 3.88.0 → 3.89.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/main.cjs +39 -12
  2. package/package.json +1 -1
package/dist/main.cjs CHANGED
@@ -27862,13 +27862,16 @@ function registerSessionReport(program3) {
27862
27862
  // src/doctor-render.ts
27863
27863
  var RESTART_LINE = "\u21BB Restart Claude to finish.";
27864
27864
  var VERBOSE_INDENT = " ";
27865
+ function checkGlyph(check) {
27866
+ if (!check.ok) return "\u2717";
27867
+ return check.verified === false ? "?" : "\u2713";
27868
+ }
27865
27869
  function renderCheckLine(check) {
27866
- if (check.ok) {
27867
- return check.detail ? `\u2713 ${check.label} \u2014 ${check.detail}` : `\u2713 ${check.label}`;
27868
- }
27869
- const head = check.detail ? `\u2717 ${check.label} \u2014 ${check.detail}` : `\u2717 ${check.label}`;
27870
- return check.fix ? `${head}
27871
- ${VERBOSE_INDENT}\u2192 ${check.fix}` : head;
27870
+ const head = check.detail ? `${checkGlyph(check)} ${check.label} \u2014 ${check.detail}` : `${checkGlyph(check)} ${check.label}`;
27871
+ const lines = [head];
27872
+ if (check.fix) lines.push(`${VERBOSE_INDENT}\u2192 ${check.fix}`);
27873
+ if (check.command) lines.push(`${VERBOSE_INDENT}${check.command}`);
27874
+ return lines.join("\n");
27872
27875
  }
27873
27876
  function renderReport(checks, opts) {
27874
27877
  const lines = checks.map(renderCheckLine);
@@ -27877,8 +27880,14 @@ function renderReport(checks, opts) {
27877
27880
  }
27878
27881
  function renderTally(checks) {
27879
27882
  const total = checks.length;
27880
- const healthy = total - checks.filter((c) => !c.ok).length;
27881
- return healthy === total ? `\u2713 all ${total} checks healthy` : `\u2713 ${healthy} of ${total} checks healthy`;
27883
+ const failed = checks.filter((c) => !c.ok).length;
27884
+ const unverified = checks.filter((c) => c.ok && c.verified === false).length;
27885
+ const healthy = total - failed - unverified;
27886
+ if (failed === 0 && unverified === 0) return `\u2713 all ${total} checks healthy`;
27887
+ const parts = [`\u2713 ${healthy} verified healthy`];
27888
+ if (unverified > 0) parts.push(`? ${unverified} unverified`);
27889
+ if (failed > 0) parts.push(`\u2717 ${failed} failed`);
27890
+ return `${parts.join(" \xB7 ")} \u2014 ${total} checks`;
27882
27891
  }
27883
27892
  function doctorReportExitCode(checks) {
27884
27893
  return checks.some((c) => !c.ok && !c.reportOnly) ? 1 : 0;
@@ -28704,6 +28713,11 @@ function checkAwsIdentity(probe) {
28704
28713
  const arn = probe.callerArn?.trim();
28705
28714
  return {
28706
28715
  ok: !arn || !arn.endsWith(":root"),
28716
+ // #4074: the row's claim is "this caller is not root", and with no ARN resolved there is no caller to
28717
+ // make it about. `awsCallerArn` returns undefined for ANY failure — expired SSO, no `aws` binary, a
28718
+ // timeout — so an empty result is "I could not look", never "I looked and it is fine". The evidence
28719
+ // line below has said exactly that since #3485; the glyph now says it too.
28720
+ verified: Boolean(arn),
28707
28721
  id: "aws-identity",
28708
28722
  label: "aws identity",
28709
28723
  fix: "use a non-root IAM user/session profile (set AWS_PROFILE or run: aws sso login), then verify `aws sts get-caller-identity` is not :root",
@@ -28738,13 +28752,25 @@ function checkCodexHookTrust(probe, displayName = "Codex") {
28738
28752
  if (probe.trusted) {
28739
28753
  return { id: "codex-hook-trust", ok: true, label, detail: "trusted", verbose: evidence };
28740
28754
  }
28755
+ if (probe.requiredCount === 0) {
28756
+ return {
28757
+ id: "codex-hook-trust",
28758
+ ok: true,
28759
+ verified: false,
28760
+ warn: true,
28761
+ label,
28762
+ detail: "no approval rows to read \u2014 the hook bundle could not be checked",
28763
+ fix: `run \`mmi-cli plugin heal\`, restart ${displayName}, then review and trust MMI under \`/hooks\``,
28764
+ verbose: evidence
28765
+ };
28766
+ }
28741
28767
  return {
28742
28768
  id: "codex-hook-trust",
28743
28769
  ok: true,
28744
28770
  warn: true,
28745
28771
  label,
28746
- detail: probe.requiredCount > 0 ? `${probe.trustedCount}/${probe.requiredCount} approval rows present \u2014 current hashes unverified` : "hook bundle could not be verified",
28747
- fix: probe.requiredCount > 0 ? `${displayName} does not allow silent hook approval; run \`/hooks\`, review the MMI commands, and trust them` : `run \`mmi-cli plugin heal\`, restart ${displayName}, then review and trust MMI under \`/hooks\``,
28772
+ detail: `${probe.trustedCount}/${probe.requiredCount} approval rows present`,
28773
+ fix: `${displayName} does not allow silent hook approval; run \`/hooks\`, review the MMI commands, and trust them`,
28748
28774
  verbose: evidence
28749
28775
  };
28750
28776
  }
@@ -28757,8 +28783,9 @@ function checkCliVersion(input, releasedNote) {
28757
28783
  if (!report.releasedVersion) {
28758
28784
  return {
28759
28785
  id: "cli-version",
28760
- ok: false,
28761
- reportOnly: true,
28786
+ ok: true,
28787
+ verified: false,
28788
+ warn: true,
28762
28789
  label: "mmi-cli",
28763
28790
  detail: `${report.currentVersion} \u2014 freshness UNKNOWN, the published version could not be read`,
28764
28791
  fix: "check it directly: `mmi-cli --version` against `npm view @mutmutco/cli version`; update with `npm install -g @mutmutco/cli@<released>`",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mutmutco/cli",
3
- "version": "3.88.0",
3
+ "version": "3.89.0",
4
4
  "description": "MMI Future CLI — the org dev toolbox and shared cross-IDE engine for every registry-declared MMI coding surface.",
5
5
  "type": "module",
6
6
  "license": "UNLICENSED",