@clearlydev/nx-archweave 0.3.3 → 0.4.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
@@ -209,7 +209,7 @@ Review is fully optional and isn't tied to one provider.
209
209
 
210
210
  - If review is disabled, zero review artifacts are generated.
211
211
  - If review is enabled, the workflow **green-skips** (it never fails) until you register the provider's secret.
212
- - A round marker stops the workflow after `--maxRounds` reviews per PR (1–5, default 3).
212
+ - A round marker stops the workflow after `--maxRounds` reviews per PR (1–5, default 3). A later commit has no AI verdict, so the `review` check fails on it; merge it with your branch ruleset's bypass.
213
213
 
214
214
  | `--provider` | Workflow file | Required secret |
215
215
  | --- | --- | --- |
@@ -3,7 +3,7 @@ import "../generators/_chunks/chunk-SFXU6IUS.js";
3
3
  import {
4
4
  VERDICT_MARKER,
5
5
  runVerdictGate
6
- } from "../generators/_chunks/chunk-67INEVWL.js";
6
+ } from "../generators/_chunks/chunk-ALSXKTLM.js";
7
7
 
8
8
  // src/bin/review-verdict.ts
9
9
  import { spawnSync } from "node:child_process";
@@ -33,13 +33,16 @@ function renderStepOutputs(commentBody, previousId, blocked, reason) {
33
33
  ].join("\n");
34
34
  }
35
35
  var UNREAD_COMMENTS_ERROR = "::error title=Review verdict not computed::Could not read PR comments, so the verdict could not be computed. Re-run the failed jobs to retry. If it fails again, check that the review job has pull-requests: read.";
36
+ var MISCONFIGURED_ERROR = "::error title=Review verdict not computed::The verdict gate is missing GITHUB_REPOSITORY or ARCHWEAVE_PR_NUMBER, or ARCHWEAVE_MAX_ROUNDS is not a whole number from 1, so no verdict was computed. Regenerate the workflow with add-review --onConflict=overwrite if it was edited by hand.";
36
37
  function runReviewVerdictBin(env, exec, writeOutput = realWriteOutput) {
37
38
  const logs = [];
38
39
  const repo = env["GITHUB_REPOSITORY"];
39
40
  const pr = env["ARCHWEAVE_PR_NUMBER"];
40
41
  const maxRounds = Number(env["ARCHWEAVE_MAX_ROUNDS"]);
41
42
  const locale = env["ARCHWEAVE_LOCALE"] === "ko" ? "ko" : "en";
43
+ const outputPath = outputModePath(env);
42
44
  if (!repo || !pr || !Number.isInteger(maxRounds) || maxRounds < 1) {
45
+ if (outputPath !== void 0) return { exitCode: 1, logs: [MISCONFIGURED_ERROR] };
43
46
  logs.push("verdict gate: required environment missing or malformed \u2014 skipping (check stays green).");
44
47
  return { exitCode: 0, logs };
45
48
  }
@@ -47,7 +50,6 @@ function runReviewVerdictBin(env, exec, writeOutput = realWriteOutput) {
47
50
  const roundAfterId = watermark !== void 0 && /^\d+$/.test(watermark) ? Number(watermark) : void 0;
48
51
  const sha = env["ARCHWEAVE_HEAD_SHA"];
49
52
  const headSha = sha !== void 0 && /^[0-9a-f]{7,40}$/i.test(sha) ? sha : void 0;
50
- const outputPath = outputModePath(env);
51
53
  const fetched = exec("gh", ["api", `repos/${repo}/issues/${pr}/comments`, "--paginate"]);
52
54
  const pages = fetched.status === 0 ? splitConcatenatedJson(fetched.stdout) : null;
53
55
  if (pages === null) {
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  composeReviewSetup,
3
3
  judgeReviewFileConflict
4
- } from "./chunk-67INEVWL.js";
4
+ } from "./chunk-ALSXKTLM.js";
5
5
  import {
6
6
  DEPENDABOT_PATH,
7
7
  renderAddReviewReport,
@@ -1,7 +1,7 @@
1
1
  // ../review-policy/dist/renderers/render-review-comment.js
2
2
  var COPY = {
3
3
  en: {
4
- terminationBanner: (maxRounds) => `> \u26A0\uFE0F **Automated review ended.** The maximum of ${maxRounds} review rounds has been reached with blocking findings (P0/P1) still open. Later pushes aren't reviewed by AI, so review them yourself before merging.`,
4
+ terminationBanner: (maxRounds) => `> \u26A0\uFE0F **Automated review ended.** The maximum of ${maxRounds} review rounds has been reached with blocking findings (P0/P1) still open. Later pushes aren't reviewed by AI, and the review check fails on them: review them yourself, and merge with your branch ruleset's bypass.`,
5
5
  verdictLines: {
6
6
  BLOCK: "**Verdict: BLOCK** \u2014 P0/P1 findings must be resolved before this change can merge.",
7
7
  CHANGES_RECOMMENDED: "**Verdict: CHANGES_RECOMMENDED** \u2014 P2 findings should be addressed.",
@@ -23,7 +23,7 @@ var COPY = {
23
23
  }
24
24
  },
25
25
  ko: {
26
- terminationBanner: (maxRounds) => `> \u26A0\uFE0F **\uC790\uB3D9 \uB9AC\uBDF0 \uC885\uB8CC.** \uCD5C\uB300 ${maxRounds}\uD68C\uC758 \uB9AC\uBDF0 \uB77C\uC6B4\uB4DC\uC5D0 \uB3C4\uB2EC\uD588\uC9C0\uB9CC \uBCD1\uD569\uC744 \uB9C9\uB294 finding(P0/P1)\uC774 \uB0A8\uC544 \uC788\uC2B5\uB2C8\uB2E4. \uC774\uD6C4 push\uB294 AI\uAC00 \uB9AC\uBDF0\uD558\uC9C0 \uC54A\uC73C\uB2C8, \uBCD1\uD569 \uC804\uC5D0 \uC9C1\uC811 \uB9AC\uBDF0\uD558\uC138\uC694.`,
26
+ terminationBanner: (maxRounds) => `> \u26A0\uFE0F **\uC790\uB3D9 \uB9AC\uBDF0 \uC885\uB8CC.** \uCD5C\uB300 ${maxRounds}\uD68C\uC758 \uB9AC\uBDF0 \uB77C\uC6B4\uB4DC\uC5D0 \uB3C4\uB2EC\uD588\uC9C0\uB9CC \uBCD1\uD569\uC744 \uB9C9\uB294 finding(P0/P1)\uC774 \uB0A8\uC544 \uC788\uC2B5\uB2C8\uB2E4. \uC774\uD6C4 push\uB294 AI\uAC00 \uB9AC\uBDF0\uD558\uC9C0 \uC54A\uACE0 review \uCCB4\uD06C\uB3C4 \uC2E4\uD328\uD569\uB2C8\uB2E4. \uC9C1\uC811 \uB9AC\uBDF0\uD55C \uB4A4 \uBE0C\uB79C\uCE58 ruleset\uC758 bypass\uB85C \uBCD1\uD569\uD558\uC138\uC694.`,
27
27
  verdictLines: {
28
28
  BLOCK: "**\uD310\uC815: BLOCK** \u2014 \uBCD1\uD569 \uC804\uC5D0 P0/P1 finding\uC744 \uD574\uACB0\uD574\uC57C \uD569\uB2C8\uB2E4.",
29
29
  CHANGES_RECOMMENDED: "**\uD310\uC815: CHANGES_RECOMMENDED** \u2014 P2 finding\uC744 \uD574\uACB0\uD558\uB294 \uAC83\uC744 \uAD8C\uC7A5\uD569\uB2C8\uB2E4.",
@@ -86,20 +86,24 @@ var NOT_RUN_REASON = {
86
86
  en: {
87
87
  secret: (secretName) => `the ${secretName} secret is not registered`,
88
88
  fork: () => "this pull request comes from a fork, and GitHub passes no secrets to runs from forks",
89
- dependabot: (secretName) => `Dependabot runs receive only Dependabot secrets, and ${secretName} is not one of them`,
90
- rounds: (_secretName, maxRounds) => `the automated review round limit (${maxRounds}) is reached`
89
+ dependabot: (secretName) => `Dependabot runs receive only Dependabot secrets, and ${secretName} is not one of them`
91
90
  },
92
91
  ko: {
93
92
  secret: (secretName) => `${secretName} \uC2DC\uD06C\uB9BF\uC774 \uB4F1\uB85D\uB418\uC9C0 \uC54A\uC74C`,
94
93
  fork: () => "\uD3EC\uD06C\uC5D0\uC11C \uC628 pull request\uC774\uACE0, GitHub\uB294 \uD3EC\uD06C \uC2E4\uD589\uC5D0 \uC2DC\uD06C\uB9BF\uC744 \uB118\uAE30\uC9C0 \uC54A\uC74C",
95
- dependabot: (secretName) => `Dependabot \uC2E4\uD589\uC740 Dependabot \uC2DC\uD06C\uB9BF\uB9CC \uBC1B\uB294\uB370, ${secretName}\uB294 \uADF8\uC911\uC5D0 \uC5C6\uC74C`,
96
- rounds: (_secretName, maxRounds) => `\uC790\uB3D9 \uB9AC\uBDF0 \uB77C\uC6B4\uB4DC \uD55C\uB3C4(${maxRounds})\uC5D0 \uB3C4\uB2EC\uD568`
94
+ dependabot: (secretName) => `Dependabot \uC2E4\uD589\uC740 Dependabot \uC2DC\uD06C\uB9BF\uB9CC \uBC1B\uB294\uB370, ${secretName}\uB294 \uADF8\uC911\uC5D0 \uC5C6\uC74C`
97
95
  }
98
96
  };
99
- function renderNotRunNotice(locale, reason, secretName, maxRounds) {
100
- const why = NOT_RUN_REASON[locale][reason](secretName, maxRounds);
97
+ function renderNotRunNotice(locale, reason, secretName) {
98
+ const why = NOT_RUN_REASON[locale][reason](secretName);
101
99
  return locale === "en" ? `AI review did not run for this commit (${why}). A green check here does not mean the change was reviewed.` : `\uC774 \uCEE4\uBC0B\uC5D0\uB294 AI \uB9AC\uBDF0\uAC00 \uC2E4\uD589\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4(${why}). \uC774 green \uCCB4\uD06C\uB294 \uBCC0\uACBD \uC0AC\uD56D\uC774 \uB9AC\uBDF0\uB418\uC5C8\uB2E4\uB294 \uB73B\uC774 \uC544\uB2D9\uB2C8\uB2E4.`;
102
100
  }
101
+ function renderVerdictToolMissingNotice(locale) {
102
+ return locale === "en" ? "The AI review ran, but the verdict tool (@clearlydev/nx-archweave) is not installed in this workspace, so there is no verdict for this commit and the review check fails. Install @clearlydev/nx-archweave as a devDependency, or, to switch review off, delete the review workflow." : "AI \uB9AC\uBDF0\uB294 \uC2E4\uD589\uB410\uC9C0\uB9CC \uC774 \uC6CC\uD06C\uC2A4\uD398\uC774\uC2A4\uC5D0 \uD310\uC815 \uB3C4\uAD6C(@clearlydev/nx-archweave)\uAC00 \uC124\uCE58\uB3FC \uC788\uC9C0 \uC54A\uC544 \uC774 \uCEE4\uBC0B\uC758 verdict\uAC00 \uC5C6\uACE0, review \uCCB4\uD06C\uB294 \uC2E4\uD328\uD569\uB2C8\uB2E4. @clearlydev/nx-archweave\uB97C devDependency\uB85C \uC124\uCE58\uD558\uAC70\uB098, \uB9AC\uBDF0\uB97C \uB044\uB824\uBA74 \uB9AC\uBDF0 \uC6CC\uD06C\uD50C\uB85C\uB97C \uC9C0\uC6B0\uC138\uC694.";
103
+ }
104
+ function renderRoundLimitNotice(locale, maxRounds) {
105
+ return locale === "en" ? `The AI review did not review this commit: the automated review round limit (${maxRounds}) is reached, so there is no verdict and the review check fails. To merge, use your branch ruleset's bypass, or raise maxRounds and run add-review again.` : `AI \uB9AC\uBDF0\uAC00 \uC774 \uCEE4\uBC0B\uC744 \uB9AC\uBDF0\uD558\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4. \uC790\uB3D9 \uB9AC\uBDF0 \uB77C\uC6B4\uB4DC \uD55C\uB3C4(${maxRounds})\uC5D0 \uB3C4\uB2EC\uD574 verdict\uAC00 \uC5C6\uACE0, review \uCCB4\uD06C\uB294 \uC2E4\uD328\uD569\uB2C8\uB2E4. \uBA38\uC9C0\uD558\uB824\uBA74 \uBE0C\uB79C\uCE58 ruleset\uC758 bypass\uB97C \uC4F0\uAC70\uB098, maxRounds\uB97C \uC62C\uB9AC\uACE0 add-review\uB97C \uB2E4\uC2DC \uC2E4\uD589\uD558\uC138\uC694.`;
106
+ }
103
107
  function withHead(lines, locale, headSha) {
104
108
  return (headSha === void 0 ? lines : [...lines, "", HEAD_LINE[locale](headSha)]).join("\n");
105
109
  }
@@ -395,7 +399,7 @@ var ACTION_PINS = {
395
399
  "actions/setup-node": "actions/setup-node@949feb2413d6458794dcd2491c4babbbce0c15c1 # v7.1.0",
396
400
  "pnpm/action-setup": "pnpm/action-setup@ea17c68df8912ef543352723c149a84f56e3d413 # v6.1.0",
397
401
  "oven-sh/setup-bun": "oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2.2.0",
398
- "anthropics/claude-code-action": "anthropics/claude-code-action@6b6870e649b5ff408753befeaee5fc7989d4e6a9 # v1.0.258",
402
+ "anthropics/claude-code-action": "anthropics/claude-code-action@c0949c50a78c1ec8ce2647db36629b870e715d0c # v1.0.268",
399
403
  "google-github-actions/run-gemini-cli": "google-github-actions/run-gemini-cli@f77273f4c914e4bf38440cf36a0369cb64a37489 # v0.1.22",
400
404
  "openai/codex-action": "openai/codex-action@bdf19a4a223ec2549a3e2274a0cf61556bc07675 # v1.13"
401
405
  };
@@ -471,26 +475,35 @@ function shellQuote(text) {
471
475
  return `'${text.replace(/'/g, `'\\''`)}'`;
472
476
  }
473
477
  function renderNotRunFunction(secretName, maxRounds, locale) {
474
- const reasons = ["secret", "fork", "dependabot", "rounds"];
478
+ const reasons = ["secret", "fork", "dependabot"];
475
479
  const [commitBefore, commitAfter] = renderCommitLine(locale, "\0").split("\0");
476
480
  return [
477
- "not_run() {",
478
- ' case "$1" in',
479
- ...reasons.map((reason) => ` ${reason}) annotation=${shellQuote(renderNotRunNotice("en", reason, secretName, maxRounds))}; notice=${shellQuote(renderNotRunNotice(locale, reason, secretName, maxRounds))} ;;`),
480
- " esac",
481
- ' echo "::notice title=AI review did not run::$annotation"',
482
- ` printf '%s\\n' "$notice" >> "$GITHUB_STEP_SUMMARY"`,
481
+ "write_notice() {",
483
482
  ` short_sha=$(printf '%s' "$HEAD_SHA" | cut -c1-7)`,
484
483
  ' case "$short_sha" in',
485
484
  " '' | *[!0-9a-f]*) short_sha= ;;",
486
485
  " esac",
487
486
  " {",
488
487
  ' echo "notice-body<<ARCHWEAVE_NOT_RUN_EOF"',
489
- ` printf '%s\\n' ${shellQuote(VERDICT_MARKER)} "\u2139\uFE0F $notice"`,
488
+ ` printf '%s\\n' ${shellQuote(VERDICT_MARKER)} "$1"`,
490
489
  ` if [ -n "$short_sha" ]; then printf '\\n%s\\n' ${shellQuote(commitBefore)}"$short_sha"${shellQuote(commitAfter)}; fi`,
491
490
  ' echo "ARCHWEAVE_NOT_RUN_EOF"',
492
491
  ' echo "run=false"',
493
492
  ' } >> "$GITHUB_OUTPUT"',
493
+ "}",
494
+ "not_run() {",
495
+ ' case "$1" in',
496
+ ...reasons.map((reason) => ` ${reason}) annotation=${shellQuote(renderNotRunNotice("en", reason, secretName))}; notice=${shellQuote(renderNotRunNotice(locale, reason, secretName))} ;;`),
497
+ " esac",
498
+ ' echo "::notice title=AI review did not run::$annotation"',
499
+ ` printf '%s\\n' "$notice" >> "$GITHUB_STEP_SUMMARY"`,
500
+ ' write_notice "\u2139\uFE0F $notice"',
501
+ "}",
502
+ "round_limit() {",
503
+ ` notice=${shellQuote(renderRoundLimitNotice(locale, maxRounds))}`,
504
+ ` printf '%s\\n' "$notice" >> "$GITHUB_STEP_SUMMARY"`,
505
+ ' write_notice "\u26D4 $notice"',
506
+ ' echo "block-reason=rounds" >> "$GITHUB_OUTPUT"',
494
507
  "}"
495
508
  ];
496
509
  }
@@ -523,7 +536,7 @@ function renderAiReviewResultStep(secretName, maxRounds, locale) {
523
536
  " exit 0",
524
537
  " ;;",
525
538
  " true/false)",
526
- " not_run rounds",
539
+ " round_limit",
527
540
  " exit 0",
528
541
  " ;;",
529
542
  " true/true)",
@@ -541,6 +554,7 @@ function renderAiReviewResultStep(secretName, maxRounds, locale) {
541
554
  ].join("\n");
542
555
  }
543
556
  function renderVerdictGateStep(maxRounds, locale) {
557
+ const [commitBefore, commitAfter] = renderCommitLine(locale, "\0").split("\0");
544
558
  return [
545
559
  "- name: Compute review verdict",
546
560
  " id: verdict",
@@ -558,21 +572,37 @@ function renderVerdictGateStep(maxRounds, locale) {
558
572
  " if [ -x node_modules/.bin/archweave-review-verdict ]; then",
559
573
  " node_modules/.bin/archweave-review-verdict",
560
574
  " else",
561
- ' echo "nx-archweave is not installed in this workspace - skipping the verdict gate."',
575
+ ` echo ${shellQuote(`::error title=Verdict tool missing::${renderVerdictToolMissingNotice("en")}`)}`,
576
+ ` notice=${shellQuote(renderVerdictToolMissingNotice(locale))}`,
577
+ ` printf '%s\\n' "$notice" >> "$GITHUB_STEP_SUMMARY"`,
578
+ ` short_sha=$(printf '%s' "$ARCHWEAVE_HEAD_SHA" | cut -c1-7)`,
579
+ ' case "$short_sha" in',
580
+ " '' | *[!0-9a-f]*) short_sha= ;;",
581
+ " esac",
582
+ " {",
583
+ ' echo "comment-body<<ARCHWEAVE_TOOL_MISSING_EOF"',
584
+ ` printf '%s\\n' ${shellQuote(VERDICT_MARKER)} "\u26D4 $notice"`,
585
+ ` if [ -n "$short_sha" ]; then printf '\\n%s\\n' ${shellQuote(commitBefore)}"$short_sha"${shellQuote(commitAfter)}; fi`,
586
+ ' echo "ARCHWEAVE_TOOL_MISSING_EOF"',
587
+ ' echo "blocked=true"',
588
+ ' echo "block-reason=tool-missing"',
589
+ ' } >> "$GITHUB_OUTPUT"',
562
590
  " fi"
563
591
  ].join("\n");
564
592
  }
565
- function renderBlockStep() {
593
+ function renderBlockStep(maxRounds) {
566
594
  return [
567
595
  "- name: Fail the review check",
568
- " if: steps.verdict.outputs.blocked == 'true'",
596
+ " if: steps.verdict.outputs.blocked == 'true' || steps.ai-review-result.outputs.block-reason == 'rounds'",
569
597
  " env:",
570
- " BLOCK_REASON: ${{ steps.verdict.outputs.block-reason }}",
598
+ " BLOCK_REASON: ${{ steps.verdict.outputs.block-reason || steps.ai-review-result.outputs.block-reason }}",
571
599
  " run: |",
572
600
  ' case "$BLOCK_REASON" in',
573
601
  ' block) echo "The AI verdict is BLOCK: fix the P0/P1 findings in the verdict comment and push." ;;',
574
602
  ' no-summary) echo "The AI review posted no summary for this commit, so there is no verdict. Re-run all jobs to review it again, or review it yourself." ;;',
575
603
  ' unreadable) echo "The AI review summary has no readable findings block, so there is no verdict. Re-run all jobs to review it again, or review it yourself." ;;',
604
+ ' tool-missing) echo "The verdict tool is not installed in this workspace, so there is no verdict. Install @clearlydev/nx-archweave as a devDependency, or delete the review workflow to switch review off." ;;',
605
+ ` rounds) echo "The automated review round limit (${maxRounds}) is reached, so the AI review did not review this commit and there is no verdict. To merge it, use your branch ruleset's bypass, or raise maxRounds and run add-review again." ;;`,
576
606
  ' *) echo "The review check failed. See the verdict comment on this pull request." ;;',
577
607
  " esac",
578
608
  " exit 1"
@@ -670,7 +700,7 @@ function renderReviewWorkflow(input, parts) {
670
700
  renderCheckoutStep(JUDGE_CONDITION),
671
701
  renderWorkspaceSetupSteps(input.packageManager),
672
702
  renderVerdictGateStep(input.maxRounds, input.locale),
673
- renderBlockStep()
703
+ renderBlockStep(input.maxRounds)
674
704
  ];
675
705
  return [
676
706
  `name: ${parts.name}`,
@@ -3,8 +3,8 @@ import {
3
3
  generator_default,
4
4
  recordedReview,
5
5
  runAddReview
6
- } from "../_chunks/chunk-JHRTVURZ.js";
7
- import "../_chunks/chunk-67INEVWL.js";
6
+ } from "../_chunks/chunk-4FJ7CLEU.js";
7
+ import "../_chunks/chunk-ALSXKTLM.js";
8
8
  import "../_chunks/chunk-3A6RZUCZ.js";
9
9
  import "../_chunks/chunk-YNMLB4DL.js";
10
10
  import "../_chunks/chunk-TUN34LAQ.js";
@@ -10,7 +10,7 @@ import {
10
10
  REVIEW_PROVIDERS,
11
11
  ROUND_MARKER,
12
12
  judgeReviewFileConflict
13
- } from "../_chunks/chunk-67INEVWL.js";
13
+ } from "../_chunks/chunk-ALSXKTLM.js";
14
14
  import {
15
15
  createGroupDetector,
16
16
  indexFilePattern
@@ -197,7 +197,8 @@ var REVIEW_CHECK_IDS = [
197
197
  "review-config-consistency",
198
198
  "review-workflow-providers",
199
199
  "review-workflow-pnpm",
200
- "review-workflow-fail-open"
200
+ "review-workflow-fail-open",
201
+ "review-workflow-no-verdict"
201
202
  ];
202
203
  var WORKFLOWS_DIR = ".github/workflows";
203
204
  function archweaveWorkflows(root) {
@@ -273,6 +274,34 @@ function buildReviewFailOpenCheck(root, workflows) {
273
274
  suggestedAction: "Re-run add-review: nx g @clearlydev/nx-archweave:add-review --onConflict=overwrite. The report shows the difference before anything is replaced."
274
275
  });
275
276
  }
277
+ var NO_VERDICT_FAILS = ['echo "block-reason=rounds" >> "$GITHUB_OUTPUT"', 'echo "block-reason=tool-missing"'];
278
+ function buildReviewNoVerdictCheck(root, workflows) {
279
+ const id = "review-workflow-no-verdict";
280
+ const label = "Review check fails when a commit has no AI verdict";
281
+ if (workflows.length === 0)
282
+ return createDoctorCheck({ id, label, status: "not-applicable", message: "no nx-archweave review workflow", evidence: [] });
283
+ const passing = workflows.filter((path) => {
284
+ const text = readFileSync2(join2(root, path), "utf-8");
285
+ return !NO_VERDICT_FAILS.every((line) => text.includes(line));
286
+ });
287
+ if (passing.length === 0) {
288
+ return createDoctorCheck({
289
+ id,
290
+ label,
291
+ status: "pass",
292
+ message: "a commit after the round limit, and a review in a workspace without the verdict tool, fail the review check",
293
+ evidence: workflows
294
+ });
295
+ }
296
+ return createDoctorCheck({
297
+ id,
298
+ label,
299
+ status: "warning",
300
+ message: "generated before nx-archweave 0.4.0: a commit after the round limit, or a review in a workspace without the verdict tool, passes the review check green, although nothing judged it",
301
+ evidence: passing,
302
+ suggestedAction: "Preview the current workflow with nx g @clearlydev/nx-archweave:add-review --onConflict=overwrite --dryRun, then run it without --dryRun. Such a commit then fails the check; merge it with your branch ruleset's bypass, raise maxRounds, or install @clearlydev/nx-archweave."
303
+ });
304
+ }
276
305
  function buildReviewChecks(root) {
277
306
  const config = readToolkitConfigState(root);
278
307
  const mainWorkflowPath = REVIEW_PROVIDERS[resolveProviderId(config)].workflowFileName;
@@ -287,7 +316,8 @@ function buildReviewChecks(root) {
287
316
  buildReviewConfigConsistencyCheck(root, mainWorkflowPath, mainExists, config),
288
317
  buildReviewProvidersCheck(workflows),
289
318
  buildReviewPnpmCheck(root, workflows),
290
- buildReviewFailOpenCheck(root, workflows)
319
+ buildReviewFailOpenCheck(root, workflows),
320
+ buildReviewNoVerdictCheck(root, workflows)
291
321
  ];
292
322
  }
293
323
  function buildReviewWorkflowPresentCheck(mainWorkflowPath, mainExists, mainIsOurs, config) {
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  recordedReview,
3
3
  runAddReview
4
- } from "../_chunks/chunk-JHRTVURZ.js";
4
+ } from "../_chunks/chunk-4FJ7CLEU.js";
5
5
  import {
6
6
  DEFAULT_MAX_ROUNDS,
7
7
  buildReviewConfigSnippet
8
- } from "../_chunks/chunk-67INEVWL.js";
8
+ } from "../_chunks/chunk-ALSXKTLM.js";
9
9
  import {
10
10
  renderAddAgentRulesReport,
11
11
  runAddAgentRules
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@clearlydev/nx-archweave",
3
- "version": "0.3.3",
3
+ "version": "0.4.0",
4
4
  "description": "Nx generators for an FSD Lite lint rule, frontend/backend boundaries, AI agent rules, GitHub templates and optional AI PR review",
5
5
  "license": "MIT",
6
6
  "author": "clearlydev (https://github.com/clearlydev)",