{"_id":"@ciberchema/blog-creator","_rev":"2-29abe58d921c922859c4d8325fb7db46","name":"@ciberchema/blog-creator","dist-tags":{"latest":"1.0.1"},"versions":{"1.0.0":{"name":"@ciberchema/blog-creator","version":"1.0.0","keywords":["blog","ssg","vue","static-site","flat-file","multisite"],"author":{"name":"Ciberchema"},"license":"MIT","_id":"@ciberchema/blog-creator@1.0.0","maintainers":[{"name":"ciberchema","email":"ciberchema@gmail.com"}],"homepage":"https://github.com/ciberchema/blog-creator#readme","bugs":{"url":"https://github.com/ciberchema/blog-creator/issues"},"bin":{"blog-creator":"src/cli/index.js"},"dist":{"shasum":"e417454fa435282f5774ff8ff891a97560c9992e","tarball":"https://registry.npmjs.org/@ciberchema/blog-creator/-/blog-creator-1.0.0.tgz","fileCount":77,"integrity":"sha512-SiqHVMI9ONNfNN5tkQ/CDCboPpa8RbiwX59gV3v44jrU8NNbTYybQNbZzkMuynGwDjy+PsaYhpQq/hxwTl63Fw==","signatures":[{"sig":"MEYCIQC20QEjnz750F/EhdCHSf2QlsJl5Lo8Y6oT4UvqEhVXBQIhAJsygu2M82MCTdo0KnqVQzd6XALqk4EfBql48VcbNt91","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":383460},"main":"src/build/index.js","type":"module","engines":{"node":">=18.0.0"},"exports":{".":"./src/build/index.js","./styles/*":"./src/styles/*.scss","./templates/*":"./src/templates/*.vue","./components/*":"./src/components/*.vue"},"gitHead":"76dc85ab9e0309f7ea156645f4c336d628348558","scripts":{"dev":"node src/cli/index.js dev","build":"node src/cli/index.js build","import":"node src/cli/index.js import"},"_npmUser":{"name":"ciberchema","email":"ciberchema@gmail.com"},"repository":{"url":"git+https://github.com/ciberchema/blog-creator.git","type":"git"},"_npmVersion":"10.5.0","description":"Motor de blog/portal flat-file multisite con Vue.js - SSG sin base de datos","directories":{},"_nodeVersion":"20.12.2","dependencies":{"vue":"^3.4.0","feed":"^4.2.2","glob":"^10.4.0","sass":"^1.101.0","vite":"^6.0.0","cheerio":"^1.0.0","fs-extra":"^11.2.0","turndown":"^7.2.0","vite-ssg":"^28.3.0","vue-router":"^4.3.0","gray-matter":"^4.0.3","markdown-it":"^14.1.0","sass-migrator":"^2.6.1","markdown-it-attrs":"^4.1.6","@vitejs/plugin-vue":"^6.0.7"},"_hasShrinkwrap":false,"optionalDependencies":{"@rolldown/binding-win32-x64-msvc":"^1.1.5"},"_npmOperationalInternal":{"tmp":"tmp/blog-creator_1.0.0_1784312166044_0.0661286648822379","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@ciberchema/blog-creator","version":"1.0.1","description":"Motor de blog/portal flat-file multisite con Vue.js - SSG sin base de datos","type":"module","main":"src/build/index.js","bin":{"blog-creator":"src/cli/index.js"},"exports":{".":"./src/build/index.js","./styles/*":"./src/styles/*.scss","./components/*":"./src/components/*.vue","./templates/*":"./src/templates/*.vue"},"scripts":{"dev":"node src/cli/index.js dev","build":"node src/cli/index.js build","import":"node src/cli/index.js import"},"dependencies":{"@vitejs/plugin-vue":"^6.0.7","cheerio":"^1.0.0","feed":"^4.2.2","fs-extra":"^11.2.0","glob":"^10.4.0","gray-matter":"^4.0.3","markdown-it":"^14.1.0","markdown-it-attrs":"^4.1.6","sass":"^1.101.0","sass-migrator":"^2.6.1","turndown":"^7.2.0","vite":"^6.0.0","vite-ssg":"^28.3.0","vue":"^3.4.0","vue-router":"^4.3.0"},"keywords":["blog","ssg","vue","static-site","flat-file","multisite"],"license":"MIT","author":{"name":"Ciberchema"},"repository":{"type":"git","url":"git+https://github.com/ciberchema/blog-creator.git"},"engines":{"node":">=18.0.0"},"optionalDependencies":{"@rolldown/binding-win32-x64-msvc":"^1.1.5"},"_id":"@ciberchema/blog-creator@1.0.1","gitHead":"f5553c79b595f690d881b9aff3f4dd934a049743","bugs":{"url":"https://github.com/ciberchema/blog-creator/issues"},"homepage":"https://github.com/ciberchema/blog-creator#readme","_nodeVersion":"20.12.2","_npmVersion":"10.5.0","dist":{"integrity":"sha512-MXGQ+wO1zdy3DPJoQ/U3siC4wmbOSOoKSgRhb5WVs3y0UxPmcmpHzm4rf8n+I0lLkPKTXF/k5EkK2jqJ9QkLGA==","shasum":"febbdbace3357ed90cd9bf82ce5e766d71e060da","tarball":"https://registry.npmjs.org/@ciberchema/blog-creator/-/blog-creator-1.0.1.tgz","fileCount":78,"unpackedSize":391793,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIBthc1h0g0IW4KezkTezo+a6AqEtAbMaxkSlr+Q8/MFnAiEAgx9wz0N2D7fk/gMvK3JyMyO1oka+2pNj4xDlUIQjOs4="}]},"_npmUser":{"name":"ciberchema","email":"ciberchema@gmail.com"},"directories":{},"maintainers":[{"name":"ciberchema","email":"ciberchema@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/blog-creator_1.0.1_1784577004420_0.908642062289337"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-17T18:16:05.852Z","modified":"2026-07-20T19:50:04.706Z","1.0.0":"2026-07-17T18:16:06.198Z","1.0.1":"2026-07-20T19:50:04.583Z"},"bugs":{"url":"https://github.com/ciberchema/blog-creator/issues"},"author":{"name":"Ciberchema"},"license":"MIT","homepage":"https://github.com/ciberchema/blog-creator#readme","keywords":["blog","ssg","vue","static-site","flat-file","multisite"],"repository":{"type":"git","url":"git+https://github.com/ciberchema/blog-creator.git"},"description":"Motor de blog/portal flat-file multisite con Vue.js - SSG sin base de datos","maintainers":[{"name":"ciberchema","email":"ciberchema@gmail.com"}],"readme":"# blog-creator\n\n> Motor de blog/portal flat-file multisite con Vue.js — Static Site Generator sin base de datos.\n\nBlog-creator es un motor de blogs y portales que almacena cada post y página como fichero plano Markdown con front-matter. Construido con **Vue.js 3 + Vite**, utiliza SSG (Static Site Generation) para producir HTML estático puro. Es **multisite y reutilizable**: el núcleo de plantillas y lógica vive en un paquete npm versionado, y cada site es un repositorio independiente que solo aporta su contenido y diseño (variables SCSS).\n\n## Features\n\n- **Flat-file CMS** — Sin base de datos. Cada post es un archivo `.md` con front-matter.\n- **Static Site Generation** — Genera HTML/JS/CSS estático listo para desplegar en cualquier hosting.\n- **Multisite** — Un solo motor, múltiples sites. Cada site tiene su propio diseño vía variables CSS.\n- **Importador WordPress/Blogger** — Scrapea la URL pública y convierte entradas a formato plano.\n- **CLI completo** — Comandos `dev`, `build`, `import`, `scaffold` para gestionar sites.\n- **RSS/Atom + Sitemap** — Generación automática de feeds y sitemap.xml.\n- **Accesibilidad WCAG AA** — Skip-links, focus visible, landmarks ARIA, contraste mínimo 4.5:1.\n- **Analítica** — Inyección de Google Analytics (GA4) mediante configuración.\n- **Markdown avanzado** — Front-matter con gray-matter, renderizado con markdown-it.\n\n## Installation\n\n```bash\nnpm install @ciberchema/blog-creator\n```\n\n## Usage\n\n### CLI\n\n```bash\nnpx blog-creator --help\n```\n\n```\nblog-creator v1.0.0 — Motor de blog/portal flat-file multisite\n\nUsage:\n  blog-creator dev              Start development server\n  blog-creator build            Build static site to ./public\n  blog-creator import           Import from WordPress/Blogger\n  blog-creator scaffold <name>  Create a new site\n  blog-creator --help           Show this help\n```\n\n### Create a new site\n\n```bash\nnpx @ciberchema/create-blog-site mi-nuevo-site\ncd mi-nuevo-site\nnpm install\n# Edit site.config.json and styles/_variables.scss\nnpm run dev      # Preview in browser\nnpm run build    # Generate static site in ./public\n```\n\n### Import content from WordPress/Blogger\n\n```bash\ncd mi-site\nnpx blog-creator import --url=https://blog-origen.com\n```\n\n## Scripts\n\n| Script | Description |\n|---|---|\n| `npm run dev` | Start Vite dev server with HMR |\n| `npm run build` | Build static site (SSG via vite-ssg) |\n| `npm run import` | Import content from WordPress/Blogger |\n\n## Configuration\n\nEach site has a `site.config.json`:\n\n```json\n{\n  \"title\": \"Mi Blog\",\n  \"description\": \"Descripción del sitio\",\n  \"lang\": \"es\",\n  \"domain\": \"https://midominio.com\",\n  \"social\": { \"X\": \"https://x.com/usuario\" },\n  \"analytics_id\": \"G-XXXXXXXXXX\",\n  \"media_base_url\": \"/media\"\n}\n```\n\nEl diseño se personaliza mediante `styles/_variables.scss` (CSS custom properties) y opcionalmente `styles/_custom.scss`.\n\n## Content format\n\nLos posts y páginas se escriben en **Markdown con front-matter YAML**. El motor usa **markdown-it** con `html: true`, `linkify: true` (URLs sueltas se convierten en enlaces automáticamente) y `typographer: true`.\n\n### Front-matter completo\n\n```yaml\n---\ntitle: \"Título del post\"          # Obligatorio\nslug: mi-primer-post               # Opcional (por defecto = nombre del fichero sin .md)\ndate: 2026-07-13                   # Opcional (ordenación descendente)\nstatus: public                     # public | draft (obligatorio)\ntype: post                         # post | page (opcional)\ncategories: [viajes, opinion]      # Opcional (crea /categories/:cat automático)\ntags: [asturias, verano]           # Opcional (crea /tags/:tag automático)\nexcerpt: \"Resumen corto\"           # Opcional (si se omite, auto-generado 160 chars)\nfeatured_image: /media/portada.jpg # Opcional (hero en post, card en listing)\nlang: es                           # Opcional\n---\n```\n\n### Enlaces e imágenes\n\nSintaxis Markdown estándar. Las imágenes reciben `loading=\"lazy\"` automáticamente.\n\n```markdown\n[Texto del enlace](https://ejemplo.com)\n![Texto alternativo](/media/foto.jpg)\n```\n\n### Cómo crear un post\n\n1. Crea un fichero `.md` en `content/posts/` (convención: `YYYY-MM-DD-tu-slug.md`)\n2. Escribe el front-matter mínimo:\n   ```markdown\n   ---\n   title: \"Tu título\"\n   status: draft\n   ---\n   ```\n3. Añade el contenido Markdown tras el `---`\n4. Previsualiza con `npm run dev`\n5. Cuando esté listo, cambia `status` a `public` y ejecuta `npm run build`\n\nPara crear una página (no un post), pon el fichero en `content/pages/` — aparecerá en `/{slug}` (ej. `/about`).\n\n## Project structure\n\n```\nblog-creator/\n├── index.html                    # HTML entry point\n├── package.json                  # @ciberchema/blog-creator\n├── CHANGELOG.md                  # Version history\n├── src/\n│   ├── main.js                   # Vue app entry (ViteSSG)\n│   ├── App.vue                   # Root component\n│   ├── router.js                 # Dynamic routes from markdown content\n│   ├── components/               # Vue components (Header, Footer, PostCard, etc.)\n│   ├── templates/                # Page templates (Home, SinglePost, Listing, NotFound)\n│   ├── styles/                   # SCSS with CSS variables + WCAG AA utilities\n│   ├── build/                    # Build logic (parser, RSS, sitemap, media)\n│   ├── cli/                      # CLI commands (dev, build, import, scaffold)\n│   └── importer/                 # WordPress/Blogger scraper\n└── create-blog-site/             # Scaffold package for new sites\n    └── template/                 # Default site template with sample content\n```\n\n## AI agent skills\n\nThis project includes skills for AI coding assistants (e.g. opencode). Cada skill se dispara con una frase en lenguaje natural durante la sesión con el agente.\n\n| Skill | Trigger phrases | Qué hace |\n|---|---|---|\n| `readme-generator` | «genera el README», «actualiza el README», «regenera el README», «rewrite README», «update README» | Lee `package.json`, `LICENSE`, `CHANGELOG.md`, el árbol de `src/` y genera o actualiza `README.md` con secciones estándar coherentes con el código real. |\n| `commit-writer` | «genera un commit», «escribe commit message», «make a commit», «commit this», «conventional commit», «analiza los cambios», «agrupa los cambios», «dame los comandos git» | Lee todos los cambios pendientes (git status), los agrupa por tipo/scope lógico y produce comandos `git add <files>` + `git commit -m \"...\"` listos para copiar y pegar, siguiendo Conventional Commits. |\n\nPara usar un skill, simplemente di la frase de activación durante la conversación con el agente. El agente cargará las instrucciones del skill automáticamente.\n\n## Architecture\n\nEl motor sigue un modelo **polyrepo**:\n\n- **Core** (`@ciberchema/blog-creator`): Contiene plantillas Vue, lógica de build, CLI y estilos compartidos. Se publica como paquete npm versionado (semver).\n- **Sites** (repositorios independientes): Cada site instala el core como dependencia y solo aporta `site.config.json`, `styles/_variables.scss` y contenido en `/content/`.\n\nEl despliegue es simple: copiar la carpeta `public/` por FTP/SFTP, o conectar el repositorio del site a Netlify/Vercel/GitHub Pages para auto-deploy.\n\n## Contributing\n\nLas contribuciones son bienvenidas. Por favor, abre un issue o pull request en el [repositorio de GitHub](https://github.com/ciberchema/blog-creator).\n\n## License\n\n[GNU General Public License v3.0](LICENSE)\n","readmeFilename":"README.md"}