{"owner":"nisrulz","repo":"app-privacy-policy-generator","hasSkills":true,"totalSkillsCount":5,"totalTokensCount":3836,"categories":["anthropic-skill","root-instruction","plugin-manifest"],"hasMcp":false,"mcpConfig":null,"found":[".agents/skills/add-localization/SKILL.md",".agents/skills/add-thirdparty-service/SKILL.md",".agents/skills/add-thirdparty-service/agents/openai.yaml","AGENTS.md","tools/reviews-page-generator/readme.md"],"skills":{".agents/skills/add-localization/SKILL.md":"---\nname: add-localization\ndescription: >\n  Add or update a language translation in the privacy policy generator.\n  Trigger when user says: \"add {language} translation\", \"add locale\",\n  \"translate to {language}\", \"add localization for {language}\", or when\n  a user wants to contribute a new language.\n---\n\n# Add Localization\n\n## Quick Steps\n\n### 1. Create locale JSON from English\n\n```sh\ncp src/locales/en.json src/locales/{code}.json\n```\n\nUse the ISO 639-1 language code (e.g., `es`, `fr`, `de`, `ja`, `pt`, `zh`).\n\n### 2. Translate all string values\n\nEdit the new JSON file. **Only translate values, never keys.**\n\n✅ Correct:\n```json\n\"wizard.step1.tagline\": \"Genera un documento personalizado...\"\n```\n\n❌ Wrong — don't change keys:\n```json\n\"wizard.step1.tagline_es\": \"Genera un documento personalizado...\"\n```\n\n### 3. Preserve `{{ variable }}` placeholders\n\nKeep placeholders like `{{ appName }}`, `{{ platformDesc }}`, `{{ deviceType }}` unchanged in the translated text.\n\n### 4. Build\n\n```sh\nmake build\n```\n\nThe Go build tool detects every JSON file in `src/locales/` and generates the HTML and JavaScript for each locale.\n\nOpen `public/index.html` — the language switcher dropdown now includes the new language.\n\n## Validation Checklist\n\n- [ ] JSON file is valid (no trailing commas, no duplicate keys)\n- [ ] All `{{ variable }}` placeholders preserved\n- [ ] UI labels, placeholders, help text translated\n- [ ] Legal templates translated (requires native-speaking legal review)\n- [ ] FAQ and disclaimer content translated\n- [ ] Platform vocabulary translated (device types, OS, browser strings)\n- [ ] Language appears in the dropdown\n- [ ] `make build` succeeds\n- [ ] `make check` passes (Go vet, build, golden, and Playwright checks)\n\n## Important Notes\n\n- **Legal text needs professional review**: Have a native-speaking lawyer review legal template translations.\n- **Don't translate third-party service names** in `thirdpartyservices.yml` — only the `name` field in the locale JSON if you add locale-specific names.\n- **Meta tags** (`meta.*` keys) are updated dynamically via JS after page load.\n",".agents/skills/add-thirdparty-service/SKILL.md":"---\nname: add-thirdparty-service\ndescription: >\n  Add a new third-party service to the privacy policy generator.\n  Trigger when user says: \"add {name} service\", \"add third party service\",\n  \"add 3rd party service\", \"add new service entry\", or when a user\n  wants to contribute a new service to the app.\n---\n\n# Add 3rd Party Service\n\n## Workflow\n\n1. Add YAML entry to `src/includes/yaml/thirdpartyservices.yml`\n2. Add logo image (160×160) to `public/images/third_party_logos/`\n3. Run `make build` to regenerate `public/js/thirdpartyservices.min.js`\n\n## YAML Entry Format\n\n```yml\n- name: Service Name\n  enabled: false\n  logo: images/third_party_logos/name.png\n  link:\n    privacy: https://example.com/privacy\n    terms: https://example.com/terms\n```\n\n## Logo Requirements\n\n- **160×160** pixels\n- Place in `public/images/third_party_logos/`\n- PNG or SVG format\n- Use remove.bg to strip background if needed\n- Use imagetools.org/trim to trim excess space\n\n## Logo Compression\n\nAfter adding the logo, run:\n\n```sh\nmake compress-images\n```\n\nThis compresses all images in `public/images/third_party_logos/` via the compress_images.sh script.\n\n## Validation\n\n```sh\nmake build   # regenerates public/js/thirdpartyservices.min.js from YAML\nmake check   # runs Go vet, build, golden, and Playwright checks\n```\n\nDo NOT edit `public/js/thirdpartyservices.min.js` directly — it is auto-generated from the YAML source.\n",".agents/skills/add-thirdparty-service/agents/openai.yaml":"display_name: Add 3rd Party Service\nshort_description: Add a new third-party service entry with YAML config and logo\ndefault_prompt: Add {service_name} as a third-party service\n","AGENTS.md":"# AGENTS.md\n\n## Project Overview\n\nStatic Vue.js web app that generates privacy policies and Terms & Conditions for Android, iOS, and web apps. The build creates one `index.html` file. It uses no bundler or hot reload. The build toolchain is pure Go (`cmd/build/`): it renders Go `text/template` files, converts YAML to JavaScript, compiles Less, minifies JavaScript, and adds cache-busting values. Node is not required for the build.\n\n## Source Layout\n\n- `src/tpl/` — Go `text/template` files used to build the page; `page.html` is the entry point. The directory contains shared blocks (`head`, `footer`, `mixins`, `meta`, `license-header`, and `css`) plus the page content. Templates use `{{ }}` (Go template delimiters); Vue uses `[[ ]]` delimiters. Put all labels and text through `translate('key')`.\n- `src/locales/` — locale JSON files (one per language); `en.json` is the source of truth; `de.json` also exists; `_flag` key for each locale\n- `src/tpl/mixins.html` — shared template blocks: `modal()`, `outputButtons()`, `attribution()`, `flycricketDeploy()`, `wizardProgress()`, `wizardMobileLogo()`, `wizardSidebar()`; templates are invoked via `{{template \"name\" .}}` (carry the page-data dot) or `{{template \"name\" (dict ...)}}` (map args)\n- `src/tpl/meta.html` — meta partials (`metaBase`, `metaAppDescription`, `metaAuthor`, `metaWebappSupport`, `metaFavicon`, `metaDataTag`, `metaLinkPreview`)\n- `src/tpl/css.html` — CSS includes (inline normalize/bulma, preload sidebar image, stylesheet link)\n- `src/tpl/license-header.html` — GPL license comment block\n- `src/tpl/content.html` — includes all content (wizard, privacy policies, T&C, disclaimer, FAQ, affiliate)\n- `src/tpl/modals.html` — modal wrappers (privacy simple/no-tracking/gdpr, terms, disclaimer, faq)\n- `src/tpl/privacy-simple.html`, `privacy-no-tracking.html`, `privacy-gdpr.html` — privacy policy bodies; all text via `translate('key')`\n- `src/tpl/tn-simple.html` — T&C template; all text via `translate('key')`\n- `src/tpl/wizard-step-1..8.html` — wizard steps; all labels via `translate('key')`\n- `src/tpl/info-modals.html` — Disclaimer/FAQ modals with Vue-controlled visibility; text via `translate('key')`\n- `src/tpl/affiliate-flycricket.html` — Flycricket affiliate integration\n- `src/js/main.js` — Vue app entry point: creates app with 3 composables (`useAppState`, `useWizard`, `useContent`), registers `translate()`, `_updateMeta()`, `switchLocale()` globally\n- `src/js/utils.js` — utility helpers (`convertHtmlToMd`, `getRawHTML`, `getContent`, `getTitle`, `loadInTextView`)\n- `src/js/flycricket.js` — Flycricket form submission helper `window.fc_deploy(bodyContentId)` (single function reused by all modal deploy buttons)\n- `src/includes/yaml/thirdpartyservices.yml` — 3rd-party service definitions (source of truth); supports locale-aware `name_{code}` fields; JS is auto-generated during build\n- `src/includes/vendor/` — vendored third-party assets; each subdirectory mirrors to `public/<subdir>/vendor/` (for example `js/` → `public/js/vendor/`)\n- `src/less/style.less` — Less entry point (`@import`s 6 partials); compiled to CSS by Go build\n- `src/less/_variables.less` — Less variables (`@color-primary`, `@font-sans`, `@border-radius`, etc.)\n- `src/less/_base.less` — Base layout, typography, hero, cards, footer\n- `src/less/_scrollbar.less` — Custom scrollbar styles\n- `src/less/_overrides.less` — Label, button, input, modal, checkbox overrides\n- `src/less/_bg-pattern.less` — `.bg-pattern` SVG data URI background\n- `src/less/_dark.less` — Dark theme overrides\n- `public/site.webmanifest` — PWA manifest (tracked, edit directly)\n- `public/sw.js` — service worker with offline caching (tracked, edit directly)\n- `public/404.html` — custom 404 page (tracked, edit directly)\n- `public/robots.txt` — robots exclusion (tracked, edit directly)\n- `public/humans.txt` — author/tech credits (tracked, edit directly)\n- `public/logo.svg` — SVG logo (tracked, edit directly)\n- `public/images/third_party_logos/` — third-party service logo images (tracked, add via `add-thirdparty-service` skill)\n- `public/images/side_image/` — hero and sidebar graphics (side_image.webp, side_image_dark.webp)\n- `public/images/app_graphics/` — app graphics (404.svg, etc.)\n- `public/images/app_icons/` — UI icons (disclaimer.svg, etc.)\n- `public/favicon*`, `public/apple-touch-icon.png`, `public/android-chrome-*` — favicons and PWA icons\n- `public/reviews.html` — generated reviews page (committed for convenience)\n- `public/reviews-data.json` — generated reviews data (committed for convenience)\n- `public/downloaded_images/` — generated reviews images served as WebP (committed for convenience; source PNGs stay in `tools/reviews-page-generator/downloaded_images/`)\n- `public/profile_pictures/` — reviewer profile pictures (gitignored, generated by reviews tool)\n- `cmd/build/*.go` — Go build toolchain source files (edit to modify build pipeline); includes `serve.go` (HTTP server for local dev)\n- `tests/golden-parity.spec.ts` — served HTML parity tests for English and German\n- `tests/golden/` — golden HTML fixtures used by the Playwright parity tests\n- `tests/` — Playwright E2E tests (Node.js is used only on demand for testing)\n- `tools/reviews-page-generator/` — standalone Go tool that generates the reviews page and its cached data\n- `Makefile` — project commands for formatting, building, serving, testing, and deployment\n\n## Build\n\n```sh\nmake format     # format Go source files\nmake check      # run Go tests, vet, and build checks\nmake build      # equivalent: go run ./cmd/build/\n```\n\nCompiles `src/` → `public/index.html`, `public/css/style.min.css`, `public/js/*.min.js`. Build outputs are tracked. The build is pure Go — no Node/npm dependency.\n\nBuild pipeline:\n1. Go compiles `src/less/style.less` → `public/css/style.min.css` via `toakleaf/less.go`\n2. Go parses `src/includes/yaml/thirdpartyservices.yml` → `public/tmp/thirdpartyservices.js`\n3. Go builds locales registry from `src/locales/` → `public/js/locales.min.js`\n4. Go renders `src/tpl/` (`text/template`, entry `page.html`) → `public/index.html`\n5. Go minifies every `src/js/*.js` and `public/tmp/*.js` to `public/js/<name>.min.js`\n6. Go mirrors each `src/includes/vendor/<type>/` directory to `public/<type>/vendor/`\n7. Per-locale: Go renders HTML with `lang` override; Go generates `locale.min.js`\n8. Cache-busting: `?v=<md5>` appended to all CSS/JS references in HTML files\n\nDev: `make serve` (builds then serves `public/` on port 8000 via Go HTTP server). `public/css/vendor/bulma.min.css` is purged out-of-band: run `make purge-css` after template or Bulma class changes, then `make build`. Node.js is required for `purge-css` only.\n\n## Code Conventions\n\n- **No comments** in source code unless documenting a complex legal rationale\n- **Commit style**: `type(scope): Description`\n- **Vue.js 3** is self-hosted (served from `public/js/vendor/vue.global.prod.js`); uses `[[ ]]` delimiters (configured in `createApp`)\n- **Go `text/template`** files use default `{{ }}` delimiters; Vue `[[ variable ]]` mustache interpolation passes through untouched (Vue.js syntax, not Go template syntax)\n- **Translation**: use `translate('key')` in templates (global method set in `main.js`), not `$t('key')`\n- **Computed properties** in Vue composable `computed()` calls — prefer over inline string matching\n- **Derived text** (e.g. `deviceType`, `platformDesc`) computed inside `generate()` following existing pattern, not watchers\n- **Compile-time flags** are passed as context fields on `pageData` in `cmd/build/render.go`: `Lang`, `Flycricket`, `NoTracking`, `Gdpr`, `ThemeToggle` (always `true` in the current site)\n- **`data-theme`** attribute on `<html>` element; dark mode support via `_dark.less` and `toggleTheme()` in `main.js`\n- **Go 1.25** — toolchain uses `github.com/tdewolff/minify/v2` for JS and `gopkg.in/yaml.v3` for YAML parsing\n\n## Testing\n\nRun these checks:\n\n- Run `make format` after Go source changes.\n- Run `make check` for Go vet and build checks.\n- The Playwright parity test compares served `en`/`de` HTML against `tests/golden/`.\n- Run `make check` for all Go, golden, and Playwright checks.\n- Node.js is only required for `make check`, `make test-ui`, and `make test-debug`.\n- `make check` runs tests, vet, build, and Playwright checks.\n\n## Deployment\n\n```sh\nmake deploy VERSION=\"<version>\"\n```\n\nCI via GitHub Actions (`.github/workflows/`): production deploy on push to `master`, preview deploy on PRs from same repo. Only maintainers can deploy.\n\n## Skills\n\n- `.agents/skills/add-thirdparty-service/` — Load this skill when adding a new 3rd-party service entry.\n- `.agents/skills/add-localization/` — Load this skill when adding a new language translation.\n\n## Quick Workflow for Edits\n\n1. Edit templates under `src/tpl/`\n2. Run `make format` after Go source changes\n3. Run `make build` to produce `public/`\n4. Verify `public/` renders correctly (open `public/index.html`)\n5. Commit source and build output changes\n\n## Contribution Rules\n\n- Bug fixes only for PRs (features discussed via issue first)\n- New 3rd-party service: load the `add-thirdparty-service` skill or manually add entry to `src/includes/yaml/thirdpartyservices.yml` + logo (160×160) to `public/images/third_party_logos/`\n- `cmd/build/` is pure Go; the build has no Node dependency (templates live in `src/tpl/`, rendering via `text/template`)\n- Build outputs expected (do not remove unless intentional): `public/index.html`, `public/css/style.min.css`, `public/js/*.min.js`, `public/js/vendor/`\n- `public/css/vendor/bulma.min.css` is a tracked source file. Re-run `make purge-css` when a change adds Bulma classes the build does not already use.\n- `public/sw.js`, `public/site.webmanifest`, `public/404.html`, `public/robots.txt`, `public/humans.txt`, `public/logo.svg` are tracked source files (not generated)\n- `public/reviews.html` and `public/reviews-data.json` are generated by `tools/reviews-page-generator/` but tracked for convenience\n","tools/reviews-page-generator/readme.md":"# Reviews Page Generator\n\nPulls comments from [GitHub Issue #65](https://github.com/nisrulz/app-privacy-policy-generator/issues/65) and generates a static Guestbook page.\n\n## Quick start\n\nFrom the repo root:\n\n```sh\n❯ make reviews          # uses cached data (if < 1 week old)\n❯ make reviews-force    # re-fetches everything from GitHub\n```\n\n## How it works\n\n1. Fetches comment pages from the GitHub Issues API (paginated, cached as JSON for 1 week)\n2. Downloads and resizes profile pictures (48x48) in parallel\n3. Downloads embedded images in parallel\n4. Converts markdown bodies to HTML, formats timestamps, remaps reactions\n5. Renders `template.mustache` into `public/reviews.html` and `public/reviews-data.json`\n6. Copies downloaded images into `public/profile_pictures/`\n\n## Requirements\n\n- [Go](https://go.dev/dl/) 1.25+\n- All dependencies are in `go.mod`\n\n## Files\n\n| File | What it does |\n|------|-------------|\n| `main.go` | Fetches, processes, renders, and writes output |\n| `go.mod` / `go.sum` | Go module definition |\n| `template.mustache` | Mustache template with `{{ total_comments }}` placeholder |\n| `comments_json/` | Cached API responses |\n| `downloaded_images/` | Raw images pulled from GitHub |\n"},"files":{".agents/skills/add-localization/SKILL.md":"---\nname: add-localization\ndescription: >\n  Add or update a language translation in the privacy policy generator.\n  Trigger when user says: \"add {language} translation\", \"add locale\",\n  \"translate to {language}\", \"add localization for {language}\", or when\n  a user wants to contribute a new language.\n---\n\n# Add Localization\n\n## Quick Steps\n\n### 1. Create locale JSON from English\n\n```sh\ncp src/locales/en.json src/locales/{code}.json\n```\n\nUse the ISO 639-1 language code (e.g., `es`, `fr`, `de`, `ja`, `pt`, `zh`).\n\n### 2. Translate all string values\n\nEdit the new JSON file. **Only translate values, never keys.**\n\n✅ Correct:\n```json\n\"wizard.step1.tagline\": \"Genera un documento personalizado...\"\n```\n\n❌ Wrong — don't change keys:\n```json\n\"wizard.step1.tagline_es\": \"Genera un documento personalizado...\"\n```\n\n### 3. Preserve `{{ variable }}` placeholders\n\nKeep placeholders like `{{ appName }}`, `{{ platformDesc }}`, `{{ deviceType }}` unchanged in the translated text.\n\n### 4. Build\n\n```sh\nmake build\n```\n\nThe Go build tool detects every JSON file in `src/locales/` and generates the HTML and JavaScript for each locale.\n\nOpen `public/index.html` — the language switcher dropdown now includes the new language.\n\n## Validation Checklist\n\n- [ ] JSON file is valid (no trailing commas, no duplicate keys)\n- [ ] All `{{ variable }}` placeholders preserved\n- [ ] UI labels, placeholders, help text translated\n- [ ] Legal templates translated (requires native-speaking legal review)\n- [ ] FAQ and disclaimer content translated\n- [ ] Platform vocabulary translated (device types, OS, browser strings)\n- [ ] Language appears in the dropdown\n- [ ] `make build` succeeds\n- [ ] `make check` passes (Go vet, build, golden, and Playwright checks)\n\n## Important Notes\n\n- **Legal text needs professional review**: Have a native-speaking lawyer review legal template translations.\n- **Don't translate third-party service names** in `thirdpartyservices.yml` — only the `name` field in the locale JSON if you add locale-specific names.\n- **Meta tags** (`meta.*` keys) are updated dynamically via JS after page load.\n",".agents/skills/add-thirdparty-service/SKILL.md":"---\nname: add-thirdparty-service\ndescription: >\n  Add a new third-party service to the privacy policy generator.\n  Trigger when user says: \"add {name} service\", \"add third party service\",\n  \"add 3rd party service\", \"add new service entry\", or when a user\n  wants to contribute a new service to the app.\n---\n\n# Add 3rd Party Service\n\n## Workflow\n\n1. Add YAML entry to `src/includes/yaml/thirdpartyservices.yml`\n2. Add logo image (160×160) to `public/images/third_party_logos/`\n3. Run `make build` to regenerate `public/js/thirdpartyservices.min.js`\n\n## YAML Entry Format\n\n```yml\n- name: Service Name\n  enabled: false\n  logo: images/third_party_logos/name.png\n  link:\n    privacy: https://example.com/privacy\n    terms: https://example.com/terms\n```\n\n## Logo Requirements\n\n- **160×160** pixels\n- Place in `public/images/third_party_logos/`\n- PNG or SVG format\n- Use remove.bg to strip background if needed\n- Use imagetools.org/trim to trim excess space\n\n## Logo Compression\n\nAfter adding the logo, run:\n\n```sh\nmake compress-images\n```\n\nThis compresses all images in `public/images/third_party_logos/` via the compress_images.sh script.\n\n## Validation\n\n```sh\nmake build   # regenerates public/js/thirdpartyservices.min.js from YAML\nmake check   # runs Go vet, build, golden, and Playwright checks\n```\n\nDo NOT edit `public/js/thirdpartyservices.min.js` directly — it is auto-generated from the YAML source.\n",".agents/skills/add-thirdparty-service/agents/openai.yaml":"display_name: Add 3rd Party Service\nshort_description: Add a new third-party service entry with YAML config and logo\ndefault_prompt: Add {service_name} as a third-party service\n","AGENTS.md":"# AGENTS.md\n\n## Project Overview\n\nStatic Vue.js web app that generates privacy policies and Terms & Conditions for Android, iOS, and web apps. The build creates one `index.html` file. It uses no bundler or hot reload. The build toolchain is pure Go (`cmd/build/`): it renders Go `text/template` files, converts YAML to JavaScript, compiles Less, minifies JavaScript, and adds cache-busting values. Node is not required for the build.\n\n## Source Layout\n\n- `src/tpl/` — Go `text/template` files used to build the page; `page.html` is the entry point. The directory contains shared blocks (`head`, `footer`, `mixins`, `meta`, `license-header`, and `css`) plus the page content. Templates use `{{ }}` (Go template delimiters); Vue uses `[[ ]]` delimiters. Put all labels and text through `translate('key')`.\n- `src/locales/` — locale JSON files (one per language); `en.json` is the source of truth; `de.json` also exists; `_flag` key for each locale\n- `src/tpl/mixins.html` — shared template blocks: `modal()`, `outputButtons()`, `attribution()`, `flycricketDeploy()`, `wizardProgress()`, `wizardMobileLogo()`, `wizardSidebar()`; templates are invoked via `{{template \"name\" .}}` (carry the page-data dot) or `{{template \"name\" (dict ...)}}` (map args)\n- `src/tpl/meta.html` — meta partials (`metaBase`, `metaAppDescription`, `metaAuthor`, `metaWebappSupport`, `metaFavicon`, `metaDataTag`, `metaLinkPreview`)\n- `src/tpl/css.html` — CSS includes (inline normalize/bulma, preload sidebar image, stylesheet link)\n- `src/tpl/license-header.html` — GPL license comment block\n- `src/tpl/content.html` — includes all content (wizard, privacy policies, T&C, disclaimer, FAQ, affiliate)\n- `src/tpl/modals.html` — modal wrappers (privacy simple/no-tracking/gdpr, terms, disclaimer, faq)\n- `src/tpl/privacy-simple.html`, `privacy-no-tracking.html`, `privacy-gdpr.html` — privacy policy bodies; all text via `translate('key')`\n- `src/tpl/tn-simple.html` — T&C template; all text via `translate('key')`\n- `src/tpl/wizard-step-1..8.html` — wizard steps; all labels via `translate('key')`\n- `src/tpl/info-modals.html` — Disclaimer/FAQ modals with Vue-controlled visibility; text via `translate('key')`\n- `src/tpl/affiliate-flycricket.html` — Flycricket affiliate integration\n- `src/js/main.js` — Vue app entry point: creates app with 3 composables (`useAppState`, `useWizard`, `useContent`), registers `translate()`, `_updateMeta()`, `switchLocale()` globally\n- `src/js/utils.js` — utility helpers (`convertHtmlToMd`, `getRawHTML`, `getContent`, `getTitle`, `loadInTextView`)\n- `src/js/flycricket.js` — Flycricket form submission helper `window.fc_deploy(bodyContentId)` (single function reused by all modal deploy buttons)\n- `src/includes/yaml/thirdpartyservices.yml` — 3rd-party service definitions (source of truth); supports locale-aware `name_{code}` fields; JS is auto-generated during build\n- `src/includes/vendor/` — vendored third-party assets; each subdirectory mirrors to `public/<subdir>/vendor/` (for example `js/` → `public/js/vendor/`)\n- `src/less/style.less` — Less entry point (`@import`s 6 partials); compiled to CSS by Go build\n- `src/less/_variables.less` — Less variables (`@color-primary`, `@font-sans`, `@border-radius`, etc.)\n- `src/less/_base.less` — Base layout, typography, hero, cards, footer\n- `src/less/_scrollbar.less` — Custom scrollbar styles\n- `src/less/_overrides.less` — Label, button, input, modal, checkbox overrides\n- `src/less/_bg-pattern.less` — `.bg-pattern` SVG data URI background\n- `src/less/_dark.less` — Dark theme overrides\n- `public/site.webmanifest` — PWA manifest (tracked, edit directly)\n- `public/sw.js` — service worker with offline caching (tracked, edit directly)\n- `public/404.html` — custom 404 page (tracked, edit directly)\n- `public/robots.txt` — robots exclusion (tracked, edit directly)\n- `public/humans.txt` — author/tech credits (tracked, edit directly)\n- `public/logo.svg` — SVG logo (tracked, edit directly)\n- `public/images/third_party_logos/` — third-party service logo images (tracked, add via `add-thirdparty-service` skill)\n- `public/images/side_image/` — hero and sidebar graphics (side_image.webp, side_image_dark.webp)\n- `public/images/app_graphics/` — app graphics (404.svg, etc.)\n- `public/images/app_icons/` — UI icons (disclaimer.svg, etc.)\n- `public/favicon*`, `public/apple-touch-icon.png`, `public/android-chrome-*` — favicons and PWA icons\n- `public/reviews.html` — generated reviews page (committed for convenience)\n- `public/reviews-data.json` — generated reviews data (committed for convenience)\n- `public/downloaded_images/` — generated reviews images served as WebP (committed for convenience; source PNGs stay in `tools/reviews-page-generator/downloaded_images/`)\n- `public/profile_pictures/` — reviewer profile pictures (gitignored, generated by reviews tool)\n- `cmd/build/*.go` — Go build toolchain source files (edit to modify build pipeline); includes `serve.go` (HTTP server for local dev)\n- `tests/golden-parity.spec.ts` — served HTML parity tests for English and German\n- `tests/golden/` — golden HTML fixtures used by the Playwright parity tests\n- `tests/` — Playwright E2E tests (Node.js is used only on demand for testing)\n- `tools/reviews-page-generator/` — standalone Go tool that generates the reviews page and its cached data\n- `Makefile` — project commands for formatting, building, serving, testing, and deployment\n\n## Build\n\n```sh\nmake format     # format Go source files\nmake check      # run Go tests, vet, and build checks\nmake build      # equivalent: go run ./cmd/build/\n```\n\nCompiles `src/` → `public/index.html`, `public/css/style.min.css`, `public/js/*.min.js`. Build outputs are tracked. The build is pure Go — no Node/npm dependency.\n\nBuild pipeline:\n1. Go compiles `src/less/style.less` → `public/css/style.min.css` via `toakleaf/less.go`\n2. Go parses `src/includes/yaml/thirdpartyservices.yml` → `public/tmp/thirdpartyservices.js`\n3. Go builds locales registry from `src/locales/` → `public/js/locales.min.js`\n4. Go renders `src/tpl/` (`text/template`, entry `page.html`) → `public/index.html`\n5. Go minifies every `src/js/*.js` and `public/tmp/*.js` to `public/js/<name>.min.js`\n6. Go mirrors each `src/includes/vendor/<type>/` directory to `public/<type>/vendor/`\n7. Per-locale: Go renders HTML with `lang` override; Go generates `locale.min.js`\n8. Cache-busting: `?v=<md5>` appended to all CSS/JS references in HTML files\n\nDev: `make serve` (builds then serves `public/` on port 8000 via Go HTTP server). `public/css/vendor/bulma.min.css` is purged out-of-band: run `make purge-css` after template or Bulma class changes, then `make build`. Node.js is required for `purge-css` only.\n\n## Code Conventions\n\n- **No comments** in source code unless documenting a complex legal rationale\n- **Commit style**: `type(scope): Description`\n- **Vue.js 3** is self-hosted (served from `public/js/vendor/vue.global.prod.js`); uses `[[ ]]` delimiters (configured in `createApp`)\n- **Go `text/template`** files use default `{{ }}` delimiters; Vue `[[ variable ]]` mustache interpolation passes through untouched (Vue.js syntax, not Go template syntax)\n- **Translation**: use `translate('key')` in templates (global method set in `main.js`), not `$t('key')`\n- **Computed properties** in Vue composable `computed()` calls — prefer over inline string matching\n- **Derived text** (e.g. `deviceType`, `platformDesc`) computed inside `generate()` following existing pattern, not watchers\n- **Compile-time flags** are passed as context fields on `pageData` in `cmd/build/render.go`: `Lang`, `Flycricket`, `NoTracking`, `Gdpr`, `ThemeToggle` (always `true` in the current site)\n- **`data-theme`** attribute on `<html>` element; dark mode support via `_dark.less` and `toggleTheme()` in `main.js`\n- **Go 1.25** — toolchain uses `github.com/tdewolff/minify/v2` for JS and `gopkg.in/yaml.v3` for YAML parsing\n\n## Testing\n\nRun these checks:\n\n- Run `make format` after Go source changes.\n- Run `make check` for Go vet and build checks.\n- The Playwright parity test compares served `en`/`de` HTML against `tests/golden/`.\n- Run `make check` for all Go, golden, and Playwright checks.\n- Node.js is only required for `make check`, `make test-ui`, and `make test-debug`.\n- `make check` runs tests, vet, build, and Playwright checks.\n\n## Deployment\n\n```sh\nmake deploy VERSION=\"<version>\"\n```\n\nCI via GitHub Actions (`.github/workflows/`): production deploy on push to `master`, preview deploy on PRs from same repo. Only maintainers can deploy.\n\n## Skills\n\n- `.agents/skills/add-thirdparty-service/` — Load this skill when adding a new 3rd-party service entry.\n- `.agents/skills/add-localization/` — Load this skill when adding a new language translation.\n\n## Quick Workflow for Edits\n\n1. Edit templates under `src/tpl/`\n2. Run `make format` after Go source changes\n3. Run `make build` to produce `public/`\n4. Verify `public/` renders correctly (open `public/index.html`)\n5. Commit source and build output changes\n\n## Contribution Rules\n\n- Bug fixes only for PRs (features discussed via issue first)\n- New 3rd-party service: load the `add-thirdparty-service` skill or manually add entry to `src/includes/yaml/thirdpartyservices.yml` + logo (160×160) to `public/images/third_party_logos/`\n- `cmd/build/` is pure Go; the build has no Node dependency (templates live in `src/tpl/`, rendering via `text/template`)\n- Build outputs expected (do not remove unless intentional): `public/index.html`, `public/css/style.min.css`, `public/js/*.min.js`, `public/js/vendor/`\n- `public/css/vendor/bulma.min.css` is a tracked source file. Re-run `make purge-css` when a change adds Bulma classes the build does not already use.\n- `public/sw.js`, `public/site.webmanifest`, `public/404.html`, `public/robots.txt`, `public/humans.txt`, `public/logo.svg` are tracked source files (not generated)\n- `public/reviews.html` and `public/reviews-data.json` are generated by `tools/reviews-page-generator/` but tracked for convenience\n","tools/reviews-page-generator/readme.md":"# Reviews Page Generator\n\nPulls comments from [GitHub Issue #65](https://github.com/nisrulz/app-privacy-policy-generator/issues/65) and generates a static Guestbook page.\n\n## Quick start\n\nFrom the repo root:\n\n```sh\n❯ make reviews          # uses cached data (if < 1 week old)\n❯ make reviews-force    # re-fetches everything from GitHub\n```\n\n## How it works\n\n1. Fetches comment pages from the GitHub Issues API (paginated, cached as JSON for 1 week)\n2. Downloads and resizes profile pictures (48x48) in parallel\n3. Downloads embedded images in parallel\n4. Converts markdown bodies to HTML, formats timestamps, remaps reactions\n5. Renders `template.mustache` into `public/reviews.html` and `public/reviews-data.json`\n6. Copies downloaded images into `public/profile_pictures/`\n\n## Requirements\n\n- [Go](https://go.dev/dl/) 1.25+\n- All dependencies are in `go.mod`\n\n## Files\n\n| File | What it does |\n|------|-------------|\n| `main.go` | Fetches, processes, renders, and writes output |\n| `go.mod` / `go.sum` | Go module definition |\n| `template.mustache` | Mustache template with `{{ total_comments }}` placeholder |\n| `comments_json/` | Cached API responses |\n| `downloaded_images/` | Raw images pulled from GitHub |\n"},"items":[{"name":"AGENTS.md","path":"AGENTS.md","rawUrl":"https://raw.githubusercontent.com/nisrulz/app-privacy-policy-generator/HEAD/AGENTS.md","title":"AI Agent Protocol & Instructions","category":"root-instruction","format":"markdown","content":"# AGENTS.md\n\n## Project Overview\n\nStatic Vue.js web app that generates privacy policies and Terms & Conditions for Android, iOS, and web apps. The build creates one `index.html` file. It uses no bundler or hot reload. The build toolchain is pure Go (`cmd/build/`): it renders Go `text/template` files, converts YAML to JavaScript, compiles Less, minifies JavaScript, and adds cache-busting values. Node is not required for the build.\n\n## Source Layout\n\n- `src/tpl/` — Go `text/template` files used to build the page; `page.html` is the entry point. The directory contains shared blocks (`head`, `footer`, `mixins`, `meta`, `license-header`, and `css`) plus the page content. Templates use `{{ }}` (Go template delimiters); Vue uses `[[ ]]` delimiters. Put all labels and text through `translate('key')`.\n- `src/locales/` — locale JSON files (one per language); `en.json` is the source of truth; `de.json` also exists; `_flag` key for each locale\n- `src/tpl/mixins.html` — shared template blocks: `modal()`, `outputButtons()`, `attribution()`, `flycricketDeploy()`, `wizardProgress()`, `wizardMobileLogo()`, `wizardSidebar()`; templates are invoked via `{{template \"name\" .}}` (carry the page-data dot) or `{{template \"name\" (dict ...)}}` (map args)\n- `src/tpl/meta.html` — meta partials (`metaBase`, `metaAppDescription`, `metaAuthor`, `metaWebappSupport`, `metaFavicon`, `metaDataTag`, `metaLinkPreview`)\n- `src/tpl/css.html` — CSS includes (inline normalize/bulma, preload sidebar image, stylesheet link)\n- `src/tpl/license-header.html` — GPL license comment block\n- `src/tpl/content.html` — includes all content (wizard, privacy policies, T&C, disclaimer, FAQ, affiliate)\n- `src/tpl/modals.html` — modal wrappers (privacy simple/no-tracking/gdpr, terms, disclaimer, faq)\n- `src/tpl/privacy-simple.html`, `privacy-no-tracking.html`, `privacy-gdpr.html` — privacy policy bodies; all text via `translate('key')`\n- `src/tpl/tn-simple.html` — T&C template; all text via `translate('key')`\n- `src/tpl/wizard-step-1..8.html` — wizard steps; all labels via `translate('key')`\n- `src/tpl/info-modals.html` — Disclaimer/FAQ modals with Vue-controlled visibility; text via `translate('key')`\n- `src/tpl/affiliate-flycricket.html` — Flycricket affiliate integration\n- `src/js/main.js` — Vue app entry point: creates app with 3 composables (`useAppState`, `useWizard`, `useContent`), registers `translate()`, `_updateMeta()`, `switchLocale()` globally\n- `src/js/utils.js` — utility helpers (`convertHtmlToMd`, `getRawHTML`, `getContent`, `getTitle`, `loadInTextView`)\n- `src/js/flycricket.js` — Flycricket form submission helper `window.fc_deploy(bodyContentId)` (single function reused by all modal deploy buttons)\n- `src/includes/yaml/thirdpartyservices.yml` — 3rd-party service definitions (source of truth); supports locale-aware `name_{code}` fields; JS is auto-generated during build\n- `src/includes/vendor/` — vendored third-party assets; each subdirectory mirrors to `public/<subdir>/vendor/` (for example `js/` → `public/js/vendor/`)\n- `src/less/style.less` — Less entry point (`@import`s 6 partials); compiled to CSS by Go build\n- `src/less/_variables.less` — Less variables (`@color-primary`, `@font-sans`, `@border-radius`, etc.)\n- `src/less/_base.less` — Base layout, typography, hero, cards, footer\n- `src/less/_scrollbar.less` — Custom scrollbar styles\n- `src/less/_overrides.less` — Label, button, input, modal, checkbox overrides\n- `src/less/_bg-pattern.less` — `.bg-pattern` SVG data URI background\n- `src/less/_dark.less` — Dark theme overrides\n- `public/site.webmanifest` — PWA manifest (tracked, edit directly)\n- `public/sw.js` — service worker with offline caching (tracked, edit directly)\n- `public/404.html` — custom 404 page (tracked, edit directly)\n- `public/robots.txt` — robots exclusion (tracked, edit directly)\n- `public/humans.txt` — author/tech credits (tracked, edit directly)\n- `public/logo.svg` — SVG logo (tracked, edit directly)\n- `public/images/third_party_logos/` — third-party service logo images (tracked, add via `add-thirdparty-service` skill)\n- `public/images/side_image/` — hero and sidebar graphics (side_image.webp, side_image_dark.webp)\n- `public/images/app_graphics/` — app graphics (404.svg, etc.)\n- `public/images/app_icons/` — UI icons (disclaimer.svg, etc.)\n- `public/favicon*`, `public/apple-touch-icon.png`, `public/android-chrome-*` — favicons and PWA icons\n- `public/reviews.html` — generated reviews page (committed for convenience)\n- `public/reviews-data.json` — generated reviews data (committed for convenience)\n- `public/downloaded_images/` — generated reviews images served as WebP (committed for convenience; source PNGs stay in `tools/reviews-page-generator/downloaded_images/`)\n- `public/profile_pictures/` — reviewer profile pictures (gitignored, generated by reviews tool)\n- `cmd/build/*.go` — Go build toolchain source files (edit to modify build pipeline); includes `serve.go` (HTTP server for local dev)\n- `tests/golden-parity.spec.ts` — served HTML parity tests for English and German\n- `tests/golden/` — golden HTML fixtures used by the Playwright parity tests\n- `tests/` — Playwright E2E tests (Node.js is used only on demand for testing)\n- `tools/reviews-page-generator/` — standalone Go tool that generates the reviews page and its cached data\n- `Makefile` — project commands for formatting, building, serving, testing, and deployment\n\n## Build\n\n```sh\nmake format     # format Go source files\nmake check      # run Go tests, vet, and build checks\nmake build      # equivalent: go run ./cmd/build/\n```\n\nCompiles `src/` → `public/index.html`, `public/css/style.min.css`, `public/js/*.min.js`. Build outputs are tracked. The build is pure Go — no Node/npm dependency.\n\nBuild pipeline:\n1. Go compiles `src/less/style.less` → `public/css/style.min.css` via `toakleaf/less.go`\n2. Go parses `src/includes/yaml/thirdpartyservices.yml` → `public/tmp/thirdpartyservices.js`\n3. Go builds locales registry from `src/locales/` → `public/js/locales.min.js`\n4. Go renders `src/tpl/` (`text/template`, entry `page.html`) → `public/index.html`\n5. Go minifies every `src/js/*.js` and `public/tmp/*.js` to `public/js/<name>.min.js`\n6. Go mirrors each `src/includes/vendor/<type>/` directory to `public/<type>/vendor/`\n7. Per-locale: Go renders HTML with `lang` override; Go generates `locale.min.js`\n8. Cache-busting: `?v=<md5>` appended to all CSS/JS references in HTML files\n\nDev: `make serve` (builds then serves `public/` on port 8000 via Go HTTP server). `public/css/vendor/bulma.min.css` is purged out-of-band: run `make purge-css` after template or Bulma class changes, then `make build`. Node.js is required for `purge-css` only.\n\n## Code Conventions\n\n- **No comments** in source code unless documenting a complex legal rationale\n- **Commit style**: `type(scope): Description`\n- **Vue.js 3** is self-hosted (served from `public/js/vendor/vue.global.prod.js`); uses `[[ ]]` delimiters (configured in `createApp`)\n- **Go `text/template`** files use default `{{ }}` delimiters; Vue `[[ variable ]]` mustache interpolation passes through untouched (Vue.js syntax, not Go template syntax)\n- **Translation**: use `translate('key')` in templates (global method set in `main.js`), not `$t('key')`\n- **Computed properties** in Vue composable `computed()` calls — prefer over inline string matching\n- **Derived text** (e.g. `deviceType`, `platformDesc`) computed inside `generate()` following existing pattern, not watchers\n- **Compile-time flags** are passed as context fields on `pageData` in `cmd/build/render.go`: `Lang`, `Flycricket`, `NoTracking`, `Gdpr`, `ThemeToggle` (always `true` in the current site)\n- **`data-theme`** attribute on `<html>` element; dark mode support via `_dark.less` and `toggleTheme()` in `main.js`\n- **Go 1.25** — toolchain uses `github.com/tdewolff/minify/v2` for JS and `gopkg.in/yaml.v3` for YAML parsing\n\n## Testing\n\nRun these checks:\n\n- Run `make format` after Go source changes.\n- Run `make check` for Go vet and build checks.\n- The Playwright parity test compares served `en`/`de` HTML against `tests/golden/`.\n- Run `make check` for all Go, golden, and Playwright checks.\n- Node.js is only required for `make check`, `make test-ui`, and `make test-debug`.\n- `make check` runs tests, vet, build, and Playwright checks.\n\n## Deployment\n\n```sh\nmake deploy VERSION=\"<version>\"\n```\n\nCI via GitHub Actions (`.github/workflows/`): production deploy on push to `master`, preview deploy on PRs from same repo. Only maintainers can deploy.\n\n## Skills\n\n- `.agents/skills/add-thirdparty-service/` — Load this skill when adding a new 3rd-party service entry.\n- `.agents/skills/add-localization/` — Load this skill when adding a new language translation.\n\n## Quick Workflow for Edits\n\n1. Edit templates under `src/tpl/`\n2. Run `make format` after Go source changes\n3. Run `make build` to produce `public/`\n4. Verify `public/` renders correctly (open `public/index.html`)\n5. Commit source and build output changes\n\n## Contribution Rules\n\n- Bug fixes only for PRs (features discussed via issue first)\n- New 3rd-party service: load the `add-thirdparty-service` skill or manually add entry to `src/includes/yaml/thirdpartyservices.yml` + logo (160×160) to `public/images/third_party_logos/`\n- `cmd/build/` is pure Go; the build has no Node dependency (templates live in `src/tpl/`, rendering via `text/template`)\n- Build outputs expected (do not remove unless intentional): `public/index.html`, `public/css/style.min.css`, `public/js/*.min.js`, `public/js/vendor/`\n- `public/css/vendor/bulma.min.css` is a tracked source file. Re-run `make purge-css` when a change adds Bulma classes the build does not already use.\n- `public/sw.js`, `public/site.webmanifest`, `public/404.html`, `public/robots.txt`, `public/humans.txt`, `public/logo.svg` are tracked source files (not generated)\n- `public/reviews.html` and `public/reviews-data.json` are generated by `tools/reviews-page-generator/` but tracked for convenience\n","isInternal":false,"tokens":2613,"sizeBytes":10094},{"name":"SKILL.md","path":".agents/skills/add-localization/SKILL.md","rawUrl":"https://raw.githubusercontent.com/nisrulz/app-privacy-policy-generator/HEAD/.agents/skills/add-localization/SKILL.md","title":"add-localization","category":"anthropic-skill","format":"markdown","content":"---\nname: add-localization\ndescription: >\n  Add or update a language translation in the privacy policy generator.\n  Trigger when user says: \"add {language} translation\", \"add locale\",\n  \"translate to {language}\", \"add localization for {language}\", or when\n  a user wants to contribute a new language.\n---\n\n# Add Localization\n\n## Quick Steps\n\n### 1. Create locale JSON from English\n\n```sh\ncp src/locales/en.json src/locales/{code}.json\n```\n\nUse the ISO 639-1 language code (e.g., `es`, `fr`, `de`, `ja`, `pt`, `zh`).\n\n### 2. Translate all string values\n\nEdit the new JSON file. **Only translate values, never keys.**\n\n✅ Correct:\n```json\n\"wizard.step1.tagline\": \"Genera un documento personalizado...\"\n```\n\n❌ Wrong — don't change keys:\n```json\n\"wizard.step1.tagline_es\": \"Genera un documento personalizado...\"\n```\n\n### 3. Preserve `{{ variable }}` placeholders\n\nKeep placeholders like `{{ appName }}`, `{{ platformDesc }}`, `{{ deviceType }}` unchanged in the translated text.\n\n### 4. Build\n\n```sh\nmake build\n```\n\nThe Go build tool detects every JSON file in `src/locales/` and generates the HTML and JavaScript for each locale.\n\nOpen `public/index.html` — the language switcher dropdown now includes the new language.\n\n## Validation Checklist\n\n- [ ] JSON file is valid (no trailing commas, no duplicate keys)\n- [ ] All `{{ variable }}` placeholders preserved\n- [ ] UI labels, placeholders, help text translated\n- [ ] Legal templates translated (requires native-speaking legal review)\n- [ ] FAQ and disclaimer content translated\n- [ ] Platform vocabulary translated (device types, OS, browser strings)\n- [ ] Language appears in the dropdown\n- [ ] `make build` succeeds\n- [ ] `make check` passes (Go vet, build, golden, and Playwright checks)\n\n## Important Notes\n\n- **Legal text needs professional review**: Have a native-speaking lawyer review legal template translations.\n- **Don't translate third-party service names** in `thirdpartyservices.yml` — only the `name` field in the locale JSON if you add locale-specific names.\n- **Meta tags** (`meta.*` keys) are updated dynamically via JS after page load.\n","frontmatter":{"name":"add-localization","description":"Add or update a language translation in the privacy policy generator. Trigger when user says: \"add {language} translation\", \"add locale\", \"translate to {language}\", \"add localization for {language}\", or when a user wants to contribute a new language.\n"},"isInternal":false,"tokens":508,"sizeBytes":2113},{"name":"openai.yaml","path":".agents/skills/add-thirdparty-service/agents/openai.yaml","rawUrl":"https://raw.githubusercontent.com/nisrulz/app-privacy-policy-generator/HEAD/.agents/skills/add-thirdparty-service/agents/openai.yaml","title":"Agents Skill","category":"anthropic-skill","format":"yaml","content":"display_name: Add 3rd Party Service\nshort_description: Add a new third-party service entry with YAML config and logo\ndefault_prompt: Add {service_name} as a third-party service\n","isInternal":false,"tokens":40,"sizeBytes":177},{"name":"SKILL.md","path":".agents/skills/add-thirdparty-service/SKILL.md","rawUrl":"https://raw.githubusercontent.com/nisrulz/app-privacy-policy-generator/HEAD/.agents/skills/add-thirdparty-service/SKILL.md","title":"add-thirdparty-service","category":"anthropic-skill","format":"markdown","content":"---\nname: add-thirdparty-service\ndescription: >\n  Add a new third-party service to the privacy policy generator.\n  Trigger when user says: \"add {name} service\", \"add third party service\",\n  \"add 3rd party service\", \"add new service entry\", or when a user\n  wants to contribute a new service to the app.\n---\n\n# Add 3rd Party Service\n\n## Workflow\n\n1. Add YAML entry to `src/includes/yaml/thirdpartyservices.yml`\n2. Add logo image (160×160) to `public/images/third_party_logos/`\n3. Run `make build` to regenerate `public/js/thirdpartyservices.min.js`\n\n## YAML Entry Format\n\n```yml\n- name: Service Name\n  enabled: false\n  logo: images/third_party_logos/name.png\n  link:\n    privacy: https://example.com/privacy\n    terms: https://example.com/terms\n```\n\n## Logo Requirements\n\n- **160×160** pixels\n- Place in `public/images/third_party_logos/`\n- PNG or SVG format\n- Use remove.bg to strip background if needed\n- Use imagetools.org/trim to trim excess space\n\n## Logo Compression\n\nAfter adding the logo, run:\n\n```sh\nmake compress-images\n```\n\nThis compresses all images in `public/images/third_party_logos/` via the compress_images.sh script.\n\n## Validation\n\n```sh\nmake build   # regenerates public/js/thirdpartyservices.min.js from YAML\nmake check   # runs Go vet, build, golden, and Playwright checks\n```\n\nDo NOT edit `public/js/thirdpartyservices.min.js` directly — it is auto-generated from the YAML source.\n","frontmatter":{"name":"add-thirdparty-service","description":"Add a new third-party service to the privacy policy generator. Trigger when user says: \"add {name} service\", \"add third party service\", \"add 3rd party service\", \"add new service entry\", or when a user wants to contribute a new service to the app.\n"},"isInternal":false,"tokens":367,"sizeBytes":1407},{"name":"readme.md","path":"tools/reviews-page-generator/readme.md","rawUrl":"https://raw.githubusercontent.com/nisrulz/app-privacy-policy-generator/HEAD/tools/reviews-page-generator/readme.md","title":"reviews-page-generator Documentation","category":"plugin-manifest","format":"markdown","content":"# Reviews Page Generator\n\nPulls comments from [GitHub Issue #65](https://github.com/nisrulz/app-privacy-policy-generator/issues/65) and generates a static Guestbook page.\n\n## Quick start\n\nFrom the repo root:\n\n```sh\n❯ make reviews          # uses cached data (if < 1 week old)\n❯ make reviews-force    # re-fetches everything from GitHub\n```\n\n## How it works\n\n1. Fetches comment pages from the GitHub Issues API (paginated, cached as JSON for 1 week)\n2. Downloads and resizes profile pictures (48x48) in parallel\n3. Downloads embedded images in parallel\n4. Converts markdown bodies to HTML, formats timestamps, remaps reactions\n5. Renders `template.mustache` into `public/reviews.html` and `public/reviews-data.json`\n6. Copies downloaded images into `public/profile_pictures/`\n\n## Requirements\n\n- [Go](https://go.dev/dl/) 1.25+\n- All dependencies are in `go.mod`\n\n## Files\n\n| File | What it does |\n|------|-------------|\n| `main.go` | Fetches, processes, renders, and writes output |\n| `go.mod` / `go.sum` | Go module definition |\n| `template.mustache` | Mustache template with `{{ total_comments }}` placeholder |\n| `comments_json/` | Cached API responses |\n| `downloaded_images/` | Raw images pulled from GitHub |\n","isInternal":false,"tokens":308,"sizeBytes":1218}],"systemPromptSnippet":"<yakaai_skills repo=\"nisrulz/app-privacy-policy-generator\">\n<!-- File: AGENTS.md (Tokens: ~2613 | Category: root-instruction) -->\n# AGENTS.md\n\n## Project Overview\n\nStatic Vue.js web app that generates privacy policies and Terms & Conditions for Android, iOS, and web apps. The build creates one `index.html` file. It uses no bundler or hot reload. The build toolchain is pure Go (`cmd/build/`): it renders Go `text/template` files, converts YAML to JavaScript, compiles Less, minifies JavaScript, and adds cache-busting values. Node is not required for the build.\n\n## Source Layout\n\n- `src/tpl/` — Go `text/template` files used to build the page; `page.html` is the entry point. The directory contains shared blocks (`head`, `footer`, `mixins`, `meta`, `license-header`, and `css`) plus the page content. Templates use `{{ }}` (Go template delimiters); Vue uses `[[ ]]` delimiters. Put all labels and text through `translate('key')`.\n- `src/locales/` — locale JSON files (one per language); `en.json` is the source of truth; `de.json` also exists; `_flag` key for each locale\n- `src/tpl/mixins.html` — shared template blocks: `modal()`, `outputButtons()`, `attribution()`, `flycricketDeploy()`, `wizardProgress()`, `wizardMobileLogo()`, `wizardSidebar()`; templates are invoked via `{{template \"name\" .}}` (carry the page-data dot) or `{{template \"name\" (dict ...)}}` (map args)\n- `src/tpl/meta.html` — meta partials (`metaBase`, `metaAppDescription`, `metaAuthor`, `metaWebappSupport`, `metaFavicon`, `metaDataTag`, `metaLinkPreview`)\n- `src/tpl/css.html` — CSS includes (inline normalize/bulma, preload sidebar image, stylesheet link)\n- `src/tpl/license-header.html` — GPL license comment block\n- `src/tpl/content.html` — includes all content (wizard, privacy policies, T&C, disclaimer, FAQ, affiliate)\n- `src/tpl/modals.html` — modal wrappers (privacy simple/no-tracking/gdpr, terms, disclaimer, faq)\n- `src/tpl/privacy-simple.html`, `privacy-no-tracking.html`, `privacy-gdpr.html` — privacy policy bodies; all text via `translate('key')`\n- `src/tpl/tn-simple.html` — T&C template; all text via `translate('key')`\n- `src/tpl/wizard-step-1..8.html` — wizard steps; all labels via `translate('key')`\n- `src/tpl/info-modals.html` — Disclaimer/FAQ modals with Vue-controlled visibility; text via `translate('key')`\n- `src/tpl/affiliate-flycricket.html` — Flycricket affiliate integration\n- `src/js/main.js` — Vue app entry point: creates app with 3 composables (`useAppState`, `useWizard`, `useContent`), registers `translate()`, `_updateMeta()`, `switchLocale()` globally\n- `src/js/utils.js` — utility helpers (`convertHtmlToMd`, `getRawHTML`, `getContent`, `getTitle`, `loadInTextView`)\n- `src/js/flycricket.js` — Flycricket form submission helper `window.fc_deploy(bodyContentId)` (single function reused by all modal deploy buttons)\n- `src/includes/yaml/thirdpartyservices.yml` — 3rd-party service definitions (source of truth); supports locale-aware `name_{code}` fields; JS is auto-generated during build\n- `src/includes/vendor/` — vendored third-party assets; each subdirectory mirrors to `public/<subdir>/vendor/` (for example `js/` → `public/js/vendor/`)\n- `src/less/style.less` — Less entry point (`@import`s 6 partials); compiled to CSS by Go build\n- `src/less/_variables.less` — Less variables (`@color-primary`, `@font-sans`, `@border-radius`, etc.)\n- `src/less/_base.less` — Base layout, typography, hero, cards, footer\n- `src/less/_scrollbar.less` — Custom scrollbar styles\n- `src/less/_overrides.less` — Label, button, input, modal, checkbox overrides\n- `src/less/_bg-pattern.less` — `.bg-pattern` SVG data URI background\n- `src/less/_dark.less` — Dark theme overrides\n- `public/site.webmanifest` — PWA manifest (tracked, edit directly)\n- `public/sw.js` — service worker with offline caching (tracked, edit directly)\n- `public/404.html` — custom 404 page (tracked, edit directly)\n- `public/robots.txt` — robots exclusion (tracked, edit directly)\n- `public/humans.txt` — author/tech credits (tracked, edit directly)\n- `public/logo.svg` — SVG logo (tracked, edit directly)\n- `public/images/third_party_logos/` — third-party service logo images (tracked, add via `add-thirdparty-service` skill)\n- `public/images/side_image/` — hero and sidebar graphics (side_image.webp, side_image_dark.webp)\n- `public/images/app_graphics/` — app graphics (404.svg, etc.)\n- `public/images/app_icons/` — UI icons (disclaimer.svg, etc.)\n- `public/favicon*`, `public/apple-touch-icon.png`, `public/android-chrome-*` — favicons and PWA icons\n- `public/reviews.html` — generated reviews page (committed for convenience)\n- `public/reviews-data.json` — generated reviews data (committed for convenience)\n- `public/downloaded_images/` — generated reviews images served as WebP (committed for convenience; source PNGs stay in `tools/reviews-page-generator/downloaded_images/`)\n- `public/profile_pictures/` — reviewer profile pictures (gitignored, generated by reviews tool)\n- `cmd/build/*.go` — Go build toolchain source files (edit to modify build pipeline); includes `serve.go` (HTTP server for local dev)\n- `tests/golden-parity.spec.ts` — served HTML parity tests for English and German\n- `tests/golden/` — golden HTML fixtures used by the Playwright parity tests\n- `tests/` — Playwright E2E tests (Node.js is used only on demand for testing)\n- `tools/reviews-page-generator/` — standalone Go tool that generates the reviews page and its cached data\n- `Makefile` — project commands for formatting, building, serving, testing, and deployment\n\n## Build\n\n```sh\nmake format     # format Go source files\nmake check      # run Go tests, vet, and build checks\nmake build      # equivalent: go run ./cmd/build/\n```\n\nCompiles `src/` → `public/index.html`, `public/css/style.min.css`, `public/js/*.min.js`. Build outputs are tracked. The build is pure Go — no Node/npm dependency.\n\nBuild pipeline:\n1. Go compiles `src/less/style.less` → `public/css/style.min.css` via `toakleaf/less.go`\n2. Go parses `src/includes/yaml/thirdpartyservices.yml` → `public/tmp/thirdpartyservices.js`\n3. Go builds locales registry from `src/locales/` → `public/js/locales.min.js`\n4. Go renders `src/tpl/` (`text/template`, entry `page.html`) → `public/index.html`\n5. Go minifies every `src/js/*.js` and `public/tmp/*.js` to `public/js/<name>.min.js`\n6. Go mirrors each `src/includes/vendor/<type>/` directory to `public/<type>/vendor/`\n7. Per-locale: Go renders HTML with `lang` override; Go generates `locale.min.js`\n8. Cache-busting: `?v=<md5>` appended to all CSS/JS references in HTML files\n\nDev: `make serve` (builds then serves `public/` on port 8000 via Go HTTP server). `public/css/vendor/bulma.min.css` is purged out-of-band: run `make purge-css` after template or Bulma class changes, then `make build`. Node.js is required for `purge-css` only.\n\n## Code Conventions\n\n- **No comments** in source code unless documenting a complex legal rationale\n- **Commit style**: `type(scope): Description`\n- **Vue.js 3** is self-hosted (served from `public/js/vendor/vue.global.prod.js`); uses `[[ ]]` delimiters (configured in `createApp`)\n- **Go `text/template`** files use default `{{ }}` delimiters; Vue `[[ variable ]]` mustache interpolation passes through untouched (Vue.js syntax, not Go template syntax)\n- **Translation**: use `translate('key')` in templates (global method set in `main.js`), not `$t('key')`\n- **Computed properties** in Vue composable `computed()` calls — prefer over inline string matching\n- **Derived text** (e.g. `deviceType`, `platformDesc`) computed inside `generate()` following existing pattern, not watchers\n- **Compile-time flags** are passed as context fields on `pageData` in `cmd/build/render.go`: `Lang`, `Flycricket`, `NoTracking`, `Gdpr`, `ThemeToggle` (always `true` in the current site)\n- **`data-theme`** attribute on `<html>` element; dark mode support via `_dark.less` and `toggleTheme()` in `main.js`\n- **Go 1.25** — toolchain uses `github.com/tdewolff/minify/v2` for JS and `gopkg.in/yaml.v3` for YAML parsing\n\n## Testing\n\nRun these checks:\n\n- Run `make format` after Go source changes.\n- Run `make check` for Go vet and build checks.\n- The Playwright parity test compares served `en`/`de` HTML against `tests/golden/`.\n- Run `make check` for all Go, golden, and Playwright checks.\n- Node.js is only required for `make check`, `make test-ui`, and `make test-debug`.\n- `make check` runs tests, vet, build, and Playwright checks.\n\n## Deployment\n\n```sh\nmake deploy VERSION=\"<version>\"\n```\n\nCI via GitHub Actions (`.github/workflows/`): production deploy on push to `master`, preview deploy on PRs from same repo. Only maintainers can deploy.\n\n## Skills\n\n- `.agents/skills/add-thirdparty-service/` — Load this skill when adding a new 3rd-party service entry.\n- `.agents/skills/add-localization/` — Load this skill when adding a new language translation.\n\n## Quick Workflow for Edits\n\n1. Edit templates under `src/tpl/`\n2. Run `make format` after Go source changes\n3. Run `make build` to produce `public/`\n4. Verify `public/` renders correctly (open `public/index.html`)\n5. Commit source and build output changes\n\n## Contribution Rules\n\n- Bug fixes only for PRs (features discussed via issue first)\n- New 3rd-party service: load the `add-thirdparty-service` skill or manually add entry to `src/includes/yaml/thirdpartyservices.yml` + logo (160×160) to `public/images/third_party_logos/`\n- `cmd/build/` is pure Go; the build has no Node dependency (templates live in `src/tpl/`, rendering via `text/template`)\n- Build outputs expected (do not remove unless intentional): `public/index.html`, `public/css/style.min.css`, `public/js/*.min.js`, `public/js/vendor/`\n- `public/css/vendor/bulma.min.css` is a tracked source file. Re-run `make purge-css` when a change adds Bulma classes the build does not already use.\n- `public/sw.js`, `public/site.webmanifest`, `public/404.html`, `public/robots.txt`, `public/humans.txt`, `public/logo.svg` are tracked source files (not generated)\n- `public/reviews.html` and `public/reviews-data.json` are generated by `tools/reviews-page-generator/` but tracked for convenience\n\n<!-- File: .agents/skills/add-localization/SKILL.md (Tokens: ~508 | Category: anthropic-skill) -->\n---\nname: add-localization\ndescription: >\n  Add or update a language translation in the privacy policy generator.\n  Trigger when user says: \"add {language} translation\", \"add locale\",\n  \"translate to {language}\", \"add localization for {language}\", or when\n  a user wants to contribute a new language.\n---\n\n# Add Localization\n\n## Quick Steps\n\n### 1. Create locale JSON from English\n\n```sh\ncp src/locales/en.json src/locales/{code}.json\n```\n\nUse the ISO 639-1 language code (e.g., `es`, `fr`, `de`, `ja`, `pt`, `zh`).\n\n### 2. Translate all string values\n\nEdit the new JSON file. **Only translate values, never keys.**\n\n✅ Correct:\n```json\n\"wizard.step1.tagline\": \"Genera un documento personalizado...\"\n```\n\n❌ Wrong — don't change keys:\n```json\n\"wizard.step1.tagline_es\": \"Genera un documento personalizado...\"\n```\n\n### 3. Preserve `{{ variable }}` placeholders\n\nKeep placeholders like `{{ appName }}`, `{{ platformDesc }}`, `{{ deviceType }}` unchanged in the translated text.\n\n### 4. Build\n\n```sh\nmake build\n```\n\nThe Go build tool detects every JSON file in `src/locales/` and generates the HTML and JavaScript for each locale.\n\nOpen `public/index.html` — the language switcher dropdown now includes the new language.\n\n## Validation Checklist\n\n- [ ] JSON file is valid (no trailing commas, no duplicate keys)\n- [ ] All `{{ variable }}` placeholders preserved\n- [ ] UI labels, placeholders, help text translated\n- [ ] Legal templates translated (requires native-speaking legal review)\n- [ ] FAQ and disclaimer content translated\n- [ ] Platform vocabulary translated (device types, OS, browser strings)\n- [ ] Language appears in the dropdown\n- [ ] `make build` succeeds\n- [ ] `make check` passes (Go vet, build, golden, and Playwright checks)\n\n## Important Notes\n\n- **Legal text needs professional review**: Have a native-speaking lawyer review legal template translations.\n- **Don't translate third-party service names** in `thirdpartyservices.yml` — only the `name` field in the locale JSON if you add locale-specific names.\n- **Meta tags** (`meta.*` keys) are updated dynamically via JS after page load.\n\n<!-- File: .agents/skills/add-thirdparty-service/agents/openai.yaml (Tokens: ~40 | Category: anthropic-skill) -->\ndisplay_name: Add 3rd Party Service\nshort_description: Add a new third-party service entry with YAML config and logo\ndefault_prompt: Add {service_name} as a third-party service\n\n<!-- File: .agents/skills/add-thirdparty-service/SKILL.md (Tokens: ~367 | Category: anthropic-skill) -->\n---\nname: add-thirdparty-service\ndescription: >\n  Add a new third-party service to the privacy policy generator.\n  Trigger when user says: \"add {name} service\", \"add third party service\",\n  \"add 3rd party service\", \"add new service entry\", or when a user\n  wants to contribute a new service to the app.\n---\n\n# Add 3rd Party Service\n\n## Workflow\n\n1. Add YAML entry to `src/includes/yaml/thirdpartyservices.yml`\n2. Add logo image (160×160) to `public/images/third_party_logos/`\n3. Run `make build` to regenerate `public/js/thirdpartyservices.min.js`\n\n## YAML Entry Format\n\n```yml\n- name: Service Name\n  enabled: false\n  logo: images/third_party_logos/name.png\n  link:\n    privacy: https://example.com/privacy\n    terms: https://example.com/terms\n```\n\n## Logo Requirements\n\n- **160×160** pixels\n- Place in `public/images/third_party_logos/`\n- PNG or SVG format\n- Use remove.bg to strip background if needed\n- Use imagetools.org/trim to trim excess space\n\n## Logo Compression\n\nAfter adding the logo, run:\n\n```sh\nmake compress-images\n```\n\nThis compresses all images in `public/images/third_party_logos/` via the compress_images.sh script.\n\n## Validation\n\n```sh\nmake build   # regenerates public/js/thirdpartyservices.min.js from YAML\nmake check   # runs Go vet, build, golden, and Playwright checks\n```\n\nDo NOT edit `public/js/thirdpartyservices.min.js` directly — it is auto-generated from the YAML source.\n\n<!-- File: tools/reviews-page-generator/readme.md (Tokens: ~308 | Category: plugin-manifest) -->\n# Reviews Page Generator\n\nPulls comments from [GitHub Issue #65](https://github.com/nisrulz/app-privacy-policy-generator/issues/65) and generates a static Guestbook page.\n\n## Quick start\n\nFrom the repo root:\n\n```sh\n❯ make reviews          # uses cached data (if < 1 week old)\n❯ make reviews-force    # re-fetches everything from GitHub\n```\n\n## How it works\n\n1. Fetches comment pages from the GitHub Issues API (paginated, cached as JSON for 1 week)\n2. Downloads and resizes profile pictures (48x48) in parallel\n3. Downloads embedded images in parallel\n4. Converts markdown bodies to HTML, formats timestamps, remaps reactions\n5. Renders `template.mustache` into `public/reviews.html` and `public/reviews-data.json`\n6. Copies downloaded images into `public/profile_pictures/`\n\n## Requirements\n\n- [Go](https://go.dev/dl/) 1.25+\n- All dependencies are in `go.mod`\n\n## Files\n\n| File | What it does |\n|------|-------------|\n| `main.go` | Fetches, processes, renders, and writes output |\n| `go.mod` / `go.sum` | Go module definition |\n| `template.mustache` | Mustache template with `{{ total_comments }}` placeholder |\n| `comments_json/` | Cached API responses |\n| `downloaded_images/` | Raw images pulled from GitHub |\n</yakaai_skills>"}