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.
- package/README.md +274 -55
- package/bin/run.js +17 -17
- package/dist/ai/adapters/model-provider-llm-adapter.d.ts +21 -0
- package/dist/ai/adapters/model-provider-llm-adapter.d.ts.map +1 -0
- package/dist/ai/adapters/model-provider-llm-adapter.js +58 -0
- package/dist/ai/adapters/model-provider-llm-adapter.js.map +1 -0
- package/dist/ai/agents/framework-rules/index.d.ts.map +1 -1
- package/dist/ai/agents/framework-rules/index.js +21 -0
- package/dist/ai/agents/framework-rules/index.js.map +1 -1
- package/dist/ai/agents/prompts/architecture-reviewer.txt +39 -39
- package/dist/ai/agents/prompts/config-reviewer.txt +47 -47
- package/dist/ai/agents/prompts/csharp-reviewer.txt +39 -39
- package/dist/ai/agents/prompts/css-reviewer.txt +41 -41
- package/dist/ai/agents/prompts/html-reviewer.txt +52 -43
- package/dist/ai/agents/prompts/performance-reviewer.txt +38 -38
- package/dist/ai/agents/prompts/security-reviewer.txt +36 -36
- package/dist/ai/agents/prompts/sql-reviewer.txt +43 -43
- package/dist/ai/agents/prompts/testing-reviewer.txt +38 -38
- package/dist/ai/agents/prompts/ts-reviewer.txt +4 -0
- package/dist/ai/agents/prompts/ux-text-reviewer.txt +68 -68
- package/dist/ai/agents/shared/finding-schema.d.ts +3 -0
- package/dist/ai/agents/shared/finding-schema.d.ts.map +1 -1
- package/dist/ai/agents/shared/finding-schema.js +3 -3
- package/dist/ai/agents/shared/finding-schema.js.map +1 -1
- package/dist/ai/providers/anthropic-provider.js +1 -1
- package/dist/ai/providers/anthropic-provider.js.map +1 -1
- package/dist/bitbucket/client.d.ts +1 -0
- package/dist/bitbucket/client.d.ts.map +1 -1
- package/dist/bitbucket/client.js +21 -0
- package/dist/bitbucket/client.js.map +1 -1
- package/dist/commands/guard/check.d.ts +3 -0
- package/dist/commands/guard/check.d.ts.map +1 -1
- package/dist/commands/guard/check.js +205 -24
- package/dist/commands/guard/check.js.map +1 -1
- package/dist/commands/review/start.d.ts +1 -0
- package/dist/commands/review/start.d.ts.map +1 -1
- package/dist/commands/review/start.js +38 -3
- package/dist/commands/review/start.js.map +1 -1
- package/dist/commands/rules/bootstrap.d.ts.map +1 -1
- package/dist/commands/rules/bootstrap.js +36 -1
- package/dist/commands/rules/bootstrap.js.map +1 -1
- package/dist/commands/rules/push.d.ts.map +1 -1
- package/dist/commands/rules/push.js +1 -1
- package/dist/commands/rules/push.js.map +1 -1
- package/dist/commands/rules/sync.d.ts.map +1 -1
- package/dist/commands/rules/sync.js +1 -1
- package/dist/commands/rules/sync.js.map +1 -1
- package/dist/config/config-manager.js +1 -1
- package/dist/config/config-manager.js.map +1 -1
- package/dist/core/review-workflow.d.ts +2 -0
- package/dist/core/review-workflow.d.ts.map +1 -1
- package/dist/core/review-workflow.js.map +1 -1
- package/dist/core/workflow-engine.d.ts +2 -0
- package/dist/core/workflow-engine.d.ts.map +1 -1
- package/dist/core/workflow-engine.js +16 -0
- package/dist/core/workflow-engine.js.map +1 -1
- package/dist/guard/auto-bootstrap.d.ts +18 -0
- package/dist/guard/auto-bootstrap.d.ts.map +1 -0
- package/dist/guard/auto-bootstrap.js +19 -0
- package/dist/guard/auto-bootstrap.js.map +1 -0
- package/dist/guard/feedback-service.d.ts +34 -0
- package/dist/guard/feedback-service.d.ts.map +1 -0
- package/dist/guard/feedback-service.js +82 -0
- package/dist/guard/feedback-service.js.map +1 -0
- package/dist/guard/guard-match-aggregator.d.ts +16 -0
- package/dist/guard/guard-match-aggregator.d.ts.map +1 -0
- package/dist/guard/guard-match-aggregator.js +79 -0
- package/dist/guard/guard-match-aggregator.js.map +1 -0
- package/dist/guard/patterns-loader.js +1 -1
- package/dist/guard/patterns-loader.js.map +1 -1
- package/dist/guard/review-findings-aggregator.d.ts +38 -0
- package/dist/guard/review-findings-aggregator.d.ts.map +1 -0
- package/dist/guard/review-findings-aggregator.js +114 -0
- package/dist/guard/review-findings-aggregator.js.map +1 -0
- package/dist/guard/types.d.ts +1 -1
- package/dist/guard/types.d.ts.map +1 -1
- package/dist/persistence/database.js +4 -4
- package/dist/persistence/migrations/0001_phase3a_schema.sql +15 -15
- package/dist/persistence/migrations/0004_review_memory.sql +24 -24
- package/dist/persistence/migrations/0005_pattern_feedback.sql +16 -0
- package/dist/persistence/migrations/20260401141055_peaceful_blur/migration.sql +66 -66
- package/dist/persistence/migrations/20260401141055_peaceful_blur/snapshot.json +467 -467
- package/dist/persistence/migrations/meta/0000_snapshot.json +467 -467
- package/dist/persistence/migrations/meta/_journal.json +7 -0
- package/dist/persistence/pattern-feedback-repository.d.ts +59 -0
- package/dist/persistence/pattern-feedback-repository.d.ts.map +1 -0
- package/dist/persistence/pattern-feedback-repository.js +116 -0
- package/dist/persistence/pattern-feedback-repository.js.map +1 -0
- package/dist/persistence/schema.d.ts +199 -0
- package/dist/persistence/schema.d.ts.map +1 -1
- package/dist/persistence/schema.js +17 -0
- package/dist/persistence/schema.js.map +1 -1
- package/dist/rule-catalog/ag-grid/base.d.ts.map +1 -1
- package/dist/rule-catalog/ag-grid/base.js +1 -0
- package/dist/rule-catalog/ag-grid/base.js.map +1 -1
- package/dist/rule-catalog/ag-grid/v32.d.ts.map +1 -1
- package/dist/rule-catalog/ag-grid/v32.js +1 -0
- package/dist/rule-catalog/ag-grid/v32.js.map +1 -1
- package/dist/rule-catalog/angular/base.d.ts.map +1 -1
- package/dist/rule-catalog/angular/base.js +117 -1
- package/dist/rule-catalog/angular/base.js.map +1 -1
- package/dist/rule-catalog/angular/v17.d.ts.map +1 -1
- package/dist/rule-catalog/angular/v17.js +1 -0
- package/dist/rule-catalog/angular/v17.js.map +1 -1
- package/dist/rule-catalog/angular/v2.d.ts +3 -0
- package/dist/rule-catalog/angular/v2.d.ts.map +1 -0
- package/dist/rule-catalog/angular/v2.js +44 -0
- package/dist/rule-catalog/angular/v2.js.map +1 -0
- package/dist/rule-catalog/index.d.ts.map +1 -1
- package/dist/rule-catalog/index.js +2 -0
- package/dist/rule-catalog/index.js.map +1 -1
- package/dist/rule-catalog/nestjs/base.d.ts.map +1 -1
- package/dist/rule-catalog/nestjs/base.js +1 -0
- package/dist/rule-catalog/nestjs/base.js.map +1 -1
- package/dist/rule-catalog/react/base.d.ts.map +1 -1
- package/dist/rule-catalog/react/base.js +1 -0
- package/dist/rule-catalog/react/base.js.map +1 -1
- package/dist/rule-catalog/ruleset-mapper.d.ts +11 -0
- package/dist/rule-catalog/ruleset-mapper.d.ts.map +1 -1
- package/dist/rule-catalog/ruleset-mapper.js +32 -0
- package/dist/rule-catalog/ruleset-mapper.js.map +1 -1
- package/dist/rule-catalog/shared/general.d.ts.map +1 -1
- package/dist/rule-catalog/shared/general.js +130 -0
- package/dist/rule-catalog/shared/general.js.map +1 -1
- package/dist/rule-catalog/shared/security.d.ts.map +1 -1
- package/dist/rule-catalog/shared/security.js +11 -2
- package/dist/rule-catalog/shared/security.js.map +1 -1
- package/dist/rule-catalog/shared/typescript.d.ts.map +1 -1
- package/dist/rule-catalog/shared/typescript.js +4 -3
- package/dist/rule-catalog/shared/typescript.js.map +1 -1
- package/dist/rule-catalog/types.d.ts +1 -0
- package/dist/rule-catalog/types.d.ts.map +1 -1
- package/dist/rules-engine/pattern-generator.d.ts +22 -1
- package/dist/rules-engine/pattern-generator.d.ts.map +1 -1
- package/dist/rules-engine/pattern-generator.js +26 -8
- package/dist/rules-engine/pattern-generator.js.map +1 -1
- package/dist/rules-engine/types.d.ts +5 -0
- package/dist/rules-engine/types.d.ts.map +1 -1
- package/dist/rules-engine/types.js.map +1 -1
- package/dist/rules-repo/constants.d.ts +14 -0
- package/dist/rules-repo/constants.d.ts.map +1 -0
- package/dist/rules-repo/constants.js +16 -0
- package/dist/rules-repo/constants.js.map +1 -0
- package/dist/rules-repo/manifest-refresh.d.ts +45 -0
- package/dist/rules-repo/manifest-refresh.d.ts.map +1 -0
- package/dist/rules-repo/manifest-refresh.js +123 -0
- package/dist/rules-repo/manifest-refresh.js.map +1 -0
- package/dist/rules-repo/manifest-resolver.d.ts +2 -1
- package/dist/rules-repo/manifest-resolver.d.ts.map +1 -1
- package/dist/rules-repo/manifest-resolver.js +20 -5
- package/dist/rules-repo/manifest-resolver.js.map +1 -1
- package/dist/rules-repo/manifest-types.d.ts +43 -1
- package/dist/rules-repo/manifest-types.d.ts.map +1 -1
- package/dist/rules-repo/manifest-types.js +26 -1
- package/dist/rules-repo/manifest-types.js.map +1 -1
- package/dist/rules-repo/rules-cache.d.ts +13 -1
- package/dist/rules-repo/rules-cache.d.ts.map +1 -1
- package/dist/rules-repo/rules-cache.js +75 -0
- package/dist/rules-repo/rules-cache.js.map +1 -1
- package/dist/rules-repo/rules-repo-client.d.ts +35 -4
- package/dist/rules-repo/rules-repo-client.d.ts.map +1 -1
- package/dist/rules-repo/rules-repo-client.js +135 -9
- package/dist/rules-repo/rules-repo-client.js.map +1 -1
- package/dist/rules-repo/types.d.ts +3 -0
- package/dist/rules-repo/types.d.ts.map +1 -1
- package/dist/rules-repo/types.js.map +1 -1
- package/dist/tui/components/app-header.js +2 -2
- package/dist/tui/components/searchable-list.d.ts +2 -1
- package/dist/tui/components/searchable-list.d.ts.map +1 -1
- package/dist/tui/components/searchable-list.js +3 -1
- package/dist/tui/components/searchable-list.js.map +1 -1
- package/dist/tui/deps-context.d.ts +6 -0
- package/dist/tui/deps-context.d.ts.map +1 -1
- package/dist/tui/deps-context.js.map +1 -1
- package/dist/tui/hooks/use-session.d.ts +4 -4
- package/dist/tui/hooks/use-suggest-rules.d.ts +30 -0
- package/dist/tui/hooks/use-suggest-rules.d.ts.map +1 -0
- package/dist/tui/hooks/use-suggest-rules.js +78 -0
- package/dist/tui/hooks/use-suggest-rules.js.map +1 -0
- package/dist/tui/screen-router.d.ts.map +1 -1
- package/dist/tui/screen-router.js +6 -0
- package/dist/tui/screen-router.js.map +1 -1
- package/dist/tui/screens/bootstrap-running.d.ts +3 -0
- package/dist/tui/screens/bootstrap-running.d.ts.map +1 -0
- package/dist/tui/screens/bootstrap-running.js +180 -0
- package/dist/tui/screens/bootstrap-running.js.map +1 -0
- package/dist/tui/screens/finding-detail.d.ts.map +1 -1
- package/dist/tui/screens/finding-detail.js +17 -0
- package/dist/tui/screens/finding-detail.js.map +1 -1
- package/dist/tui/screens/findings-list.d.ts.map +1 -1
- package/dist/tui/screens/findings-list.js +28 -2
- package/dist/tui/screens/findings-list.js.map +1 -1
- package/dist/tui/screens/guard-detail.d.ts.map +1 -1
- package/dist/tui/screens/guard-detail.js +48 -4
- package/dist/tui/screens/guard-detail.js.map +1 -1
- package/dist/tui/screens/guard-home.d.ts.map +1 -1
- package/dist/tui/screens/guard-home.js +28 -8
- package/dist/tui/screens/guard-home.js.map +1 -1
- package/dist/tui/screens/guard-results.d.ts.map +1 -1
- package/dist/tui/screens/guard-results.js +133 -4
- package/dist/tui/screens/guard-results.js.map +1 -1
- package/dist/tui/screens/guard-running.d.ts.map +1 -1
- package/dist/tui/screens/guard-running.js +116 -5
- package/dist/tui/screens/guard-running.js.map +1 -1
- package/dist/tui/screens/home.d.ts.map +1 -1
- package/dist/tui/screens/home.js +27 -2
- package/dist/tui/screens/home.js.map +1 -1
- package/dist/tui/screens/repo-select.d.ts.map +1 -1
- package/dist/tui/screens/repo-select.js +3 -0
- package/dist/tui/screens/repo-select.js.map +1 -1
- package/dist/tui/screens/review-running.js +1 -1
- package/dist/tui/screens/review-running.js.map +1 -1
- package/dist/tui/screens/rule-suggestions.d.ts +3 -0
- package/dist/tui/screens/rule-suggestions.d.ts.map +1 -0
- package/dist/tui/screens/rule-suggestions.js +121 -0
- package/dist/tui/screens/rule-suggestions.js.map +1 -0
- package/dist/tui/state/router-reducer.d.ts +1 -1
- package/dist/tui/state/router-reducer.d.ts.map +1 -1
- package/dist/tui/state/router-reducer.js.map +1 -1
- package/dist/tui/state/tui-reducer.d.ts +66 -3
- package/dist/tui/state/tui-reducer.d.ts.map +1 -1
- package/dist/tui/state/tui-reducer.js +98 -0
- package/dist/tui/state/tui-reducer.js.map +1 -1
- package/dist/tui/types/bootstrap-options.d.ts +10 -0
- package/dist/tui/types/bootstrap-options.d.ts.map +1 -0
- package/dist/tui/types/bootstrap-options.js +19 -0
- package/dist/tui/types/bootstrap-options.js.map +1 -0
- package/dist/tui/types/guard-options.d.ts +17 -0
- package/dist/tui/types/guard-options.d.ts.map +1 -0
- package/dist/tui/types/guard-options.js +36 -0
- package/dist/tui/types/guard-options.js.map +1 -0
- package/dist/types/repo-config.d.ts +8 -8
- package/dist/utils/summary-generator.d.ts +1 -0
- package/dist/utils/summary-generator.d.ts.map +1 -1
- package/dist/utils/summary-generator.js +12 -6
- package/dist/utils/summary-generator.js.map +1 -1
- package/oclif.manifest.json +28 -3
- package/package.json +24 -2
- package/dist/memory/engram-client.d.ts +0 -15
- package/dist/memory/engram-client.d.ts.map +0 -1
- package/dist/memory/engram-client.js +0 -167
- package/dist/memory/engram-client.js.map +0 -1
- package/dist/persistence/migrations/0000_peaceful_blur.sql +0 -66
- package/dist/tui/components/status-bar.d.ts +0 -10
- package/dist/tui/components/status-bar.d.ts.map +0 -1
- package/dist/tui/components/status-bar.js +0 -7
- package/dist/tui/components/status-bar.js.map +0 -1
- package/dist/types/engram.d.ts +0 -29
- package/dist/types/engram.d.ts.map +0 -1
- package/dist/types/engram.js +0 -2
- package/dist/types/engram.js.map +0 -1
package/README.md
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
# PRISM-PR
|
|
2
2
|
|
|
3
|
-
|
|
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
|
-
|
|
45
|
+
---
|
|
23
46
|
|
|
24
|
-
|
|
47
|
+
## Quick start — zero config
|
|
25
48
|
|
|
26
|
-
|
|
49
|
+
PRISM auto-detects your stack and bootstraps rules on the first run. No setup needed.
|
|
27
50
|
|
|
28
51
|
```bash
|
|
29
|
-
|
|
30
|
-
prism guard check
|
|
52
|
+
cd your-bitbucket-repo
|
|
53
|
+
prism guard check
|
|
54
|
+
```
|
|
31
55
|
|
|
32
|
-
|
|
33
|
-
|
|
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 (
|
|
36
|
-
prism
|
|
75
|
+
# JSON output (CI-friendly)
|
|
76
|
+
prism rules bootstrap --dry-run --json
|
|
37
77
|
|
|
38
|
-
#
|
|
39
|
-
prism
|
|
78
|
+
# Explicit workspace/repo/branch
|
|
79
|
+
prism rules bootstrap --workspace acme --repo my-repo --branch develop
|
|
40
80
|
```
|
|
41
81
|
|
|
42
|
-
###
|
|
82
|
+
### Check a PR
|
|
43
83
|
|
|
44
84
|
```bash
|
|
45
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
53
|
-
- `1` — Matches found
|
|
113
|
+
### Versioned Catalog
|
|
54
114
|
|
|
55
|
-
|
|
115
|
+
Rulesets are published as immutable versioned artifacts:
|
|
56
116
|
|
|
57
|
-
|
|
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
|
-
|
|
128
|
+
### Feedback Loop & Auto-Tune
|
|
60
129
|
|
|
61
|
-
|
|
130
|
+
Mark findings as false positives. After enough feedback, PRISM auto-excludes noisy patterns.
|
|
62
131
|
|
|
63
132
|
```bash
|
|
64
|
-
#
|
|
65
|
-
prism
|
|
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
|
-
#
|
|
68
|
-
prism
|
|
136
|
+
# CLI: auto-exclude patterns with 3+ false positives
|
|
137
|
+
prism guard check --pr 42 --auto-tune
|
|
69
138
|
```
|
|
70
139
|
|
|
71
|
-
|
|
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
|
-
#
|
|
75
|
-
prism
|
|
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
|
-
|
|
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
|
-
|
|
158
|
+
---
|
|
159
|
+
|
|
160
|
+
## Interactive TUI
|
|
81
161
|
|
|
82
162
|
```bash
|
|
83
|
-
prism
|
|
163
|
+
prism # main TUI (review + navigation)
|
|
164
|
+
prism guard # guard-focused TUI
|
|
84
165
|
```
|
|
85
166
|
|
|
86
|
-
|
|
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
|
-
|
|
90
|
-
prism
|
|
210
|
+
prism review start --workspace acme --repo app --pr 42
|
|
91
211
|
|
|
92
|
-
#
|
|
93
|
-
prism review start
|
|
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
|
-
|
|
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 |
|
|
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
|
|
106
|
-
| `prism guard check` |
|
|
107
|
-
| `prism rules
|
|
108
|
-
| `prism rules
|
|
109
|
-
| `prism rules
|
|
110
|
-
| `prism
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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,
|
|
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":"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,mEAAmE;IACnE,IAAI,SAAS,KAAK,SAAS,IAAI,OAAO,KAAK,uBAAuB,EAAE,CAAC;QACnE,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QAC1E,MAAM,kBAAkB,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAEtH,IAAI,kBAAkB,EAAE,CAAC;YACvB,KAAK,CAAC,IAAI,CAAC,gEAAgE;gBACzE,mEAAmE;gBACnE,0GAA0G;gBAC1G,wHAAwH;gBACxH,4GAA4G;gBAC5G,mGAAmG,CAAC,CAAC;QACzG,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,IAAI,CAAC,2EAA2E;gBACpF,mEAAmE;gBACnE,wLAAwL;gBACxL,sFAAsF;gBACtF,qFAAqF;gBACrF,qGAAqG,CAAC,CAAC;QAC3G,CAAC;IACH,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,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 |
|