@zephyrdeng/pi-review 0.6.1 → 0.7.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 (125) hide show
  1. package/README.md +110 -13
  2. package/README.zh-CN.md +64 -3
  3. package/dist/args.d.ts +8 -0
  4. package/dist/args.d.ts.map +1 -1
  5. package/dist/args.js +147 -28
  6. package/dist/args.js.map +1 -1
  7. package/dist/args.test.d.ts +2 -0
  8. package/dist/args.test.d.ts.map +1 -0
  9. package/dist/args.test.js +115 -0
  10. package/dist/args.test.js.map +1 -0
  11. package/dist/cli-exit.test.d.ts +2 -0
  12. package/dist/cli-exit.test.d.ts.map +1 -0
  13. package/dist/cli-exit.test.js +84 -0
  14. package/dist/cli-exit.test.js.map +1 -0
  15. package/dist/cli.js +16 -2
  16. package/dist/cli.js.map +1 -1
  17. package/dist/config.d.ts +1 -0
  18. package/dist/config.d.ts.map +1 -1
  19. package/dist/config.js +1 -0
  20. package/dist/config.js.map +1 -1
  21. package/dist/extensions/review.d.ts +2 -0
  22. package/dist/extensions/review.js +22 -0
  23. package/dist/extensions/rv-prompts.d.ts +19 -0
  24. package/dist/extensions/rv-prompts.js +132 -0
  25. package/dist/index.d.ts +17 -7
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +12 -6
  28. package/dist/index.js.map +1 -1
  29. package/dist/json-events.d.ts +45 -0
  30. package/dist/json-events.d.ts.map +1 -1
  31. package/dist/json-events.js +185 -0
  32. package/dist/json-events.js.map +1 -1
  33. package/dist/json-events.test.js +64 -1
  34. package/dist/json-events.test.js.map +1 -1
  35. package/dist/loop.d.ts +36 -0
  36. package/dist/loop.d.ts.map +1 -0
  37. package/dist/loop.js +73 -0
  38. package/dist/loop.js.map +1 -0
  39. package/dist/loop.test.d.ts +2 -0
  40. package/dist/loop.test.d.ts.map +1 -0
  41. package/dist/loop.test.js +83 -0
  42. package/dist/loop.test.js.map +1 -0
  43. package/dist/matcher.d.ts +74 -0
  44. package/dist/matcher.d.ts.map +1 -0
  45. package/dist/matcher.js +202 -0
  46. package/dist/matcher.js.map +1 -0
  47. package/dist/matcher.test.d.ts +2 -0
  48. package/dist/matcher.test.d.ts.map +1 -0
  49. package/dist/matcher.test.js +161 -0
  50. package/dist/matcher.test.js.map +1 -0
  51. package/dist/meta-footer.d.ts +15 -1
  52. package/dist/meta-footer.d.ts.map +1 -1
  53. package/dist/meta-footer.js +108 -0
  54. package/dist/meta-footer.js.map +1 -1
  55. package/dist/meta-footer.test.js +43 -1
  56. package/dist/meta-footer.test.js.map +1 -1
  57. package/dist/panel-aggregate.d.ts +18 -0
  58. package/dist/panel-aggregate.d.ts.map +1 -0
  59. package/dist/panel-aggregate.js +247 -0
  60. package/dist/panel-aggregate.js.map +1 -0
  61. package/dist/panel-aggregate.test.d.ts +2 -0
  62. package/dist/panel-aggregate.test.d.ts.map +1 -0
  63. package/dist/panel-aggregate.test.js +461 -0
  64. package/dist/panel-aggregate.test.js.map +1 -0
  65. package/dist/panel-cli.test.d.ts +2 -0
  66. package/dist/panel-cli.test.d.ts.map +1 -0
  67. package/dist/panel-cli.test.js +188 -0
  68. package/dist/panel-cli.test.js.map +1 -0
  69. package/dist/panel-config.d.ts +19 -0
  70. package/dist/panel-config.d.ts.map +1 -0
  71. package/dist/panel-config.js +115 -0
  72. package/dist/panel-config.js.map +1 -0
  73. package/dist/panel-config.test.d.ts +2 -0
  74. package/dist/panel-config.test.d.ts.map +1 -0
  75. package/dist/panel-config.test.js +91 -0
  76. package/dist/panel-config.test.js.map +1 -0
  77. package/dist/panel-loop.test.d.ts +2 -0
  78. package/dist/panel-loop.test.d.ts.map +1 -0
  79. package/dist/panel-loop.test.js +118 -0
  80. package/dist/panel-loop.test.js.map +1 -0
  81. package/dist/panel.d.ts +10 -0
  82. package/dist/panel.d.ts.map +1 -0
  83. package/dist/panel.js +315 -0
  84. package/dist/panel.js.map +1 -0
  85. package/dist/presets.d.ts +2 -1
  86. package/dist/presets.d.ts.map +1 -1
  87. package/dist/presets.js +10 -0
  88. package/dist/presets.js.map +1 -1
  89. package/dist/prompt.d.ts +14 -1
  90. package/dist/prompt.d.ts.map +1 -1
  91. package/dist/prompt.js +61 -15
  92. package/dist/prompt.js.map +1 -1
  93. package/dist/prompt.test.d.ts +2 -0
  94. package/dist/prompt.test.d.ts.map +1 -0
  95. package/dist/prompt.test.js +37 -0
  96. package/dist/prompt.test.js.map +1 -0
  97. package/dist/review-result.d.ts +5 -0
  98. package/dist/review-result.d.ts.map +1 -0
  99. package/dist/review-result.js +98 -0
  100. package/dist/review-result.js.map +1 -0
  101. package/dist/review-result.test.d.ts +2 -0
  102. package/dist/review-result.test.d.ts.map +1 -0
  103. package/dist/review-result.test.js +196 -0
  104. package/dist/review-result.test.js.map +1 -0
  105. package/dist/review.d.ts +10 -4
  106. package/dist/review.d.ts.map +1 -1
  107. package/dist/review.js +82 -20
  108. package/dist/review.js.map +1 -1
  109. package/dist/review.meta.test.js +2 -2
  110. package/dist/review.meta.test.js.map +1 -1
  111. package/dist/skill-protocol.test.d.ts +2 -0
  112. package/dist/skill-protocol.test.d.ts.map +1 -0
  113. package/dist/skill-protocol.test.js +35 -0
  114. package/dist/skill-protocol.test.js.map +1 -0
  115. package/dist/types.d.ts +147 -5
  116. package/dist/types.d.ts.map +1 -1
  117. package/dist/types.js +11 -0
  118. package/dist/types.js.map +1 -1
  119. package/extensions/rv-completions.test.ts +15 -0
  120. package/extensions/rv-completions.ts +7 -1
  121. package/package.json +3 -3
  122. package/resources/panel-presets.json +21 -0
  123. package/resources/system-prompt.md +11 -1
  124. package/skills/pi-review/SKILL.md +90 -12
  125. package/skills/pi-review/references/codex-tools.md +19 -6
@@ -0,0 +1,98 @@
1
+ import { parseVerdict } from "./verdict.js";
2
+ function escapeRegExp(value) {
3
+ return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
4
+ }
5
+ function markdownSection(markdown, heading) {
6
+ const escaped = escapeRegExp(heading);
7
+ return markdown.match(new RegExp(`(?:^|\\n)##\\s*${escaped}\\s*\\n+([\\s\\S]*?)(?=\\n##\\s+|$)`, "i"))?.[1]?.trim() ?? "";
8
+ }
9
+ function field(block, name) {
10
+ const escaped = escapeRegExp(name);
11
+ return block.match(new RegExp(`^\\s*[-*]\\s*(?:\\*\\*)?${escaped}(?:\\*\\*)?\\s*:\\s*(.+?)\\s*$`, "im"))?.[1]?.trim();
12
+ }
13
+ const SEVERITY_PREFIX = /^(critical|high|medium|low|info|warning)\s*[:—-]\s*/i;
14
+ function findingBlocks(section) {
15
+ const headings = [...section.matchAll(/^###\s+(.+?)\s*$/gm)].map((match) => ({
16
+ header: match[1],
17
+ index: match.index ?? 0,
18
+ length: match[0].length,
19
+ }));
20
+ if (headings.length > 0)
21
+ return headings;
22
+ return [...section.matchAll(/^(?:[-*]|(\d+)[.)])\s+(.+?)\s*$/gm)].map((match) => ({
23
+ header: match[2],
24
+ index: match.index ?? 0,
25
+ length: match[0].length,
26
+ ...(match[1] ? { listId: match[1] } : {}),
27
+ }));
28
+ }
29
+ function parseStructuredFindings(markdown, verdictInfo) {
30
+ const section = markdownSection(markdown, "Findings");
31
+ const blocks = findingBlocks(section);
32
+ return blocks.map((entry, index) => {
33
+ const plainHeader = entry.header.replace(/[*_]/g, "").trim();
34
+ const idParts = plainHeader.match(/^([A-Za-z]+\d+|\d+)[.):\s-]+(.+)$/);
35
+ let summary = (idParts?.[2] ?? plainHeader).trim();
36
+ const severityFromHeader = summary.match(SEVERITY_PREFIX)?.[1]?.toLowerCase();
37
+ summary = summary.replace(SEVERITY_PREFIX, "");
38
+ const pathFromHeader = summary.match(/`([^`]+)`/)?.[1];
39
+ if (pathFromHeader)
40
+ summary = summary.replace(/`[^`]+`\s*[:—-]?\s*/, "");
41
+ const blockStart = entry.index + entry.length;
42
+ const blockEnd = blocks[index + 1]?.index ?? section.length;
43
+ const block = section.slice(blockStart, blockEnd);
44
+ const severity = field(block, "Severity")?.toLowerCase() ?? severityFromHeader;
45
+ const rawPath = field(block, "Path")?.replace(/^`|`$/g, "") ?? pathFromHeader;
46
+ const findingPath = rawPath && !/^(?:none|n\/a|-)$/i.test(rawPath) ? rawPath : undefined;
47
+ const actionableField = field(block, "Actionable");
48
+ const actionable = actionableField === undefined
49
+ ? verdictInfo.verdict === "request_changes"
50
+ : /^(?:yes|true)$/i.test(actionableField);
51
+ const id = entry.listId ?? idParts?.[1];
52
+ return {
53
+ ...(id ? { id } : {}),
54
+ ...(severity ? { severity } : {}),
55
+ ...(findingPath ? { path: findingPath } : {}),
56
+ summary: summary.replace(/[`*_]/g, "").trim(),
57
+ actionable,
58
+ };
59
+ });
60
+ }
61
+ const REVIEW_EXIT_CODE = {
62
+ clean: 0,
63
+ has_findings: 1,
64
+ needs_human: 3,
65
+ blocked: 4,
66
+ };
67
+ export function reviewExitCode(status) {
68
+ return REVIEW_EXIT_CODE[status];
69
+ }
70
+ /** Derives the machine review contract from the human-readable conclusion. */
71
+ export function parseReviewResult(markdown, verdictInfo = parseVerdict(markdown)) {
72
+ const findings = parseStructuredFindings(markdown, verdictInfo);
73
+ const actionableCount = findings.filter((finding) => finding.actionable).length;
74
+ let status;
75
+ switch (verdictInfo.verdict) {
76
+ case "approve":
77
+ status = "clean";
78
+ break;
79
+ case "request_changes":
80
+ status = "has_findings";
81
+ break;
82
+ case "needs_clarification":
83
+ status = "needs_human";
84
+ break;
85
+ case "blocked":
86
+ status = "blocked";
87
+ break;
88
+ }
89
+ if (verdictInfo.verdict === "approve" && actionableCount > 0)
90
+ status = "has_findings";
91
+ return {
92
+ ...verdictInfo,
93
+ status,
94
+ findings,
95
+ actionableCount,
96
+ };
97
+ }
98
+ //# sourceMappingURL=review-result.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-result.js","sourceRoot":"","sources":["../src/review-result.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,SAAS,YAAY,CAAC,KAAa;IACjC,OAAO,KAAK,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;AACtD,CAAC;AAED,SAAS,eAAe,CAAC,QAAgB,EAAE,OAAe;IACxD,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IACtC,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,kBAAkB,OAAO,qCAAqC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AAC5H,CAAC;AAED,SAAS,KAAK,CAAC,KAAa,EAAE,IAAY;IACxC,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IACnC,OAAO,KAAK,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,2BAA2B,OAAO,gCAAgC,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;AACxH,CAAC;AAED,MAAM,eAAe,GAAG,sDAAsD,CAAC;AAS/E,SAAS,aAAa,CAAC,OAAe;IACpC,MAAM,QAAQ,GAAG,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAC3E,MAAM,EAAE,KAAK,CAAC,CAAC,CAAE;QACjB,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,CAAC;QACvB,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM;KACxB,CAAC,CAAC,CAAC;IACJ,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,QAAQ,CAAC;IAEzC,OAAO,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,mCAAmC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAChF,MAAM,EAAE,KAAK,CAAC,CAAC,CAAE;QACjB,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,CAAC;QACvB,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM;QACvB,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC1C,CAAC,CAAC,CAAC;AACN,CAAC;AAED,SAAS,uBAAuB,CAAC,QAAgB,EAAE,WAAwB;IACzE,MAAM,OAAO,GAAG,eAAe,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IACtD,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IAEtC,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;QACjC,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAC7D,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;QACvE,IAAI,OAAO,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC,CAAC,IAAI,EAAE,CAAC;QACnD,MAAM,kBAAkB,GAAG,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC;QAC9E,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;QAC/C,MAAM,cAAc,GAAG,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACvD,IAAI,cAAc;YAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,qBAAqB,EAAE,EAAE,CAAC,CAAC;QAEzE,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC;QAC9C,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;QAC5D,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QAClD,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,EAAE,UAAU,CAAC,EAAE,WAAW,EAAE,IAAI,kBAAkB,CAAC;QAC/E,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,cAAc,CAAC;QAC9E,MAAM,WAAW,GAAG,OAAO,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;QACzF,MAAM,eAAe,GAAG,KAAK,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;QACnD,MAAM,UAAU,GAAG,eAAe,KAAK,SAAS;YAC9C,CAAC,CAAC,WAAW,CAAC,OAAO,KAAK,iBAAiB;YAC3C,CAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC5C,MAAM,EAAE,GAAG,KAAK,CAAC,MAAM,IAAI,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;QAExC,OAAO;YACL,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACrB,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACjC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7C,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE;YAC7C,UAAU;SACX,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,gBAAgB,GAAiC;IACrD,KAAK,EAAE,CAAC;IACR,YAAY,EAAE,CAAC;IACf,WAAW,EAAE,CAAC;IACd,OAAO,EAAE,CAAC;CACX,CAAC;AAEF,MAAM,UAAU,cAAc,CAAC,MAAoB;IACjD,OAAO,gBAAgB,CAAC,MAAM,CAAC,CAAC;AAClC,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,iBAAiB,CAC/B,QAAgB,EAChB,cAA2B,YAAY,CAAC,QAAQ,CAAC;IAEjD,MAAM,QAAQ,GAAG,uBAAuB,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IAChE,MAAM,eAAe,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC;IAEhF,IAAI,MAAwC,CAAC;IAC7C,QAAQ,WAAW,CAAC,OAAO,EAAE,CAAC;QAC5B,KAAK,SAAS;YACZ,MAAM,GAAG,OAAO,CAAC;YACjB,MAAM;QACR,KAAK,iBAAiB;YACpB,MAAM,GAAG,cAAc,CAAC;YACxB,MAAM;QACR,KAAK,qBAAqB;YACxB,MAAM,GAAG,aAAa,CAAC;YACvB,MAAM;QACR,KAAK,SAAS;YACZ,MAAM,GAAG,SAAS,CAAC;YACnB,MAAM;IACV,CAAC;IAED,IAAI,WAAW,CAAC,OAAO,KAAK,SAAS,IAAI,eAAe,GAAG,CAAC;QAAE,MAAM,GAAG,cAAc,CAAC;IAEtF,OAAO;QACL,GAAG,WAAW;QACd,MAAM;QACN,QAAQ;QACR,eAAe;KAChB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=review-result.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-result.test.d.ts","sourceRoot":"","sources":["../src/review-result.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,196 @@
1
+ import assert from "node:assert/strict";
2
+ import { test } from "node:test";
3
+ import { parseReviewResult, reviewExitCode } from "./review-result.js";
4
+ test("approve with no material findings is clean", () => {
5
+ const result = parseReviewResult(`
6
+ ## Verdict
7
+ approve
8
+
9
+ ## Summary
10
+ - Ready to ship.
11
+
12
+ ## Findings
13
+ No material findings.
14
+
15
+ ## Risks and Blind Spots
16
+ None.
17
+
18
+ ## Open Questions
19
+ None.
20
+ `);
21
+ assert.equal(result.verdict, "approve");
22
+ assert.equal(result.status, "clean");
23
+ assert.deepEqual(result.findings, []);
24
+ assert.equal(result.actionableCount, 0);
25
+ });
26
+ test("request_changes exposes structured actionable findings", () => {
27
+ const result = parseReviewResult(`
28
+ ## Verdict
29
+ request_changes
30
+
31
+ ## Summary
32
+ - The loop accepts an invalid budget.
33
+
34
+ ## Findings
35
+ ### F1: Validate the round budget
36
+ - Severity: high
37
+ - Path: src/args.ts
38
+ - Actionable: yes
39
+ - Evidence: Zero rounds bypasses the review gate.
40
+ - Impact: CI can report success without a review.
41
+ - Recommendation: Reject values below one.
42
+
43
+ ## Risks and Blind Spots
44
+ None.
45
+
46
+ ## Open Questions
47
+ None.
48
+ `);
49
+ assert.equal(result.status, "has_findings");
50
+ assert.deepEqual(result.findings, [
51
+ {
52
+ id: "F1",
53
+ severity: "high",
54
+ path: "src/args.ts",
55
+ summary: "Validate the round budget",
56
+ actionable: true,
57
+ },
58
+ ]);
59
+ assert.equal(result.actionableCount, 1);
60
+ });
61
+ test("partial Markdown findings use verdict-aware actionable defaults", () => {
62
+ const result = parseReviewResult(`
63
+ ## Verdict
64
+ request_changes
65
+
66
+ ## Summary
67
+ - The round budget is unsafe.
68
+
69
+ ## Findings
70
+ ### High: \`src/args.ts\` accepts zero rounds
71
+ - Evidence: --max-rounds 0 reaches the runner.
72
+ - Impact: The gate can skip all reviews.
73
+ - Recommendation: Require a positive integer.
74
+
75
+ ## Risks and Blind Spots
76
+ None.
77
+
78
+ ## Open Questions
79
+ None.
80
+ `);
81
+ assert.deepEqual(result.findings, [
82
+ {
83
+ severity: "high",
84
+ path: "src/args.ts",
85
+ summary: "accepts zero rounds",
86
+ actionable: true,
87
+ },
88
+ ]);
89
+ assert.equal(result.actionableCount, 1);
90
+ assert.equal(result.status, "has_findings");
91
+ });
92
+ test("legacy top-level finding lists remain machine-readable", () => {
93
+ const result = parseReviewResult(`
94
+ ## Verdict
95
+ request_changes
96
+
97
+ ## Summary
98
+ - CI does not fail closed.
99
+
100
+ ## Findings
101
+ 1. **High** — \`src/cli.ts\`: Dirty reviews still exit zero
102
+ - Evidence: runReview forwards the child exit code.
103
+ - Impact: A review gate passes with actionable findings.
104
+ - Recommendation: Map structured status to a stable exit code.
105
+
106
+ ## Risks and Blind Spots
107
+ None.
108
+
109
+ ## Open Questions
110
+ None.
111
+ `);
112
+ assert.deepEqual(result.findings, [
113
+ {
114
+ id: "1",
115
+ severity: "high",
116
+ path: "src/cli.ts",
117
+ summary: "Dirty reviews still exit zero",
118
+ actionable: true,
119
+ },
120
+ ]);
121
+ });
122
+ test("an actionable finding overrides an approve verdict", () => {
123
+ const result = parseReviewResult(`
124
+ ## Verdict
125
+ approve
126
+
127
+ ## Findings
128
+ ### F1: Fix before closeout
129
+ - Severity: medium
130
+ - Actionable: true
131
+
132
+ ## Risks and Blind Spots
133
+ None.
134
+
135
+ ## Open Questions
136
+ None.
137
+ `);
138
+ assert.equal(result.status, "has_findings");
139
+ assert.equal(result.actionableCount, 1);
140
+ });
141
+ test("non-actionable findings without a path keep approve clean", () => {
142
+ const result = parseReviewResult(`
143
+ ## Verdict
144
+ approve
145
+
146
+ ## Findings
147
+ ### F1: Track a future improvement
148
+ - Severity: low
149
+ - Path: none
150
+ - Actionable: no
151
+ `);
152
+ assert.equal(result.status, "clean");
153
+ assert.deepEqual(result.findings, [
154
+ {
155
+ id: "F1",
156
+ severity: "low",
157
+ summary: "Track a future improvement",
158
+ actionable: false,
159
+ },
160
+ ]);
161
+ });
162
+ test("clarification, parse fallback, and runtime failures escalate", () => {
163
+ const clarification = parseReviewResult(`
164
+ ## Verdict
165
+ needs_clarification
166
+
167
+ ## Findings
168
+ ### F1: Confirm the intended contract
169
+ - Severity: high
170
+ - Actionable: yes
171
+ `);
172
+ assert.equal(clarification.status, "needs_human");
173
+ const fallback = parseReviewResult("## Findings\nNo material findings.");
174
+ assert.equal(fallback.status, "needs_human");
175
+ assert.equal(fallback.verdictSource, "fallback");
176
+ assert.match(fallback.parseError ?? "", /Could not parse/);
177
+ const runtime = parseReviewResult(`
178
+ ## Findings
179
+ ### F1: Retry the child
180
+ - Severity: high
181
+ - Actionable: yes
182
+ `, {
183
+ verdict: "blocked",
184
+ verdictSource: "runtime_error",
185
+ parseError: "child pi exited with status 1",
186
+ });
187
+ assert.equal(runtime.status, "blocked");
188
+ assert.equal(runtime.verdictSource, "runtime_error");
189
+ });
190
+ test("review statuses map to stable gate exit codes", () => {
191
+ assert.equal(reviewExitCode("clean"), 0);
192
+ assert.equal(reviewExitCode("has_findings"), 1);
193
+ assert.equal(reviewExitCode("needs_human"), 3);
194
+ assert.equal(reviewExitCode("blocked"), 4);
195
+ });
196
+ //# sourceMappingURL=review-result.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-result.test.js","sourceRoot":"","sources":["../src/review-result.test.ts"],"names":[],"mappings":"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"}
package/dist/review.d.ts CHANGED
@@ -1,10 +1,16 @@
1
- import type { ParsedArgs } from "./types.js";
1
+ import type { ParsedArgs, ReviewRunResult } from "./types.js";
2
2
  import { type ChildRunResult } from "./child-process.js";
3
+ export declare function readReviewStdin(): string;
4
+ export declare function childEnv(piBin: string): NodeJS.ProcessEnv;
3
5
  /** Ensures the ASCII meta footer starts on its own line after streamed child stdout. */
4
6
  export declare function metaLinePrefix(childStdout: string, streamMode: boolean): string;
5
- /** True when the final text must be printed after exit instead of having streamed live. */
6
- export declare function progressLogBuffersOutput(streamMode: boolean, hasProgressLog: boolean): boolean;
7
+ /** True when the final text must be printed after exit instead of having streamed live.
8
+ * With --mode json streaming, text deltas are forwarded live in streaming mode;
9
+ * --progress-log no longer forces buffering (it only tees the raw event stream). */
10
+ export declare function progressLogBuffersOutput(streamMode: boolean, _hasProgressLog: boolean): boolean;
7
11
  export declare function childRuntimeError(child: Pick<ChildRunResult, "status" | "signal" | "error">): string | undefined;
8
12
  export declare function runModels(piBin: string, args: string[]): never;
9
- export declare function runReview(parsed: ParsedArgs): Promise<void>;
13
+ export declare function runReviewOnce(parsed: ParsedArgs, stdinText?: string): Promise<ReviewRunResult>;
14
+ /** CLI-compatible single review entrypoint. */
15
+ export declare function runReview(parsed: ParsedArgs): Promise<never>;
10
16
  //# sourceMappingURL=review.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"review.d.ts","sourceRoot":"","sources":["../src/review.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAc,MAAM,YAAY,CAAC;AACzD,OAAO,EAA2C,KAAK,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAmClG,wFAAwF;AACxF,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,GAAG,MAAM,CAG/E;AAED,2FAA2F;AAC3F,wBAAgB,wBAAwB,CAAC,UAAU,EAAE,OAAO,EAAE,cAAc,EAAE,OAAO,GAAG,OAAO,CAE9F;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,IAAI,CAAC,cAAc,EAAE,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC,GAAG,MAAM,GAAG,SAAS,CAKhH;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,KAAK,CAM9D;AAED,wBAAsB,SAAS,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CA6IjE"}
1
+ {"version":3,"file":"review.d.ts","sourceRoot":"","sources":["../src/review.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAc,eAAe,EAAE,MAAM,YAAY,CAAC;AAC1E,OAAO,EAA2C,KAAK,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAYlG,wBAAgB,eAAe,IAAI,MAAM,CAOxC;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC,UAAU,CAczD;AAED,wFAAwF;AACxF,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,GAAG,MAAM,CAG/E;AAED;;oFAEoF;AACpF,wBAAgB,wBAAwB,CAAC,UAAU,EAAE,OAAO,EAAE,eAAe,EAAE,OAAO,GAAG,OAAO,CAE/F;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,IAAI,CAAC,cAAc,EAAE,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC,GAAG,MAAM,GAAG,SAAS,CAKhH;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,KAAK,CAM9D;AAED,wBAAsB,aAAa,CAAC,MAAM,EAAE,UAAU,EAAE,SAAS,SAAoB,GAAG,OAAO,CAAC,eAAe,CAAC,CAkM/G;AAED,+CAA+C;AAC/C,wBAAsB,SAAS,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,CAGlE"}
package/dist/review.js CHANGED
@@ -1,17 +1,19 @@
1
1
  import fs from "node:fs";
2
2
  import os from "node:os";
3
3
  import path from "node:path";
4
+ import { Writable } from "node:stream";
4
5
  import { spawnSync } from "node:child_process";
5
6
  import { spawnBufferedChild, spawnStreamingChild } from "./child-process.js";
6
7
  import { loadPresets, loadSystemPrompt } from "./presets.js";
7
8
  import { splitPayload, buildPrompt } from "./prompt.js";
8
9
  import { parseVerdict } from "./verdict.js";
9
- import { extractFinalText } from "./json-events.js";
10
+ import { parseReviewResult, reviewExitCode } from "./review-result.js";
11
+ import { extractFinalText, extractUsage, JsonEventStream } from "./json-events.js";
10
12
  import { makeRunSessionDir, newestJsonl } from "./session.js";
11
13
  import { fail, hasPathSeparator, expandMaybeHome, normalizeTools } from "./utils.js";
12
14
  import { resolveConfig } from "./config.js";
13
15
  import { formatReviewMetaAscii, formatReviewMetaJsonLine } from "./meta-footer.js";
14
- function readStdin() {
16
+ export function readReviewStdin() {
15
17
  if (process.stdin.isTTY)
16
18
  return "";
17
19
  try {
@@ -21,7 +23,7 @@ function readStdin() {
21
23
  return "";
22
24
  }
23
25
  }
24
- function childEnv(piBin) {
26
+ export function childEnv(piBin) {
25
27
  const pathEntries = [
26
28
  hasPathSeparator(piBin) ? path.dirname(piBin) : undefined,
27
29
  path.join(os.homedir(), ".bun", "bin"),
@@ -41,9 +43,11 @@ export function metaLinePrefix(childStdout, streamMode) {
41
43
  return "";
42
44
  return childStdout.endsWith("\n") ? "" : "\n";
43
45
  }
44
- /** True when the final text must be printed after exit instead of having streamed live. */
45
- export function progressLogBuffersOutput(streamMode, hasProgressLog) {
46
- return !streamMode || hasProgressLog;
46
+ /** True when the final text must be printed after exit instead of having streamed live.
47
+ * With --mode json streaming, text deltas are forwarded live in streaming mode;
48
+ * --progress-log no longer forces buffering (it only tees the raw event stream). */
49
+ export function progressLogBuffersOutput(streamMode, _hasProgressLog) {
50
+ return !streamMode;
47
51
  }
48
52
  export function childRuntimeError(child) {
49
53
  if (child.error)
@@ -61,19 +65,20 @@ export function runModels(piBin, args) {
61
65
  });
62
66
  process.exit(result.status ?? (result.error ? 1 : 0));
63
67
  }
64
- export async function runReview(parsed) {
68
+ export async function runReviewOnce(parsed, stdinText = readReviewStdin()) {
65
69
  const config = resolveConfig();
66
70
  const presets = loadPresets(config.presetsFile);
67
71
  const preset = presets[parsed.mode];
68
72
  if (!preset) {
69
73
  fail(`unknown review mode: ${parsed.mode}\nAvailable modes: ${Object.keys(presets).join(", ")}`);
70
74
  }
71
- const stdinText = readStdin();
72
75
  const payload = splitPayload(parsed.payload);
73
76
  const prompt = buildPrompt(parsed.mode, preset, payload, stdinText);
74
- const args = ["-p"];
75
- if (parsed.progressLog)
76
- args.push("--mode", "json");
77
+ // Always run the child in --mode json so token usage and semantic milestones
78
+ // are available by default (no longer require --progress-log). The stream
79
+ // emitter forwards readable text deltas to the terminal so the human still
80
+ // sees the same live review prose.
81
+ const args = ["-p", "--mode", "json"];
77
82
  const systemPrompt = loadSystemPrompt(config.systemPromptFile);
78
83
  if (systemPrompt)
79
84
  args.push("--append-system-prompt", systemPrompt);
@@ -120,15 +125,47 @@ export async function runReview(parsed) {
120
125
  });
121
126
  }
122
127
  const startedAt = Date.now();
128
+ // In streaming mode the child always emits --mode json. A JsonEventStream
129
+ // forwards readable text deltas to stdout and semantic milestones to stderr
130
+ // while accumulating token usage; the same raw json lines also tee into the
131
+ // progress-log file when --progress-log is set.
132
+ let streamParser;
133
+ let streamUsage;
134
+ const stdoutSink = parsed.stream
135
+ ? new Writable({
136
+ write(chunk, _enc, cb) {
137
+ const text = String(chunk);
138
+ if (progressStream)
139
+ progressStream.write(text);
140
+ if (!streamParser) {
141
+ streamParser = new JsonEventStream({
142
+ onText: (c) => process.stdout.write(c),
143
+ onMilestone: (line) => process.stderr.write(line),
144
+ });
145
+ }
146
+ streamParser.feed(text);
147
+ cb();
148
+ },
149
+ })
150
+ : undefined;
123
151
  const spawnOpts = {
124
152
  cwd: process.cwd(),
125
153
  env: childEnv(config.piBin),
126
- ...(progressStream ? { stdoutSink: progressStream } : {}),
154
+ ...(stdoutSink ? { stdoutSink } : {}),
127
155
  };
128
156
  const child = parsed.stream
129
157
  ? await spawnStreamingChild(config.piBin, args, spawnOpts)
130
158
  : spawnBufferedChild(config.piBin, args, spawnOpts);
131
159
  const durationMs = Date.now() - startedAt;
160
+ if (streamParser) {
161
+ streamParser.flush();
162
+ streamUsage = streamParser.usage().usage;
163
+ }
164
+ if (stdoutSink) {
165
+ // ensure newline separation after streamed text before the ASCII footer
166
+ if (child.stdout && !child.stdout.endsWith("\n"))
167
+ process.stdout.write("\n");
168
+ }
132
169
  if (progressStream) {
133
170
  await new Promise((resolve) => progressStream.end(() => resolve()));
134
171
  if (progressStreamError) {
@@ -139,14 +176,27 @@ export async function runReview(parsed) {
139
176
  const stderr = child.stderr || "";
140
177
  let extractedError;
141
178
  let extractedFatal = false;
142
- if (parsed.progressLog) {
179
+ let extractedUsage;
180
+ if (parsed.stream) {
181
+ // Text was already forwarded live by the stream parser; derive final text
182
+ // and usage from the captured json stream.
183
+ extractedUsage = streamUsage ?? extractUsage(stdout).usage;
184
+ const extracted = extractFinalText(stdout);
185
+ stdout = extracted.text;
186
+ extractedError = extracted.error;
187
+ extractedFatal = Boolean(extracted.fatal);
188
+ }
189
+ else {
190
+ // Buffered mode: parse the captured json stream for text + usage.
191
+ extractedUsage = extractUsage(stdout).usage;
143
192
  const extracted = extractFinalText(stdout);
144
193
  stdout = extracted.text;
145
194
  extractedError = extracted.error;
146
195
  extractedFatal = Boolean(extracted.fatal);
147
196
  }
148
- const bufferedPrint = progressLogBuffersOutput(parsed.stream, Boolean(parsed.progressLog));
149
- if (bufferedPrint && stdout) {
197
+ // Streaming mode already forwarded text deltas live via the stream parser,
198
+ // so we never reprint. Buffered mode prints the extracted final text once.
199
+ if (!parsed.stream && stdout) {
150
200
  process.stdout.write(stdout.endsWith("\n") ? stdout : `${stdout}\n`);
151
201
  }
152
202
  if (!parsed.stream && stderr) {
@@ -177,16 +227,20 @@ export async function runReview(parsed) {
177
227
  parseError: [verdictInfo.parseError, extractedError].filter(Boolean).join("; "),
178
228
  };
179
229
  }
230
+ const structuredResult = parseReviewResult(stdout, verdictInfo);
231
+ const thinking = parsed.thinking || preset.thinking;
180
232
  const meta = {
181
233
  reviewMode: parsed.mode,
182
- verdict: verdictInfo.verdict,
183
- verdictSource: verdictInfo.verdictSource,
234
+ ...structuredResult,
184
235
  durationMs,
185
236
  model: parsed.model || preset.model || null,
237
+ ...(thinking ? { thinking } : {}),
238
+ ...(extractedUsage ? { usage: extractedUsage } : {}),
186
239
  sessionHandle: sessionHandle || undefined,
187
- parseError: verdictInfo.parseError || undefined,
188
240
  };
189
- const metaPrefix = metaLinePrefix(stdout, !bufferedPrint);
241
+ // In streaming mode text was forwarded live; the ASCII footer starts on its
242
+ // own line. In buffered mode the final text was just printed above.
243
+ const metaPrefix = metaLinePrefix(stdout, !parsed.stream);
190
244
  if (metaPrefix)
191
245
  process.stdout.write(metaPrefix);
192
246
  process.stdout.write(`${formatReviewMetaAscii(meta)}\n`);
@@ -198,6 +252,14 @@ export async function runReview(parsed) {
198
252
  else {
199
253
  process.stderr.write(jsonLine);
200
254
  }
201
- process.exit(child.status ?? (child.error || child.signal ? 1 : 0));
255
+ return {
256
+ meta,
257
+ exitCode: reviewExitCode(meta.status),
258
+ };
259
+ }
260
+ /** CLI-compatible single review entrypoint. */
261
+ export async function runReview(parsed) {
262
+ const result = await runReviewOnce(parsed);
263
+ process.exit(result.exitCode);
202
264
  }
203
265
  //# sourceMappingURL=review.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"review.js","sourceRoot":"","sources":["../src/review.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"review.js","sourceRoot":"","sources":["../src/review.ts"],"names":[],"mappings":"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"}
@@ -12,8 +12,8 @@ test("metaLinePrefix is empty in buffered mode", () => {
12
12
  test("childRuntimeError treats spawn errors as runtime errors", () => {
13
13
  assert.equal(childRuntimeError({ status: null, signal: null, error: new Error("spawn ENOENT") }), "spawn ENOENT");
14
14
  });
15
- test("progressLogBuffersOutput buffers whenever streaming is off or a progress log is set", () => {
16
- assert.equal(progressLogBuffersOutput(true, true), true);
15
+ test("progressLogBuffersOutput buffers only in non-streaming mode", () => {
16
+ assert.equal(progressLogBuffersOutput(true, true), false);
17
17
  assert.equal(progressLogBuffersOutput(true, false), false);
18
18
  assert.equal(progressLogBuffersOutput(false, false), true);
19
19
  assert.equal(progressLogBuffersOutput(false, true), true);
@@ -1 +1 @@
1
- {"version":3,"file":"review.meta.test.js","sourceRoot":"","sources":["../src/review.meta.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAE1F,IAAI,CAAC,yEAAyE,EAAE,GAAG,EAAE;IACnF,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;IAClD,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;IAClD,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;AAC7C,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,0CAA0C,EAAE,GAAG,EAAE;IACpD,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;AACnD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,yDAAyD,EAAE,GAAG,EAAE;IACnE,MAAM,CAAC,KAAK,CACV,iBAAiB,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,KAAK,CAAC,cAAc,CAAC,EAAE,CAAC,EACnF,cAAc,CACf,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,qFAAqF,EAAE,GAAG,EAAE;IAC/F,MAAM,CAAC,KAAK,CAAC,wBAAwB,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;IACzD,MAAM,CAAC,KAAK,CAAC,wBAAwB,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC;IAC3D,MAAM,CAAC,KAAK,CAAC,wBAAwB,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC;IAC3D,MAAM,CAAC,KAAK,CAAC,wBAAwB,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;AAC5D,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"review.meta.test.js","sourceRoot":"","sources":["../src/review.meta.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAE1F,IAAI,CAAC,yEAAyE,EAAE,GAAG,EAAE;IACnF,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;IAClD,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;IAClD,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;AAC7C,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,0CAA0C,EAAE,GAAG,EAAE;IACpD,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;AACnD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,yDAAyD,EAAE,GAAG,EAAE;IACnE,MAAM,CAAC,KAAK,CACV,iBAAiB,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,KAAK,CAAC,cAAc,CAAC,EAAE,CAAC,EACnF,cAAc,CACf,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,6DAA6D,EAAE,GAAG,EAAE;IACvE,MAAM,CAAC,KAAK,CAAC,wBAAwB,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC;IAC1D,MAAM,CAAC,KAAK,CAAC,wBAAwB,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC;IAC3D,MAAM,CAAC,KAAK,CAAC,wBAAwB,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC;IAC3D,MAAM,CAAC,KAAK,CAAC,wBAAwB,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;AAC5D,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=skill-protocol.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-protocol.test.d.ts","sourceRoot":"","sources":["../src/skill-protocol.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,35 @@
1
+ import assert from "node:assert/strict";
2
+ import fs from "node:fs";
3
+ import { fileURLToPath } from "node:url";
4
+ import { test } from "node:test";
5
+ const skillPath = fileURLToPath(new URL("../skills/pi-review/SKILL.md", import.meta.url));
6
+ test("shipped skill defines bounded host-owned loop closeout", () => {
7
+ const skill = fs.readFileSync(skillPath, "utf8");
8
+ for (const required of [
9
+ "Freeze the scope baseline",
10
+ "in-scope blocker",
11
+ "follow-up",
12
+ "stop-and-escalate",
13
+ "two non-converging",
14
+ "Never ask the child review session to implement fixes",
15
+ "explicit human acceptance",
16
+ ]) {
17
+ assert.match(skill, new RegExp(required, "i"));
18
+ }
19
+ });
20
+ test("shipped skill documents Panel Review, consensus, and advisories", () => {
21
+ const skill = fs.readFileSync(skillPath, "utf8");
22
+ for (const required of [
23
+ "Panel review",
24
+ "confirmed finding",
25
+ "advisory",
26
+ "quorum",
27
+ "majority",
28
+ "unanimous",
29
+ "host-only fixes",
30
+ "cost multipl",
31
+ ]) {
32
+ assert.match(skill, new RegExp(required, "i"), `skill missing: ${required}`);
33
+ }
34
+ });
35
+ //# sourceMappingURL=skill-protocol.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-protocol.test.js","sourceRoot":"","sources":["../src/skill-protocol.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,SAAS,GAAG,aAAa,CAAC,IAAI,GAAG,CAAC,8BAA8B,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAE1F,IAAI,CAAC,wDAAwD,EAAE,GAAG,EAAE;IAClE,MAAM,KAAK,GAAG,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAEjD,KAAK,MAAM,QAAQ,IAAI;QACrB,2BAA2B;QAC3B,kBAAkB;QAClB,WAAW;QACX,mBAAmB;QACnB,oBAAoB;QACpB,uDAAuD;QACvD,2BAA2B;KAC5B,EAAE,CAAC;QACF,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,MAAM,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC;IACjD,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,iEAAiE,EAAE,GAAG,EAAE;IAC3E,MAAM,KAAK,GAAG,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAEjD,KAAK,MAAM,QAAQ,IAAI;QACrB,cAAc;QACd,mBAAmB;QACnB,UAAU;QACV,QAAQ;QACR,UAAU;QACV,WAAW;QACX,iBAAiB;QACjB,cAAc;KACf,EAAE,CAAC;QACF,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,MAAM,CAAC,QAAQ,EAAE,GAAG,CAAC,EAAE,kBAAkB,QAAQ,EAAE,CAAC,CAAC;IAC/E,CAAC;AACH,CAAC,CAAC,CAAC"}