{"_id":"@chuny-ai/dictum","_rev":"2-1ec7176272e252f99ae47f816c3f74c2","name":"@chuny-ai/dictum","dist-tags":{"latest":"0.1.1"},"versions":{"0.1.0":{"name":"@chuny-ai/dictum","version":"0.1.0","keywords":["cli","ai","harness","symlink","claude","copilot","cursor"],"author":{"name":"Edwin J. Páez"},"license":"BSD-2-Clause","_id":"@chuny-ai/dictum@0.1.0","maintainers":[{"name":"chuny-ai","email":"edwinjpr11@gmail.com"}],"homepage":"https://github.com/Chuny-AI/dictum#readme","bugs":{"url":"https://github.com/Chuny-AI/dictum/issues"},"bin":{"dictum":"dist/cli.js"},"dist":{"shasum":"cbdc4fc6104d2527736bff8a1cca43b6e42cda28","tarball":"https://registry.npmjs.org/@chuny-ai/dictum/-/dictum-0.1.0.tgz","fileCount":27,"integrity":"sha512-4K8SkDBsOQeRxqNVq1aQ3rK0UPWe414OudnZnvjGrPy5jNOWCGrsx4lm/cO6wG0Fd9SrotkPTjcQd+a++XMAkA==","signatures":[{"sig":"MEQCIDMqbUgFIkHFl6KuIDpbd8+LcQ7vL6G+IT+n5AsOuga3AiAs1MVTYuH4vtqT0mdg0esqp/FxOZX1VSpN6VfKTgQMfg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":96704},"type":"module","engines":{"node":">=18.17.0"},"gitHead":"815382f0ac7b357e07af3d1f060657504dd1b014","scripts":{"dev":"tsx src/cli.ts","test":"vitest run","build":"tsc -p tsconfig.build.json","docs:dev":"vitepress dev docs","prebuild":"node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\"","typecheck":"tsc -p tsconfig.json","docs:build":"vitepress build docs","test:watch":"vitest","docs:preview":"vitepress preview docs","prepublishOnly":"npm run build"},"_npmUser":{"name":"chuny-ai","email":"edwinjpr11@gmail.com"},"repository":{"url":"git+https://github.com/Chuny-AI/dictum.git","type":"git"},"_npmVersion":"11.16.0","description":"Proyecta un harness de IA (agents, skills, rules, hooks) hacia las ubicaciones estándar de cada herramienta mediante enlaces simbólicos cross-platform.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ora":"^8.1.1","zod":"^3.24.1","yaml":"^2.7.0","commander":"^13.1.0","fast-glob":"^3.3.3","picocolors":"^1.1.1","@inquirer/prompts":"^7.2.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.2","vitest":"^3.2.7","vitepress":"^1.6.4","typescript":"^5.7.3","@types/node":"^22.10.5"},"_npmOperationalInternal":{"tmp":"tmp/dictum_0.1.0_1785644552712_0.28505152831506186","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@chuny-ai/dictum","version":"0.1.1","description":"Proyecta un harness de IA (agents, skills, rules, hooks) hacia .claude/ mediante enlaces simbólicos cross-platform, y activa sus hooks automáticamente.","keywords":["cli","ai","harness","symlink","claude","claude-code","hooks"],"license":"BSD-2-Clause","author":{"name":"Edwin J. Páez"},"homepage":"https://github.com/Chuny-AI/dictum#readme","repository":{"type":"git","url":"git+https://github.com/Chuny-AI/dictum.git"},"bugs":{"url":"https://github.com/Chuny-AI/dictum/issues"},"publishConfig":{"access":"public"},"type":"module","bin":{"dictum":"dist/cli.js"},"engines":{"node":">=18.17.0"},"scripts":{"prebuild":"node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\"","build":"tsc -p tsconfig.build.json","prepublishOnly":"npm run build","dev":"tsx src/cli.ts","typecheck":"tsc -p tsconfig.json","test":"vitest run","test:watch":"vitest","docs:dev":"vitepress dev docs","docs:build":"vitepress build docs","docs:preview":"vitepress preview docs"},"dependencies":{"@inquirer/prompts":"^7.2.1","commander":"^13.1.0","fast-glob":"^3.3.3","ora":"^8.1.1","picocolors":"^1.1.1","yaml":"^2.7.0","zod":"^3.24.1"},"devDependencies":{"@types/node":"^22.10.5","tsx":"^4.19.2","typescript":"^5.7.3","vitepress":"^1.6.4","vitest":"^3.2.7"},"gitHead":"127e3ad8ee5e655bfd21dffd1124810799b561bd","_id":"@chuny-ai/dictum@0.1.1","_nodeVersion":"24.18.0","_npmVersion":"11.16.0","dist":{"integrity":"sha512-mA1qr8vQhkgKiM3HjsOkK8iS6JIN67/Esq2HDSHj4c6DvG/wSij4eS728VGETUhlW4+ET+oenVFndMCh1cPVMQ==","shasum":"3395bf98c3c74a147ebc76b77fb02e76b8651434","tarball":"https://registry.npmjs.org/@chuny-ai/dictum/-/dictum-0.1.1.tgz","fileCount":30,"unpackedSize":122565,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCankYv66S+j54CfdYVEf65zCxrqEoLVWqOjiN+pePTZwIhAMGa+d7v0WhnumtUQdti0jT4NRP4klL6qX2Lwl5lEfdh"}]},"_npmUser":{"name":"chuny-ai","email":"edwinjpr11@gmail.com"},"directories":{},"maintainers":[{"name":"chuny-ai","email":"edwinjpr11@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/dictum_0.1.1_1785652936450_0.5804143095790804"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-02T04:22:32.531Z","modified":"2026-08-02T06:42:16.752Z","0.1.0":"2026-08-02T04:22:32.841Z","0.1.1":"2026-08-02T06:42:16.596Z"},"bugs":{"url":"https://github.com/Chuny-AI/dictum/issues"},"author":{"name":"Edwin J. Páez"},"license":"BSD-2-Clause","homepage":"https://github.com/Chuny-AI/dictum#readme","keywords":["cli","ai","harness","symlink","claude","claude-code","hooks"],"repository":{"type":"git","url":"git+https://github.com/Chuny-AI/dictum.git"},"description":"Proyecta un harness de IA (agents, skills, rules, hooks) hacia .claude/ mediante enlaces simbólicos cross-platform, y activa sus hooks automáticamente.","maintainers":[{"name":"chuny-ai","email":"edwinjpr11@gmail.com"}],"readme":"# dictum\n\n> Un harness de IA, proyectado en cada herramienta que lo necesite.\n\n📖 **[Documentación completa](https://chuny-ai.github.io/dictum/)** — por qué existe, modelo\nmental, estrategia de symlinks, seguridad y arquitectura interna.\n\n**dictum** es un CLI que enlaza (nunca copia) un repositorio de harness de IA\n(`agents/`, `skills/`, `rules/`, `hooks/`) hacia `.claude/`, según lo que declares en un\n`manifest.yaml` por proyecto. Por ahora solo soporta Claude Code — es el único preset\nintegrado.\n\n---\n\n## Instalación\n\nRequiere Node.js >= 18.17. No hace falta instalar nada de forma permanente para\nprobarlo:\n\n```bash\nnpx @chuny-ai/dictum doctor\n```\n\nPara uso recurrente en un proyecto, instálalo como dependencia de desarrollo (así\nqueda fijado en `package.json` y todo el equipo usa la misma versión):\n\n```bash\nnpm install --save-dev @chuny-ai/dictum\n```\n\nO de forma global, si lo vas a usar igual en muchos proyectos que no comparten\n`package.json`:\n\n```bash\nnpm install -g @chuny-ai/dictum\n```\n\n`dictum doctor` diagnostica el entorno en cualquier momento: versión de Node,\nsoporte de symlinks en el directorio actual, y si hay un `manifest.yaml` válido.\n\n---\n\n## Uso\n\n### Guía rápida\n\nPunto de partida: ya tienes (o vas a crear) un repositorio de harness con la\nestructura `agents/`, `skills/`, `rules/`, `hooks/` — dictum no lo genera, solo lo\nconsume. A partir de ahí:\n\n1. **`dictum init`** — crea `manifest.yaml` en el proyecto actual. En modo\n   interactivo pregunta la ruta al harness y confirma el target `claude`.\n\n   ```bash\n   cd mi-proyecto\n   dictum init\n   ```\n\n2. **Revisa el `manifest.yaml` generado.** `init` deja `source.root` apuntando a\n   `../harness` por defecto y todos los componentes en `all` para las\n   herramientas que marcaste — ajusta la ruta real del harness y qué\n   `agents`/`skills`/`rules`/`hooks` quiere cada una (ver [manifest.yaml](#manifestyaml)\n   más abajo).\n\n3. **`dictum diff`** — muestra qué haría `apply` sin tocar nada en disco.\n   Siempre es seguro correrlo para previsualizar.\n\n   ```bash\n   dictum diff\n   ```\n\n4. **`dictum apply`** — crea los enlaces de verdad.\n\n   ```bash\n   dictum apply\n   ```\n\n5. **`dictum status`** — confirma que todo quedó `linked`, en cualquier momento\n   después.\n\n   ```bash\n   dictum status\n   ```\n\n### Ejemplo completo\n\n```\n# el harness vive un nivel arriba del proyecto\n~/code/\n├── harness/\n│   ├── agents/agents.md\n│   ├── skills/code-review/SKILL.md\n│   ├── rules/security.md\n│   └── hooks/claude/pre-commit.sh\n└── mi-proyecto/\n    └── (aquí corres dictum)\n```\n\n```bash\n$ cd ~/code/mi-proyecto\n$ dictum init --yes            # no interactivo: usa defaults (harness en ../harness, target claude)\n$ dictum diff\n+ [claude/agents/all] .claude/agents\n+ [claude/skills/all] .claude/skills\n+ [claude/rules/all] .claude/rules\n+ [claude/hooks/all] .claude/hooks\n4 crear, 0 actualizar, 0 eliminar, 0 en conflicto, 0 bloqueadas\n\n$ dictum apply\n✓ [claude/agents/all] .claude/agents\n✓ [claude/skills/all] .claude/skills\n✓ [claude/rules/all] .claude/rules\n✓ [claude/hooks/all] .claude/hooks\n4 aplicadas, 0 omitidas, 0 fallidas\n\n$ dictum status\nlinked    [claude/agents/all] .claude/agents\nlinked    [claude/skills/all] .claude/skills\nlinked    [claude/rules/all] .claude/rules\nlinked    [claude/hooks/all] .claude/hooks\n```\n\n`.claude/agents`, `.claude/skills`, etc. son ahora symlinks reales hacia el\nharness — editar un archivo en el harness lo refleja al instante en el proyecto,\nsin volver a correr nada.\n\n### Comandos\n\n| Comando | Qué hace |\n| --- | --- |\n| `dictum init` | Crea un `manifest.yaml` en el proyecto actual. |\n| `dictum apply [targets...]` | Reconcilia el filesystem hacia el estado del manifest: crea, actualiza y elimina enlaces. Idempotente. |\n| `dictum diff [targets...]` | Calcula y muestra el plan de `apply` sin tocar disco. |\n| `dictum status [targets...]` | Estado actual por ruta: `linked`, `missing`, `conflict`, `drifted`, `blocked`, `orphaned`. |\n| `dictum clean [targets...]` (alias `unlink`) | Elimina los enlaces que dictum generó, según el journal. |\n| `dictum list` | Lista herramientas soportadas (presets) y componentes disponibles en el harness configurado. |\n| `dictum doctor` | Diagnóstico del entorno: soporte de symlinks, Modo Desarrollador en Windows, permisos, versión de Node. |\n| `dictum validate` | Valida `manifest.yaml` contra el esquema sin tocar disco ni requerir acceso al harness. |\n| `dictum completions <shell>` | Genera autocompletado para bash/zsh/fish/powershell. |\n\nSelección de destino por argumento posicional, no por flag:\n\n```bash\ndictum apply           # todos los targets activos (enabled: true) del manifest\ndictum apply claude    # solo ese, aunque haya más declarados\ndictum apply --all     # fuerza todos, incluidos enabled: false\n```\n\nFlags más usadas: `-n/--dry-run` (calcula sin ejecutar), `-y/--yes` (no\ninteractivo), `-f/--force` (sobrescribe conflictos), `--on-conflict\n<backup|overwrite|skip|fail>`, `--only`/`--except <agents,skills,rules,hooks>`,\n`--json` (salida estructurada para CI/scripts), `-c/--config` y `-C/--cwd` para\napuntar a otro manifest o directorio. Ver `dictum <comando> --help` para el\ndetalle de cada uno.\n\n### manifest.yaml\n\n```yaml\nversion: 1\n\nsource:\n  root: ../dictum-harness\n  layout:\n    agents: agents\n    skills: skills\n    rules: rules\n    hooks: hooks\n\ndefaults:\n  onConflict: backup\n\ntargets:\n  claude:\n    enabled: true\n    components:\n      agents: all\n      skills:\n        - code-review\n        - release-notes\n      rules: all\n      hooks:\n        claude: all\n        git: false\n```\n\n- `targets.<nombre>` sin `path` usa el preset integrado para ese nombre (por ahora,\n  solo `claude` → `.claude`). Cualquier otro nombre necesita `path` explícito.\n- `components.<tipo>: all` proyecta la carpeta completa tal cual vive en el harness.\n- `components.<tipo>: [a, b]` proyecta solo esos elementos con nombre.\n- `components.<tipo>: false` omite ese tipo de componente para ese target.\n- `hooks` admite desglose por subcarpeta (`claude`, `git`, ...).\n- `overrides.<target>` permite desviar `onConflict` de los `defaults` globales para\n  un target puntual.\n\nVer [`manifest.yaml`](./manifest.yaml) en la raíz del repo para la versión\ncomentada completa.\n\n### Día a día\n\n- **Cambiaste el `manifest.yaml`** → corre `dictum apply` de nuevo. Es\n  idempotente: solo toca lo que cambió, y lo que ya no se pide se limpia si sigue\n  siendo un symlink de dictum (si alguien puso contenido real ahí, se reporta\n  como conflicto en vez de borrarlo).\n- **Cambiaste contenido dentro del harness** → no hace falta correr nada; los\n  symlinks ya apuntan ahí.\n- **Quieres deshacer todo lo que dictum creó** en este proyecto → `dictum clean`\n  (alias `unlink`). Borra exactamente lo que el journal (`.dictum/state.json`)\n  recuerda haber creado, nada más.\n- **`apply`/`diff`/`status` muestran `blocked`** → normalmente en Windows sin\n  \"Modo de programador\" activo. `dictum apply` en una terminal interactiva ofrece\n  resolverlo ahí mismo; fuera de una terminal interactiva, corre `dictum doctor`\n  para ver el diagnóstico y el motivo exacto.\n- **Quieres ver qué haría un comando sin ejecutarlo** → `-n/--dry-run` en\n  cualquier comando mutante, o directamente `dictum diff`.\n- **Vas a correrlo en CI/scripts** → agrega `--yes --json`; la salida JSON es\n  estable y pensada para parsear.\n- **Tu harness trae hooks de `claude` o `git`** → `apply` no solo los enlaza,\n  también los activa (entrada en `.claude/settings.local.json`, o\n  `core.hooksPath` para git) si el harness declara un `dictum-hooks.json`\n  junto al script. Nunca pisa una activación que no reconoce como propia sin\n  preguntar primero. Ver [Hook activation](https://chuny-ai.github.io/dictum/reference/hooks) en la documentación.\n\nPara el porqué de estas decisiones (por qué solo symlinks, qué pasa si el volumen\nno los soporta, cómo se protege de borrar contenido real) ver la\n[documentación completa](https://chuny-ai.github.io/dictum/).\n","readmeFilename":"README.md"}