codex-plugin-doctor 1.14.0 → 1.16.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.
package/README.md CHANGED
@@ -358,9 +358,9 @@ jobs:
358
358
  runs-on: ubuntu-latest
359
359
  steps:
360
360
  - uses: actions/checkout@v5
361
- - uses: Esquetta/CodexPluginDoctor@v1.14.0
361
+ - uses: Esquetta/CodexPluginDoctor@v1.16.0
362
362
  with:
363
- version: "1.14.0"
363
+ version: "1.16.0"
364
364
  path: .
365
365
  runtime: "true"
366
366
  policy: codex-publish
@@ -71,6 +71,10 @@ export interface DoctorReviewBundleVerificationReport {
71
71
  status: "pass" | "fail";
72
72
  message: string;
73
73
  }>;
74
+ failedChecks: Array<{
75
+ id: string;
76
+ message: string;
77
+ }>;
74
78
  attestation: DoctorAttestationVerificationReport | null;
75
79
  releaseEvidence: DoctorReleaseEvidenceVerificationReport | null;
76
80
  }
@@ -121,7 +125,9 @@ export declare function verifyDoctorReviewBundle(bundleDirectory: string, option
121
125
  targetPath: string;
122
126
  }): Promise<DoctorReviewBundleVerificationReport>;
123
127
  export declare function renderDoctorReviewBundleVerificationJson(report: DoctorReviewBundleVerificationReport): string;
124
- export declare function renderDoctorReviewBundleVerification(report: DoctorReviewBundleVerificationReport): string;
128
+ export declare function renderDoctorReviewBundleVerification(report: DoctorReviewBundleVerificationReport, options?: {
129
+ failuresOnly?: boolean;
130
+ }): string;
125
131
  export declare function renderDoctorReviewBundleDiffJson(report: DoctorReviewBundleDiffReport): string;
126
132
  export declare function renderDoctorReviewBundleDiff(report: DoctorReviewBundleDiffReport): string;
127
133
  export declare function renderDoctorReviewBundle(bundle: DoctorReviewBundle): string;
@@ -697,7 +697,12 @@ export async function verifyDoctorReviewBundle(bundleDirectory, options) {
697
697
  message: "The bundled release evidence could not be verified."
698
698
  });
699
699
  }
700
- const failedChecks = checks.filter((check) => check.status === "fail");
700
+ const failedChecks = checks
701
+ .filter((check) => check.status === "fail")
702
+ .map((check) => ({
703
+ id: check.id,
704
+ message: check.message
705
+ }));
701
706
  const fileChecks = checks.filter((check) => check.id.startsWith("review_bundle.file."));
702
707
  const manifestStatus = checks.find((check) => check.id === "review_bundle.manifest.valid")?.status ?? "fail";
703
708
  return {
@@ -717,6 +722,7 @@ export async function verifyDoctorReviewBundle(bundleDirectory, options) {
717
722
  releaseEvidence: releaseEvidence?.status ?? "fail"
718
723
  },
719
724
  checks,
725
+ failedChecks,
720
726
  attestation,
721
727
  releaseEvidence
722
728
  };
@@ -724,7 +730,7 @@ export async function verifyDoctorReviewBundle(bundleDirectory, options) {
724
730
  export function renderDoctorReviewBundleVerificationJson(report) {
725
731
  return JSON.stringify(report, null, 2);
726
732
  }
727
- export function renderDoctorReviewBundleVerification(report) {
733
+ export function renderDoctorReviewBundleVerification(report, options = {}) {
728
734
  const lines = [
729
735
  "Doctor Review Bundle Verification",
730
736
  "=================================",
@@ -737,10 +743,24 @@ export function renderDoctorReviewBundleVerification(report) {
737
743
  `Runtime policy: ${report.summary.runtimePolicy.toUpperCase()}`,
738
744
  `Attestation: ${report.summary.attestation.toUpperCase()}`,
739
745
  `Release evidence: ${report.summary.releaseEvidence.toUpperCase()}`,
746
+ `Failed checks: ${report.failedChecks.length}`,
740
747
  "",
741
- "Checks",
742
- "------"
748
+ "Failed Checks",
749
+ "-------------"
743
750
  ];
751
+ if (report.failedChecks.length === 0) {
752
+ lines.push("None.");
753
+ }
754
+ else {
755
+ for (const check of report.failedChecks) {
756
+ lines.push(`FAIL ${check.id}`);
757
+ lines.push(` ${check.message}`);
758
+ }
759
+ }
760
+ if (options.failuresOnly) {
761
+ return lines.join("\n");
762
+ }
763
+ lines.push("", "Checks", "------");
744
764
  for (const check of report.checks) {
745
765
  lines.push(`${check.status === "pass" ? "PASS" : "FAIL"} ${check.id}`);
746
766
  lines.push(` ${check.message}`);
package/dist/run-cli.js CHANGED
@@ -73,7 +73,7 @@ const defaultIo = {
73
73
  }
74
74
  };
75
75
  function printUsage(io) {
76
- io.writeStderr("Usage: codex-plugin-doctor check <path|--installed> [filter] [--policy codex-publish|mcp-strict|security] [--compat] [--json|--markdown|--badge-json|--badge-markdown] [--output <path>] [--history <path>] [--runtime] [--require-runtime-approval --runtime-approval-digest <digest>] [--verbose-runtime] [--explain] [--no-animations] [--ascii]\n codex-plugin-doctor audit --installed [filter] [--policy codex-publish|mcp-strict|security] [--security] [--compat] [--json] [--output <path>] [--cache] [--changed]\n codex-plugin-doctor mcp <path> [--json] [--output <path>]\n codex-plugin-doctor security <path> [--policy security] [--json|--scorecard]\n codex-plugin-doctor compat <path> [--all|--client <client>] [--json] [--scorecard] [--output <path>] [--install-preview|--apply --backup]\n codex-plugin-doctor fix <path> (--dry-run|--interactive --backup|--apply --backup)\n codex-plugin-doctor history <history.jsonl> [--json] [--fail-on-regression]\n codex-plugin-doctor doctor [npm <package>|contract|corpus|runtime-plan <path> [--json|--markdown] [--output <path>]|runtime-policy <path> [--json] [--output <path>]|review-bundle <path> --output <dir> --sign-key-env NAME [--json] [--allow-dirty] [--allow-untagged]|review-bundle verify <bundle-dir> --target <path> --sign-key-env NAME [--json] [--output <path>]|review-bundle diff --before <dir> --after <dir> [--json]|attest <path> [--sign-key-env NAME]|attest verify <attestation.json> --target <path> --sign-key-env NAME|release-evidence <path> --sign-key-env NAME [--allow-dirty] [--allow-untagged] [--require-runtime-approval --runtime-approval-digest <digest>]|release-evidence verify <evidence.json> --target <path> --sign-key-env NAME|release-evidence asset <path> --tag <tag> --output <evidence.json> --sign-key-env NAME [--upload]|mcp <path>|inspector <path>|diff --before <path> --after <path>|recommend <path>|trust <path>|perf <path> [--max-total-ms <ms>] [--max-stage-ms stage=ms]|export --bundle <path>|snapshot|clients|--json|--update-check]\n codex-plugin-doctor init [path] [--template skill-only|mcp-stdio|mcp-http|full-runtime]\n codex-plugin-doctor init-ci [path]\n codex-plugin-doctor self-test\n codex-plugin-doctor list --installed\n codex-plugin-doctor explain <finding-id>\n codex-plugin-doctor --version\n\nFirst run:\n codex-plugin-doctor doctor\n codex-plugin-doctor self-test\n codex-plugin-doctor init my-plugin\n codex-plugin-doctor check . --runtime --explain");
76
+ io.writeStderr("Usage: codex-plugin-doctor check <path|--installed> [filter] [--policy codex-publish|mcp-strict|security] [--compat] [--json|--markdown|--badge-json|--badge-markdown] [--output <path>] [--history <path>] [--runtime] [--require-runtime-approval --runtime-approval-digest <digest>] [--verbose-runtime] [--explain] [--no-animations] [--ascii]\n codex-plugin-doctor audit --installed [filter] [--policy codex-publish|mcp-strict|security] [--security] [--compat] [--json] [--output <path>] [--cache] [--changed]\n codex-plugin-doctor mcp <path> [--json] [--output <path>]\n codex-plugin-doctor security <path> [--policy security] [--json|--scorecard]\n codex-plugin-doctor compat <path> [--all|--client <client>] [--json] [--scorecard] [--output <path>] [--install-preview|--apply --backup]\n codex-plugin-doctor fix <path> (--dry-run|--interactive --backup|--apply --backup)\n codex-plugin-doctor history <history.jsonl> [--json] [--fail-on-regression]\n codex-plugin-doctor doctor [npm <package>|contract|corpus|runtime-plan <path> [--json|--markdown] [--output <path>]|runtime-policy <path> [--json] [--output <path>]|review-bundle <path> --output <dir> --sign-key-env NAME [--json] [--allow-dirty] [--allow-untagged]|review-bundle verify <bundle-dir> --target <path> --sign-key-env NAME [--json] [--output <path>] [--failures-only]|review-bundle diff --before <dir> --after <dir> [--json]|attest <path> [--sign-key-env NAME]|attest verify <attestation.json> --target <path> --sign-key-env NAME|release-evidence <path> --sign-key-env NAME [--allow-dirty] [--allow-untagged] [--require-runtime-approval --runtime-approval-digest <digest>]|release-evidence verify <evidence.json> --target <path> --sign-key-env NAME|release-evidence asset <path> --tag <tag> --output <evidence.json> --sign-key-env NAME [--upload]|mcp <path>|inspector <path>|diff --before <path> --after <path>|recommend <path>|trust <path>|perf <path> [--max-total-ms <ms>] [--max-stage-ms stage=ms]|export --bundle <path>|snapshot|clients|--json|--update-check]\n codex-plugin-doctor init [path] [--template skill-only|mcp-stdio|mcp-http|full-runtime]\n codex-plugin-doctor init-ci [path]\n codex-plugin-doctor self-test\n codex-plugin-doctor list --installed\n codex-plugin-doctor explain <finding-id>\n codex-plugin-doctor --version\n\nFirst run:\n codex-plugin-doctor doctor\n codex-plugin-doctor self-test\n codex-plugin-doctor init my-plugin\n codex-plugin-doctor check . --runtime --explain");
77
77
  }
78
78
  const performanceStageNames = new Set([
79
79
  "validation",
@@ -449,6 +449,7 @@ export async function runCli(args, io = defaultIo, options = {}) {
449
449
  : null;
450
450
  const verifyFlags = bundleDirectory ? remainingArgs.slice(2) : remainingArgs.slice(1);
451
451
  const jsonOutput = verifyFlags.includes("--json");
452
+ const failuresOnly = verifyFlags.includes("--failures-only");
452
453
  const outputIndex = verifyFlags.indexOf("--output");
453
454
  const outputPath = outputIndex === -1 ? null : verifyFlags[outputIndex + 1];
454
455
  const targetIndex = verifyFlags.indexOf("--target");
@@ -490,7 +491,7 @@ export async function runCli(args, io = defaultIo, options = {}) {
490
491
  });
491
492
  const renderedReport = jsonOutput
492
493
  ? renderDoctorReviewBundleVerificationJson(report)
493
- : renderDoctorReviewBundleVerification(report);
494
+ : renderDoctorReviewBundleVerification(report, { failuresOnly });
494
495
  if (outputPath) {
495
496
  await writeFile(outputPath, renderedReport, "utf8");
496
497
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "codex-plugin-doctor",
3
- "version": "1.14.0",
3
+ "version": "1.16.0",
4
4
  "description": "CLI-first validator for Codex plugins, skills, and MCP package surfaces with runtime MCP protocol validation.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",