navori 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +144 -0
- package/dist/assets/core/core-assets/managed/cierre-sesion.md +9 -0
- package/dist/assets/core/core-assets/managed/formato-respuesta.md +12 -0
- package/dist/assets/core/core-assets/managed/idioma-rol.md +4 -0
- package/dist/assets/core/core-assets/managed/tipado-fuerte.md +5 -0
- package/dist/assets/core/package.json +17 -0
- package/dist/assets/plugins/acli/managed/acli-protocol.md +10 -0
- package/dist/assets/plugins/acli/plugin.json +21 -0
- package/dist/assets/plugins/cognitive/managed/cognitive-protocol.md +9 -0
- package/dist/assets/plugins/cognitive/plugin.json +13 -0
- package/dist/assets/plugins/engram/managed/engram-protocol.md +5 -0
- package/dist/assets/plugins/engram/plugin.json +22 -0
- package/dist/assets/plugins/gh/managed/gh-protocol.md +12 -0
- package/dist/assets/plugins/gh/plugin.json +23 -0
- package/dist/assets/plugins/jscpd/managed/jscpd-protocol.md +10 -0
- package/dist/assets/plugins/jscpd/plugin.json +22 -0
- package/dist/assets/plugins/semgrep/managed/semgrep-protocol.md +14 -0
- package/dist/assets/plugins/semgrep/plugin.json +21 -0
- package/dist/index.js +3944 -0
- package/package.json +52 -0
package/README.md
ADDED
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
# navori
|
|
2
|
+
|
|
3
|
+
Multi-agent harness + SDD scaffolder for Claude Code (and other AI engines).
|
|
4
|
+
|
|
5
|
+
`navori` lleva tu setup de Claude Code (agentes, skills, hooks, CLAUDE.md, AGENTS.md) a múltiples repos con un solo comando — sin perder customización local, sin sobrescribir lo que ya tenías.
|
|
6
|
+
|
|
7
|
+
## Instalación
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npm i -g navori
|
|
11
|
+
# o sin instalar
|
|
12
|
+
npx navori init
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## Quick start
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
# Modo opinado: cero preguntas, todo configurado
|
|
19
|
+
cd ~/tu-repo
|
|
20
|
+
navori init --recommended
|
|
21
|
+
|
|
22
|
+
# O wizard interactivo con detección de stack
|
|
23
|
+
navori init
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
El `init` detecta automáticamente del repo:
|
|
27
|
+
- **Nombre** del proyecto (de `package.json`, `pyproject.toml`, `Cargo.toml`, git remote o basename)
|
|
28
|
+
- **Stack**: framework (Next.js, Vite, NestJS, Expo, etc.), UI, forms, state, test
|
|
29
|
+
- **Preset sugerido** basado en el stack (ej. `vite-react-ts-mantine`, `nextjs-apollo`, `bun-keystone`)
|
|
30
|
+
- **Quality gate** compuesto de los scripts del `package.json`
|
|
31
|
+
- **Branch base** del git (`origin/HEAD`, fallback main/master/develop)
|
|
32
|
+
- **Infraestructura Claude existente** (`.claude/`, `CLAUDE.md`, `AGENTS.md`, agents, skills) — ofrece coexistir o reemplazar con backup
|
|
33
|
+
|
|
34
|
+
Y genera:
|
|
35
|
+
- `navori.config.json` — fuente de verdad del repo
|
|
36
|
+
- `CLAUDE.md` con managed blocks que el CLI mantiene sincronizados
|
|
37
|
+
|
|
38
|
+
## Comandos
|
|
39
|
+
|
|
40
|
+
| Comando | Qué hace |
|
|
41
|
+
|---|---|
|
|
42
|
+
| `init` | Bootstrap del repo con detección automática + wizard |
|
|
43
|
+
| `add <plugin>` | Activa un plugin + opcionalmente instala la tool externa |
|
|
44
|
+
| `configure <section>` | Ajusta una sección del config sin re-correr el wizard |
|
|
45
|
+
| `update` | Re-detecta el repo, refresca config y corre sync en un paso |
|
|
46
|
+
| `render` | Genera CLAUDE.md con los managed blocks |
|
|
47
|
+
| `sync` | Refresca managed blocks con conflict resolution + backups |
|
|
48
|
+
| `doctor` | Inspecciona config + reporta procedencia de cada managed block |
|
|
49
|
+
| `workspace <sub>` | Gestiona workspaces cross-repo (init, ls, show, add-repo) |
|
|
50
|
+
| `ticket <sub>` | Gestiona tickets-as-files en un workspace (new, list, show) |
|
|
51
|
+
|
|
52
|
+
## Plugins disponibles
|
|
53
|
+
|
|
54
|
+
| Plugin | Para qué | External tool |
|
|
55
|
+
|---|---|---|
|
|
56
|
+
| `engram` | Memoria persistente entre sesiones | `engram` binary |
|
|
57
|
+
| `acli` | Leer tickets de Jira desde la terminal | `acli` |
|
|
58
|
+
| `gh` | GitHub Issues, PRs y workflow runs | `gh` |
|
|
59
|
+
| `jscpd` | Detección de duplicación en el diff | `jscpd` (opt-in) |
|
|
60
|
+
| `semgrep` | Security gate local | `semgrep` (opt-in) |
|
|
61
|
+
| `cognitive` | Guardrails de complejidad cognitiva | (ninguna) |
|
|
62
|
+
|
|
63
|
+
Activar uno:
|
|
64
|
+
```bash
|
|
65
|
+
navori add engram # te ofrece instalar la tool externa si falta
|
|
66
|
+
navori add engram --skip-install # solo registra el plugin
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
## Workspace + tickets cross-repo
|
|
70
|
+
|
|
71
|
+
Si un ticket toca varios repos (frontend + backend + microservicio), el workspace te da un punto único:
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
# Crear workspace
|
|
75
|
+
navori workspace init bonum --description "Bonum platform"
|
|
76
|
+
|
|
77
|
+
# Registrar repos del workspace
|
|
78
|
+
navori workspace add-repo bonum --name webapp --path ~/dev/bonum/webapp --stack vite-react-ts-mantine
|
|
79
|
+
navori workspace add-repo bonum --name backend --path ~/dev/bonum/nexus --stack nestjs
|
|
80
|
+
|
|
81
|
+
# Crear ticket
|
|
82
|
+
navori ticket new bonum BNM-123 --title "Checkout flow rebuild"
|
|
83
|
+
|
|
84
|
+
# En cada repo que tocás el ticket, agregá una referencia:
|
|
85
|
+
# echo "ticket: BNM-123" >> progress/current.md
|
|
86
|
+
|
|
87
|
+
# Ver el ticket + en qué repos aparece
|
|
88
|
+
navori ticket show bonum BNM-123
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
El workspace también guarda defaults heredables:
|
|
92
|
+
```bash
|
|
93
|
+
navori init --workspace bonum # hereda engines, plugins, branchBase, etc.
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
Storage: `~/.navori/workspaces/<name>/` (manifest + tickets/ + backups/).
|
|
97
|
+
|
|
98
|
+
## Managed blocks con versionado
|
|
99
|
+
|
|
100
|
+
Cada bloque que `navori` inyecta en tu `CLAUDE.md` lleva metadata:
|
|
101
|
+
|
|
102
|
+
```html
|
|
103
|
+
<!-- navori:managed id="idioma-rol" hash="3fbef743" version="0.0.1" source="@navori/core" -->
|
|
104
|
+
contenido sincronizado
|
|
105
|
+
<!-- /navori:managed id="idioma-rol" -->
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
- **`hash`**: detecta si vos editaste el bloque (sync te avisa antes de pisar)
|
|
109
|
+
- **`version`**: cuando se publica una nueva versión de `@navori/core` o un plugin, `sync` reporta "update available"
|
|
110
|
+
- **`source`**: qué paquete es dueño del bloque (`doctor` te muestra la procedencia de cada uno)
|
|
111
|
+
|
|
112
|
+
Si modificás un managed block a mano y después corrés `sync`, vas a ver:
|
|
113
|
+
```
|
|
114
|
+
Conflict in 'idioma-rol':
|
|
115
|
+
- tu versión
|
|
116
|
+
+ versión del Core
|
|
117
|
+
```
|
|
118
|
+
Y elegís: `skip-conflicts` (mantener tu edit), `apply-all` (pisar) o `abort`.
|
|
119
|
+
|
|
120
|
+
Backups automáticos en `~/.navori/backups/<timestamp>/` antes de cada `sync` (retención 30 días).
|
|
121
|
+
|
|
122
|
+
## Customización quirúrgica
|
|
123
|
+
|
|
124
|
+
Cambiar una sola cosa sin re-init:
|
|
125
|
+
|
|
126
|
+
```bash
|
|
127
|
+
navori configure plugins # multiselect de plugins activos
|
|
128
|
+
navori configure quality-gate # nuevo comando de quality gate
|
|
129
|
+
navori configure language en # switch a inglés (fallback a es)
|
|
130
|
+
navori configure engines # multiselect: claude / agents-md / cursor / copilot
|
|
131
|
+
navori configure workspace bonum # asociar a un workspace
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
## Filosofía
|
|
135
|
+
|
|
136
|
+
- **Cero opinión sobre tu proceso**. El CLI detecta y propone; vos decidís.
|
|
137
|
+
- **Coexiste con harness existente**. Modo `coexist` no toca nada que ya tenías.
|
|
138
|
+
- **Nunca pisa silenciosamente**. Hash en el marker + backups antes de cada write.
|
|
139
|
+
- **Output legible siempre**. Texto + `--json` para piping en CI.
|
|
140
|
+
- **Bilingüe ready**. Schema soporta `language: es | en`. Hoy solo `es` está full; `en` cae en fallback honesto.
|
|
141
|
+
|
|
142
|
+
## Licencia
|
|
143
|
+
|
|
144
|
+
ISC.
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
## Cierre de sesión
|
|
2
|
+
|
|
3
|
+
Antes de cerrar la sesión:
|
|
4
|
+
|
|
5
|
+
1. **Quality gate**: corré `{{qualityGate.full}}` y confirmá que pasa (o documentá deuda en `progress/current.md`).
|
|
6
|
+
2. **History**: agregá entrada en `progress/history.md` con `## YYYY-MM-DD HH:MM <agente> — <resumen>` + cambios + estado del gate.
|
|
7
|
+
3. **Vaciar current**: dejá `progress/current.md` en estado `idle` o con el siguiente paso explícito.
|
|
8
|
+
4. **Sin temporales**: borrá scratch files, no dejes `console.log`, `debugger`, ni código comentado.
|
|
9
|
+
5. **Commit Conventional**: `feat|fix|chore|docs(scope): mensaje`, español MX, atómico. Nunca commitear `.claude/` ni `CLAUDE.md`.
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
## Formato de respuesta
|
|
2
|
+
|
|
3
|
+
**Bug fix** (sin intro ni cierre):
|
|
4
|
+
CAUSA: <1 línea> / ARCHIVO: <path>:<línea> / FIX: <diff mínimo>
|
|
5
|
+
|
|
6
|
+
**Code review**:
|
|
7
|
+
[CRÍTICO] ... # rompe build, security o pérdida de datos
|
|
8
|
+
[ALTO] ... # bug funcional, regresión
|
|
9
|
+
[MEDIO] ... # legibilidad, naming
|
|
10
|
+
|
|
11
|
+
**Generación**: diff si modifica; archivo completo solo si es nuevo.
|
|
12
|
+
**Commits**: Conventional (`feat(scope): ...`), español MX, atómicos.
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
## Tipado fuerte
|
|
2
|
+
|
|
3
|
+
`any` prohibido. Usar `unknown` + narrowing. Tipar explícitamente: parámetros, retornos, callbacks, eventos, props, hooks y responses de services.
|
|
4
|
+
|
|
5
|
+
Excepción: `// any justificado: <razón>` — último recurso, no atajo. Si no hay razón clara, no es justificado.
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@navori/core",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "Universal harness primitives — managed core assets",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"exports": {
|
|
7
|
+
".": "./src/index.ts",
|
|
8
|
+
"./assets/*": "./core-assets/*"
|
|
9
|
+
},
|
|
10
|
+
"files": [
|
|
11
|
+
"src",
|
|
12
|
+
"core-assets"
|
|
13
|
+
],
|
|
14
|
+
"engines": {
|
|
15
|
+
"node": ">=20"
|
|
16
|
+
}
|
|
17
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
## Tickets de Jira (acli)
|
|
2
|
+
|
|
3
|
+
Para leer tickets de Jira usá **acli** (no el MCP de Atlassian).
|
|
4
|
+
|
|
5
|
+
- Ver un ticket: `acli jira workitem view <KEY>` (ej. `acli jira workitem view BNM-123`)
|
|
6
|
+
- Buscar tickets: `acli jira workitem search --jql "<JQL>"`
|
|
7
|
+
- Listar comentarios: `acli jira workitem comment list --key <KEY>`
|
|
8
|
+
- Listar transiciones: `acli jira workitem transition list --key <KEY>`
|
|
9
|
+
|
|
10
|
+
El MCP de Atlassian/Rovo queda como fallback si `acli` falla o no está disponible.
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "acli",
|
|
3
|
+
"name": "Atlassian CLI (Jira tickets)",
|
|
4
|
+
"description": "Lectura de tickets de Jira desde la terminal sin abrir el browser",
|
|
5
|
+
"version": "0.0.1",
|
|
6
|
+
"managed": [
|
|
7
|
+
{
|
|
8
|
+
"id": "acli-protocol",
|
|
9
|
+
"file": "managed/acli-protocol.md",
|
|
10
|
+
"recommendedAgent": "researcher"
|
|
11
|
+
}
|
|
12
|
+
],
|
|
13
|
+
"externalTool": {
|
|
14
|
+
"name": "acli",
|
|
15
|
+
"checkBinary": "acli",
|
|
16
|
+
"install": {
|
|
17
|
+
"darwin": "brew install atlassian-labs/acli/acli",
|
|
18
|
+
"linux": "curl -fsSL https://acli-releases.atlassian.com/install.sh | bash"
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
## Complejidad cognitiva (SonarJS)
|
|
2
|
+
|
|
3
|
+
Antes de aprobar un cambio, verificar que las funciones tocadas no exceden el umbral de complejidad cognitiva.
|
|
4
|
+
|
|
5
|
+
- Threshold por default: `cognitive-complexity: ["error", 15]` (ESLint SonarJS).
|
|
6
|
+
- Si una función excede el umbral: **refactorizar antes de aprobar** (extraer funciones, simplificar condicionales, dividir responsabilidades).
|
|
7
|
+
- Casos válidos donde se relaja: state machines explícitas, parsers, switch/case sobre un enum cerrado. Documentar con `// cognitive-complexity-allowed: <razón>` antes del bloque.
|
|
8
|
+
|
|
9
|
+
Tool externa no requerida — la regla corre dentro del lint del proyecto si está configurada. Si no, este protocolo es informativo y debe leerse en code review.
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "cognitive",
|
|
3
|
+
"name": "Cognitive complexity guardrails",
|
|
4
|
+
"description": "Detección de complejidad cognitiva alta via ESLint rule SonarJS",
|
|
5
|
+
"version": "0.0.1",
|
|
6
|
+
"managed": [
|
|
7
|
+
{
|
|
8
|
+
"id": "cognitive-protocol",
|
|
9
|
+
"file": "managed/cognitive-protocol.md",
|
|
10
|
+
"recommendedAgent": "reviewer"
|
|
11
|
+
}
|
|
12
|
+
]
|
|
13
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
## Engram
|
|
2
|
+
|
|
3
|
+
- `mem_save` proactivo tras decisión / bug-fix-con-root-cause / convención / discovery / preferencia confirmada.
|
|
4
|
+
- `mem_search` al inicio si el primer mensaje referencia el proyecto. Verificar en código que lo recordado siga existiendo antes de afirmarlo.
|
|
5
|
+
- `mem_session_summary` obligatorio antes de "listo": Goal · Discoveries · Accomplished · Next Steps · Relevant Files.
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "engram",
|
|
3
|
+
"name": "Engram persistent memory",
|
|
4
|
+
"description": "Memory persistence across Claude Code sessions via MCP server",
|
|
5
|
+
"version": "0.0.1",
|
|
6
|
+
"managed": [
|
|
7
|
+
{
|
|
8
|
+
"id": "engram-protocol",
|
|
9
|
+
"file": "managed/engram-protocol.md",
|
|
10
|
+
"recommendedAgent": "leader"
|
|
11
|
+
}
|
|
12
|
+
],
|
|
13
|
+
"externalTool": {
|
|
14
|
+
"name": "engram",
|
|
15
|
+
"checkBinary": "engram",
|
|
16
|
+
"install": {
|
|
17
|
+
"darwin": "brew install gentleman-programming/tap/engram",
|
|
18
|
+
"linux": "curl -fsSL https://raw.githubusercontent.com/Gentleman-Programming/engram/main/scripts/install.sh | bash"
|
|
19
|
+
},
|
|
20
|
+
"postInstall": "claude plugin install engram"
|
|
21
|
+
}
|
|
22
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
## GitHub CLI (gh)
|
|
2
|
+
|
|
3
|
+
Para interactuar con GitHub (issues, PRs, repos) usá **gh**:
|
|
4
|
+
|
|
5
|
+
- Ver issue: `gh issue view <number>` o `gh issue view <number> --comments`
|
|
6
|
+
- Buscar issues: `gh issue list --search "<query>"` o `gh issue list --label bug --state open`
|
|
7
|
+
- Crear PR: `gh pr create --title "..." --body "..."`
|
|
8
|
+
- Ver PR + checks: `gh pr view <number> --checks` o `gh pr checks <number>`
|
|
9
|
+
- Listar PRs: `gh pr list --state open`
|
|
10
|
+
- Ver workflow runs: `gh run list --limit 5` o `gh run view <id> --log-failed`
|
|
11
|
+
|
|
12
|
+
`gh auth status` muestra si está autenticado. Si falla, correr `gh auth login`.
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "gh",
|
|
3
|
+
"name": "GitHub CLI (issues + PRs)",
|
|
4
|
+
"description": "Acceso a Issues, PRs y repos de GitHub desde la terminal",
|
|
5
|
+
"version": "0.0.1",
|
|
6
|
+
"managed": [
|
|
7
|
+
{
|
|
8
|
+
"id": "gh-protocol",
|
|
9
|
+
"file": "managed/gh-protocol.md",
|
|
10
|
+
"recommendedAgent": "commit-pr-pilot"
|
|
11
|
+
}
|
|
12
|
+
],
|
|
13
|
+
"externalTool": {
|
|
14
|
+
"name": "gh",
|
|
15
|
+
"checkBinary": "gh",
|
|
16
|
+
"install": {
|
|
17
|
+
"darwin": "brew install gh",
|
|
18
|
+
"linux": "(see https://github.com/cli/cli/blob/trunk/docs/install_linux.md)",
|
|
19
|
+
"win32": "winget install --id GitHub.cli"
|
|
20
|
+
},
|
|
21
|
+
"postInstall": "gh auth status || gh auth login"
|
|
22
|
+
}
|
|
23
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
## Duplicación de código (jscpd)
|
|
2
|
+
|
|
3
|
+
Antes de aprobar un cambio, correr jscpd sobre el diff vs la branch base.
|
|
4
|
+
|
|
5
|
+
- Solo sobre archivos modificados:
|
|
6
|
+
```
|
|
7
|
+
git diff --name-only $BRANCH_BASE...HEAD | grep -E '\.(ts|tsx|js|jsx)$' | xargs jscpd --silent
|
|
8
|
+
```
|
|
9
|
+
- Si reporta clones >0 con threshold del proyecto: **no aprobar** el cambio sin justificar (los reviewers deben pedir refactor o extracción).
|
|
10
|
+
- Skip silencioso si `jscpd` no está en `PATH` (no bloquear si el dev no tiene la tool instalada).
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "jscpd",
|
|
3
|
+
"name": "jscpd (code duplication detector)",
|
|
4
|
+
"description": "Detección de duplicación de código en el diff vs branch base",
|
|
5
|
+
"version": "0.0.1",
|
|
6
|
+
"managed": [
|
|
7
|
+
{
|
|
8
|
+
"id": "jscpd-protocol",
|
|
9
|
+
"file": "managed/jscpd-protocol.md",
|
|
10
|
+
"recommendedAgent": "reviewer"
|
|
11
|
+
}
|
|
12
|
+
],
|
|
13
|
+
"externalTool": {
|
|
14
|
+
"name": "jscpd",
|
|
15
|
+
"checkBinary": "jscpd",
|
|
16
|
+
"install": {
|
|
17
|
+
"darwin": "pnpm add -g jscpd",
|
|
18
|
+
"linux": "pnpm add -g jscpd",
|
|
19
|
+
"win32": "pnpm add -g jscpd"
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
## Security gate local (semgrep)
|
|
2
|
+
|
|
3
|
+
Antes de cerrar un cambio relevante (auth, RBAC, secrets, input validation), correr semgrep sobre el diff.
|
|
4
|
+
|
|
5
|
+
- Scan rápido del diff:
|
|
6
|
+
```
|
|
7
|
+
git diff --name-only $BRANCH_BASE...HEAD | xargs semgrep --config=auto --severity=ERROR
|
|
8
|
+
```
|
|
9
|
+
- Scan completo del proyecto (más lento, opt-in):
|
|
10
|
+
```
|
|
11
|
+
semgrep --config=auto --error
|
|
12
|
+
```
|
|
13
|
+
- Reglas custom: ver `.semgrep.yml` en la raíz del repo si existe.
|
|
14
|
+
- Skip silencioso si `semgrep` no está instalado (no bloquear si el dev no lo tiene).
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "semgrep",
|
|
3
|
+
"name": "semgrep (security + pattern analysis)",
|
|
4
|
+
"description": "Detección de vulnerabilidades y patrones inseguros local opt-in",
|
|
5
|
+
"version": "0.0.1",
|
|
6
|
+
"managed": [
|
|
7
|
+
{
|
|
8
|
+
"id": "semgrep-protocol",
|
|
9
|
+
"file": "managed/semgrep-protocol.md",
|
|
10
|
+
"recommendedAgent": "reviewer"
|
|
11
|
+
}
|
|
12
|
+
],
|
|
13
|
+
"externalTool": {
|
|
14
|
+
"name": "semgrep",
|
|
15
|
+
"checkBinary": "semgrep",
|
|
16
|
+
"install": {
|
|
17
|
+
"darwin": "brew install semgrep",
|
|
18
|
+
"linux": "pipx install semgrep"
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|