@wiati/dfe-agent 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +20 -0
- package/README.md +196 -0
- package/dist/agent.md +48 -0
- package/dist/bin/dfe-agent.d.ts +2 -0
- package/dist/bin/dfe-agent.d.ts.map +1 -0
- package/dist/bin/dfe-agent.js +19 -0
- package/dist/bin/dfe-agent.js.map +1 -0
- package/dist/cli.d.ts +25 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +105 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/install.d.ts +23 -0
- package/dist/commands/install.d.ts.map +1 -0
- package/dist/commands/install.js +74 -0
- package/dist/commands/install.js.map +1 -0
- package/dist/commands/query.d.ts +14 -0
- package/dist/commands/query.d.ts.map +1 -0
- package/dist/commands/query.js +18 -0
- package/dist/commands/query.js.map +1 -0
- package/dist/commands/status.d.ts +10 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +58 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/update.d.ts +26 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +144 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/query/cache.d.ts +38 -0
- package/dist/query/cache.d.ts.map +1 -0
- package/dist/query/cache.js +80 -0
- package/dist/query/cache.js.map +1 -0
- package/dist/query/constants.d.ts +20 -0
- package/dist/query/constants.d.ts.map +1 -0
- package/dist/query/constants.js +20 -0
- package/dist/query/constants.js.map +1 -0
- package/dist/query/contextBuilder.d.ts +40 -0
- package/dist/query/contextBuilder.d.ts.map +1 -0
- package/dist/query/contextBuilder.js +54 -0
- package/dist/query/contextBuilder.js.map +1 -0
- package/dist/query/embedder.d.ts +30 -0
- package/dist/query/embedder.d.ts.map +1 -0
- package/dist/query/embedder.js +69 -0
- package/dist/query/embedder.js.map +1 -0
- package/dist/query/ftsSearch.d.ts +28 -0
- package/dist/query/ftsSearch.d.ts.map +1 -0
- package/dist/query/ftsSearch.js +48 -0
- package/dist/query/ftsSearch.js.map +1 -0
- package/dist/query/hybrid.d.ts +31 -0
- package/dist/query/hybrid.d.ts.map +1 -0
- package/dist/query/hybrid.js +67 -0
- package/dist/query/hybrid.js.map +1 -0
- package/dist/query/index.d.ts +45 -0
- package/dist/query/index.d.ts.map +1 -0
- package/dist/query/index.js +153 -0
- package/dist/query/index.js.map +1 -0
- package/dist/query/vectorSearch.d.ts +32 -0
- package/dist/query/vectorSearch.d.ts.map +1 -0
- package/dist/query/vectorSearch.js +54 -0
- package/dist/query/vectorSearch.js.map +1 -0
- package/dist/skill/dfe-fiscal/SKILL.md +140 -0
- package/package.json +59 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
Todas as mudancas notaveis neste projeto sao documentadas aqui.
|
|
4
|
+
|
|
5
|
+
## 0.1.0 — 2026-XX-XX (Sprint 14 MVP, em desenvolvimento)
|
|
6
|
+
|
|
7
|
+
### Added
|
|
8
|
+
- Pacote npm `@dfe-agent/dfe-agent` com agent + skill + CLI Node
|
|
9
|
+
- Subcommands `install`, `update`, `query`, `status`
|
|
10
|
+
- Base RAG via GitHub Releases (download obrigatorio no primeiro `update`; sem seed bundled para manter npm tarball <50MB)
|
|
11
|
+
- Query engine Node port de `src/query/query_engine.py` com paridade validada
|
|
12
|
+
- Sync bidirecional `agent.md` + `SKILL.md` com drift detection no CI
|
|
13
|
+
- Workflow GitHub Actions `publish-base.yml` para publicar `dfe.db.gz` em cada release
|
|
14
|
+
- Workflow GitHub Actions `publish-npm.yml` para publicar no npm em tag `packages-v*.*.*`
|
|
15
|
+
|
|
16
|
+
### Known limitations (Sprint 14)
|
|
17
|
+
- Ambiente de desenvolvimento historico tinha issue pre-existente com Node v22.21.1 + `sharp`/`better-sqlite3` nativos (Sprint 13). **Resolvido em 2026-08-26** via upgrade para Node 24.19.0 LTS.
|
|
18
|
+
- `npx dfe-agent install` NAO e' automatico no postinstall (decisao D8 opt-in).
|
|
19
|
+
- Collector/indexer continuam em Python — Sprint 15+ pode portar para Node.
|
|
20
|
+
- **Sem seed bundled** (decisao revisada: `storage/dfe.db` gzipado = 61MB, excede target <30MB). Primeiro `update` exige rede; em rede off, retorna exit 3 com mensagem clara. Follow-up Sprint 15+: gerar seed mini (<5MB) com subconjunto de docs.
|
package/README.md
ADDED
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
# @dfe-agent/dfe-agent
|
|
2
|
+
|
|
3
|
+
> **Status: MVP em desenvolvimento (Sprint 14)** — publicacao inicial prevista apos Fase F.
|
|
4
|
+
|
|
5
|
+
Agente opencode + base RAG com documentacao fiscal eletronica oficial brasileira (NF-e, NFC-e, CT-e, MDF-e, SPED). Para outros projetos opencode que querem responder perguntas sobre DFes sem clonar o DFe-Agent inteiro.
|
|
6
|
+
|
|
7
|
+
## What is this?
|
|
8
|
+
|
|
9
|
+
`@dfe-agent/dfe-agent` e' o agente `dfe-agent` empacotado como pacote npm. Ele expoe:
|
|
10
|
+
|
|
11
|
+
- **Agent definition** (`dist/agent.md`) — system prompt que orienta o LLM a:
|
|
12
|
+
- usar a skill `dfe-fiscal`
|
|
13
|
+
- consultar a base RAG local via `dfe-agent query`
|
|
14
|
+
- citar fontes em todas as respostas
|
|
15
|
+
- recusar responder quando nao ha' chunks relevantes (`Nao encontrei base para responder`)
|
|
16
|
+
|
|
17
|
+
- **Skill definition** (`dist/skill/dfe-fiscal/SKILL.md`) — workflow canonico de:
|
|
18
|
+
- invocar `dfe-agent update` para manter base atualizada
|
|
19
|
+
- usar modos `semantic` / `fts` / `hybrid`
|
|
20
|
+
- aplicar guarda de `NO_EVIDENCE_MESSAGE`
|
|
21
|
+
|
|
22
|
+
- **CLI Node** (`dist/bin/dfe-agent.js`) — 4 subcommands:
|
|
23
|
+
- `install` — copia agent + skill para `.opencode/` do projeto consumidor
|
|
24
|
+
- `update` — baixa base RAG do GitHub Releases do DFe-Agent
|
|
25
|
+
- `query "<pergunta>"` — busca semantica/FTS5/hibrida, retorna JSON
|
|
26
|
+
- `status` — info da base instalada (path, mtime, doc count, schema)
|
|
27
|
+
|
|
28
|
+
- **Base RAG pre-buildada** — gerada no CI do DFe-Agent (Python pipeline) e distribuida via GitHub Releases como `dfe.db.gz` + `dfe.db.gz.sha256`. Tamanho: ~30MB gzipped.
|
|
29
|
+
|
|
30
|
+
## Install
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
npm install @dfe-agent/dfe-agent
|
|
34
|
+
npx dfe-agent install # copia agent + skill para .opencode/ (opt-in, nao automatico)
|
|
35
|
+
npx dfe-agent update # baixa base RAG (~30MB)
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
> **Por que `install` e' opt-in?** Decisao D8: evita sobrescrever `.opencode/agent/dfe-agent.md` custom do usuario sem aviso. Para auto-setup, use `npx dfe-agent install --auto-setup`.
|
|
39
|
+
|
|
40
|
+
## Quick start
|
|
41
|
+
|
|
42
|
+
### Via opencode TUI (integrado)
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
# apos install + update:
|
|
46
|
+
opencode run
|
|
47
|
+
# no TUI: Tab -> selecione @dfe-agent -> faca pergunta em linguagem natural
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
O agent invocara' a skill `dfe-fiscal`, que rodara' `dfe-agent query "<pergunta>"`, formatara' a resposta em linguagem natural e adicionara' o bloco `Fontes:` no final.
|
|
51
|
+
|
|
52
|
+
### Via CLI direto (sem TUI)
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
npx dfe-agent query "O que e a NF-e?"
|
|
56
|
+
# {
|
|
57
|
+
# "answer": "A Nota Fiscal eletronica (NF-e) e' um documento...",
|
|
58
|
+
# "sources": [
|
|
59
|
+
# { "url": "https://www.nfe.fazenda.gov.br/...", "title": "NT 2019.001", "score": 0.87 }
|
|
60
|
+
# ]
|
|
61
|
+
# }
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
Modos opt-in:
|
|
65
|
+
|
|
66
|
+
| Flag | Algoritmo | Quando usar |
|
|
67
|
+
|---|---|---|
|
|
68
|
+
| (nenhuma) | Vector search (sqlite-vec) | Default; perguntas genericas |
|
|
69
|
+
| `--mode=fts` | FTS5 BM25 | Termos literais (numero NT, codigo) |
|
|
70
|
+
| `--mode=hybrid` | RRF k=60 (vector + FTS5) | Maioria dos casos (gate Sprint 2) |
|
|
71
|
+
|
|
72
|
+
## Updating the base
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
npx dfe-agent update
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
Fluxo:
|
|
79
|
+
|
|
80
|
+
1. `GET https://api.github.com/repos/dfe-agent/DFe-Agent/releases/latest`
|
|
81
|
+
2. Localiza assets `dfe.db.gz` + `dfe.db.gz.sha256`
|
|
82
|
+
3. Download + verifica SHA-256 (gate B.3)
|
|
83
|
+
4. Extrai atomicamente para `~/.dfe-agent/dfe.db`
|
|
84
|
+
5. Valida `PRAGMA user_version >= 6` (gate schema)
|
|
85
|
+
6. Fallback: sem seed bundled (decisao Sprint 14 final); retorna exit 3 com mensagem clara se GitHub inacessivel. Follow-up Sprint 15+ pode adicionar seed mini.
|
|
86
|
+
|
|
87
|
+
## Custom base path
|
|
88
|
+
|
|
89
|
+
```bash
|
|
90
|
+
DFE_AGENT_BASE_DIR=/custom/path npx dfe-agent update
|
|
91
|
+
DFE_AGENT_BASE_DIR=/custom/path npx dfe-agent query "..."
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
Util para:
|
|
95
|
+
|
|
96
|
+
- CI em sandbox (sem $HOME gravavel)
|
|
97
|
+
- Per-project base (multiplas bases em maquinas compartilhadas)
|
|
98
|
+
- Testes isolados
|
|
99
|
+
|
|
100
|
+
## Troubleshooting
|
|
101
|
+
|
|
102
|
+
| Erro | Causa | Solucao |
|
|
103
|
+
|---|---|---|
|
|
104
|
+
| `no dfe.db.gz asset` | Release do DFe-Agent ainda nao publicado | Aguarde primeiro release `v*.*.*` |
|
|
105
|
+
| `SHA mismatch` | Base corrompida no download | Rode `npx dfe-agent update` novamente |
|
|
106
|
+
| `PRAGMA user_version < 6` | Base antiga de versao pre-Sprint 5 | `rm ~/.dfe-agent/dfe.db && npx dfe-agent update` |
|
|
107
|
+
| `@xenova/transformers` falha ao carregar | Node v22.21.1 com sharp natives quebrados (Sprint 13) | Use Node 22.9 LTS ou 20.x |
|
|
108
|
+
| `better-sqlite3` falha ao compilar | Toolchain MSVC ausente | `npm rebuild better-sqlite3` com Visual Studio Build Tools |
|
|
109
|
+
| Query retorna `Nao encontrei base para responder` para pergunta valida | Base sem docs sobre o tema ou score baixo | `npx dfe-agent status` -> verifique `baseDocCount`; se baixo, `npx dfe-agent update` |
|
|
110
|
+
|
|
111
|
+
## Development
|
|
112
|
+
|
|
113
|
+
A fonte canonica deste agent vive no **DFe-Agent repo**:
|
|
114
|
+
|
|
115
|
+
- `.opencode/agent/dfe-agent.md`
|
|
116
|
+
- `.opencode/skills/dfe-fiscal/SKILL.md`
|
|
117
|
+
|
|
118
|
+
Para distribuir atualizacoes:
|
|
119
|
+
|
|
120
|
+
1. Edite a fonte canonica no DFe-Agent root.
|
|
121
|
+
2. Rode `npm run sync` em `packages/dfe-agent/` para copiar para `dist/`.
|
|
122
|
+
3. CI roda `npm run drift-check` para garantir consistencia (gate B.1).
|
|
123
|
+
|
|
124
|
+
Drift detectado em CI = PR bloqueado.
|
|
125
|
+
|
|
126
|
+
## Como o pacote funciona (arquitetura)
|
|
127
|
+
|
|
128
|
+
```
|
|
129
|
+
DFe-Agent root (CI em cada release v*.*.*)
|
|
130
|
+
│
|
|
131
|
+
├── python -m src.collector --once # varre portais oficiais
|
|
132
|
+
├── python -m src.indexer.ingest # gera embeddings
|
|
133
|
+
├── gzip storage/dfe.db > dfe.db.gz # ~30MB
|
|
134
|
+
└── upload asset em GitHub Release
|
|
135
|
+
│
|
|
136
|
+
▼
|
|
137
|
+
npx dfe-agent update (consumer)
|
|
138
|
+
├── download dfe.db.gz + sha256
|
|
139
|
+
├── verify SHA-256
|
|
140
|
+
├── extract to ~/.dfe-agent/dfe.db (atomic)
|
|
141
|
+
└── PRAGMA user_version >= 6 (gate schema)
|
|
142
|
+
│
|
|
143
|
+
▼
|
|
144
|
+
npx dfe-agent query "<pergunta>" (consumer)
|
|
145
|
+
├── encode(query) via @xenova/transformers (ONNX)
|
|
146
|
+
├── sqlite-vec MATCH em vec_chunks
|
|
147
|
+
├── opcional: FTS5 BM25 MATCH em fts_chunks
|
|
148
|
+
├── opcional: RRF k=60 fusion
|
|
149
|
+
└── retorna {answer, sources[]}
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
## Layout
|
|
153
|
+
|
|
154
|
+
```
|
|
155
|
+
packages/dfe-agent/
|
|
156
|
+
├── package.json
|
|
157
|
+
├── tsconfig.json
|
|
158
|
+
├── .gitignore
|
|
159
|
+
├── README.md
|
|
160
|
+
├── CHANGELOG.md
|
|
161
|
+
├── src/ # TypeScript source
|
|
162
|
+
│ ├── index.ts # entry point (VERSION, reexports)
|
|
163
|
+
│ ├── cli.ts # CLI parser (parseArgs + 4 subcommands)
|
|
164
|
+
│ ├── commands/
|
|
165
|
+
│ │ ├── install.ts # copia agent + skill para .opencode/
|
|
166
|
+
│ │ ├── update.ts # download + SHA verify + atomic extract
|
|
167
|
+
│ │ ├── query.ts # delega para queryEngine.search()
|
|
168
|
+
│ │ └── status.ts # info da base
|
|
169
|
+
│ ├── query/ # query engine Node (port Py)
|
|
170
|
+
│ │ ├── index.ts # orchestrator + NO_EVIDENCE_MESSAGE
|
|
171
|
+
│ │ ├── embedder.ts # @xenova/transformers + LRU 128
|
|
172
|
+
│ │ ├── vectorSearch.ts # sqlite-vec MATCH
|
|
173
|
+
│ │ ├── ftsSearch.ts # FTS5 BM25
|
|
174
|
+
│ │ ├── hybrid.ts # RRF k=60
|
|
175
|
+
│ │ ├── cache.ts # SQLite query cache
|
|
176
|
+
│ │ └── contextBuilder.ts # {answer, sources}
|
|
177
|
+
│ └── bin/
|
|
178
|
+
│ └── dfe-agent.ts # bin shim (shebang)
|
|
179
|
+
├── scripts/ # sync + drift-check
|
|
180
|
+
│ ├── sync-assets.ts
|
|
181
|
+
│ └── drift-check.ts
|
|
182
|
+
├── dist/ # build output (gitignored)
|
|
183
|
+
├── tests/ # node --test suites
|
|
184
|
+
│ ├── scaffold.test.ts
|
|
185
|
+
│ ├── sync-assets.test.ts
|
|
186
|
+
│ ├── drift-check.test.ts
|
|
187
|
+
│ ├── cli/skeleton.test.ts
|
|
188
|
+
│ ├── query/{embedder,ftsSearch,hybrid,cache,orchestrator}.test.ts
|
|
189
|
+
│ └── e2e/
|
|
190
|
+
# NOTA: src/seed/ removido em Sprint 14 final (61MB gzip > target 30MB);
|
|
191
|
+
# `update` retorna exit 3 com mensagem clara em rede off sem seed.
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
## License
|
|
195
|
+
|
|
196
|
+
MIT
|
package/dist/agent.md
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: dfe-agent
|
|
3
|
+
model: PROVIDER/MiniMax-M3
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# DFe-Agent
|
|
7
|
+
|
|
8
|
+
Voce e o agente principal do projeto DFe-Agent. Sua funcao e responder perguntas sobre documentacao fiscal eletronica oficial (NF-e, NFC-e, CT-e, MDF-e, SPED) e legislacao fiscal eletronica oficial fundamentada em notas tecnicas e atos dos orgaos publicos habilitados, com fonte unica na base RAG local.
|
|
9
|
+
|
|
10
|
+
## Fluxo obrigatorio antes de responder
|
|
11
|
+
|
|
12
|
+
1. SEMPRE invoque a skill `dfe-fiscal` antes de qualquer resposta.
|
|
13
|
+
2. Use o `QueryEngine` da skill `dfe-fiscal` para buscar chunks relevantes.
|
|
14
|
+
3. Avalie se ha evidencia suficiente via `has_sufficient_evidence`.
|
|
15
|
+
|
|
16
|
+
## Regra absoluta: nunca inventar informacao
|
|
17
|
+
|
|
18
|
+
Se `has_sufficient_evidence` retornar `False`, responda literalmente:
|
|
19
|
+
|
|
20
|
+
> Nao encontrei base para responder
|
|
21
|
+
|
|
22
|
+
Nunca afirme algo sem citar fonte presente na base RAG.
|
|
23
|
+
|
|
24
|
+
## Formato de toda resposta
|
|
25
|
+
|
|
26
|
+
A resposta SEMPRE termina com bloco `Fontes:` listando `URL - Titulo do documento` para cada fonte citada.
|
|
27
|
+
|
|
28
|
+
Exemplo de fechamento obrigatorio:
|
|
29
|
+
|
|
30
|
+
```
|
|
31
|
+
Fontes:
|
|
32
|
+
- https://www.nfe.fazenda.gov.br/docs/nt_2019_001.pdf - Nota Tecnica 2019.001 NF-e
|
|
33
|
+
- https://sped.gov.br/noticias/nt_2026_001 - Nota Tecnica SPED 2026.001
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## Guardrails
|
|
37
|
+
|
|
38
|
+
- NUNCA inventar informacao
|
|
39
|
+
- SEMPRE citar fonte presente na base RAG
|
|
40
|
+
- NUNCA emitir documento fiscal (fora de escopo)
|
|
41
|
+
- NUNCA substituir contador ou emitir opiniao legal/contabil
|
|
42
|
+
|
|
43
|
+
> **Sprint 11 D.4**: a regra "SEMPRE executar varredura antes de responder"
|
|
44
|
+
> foi REMOVIDA deste agente (contradizia o gate `dev/pre_tool_use.py`
|
|
45
|
+
> do agente implementador). O fluxo canonico de varredura + consulta
|
|
46
|
+
> esta documentado na skill `.opencode/skills/dfe-fiscal/SKILL.md`
|
|
47
|
+
> (Passo 2 do workflow) e deve ser aplicado manualmente quando
|
|
48
|
+
> necessario, NAO como regra automatica pre-resposta.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dfe-agent.d.ts","sourceRoot":"","sources":["../../src/bin/dfe-agent.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
// dfe-agent binario — entry point executado via `npx dfe-agent`.
|
|
4
|
+
//
|
|
5
|
+
// Em dev (`packages/dfe-agent/`), usa tsx para carregar src/cli.ts direto.
|
|
6
|
+
// Em producao (instalado via npm), tsc compila src/cli.ts -> dist/cli.js,
|
|
7
|
+
// e este shim apenas re-exporta. O `package.json > bin` aponta para
|
|
8
|
+
// dist/bin/dfe-agent.js, mas como src/cli.ts ja tem o guard `if
|
|
9
|
+
// (import.meta.url === ...)`, ele se executa quando invocado via tsx.
|
|
10
|
+
//
|
|
11
|
+
// Em producao, o build copia src/cli.ts para dist/cli.js e empacota.
|
|
12
|
+
import("../cli.js")
|
|
13
|
+
.then((m) => m.runCli(process.argv.slice(2)))
|
|
14
|
+
.then((code) => process.exit(code))
|
|
15
|
+
.catch((err) => {
|
|
16
|
+
console.error(`[dfe-agent] erro fatal: ${err.message}`);
|
|
17
|
+
process.exit(1);
|
|
18
|
+
});
|
|
19
|
+
//# sourceMappingURL=dfe-agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dfe-agent.js","sourceRoot":"","sources":["../../src/bin/dfe-agent.ts"],"names":[],"mappings":";;AACA,iEAAiE;AACjE,EAAE;AACF,2EAA2E;AAC3E,0EAA0E;AAC1E,oEAAoE;AACpE,gEAAgE;AAChE,sEAAsE;AACtE,EAAE;AACF,qEAAqE;AAErE,MAAM,CAAC,WAAW,CAAC;KAChB,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;KAC5C,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;KAClC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACb,OAAO,CAAC,KAAK,CAAC,2BAA2B,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;IACxD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* cli.ts — entry point CLI para @dfe-agent/dfe-agent.
|
|
3
|
+
*
|
|
4
|
+
* Subcommands:
|
|
5
|
+
* install copia agent + skill para .opencode/ do projeto
|
|
6
|
+
* update baixa base RAG do GitHub Releases
|
|
7
|
+
* query busca semantica / FTS5 / hibrida na base
|
|
8
|
+
* status info da base instalada (path, mtime, doc count)
|
|
9
|
+
*
|
|
10
|
+
* Exit codes:
|
|
11
|
+
* 0 sucesso (incluindo NO_EVIDENCE_MESSAGE em `query`)
|
|
12
|
+
* 1 erro generico / I/O
|
|
13
|
+
* 2 argumentos invalidos
|
|
14
|
+
* 3 base ausente / SHA mismatch em `update`
|
|
15
|
+
*
|
|
16
|
+
* @see PLAN_SPRINT14.md Task C.1
|
|
17
|
+
*/
|
|
18
|
+
export interface CliOptions {
|
|
19
|
+
autoSetup?: boolean;
|
|
20
|
+
json?: boolean;
|
|
21
|
+
mode?: string;
|
|
22
|
+
question?: string;
|
|
23
|
+
}
|
|
24
|
+
export declare function runCli(argv: string[]): Promise<number>;
|
|
25
|
+
//# sourceMappingURL=cli.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAmBH,MAAM,WAAW,UAAU;IACzB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAsB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAoE5D"}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* cli.ts — entry point CLI para @dfe-agent/dfe-agent.
|
|
3
|
+
*
|
|
4
|
+
* Subcommands:
|
|
5
|
+
* install copia agent + skill para .opencode/ do projeto
|
|
6
|
+
* update baixa base RAG do GitHub Releases
|
|
7
|
+
* query busca semantica / FTS5 / hibrida na base
|
|
8
|
+
* status info da base instalada (path, mtime, doc count)
|
|
9
|
+
*
|
|
10
|
+
* Exit codes:
|
|
11
|
+
* 0 sucesso (incluindo NO_EVIDENCE_MESSAGE em `query`)
|
|
12
|
+
* 1 erro generico / I/O
|
|
13
|
+
* 2 argumentos invalidos
|
|
14
|
+
* 3 base ausente / SHA mismatch em `update`
|
|
15
|
+
*
|
|
16
|
+
* @see PLAN_SPRINT14.md Task C.1
|
|
17
|
+
*/
|
|
18
|
+
import { parseArgs } from "node:util";
|
|
19
|
+
import { fileURLToPath } from "node:url";
|
|
20
|
+
const USAGE = `dfe-agent — agente opencode + base RAG de documentacao fiscal eletronica
|
|
21
|
+
|
|
22
|
+
Uso:
|
|
23
|
+
dfe-agent install [--auto-setup] copia agent + skill para .opencode/
|
|
24
|
+
dfe-agent update baixa base RAG do GitHub Releases
|
|
25
|
+
dfe-agent query "<pergunta>" busca na base e retorna JSON {answer, sources[]}
|
|
26
|
+
dfe-agent status info da base instalada
|
|
27
|
+
dfe-agent --help imprime esta mensagem
|
|
28
|
+
|
|
29
|
+
Variaveis de ambiente:
|
|
30
|
+
DFE_AGENT_BASE_DIR path custom para base RAG (default: ~/.dfe-agent)
|
|
31
|
+
NPM_CONFIG_REGISTRY registry npm (para publicacao)
|
|
32
|
+
`;
|
|
33
|
+
export async function runCli(argv) {
|
|
34
|
+
// Lazy imports para evitar carregar modulos pesados (better-sqlite3) sem necessidade
|
|
35
|
+
const { install } = await import("./commands/install.js");
|
|
36
|
+
const { update } = await import("./commands/update.js");
|
|
37
|
+
const { query } = await import("./commands/query.js");
|
|
38
|
+
const { status } = await import("./commands/status.js");
|
|
39
|
+
let parsed;
|
|
40
|
+
try {
|
|
41
|
+
parsed = parseArgs({
|
|
42
|
+
args: argv,
|
|
43
|
+
options: {
|
|
44
|
+
auto: { type: "boolean", default: false },
|
|
45
|
+
json: { type: "boolean", default: true },
|
|
46
|
+
mode: { type: "string", default: "semantic" },
|
|
47
|
+
help: { type: "boolean", short: "h", default: false },
|
|
48
|
+
version: { type: "boolean", short: "v", default: false },
|
|
49
|
+
},
|
|
50
|
+
allowPositionals: true,
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
catch (err) {
|
|
54
|
+
console.error(`[dfe-agent] erro de argumentos: ${err.message}`);
|
|
55
|
+
return 2;
|
|
56
|
+
}
|
|
57
|
+
const { values, positionals } = parsed;
|
|
58
|
+
if (values.version) {
|
|
59
|
+
const { VERSION } = await import("./index.js");
|
|
60
|
+
console.log(VERSION);
|
|
61
|
+
return 0;
|
|
62
|
+
}
|
|
63
|
+
if (values.help || positionals.length === 0) {
|
|
64
|
+
console.log(USAGE);
|
|
65
|
+
return 0;
|
|
66
|
+
}
|
|
67
|
+
const [cmd, ...rest] = positionals;
|
|
68
|
+
switch (cmd) {
|
|
69
|
+
case "install":
|
|
70
|
+
return await install({ autoSetup: Boolean(values.auto) });
|
|
71
|
+
case "update":
|
|
72
|
+
return await update({});
|
|
73
|
+
case "query": {
|
|
74
|
+
const question = rest.join(" ").trim();
|
|
75
|
+
if (!question) {
|
|
76
|
+
console.error("[dfe-agent] query requer <pergunta>");
|
|
77
|
+
return 2;
|
|
78
|
+
}
|
|
79
|
+
return await query({
|
|
80
|
+
question,
|
|
81
|
+
mode: String(values.mode ?? "semantic"),
|
|
82
|
+
json: Boolean(values.json),
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
case "status":
|
|
86
|
+
return await status({ json: Boolean(values.json) });
|
|
87
|
+
default:
|
|
88
|
+
console.error(`[dfe-agent] comando desconhecido: ${cmd}`);
|
|
89
|
+
console.error(USAGE);
|
|
90
|
+
return 2;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
// Executa quando invocado diretamente como cli.ts OU cli.js (NÃO como binario
|
|
94
|
+
// dist/bin/dfe-agent.js — esse path tem seu proprio entry point).
|
|
95
|
+
// Comparacao exata via fileURLToPath evita heuristica fragil de endsWith.
|
|
96
|
+
const thisFile = fileURLToPath(import.meta.url);
|
|
97
|
+
const invokedDirectly = process.argv[1] === thisFile
|
|
98
|
+
|| process.argv[1]?.endsWith(`${thisFile.endsWith(".ts") ? "cli.ts" : "cli.js"}`);
|
|
99
|
+
if (invokedDirectly) {
|
|
100
|
+
runCli(process.argv.slice(2)).then((code) => process.exit(code), (err) => {
|
|
101
|
+
console.error(`[dfe-agent] erro fatal: ${err.message}`);
|
|
102
|
+
process.exit(1);
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* commands/install.ts — copia agent + skill de dist/ para .opencode/ do projeto.
|
|
3
|
+
*
|
|
4
|
+
* @see PLAN_SPRINT14.md Task C.1
|
|
5
|
+
*
|
|
6
|
+
* Origem (read-only):
|
|
7
|
+
* <pkg>/dist/agent.md
|
|
8
|
+
* <pkg>/dist/skill/dfe-fiscal/
|
|
9
|
+
*
|
|
10
|
+
* Destino (escrita):
|
|
11
|
+
* <cwd>/.opencode/agent/dfe-agent.md
|
|
12
|
+
* <cwd>/.opencode/skills/dfe-fiscal/
|
|
13
|
+
*
|
|
14
|
+
* Exit codes:
|
|
15
|
+
* 0 sucesso
|
|
16
|
+
* 1 erro de I/O
|
|
17
|
+
* 2 target invalido (sem permissao de escrita)
|
|
18
|
+
*/
|
|
19
|
+
export interface InstallOptions {
|
|
20
|
+
autoSetup?: boolean;
|
|
21
|
+
}
|
|
22
|
+
export declare function install(opts: InstallOptions): Promise<number>;
|
|
23
|
+
//# sourceMappingURL=install.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAQH,MAAM,WAAW,cAAc;IAC7B,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,wBAAsB,OAAO,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAyDnE"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* commands/install.ts — copia agent + skill de dist/ para .opencode/ do projeto.
|
|
3
|
+
*
|
|
4
|
+
* @see PLAN_SPRINT14.md Task C.1
|
|
5
|
+
*
|
|
6
|
+
* Origem (read-only):
|
|
7
|
+
* <pkg>/dist/agent.md
|
|
8
|
+
* <pkg>/dist/skill/dfe-fiscal/
|
|
9
|
+
*
|
|
10
|
+
* Destino (escrita):
|
|
11
|
+
* <cwd>/.opencode/agent/dfe-agent.md
|
|
12
|
+
* <cwd>/.opencode/skills/dfe-fiscal/
|
|
13
|
+
*
|
|
14
|
+
* Exit codes:
|
|
15
|
+
* 0 sucesso
|
|
16
|
+
* 1 erro de I/O
|
|
17
|
+
* 2 target invalido (sem permissao de escrita)
|
|
18
|
+
*/
|
|
19
|
+
import { cpSync, existsSync, mkdirSync, statSync } from "node:fs";
|
|
20
|
+
import { dirname, resolve } from "node:path";
|
|
21
|
+
import { fileURLToPath } from "node:url";
|
|
22
|
+
const PKG_ROOT = resolve(dirname(fileURLToPath(import.meta.url)), "../..");
|
|
23
|
+
export async function install(opts) {
|
|
24
|
+
const target = resolve(process.cwd(), ".opencode");
|
|
25
|
+
const targetAgent = `${target}/agent/dfe-agent.md`;
|
|
26
|
+
const targetSkill = `${target}/skills/dfe-fiscal`;
|
|
27
|
+
// 1. Validar source (dist/)
|
|
28
|
+
const srcAgent = resolve(PKG_ROOT, "dist/agent.md");
|
|
29
|
+
const srcSkill = resolve(PKG_ROOT, "dist/skill/dfe-fiscal");
|
|
30
|
+
if (!existsSync(srcAgent)) {
|
|
31
|
+
console.error(`[dfe-agent] dist/agent.md nao encontrado em ${srcAgent}.\n` +
|
|
32
|
+
`[dfe-agent] isto indica que 'npm run sync' nao foi rodado antes do build.\n` +
|
|
33
|
+
`[dfe-agent] se voce instalou via npm install, isso e' um bug do pacote — reporte em https://github.com/dfe-agent/DFe-Agent/issues`);
|
|
34
|
+
return 1;
|
|
35
|
+
}
|
|
36
|
+
if (!existsSync(srcSkill)) {
|
|
37
|
+
console.error(`[dfe-agent] dist/skill/dfe-fiscal nao encontrado em ${srcSkill}`);
|
|
38
|
+
return 1;
|
|
39
|
+
}
|
|
40
|
+
// 2. Criar target dir
|
|
41
|
+
try {
|
|
42
|
+
mkdirSync(`${target}/agent`, { recursive: true });
|
|
43
|
+
mkdirSync(`${target}/skills/dfe-fiscal`, { recursive: true });
|
|
44
|
+
}
|
|
45
|
+
catch (err) {
|
|
46
|
+
console.error(`[dfe-agent] nao foi possivel criar ${target}: ${err.message}`);
|
|
47
|
+
return 2;
|
|
48
|
+
}
|
|
49
|
+
// 3. Copiar (sobrescreve sem warning — design B.1)
|
|
50
|
+
cpSync(srcAgent, targetAgent);
|
|
51
|
+
const agentSize = statSync(targetAgent).size;
|
|
52
|
+
console.info(`[dfe-agent] copied agent -> ${targetAgent} (${agentSize} bytes)`);
|
|
53
|
+
cpSync(srcSkill, targetSkill, { recursive: true });
|
|
54
|
+
console.info(`[dfe-agent] copied skill -> ${targetSkill}`);
|
|
55
|
+
// 4. Se --auto-setup, dispara update em sequencia
|
|
56
|
+
if (opts.autoSetup) {
|
|
57
|
+
console.info("[dfe-agent] --auto-setup acionado, disparando update...");
|
|
58
|
+
try {
|
|
59
|
+
const { update } = await import("./update.js");
|
|
60
|
+
const updateCode = await update({});
|
|
61
|
+
console.info(`[dfe-agent] update finalizou com exit code ${updateCode}`);
|
|
62
|
+
return updateCode;
|
|
63
|
+
}
|
|
64
|
+
catch (err) {
|
|
65
|
+
console.error(`[dfe-agent] update falhou: ${err.message}`);
|
|
66
|
+
return 3;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
console.info(`[dfe-agent] proximos passos:`);
|
|
70
|
+
console.info(`[dfe-agent] npx dfe-agent update # baixa base RAG`);
|
|
71
|
+
console.info(`[dfe-agent] opencode run # abre TUI e seleciona @dfe-agent`);
|
|
72
|
+
return 0;
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=install.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* commands/query.ts — busca semantica / FTS5 / hibrida na base RAG.
|
|
3
|
+
*
|
|
4
|
+
* @see PLAN_SPRINT14.md Task C.3 + Fase E
|
|
5
|
+
*
|
|
6
|
+
* Stub inicial: delega para query/index.ts (Fase E).
|
|
7
|
+
*/
|
|
8
|
+
export interface QueryOptions {
|
|
9
|
+
question: string;
|
|
10
|
+
mode?: string;
|
|
11
|
+
json?: boolean;
|
|
12
|
+
}
|
|
13
|
+
export declare function query(opts: QueryOptions): Promise<number>;
|
|
14
|
+
//# sourceMappingURL=query.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../src/commands/query.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,wBAAsB,KAAK,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAI/D"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* commands/query.ts — busca semantica / FTS5 / hibrida na base RAG.
|
|
3
|
+
*
|
|
4
|
+
* @see PLAN_SPRINT14.md Task C.3 + Fase E
|
|
5
|
+
*
|
|
6
|
+
* Stub inicial: delega para query/index.ts (Fase E).
|
|
7
|
+
*/
|
|
8
|
+
import { search } from "../query/index.js";
|
|
9
|
+
export async function query(opts) {
|
|
10
|
+
const result = await search(opts.question, { mode: (opts.mode ?? "semantic") });
|
|
11
|
+
console.log(JSON.stringify(result, null, 2));
|
|
12
|
+
return 0;
|
|
13
|
+
}
|
|
14
|
+
if (import.meta.url === `file:///${process.argv[1]?.replace(/\\/g, "/")}`) {
|
|
15
|
+
const q = process.argv.slice(2).join(" ").trim();
|
|
16
|
+
query({ question: q }).then((code) => process.exit(code));
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=query.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query.js","sourceRoot":"","sources":["../../src/commands/query.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAQ3C,MAAM,CAAC,KAAK,UAAU,KAAK,CAAC,IAAkB;IAC5C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,IAAI,UAAU,CAAQ,EAAE,CAAC,CAAC;IACvF,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC7C,OAAO,CAAC,CAAC;AACX,CAAC;AAED,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,WAAW,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC;IAC1E,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACjD,KAAK,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAC5D,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* commands/status.ts — info da base instalada.
|
|
3
|
+
*
|
|
4
|
+
* @see PLAN_SPRINT14.md Task C.4
|
|
5
|
+
*/
|
|
6
|
+
export interface StatusOptions {
|
|
7
|
+
json?: boolean;
|
|
8
|
+
}
|
|
9
|
+
export declare function status(opts: StatusOptions): Promise<number>;
|
|
10
|
+
//# sourceMappingURL=status.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAUH,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,wBAAsB,MAAM,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAuCjE"}
|