Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
15 commits
Select commit Hold shift + click to select a range
5d66b44
feat(public-site-content): content-driven How it works and Security p…
arutsh Oct 1, 2026
3580c2d
feat(public-site-content): content-driven About and Contact pages (#374)
arutsh Oct 1, 2026
2154f4e
feat: replace LandingPage with HomePage and implement content-driven …
arutsh Oct 1, 2026
27115fe
feat(public-site-content): migrate legal content to new structure and…
arutsh Oct 1, 2026
52aaa9b
feat(ai-feat-site-assistant-retrieval-evals): flesh out proposal into…
arutsh Oct 1, 2026
2eb6632
chore(ai-feat-site-assistant-retrieval-evals): fold parent issue #380…
arutsh Oct 1, 2026
f47e755
feat(ai-feat-site-assistant-retrieval-evals): add site-knowledge inde…
arutsh Oct 3, 2026
25258b7
fix(ai-feat-site-assistant-retrieval-evals): satisfy pre-push lint/ty…
arutsh Oct 3, 2026
c8cd29f
feat(ai-feat-site-assistant-retrieval-evals): add /guides/<slug> publ…
arutsh Oct 3, 2026
fe63f90
feat(ai-feat-site-assistant-retrieval-evals): add site retrieval with…
arutsh Oct 3, 2026
7e66ac0
feat(ai-feat-site-assistant-retrieval-evals): add golden dataset and …
arutsh Oct 5, 2026
ab9c983
feat(ai-feat-site-assistant-retrieval-evals): wire CI triggers and ma…
arutsh Oct 10, 2026
799c8ed
feat(ai-feat-site-assistant-retrieval-evals): add reindex-content wor…
arutsh Oct 10, 2026
69cde5b
Potential fix for pull request finding 'CodeQL / Workflow does not co…
arutsh Oct 10, 2026
c81dc00
Merge branch 'main' into AI/feat/Issue-381/site-assistant-retrieval-e…
arutsh Oct 10, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 22 additions & 0 deletions .cplt.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
# Generated by `cplt init`. Review before trusting.
# Detected: Node.js, Docker, Python, Playwright, Vite
# Workspace members:
# frontend-typescript (heuristic scan): Node.js, Docker, Playwright, Vite

[propose]
# Suggested by: frontend-typescript
allow_localhost_any = true
# Repo tracks .env.* files in every service; sandbox needs to read/write them
# for git add/commit/stash to work. See CLAUDE.md env-file handling note.
allow_env_files = true

[propose.allow]
localhost = [80, 443, 4000, 4317, 4318, 5173, 5432, 5433, 5555, 5672, 5673, 6379, 6380, 8000, 8082, 8889, 9000, 9001, 9002, 9003, 9010, 9011, 9020, 9021, 9082, 9090, 9411, 15672, 15673, 15692]

## Machine-specific — these belong in ~/.config/cplt/config.toml, not here.
## Copy the [section] headers too: keys pasted at the end of that file are
## scoped by whichever header precedes them, which silently drops the grant.
#
# [sandbox]
# allow_cache_exec = ["ms-playwright"]

18 changes: 18 additions & 0 deletions .github/workflows/ai.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,13 +24,31 @@ jobs:
relevant:
- "services/ai/**"
- "shared/**"
- "frontend-typescript/src/content/site/**"
- "docs/user-guide/**"
- "docs/PRODUCT.md"

ai-test:
needs: changes
if: needs.changes.outputs.relevant == 'true'
runs-on: ubuntu-latest
services:
postgres:
image: postgres:15
env:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
POSTGRES_DB: grandflow_ai
ports:
- 5432:5432
options: >-
--health-cmd "pg_isready -U postgres"
--health-interval 5s
--health-timeout 5s
--health-retries 10
env:
AI_DATABASE_URL: postgresql://postgres:postgres@localhost:5432/grandflow_ai
AI_TEST_POSTGRES_URL: postgresql://postgres:postgres@localhost:5432/grandflow_ai
LOG_LEVEL: INFO
PYTHONPATH: ${{ github.workspace }}/services/ai:${{ github.workspace }}
AI_PROVIDER_APPROVED_ORIGINS: '[{"origin": "http://ollama:11434", "allow_private": true}]'
Expand Down
4 changes: 4 additions & 0 deletions .github/workflows/frontend.yml
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,10 @@ jobs:
working-directory: ./frontend-typescript
run: npm ci

- name: Lint (baseline ratchet)
working-directory: ./frontend-typescript
run: npm run lint:ci

- name: Run Vitest
working-directory: ./frontend-typescript
run: npx vitest run --coverage
33 changes: 33 additions & 0 deletions .github/workflows/reindex-content.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
name: Reindex Site Content

on:
push:
branches: [main]
paths:
- "frontend-typescript/src/content/site/**"
- "docs/user-guide/**"
- "docs/PRODUCT.md"

permissions: {}

jobs:
reindex:
runs-on: ubuntu-latest
steps:
- name: Reindex content and restart AI service
uses: appleboy/ssh-action@v1.0.3
with:
host: ${{ secrets.VPS_HOST }}
username: ${{ secrets.VPS_USER }}
key: ${{ secrets.VPS_SSH_KEY }}
command_timeout: 5m
script: |
set -euo pipefail
cd /opt/grandflow

# Fetch latest main and update checkout
git fetch origin main
git reset --hard origin/main

# Restart ai container to trigger startup ingestion hook
docker compose --env-file .env.prod -f docker-compose.prod.yml restart ai
Comment thread
github-advanced-security[bot] marked this conversation as resolved.
Fixed
14 changes: 14 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -67,3 +67,17 @@ This is enforced, not just documented: `.claude/hooks/check_comment_brevity.py`
(a `PreToolUse` hook on `Write`/`Edit`) denies any write that introduces a
comment longer than that, so trim it before retrying rather than fighting the
hook.

## Frontend lint — fix on touch, never add to the pile

`frontend-typescript` has a pre-existing lint backlog. Rather than block on
fixing it all at once, CI enforces a ratchet: `BASELINE` in
`frontend-typescript/scripts/check-lint-baseline.mjs` caps total ESLint
problems, checked by `npm run lint:ci`. A push that adds new lint errors
fails; one that fixes some should lower `BASELINE` to lock the win in. When
you touch a file that already has lint issues, fix them as part of that
change instead of leaving them for later.

This is enforced, not just documented: `.github/workflows/frontend.yml` runs
`lint:ci` on every push/PR touching `frontend-typescript/**`, and
`scripts/git-hooks/pre-push` mirrors it locally (see WORKFLOW.md §8).
3 changes: 3 additions & 0 deletions docker-compose.local.yml
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,9 @@ services:
volumes:
- ./shared:/app/shared:ro
- ./services/ai:/app
- ./frontend-typescript/src/content/site:/app/content/site:ro
- ./docs/user-guide:/app/docs/user-guide:ro
- ./docs/PRODUCT.md:/app/docs/PRODUCT.md:ro
env_file:
- ./services/ai/.env.ai.private.local
environment:
Expand Down
5 changes: 5 additions & 0 deletions docker-compose.prod.yml
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,11 @@ services:
dockerfile: services/ai/Dockerfile
container_name: ai-service
restart: unless-stopped
# Bind-mounted so `restart ai` reindexes freshly pulled content without a rebuild.
volumes:
- ./frontend-typescript/src/content/site:/app/content/site:ro
- ./docs/user-guide:/app/docs/user-guide:ro
- ./docs/PRODUCT.md:/app/docs/PRODUCT.md:ro
env_file:
- ./services/ai/.env.ai.prod
environment:
Expand Down
7 changes: 5 additions & 2 deletions docs/development/WORKFLOW.md
Original file line number Diff line number Diff line change
Expand Up @@ -161,8 +161,11 @@ rather than fast-forward-mergeable). Pass `--yes` to skip the prompt.
(`black --check`, `mypy`, `flake8`) locally, scoped to whichever service(s) the
push actually touches (a `shared/` change checks all four). A push touching
`scripts/*.py` runs `black --check`, `flake8 --max-line-length=100` and
`scripts/test_flow.py` over `scripts/` — the workflow tooling lints itself. The
hook also rejects a branch whose name doesn't match §3. One-time setup:
`scripts/test_flow.py` over `scripts/` — the workflow tooling lints itself. A
push touching `frontend-typescript/*.{ts,tsx}` runs `npm run lint:ci`, the
same ESLint baseline ratchet as `frontend.yml` (see CLAUDE.md's "Frontend
lint" section). The hook also rejects a branch whose name doesn't match §3.
One-time setup:

```
git config core.hooksPath scripts/git-hooks
Expand Down
2 changes: 1 addition & 1 deletion frontend-typescript/eslint.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import tseslint from 'typescript-eslint'
import { globalIgnores } from 'eslint/config'

export default tseslint.config([
globalIgnores(['dist']),
globalIgnores(['dist', 'coverage']),
{
files: ['**/*.{ts,tsx}'],
extends: [
Expand Down
Loading
Loading