reviewflow 3.9.0 → 3.10.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/CHANGELOG.md +8 -0
- package/README.md +2 -0
- package/dist/config/projectConfig.d.ts +3 -5
- package/dist/config/projectConfig.d.ts.map +1 -1
- package/dist/config/projectConfig.js +19 -1
- package/dist/config/projectConfig.js.map +1 -1
- package/dist/entities/modelRouting/modelRouting.gateway.d.ts +5 -0
- package/dist/entities/modelRouting/modelRouting.gateway.d.ts.map +1 -0
- package/dist/entities/modelRouting/modelRouting.gateway.js +2 -0
- package/dist/entities/modelRouting/modelRouting.gateway.js.map +1 -0
- package/dist/entities/modelRouting/modelRouting.schema.d.ts +13 -0
- package/dist/entities/modelRouting/modelRouting.schema.d.ts.map +1 -0
- package/dist/entities/modelRouting/modelRouting.schema.js +7 -0
- package/dist/entities/modelRouting/modelRouting.schema.js.map +1 -0
- package/dist/entities/tokenUsage/tokenUsage.gateway.d.ts +6 -0
- package/dist/entities/tokenUsage/tokenUsage.gateway.d.ts.map +1 -0
- package/dist/entities/tokenUsage/tokenUsage.gateway.js +2 -0
- package/dist/entities/tokenUsage/tokenUsage.gateway.js.map +1 -0
- package/dist/entities/tokenUsage/tokenUsage.schema.d.ts +30 -0
- package/dist/entities/tokenUsage/tokenUsage.schema.d.ts.map +1 -0
- package/dist/entities/tokenUsage/tokenUsage.schema.js +19 -0
- package/dist/entities/tokenUsage/tokenUsage.schema.js.map +1 -0
- package/dist/frameworks/claude/claudeInvoker.d.ts +4 -0
- package/dist/frameworks/claude/claudeInvoker.d.ts.map +1 -1
- package/dist/frameworks/claude/claudeInvoker.js +86 -27
- package/dist/frameworks/claude/claudeInvoker.js.map +1 -1
- package/dist/frameworks/claude/streamJsonParser.d.ts +44 -0
- package/dist/frameworks/claude/streamJsonParser.d.ts.map +1 -0
- package/dist/frameworks/claude/streamJsonParser.js +96 -0
- package/dist/frameworks/claude/streamJsonParser.js.map +1 -0
- package/dist/frameworks/queue/pQueueAdapter.d.ts +2 -0
- package/dist/frameworks/queue/pQueueAdapter.d.ts.map +1 -1
- package/dist/frameworks/queue/pQueueAdapter.js.map +1 -1
- package/dist/frameworks/settings/runtimeSettings.d.ts +1 -1
- package/dist/frameworks/settings/runtimeSettings.d.ts.map +1 -1
- package/dist/frameworks/settings/runtimeSettings.js +1 -1
- package/dist/frameworks/settings/runtimeSettings.js.map +1 -1
- package/dist/interface-adapters/gateways/projectConfig/routingPolicy.projectConfig.gateway.d.ts +6 -0
- package/dist/interface-adapters/gateways/projectConfig/routingPolicy.projectConfig.gateway.d.ts.map +1 -0
- package/dist/interface-adapters/gateways/projectConfig/routingPolicy.projectConfig.gateway.js +8 -0
- package/dist/interface-adapters/gateways/projectConfig/routingPolicy.projectConfig.gateway.js.map +1 -0
- package/dist/interface-adapters/gateways/tokenUsage/tokenUsage.filesystem.gateway.d.ts +7 -0
- package/dist/interface-adapters/gateways/tokenUsage/tokenUsage.filesystem.gateway.d.ts.map +1 -0
- package/dist/interface-adapters/gateways/tokenUsage/tokenUsage.filesystem.gateway.js +37 -0
- package/dist/interface-adapters/gateways/tokenUsage/tokenUsage.filesystem.gateway.js.map +1 -0
- package/dist/tests/factories/routingPolicy.factory.d.ts +5 -0
- package/dist/tests/factories/routingPolicy.factory.d.ts.map +1 -0
- package/dist/tests/factories/routingPolicy.factory.js +10 -0
- package/dist/tests/factories/routingPolicy.factory.js.map +1 -0
- package/dist/tests/factories/tokenUsage.factory.d.ts +8 -0
- package/dist/tests/factories/tokenUsage.factory.d.ts.map +1 -0
- package/dist/tests/factories/tokenUsage.factory.js +28 -0
- package/dist/tests/factories/tokenUsage.factory.js.map +1 -0
- package/dist/tests/stubs/tokenUsage.stub.d.ts +11 -0
- package/dist/tests/stubs/tokenUsage.stub.d.ts.map +1 -0
- package/dist/tests/stubs/tokenUsage.stub.js +19 -0
- package/dist/tests/stubs/tokenUsage.stub.js.map +1 -0
- package/dist/tests/units/config/projectConfig.test.js +47 -0
- package/dist/tests/units/config/projectConfig.test.js.map +1 -1
- package/dist/tests/units/frameworks/claude/streamJsonParser.test.d.ts +2 -0
- package/dist/tests/units/frameworks/claude/streamJsonParser.test.d.ts.map +1 -0
- package/dist/tests/units/frameworks/claude/streamJsonParser.test.js +83 -0
- package/dist/tests/units/frameworks/claude/streamJsonParser.test.js.map +1 -0
- package/dist/tests/units/interface-adapters/gateways/projectConfig/routingPolicy.projectConfig.gateway.test.d.ts +2 -0
- package/dist/tests/units/interface-adapters/gateways/projectConfig/routingPolicy.projectConfig.gateway.test.d.ts.map +1 -0
- package/dist/tests/units/interface-adapters/gateways/projectConfig/routingPolicy.projectConfig.gateway.test.js +44 -0
- package/dist/tests/units/interface-adapters/gateways/projectConfig/routingPolicy.projectConfig.gateway.test.js.map +1 -0
- package/dist/tests/units/interface-adapters/gateways/tokenUsage/tokenUsage.filesystem.gateway.test.d.ts +2 -0
- package/dist/tests/units/interface-adapters/gateways/tokenUsage/tokenUsage.filesystem.gateway.test.d.ts.map +1 -0
- package/dist/tests/units/interface-adapters/gateways/tokenUsage/tokenUsage.filesystem.gateway.test.js +57 -0
- package/dist/tests/units/interface-adapters/gateways/tokenUsage/tokenUsage.filesystem.gateway.test.js.map +1 -0
- package/dist/tests/units/usecases/selectModelForReview/selectModelForReview.usecase.test.d.ts +2 -0
- package/dist/tests/units/usecases/selectModelForReview/selectModelForReview.usecase.test.d.ts.map +1 -0
- package/dist/tests/units/usecases/selectModelForReview/selectModelForReview.usecase.test.js +55 -0
- package/dist/tests/units/usecases/selectModelForReview/selectModelForReview.usecase.test.js.map +1 -0
- package/dist/tests/units/usecases/summarizeTokenUsage/summarizeTokenUsage.usecase.test.d.ts +2 -0
- package/dist/tests/units/usecases/summarizeTokenUsage/summarizeTokenUsage.usecase.test.d.ts.map +1 -0
- package/dist/tests/units/usecases/summarizeTokenUsage/summarizeTokenUsage.usecase.test.js +64 -0
- package/dist/tests/units/usecases/summarizeTokenUsage/summarizeTokenUsage.usecase.test.js.map +1 -0
- package/dist/tests/units/usecases/trackTokenUsage/trackTokenUsage.usecase.test.d.ts +2 -0
- package/dist/tests/units/usecases/trackTokenUsage/trackTokenUsage.usecase.test.d.ts.map +1 -0
- package/dist/tests/units/usecases/trackTokenUsage/trackTokenUsage.usecase.test.js +26 -0
- package/dist/tests/units/usecases/trackTokenUsage/trackTokenUsage.usecase.test.js.map +1 -0
- package/dist/usecases/selectModelForReview/selectModelForReview.usecase.d.ts +15 -0
- package/dist/usecases/selectModelForReview/selectModelForReview.usecase.d.ts.map +1 -0
- package/dist/usecases/selectModelForReview/selectModelForReview.usecase.js +16 -0
- package/dist/usecases/selectModelForReview/selectModelForReview.usecase.js.map +1 -0
- package/dist/usecases/summarizeTokenUsage/summarizeTokenUsage.usecase.d.ts +23 -0
- package/dist/usecases/summarizeTokenUsage/summarizeTokenUsage.usecase.d.ts.map +1 -0
- package/dist/usecases/summarizeTokenUsage/summarizeTokenUsage.usecase.js +38 -0
- package/dist/usecases/summarizeTokenUsage/summarizeTokenUsage.usecase.js.map +1 -0
- package/dist/usecases/trackTokenUsage/trackTokenUsage.usecase.d.ts +8 -0
- package/dist/usecases/trackTokenUsage/trackTokenUsage.usecase.d.ts.map +1 -0
- package/dist/usecases/trackTokenUsage/trackTokenUsage.usecase.js +10 -0
- package/dist/usecases/trackTokenUsage/trackTokenUsage.usecase.js.map +1 -0
- package/package.json +3 -3
- package/scripts/hooks/enforce-dependency-rule.sh +61 -0
- package/scripts/hooks/enforce-gateway-port-purity.sh +35 -0
- package/scripts/hooks/enforce-presenter-class.sh +34 -0
- package/scripts/hooks/tests/test-architecture-hooks.sh +163 -0
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
set -euo pipefail
|
|
3
|
+
|
|
4
|
+
# Tests for the 3 Clean Architecture enforcement hooks.
|
|
5
|
+
# Run: bash scripts/hooks/tests/test-architecture-hooks.sh
|
|
6
|
+
|
|
7
|
+
HOOK_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
|
8
|
+
PASSED=0
|
|
9
|
+
FAILED=0
|
|
10
|
+
TOTAL=0
|
|
11
|
+
|
|
12
|
+
green() { printf "\033[32m%s\033[0m\n" "$1"; }
|
|
13
|
+
red() { printf "\033[31m%s\033[0m\n" "$1"; }
|
|
14
|
+
bold() { printf "\033[1m%s\033[0m\n" "$1"; }
|
|
15
|
+
|
|
16
|
+
assert_exit() {
|
|
17
|
+
local name="$1" expected="$2" actual="$3"
|
|
18
|
+
TOTAL=$((TOTAL + 1))
|
|
19
|
+
if [[ "$actual" -eq "$expected" ]]; then
|
|
20
|
+
green " PASS: $name (exit $actual)"
|
|
21
|
+
PASSED=$((PASSED + 1))
|
|
22
|
+
else
|
|
23
|
+
red " FAIL: $name (expected exit $expected, got $actual)"
|
|
24
|
+
FAILED=$((FAILED + 1))
|
|
25
|
+
fi
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
payload() {
|
|
29
|
+
python3 -c "
|
|
30
|
+
import json, sys
|
|
31
|
+
print(json.dumps({'tool_input': {'file_path': sys.argv[1], 'content': sys.argv[2], 'new_string': ''}}))
|
|
32
|
+
" "$1" "$2"
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
# ─────────────────────────────────────────────────────────────
|
|
36
|
+
bold "=== enforce-dependency-rule.sh ==="
|
|
37
|
+
|
|
38
|
+
# Entity importing interface-adapters → blocked
|
|
39
|
+
EXIT=$(payload "/project/src/entities/foo/foo.gateway.ts" \
|
|
40
|
+
"import type { Bar } from '@/interface-adapters/gateways/bar.js'" \
|
|
41
|
+
| "$HOOK_DIR/enforce-dependency-rule.sh" > /dev/null 2>&1; echo $?) || true
|
|
42
|
+
assert_exit "entity cannot import interface-adapters" 2 "$EXIT"
|
|
43
|
+
|
|
44
|
+
# Entity importing usecases → blocked
|
|
45
|
+
EXIT=$(payload "/project/src/entities/foo/foo.ts" \
|
|
46
|
+
"import type { Usecase } from '@/usecases/something.usecase.js'" \
|
|
47
|
+
| "$HOOK_DIR/enforce-dependency-rule.sh" > /dev/null 2>&1; echo $?) || true
|
|
48
|
+
assert_exit "entity cannot import usecases" 2 "$EXIT"
|
|
49
|
+
|
|
50
|
+
# Entity importing frameworks → blocked
|
|
51
|
+
EXIT=$(payload "/project/src/entities/foo/foo.ts" \
|
|
52
|
+
"import type { Queue } from '@/frameworks/queue/pQueueAdapter.js'" \
|
|
53
|
+
| "$HOOK_DIR/enforce-dependency-rule.sh" > /dev/null 2>&1; echo $?) || true
|
|
54
|
+
assert_exit "entity cannot import frameworks" 2 "$EXIT"
|
|
55
|
+
|
|
56
|
+
# Entity importing within entities → allowed
|
|
57
|
+
EXIT=$(payload "/project/src/entities/foo/foo.ts" \
|
|
58
|
+
"import type { Bar } from '@/entities/bar/bar.js'" \
|
|
59
|
+
| "$HOOK_DIR/enforce-dependency-rule.sh" > /dev/null 2>&1; echo $?) || true
|
|
60
|
+
assert_exit "entity can import other entities" 0 "$EXIT"
|
|
61
|
+
|
|
62
|
+
# Usecase importing interface-adapters → blocked
|
|
63
|
+
EXIT=$(payload "/project/src/usecases/doSomething.usecase.ts" \
|
|
64
|
+
"import type { SomeGateway } from '@/interface-adapters/gateways/some.gateway.js'" \
|
|
65
|
+
| "$HOOK_DIR/enforce-dependency-rule.sh" > /dev/null 2>&1; echo $?) || true
|
|
66
|
+
assert_exit "usecase cannot import interface-adapters" 2 "$EXIT"
|
|
67
|
+
|
|
68
|
+
# Usecase importing frameworks → blocked
|
|
69
|
+
EXIT=$(payload "/project/src/usecases/doSomething.usecase.ts" \
|
|
70
|
+
"import type { ReviewJob } from '@/frameworks/queue/pQueueAdapter.js'" \
|
|
71
|
+
| "$HOOK_DIR/enforce-dependency-rule.sh" > /dev/null 2>&1; echo $?) || true
|
|
72
|
+
assert_exit "usecase cannot import frameworks" 2 "$EXIT"
|
|
73
|
+
|
|
74
|
+
# Usecase importing entities (valid) → allowed
|
|
75
|
+
EXIT=$(payload "/project/src/usecases/doSomething.usecase.ts" \
|
|
76
|
+
"import type { ReviewContextGateway } from '@/entities/reviewContext/reviewContext.gateway.js'" \
|
|
77
|
+
| "$HOOK_DIR/enforce-dependency-rule.sh" > /dev/null 2>&1; echo $?) || true
|
|
78
|
+
assert_exit "usecase can import entities" 0 "$EXIT"
|
|
79
|
+
|
|
80
|
+
# File outside src/ → always allowed
|
|
81
|
+
EXIT=$(payload "/project/scripts/build.ts" \
|
|
82
|
+
"import type { Foo } from '@/interface-adapters/gateways/foo.js'" \
|
|
83
|
+
| "$HOOK_DIR/enforce-dependency-rule.sh" > /dev/null 2>&1; echo $?) || true
|
|
84
|
+
assert_exit "non-src file always allowed" 0 "$EXIT"
|
|
85
|
+
|
|
86
|
+
# ─────────────────────────────────────────────────────────────
|
|
87
|
+
bold "=== enforce-gateway-port-purity.sh ==="
|
|
88
|
+
|
|
89
|
+
# Entity gateway with interface → allowed
|
|
90
|
+
EXIT=$(payload "/project/src/entities/review/reviewContext.gateway.ts" \
|
|
91
|
+
"export interface ReviewContextGateway { create(): void }" \
|
|
92
|
+
| "$HOOK_DIR/enforce-gateway-port-purity.sh" > /dev/null 2>&1; echo $?) || true
|
|
93
|
+
assert_exit "entity gateway with interface is allowed" 0 "$EXIT"
|
|
94
|
+
|
|
95
|
+
# Entity gateway with abstract class → allowed
|
|
96
|
+
EXIT=$(payload "/project/src/entities/review/reviewContext.gateway.ts" \
|
|
97
|
+
"export abstract class ReviewContextGateway { abstract create(): void }" \
|
|
98
|
+
| "$HOOK_DIR/enforce-gateway-port-purity.sh" > /dev/null 2>&1; echo $?) || true
|
|
99
|
+
assert_exit "entity gateway with abstract class is allowed" 0 "$EXIT"
|
|
100
|
+
|
|
101
|
+
# Entity gateway with plain class → blocked
|
|
102
|
+
EXIT=$(payload "/project/src/entities/review/reviewContext.gateway.ts" \
|
|
103
|
+
"export class ReviewContextGateway { create(): void {} }" \
|
|
104
|
+
| "$HOOK_DIR/enforce-gateway-port-purity.sh" > /dev/null 2>&1; echo $?) || true
|
|
105
|
+
assert_exit "entity gateway with plain class is blocked" 2 "$EXIT"
|
|
106
|
+
|
|
107
|
+
# Implementation in interface-adapters with plain class → allowed (not in entities/)
|
|
108
|
+
EXIT=$(payload "/project/src/interface-adapters/gateways/reviewContext.fileSystem.gateway.ts" \
|
|
109
|
+
"export class ReviewContextFileSystemGateway implements ReviewContextGateway {}" \
|
|
110
|
+
| "$HOOK_DIR/enforce-gateway-port-purity.sh" > /dev/null 2>&1; echo $?) || true
|
|
111
|
+
assert_exit "gateway impl in interface-adapters with plain class is allowed" 0 "$EXIT"
|
|
112
|
+
|
|
113
|
+
# Non-gateway entity file → not checked
|
|
114
|
+
EXIT=$(payload "/project/src/entities/review/reviewContext.ts" \
|
|
115
|
+
"export class ReviewContext { private constructor() {} }" \
|
|
116
|
+
| "$HOOK_DIR/enforce-gateway-port-purity.sh" > /dev/null 2>&1; echo $?) || true
|
|
117
|
+
assert_exit "non-gateway entity file not checked" 0 "$EXIT"
|
|
118
|
+
|
|
119
|
+
# ─────────────────────────────────────────────────────────────
|
|
120
|
+
bold "=== enforce-presenter-class.sh ==="
|
|
121
|
+
|
|
122
|
+
# Presenter with class ending in Presenter → allowed
|
|
123
|
+
EXIT=$(payload "/project/src/interface-adapters/presenters/jobStatus.presenter.ts" \
|
|
124
|
+
"export class JobStatusPresenter { present(input: unknown) { return {} } }" \
|
|
125
|
+
| "$HOOK_DIR/enforce-presenter-class.sh" > /dev/null 2>&1; echo $?) || true
|
|
126
|
+
assert_exit "presenter class *Presenter is allowed" 0 "$EXIT"
|
|
127
|
+
|
|
128
|
+
# Presenter with class ending in Calculator → allowed
|
|
129
|
+
EXIT=$(payload "/project/src/interface-adapters/presenters/score.presenter.ts" \
|
|
130
|
+
"export class ScoreCalculator { compute(input: unknown) { return 0 } }" \
|
|
131
|
+
| "$HOOK_DIR/enforce-presenter-class.sh" > /dev/null 2>&1; echo $?) || true
|
|
132
|
+
assert_exit "presenter class *Calculator is allowed" 0 "$EXIT"
|
|
133
|
+
|
|
134
|
+
# Presenter with function export → blocked
|
|
135
|
+
EXIT=$(payload "/project/src/interface-adapters/presenters/jobStatus.presenter.ts" \
|
|
136
|
+
"export function presentJobStatus(input: unknown) { return {} }" \
|
|
137
|
+
| "$HOOK_DIR/enforce-presenter-class.sh" > /dev/null 2>&1; echo $?) || true
|
|
138
|
+
assert_exit "presenter function export is blocked" 2 "$EXIT"
|
|
139
|
+
|
|
140
|
+
# Non-presenter .ts file → not checked
|
|
141
|
+
EXIT=$(payload "/project/src/interface-adapters/controllers/webhook.controller.ts" \
|
|
142
|
+
"export function handleWebhook() {}" \
|
|
143
|
+
| "$HOOK_DIR/enforce-presenter-class.sh" > /dev/null 2>&1; echo $?) || true
|
|
144
|
+
assert_exit "non-presenter file not checked" 0 "$EXIT"
|
|
145
|
+
|
|
146
|
+
# presenter.ts outside interface-adapters/presenters/ → not checked
|
|
147
|
+
EXIT=$(payload "/project/src/entities/foo/foo.presenter.ts" \
|
|
148
|
+
"export function fooPresenter() {}" \
|
|
149
|
+
| "$HOOK_DIR/enforce-presenter-class.sh" > /dev/null 2>&1; echo $?) || true
|
|
150
|
+
assert_exit "presenter outside interface-adapters/presenters/ not checked" 0 "$EXIT"
|
|
151
|
+
|
|
152
|
+
# ─────────────────────────────────────────────────────────────
|
|
153
|
+
echo ""
|
|
154
|
+
bold "=== RESULTS ==="
|
|
155
|
+
echo "Total: $TOTAL | Passed: $PASSED | Failed: $FAILED"
|
|
156
|
+
|
|
157
|
+
if [[ "$FAILED" -gt 0 ]]; then
|
|
158
|
+
red "SOME TESTS FAILED"
|
|
159
|
+
exit 1
|
|
160
|
+
else
|
|
161
|
+
green "ALL TESTS PASSED"
|
|
162
|
+
exit 0
|
|
163
|
+
fi
|