dsh-doublecheck 0.6.0 → 0.7.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 +22 -0
- package/README.es.md +199 -220
- package/README.hi.md +199 -228
- package/README.md +199 -225
- package/README.pt.md +199 -220
- package/README.zh.md +201 -225
- package/lib/domain/gate.d.ts +263 -0
- package/lib/domain/gate.js +658 -0
- package/lib/domain/projection.d.ts +8 -3
- package/lib/domain/projection.js +12 -0
- package/lib/domain/report.d.ts +2 -2
- package/lib/domain/stages.d.ts +1 -1
- package/lib/events.d.ts +46 -4
- package/lib/grill/index.d.ts +1 -1
- package/lib/guard/command.d.ts +2 -2
- package/lib/guard/command.js +3 -0
- package/lib/guard/gate.d.ts +170 -0
- package/lib/guard/gate.js +518 -0
- package/lib/guard/index.d.ts +15 -3
- package/lib/guard/index.js +81 -4
- package/lib/guard/prose.d.ts +17 -0
- package/lib/guard/prose.js +14 -0
- package/lib/guard/review.d.ts +2 -2
- package/lib/index.d.ts +10 -9
- package/lib/index.js +1 -0
- package/lib/invariant.d.ts +3 -1
- package/lib/invariant.js +15 -0
- package/lib/types.d.ts +8 -1
- package/lib/types.js +2 -0
- package/package.json +52 -6
- package/skills/delivery-proof/SKILL.md +12 -0
- package/strict.patch.yml +37 -0
package/README.pt.md
CHANGED
|
@@ -1,279 +1,258 @@
|
|
|
1
|
+
<div align="center">
|
|
2
|
+
|
|
1
3
|
# dsh-doublecheck
|
|
2
4
|
|
|
3
|
-
|
|
5
|
+
**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.**
|
|
4
6
|
|
|
5
|
-
|
|
6
|
-
[](https://www.npmjs.com/package/dsh-doublecheck)
|
|
7
|
-
[](LICENSE)
|
|
8
|
-
[](https://github.com/topics/dsh-plugin)
|
|
7
|
+
*Os requisitos são interrogados antes da primeira edição; a entrega é comprovada, nunca afirmada.*
|
|
9
8
|
|
|
10
|
-
|
|
9
|
+
[](LICENSE)
|
|
10
|
+
[](https://github.com/topics/dsh-plugin)
|
|
11
|
+
[](#)
|
|
12
|
+
[](https://github.com/PerryLink/dsh-doublecheck/actions)
|
|
13
|
+
[](https://github.com/PerryLink/dsh-doublecheck/releases)
|
|
14
|
+
[](https://www.npmjs.com/package/dsh-doublecheck)
|
|
15
|
+
[](https://www.npmjs.com/package/dsh-doublecheck)
|
|
11
16
|
|
|
12
|
-
|
|
17
|
+
[English](README.md) · [简体中文](README.zh.md) · [Español](README.es.md) · [Português](README.pt.md) · [हिन्दी](README.hi.md)
|
|
13
18
|
|
|
14
|
-
|
|
19
|
+
</div>
|
|
15
20
|
|
|
16
|
-
|
|
17
|
-
- Times disciplinados fazem isso com humanos: revisão de requisitos → teste que falha → teste que passa → autorrevisão → comprovação de entrega. Agentes merecem o mesmo ciclo, imposto pelo harness, não pela boa vontade.
|
|
21
|
+
---
|
|
18
22
|
|
|
19
|
-
##
|
|
23
|
+
## Compatibilidade
|
|
20
24
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
spec estruturado gravado na sessão e no workspace
|
|
28
|
-
```
|
|
25
|
+
| Superfície | Status |
|
|
26
|
+
|---|---|
|
|
27
|
+
| Harness | DeepSeek Harness `0.1.0-rc.6` |
|
|
28
|
+
| Node | `^22.19.0 \|\| >=24.0.0` |
|
|
29
|
+
| Plataformas | Todas (host puro; sem código nativo, sem requisições de rede diretas próprias) |
|
|
30
|
+
| Modelo | Qualquer (o guard nunca chama um modelo; as fases de crítico e revisor rodam como subagentes do harness) |
|
|
29
31
|
|
|
30
|
-
|
|
31
|
-
|---|---|---|
|
|
32
|
-
| **grill** | Interrogar as seis dimensões de requisitos; recusar implementar até o consenso. | ✅ v0.1 |
|
|
33
|
-
| **design** | Spec registrado via `doublecheck_spec`. | ✅ v0.1 |
|
|
34
|
-
| **red** | Um teste que falha comprova a lacuna; edições de implementação precisam dele no registro. | ✅ v0.2 |
|
|
35
|
-
| **green** | Um teste que passa após as edições fecha o ciclo. | ✅ v0.2 |
|
|
36
|
-
| **review** | Um crítico adversário bifurcado audita a entrega contra o spec. | ✅ v0.3 |
|
|
37
|
-
| **verify** | `doublecheck_report` + um workflow de verificação por dimensão comprovam a entrega. | ✅ v0.4 |
|
|
38
|
-
|
|
39
|
-
## Recursos
|
|
40
|
-
|
|
41
|
-
- 🔥 **Skill `grill-requirements`** — um skill empacotado no formato Agent Skills que interroga a tarefa em seis dimensões (**objetivo, escopo, critérios de aceite, modos de falha, prioridades, não-objetivos**) usando a UI nativa `ask_user_question` do DSH, recusa escrever código até o consenso e registra o contrato.
|
|
42
|
-
- 🧰 **Skills de etapa para o ciclo inteiro** — `red-green-tdd` (escreva o teste que falha, rode red, implemente, rode green), `delivery-review` (autorrevisão adversária contra o spec uma vez em green) e `delivery-proof` (consolide a evidência no relatório de entrega antes de declarar concluído) juntam-se ao `grill-requirements`: as seis etapas têm orientação de modelo, não só a primeira.
|
|
43
|
-
- 📜 **Ferramenta `doublecheck_spec`** — grava o spec acordado no log da sessão e escreve uma cópia em markdown no workspace, para o contrato sobreviver à conversa. Dimensões vazias ou só com espaços são rejeitadas no commit (v0.6): o grill precisa assentar as seis antes de o spec contar.
|
|
44
|
-
- 🔄 **Re-grill na mudança de tarefa** — um spec registrado cobre a própria tarefa: um novo pedido direto do usuário após o último spec reabre o portão grill para esse follow-up, em vez de herdar o contrato anterior em silêncio.
|
|
45
|
-
- 🛡️ **Guard de disciplina** — um portão suave no pipeline de políticas de ferramentas. Tarefa vaga + sem spec + rumo a `edit`/`write` → **lembrar**, **pedir aprovação humana** ou **bloquear**, conforme `intensity`.
|
|
46
|
-
- 🟥🟩 **Portões de evidência red/green** (`modules.tdd`) — verificações duras sobre o log da sessão: uma edição de implementação exige um **teste que falha registrado** desde o último teste que passa (escrever arquivos de teste é sempre permitido — é assim que o passo red acontece), e um turno que termina com edições mas sem nenhum teste que passa recebe um lembrete green injetado. Ferramentas guard personalizadas funcionam de cara: os portões leem as chaves de argumento `file_path` e `path`, e uma chamada que não nomeia arquivo nenhum não é tratada como edição de implementação.
|
|
47
|
-
- 👁️ **Revisão adversária** (`modules.adversary`) — assim que a entrega chega ao green, um subagente crítico bifurcado (seam nativo de subagentes do DSH, provider `fork` por padrão) audita a sessão contra o spec registrado com postura adversária e devolve achados estruturados, ordenados com blockers primeiro. `remind` injeta a crítica; `warn`/`block` ainda direcionam uma rodada para o modelo responder aos achados. `adversaryModel` roteia o crítico para um modelo separado; a allowlist de ferramentas do crítico é somente leitura por padrão. Os achados trafegam pela fonte de mensagens durável `doublecheck-review`. A revisão se rearma quando o crítico termina: edições de implementação após o último registro de revisão disparam outra rodada, e cancelar o turno aborta o crítico em voo.
|
|
48
|
-
- 🌐 **Superfície de modelo totalmente localizada** — toda string visível ao modelo que o pacote injeta ou responde (lembretes, feedback de negação/consulta, direcionamento de revisão, avisos de troca, respostas do `/doublecheck` e o prompt de tarefa do crítico) respeita `language: 'en' | 'zh'`; os documentos spec/report do workspace mantêm seus cabeçalhos estáveis em inglês.
|
|
49
|
-
- 📊 **Relatório doublecheck + workflow de verificação** (`doublecheck_report`, v0.4) — consolida a evidência de disciplina da sessão (spec, cronologia red/green, achados da revisão, edições) em um relatório de entrega com um veredito derivado (`grill → draft → red → green → objections/verified → proven/challenged/unverified`), gravado no workspace. Com `verify`, os verificadores por dimensão rodam pelo seam de workflow do DSH (`verifyMode: all` lança um verificador paralelo por dimensão; `single` executa um combinado) e os vereditos se dobram no relatório — `proven` exige um veredito para cada dimensão.
|
|
50
|
-
- 🚦 **Portão de entrega** — no limite do turno, uma entrega que chegou ao green sem `doublecheck_report` registrado recebe um lembrete de relatório esperado antes de declarar concluído; um relatório bem-sucedido avança a etapa para `verify`.
|
|
51
|
-
- 🔁 **Estado durável** — todo artefato visível ao modelo (spec, lembretes, feedback de negação, achados da revisão, o interruptor `/doublecheck on|off`) fica no log da sessão; as decisões dos portões derivam só do log (`tool/call` + `tool/result`, incluindo os sub-despachos do Code Mode), então sessões retomadas ou bifurcadas se comportam igual. `remindOnce` também é durável: uma sessão que já recebeu um lembrete nunca o recebe duas vezes, mesmo após reiniciar. A dobra do interruptor viaja num snapshot incremental, então sessões longas ficam em O(eventos novos) por chamada de ferramenta.
|
|
52
|
-
- ⌨️ **Comando de sessão `/doublecheck`** — `status` informa o interruptor efetivo, os módulos configurados, a intensidade de aplicação e os fatos de etapa dobrados (spec, cor dos testes, revisão, contagem de edições); `report` dobra o relatório de entrega na hora; `on|off` grava o override durável `doublecheck/state` e injeta um aviso de troca.
|
|
53
|
-
- 📚 **Ferramenta `doublecheck_skills`** — lista e carrega os skills do pacote pelo seam oficial do registro de skills.
|
|
54
|
-
- 🔒 **Overlay estrito** — `strict.patch.yml` liga todos os portões com intensidade `block` numa única camada de patch (vem com o pacote).
|
|
55
|
-
- 🧩 **Companheiro invariante independente** — a linha `dsh-doublecheck/invariant` é uma exportação de subrota real: relata contradições do caminho de escrita do pacote (forma spec/report/review) pelo registro `invariants` do host sem carregar o guard.
|
|
56
|
-
|
|
57
|
-
## Demo
|
|
58
|
-
|
|
59
|
-
Uma execução headless real com `intensity: block` e todos os portões habilitados, transcrição gravada a partir do log de sessão durável:
|
|
32
|
+
## O que você obtém
|
|
60
33
|
|
|
61
|
-
|
|
62
|
-
dsh --profile demo headless "把这个项目里最慢的代码直接改快,别问我任何问题,直接改文件。"
|
|
63
|
-
```
|
|
34
|
+
`dsh-doublecheck` instala duas linhas de plugin que leem e aplicam a partir do mesmo registro de sessão durável:
|
|
64
35
|
|
|
65
|
-
1.
|
|
66
|
-
|
|
67
|
-
2. O modelo registra o spec (`doublecheck_spec`), escreve um teste que falha (arquivos de teste são sempre editáveis) e o executa — o log registra `[exit code: 1]`, o passo red.
|
|
68
|
-
3. As edições de implementação agora passam; uma execução posterior registra `4 passed`, o passo green.
|
|
69
|
-
4. O crítico bifurcado audita a entrega; seus achados marcados por severidade são injetados, e `warn`/`block` direcionam uma rodada para o modelo respondê-los.
|
|
70
|
-
5. `doublecheck_report` dobra tudo em um relatório markdown com um veredito derivado — `proven` quando todas as verificações por dimensão passam, `challenged` quando um verificador objeta.
|
|
36
|
+
1. **`doublecheck-grill`** — o forno de requisitos: a skill empacotada `grill-requirements` mais as ferramentas voltadas ao modelo `doublecheck_skills`, `doublecheck_spec` e `doublecheck_report`, e o fluxo de verificação por dimensão.
|
|
37
|
+
2. **`doublecheck-guard`** — o guard de disciplina: o portão grill, os portões de evidência vermelho/verde, a revisão adversarial, os comandos `/doublecheck` e `/gate`, o namespace de configurações `doublecheck.gate` e o portão de entrega de quatro fases.
|
|
71
38
|
|
|
72
|
-
|
|
39
|
+
Juntos impõem o **ciclo de disciplina** — *grill → design → red → green → review → verify*:
|
|
73
40
|
|
|
74
|
-
```
|
|
75
|
-
|
|
76
|
-
|
|
41
|
+
```text
|
|
42
|
+
grill ──▶ design ──▶ red ──▶ green ──▶ review ──▶ verify
|
|
43
|
+
│
|
|
44
|
+
└─ seis dimensões de requisitos, portão de consenso,
|
|
45
|
+
spec estruturado confirmado na sessão + workspace
|
|
77
46
|
```
|
|
78
47
|
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
48
|
+
| Etapa | Significado |
|
|
49
|
+
|---|---|
|
|
50
|
+
| **grill** | Interroga as seis dimensões de requisitos; recusa implementar até o consenso. |
|
|
51
|
+
| **design** | O spec acordado é confirmado via `doublecheck_spec`. |
|
|
52
|
+
| **red** | Uma execução de teste que falha comprova a lacuna antes das edições de implementação. |
|
|
53
|
+
| **green** | Uma execução de teste aprovada após as edições fecha o ciclo. |
|
|
54
|
+
| **review** | Um crítico adversarial bifurcado audita a entrega contra o spec. |
|
|
55
|
+
| **verify** | `doublecheck_report` + um fluxo de verificação por dimensão comprovam a entrega. |
|
|
85
56
|
|
|
86
|
-
|
|
57
|
+
## Início rápido
|
|
87
58
|
|
|
88
59
|
```sh
|
|
89
|
-
|
|
90
|
-
|
|
60
|
+
# 1. install the bundle into your profile
|
|
61
|
+
dsh plugin --profile web add "github:PerryLink/dsh-doublecheck#main"
|
|
91
62
|
|
|
92
|
-
|
|
63
|
+
# or from npm (published releases)
|
|
64
|
+
dsh plugin --profile web add dsh-doublecheck
|
|
93
65
|
|
|
94
|
-
|
|
95
|
-
dsh --profile
|
|
66
|
+
# 2. restart and verify the row
|
|
67
|
+
dsh --profile web --dump-config | grep -E -A3 'id: doublecheck-(grill|guard)'
|
|
96
68
|
```
|
|
97
69
|
|
|
98
|
-
|
|
70
|
+
Ambas as linhas (`doublecheck-grill` e `doublecheck-guard`) são ativadas automaticamente com o perfil.
|
|
99
71
|
|
|
100
|
-
|
|
101
|
-
dsh plugin --profile <name> remove dsh-doublecheck
|
|
102
|
-
```
|
|
72
|
+
## Instalar e desinstalar
|
|
103
73
|
|
|
104
|
-
|
|
74
|
+
- **canal git** (última `main`): `dsh plugin --profile web add "github:PerryLink/dsh-doublecheck#main"` — o script `prepare` compila apenas com dependências de produção.
|
|
75
|
+
- **canal npm** (versões publicadas): `dsh plugin --profile web add dsh-doublecheck`.
|
|
76
|
+
- **canal tarball**: `pnpm pack` neste repo e então `dsh plugin --profile web add ./dsh-doublecheck-<version>.tgz`.
|
|
77
|
+
- **desinstalar**: `dsh plugin --profile web remove dsh-doublecheck` (ou remova as linhas do patch de perfil).
|
|
105
78
|
|
|
106
|
-
|
|
79
|
+
Para um modo estrito sem configuração (cada portão ativo com intensidade `block`, cobertura do portão exigida), aplique a camada de sobreposição incluída sobre o patch do bundle: `dsh --profile web --patch ./node_modules/dsh-doublecheck/strict.patch.yml`.
|
|
107
80
|
|
|
108
|
-
|
|
109
|
-
- O interruptor de sessão durável (`/doublecheck on|off` → `doublecheck/state`) exige a superfície de escrita `ignorable` do host (harness posterior ao rc.6): hosts rc.6 ignoram o options bag e o evento permanece required-on-read, então prefira a troca em memória até atualizar o harness.
|
|
81
|
+
## Configuração
|
|
110
82
|
|
|
111
|
-
|
|
83
|
+
Todos os ajustes são campos `Config` do Schemastery (alteráveis a partir do cordis.yml). Uma sobrescrita direcionada por id substitui a linha inteira — redeclare cada chave de que você precisa. `cordis.patch.yml` documenta cada chave inline; os padrões do Schema são a única fonte dos padrões de ajuste.
|
|
112
84
|
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
85
|
+
| Chave | Padrão | Significado |
|
|
86
|
+
|---|---|---|
|
|
87
|
+
| `specFile` | `'doublecheck-spec.md'` | Arquivo do workspace para o markdown do spec confirmado (linha grill). |
|
|
88
|
+
| `reportFile` | `'doublecheck-report.md'` | Arquivo do workspace para o relatório de entrega (linha grill). |
|
|
89
|
+
| `reportVerify` | `true` | Executa o fluxo de verificação por padrão (linha grill). |
|
|
90
|
+
| `verifyProvider` | `'fork'` | Provedor de subagente para os verificadores por dimensão (linha grill). |
|
|
91
|
+
| `verifyMode` | `'all'` | `all` = um verificador paralelo por dimensão; `single` = um verificador combinado (linha grill). |
|
|
92
|
+
| `intensity` | `'remind'` | Força de aplicação dos portões grill, vermelho/verde e de revisão (`remind` / `warn` / `block`). |
|
|
93
|
+
| `enableByDefault` | `true` | Interruptor mestre para sessões sem registro `/doublecheck on\|off`. |
|
|
94
|
+
| `language` | `'en'` | Idioma da prosa injetada de lembrete/negação/revisão/portão (`en` / `zh`). |
|
|
95
|
+
| `guardTools` | `['edit', 'write']` | Nomes de ferramentas de mutação que ambos os portões vigiam. |
|
|
96
|
+
| `vagueTaskMaxChars` | `200` | Tarefas mais longas nunca são tratadas como vagas. |
|
|
97
|
+
| `remindOnce` | `true` | Injeta cada lembrete no máximo uma vez por sessão (durável entre reinícios). |
|
|
98
|
+
| `testToolNames` | `['bash', 'pwsh']` | Nomes de ferramentas shell que podem executar testes. |
|
|
99
|
+
| `testCommandPatterns` | *(pnpm/npm/yarn/bun test, pytest, go/cargo/make test, node --test, deno test, uv run pytest)* | Regex que um comando deve corresponder para contar como execução de teste. |
|
|
100
|
+
| `testFilePatterns` | *(dirs de teste, `*.test.*` / `*.spec.*`)* | Regex que identificam arquivos de teste — sempre editáveis, isentos do portão vermelho. |
|
|
101
|
+
| `modules.grill` | `true` | Desligado desativa o portão grill. |
|
|
102
|
+
| `modules.tdd` | `true` | Ligado habilita os portões de evidência vermelho/verde. |
|
|
103
|
+
| `modules.adversary` | `false` | Ligado habilita a revisão de crítico bifurcado no verde. |
|
|
104
|
+
| `adversaryModel` | `null` | Rota de modelo do crítico; `null` = o modelo principal se autorrevisa. |
|
|
105
|
+
| `adversaryProvider` | `'fork'` | Provedor de subagente sobre o qual o crítico roda. |
|
|
106
|
+
| `adversaryMaxFindings` | `5` | Limite de achados (1–20) injetados na sessão. |
|
|
107
|
+
| `adversaryTools` | `['read', 'glob', 'grep']` | Lista permitida de ferramentas do crítico; mantenha somente leitura. |
|
|
108
|
+
| `adversaryTimeoutMs` | `120000` | Orçamento de tempo rígido para uma execução do crítico. |
|
|
109
|
+
| `gate.enabled` | `true` | Interruptor mestre do painel do portão e do aviso vermelho de limite de turno. |
|
|
110
|
+
| `gate.planSuggestion` | `true` | Acrescenta a sugestão de reverificação em modo plano aos relatórios vermelhos. |
|
|
111
|
+
| `gate.reportFile` | `'gate-report.md'` | Arquivo do workspace para o relatório do portão. |
|
|
112
|
+
| `gate.requirements.checklist` | *(seis perguntas de dimensão de spec)* | Lista de perguntas-chave plugável: `{ id, question, specDimension, required }`. |
|
|
113
|
+
| `gate.requirements.minConfirmed` | `6` | Perguntas obrigatórias mínimas que devem passar (1..quantidade obrigatória). |
|
|
114
|
+
| `gate.requirements.interrogateTool` | `'ask_user_question'` | Nome da ferramenta cujas chamadas contam como evidência de interrogação. |
|
|
115
|
+
| `gate.tests.requirePassingRun` | `true` | Uma última execução de teste não aprovada (ou ausente) é uma luz vermelha. |
|
|
116
|
+
| `gate.tests.allowFailingRuns` | `0` | Execuções que falham após o último verde permitidas antes do vermelho. |
|
|
117
|
+
| `gate.tests.requireCoverage` | `false` | Ligado exige evidência de cobertura na saída do teste. |
|
|
118
|
+
| `gate.tests.minCoveragePct` | `80` | Percentual mínimo de cobertura (0–100). |
|
|
119
|
+
| `gate.consistency.*` | `provider: 'fork'`, `model: null`, `tools: ['read','glob','grep']`, `timeoutMs: 120000`, `maxFindings: 5` | Ajustes do revisor local de consistência (`model: null` = modelo principal). |
|
|
120
|
+
| `gate.review.engine` | `'auto'` | `auto` = registros de veredicto do dsh-auto-review quando presentes, senão o revisor local; `local` = sempre local. |
|
|
121
|
+
| `gate.review.provider` | `'fork'` | Provedor do revisor local de revisão (seu `model`/`tools`/`timeoutMs`/`maxFindings` coincidem com `gate.consistency.*`). |
|
|
122
|
+
|
|
123
|
+
A má configuração falha em voz alta ao carregar: regex inválidas, listas de nomes vazias ou duplicadas, limites fora de faixa e ids de lista duplicados lançam erro em vez de não fazer nada em silêncio. `strict.patch.yml` é a camada de todos os portões em bloqueio que redeclara a linha guard com `intensity: block`, todos os módulos ativos e o requisito de cobertura habilitado.
|
|
124
|
+
|
|
125
|
+
## Ferramentas e superfícies
|
|
126
|
+
|
|
127
|
+
| Superfície | Tipo | Notas |
|
|
128
|
+
|---|---|---|
|
|
129
|
+
| `doublecheck_skills` | ferramenta | Lista e carrega as quatro skills empacotadas por meio da interface do registro de skills. |
|
|
130
|
+
| `doublecheck_spec` | ferramenta | Confirma o spec de seis dimensões no registro de sessão e em uma cópia markdown do workspace. |
|
|
131
|
+
| `doublecheck_report` | ferramenta | Dobra a evidência de disciplina em um relatório de entrega (fluxo de verificação por dimensão opcional). |
|
|
132
|
+
| `/doublecheck status\|report\|on\|off` | comando | Interruptor, módulos, intensidade, fatos de etapa, relatório dobrado e a sobrescrita durável on/off. |
|
|
133
|
+
| `/gate status\|run\|config` | comando | Progresso da lista em tempo real, o relatório entregável/retrabalho assentado e a configuração efetiva. |
|
|
134
|
+
| `grill-requirements`, `red-green-tdd`, `delivery-review`, `delivery-proof` | skill | Skills de disciplina empacotadas que cobrem as seis etapas do ciclo. |
|
|
135
|
+
| `doublecheck.gate` | namespace de configurações | A lista plugável, exposta a UIs com configurações (`expose: true`, `applies: restart`). |
|
|
136
|
+
| `strict.patch.yml` | camada de sobreposição | Cada portão ativo com intensidade `block` mais o requisito de cobertura, em uma camada de patch. |
|
|
137
|
+
| `dsh-doublecheck/invariant` | linha acompanhante | Reporta contradições de caminho de escrita próprias do pacote por meio do registro `invariants` do host. |
|
|
117
138
|
|
|
118
|
-
##
|
|
139
|
+
## Fases do portão
|
|
119
140
|
|
|
120
|
-
|
|
121
|
-
|---|---|
|
|
122
|
-
| Sem camada `# == dsh-doublecheck` no `--dump-config` | Falta o bundle patch ou uma linha está `disabled` — confira a ordem dos patches do profile e os ids das linhas. |
|
|
123
|
-
| Os gates nunca reagem | Rode `/doublecheck status`: o interruptor da sessão pode estar desligado, ou todos os `modules.*` estão false. |
|
|
124
|
-
| "Adversary review did not run: the subagents seam is not mounted" | Esta composição de profile não provê subagentes — monte um (composições spine trazem) ou desative `modules.adversary`. |
|
|
125
|
-
| `doublecheck_report` mostra `verification: null` | O seam `workflowEngine` está ausente ou o run foi rejeitado/abortado — o relatório diz isso em vez de adivinhar. |
|
|
126
|
-
| O relatório diz `unverified` | A verificação rodou mas nem toda dimensão do spec devolveu veredicto — rode de novo com `verify: true`; `proven` exige as seis. |
|
|
141
|
+
O portão de entrega agrega a evidência durável da sessão em uma lista configurável de quatro fases e assenta uma decisão **entregável / retrabalho necessário**. Cada fase dobra apenas o registro de sessão (a reprodução É o estado), então uma execução é rederivada de forma idêntica após retomar ou bifurcar.
|
|
127
142
|
|
|
128
|
-
|
|
143
|
+
| Fase | Verificações | Fonte de evidência | Custo de modelo |
|
|
144
|
+
|---|---|---|---|
|
|
145
|
+
| Interrogação de requisitos | Lista de perguntas-chave confirmadas item a item (seis perguntas de dimensão de spec por padrão) | `doublecheck_spec` confirmado + chamadas `ask_user_question` | nenhum |
|
|
146
|
+
| Evidência de teste | Cor da última execução, execuções que falham após o verde, limite de cobertura opcional | Execuções de teste shell no registro de sessão (`[exit code: N]`, percentuais de cobertura) | nenhum |
|
|
147
|
+
| Consistência de implementação | Mapeamento diff ↔ requisito: cada edição deve servir a uma dimensão de spec | Revisor bifurcado local (achados estruturados, ferramentas somente leitura) | um subagente |
|
|
148
|
+
| Conclusão de revisão | O veredicto de entrega; `engine: auto` consome os registros de veredicto duráveis do dsh-auto-review quando presentes, senão o revisor local | Eventos `autoReview/verdict` / `autoReview/rejection`, ou o revisor bifurcado local | um subagente (local) |
|
|
129
149
|
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
```yaml
|
|
133
|
-
- id: doublecheck-grill
|
|
134
|
-
config:
|
|
135
|
-
specFile: 'specs/doublecheck-spec.md' # padrão: 'doublecheck-spec.md'
|
|
136
|
-
reportFile: 'specs/doublecheck-report.md' # padrão: 'doublecheck-report.md'
|
|
137
|
-
reportVerify: true # rodar o workflow de verificação por padrão
|
|
138
|
-
verifyProvider: 'fork' # provider para os verificadores por dimensão
|
|
139
|
-
reportTestToolNames: ['bash', 'pwsh']
|
|
140
|
-
reportTestCommandPatterns:
|
|
141
|
-
- '(?:^|[;&|]\s*)(?:(?:pnpm|npm|npx|yarn|bun)(?:\s+run)?\s+(?:test|vitest|jest|mocha)(?:\s|$))'
|
|
142
|
-
- '(?:^|[;&|]\s*)(?:(?:pytest|go\s+test|cargo\s+test|make\s+test|ctest)(?:\s|$))'
|
|
143
|
-
- '(?:^|[;&|]\s*)(?:node\s+--test(?:\s|$))'
|
|
144
|
-
- '(?:^|[;&|]\s*)(?:deno\s+test|uv\s+run\s+pytest)(?:\s|$)'
|
|
145
|
-
reportMutationTools: ['edit', 'write']
|
|
146
|
-
reportTestFilePatterns:
|
|
147
|
-
- '(^|[\\/])(tests?|__tests__|specs?)([\\/]|$)'
|
|
148
|
-
- '\\.(test|spec)\\.[A-Za-z0-9]+$'
|
|
149
|
-
|
|
150
|
-
- id: doublecheck-guard
|
|
151
|
-
config:
|
|
152
|
-
intensity: warn
|
|
153
|
-
modules:
|
|
154
|
-
grill: true
|
|
155
|
-
tdd: true # portões de evidência red/green (v0.2)
|
|
156
|
-
adversary: true # revisão do crítico bifurcado (v0.3)
|
|
157
|
-
adversaryModel: null
|
|
158
|
-
adversaryProvider: 'fork' # provider de subagentes onde o crítico roda
|
|
159
|
-
adversaryMaxFindings: 5 # teto de achados injetados na sessão
|
|
160
|
-
adversaryTools: ['read', 'glob', 'grep'] # allowlist de ferramentas do crítico (somente leitura)
|
|
161
|
-
adversaryTimeoutMs: 120000 # orçamento rígido para uma execução do crítico
|
|
162
|
-
guardTools: ['edit', 'write']
|
|
163
|
-
vagueTaskMaxChars: 200
|
|
164
|
-
remindOnce: true
|
|
165
|
-
testToolNames: ['bash', 'pwsh']
|
|
166
|
-
testCommandPatterns:
|
|
167
|
-
- '(?:^|[;&|]\s*)(?:(?:pnpm|npm|npx|yarn|bun)(?:\s+run)?\s+(?:test|vitest|jest|mocha)(?:\s|$))'
|
|
168
|
-
- '(?:^|[;&|]\s*)(?:(?:pytest|go\s+test|cargo\s+test|make\s+test|ctest)(?:\s|$))'
|
|
169
|
-
- '(?:^|[;&|]\s*)(?:node\s+--test(?:\s|$))'
|
|
170
|
-
- '(?:^|[;&|]\s*)(?:deno\s+test|uv\s+run\s+pytest)(?:\s|$)'
|
|
171
|
-
testFilePatterns:
|
|
172
|
-
- '(^|[\\/])(tests?|__tests__|specs?)([\\/]|$)'
|
|
173
|
-
- '\\.(test|spec)\\.[A-Za-z0-9]+$'
|
|
174
|
-
```
|
|
150
|
+
As luzes vermelhas são verificações que falharam (um spec ausente, uma última execução que falhou, cobertura abaixo do mínimo, uma edição sem mapeamento, achados blocker/major) — cada uma carrega uma sugestão de retrabalho. Avisos e pulos nunca invertem a decisão. O portão integra o [dsh-auto-review](https://github.com/PerryLink/dsh-auto-review) como dependência fraca: `review.engine: auto` dobra seus registros de veredicto quando presentes e degrada para o revisor local caso contrário; o portão nunca sintetiza solicitações de aprovação.
|
|
175
151
|
|
|
176
|
-
|
|
152
|
+
## Relatório de exemplo
|
|
177
153
|
|
|
178
|
-
|
|
154
|
+
`/gate run` retorna este markdown — cole-o na descrição de um PR:
|
|
179
155
|
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
| `remind` (padrão) | A chamada prossegue; um lembrete viaja no contexto do resultado para a próxima requisição do modelo. |
|
|
183
|
-
| `warn` | A chamada fica retida aguardando aprovação humana única pelo seam de aprovação (nega quando não há canal). |
|
|
184
|
-
| `block` | A chamada é negada com feedback que orienta o modelo a corrigir a disciplina primeiro. |
|
|
156
|
+
````markdown
|
|
157
|
+
# Delivery gate report
|
|
185
158
|
|
|
186
|
-
|
|
159
|
+
> **Verdict: rework required** — 2 red item(s)
|
|
160
|
+
> The gate is red. Re-open the work in plan mode to re-check the open items before delivering.
|
|
187
161
|
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
| `remindOnce` | `true` | Injetar o lembrete de cada portão no máximo uma vez por sessão. |
|
|
196
|
-
| `testToolNames` | `['bash', 'pwsh']` | Nomes de ferramentas de shell que podem executar testes. |
|
|
197
|
-
| `testCommandPatterns` | *(pnpm/npm/yarn/bun test, pytest, go/cargo/make test, node --test, deno test, uv run pytest)* | Expressões regulares com as quais um comando deve coincidir para contar como execução de teste. |
|
|
198
|
-
| `testFilePatterns` | *(diretórios de teste, `*.test.*` / `*.spec.*`)* | Expressões regulares que identificam arquivos de teste — sempre editáveis, isentos do portão red. |
|
|
199
|
-
| `adversaryModel` | `null` | Rota do modelo crítico; `null` = o modelo principal se autorrevisa. |
|
|
200
|
-
| `adversaryProvider` | `'fork'` | Nome do provider de subagentes onde o crítico roda. |
|
|
201
|
-
| `adversaryMaxFindings` | `5` | Teto de achados (1–20) injetados na sessão. |
|
|
202
|
-
| `adversaryTools` | `['read', 'glob', 'grep']` | Allowlist de ferramentas do crítico; mantenha somente leitura. |
|
|
203
|
-
| `adversaryTimeoutMs` | `120000` | Orçamento de tempo rígido para uma execução do crítico. |
|
|
162
|
+
## 1. Requirements interrogation — PASS
|
|
163
|
+
- [✔] **What outcome must the delivery produce?** — spec dimension "goal" committed
|
|
164
|
+
- [✔] **What is in scope, and what is out of scope?** — spec dimension "scope" committed
|
|
165
|
+
- [✔] **Which observable checks prove the work is done?** — spec dimension "acceptanceCriteria" committed
|
|
166
|
+
- [✔] **What can go wrong, and what is the correct behavior in each case?** — spec dimension "failureModes" committed
|
|
167
|
+
- [✔] **What is traded when goals conflict; what is optional?** — spec dimension "priorities" committed
|
|
168
|
+
- [✔] **What does the user explicitly not want?** — spec dimension "nonGoals" committed
|
|
204
169
|
|
|
205
|
-
|
|
170
|
+
## 2. Test evidence — FAIL
|
|
171
|
+
- [✔] **passing test run** — latest test run passed
|
|
172
|
+
- [✔] **failing cases after green** — 0 failing run(s) after green (allowed: 0)
|
|
173
|
+
- [✖] **coverage evidence** — 61% coverage below the 80% minimum — rework: raise coverage above the configured minimum
|
|
206
174
|
|
|
207
|
-
|
|
175
|
+
## 3. Implementation consistency — WARN
|
|
176
|
+
- [⚠] **[minor] src/telemetry.ts touched without a requirement** — [minor] the edit adds a metric no spec dimension covers
|
|
208
177
|
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
| `reportFile` | `'doublecheck-report.md'` | Arquivo do workspace que recebe o markdown do relatório. |
|
|
212
|
-
| `reportVerify` | `true` | Padrão para o flag `verify` da ferramenta. |
|
|
213
|
-
| `verifyProvider` | `'fork'` | Provider de subagentes onde os verificadores por dimensão rodam. |
|
|
214
|
-
| `reportTestToolNames` / `reportTestCommandPatterns` | *(same defaults as the guard row)* | Classificação de execuções de teste com escopo de relatório. |
|
|
215
|
-
| `reportMutationTools` / `reportTestFilePatterns` | *(same defaults as the guard row)* | Classificação de edições de implementação com escopo de relatório. |
|
|
178
|
+
## 4. Review conclusion — PASS
|
|
179
|
+
- [✔] **dsh-auto-review conclusion** — 3 call(s) approved by dsh-auto-review (latest risk: low)
|
|
216
180
|
|
|
217
|
-
|
|
181
|
+
## Red items
|
|
182
|
+
1. **tests/coverage** — 61% coverage below the 80% minimum — *rework: raise coverage above the configured minimum*
|
|
183
|
+
2. **consistency/finding-1** — [minor] the edit adds a metric no spec dimension covers — *rework: src/telemetry.ts touched without a requirement*
|
|
218
184
|
|
|
219
|
-
##
|
|
185
|
+
## Audit
|
|
186
|
+
- review engine: dsh-auto-review
|
|
187
|
+
- generated at: 2026-08-14T12:00:00.000Z
|
|
188
|
+
- counts, ids, and verdicts only: no file contents or session text are embedded, and recognized secrets are redacted.
|
|
189
|
+
````
|
|
220
190
|
|
|
221
|
-
|
|
222
|
-
|---|---|
|
|
223
|
-
| Skills empacotados | `ctx.skills.registerProvider()` — seam de capacidade de skills, `source: bundled` |
|
|
224
|
-
| Ferramenta de catálogo/carga | `ctx.tools.register()` — `doublecheck_skills` |
|
|
225
|
-
| Spec + arquivo no workspace | ferramenta `doublecheck_spec` + escrita opcional via `ctx.fs` |
|
|
226
|
-
| Portão de requisitos | waterfall `tools/pre-execute` — `allow` / `ask` (seam de aprovação) / `deny` |
|
|
227
|
-
| Portão red | waterfall `tools/pre-execute` — verificação dura da evidência de teste falho antes das edições de implementação |
|
|
228
|
-
| Injeção de lembrete | waterfall `tools/post-execute` — `additionalContexts` → registrado como `user/message` |
|
|
229
|
-
| Portão green | `agent/turn-stopping` serial — injeta um lembrete de conclusão quando as edições carecem de um teste que passa |
|
|
230
|
-
| Revisão adversária | `ctx.subagents.start()` — forked critic with structured findings schema, injected at green; `warn`/`block` steer one round |
|
|
231
|
-
| Relatório de entrega | `doublecheck_report` tool — session-log fold + workspace markdown |
|
|
232
|
-
| Workflow de verificação | `ctx.workflowEngine.start()` — one parallel checker per spec dimension, structured checks |
|
|
233
|
-
| Estado durável | session log fold over `tool/call` + `tool/result` + `tool/code-dispatch` + injected structured sources; model-visible ⟺ logged |
|
|
234
|
-
| Eventos internos | `doublecheck/spec`, `doublecheck/reminder`, `doublecheck/review`, `doublecheck/report` (typed via declaration merging, `@mode emit`) |
|
|
235
|
-
|
|
236
|
-
Sem mudanças no agent-loop. Todo registro é um `ctx.effect` / `ctx.on` / `register()` de serviço reversível.
|
|
237
|
-
|
|
238
|
-
## O que o modelo vê
|
|
239
|
-
|
|
240
|
-
- O skill `grill-requirements` entra no catálogo de skills da sessão e carrega pela ferramenta integrada `skill` (ou `doublecheck_skills`).
|
|
241
|
-
- `ask_user_question` continua sendo a forma nativa do DSH de perguntar ao usuário; o skill só coreografa (e em headless sem provider degrada para perguntas em prosa).
|
|
242
|
-
- Os lembretes chegam como contexto `{kind:'plugin'}`, então as UIs de transcrição os exibem como metadados de injeção.
|
|
243
|
-
- A crítica do adversário chega da mesma forma depois que o crítico se estabelece, com achados marcados por severidade; sob `warn`/`block` o ciclo é direcionado uma rodada para que o modelo os responda.
|
|
244
|
-
- `doublecheck_report` devolve o relatório consolidado como resultado de ferramenta (spec, cronologia de testes, revisão, verificação, veredito), então «comprovar a entrega» está a uma chamada de distância.
|
|
245
|
-
- `/doublecheck` responde direto na transcrição: `status` mostra o interruptor, os módulos, a intensidade e os fatos de etapa; `report` imprime o relatório dobrado; `on|off` muda o interruptor da sessão.
|
|
246
|
-
|
|
247
|
-
## Comando de sessão
|
|
191
|
+
## Permissões e dados
|
|
248
192
|
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
193
|
+
- **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.
|
|
194
|
+
- **Escreve**: `doublecheck-spec.md`, `doublecheck-report.md` e `gate-report.md` no workspace da sessão (caminhos configuráveis) por meio da interface `ctx.fs`; os eventos de sessão duráveis `doublecheck/state` e `doublecheck/gate`.
|
|
195
|
+
- **Chamadas a modelo**: as fases de consistência e revisão local do portão (um subagente cada por `/gate run`), a revisão adversarial opcional e o fluxo de verificação de `doublecheck_report` iniciam execuções de subagente; nada mais chama um modelo ou a rede.
|
|
196
|
+
- **Nunca toca**: credenciais, variáveis de ambiente ou qualquer arquivo fora do workspace da sessão. O manifesto do workshop declara apenas `filesystem:read` e `filesystem:write`. Os relatórios do portão carregam apenas contagens, ids e veredictos; segredos reconhecidos nos textos do revisor são redigidos antes de armazenar ou exibir.
|
|
252
197
|
|
|
253
|
-
|
|
254
|
-
- `report` — dobra o relatório de entrega a partir do log da sessão na hora (sem workflow de verificação; `doublecheck_report` é dono desse caminho).
|
|
255
|
-
- `on` / `off` — grava o evento durável `doublecheck/state` (sobrevive a reinício, retomada e bifurcação — o replay É o estado) e injeta um aviso de troca visível ao modelo.
|
|
198
|
+
## Limites de segurança
|
|
256
199
|
|
|
257
|
-
|
|
200
|
+
- **Visível ao modelo ⟺ registrado.** Cada lembrete, revisão e aviso de portão injetado viaja pelos canais padrão e cai no registro de sessão; os fatos duráveis spec/state/gate viajam por resultados de ferramenta ou membros de `SessionEventMap`.
|
|
201
|
+
- **Falha fechado / falha em voz alta.** A configuração do guard e do portão é validada em `apply` (asserções lançam); uma interface de revisor ou adversário que não pode rodar se assenta como um aviso honesto "unavailable"/pulo em vez de um veredicto falso.
|
|
202
|
+
- **Relatórios auditáveis.** Os relatórios de portão e entrega registram apenas contagens, ids e veredictos — sem conteúdos de arquivo ou texto de sessão — e os textos de achados produzidos pelo modelo passam por um redator de segredos antes de armazenar ou exibir.
|
|
203
|
+
- **Sem rede própria.** O plugin não faz requisições de rede diretas; os subagentes de crítico e revisor viajam pela interface de subagentes do harness.
|
|
204
|
+
- **Dependência fraca do dsh-auto-review.** Nunca é importado nem exigido; o portão dobra seus registros de veredicto duráveis e degrada para o revisor local, e nunca sintetiza solicitações de aprovação.
|
|
258
205
|
|
|
259
|
-
##
|
|
206
|
+
## Limitações conhecidas
|
|
260
207
|
|
|
261
|
-
|
|
208
|
+
- **Escritas duráveis no rc.6.** `/doublecheck on\|off` → `doublecheck/state` e `/gate run` → `doublecheck/gate` precisam da superfície de append `ignorable` do host (pós-rc.6); em hosts rc.6 a bolsa de opções é ignorada e o evento permanece de leitura obrigatória, então o interruptor fica em memória e o registro do portão vive apenas no resultado do comando + arquivo do workspace até o harness ser atualizado.
|
|
209
|
+
- **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`.
|
|
210
|
+
- **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.
|
|
262
211
|
|
|
263
212
|
## Desenvolvimento
|
|
264
213
|
|
|
265
214
|
```sh
|
|
266
|
-
pnpm install
|
|
267
|
-
pnpm run
|
|
268
|
-
pnpm run
|
|
269
|
-
pnpm run test
|
|
270
|
-
pnpm run
|
|
215
|
+
pnpm install # node ^22.19 || >=24
|
|
216
|
+
pnpm run build # tsc --noEmitOnError (lib/ is committed)
|
|
217
|
+
pnpm run prepare # tsc --noEmitOnError (git-install channel)
|
|
218
|
+
pnpm run prepublishOnly # build + full test suite
|
|
219
|
+
pnpm run typecheck # tsc --noEmit + tests tsconfig
|
|
220
|
+
pnpm run lint # eslint src tests
|
|
221
|
+
pnpm test # vitest run
|
|
222
|
+
pnpm run test:coverage # vitest run --coverage
|
|
223
|
+
pnpm run pack:check # build + pack the tarball
|
|
271
224
|
```
|
|
272
225
|
|
|
273
|
-
##
|
|
226
|
+
## Tópicos
|
|
227
|
+
|
|
228
|
+
`dsh`, `dsh-plugin`, `deepseek-harness`, `engineering-discipline`, `requirements`, `guard`, `skill`, `quality-gate`, `delivery-gate`
|
|
274
229
|
|
|
275
|
-
|
|
230
|
+
## Contribuidores
|
|
231
|
+
|
|
232
|
+
- [@PerryLink](https://github.com/PerryLink) — criador e mantenedor: o ciclo de disciplina grill → design → red → green → review → verify, o portão de entrega de quatro fases, a documentação em cinco idiomas e o pipeline de CI/publicação.
|
|
233
|
+
|
|
234
|
+
## PerryLink DSH Plugin Family
|
|
235
|
+
|
|
236
|
+
Este projeto é um dos [15 plugins do DeepSeek Harness](https://github.com/PerryLink) mantidos por [PerryLink](https://github.com/PerryLink). Se este ajuda você, os demais provavelmente também ajudarão:
|
|
237
|
+
|
|
238
|
+
| Plugin | One-liner |
|
|
239
|
+
|---|---|
|
|
240
|
+
| [dsh-mcp-panel](https://github.com/PerryLink/dsh-mcp-panel) | Read-only MCP runtime panel: /mcp command + Settings tab with status, tools and errors |
|
|
241
|
+
| **[dsh-doublecheck](https://github.com/PerryLink/dsh-doublecheck)** | Engineering-discipline guard + delivery quality gate: requirements grill, test gates, adversary review, /gate deliverable/rework panel |
|
|
242
|
+
| [dsh-background-agents](https://github.com/PerryLink/dsh-background-agents) | Durable background child agents with a Web UI sidebar, messaging and interrupt |
|
|
243
|
+
| [dsh-lsp-actions](https://github.com/PerryLink/dsh-lsp-actions) | LSP diagnostics, formatting, completion, code actions and rename over language servers |
|
|
244
|
+
| [dsh-output-styles](https://github.com/PerryLink/dsh-output-styles) | Claude Code outputStyles-equivalent runtime style switching |
|
|
245
|
+
| [dsh-checkpoint-rewind](https://github.com/PerryLink/dsh-checkpoint-rewind) | Claude Code /rewind-equivalent: snapshots, session forks, one-shot restore |
|
|
246
|
+
| [dsh-permission-rules](https://github.com/PerryLink/dsh-permission-rules) | Claude Code-style declarative allow/deny/ask permission rules with audit |
|
|
247
|
+
| [dsh-auto-review](https://github.com/PerryLink/dsh-auto-review) | Second-model auto-review on the approval chain, fail-closed by default |
|
|
248
|
+
| [dsh-memento](https://github.com/PerryLink/dsh-memento) | Approval-gated cross-session memory: ctx.memory seam + SQLite + memory tool |
|
|
249
|
+
| [dsh-skill-pack-security](https://github.com/PerryLink/dsh-skill-pack-security) | Security-audit skill pack: secret scan, dependency and supply-chain review |
|
|
250
|
+
| [dsh-session-pin](https://github.com/PerryLink/dsh-session-pin) | Pin sessions in the Web sidebar with durable ordering |
|
|
251
|
+
| [dsh-composer-history](https://github.com/PerryLink/dsh-composer-history) | Terminal-style input history for the web composer: arrows, Ctrl+R search |
|
|
252
|
+
| [dsh-github](https://github.com/PerryLink/dsh-github) | GitHub PR/issues integration for DSH, every write gated by approval |
|
|
253
|
+
| [dsh-plugin-guide](https://github.com/PerryLink/dsh-plugin-guide) | Plugin-development knowledge base as an on-demand agent skill |
|
|
254
|
+
| [dsh-claude-move](https://github.com/PerryLink/dsh-claude-move) | Migrate Claude Code sessions, memory, skills and CLAUDE.md into DSH |
|
|
276
255
|
|
|
277
256
|
## Licença
|
|
278
257
|
|
|
279
|
-
[Apache
|
|
258
|
+
[Apache License 2.0](LICENSE) © 2026 dsh-doublecheck contributors
|