Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
  •  
  •  
  •  
4 changes: 2 additions & 2 deletions .cursor/rules/server-types-runtime-only.mdc
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
description: AgentUIServer / server-port types are defined only in assistant-ui-runtime; UI re-exports
globs: packages/trueforge-ui-sdk/src/server/**/*,packages/trueforge-ui-sdk/src/**/*Server*,packages/trueforge-ui-sdk/src/**/*server*,packages/frontend/src/harnessServer.ts,packages/frontend/src/harnessBuilderServer.ts
globs: packages/trueforge-ui/src/server/**/*,packages/trueforge-ui/src/**/*Server*,packages/trueforge-ui/src/**/*server*,packages/frontend/src/harnessServer.ts,packages/frontend/src/harnessBuilderServer.ts
alwaysApply: false
---

Expand All @@ -11,7 +11,7 @@ Canonical `AgentUIServer` / chat / builder / catalog port types live only in

## Rules

- [`packages/trueforge-ui-sdk/src/server/types.ts`](packages/trueforge-ui-sdk/src/server/types.ts)
- [`packages/trueforge-ui/src/server/types.ts`](packages/trueforge-ui/src/server/types.ts)
is the host-facing barrel: re-export only from `@truefoundry/assistant-ui-runtime`
(prefer `/server` when avoiding root name collisions). Do **not** put hand-written
server port/DTO interfaces there or elsewhere in this monorepo.
Expand Down
2 changes: 1 addition & 1 deletion .github/PULL_REQUEST_TEMPLATE.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,5 +16,5 @@ Closes #

- [ ] `pnpm build`, `pnpm test`, `pnpm typecheck`, `pnpm lint:ci`, and `pnpm format:check` pass locally
- [ ] Tests added/updated where it makes sense
- [ ] No hand-edits to generated code (`packages/sdk`, `.github/fern/openapi/openapi.json`, `docs/openapi.json`)
- [ ] No hand-edits to generated code (`packages/trueforge-sdk`, `.github/fern/openapi/openapi.json`, `docs/openapi.json`)
- [ ] Docs / `.env.example` updated if configuration or behavior changed
2 changes: 1 addition & 1 deletion .github/fern/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,6 @@

OpenAPI and the TypeScript SDK are generated in CI (and locally via
`pnpm sdk:generate`). Edit server routes, not `openapi/openapi.json` or
`packages/sdk`.
`packages/trueforge-sdk`.

Bump: 1
6 changes: 3 additions & 3 deletions .github/fern/generators.yml
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ groups:
version: 3.87.1
output:
location: local-file-system
path: ../../packages/sdk
path: ../../packages/trueforge-sdk
config:
packageJson:
name: '@truefoundry/trueforge-sdk'
Expand All @@ -47,8 +47,8 @@ groups:
repository:
type: git
url: git+https://github.com/truefoundry/trueforge.git
directory: packages/sdk
homepage: https://github.com/truefoundry/trueforge/tree/main/packages/sdk#readme
directory: packages/trueforge-sdk
homepage: https://github.com/truefoundry/trueforge/tree/main/packages/trueforge-sdk#readme
bugs:
url: https://github.com/truefoundry/trueforge/issues
publishConfig:
Expand Down
44 changes: 22 additions & 22 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -39,44 +39,44 @@ jobs:
# - tsconfig.base.json: shared TS settings affect package tests
# - .github/workflows/ci.yml: this workflow's package matrix/steps change
filters: |
harness:
- 'packages/harness/**'
trueforge-core:
- 'packages/trueforge-core/**'
- 'package.json'
- 'pnpm-workspace.yaml'
- 'tsconfig.base.json'
- '.github/workflows/ci.yml'
server:
- 'packages/server/**'
trueforge:
- 'packages/trueforge/**'
- 'package.json'
- 'pnpm-workspace.yaml'
- 'tsconfig.base.json'
- '.github/workflows/ci.yml'
frontend:
- 'packages/frontend/**'
# trueforge-sdk is link:../sdk (no version bump); SDK-only PRs must still run FE checks.
- 'packages/sdk/**'
# trueforge-sdk is workspace:* (no version bump); SDK-only PRs must still run FE checks.
- 'packages/trueforge-sdk/**'
- 'package.json'
- 'pnpm-workspace.yaml'
- 'tsconfig.base.json'
- '.github/workflows/ci.yml'
trueforge-ui:
- 'packages/trueforge-ui-sdk/**'
- 'packages/trueforge-ui/**'
- 'package.json'
- 'pnpm-workspace.yaml'
- 'tsconfig.base.json'
- '.github/workflows/ci.yml'
store:
- 'packages/server/src/db/**'
- 'packages/server/tests/db/**'
- 'packages/server/jest.store.postgres.config.cjs'
- 'packages/server/jest.store.sqlite.config.cjs'
- 'packages/server/package.json'
- 'packages/harness/package.json'
- 'packages/harness/src/agent-session/models/**'
- 'packages/harness/src/agent-session/schemas/**'
- 'packages/harness/src/agent-session/store/**'
- 'packages/harness/tests/agent-session/store/**'
- 'packages/harness/tests/agent-session/testHelpers.ts'
- 'packages/trueforge/src/db/**'
- 'packages/trueforge/tests/db/**'
- 'packages/trueforge/jest.store.postgres.config.cjs'
- 'packages/trueforge/jest.store.sqlite.config.cjs'
- 'packages/trueforge/package.json'
- 'packages/trueforge-core/package.json'
- 'packages/trueforge-core/src/agent-session/models/**'
- 'packages/trueforge-core/src/agent-session/schemas/**'
- 'packages/trueforge-core/src/agent-session/store/**'
- 'packages/trueforge-core/tests/agent-session/store/**'
- 'packages/trueforge-core/tests/agent-session/testHelpers.ts'
- 'package.json'
- 'pnpm-workspace.yaml'
- 'tsconfig.base.json'
Expand All @@ -85,15 +85,15 @@ jobs:
- name: Build package matrix
id: packages
env:
HARNESS: ${{ steps.filter.outputs.harness }}
SERVER: ${{ steps.filter.outputs.server }}
TRUEFORGE_CORE: ${{ steps.filter.outputs['trueforge-core'] }}
TRUEFORGE: ${{ steps.filter.outputs.trueforge }}
FRONTEND: ${{ steps.filter.outputs.frontend }}
TRUEFORGE_UI: ${{ steps.filter.outputs['trueforge-ui'] }}
run: |
node <<'EOF' >> "$GITHUB_OUTPUT"
const changedPackages = [];
if (process.env.HARNESS === 'true') changedPackages.push('harness');
if (process.env.SERVER === 'true') changedPackages.push('server');
if (process.env.TRUEFORGE_CORE === 'true') changedPackages.push('trueforge-core');
if (process.env.TRUEFORGE === 'true') changedPackages.push('trueforge');
if (process.env.FRONTEND === 'true') changedPackages.push('frontend');
if (process.env.TRUEFORGE_UI === 'true') changedPackages.push('trueforge-ui');
console.log(`list=${JSON.stringify(changedPackages)}`);
Expand Down
20 changes: 10 additions & 10 deletions .github/workflows/generate-sdk.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -6,17 +6,17 @@ on:
branches: [main]
# Only sources the document is built from; tests and metadata cannot change it.
paths:
- 'packages/server/src/**'
- 'packages/server/scripts/**'
- 'packages/harness/src/**'
- 'packages/trueforge/src/**'
- 'packages/trueforge/scripts/**'
- 'packages/trueforge-core/src/**'
- '.github/fern/**'
- '.github/workflows/generate-sdk.yaml'
pull_request:
types: [opened, synchronize, reopened]
paths:
- 'packages/server/src/**'
- 'packages/server/scripts/**'
- 'packages/harness/src/**'
- 'packages/trueforge/src/**'
- 'packages/trueforge/scripts/**'
- 'packages/trueforge-core/src/**'
- '.github/fern/**'
- '.github/workflows/generate-sdk.yaml'

Expand Down Expand Up @@ -122,7 +122,7 @@ jobs:
# --porcelain, not `git diff`, so new files count too.
# docs/openapi.json is a second copy of the same document (Mintlify); keep it
# in the same commit as .github/fern/openapi or the docs site drifts.
if [ -z "$(git status --porcelain -- .github/fern/openapi docs/openapi.json packages/sdk pnpm-lock.yaml)" ]; then
if [ -z "$(git status --porcelain -- .github/fern/openapi docs/openapi.json packages/trueforge-sdk pnpm-lock.yaml)" ]; then
echo "OpenAPI document and SDK are already up to date."
exit 0
fi
Expand All @@ -131,13 +131,13 @@ jobs:
git config user.email "${APP_SLUG}[bot]@users.noreply.github.com"

# Bot-authored sdk diffs need a changeset; the PR author never touches this commit.
# Skip packages/sdk/.fern — Fern metadata only, not a consumer-facing change.
# Skip packages/trueforge-sdk/.fern — Fern metadata only, not a consumer-facing change.
# changeset:sdk-regen is a no-op if the sdk is already named in a pending file.
if [ -n "$(git status --porcelain -- packages/sdk ':!packages/sdk/.fern')" ]; then
if [ -n "$(git status --porcelain -- packages/trueforge-sdk ':!packages/trueforge-sdk/.fern')" ]; then
pnpm changeset:sdk-regen
fi

git add .github/fern/openapi docs/openapi.json packages/sdk pnpm-lock.yaml .changeset
git add .github/fern/openapi docs/openapi.json packages/trueforge-sdk pnpm-lock.yaml .changeset
git commit -m "Regenerate OpenAPI document and TypeScript SDK"
git push origin "HEAD:refs/heads/$BRANCH"

Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/push-sandbox-image.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,8 @@ jobs:
artifactory_repository_url: ${{ vars.TRUEFOUNDRY_ARTIFACTORY_PUBLIC_REPOSITORY }}
image_artifact_name: trueforge-sandbox
image_tag: ${{ github.sha }}
image_context: packages/harness/scripts/sandbox
dockerfile_path: packages/harness/scripts/sandbox/sandbox.Dockerfile
image_context: packages/trueforge-core/scripts/sandbox
dockerfile_path: packages/trueforge-core/scripts/sandbox/sandbox.Dockerfile
# Dockerfile downloads linux-amd64 helm/nats binaries only.
platforms: linux/amd64
enable_jfrog: true
Expand Down
6 changes: 3 additions & 3 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -124,11 +124,11 @@ jobs:
- run: pnpm build
- run: pnpm test

# Root build copies FE into packages/server/dist/_frontend; refuse an API-only tarball.
# Root build copies FE into packages/trueforge/dist/_frontend; refuse an API-only tarball.
- name: Verify packaged UI is present
run: |
test -f packages/server/dist/cli.js
test -f packages/server/dist/_frontend/index.html
test -f packages/trueforge/dist/cli.js
test -f packages/trueforge/dist/_frontend/index.html

- name: Pack packages
id: pack
Expand Down
10 changes: 5 additions & 5 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,11 @@ coverage/
.pnpm-store/
.eslintcache
.prettiercache
packages/harness/src/core/sandbox/sandboxScripts.gen.ts
packages/server/src/catalog/modelCatalog.gen.ts
packages/server/src/catalog/mcpCatalog.gen.ts
packages/server/src/catalog/skillCatalog.gen.ts
packages/server/src/catalog/sandboxCatalog.gen.ts
packages/trueforge-core/src/core/sandbox/sandboxScripts.gen.ts
packages/trueforge/src/catalog/modelCatalog.gen.ts
packages/trueforge/src/catalog/mcpCatalog.gen.ts
packages/trueforge/src/catalog/skillCatalog.gen.ts
packages/trueforge/src/catalog/sandboxCatalog.gen.ts
data/
# Helm subchart deps are fetched via `helm dependency build` (pinned by the
# committed Chart.lock); the downloaded .tgz/dirs are not committed.
Expand Down
2 changes: 1 addition & 1 deletion .prettierignore
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
node_modules/
dist/
# Fern-generated: formatted by the generator, not by this repo's config.
packages/sdk/
packages/trueforge-sdk/
.github/fern/openapi/
# Ignore generated openapi.json in docs
docs/openapi.json
Expand Down
10 changes: 5 additions & 5 deletions AGENTS.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
- Workspace tasks MUST use `package.json` scripts; add a script when a missing workflow is repeatable like the existing commands, not ad hoc commands.
- CI package path filters, matrix package ids, and root scripts `test:*` in `.github/workflows/ci.yml` and root `package.json` MUST stay synchronized when a workspace package is added, renamed, or moved; the `store` filter sync rule lives in `packages/harness/src/agent-session/store/AGENTS.md`.
- CI package path filters, matrix package ids, and root scripts `test:*` in `.github/workflows/ci.yml` and root `package.json` MUST stay synchronized when a workspace package is added, renamed, or moved; the `store` filter sync rule lives in `packages/trueforge-core/src/agent-session/store/AGENTS.md`.
- Release wiring MUST keep dist-free host development, `pnpm smoke`, and packed CJS/ESM consumers of `@truefoundry/trueforge-core` working without changes.
- Shared Postgres/Redis settings in `docker-compose.yml` and `docker-compose.dev.yml` (image versions, health checks, `env_file`) MUST stay synchronized; intentional differences (app services, data paths, project `name`, host ports, in-network `POSTGRES_HOST` / `REDIS_URL`) MUST stay explicit. `packages/server/.env` is the host-dev + secrets source; `docker-compose.yml` may read it but MUST override container connectivity so host-dev localhost values are not used inside the smoke-test stack.
- Changes to types or schemas MUST keep `packages/harness`, `packages/frontend`, `packages/server`, and `patches` synchronized; they MUST NOT update only one affected layer.
- Shared Postgres/Redis settings in `docker-compose.yml` and `docker-compose.dev.yml` (image versions, health checks, `env_file`) MUST stay synchronized; intentional differences (app services, data paths, project `name`, host ports, in-network `POSTGRES_HOST` / `REDIS_URL`) MUST stay explicit. `packages/trueforge/.env` is the host-dev + secrets source; `docker-compose.yml` may read it but MUST override container connectivity so host-dev localhost values are not used inside the smoke-test stack.
- Changes to types or schemas MUST keep `packages/trueforge-core`, `packages/frontend`, `packages/trueforge`, and `patches` synchronized; they MUST NOT update only one affected layer.
- TypeScript code MUST NOT use assertion escapes such as `as T`, `as unknown as T`, non-null `!`, or `as never` to silence type errors; implementations MUST use sound contracts, guards, or corrected types.
- When catching an error and throwing another, the new error MUST set `{ cause: caught }` so the original failure is preserved for logs and debugging.
- Every type, schema, helper, and contract MUST have one canonical owner; code MUST NOT introduce duplicate definitions or forwarding shims that hide ownership.
Expand All @@ -13,9 +13,9 @@
- Comments MUST explain intent, trade-offs, or constraints and remain concise; they MUST NOT restate the code or include issue-tracker IDs.
- Every nested `AGENTS.md` MUST have a sibling `CLAUDE.md` containing only `@AGENTS.md`, so Cursor and Claude Code load the same scoped rules.
- OpenAPI specs under `.github/fern/openapi/openapi.json` and `docs/openapi.json` are autogenerated in CI and MUST NOT be edited manually (both copies MUST stay identical)
- Code under `packages/sdk` is autogenerated in CI and MUST NOT be edited manually
- Code under `packages/trueforge-sdk` is autogenerated in CI and MUST NOT be edited manually
- Tests MUST live under a top-level `test` directory that mirrors the `src` layout; they MUST NOT be inlined under `src`.
- Functions with more than one parameter of the same type MUST take a single options object (e.g. `f({ a, b }: { a: string; b: string })`); they MUST NOT use multiple positional parameters of that repeated type (e.g. `f(a: string, b: string)`).
- Zod unions MUST use `z.discriminatedUnion` whenever every member carries a shared literal discriminator field; `z.union` is only permitted when no such common discriminator exists.
- HTTP/OpenAPI wire shapes (path params, query params, request/response JSON fields) and database identifiers (table/column names, persisted jsonb document keys) MUST use `snake_case`.
- Server code MUST NOT read environment variables via `process.env` directly; all env reads MUST go through `packages/server/src/config.ts`, unless there is a documented special requirement (for example bootstrap before config is loaded).
- Server code MUST NOT read environment variables via `process.env` directly; all env reads MUST go through `packages/trueforge/src/config.ts`, unless there is a documented special requirement (for example bootstrap before config is loaded).
Loading
Loading