rhachet-roles-bhrain 0.2.0 → 0.3.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 (130) hide show
  1. package/dist/.test/getContextOpenAI.js +1 -1
  2. package/dist/.test/getContextOpenAI.js.map +1 -1
  3. package/dist/domain.operations/review/compileReviewPrompt.d.ts +22 -0
  4. package/dist/domain.operations/review/compileReviewPrompt.js +95 -0
  5. package/dist/domain.operations/review/compileReviewPrompt.js.map +1 -0
  6. package/dist/domain.operations/review/enumFilesFromDiffs.d.ts +8 -0
  7. package/dist/domain.operations/review/enumFilesFromDiffs.js +74 -0
  8. package/dist/domain.operations/review/enumFilesFromDiffs.js.map +1 -0
  9. package/dist/domain.operations/review/enumFilesFromGlob.d.ts +8 -0
  10. package/dist/domain.operations/review/enumFilesFromGlob.js +31 -0
  11. package/dist/domain.operations/review/enumFilesFromGlob.js.map +1 -0
  12. package/dist/domain.operations/review/estimateTokenCount.d.ts +9 -0
  13. package/dist/domain.operations/review/estimateTokenCount.js +20 -0
  14. package/dist/domain.operations/review/estimateTokenCount.js.map +1 -0
  15. package/dist/domain.operations/review/formatReviewOutput.d.ts +14 -0
  16. package/dist/domain.operations/review/formatReviewOutput.js +42 -0
  17. package/dist/domain.operations/review/formatReviewOutput.js.map +1 -0
  18. package/dist/domain.operations/review/genTokenBreakdownMarkdown.d.ts +19 -0
  19. package/dist/domain.operations/review/genTokenBreakdownMarkdown.js +110 -0
  20. package/dist/domain.operations/review/genTokenBreakdownMarkdown.js.map +1 -0
  21. package/dist/domain.operations/review/genTokenBreakdownReport.d.ts +24 -0
  22. package/dist/domain.operations/review/genTokenBreakdownReport.js +64 -0
  23. package/dist/domain.operations/review/genTokenBreakdownReport.js.map +1 -0
  24. package/dist/domain.operations/review/invokeClaudeCode.d.ts +22 -0
  25. package/dist/domain.operations/review/invokeClaudeCode.js +92 -0
  26. package/dist/domain.operations/review/invokeClaudeCode.js.map +1 -0
  27. package/dist/domain.operations/review/writeInputArtifacts.d.ts +27 -0
  28. package/dist/domain.operations/review/writeInputArtifacts.js +50 -0
  29. package/dist/domain.operations/review/writeInputArtifacts.js.map +1 -0
  30. package/dist/domain.operations/review/writeOutputArtifacts.d.ts +12 -0
  31. package/dist/domain.operations/review/writeOutputArtifacts.js +46 -0
  32. package/dist/domain.operations/review/writeOutputArtifacts.js.map +1 -0
  33. package/dist/roles/getRoleRegistry.js +2 -1
  34. package/dist/roles/getRoleRegistry.js.map +1 -1
  35. package/dist/roles/getRoleRegistry.readme.js +6 -0
  36. package/dist/roles/getRoleRegistry.readme.js.map +1 -1
  37. package/dist/roles/reviewer/briefs/review.tactics.md +60 -0
  38. package/dist/roles/reviewer/getReviewerRole.d.ts +6 -0
  39. package/dist/roles/reviewer/getReviewerRole.js +80 -0
  40. package/dist/roles/reviewer/getReviewerRole.js.map +1 -0
  41. package/dist/roles/reviewer/skills/review/review.d.ts +57 -0
  42. package/dist/roles/reviewer/skills/review/review.js +445 -0
  43. package/dist/roles/reviewer/skills/review/review.js.map +1 -0
  44. package/dist/roles/reviewer/skills/review/review.sh +21 -0
  45. package/dist/roles/reviewer/skills/review/review.ts +575 -0
  46. package/dist/roles/thinker/getThinkerRole.js +1 -1
  47. package/dist/roles/thinker/getThinkerRole.js.map +1 -1
  48. package/dist/roles/thinker/skills/brief.articulate/.demo/article.vision.v2025_08_19..i1.via_chatgpt.md +47 -0
  49. package/dist/roles/thinker/skills/brief.articulate/.demo/article.vision.v2025_08_19.i2.via_rhachet.md +60 -0
  50. package/dist/roles/thinker/skills/brief.articulate/.demo/diverge.v2025_08_17.i1.md +62 -0
  51. package/dist/roles/thinker/skills/brief.articulate/.demo/diverge.v2025_08_17.i1.with_feedback.md +89 -0
  52. package/dist/roles/thinker/skills/brief.articulate/.demo/diverge.v2025_08_17.i2.md +47 -0
  53. package/dist/roles/thinker/skills/brief.articulate/.demo/joke.v2025_08_15.i1.md +44 -0
  54. package/dist/roles/thinker/skills/brief.articulate/.demo/joke.v2025_08_15.i2.md +63 -0
  55. package/dist/roles/thinker/skills/brief.articulate/.demo/joke.v2025_08_15.i3.md +51 -0
  56. package/dist/roles/thinker/skills/brief.articulate/.demo/user-journey.v2025_08_17.i1.md +62 -0
  57. package/dist/roles/thinker/skills/brief.articulate/.demo/user-journey.v2025_08_17.i2.md +49 -0
  58. package/dist/roles/thinker/skills/brief.articulate/.readme.md +0 -0
  59. package/dist/roles/thinker/skills/brief.articulate/stepArticulate.skill.js +1 -1
  60. package/dist/roles/thinker/skills/brief.articulate/stepArticulate.skill.js.map +1 -1
  61. package/dist/roles/thinker/skills/brief.articulate/stepArticulate.skill.ts +168 -0
  62. package/dist/roles/thinker/skills/brief.articulate/stepArticulate.ts +157 -0
  63. package/dist/roles/thinker/skills/brief.catalogize/.demo/joke.types.v2025_08_28.i1.md +93 -0
  64. package/dist/roles/thinker/skills/brief.catalogize/.demo/joke.types.v2025_08_28.i2.md +84 -0
  65. package/dist/roles/thinker/skills/brief.catalogize/.demo/joke.types.v2025_09_28.i1.no_focus_context.md +8 -0
  66. package/dist/roles/thinker/skills/brief.catalogize/.demo/joke.types.v2025_09_28.i2.md +54 -0
  67. package/dist/roles/thinker/skills/brief.catalogize/.demo/persona.usecases.v2025_08_28.i1.md +62 -0
  68. package/dist/roles/thinker/skills/brief.catalogize/.demo/persona.usecases.v2025_08_28.i2.md +64 -0
  69. package/dist/roles/thinker/skills/brief.catalogize/.readme.md +5 -0
  70. package/dist/roles/thinker/skills/brief.catalogize/stepCatalogize.skill.js +1 -1
  71. package/dist/roles/thinker/skills/brief.catalogize/stepCatalogize.skill.js.map +1 -1
  72. package/dist/roles/thinker/skills/brief.catalogize/stepCatalogize.skill.ts +173 -0
  73. package/dist/roles/thinker/skills/brief.catalogize/stepCatalogize.ts +132 -0
  74. package/dist/roles/thinker/skills/brief.demonstrate/.demo/user.journey.roadtrip.input.example.i4.md +3 -0
  75. package/dist/roles/thinker/skills/brief.demonstrate/.demo/user.journey.roadtrip.input.example.i5.md +3 -0
  76. package/dist/roles/thinker/skills/brief.demonstrate/.demo/user.journey.roadtrip.input.example.i6.md +3 -0
  77. package/dist/roles/thinker/skills/brief.demonstrate/.demo/user.journey.roadtrip.input.example.md +3 -0
  78. package/dist/roles/thinker/skills/brief.demonstrate/.demo/user.journey.roadtrip.v2025_08_27.i1.md +52 -0
  79. package/dist/roles/thinker/skills/brief.demonstrate/.demo/user.journey.roadtrip.v2025_08_27.i2.md +51 -0
  80. package/dist/roles/thinker/skills/brief.demonstrate/.demo/user.journey.roadtrip.v2025_08_27.i3.md +47 -0
  81. package/dist/roles/thinker/skills/brief.demonstrate/.demo/user.journey.roadtrip.v2025_08_27.i4.md +62 -0
  82. package/dist/roles/thinker/skills/brief.demonstrate/.demo/user.journey.roadtrip.v2025_08_27.i5.md +47 -0
  83. package/dist/roles/thinker/skills/brief.demonstrate/.demo/user.journey.roadtrip.v2025_08_27.i6.md +53 -0
  84. package/dist/roles/thinker/skills/brief.demonstrate/.readme +3 -0
  85. package/dist/roles/thinker/skills/brief.demonstrate/stepDemonstrate.skill.js +1 -1
  86. package/dist/roles/thinker/skills/brief.demonstrate/stepDemonstrate.skill.js.map +1 -1
  87. package/dist/roles/thinker/skills/brief.demonstrate/stepDemonstrate.skill.ts +190 -0
  88. package/dist/roles/thinker/skills/brief.demonstrate/stepDemonstrate.ts +164 -0
  89. package/dist/roles/thinker/skills/khue.cluster/.demo/user.journeys.input1.cluster.v2025_08_17.i1.md +72 -0
  90. package/dist/roles/thinker/skills/khue.cluster/.demo/user.journeys.input1.cluster.v2025_08_17.i2.md +53 -0
  91. package/dist/roles/thinker/skills/khue.cluster/.demo/user.journeys.input1.cluster.v2025_08_17.i3.which_objectives.md +58 -0
  92. package/dist/roles/thinker/skills/khue.cluster/.demo/user.journeys.input1.cluster.v2025_08_17.i5.which_personas.md +64 -0
  93. package/dist/roles/thinker/skills/khue.cluster/.demo/user.journeys.input2.cluster.v2025_08_17.i1.md +67 -0
  94. package/dist/roles/thinker/skills/khue.cluster/.demo/user.journeys.input2.cluster.v2025_08_17.i2.md +49 -0
  95. package/dist/roles/thinker/skills/khue.cluster/.demo/user.journeys.input2.cluster.v2025_08_17.i3.md +59 -0
  96. package/dist/roles/thinker/skills/khue.cluster/.readme.md +0 -0
  97. package/dist/roles/thinker/skills/khue.cluster/stepCluster.skill.js +1 -1
  98. package/dist/roles/thinker/skills/khue.cluster/stepCluster.skill.js.map +1 -1
  99. package/dist/roles/thinker/skills/khue.cluster/stepCluster.skill.ts +174 -0
  100. package/dist/roles/thinker/skills/khue.cluster/stepCluster.ts +150 -0
  101. package/dist/roles/thinker/skills/khue.decompose/.readme.md +9 -0
  102. package/dist/roles/thinker/skills/khue.diverge/.demo/joke.examples.v2025_08_17.i2.md +23 -0
  103. package/dist/roles/thinker/skills/khue.diverge/.demo/joke.examples.v2025_08_17.i3.md +23 -0
  104. package/dist/roles/thinker/skills/khue.diverge/.demo/joke.varieties.v2025_08_17.i1.md +23 -0
  105. package/dist/roles/thinker/skills/khue.diverge/.demo/userjourney.examples.v2025_08_17.i1.md +9 -0
  106. package/dist/roles/thinker/skills/khue.diverge/.demo/userjourney.examples.v2025_08_17.i2.md +9 -0
  107. package/dist/roles/thinker/skills/khue.diverge/.demo/userjourney.examples.v2025_08_17.i3.md +23 -0
  108. package/dist/roles/thinker/skills/khue.diverge/.demo/userjourney.examples.v2025_08_17.i4.folksy.md +9 -0
  109. package/dist/roles/thinker/skills/khue.diverge/.demo/userjourney.examples.v2025_08_17.i5.folksy.md +23 -0
  110. package/dist/roles/thinker/skills/khue.diverge/.readme.md +0 -0
  111. package/dist/roles/thinker/skills/khue.diverge/stepDiverge.skill.js +1 -1
  112. package/dist/roles/thinker/skills/khue.diverge/stepDiverge.skill.js.map +1 -1
  113. package/dist/roles/thinker/skills/khue.diverge/stepDiverge.skill.ts +149 -0
  114. package/dist/roles/thinker/skills/khue.diverge/stepDiverge.ts +151 -0
  115. package/dist/roles/thinker/skills/khue.encompose/.readme.md +7 -0
  116. package/dist/roles/thinker/skills/khue.instantiate/.readme.md +14 -0
  117. package/dist/roles/thinker/skills/khue.instantiate/stepInstantiate.skill.js +1 -1
  118. package/dist/roles/thinker/skills/khue.instantiate/stepInstantiate.skill.js.map +1 -1
  119. package/dist/roles/thinker/skills/khue.instantiate/stepInstantiate.skill.ts +190 -0
  120. package/dist/roles/thinker/skills/khue.instantiate/stepInstantiate.ts +132 -0
  121. package/dist/roles/thinker/skills/khue.triage/.demo/laughs.v2025_08_18.i1.md +29 -0
  122. package/dist/roles/thinker/skills/khue.triage/.demo/user.journeys.v2025_08_17.i1.md +86 -0
  123. package/dist/roles/thinker/skills/khue.triage/.demo/user.journeys.v2025_08_17.i2.md +68 -0
  124. package/dist/roles/thinker/skills/khue.triage/.readme.md +0 -0
  125. package/dist/roles/thinker/skills/khue.triage/stepTriage.skill.js +1 -1
  126. package/dist/roles/thinker/skills/khue.triage/stepTriage.skill.js.map +1 -1
  127. package/dist/roles/thinker/skills/khue.triage/stepTriage.skill.ts +174 -0
  128. package/dist/roles/thinker/skills/khue.triage/stepTriage.ts +153 -0
  129. package/package.json +7 -6
  130. package/readme.md +55 -0
@@ -0,0 +1,92 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.invokeClaudeCode = void 0;
4
+ const child_process_1 = require("child_process");
5
+ const helpful_errors_1 = require("helpful-errors");
6
+ /**
7
+ * .what = invokes claude-code cli with the prompt
8
+ * .why = executes the review via the specified brain (claude-code)
9
+ */
10
+ const invokeClaudeCode = async (input) => {
11
+ // invoke claude-code cli via stdin to avoid E2BIG on large prompts
12
+ const output = await new Promise((resolve, reject) => {
13
+ const child = (0, child_process_1.spawn)('claude', ['-p', '-', '--output-format', 'json'], {
14
+ cwd: input.cwd,
15
+ });
16
+ let stdout = '';
17
+ let stderr = '';
18
+ child.stdout.on('data', (data) => {
19
+ stdout += data.toString();
20
+ });
21
+ child.stderr.on('data', (data) => {
22
+ stderr += data.toString();
23
+ });
24
+ child.on('error', reject);
25
+ child.on('close', (code) => {
26
+ if (code !== 0) {
27
+ // check for prompt too long error
28
+ if (stdout.includes('Prompt is too long')) {
29
+ reject(new helpful_errors_1.BadRequestError('prompt is too long for claude context window; reduce --rules or --paths scope', {
30
+ status: code,
31
+ hint: 'try narrowing your glob patterns or excluding large files',
32
+ }));
33
+ return;
34
+ }
35
+ reject(new helpful_errors_1.UnexpectedCodePathError('claude-code exited with non-zero', {
36
+ status: code,
37
+ stdout: stdout.slice(0, 2000),
38
+ stderr: stderr.slice(0, 2000),
39
+ }));
40
+ return;
41
+ }
42
+ resolve(stdout);
43
+ });
44
+ // write prompt to stdin and close
45
+ child.stdin.write(input.prompt);
46
+ child.stdin.end();
47
+ });
48
+ // parse the json response
49
+ const response = (() => {
50
+ try {
51
+ return JSON.parse(output);
52
+ }
53
+ catch {
54
+ throw new helpful_errors_1.UnexpectedCodePathError('failed to parse claude-code response', {
55
+ output,
56
+ });
57
+ }
58
+ })();
59
+ // extract review content from response
60
+ const review = (() => {
61
+ // claude-code json output has a 'result' field with the text content
62
+ if (response.result && typeof response.result === 'string') {
63
+ return response.result;
64
+ }
65
+ // fallback: look for text in message content
66
+ if (response.content && Array.isArray(response.content)) {
67
+ const textContent = response.content.find((c) => c.type === 'text');
68
+ if (textContent?.text) {
69
+ return textContent.text;
70
+ }
71
+ }
72
+ throw new helpful_errors_1.UnexpectedCodePathError('failed to extract review from response', {
73
+ response,
74
+ });
75
+ })();
76
+ // extract usage from response
77
+ const usage = (() => {
78
+ if (!response.usage)
79
+ throw new helpful_errors_1.UnexpectedCodePathError('response.usage not found', {
80
+ response,
81
+ });
82
+ return {
83
+ inputTokens: response.usage.input_tokens ?? 0,
84
+ inputTokensCacheCreation: response.usage.cache_creation_input_tokens ?? 0,
85
+ inputTokensCacheRead: response.usage.cache_read_input_tokens ?? 0,
86
+ outputTokens: response.usage.output_tokens ?? 0,
87
+ };
88
+ })();
89
+ return { response, review, usage };
90
+ };
91
+ exports.invokeClaudeCode = invokeClaudeCode;
92
+ //# sourceMappingURL=invokeClaudeCode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invokeClaudeCode.js","sourceRoot":"","sources":["../../../src/domain.operations/review/invokeClaudeCode.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * .what = writes input artifacts to log directory for auditability
3
+ * .why = enables debugging, replay, and audit of review invocations
4
+ */
5
+ export declare const writeInputArtifacts: (input: {
6
+ logDir: string;
7
+ args: {
8
+ rules: string | string[];
9
+ diffs?: string;
10
+ paths?: string | string[];
11
+ output: string;
12
+ mode: 'soft' | 'hard';
13
+ };
14
+ scope: {
15
+ ruleFiles: string[];
16
+ targetFiles: string[];
17
+ };
18
+ metrics: {
19
+ tokenEstimate: number;
20
+ contextWindowPercent: number;
21
+ costEstimate: number;
22
+ };
23
+ prompt: string;
24
+ }) => Promise<{
25
+ argsPath: string;
26
+ promptPath: string;
27
+ }>;
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.writeInputArtifacts = void 0;
27
+ const fs = __importStar(require("fs/promises"));
28
+ const path = __importStar(require("path"));
29
+ /**
30
+ * .what = writes input artifacts to log directory for auditability
31
+ * .why = enables debugging, replay, and audit of review invocations
32
+ */
33
+ const writeInputArtifacts = async (input) => {
34
+ // ensure log directory exists
35
+ await fs.mkdir(input.logDir, { recursive: true });
36
+ // write input.args.json
37
+ const argsPath = path.join(input.logDir, 'input.args.json');
38
+ const argsContent = JSON.stringify({
39
+ args: input.args,
40
+ scope: input.scope,
41
+ metrics: input.metrics,
42
+ }, null, 2);
43
+ await fs.writeFile(argsPath, argsContent, 'utf-8');
44
+ // write input.prompt.md
45
+ const promptPath = path.join(input.logDir, 'input.prompt.md');
46
+ await fs.writeFile(promptPath, input.prompt, 'utf-8');
47
+ return { argsPath, promptPath };
48
+ };
49
+ exports.writeInputArtifacts = writeInputArtifacts;
50
+ //# sourceMappingURL=writeInputArtifacts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"writeInputArtifacts.js","sourceRoot":"","sources":["../../../src/domain.operations/review/writeInputArtifacts.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,gDAAkC;AAClC,2CAA6B;AAE7B;;;GAGG;AACI,MAAM,mBAAmB,GAAG,KAAK,EAAE,KAmBzC,EAAqD,EAAE;IACtD,8BAA8B;IAC9B,MAAM,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAElD,wBAAwB;IACxB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IAC5D,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAChC;QACE,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,OAAO,EAAE,KAAK,CAAC,OAAO;KACvB,EACD,IAAI,EACJ,CAAC,CACF,CAAC;IACF,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;IAEnD,wBAAwB;IACxB,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IAC9D,MAAM,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAEtD,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;AAClC,CAAC,CAAC;AAzCW,QAAA,mBAAmB,uBAyC9B"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * .what = writes output artifacts to log directory for auditability
3
+ * .why = enables debugging, replay, and audit of review results
4
+ */
5
+ export declare const writeOutputArtifacts: (input: {
6
+ logDir: string;
7
+ response: object;
8
+ review: string;
9
+ }) => Promise<{
10
+ responsePath: string;
11
+ reviewPath: string;
12
+ }>;
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.writeOutputArtifacts = void 0;
27
+ const fs = __importStar(require("fs/promises"));
28
+ const path = __importStar(require("path"));
29
+ /**
30
+ * .what = writes output artifacts to log directory for auditability
31
+ * .why = enables debugging, replay, and audit of review results
32
+ */
33
+ const writeOutputArtifacts = async (input) => {
34
+ // ensure log directory exists (should already exist from writeInputArtifacts)
35
+ await fs.mkdir(input.logDir, { recursive: true });
36
+ // write output.response.json
37
+ const responsePath = path.join(input.logDir, 'output.response.json');
38
+ const responseContent = JSON.stringify(input.response, null, 2);
39
+ await fs.writeFile(responsePath, responseContent, 'utf-8');
40
+ // write output.review.md
41
+ const reviewPath = path.join(input.logDir, 'output.review.md');
42
+ await fs.writeFile(reviewPath, input.review, 'utf-8');
43
+ return { responsePath, reviewPath };
44
+ };
45
+ exports.writeOutputArtifacts = writeOutputArtifacts;
46
+ //# sourceMappingURL=writeOutputArtifacts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"writeOutputArtifacts.js","sourceRoot":"","sources":["../../../src/domain.operations/review/writeOutputArtifacts.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,gDAAkC;AAClC,2CAA6B;AAE7B;;;GAGG;AACI,MAAM,oBAAoB,GAAG,KAAK,EAAE,KAI1C,EAAyD,EAAE;IAC1D,8EAA8E;IAC9E,MAAM,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAElD,6BAA6B;IAC7B,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC;IACrE,MAAM,eAAe,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAChE,MAAM,EAAE,CAAC,SAAS,CAAC,YAAY,EAAE,eAAe,EAAE,OAAO,CAAC,CAAC;IAE3D,yBAAyB;IACzB,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IAC/D,MAAM,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAEtD,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,CAAC;AACtC,CAAC,CAAC;AAlBW,QAAA,oBAAoB,wBAkB/B"}
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getRoleRegistry = void 0;
4
4
  const rhachet_1 = require("rhachet");
5
5
  const getRoleRegistry_readme_1 = require("./getRoleRegistry.readme");
6
+ const getReviewerRole_1 = require("./reviewer/getReviewerRole");
6
7
  const getThinkerRole_1 = require("./thinker/getThinkerRole");
7
8
  /**
8
9
  * .what = returns the core registry of predefined roles and skills
@@ -13,7 +14,7 @@ const getThinkerRole_1 = require("./thinker/getThinkerRole");
13
14
  const getRoleRegistry = () => new rhachet_1.RoleRegistry({
14
15
  slug: 'bhrain',
15
16
  readme: getRoleRegistry_readme_1.BHRAIN_REGISTRY_README,
16
- roles: [getThinkerRole_1.ROLE_THINKER],
17
+ roles: [getThinkerRole_1.ROLE_THINKER, getReviewerRole_1.ROLE_REVIEWER],
17
18
  });
18
19
  exports.getRoleRegistry = getRoleRegistry;
19
20
  //# sourceMappingURL=getRoleRegistry.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"getRoleRegistry.js","sourceRoot":"","sources":["../../src/roles/getRoleRegistry.ts"],"names":[],"mappings":";;;AAAA,qCAAuC;AAEvC,qEAAkE;AAClE,6DAAwD;AAExD;;;;;GAKG;AACI,MAAM,eAAe,GAAG,GAAiB,EAAE,CAChD,IAAI,sBAAY,CAAC;IACf,IAAI,EAAE,QAAQ;IACd,MAAM,EAAE,+CAAsB;IAC9B,KAAK,EAAE,CAAC,6BAAY,CAAC;CACtB,CAAC,CAAC;AALQ,QAAA,eAAe,mBAKvB"}
1
+ {"version":3,"file":"getRoleRegistry.js","sourceRoot":"","sources":["../../src/roles/getRoleRegistry.ts"],"names":[],"mappings":";;;AAAA,qCAAuC;AAEvC,qEAAkE;AAClE,gEAA2D;AAC3D,6DAAwD;AAExD;;;;;GAKG;AACI,MAAM,eAAe,GAAG,GAAiB,EAAE,CAChD,IAAI,sBAAY,CAAC;IACf,IAAI,EAAE,QAAQ;IACd,MAAM,EAAE,+CAAsB;IAC9B,KAAK,EAAE,CAAC,6BAAY,EAAE,+BAAa,CAAC;CACrC,CAAC,CAAC;AALQ,QAAA,eAAe,mBAKvB"}
@@ -18,5 +18,11 @@ Used to navigate through concept space. See src/roles/thinker/briefs/cognition f
18
18
  ## 📚 Librarian
19
19
 
20
20
  Used to curate knowledge and context. see src/roles/thinker/briefs/librarian.context and src/roles/thinker/briefs/librarian.tactics for details.
21
+
22
+ ---
23
+
24
+ ## 🔍 Reviewer
25
+
26
+ Used to review artifacts against declared rules. Designed to be composed into review skills for other roles.
21
27
  `.trim();
22
28
  //# sourceMappingURL=getRoleRegistry.readme.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"getRoleRegistry.readme.js","sourceRoot":"","sources":["../../src/roles/getRoleRegistry.readme.ts"],"names":[],"mappings":";;;AAAA,mDAAmD;AACtC,QAAA,sBAAsB,GAAG;;;;;;;;;;;;;;;;GAgBnC,CAAC,IAAI,EAAE,CAAC"}
1
+ {"version":3,"file":"getRoleRegistry.readme.js","sourceRoot":"","sources":["../../src/roles/getRoleRegistry.readme.ts"],"names":[],"mappings":";;;AAAA,mDAAmD;AACtC,QAAA,sBAAsB,GAAG;;;;;;;;;;;;;;;;;;;;;;GAsBnC,CAAC,IAAI,EAAE,CAAC"}
@@ -0,0 +1,60 @@
1
+ # review tactics
2
+
3
+ ## purpose
4
+
5
+ the reviewer role performs automated code review against declared rules, using claude-code as the underlying brain.
6
+
7
+ ## modes
8
+
9
+ ### soft mode
10
+
11
+ - includes only file paths in the prompt
12
+ - instructs brain to read files directly
13
+ - lower token usage
14
+ - best for: large codebases, exploratory reviews
15
+
16
+ ### hard mode
17
+
18
+ - includes full file contents in the prompt
19
+ - no additional file reads required
20
+ - higher token usage, faster execution
21
+ - best for: focused reviews, smaller scopes
22
+
23
+ ## mode selection criteria
24
+
25
+ use `--soft` when:
26
+ - scope is large (>50 files)
27
+ - context window would exceed 60%
28
+ - reviewing for general patterns
29
+
30
+ use `--hard` when:
31
+ - scope is small (<20 files)
32
+ - precision is critical
33
+ - reviewing specific changes
34
+
35
+ ## context window thresholds
36
+
37
+ - **60% warning**: emits warning but continues
38
+ - **75% failfast**: throws error with recommendation to reduce scope or use soft mode
39
+
40
+ ## scope combination
41
+
42
+ targets are the union of `--diffs` and `--paths`:
43
+ - `--diffs uptil-main`: files changed since main branch
44
+ - `--diffs uptil-staged`: only staged files
45
+ - `--paths`: explicit glob patterns
46
+
47
+ ## artifacts
48
+
49
+ all invocations log to `.log/bhrain/review/$timestamp/`:
50
+ - `input.args.json`: original arguments and computed metrics
51
+ - `input.prompt.md`: exact prompt sent to brain
52
+ - `output.response.json`: raw brain response
53
+ - `output.review.md`: formatted review output
54
+
55
+ ## output format
56
+
57
+ reviews follow the feedback template format:
58
+ - blockers appear first (severity: blocker)
59
+ - nitpicks appear second (severity: nitpick)
60
+ - each finding includes file path and line number when available
@@ -0,0 +1,6 @@
1
+ import { Role } from 'rhachet';
2
+ /**
3
+ * .what = reviewer role definition
4
+ * .why = enables code review against declared rules via brain invocation
5
+ */
6
+ export declare const ROLE_REVIEWER: Role;
@@ -0,0 +1,80 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ROLE_REVIEWER = void 0;
4
+ const rhachet_1 = require("rhachet");
5
+ /**
6
+ * .what = reviewer role definition
7
+ * .why = enables code review against declared rules via brain invocation
8
+ */
9
+ exports.ROLE_REVIEWER = rhachet_1.Role.build({
10
+ slug: 'reviewer',
11
+ name: 'Reviewer',
12
+ purpose: 'review artifacts against declared rules',
13
+ readme: `
14
+ ## 🔍 Reviewer
15
+
16
+ - **scale**: repo-level, artifact quality
17
+ - **focus**: rule compliance, best practices enforcement
18
+ - **maximizes**: artifact quality and consistency
19
+
20
+ used to review artifacts against declared rules and best practices.
21
+ invokes claude-code brain to perform intelligent review.
22
+ designed to be composed into review skills for other roles.
23
+
24
+ ### usage
25
+
26
+ \`\`\`sh
27
+ npx rhachet run --repo bhrain --skill review --mode hard --diffs uptil-main --paths '!pnpm-lock.yaml'
28
+ \`\`\`
29
+
30
+ produces
31
+
32
+ \`\`\`
33
+ 🌊 skill "review" from repo=bhrain role=reviewer
34
+
35
+ 🔭 metrics.expected
36
+ ├─ files
37
+ │ ├─ rules: 60
38
+ │ └─ targets: 69
39
+ ├─ tokens
40
+ │ ├─ estimate: 73122
41
+ │ └─ context: 36.6%
42
+ └─ cost
43
+ └─ estimate: $0.3290
44
+
45
+ 🪵 logs
46
+ ├─ scope: .log/bhrain/review/2025-12-23T00-39-00-673Z/input.scope.json
47
+ ├─ metrics: .log/bhrain/review/2025-12-23T00-39-00-673Z/metrics.expected.json
48
+ └─ tokens: .log/bhrain/review/2025-12-23T00-39-00-673Z/tokens.expected.md
49
+
50
+ 🐢 let's review!
51
+ └─ elapsed: 85s ✓
52
+
53
+ ✨ metrics.realized
54
+ ├─ tokens
55
+ │ ├─ input: 2
56
+ │ ├─ cache.write: 144578
57
+ │ ├─ cache.read: 14316
58
+ │ └─ output: 1090
59
+ └─ cost
60
+ ├─ input: $0.0000
61
+ ├─ cache.write: $0.5422
62
+ ├─ cache.read: $0.0043
63
+ ├─ output: $0.0164
64
+ └─ total: $0.5629
65
+
66
+ 🌊 output
67
+ ├─ logs: .log/bhrain/review/2025-12-23T00-39-00-673Z
68
+ └─ review: .review/bhrain/v2025-12-23T00-39-00-645Z/[feedback].[given].by_robot.md
69
+ \`\`\`
70
+ `.trim(),
71
+ traits: [],
72
+ skills: {
73
+ dirs: [{ uri: __dirname + '/skills' }],
74
+ refs: [],
75
+ },
76
+ briefs: {
77
+ dirs: [{ uri: __dirname + '/briefs' }],
78
+ },
79
+ });
80
+ //# sourceMappingURL=getReviewerRole.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getReviewerRole.js","sourceRoot":"","sources":["../../../src/roles/reviewer/getReviewerRole.ts"],"names":[],"mappings":";;;AAAA,qCAA+B;AAE/B;;;GAGG;AACU,QAAA,aAAa,GAAS,cAAI,CAAC,KAAK,CAAC;IAC5C,IAAI,EAAE,UAAU;IAChB,IAAI,EAAE,UAAU;IAChB,OAAO,EAAE,yCAAyC;IAClD,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyDP,CAAC,IAAI,EAAE;IACR,MAAM,EAAE,EAAE;IACV,MAAM,EAAE;QACN,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,SAAS,GAAG,SAAS,EAAE,CAAC;QACtC,IAAI,EAAE,EAAE;KACT;IACD,MAAM,EAAE;QACN,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,SAAS,GAAG,SAAS,EAAE,CAAC;KACvC;CACF,CAAC,CAAC"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * .what = result of stepReview execution
3
+ * .why = enables caller to inspect review outcome and artifacts
4
+ */
5
+ export type StepReviewResult = {
6
+ review: {
7
+ formatted: string;
8
+ };
9
+ log: {
10
+ dir: string;
11
+ };
12
+ output: {
13
+ path: string;
14
+ };
15
+ metrics: {
16
+ files: {
17
+ rulesCount: number;
18
+ targetsCount: number;
19
+ };
20
+ expected: {
21
+ tokens: {
22
+ estimate: number;
23
+ contextWindowPercent: number;
24
+ };
25
+ cost: {
26
+ estimate: number;
27
+ };
28
+ };
29
+ realized: {
30
+ tokens: {
31
+ input: number;
32
+ inputCacheCreation: number;
33
+ inputCacheRead: number;
34
+ output: number;
35
+ };
36
+ cost: {
37
+ input: number;
38
+ cacheWrite: number;
39
+ cacheRead: number;
40
+ output: number;
41
+ total: number;
42
+ };
43
+ };
44
+ };
45
+ };
46
+ /**
47
+ * .what = executes a code review against specified rules and targets
48
+ * .why = core orchestration flow for reviewer role
49
+ */
50
+ export declare const stepReview: (input: {
51
+ rules: string | string[];
52
+ diffs?: string;
53
+ paths?: string | string[];
54
+ output: string;
55
+ mode: 'soft' | 'hard';
56
+ cwd?: string;
57
+ }) => Promise<StepReviewResult>;