@eduardbar/drift 1.2.0 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (195) hide show
  1. package/.gga +50 -0
  2. package/.github/actions/drift-review/README.md +60 -0
  3. package/.github/actions/drift-review/action.yml +131 -0
  4. package/.github/actions/drift-scan/README.md +28 -32
  5. package/.github/actions/drift-scan/action.yml +78 -14
  6. package/.github/workflows/publish-vscode.yml +3 -3
  7. package/.github/workflows/publish.yml +3 -3
  8. package/.github/workflows/review-pr.yml +94 -9
  9. package/AGENTS.md +75 -245
  10. package/CHANGELOG.md +28 -0
  11. package/README.md +308 -51
  12. package/ROADMAP.md +6 -5
  13. package/dist/analyzer.d.ts +2 -2
  14. package/dist/analyzer.js +420 -159
  15. package/dist/benchmark.d.ts +2 -0
  16. package/dist/benchmark.js +204 -0
  17. package/dist/cli.js +693 -67
  18. package/dist/config.js +16 -2
  19. package/dist/diff.js +66 -10
  20. package/dist/doctor.d.ts +5 -0
  21. package/dist/doctor.js +133 -0
  22. package/dist/format.d.ts +17 -0
  23. package/dist/format.js +45 -0
  24. package/dist/git.js +12 -0
  25. package/dist/guard-types.d.ts +57 -0
  26. package/dist/guard-types.js +2 -0
  27. package/dist/guard.d.ts +14 -0
  28. package/dist/guard.js +239 -0
  29. package/dist/index.d.ts +12 -3
  30. package/dist/index.js +6 -1
  31. package/dist/init.d.ts +15 -0
  32. package/dist/init.js +273 -0
  33. package/dist/map-cycles.d.ts +2 -0
  34. package/dist/map-cycles.js +34 -0
  35. package/dist/map-svg.d.ts +19 -0
  36. package/dist/map-svg.js +97 -0
  37. package/dist/map.js +78 -138
  38. package/dist/metrics.js +70 -55
  39. package/dist/output-metadata.d.ts +13 -0
  40. package/dist/output-metadata.js +17 -0
  41. package/dist/plugins-capabilities.d.ts +4 -0
  42. package/dist/plugins-capabilities.js +21 -0
  43. package/dist/plugins-messages.d.ts +10 -0
  44. package/dist/plugins-messages.js +16 -0
  45. package/dist/plugins-rules.d.ts +9 -0
  46. package/dist/plugins-rules.js +137 -0
  47. package/dist/plugins.d.ts +2 -1
  48. package/dist/plugins.js +80 -28
  49. package/dist/printer.js +4 -0
  50. package/dist/reporter-constants.d.ts +16 -0
  51. package/dist/reporter-constants.js +39 -0
  52. package/dist/reporter.d.ts +3 -3
  53. package/dist/reporter.js +35 -55
  54. package/dist/review.d.ts +2 -1
  55. package/dist/review.js +4 -3
  56. package/dist/rules/comments.js +2 -2
  57. package/dist/rules/complexity.js +2 -7
  58. package/dist/rules/nesting.js +3 -13
  59. package/dist/rules/phase0-basic.js +10 -10
  60. package/dist/rules/phase3-configurable.js +23 -15
  61. package/dist/rules/shared.d.ts +2 -0
  62. package/dist/rules/shared.js +27 -3
  63. package/dist/saas/constants.d.ts +15 -0
  64. package/dist/saas/constants.js +48 -0
  65. package/dist/saas/dashboard.d.ts +8 -0
  66. package/dist/saas/dashboard.js +132 -0
  67. package/dist/saas/errors.d.ts +19 -0
  68. package/dist/saas/errors.js +37 -0
  69. package/dist/saas/helpers.d.ts +21 -0
  70. package/dist/saas/helpers.js +110 -0
  71. package/dist/saas/ingest.d.ts +3 -0
  72. package/dist/saas/ingest.js +249 -0
  73. package/dist/saas/organization.d.ts +5 -0
  74. package/dist/saas/organization.js +82 -0
  75. package/dist/saas/plan-change.d.ts +10 -0
  76. package/dist/saas/plan-change.js +15 -0
  77. package/dist/saas/store.d.ts +21 -0
  78. package/dist/saas/store.js +159 -0
  79. package/dist/saas/types.d.ts +191 -0
  80. package/dist/saas/types.js +2 -0
  81. package/dist/saas.d.ts +8 -82
  82. package/dist/saas.js +7 -320
  83. package/dist/sarif.d.ts +74 -0
  84. package/dist/sarif.js +122 -0
  85. package/dist/trust-advanced.d.ts +14 -0
  86. package/dist/trust-advanced.js +65 -0
  87. package/dist/trust-kpi-fs.d.ts +3 -0
  88. package/dist/trust-kpi-fs.js +141 -0
  89. package/dist/trust-kpi-parse.d.ts +7 -0
  90. package/dist/trust-kpi-parse.js +186 -0
  91. package/dist/trust-kpi-types.d.ts +16 -0
  92. package/dist/trust-kpi-types.js +2 -0
  93. package/dist/trust-kpi.d.ts +7 -0
  94. package/dist/trust-kpi.js +185 -0
  95. package/dist/trust-policy.d.ts +32 -0
  96. package/dist/trust-policy.js +160 -0
  97. package/dist/trust-render.d.ts +9 -0
  98. package/dist/trust-render.js +54 -0
  99. package/dist/trust-scoring.d.ts +9 -0
  100. package/dist/trust-scoring.js +208 -0
  101. package/dist/trust.d.ts +37 -0
  102. package/dist/trust.js +168 -0
  103. package/dist/types/app.d.ts +30 -0
  104. package/dist/types/app.js +2 -0
  105. package/dist/types/config.d.ts +25 -0
  106. package/dist/types/config.js +2 -0
  107. package/dist/types/core.d.ts +100 -0
  108. package/dist/types/core.js +2 -0
  109. package/dist/types/diff.d.ts +55 -0
  110. package/dist/types/diff.js +2 -0
  111. package/dist/types/plugin.d.ts +41 -0
  112. package/dist/types/plugin.js +2 -0
  113. package/dist/types/trust.d.ts +120 -0
  114. package/dist/types/trust.js +2 -0
  115. package/dist/types.d.ts +8 -211
  116. package/docs/PRD.md +187 -109
  117. package/docs/plugin-contract.md +61 -0
  118. package/docs/release-notes-draft.md +40 -0
  119. package/docs/rules-catalog.md +49 -0
  120. package/docs/trust-core-release-checklist.md +87 -0
  121. package/package.json +6 -3
  122. package/packages/vscode-drift/src/code-actions.ts +1 -1
  123. package/schemas/drift-ai-output.v1.json +162 -0
  124. package/schemas/drift-report.v1.json +151 -0
  125. package/schemas/drift-trust.v1.json +131 -0
  126. package/scripts/smoke-repo.mjs +394 -0
  127. package/src/analyzer.ts +484 -155
  128. package/src/benchmark.ts +266 -0
  129. package/src/cli.ts +840 -85
  130. package/src/config.ts +19 -2
  131. package/src/diff.ts +84 -10
  132. package/src/doctor.ts +173 -0
  133. package/src/format.ts +81 -0
  134. package/src/git.ts +16 -0
  135. package/src/guard-types.ts +64 -0
  136. package/src/guard.ts +324 -0
  137. package/src/index.ts +83 -0
  138. package/src/init.ts +298 -0
  139. package/src/map-cycles.ts +38 -0
  140. package/src/map-svg.ts +124 -0
  141. package/src/map.ts +111 -142
  142. package/src/metrics.ts +78 -59
  143. package/src/output-metadata.ts +30 -0
  144. package/src/plugins-capabilities.ts +36 -0
  145. package/src/plugins-messages.ts +35 -0
  146. package/src/plugins-rules.ts +296 -0
  147. package/src/plugins.ts +148 -27
  148. package/src/printer.ts +4 -0
  149. package/src/reporter-constants.ts +46 -0
  150. package/src/reporter.ts +64 -65
  151. package/src/review.ts +6 -4
  152. package/src/rules/comments.ts +2 -2
  153. package/src/rules/complexity.ts +2 -7
  154. package/src/rules/nesting.ts +3 -13
  155. package/src/rules/phase0-basic.ts +11 -12
  156. package/src/rules/phase3-configurable.ts +39 -26
  157. package/src/rules/shared.ts +31 -3
  158. package/src/saas/constants.ts +56 -0
  159. package/src/saas/dashboard.ts +172 -0
  160. package/src/saas/errors.ts +45 -0
  161. package/src/saas/helpers.ts +140 -0
  162. package/src/saas/ingest.ts +278 -0
  163. package/src/saas/organization.ts +99 -0
  164. package/src/saas/plan-change.ts +19 -0
  165. package/src/saas/store.ts +172 -0
  166. package/src/saas/types.ts +216 -0
  167. package/src/saas.ts +49 -433
  168. package/src/sarif.ts +232 -0
  169. package/src/trust-advanced.ts +99 -0
  170. package/src/trust-kpi-fs.ts +169 -0
  171. package/src/trust-kpi-parse.ts +219 -0
  172. package/src/trust-kpi-types.ts +19 -0
  173. package/src/trust-kpi.ts +210 -0
  174. package/src/trust-policy.ts +246 -0
  175. package/src/trust-render.ts +61 -0
  176. package/src/trust-scoring.ts +231 -0
  177. package/src/trust.ts +260 -0
  178. package/src/types/app.ts +30 -0
  179. package/src/types/config.ts +27 -0
  180. package/src/types/core.ts +105 -0
  181. package/src/types/diff.ts +61 -0
  182. package/src/types/plugin.ts +46 -0
  183. package/src/types/trust.ts +134 -0
  184. package/src/types.ts +78 -238
  185. package/tests/cli-sarif.test.ts +92 -0
  186. package/tests/diff.test.ts +124 -0
  187. package/tests/format.test.ts +157 -0
  188. package/tests/new-features.test.ts +80 -1
  189. package/tests/phase1-init-doctor-guard.test.ts +199 -0
  190. package/tests/plugins.test.ts +219 -0
  191. package/tests/rules.test.ts +23 -1
  192. package/tests/saas-foundation.test.ts +358 -1
  193. package/tests/sarif.test.ts +160 -0
  194. package/tests/trust-kpi.test.ts +147 -0
  195. package/tests/trust.test.ts +602 -0
package/docs/PRD.md CHANGED
@@ -1,157 +1,235 @@
1
1
  # PRD - drift
2
2
 
3
- Version: 1.2.0
4
- Estado: Activo
5
- Producto: `@eduardbar/drift`
3
+ > **AI Code Audit CLI para recuperar confianza de merge en PRs asistidos por IA.**
6
4
 
7
- ## 1) Contexto
5
+ **Version del PRD**: 1.3.0-scope-refresh
6
+ **Version de producto vigente**: 1.2.0
7
+ **Estado**: Activo
8
+ **Producto**: `@eduardbar/drift`
9
+ **Owner**: Eduardo Barba
10
+ **Fecha**: 2026-03-15
8
11
 
9
- `drift` es un CLI de analisis estatico para TypeScript que detecta deuda tecnica asociada a codigo generado por IA y calcula score por archivo y por repositorio.
12
+ ---
10
13
 
11
- Con release `v1.2.0`, el producto entrega comandos operativos, analisis AST, reglas de arquitectura configurables, salida accionable, workflow CI para PR comments, y foundations SaaS (`drift cloud ingest|summary|dashboard`) con politica free-until-7500.
14
+ ## 1. Contexto y problema
12
15
 
13
- ## 2) Vision de producto
16
+ El uso de IA para programar acelera entregas, pero tambien aumenta ruido tecnico en Pull Requests: cambios grandes, deuda encubierta, reglas de arquitectura rotas y riesgo de merge dificil de evaluar rapido.
14
17
 
15
- Ser la herramienta de referencia para equipos que usan IA para programar y necesitan detectar, priorizar y corregir deuda tecnica antes de mergear a produccion.
18
+ Hoy muchos equipos hacen review "a ojo" o dependen de checks incompletos. Resultado: se mergea codigo con riesgo real porque falta una senial consolidada y accionable para decidir si un PR esta listo.
16
19
 
17
- ## 3) Killer feature
20
+ Drift se reposiciona para cerrar ese gap: pasar de "scanner de deuda" a "decision engine de confianza de merge" para repos TypeScript/JavaScript con flujo local y CI.
18
21
 
19
- ## AI Code Smell Detector
22
+ ---
20
23
 
21
- Detectar patrones de olor tecnico vinculados a codigo IA, estimar probabilidad de origen IA y traducir hallazgos en acciones concretas (fixes, review de PR, reglas de arquitectura y reportes).
24
+ ## 2. Reposicionamiento de producto
22
25
 
23
- ## 4) Estado de cumplimiento (actualizado)
26
+ ### 2.1 Nueva tesis
24
27
 
25
- ### Entregado
28
+ `drift` es un **AI Code Audit CLI** orientado a responder una pregunta critica antes de mergear:
26
29
 
27
- - `drift review` en CLI para analizar diff contra base y producir markdown usable en PR.
28
- - `drift map` basico para generar `architecture.svg`.
29
- - Senial de IA en salida (`ai_likelihood` y `files_suspected`).
30
- - Reglas de arquitectura configurables via `drift.config.ts`.
31
- - Score y breakdown por dimensiones para lectura ejecutiva y tecnica.
32
- - Metricas de maintenance risk/hotspots.
33
- - Plugin system MVP (`drift-plugin-*`) con aislamiento de errores.
34
- - `drift fix` con modos preview/write.
35
- - Workflow CI para comentario automatico unico y actualizable de `drift review`.
36
- - `drift map` con marcado de cycle edges y layer violations en el SVG.
37
- - VSCode quick actions para fixes de bajo riesgo.
38
- - Confirmacion interactiva para `drift fix --write` (con `--yes` para CI/no-interactive).
39
- - `drift report` HTML (`drift-report.html`) sin flag extra.
40
- - Documentacion y tests del release.
30
+ **"Este PR asistido por IA es confiable para merge?"**
41
31
 
42
- ### Parcial
32
+ ### 2.2 North Star de posicionamiento
43
33
 
44
- - Consolidacion/hardening de API de plugins para ecosistema externo amplio.
34
+ Mover el foco de "contar smells" a "reducir riesgo de merge" con una salida resumida, priorizada y utilizable por developers, reviewers y tech leads.
45
35
 
46
- ### Pendiente
36
+ ---
47
37
 
48
- - Hardening del contrato de plugins para ecosistema externo amplio.
49
- - Evolucion del dashboard SaaS foundations a experiencia multi-tenant full (auth, permisos por rol y billing activo post-umbral).
38
+ ## 3. Que NO es y que SI es Drift
50
39
 
51
- ## 5) Criterios de aceptacion vigentes
40
+ | Categoria | Definicion |
41
+ |---|---|
42
+ | No es | Un code generator ni un copiloto para escribir features |
43
+ | No es | Un SaaS dependiente de backend propio para funcionar |
44
+ | No es | Un reemplazo completo de code review humano |
45
+ | No es | Un quality gate magico multi-lenguaje full stack |
46
+ | Si es | Un CLI local/CI de auditoria tecnica para codigo TypeScript/JavaScript |
47
+ | Si es | Un sistema de scoring y priorizacion de deuda con foco en riesgo de merge |
48
+ | Si es | Una herramienta para PRs asistidos por IA con salida accionable |
49
+ | Si es | Un producto operable sin infraestructura propietaria (user-run) |
52
50
 
53
- ### 5.1 Entregables cerrados en v1.1.0
51
+ ---
54
52
 
55
- - `drift review --base <ref>` devuelve score delta de PR, issues nuevos/resueltos y markdown.
56
- - `drift scan --ai` incluye `ai_likelihood` y ranking `files_suspected`.
57
- - `drift map <path>` genera `architecture.svg` utilizable sin edicion manual.
58
- - `drift report [path]` genera HTML self-contained (no requiere `--html`).
59
- - `drift fix --preview` muestra antes/despues y `drift fix --write` aplica reglas soportadas.
53
+ ## 4. Estado real del producto (v1.2.0)
60
54
 
61
- ### 5.1.b Entregables cerrados en v1.2 (scope tecnico)
55
+ ### 4.1 Capacidades entregadas y activas
62
56
 
63
- - Workflow CI publica/actualiza comentario unico en PR para `drift review`.
64
- - `drift map` marca visualmente ciclos y violaciones por capa.
65
- - Extension VSCode expone quick actions para `debug-leftover` y `catch-swallow`.
66
- - `drift fix --write` pide confirmacion interactiva por defecto y admite `--yes`.
57
+ | Area | Estado | Capacidades vigentes |
58
+ |---|---|---|
59
+ | Analisis AST y scoring | Entregado | Reglas de drift, score por archivo/repositorio, salida CLI/JSON/AI |
60
+ | PR review | Entregado | `drift review` con diff vs base, markdown para PR, delta de issues |
61
+ | Arquitectura | Entregado | `drift map` con `architecture.svg`, cycle edges, layer violations |
62
+ | Fixes | Entregado | `drift fix --preview` y `drift fix --write` con confirmacion (`--yes` para CI) |
63
+ | Reporteria | Entregado | `drift report` HTML self-contained |
64
+ | CI | Entregado | Workflow para comentario unico y actualizable en PR |
65
+ | Editor | Entregado | VSCode quick actions para fixes de bajo riesgo |
66
+ | Extensibilidad | MVP entregado | Plugin system `drift-plugin-*` con aislamiento de errores |
67
+ | Foundations cloud-like | Entregado (base) | `drift cloud ingest|summary|dashboard`, politica free-until-7500 en PRD |
67
68
 
68
- ### 5.2 Objetivos aun abiertos (CI/editor/UX)
69
+ ### 4.2 Abiertos actuales
69
70
 
70
- - Hardening del contrato de plugins para compatibilidad de largo plazo (versionado/migraciones).
71
+ - Hardening del contrato de plugins para ecosistema externo de largo plazo.
72
+ - Evolucion de foundations cloud-like hacia experiencia multi-tenant completa (auth, roles, billing) cuando corresponda.
71
73
 
72
- ## 6) Roadmap actualizado
74
+ Nota: este PRD no declara como implementado nada fuera de las capacidades ya reflejadas en v1.2.0.
73
75
 
74
- ### v1.1 (completado - release 1.1.0)
76
+ ---
75
77
 
76
- Prioridades cerradas:
77
- - CLI de review para PR, mapa basico, salida AI, reglas configurables, report HTML, fix preview/write, hotspots, plugin MVP.
78
+ ## 5. Feature estrella: `drift trust`
78
79
 
79
- Done del bloque:
80
- - Features documentadas.
81
- - Tests de paths principales.
82
- - Salidas CLI/JSON/AI consistentes para uso local y CI.
80
+ ### 5.1 Objetivo
83
81
 
84
- ### v1.2 (completado - cierre de pendientes tecnicos)
82
+ Introducir `drift trust` como salida de alto nivel para decision de merge en PRs asistidos por IA.
85
83
 
86
- Prioridades cerradas:
87
- - Comentario automatico actualizable en PR desde workflow CI.
88
- - Mejora de `drift map` para destacar ciclos y violaciones.
89
- - UX de seguridad para `drift fix --write` con confirmacion interactiva.
84
+ ### 5.2 Output conceptual esperado
90
85
 
91
- Done del bloque:
92
- - Flujo CI reproducible con comentario unico por PR.
93
- - Visualizaciones verificables en SVG sobre repos medianos.
94
- - Confirmacion interactiva implementada para write mode.
86
+ `drift trust` debe sintetizar en un bloque corto y accionable:
95
87
 
96
- ### v2 (prioridad: experiencia de editor + extensibilidad)
88
+ | Campo | Proposito |
89
+ |---|---|
90
+ | Trust Score | Puntaje de confianza de merge (0-100) |
91
+ | Merge Risk | Clasificacion de riesgo (`LOW`, `MEDIUM`, `HIGH`, `CRITICAL`) |
92
+ | Top Reasons | Principales razones que explican el riesgo |
93
+ | Fix Priorities | Orden recomendado de correcciones para bajar riesgo rapido |
97
94
 
98
- Prioridades:
99
- - Consolidacion de API de plugins y hardening de compatibilidad.
100
- - Reglas de plugin versionadas y validacion de contrato avanzada.
95
+ ### 5.3 Alcance funcional del feature
101
96
 
102
- Criterio de done:
103
- - Plugins con contrato estable y manejo de errores robusto.
104
- - Documentacion de versionado para autores de plugins.
97
+ - Usa seniales ya existentes en Drift (reglas, severidad, diff, arquitectura, hotspots) para componer una conclusion ejecutiva.
98
+ - Prioriza interpretabilidad: cada resultado debe explicar por que sube/baja la confianza.
99
+ - Se diseña para uso local y CI sin requerir servicio central.
105
100
 
106
- ### v3 (fundations completadas en v1.2.0)
101
+ Importante: en este documento, `drift trust` se define como **scope de producto**; su implementacion tecnica se planifica por etapas.
107
102
 
108
- Prioridades cerradas:
109
- - Base de datos local de snapshots para cloud MVP.
110
- - Ingestion de reportes en storage local SaaS-like.
111
- - Summary de uso/threshold y dashboard HTML inicial.
112
- - Guardrails de fase gratuita por workspace + politica free-until-7500.
103
+ ---
113
104
 
114
- Siguiente incremento (v3.x):
115
- - Auth real multi-tenant, permisos por equipo y backend remoto persistente.
116
- - Activacion de billing cuando el umbral de 7.500 usuarios se cumpla.
105
+ ## 6. Scope de producto: Core vs Premium
117
106
 
118
- ## 6.1) Estrategia de monetizacion (aprobada)
107
+ ### 6.1 Drift Core (base abierta y utilizable)
119
108
 
120
- - Fase gratuita: Drift SaaS gratis hasta alcanzar 7.500 usuarios registrados.
121
- - Trigger de monetizacion: al alcanzar 7.500 usuarios, activar planes pagos para nuevos usuarios y definir politica de migracion para cohortes gratuitas.
122
- - Objetivo: priorizar adopcion y proof-of-value temprano sin friccion comercial inicial.
123
- - Guardrails durante fase gratuita:
124
- - Limites tecnicos por workspace (runs/mes, retencion de historial, repositorios activos).
125
- - Instrumentacion de uso desde el dia 1 para evitar abuso y medir unit economics.
126
- - Feature flags de pricing listas antes del trigger para evitar corte abrupto.
109
+ | Incluido en Core | Notas |
110
+ |---|---|
111
+ | `scan`, `review`, `fix`, `report`, `map`, `ci`, `diff`, `snapshot`, `trend`, `blame` | Mantiene propuesta actual de CLI tecnico |
112
+ | Reglas de drift y score base | Incluye salida JSON/AI para automatizacion |
113
+ | `drift trust` baseline | Trust Score + Merge Risk + Top Reasons + Fix Priorities en modo esencial |
114
+ | Uso local + CI en runners del usuario | Sin infraestructura Drift obligatoria |
127
115
 
128
- ## 7) Fuera de alcance actual
116
+ ### 6.2 Drift Premium (valor para equipos)
129
117
 
130
- - Soporte multi-lenguaje completo fuera de TypeScript/JS.
131
- - Autofix de reglas de alto riesgo sin confirmacion explicita.
132
- - Integraciones propietarias cerradas sin API estable.
118
+ | Incluido en Premium | Propuesta de valor |
119
+ |---|---|
120
+ | `drift trust` avanzado | Mayor contexto historico, comparativas y guidance de remediacion de equipo |
121
+ | Policy packs y controles por equipo | Gates y criterios de merge mas finos |
122
+ | Reportes ejecutivos extendidos | Vistas para liderazgo tecnico y seguimiento de riesgo |
123
+ | Soporte y prioridad | Respuesta mas rapida y acompanamiento de adopcion |
133
124
 
134
- ## 8) KPIs de exito
125
+ Nota: Premium define direccion comercial; la activacion concreta depende del roadmap de producto y capacidad operativa.
135
126
 
136
- - Reduccion de score promedio en repos activos.
137
- - % de PRs con feedback drift resuelto antes de merge.
138
- - Tiempo medio desde deteccion hasta fix aplicado.
139
- - Adopcion de reglas de arquitectura configurables por equipo.
127
+ ---
140
128
 
141
- ## 9) Dependencias y riesgos
129
+ ## 7. Pricing inicial y propuesta comercial
142
130
 
143
- - Performance en repos grandes (AST + cross-file).
144
- - Calidad de senial en `ai_likelihood` (falsos positivos/negativos).
145
- - Variabilidad de entornos CI para publicar comentarios de PR.
146
- - Evolucion de API de plugins sin romper backward compatibility.
131
+ ### 7.1 Planes
147
132
 
148
- ## 10) Definition of Done por release
133
+ | Plan | Precio | Publico objetivo | Valor principal |
134
+ |---|---:|---|---|
135
+ | Free | USD 0 (forever) | Developers individuales + open source | Analisis local ilimitado, output accionable y adopcion sin friccion |
136
+ | Sponsor | USD 8/mes o USD 80/anio | Fans, freelancers y power users | Apoyo al proyecto + rule packs premium ligeros + early access |
137
+ | Team | USD 39/mes por org o USD 390/anio | Equipos pequenos/medianos | Gobernanza inicial: policies, thresholds por branch y suppressions por regla |
138
+ | Business | USD 149/mes por org o USD 1490/anio | Equipos con mayor exigencia | Governance/compliance avanzado, custom rules y soporte prioritario |
149
139
 
150
- Checklist minimo por release:
140
+ ### 7.2 Hipotesis de monetizacion
151
141
 
152
- - [ ] Scope del release cerrado y trazable a este PRD.
153
- - [ ] Comandos/flujo documentados con ejemplos reales.
154
- - [ ] Tests de regresion en paths principales y casos borde.
155
- - [ ] Salidas CLI/JSON/AI estables para automatizacion.
156
- - [ ] Criterios de aceptacion del bloque marcados como cumplidos o movidos a pendiente.
157
- - [ ] Riesgos y tradeoffs explicitados en notas de release.
142
+ - Inicio con **GitHub Sponsors** como canal principal de conversion (Sponsor plan).
143
+ - Validar willingness-to-pay antes de escalar complejidad comercial.
144
+ - Evolucionar hacia Team/Business conforme se consolide `drift trust` y demanda de gobierno por equipo.
145
+
146
+ ---
147
+
148
+ ## 8. Estrategia operativa (sin infraestructura propia)
149
+
150
+ ### 8.1 Principios
151
+
152
+ - Drift corre donde ya corre el codigo: laptop del developer, CI existente, runners del usuario.
153
+ - No se requiere backend propietario para la propuesta principal de valor.
154
+ - Costos operativos iniciales bajos para maximizar foco en producto y distribucion.
155
+
156
+ ### 8.2 Modelo operativo
157
+
158
+ | Dimension | Decision |
159
+ |---|---|
160
+ | Compute | Local/CI del usuario |
161
+ | Storage | Artefactos y reportes en entorno del usuario |
162
+ | Integracion | CLI + GitHub Actions + outputs markdown/JSON/AI |
163
+ | Monetizacion inicial | GitHub Sponsors + futura oferta Team/Business |
164
+
165
+ ---
166
+
167
+ ## 9. Launch strategy por etapas
168
+
169
+ ### Etapa 1 - Reposicionamiento y mensaje (inmediato)
170
+
171
+ - Actualizar narrativa publica: de "deuda tecnica IA" a "merge trust para PRs asistidos por IA".
172
+ - Publicar docs y ejemplos orientados a decision de merge.
173
+ - CTA principal: probar `drift review` y futura experiencia `drift trust`.
174
+
175
+ ### Etapa 2 - `drift trust` baseline (producto)
176
+
177
+ - Entregar salida conceptual en CLI/CI con Trust Score, Merge Risk, Top Reasons, Fix Priorities.
178
+ - Incorporar senales de diff/PR de forma deterministica (`--base`) y salida markdown lista para comentarios de PR.
179
+ - Medir adopcion en PR workflows y feedback de interpretabilidad.
180
+ - Ajustar pesos/heuristicas con evidencia de uso real.
181
+
182
+ ### Etapa 3 - Conversion y expansion
183
+
184
+ - Activar perks para Sponsor y clarificar diferencia Core vs Premium.
185
+ - Formalizar Team plan con policies y reportes de riesgo compartidos.
186
+ - Preparar oferta Business para cuentas con necesidad de governance.
187
+
188
+ ---
189
+
190
+ ## 10. Positioning copy (taglines y one-liners)
191
+
192
+ ### 10.1 Taglines
193
+
194
+ - "Merge con confianza, incluso cuando el PR vino asistido por IA."
195
+ - "Tu AI Code Audit CLI para decidir merge sin adivinar."
196
+ - "Menos ruido de PR, mas confianza de release."
197
+
198
+ ### 10.2 One-liners
199
+
200
+ - "Drift convierte senales tecnicas de un PR en una decision clara de merge risk."
201
+ - "Deuda tecnica IA detectada, priorizada y traducida a acciones concretas antes de mergear."
202
+ - "TypeScript AI audit en local y CI, sin depender de infraestructura externa."
203
+
204
+ ---
205
+
206
+ ## 11. KPIs y metricas de exito
207
+
208
+ | KPI | Objetivo |
209
+ |---|---|
210
+ | % de PRs evaluados con senial de confianza | Medir adopcion de flujo `review/trust` |
211
+ | Reduccion de issues de alto riesgo antes de merge | Medir impacto real en calidad |
212
+ | Tiempo desde deteccion a fix | Medir accionabilidad de la salida |
213
+ | Conversion a Sponsor/Team | Validar monetizacion temprana |
214
+
215
+ ---
216
+
217
+ ## 12. Riesgos y mitigaciones
218
+
219
+ | Riesgo | Mitigacion |
220
+ |---|---|
221
+ | Falsos positivos en senal de riesgo | Transparencia en Top Reasons + ajuste iterativo de reglas/pesos |
222
+ | Confusion entre "auditoria" y "autofix magico" | Mensaje explicito de que Drift no reemplaza revision humana |
223
+ | Presion por features enterprise tempranas | Enfoque por etapas: Sponsors primero, Team/Business luego |
224
+ | Variabilidad de entornos CI | Mantener salida portable y documentar integraciones recomendadas |
225
+
226
+ ---
227
+
228
+ ## 13. Definition of Done para este refresh de scope
229
+
230
+ - PRD unificado con posicionamiento "AI Code Audit CLI".
231
+ - `drift trust` definido como feature estrella con output conceptual completo.
232
+ - Delimitacion explicita de que Drift es/no es.
233
+ - Pricing y Core vs Premium documentados de forma consistente.
234
+ - Estrategia operativa sin infraestructura propia y monetizacion via Sponsors declaradas.
235
+ - Launch strategy por etapas y copy de posicionamiento incluidos.
@@ -0,0 +1,61 @@
1
+ # Drift Plugin Contract (v2)
2
+
3
+ This document defines the external plugin contract for `@eduardbar/drift`.
4
+
5
+ ## Minimal plugin shape
6
+
7
+ ```js
8
+ module.exports = {
9
+ name: 'my-plugin',
10
+ apiVersion: 1,
11
+ capabilities: {
12
+ fixes: true,
13
+ tags: 'security',
14
+ },
15
+ rules: [
16
+ {
17
+ id: 'no-debug-leftovers',
18
+ severity: 'warning',
19
+ weight: 8,
20
+ detect(file, context) {
21
+ return []
22
+ },
23
+ fix(issue, file, context) {
24
+ return issue
25
+ },
26
+ },
27
+ ],
28
+ }
29
+ ```
30
+
31
+ ## Contract rules
32
+
33
+ - `name`: required non-empty string.
34
+ - `apiVersion`: recommended and currently supported value is `1`.
35
+ - `capabilities`: optional object map with primitive values (`string | number | boolean`).
36
+ - `rules`: required array with at least one valid rule.
37
+ - Rule `id` (or legacy `name` fallback):
38
+ - for `apiVersion: 1` must match `^[a-z][a-z0-9]*(?:[-_/][a-z0-9]+)*$`
39
+ - must be unique within the plugin.
40
+ - `detect(file, context)`: required function returning `DriftIssue[]`.
41
+
42
+ ## Legacy compatibility
43
+
44
+ - Plugins without `apiVersion` still load for backward compatibility.
45
+ - Drift emits warning code `plugin-api-version-implicit` and assumes compatibility mode.
46
+ - In compatibility mode, non-standard rule IDs are warnings (`plugin-rule-id-format-legacy`) instead of hard errors.
47
+
48
+ ## Failure isolation
49
+
50
+ - Invalid plugin contracts are skipped and reported as diagnostics.
51
+ - Runtime errors thrown by one plugin rule are isolated to that rule; scan continues for other rules/files.
52
+
53
+ ## Common diagnostic codes
54
+
55
+ - `plugin-api-version-implicit`: missing `apiVersion`; plugin loaded in legacy mode.
56
+ - `plugin-api-version-invalid`: `apiVersion` is not a positive integer.
57
+ - `plugin-api-version-unsupported`: plugin version is not supported by current drift runtime.
58
+ - `plugin-rule-id-invalid`: rule ID format invalid for explicit API version.
59
+ - `plugin-rule-id-duplicate`: duplicate rule ID inside the same plugin.
60
+ - `plugin-capabilities-invalid`: `capabilities` is not an object.
61
+ - `plugin-capabilities-value-invalid`: capability value is not a primitive.
@@ -0,0 +1,40 @@
1
+ # Release Notes Draft (S5)
2
+
3
+ ## Scope
4
+
5
+ This draft covers the latest trust-core and SARIF-related changes prepared for release packaging.
6
+
7
+ ## What changed
8
+
9
+ - Added/solidified release-facing CLI capabilities:
10
+ - `init` for project scaffolding and baseline bootstrap.
11
+ - `doctor` for environment diagnostics.
12
+ - `guard` for non-regression enforcement by diff or baseline.
13
+ - Consolidated output format behavior around `--format` and preserved legacy aliases for compatibility.
14
+ - Added SARIF output coverage across critical commands (`scan`, `ci`, `diff`, `review`, `trust`).
15
+ - Aligned CI and action v2 contract expectations with SARIF-enabled workflows.
16
+ - Expanded tests and docs to reduce release risk in CLI output contracts.
17
+
18
+ ## User impact
19
+
20
+ - Teams can ingest drift findings in SARIF-native tooling without custom adapters.
21
+ - Trust/review automation in PRs is more consistent thanks to normalized output contracts.
22
+ - Onboarding and guardrail setup are faster with `init`, `doctor`, and `guard`.
23
+
24
+ ## Risks and watch points
25
+
26
+ - SARIF consumers may still differ in strictness; validate in at least one real CI environment.
27
+ - Legacy alias paths (`--json`, `--comment`, `--markdown`) depend on compatibility behavior and should remain covered by tests.
28
+ - Trust/reporting flows rely on artifact path conventions in CI; keep workflow and docs synchronized.
29
+
30
+ ## Minimal validation before tag
31
+
32
+ - Smoke no-build commands:
33
+ - `scan --format sarif`
34
+ - `ci --format sarif`
35
+ - `trust --format sarif`
36
+ - `review --format sarif` (or `diff --format sarif` fallback)
37
+ - Targeted tests:
38
+ - `tests/cli-sarif.test.ts`
39
+ - `tests/format.test.ts`
40
+ - `tests/sarif.test.ts`
@@ -0,0 +1,49 @@
1
+ # drift rules catalog (current)
2
+
3
+ Source of truth: `RULE_WEIGHTS` in `src/analyzer.ts`.
4
+
5
+ This catalog reflects the current repository state and includes all rule IDs currently weighted/scored by drift.
6
+
7
+ | id | severity | weight | phase/origin | note |
8
+ |---|---|---:|---|---|
9
+ | `large-file` | error | 20 | phase0-basic | file exceeds size threshold |
10
+ | `large-function` | error | 15 | phase0-basic | function exceeds line threshold |
11
+ | `debug-leftover` | warning | 10 | phase0-basic | debug console calls / TODO-like leftovers |
12
+ | `dead-code` | warning | 8 | phase0-basic | unused named imports in file |
13
+ | `duplicate-function-name` | error | 18 | phase0-basic | repeated function names in same file |
14
+ | `comment-contradiction` | warning | 12 | comments rule | comment restates obvious code intent |
15
+ | `no-return-type` | info | 5 | phase0-basic | missing explicit return type |
16
+ | `catch-swallow` | warning | 10 | phase0-basic | empty catch blocks |
17
+ | `magic-number` | info | 3 | magic rule | numeric literals used directly |
18
+ | `any-abuse` | warning | 8 | phase0-basic | explicit `any` usage |
19
+ | `high-complexity` | error | 15 | phase1-complexity | high cyclomatic complexity |
20
+ | `deep-nesting` | warning | 12 | nesting rule | nested control flow too deep |
21
+ | `too-many-params` | warning | 8 | nesting rule | function has too many parameters |
22
+ | `high-coupling` | warning | 10 | coupling rule | too many module dependencies |
23
+ | `promise-style-mix` | warning | 7 | promise rule | mixed async/await and then/catch styles |
24
+ | `unused-export` | warning | 8 | phase2-crossfile | export not imported elsewhere |
25
+ | `dead-file` | warning | 10 | phase2-crossfile | file not imported by project |
26
+ | `unused-dependency` | warning | 6 | phase2-crossfile | package.json dependency unused in sources |
27
+ | `circular-dependency` | error | 14 | phase3-arch | circular import graph edges |
28
+ | `layer-violation` | error | 16 | phase3-arch (config-driven) | invalid import direction across configured layers |
29
+ | `cross-boundary-import` | warning | 10 | phase3-arch (config-driven) | invalid import across configured modules/boundaries |
30
+ | `controller-no-db` | warning | 11 | phase3-configurable | controller imports DB/repository concerns directly |
31
+ | `service-no-http` | warning | 11 | phase3-configurable | service imports/uses HTTP transport concerns |
32
+ | `max-function-lines` | warning | 9 | phase3-configurable | function/method exceeds configured max lines |
33
+ | `over-commented` | info | 4 | phase5-ai | excessive comments heuristic |
34
+ | `hardcoded-config` | warning | 10 | phase5-ai | hardcoded URLs/secrets/config literals |
35
+ | `inconsistent-error-handling` | warning | 8 | phase5-ai | mixed error-handling styles |
36
+ | `unnecessary-abstraction` | warning | 7 | phase5-ai | wrappers/abstractions with little value |
37
+ | `naming-inconsistency` | warning | 6 | phase5-ai | mixed naming conventions |
38
+ | `ai-code-smell` | warning | 12 | analyzer meta-rule | aggregated AI-smell signal from multiple heuristics |
39
+ | `semantic-duplication` | warning | 12 | phase8-semantic | AST fingerprint identifies equivalent functions |
40
+ | `plugin-error` | warning | 4 | plugin diagnostics | plugin load/contract/runtime failure surfaced as issue |
41
+ | `plugin-warning` | info | 0 | plugin diagnostics | non-fatal plugin validation warning |
42
+ | `analysis-skip-max-files` | info | 0 | analysis guardrail diagnostics | file skipped due to `maxFiles` limit |
43
+ | `analysis-skip-file-size` | info | 0 | analysis guardrail diagnostics | file skipped due to `maxFileSizeKb` limit |
44
+
45
+ ## Notes
46
+
47
+ - Config-driven rules require matching config blocks to execute (`layers`, `modules`/legacy aliases, `architectureRules`).
48
+ - `plugin-*` and `analysis-skip-*` are diagnostic rules emitted as issues and included in scoring with their configured weights.
49
+ - Total rule IDs currently defined: **35**.
@@ -0,0 +1,87 @@
1
+ # Trust Core Tonight - Release Checklist
2
+
3
+ Use this checklist before releasing the trust-core milestone.
4
+
5
+ ## 1) Local validation
6
+
7
+ - [x] `npm ci`
8
+ - [x] `npm test`
9
+ - [x] `npx --no-install tsx ./src/cli.ts trust . --base origin/master --markdown`
10
+ - [x] `npx --no-install tsx ./src/cli.ts trust . --base origin/master --json-output drift-trust.json`
11
+ - [x] `npx --no-install tsx ./src/cli.ts trust-gate drift-trust.json --min-trust 45 --max-risk HIGH`
12
+ - [x] `npx --no-install tsx ./src/cli.ts review --base origin/master --comment`
13
+
14
+ ## 2) CI workflow validation
15
+
16
+ - [x] Open or update a non-fork PR and confirm `.github/workflows/review-pr.yml` runs successfully.
17
+ - [x] Confirm sticky PR comment is updated once (marker: `<!-- drift-review -->`).
18
+ - [x] Confirm PR comment includes both sections in this order: `drift trust` then `drift review`.
19
+ - [x] E2E: `trust-gate` runs from generated `drift-trust.json` in `review-pr` workflow.
20
+ - [x] E2E: `kpi` aggregates over generated trust JSON artifact (`drift-trust-kpi.json`).
21
+ - [x] E2E: `drift-trust-json-pr-<PR_NUMBER>-run-<RUN_ATTEMPT>` artifact now bundles:
22
+ - `drift-trust.json`
23
+ - `drift-trust-gate.txt`
24
+ - `drift-trust-kpi.json`
25
+ - [x] Confirm step summary shows trust KPI values: trust score, merge risk, new issues, resolved issues.
26
+ - [x] E2E: step summary includes aggregate KPI block (matched/parsed/malformed, PR samples, avg trust, high-risk ratio).
27
+
28
+ Smoke PR runbook:
29
+
30
+ - [x] Create a short-lived branch (for example `chore/trust-ci-smoke`) with a docs-only change.
31
+ - [x] Open a PR against `master` and wait for `review-pr` workflow to complete.
32
+ - [x] Verify gate behavior and comment rendering, then close or merge the PR.
33
+ - [x] Delete the short-lived branch after validation.
34
+
35
+ ## 3) Gate behavior acceptance
36
+
37
+ Default trust gate for this milestone:
38
+
39
+ - `--min-trust 45`
40
+ - `--max-risk HIGH`
41
+
42
+ Checks:
43
+
44
+ - [x] PR fails when trust score is below 45.
45
+ - [x] PR fails when merge risk is `CRITICAL`.
46
+ - [x] PR passes when trust score is 45+ and merge risk is `LOW`, `MEDIUM`, or `HIGH`.
47
+
48
+ Calibration evidence from docs-only smoke runs: trust score 49 (PR #11), 46 (PR #12), 41 (PR #13). Gate floor set to 45 to reduce false positives while still blocking weak trust outcomes and `CRITICAL` risk.
49
+
50
+ ## 4) Narrative and docs acceptance
51
+
52
+ - [x] `README.md` positions drift as an AI Code Audit CLI for merge trust in AI-assisted PRs.
53
+ - [x] `package.json` description matches the same positioning.
54
+ - [x] `src/cli.ts` program description matches the same positioning.
55
+ - [x] `ROADMAP.md` no longer contradicts PRD on core vs premium direction.
56
+
57
+ ## 5) SARIF and action v2 readiness
58
+
59
+ - [x] `scan --format sarif` emits valid SARIF payload with drift rule mapping.
60
+ - [x] `ci --format sarif` emits SARIF without requiring GitHub annotation mode.
61
+ - [x] `diff --format sarif` emits SARIF from `DriftDiff` output.
62
+ - [x] `review --format sarif` emits SARIF from review diff context.
63
+ - [x] `trust --format sarif` emits SARIF based on current trust scan report.
64
+ - [x] CI workflow uploads SARIF artifact in PR runs.
65
+ - [x] Action v2 contracts are aligned with SARIF-capable commands and outputs.
66
+
67
+ ## 6) Trust artifacts and KPI readiness
68
+
69
+ - [x] Trust command supports split outputs (`--json-output` + selected stdout format).
70
+ - [x] Artifact bundle includes trust JSON, gate result, and trust KPI aggregate.
71
+ - [x] `drift kpi` parses trust artifacts and prints JSON plus optional summary.
72
+ - [x] Trust gate policy behavior documented and calibrated for current milestone.
73
+
74
+ ## 7) Quick smoke runbook (no build)
75
+
76
+ Run from repository root:
77
+
78
+ - [x] `node --import tsx ./src/cli.ts scan . --format sarif > .tmp/smoke-scan.sarif`
79
+ - [x] `node --import tsx ./src/cli.ts ci . --format sarif > .tmp/smoke-ci.sarif`
80
+ - [x] `node --import tsx ./src/cli.ts trust . --format sarif > .tmp/smoke-trust.sarif`
81
+ - [x] `node --import tsx ./src/cli.ts review --base HEAD~1 --format sarif > .tmp/smoke-review.sarif`
82
+
83
+ Validation hints:
84
+
85
+ - Check each command exits with code `0`.
86
+ - Check each `.sarif` file starts with `{"$schema"` and contains `"runs"`.
87
+ - Keep smoke artifacts out of release commit unless explicitly needed.
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@eduardbar/drift",
3
- "version": "1.2.0",
4
- "description": "Detect silent technical debt left by AI-generated code",
3
+ "version": "1.4.0",
4
+ "description": "AI Code Audit CLI for merge trust in AI-assisted PRs",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
7
7
  "bin": {
@@ -14,7 +14,9 @@
14
14
  "prepublishOnly": "npm run build",
15
15
  "test": "vitest run",
16
16
  "test:watch": "vitest",
17
- "test:coverage": "vitest run --coverage"
17
+ "test:coverage": "vitest run --coverage",
18
+ "benchmark": "node --import tsx src/benchmark.ts",
19
+ "smoke:repo": "node ./scripts/smoke-repo.mjs"
18
20
  },
19
21
  "keywords": [
20
22
  "vibe-coding",
@@ -42,6 +44,7 @@
42
44
  "devDependencies": {
43
45
  "@types/node": "^25.3.0",
44
46
  "@vitest/coverage-v8": "^4.0.18",
47
+ "tsx": "^4.21.0",
45
48
  "typescript": "^5.9.3",
46
49
  "vitest": "^4.0.18"
47
50
  }
@@ -16,7 +16,7 @@ function buildCatchTodoEdit(document: vscode.TextDocument, line: number): vscode
16
16
  const targetLine = document.lineAt(line)
17
17
  const baseIndent = targetLine.text.match(/^\s*/)?.[0] ?? ''
18
18
  const indent = `${baseIndent} `
19
- edit.insert(document.uri, new vscode.Position(line + 1, 0), `${indent}// TODO: handle error\n`)
19
+ edit.insert(document.uri, new vscode.Position(line + 1, 0), `${indent}// handle error\n`)
20
20
  return edit
21
21
  }
22
22