rhachet-roles-bhrain 0.1.1 → 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 (159) 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/architect/briefs/brains.replic/arc000.sources.[catalog].md +178 -0
  34. package/dist/roles/architect/briefs/brains.replic/arc101.concept.llm.[article].md +25 -0
  35. package/dist/roles/architect/briefs/brains.replic/arc102.concept.repl.[article].md +33 -0
  36. package/dist/roles/architect/briefs/brains.replic/arc103.concept.replic-brain.[article].md +35 -0
  37. package/dist/roles/architect/briefs/brains.replic/arc104.concept.context-window.[article].md +40 -0
  38. package/dist/roles/architect/briefs/brains.replic/arc105.concept.system-prompt.[article].md +44 -0
  39. package/dist/roles/architect/briefs/brains.replic/arc106.concept.tool-definition.[article].md +59 -0
  40. package/dist/roles/architect/briefs/brains.replic/arc107.concept.tool-call.[article].md +54 -0
  41. package/dist/roles/architect/briefs/brains.replic/arc108.concept.tool-result.[article].md +58 -0
  42. package/dist/roles/architect/briefs/brains.replic/arc109.concept.agentic-loop.[article].md +62 -0
  43. package/dist/roles/architect/briefs/brains.replic/arc110.concept.reasoning-trace.[article].md +58 -0
  44. package/dist/roles/architect/briefs/brains.replic/arc111.concept.react-pattern.[article].md +65 -0
  45. package/dist/roles/architect/briefs/brains.replic/arc112.concept.reflexion-pattern.[article].md +68 -0
  46. package/dist/roles/architect/briefs/brains.replic/arc113.concept.tree-of-thoughts.[article].md +76 -0
  47. package/dist/roles/architect/briefs/brains.replic/arc114.concept.self-consistency.[article].md +73 -0
  48. package/dist/roles/architect/briefs/brains.replic/arc115.concept.lats-pattern.[article].md +78 -0
  49. package/dist/roles/architect/briefs/brains.replic/arc116.concept.context-compaction.[article].md +71 -0
  50. package/dist/roles/architect/briefs/brains.replic/arc117.concept.subagent.[article].md +71 -0
  51. package/dist/roles/architect/briefs/brains.replic/arc118.concept.extended-thinking.[article].md +69 -0
  52. package/dist/roles/architect/briefs/brains.replic/arc119.concept.mcp.[article].md +78 -0
  53. package/dist/roles/architect/briefs/brains.replic/arc120.concept.session.[article].md +67 -0
  54. package/dist/roles/architect/briefs/brains.replic/arc121.concept.message.[article].md +79 -0
  55. package/dist/roles/architect/briefs/brains.replic/arc122.concept.plan-and-solve.[article].md +80 -0
  56. package/dist/roles/architect/briefs/brains.replic/arc150.concepts.treestruct.[article].md +126 -0
  57. package/dist/roles/architect/briefs/brains.replic/arc201.blueprint.claude-code.[article].md +417 -0
  58. package/dist/roles/architect/briefs/brains.replic/arc201.blueprint.claude-code.zoomin.reason.[article].md +507 -0
  59. package/dist/roles/architect/briefs/brains.replic/arc202.blueprint.codex.[article].md +354 -0
  60. package/dist/roles/architect/briefs/brains.replic/arc300.blueprints.comparison.[catalog].md +284 -0
  61. package/dist/roles/getRoleRegistry.js +2 -1
  62. package/dist/roles/getRoleRegistry.js.map +1 -1
  63. package/dist/roles/getRoleRegistry.readme.js +6 -0
  64. package/dist/roles/getRoleRegistry.readme.js.map +1 -1
  65. package/dist/roles/reviewer/briefs/review.tactics.md +60 -0
  66. package/dist/roles/reviewer/getReviewerRole.d.ts +6 -0
  67. package/dist/roles/reviewer/getReviewerRole.js +80 -0
  68. package/dist/roles/reviewer/getReviewerRole.js.map +1 -0
  69. package/dist/roles/reviewer/skills/review/review.d.ts +57 -0
  70. package/dist/roles/reviewer/skills/review/review.js +445 -0
  71. package/dist/roles/reviewer/skills/review/review.js.map +1 -0
  72. package/dist/roles/reviewer/skills/review/review.sh +21 -0
  73. package/dist/roles/reviewer/skills/review/review.ts +575 -0
  74. package/dist/roles/thinker/briefs/term=brain.atomic_vs_replic.md +8 -0
  75. package/dist/roles/thinker/getThinkerRole.js +1 -1
  76. package/dist/roles/thinker/getThinkerRole.js.map +1 -1
  77. package/dist/roles/thinker/skills/brief.articulate/.demo/article.vision.v2025_08_19..i1.via_chatgpt.md +47 -0
  78. package/dist/roles/thinker/skills/brief.articulate/.demo/article.vision.v2025_08_19.i2.via_rhachet.md +60 -0
  79. package/dist/roles/thinker/skills/brief.articulate/.demo/diverge.v2025_08_17.i1.md +62 -0
  80. package/dist/roles/thinker/skills/brief.articulate/.demo/diverge.v2025_08_17.i1.with_feedback.md +89 -0
  81. package/dist/roles/thinker/skills/brief.articulate/.demo/diverge.v2025_08_17.i2.md +47 -0
  82. package/dist/roles/thinker/skills/brief.articulate/.demo/joke.v2025_08_15.i1.md +44 -0
  83. package/dist/roles/thinker/skills/brief.articulate/.demo/joke.v2025_08_15.i2.md +63 -0
  84. package/dist/roles/thinker/skills/brief.articulate/.demo/joke.v2025_08_15.i3.md +51 -0
  85. package/dist/roles/thinker/skills/brief.articulate/.demo/user-journey.v2025_08_17.i1.md +62 -0
  86. package/dist/roles/thinker/skills/brief.articulate/.demo/user-journey.v2025_08_17.i2.md +49 -0
  87. package/dist/roles/thinker/skills/brief.articulate/.readme.md +0 -0
  88. package/dist/roles/thinker/skills/brief.articulate/stepArticulate.skill.js +1 -1
  89. package/dist/roles/thinker/skills/brief.articulate/stepArticulate.skill.js.map +1 -1
  90. package/dist/roles/thinker/skills/brief.articulate/stepArticulate.skill.ts +168 -0
  91. package/dist/roles/thinker/skills/brief.articulate/stepArticulate.ts +157 -0
  92. package/dist/roles/thinker/skills/brief.catalogize/.demo/joke.types.v2025_08_28.i1.md +93 -0
  93. package/dist/roles/thinker/skills/brief.catalogize/.demo/joke.types.v2025_08_28.i2.md +84 -0
  94. package/dist/roles/thinker/skills/brief.catalogize/.demo/joke.types.v2025_09_28.i1.no_focus_context.md +8 -0
  95. package/dist/roles/thinker/skills/brief.catalogize/.demo/joke.types.v2025_09_28.i2.md +54 -0
  96. package/dist/roles/thinker/skills/brief.catalogize/.demo/persona.usecases.v2025_08_28.i1.md +62 -0
  97. package/dist/roles/thinker/skills/brief.catalogize/.demo/persona.usecases.v2025_08_28.i2.md +64 -0
  98. package/dist/roles/thinker/skills/brief.catalogize/.readme.md +5 -0
  99. package/dist/roles/thinker/skills/brief.catalogize/stepCatalogize.skill.js +1 -1
  100. package/dist/roles/thinker/skills/brief.catalogize/stepCatalogize.skill.js.map +1 -1
  101. package/dist/roles/thinker/skills/brief.catalogize/stepCatalogize.skill.ts +173 -0
  102. package/dist/roles/thinker/skills/brief.catalogize/stepCatalogize.ts +132 -0
  103. package/dist/roles/thinker/skills/brief.demonstrate/.demo/user.journey.roadtrip.input.example.i4.md +3 -0
  104. package/dist/roles/thinker/skills/brief.demonstrate/.demo/user.journey.roadtrip.input.example.i5.md +3 -0
  105. package/dist/roles/thinker/skills/brief.demonstrate/.demo/user.journey.roadtrip.input.example.i6.md +3 -0
  106. package/dist/roles/thinker/skills/brief.demonstrate/.demo/user.journey.roadtrip.input.example.md +3 -0
  107. package/dist/roles/thinker/skills/brief.demonstrate/.demo/user.journey.roadtrip.v2025_08_27.i1.md +52 -0
  108. package/dist/roles/thinker/skills/brief.demonstrate/.demo/user.journey.roadtrip.v2025_08_27.i2.md +51 -0
  109. package/dist/roles/thinker/skills/brief.demonstrate/.demo/user.journey.roadtrip.v2025_08_27.i3.md +47 -0
  110. package/dist/roles/thinker/skills/brief.demonstrate/.demo/user.journey.roadtrip.v2025_08_27.i4.md +62 -0
  111. package/dist/roles/thinker/skills/brief.demonstrate/.demo/user.journey.roadtrip.v2025_08_27.i5.md +47 -0
  112. package/dist/roles/thinker/skills/brief.demonstrate/.demo/user.journey.roadtrip.v2025_08_27.i6.md +53 -0
  113. package/dist/roles/thinker/skills/brief.demonstrate/.readme +3 -0
  114. package/dist/roles/thinker/skills/brief.demonstrate/stepDemonstrate.skill.js +1 -1
  115. package/dist/roles/thinker/skills/brief.demonstrate/stepDemonstrate.skill.js.map +1 -1
  116. package/dist/roles/thinker/skills/brief.demonstrate/stepDemonstrate.skill.ts +190 -0
  117. package/dist/roles/thinker/skills/brief.demonstrate/stepDemonstrate.ts +164 -0
  118. package/dist/roles/thinker/skills/khue.cluster/.demo/user.journeys.input1.cluster.v2025_08_17.i1.md +72 -0
  119. package/dist/roles/thinker/skills/khue.cluster/.demo/user.journeys.input1.cluster.v2025_08_17.i2.md +53 -0
  120. package/dist/roles/thinker/skills/khue.cluster/.demo/user.journeys.input1.cluster.v2025_08_17.i3.which_objectives.md +58 -0
  121. package/dist/roles/thinker/skills/khue.cluster/.demo/user.journeys.input1.cluster.v2025_08_17.i5.which_personas.md +64 -0
  122. package/dist/roles/thinker/skills/khue.cluster/.demo/user.journeys.input2.cluster.v2025_08_17.i1.md +67 -0
  123. package/dist/roles/thinker/skills/khue.cluster/.demo/user.journeys.input2.cluster.v2025_08_17.i2.md +49 -0
  124. package/dist/roles/thinker/skills/khue.cluster/.demo/user.journeys.input2.cluster.v2025_08_17.i3.md +59 -0
  125. package/dist/roles/thinker/skills/khue.cluster/.readme.md +0 -0
  126. package/dist/roles/thinker/skills/khue.cluster/stepCluster.skill.js +1 -1
  127. package/dist/roles/thinker/skills/khue.cluster/stepCluster.skill.js.map +1 -1
  128. package/dist/roles/thinker/skills/khue.cluster/stepCluster.skill.ts +174 -0
  129. package/dist/roles/thinker/skills/khue.cluster/stepCluster.ts +150 -0
  130. package/dist/roles/thinker/skills/khue.decompose/.readme.md +9 -0
  131. package/dist/roles/thinker/skills/khue.diverge/.demo/joke.examples.v2025_08_17.i2.md +23 -0
  132. package/dist/roles/thinker/skills/khue.diverge/.demo/joke.examples.v2025_08_17.i3.md +23 -0
  133. package/dist/roles/thinker/skills/khue.diverge/.demo/joke.varieties.v2025_08_17.i1.md +23 -0
  134. package/dist/roles/thinker/skills/khue.diverge/.demo/userjourney.examples.v2025_08_17.i1.md +9 -0
  135. package/dist/roles/thinker/skills/khue.diverge/.demo/userjourney.examples.v2025_08_17.i2.md +9 -0
  136. package/dist/roles/thinker/skills/khue.diverge/.demo/userjourney.examples.v2025_08_17.i3.md +23 -0
  137. package/dist/roles/thinker/skills/khue.diverge/.demo/userjourney.examples.v2025_08_17.i4.folksy.md +9 -0
  138. package/dist/roles/thinker/skills/khue.diverge/.demo/userjourney.examples.v2025_08_17.i5.folksy.md +23 -0
  139. package/dist/roles/thinker/skills/khue.diverge/.readme.md +0 -0
  140. package/dist/roles/thinker/skills/khue.diverge/stepDiverge.skill.js +1 -1
  141. package/dist/roles/thinker/skills/khue.diverge/stepDiverge.skill.js.map +1 -1
  142. package/dist/roles/thinker/skills/khue.diverge/stepDiverge.skill.ts +149 -0
  143. package/dist/roles/thinker/skills/khue.diverge/stepDiverge.ts +151 -0
  144. package/dist/roles/thinker/skills/khue.encompose/.readme.md +7 -0
  145. package/dist/roles/thinker/skills/khue.instantiate/.readme.md +14 -0
  146. package/dist/roles/thinker/skills/khue.instantiate/stepInstantiate.skill.js +1 -1
  147. package/dist/roles/thinker/skills/khue.instantiate/stepInstantiate.skill.js.map +1 -1
  148. package/dist/roles/thinker/skills/khue.instantiate/stepInstantiate.skill.ts +190 -0
  149. package/dist/roles/thinker/skills/khue.instantiate/stepInstantiate.ts +132 -0
  150. package/dist/roles/thinker/skills/khue.triage/.demo/laughs.v2025_08_18.i1.md +29 -0
  151. package/dist/roles/thinker/skills/khue.triage/.demo/user.journeys.v2025_08_17.i1.md +86 -0
  152. package/dist/roles/thinker/skills/khue.triage/.demo/user.journeys.v2025_08_17.i2.md +68 -0
  153. package/dist/roles/thinker/skills/khue.triage/.readme.md +0 -0
  154. package/dist/roles/thinker/skills/khue.triage/stepTriage.skill.js +1 -1
  155. package/dist/roles/thinker/skills/khue.triage/stepTriage.skill.js.map +1 -1
  156. package/dist/roles/thinker/skills/khue.triage/stepTriage.skill.ts +174 -0
  157. package/dist/roles/thinker/skills/khue.triage/stepTriage.ts +153 -0
  158. package/package.json +9 -7
  159. package/readme.md +55 -0
@@ -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>;
@@ -0,0 +1,445 @@
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.stepReview = void 0;
27
+ const fs = __importStar(require("fs/promises"));
28
+ const helpful_errors_1 = require("helpful-errors");
29
+ const path = __importStar(require("path"));
30
+ const compileReviewPrompt_1 = require("../../../../domain.operations/review/compileReviewPrompt");
31
+ const enumFilesFromDiffs_1 = require("../../../../domain.operations/review/enumFilesFromDiffs");
32
+ const enumFilesFromGlob_1 = require("../../../../domain.operations/review/enumFilesFromGlob");
33
+ const formatReviewOutput_1 = require("../../../../domain.operations/review/formatReviewOutput");
34
+ const genTokenBreakdownMarkdown_1 = require("../../../../domain.operations/review/genTokenBreakdownMarkdown");
35
+ const genTokenBreakdownReport_1 = require("../../../../domain.operations/review/genTokenBreakdownReport");
36
+ const invokeClaudeCode_1 = require("../../../../domain.operations/review/invokeClaudeCode");
37
+ const writeInputArtifacts_1 = require("../../../../domain.operations/review/writeInputArtifacts");
38
+ const writeOutputArtifacts_1 = require("../../../../domain.operations/review/writeOutputArtifacts");
39
+ /**
40
+ * .what = generates ISO timestamp for log directory naming
41
+ * .why = enables unique, sortable log directories
42
+ */
43
+ const genLogTimestamp = () => {
44
+ return new Date().toISOString().replace(/[:.]/g, '-');
45
+ };
46
+ /**
47
+ * .what = simple spinner for CLI feedback
48
+ * .why = shows progress during long-running operations
49
+ */
50
+ const withSpinner = async (input) => {
51
+ const frames = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
52
+ const startTime = Date.now();
53
+ let i = 0;
54
+ // print title once
55
+ console.log(input.message);
56
+ // render only the elapsed time branch line
57
+ const render = (frame) => {
58
+ const elapsed = Math.floor((Date.now() - startTime) / 1000);
59
+ process.stdout.write(`\r └─ elapsed: ${elapsed}s ${frame} `);
60
+ };
61
+ render(frames[0]);
62
+ const interval = setInterval(() => {
63
+ i = (i + 1) % frames.length;
64
+ render(frames[i]);
65
+ }, 100);
66
+ try {
67
+ const result = await input.operation();
68
+ clearInterval(interval);
69
+ const elapsed = Math.floor((Date.now() - startTime) / 1000);
70
+ process.stdout.write(`\r └─ elapsed: ${elapsed}s ✓\n\n`);
71
+ return result;
72
+ }
73
+ catch (error) {
74
+ clearInterval(interval);
75
+ const elapsed = Math.floor((Date.now() - startTime) / 1000);
76
+ process.stdout.write(`\r └─ elapsed: ${elapsed}s ✗\n`);
77
+ throw error;
78
+ }
79
+ };
80
+ /**
81
+ * .what = executes a code review against specified rules and targets
82
+ * .why = core orchestration flow for reviewer role
83
+ */
84
+ const stepReview = async (input) => {
85
+ const cwd = input.cwd ?? process.cwd();
86
+ // validate that at least one of rules, diffs, or paths is specified
87
+ const hasRules = input.rules && (Array.isArray(input.rules) ? input.rules.length > 0 : true);
88
+ const hasDiffs = !!input.diffs;
89
+ const hasPaths = input.paths && (Array.isArray(input.paths) ? input.paths.length > 0 : true);
90
+ if (!hasRules && !hasDiffs && !hasPaths)
91
+ throw new helpful_errors_1.BadRequestError('must specify at least one of --rules, --diffs, or --paths');
92
+ // validate output parent directory exists
93
+ const outputParent = path.dirname(input.output);
94
+ const outputParentAbsolute = path.isAbsolute(outputParent)
95
+ ? outputParent
96
+ : path.join(cwd, outputParent);
97
+ try {
98
+ await fs.access(outputParentAbsolute);
99
+ }
100
+ catch {
101
+ throw new helpful_errors_1.BadRequestError('output path parent directory does not exist', {
102
+ outputParent: outputParentAbsolute,
103
+ });
104
+ }
105
+ // enumerate rule files
106
+ const ruleGlobs = Array.isArray(input.rules)
107
+ ? input.rules
108
+ : [input.rules].filter(Boolean);
109
+ const ruleFiles = await (0, enumFilesFromGlob_1.enumFilesFromGlob)({ glob: ruleGlobs, cwd });
110
+ if (ruleGlobs.length > 0 && ruleFiles.length === 0)
111
+ throw new helpful_errors_1.BadRequestError('--rules glob was ineffective; matched zero files', {
112
+ rules: input.rules,
113
+ });
114
+ // enumerate target files from diffs
115
+ const targetFilesFromDiffs = input.diffs
116
+ ? await (0, enumFilesFromDiffs_1.enumFilesFromDiffs)({
117
+ range: input.diffs,
118
+ cwd,
119
+ })
120
+ : [];
121
+ // enumerate target files from paths
122
+ const pathGlobs = input.paths
123
+ ? Array.isArray(input.paths)
124
+ ? input.paths
125
+ : [input.paths]
126
+ : [];
127
+ const positivePathGlobs = pathGlobs.filter((p) => !p.startsWith('!'));
128
+ const negativePathGlobs = pathGlobs
129
+ .filter((p) => p.startsWith('!'))
130
+ .map((p) => p.slice(1));
131
+ const targetFilesFromPaths = await (0, enumFilesFromGlob_1.enumFilesFromGlob)({
132
+ glob: positivePathGlobs,
133
+ cwd,
134
+ });
135
+ // union target files from diffs and paths, then apply global exclusions
136
+ const targetFilesUnion = [
137
+ ...new Set([...targetFilesFromDiffs, ...targetFilesFromPaths]),
138
+ ];
139
+ const targetFiles = targetFilesUnion
140
+ .filter((file) => {
141
+ for (const pattern of negativePathGlobs) {
142
+ if (file === pattern || file.endsWith(`/${pattern}`))
143
+ return false;
144
+ if (pattern.includes('*')) {
145
+ const regex = new RegExp('^' + pattern.replace(/\*/g, '.*').replace(/\?/g, '.') + '$');
146
+ if (regex.test(file))
147
+ return false;
148
+ }
149
+ }
150
+ return true;
151
+ })
152
+ .sort();
153
+ // validate combined scope is non-empty
154
+ if (targetFiles.length === 0)
155
+ throw new helpful_errors_1.BadRequestError('combined scope resolves to zero files', {
156
+ diffs: input.diffs,
157
+ paths: input.paths,
158
+ diffsMatched: targetFilesFromDiffs.length,
159
+ pathsMatched: targetFilesFromPaths.length,
160
+ });
161
+ // create log directory early for debugging
162
+ const logDir = path.join(cwd, '.log', 'bhrain', 'review', genLogTimestamp());
163
+ await fs.mkdir(logDir, { recursive: true });
164
+ // write scope immediately for debugging
165
+ await fs.writeFile(path.join(logDir, 'input.scope.json'), JSON.stringify({ ruleFiles, targetFiles }, null, 2), 'utf-8');
166
+ // read file contents for prompt compilation
167
+ const readFileContent = async (file) => {
168
+ try {
169
+ return await fs.readFile(path.join(cwd, file), 'utf-8');
170
+ }
171
+ catch (error) {
172
+ if (!(error instanceof Error))
173
+ throw error;
174
+ throw new helpful_errors_1.BadRequestError(`failed to read file: ${file}`, {
175
+ file,
176
+ fullPath: path.join(cwd, file),
177
+ error: error.message,
178
+ });
179
+ }
180
+ };
181
+ const ruleContents = await Promise.all(ruleFiles.map(async (file) => ({
182
+ path: file,
183
+ content: await readFileContent(file),
184
+ })));
185
+ const targetContents = await Promise.all(targetFiles.map(async (file) => ({
186
+ path: file,
187
+ content: await readFileContent(file),
188
+ })));
189
+ // generate and write token breakdown reports
190
+ const allContents = [...ruleContents, ...targetContents];
191
+ const allBreakdown = (0, genTokenBreakdownReport_1.genTokenBreakdownReport)({ files: allContents });
192
+ const rulesBreakdown = (0, genTokenBreakdownReport_1.genTokenBreakdownReport)({ files: ruleContents });
193
+ const targetsBreakdown = (0, genTokenBreakdownReport_1.genTokenBreakdownReport)({ files: targetContents });
194
+ await fs.writeFile(path.join(logDir, 'tokens.expected.json'), JSON.stringify({
195
+ all: allBreakdown,
196
+ rules: rulesBreakdown,
197
+ targets: targetsBreakdown,
198
+ }, null, 2), 'utf-8');
199
+ await fs.writeFile(path.join(logDir, 'tokens.expected.md'), (0, genTokenBreakdownMarkdown_1.genTokenBreakdownMarkdown)({
200
+ all: allBreakdown,
201
+ rules: rulesBreakdown,
202
+ targets: targetsBreakdown,
203
+ }), 'utf-8');
204
+ // compile review prompt
205
+ const promptResult = (0, compileReviewPrompt_1.compileReviewPrompt)({
206
+ rules: ruleContents,
207
+ targets: targetContents,
208
+ mode: input.mode,
209
+ });
210
+ // write metrics.expected immediately after files are read
211
+ await fs.writeFile(path.join(logDir, 'metrics.expected.json'), JSON.stringify({
212
+ files: {
213
+ rulesCount: ruleFiles.length,
214
+ targetsCount: targetFiles.length,
215
+ },
216
+ tokens: {
217
+ estimate: promptResult.tokenEstimate,
218
+ contextWindowPercent: promptResult.contextWindowPercent,
219
+ },
220
+ cost: {
221
+ estimate: promptResult.costEstimate,
222
+ },
223
+ }, null, 2), 'utf-8');
224
+ // write input artifacts
225
+ await (0, writeInputArtifacts_1.writeInputArtifacts)({
226
+ logDir,
227
+ args: {
228
+ rules: input.rules,
229
+ diffs: input.diffs,
230
+ paths: input.paths,
231
+ output: input.output,
232
+ mode: input.mode,
233
+ },
234
+ scope: {
235
+ ruleFiles,
236
+ targetFiles,
237
+ },
238
+ metrics: {
239
+ tokenEstimate: promptResult.tokenEstimate,
240
+ contextWindowPercent: promptResult.contextWindowPercent,
241
+ costEstimate: promptResult.costEstimate,
242
+ },
243
+ prompt: promptResult.prompt,
244
+ });
245
+ // emit metrics.expected before invocation
246
+ const logDirRelative = path.relative(cwd, logDir);
247
+ console.log(`
248
+ 🔭 metrics.expected
249
+ ├─ files
250
+ │ ├─ rules: ${ruleFiles.length}
251
+ │ └─ targets: ${targetFiles.length}
252
+ ├─ tokens
253
+ │ ├─ estimate: ${promptResult.tokenEstimate}
254
+ │ └─ context: ${promptResult.contextWindowPercent.toFixed(1)}%
255
+ └─ cost
256
+ └─ estimate: $${promptResult.costEstimate.toFixed(4)}
257
+
258
+ 🪵 logs
259
+ ├─ scope: ${logDirRelative}/input.scope.json
260
+ ├─ metrics: ${logDirRelative}/metrics.expected.json
261
+ └─ tokens: ${logDirRelative}/tokens.expected.md
262
+ `.trim());
263
+ // invoke claude-code with spinner
264
+ console.log('');
265
+ const brainResult = await withSpinner({
266
+ message: "🐢 let's review!",
267
+ operation: () => (0, invokeClaudeCode_1.invokeClaudeCode)({ prompt: promptResult.prompt, cwd }),
268
+ });
269
+ // calculate realized costs per token type
270
+ const realizedCosts = (() => {
271
+ const input = (brainResult.usage.inputTokens / 1000000) * 3;
272
+ const cacheWrite = (brainResult.usage.inputTokensCacheCreation / 1000000) * 3.75;
273
+ const cacheRead = (brainResult.usage.inputTokensCacheRead / 1000000) * 0.3;
274
+ const output = (brainResult.usage.outputTokens / 1000000) * 15;
275
+ const total = Math.round((input + cacheWrite + cacheRead + output) * 10000) / 10000;
276
+ return { input, cacheWrite, cacheRead, output, total };
277
+ })();
278
+ // write metrics.realized after invocation
279
+ await fs.writeFile(path.join(logDir, 'metrics.realized.json'), JSON.stringify({
280
+ tokens: {
281
+ input: brainResult.usage.inputTokens,
282
+ inputCacheCreation: brainResult.usage.inputTokensCacheCreation,
283
+ inputCacheRead: brainResult.usage.inputTokensCacheRead,
284
+ output: brainResult.usage.outputTokens,
285
+ },
286
+ cost: {
287
+ input: realizedCosts.input,
288
+ cacheWrite: realizedCosts.cacheWrite,
289
+ cacheRead: realizedCosts.cacheRead,
290
+ output: realizedCosts.output,
291
+ total: realizedCosts.total,
292
+ },
293
+ }, null, 2), 'utf-8');
294
+ // parse issues from review text
295
+ const reviewIssues = (() => {
296
+ // extract JSON from the review text (may be wrapped in markdown code blocks)
297
+ const jsonMatch = brainResult.review.match(/```(?:json)?\s*([\s\S]*?)```/);
298
+ const jsonText = jsonMatch?.[1]?.trim() ?? brainResult.review.trim();
299
+ try {
300
+ return JSON.parse(jsonText);
301
+ }
302
+ catch (error) {
303
+ throw new helpful_errors_1.BadRequestError('failed to parse review issues from claude response', {
304
+ review: brainResult.review,
305
+ jsonText,
306
+ error: error instanceof Error ? error.message : String(error),
307
+ });
308
+ }
309
+ })();
310
+ // format review output
311
+ const formattedReview = (0, formatReviewOutput_1.formatReviewOutput)({
312
+ response: reviewIssues,
313
+ });
314
+ // write output artifacts
315
+ await (0, writeOutputArtifacts_1.writeOutputArtifacts)({
316
+ logDir,
317
+ response: brainResult.response,
318
+ review: formattedReview,
319
+ });
320
+ // write final review to output path
321
+ const outputAbsolute = path.isAbsolute(input.output)
322
+ ? input.output
323
+ : path.join(cwd, input.output);
324
+ await fs.writeFile(outputAbsolute, formattedReview, 'utf-8');
325
+ // emit metrics.realized after invocation
326
+ console.log(`
327
+ ✨ metrics.realized
328
+ ├─ tokens
329
+ │ ├─ input: ${brainResult.usage.inputTokens}
330
+ │ ├─ cache.write: ${brainResult.usage.inputTokensCacheCreation}
331
+ │ ├─ cache.read: ${brainResult.usage.inputTokensCacheRead}
332
+ │ └─ output: ${brainResult.usage.outputTokens}
333
+ └─ cost
334
+ ├─ input: $${realizedCosts.input.toFixed(4)}
335
+ ├─ cache.write: $${realizedCosts.cacheWrite.toFixed(4)}
336
+ ├─ cache.read: $${realizedCosts.cacheRead.toFixed(4)}
337
+ ├─ output: $${realizedCosts.output.toFixed(4)}
338
+ └─ total: $${realizedCosts.total.toFixed(4)}
339
+
340
+ 🌊 output
341
+ ├─ logs: ${path.relative(cwd, logDir)}
342
+ └─ review: ${path.relative(cwd, outputAbsolute).startsWith('..') ? outputAbsolute : path.relative(cwd, outputAbsolute)}
343
+ `.trim());
344
+ return {
345
+ review: {
346
+ formatted: formattedReview,
347
+ },
348
+ log: {
349
+ dir: logDir,
350
+ },
351
+ output: {
352
+ path: outputAbsolute,
353
+ },
354
+ metrics: {
355
+ files: {
356
+ rulesCount: ruleFiles.length,
357
+ targetsCount: targetFiles.length,
358
+ },
359
+ expected: {
360
+ tokens: {
361
+ estimate: promptResult.tokenEstimate,
362
+ contextWindowPercent: promptResult.contextWindowPercent,
363
+ },
364
+ cost: {
365
+ estimate: promptResult.costEstimate,
366
+ },
367
+ },
368
+ realized: {
369
+ tokens: {
370
+ input: brainResult.usage.inputTokens,
371
+ inputCacheCreation: brainResult.usage.inputTokensCacheCreation,
372
+ inputCacheRead: brainResult.usage.inputTokensCacheRead,
373
+ output: brainResult.usage.outputTokens,
374
+ },
375
+ cost: {
376
+ input: realizedCosts.input,
377
+ cacheWrite: realizedCosts.cacheWrite,
378
+ cacheRead: realizedCosts.cacheRead,
379
+ output: realizedCosts.output,
380
+ total: realizedCosts.total,
381
+ },
382
+ },
383
+ },
384
+ };
385
+ };
386
+ exports.stepReview = stepReview;
387
+ /**
388
+ * .what = CLI entrypoint when run directly
389
+ * .why = enables ./review.sh to invoke this module
390
+ */
391
+ if (require.main === module) {
392
+ // parse command line arguments
393
+ const args = process.argv.slice(2);
394
+ const parsed = {};
395
+ for (let i = 0; i < args.length; i += 2) {
396
+ const key = args[i]?.replace(/^--/, '');
397
+ const value = args[i + 1];
398
+ if (key && value)
399
+ parsed[key] = value;
400
+ }
401
+ // default output path if not provided
402
+ const output = parsed.output ??
403
+ path.join(process.cwd(), '.review', 'bhrain', `v${genLogTimestamp()}`, '[feedback].[given].by_robot.md');
404
+ // validate mode is provided
405
+ if (!parsed.mode || (parsed.mode !== 'soft' && parsed.mode !== 'hard')) {
406
+ console.error('⛈️ error: --mode must be "soft" or "hard"');
407
+ process.exit(1);
408
+ }
409
+ const mode = parsed.mode;
410
+ // default rules to .agent/**/briefs/**/rule.*.md
411
+ const rules = parsed.rules
412
+ ? parsed.rules.split(',').map((r) => r.trim())
413
+ : ['.agent/**/briefs/**/rule.*.md'];
414
+ // default diffs to uptil-main
415
+ const diffs = parsed.diffs ??
416
+ 'uptil-main';
417
+ // parse paths if provided
418
+ const paths = parsed.paths
419
+ ? parsed.paths.split(',').map((p) => p.trim())
420
+ : undefined;
421
+ // execute review
422
+ void (async () => {
423
+ try {
424
+ // ensure output directory exists
425
+ await fs.mkdir(path.dirname(output), { recursive: true });
426
+ // run the review
427
+ await (0, exports.stepReview)({
428
+ rules,
429
+ diffs,
430
+ paths,
431
+ output,
432
+ mode,
433
+ });
434
+ }
435
+ catch (error) {
436
+ if (error instanceof helpful_errors_1.BadRequestError) {
437
+ console.error(`\n⛈️ error: ${error.message}`);
438
+ process.exit(1);
439
+ }
440
+ console.error('⛈️ unexpected error:', error);
441
+ process.exit(1);
442
+ }
443
+ })();
444
+ }
445
+ //# sourceMappingURL=review.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review.js","sourceRoot":"","sources":["../../../../../src/roles/reviewer/skills/review/review.ts"],"names":[],"mappings":"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"}