Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
186 commits
Select commit Hold shift + click to select a range
c09e4a0
feat: secure autonomous outbound workflow
salim4n Aug 4, 2026
8dd54f4
feat: select WhatsApp account per workspace
salim4n Aug 4, 2026
edad4bd
feat: reassess WhatsApp after account selection
salim4n Aug 4, 2026
fd984da
feat: add durable WhatsApp sourcing
salim4n Aug 5, 2026
f06fb12
chore: stop tracking python cache and agent tool directories
Aug 7, 2026
564d816
docs(product): ready fiches F-010/F-022/F-024/F-026, completion F-011…
Aug 7, 2026
1dc80b7
feat(backend): F-011 canonical ICP container with immutable versions
Aug 7, 2026
09f0c81
feat(backend): F-010 offers with immutable published versions
Aug 7, 2026
5b6312e
feat(web): F-010/F-011 ICP and offers pages
Aug 7, 2026
142e941
feat(web): F-020/F-021 CRM navigation, cursor pagination, shared states
Aug 7, 2026
d941807
docs: document dev -> preprod -> prod branch flow
Aug 7, 2026
857888a
ci: run bun run check on dev/preprod/prod
Aug 7, 2026
508c508
fix: export offer database schema
Aug 7, 2026
10dc04c
docs(product): restore fiche updates F-011/F-020/F-021 + catalog links
Aug 7, 2026
a16cbe7
feat(web): restore F-010/F-011/CRM tracked-file changes
Aug 7, 2026
b0f2152
feat(backend): restore F-010/F-011 tracked-file changes
Aug 7, 2026
a45df05
feat(crm): add company filters and contact mutations
Aug 7, 2026
3939644
feat(web): complete CRM filters and editing
Aug 7, 2026
3f24158
feat(infrastructure): dispatch outbox events and audit sensitive actions
Aug 7, 2026
a1e23d2
feat(crm): complete suppression endpoints
Aug 7, 2026
a0803dc
fix(crm): scope contact import blocks to global suppressions
Aug 7, 2026
5ccd294
feat(web): add suppression management UI
Aug 7, 2026
4142a44
fix(web): clarify channel suppression semantics
Aug 7, 2026
e571788
feat(crm): add idempotent csv imports
Aug 7, 2026
1eae195
feat(web): add CSV import workflow
Aug 7, 2026
d46f734
feat(crm): add reversible contact merges
Aug 7, 2026
a53272d
fix(api): allow csv uploads up to 12 MiB
Aug 7, 2026
188e941
fix(contracts): make offer claim ids optional
Aug 7, 2026
bef0719
feat(web): add duplicate merge review UI
Aug 7, 2026
54049be
docs(product): add F-012 messaging strategy fiche, complete F-023 DoR…
Aug 7, 2026
1a0b7a9
feat(messaging): add strategy and AI policy version foundations
Aug 8, 2026
7977136
feat(messaging): publish strategy and AI policy versions
Aug 8, 2026
6771fc7
feat(web): add messaging strategy and AI policy UI
Aug 8, 2026
d09e7fd
feat(discovery): harden Unipile prospect source contract
Aug 8, 2026
a287ec4
feat(discovery): import prospects with provenance and suppression checks
Aug 8, 2026
9515477
docs(product): add F-031 campaigns fiche, complete F-030 DoR + catalo…
Aug 8, 2026
672d826
feat(web): add discovery run and candidate import UI
Aug 8, 2026
58bee23
feat(web): handle discovery permission errors
Aug 8, 2026
8befe7a
feat(sequences): enforce immutable version publication rules
Aug 8, 2026
fc58f52
feat(web): add versioned sequence editor
Aug 8, 2026
c82535c
feat(campaigns): add immutable snapshot lifecycle and preflight
Aug 8, 2026
4875113
docs(product): add F-032/F-033/F-034/F-035 fiches (Wave 3 execution) …
Aug 8, 2026
18d103c
feat(web): add campaign builder and lifecycle UI
Aug 8, 2026
db56241
docs(product): ratify domain events F-032/F-033/F-035 in traceability…
Aug 8, 2026
1d2641c
docs(product): ratify CampaignPaused/Resumed/Archived events (F-031)
Aug 8, 2026
bfc8193
feat(accounts): add encrypted connected Unipile accounts
Aug 8, 2026
e4cd4fb
feat(web): add connected accounts integrations UI
Aug 8, 2026
4d212af
feat(campaigns): add deterministic population enrollment
Aug 8, 2026
faac548
feat(web): add campaign population enrollment UI
Aug 8, 2026
a7fbaa3
feat(approvals): add generic approval queue
Aug 8, 2026
c298c05
feat(web): add approval queue and decision UI
Aug 8, 2026
005f394
feat(scheduler): add idempotent outreach execution
Aug 8, 2026
5645457
feat(web): add campaign outreach actions timeline
Aug 8, 2026
de2e86d
merge: consolidate AionUI and outbound autopilot
salim4n Aug 8, 2026
f13faed
fix: restore messaging supervision API routes
salim4n Aug 8, 2026
bbd216a
docs: align autopilot positioning, actualize feature statuses and README
Aug 8, 2026
6a4ec73
fix(integration): restore hardened workflow invariants
Aug 8, 2026
6bc345a
ci: install Playwright Chromium for crawler checks
Aug 8, 2026
2b2fc09
ci: isolate integration database from migration database
Aug 8, 2026
9841ab8
docs(product): fiches DoR F-025 enrichissement et F-027 signaux + lie…
Aug 8, 2026
f66cf2a
feat(enrichment): add provenance and idempotent jobs
Aug 8, 2026
8f62936
feat(web): add prospect enrichment coordinates
Aug 8, 2026
07d9fd1
feat(signals): add intent signal collection
Aug 8, 2026
7ebcd81
feat(web): add intent signals to CRM
Aug 9, 2026
370ed7e
docs(product): statuts F-025 et F-027 livrés (chantier 7)
Aug 9, 2026
33aaf26
docs(product): fiche DoR F-051 analytics + statut et lien catalogue
Aug 9, 2026
be8e73c
fix(signals): persist workspace signal settings
Aug 9, 2026
98c6177
feat(analytics): add deterministic workspace analytics
Aug 9, 2026
5e9f94a
fix(signals): scope intent evidence to target
salim4n Aug 9, 2026
d7f69f4
feat(web): add workspace analytics dashboard
Aug 9, 2026
b0ef73d
docs(product): F-051 — drill-down différé hors périmètre (agrégats un…
Aug 9, 2026
20e343a
fix(analytics): project breakdown facts by dimension
Aug 9, 2026
f09a986
fix(web): show unavailable analytics metrics
Aug 9, 2026
d7b01a8
docs(product): statut F-051 analytics livré (chantier 8)
Aug 9, 2026
fc8f19b
fix(research): serialize fanout finalizer commits
Aug 9, 2026
8f33f6b
docs(product): fiches DoR F-002 workspaces/membres et F-053 paramètre…
Aug 9, 2026
af5eaed
docs(product): F-051 — état d'implémentation livré (chantier 8)
Aug 9, 2026
4b273e7
docs(product): fiches DoR F-035-suite (onboarding/quotas/alertes) et …
Aug 9, 2026
629457d
docs: documenter bun run test:integration comme seul chemin supporté
Aug 9, 2026
ed64551
docs(product): fiches DoR F-050 sources de connaissance et AI-140 éva…
Aug 9, 2026
f831c9b
docs(product): fiches DoR F-003 console opérateur, F-043 calendrier, …
Aug 9, 2026
9df9263
feat(accounts): add onboarding quotas and health alerts
Aug 9, 2026
259e2b7
feat(web): add connected account onboarding alerts
Aug 9, 2026
3e67d6f
docs(product): F-035 suite onboarding/quotas/alertes livrée (chantier 9)
Aug 9, 2026
df26cf9
feat(pipeline): complete opportunity lifecycle and forecasts
Aug 9, 2026
e039391
test(pipeline): clean immutable opportunity histories safely
Aug 9, 2026
99e10ad
feat(web): complete pipeline opportunity workflow
Aug 9, 2026
0a328b9
docs(product): F-044 pipeline livré (chantier 10)
Aug 9, 2026
381f0f8
feat(workspaces): add member invitations and role administration
Aug 9, 2026
4d697dd
fix(tests): reset isolated integration database
salim4n Aug 9, 2026
2037b73
feat(workspaces): complete team administration flows
salim4n Aug 9, 2026
e158dd9
feat: deliver workspace security settings
salim4n Aug 9, 2026
dc7f608
feat: deliver verified knowledge sources
salim4n Aug 9, 2026
44b9dad
feat: deliver continuous AI evaluation
salim4n Aug 9, 2026
27910b0
feat: deliver operator console
salim4n Aug 9, 2026
fa4ce69
feat: complete calendar product
salim4n Aug 9, 2026
ff04220
feat: deliver resumable workspace onboarding
salim4n Aug 9, 2026
c2ce819
fix(integrations): connect Unipile hosted auth callbacks
salim4n Aug 10, 2026
e95821d
docs(perf): record local capacity baseline
salim4n Aug 11, 2026
c7901ec
feat(agent): add durable prospect decisions
salim4n Aug 13, 2026
0d5fa69
docs(agent): document durable outbound architecture
salim4n Aug 13, 2026
c3134dd
fix(agent): preserve campaign context in dry runs
salim4n Aug 13, 2026
4c3822a
fix(worker): isolate prospect decisions from research
salim4n Aug 13, 2026
2142c21
ci: validate pull requests targeting dev
salim4n Aug 13, 2026
edc1b13
docs(qa): record agentic release qualification
salim4n Aug 13, 2026
d7017f0
fix(outreach): serialize replies with provider sends
salim4n Aug 13, 2026
13eb9ee
fix(crawler): report completed pages after crawl
salim4n Aug 16, 2026
aacf343
test(crawler): assert API progress projection
salim4n Aug 16, 2026
f473ae5
fix(inbox): distinguish campaign and outside conversations
salim4n Aug 16, 2026
4828456
fix(integrations): support LinkedIn hosted auth callbacks
salim4n Aug 16, 2026
727734c
fix(unipile): reconcile existing connected accounts
salim4n Aug 16, 2026
258fdd9
feat(onboarding): provision autopilot policy automatically
salim4n Aug 16, 2026
a8c2692
feat(autopilot): remove human approval gate
salim4n Aug 16, 2026
a6f27e7
chore(deploy): add production VPS bundle
salim4n Aug 16, 2026
a2cff74
chore(deploy): add provider readiness check
salim4n Aug 16, 2026
78f20da
fix(deploy): run bundled migration entrypoint
salim4n Aug 16, 2026
aa197d7
chore(deploy): validate production environment
salim4n Aug 16, 2026
9d543e3
chore(deploy): add explicit Unipile canary
salim4n Aug 16, 2026
234bde9
chore(deploy): automate VPS release
salim4n Aug 16, 2026
463156b
fix(deploy): honor alternate environment file
salim4n Aug 16, 2026
f7be5a6
feat(outbound): ship operational workspace redesign
salim4n Aug 18, 2026
dcd9c0a
feat(outbound): simplify autonomous prospecting loop
salim4n Aug 18, 2026
b58f750
feat(outbound): simplify ICP launch and acceptance path
salim4n Aug 18, 2026
f7cb00e
feat: improve autonomous prospect sourcing
salim4n Aug 18, 2026
b8efbf8
feat: add evidence-led editorial review
salim4n Aug 18, 2026
f709769
docs: define Noosphere inbound architecture and backlog
salim4n Aug 20, 2026
3fead25
docs: validate Noosphere experience architecture
salim4n Aug 20, 2026
13d32b0
Merge pull request #19 from IgnitionAI/docs/noosphere-inbound-backlog
salim4n Aug 20, 2026
c023963
feat(noosphere): add axis and today cockpit
salim4n Aug 20, 2026
ca238fe
Merge pull request #24 from IgnitionAI/feat/noosphere-lot-0
salim4n Aug 20, 2026
213e9e8
feat(noosphere): compose outbound workspace surfaces
salim4n Aug 20, 2026
0d29d3c
Merge pull request #30 from IgnitionAI/feat/noosphere-lot-1
salim4n Aug 20, 2026
9c265ff
feat(inbound): derive grounded editorial strategy
salim4n Aug 20, 2026
214ecb7
test(noosphere): stabilize workspace login journey
salim4n Aug 20, 2026
bbb7d18
Merge pull request #37 from IgnitionAI/feat/noosphere-strategy-34
salim4n Aug 20, 2026
37886f1
feat(content): add durable sourced idea radar
salim4n Aug 20, 2026
2dd69a2
Merge pull request #38 from IgnitionAI/feat/noosphere-ideas-31
salim4n Aug 20, 2026
54be021
feat(content): add grounded LinkedIn writing pipeline
salim4n Aug 20, 2026
1e41a12
CNT-101: grounded LinkedIn content pipeline (#39)
salim4n Aug 20, 2026
75284cd
feat(content): add LinkedIn social publisher port
salim4n Aug 20, 2026
4d05d87
Merge pull request #40 from IgnitionAI/feat/noosphere-linkedin-publis…
salim4n Aug 20, 2026
2ea87f6
feat(content): add durable LinkedIn publishing
salim4n Aug 20, 2026
abf9158
Merge pull request #41 from IgnitionAI/feat/noosphere-durable-publica…
salim4n Aug 20, 2026
7327ea5
feat(content): synchronize LinkedIn posts and metrics (#42)
salim4n Aug 20, 2026
22dfc39
feat(inbound): ingest LinkedIn engagements durably (#44)
salim4n Aug 21, 2026
efe8c11
feat(symbiosis): add evidence-led attribution (#46)
salim4n Aug 21, 2026
a2d9da3
SYM-101 — Relier contenu, conversations et revenu (#48)
salim4n Aug 21, 2026
24a1945
CRM-102 — Scorer les signaux sociaux prouvés (#50)
salim4n Aug 21, 2026
86769f5
feat(conversations): project proved social interactions (#52)
salim4n Aug 21, 2026
ae6ee5a
feat(symbiosis): attribute calls to growth sources
salim4n Aug 21, 2026
bdfd322
Merge pull request #54 from IgnitionAI/feat/noosphere-call-attributio…
salim4n Aug 21, 2026
b08211d
feat(content): automate daily LinkedIn editorial loop
salim4n Aug 21, 2026
66f8fde
Merge pull request #59 from IgnitionAI/feat/noosphere-daily-editorial…
salim4n Aug 21, 2026
832c684
feat(content): learn within editorial policy bounds
salim4n Aug 21, 2026
886ec5e
Merge pull request #60 from IgnitionAI/feat/noosphere-bounded-editori…
salim4n Aug 21, 2026
8bdab62
feat(content): reconcile unknown provider outcomes
salim4n Aug 21, 2026
a79a2ef
Merge pull request #61 from IgnitionAI/feat/noosphere-provider-reconc…
salim4n Aug 21, 2026
007db77
feat(ptc): gate the real LinkedIn canary
salim4n Aug 21, 2026
499f589
Merge pull request #62 from IgnitionAI/feat/noosphere-linkedin-ptc-56
salim4n Aug 21, 2026
3dfe084
perf: benchmark the Noosphere standard stack
salim4n Aug 21, 2026
1a3962f
fix(perf): always stop capacity sampling
salim4n Aug 21, 2026
fae528b
Merge pull request #63 from IgnitionAI/perf/noosphere-capacity-15
salim4n Aug 21, 2026
d290118
fix(content): recover invalid Kimi strategy output
salim4n Aug 21, 2026
bcd9f48
fix(content): route idea discovery before generation
salim4n Aug 21, 2026
1aebf74
fix(content): prevent inbound queue starvation
salim4n Aug 21, 2026
ad3589e
fix(content): compare only published history
salim4n Aug 21, 2026
e802974
fix(content): reserve repetition blockers for harmful duplication
salim4n Aug 21, 2026
47f94b7
fix(content): reject contradictory evidence verdicts
salim4n Aug 21, 2026
9d39afc
feat(content): self-repair audit feedback once
salim4n Aug 21, 2026
5e3c506
Merge pull request #64 from IgnitionAI/fix/noosphere-editorial-strate…
salim4n Aug 21, 2026
a816496
fix(content): prevent stale runs from replacing newer assets
salim4n Aug 21, 2026
5ef288d
fix(content): allocate versions from immutable history
salim4n Aug 21, 2026
5102e66
Merge pull request #65 from IgnitionAI/fix/content-stale-run-superses…
salim4n Aug 21, 2026
59925b8
feat: harden autonomous growth workflows
salim4n Aug 22, 2026
c37b2cb
feat: simplify the Noosphere experience
salim4n Aug 22, 2026
1a55bbd
docs: document the LinkedIn editorial autopilot
salim4n Aug 22, 2026
721679d
fix: keep channel settings usable without Unipile
salim4n Aug 22, 2026
b7fd1d5
test: stabilize the workspace surface canary
salim4n Aug 22, 2026
d4359bc
feat: add branded inbound media and provider-neutral AI routing
salim4n Aug 22, 2026
ecf0682
feat: establish the Noosphere visual system
salim4n Aug 22, 2026
f659e59
feat: add durable Prospect 360 context
salim4n Aug 23, 2026
21da07c
docs: publish Noosphere open source documentation
salim4n Aug 23, 2026
d0a0598
test: qualify Prospect 360 production path
salim4n Aug 23, 2026
69d220d
fix: keep Prospect 360 refresh durable
salim4n Aug 23, 2026
4933ea6
feat: replace Docling with structured local knowledge search (#66)
salim4n Aug 24, 2026
4e5ed58
fix: harden internal requests and HTML extraction (#68)
salim4n Aug 24, 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
  •  
  •  
  •  
17 changes: 17 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
.git
.github
.env
.env.*
!.env.example
node_modules
apps/web/.next
apps/crawler/.venv
apps/crawler/.pytest_cache
apps/crawler/__pycache__
dist
coverage
.next
prototype
tests
*.log
.DS_Store
43 changes: 36 additions & 7 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -2,22 +2,48 @@ DATABASE_URL=postgres://postgres:postgres@127.0.0.1:5432/ignition_outbound
OPENAI_API_KEY=
OPENAI_RESEARCH_MODEL=
OPENAI_SYNTHESIS_MODEL=
OPENAI_EMBEDDING_MODEL=text-embedding-3-small
AI_PROVIDER=kimi-code
TEI_EMBEDDING_GRPC_ADDRESS=127.0.0.1:8081
TEI_EMBEDDING_RUNTIME_MODEL_ID=janni-t/qwen3-embedding-0.6b-int8-tei-onnx
TEI_EMBEDDING_RUNTIME_MODEL_SHA=8fe0c238c7c48016d28e750413ca492024be3ddf
TEI_EMBEDDING_DIMENSION=1024
TEI_EMBEDDING_CONCURRENCY=1
TEI_RERANKER_GRPC_ADDRESS=127.0.0.1:8082
TEI_RERANKER_RUNTIME_MODEL_ID=csylabs/bge-reranker-v2-m3-int8-onnx
TEI_RERANKER_RUNTIME_MODEL_SHA=eaf5072d7b1a3f1fa584cc7482c7efb8f784dca0
TEI_GRPC_TIMEOUT_MS=15000
TEI_QUERY_INSTRUCTION=Given a search query, retrieve relevant passages that answer the query in French or English.
AI_PROVIDER=codex-cli
KIMI_CODE_API_KEY=
KIMI_CODE_BASE_URL=https://api.kimi.com/coding/v1
KIMI_RESEARCH_MODELS=kimi-for-coding,k3,kimi-for-coding-highspeed
KIMI_SYNTHESIS_MODELS=kimi-for-coding,kimi-for-coding-highspeed,k3
KIMI_RESEARCH_MODELS=k3,k3-256k
PROSPECT_DECISION_MODEL=k3
KIMI_SYNTHESIS_MODELS=k3-256k,k3
KIMI_FALLBACK_MODELS=kimi-for-coding-highspeed
# Use AI_PROVIDER=codex-cli for a Codex-only deployment. Authentication is
# stored in the private codex-service-home Docker volume.
CODEX_DEFAULT_MODEL=gpt-5.6-luna
CODEX_DEFAULT_REASONING_EFFORT=xhigh
CODEX_FALLBACK_MODELS=gpt-5.4-mini
CODEX_BINARY_PATH=codex
SEARXNG_URL=http://searxng:8080
SEARXNG_SECRET=replace-with-a-random-internal-secret
UNIPILE_DSN=https://api37.unipile.com:16796
UNIPILE_API_KEY=
UNIPILE_LINKEDIN_ACCOUNT_ID=
UNIPILE_WHATSAPP_ACCOUNT_ID=
UNIPILE_WEBHOOK_SECRET=
UNIPILE_INBOX_SYNC_ENABLED=true
UNIPILE_SOCIAL_CONTENT_SYNC_ENABLED=true
UNIPILE_SOCIAL_ENGAGEMENT_SYNC_ENABLED=true
CALENDAR_WEBHOOK_SIGNING_KEY=
PUBLIC_WEBHOOK_BASE_URL=http://localhost:3001
OUTBOUND_LINKEDIN_DAILY_LIMIT=20
OUTBOUND_EMAIL_DAILY_LIMIT=50
OUTBOUND_WHATSAPP_DAILY_LIMIT=30
BOOKING_URL=
CRAWLER_SERVICE_URL=http://127.0.0.1:8000
CRAWLER_API_KEY=
SEARCH_FALLBACK_ENABLED=true
DOCLING_SERVICE_URL=http://127.0.0.1:5001
DOCLING_API_KEY=
S3_ENDPOINT=http://127.0.0.1:9000
S3_REGION=us-east-1
S3_BUCKET=ignition-outbound
Expand All @@ -35,6 +61,9 @@ BOOTSTRAP_WORKSPACE_SLUG=ignition-ai
BOOTSTRAP_WORKSPACE_NAME=IgnitionAI
PORT=3001
WORKER_ID=research-worker-1
DAILY_PROSPECTING_TIME=06:00
DAILY_PROSPECTING_TIMEZONE=Europe/Paris
JOB_LEASE_MS=60000
JOB_BATCH_SIZE=1
JOB_HEARTBEAT_MS=20000
JOB_BATCH_SIZE=4
JOB_POLL_INTERVAL_MS=1000
125 changes: 125 additions & 0 deletions .github/workflows/check.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
name: Check

on:
push:
branches:
- dev
- preprod
- prod
pull_request:
branches:
- dev
- preprod
- prod

permissions:
contents: read

env:
# CI-only values. They are intentionally non-secret and never used against
# external providers or production services.
DATABASE_URL: postgres://postgres:postgres@127.0.0.1:5432/ignition_outbound_test
# Integration tests create/migrate their own database and must not share the
# database used by the repository migration check above.
TEST_DATABASE_URL: postgres://postgres:postgres@127.0.0.1:5432/ignition_outbound_integration_test
OPENAI_API_KEY: ci-test-openai-key
OPENAI_RESEARCH_MODEL: ci-test-research-model
OPENAI_SYNTHESIS_MODEL: ci-test-synthesis-model
OPENAI_EMBEDDING_MODEL: text-embedding-3-small
AI_PROVIDER: openai
BETTER_AUTH_URL: http://localhost:3000
BETTER_AUTH_SECRET: ci-only-better-auth-secret-012345678901234567890123
BETTER_AUTH_TRUSTED_ORIGINS: http://localhost:3000,http://127.0.0.1:3000
BETTER_AUTH_ALLOW_SIGN_UP: "false"
OUTBOUND_API_URL: http://127.0.0.1:3001
S3_ENDPOINT: http://127.0.0.1:9000
S3_REGION: us-east-1
S3_BUCKET: ignition-outbound-ci
S3_ACCESS_KEY_ID: ci-access-key
S3_SECRET_ACCESS_KEY: ci-secret-key
DOCLING_SERVICE_URL: http://127.0.0.1:5001
CRAWLER_SERVICE_URL: http://127.0.0.1:8000
SEARCH_FALLBACK_ENABLED: "true"
PORT: "3001"
BOOTSTRAP_OWNER_EMAIL: noosphere-ci@example.test
BOOTSTRAP_OWNER_NAME: Noosphere CI
BOOTSTRAP_OWNER_PASSWORD: noosphere-ci-password
BOOTSTRAP_WORKSPACE_SLUG: ignition-ai
BOOTSTRAP_WORKSPACE_NAME: IgnitionAI

jobs:
check:
name: bun run check
runs-on: ubuntu-latest
services:
database:
image: paradedb/paradedb:v0.23.5
env:
POSTGRES_DB: ignition_outbound_test
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
ports:
- 5432:5432
options: >-
--health-cmd "pg_isready -U postgres -d ignition_outbound_test"
--health-interval 5s
--health-timeout 5s
--health-retries 20

steps:
- name: Checkout
uses: actions/checkout@v4

- name: Setup Bun
uses: oven-sh/setup-bun@v2
with:
bun-version: 1.3.4

- name: Cache Bun
uses: actions/cache@v4
with:
path: ~/.bun/install/cache
key: ${{ runner.os }}-bun-${{ hashFiles('bun.lock') }}
restore-keys: |
${{ runner.os }}-bun-

- name: Setup Python
uses: actions/setup-python@v5
with:
python-version: "3.12"

- name: Setup uv
uses: astral-sh/setup-uv@v6
with:
enable-cache: true
cache-dependency-glob: apps/crawler/uv.lock

- name: Cache Playwright browsers
uses: actions/cache@v4
with:
path: ~/.cache/ms-playwright
key: ${{ runner.os }}-playwright-${{ hashFiles('apps/crawler/uv.lock') }}
restore-keys: |
${{ runner.os }}-playwright-

- name: Install dependencies
run: bun install --frozen-lockfile

- name: Install Playwright Chromium
working-directory: apps/crawler
run: uv run playwright install --with-deps chromium

- name: Apply database migrations
run: bun run db:migrate

- name: Run repository checks
run: bun run check

- name: Run PostgreSQL integration tests
run: bun run test:integration

- name: Install browser for Noosphere P0
run: bunx playwright install --with-deps chromium

- name: Run Noosphere browser journeys
run: bun run test:e2e
38 changes: 8 additions & 30 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -1,39 +1,17 @@
name: CI
name: CI (legacy manual entrypoint)

# The branch and pull-request automation lives in check.yml. Keep this file as
# a manual escape hatch for links/bookmarks to the old CI workflow, without
# running a second, incomplete check on every push.
on:
push:
pull_request:
workflow_dispatch:

permissions:
contents: read

jobs:
verify:
info:
runs-on: ubuntu-latest
services:
postgres:
image: postgres:17-alpine
env:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
POSTGRES_DB: ignition_outbound_test
ports:
- 5432:5432
options: >-
--health-cmd "pg_isready -U postgres -d ignition_outbound_test"
--health-interval 5s
--health-timeout 5s
--health-retries 10
steps:
- uses: actions/checkout@v4
- uses: oven-sh/setup-bun@v2
with:
bun-version: 1.3.4
- name: Install dependencies
run: bun install --frozen-lockfile
- name: Verify repository
run: bun run check
- name: Verify PostgreSQL foundation
env:
TEST_DATABASE_URL: postgres://postgres:postgres@127.0.0.1:5432/ignition_outbound_test
run: bun run test:integration
- name: Use the Check workflow
run: echo "Run the Check workflow for the supported dev -> preprod -> prod flow."
17 changes: 17 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,25 @@ node_modules/
.next/
dist/
coverage/
playwright-report/
test-results/
__pycache__/
.pytest_cache/
.venv/
*.py[cod]
*.tsbuildinfo
*.log
.env
.env.*
!.env.example
!deploy/.env.production.example

# Python
__pycache__/
*.pyc

# Agent tool dirs
.aionrs/
.claude/
.codex/
.kimi/
25 changes: 24 additions & 1 deletion CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,32 @@ bun run check
Lors de l’implémentation Next.js, ajouter progressivement types, tests
unitaires, tests PostgreSQL, contrats fournisseurs et tests visuels.

Les tests d’intégration PostgreSQL s’exécutent uniquement via
`bun run test:integration` : le script dérive une base `_test` isolée et
refuse `TEST_DATABASE_URL=DATABASE_URL`. Ne jamais lancer
`bun test tests/integration` directement — sans `TEST_DATABASE_URL`, les
tests retombent sur la base de développement et échouent sur ses résidus
d’état.

## Flux de branches

Trois branches permanentes, promotion dans un seul sens :

- `dev` : intégration. Tout le travail (features, fixes, docs) est commité ici,
directement ou via une branche `feat/<description>` fusionnée dans `dev` ;
- `preprod` : validation. On y promeut `dev` quand `bun run check` est vert et
la QA passée (parcours réel API + base, états, responsive) ;
- `prod` : production. On y promeut `preprod` uniquement pour une release
validée. `main` reflète `prod`.

Règles : aucun commit direct sur `preprod`/`prod` hors promotion ; un correctif
urgent part de `prod` en `fix/<description>` puis est fusionné dans `prod`,
`preprod` et `dev`.

## Branches et commits

- branche : `feat/<description>`, `fix/<description>` ou `docs/<description>` ;
- branche de travail : `feat/<description>`, `fix/<description>` ou
`docs/<description>`, fusionnée dans `dev` ;
- changements limités à un objectif ;
- aucune donnée personnelle réelle dans les fixtures ;
- aucune clé fournisseur dans le dépôt.
Expand Down
Loading
Loading