prism-pr 1.0.0-alpha.65 → 1.0.0-alpha.68

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 (251) hide show
  1. package/README.md +274 -55
  2. package/bin/run.js +17 -17
  3. package/dist/ai/adapters/model-provider-llm-adapter.d.ts +21 -0
  4. package/dist/ai/adapters/model-provider-llm-adapter.d.ts.map +1 -0
  5. package/dist/ai/adapters/model-provider-llm-adapter.js +58 -0
  6. package/dist/ai/adapters/model-provider-llm-adapter.js.map +1 -0
  7. package/dist/ai/agents/framework-rules/index.d.ts.map +1 -1
  8. package/dist/ai/agents/framework-rules/index.js +21 -0
  9. package/dist/ai/agents/framework-rules/index.js.map +1 -1
  10. package/dist/ai/agents/prompts/architecture-reviewer.txt +39 -39
  11. package/dist/ai/agents/prompts/config-reviewer.txt +47 -47
  12. package/dist/ai/agents/prompts/csharp-reviewer.txt +39 -39
  13. package/dist/ai/agents/prompts/css-reviewer.txt +41 -41
  14. package/dist/ai/agents/prompts/html-reviewer.txt +52 -43
  15. package/dist/ai/agents/prompts/performance-reviewer.txt +38 -38
  16. package/dist/ai/agents/prompts/security-reviewer.txt +36 -36
  17. package/dist/ai/agents/prompts/sql-reviewer.txt +43 -43
  18. package/dist/ai/agents/prompts/testing-reviewer.txt +38 -38
  19. package/dist/ai/agents/prompts/ts-reviewer.txt +4 -0
  20. package/dist/ai/agents/prompts/ux-text-reviewer.txt +68 -68
  21. package/dist/ai/agents/shared/finding-schema.d.ts +3 -0
  22. package/dist/ai/agents/shared/finding-schema.d.ts.map +1 -1
  23. package/dist/ai/agents/shared/finding-schema.js +3 -3
  24. package/dist/ai/agents/shared/finding-schema.js.map +1 -1
  25. package/dist/ai/providers/anthropic-provider.js +1 -1
  26. package/dist/ai/providers/anthropic-provider.js.map +1 -1
  27. package/dist/bitbucket/client.d.ts +1 -0
  28. package/dist/bitbucket/client.d.ts.map +1 -1
  29. package/dist/bitbucket/client.js +21 -0
  30. package/dist/bitbucket/client.js.map +1 -1
  31. package/dist/commands/guard/check.d.ts +3 -0
  32. package/dist/commands/guard/check.d.ts.map +1 -1
  33. package/dist/commands/guard/check.js +205 -24
  34. package/dist/commands/guard/check.js.map +1 -1
  35. package/dist/commands/review/start.d.ts +1 -0
  36. package/dist/commands/review/start.d.ts.map +1 -1
  37. package/dist/commands/review/start.js +38 -3
  38. package/dist/commands/review/start.js.map +1 -1
  39. package/dist/commands/rules/bootstrap.d.ts.map +1 -1
  40. package/dist/commands/rules/bootstrap.js +36 -1
  41. package/dist/commands/rules/bootstrap.js.map +1 -1
  42. package/dist/commands/rules/push.d.ts.map +1 -1
  43. package/dist/commands/rules/push.js +1 -1
  44. package/dist/commands/rules/push.js.map +1 -1
  45. package/dist/commands/rules/sync.d.ts.map +1 -1
  46. package/dist/commands/rules/sync.js +1 -1
  47. package/dist/commands/rules/sync.js.map +1 -1
  48. package/dist/config/config-manager.js +1 -1
  49. package/dist/config/config-manager.js.map +1 -1
  50. package/dist/core/review-workflow.d.ts +2 -0
  51. package/dist/core/review-workflow.d.ts.map +1 -1
  52. package/dist/core/review-workflow.js.map +1 -1
  53. package/dist/core/workflow-engine.d.ts +2 -0
  54. package/dist/core/workflow-engine.d.ts.map +1 -1
  55. package/dist/core/workflow-engine.js +16 -0
  56. package/dist/core/workflow-engine.js.map +1 -1
  57. package/dist/guard/auto-bootstrap.d.ts +18 -0
  58. package/dist/guard/auto-bootstrap.d.ts.map +1 -0
  59. package/dist/guard/auto-bootstrap.js +19 -0
  60. package/dist/guard/auto-bootstrap.js.map +1 -0
  61. package/dist/guard/feedback-service.d.ts +34 -0
  62. package/dist/guard/feedback-service.d.ts.map +1 -0
  63. package/dist/guard/feedback-service.js +82 -0
  64. package/dist/guard/feedback-service.js.map +1 -0
  65. package/dist/guard/guard-match-aggregator.d.ts +16 -0
  66. package/dist/guard/guard-match-aggregator.d.ts.map +1 -0
  67. package/dist/guard/guard-match-aggregator.js +79 -0
  68. package/dist/guard/guard-match-aggregator.js.map +1 -0
  69. package/dist/guard/patterns-loader.js +1 -1
  70. package/dist/guard/patterns-loader.js.map +1 -1
  71. package/dist/guard/review-findings-aggregator.d.ts +38 -0
  72. package/dist/guard/review-findings-aggregator.d.ts.map +1 -0
  73. package/dist/guard/review-findings-aggregator.js +114 -0
  74. package/dist/guard/review-findings-aggregator.js.map +1 -0
  75. package/dist/guard/types.d.ts +1 -1
  76. package/dist/guard/types.d.ts.map +1 -1
  77. package/dist/persistence/database.js +4 -4
  78. package/dist/persistence/migrations/0001_phase3a_schema.sql +15 -15
  79. package/dist/persistence/migrations/0004_review_memory.sql +24 -24
  80. package/dist/persistence/migrations/0005_pattern_feedback.sql +16 -0
  81. package/dist/persistence/migrations/20260401141055_peaceful_blur/migration.sql +66 -66
  82. package/dist/persistence/migrations/20260401141055_peaceful_blur/snapshot.json +467 -467
  83. package/dist/persistence/migrations/meta/0000_snapshot.json +467 -467
  84. package/dist/persistence/migrations/meta/_journal.json +7 -0
  85. package/dist/persistence/pattern-feedback-repository.d.ts +59 -0
  86. package/dist/persistence/pattern-feedback-repository.d.ts.map +1 -0
  87. package/dist/persistence/pattern-feedback-repository.js +116 -0
  88. package/dist/persistence/pattern-feedback-repository.js.map +1 -0
  89. package/dist/persistence/schema.d.ts +199 -0
  90. package/dist/persistence/schema.d.ts.map +1 -1
  91. package/dist/persistence/schema.js +17 -0
  92. package/dist/persistence/schema.js.map +1 -1
  93. package/dist/rule-catalog/ag-grid/base.d.ts.map +1 -1
  94. package/dist/rule-catalog/ag-grid/base.js +1 -0
  95. package/dist/rule-catalog/ag-grid/base.js.map +1 -1
  96. package/dist/rule-catalog/ag-grid/v32.d.ts.map +1 -1
  97. package/dist/rule-catalog/ag-grid/v32.js +1 -0
  98. package/dist/rule-catalog/ag-grid/v32.js.map +1 -1
  99. package/dist/rule-catalog/angular/base.d.ts.map +1 -1
  100. package/dist/rule-catalog/angular/base.js +117 -1
  101. package/dist/rule-catalog/angular/base.js.map +1 -1
  102. package/dist/rule-catalog/angular/v17.d.ts.map +1 -1
  103. package/dist/rule-catalog/angular/v17.js +1 -0
  104. package/dist/rule-catalog/angular/v17.js.map +1 -1
  105. package/dist/rule-catalog/angular/v2.d.ts +3 -0
  106. package/dist/rule-catalog/angular/v2.d.ts.map +1 -0
  107. package/dist/rule-catalog/angular/v2.js +44 -0
  108. package/dist/rule-catalog/angular/v2.js.map +1 -0
  109. package/dist/rule-catalog/index.d.ts.map +1 -1
  110. package/dist/rule-catalog/index.js +2 -0
  111. package/dist/rule-catalog/index.js.map +1 -1
  112. package/dist/rule-catalog/nestjs/base.d.ts.map +1 -1
  113. package/dist/rule-catalog/nestjs/base.js +1 -0
  114. package/dist/rule-catalog/nestjs/base.js.map +1 -1
  115. package/dist/rule-catalog/react/base.d.ts.map +1 -1
  116. package/dist/rule-catalog/react/base.js +1 -0
  117. package/dist/rule-catalog/react/base.js.map +1 -1
  118. package/dist/rule-catalog/ruleset-mapper.d.ts +11 -0
  119. package/dist/rule-catalog/ruleset-mapper.d.ts.map +1 -1
  120. package/dist/rule-catalog/ruleset-mapper.js +32 -0
  121. package/dist/rule-catalog/ruleset-mapper.js.map +1 -1
  122. package/dist/rule-catalog/shared/general.d.ts.map +1 -1
  123. package/dist/rule-catalog/shared/general.js +130 -0
  124. package/dist/rule-catalog/shared/general.js.map +1 -1
  125. package/dist/rule-catalog/shared/security.d.ts.map +1 -1
  126. package/dist/rule-catalog/shared/security.js +11 -2
  127. package/dist/rule-catalog/shared/security.js.map +1 -1
  128. package/dist/rule-catalog/shared/typescript.d.ts.map +1 -1
  129. package/dist/rule-catalog/shared/typescript.js +4 -3
  130. package/dist/rule-catalog/shared/typescript.js.map +1 -1
  131. package/dist/rule-catalog/types.d.ts +1 -0
  132. package/dist/rule-catalog/types.d.ts.map +1 -1
  133. package/dist/rules-engine/pattern-generator.d.ts +22 -1
  134. package/dist/rules-engine/pattern-generator.d.ts.map +1 -1
  135. package/dist/rules-engine/pattern-generator.js +26 -8
  136. package/dist/rules-engine/pattern-generator.js.map +1 -1
  137. package/dist/rules-engine/types.d.ts +5 -0
  138. package/dist/rules-engine/types.d.ts.map +1 -1
  139. package/dist/rules-engine/types.js.map +1 -1
  140. package/dist/rules-repo/constants.d.ts +14 -0
  141. package/dist/rules-repo/constants.d.ts.map +1 -0
  142. package/dist/rules-repo/constants.js +16 -0
  143. package/dist/rules-repo/constants.js.map +1 -0
  144. package/dist/rules-repo/manifest-refresh.d.ts +45 -0
  145. package/dist/rules-repo/manifest-refresh.d.ts.map +1 -0
  146. package/dist/rules-repo/manifest-refresh.js +123 -0
  147. package/dist/rules-repo/manifest-refresh.js.map +1 -0
  148. package/dist/rules-repo/manifest-resolver.d.ts +2 -1
  149. package/dist/rules-repo/manifest-resolver.d.ts.map +1 -1
  150. package/dist/rules-repo/manifest-resolver.js +20 -5
  151. package/dist/rules-repo/manifest-resolver.js.map +1 -1
  152. package/dist/rules-repo/manifest-types.d.ts +43 -1
  153. package/dist/rules-repo/manifest-types.d.ts.map +1 -1
  154. package/dist/rules-repo/manifest-types.js +26 -1
  155. package/dist/rules-repo/manifest-types.js.map +1 -1
  156. package/dist/rules-repo/rules-cache.d.ts +13 -1
  157. package/dist/rules-repo/rules-cache.d.ts.map +1 -1
  158. package/dist/rules-repo/rules-cache.js +75 -0
  159. package/dist/rules-repo/rules-cache.js.map +1 -1
  160. package/dist/rules-repo/rules-repo-client.d.ts +35 -4
  161. package/dist/rules-repo/rules-repo-client.d.ts.map +1 -1
  162. package/dist/rules-repo/rules-repo-client.js +135 -9
  163. package/dist/rules-repo/rules-repo-client.js.map +1 -1
  164. package/dist/rules-repo/types.d.ts +3 -0
  165. package/dist/rules-repo/types.d.ts.map +1 -1
  166. package/dist/rules-repo/types.js.map +1 -1
  167. package/dist/tui/components/app-header.js +2 -2
  168. package/dist/tui/components/searchable-list.d.ts +2 -1
  169. package/dist/tui/components/searchable-list.d.ts.map +1 -1
  170. package/dist/tui/components/searchable-list.js +3 -1
  171. package/dist/tui/components/searchable-list.js.map +1 -1
  172. package/dist/tui/deps-context.d.ts +6 -0
  173. package/dist/tui/deps-context.d.ts.map +1 -1
  174. package/dist/tui/deps-context.js.map +1 -1
  175. package/dist/tui/hooks/use-session.d.ts +4 -4
  176. package/dist/tui/hooks/use-suggest-rules.d.ts +30 -0
  177. package/dist/tui/hooks/use-suggest-rules.d.ts.map +1 -0
  178. package/dist/tui/hooks/use-suggest-rules.js +78 -0
  179. package/dist/tui/hooks/use-suggest-rules.js.map +1 -0
  180. package/dist/tui/screen-router.d.ts.map +1 -1
  181. package/dist/tui/screen-router.js +6 -0
  182. package/dist/tui/screen-router.js.map +1 -1
  183. package/dist/tui/screens/bootstrap-running.d.ts +3 -0
  184. package/dist/tui/screens/bootstrap-running.d.ts.map +1 -0
  185. package/dist/tui/screens/bootstrap-running.js +180 -0
  186. package/dist/tui/screens/bootstrap-running.js.map +1 -0
  187. package/dist/tui/screens/finding-detail.d.ts.map +1 -1
  188. package/dist/tui/screens/finding-detail.js +17 -0
  189. package/dist/tui/screens/finding-detail.js.map +1 -1
  190. package/dist/tui/screens/findings-list.d.ts.map +1 -1
  191. package/dist/tui/screens/findings-list.js +28 -2
  192. package/dist/tui/screens/findings-list.js.map +1 -1
  193. package/dist/tui/screens/guard-detail.d.ts.map +1 -1
  194. package/dist/tui/screens/guard-detail.js +48 -4
  195. package/dist/tui/screens/guard-detail.js.map +1 -1
  196. package/dist/tui/screens/guard-home.d.ts.map +1 -1
  197. package/dist/tui/screens/guard-home.js +28 -8
  198. package/dist/tui/screens/guard-home.js.map +1 -1
  199. package/dist/tui/screens/guard-results.d.ts.map +1 -1
  200. package/dist/tui/screens/guard-results.js +133 -4
  201. package/dist/tui/screens/guard-results.js.map +1 -1
  202. package/dist/tui/screens/guard-running.d.ts.map +1 -1
  203. package/dist/tui/screens/guard-running.js +116 -5
  204. package/dist/tui/screens/guard-running.js.map +1 -1
  205. package/dist/tui/screens/home.d.ts.map +1 -1
  206. package/dist/tui/screens/home.js +27 -2
  207. package/dist/tui/screens/home.js.map +1 -1
  208. package/dist/tui/screens/repo-select.d.ts.map +1 -1
  209. package/dist/tui/screens/repo-select.js +3 -0
  210. package/dist/tui/screens/repo-select.js.map +1 -1
  211. package/dist/tui/screens/review-running.js +1 -1
  212. package/dist/tui/screens/review-running.js.map +1 -1
  213. package/dist/tui/screens/rule-suggestions.d.ts +3 -0
  214. package/dist/tui/screens/rule-suggestions.d.ts.map +1 -0
  215. package/dist/tui/screens/rule-suggestions.js +121 -0
  216. package/dist/tui/screens/rule-suggestions.js.map +1 -0
  217. package/dist/tui/state/router-reducer.d.ts +1 -1
  218. package/dist/tui/state/router-reducer.d.ts.map +1 -1
  219. package/dist/tui/state/router-reducer.js.map +1 -1
  220. package/dist/tui/state/tui-reducer.d.ts +66 -3
  221. package/dist/tui/state/tui-reducer.d.ts.map +1 -1
  222. package/dist/tui/state/tui-reducer.js +98 -0
  223. package/dist/tui/state/tui-reducer.js.map +1 -1
  224. package/dist/tui/types/bootstrap-options.d.ts +10 -0
  225. package/dist/tui/types/bootstrap-options.d.ts.map +1 -0
  226. package/dist/tui/types/bootstrap-options.js +19 -0
  227. package/dist/tui/types/bootstrap-options.js.map +1 -0
  228. package/dist/tui/types/guard-options.d.ts +17 -0
  229. package/dist/tui/types/guard-options.d.ts.map +1 -0
  230. package/dist/tui/types/guard-options.js +36 -0
  231. package/dist/tui/types/guard-options.js.map +1 -0
  232. package/dist/types/repo-config.d.ts +8 -8
  233. package/dist/utils/summary-generator.d.ts +1 -0
  234. package/dist/utils/summary-generator.d.ts.map +1 -1
  235. package/dist/utils/summary-generator.js +12 -6
  236. package/dist/utils/summary-generator.js.map +1 -1
  237. package/oclif.manifest.json +28 -3
  238. package/package.json +24 -2
  239. package/dist/memory/engram-client.d.ts +0 -15
  240. package/dist/memory/engram-client.d.ts.map +0 -1
  241. package/dist/memory/engram-client.js +0 -167
  242. package/dist/memory/engram-client.js.map +0 -1
  243. package/dist/persistence/migrations/0000_peaceful_blur.sql +0 -66
  244. package/dist/tui/components/status-bar.d.ts +0 -10
  245. package/dist/tui/components/status-bar.d.ts.map +0 -1
  246. package/dist/tui/components/status-bar.js +0 -7
  247. package/dist/tui/components/status-bar.js.map +0 -1
  248. package/dist/types/engram.d.ts +0 -29
  249. package/dist/types/engram.d.ts.map +0 -1
  250. package/dist/types/engram.js +0 -2
  251. package/dist/types/engram.js.map +0 -1
package/README.md CHANGED
@@ -1,6 +1,8 @@
1
1
  # PRISM-PR
2
2
 
3
- Intelligent Pull Request review orchestrator for Bitbucket. AI-powered code review with pattern-based pre-checks using ast-grep structural matching.
3
+ > **Alpha** this package is in active development (`1.0.0-alpha`). APIs and commands may change between releases.
4
+
5
+ Intelligent Pull Request review orchestrator for Bitbucket. AI-powered code review plus pattern-based pre-checks using ast-grep structural matching, a shared team rules repository, and a self-evolving rule system that learns from your feedback.
4
6
 
5
7
  ## Install
6
8
 
@@ -8,113 +10,330 @@ Intelligent Pull Request review orchestrator for Bitbucket. AI-powered code revi
8
10
  npm i -g prism-pr
9
11
  ```
10
12
 
13
+ ## Requirements
14
+
15
+ - Node.js **>= 22.5.0** (SQLite is loaded via the native `node:sqlite` module)
16
+ - Bitbucket Cloud account with an Atlassian API token
17
+ - AI provider (one of):
18
+ - `ANTHROPIC_API_KEY` environment variable (preferred), or
19
+ - [Claude Code CLI](https://docs.anthropic.com/en/docs/claude-code) installed and authenticated
20
+
11
21
  ## Setup
12
22
 
13
23
  ```bash
14
- # Login with your Bitbucket app password
15
24
  prism login
16
25
  ```
17
26
 
18
- Your Bitbucket app password needs these permissions:
27
+ Your Bitbucket app password / API token needs these permissions:
28
+
19
29
  - Repositories: **Read** + **Write**
20
- - Pull requests: **Read**
30
+ - Pull requests: **Read** + **Write**
31
+
32
+ ## Discoverability — always available
33
+
34
+ Every command documents itself via `--help`. If something in this README is stale, trust `--help`:
35
+
36
+ ```bash
37
+ prism --help # full command tree
38
+ prism rules --help # subcommands under `rules`
39
+ prism guard --help # subcommands under `guard`
40
+ prism rules bootstrap --help # flags + examples for a specific command
41
+ prism guard check --help
42
+ prism review start --help
43
+ ```
21
44
 
22
- ## Guard — Instant PR Pattern Check
45
+ ---
23
46
 
24
- Guard checks your PR against learned patterns from past reviews. Zero LLM calls, under 2 seconds.
47
+ ## Quick start zero config
25
48
 
26
- ### Check a PR (CLI)
49
+ PRISM auto-detects your stack and bootstraps rules on the first run. No setup needed.
27
50
 
28
51
  ```bash
29
- # Basic check
30
- prism guard check -w <workspace> -r <repo> -p <pr-id> --verbose
52
+ cd your-bitbucket-repo
53
+ prism guard check
54
+ ```
31
55
 
32
- # Filter by severity
33
- prism guard check -w <workspace> -r <repo> -p <pr-id> --min-severity high --verbose
56
+ That's it. On first run, PRISM will:
57
+
58
+ 1. Detect workspace/repo from your git remote
59
+ 2. Fetch `package.json` via Bitbucket API to detect your stack (TypeScript, Angular, React, NestJS, AG Grid, …)
60
+ 3. Generate a manifest with the matching rulesets
61
+ 4. Push everything to the shared rules repository
62
+ 5. Resolve patterns and check your PR
63
+
64
+ ### Manual bootstrap (optional)
65
+
66
+ If you prefer explicit control:
67
+
68
+ ```bash
69
+ # Detect stack and push manifest + rulesets to the shared rules repo
70
+ prism rules bootstrap
71
+
72
+ # Preview without pushing
73
+ prism rules bootstrap --dry-run
34
74
 
35
- # JSON output (for CI/CD)
36
- prism guard check -w <workspace> -r <repo> -p <pr-id> --json
75
+ # JSON output (CI-friendly)
76
+ prism rules bootstrap --dry-run --json
37
77
 
38
- # Use remote rules (shared team patterns)
39
- prism guard check -w <workspace> -r <repo> -p <pr-id> --remote --verbose
78
+ # Explicit workspace/repo/branch
79
+ prism rules bootstrap --workspace acme --repo my-repo --branch develop
40
80
  ```
41
81
 
42
- ### Interactive TUI
82
+ ### Check a PR
43
83
 
44
84
  ```bash
45
- prism guard
85
+ # Interactive PR picker (auto-detects workspace/repo from git origin)
86
+ prism guard check
87
+
88
+ # Pick a PR by ID
89
+ prism guard check --pr 42
90
+
91
+ # Full output with code snippets and suggestions
92
+ prism guard check --pr 42 --verbose
93
+
94
+ # Filter by severity
95
+ prism guard check --pr 42 --min-severity high --verbose
96
+
97
+ # JSON output for CI
98
+ prism guard check --pr 42 --json
46
99
  ```
47
100
 
48
- Launches the full interactive experience: select workspace, repo, PR, and browse results with keyboard navigation.
101
+ **`--verbose` gates the snippet and suggestion.** Without it, matches show severity badge + title + file:line only. With `--verbose`, you get diff context with a pointer on the exact line, plus the fix suggestion.
102
+
103
+ ---
104
+
105
+ ## Living Rules — self-evolving rule system
106
+
107
+ PRISM's rules aren't static. They learn, adapt, and grow with your codebase.
108
+
109
+ ### Auto-Refresh
49
110
 
50
- ### Exit codes
111
+ Manifests detect when your stack changes. If you add a new framework (e.g. NestJS) to your project, the next guard check automatically updates the manifest with the new rulesets. Default staleness threshold: 7 days.
51
112
 
52
- - `0` — No matches found (all clear)
53
- - `1` — Matches found
113
+ ### Versioned Catalog
54
114
 
55
- Use in CI: `prism guard check -w acme -r app -p $PR_ID --min-severity high || exit 1`
115
+ Rulesets are published as immutable versioned artifacts:
56
116
 
57
- ## Rules — Generate and Share Patterns
117
+ ```
118
+ catalog/
119
+ shared/security/1.0.0.json # immutable, infinite cache
120
+ shared/general/1.0.0.json
121
+ angular/v17/1.0.0.json
122
+ ...
123
+ catalog/index.json # lists all rulesets + latest versions
124
+ ```
125
+
126
+ Manifests can pin versions: `"shared/security@1.2.0"`. Unversioned includes resolve to latest. A 3-level fallback chain ensures resilience: versioned remote → unversioned remote → static builtin catalog.
58
127
 
59
- Rules are generated from your review history and shared via a remote repository.
128
+ ### Feedback Loop & Auto-Tune
60
129
 
61
- ### Generate patterns
130
+ Mark findings as false positives. After enough feedback, PRISM auto-excludes noisy patterns.
62
131
 
63
132
  ```bash
64
- # Generate .prism-patterns.json from past reviews
65
- prism rules sync -w <workspace> -r <repo> --verbose
133
+ # CLI: mark specific pattern IDs as false positive
134
+ prism guard check --pr 42 --mark-fp "security--xss--innerHTML-usage,general--debug--console-log"
66
135
 
67
- # Skip AI rule generation (faster, keyword-only)
68
- prism rules sync -w <workspace> -r <repo> --skip-rules
136
+ # CLI: auto-exclude patterns with 3+ false positives
137
+ prism guard check --pr 42 --auto-tune
69
138
  ```
70
139
 
71
- ### Share with your team
140
+ In the TUI, press `[f]` on any finding to mark it as a false positive. Press `[t]` in the results screen to apply auto-tune.
141
+
142
+ ### AI Rule Suggestion
143
+
144
+ PRISM can analyze findings from any review and generate new ast-grep rules automatically. Rule suggestions are a **post-review** action — you see the findings first, then decide which patterns should become permanent rules.
72
145
 
73
146
  ```bash
74
- # Push patterns to remote rules repo
75
- prism rules push -w <workspace> -r <repo>
147
+ # CLI: generate rules from guard findings
148
+ prism guard check --pr 42 --suggest-rules
149
+
150
+ # CLI: generate rules from AI review findings
151
+ prism review start --workspace acme --repo app --pr 42 --suggest-rules
76
152
  ```
77
153
 
78
- Your team then uses `--remote` flag on guard check to fetch shared rules automatically.
154
+ PRISM uses the same AI provider configured for reviews (auto-detects from `ANTHROPIC_API_KEY` or falls back to Claude Code CLI).
155
+
156
+ In the TUI, press `[g]` on any results screen (guard results or AI review findings) to generate rule suggestions on demand. Review, accept/reject, and apply to the manifest.
79
157
 
80
- ### View stats
158
+ ---
159
+
160
+ ## Interactive TUI
81
161
 
82
162
  ```bash
83
- prism rules stats -w <workspace> -r <repo>
163
+ prism # main TUI (review + navigation)
164
+ prism guard # guard-focused TUI
84
165
  ```
85
166
 
86
- ## AI Review Full PR Analysis
167
+ Launches a full Ink-based terminal UI with keyboard navigation.
168
+
169
+ ### Guardian Angel section
170
+
171
+ - **Guard Check** — select workspace → repo → PR → run check
172
+ - **Guard Check (auto-detect)** — detects workspace/repo from git origin, skips manual selection
173
+ - **Rules Bootstrap** — detect stack and push manifest (dry-run toggle, branch override)
174
+
175
+ ### Guard options (toggleable in guard-home)
176
+
177
+ | Key | Option | Description |
178
+ |-----|--------|-------------|
179
+ | `v` | Verbose | Show context lines and suggestions |
180
+ | `s` | Severity | Cycle minimum severity filter |
181
+ | `a` | AST | Toggle ast-grep matching on/off |
182
+
183
+ ### Guard results actions
184
+
185
+ | Key | Action | Description |
186
+ |-----|--------|-------------|
187
+ | `↑↓` | Navigate | Browse findings |
188
+ | `Enter` | Detail | View finding detail with context |
189
+ | `f` | False positive | Mark finding as FP (in detail view) |
190
+ | `j` | Export JSON | Export results to `prism-guard-results.json` |
191
+ | `t` | Auto-tune | Batch-exclude patterns with enough FP feedback |
192
+ | `g` | AI suggestions | Generate and review AI-suggested rules (on demand) |
193
+ | `Esc` | Back | Return to previous screen |
194
+
195
+ ### AI Review findings actions
196
+
197
+ | Key | Action | Description |
198
+ |-----|--------|-------------|
199
+ | `↑↓` | Navigate | Browse findings |
200
+ | `Enter` | Detail | View finding detail |
201
+ | `g` | AI suggestions | Generate rules from review findings (on demand) |
202
+ | `p` | Publish | Publish findings to Bitbucket PR |
203
+ | `Esc` | Back | Return to previous screen |
204
+
205
+ ---
206
+
207
+ ## AI Review — full PR analysis (LLM-powered)
87
208
 
88
209
  ```bash
89
- # Launch interactive TUI for full AI review
90
- prism
210
+ prism review start --workspace acme --repo app --pr 42
91
211
 
92
- # Or start directly
93
- prism review start -w <workspace> -r <repo> -p <pr-id>
212
+ # Verbose logging
213
+ prism review start --workspace acme --repo app --pr 42 --verbose
214
+
215
+ # Pick a provider explicitly
216
+ prism review start --workspace acme --repo app --pr 42 --provider anthropic
217
+ prism review start --workspace acme --repo app --pr 42 --provider claude-code
218
+
219
+ # Generate rule suggestions from findings
220
+ prism review start --workspace acme --repo app --pr 42 --suggest-rules
94
221
  ```
95
222
 
96
- The AI review uses specialized agents (TypeScript, PHP, CSS, Security, Architecture, Performance, etc.) to analyze your PR and generate findings with inline suggestions.
223
+ > **Note:** `review start` requires `--workspace` and `--repo` explicitly (no auto-detect from git origin). `guard check` auto-detects both.
224
+
225
+ The AI review runs specialized agents (TypeScript, PHP, CSS, Security, Architecture, Performance, …) and produces findings with inline suggestions. Findings are stored in a local SQLite database for review memory and pattern generation.
226
+
227
+ ---
97
228
 
98
229
  ## Commands
99
230
 
100
- | Command | Description |
101
- |---------|-------------|
102
- | `prism` | Launch interactive TUI |
231
+ | Command | Purpose |
232
+ |---------|---------|
233
+ | `prism` | Launch main interactive TUI |
103
234
  | `prism login` | Authenticate with Bitbucket |
104
235
  | `prism logout` | Remove stored credentials |
105
- | `prism guard` | Guard TUI (pattern check) |
106
- | `prism guard check` | Guard CLI (non-interactive) |
107
- | `prism rules sync` | Generate patterns from review history |
108
- | `prism rules push` | Push patterns to remote repo |
109
- | `prism rules stats` | Show pattern statistics |
110
- | `prism review start` | Start AI review for a PR |
236
+ | `prism guard` | Guard Check TUI |
237
+ | `prism guard check` | Non-interactive pattern check (manifest v3) |
238
+ | `prism rules bootstrap` | Detect stack, generate manifest, push to rules repo |
239
+ | `prism rules sync` | ~~Legacy v2.~~ Generate `.prism-patterns.json` from local review history (deprecated) |
240
+ | `prism rules push` | ~~Legacy v2.~~ Push a local `.prism-patterns.json` to the rules repo (deprecated) |
241
+ | `prism rules stats` | Show aggregated finding patterns from local review history |
242
+ | `prism review start` | Run an AI code review on a PR |
243
+
244
+ ### guard check flags
245
+
246
+ | Flag | Description |
247
+ |------|-------------|
248
+ | `--workspace, -w` | Bitbucket workspace (auto-detected from git origin) |
249
+ | `--repo, -r` | Repository slug (auto-detected from git origin) |
250
+ | `--pr, -p` | Pull request ID (interactive picker if omitted) |
251
+ | `--verbose` | Show diff context and suggestions |
252
+ | `--min-severity` | Filter: `critical`, `high`, `medium`, `low`, `info` |
253
+ | `--json` | Structured JSON output (CI-friendly) |
254
+ | `--skip-ast` | Skip ast-grep, keyword-only matching |
255
+ | `--auto-tune` | Auto-exclude patterns with repeated false positives |
256
+ | `--suggest-rules` | Generate AI rules from recurring findings |
257
+ | `--mark-fp` | Mark pattern IDs as false positive (comma-separated) |
258
+ | `--patterns` | Path to local patterns file (bypasses manifest) |
259
+ | `--remote` | **Deprecated.** Use v2 remote fetch path |
260
+
261
+ ### Exit codes (guard check)
262
+
263
+ - `0` — no matches found
264
+ - `1` — matches found (or error)
265
+
266
+ Useful in CI:
111
267
 
112
- ## Requirements
268
+ ```bash
269
+ prism guard check --pr "$PR_ID" --min-severity high --json > findings.json
270
+ ```
271
+
272
+ ---
273
+
274
+ ## Concepts
275
+
276
+ ### Manifest v3
277
+
278
+ A `ProjectManifest` lives at `projects/<workspace>/<repo>.json` in the shared rules repo. It references rulesets by id instead of inlining patterns:
279
+
280
+ ```json
281
+ {
282
+ "version": 3,
283
+ "generatedAt": "2026-04-13T21:00:00.000Z",
284
+ "stack": {
285
+ "languages": ["typescript"],
286
+ "frameworks": [{ "name": "angular", "version": "17.3.0" }],
287
+ "detectedAt": "2026-04-13T21:00:00.000Z"
288
+ },
289
+ "includes": ["angular/base", "angular/v17", "shared/typescript", "shared/security@1.0.0"],
290
+ "excludes": ["general--debug--console-log"],
291
+ "patterns": []
292
+ }
293
+ ```
294
+
295
+ - `includes` — ruleset IDs to pull in (supports `@version` pinning)
296
+ - `excludes` — pattern IDs to skip (auto-tune populates this)
297
+ - `patterns` — project-specific custom patterns (AI suggestions land here)
298
+
299
+ ### Rulesets
300
+
301
+ Built-in rulesets today (9 rulesets, 30+ ast-grep patterns):
302
+
303
+ - `shared/general`, `shared/security`, `shared/typescript`
304
+ - `angular/base`, `angular/v17`
305
+ - `react/base`
306
+ - `nestjs/base`
307
+ - `ag-grid/base`, `ag-grid/v32`
308
+
309
+ ### Remote catalog structure
310
+
311
+ All teams share a single Bitbucket rules repository that hosts manifests and versioned rulesets. The default shared repo is `walzate1/prism-rules`:
312
+
313
+ ```
314
+ {rules-repo} (Bitbucket)
315
+ ├── projects/{workspace}/{repo}.json # per-project manifest
316
+ ├── rulesets/{id}.json # unversioned rulesets (backward compat)
317
+ └── catalog/
318
+ ├── index.json # catalog index (all rulesets + versions)
319
+ └── {id}/{version}.json # immutable versioned rulesets
320
+ ```
321
+
322
+ ### Severity levels
323
+
324
+ `critical` · `high` · `medium` · `low` · `info`
325
+
326
+ ### Pattern resolution flow
327
+
328
+ 1. `--patterns <file>` explicitly set → use local file (bypasses manifest)
329
+ 2. Fetch manifest from `projects/<ws>/<repo>.json`
330
+ 3. If no manifest → **auto-bootstrap** (detect stack → generate → push → continue)
331
+ 4. If manifest is stale (>7 days) → **auto-refresh** (re-detect stack → smart merge → push)
332
+ 5. Resolve includes via 3-level fallback (versioned → unversioned → static builtin)
333
+ 6. Apply excludes → merge custom patterns → run guard
113
334
 
114
- - Node.js 20+
115
- - Bitbucket Cloud account with app password
116
- - Claude Code CLI (for AI review and rule generation)
335
+ ---
117
336
 
118
337
  ## License
119
338
 
120
- Private
339
+ UNLICENSED — All rights reserved.
package/bin/run.js CHANGED
@@ -1,17 +1,17 @@
1
- #!/usr/bin/env node
2
-
3
- // Suppress node:sqlite ExperimentalWarning
4
- const _origEmit = process.emit.bind(process);
5
- process.emit = function (event, ...args) {
6
- if (event === 'warning' && args[0]?.name === 'ExperimentalWarning') return false;
7
- return _origEmit(event, ...args);
8
- };
9
-
10
- import { execute } from '@oclif/core';
11
-
12
- // If no command specified, default to interactive TUI
13
- if (process.argv.length === 2) {
14
- process.argv.push('interactive');
15
- }
16
-
17
- await execute({ dir: import.meta.url });
1
+ #!/usr/bin/env node
2
+
3
+ // Suppress node:sqlite ExperimentalWarning
4
+ const _origEmit = process.emit.bind(process);
5
+ process.emit = function (event, ...args) {
6
+ if (event === 'warning' && args[0]?.name === 'ExperimentalWarning') return false;
7
+ return _origEmit(event, ...args);
8
+ };
9
+
10
+ import { execute } from '@oclif/core';
11
+
12
+ // If no command specified, default to interactive TUI
13
+ if (process.argv.length === 2) {
14
+ process.argv.push('interactive');
15
+ }
16
+
17
+ await execute({ dir: import.meta.url });
@@ -0,0 +1,21 @@
1
+ import type { ModelProvider } from '../../types/provider.js';
2
+ import type { LLMProvider } from '../../rules-engine/pattern-generator.js';
3
+ /**
4
+ * Adapter that bridges ModelProvider (tool_use, returns AnalyzeResult) →
5
+ * LLMProvider (string-in / string-out) required by PatternGenerator.
6
+ *
7
+ * Strategy:
8
+ * 1. Defines a tool schema where `findings[0]` is the model's complete text output.
9
+ * 2. Calls ModelProvider.analyze() with this schema.
10
+ * 3. Extracts findings[0] as a string (or JSON-serializes if the model returns an object).
11
+ * 4. Returns empty string when findings is empty — callers handle empty gracefully.
12
+ */
13
+ export declare class ModelProviderLLMAdapter implements LLMProvider {
14
+ private readonly provider;
15
+ constructor(provider: ModelProvider);
16
+ analyze(systemPrompt: string, userContent: string, options?: {
17
+ toolName?: string;
18
+ maxTokens?: number;
19
+ }): Promise<string>;
20
+ }
21
+ //# sourceMappingURL=model-provider-llm-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-provider-llm-adapter.d.ts","sourceRoot":"","sources":["../../../src/ai/adapters/model-provider-llm-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yCAAyC,CAAC;AAwB3E;;;;;;;;;GASG;AACH,qBAAa,uBAAwB,YAAW,WAAW;IAC7C,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,EAAE,aAAa;IAE9C,OAAO,CACX,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAClD,OAAO,CAAC,MAAM,CAAC;CAwBnB"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Tool schema designed to work with AnthropicProvider's extraction logic.
3
+ *
4
+ * AnthropicProvider always extracts `toolUseBlock.input.findings` from the tool call response.
5
+ * So the schema MUST use `findings` as the key — the model places its response in `findings[0]`.
6
+ *
7
+ * With this schema the model is instructed to return an array with exactly one element:
8
+ * the complete JSON response. AnthropicProvider's existing extraction code
9
+ * (`input.findings ?? []`) captures it, and we return `findings[0]`.
10
+ */
11
+ const TEXT_CAPTURE_TOOL_SCHEMA = {
12
+ type: 'object',
13
+ properties: {
14
+ findings: {
15
+ type: 'array',
16
+ items: { type: 'string' },
17
+ description: 'Array with exactly one element: the complete JSON response. No markdown fences.',
18
+ },
19
+ },
20
+ required: ['findings'],
21
+ };
22
+ /**
23
+ * Adapter that bridges ModelProvider (tool_use, returns AnalyzeResult) →
24
+ * LLMProvider (string-in / string-out) required by PatternGenerator.
25
+ *
26
+ * Strategy:
27
+ * 1. Defines a tool schema where `findings[0]` is the model's complete text output.
28
+ * 2. Calls ModelProvider.analyze() with this schema.
29
+ * 3. Extracts findings[0] as a string (or JSON-serializes if the model returns an object).
30
+ * 4. Returns empty string when findings is empty — callers handle empty gracefully.
31
+ */
32
+ export class ModelProviderLLMAdapter {
33
+ provider;
34
+ constructor(provider) {
35
+ this.provider = provider;
36
+ }
37
+ async analyze(systemPrompt, userContent, options) {
38
+ const toolName = options?.toolName ?? 'generate_ast_grep_rule';
39
+ const maxTokens = options?.maxTokens ?? 1024;
40
+ const result = await this.provider.analyze({
41
+ systemPrompt,
42
+ userContent,
43
+ toolName,
44
+ toolSchema: TEXT_CAPTURE_TOOL_SCHEMA,
45
+ maxTokens,
46
+ });
47
+ if (result.findings.length === 0) {
48
+ return '';
49
+ }
50
+ const first = result.findings[0];
51
+ if (typeof first === 'string') {
52
+ return first;
53
+ }
54
+ // Object findings — JSON-serialize for parseGeneratedRule to handle
55
+ return JSON.stringify(first);
56
+ }
57
+ }
58
+ //# sourceMappingURL=model-provider-llm-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-provider-llm-adapter.js","sourceRoot":"","sources":["../../../src/ai/adapters/model-provider-llm-adapter.ts"],"names":[],"mappings":"AAGA;;;;;;;;;GASG;AACH,MAAM,wBAAwB,GAAG;IAC/B,IAAI,EAAE,QAAiB;IACvB,UAAU,EAAE;QACV,QAAQ,EAAE;YACR,IAAI,EAAE,OAAgB;YACtB,KAAK,EAAE,EAAE,IAAI,EAAE,QAAiB,EAAE;YAClC,WAAW,EAAE,iFAAiF;SAC/F;KACF;IACD,QAAQ,EAAE,CAAC,UAAU,CAAU;CAChC,CAAC;AAEF;;;;;;;;;GASG;AACH,MAAM,OAAO,uBAAuB;IACL;IAA7B,YAA6B,QAAuB;QAAvB,aAAQ,GAAR,QAAQ,CAAe;IAAG,CAAC;IAExD,KAAK,CAAC,OAAO,CACX,YAAoB,EACpB,WAAmB,EACnB,OAAmD;QAEnD,MAAM,QAAQ,GAAG,OAAO,EAAE,QAAQ,IAAI,wBAAwB,CAAC;QAC/D,MAAM,SAAS,GAAG,OAAO,EAAE,SAAS,IAAI,IAAI,CAAC;QAE7C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;YACzC,YAAY;YACZ,WAAW;YACX,QAAQ;YACR,UAAU,EAAE,wBAAwB;YACpC,SAAS;SACV,CAAC,CAAC;QAEH,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACjC,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QACjC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,OAAO,KAAK,CAAC;QACf,CAAC;QAED,oEAAoE;QACpE,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/ai/agents/framework-rules/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AAMrE,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAMD;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CACnC,YAAY,EAAE,YAAY,GAAG,SAAS,GAAG,IAAI,EAC7C,OAAO,EAAE,MAAM,GACd,MAAM,GAAG,SAAS,CAoBpB;AAED;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CACnC,YAAY,EAAE,YAAY,GAAG,SAAS,GAAG,IAAI,EAC7C,OAAO,EAAE,MAAM,EACf,SAAS,CAAC,EAAE,eAAe,EAAE,GAC5B,MAAM,GAAG,SAAS,CAkBpB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/ai/agents/framework-rules/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AAMrE,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAMD;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CACnC,YAAY,EAAE,YAAY,GAAG,SAAS,GAAG,IAAI,EAC7C,OAAO,EAAE,MAAM,GACd,MAAM,GAAG,SAAS,CA0CpB;AAED;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CACnC,YAAY,EAAE,YAAY,GAAG,SAAS,GAAG,IAAI,EAC7C,OAAO,EAAE,MAAM,EACf,SAAS,CAAC,EAAE,eAAe,EAAE,GAC5B,MAAM,GAAG,SAAS,CAkBpB"}
@@ -37,6 +37,27 @@ export function buildFrameworkContext(stackProfile, agentId) {
37
37
  if (stackProfile.keyLibraries.length > 0) {
38
38
  parts.push(`Key libraries: ${stackProfile.keyLibraries.join(', ')}`);
39
39
  }
40
+ // Angular architecture guidance — context-aware component patterns
41
+ if (canonical === 'angular' && agentId === 'architecture-reviewer') {
42
+ const libs = new Set(stackProfile.keyLibraries.map(l => l.toLowerCase()));
43
+ const hasStateManagement = libs.has('@ngxs/store') || libs.has('@ngrx/store') || libs.has('ngxs') || libs.has('ngrx');
44
+ if (hasStateManagement) {
45
+ parts.push(`\nAngular Architecture Guidance (state management detected):\n` +
46
+ `When suggesting component extraction or refactoring, recommend:\n` +
47
+ `- Store-driven architecture: components read state via Selectors, trigger changes via Actions/Dispatch\n` +
48
+ `- Smart containers subscribe to Store selectors; Dumb components receive data via @Input and emit events via @Output\n` +
49
+ `- Do NOT recommend passing state through @Input/@Output chains — use the Store as single source of truth\n` +
50
+ `- Services should dispatch Actions, not hold BehaviorSubjects for state that belongs in the Store`);
51
+ }
52
+ else {
53
+ parts.push(`\nAngular Architecture Guidance (no state management library detected):\n` +
54
+ `When suggesting component extraction or refactoring, recommend:\n` +
55
+ `- Smart & Dumb Components pattern: Smart (container) components handle logic and data fetching; Dumb (presentational) components receive data via @Input and emit events via @Output\n` +
56
+ `- Use Services with BehaviorSubject/Observable for shared state between components\n` +
57
+ `- Prefer Observable streams with async pipe over manual .subscribe() in templates\n` +
58
+ `- Keep components small and focused — extract when a component handles more than one responsibility`);
59
+ }
60
+ }
40
61
  return parts.join('\n');
41
62
  }
42
63
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/ai/agents/framework-rules/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAYvD,8EAA8E;AAC9E,aAAa;AACb,8EAA8E;AAE9E;;;;;;;GAOG;AACH,MAAM,UAAU,qBAAqB,CACnC,YAA6C,EAC7C,OAAe;IAEf,IAAI,YAAY,EAAE,SAAS,IAAI,IAAI;QAAE,OAAO,SAAS,CAAC;IAEtD,MAAM,SAAS,GAAG,sBAAsB,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;IACjE,IAAI,SAAS,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAE9C,MAAM,QAAQ,GAAG,mBAAmB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACpD,IAAI,QAAQ,KAAK,SAAS,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC;QAAE,OAAO,SAAS,CAAC;IAEvE,sBAAsB;IACtB,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,cAAc,YAAY,CAAC,SAAS,EAAE,CAAC,CAAC;IACnD,IAAI,YAAY,CAAC,gBAAgB,KAAK,IAAI,EAAE,CAAC;QAC3C,KAAK,CAAC,IAAI,CAAC,YAAY,YAAY,CAAC,gBAAgB,EAAE,CAAC,CAAC;IAC1D,CAAC;IACD,IAAI,YAAY,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzC,KAAK,CAAC,IAAI,CAAC,kBAAkB,YAAY,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACvE,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,qBAAqB,CACnC,YAA6C,EAC7C,OAAe,EACf,SAA6B;IAE7B,MAAM,OAAO,GAAG,qBAAqB,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IAE7D,mCAAmC;IACnC,MAAM,UAAU,GAAG,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,OAAO,CAAC,CAAC;IAC/D,MAAM,UAAU,GAAG,UAAU,EAAE,KAAK,CAAC;IAErC,IAAI,OAAO,KAAK,SAAS,IAAI,CAAC,UAAU,KAAK,SAAS,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,CAAC;QAAE,OAAO,SAAS,CAAC;IAErG,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACzB,CAAC;IACD,IAAI,UAAU,KAAK,SAAS,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtD,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC5B,CAAC;IAED,OAAO,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC/B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/ai/agents/framework-rules/index.ts"],"names":[],"mappings":"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"}
@@ -1,39 +1,39 @@
1
- You are a senior software architect reviewing a pull request for structural and design issues. Your goal is to identify high-signal architectural problems — NOT file-level code style issues or implementation details.
2
-
3
- ## Focus Areas
4
-
5
- Review the entire diff holistically and report findings for:
6
-
7
- 1. **Circular dependencies** — modules or packages that import each other directly or transitively, creating tight coupling that prevents independent testing or deployment
8
- 2. **Single Responsibility Principle violations** — classes, modules, or functions that are clearly doing multiple unrelated things (e.g., a data model that also handles HTTP calls; a service that mixes business logic with persistence)
9
- 3. **Layer boundary crossings** — higher-level layers being imported by lower-level layers (e.g., UI components importing directly from database models; infrastructure code importing domain entities incorrectly)
10
- 4. **Inappropriate coupling** — components that know too much about each other's internals; tight coupling that makes changes in one place require changes in many others
11
- 5. **Leaked abstractions** — implementation details of one layer leaking into another (e.g., SQL-specific types in business logic; HTTP status codes in domain services)
12
-
13
- ## Critical Output Constraint
14
-
15
- Produce between 0 and 3 findings MAXIMUM. This is a hard limit.
16
-
17
- Focus only on `critical` or `high` severity architectural issues. Do NOT report:
18
- - `medium`, `low`, or `info` severity findings
19
- - File-level implementation details
20
- - Naming conventions or code style
21
- - Issues that affect a single file without cross-component impact
22
- - Theoretical violations without clear evidence in the diff
23
-
24
- If no high-signal architectural issues exist, return an empty findings array. Do NOT manufacture findings to appear thorough.
25
-
26
- ## Output Instructions
27
-
28
- You MUST call the `report_findings` tool to submit your findings. Do not write findings as plain text — the tool call is required.
29
-
30
- For each finding, reference the exact line number using the `[L{num}]` annotations provided in the diff. The `lineNumber` field in each finding MUST correspond to an annotated line from the diff.
31
-
32
- If there are no findings, call `report_findings` with an empty array: `{ "findings": [] }`.
33
-
34
- ## Severity Criteria
35
-
36
- | Severity | When to use |
37
- |----------|-------------|
38
- | `critical` | Circular dependency or layer violation that will break builds or prevent testability |
39
- | `high` | SRP violation or coupling issue that will cause cascading changes and increase defect rate |
1
+ You are a senior software architect reviewing a pull request for structural and design issues. Your goal is to identify high-signal architectural problems — NOT file-level code style issues or implementation details.
2
+
3
+ ## Focus Areas
4
+
5
+ Review the entire diff holistically and report findings for:
6
+
7
+ 1. **Circular dependencies** — modules or packages that import each other directly or transitively, creating tight coupling that prevents independent testing or deployment
8
+ 2. **Single Responsibility Principle violations** — classes, modules, or functions that are clearly doing multiple unrelated things (e.g., a data model that also handles HTTP calls; a service that mixes business logic with persistence)
9
+ 3. **Layer boundary crossings** — higher-level layers being imported by lower-level layers (e.g., UI components importing directly from database models; infrastructure code importing domain entities incorrectly)
10
+ 4. **Inappropriate coupling** — components that know too much about each other's internals; tight coupling that makes changes in one place require changes in many others
11
+ 5. **Leaked abstractions** — implementation details of one layer leaking into another (e.g., SQL-specific types in business logic; HTTP status codes in domain services)
12
+
13
+ ## Critical Output Constraint
14
+
15
+ Produce between 0 and 3 findings MAXIMUM. This is a hard limit.
16
+
17
+ Focus only on `critical` or `high` severity architectural issues. Do NOT report:
18
+ - `medium`, `low`, or `info` severity findings
19
+ - File-level implementation details
20
+ - Naming conventions or code style
21
+ - Issues that affect a single file without cross-component impact
22
+ - Theoretical violations without clear evidence in the diff
23
+
24
+ If no high-signal architectural issues exist, return an empty findings array. Do NOT manufacture findings to appear thorough.
25
+
26
+ ## Output Instructions
27
+
28
+ You MUST call the `report_findings` tool to submit your findings. Do not write findings as plain text — the tool call is required.
29
+
30
+ For each finding, reference the exact line number using the `[L{num}]` annotations provided in the diff. The `lineNumber` field in each finding MUST correspond to an annotated line from the diff.
31
+
32
+ If there are no findings, call `report_findings` with an empty array: `{ "findings": [] }`.
33
+
34
+ ## Severity Criteria
35
+
36
+ | Severity | When to use |
37
+ |----------|-------------|
38
+ | `critical` | Circular dependency or layer violation that will break builds or prevent testability |
39
+ | `high` | SRP violation or coupling issue that will cause cascading changes and increase defect rate |