prr-kit 1.1.3 → 1.2.1
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/LICENSE +1 -1
- package/README.md +260 -235
- package/docs/assets/banner.svg +30 -248
- package/docs/assets/how-it-works.svg +87 -0
- package/package.json +60 -60
- package/src/core/agents/prr-master.agent.yaml +18 -7
- package/src/core/tasks/clear.md +140 -0
- package/src/core/tasks/help.md +15 -13
- package/src/core/workflows/clear/workflow.md +6 -0
- package/src/core/workflows/help/workflow.md +6 -0
- package/src/core/workflows/party-mode/steps/step-01-load-reviewers.md +35 -24
- package/src/core/workflows/party-mode/steps/step-02-discussion.md +45 -25
- package/src/core/workflows/party-mode/workflow.md +2 -2
- package/src/prr/agents/architecture-reviewer.agent.yaml +65 -45
- package/src/prr/agents/business-reviewer.agent.yaml +66 -0
- package/src/prr/agents/general-reviewer.agent.yaml +64 -48
- package/src/prr/agents/performance-reviewer.agent.yaml +65 -45
- package/src/prr/agents/security-reviewer.agent.yaml +67 -43
- package/src/prr/config-template.yaml +97 -0
- package/src/prr/data/stacks/actix.md +55 -0
- package/src/prr/data/stacks/alpine.md +47 -0
- package/src/prr/data/stacks/android.md +53 -0
- package/src/prr/data/stacks/angular.md +96 -0
- package/src/prr/data/stacks/ansible.md +55 -0
- package/src/prr/data/stacks/apollo.md +54 -0
- package/src/prr/data/stacks/astro.md +48 -0
- package/src/prr/data/stacks/aws-cdk.md +55 -0
- package/src/prr/data/stacks/axum.md +56 -0
- package/src/prr/data/stacks/babylonjs.md +55 -0
- package/src/prr/data/stacks/bash.md +53 -0
- package/src/prr/data/stacks/bevy.md +53 -0
- package/src/prr/data/stacks/bootstrap.md +52 -0
- package/src/prr/data/stacks/bun.md +55 -0
- package/src/prr/data/stacks/cpp.md +57 -0
- package/src/prr/data/stacks/csharp.md +95 -0
- package/src/prr/data/stacks/css.md +55 -0
- package/src/prr/data/stacks/cypress.md +53 -0
- package/src/prr/data/stacks/d3.md +53 -0
- package/src/prr/data/stacks/deno.md +49 -0
- package/src/prr/data/stacks/django.md +92 -0
- package/src/prr/data/stacks/docker.md +79 -0
- package/src/prr/data/stacks/drizzle.md +54 -0
- package/src/prr/data/stacks/dynamodb.md +55 -0
- package/src/prr/data/stacks/electron.md +44 -0
- package/src/prr/data/stacks/elixir.md +53 -0
- package/src/prr/data/stacks/expo.md +53 -0
- package/src/prr/data/stacks/expressjs.md +82 -0
- package/src/prr/data/stacks/fastapi.md +88 -0
- package/src/prr/data/stacks/fastify.md +60 -0
- package/src/prr/data/stacks/fiber.md +55 -0
- package/src/prr/data/stacks/firebase.md +43 -0
- package/src/prr/data/stacks/flask.md +46 -0
- package/src/prr/data/stacks/flutter.md +75 -0
- package/src/prr/data/stacks/gin.md +57 -0
- package/src/prr/data/stacks/github-actions.md +71 -0
- package/src/prr/data/stacks/go.md +88 -0
- package/src/prr/data/stacks/godot.md +56 -0
- package/src/prr/data/stacks/graphql.md +76 -0
- package/src/prr/data/stacks/grpc.md +56 -0
- package/src/prr/data/stacks/haskell.md +48 -0
- package/src/prr/data/stacks/helm.md +54 -0
- package/src/prr/data/stacks/hono.md +54 -0
- package/src/prr/data/stacks/htmx.md +38 -0
- package/src/prr/data/stacks/java.md +87 -0
- package/src/prr/data/stacks/jest-vitest.md +87 -0
- package/src/prr/data/stacks/jquery.md +50 -0
- package/src/prr/data/stacks/junit.md +53 -0
- package/src/prr/data/stacks/kotlin.md +89 -0
- package/src/prr/data/stacks/kubernetes.md +148 -0
- package/src/prr/data/stacks/langchain.md +56 -0
- package/src/prr/data/stacks/laravel.md +56 -0
- package/src/prr/data/stacks/libgdx.md +46 -0
- package/src/prr/data/stacks/lit.md +49 -0
- package/src/prr/data/stacks/love2d.md +51 -0
- package/src/prr/data/stacks/lua.md +51 -0
- package/src/prr/data/stacks/mobx.md +54 -0
- package/src/prr/data/stacks/mongodb.md +85 -0
- package/src/prr/data/stacks/monogame.md +51 -0
- package/src/prr/data/stacks/mysql.md +57 -0
- package/src/prr/data/stacks/nestjs.md +95 -0
- package/src/prr/data/stacks/nextjs.md +88 -0
- package/src/prr/data/stacks/nginx.md +55 -0
- package/src/prr/data/stacks/node.md +56 -0
- package/src/prr/data/stacks/nuxtjs.md +91 -0
- package/src/prr/data/stacks/openai-api.md +54 -0
- package/src/prr/data/stacks/opengl.md +54 -0
- package/src/prr/data/stacks/phaser.md +54 -0
- package/src/prr/data/stacks/phoenix.md +55 -0
- package/src/prr/data/stacks/php.md +56 -0
- package/src/prr/data/stacks/playwright.md +86 -0
- package/src/prr/data/stacks/postgresql.md +60 -0
- package/src/prr/data/stacks/prisma.md +81 -0
- package/src/prr/data/stacks/pygame.md +52 -0
- package/src/prr/data/stacks/pytest.md +53 -0
- package/src/prr/data/stacks/python.md +94 -0
- package/src/prr/data/stacks/pytorch.md +54 -0
- package/src/prr/data/stacks/qwik.md +50 -0
- package/src/prr/data/stacks/rails.md +48 -0
- package/src/prr/data/stacks/react-native.md +77 -0
- package/src/prr/data/stacks/react.md +104 -0
- package/src/prr/data/stacks/redis.md +76 -0
- package/src/prr/data/stacks/redux.md +107 -0
- package/src/prr/data/stacks/remix.md +51 -0
- package/src/prr/data/stacks/rust.md +88 -0
- package/src/prr/data/stacks/sass.md +51 -0
- package/src/prr/data/stacks/scala.md +50 -0
- package/src/prr/data/stacks/scikit-learn.md +53 -0
- package/src/prr/data/stacks/sequelize.md +54 -0
- package/src/prr/data/stacks/socket-io.md +54 -0
- package/src/prr/data/stacks/solidity.md +53 -0
- package/src/prr/data/stacks/solidjs.md +45 -0
- package/src/prr/data/stacks/spring-boot.md +92 -0
- package/src/prr/data/stacks/sql.md +85 -0
- package/src/prr/data/stacks/sqlite.md +55 -0
- package/src/prr/data/stacks/styled-components.md +51 -0
- package/src/prr/data/stacks/supabase.md +57 -0
- package/src/prr/data/stacks/svelte.md +77 -0
- package/src/prr/data/stacks/sveltekit.md +54 -0
- package/src/prr/data/stacks/swift.md +61 -0
- package/src/prr/data/stacks/tailwindcss.md +10 -0
- package/src/prr/data/stacks/tanstack-query.md +48 -0
- package/src/prr/data/stacks/tauri.md +52 -0
- package/src/prr/data/stacks/terraform.md +53 -0
- package/src/prr/data/stacks/three.md +53 -0
- package/src/prr/data/stacks/trpc.md +49 -0
- package/src/prr/data/stacks/typeorm.md +40 -0
- package/src/prr/data/stacks/typescript.md +83 -0
- package/src/prr/data/stacks/unity.md +61 -0
- package/src/prr/data/stacks/unreal.md +58 -0
- package/src/prr/data/stacks/vite.md +48 -0
- package/src/prr/data/stacks/vue3.md +95 -0
- package/src/prr/data/stacks/vulkan.md +53 -0
- package/src/prr/data/stacks/wasm.md +49 -0
- package/src/prr/data/stacks/webpack.md +48 -0
- package/src/prr/data/stacks/zig.md +51 -0
- package/src/prr/data/stacks/zustand.md +56 -0
- package/src/prr/workflows/1-discover/select-pr/steps/step-05-confirm.md +1 -0
- package/src/prr/workflows/1-discover/select-pr/workflow.md +1 -1
- package/src/prr/workflows/2-analyze/collect-pr-context/steps/step-01-analyze-files.md +334 -0
- package/src/prr/workflows/2-analyze/collect-pr-context/steps/step-02-collect-sources.md +451 -0
- package/src/prr/workflows/2-analyze/collect-pr-context/steps/step-03-build-knowledge-base.md +337 -0
- package/src/prr/workflows/2-analyze/collect-pr-context/workflow.md +123 -0
- package/src/prr/workflows/2-analyze/describe-pr/steps/step-02-classify.md +12 -6
- package/src/prr/workflows/2-analyze/describe-pr/steps/step-03-walkthrough.md +59 -1
- package/src/prr/workflows/3-review/architecture-review/checklist.md +4 -0
- package/src/prr/workflows/3-review/architecture-review/instructions.xml +32 -4
- package/src/prr/workflows/3-review/architecture-review/workflow.yaml +17 -18
- package/src/prr/workflows/3-review/business-review/checklist.md +27 -0
- package/src/prr/workflows/3-review/business-review/instructions.xml +153 -0
- package/src/prr/workflows/3-review/business-review/workflow.yaml +17 -0
- package/src/prr/workflows/3-review/general-review/checklist.md +5 -1
- package/src/prr/workflows/3-review/general-review/instructions.xml +39 -8
- package/src/prr/workflows/3-review/general-review/workflow.yaml +17 -18
- package/src/prr/workflows/3-review/performance-review/checklist.md +3 -1
- package/src/prr/workflows/3-review/performance-review/instructions.xml +10 -3
- package/src/prr/workflows/3-review/performance-review/workflow.yaml +17 -18
- package/src/prr/workflows/3-review/security-review/checklist.md +2 -1
- package/src/prr/workflows/3-review/security-review/instructions.xml +8 -3
- package/src/prr/workflows/3-review/security-review/workflow.yaml +18 -19
- package/src/prr/workflows/4-improve/improve-code/workflow.yaml +17 -18
- package/src/prr/workflows/6-report/generate-report/steps/step-01-collect.md +9 -2
- package/src/prr/workflows/6-report/generate-report/steps/step-02-organize.md +28 -7
- package/src/prr/workflows/6-report/generate-report/steps/step-03-write.md +6 -4
- package/src/prr/workflows/6-report/generate-report/templates/review-report.template.md +124 -78
- package/src/prr/workflows/6-report/post-comments/steps/step-01-format.md +104 -13
- package/src/prr/workflows/6-report/post-comments/steps/step-02-post.md +92 -21
- package/src/prr/workflows/6-report/post-comments/workflow.md +6 -0
- package/src/prr/workflows/quick/workflow.md +138 -32
- package/src/prr/workflows/0-setup/collect-project-context/steps/step-01-scan-configs.md +0 -106
- package/src/prr/workflows/0-setup/collect-project-context/steps/step-02-extract-rules.md +0 -131
- package/src/prr/workflows/0-setup/collect-project-context/steps/step-03-ask-context.md +0 -194
- package/src/prr/workflows/0-setup/collect-project-context/steps/step-04-save-context.md +0 -161
- package/src/prr/workflows/0-setup/collect-project-context/workflow.md +0 -58
|
@@ -0,0 +1,334 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: "step-01-analyze-files"
|
|
3
|
+
description: "Analyze files changed in PR to determine context needs"
|
|
4
|
+
nextStepFile: "./step-02-collect-sources.md"
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Step 1: Analyze Changed Files
|
|
8
|
+
|
|
9
|
+
## Goal
|
|
10
|
+
Determine what context is needed based on files changed in the PR.
|
|
11
|
+
|
|
12
|
+
## Sequence of Instructions
|
|
13
|
+
|
|
14
|
+
### 1. Announce Analysis
|
|
15
|
+
|
|
16
|
+
```
|
|
17
|
+
🔍 Analyzing PR changes to determine context needs...
|
|
18
|
+
Files changed: {n}
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
### 2. Extract File Information
|
|
22
|
+
|
|
23
|
+
For each file in the PR diff, extract:
|
|
24
|
+
|
|
25
|
+
**File metadata:**
|
|
26
|
+
- Full path (e.g., `src/stores/todoStore.js`)
|
|
27
|
+
- File extension (`.js`, `.vue`, `.ts`, `.py`, etc.)
|
|
28
|
+
- Directory path segments (e.g., `src`, `stores`)
|
|
29
|
+
|
|
30
|
+
**File categories:**
|
|
31
|
+
```javascript
|
|
32
|
+
const fileCategories = {
|
|
33
|
+
'src/components/*.vue': 'vue-component',
|
|
34
|
+
'src/views/*.vue': 'vue-view',
|
|
35
|
+
'src/stores/*.js': 'pinia-store',
|
|
36
|
+
'src/router/*.js': 'vue-router',
|
|
37
|
+
'src/composables/*.js': 'composable',
|
|
38
|
+
'*.test.js|*.spec.js': 'test',
|
|
39
|
+
'src/utils/*.js': 'utility',
|
|
40
|
+
'*.css|*.scss': 'stylesheet'
|
|
41
|
+
}
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
### 3. Detect Domains
|
|
45
|
+
|
|
46
|
+
Based on file paths and content, identify domains:
|
|
47
|
+
|
|
48
|
+
**Domain detection patterns:**
|
|
49
|
+
```javascript
|
|
50
|
+
const domainPatterns = {
|
|
51
|
+
'authentication': ['auth', 'login', 'jwt', 'token', 'session'],
|
|
52
|
+
'state-management': ['store', 'pinia', 'vuex', 'state'],
|
|
53
|
+
'routing': ['router', 'route', 'navigation'],
|
|
54
|
+
'ui-components': ['component', 'button', 'input', 'form'],
|
|
55
|
+
'api': ['api', 'fetch', 'axios', 'http', 'endpoint'],
|
|
56
|
+
'database': ['db', 'query', 'model', 'schema'],
|
|
57
|
+
'security': ['auth', 'permission', 'validate', 'sanitize']
|
|
58
|
+
}
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
### 4. Scan for Inline Annotations
|
|
62
|
+
|
|
63
|
+
In changed lines, look for special comments:
|
|
64
|
+
|
|
65
|
+
```javascript
|
|
66
|
+
// @context: This module handles user authentication
|
|
67
|
+
// @security: All inputs must be validated before storage
|
|
68
|
+
// @pattern: Use repository pattern for data access
|
|
69
|
+
// @rule: ESLint vue/multi-word-component-names must be followed
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
Extract these annotations with:
|
|
73
|
+
- File path
|
|
74
|
+
- Line number
|
|
75
|
+
- Annotation type
|
|
76
|
+
- Content
|
|
77
|
+
|
|
78
|
+
### 5. Identify Config Files Needed
|
|
79
|
+
|
|
80
|
+
Based on file types changed:
|
|
81
|
+
|
|
82
|
+
```javascript
|
|
83
|
+
const configMapping = {
|
|
84
|
+
'.vue': ['.eslintrc*', '.prettierrc*', 'vite.config.*'],
|
|
85
|
+
'.js|.ts': ['.eslintrc*', '.prettierrc*', 'tsconfig.json'],
|
|
86
|
+
'.py': ['pyproject.toml', '.flake8', 'mypy.ini'],
|
|
87
|
+
'.css|.scss': ['.stylelintrc*']
|
|
88
|
+
}
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
### 6. Identify Docs Needed
|
|
92
|
+
|
|
93
|
+
Based on domains and categories:
|
|
94
|
+
|
|
95
|
+
```javascript
|
|
96
|
+
const docsMapping = {
|
|
97
|
+
'vue-component': ['CONTRIBUTING.md → Component section', 'docs/components.md'],
|
|
98
|
+
'pinia-store': ['ARCHITECTURE.md → State management', 'docs/state-management.md'],
|
|
99
|
+
'security': ['CONTRIBUTING.md → Security section', 'docs/security.md'],
|
|
100
|
+
'api': ['docs/api-guidelines.md', 'ARCHITECTURE.md → API section']
|
|
101
|
+
}
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
### 7. Detect Technology Stacks
|
|
105
|
+
|
|
106
|
+
Analyze file extensions, import statements, config files, and directory structure to detect which technology stacks are involved in the PR. This information is used in Step 2 to load stack-specific review rules.
|
|
107
|
+
|
|
108
|
+
**Frontend Frameworks:**
|
|
109
|
+
|
|
110
|
+
| Stack key | Detection signals |
|
|
111
|
+
|-----------|-------------------|
|
|
112
|
+
| `vue3` | `*.vue` files · `from 'vue'` · `<script setup>` · `defineComponent` · `vite.config.*` with vue plugin |
|
|
113
|
+
| `react` | `*.jsx` / `*.tsx` · `from 'react'` · `useState` / `useEffect` · JSX syntax |
|
|
114
|
+
| `angular` | `*.component.ts` · `@Component(` · `@NgModule(` · `angular.json` |
|
|
115
|
+
| `svelte` | `*.svelte` files |
|
|
116
|
+
| `nextjs` | `next.config.*` · `pages/` or `app/` dir · `getServerSideProps` · `from 'next'` |
|
|
117
|
+
| `nuxtjs` | `nuxt.config.*` · `useNuxtApp` · `defineNuxtComponent` · `.nuxt/` |
|
|
118
|
+
| `astro` | `*.astro` files · `astro.config.*` · `from 'astro'` · `@astrojs/` imports |
|
|
119
|
+
| `solidjs` | `from 'solid-js'` · `createSignal` · `createEffect` · `<Show>` · `<For>` · `vite-plugin-solid` |
|
|
120
|
+
| `htmx` | `htmx.min.js` · `hx-get` / `hx-post` / `hx-swap` attributes in HTML templates |
|
|
121
|
+
|
|
122
|
+
**Styling:**
|
|
123
|
+
|
|
124
|
+
| Stack key | Detection signals |
|
|
125
|
+
|-----------|-------------------|
|
|
126
|
+
| `typescript` | `*.ts` / `*.tsx` · `tsconfig.json` · `typescript` in devDeps |
|
|
127
|
+
| `tailwindcss` | `tailwind.config.*` · `@tailwind` · `@apply` in CSS · utility class patterns |
|
|
128
|
+
| `css` | `*.css` / `*.scss` / `*.sass` / `*.less` / `*.styl` files |
|
|
129
|
+
|
|
130
|
+
**State Management:**
|
|
131
|
+
|
|
132
|
+
| Stack key | Detection signals |
|
|
133
|
+
|-----------|-------------------|
|
|
134
|
+
| `redux` | `@reduxjs/toolkit` or `redux` in deps · `createSlice` · `configureStore` · `useSelector` · `useDispatch` |
|
|
135
|
+
|
|
136
|
+
**Backend — Node.js:**
|
|
137
|
+
|
|
138
|
+
| Stack key | Detection signals |
|
|
139
|
+
|-----------|-------------------|
|
|
140
|
+
| `nestjs` | `@Module(` · `@Injectable(` · `@Controller(` · `NestFactory` · `nest-cli.json` |
|
|
141
|
+
| `expressjs` | `express()` · `app.use(` · `router.get/post` · `from 'express'` |
|
|
142
|
+
|
|
143
|
+
**Backend — Python:**
|
|
144
|
+
|
|
145
|
+
| Stack key | Detection signals |
|
|
146
|
+
|-----------|-------------------|
|
|
147
|
+
| `fastapi` | `from fastapi` · `@app.get` · `Depends(` · `BaseModel` (pydantic) |
|
|
148
|
+
| `django` | `from django` · `models.Model` · `views.py` · `urls.py` · `manage.py` |
|
|
149
|
+
| `flask` | `from flask import` · `@app.route` · `Flask(__name__)` |
|
|
150
|
+
| `python` | `*.py` files without more specific framework signals |
|
|
151
|
+
|
|
152
|
+
**Backend — Java:**
|
|
153
|
+
|
|
154
|
+
| Stack key | Detection signals |
|
|
155
|
+
|-----------|-------------------|
|
|
156
|
+
| `spring-boot` | `@SpringBootApplication` · `@RestController` · `@Service` · `application.properties` |
|
|
157
|
+
| `java` | `*.java` files · `public class` · `import java.` · without Spring Boot signals |
|
|
158
|
+
|
|
159
|
+
**Backend — Kotlin:**
|
|
160
|
+
|
|
161
|
+
| Stack key | Detection signals |
|
|
162
|
+
|-----------|-------------------|
|
|
163
|
+
| `kotlin` | `*.kt` files · `fun main()` · `import kotlin.` · `build.gradle.kts` · `@Composable` |
|
|
164
|
+
|
|
165
|
+
**Backend — C# / .NET:**
|
|
166
|
+
|
|
167
|
+
| Stack key | Detection signals |
|
|
168
|
+
|-----------|-------------------|
|
|
169
|
+
| `csharp` | `*.cs` files · `*.csproj` · `*.sln` · `using System` · `namespace` · `appsettings.json` |
|
|
170
|
+
|
|
171
|
+
**Backend — C++:**
|
|
172
|
+
|
|
173
|
+
| Stack key | Detection signals |
|
|
174
|
+
|-----------|-------------------|
|
|
175
|
+
| `cpp` | `*.cpp` / `*.cc` / `*.cxx` files · `*.hpp` · `#include <` · `CMakeLists.txt` · `Makefile` |
|
|
176
|
+
|
|
177
|
+
**Backend — Rust:**
|
|
178
|
+
|
|
179
|
+
| Stack key | Detection signals |
|
|
180
|
+
|-----------|-------------------|
|
|
181
|
+
| `rust` | `*.rs` files · `Cargo.toml` · `Cargo.lock` · `fn main()` · `use std::` · `impl` |
|
|
182
|
+
|
|
183
|
+
**Backend — Elixir:**
|
|
184
|
+
|
|
185
|
+
| Stack key | Detection signals |
|
|
186
|
+
|-----------|-------------------|
|
|
187
|
+
| `elixir` | `*.ex` / `*.exs` files · `mix.exs` · `defmodule` · `use Phoenix.` · `Repo.` · `Ecto.` |
|
|
188
|
+
|
|
189
|
+
**Backend — Go:**
|
|
190
|
+
|
|
191
|
+
| Stack key | Detection signals |
|
|
192
|
+
|-----------|-------------------|
|
|
193
|
+
| `go` | `*.go` files · `go.mod` · `package main` |
|
|
194
|
+
|
|
195
|
+
**Backend — PHP:**
|
|
196
|
+
|
|
197
|
+
| Stack key | Detection signals |
|
|
198
|
+
|-----------|-------------------|
|
|
199
|
+
| `laravel` | `*.php` + `artisan` · `Eloquent` · `routes/web.php` · `app/Http/Controllers` |
|
|
200
|
+
|
|
201
|
+
**Backend — Ruby:**
|
|
202
|
+
|
|
203
|
+
| Stack key | Detection signals |
|
|
204
|
+
|-----------|-------------------|
|
|
205
|
+
| `rails` | `*.rb` + `Gemfile` with rails · `ApplicationController` · `config/routes.rb` |
|
|
206
|
+
|
|
207
|
+
**Database / ORM:**
|
|
208
|
+
|
|
209
|
+
| Stack key | Detection signals |
|
|
210
|
+
|-----------|-------------------|
|
|
211
|
+
| `sql` | `*.sql` · raw SQL strings in code (`SELECT`, `INSERT`, `UPDATE`) · `db.query(` |
|
|
212
|
+
| `prisma` | `prisma/schema.prisma` · `@prisma/client` · `PrismaClient` |
|
|
213
|
+
| `typeorm` | `@Entity(` · `@Column(` · `DataSource` · `createConnection` |
|
|
214
|
+
| `mongodb` | `mongoose` · `MongoClient` · `Schema(` · `.aggregate(` |
|
|
215
|
+
|
|
216
|
+
**Cache / KV Store:**
|
|
217
|
+
|
|
218
|
+
| Stack key | Detection signals |
|
|
219
|
+
|-----------|-------------------|
|
|
220
|
+
| `redis` | `ioredis` / `redis` in deps · `createClient()` · `HSET` · `GET` / `SET` commands · `redis://` URIs |
|
|
221
|
+
|
|
222
|
+
**BaaS / Cloud Platform:**
|
|
223
|
+
|
|
224
|
+
| Stack key | Detection signals |
|
|
225
|
+
|-----------|-------------------|
|
|
226
|
+
| `firebase` | `firebase` in deps · `initializeApp(` · `getFirestore(` · `getAuth(` · `firebase.json` |
|
|
227
|
+
|
|
228
|
+
**Testing — Unit / Integration:**
|
|
229
|
+
|
|
230
|
+
| Stack key | Detection signals |
|
|
231
|
+
|-----------|-------------------|
|
|
232
|
+
| `jest-vitest` | `jest.config.*` · `vitest.config.*` · `*.test.ts/js` · `*.spec.ts/js` |
|
|
233
|
+
|
|
234
|
+
**Testing — E2E:**
|
|
235
|
+
|
|
236
|
+
| Stack key | Detection signals |
|
|
237
|
+
|-----------|-------------------|
|
|
238
|
+
| `playwright` | `playwright.config.*` · `cypress.config.*` · `*.cy.js` · `page.goto` · `cy.` commands |
|
|
239
|
+
|
|
240
|
+
**Infrastructure:**
|
|
241
|
+
|
|
242
|
+
| Stack key | Detection signals |
|
|
243
|
+
|-----------|-------------------|
|
|
244
|
+
| `docker` | `Dockerfile*` · `docker-compose*.yml` · `.dockerignore` |
|
|
245
|
+
| `kubernetes` | `*.yaml` with `apiVersion:` + `kind: Deployment/Pod/Service` · `kubectl` · `kustomization.yaml` · Helm charts |
|
|
246
|
+
| `terraform` | `*.tf` files · `terraform {` · `resource "` · `provider "` · `terraform.tfvars` |
|
|
247
|
+
| `github-actions` | `.github/workflows/*.yml` · `on:` + `jobs:` + `steps:` · `uses: actions/` |
|
|
248
|
+
|
|
249
|
+
**API Layer:**
|
|
250
|
+
|
|
251
|
+
| Stack key | Detection signals |
|
|
252
|
+
|-----------|-------------------|
|
|
253
|
+
| `graphql` | `*.graphql` / `*.gql` · `gql\`` · `typeDefs` · `resolvers` · `ApolloServer` |
|
|
254
|
+
|
|
255
|
+
**Mobile:**
|
|
256
|
+
|
|
257
|
+
| Stack key | Detection signals |
|
|
258
|
+
|-----------|-------------------|
|
|
259
|
+
| `react-native` | `react-native` in deps · RN component imports (`View`, `Text`, `StyleSheet`) |
|
|
260
|
+
| `flutter` | `*.dart` files · `pubspec.yaml` with `flutter:` · `import 'package:flutter/` · `Widget` |
|
|
261
|
+
| `kotlin` | (see Backend — Kotlin above; also applies to Android development) |
|
|
262
|
+
| `swift` | `*.swift` files · `import UIKit` / `import SwiftUI` · `Package.swift` · `*.xcodeproj` |
|
|
263
|
+
|
|
264
|
+
**Desktop:**
|
|
265
|
+
|
|
266
|
+
| Stack key | Detection signals |
|
|
267
|
+
|-----------|-------------------|
|
|
268
|
+
| `electron` | `electron` in deps · `BrowserWindow` · `ipcMain` · `ipcRenderer` · `app.whenReady()` |
|
|
269
|
+
|
|
270
|
+
**Runtime:**
|
|
271
|
+
|
|
272
|
+
| Stack key | Detection signals |
|
|
273
|
+
|-----------|-------------------|
|
|
274
|
+
| `deno` | `deno.json` / `deno.jsonc` · `Deno.` namespace · `jsr:` / `npm:` specifiers · `deno run` in scripts |
|
|
275
|
+
|
|
276
|
+
**Output — add to analysis summary:**
|
|
277
|
+
```yaml
|
|
278
|
+
detected_stacks: [vue3, typescript, tailwindcss] # list of matched stack keys
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
If no stack is confidently detected → `detected_stacks: []` — steps downstream skip stack-specific loading silently.
|
|
282
|
+
|
|
283
|
+
---
|
|
284
|
+
|
|
285
|
+
### 8. Build Analysis Summary
|
|
286
|
+
|
|
287
|
+
```javascript
|
|
288
|
+
{
|
|
289
|
+
"files_changed": [
|
|
290
|
+
{
|
|
291
|
+
"path": "src/stores/todoStore.js",
|
|
292
|
+
"extension": ".js",
|
|
293
|
+
"category": "pinia-store",
|
|
294
|
+
"domains": ["state-management"],
|
|
295
|
+
"annotations": [
|
|
296
|
+
{
|
|
297
|
+
"line": 10,
|
|
298
|
+
"type": "@pattern",
|
|
299
|
+
"content": "Use composition API only"
|
|
300
|
+
}
|
|
301
|
+
]
|
|
302
|
+
},
|
|
303
|
+
{
|
|
304
|
+
"path": "src/views/TodoListView.vue",
|
|
305
|
+
"extension": ".vue",
|
|
306
|
+
"category": "vue-view",
|
|
307
|
+
"domains": ["ui-components", "state-management"]
|
|
308
|
+
}
|
|
309
|
+
],
|
|
310
|
+
"context_needs": {
|
|
311
|
+
"configs": [".eslintrc.js", ".prettierrc", "vite.config.js"],
|
|
312
|
+
"docs": ["CONTRIBUTING.md", "ARCHITECTURE.md"],
|
|
313
|
+
"primary": ["CLAUDE.md", "AGENTS.md"],
|
|
314
|
+
"domains": ["state-management", "ui-components"]
|
|
315
|
+
},
|
|
316
|
+
"detected_stacks": ["vue3", "typescript"]
|
|
317
|
+
}
|
|
318
|
+
```
|
|
319
|
+
|
|
320
|
+
### 9. Report Analysis
|
|
321
|
+
|
|
322
|
+
```
|
|
323
|
+
✓ File analysis complete:
|
|
324
|
+
📄 Files: {n} ({list of extensions})
|
|
325
|
+
🎯 Domains: {domains}
|
|
326
|
+
🧩 Stacks detected: {detected_stacks or "none"}
|
|
327
|
+
📋 Configs needed: {configs}
|
|
328
|
+
📚 Docs needed: {docs}
|
|
329
|
+
💬 Annotations found: {count}
|
|
330
|
+
```
|
|
331
|
+
|
|
332
|
+
### 10. Load Next Step
|
|
333
|
+
|
|
334
|
+
Add `step-01-analyze-files` to `stepsCompleted`. Load: `{nextStepFile}`
|