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.
Files changed (100) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/README.md +2 -0
  3. package/dist/config/projectConfig.d.ts +3 -5
  4. package/dist/config/projectConfig.d.ts.map +1 -1
  5. package/dist/config/projectConfig.js +19 -1
  6. package/dist/config/projectConfig.js.map +1 -1
  7. package/dist/entities/modelRouting/modelRouting.gateway.d.ts +5 -0
  8. package/dist/entities/modelRouting/modelRouting.gateway.d.ts.map +1 -0
  9. package/dist/entities/modelRouting/modelRouting.gateway.js +2 -0
  10. package/dist/entities/modelRouting/modelRouting.gateway.js.map +1 -0
  11. package/dist/entities/modelRouting/modelRouting.schema.d.ts +13 -0
  12. package/dist/entities/modelRouting/modelRouting.schema.d.ts.map +1 -0
  13. package/dist/entities/modelRouting/modelRouting.schema.js +7 -0
  14. package/dist/entities/modelRouting/modelRouting.schema.js.map +1 -0
  15. package/dist/entities/tokenUsage/tokenUsage.gateway.d.ts +6 -0
  16. package/dist/entities/tokenUsage/tokenUsage.gateway.d.ts.map +1 -0
  17. package/dist/entities/tokenUsage/tokenUsage.gateway.js +2 -0
  18. package/dist/entities/tokenUsage/tokenUsage.gateway.js.map +1 -0
  19. package/dist/entities/tokenUsage/tokenUsage.schema.d.ts +30 -0
  20. package/dist/entities/tokenUsage/tokenUsage.schema.d.ts.map +1 -0
  21. package/dist/entities/tokenUsage/tokenUsage.schema.js +19 -0
  22. package/dist/entities/tokenUsage/tokenUsage.schema.js.map +1 -0
  23. package/dist/frameworks/claude/claudeInvoker.d.ts +4 -0
  24. package/dist/frameworks/claude/claudeInvoker.d.ts.map +1 -1
  25. package/dist/frameworks/claude/claudeInvoker.js +86 -27
  26. package/dist/frameworks/claude/claudeInvoker.js.map +1 -1
  27. package/dist/frameworks/claude/streamJsonParser.d.ts +44 -0
  28. package/dist/frameworks/claude/streamJsonParser.d.ts.map +1 -0
  29. package/dist/frameworks/claude/streamJsonParser.js +96 -0
  30. package/dist/frameworks/claude/streamJsonParser.js.map +1 -0
  31. package/dist/frameworks/queue/pQueueAdapter.d.ts +2 -0
  32. package/dist/frameworks/queue/pQueueAdapter.d.ts.map +1 -1
  33. package/dist/frameworks/queue/pQueueAdapter.js.map +1 -1
  34. package/dist/frameworks/settings/runtimeSettings.d.ts +1 -1
  35. package/dist/frameworks/settings/runtimeSettings.d.ts.map +1 -1
  36. package/dist/frameworks/settings/runtimeSettings.js +1 -1
  37. package/dist/frameworks/settings/runtimeSettings.js.map +1 -1
  38. package/dist/interface-adapters/gateways/projectConfig/routingPolicy.projectConfig.gateway.d.ts +6 -0
  39. package/dist/interface-adapters/gateways/projectConfig/routingPolicy.projectConfig.gateway.d.ts.map +1 -0
  40. package/dist/interface-adapters/gateways/projectConfig/routingPolicy.projectConfig.gateway.js +8 -0
  41. package/dist/interface-adapters/gateways/projectConfig/routingPolicy.projectConfig.gateway.js.map +1 -0
  42. package/dist/interface-adapters/gateways/tokenUsage/tokenUsage.filesystem.gateway.d.ts +7 -0
  43. package/dist/interface-adapters/gateways/tokenUsage/tokenUsage.filesystem.gateway.d.ts.map +1 -0
  44. package/dist/interface-adapters/gateways/tokenUsage/tokenUsage.filesystem.gateway.js +37 -0
  45. package/dist/interface-adapters/gateways/tokenUsage/tokenUsage.filesystem.gateway.js.map +1 -0
  46. package/dist/tests/factories/routingPolicy.factory.d.ts +5 -0
  47. package/dist/tests/factories/routingPolicy.factory.d.ts.map +1 -0
  48. package/dist/tests/factories/routingPolicy.factory.js +10 -0
  49. package/dist/tests/factories/routingPolicy.factory.js.map +1 -0
  50. package/dist/tests/factories/tokenUsage.factory.d.ts +8 -0
  51. package/dist/tests/factories/tokenUsage.factory.d.ts.map +1 -0
  52. package/dist/tests/factories/tokenUsage.factory.js +28 -0
  53. package/dist/tests/factories/tokenUsage.factory.js.map +1 -0
  54. package/dist/tests/stubs/tokenUsage.stub.d.ts +11 -0
  55. package/dist/tests/stubs/tokenUsage.stub.d.ts.map +1 -0
  56. package/dist/tests/stubs/tokenUsage.stub.js +19 -0
  57. package/dist/tests/stubs/tokenUsage.stub.js.map +1 -0
  58. package/dist/tests/units/config/projectConfig.test.js +47 -0
  59. package/dist/tests/units/config/projectConfig.test.js.map +1 -1
  60. package/dist/tests/units/frameworks/claude/streamJsonParser.test.d.ts +2 -0
  61. package/dist/tests/units/frameworks/claude/streamJsonParser.test.d.ts.map +1 -0
  62. package/dist/tests/units/frameworks/claude/streamJsonParser.test.js +83 -0
  63. package/dist/tests/units/frameworks/claude/streamJsonParser.test.js.map +1 -0
  64. package/dist/tests/units/interface-adapters/gateways/projectConfig/routingPolicy.projectConfig.gateway.test.d.ts +2 -0
  65. package/dist/tests/units/interface-adapters/gateways/projectConfig/routingPolicy.projectConfig.gateway.test.d.ts.map +1 -0
  66. package/dist/tests/units/interface-adapters/gateways/projectConfig/routingPolicy.projectConfig.gateway.test.js +44 -0
  67. package/dist/tests/units/interface-adapters/gateways/projectConfig/routingPolicy.projectConfig.gateway.test.js.map +1 -0
  68. package/dist/tests/units/interface-adapters/gateways/tokenUsage/tokenUsage.filesystem.gateway.test.d.ts +2 -0
  69. package/dist/tests/units/interface-adapters/gateways/tokenUsage/tokenUsage.filesystem.gateway.test.d.ts.map +1 -0
  70. package/dist/tests/units/interface-adapters/gateways/tokenUsage/tokenUsage.filesystem.gateway.test.js +57 -0
  71. package/dist/tests/units/interface-adapters/gateways/tokenUsage/tokenUsage.filesystem.gateway.test.js.map +1 -0
  72. package/dist/tests/units/usecases/selectModelForReview/selectModelForReview.usecase.test.d.ts +2 -0
  73. package/dist/tests/units/usecases/selectModelForReview/selectModelForReview.usecase.test.d.ts.map +1 -0
  74. package/dist/tests/units/usecases/selectModelForReview/selectModelForReview.usecase.test.js +55 -0
  75. package/dist/tests/units/usecases/selectModelForReview/selectModelForReview.usecase.test.js.map +1 -0
  76. package/dist/tests/units/usecases/summarizeTokenUsage/summarizeTokenUsage.usecase.test.d.ts +2 -0
  77. package/dist/tests/units/usecases/summarizeTokenUsage/summarizeTokenUsage.usecase.test.d.ts.map +1 -0
  78. package/dist/tests/units/usecases/summarizeTokenUsage/summarizeTokenUsage.usecase.test.js +64 -0
  79. package/dist/tests/units/usecases/summarizeTokenUsage/summarizeTokenUsage.usecase.test.js.map +1 -0
  80. package/dist/tests/units/usecases/trackTokenUsage/trackTokenUsage.usecase.test.d.ts +2 -0
  81. package/dist/tests/units/usecases/trackTokenUsage/trackTokenUsage.usecase.test.d.ts.map +1 -0
  82. package/dist/tests/units/usecases/trackTokenUsage/trackTokenUsage.usecase.test.js +26 -0
  83. package/dist/tests/units/usecases/trackTokenUsage/trackTokenUsage.usecase.test.js.map +1 -0
  84. package/dist/usecases/selectModelForReview/selectModelForReview.usecase.d.ts +15 -0
  85. package/dist/usecases/selectModelForReview/selectModelForReview.usecase.d.ts.map +1 -0
  86. package/dist/usecases/selectModelForReview/selectModelForReview.usecase.js +16 -0
  87. package/dist/usecases/selectModelForReview/selectModelForReview.usecase.js.map +1 -0
  88. package/dist/usecases/summarizeTokenUsage/summarizeTokenUsage.usecase.d.ts +23 -0
  89. package/dist/usecases/summarizeTokenUsage/summarizeTokenUsage.usecase.d.ts.map +1 -0
  90. package/dist/usecases/summarizeTokenUsage/summarizeTokenUsage.usecase.js +38 -0
  91. package/dist/usecases/summarizeTokenUsage/summarizeTokenUsage.usecase.js.map +1 -0
  92. package/dist/usecases/trackTokenUsage/trackTokenUsage.usecase.d.ts +8 -0
  93. package/dist/usecases/trackTokenUsage/trackTokenUsage.usecase.d.ts.map +1 -0
  94. package/dist/usecases/trackTokenUsage/trackTokenUsage.usecase.js +10 -0
  95. package/dist/usecases/trackTokenUsage/trackTokenUsage.usecase.js.map +1 -0
  96. package/package.json +3 -3
  97. package/scripts/hooks/enforce-dependency-rule.sh +61 -0
  98. package/scripts/hooks/enforce-gateway-port-purity.sh +35 -0
  99. package/scripts/hooks/enforce-presenter-class.sh +34 -0
  100. 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