Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
67 commits
Select commit Hold shift + click to select a range
2402ff5
chore: add typecheck, tests, lint and CI safety net
fabioassuncao Aug 10, 2026
0319985
style: apply Prettier across the repo
fabioassuncao Aug 10, 2026
64842d8
fix: escape generated snippets, block unsafe URLs, pin the CDN version
fabioassuncao Aug 10, 2026
22f6674
refactor: move to apps/ + packages/ layout
fabioassuncao Aug 10, 2026
d082fea
refactor(web): semantic design tokens and shared UI primitives
fabioassuncao Aug 10, 2026
d64d20e
feat(web): turn the site into a tool platform
fabioassuncao Aug 10, 2026
78b98dc
refactor: single source of truth for channel presets
fabioassuncao Aug 10, 2026
1765128
refactor: extract @codions/tools-core, minify inlined CSS
fabioassuncao Aug 10, 2026
0506085
feat: add the Consent & Privacy Manager
fabioassuncao Aug 10, 2026
e625e3d
docs: rewrite for the platform; split release and deploy workflows
fabioassuncao Aug 10, 2026
f1418fe
docs: record the one visible behavioural change
fabioassuncao Aug 10, 2026
dd66c94
docs: record the reference projects studied for the consent manager
fabioassuncao Aug 10, 2026
5509b65
docs: add DEPLOYMENT.md covering the site and the packages
fabioassuncao Aug 10, 2026
52a1bc4
chore: rename to codions-tools, target tools.codions.dev, add ROADMAP
fabioassuncao Aug 10, 2026
a7b3c16
docs: update trusted publisher for the renamed repository
fabioassuncao Aug 10, 2026
c37a453
chore: migrate to Nuxt 4, update project structure, and enhance docum…
fabioassuncao Aug 10, 2026
436c576
chore: update deployment workflow and enhance consent manager code
fabioassuncao Aug 10, 2026
f32f9d2
feat(roadmap): implement Fase C — plataforma de pixel único
fabioassuncao Aug 10, 2026
395a5fa
docs: add CLAUDE.md for project guidance and commands
fabioassuncao Aug 10, 2026
b03f778
style: apply Prettier to roadmap docs
fabioassuncao Aug 10, 2026
f8f2fea
feat(pixel): D1 codions-tools-app + schema inicial (users, sites, sit…
fabioassuncao Aug 10, 2026
ab9c188
feat(pixel): KV codions-tools-sessions para tokens de login e sessões
fabioassuncao Aug 10, 2026
0eea96d
docs(pixel): registrar bloqueio da etapa 1.3 (escopo OAuth do Wrangler)
fabioassuncao Aug 10, 2026
b877f0c
feat(pixel): envio de e-mail habilitado (send_email/EMAIL) em tools.c…
fabioassuncao Aug 10, 2026
e060616
feat(pixel): login por link mágico (POST /api/auth/request, GET /auth…
fabioassuncao Aug 10, 2026
cf89ce3
fix(pixel): normalize email before rate-limiting the login request
fabioassuncao Aug 10, 2026
920a461
feat(pixel): catálogo de ferramentas (tool-catalog.ts)
fabioassuncao Aug 10, 2026
3e8bacb
feat(pixel): rota GET /p/:siteKey servindo o bundle combinado
fabioassuncao Aug 10, 2026
939e389
feat(pixel): painel — catálogo de sites (listar, criar, gerar site key)
fabioassuncao Aug 10, 2026
54e772d
feat(pixel): painel — detalhe do site (snippet, toggle de ferramentas…
fabioassuncao Aug 10, 2026
c754d70
feat(pixel): reaproveitar ConfigPanel.vue no painel (useSiteToolConfig)
fabioassuncao Aug 11, 2026
9d4ea19
docs(pixel): confirmar etapa 1.10 — migração sem código novo
fabioassuncao Aug 11, 2026
e9826d0
feat(pixel): validação ponta a ponta — Fase 1 concluída
fabioassuncao Aug 11, 2026
4186119
feat(pixel): tabela tool_metrics — contadores agregados no D1
fabioassuncao Aug 11, 2026
6e7d9a0
feat(pixel): endpoint de beacon POST /api/t
fabioassuncao Aug 11, 2026
e1058ee
feat(pixel): módulo de telemetria opcional em packages/core
fabioassuncao Aug 11, 2026
912898f
feat(pixel): aba de métricas no painel, por site e por ferramenta
fabioassuncao Aug 11, 2026
4b0cbff
feat(pixel): Anúncio / barra informativa — primeira ferramenta da Fase 3
fabioassuncao Aug 11, 2026
49be6d0
feat(pixel): Atividade recente — segunda ferramenta da Fase 3
fabioassuncao Aug 11, 2026
b4ad160
feat(pixel): Contador ao vivo — terceira ferramenta da Fase 3
fabioassuncao Aug 11, 2026
28e9e9c
feat(reviews): carrossel/grade de depoimentos — quarta ferramenta da …
fabioassuncao Aug 11, 2026
7d74a5f
feat(coupon): código de desconto copiável com contador regressivo — q…
fabioassuncao Aug 11, 2026
651154a
feat(email-collector): formulário de captura de e-mail — sexta e últi…
fabioassuncao Aug 11, 2026
87d153d
docs(roadmap): etapa 4.2 bloqueada — escopo da API Cloudflare insufic…
fabioassuncao Aug 11, 2026
ddf8e15
feat(core): telemetria respeita o Consent Manager quando os dois estã…
fabioassuncao Aug 11, 2026
5e4b3a5
feat(web): política de privacidade real — última etapa do roadmap
fabioassuncao Aug 11, 2026
a0fdc42
fix(docs): corrigir aninhamento de colons MDC — layout quebrando full…
fabioassuncao Aug 11, 2026
290135f
feat(platform): commitar migração Drizzle, control-first e reorganiza…
fabioassuncao Aug 11, 2026
06fa5d5
fix(email-collector): padronizar zIndex para 100
fabioassuncao Aug 11, 2026
1533688
feat(metrics): aplicar migração de label em tool_metrics + tradutor d…
fabioassuncao Aug 11, 2026
133b6a4
feat(telemetry): payload estruturado (label) + instrumentar floating-…
fabioassuncao Aug 11, 2026
d9eb470
feat(pixel): remover auto-inicialização standalone dos 8 cdn.ts
fabioassuncao Aug 11, 2026
1fff89c
fix(auth): hash de token/sessão no KV + logout
fabioassuncao Aug 11, 2026
4b5c8ef
docs(roadmap): corrigir §11 item 21 — logout de uma sessão já existe
fabioassuncao Aug 11, 2026
4d354d7
docs(roadmap): corrigir §10.12 — comunicação pixel↔plataforma já conc…
fabioassuncao Aug 11, 2026
f48f10e
feat(core): definir o eixo layout formal (tipos)
fabioassuncao Aug 11, 2026
77659b6
feat(core): motor genérico de exibição (gatilho + URL + frequência)
fabioassuncao Aug 11, 2026
813d22e
feat(sites): verificação de domínio via meta tag + guard no pixel
fabioassuncao Aug 11, 2026
bfe19dc
feat(ci): authz-check.mjs — impõe getOwnedSite por CI, não só disciplina
fabioassuncao Aug 11, 2026
d6cfc0e
feat(campaigns): fundação de agendamento e regras de exibição
fabioassuncao Aug 11, 2026
09edb95
feat(request-collector): portar o primeiro widget P1 pendente
fabioassuncao Aug 11, 2026
c000e83
feat(api): API pública /v1/ de métricas + fecha o SSRF de webhookUrl
fabioassuncao Aug 11, 2026
fbd834a
feat(painel): /painel/conta com logout + link de entrada no AppHeader
fabioassuncao Aug 11, 2026
f84b889
feat(home): reescrever a página inicial com a taxonomia de 5 categorias
fabioassuncao Aug 11, 2026
b32cc89
feat(legal): Termos de Uso — fecha os 3 lugares do ADR-0042
fabioassuncao Aug 11, 2026
756aeb1
feat(database): consolida as 8 migrations históricas em 0001_schema_i…
fabioassuncao Aug 12, 2026
b85eab5
refactor(server): reorganiza server/ em modules/+controllers, move in…
fabioassuncao Aug 12, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
30 changes: 0 additions & 30 deletions .github/workflows/build.yml

This file was deleted.

63 changes: 63 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
name: CI

on:
pull_request:
push:
branches: [main]

concurrency:
group: ci-${{ github.ref }}
cancel-in-progress: true

jobs:
verify:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v4

- uses: actions/setup-node@v4
with:
node-version-file: .nvmrc
cache: npm

- run: npm ci

# Runtimes first: the web app type-checks against their generated .d.ts, and
# the bundle contract test asserts against dist/.
- name: Build runtimes
run: npm run build:runtimes

- name: Typecheck
run: npm run typecheck

- name: Lint
run: npm run lint

- name: Format check
run: npm run format:check

- name: Build site
run: npm run build:web

- name: Test
run: npm test

# These bundles load on other people's sites; growth should be a decision.
- name: Bundle size budget
run: npm run size

# Every handler under api/sites/[siteId]/** must check ownership before any
# other query (ADR-0026) — catches a new widget's route copied from an existing
# one with the getOwnedSite() call forgotten.
- name: Ownership check
run: npm run authz-check

# The CDN URL pasted into third-party sites points at this exact path.
- name: Check published bundle path
run: test -f packages/floating-contact-button/dist/floating-contact.min.js

# The package README used to be copied from the repo root at publish time.
# Now that the root README describes the platform, the package must ship its own.
- name: Check package README ships with the tool docs
run: grep -q '@codions/floating-contact-button' packages/floating-contact-button/README.md
45 changes: 45 additions & 0 deletions .github/workflows/deploy.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
name: Deploy

# Nuxt SSR runs in a Cloudflare Worker; static files use Workers Assets.
#
# Triggered by CI finishing on main rather than by the push itself, so a commit
# that fails lint/typecheck/tests never reaches production — see the CI workflow's
# `verify` job. `workflow_dispatch` stays for a manual re-deploy of the last green
# commit without needing a new push.
on:
workflow_dispatch:
workflow_run:
workflows: [CI]
types: [completed]
branches: [main]

# `cancel-in-progress: false`: a running deploy must finish, not be pre-empted by a
# newer commit's deploy starting out of order and leaving main on an older build.
concurrency:
group: deploy-${{ github.ref }}
cancel-in-progress: false

jobs:
deploy:
if: github.event_name == 'workflow_dispatch' || github.event.workflow_run.conclusion == 'success'
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v4
with:
ref: ${{ github.event.workflow_run.head_sha || github.sha }}

- uses: actions/setup-node@v4
with:
node-version-file: .nvmrc
cache: npm

- run: npm ci

- run: npm run build

- name: Deploy to Cloudflare
run: npx wrangler deploy
env:
CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}
CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
36 changes: 36 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
name: Release

# Publishing is driven by GitHub Releases, not by pushes: cutting a release is a
# deliberate act. CI (ci.yml) covers every pull request and push to main.
on:
release:
types: [published]

permissions:
id-token: write

jobs:
publish:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v4

- uses: actions/setup-node@v4
with:
node-version-file: .nvmrc
cache: npm
registry-url: 'https://registry.npmjs.org'

- run: npm ci

- run: npm run build

- name: Test
run: npm test

# Only the Floating Contact Button is published today. The consent manager is
# marked private until its API settles; flipping that is a one-line change in
# its package.json plus a line here.
- name: Publish @codions/floating-contact-button
run: npm publish -w packages/floating-contact-button --provenance --access public
20 changes: 13 additions & 7 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,12 +1,18 @@
node_modules
.DS_Store
*.tgz
.wrangler
.nuxt
.output
.data
.playwright-cli
output/playwright

# Root build outputs (CDN / GitHub Pages deployment)
/dist
/docs
# Build outputs
apps/*/dist
packages/*/dist

# Package build outputs
packages/lib/dist
packages/lib/README.md
packages/docs/dist
# Third-party static clone kept locally for reference/evidence only — see
# roadmap/06-widgets/README.md. Not our source, never committed (includes its own
# nested .git and is not ours to distribute).
roadmap/_references
1 change: 1 addition & 0 deletions .nvmrc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
24
9 changes: 9 additions & 0 deletions .prettierignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
dist
node_modules
package-lock.json
.wrangler
CHANGELOG.md
**/worker-configuration.d.ts
# Third-party static clone kept for reference/evidence only — see
# roadmap/06-widgets/README.md. Not our source, never formatted.
roadmap/_references
7 changes: 7 additions & 0 deletions .prettierrc.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"semi": false,
"singleQuote": true,
"printWidth": 100,
"trailingComma": "all",
"arrowParens": "always"
}
Loading
Loading