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.
- package/dist/.test/getContextOpenAI.js +1 -1
- package/dist/.test/getContextOpenAI.js.map +1 -1
- package/dist/domain.operations/review/compileReviewPrompt.d.ts +22 -0
- package/dist/domain.operations/review/compileReviewPrompt.js +95 -0
- package/dist/domain.operations/review/compileReviewPrompt.js.map +1 -0
- package/dist/domain.operations/review/enumFilesFromDiffs.d.ts +8 -0
- package/dist/domain.operations/review/enumFilesFromDiffs.js +74 -0
- package/dist/domain.operations/review/enumFilesFromDiffs.js.map +1 -0
- package/dist/domain.operations/review/enumFilesFromGlob.d.ts +8 -0
- package/dist/domain.operations/review/enumFilesFromGlob.js +31 -0
- package/dist/domain.operations/review/enumFilesFromGlob.js.map +1 -0
- package/dist/domain.operations/review/estimateTokenCount.d.ts +9 -0
- package/dist/domain.operations/review/estimateTokenCount.js +20 -0
- package/dist/domain.operations/review/estimateTokenCount.js.map +1 -0
- package/dist/domain.operations/review/formatReviewOutput.d.ts +14 -0
- package/dist/domain.operations/review/formatReviewOutput.js +42 -0
- package/dist/domain.operations/review/formatReviewOutput.js.map +1 -0
- package/dist/domain.operations/review/genTokenBreakdownMarkdown.d.ts +19 -0
- package/dist/domain.operations/review/genTokenBreakdownMarkdown.js +110 -0
- package/dist/domain.operations/review/genTokenBreakdownMarkdown.js.map +1 -0
- package/dist/domain.operations/review/genTokenBreakdownReport.d.ts +24 -0
- package/dist/domain.operations/review/genTokenBreakdownReport.js +64 -0
- package/dist/domain.operations/review/genTokenBreakdownReport.js.map +1 -0
- package/dist/domain.operations/review/invokeClaudeCode.d.ts +22 -0
- package/dist/domain.operations/review/invokeClaudeCode.js +92 -0
- package/dist/domain.operations/review/invokeClaudeCode.js.map +1 -0
- package/dist/domain.operations/review/writeInputArtifacts.d.ts +27 -0
- package/dist/domain.operations/review/writeInputArtifacts.js +50 -0
- package/dist/domain.operations/review/writeInputArtifacts.js.map +1 -0
- package/dist/domain.operations/review/writeOutputArtifacts.d.ts +12 -0
- package/dist/domain.operations/review/writeOutputArtifacts.js +46 -0
- package/dist/domain.operations/review/writeOutputArtifacts.js.map +1 -0
- package/dist/roles/architect/briefs/brains.replic/arc000.sources.[catalog].md +178 -0
- package/dist/roles/architect/briefs/brains.replic/arc101.concept.llm.[article].md +25 -0
- package/dist/roles/architect/briefs/brains.replic/arc102.concept.repl.[article].md +33 -0
- package/dist/roles/architect/briefs/brains.replic/arc103.concept.replic-brain.[article].md +35 -0
- package/dist/roles/architect/briefs/brains.replic/arc104.concept.context-window.[article].md +40 -0
- package/dist/roles/architect/briefs/brains.replic/arc105.concept.system-prompt.[article].md +44 -0
- package/dist/roles/architect/briefs/brains.replic/arc106.concept.tool-definition.[article].md +59 -0
- package/dist/roles/architect/briefs/brains.replic/arc107.concept.tool-call.[article].md +54 -0
- package/dist/roles/architect/briefs/brains.replic/arc108.concept.tool-result.[article].md +58 -0
- package/dist/roles/architect/briefs/brains.replic/arc109.concept.agentic-loop.[article].md +62 -0
- package/dist/roles/architect/briefs/brains.replic/arc110.concept.reasoning-trace.[article].md +58 -0
- package/dist/roles/architect/briefs/brains.replic/arc111.concept.react-pattern.[article].md +65 -0
- package/dist/roles/architect/briefs/brains.replic/arc112.concept.reflexion-pattern.[article].md +68 -0
- package/dist/roles/architect/briefs/brains.replic/arc113.concept.tree-of-thoughts.[article].md +76 -0
- package/dist/roles/architect/briefs/brains.replic/arc114.concept.self-consistency.[article].md +73 -0
- package/dist/roles/architect/briefs/brains.replic/arc115.concept.lats-pattern.[article].md +78 -0
- package/dist/roles/architect/briefs/brains.replic/arc116.concept.context-compaction.[article].md +71 -0
- package/dist/roles/architect/briefs/brains.replic/arc117.concept.subagent.[article].md +71 -0
- package/dist/roles/architect/briefs/brains.replic/arc118.concept.extended-thinking.[article].md +69 -0
- package/dist/roles/architect/briefs/brains.replic/arc119.concept.mcp.[article].md +78 -0
- package/dist/roles/architect/briefs/brains.replic/arc120.concept.session.[article].md +67 -0
- package/dist/roles/architect/briefs/brains.replic/arc121.concept.message.[article].md +79 -0
- package/dist/roles/architect/briefs/brains.replic/arc122.concept.plan-and-solve.[article].md +80 -0
- package/dist/roles/architect/briefs/brains.replic/arc150.concepts.treestruct.[article].md +126 -0
- package/dist/roles/architect/briefs/brains.replic/arc201.blueprint.claude-code.[article].md +417 -0
- package/dist/roles/architect/briefs/brains.replic/arc201.blueprint.claude-code.zoomin.reason.[article].md +507 -0
- package/dist/roles/architect/briefs/brains.replic/arc202.blueprint.codex.[article].md +354 -0
- package/dist/roles/architect/briefs/brains.replic/arc300.blueprints.comparison.[catalog].md +284 -0
- package/dist/roles/getRoleRegistry.js +2 -1
- package/dist/roles/getRoleRegistry.js.map +1 -1
- package/dist/roles/getRoleRegistry.readme.js +6 -0
- package/dist/roles/getRoleRegistry.readme.js.map +1 -1
- package/dist/roles/reviewer/briefs/review.tactics.md +60 -0
- package/dist/roles/reviewer/getReviewerRole.d.ts +6 -0
- package/dist/roles/reviewer/getReviewerRole.js +80 -0
- package/dist/roles/reviewer/getReviewerRole.js.map +1 -0
- package/dist/roles/reviewer/skills/review/review.d.ts +57 -0
- package/dist/roles/reviewer/skills/review/review.js +445 -0
- package/dist/roles/reviewer/skills/review/review.js.map +1 -0
- package/dist/roles/reviewer/skills/review/review.sh +21 -0
- package/dist/roles/reviewer/skills/review/review.ts +575 -0
- package/dist/roles/thinker/briefs/term=brain.atomic_vs_replic.md +8 -0
- package/dist/roles/thinker/getThinkerRole.js +1 -1
- package/dist/roles/thinker/getThinkerRole.js.map +1 -1
- package/dist/roles/thinker/skills/brief.articulate/.demo/article.vision.v2025_08_19..i1.via_chatgpt.md +47 -0
- package/dist/roles/thinker/skills/brief.articulate/.demo/article.vision.v2025_08_19.i2.via_rhachet.md +60 -0
- package/dist/roles/thinker/skills/brief.articulate/.demo/diverge.v2025_08_17.i1.md +62 -0
- package/dist/roles/thinker/skills/brief.articulate/.demo/diverge.v2025_08_17.i1.with_feedback.md +89 -0
- package/dist/roles/thinker/skills/brief.articulate/.demo/diverge.v2025_08_17.i2.md +47 -0
- package/dist/roles/thinker/skills/brief.articulate/.demo/joke.v2025_08_15.i1.md +44 -0
- package/dist/roles/thinker/skills/brief.articulate/.demo/joke.v2025_08_15.i2.md +63 -0
- package/dist/roles/thinker/skills/brief.articulate/.demo/joke.v2025_08_15.i3.md +51 -0
- package/dist/roles/thinker/skills/brief.articulate/.demo/user-journey.v2025_08_17.i1.md +62 -0
- package/dist/roles/thinker/skills/brief.articulate/.demo/user-journey.v2025_08_17.i2.md +49 -0
- package/dist/roles/thinker/skills/brief.articulate/.readme.md +0 -0
- package/dist/roles/thinker/skills/brief.articulate/stepArticulate.skill.js +1 -1
- package/dist/roles/thinker/skills/brief.articulate/stepArticulate.skill.js.map +1 -1
- package/dist/roles/thinker/skills/brief.articulate/stepArticulate.skill.ts +168 -0
- package/dist/roles/thinker/skills/brief.articulate/stepArticulate.ts +157 -0
- package/dist/roles/thinker/skills/brief.catalogize/.demo/joke.types.v2025_08_28.i1.md +93 -0
- package/dist/roles/thinker/skills/brief.catalogize/.demo/joke.types.v2025_08_28.i2.md +84 -0
- package/dist/roles/thinker/skills/brief.catalogize/.demo/joke.types.v2025_09_28.i1.no_focus_context.md +8 -0
- package/dist/roles/thinker/skills/brief.catalogize/.demo/joke.types.v2025_09_28.i2.md +54 -0
- package/dist/roles/thinker/skills/brief.catalogize/.demo/persona.usecases.v2025_08_28.i1.md +62 -0
- package/dist/roles/thinker/skills/brief.catalogize/.demo/persona.usecases.v2025_08_28.i2.md +64 -0
- package/dist/roles/thinker/skills/brief.catalogize/.readme.md +5 -0
- package/dist/roles/thinker/skills/brief.catalogize/stepCatalogize.skill.js +1 -1
- package/dist/roles/thinker/skills/brief.catalogize/stepCatalogize.skill.js.map +1 -1
- package/dist/roles/thinker/skills/brief.catalogize/stepCatalogize.skill.ts +173 -0
- package/dist/roles/thinker/skills/brief.catalogize/stepCatalogize.ts +132 -0
- package/dist/roles/thinker/skills/brief.demonstrate/.demo/user.journey.roadtrip.input.example.i4.md +3 -0
- package/dist/roles/thinker/skills/brief.demonstrate/.demo/user.journey.roadtrip.input.example.i5.md +3 -0
- package/dist/roles/thinker/skills/brief.demonstrate/.demo/user.journey.roadtrip.input.example.i6.md +3 -0
- package/dist/roles/thinker/skills/brief.demonstrate/.demo/user.journey.roadtrip.input.example.md +3 -0
- package/dist/roles/thinker/skills/brief.demonstrate/.demo/user.journey.roadtrip.v2025_08_27.i1.md +52 -0
- package/dist/roles/thinker/skills/brief.demonstrate/.demo/user.journey.roadtrip.v2025_08_27.i2.md +51 -0
- package/dist/roles/thinker/skills/brief.demonstrate/.demo/user.journey.roadtrip.v2025_08_27.i3.md +47 -0
- package/dist/roles/thinker/skills/brief.demonstrate/.demo/user.journey.roadtrip.v2025_08_27.i4.md +62 -0
- package/dist/roles/thinker/skills/brief.demonstrate/.demo/user.journey.roadtrip.v2025_08_27.i5.md +47 -0
- package/dist/roles/thinker/skills/brief.demonstrate/.demo/user.journey.roadtrip.v2025_08_27.i6.md +53 -0
- package/dist/roles/thinker/skills/brief.demonstrate/.readme +3 -0
- package/dist/roles/thinker/skills/brief.demonstrate/stepDemonstrate.skill.js +1 -1
- package/dist/roles/thinker/skills/brief.demonstrate/stepDemonstrate.skill.js.map +1 -1
- package/dist/roles/thinker/skills/brief.demonstrate/stepDemonstrate.skill.ts +190 -0
- package/dist/roles/thinker/skills/brief.demonstrate/stepDemonstrate.ts +164 -0
- package/dist/roles/thinker/skills/khue.cluster/.demo/user.journeys.input1.cluster.v2025_08_17.i1.md +72 -0
- package/dist/roles/thinker/skills/khue.cluster/.demo/user.journeys.input1.cluster.v2025_08_17.i2.md +53 -0
- package/dist/roles/thinker/skills/khue.cluster/.demo/user.journeys.input1.cluster.v2025_08_17.i3.which_objectives.md +58 -0
- package/dist/roles/thinker/skills/khue.cluster/.demo/user.journeys.input1.cluster.v2025_08_17.i5.which_personas.md +64 -0
- package/dist/roles/thinker/skills/khue.cluster/.demo/user.journeys.input2.cluster.v2025_08_17.i1.md +67 -0
- package/dist/roles/thinker/skills/khue.cluster/.demo/user.journeys.input2.cluster.v2025_08_17.i2.md +49 -0
- package/dist/roles/thinker/skills/khue.cluster/.demo/user.journeys.input2.cluster.v2025_08_17.i3.md +59 -0
- package/dist/roles/thinker/skills/khue.cluster/.readme.md +0 -0
- package/dist/roles/thinker/skills/khue.cluster/stepCluster.skill.js +1 -1
- package/dist/roles/thinker/skills/khue.cluster/stepCluster.skill.js.map +1 -1
- package/dist/roles/thinker/skills/khue.cluster/stepCluster.skill.ts +174 -0
- package/dist/roles/thinker/skills/khue.cluster/stepCluster.ts +150 -0
- package/dist/roles/thinker/skills/khue.decompose/.readme.md +9 -0
- package/dist/roles/thinker/skills/khue.diverge/.demo/joke.examples.v2025_08_17.i2.md +23 -0
- package/dist/roles/thinker/skills/khue.diverge/.demo/joke.examples.v2025_08_17.i3.md +23 -0
- package/dist/roles/thinker/skills/khue.diverge/.demo/joke.varieties.v2025_08_17.i1.md +23 -0
- package/dist/roles/thinker/skills/khue.diverge/.demo/userjourney.examples.v2025_08_17.i1.md +9 -0
- package/dist/roles/thinker/skills/khue.diverge/.demo/userjourney.examples.v2025_08_17.i2.md +9 -0
- package/dist/roles/thinker/skills/khue.diverge/.demo/userjourney.examples.v2025_08_17.i3.md +23 -0
- package/dist/roles/thinker/skills/khue.diverge/.demo/userjourney.examples.v2025_08_17.i4.folksy.md +9 -0
- package/dist/roles/thinker/skills/khue.diverge/.demo/userjourney.examples.v2025_08_17.i5.folksy.md +23 -0
- package/dist/roles/thinker/skills/khue.diverge/.readme.md +0 -0
- package/dist/roles/thinker/skills/khue.diverge/stepDiverge.skill.js +1 -1
- package/dist/roles/thinker/skills/khue.diverge/stepDiverge.skill.js.map +1 -1
- package/dist/roles/thinker/skills/khue.diverge/stepDiverge.skill.ts +149 -0
- package/dist/roles/thinker/skills/khue.diverge/stepDiverge.ts +151 -0
- package/dist/roles/thinker/skills/khue.encompose/.readme.md +7 -0
- package/dist/roles/thinker/skills/khue.instantiate/.readme.md +14 -0
- package/dist/roles/thinker/skills/khue.instantiate/stepInstantiate.skill.js +1 -1
- package/dist/roles/thinker/skills/khue.instantiate/stepInstantiate.skill.js.map +1 -1
- package/dist/roles/thinker/skills/khue.instantiate/stepInstantiate.skill.ts +190 -0
- package/dist/roles/thinker/skills/khue.instantiate/stepInstantiate.ts +132 -0
- package/dist/roles/thinker/skills/khue.triage/.demo/laughs.v2025_08_18.i1.md +29 -0
- package/dist/roles/thinker/skills/khue.triage/.demo/user.journeys.v2025_08_17.i1.md +86 -0
- package/dist/roles/thinker/skills/khue.triage/.demo/user.journeys.v2025_08_17.i2.md +68 -0
- package/dist/roles/thinker/skills/khue.triage/.readme.md +0 -0
- package/dist/roles/thinker/skills/khue.triage/stepTriage.skill.js +1 -1
- package/dist/roles/thinker/skills/khue.triage/stepTriage.skill.js.map +1 -1
- package/dist/roles/thinker/skills/khue.triage/stepTriage.skill.ts +174 -0
- package/dist/roles/thinker/skills/khue.triage/stepTriage.ts +153 -0
- package/package.json +9 -7
- 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,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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"}
|