Skip to content

Commit bc4fb4b

Browse files
dbejarano820claude
andauthored
chore: rename npm scope from @hacienda-cr to @dojocoding (#23)
Rename all 4 packages for DojoCoding ecosystem branding: - @hacienda-cr/shared → @dojocoding/hacienda-shared - @hacienda-cr/sdk → @dojocoding/hacienda-sdk - @hacienda-cr/cli → @dojocoding/hacienda-cli - @hacienda-cr/mcp → @dojocoding/hacienda-mcp Updated across 77 files: package.json names/deps, all source imports, changeset config, CI workflow, README, CLAUDE.md, CHANGELOGs, and package READMEs. Removed MASTER_PLAN.md. Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
1 parent abc59d5 commit bc4fb4b

77 files changed

Lines changed: 206 additions & 996 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.changeset/config.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
"changelog": "@changesets/cli/changelog",
44
"commit": false,
55
"fixed": [],
6-
"linked": [["@hacienda-cr/*"]],
6+
"linked": [["@dojocoding/*"]],
77
"access": "public",
88
"baseBranch": "main",
99
"updateInternalDependencies": "patch",

.github/workflows/publish.yml

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -50,22 +50,22 @@ jobs:
5050
- name: Test
5151
run: pnpm test
5252

53-
- name: Publish @hacienda-cr/shared
54-
run: pnpm --filter @hacienda-cr/shared publish --access public --no-git-checks
53+
- name: Publish @dojocoding/hacienda-shared
54+
run: pnpm --filter @dojocoding/hacienda-shared publish --access public --no-git-checks
5555
env:
5656
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
5757

58-
- name: Publish @hacienda-cr/sdk
59-
run: pnpm --filter @hacienda-cr/sdk publish --access public --no-git-checks
58+
- name: Publish @dojocoding/hacienda-sdk
59+
run: pnpm --filter @dojocoding/hacienda-sdk publish --access public --no-git-checks
6060
env:
6161
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
6262

63-
- name: Publish @hacienda-cr/cli
64-
run: pnpm --filter @hacienda-cr/cli publish --access public --no-git-checks
63+
- name: Publish @dojocoding/hacienda-cli
64+
run: pnpm --filter @dojocoding/hacienda-cli publish --access public --no-git-checks
6565
env:
6666
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
6767

68-
- name: Publish @hacienda-cr/mcp
69-
run: pnpm --filter @hacienda-cr/mcp publish --access public --no-git-checks
68+
- name: Publish @dojocoding/hacienda-mcp
69+
run: pnpm --filter @dojocoding/hacienda-mcp publish --access public --no-git-checks
7070
env:
7171
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}

CLAUDE.md

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,6 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co
66

77
TypeScript SDK, CLI & MCP Server for Costa Rica Electronic Invoicing (Comprobantes Electrónicos) against the Ministerio de Hacienda API v4.4. Three-layer architecture: SDK (core library) → CLI (`hacienda` binary) → MCP Server (AI-accessible tools).
88

9-
See `MASTER_PLAN.md` for full architecture, backlog, spikes (S-01 through S-06), and dependency graph.
10-
119
## Commands
1210

1311
```bash
@@ -20,9 +18,9 @@ pnpm typecheck # Type-check all packages
2018
pnpm clean # Remove all dist/ directories
2119

2220
# Single package
23-
pnpm --filter @hacienda-cr/sdk build
24-
pnpm --filter @hacienda-cr/sdk test
25-
pnpm --filter @hacienda-cr/sdk test clave.spec.ts # Single test file
21+
pnpm --filter @dojocoding/hacienda-sdk build
22+
pnpm --filter @dojocoding/hacienda-sdk test
23+
pnpm --filter @dojocoding/hacienda-sdk test clave.spec.ts # Single test file
2624
```
2725

2826
**Build order matters:** Turbo handles this automatically — `shared` builds first, then `sdk`, then `cli`/`mcp`. Always run `pnpm build` before `pnpm test` on a fresh clone.
@@ -31,10 +29,10 @@ pnpm --filter @hacienda-cr/sdk test clave.spec.ts # Single test file
3129

3230
```
3331
packages/
34-
├── sdk/ # @hacienda-cr/sdk — Core: auth, XML, signing, API client, tax calc
35-
├── cli/ # @hacienda-cr/cli — `hacienda` binary (citty framework)
36-
└── mcp/ # @hacienda-cr/mcp — MCP Server (@modelcontextprotocol/sdk)
37-
shared/ # @hacienda-cr/shared — Types, Zod schemas, constants, enums
32+
├── sdk/ # @dojocoding/hacienda-sdk — Core: auth, XML, signing, API client, tax calc
33+
├── cli/ # @dojocoding/hacienda-cli — `hacienda` binary (citty framework)
34+
└── mcp/ # @dojocoding/hacienda-mcp — MCP Server (@modelcontextprotocol/sdk)
35+
shared/ # @dojocoding/hacienda-shared — Types, Zod schemas, constants, enums
3836
```
3937

4038
**Dependency flow:** `shared``sdk``cli` / `mcp`. The SDK is the foundation — CLI and MCP wrap it.
@@ -132,4 +130,3 @@ Config: `~/.hacienda-cr/config.toml`. Secrets always via env vars (`HACIENDA_PAS
132130
- Token lifecycle: access token ~5min (cache in memory, refresh 30s before expiry), refresh token ~10hrs (persist to disk)
133131
- All XML must validate against vendored v4.4 XSD schemas before submission
134132
- Critical path: monorepo setup → types/clave → XML builder (Factura) → signing → API submission → end-to-end test
135-
- Spikes S-01 through S-06 in MASTER_PLAN.md must be resolved before their dependent milestones

MASTER_PLAN.md

Lines changed: 0 additions & 796 deletions
This file was deleted.

README.md

Lines changed: 31 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
**El toolkit open-source más completo para facturación electrónica en Costa Rica.**\
66
SDK + CLI + Servidor MCP para emitir comprobantes electrónicos contra la API v4.4 del Ministerio de Hacienda.
77

8-
[![npm version](https://img.shields.io/npm/v/@hacienda-cr/sdk.svg)](https://www.npmjs.com/package/@hacienda-cr/sdk)
8+
[![npm version](https://img.shields.io/npm/v/@dojocoding/hacienda-sdk.svg)](https://www.npmjs.com/package/@dojocoding/hacienda-sdk)
99
[![CI](https://github.com/DojoCodingLabs/hacienda-cr/actions/workflows/ci.yml/badge.svg)](https://github.com/DojoCodingLabs/hacienda-cr/actions/workflows/ci.yml)
1010
[![License: MIT](https://img.shields.io/badge/Licencia-MIT-blue.svg)](LICENSE)
1111
[![Node.js](https://img.shields.io/badge/Node.js-22%2B-green.svg)](https://nodejs.org)
@@ -32,11 +32,11 @@ Emitir facturas electrónicas en Costa Rica no debería ser un dolor de cabeza.
3232
### Opción 1: SDK (para desarrolladores)
3333

3434
```bash
35-
npm install @hacienda-cr/sdk
35+
npm install @dojocoding/hacienda-sdk
3636
```
3737

3838
```ts
39-
import { HaciendaClient, DocumentType, Situation } from "@hacienda-cr/sdk";
39+
import { HaciendaClient, DocumentType, Situation } from "@dojocoding/hacienda-sdk";
4040

4141
// 1. Crear el cliente
4242
const client = new HaciendaClient({
@@ -66,7 +66,7 @@ const clave = client.buildClave({
6666
### Opción 2: CLI (para facturar desde la terminal)
6767

6868
```bash
69-
npm install -g @hacienda-cr/cli
69+
npm install -g @dojocoding/hacienda-cli
7070

7171
# Autenticarse
7272
hacienda auth login --cedula-type 02 --cedula 3101234567
@@ -87,7 +87,7 @@ hacienda lookup 3101234567
8787
### Opción 3: MCP Server (para asistentes de IA)
8888

8989
```bash
90-
npm install -g @hacienda-cr/mcp
90+
npm install -g @dojocoding/hacienda-mcp
9191
hacienda-mcp
9292
```
9393

@@ -138,7 +138,7 @@ Le podés decir a Claude: _"Creá una factura de Mi Empresa S.A. (cédula 310123
138138
El punto de entrada principal. Orquesta autenticación, generación de claves y operaciones con la API.
139139

140140
```ts
141-
import { HaciendaClient } from "@hacienda-cr/sdk";
141+
import { HaciendaClient } from "@dojocoding/hacienda-sdk";
142142

143143
const client = new HaciendaClient({
144144
// Requerido
@@ -202,8 +202,8 @@ import {
202202
buildClave,
203203
DocumentType,
204204
Situation,
205-
} from "@hacienda-cr/sdk";
206-
import type { LineItemInput } from "@hacienda-cr/sdk";
205+
} from "@dojocoding/hacienda-sdk";
206+
import type { LineItemInput } from "@dojocoding/hacienda-sdk";
207207

208208
// 1. Definir las líneas de detalle
209209
const lineas: LineItemInput[] = [
@@ -293,7 +293,7 @@ const xml = buildFacturaXml(factura);
293293
**Validación de XML:**
294294

295295
```ts
296-
import { validateFacturaInput } from "@hacienda-cr/sdk";
296+
import { validateFacturaInput } from "@dojocoding/hacienda-sdk";
297297

298298
const resultado = validateFacturaInput(datosFactura);
299299
if (!resultado.valid) {
@@ -308,8 +308,8 @@ if (!resultado.valid) {
308308
Utilidades para calcular impuestos, totales por línea y resúmenes según la normativa de Hacienda. Todos los montos se redondean a 5 decimales.
309309

310310
```ts
311-
import { round5, calculateLineItemTotals, calculateInvoiceSummary } from "@hacienda-cr/sdk";
312-
import type { LineItemInput, CalculatedLineItem, InvoiceSummary } from "@hacienda-cr/sdk";
311+
import { round5, calculateLineItemTotals, calculateInvoiceSummary } from "@dojocoding/hacienda-sdk";
312+
import type { LineItemInput, CalculatedLineItem, InvoiceSummary } from "@dojocoding/hacienda-sdk";
313313

314314
const item: LineItemInput = {
315315
numeroLinea: 1,
@@ -365,7 +365,7 @@ Cada comprobante electrónico requiere una clave numérica única de 50 dígitos
365365
**Estructura:** `[506][DDMMYY][cédula 12 dígitos][sucursal 3][terminal 5][tipo doc 2][consecutivo 10][situación 1][código seguridad 8]`
366366

367367
```ts
368-
import { buildClave, parseClave, DocumentType, Situation } from "@hacienda-cr/sdk";
368+
import { buildClave, parseClave, DocumentType, Situation } from "@dojocoding/hacienda-sdk";
369369

370370
// Generar clave
371371
const clave = buildClave({
@@ -402,7 +402,7 @@ Todo XML enviado a Hacienda debe estar firmado con XAdES-EPES usando el certific
402402

403403
```ts
404404
import { readFileSync } from "node:fs";
405-
import { signXml, signAndEncode, loadP12 } from "@hacienda-cr/sdk";
405+
import { signXml, signAndEncode, loadP12 } from "@dojocoding/hacienda-sdk";
406406

407407
const p12Buffer = readFileSync("/ruta/al/certificado.p12");
408408
const pin = process.env.HACIENDA_P12_PIN!;
@@ -426,7 +426,7 @@ const credenciales = await loadP12(p12Buffer, pin);
426426
Envía el documento y espera a que Hacienda lo procese. Maneja el polling automáticamente.
427427

428428
```ts
429-
import { submitAndWait, HttpClient } from "@hacienda-cr/sdk";
429+
import { submitAndWait, HttpClient } from "@dojocoding/hacienda-sdk";
430430

431431
const httpClient = new HttpClient({
432432
baseUrl: "https://api.comprobanteselectronicos.go.cr/recepcion-sandbox/v1",
@@ -463,7 +463,7 @@ if (resultado.accepted) {
463463
**Opción granular — control total:**
464464

465465
```ts
466-
import { submitDocument, getStatus, isTerminalStatus } from "@hacienda-cr/sdk";
466+
import { submitDocument, getStatus, isTerminalStatus } from "@dojocoding/hacienda-sdk";
467467

468468
// Enviar
469469
const response = await submitDocument(httpClient, solicitud);
@@ -478,7 +478,7 @@ if (isTerminalStatus(status.status)) {
478478
**Listar y consultar comprobantes:**
479479

480480
```ts
481-
import { listComprobantes, getComprobante } from "@hacienda-cr/sdk";
481+
import { listComprobantes, getComprobante } from "@dojocoding/hacienda-sdk";
482482

483483
const lista = await listComprobantes(httpClient, {
484484
offset: 0,
@@ -493,7 +493,7 @@ const detalle = await getComprobante(httpClient, "50601...");
493493
**Reintentos con backoff exponencial:**
494494

495495
```ts
496-
import { withRetry } from "@hacienda-cr/sdk";
496+
import { withRetry } from "@dojocoding/hacienda-sdk";
497497

498498
const resultado = await withRetry(() => submitDocument(httpClient, solicitud), {
499499
maxAttempts: 3,
@@ -507,7 +507,7 @@ const resultado = await withRetry(() => submitDocument(httpClient, solicitud), {
507507
Buscá información de cualquier contribuyente usando la API pública de actividades económicas de Hacienda (no requiere autenticación):
508508

509509
```ts
510-
import { lookupTaxpayer } from "@hacienda-cr/sdk";
510+
import { lookupTaxpayer } from "@dojocoding/hacienda-sdk";
511511

512512
const info = await lookupTaxpayer("3101234567");
513513
console.log(info.nombre); // "MI EMPRESA S.A."
@@ -529,7 +529,7 @@ import {
529529
deleteProfile,
530530
getNextSequence,
531531
resetSequence,
532-
} from "@hacienda-cr/sdk";
532+
} from "@dojocoding/hacienda-sdk";
533533

534534
// Guardar un perfil
535535
await saveConfig(
@@ -566,7 +566,7 @@ await resetSequence("02", "3101234567", "01", "001", "00001");
566566
Logger integrado con niveles configurables y soporte para JSON (ideal para producción).
567567

568568
```ts
569-
import { Logger, LogLevel, noopLogger } from "@hacienda-cr/sdk";
569+
import { Logger, LogLevel, noopLogger } from "@dojocoding/hacienda-sdk";
570570

571571
const logger = new Logger({
572572
level: LogLevel.DEBUG, // DEBUG, INFO, WARN, ERROR, SILENT
@@ -594,7 +594,7 @@ import {
594594
ApiError,
595595
AuthenticationError,
596596
SigningError,
597-
} from "@hacienda-cr/sdk";
597+
} from "@dojocoding/hacienda-sdk";
598598

599599
try {
600600
await client.authenticate();
@@ -636,7 +636,7 @@ try {
636636
## CLI — Referencia de comandos
637637

638638
```bash
639-
npm install -g @hacienda-cr/cli
639+
npm install -g @dojocoding/hacienda-cli
640640
```
641641

642642
Todos los comandos soportan `--json` para salida legible por máquinas.
@@ -777,7 +777,7 @@ hacienda draft --template nota-credito --output nc.json
777777

778778
## MCP Server — Integración con IA
779779

780-
El paquete `@hacienda-cr/mcp` expone el SDK como servidor MCP ([Model Context Protocol](https://modelcontextprotocol.io)), permitiendo que asistentes de IA emitan facturas electrónicas de forma conversacional.
780+
El paquete `@dojocoding/hacienda-mcp` expone el SDK como servidor MCP ([Model Context Protocol](https://modelcontextprotocol.io)), permitiendo que asistentes de IA emitan facturas electrónicas de forma conversacional.
781781

782782
### Configuración con Claude Desktop
783783

@@ -788,7 +788,7 @@ Agregá esto al `claude_desktop_config.json`:
788788
"mcpServers": {
789789
"hacienda-cr": {
790790
"command": "npx",
791-
"args": ["-y", "@hacienda-cr/mcp"]
791+
"args": ["-y", "@dojocoding/hacienda-mcp"]
792792
}
793793
}
794794
}
@@ -840,10 +840,10 @@ pnpm typecheck
840840
```
841841
hacienda-cr/
842842
├── packages/
843-
│ ├── sdk/ # @hacienda-cr/sdk — Core: auth, XML, firma, API
844-
│ ├── cli/ # @hacienda-cr/cli — Binario `hacienda` (citty)
845-
│ └── mcp/ # @hacienda-cr/mcp — Servidor MCP
846-
├── shared/ # @hacienda-cr/shared — Tipos, constantes, enums compartidos
843+
│ ├── sdk/ # @dojocoding/hacienda-sdk — Core: auth, XML, firma, API
844+
│ ├── cli/ # @dojocoding/hacienda-cli — Binario `hacienda` (citty)
845+
│ └── mcp/ # @dojocoding/hacienda-mcp — Servidor MCP
846+
├── shared/ # @dojocoding/hacienda-shared — Tipos, constantes, enums compartidos
847847
├── turbo.json # Configuración de Turborepo
848848
├── vitest.workspace.ts
849849
└── pnpm-workspace.yaml
@@ -852,9 +852,9 @@ hacienda-cr/
852852
### Construir paquetes individuales
853853

854854
```bash
855-
pnpm --filter @hacienda-cr/sdk build
856-
pnpm --filter @hacienda-cr/sdk test
857-
pnpm --filter @hacienda-cr/sdk test clave.spec.ts
855+
pnpm --filter @dojocoding/hacienda-sdk build
856+
pnpm --filter @dojocoding/hacienda-sdk test
857+
pnpm --filter @dojocoding/hacienda-sdk test clave.spec.ts
858858
```
859859

860860
### Stack tecnológico

packages/cli/CHANGELOG.md

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,21 @@
1-
# @hacienda-cr/cli
1+
# @dojocoding/hacienda-cli
22

33
## 0.1.0
44

55
### Minor Changes
66

77
- Initial public release of hacienda-cr — TypeScript SDK, CLI, and MCP Server for Costa Rica electronic invoicing (Hacienda API v4.4).
88

9-
**@hacienda-cr/shared** — Shared types, Zod schemas, and constants for all 7 document types, tax codes, and identification types.
9+
**@dojocoding/hacienda-shared** — Shared types, Zod schemas, and constants for all 7 document types, tax codes, and identification types.
1010

11-
**@hacienda-cr/sdk** — Core SDK with OAuth2 authentication, 50-digit clave generation/parsing, XML builder, XAdES-EPES digital signing, API client with submission/polling, and document builders for all 7 electronic document types.
11+
**@dojocoding/hacienda-sdk** — Core SDK with OAuth2 authentication, 50-digit clave generation/parsing, XML builder, XAdES-EPES digital signing, API client with submission/polling, and document builders for all 7 electronic document types.
1212

13-
**@hacienda-cr/cli**`hacienda` CLI binary for login, invoice drafting, validation, signing, submission, status checking, and document listing.
13+
**@dojocoding/hacienda-cli**`hacienda` CLI binary for login, invoice drafting, validation, signing, submission, status checking, and document listing.
1414

15-
**@hacienda-cr/mcp** — MCP Server exposing invoice creation, status checking, document retrieval, taxpayer lookup, and reference data as AI-accessible tools and resources.
15+
**@dojocoding/hacienda-mcp** — MCP Server exposing invoice creation, status checking, document retrieval, taxpayer lookup, and reference data as AI-accessible tools and resources.
1616

1717
### Patch Changes
1818

1919
- Updated dependencies
20-
- @hacienda-cr/shared@0.1.0
21-
- @hacienda-cr/sdk@0.1.0
20+
- @dojocoding/hacienda-shared@0.1.0
21+
- @dojocoding/hacienda-sdk@0.1.0

packages/cli/README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# @hacienda-cr/cli
1+
# @dojocoding/hacienda-cli
22

33
Command-line tool for Costa Rica electronic invoicing (Hacienda API v4.4).
44

@@ -7,7 +7,7 @@ Provides the `hacienda` command for authenticating, creating, validating, signin
77
## Installation
88

99
```bash
10-
npm install -g @hacienda-cr/cli
10+
npm install -g @dojocoding/hacienda-cli
1111
```
1212

1313
Requires **Node.js 22+**.

packages/cli/package.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
2-
"name": "@hacienda-cr/cli",
2+
"name": "@dojocoding/hacienda-cli",
33
"version": "0.1.0",
44
"description": "CLI for Costa Rica electronic invoicing (hacienda command)",
55
"type": "module",
@@ -34,8 +34,8 @@
3434
"clean": "rm -rf dist"
3535
},
3636
"dependencies": {
37-
"@hacienda-cr/sdk": "workspace:*",
38-
"@hacienda-cr/shared": "workspace:*",
37+
"@dojocoding/hacienda-sdk": "workspace:*",
38+
"@dojocoding/hacienda-shared": "workspace:*",
3939
"citty": "^0.2.1"
4040
},
4141
"license": "MIT",

packages/cli/src/commands/auth/login.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ import {
1515
IdType,
1616
saveConfig,
1717
ensureConfigDir,
18-
} from "@hacienda-cr/sdk";
19-
import type { Profile } from "@hacienda-cr/sdk";
18+
} from "@dojocoding/hacienda-sdk";
19+
import type { Profile } from "@dojocoding/hacienda-sdk";
2020
import { success, error, detail, outputJson } from "../../utils/format.js";
2121

2222
export const loginCommand = defineCommand({

packages/cli/src/commands/auth/status.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
*/
88

99
import { defineCommand } from "citty";
10-
import { loadConfig, listProfiles, getConfigPath } from "@hacienda-cr/sdk";
10+
import { loadConfig, listProfiles, getConfigPath } from "@dojocoding/hacienda-sdk";
1111
import { success, warn, detail, info, outputJson, dim } from "../../utils/format.js";
1212

1313
export const statusCommand = defineCommand({

0 commit comments

Comments
 (0)