dsh-doublecheck 0.8.0 → 0.9.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/CHANGELOG.md +13 -0
- package/README.es.md +48 -17
- package/README.hi.md +48 -17
- package/README.md +49 -18
- package/README.pt.md +48 -17
- package/README.zh.md +48 -17
- package/lib/ci.d.ts +19 -0
- package/lib/ci.js +73 -0
- package/lib/domain/gate.d.ts +47 -0
- package/lib/domain/gate.js +84 -0
- package/lib/events.d.ts +9 -4
- package/lib/guard/command.js +6 -3
- package/lib/guard/gate.js +15 -4
- package/package.json +9 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,19 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to dsh-doublecheck are recorded here, newest first.
|
|
4
4
|
|
|
5
|
+
## [0.9.1] - 2026-08-30
|
|
6
|
+
|
|
7
|
+
### Fixed
|
|
8
|
+
|
|
9
|
+
- Tests no longer import the `CallId` brand from `@deepseek-ai/dsh-llm` (renamed to `ToolCallId` on host master): the call-id brand is now derived from the `dsh-tools` execution contract, staying green on both the published rc line and the 0.1.2-alpha.1 checkout.
|
|
10
|
+
- Docs now state the 0.1.2-alpha.1 reality for the durable `doublecheck/state` / `doublecheck/gate` writes: the host removed the `ignorable` envelope, so the probe fails safe and the switch degrades to process-local. Behavior unchanged.
|
|
11
|
+
|
|
12
|
+
## [0.9.0] - 2026-08-26
|
|
13
|
+
|
|
14
|
+
### Added
|
|
15
|
+
|
|
16
|
+
- **Headless CI gate report (JSON/SARIF).** `/gate run` now also writes a `gate-report.json` next to `gate-report.md` — the same settled `GateState` as lossless JSON. The new `doublecheck-gate` CLI serializes that state to JSON or SARIF 2.1.0 for GitHub Actions PR comments/status checks (`doublecheck-gate --format json|sarif --input gate-report.json`), exiting `0` on `deliverable` and `1` on `rework`. The CLI never re-runs the four-phase gate or the evidence folds — it only serializes the already-settled state.
|
|
17
|
+
|
|
5
18
|
## [0.8.0] - 2026-08-23
|
|
6
19
|
|
|
7
20
|
### Added
|
package/README.es.md
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
<div align="center">
|
|
2
2
|
|
|
3
3
|
# dsh-doublecheck
|
|
4
|
+
- **Canal 1024 store**: `npm i -g dsh1024` una vez, luego `dsh1024 plugin --profile web add dsh-doublecheck` (cuenta para el ranking de instalaciones de [deepseek1024.com](https://deepseek1024.com)).
|
|
4
5
|
|
|
5
6
|
**La puerta de calidad de entrega para DeepSeek Harness: interroga los requisitos, prueba la implementación, demuestra la entrega — y controla el traspaso con una decisión de entregable / rehacer.**
|
|
6
7
|
|
|
@@ -192,6 +193,19 @@ Las luces rojas son comprobaciones fallidas (un spec ausente, una última ejecuc
|
|
|
192
193
|
- counts, ids, and verdicts only: no file contents or session text are embedded, and recognized secrets are redacted.
|
|
193
194
|
````
|
|
194
195
|
|
|
196
|
+
## Salida de CI
|
|
197
|
+
|
|
198
|
+
`/gate run` también escribe un `gate-report.json` (el mismo estado asentado que el JSON sin pérdida, junto a `gate-report.md`). El CLI `doublecheck-gate` convierte ese archivo en salida legible por máquina para GitHub Actions:
|
|
199
|
+
|
|
200
|
+
```sh
|
|
201
|
+
# JSON (comentario de PR / payload de estado)
|
|
202
|
+
doublecheck-gate --format json --input gate-report.json
|
|
203
|
+
# SARIF 2.1.0 (subida de code-scanning / verificación de estado)
|
|
204
|
+
doublecheck-gate --format sarif < gate-report.json
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
El CLI solo serializa el `GateState` ya asentado — nunca vuelve a ejecutar la puerta de cuatro fases ni los pliegues de evidencia. Su código de salida mapea el veredicto: `0` = entregable, `1` = retrabajo, `2` = error de uso/análisis.
|
|
208
|
+
|
|
195
209
|
## Permisos y datos
|
|
196
210
|
|
|
197
211
|
- **Lee**: el registro de sesión (`tool/call` / `tool/result` / `tool/code-dispatch`, fuentes `user/message` inyectadas y los registros de veredicto ajenos `autoReview/*`) solo en proceso; el estado opcional del servicio de modo plan.
|
|
@@ -209,7 +223,7 @@ Las luces rojas son comprobaciones fallidas (un spec ausente, una última ejecuc
|
|
|
209
223
|
|
|
210
224
|
## Limitaciones conocidas
|
|
211
225
|
|
|
212
|
-
- **Escrituras durables.** `/doublecheck on\|off` → `doublecheck/state` y `/gate run` → `doublecheck/gate` necesitan la superficie de append `ignorable` del host (post-rc.6)
|
|
226
|
+
- **Escrituras durables.** `/doublecheck on\|off` → `doublecheck/state` y `/gate run` → `doublecheck/gate` necesitan la superficie de append `ignorable` del host (post-rc.6 hasta `0.1.1-rc.2`). En hosts sin esa superficie (rc.6/rc.8 y `0.1.2-alpha.1`, que eliminó el sobre), las escrituras se omiten y el interruptor queda en proceso.
|
|
213
227
|
- **Interfaces opcionales.** El espacio de ajustes `doublecheck.gate` se registra solo cuando el servicio de ajustes está montado; la línea de modo plan de `/gate status` lee el `ctx.planMode` opcional (muestra `unknown` sin él); la revisión adversarial necesita `ctx.subagents`; la verificación necesita `workflowEngine`.
|
|
214
228
|
- **Degradación local.** `gate.review.engine: auto` degrada al revisor local cuando dsh-auto-review está ausente o no tiene registros de veredicto en esta sesión — el informe nombra la razón en lugar de inventar un veredicto.
|
|
215
229
|
- **La evidencia dsh-eval se basa en archivos.** El motor de evaluación de dsh-auto-review (`dsh-eval`) escribe sus resultados de regresión de prompt / estrés / equidad en un archivo de informe del espacio de trabajo, no en el registro de sesión. `gate.tests.evalReports.enabled` pliega ese archivo (desactivado por defecto; salta cuando está ausente) y los recuentos pliegados viajan en el registro duradero `doublecheck/gate` para que una ejecución asentada siga siendo reproducible.
|
|
@@ -238,25 +252,42 @@ pnpm run pack:check # build + pack the tarball
|
|
|
238
252
|
|
|
239
253
|
## PerryLink DSH Plugin Family
|
|
240
254
|
|
|
241
|
-
Este proyecto es uno de los [
|
|
255
|
+
Este proyecto es uno de los [33 complementos de DeepSeek Harness](https://github.com/PerryLink) mantenidos por [PerryLink](https://github.com/PerryLink). Si este te ayuda, probablemente los demás también:
|
|
242
256
|
|
|
243
257
|
| Plugin | One-liner |
|
|
244
258
|
|---|---|
|
|
245
|
-
| [dsh-
|
|
246
|
-
| **[dsh-
|
|
247
|
-
| [dsh-
|
|
248
|
-
| [dsh-
|
|
249
|
-
| [dsh-
|
|
250
|
-
| [dsh-
|
|
251
|
-
| [dsh-
|
|
252
|
-
| [dsh-
|
|
253
|
-
| [dsh-
|
|
254
|
-
| [dsh-
|
|
255
|
-
| [dsh-
|
|
256
|
-
| [dsh-
|
|
257
|
-
| [dsh-github](https://github.com/PerryLink/dsh-github) |
|
|
258
|
-
| [dsh-
|
|
259
|
-
| [dsh-
|
|
259
|
+
| **[dsh-dsh-auto-review](https://github.com/PerryLink/dsh-dsh-auto-review)** | Auto-revisión de segundo modelo en la cadena de aprobación, con cierre en fallo por defecto | |
|
|
260
|
+
| **[dsh-dsh-background-agents](https://github.com/PerryLink/dsh-dsh-background-agents)** | Agentes hijos en segundo plano durables con barra lateral de UI web, mensajería e interrupción | |
|
|
261
|
+
| **[dsh-dsh-budget](https://github.com/PerryLink/dsh-dsh-budget)** | Gobernanza de costes para DeepSeek Harness: presupuestos, carbono y latencia en un panel. | |
|
|
262
|
+
| **[dsh-dsh-checkpoint-rewind](https://github.com/PerryLink/dsh-dsh-checkpoint-rewind)** | Equivalente a /rewind de Claude Code: instantáneas, bifurcaciones de sesión, restauración de un solo uso | |
|
|
263
|
+
| **[dsh-dsh-claude-move](https://github.com/PerryLink/dsh-dsh-claude-move)** | Migra sesiones, memoria, habilidades y CLAUDE.md de Claude Code a DSH | |
|
|
264
|
+
| **[dsh-dsh-click](https://github.com/PerryLink/dsh-dsh-click)** | Control de escritorio nativo multiplataforma para DeepSeek Harness — Windows primero. | |
|
|
265
|
+
| **[dsh-dsh-composer-history](https://github.com/PerryLink/dsh-dsh-composer-history)** | Historial de entrada estilo terminal para el compositor web: flechas, búsqueda Ctrl+R | |
|
|
266
|
+
| **[dsh-dsh-data-quality](https://github.com/PerryLink/dsh-dsh-data-quality)** | Comprobaciones de calidad de datasets y verificación de citas (el puente numérico opcional consumido aquí) | |
|
|
267
|
+
| **[dsh-dsh-defend](https://github.com/PerryLink/dsh-dsh-defend)** | Defensa contra inyección de prompts, jailbreak y fuga de secretos para DeepSeek Harness. | |
|
|
268
|
+
| **[dsh-dsh-draw](https://github.com/PerryLink/dsh-dsh-draw)** | Enrutamiento unificado de generación de imágenes estáticas para DeepSeek Harness. | |
|
|
269
|
+
| **[dsh-dsh-fast](https://github.com/PerryLink/dsh-dsh-fast)** | Diagnóstico de rendimiento de solo lectura para DeepSeek Harness. | |
|
|
270
|
+
| **[dsh-dsh-fund-research](https://github.com/PerryLink/dsh-dsh-fund-research)** | Informes de investigación deterministas para fondos mutuos públicos chinos | |
|
|
271
|
+
| **[dsh-dsh-github](https://github.com/PerryLink/dsh-dsh-github)** | Integración de PR/issues de GitHub para DSH, cada escritura controlada por aprobación | |
|
|
272
|
+
| **[dsh-dsh-industry-research](https://github.com/PerryLink/dsh-dsh-industry-research)** | Orquestación de investigación sectorial que sella sus entregables mediante el `ctx.researchReport.assemble` de este plugin | |
|
|
273
|
+
| **[dsh-dsh-library](https://github.com/PerryLink/dsh-dsh-library)** | Base de conocimiento documental local para DeepSeek Harness. | |
|
|
274
|
+
| **[dsh-dsh-local-ai](https://github.com/PerryLink/dsh-dsh-local-ai)** | Integración de modelos locales (Ollama) para DeepSeek Harness. | |
|
|
275
|
+
| **[dsh-dsh-lsp-actions](https://github.com/PerryLink/dsh-dsh-lsp-actions)** | Diagnósticos, formato, autocompletado, acciones de código y renombrado LSP sobre servidores de lenguaje | |
|
|
276
|
+
| **[dsh-dsh-mask](https://github.com/PerryLink/dsh-dsh-mask)** | Middleware de enmascaramiento de PII: anonimiza en el límite del modelo, restaura en la capa de visualización | |
|
|
277
|
+
| **[dsh-dsh-mcp-panel](https://github.com/PerryLink/dsh-dsh-mcp-panel)** | Panel de tiempo de ejecución MCP de solo lectura: comando /mcp + pestaña Settings con estado, herramientas y errores | |
|
|
278
|
+
| **[dsh-dsh-memento](https://github.com/PerryLink/dsh-dsh-memento)** | Memoria entre sesiones controlada por aprobación: costura ctx.memory + SQLite + herramienta de memoria | |
|
|
279
|
+
| **[dsh-dsh-observe](https://github.com/PerryLink/dsh-dsh-observe)** | Exportador de observabilidad OpenTelemetry y Langfuse para DeepSeek Harness. | |
|
|
280
|
+
| **[dsh-dsh-output-styles](https://github.com/PerryLink/dsh-dsh-output-styles)** | Cambio de estilo en tiempo de ejecución equivalente a outputStyles de Claude Code | |
|
|
281
|
+
| **[dsh-dsh-permission-rules](https://github.com/PerryLink/dsh-dsh-permission-rules)** | Reglas de permisos declarativas allow/deny/ask estilo Claude Code con auditoría | |
|
|
282
|
+
| **[dsh-dsh-plugin-guide](https://github.com/PerryLink/dsh-dsh-plugin-guide)** | Base de conocimiento de desarrollo de plugins como habilidad de agente bajo demanda | |
|
|
283
|
+
| **[dsh-dsh-research-report](https://github.com/PerryLink/dsh-dsh-research-report)** | Motor de informes de investigación verificables con evidencia direccionada por contenido | |
|
|
284
|
+
| **[dsh-dsh-score](https://github.com/PerryLink/dsh-dsh-score)** | Puntuación de calidad multidimensional para plugins de DeepSeek Harness. | |
|
|
285
|
+
| **[dsh-dsh-session-pin](https://github.com/PerryLink/dsh-dsh-session-pin)** | Fija sesiones en la barra lateral web con orden durable | |
|
|
286
|
+
| **[dsh-dsh-session-sync](https://github.com/PerryLink/dsh-dsh-session-sync)** | Sincronización de sesiones entre dispositivos para DeepSeek Harness — un espejo git dedicado de tu almacén de sesiones. | |
|
|
287
|
+
| **[dsh-dsh-skill-pack-security](https://github.com/PerryLink/dsh-dsh-skill-pack-security)** | Paquete de habilidades de auditoría de seguridad: escaneo de secretos, revisión de dependencias y cadena de suministro | |
|
|
288
|
+
| **[dsh-dsh-talk](https://github.com/PerryLink/dsh-dsh-talk)** | Bucle de sesión con voz para DeepSeek Harness: háblale y escucha su respuesta. | |
|
|
289
|
+
| **[dsh-dsh-test-drive](https://github.com/PerryLink/dsh-dsh-test-drive)** | Pruebas de instalación y humo aisladas para plugins de DeepSeek Harness. | |
|
|
290
|
+
| **[dsh-dsh-translate](https://github.com/PerryLink/dsh-dsh-translate)** | Traducción de parámetros entre proveedores y reparación determinista de JSON para DeepSeek Harness. | |
|
|
260
291
|
|
|
261
292
|
## Licencia
|
|
262
293
|
|
package/README.hi.md
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
<div align="center">
|
|
2
2
|
|
|
3
3
|
# dsh-doublecheck
|
|
4
|
+
- **1024 स्टोर चैनल**: एक बार `npm i -g dsh1024`, फिर `dsh1024 plugin --profile web add dsh-doublecheck` ([deepseek1024.com](https://deepseek1024.com) इंस्टॉल रैंकिंग में गिना जाता है)।
|
|
4
5
|
|
|
5
6
|
**DeepSeek Harness के लिए डिलीवरी गुणवत्ता-द्वार: आवश्यकताओं की पड़ताल करें, कार्यान्वयन का परीक्षण करें, डिलीवरी साबित करें — फिर deliverable / rework required निर्णय से हैंडऑफ़ को नियंत्रित करें।**
|
|
6
7
|
|
|
@@ -192,6 +193,19 @@ dsh --profile web --dump-config | grep -E -A3 'id: doublecheck-(grill|guard)'
|
|
|
192
193
|
- counts, ids, and verdicts only: no file contents or session text are embedded, and recognized secrets are redacted.
|
|
193
194
|
````
|
|
194
195
|
|
|
196
|
+
## CI आउटपुट
|
|
197
|
+
|
|
198
|
+
`/gate run` एक `gate-report.json` भी लिखता है (दोषरहित JSON जैसी ही स्थापित स्थिति, `gate-report.md` के पास)। `doublecheck-gate` CLI उस फ़ाइल को GitHub Actions के लिए मशीन-पठनीय आउटपुट में बदलता है:
|
|
199
|
+
|
|
200
|
+
```sh
|
|
201
|
+
# JSON (PR टिप्पणी / स्थिति पेलोड)
|
|
202
|
+
doublecheck-gate --format json --input gate-report.json
|
|
203
|
+
# SARIF 2.1.0 (code-scanning अपलोड / स्थिति जाँच)
|
|
204
|
+
doublecheck-gate --format sarif < gate-report.json
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
CLI केवल पहले से स्थापित `GateState` को क्रमबद्ध करता है — यह कभी चार-चरणीय द्वार या साक्ष्य तहों को दोबारा नहीं चलाता। इसका निकास कोड निर्णय को मैप करता है: `0` = डिलीवर करने योग्य, `1` = पुनः कार्य, `2` = उपयोग/पार्स त्रुटि।
|
|
208
|
+
|
|
195
209
|
## अनुमतियाँ और डेटा
|
|
196
210
|
|
|
197
211
|
- **पढ़ता है**: सत्र लॉग (`tool/call` / `tool/result` / `tool/code-dispatch`, इंजेक्ट किए गए `user/message` स्रोत, और बाहरी `autoReview/*` निर्णय रिकॉर्ड) केवल प्रक्रिया के भीतर; वैकल्पिक प्लान-मोड सेवा स्थिति।
|
|
@@ -209,7 +223,7 @@ dsh --profile web --dump-config | grep -E -A3 'id: doublecheck-(grill|guard)'
|
|
|
209
223
|
|
|
210
224
|
## ज्ञात सीमाएँ
|
|
211
225
|
|
|
212
|
-
- **टिकाऊ लेखन।** `/doublecheck on\|off` → `doublecheck/state` और `/gate run` → `doublecheck/gate` को host की `ignorable` append सतह (rc.6 के बाद)
|
|
226
|
+
- **टिकाऊ लेखन।** `/doublecheck on\|off` → `doublecheck/state` और `/gate run` → `doublecheck/gate` को host की `ignorable` append सतह (rc.6 के बाद से `0.1.1-rc.2` तक) चाहिए। उस सतह के बिना hosts (rc.6/rc.8 और `0.1.2-alpha.1`, जिसने envelope हटा दिया) पर लेखन छोड़ दिया जाता है और स्विच प्रक्रिया-स्थानीय रहता है।
|
|
213
227
|
- **वैकल्पिक इंटरफ़ेस।** `doublecheck.gate` सेटिंग्स नेमस्पेस केवल तब पंजीकृत होता है जब सेटिंग्स सेवा माउंट हो; `/gate status` की प्लान-मोड पंक्ति वैकल्पिक `ctx.planMode` पढ़ती है (इसके बिना `unknown` दिखाती है); प्रतिकूल समीक्षा को `ctx.subagents` चाहिए; सत्यापन को `workflowEngine` चाहिए।
|
|
214
228
|
- **स्थानीय अवनति।** जब dsh-auto-review अनुपस्थित हो या इस सत्र में उसके कोई निर्णय रिकॉर्ड न हों, तो `gate.review.engine: auto` स्थानीय समीक्षक पर घट जाता है — रिपोर्ट निर्णय गढ़ने के बजाय कारण बताती है।
|
|
215
229
|
- **dsh-eval साक्ष्य फ़ाइल-आधारित है।** dsh-auto-review का मूल्यांकन इंजन (`dsh-eval`) अपने prompt-regression / stress / fairness परिणाम कार्यक्षेत्र रिपोर्ट फ़ाइल में लिखता है, सत्र लॉग में नहीं। `gate.tests.evalReports.enabled` उस फ़ाइल को मोड़ता है (डिफ़ॉल्ट रूप से बंद; अनुपस्थित होने पर छोड़ देता है) और मोड़ी गई गणनाएँ टिकाऊ `doublecheck/gate` रिकॉर्ड पर चलती हैं, ताकि तयशुदा रन फिर भी रीप्ले हो सके।
|
|
@@ -238,25 +252,42 @@ pnpm run pack:check # build + pack the tarball
|
|
|
238
252
|
|
|
239
253
|
## PerryLink DSH Plugin Family
|
|
240
254
|
|
|
241
|
-
यह
|
|
255
|
+
यह प्रोजेक्ट [PerryLink](https://github.com/PerryLink) द्वारा अनुरक्षित [33 DeepSeek Harness प्लगइनों](https://github.com/PerryLink) में से एक है। अगर यह आपकी मदद करता है, तो बाकी भी करेंगे:
|
|
242
256
|
|
|
243
257
|
| Plugin | One-liner |
|
|
244
258
|
|---|---|
|
|
245
|
-
| [dsh-
|
|
246
|
-
| **[dsh-
|
|
247
|
-
| [dsh-
|
|
248
|
-
| [dsh-
|
|
249
|
-
| [dsh-
|
|
250
|
-
| [dsh-
|
|
251
|
-
| [dsh-
|
|
252
|
-
| [dsh-
|
|
253
|
-
| [dsh-
|
|
254
|
-
| [dsh-
|
|
255
|
-
| [dsh-
|
|
256
|
-
| [dsh-
|
|
257
|
-
| [dsh-github](https://github.com/PerryLink/dsh-github) | GitHub PR/issues
|
|
258
|
-
| [dsh-
|
|
259
|
-
| [dsh-
|
|
259
|
+
| **[dsh-dsh-auto-review](https://github.com/PerryLink/dsh-dsh-auto-review)** | अनुमोदन श्रृंखला पर द्वितीय-मॉडल स्वतः-समीक्षा, डिफ़ॉल्ट रूप से विफल-बंद | |
|
|
260
|
+
| **[dsh-dsh-background-agents](https://github.com/PerryLink/dsh-dsh-background-agents)** | वेब UI साइडबार, संदेश और अवरोधन के साथ टिकाऊ पृष्ठभूमि चाइल्ड एजेंट | |
|
|
261
|
+
| **[dsh-dsh-budget](https://github.com/PerryLink/dsh-dsh-budget)** | DeepSeek Harness के लिए लागत प्रशासन: बजट, कार्बन और विलंबता एक पैनल में। | |
|
|
262
|
+
| **[dsh-dsh-checkpoint-rewind](https://github.com/PerryLink/dsh-dsh-checkpoint-rewind)** | Claude Code /rewind-समतुल्य: स्नैपशॉट, सत्र फ़ॉर्क, एक-बार पुनर्स्थापना | |
|
|
263
|
+
| **[dsh-dsh-claude-move](https://github.com/PerryLink/dsh-dsh-claude-move)** | Claude Code सत्र, मेमोरी, कौशल और CLAUDE.md को DSH में स्थानांतरित करें | |
|
|
264
|
+
| **[dsh-dsh-click](https://github.com/PerryLink/dsh-dsh-click)** | DeepSeek Harness के लिए क्रॉस-प्लेटफ़ॉर्म नेटिव डेस्कटॉप नियंत्रण — Windows पहले। | |
|
|
265
|
+
| **[dsh-dsh-composer-history](https://github.com/PerryLink/dsh-dsh-composer-history)** | वेब कंपोज़र के लिए टर्मिनल-शैली इनपुट इतिहास: तीर, Ctrl+R खोज | |
|
|
266
|
+
| **[dsh-dsh-data-quality](https://github.com/PerryLink/dsh-dsh-data-quality)** | डेटासेट गुणवत्ता जाँच व उद्धरण सत्यापन (यहाँ उपभोग किया गया वैकल्पिक संख्या-सेतु) | |
|
|
267
|
+
| **[dsh-dsh-defend](https://github.com/PerryLink/dsh-dsh-defend)** | DeepSeek Harness के लिए प्रॉम्प्ट-इंजेक्शन, जेलब्रेक और सीक्रेट-लीक रक्षा। | |
|
|
268
|
+
| **[dsh-dsh-draw](https://github.com/PerryLink/dsh-dsh-draw)** | DeepSeek Harness के लिए एकीकृत स्थैतिक-छवि निर्माण रूटिंग। | |
|
|
269
|
+
| **[dsh-dsh-fast](https://github.com/PerryLink/dsh-dsh-fast)** | DeepSeek Harness के लिए रीड-ओनली प्रदर्शन डायग्नोस्टिक्स। | |
|
|
270
|
+
| **[dsh-dsh-fund-research](https://github.com/PerryLink/dsh-dsh-fund-research)** | चीनी सार्वजनिक म्यूचुअल फंड के लिए नियतात्मक अनुसंधान रिपोर्ट | |
|
|
271
|
+
| **[dsh-dsh-github](https://github.com/PerryLink/dsh-dsh-github)** | DSH के लिए GitHub PR/issues एकीकरण, हर लेखन अनुमोदन-द्वारित | |
|
|
272
|
+
| **[dsh-dsh-industry-research](https://github.com/PerryLink/dsh-dsh-industry-research)** | उद्योग-अनुसंधान ऑर्केस्ट्रेशन जो इस प्लगिन के `ctx.researchReport.assemble` से डिलीवरेबल सील करता है | |
|
|
273
|
+
| **[dsh-dsh-library](https://github.com/PerryLink/dsh-dsh-library)** | DeepSeek Harness के लिए स्थानीय दस्तावेज़ ज्ञानकोश। | |
|
|
274
|
+
| **[dsh-dsh-local-ai](https://github.com/PerryLink/dsh-dsh-local-ai)** | DeepSeek Harness के लिए स्थानीय-मॉडल (Ollama) एकीकरण। | |
|
|
275
|
+
| **[dsh-dsh-lsp-actions](https://github.com/PerryLink/dsh-dsh-lsp-actions)** | भाषा सर्वरों पर LSP निदान, फ़ॉर्मेटिंग, पूर्णता, कोड क्रियाएँ और नाम बदलना | |
|
|
276
|
+
| **[dsh-dsh-mask](https://github.com/PerryLink/dsh-dsh-mask)** | PII मास्किंग मिडलवेयर: मॉडल सीमा पर अनाम करें, डिस्प्ले लेयर पर पुनर्स्थापित करें | |
|
|
277
|
+
| **[dsh-dsh-mcp-panel](https://github.com/PerryLink/dsh-dsh-mcp-panel)** | केवल-पढ़ने वाला MCP रनटाइम पैनल: /mcp कमांड + स्थिति, टूल और त्रुटियों वाला Settings टैब | |
|
|
278
|
+
| **[dsh-dsh-memento](https://github.com/PerryLink/dsh-dsh-memento)** | अनुमोदन-द्वारित क्रॉस-सत्र मेमोरी: ctx.memory सीम + SQLite + मेमोरी टूल | |
|
|
279
|
+
| **[dsh-dsh-observe](https://github.com/PerryLink/dsh-dsh-observe)** | DeepSeek Harness के लिए OpenTelemetry और Langfuse अवलोकनीयता निर्यातक। | |
|
|
280
|
+
| **[dsh-dsh-output-styles](https://github.com/PerryLink/dsh-dsh-output-styles)** | Claude Code outputStyles-समतुल्य रनटाइम शैली बदलाव | |
|
|
281
|
+
| **[dsh-dsh-permission-rules](https://github.com/PerryLink/dsh-dsh-permission-rules)** | ऑडिट के साथ Claude Code-शैली घोषणात्मक allow/deny/ask अनुमति नियम | |
|
|
282
|
+
| **[dsh-dsh-plugin-guide](https://github.com/PerryLink/dsh-dsh-plugin-guide)** | माँग पर एजेंट कौशल के रूप में प्लगइन-विकास ज्ञान आधार | |
|
|
283
|
+
| **[dsh-dsh-research-report](https://github.com/PerryLink/dsh-dsh-research-report)** | सामग्री-पता साक्ष्य और सीलबंद संस्करणों वाला सत्यापन-योग्य अनुसंधान-रिपोर्ट इंजन | |
|
|
284
|
+
| **[dsh-dsh-score](https://github.com/PerryLink/dsh-dsh-score)** | DeepSeek Harness प्लगिनों की बहु-आयामी गुणवत्ता स्कोरिंग। | |
|
|
285
|
+
| **[dsh-dsh-session-pin](https://github.com/PerryLink/dsh-dsh-session-pin)** | टिकाऊ क्रम के साथ वेब साइडबार में सत्र पिन करें | |
|
|
286
|
+
| **[dsh-dsh-session-sync](https://github.com/PerryLink/dsh-dsh-session-sync)** | DeepSeek Harness के लिए क्रॉस-डिवाइस सत्र सिंक — आपके सत्र स्टोर का एक समर्पित git मिरर। | |
|
|
287
|
+
| **[dsh-dsh-skill-pack-security](https://github.com/PerryLink/dsh-dsh-skill-pack-security)** | सुरक्षा-ऑडिट कौशल पैक: गुप्त स्कैन, निर्भरता और आपूर्ति-श्रृंखला समीक्षा | |
|
|
288
|
+
| **[dsh-dsh-talk](https://github.com/PerryLink/dsh-dsh-talk)** | DeepSeek Harness के लिए आवाज़-प्रथम सत्र लूप: बोलें और उत्तर सुनें। | |
|
|
289
|
+
| **[dsh-dsh-test-drive](https://github.com/PerryLink/dsh-dsh-test-drive)** | DeepSeek Harness प्लगिनों के लिए पृथक इंस्टॉल-एंड-स्मोक टेस्ट ड्राइव। | |
|
|
290
|
+
| **[dsh-dsh-translate](https://github.com/PerryLink/dsh-dsh-translate)** | DeepSeek Harness के लिए वेंडर पैरामीटर अनुवाद और नियतात्मक JSON मरम्मत। | |
|
|
260
291
|
|
|
261
292
|
## लाइसेंस
|
|
262
293
|
|
package/README.md
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
<div align="center">
|
|
2
2
|
|
|
3
3
|
# dsh-doublecheck
|
|
4
|
+
- **1024 store channel**: `npm i -g dsh1024` once, then `dsh1024 plugin --profile web add dsh-doublecheck` (counts toward the [deepseek1024.com](https://deepseek1024.com) install ranking).
|
|
4
5
|
[](https://gitee.com/perrylink/dsh-doublecheck)
|
|
5
6
|
|
|
6
7
|
**The delivery quality gate for DeepSeek Harness: grill the requirements, test the implementation, prove the delivery — then gate the handoff with a deliverable/rework decision.**
|
|
@@ -193,10 +194,23 @@ Red lights are failed checks (a missing spec, a failing latest run, coverage bel
|
|
|
193
194
|
- counts, ids, and verdicts only: no file contents or session text are embedded, and recognized secrets are redacted.
|
|
194
195
|
````
|
|
195
196
|
|
|
197
|
+
## CI output
|
|
198
|
+
|
|
199
|
+
`/gate run` also writes a `gate-report.json` (the same settled state as lossless JSON, next to `gate-report.md`). The `doublecheck-gate` CLI turns that file into machine-readable output for GitHub Actions:
|
|
200
|
+
|
|
201
|
+
```sh
|
|
202
|
+
# JSON (PR comment / status payload)
|
|
203
|
+
doublecheck-gate --format json --input gate-report.json
|
|
204
|
+
# SARIF 2.1.0 (code-scanning upload / status check)
|
|
205
|
+
doublecheck-gate --format sarif < gate-report.json
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
The CLI only serializes the already-settled `GateState` — it never re-runs the four-phase gate or the evidence folds. Its exit code maps the verdict: `0` = deliverable, `1` = rework, `2` = usage/parse error.
|
|
209
|
+
|
|
196
210
|
## Permissions & data
|
|
197
211
|
|
|
198
212
|
- **Reads**: the session log (`tool/call` / `tool/result` / `tool/code-dispatch`, injected `user/message` sources, and the foreign `autoReview/*` verdict records) in-process only; the optional plan-mode service state.
|
|
199
|
-
- **Writes**: `doublecheck-spec.md`, `doublecheck-report.md`, and `gate-report.
|
|
213
|
+
- **Writes**: `doublecheck-spec.md`, `doublecheck-report.md`, `gate-report.md`, and `gate-report.json` in the session workspace (paths configurable) through the `ctx.fs` seam; the durable `doublecheck/state` and `doublecheck/gate` session events.
|
|
200
214
|
- **Model calls**: the gate's consistency and local-review phases (one subagent each per `/gate run`), the optional adversary review, and the `doublecheck_report` verification workflow start subagent runs; nothing else calls a model or the network.
|
|
201
215
|
- **Never touched**: credentials, environment variables, or any file outside the session workspace. The workshop manifest declares `filesystem:read` and `filesystem:write` only. Gate reports carry counts, ids, and verdicts only; recognized secrets in reviewer texts are redacted before storage or display.
|
|
202
216
|
|
|
@@ -210,7 +224,7 @@ Red lights are failed checks (a missing spec, a failing latest run, coverage bel
|
|
|
210
224
|
|
|
211
225
|
## Known limitations
|
|
212
226
|
|
|
213
|
-
- **Durable writes.** `/doublecheck on\|off` → `doublecheck/state` and `/gate run` → `doublecheck/gate` ride the host's `ignorable` append surface (post-rc.6)
|
|
227
|
+
- **Durable writes.** `/doublecheck on\|off` → `doublecheck/state` and `/gate run` → `doublecheck/gate` ride the host's `ignorable` append surface (post-rc.6 through `0.1.1-rc.2`). On hosts without that surface (rc.6/rc.8, and `0.1.2-alpha.1` which removed the envelope), the writes are skipped and the switch stays process-local.
|
|
214
228
|
- **Optional seams.** The `doublecheck.gate` settings namespace registers only when the settings service is mounted; the `/gate status` plan-mode line reads the optional `ctx.planMode` (shows `unknown` without it); the adversary review needs `ctx.subagents`; verification needs `workflowEngine`.
|
|
215
229
|
- **Local degrade.** `gate.review.engine: auto` degrades to the local reviewer when dsh-auto-review is absent or has no verdict records this session — the report names the reason instead of inventing a verdict.
|
|
216
230
|
- **dsh-eval evidence is file-based.** The dsh-auto-review eval engine (`dsh-eval`) writes its prompt-regression / stress / fairness results to a workspace report file, not the session log. `gate.tests.evalReports.enabled` folds that file (off by default; skips when absent) and the folded counts ride the durable `doublecheck/gate` record so a settled run still replays.
|
|
@@ -239,25 +253,42 @@ pnpm run pack:check # build + pack the tarball
|
|
|
239
253
|
|
|
240
254
|
## PerryLink DSH Plugin Family
|
|
241
255
|
|
|
242
|
-
This project is one of the [
|
|
256
|
+
This project is one of the [33 DeepSeek Harness plugins](https://github.com/PerryLink) maintained by [PerryLink](https://github.com/PerryLink). If this one helps you, the others likely will too:
|
|
243
257
|
|
|
244
258
|
| Plugin | One-liner |
|
|
245
259
|
|---|---|
|
|
246
|
-
| [dsh-
|
|
247
|
-
| **[dsh-
|
|
248
|
-
| [dsh-
|
|
249
|
-
| [dsh-
|
|
250
|
-
| [dsh-
|
|
251
|
-
| [dsh-
|
|
252
|
-
| [dsh-
|
|
253
|
-
| [dsh-
|
|
254
|
-
| [dsh-
|
|
255
|
-
| [dsh-
|
|
256
|
-
| [dsh-
|
|
257
|
-
| [dsh-
|
|
258
|
-
| [dsh-github](https://github.com/PerryLink/dsh-github) | GitHub PR/issues integration for DSH, every write gated by approval |
|
|
259
|
-
| [dsh-
|
|
260
|
-
| [dsh-
|
|
260
|
+
| **[dsh-dsh-auto-review](https://github.com/PerryLink/dsh-dsh-auto-review)** | Second-model auto-review on the approval chain, fail-closed by default | |
|
|
261
|
+
| **[dsh-dsh-background-agents](https://github.com/PerryLink/dsh-dsh-background-agents)** | Durable background child agents with a Web UI sidebar, messaging and interrupt | |
|
|
262
|
+
| **[dsh-dsh-budget](https://github.com/PerryLink/dsh-dsh-budget)** | Cost governance for DeepSeek Harness: budgets, carbon, and latency in one panel. | |
|
|
263
|
+
| **[dsh-dsh-checkpoint-rewind](https://github.com/PerryLink/dsh-dsh-checkpoint-rewind)** | Claude Code /rewind-equivalent: snapshots, session forks, one-shot restore | |
|
|
264
|
+
| **[dsh-dsh-claude-move](https://github.com/PerryLink/dsh-dsh-claude-move)** | Migrate Claude Code sessions, memory, skills and CLAUDE.md into DSH | |
|
|
265
|
+
| **[dsh-dsh-click](https://github.com/PerryLink/dsh-dsh-click)** | Cross-platform native desktop control for DeepSeek Harness — Windows first. | |
|
|
266
|
+
| **[dsh-dsh-composer-history](https://github.com/PerryLink/dsh-dsh-composer-history)** | Terminal-style input history for the web composer: arrows, Ctrl+R search | |
|
|
267
|
+
| **[dsh-dsh-data-quality](https://github.com/PerryLink/dsh-dsh-data-quality)** | Dataset quality checks and citation cross-checks (the optional numeric bridge consumed here) | |
|
|
268
|
+
| **[dsh-dsh-defend](https://github.com/PerryLink/dsh-dsh-defend)** | Prompt-injection, jailbreak, and secret-leak defense for DeepSeek Harness. | |
|
|
269
|
+
| **[dsh-dsh-draw](https://github.com/PerryLink/dsh-dsh-draw)** | Unified static-image generation routing for DeepSeek Harness. | |
|
|
270
|
+
| **[dsh-dsh-fast](https://github.com/PerryLink/dsh-dsh-fast)** | Read-only performance diagnostics for DeepSeek Harness. | |
|
|
271
|
+
| **[dsh-dsh-fund-research](https://github.com/PerryLink/dsh-dsh-fund-research)** | Deterministic research reports for Chinese public mutual funds | |
|
|
272
|
+
| **[dsh-dsh-github](https://github.com/PerryLink/dsh-dsh-github)** | GitHub PR/issues integration for DSH, every write gated by approval | |
|
|
273
|
+
| **[dsh-dsh-industry-research](https://github.com/PerryLink/dsh-dsh-industry-research)** | Industry research orchestration that seals its deliverables through this plugin's `ctx.researchReport.assemble` | |
|
|
274
|
+
| **[dsh-dsh-library](https://github.com/PerryLink/dsh-dsh-library)** | Local document knowledge base for DeepSeek Harness. | |
|
|
275
|
+
| **[dsh-dsh-local-ai](https://github.com/PerryLink/dsh-dsh-local-ai)** | Local-model (Ollama) integration for DeepSeek Harness. | |
|
|
276
|
+
| **[dsh-dsh-lsp-actions](https://github.com/PerryLink/dsh-dsh-lsp-actions)** | LSP diagnostics, formatting, completion, code actions and rename over language servers | |
|
|
277
|
+
| **[dsh-dsh-mask](https://github.com/PerryLink/dsh-dsh-mask)** | PII masking middleware: anonymize at the model boundary, restore at the display layer | |
|
|
278
|
+
| **[dsh-dsh-mcp-panel](https://github.com/PerryLink/dsh-dsh-mcp-panel)** | Read-only MCP runtime panel: /mcp command + Settings tab with status, tools and errors | |
|
|
279
|
+
| **[dsh-dsh-memento](https://github.com/PerryLink/dsh-dsh-memento)** | Approval-gated cross-session memory: ctx.memory seam + SQLite + memory tool | |
|
|
280
|
+
| **[dsh-dsh-observe](https://github.com/PerryLink/dsh-dsh-observe)** | OpenTelemetry and Langfuse observability exporter for DeepSeek Harness. | |
|
|
281
|
+
| **[dsh-dsh-output-styles](https://github.com/PerryLink/dsh-dsh-output-styles)** | Claude Code outputStyles-equivalent runtime style switching | |
|
|
282
|
+
| **[dsh-dsh-permission-rules](https://github.com/PerryLink/dsh-dsh-permission-rules)** | Claude Code-style declarative allow/deny/ask permission rules with audit | |
|
|
283
|
+
| **[dsh-dsh-plugin-guide](https://github.com/PerryLink/dsh-dsh-plugin-guide)** | Plugin-development knowledge base as an on-demand agent skill | |
|
|
284
|
+
| **[dsh-dsh-research-report](https://github.com/PerryLink/dsh-dsh-research-report)** | Verifiable research-report engine: content-addressed evidence ledger and sealed versions | |
|
|
285
|
+
| **[dsh-dsh-score](https://github.com/PerryLink/dsh-dsh-score)** | Multi-dimensional quality scoring for DeepSeek Harness plugins. | |
|
|
286
|
+
| **[dsh-dsh-session-pin](https://github.com/PerryLink/dsh-dsh-session-pin)** | Pin sessions in the Web sidebar with durable ordering | |
|
|
287
|
+
| **[dsh-dsh-session-sync](https://github.com/PerryLink/dsh-dsh-session-sync)** | Cross-device session sync for DeepSeek Harness — a dedicated git mirror of your session store. | |
|
|
288
|
+
| **[dsh-dsh-skill-pack-security](https://github.com/PerryLink/dsh-dsh-skill-pack-security)** | Security-audit skill pack: secret scan, dependency and supply-chain review | |
|
|
289
|
+
| **[dsh-dsh-talk](https://github.com/PerryLink/dsh-dsh-talk)** | Voice-first session loop for DeepSeek Harness: talk to it, hear it answer. | |
|
|
290
|
+
| **[dsh-dsh-test-drive](https://github.com/PerryLink/dsh-dsh-test-drive)** | Isolated install-and-smoke test drives for DeepSeek Harness plugins. | |
|
|
291
|
+
| **[dsh-dsh-translate](https://github.com/PerryLink/dsh-dsh-translate)** | Vendor parameter translation and deterministic JSON repair for DeepSeek Harness. | |
|
|
261
292
|
|
|
262
293
|
## License
|
|
263
294
|
|
package/README.pt.md
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
<div align="center">
|
|
2
2
|
|
|
3
3
|
# dsh-doublecheck
|
|
4
|
+
- **Canal 1024 store**: `npm i -g dsh1024` uma vez, depois `dsh1024 plugin --profile web add dsh-doublecheck` (conta para o ranking de instalações do [deepseek1024.com](https://deepseek1024.com)).
|
|
4
5
|
|
|
5
6
|
**O portão de qualidade de entrega para o DeepSeek Harness: interrogue os requisitos, teste a implementação, comprove a entrega — e então controle a passagem com uma decisão de entregável / retrabalho necessário.**
|
|
6
7
|
|
|
@@ -192,6 +193,19 @@ As luzes vermelhas são verificações que falharam (um spec ausente, uma últim
|
|
|
192
193
|
- counts, ids, and verdicts only: no file contents or session text are embedded, and recognized secrets are redacted.
|
|
193
194
|
````
|
|
194
195
|
|
|
196
|
+
## Saída do CI
|
|
197
|
+
|
|
198
|
+
`/gate run` também grava um `gate-report.json` (o mesmo estado assentado que o JSON sem perda, ao lado de `gate-report.md`). O CLI `doublecheck-gate` converte esse arquivo em saída legível por máquina para o GitHub Actions:
|
|
199
|
+
|
|
200
|
+
```sh
|
|
201
|
+
# JSON (comentário de PR / payload de status)
|
|
202
|
+
doublecheck-gate --format json --input gate-report.json
|
|
203
|
+
# SARIF 2.1.0 (upload de code-scanning / verificação de status)
|
|
204
|
+
doublecheck-gate --format sarif < gate-report.json
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
O CLI apenas serializa o `GateState` já assentado — nunca reexecuta a porta de quatro fases nem as dobras de evidência. Seu código de saída mapeia o veredicto: `0` = entregável, `1` = retrabalho, `2` = erro de uso/análise.
|
|
208
|
+
|
|
195
209
|
## Permissões e dados
|
|
196
210
|
|
|
197
211
|
- **Lê**: o registro de sessão (`tool/call` / `tool/result` / `tool/code-dispatch`, fontes `user/message` injetadas e os registros de veredicto alheios `autoReview/*`) somente em processo; o estado opcional do serviço de modo plano.
|
|
@@ -209,7 +223,7 @@ As luzes vermelhas são verificações que falharam (um spec ausente, uma últim
|
|
|
209
223
|
|
|
210
224
|
## Limitações conhecidas
|
|
211
225
|
|
|
212
|
-
- **Escritas duráveis.** `/doublecheck on\|off` → `doublecheck/state` e `/gate run` → `doublecheck/gate` precisam da superfície de append `ignorable` do host (pós-rc.6)
|
|
226
|
+
- **Escritas duráveis.** `/doublecheck on\|off` → `doublecheck/state` e `/gate run` → `doublecheck/gate` precisam da superfície de append `ignorable` do host (pós-rc.6 até `0.1.1-rc.2`). Em hosts sem essa superfície (rc.6/rc.8 e `0.1.2-alpha.1`, que removeu o envelope), as escritas são omitidas e o interruptor permanece em processo.
|
|
213
227
|
- **Interfaces opcionais.** O namespace de configurações `doublecheck.gate` é registrado apenas quando o serviço de configurações está montado; a linha de modo plano de `/gate status` lê o `ctx.planMode` opcional (mostra `unknown` sem ele); a revisão adversarial precisa de `ctx.subagents`; a verificação precisa de `workflowEngine`.
|
|
214
228
|
- **Degradação local.** `gate.review.engine: auto` degrada para o revisor local quando o dsh-auto-review está ausente ou não tem registros de veredicto nesta sessão — o relatório nomeia a razão em vez de inventar um veredicto.
|
|
215
229
|
- **A evidência dsh-eval é baseada em arquivos.** O motor de avaliação do dsh-auto-review (`dsh-eval`) grava seus resultados de regressão de prompt / estresse / equidade em um arquivo de relatório do espaço de trabalho, não no registro de sessão. `gate.tests.evalReports.enabled` dobra esse arquivo (desativado por padrão; pula quando ausente) e as contagens dobradas viajam no registro durável `doublecheck/gate` para que uma execução assentada ainda seja reproduzível.
|
|
@@ -238,25 +252,42 @@ pnpm run pack:check # build + pack the tarball
|
|
|
238
252
|
|
|
239
253
|
## PerryLink DSH Plugin Family
|
|
240
254
|
|
|
241
|
-
Este projeto é um dos [
|
|
255
|
+
Este projeto é um dos [33 plugins de DeepSeek Harness](https://github.com/PerryLink) mantidos por [PerryLink](https://github.com/PerryLink). Se este ajuda você, os outros provavelmente também:
|
|
242
256
|
|
|
243
257
|
| Plugin | One-liner |
|
|
244
258
|
|---|---|
|
|
245
|
-
| [dsh-
|
|
246
|
-
| **[dsh-
|
|
247
|
-
| [dsh-
|
|
248
|
-
| [dsh-
|
|
249
|
-
| [dsh-
|
|
250
|
-
| [dsh-
|
|
251
|
-
| [dsh-
|
|
252
|
-
| [dsh-
|
|
253
|
-
| [dsh-
|
|
254
|
-
| [dsh-
|
|
255
|
-
| [dsh-
|
|
256
|
-
| [dsh-
|
|
257
|
-
| [dsh-github](https://github.com/PerryLink/dsh-github) |
|
|
258
|
-
| [dsh-
|
|
259
|
-
| [dsh-
|
|
259
|
+
| **[dsh-dsh-auto-review](https://github.com/PerryLink/dsh-dsh-auto-review)** | Auto-revisão de segundo modelo na cadeia de aprovação, com falha fechada por padrão | |
|
|
260
|
+
| **[dsh-dsh-background-agents](https://github.com/PerryLink/dsh-dsh-background-agents)** | Agentes filhos em segundo plano duráveis com barra lateral de UI web, mensagens e interrupção | |
|
|
261
|
+
| **[dsh-dsh-budget](https://github.com/PerryLink/dsh-dsh-budget)** | Governança de custos para DeepSeek Harness: orçamentos, carbono e latência em um painel. | |
|
|
262
|
+
| **[dsh-dsh-checkpoint-rewind](https://github.com/PerryLink/dsh-dsh-checkpoint-rewind)** | Equivalente ao /rewind do Claude Code: instantâneos, bifurcações de sessão, restauração de uso único | |
|
|
263
|
+
| **[dsh-dsh-claude-move](https://github.com/PerryLink/dsh-dsh-claude-move)** | Migre sessões, memória, habilidades e CLAUDE.md do Claude Code para o DSH | |
|
|
264
|
+
| **[dsh-dsh-click](https://github.com/PerryLink/dsh-dsh-click)** | Controle de desktop nativo multiplataforma para DeepSeek Harness — Windows primeiro. | |
|
|
265
|
+
| **[dsh-dsh-composer-history](https://github.com/PerryLink/dsh-dsh-composer-history)** | Histórico de entrada estilo terminal para o compositor web: setas, busca Ctrl+R | |
|
|
266
|
+
| **[dsh-dsh-data-quality](https://github.com/PerryLink/dsh-dsh-data-quality)** | Verificações de qualidade de datasets e verificação de citações (a ponte numérica opcional consumida aqui) | |
|
|
267
|
+
| **[dsh-dsh-defend](https://github.com/PerryLink/dsh-dsh-defend)** | Defesa contra injeção de prompt, jailbreak e vazamento de segredos para DeepSeek Harness. | |
|
|
268
|
+
| **[dsh-dsh-draw](https://github.com/PerryLink/dsh-dsh-draw)** | Roteamento unificado de geração de imagens estáticas para DeepSeek Harness. | |
|
|
269
|
+
| **[dsh-dsh-fast](https://github.com/PerryLink/dsh-dsh-fast)** | Diagnóstico de desempenho só de leitura para DeepSeek Harness. | |
|
|
270
|
+
| **[dsh-dsh-fund-research](https://github.com/PerryLink/dsh-dsh-fund-research)** | Relatórios de pesquisa deterministas para fundos mútuos públicos chineses | |
|
|
271
|
+
| **[dsh-dsh-github](https://github.com/PerryLink/dsh-dsh-github)** | Integração de PR/issues do GitHub para o DSH, cada escrita controlada por aprovação | |
|
|
272
|
+
| **[dsh-dsh-industry-research](https://github.com/PerryLink/dsh-dsh-industry-research)** | Orquestração de pesquisa setorial que sela as suas entregas através do `ctx.researchReport.assemble` deste plugin | |
|
|
273
|
+
| **[dsh-dsh-library](https://github.com/PerryLink/dsh-dsh-library)** | Base de conhecimento documental local para DeepSeek Harness. | |
|
|
274
|
+
| **[dsh-dsh-local-ai](https://github.com/PerryLink/dsh-dsh-local-ai)** | Integração de modelos locais (Ollama) para DeepSeek Harness. | |
|
|
275
|
+
| **[dsh-dsh-lsp-actions](https://github.com/PerryLink/dsh-dsh-lsp-actions)** | Diagnósticos, formatação, autocompletar, ações de código e renomeação LSP sobre servidores de linguagem | |
|
|
276
|
+
| **[dsh-dsh-mask](https://github.com/PerryLink/dsh-dsh-mask)** | Middleware de mascaramento de PII: anonimiza no limite do modelo, restaura na camada de exibição | |
|
|
277
|
+
| **[dsh-dsh-mcp-panel](https://github.com/PerryLink/dsh-dsh-mcp-panel)** | Painel de tempo de execução MCP somente leitura: comando /mcp + aba Settings com status, ferramentas e erros | |
|
|
278
|
+
| **[dsh-dsh-memento](https://github.com/PerryLink/dsh-dsh-memento)** | Memória entre sessões controlada por aprovação: costura ctx.memory + SQLite + ferramenta de memória | |
|
|
279
|
+
| **[dsh-dsh-observe](https://github.com/PerryLink/dsh-dsh-observe)** | Exportador de observabilidade OpenTelemetry e Langfuse para DeepSeek Harness. | |
|
|
280
|
+
| **[dsh-dsh-output-styles](https://github.com/PerryLink/dsh-dsh-output-styles)** | Troca de estilo em tempo de execução equivalente ao outputStyles do Claude Code | |
|
|
281
|
+
| **[dsh-dsh-permission-rules](https://github.com/PerryLink/dsh-dsh-permission-rules)** | Regras de permissão declarativas allow/deny/ask estilo Claude Code com auditoria | |
|
|
282
|
+
| **[dsh-dsh-plugin-guide](https://github.com/PerryLink/dsh-dsh-plugin-guide)** | Base de conhecimento de desenvolvimento de plugins como habilidade de agente sob demanda | |
|
|
283
|
+
| **[dsh-dsh-research-report](https://github.com/PerryLink/dsh-dsh-research-report)** | Motor de relatórios de pesquisa verificáveis com evidência endereçada por conteúdo | |
|
|
284
|
+
| **[dsh-dsh-score](https://github.com/PerryLink/dsh-dsh-score)** | Pontuação de qualidade multidimensional para plugins de DeepSeek Harness. | |
|
|
285
|
+
| **[dsh-dsh-session-pin](https://github.com/PerryLink/dsh-dsh-session-pin)** | Fixe sessões na barra lateral web com ordenação durável | |
|
|
286
|
+
| **[dsh-dsh-session-sync](https://github.com/PerryLink/dsh-dsh-session-sync)** | Sincronização de sessões entre dispositivos para DeepSeek Harness — um espelho git dedicado do seu armazenamento de sessões. | |
|
|
287
|
+
| **[dsh-dsh-skill-pack-security](https://github.com/PerryLink/dsh-dsh-skill-pack-security)** | Pacote de habilidades de auditoria de segurança: varredura de segredos, revisão de dependências e cadeia de suprimentos | |
|
|
288
|
+
| **[dsh-dsh-talk](https://github.com/PerryLink/dsh-dsh-talk)** | Loop de sessão com voz para DeepSeek Harness: fale e ouça a resposta. | |
|
|
289
|
+
| **[dsh-dsh-test-drive](https://github.com/PerryLink/dsh-dsh-test-drive)** | Test drives isolados de instalação e smoke para plugins de DeepSeek Harness. | |
|
|
290
|
+
| **[dsh-dsh-translate](https://github.com/PerryLink/dsh-dsh-translate)** | Tradução de parâmetros entre fornecedores e reparo determinístico de JSON para DeepSeek Harness. | |
|
|
260
291
|
|
|
261
292
|
## Licença
|
|
262
293
|
|
package/README.zh.md
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
<div align="center">
|
|
2
2
|
|
|
3
3
|
# dsh-doublecheck
|
|
4
|
+
- **1024 商店渠道**:先 `npm i -g dsh1024`,再 `dsh1024 plugin --profile web add dsh-doublecheck`(计入 [deepseek1024.com](https://deepseek1024.com) 安装排行)。
|
|
4
5
|
|
|
5
6
|
**DeepSeek Harness 的交付质量门禁:先拷问需求,再测试实现,最后证明交付——并用「可交付 / 需要返工」的裁决来把关交接。**
|
|
6
7
|
|
|
@@ -192,6 +193,19 @@ dsh --profile web --dump-config | grep -E -A3 'id: doublecheck-(grill|guard)'
|
|
|
192
193
|
- counts, ids, and verdicts only: no file contents or session text are embedded, and recognized secrets are redacted.
|
|
193
194
|
````
|
|
194
195
|
|
|
196
|
+
## CI 输出
|
|
197
|
+
|
|
198
|
+
`/gate run` 还会写一个 `gate-report.json`(与无损 JSON 相同的已定状态,位于 `gate-report.md` 旁边)。`doublecheck-gate` CLI 把该文件转成可供 GitHub Actions 使用的机器可读输出:
|
|
199
|
+
|
|
200
|
+
```sh
|
|
201
|
+
# JSON(PR 评论 / 状态载荷)
|
|
202
|
+
doublecheck-gate --format json --input gate-report.json
|
|
203
|
+
# SARIF 2.1.0(code-scanning 上传 / 状态检查)
|
|
204
|
+
doublecheck-gate --format sarif < gate-report.json
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
CLI 只序列化已定的 `GateState` —— 它从不重新运行四阶段门禁或证据折叠。其退出码映射裁决:`0` = 可交付,`1` = 返工,`2` = 用法/解析错误。
|
|
208
|
+
|
|
195
209
|
## 权限与数据
|
|
196
210
|
|
|
197
211
|
- **读取**:仅进程内读取会话日志(`tool/call` / `tool/result` / `tool/code-dispatch`、注入的 `user/message` 来源,以及外部的 `autoReview/*` 裁决记录);可选的计划模式服务状态。
|
|
@@ -209,7 +223,7 @@ dsh --profile web --dump-config | grep -E -A3 'id: doublecheck-(grill|guard)'
|
|
|
209
223
|
|
|
210
224
|
## 已知限制
|
|
211
225
|
|
|
212
|
-
- **持久写入。** `/doublecheck on\|off` → `doublecheck/state` 与 `/gate run` → `doublecheck/gate` 需要宿主的 `ignorable` 追加接口(rc.6
|
|
226
|
+
- **持久写入。** `/doublecheck on\|off` → `doublecheck/state` 与 `/gate run` → `doublecheck/gate` 需要宿主的 `ignorable` 追加接口(rc.6 之后至 `0.1.1-rc.2`)。在无此接口的宿主上(rc.6/rc.8,以及移除该信封的 `0.1.2-alpha.1`),写入被跳过、开关保持进程内状态。
|
|
213
227
|
- **可选接口。** `doublecheck.gate` 设置命名空间仅在挂载设置服务时注册;`/gate status` 的计划模式行读取可选的 `ctx.planMode`(没有则显示 `unknown`);对抗式评审需要 `ctx.subagents`;验证需要 `workflowEngine`。
|
|
214
228
|
- **本地降级。** 当 dsh-auto-review 缺失或本会话没有裁决记录时,`gate.review.engine: auto` 会降级到本地评审者——报告会写明原因,而不是捏造裁决。
|
|
215
229
|
- **dsh-eval 证据基于文件。** dsh-auto-review 评测引擎(`dsh-eval`)把其 prompt 回归 / 压测 / 公平性结果写入工作区报告文件,而非会话日志。`gate.tests.evalReports.enabled` 折叠该文件(默认关闭;缺失时跳过),折叠出的计数随持久 `doublecheck/gate` 记录保存,使已定的运行仍可重放。
|
|
@@ -238,25 +252,42 @@ pnpm run pack:check # build + pack the tarball
|
|
|
238
252
|
|
|
239
253
|
## PerryLink DSH Plugin Family
|
|
240
254
|
|
|
241
|
-
|
|
255
|
+
这是 [PerryLink](https://github.com/PerryLink) 维护的 [33 个 DeepSeek Harness 插件](https://github.com/PerryLink) 之一。如果它能帮到你,其他的也会:
|
|
242
256
|
|
|
243
257
|
| Plugin | One-liner |
|
|
244
258
|
|---|---|
|
|
245
|
-
| [dsh-
|
|
246
|
-
| **[dsh-
|
|
247
|
-
| [dsh-
|
|
248
|
-
| [dsh-
|
|
249
|
-
| [dsh-
|
|
250
|
-
| [dsh-
|
|
251
|
-
| [dsh-
|
|
252
|
-
| [dsh-
|
|
253
|
-
| [dsh-
|
|
254
|
-
| [dsh-
|
|
255
|
-
| [dsh-
|
|
256
|
-
| [dsh-
|
|
257
|
-
| [dsh-github](https://github.com/PerryLink/dsh-github) | GitHub PR/issues
|
|
258
|
-
| [dsh-
|
|
259
|
-
| [dsh-
|
|
259
|
+
| **[dsh-dsh-auto-review](https://github.com/PerryLink/dsh-dsh-auto-review)** | 审批链上的第二模型自动审查,默认失败关闭 | |
|
|
260
|
+
| **[dsh-dsh-background-agents](https://github.com/PerryLink/dsh-dsh-background-agents)** | 带 Web UI 侧栏、消息与中断的持久后台子代理 | |
|
|
261
|
+
| **[dsh-dsh-budget](https://github.com/PerryLink/dsh-dsh-budget)** | DeepSeek Harness 的成本治理:预算、碳排与延迟一屏呈现。 | |
|
|
262
|
+
| **[dsh-dsh-checkpoint-rewind](https://github.com/PerryLink/dsh-dsh-checkpoint-rewind)** | Claude Code /rewind 等价:快照、会话 fork、一次性恢复 | |
|
|
263
|
+
| **[dsh-dsh-claude-move](https://github.com/PerryLink/dsh-dsh-claude-move)** | 把 Claude Code 会话、记忆、技能与 CLAUDE.md 迁入 DSH | |
|
|
264
|
+
| **[dsh-dsh-click](https://github.com/PerryLink/dsh-dsh-click)** | 跨平台原生桌面控制(DeepSeek Harness),Windows 优先。 | |
|
|
265
|
+
| **[dsh-dsh-composer-history](https://github.com/PerryLink/dsh-dsh-composer-history)** | Web 输入框的终端式历史:方向键、Ctrl+R 搜索 | |
|
|
266
|
+
| **[dsh-dsh-data-quality](https://github.com/PerryLink/dsh-dsh-data-quality)** | 数据集质量检查与引文核查(本插件可选消费的数字核查桥) | |
|
|
267
|
+
| **[dsh-dsh-defend](https://github.com/PerryLink/dsh-dsh-defend)** | DeepSeek Harness 的提示注入、越狱与密钥泄露防护。 | |
|
|
268
|
+
| **[dsh-dsh-draw](https://github.com/PerryLink/dsh-dsh-draw)** | DeepSeek Harness 的统一静态图像生成路由。 | |
|
|
269
|
+
| **[dsh-dsh-fast](https://github.com/PerryLink/dsh-dsh-fast)** | DeepSeek Harness 只读性能诊断。 | |
|
|
270
|
+
| **[dsh-dsh-fund-research](https://github.com/PerryLink/dsh-dsh-fund-research)** | 面向中国公募基金的确定性研究报告 | |
|
|
271
|
+
| **[dsh-dsh-github](https://github.com/PerryLink/dsh-dsh-github)** | 面向 DSH 的 GitHub PR/issues 集成,每次写入经审批门控 | |
|
|
272
|
+
| **[dsh-dsh-industry-research](https://github.com/PerryLink/dsh-dsh-industry-research)** | 行业研究编排,经本插件的 `ctx.researchReport.assemble` 封存交付物 | |
|
|
273
|
+
| **[dsh-dsh-library](https://github.com/PerryLink/dsh-dsh-library)** | DeepSeek Harness 的本地文档知识库。 | |
|
|
274
|
+
| **[dsh-dsh-local-ai](https://github.com/PerryLink/dsh-dsh-local-ai)** | DeepSeek Harness 的本地模型(Ollama)接入。 | |
|
|
275
|
+
| **[dsh-dsh-lsp-actions](https://github.com/PerryLink/dsh-dsh-lsp-actions)** | 通过语言服务器的 LSP 诊断、格式化、补全、代码操作与重命名 | |
|
|
276
|
+
| **[dsh-dsh-mask](https://github.com/PerryLink/dsh-dsh-mask)** | PII 脱敏中间件:模型边界匿名化、展示层还原 | |
|
|
277
|
+
| **[dsh-dsh-mcp-panel](https://github.com/PerryLink/dsh-dsh-mcp-panel)** | 只读 MCP 运行时面板:/mcp 命令 + 带状态、工具与错误的 Settings 标签页 | |
|
|
278
|
+
| **[dsh-dsh-memento](https://github.com/PerryLink/dsh-dsh-memento)** | 审批门控的跨会话记忆:ctx.memory 接缝 + SQLite + 记忆工具 | |
|
|
279
|
+
| **[dsh-dsh-observe](https://github.com/PerryLink/dsh-dsh-observe)** | DeepSeek Harness 的 OpenTelemetry 与 Langfuse 可观测导出器。 | |
|
|
280
|
+
| **[dsh-dsh-output-styles](https://github.com/PerryLink/dsh-dsh-output-styles)** | Claude Code outputStyles 等价的运行时风格切换 | |
|
|
281
|
+
| **[dsh-dsh-permission-rules](https://github.com/PerryLink/dsh-dsh-permission-rules)** | Claude Code 风格声明式 allow/deny/ask 权限规则,带审计 | |
|
|
282
|
+
| **[dsh-dsh-plugin-guide](https://github.com/PerryLink/dsh-dsh-plugin-guide)** | 作为按需代理技能的插件开发知识库 | |
|
|
283
|
+
| **[dsh-dsh-research-report](https://github.com/PerryLink/dsh-dsh-research-report)** | 可验证研究报告引擎:内容寻址证据账本与封存版本 | |
|
|
284
|
+
| **[dsh-dsh-score](https://github.com/PerryLink/dsh-dsh-score)** | DeepSeek Harness 插件的多维质量评分。 | |
|
|
285
|
+
| **[dsh-dsh-session-pin](https://github.com/PerryLink/dsh-dsh-session-pin)** | 在 Web 侧栏置顶会话,带持久排序 | |
|
|
286
|
+
| **[dsh-dsh-session-sync](https://github.com/PerryLink/dsh-dsh-session-sync)** | DeepSeek Harness 的跨设备会话同步——会话存储的专用 git 镜像。 | |
|
|
287
|
+
| **[dsh-dsh-skill-pack-security](https://github.com/PerryLink/dsh-dsh-skill-pack-security)** | 安全审计技能包:密钥扫描、依赖与供应链审查 | |
|
|
288
|
+
| **[dsh-dsh-talk](https://github.com/PerryLink/dsh-dsh-talk)** | DeepSeek Harness 的语音优先会话闭环:对它说,听它答。 | |
|
|
289
|
+
| **[dsh-dsh-test-drive](https://github.com/PerryLink/dsh-dsh-test-drive)** | DeepSeek Harness 插件的隔离试装冒烟。 | |
|
|
290
|
+
| **[dsh-dsh-translate](https://github.com/PerryLink/dsh-dsh-translate)** | DeepSeek Harness 的厂商参数翻译与确定性 JSON 修复。 | |
|
|
260
291
|
|
|
261
292
|
## 许可证
|
|
262
293
|
|
package/lib/ci.d.ts
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Headless gate-report CLI for CI (`doublecheck-gate`).
|
|
4
|
+
*
|
|
5
|
+
* Consumes a serialized {@link GateState} (the JSON the gate settles and
|
|
6
|
+
* writes next to `gate-report.md`) and emits a machine-readable report for a
|
|
7
|
+
* GH Actions PR comment or status check. It does NOT re-run the four-phase
|
|
8
|
+
* gate — it only serializes the already-settled state — so the gate runner
|
|
9
|
+
* and the evidence folds stay exactly as they are.
|
|
10
|
+
*
|
|
11
|
+
* Usage:
|
|
12
|
+
* doublecheck-gate --format json --input gate-report.json
|
|
13
|
+
* doublecheck-gate --format sarif < gate-report.json
|
|
14
|
+
*
|
|
15
|
+
* Exit code: 0 = deliverable, 1 = rework, 2 = usage/parse error.
|
|
16
|
+
*
|
|
17
|
+
* @module dsh-doublecheck/ci
|
|
18
|
+
*/
|
|
19
|
+
export {};
|
package/lib/ci.js
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Headless gate-report CLI for CI (`doublecheck-gate`).
|
|
4
|
+
*
|
|
5
|
+
* Consumes a serialized {@link GateState} (the JSON the gate settles and
|
|
6
|
+
* writes next to `gate-report.md`) and emits a machine-readable report for a
|
|
7
|
+
* GH Actions PR comment or status check. It does NOT re-run the four-phase
|
|
8
|
+
* gate — it only serializes the already-settled state — so the gate runner
|
|
9
|
+
* and the evidence folds stay exactly as they are.
|
|
10
|
+
*
|
|
11
|
+
* Usage:
|
|
12
|
+
* doublecheck-gate --format json --input gate-report.json
|
|
13
|
+
* doublecheck-gate --format sarif < gate-report.json
|
|
14
|
+
*
|
|
15
|
+
* Exit code: 0 = deliverable, 1 = rework, 2 = usage/parse error.
|
|
16
|
+
*
|
|
17
|
+
* @module dsh-doublecheck/ci
|
|
18
|
+
*/
|
|
19
|
+
import { readFileSync } from 'node:fs';
|
|
20
|
+
import { renderGateReportJson, renderGateReportSarif } from "./domain/gate.js";
|
|
21
|
+
/** Parse CLI arguments into `{ format, input }`. */
|
|
22
|
+
function parseArgs(argv) {
|
|
23
|
+
let format = 'json';
|
|
24
|
+
let input = null;
|
|
25
|
+
for (let index = 0; index < argv.length; index += 1) {
|
|
26
|
+
const arg = argv[index];
|
|
27
|
+
if (arg === '--format' || arg === '-f') {
|
|
28
|
+
const next = argv[index + 1];
|
|
29
|
+
if (next !== 'json' && next !== 'sarif')
|
|
30
|
+
throw new Error(`--format must be json or sarif, got ${JSON.stringify(next)}`);
|
|
31
|
+
format = next;
|
|
32
|
+
index += 1;
|
|
33
|
+
}
|
|
34
|
+
else if (arg === '--input' || arg === '-i') {
|
|
35
|
+
input = argv[index + 1] ?? null;
|
|
36
|
+
if (input === null)
|
|
37
|
+
throw new Error('--input requires a file path');
|
|
38
|
+
index += 1;
|
|
39
|
+
}
|
|
40
|
+
else if (arg === '--help' || arg === '-h') {
|
|
41
|
+
throw new Error('usage: doublecheck-gate [--format json|sarif] [--input <file>]');
|
|
42
|
+
}
|
|
43
|
+
else if (!arg.startsWith('-')) {
|
|
44
|
+
input = arg;
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
throw new Error(`unknown argument ${JSON.stringify(arg)}`);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return { format, input };
|
|
51
|
+
}
|
|
52
|
+
/** Read the gate-state JSON from the input file or stdin (fd 0). */
|
|
53
|
+
function readState(input) {
|
|
54
|
+
const raw = input !== null ? readFileSync(input, 'utf8') : readFileSync(0, 'utf8');
|
|
55
|
+
return JSON.parse(raw);
|
|
56
|
+
}
|
|
57
|
+
/** Render and print the report, returning the process exit code. */
|
|
58
|
+
function main(argv) {
|
|
59
|
+
let format;
|
|
60
|
+
let input;
|
|
61
|
+
try {
|
|
62
|
+
;
|
|
63
|
+
({ format, input } = parseArgs(argv));
|
|
64
|
+
const state = readState(input);
|
|
65
|
+
process.stdout.write((format === 'sarif' ? renderGateReportSarif : renderGateReportJson)(state) + '\n');
|
|
66
|
+
return state.verdict === 'rework' ? 1 : 0;
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
process.stderr.write(`doublecheck-gate: ${error instanceof Error ? error.message : String(error)}\n`);
|
|
70
|
+
return 2;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
process.exitCode = main(process.argv.slice(2));
|
package/lib/domain/gate.d.ts
CHANGED
|
@@ -322,3 +322,50 @@ export declare function renderGateReportMarkdown(state: GateState, planSuggestio
|
|
|
322
322
|
export declare function renderPhaseMarkdown(result: GatePhaseResult): string[];
|
|
323
323
|
/** Human-readable phase headings (stable English audit ids). */
|
|
324
324
|
export declare function phaseLabel(phase: GatePhase): string;
|
|
325
|
+
/**
|
|
326
|
+
* The machine-readable CI report derived from a settled gate state. Lossless
|
|
327
|
+
* JSON over the same counts/ids/verdicts the markdown report carries — no
|
|
328
|
+
* session text or file contents — so a GH Actions step can consume it for a
|
|
329
|
+
* PR comment or status check. The four-phase runner and the evidence folds
|
|
330
|
+
* are unchanged; this is a pure serialization of their settled output.
|
|
331
|
+
*/
|
|
332
|
+
export interface CiReport {
|
|
333
|
+
readonly schemaVersion: 1;
|
|
334
|
+
readonly tool: 'dsh-doublecheck';
|
|
335
|
+
readonly verdict: GateVerdict;
|
|
336
|
+
/** Convenience boolean: true when the delivery may proceed. */
|
|
337
|
+
readonly deliverable: boolean;
|
|
338
|
+
readonly reviewEngine: GateReviewEngine;
|
|
339
|
+
readonly at: string;
|
|
340
|
+
/** Number of failing (red) checks across enabled phases. */
|
|
341
|
+
readonly redChecks: number;
|
|
342
|
+
readonly phases: Array<{
|
|
343
|
+
readonly phase: GatePhase;
|
|
344
|
+
readonly enabled: boolean;
|
|
345
|
+
readonly status: GateCheckStatus;
|
|
346
|
+
readonly checks: Array<{
|
|
347
|
+
readonly id: string;
|
|
348
|
+
readonly label: string;
|
|
349
|
+
readonly status: GateCheckStatus;
|
|
350
|
+
readonly summary: string;
|
|
351
|
+
readonly suggestion: string;
|
|
352
|
+
}>;
|
|
353
|
+
}>;
|
|
354
|
+
}
|
|
355
|
+
/** Build the JSON-safe CI report from a settled gate state. */
|
|
356
|
+
export declare function buildCiReport(state: GateState): CiReport;
|
|
357
|
+
/**
|
|
358
|
+
* Render the settled gate state as headless JSON for CI (`--ci` output).
|
|
359
|
+
* @param state - the settled gate state.
|
|
360
|
+
* @returns the pretty-printed JSON report.
|
|
361
|
+
*/
|
|
362
|
+
export declare function renderGateReportJson(state: GateState): string;
|
|
363
|
+
/**
|
|
364
|
+
* Render the settled gate state as a SARIF 2.1.0 document for CI
|
|
365
|
+
* (GitHub code-scanning / status checks). Each failing check is an `error`
|
|
366
|
+
* result and each warning is a `warning` result; passing/skipped/pending
|
|
367
|
+
* checks are declared as rules but produce no result.
|
|
368
|
+
* @param state - the settled gate state.
|
|
369
|
+
* @returns the pretty-printed SARIF document.
|
|
370
|
+
*/
|
|
371
|
+
export declare function renderGateReportSarif(state: GateState): string;
|
package/lib/domain/gate.js
CHANGED
|
@@ -750,3 +750,87 @@ export function phaseLabel(phase) {
|
|
|
750
750
|
case 'review': return 'Review conclusion';
|
|
751
751
|
}
|
|
752
752
|
}
|
|
753
|
+
/** Build the JSON-safe CI report from a settled gate state. */
|
|
754
|
+
export function buildCiReport(state) {
|
|
755
|
+
return {
|
|
756
|
+
schemaVersion: 1,
|
|
757
|
+
tool: 'dsh-doublecheck',
|
|
758
|
+
verdict: state.verdict,
|
|
759
|
+
deliverable: state.verdict === 'deliverable',
|
|
760
|
+
reviewEngine: state.reviewEngine,
|
|
761
|
+
at: state.at,
|
|
762
|
+
redChecks: countRedChecks(Object.values(state.phases)),
|
|
763
|
+
phases: GATE_PHASES.map(phase => {
|
|
764
|
+
const result = state.phases[phase];
|
|
765
|
+
return {
|
|
766
|
+
phase,
|
|
767
|
+
enabled: result?.enabled ?? false,
|
|
768
|
+
status: result?.status ?? 'pending',
|
|
769
|
+
checks: (result?.checks ?? []).map(check => ({
|
|
770
|
+
id: check.id,
|
|
771
|
+
label: check.label,
|
|
772
|
+
status: check.status,
|
|
773
|
+
summary: check.summary,
|
|
774
|
+
suggestion: check.suggestion,
|
|
775
|
+
})),
|
|
776
|
+
};
|
|
777
|
+
}),
|
|
778
|
+
};
|
|
779
|
+
}
|
|
780
|
+
/**
|
|
781
|
+
* Render the settled gate state as headless JSON for CI (`--ci` output).
|
|
782
|
+
* @param state - the settled gate state.
|
|
783
|
+
* @returns the pretty-printed JSON report.
|
|
784
|
+
*/
|
|
785
|
+
export function renderGateReportJson(state) {
|
|
786
|
+
return JSON.stringify(buildCiReport(state), null, 2);
|
|
787
|
+
}
|
|
788
|
+
/**
|
|
789
|
+
* Render the settled gate state as a SARIF 2.1.0 document for CI
|
|
790
|
+
* (GitHub code-scanning / status checks). Each failing check is an `error`
|
|
791
|
+
* result and each warning is a `warning` result; passing/skipped/pending
|
|
792
|
+
* checks are declared as rules but produce no result.
|
|
793
|
+
* @param state - the settled gate state.
|
|
794
|
+
* @returns the pretty-printed SARIF document.
|
|
795
|
+
*/
|
|
796
|
+
export function renderGateReportSarif(state) {
|
|
797
|
+
const rules = [];
|
|
798
|
+
const results = [];
|
|
799
|
+
for (const phase of GATE_PHASES) {
|
|
800
|
+
const result = state.phases[phase];
|
|
801
|
+
if (result === undefined || !result.enabled)
|
|
802
|
+
continue;
|
|
803
|
+
for (const check of result.checks) {
|
|
804
|
+
const ruleId = `doublecheck/${phase}/${check.id}`;
|
|
805
|
+
rules.push({ id: ruleId, shortDescription: { text: `${phaseLabel(phase)} — ${check.label}` } });
|
|
806
|
+
if (check.status === 'pass' || check.status === 'skip' || check.status === 'pending')
|
|
807
|
+
continue;
|
|
808
|
+
results.push({
|
|
809
|
+
ruleId,
|
|
810
|
+
level: check.status === 'fail' ? 'error' : 'warning',
|
|
811
|
+
message: { text: check.suggestion !== '' ? `${check.summary} — rework: ${check.suggestion}` : check.summary },
|
|
812
|
+
});
|
|
813
|
+
}
|
|
814
|
+
}
|
|
815
|
+
const sarif = {
|
|
816
|
+
version: '2.1.0',
|
|
817
|
+
$schema: 'https://json.schemastore.org/sarif-2.1.0.json',
|
|
818
|
+
runs: [{
|
|
819
|
+
tool: {
|
|
820
|
+
driver: {
|
|
821
|
+
name: 'dsh-doublecheck',
|
|
822
|
+
informationUri: 'https://github.com/PerryLink/dsh-doublecheck',
|
|
823
|
+
rules,
|
|
824
|
+
},
|
|
825
|
+
},
|
|
826
|
+
properties: {
|
|
827
|
+
verdict: state.verdict,
|
|
828
|
+
deliverable: state.verdict === 'deliverable',
|
|
829
|
+
reviewEngine: state.reviewEngine,
|
|
830
|
+
at: state.at,
|
|
831
|
+
},
|
|
832
|
+
results,
|
|
833
|
+
}],
|
|
834
|
+
};
|
|
835
|
+
return JSON.stringify(sarif, null, 2);
|
|
836
|
+
}
|
package/lib/events.d.ts
CHANGED
|
@@ -31,7 +31,9 @@ declare module '@deepseek-ai/dsh-session' {
|
|
|
31
31
|
* false, all discipline gates (grill, tdd, adversary) defer to the human
|
|
32
32
|
* chain for this session, surviving restart and restore. The event rides
|
|
33
33
|
* the envelope's `ignorable: true` marker so hosts that do not know the
|
|
34
|
-
* type still load the log.
|
|
34
|
+
* type still load the log. On hosts without the marker surface (rc.6/rc.8)
|
|
35
|
+
* or that removed it (0.1.2-alpha.1), the command layer skips this write
|
|
36
|
+
* and keeps the switch process-local.
|
|
35
37
|
*/
|
|
36
38
|
'doublecheck/state': {
|
|
37
39
|
enabled: boolean;
|
|
@@ -41,7 +43,8 @@ declare module '@deepseek-ai/dsh-session' {
|
|
|
41
43
|
* state (checklist statuses, red items, verdict, engine, timestamp).
|
|
42
44
|
* Audit-safe by construction — counts, ids, and verdicts only — and the
|
|
43
45
|
* replayable source the `/gate status` panel and the turn-boundary red
|
|
44
|
-
* notice re-derive from. Rides `ignorable: true` like the state switch
|
|
46
|
+
* notice re-derive from. Rides `ignorable: true` like the state switch
|
|
47
|
+
* (same marker-surface caveat).
|
|
45
48
|
*/
|
|
46
49
|
'doublecheck/gate': GateState;
|
|
47
50
|
}
|
|
@@ -49,7 +52,8 @@ declare module '@deepseek-ai/dsh-session' {
|
|
|
49
52
|
/**
|
|
50
53
|
* `Session.append` narrowed to the `doublecheck/state` event. The options bag
|
|
51
54
|
* carries `ignorable: true`; rc.6 hosts ignore it (same event), post-rc.6
|
|
52
|
-
* hosts stamp the marker.
|
|
55
|
+
* hosts through 0.1.1-rc.2 stamp the marker, and 0.1.2-alpha.1 removed the
|
|
56
|
+
* envelope — so the command layer never calls this append there.
|
|
53
57
|
*/
|
|
54
58
|
export interface StateAppend {
|
|
55
59
|
(type: 'doublecheck/state', data: SessionEventMap['doublecheck/state'], options: {
|
|
@@ -58,7 +62,8 @@ export interface StateAppend {
|
|
|
58
62
|
}
|
|
59
63
|
/**
|
|
60
64
|
* `Session.append` narrowed to the `doublecheck/gate` event, with the same
|
|
61
|
-
* `ignorable: true` envelope marker as the state
|
|
65
|
+
* `ignorable: true` envelope marker (and marker-surface caveat) as the state
|
|
66
|
+
* switch.
|
|
62
67
|
*/
|
|
63
68
|
export interface GateAppend {
|
|
64
69
|
(type: 'doublecheck/gate', data: SessionEventMap['doublecheck/gate'], options: {
|
package/lib/guard/command.js
CHANGED
|
@@ -20,9 +20,12 @@ import { PROSE } from "./prose.js";
|
|
|
20
20
|
/**
|
|
21
21
|
* Whether this host's `Session.append` stamps the `ignorable` envelope marker.
|
|
22
22
|
* Detected once per process on a detached probe session: hosts without the
|
|
23
|
-
* surface (rc.6) accept and ignore the options bag,
|
|
24
|
-
*
|
|
25
|
-
*
|
|
23
|
+
* surface (rc.6/rc.8) accept and ignore the options bag, 0.1.2-alpha.1
|
|
24
|
+
* removed the ignorable envelope entirely (42dc2a46c2) and would refuse the
|
|
25
|
+
* unknown type on restore, and writing the durable state event unmarked would
|
|
26
|
+
* make the session log unreadable to first-party readers — so the switch
|
|
27
|
+
* command falls back to in-memory switching on any host where the probe does
|
|
28
|
+
* not come back stamped.
|
|
26
29
|
* @returns true when a `doublecheck/state` append comes back with the marker.
|
|
27
30
|
*/
|
|
28
31
|
let ignorableCapability;
|
package/lib/guard/gate.js
CHANGED
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
*/
|
|
26
26
|
import { createUserMessage } from '@deepseek-ai/dsh-llm';
|
|
27
27
|
import z from '@deepseek-ai/schemastery';
|
|
28
|
-
import { attachEvalChecks, countRedChecks, DEFAULT_COVERAGE_PATTERN, DEFAULT_EVAL_REPORTS_CONFIG, DEFAULT_GATE_QUESTIONS, deriveGateVerdict, evaluateConsistency, evaluateRequirements, evaluateReview, evaluateTests, foldAutoReviewEvidence, foldRequirementsEvidence, foldTestEvidence, GATE_FINDINGS_SCHEMA, parseEvalReport, renderGateReportMarkdown, renderPhaseMarkdown, skippedPhase, } from "../domain/gate.js";
|
|
28
|
+
import { attachEvalChecks, countRedChecks, DEFAULT_COVERAGE_PATTERN, DEFAULT_EVAL_REPORTS_CONFIG, DEFAULT_GATE_QUESTIONS, deriveGateVerdict, evaluateConsistency, evaluateRequirements, evaluateReview, evaluateTests, foldAutoReviewEvidence, foldRequirementsEvidence, foldTestEvidence, GATE_FINDINGS_SCHEMA, parseEvalReport, renderGateReportJson, renderGateReportMarkdown, renderPhaseMarkdown, skippedPhase, } from "../domain/gate.js";
|
|
29
29
|
import { sortFindings } from "./review.js";
|
|
30
30
|
import { PROSE } from "./prose.js";
|
|
31
31
|
/** The default gate configuration: every phase on, the six key questions required. */
|
|
@@ -396,19 +396,30 @@ async function writeGateFile(ctx, filePath, state, agent, signal) {
|
|
|
396
396
|
const fs = ctx.get('fs');
|
|
397
397
|
if (fs === undefined)
|
|
398
398
|
return;
|
|
399
|
-
let target;
|
|
400
399
|
try {
|
|
401
|
-
|
|
400
|
+
const markdownTarget = await fs.resolve(filePath, {
|
|
402
401
|
...agent.session.header.cwd !== undefined ? { cwd: agent.session.header.cwd } : {},
|
|
403
402
|
signal,
|
|
404
403
|
});
|
|
405
|
-
await fs.writeText(
|
|
404
|
+
await fs.writeText(markdownTarget, renderGateReportMarkdown(state, true), undefined, signal);
|
|
405
|
+
// The headless CI copy: the same settled state as JSON, for the
|
|
406
|
+
// `doublecheck-gate` CLI (PR comment / status checks). Additive output —
|
|
407
|
+
// the markdown report and the four-phase runner are unchanged.
|
|
408
|
+
const ciTarget = await fs.resolve(ciReportPath(filePath), {
|
|
409
|
+
...agent.session.header.cwd !== undefined ? { cwd: agent.session.header.cwd } : {},
|
|
410
|
+
signal,
|
|
411
|
+
});
|
|
412
|
+
await fs.writeText(ciTarget, renderGateReportJson(state), undefined, signal);
|
|
406
413
|
}
|
|
407
414
|
catch (error) {
|
|
408
415
|
signal.throwIfAborted();
|
|
409
416
|
ctx.logger.debug(`dsh-doublecheck: gate report file write skipped: ${String(error)}`);
|
|
410
417
|
}
|
|
411
418
|
}
|
|
419
|
+
/** Derive the JSON CI-report path from the markdown report path. */
|
|
420
|
+
function ciReportPath(filePath) {
|
|
421
|
+
return filePath.endsWith('.md') ? `${filePath.slice(0, -3)}.json` : `${filePath}.json`;
|
|
422
|
+
}
|
|
412
423
|
/**
|
|
413
424
|
* Read and fold the dsh-eval report through the filesystem seam. A missing
|
|
414
425
|
* seam, a missing file, malformed JSON, or a wrong document shape all settle
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-doublecheck",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.9.1",
|
|
4
4
|
"description": "Delivery quality gate for DeepSeek Harness: grill the requirements, test the implementation, prove the delivery, and gate the handoff with a deliverable/rework decision.",
|
|
5
5
|
"packageManager": "pnpm@11.7.0",
|
|
6
6
|
"repository": {
|
|
@@ -14,6 +14,9 @@
|
|
|
14
14
|
"type": "module",
|
|
15
15
|
"main": "lib/index.js",
|
|
16
16
|
"types": "lib/index.d.ts",
|
|
17
|
+
"bin": {
|
|
18
|
+
"doublecheck-gate": "lib/ci.js"
|
|
19
|
+
},
|
|
17
20
|
"exports": {
|
|
18
21
|
".": {
|
|
19
22
|
"types": "./lib/index.d.ts",
|
|
@@ -128,6 +131,7 @@
|
|
|
128
131
|
"@deepseek-ai/cordis": "^4.0.1",
|
|
129
132
|
"@deepseek-ai/dsh-agent": ">=0.1.0-rc.8 <0.2.0",
|
|
130
133
|
"@deepseek-ai/dsh-commands": ">=0.1.0-rc.8 <0.2.0",
|
|
134
|
+
"@deepseek-ai/dsh-invariants": "^0.1.1-rc.2",
|
|
131
135
|
"@deepseek-ai/dsh-llm": ">=0.1.0-rc.8 <0.2.0",
|
|
132
136
|
"@deepseek-ai/dsh-session": ">=0.1.0-rc.8 <0.2.0",
|
|
133
137
|
"@deepseek-ai/dsh-session-projection": ">=0.1.1-rc.2 <0.2.0",
|
|
@@ -160,5 +164,9 @@
|
|
|
160
164
|
"eslint": "^9.30.0",
|
|
161
165
|
"typescript-eslint": "^8.35.0",
|
|
162
166
|
"vitest": "^3.2.0"
|
|
167
|
+
},
|
|
168
|
+
"funding": {
|
|
169
|
+
"type": "individual",
|
|
170
|
+
"url": "https://github.com/sponsors/PerryLink"
|
|
163
171
|
}
|
|
164
172
|
}
|