Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
54 commits
Select commit Hold shift + click to select a range
2ab6291
fix: harden runtime boundaries and state handling
nonnil Jul 16, 2026
5abbc2a
docs: simplify current project guidance
nonnil Jul 16, 2026
d18a974
fix: resolve codebase review findings
nonnil Jul 16, 2026
7d54466
docs: align guidance with reviewed runtime
nonnil Jul 16, 2026
e47b676
fix: close remaining codebase review findings
nonnil Jul 16, 2026
290137f
docs: record final reviewed runtime invariants
nonnil Jul 16, 2026
c02a9ba
fix: enforce durable state invariants
nonnil Jul 16, 2026
06b2c6a
test: isolate temporary git repositories
nonnil Jul 16, 2026
5edda03
fix: bound and harden psychiatrist streams
nonnil Jul 16, 2026
c1902c7
fix: preserve reader and settings interaction state
nonnil Jul 16, 2026
b84d3ec
perf: bound collection browse work
nonnil Jul 17, 2026
cd117c5
fix: preserve deletion and backup intent
nonnil Jul 17, 2026
6e9f279
fix: bound translation event streams
nonnil Jul 17, 2026
47e35f0
fix: harden reader interaction boundaries
nonnil Jul 17, 2026
928409b
fix: coordinate recovery and isolate backup git
nonnil Jul 17, 2026
65fdaea
fix: validate and bound reader projections
nonnil Jul 17, 2026
b644dc8
fix: cap concurrent runtime resources
nonnil Jul 17, 2026
226b5c0
fix: harden psychiatrist browser projections
nonnil Jul 17, 2026
e269907
fix: bound translation and projection work
nonnil Jul 17, 2026
84cf261
fix: bound and align translation workloads
nonnil Jul 17, 2026
8a222cb
fix: bound translation source reads
nonnil Jul 17, 2026
5c627fa
fix: make Codex catalog recovery retryable
nonnil Jul 17, 2026
b6b7d40
fix: preserve Settings catalog selections
nonnil Jul 17, 2026
4235f2c
test: isolate Settings E2E runtime
nonnil Jul 17, 2026
8ef5798
fix: preserve taxonomy dismissal focus
nonnil Jul 17, 2026
99c03f9
fix: add collection page recovery
nonnil Jul 17, 2026
632139b
fix: scope collection retry ownership
nonnil Jul 20, 2026
b20eb75
fix: enforce browser import host policy
nonnil Jul 20, 2026
58cda78
fix: bound aggregate translation output
nonnil Jul 20, 2026
cf885e5
perf: index collection browse cursors
nonnil Jul 20, 2026
bd40d72
fix: add reader catalog recovery
nonnil Jul 20, 2026
bfa8b9c
docs: align review hardening contracts
nonnil Jul 20, 2026
e34c927
test: remove browser import DNS dependency
nonnil Jul 20, 2026
6b25476
fix: enforce effective config path boundaries
nonnil Jul 20, 2026
a85aa39
fix: recover ambiguous atomic content creation
nonnil Jul 20, 2026
5c8deaa
fix: reject invalid migration histories
nonnil Jul 20, 2026
a6e5182
fix: add resilient memory browse navigation
nonnil Jul 20, 2026
35a70fd
fix: use accessible confirmation dialogs
nonnil Jul 20, 2026
1eff0bd
fix: harden psychiatrist citation boundaries
nonnil Jul 20, 2026
d4289e9
fix: reconcile first JSONL publication
nonnil Jul 20, 2026
0f6a6c5
ci: cover maintained runtime surfaces
nonnil Jul 20, 2026
e0836ef
ci: harden release verification
nonnil Jul 20, 2026
904cb9e
perf: linearize reader toc updates
nonnil Jul 20, 2026
d9b263f
fix: route migration cli through runtime checks
nonnil Jul 20, 2026
164145f
fix: preserve asynchronous action focus
nonnil Jul 20, 2026
7258709
fix: reconcile flashback export durability
nonnil Jul 20, 2026
945c096
test: route e2e fixtures through the server
nonnil Jul 20, 2026
f040510
test: harden e2e fixture control boundaries
nonnil Jul 20, 2026
4bda883
test: await flashback export recovery cleanup
nonnil Jul 20, 2026
f8a383f
fix: harden Codex socket connection lifecycle
nonnil Jul 20, 2026
5b1b5d3
fix: enforce single-instance runtime ownership
nonnil Jul 20, 2026
461faa4
fix: harden runtime lease materialization
nonnil Jul 20, 2026
f70ca43
fix: make backup failsafe recovery atomic
nonnil Jul 20, 2026
5b8066e
chore: remove stale TypeScript paths
nonnil Jul 20, 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
  •  
  •  
  •  
1 change: 1 addition & 0 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,6 @@

# Browser-assisted imports are disabled by default. Enable only for local
# development with a random token that is also configured in the extension.
# Generate one with `openssl rand -hex 32`; weak tokens are rejected.
TRAUMA_BROWSER_IMPORT_ENABLED=false
TRAUMA_BROWSER_IMPORT_TOKEN=
26 changes: 23 additions & 3 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ on:
- "src/**"
- "tests/**"
- "e2e/**"
- "extensions/**"
- "public/**"
- "drizzle/**"
- "scripts/**"
Expand All @@ -20,6 +21,7 @@ on:
- "package.json"
- "bun.lock"
- "mise.toml"
- ".env.example"
- "trauma.config.example.json"
pull_request:
branches:
Expand All @@ -29,6 +31,7 @@ on:
- "src/**"
- "tests/**"
- "e2e/**"
- "extensions/**"
- "public/**"
- "drizzle/**"
- "scripts/**"
Expand All @@ -40,6 +43,7 @@ on:
- "package.json"
- "bun.lock"
- "mise.toml"
- ".env.example"
- "trauma.config.example.json"
workflow_dispatch:

Expand All @@ -58,21 +62,37 @@ jobs:

steps:
- name: Check out repository
uses: actions/checkout@v4
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1
with:
persist-credentials: false

- name: Set up Bun
uses: oven-sh/setup-bun@v2
uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2.2.0
with:
bun-version: 1.3.13

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

- name: Audit dependencies
run: bun run audit

- name: Run baseline verification
run: bun run verify

- name: Install Playwright browser
run: bunx playwright install --with-deps chromium

- name: Run E2E smoke tests
- name: Run E2E tests
run: bun run test:e2e

- name: Upload Playwright failure artifacts
if: failure()
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
if-no-files-found: ignore
name: playwright-failures-${{ github.run_id }}-${{ github.run_attempt }}
path: |
playwright-report/
test-results/
retention-days: 7
55 changes: 55 additions & 0 deletions .github/workflows/docs.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
name: Documentation

on:
push:
branches:
- main
paths:
- ".github/workflows/docs.yml"
- "docs/**"
- "AGENTS.md"
- "Backlog.md"
- "CLAUDE.md"
- "README.md"
- "scripts/check-docs.ts"
- "package.json"
pull_request:
branches:
- main
paths:
- ".github/workflows/docs.yml"
- "docs/**"
- "AGENTS.md"
- "Backlog.md"
- "CLAUDE.md"
- "README.md"
- "scripts/check-docs.ts"
- "package.json"
workflow_dispatch:

permissions:
contents: read

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

jobs:
check:
name: Check documentation
runs-on: ubuntu-latest
timeout-minutes: 5

steps:
- name: Check out repository
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1
with:
persist-credentials: false

- name: Set up Bun
uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2.2.0
with:
bun-version: 1.3.13

- name: Check documentation
run: bun run docs:check
111 changes: 80 additions & 31 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,87 +7,136 @@ on:
- "v*.*.*"

permissions:
contents: write
contents: read

concurrency:
group: release-${{ github.ref }}
cancel-in-progress: false

jobs:
release:
name: Create GitHub Release
validate:
name: Validate release tag
runs-on: ubuntu-latest
timeout-minutes: 20
timeout-minutes: 5
outputs:
tag_name: ${{ steps.release_tag.outputs.tag_name }}
valid: ${{ steps.release_tag.outputs.valid }}
version: ${{ steps.release_tag.outputs.version }}

steps:
- name: Check out tagged commit
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1
with:
fetch-depth: 1
persist-credentials: false
ref: ${{ github.sha }}

- name: Set up Bun
uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2.2.0
with:
bun-version: 1.3.13

- name: Validate release tag
id: release_tag
shell: bash
run: |
TAG_NAME="${GITHUB_REF_NAME}"
run: bun run scripts/validate-release.ts

if [[ ! "$TAG_NAME" =~ ^v?[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
echo "::notice title=Skipped release::Tag '$TAG_NAME' is not a three-part semantic version."
echo "valid=false" >> "$GITHUB_OUTPUT"
exit 0
fi
verify:
name: Verify release
needs: validate
if: needs.validate.outputs.valid == 'true'
runs-on: ubuntu-latest
timeout-minutes: 20
permissions:
contents: read

echo "valid=true" >> "$GITHUB_OUTPUT"
echo "tag_name=$TAG_NAME" >> "$GITHUB_OUTPUT"
echo "version=${TAG_NAME#v}" >> "$GITHUB_OUTPUT"
steps:

- name: Check out repository
if: steps.release_tag.outputs.valid == 'true'
uses: actions/checkout@v4
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1
with:
fetch-depth: 0
persist-credentials: false
ref: ${{ github.sha }}

- name: Set up Bun
if: steps.release_tag.outputs.valid == 'true'
uses: oven-sh/setup-bun@v2
uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2.2.0
with:
bun-version: 1.3.13

- name: Install dependencies
if: steps.release_tag.outputs.valid == 'true'
run: bun install --frozen-lockfile

- name: Audit dependencies
run: bun run audit

- name: Run baseline verification
if: steps.release_tag.outputs.valid == 'true'
run: bun run verify

- name: Install Playwright browser
if: steps.release_tag.outputs.valid == 'true'
run: bunx playwright install --with-deps chromium

- name: Run E2E smoke tests
if: steps.release_tag.outputs.valid == 'true'
- name: Run E2E tests
run: bun run test:e2e

- name: Upload Playwright failure artifacts
if: failure()
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
if-no-files-found: ignore
name: playwright-failures-${{ github.run_id }}-${{ github.run_attempt }}
path: |
playwright-report/
test-results/
retention-days: 7

release:
name: Create GitHub Release
needs: [validate, verify]
if: needs.validate.outputs.valid == 'true' && needs.verify.result == 'success'
runs-on: ubuntu-latest
timeout-minutes: 5
permissions:
contents: write

steps:
- name: Check out tagged commit
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1
with:
fetch-depth: 1
persist-credentials: false
ref: ${{ github.sha }}

- name: Create release
if: steps.release_tag.outputs.valid == 'true'
env:
GH_TOKEN: ${{ github.token }}
TAG_NAME: ${{ steps.release_tag.outputs.tag_name }}
RELEASE_VERSION: ${{ steps.release_tag.outputs.version }}
TAG_NAME: ${{ needs.validate.outputs.tag_name }}
RELEASE_VERSION: ${{ needs.validate.outputs.version }}
run: |
if gh release view "$TAG_NAME" --repo "$GITHUB_REPOSITORY" >/dev/null 2>&1; then
echo "Release $TAG_NAME already exists."
exit 0
fi

RELEASE_NOTES_FILE="changelog/v${RELEASE_VERSION}.md"
RELEASE_NOTES_PATH="changelog/v${RELEASE_VERSION}.md"

if [[ -f "$RELEASE_NOTES_PATH" ]]; then
if [[ ! -r "$RELEASE_NOTES_PATH" ]]; then
echo "::error title=Invalid release notes path::$RELEASE_NOTES_PATH is not readable."
exit 1
fi

if [[ -f "$RELEASE_NOTES_FILE" ]]; then
gh release create "$TAG_NAME" \
--repo "$GITHUB_REPOSITORY" \
--title "TRAUMA $RELEASE_VERSION" \
--notes-file "$RELEASE_NOTES_FILE" \
--notes-file "$RELEASE_NOTES_PATH" \
--verify-tag
else
elif [[ ! -e "$RELEASE_NOTES_PATH" && ! -L "$RELEASE_NOTES_PATH" ]]; then
gh release create "$TAG_NAME" \
--repo "$GITHUB_REPOSITORY" \
--title "TRAUMA $RELEASE_VERSION" \
--generate-notes \
--verify-tag
else
echo "::error title=Invalid release notes path::$RELEASE_NOTES_PATH is not a regular file."
exit 1
fi
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
.superpowers/
.eda/
.tmp/
app.config.timestamp_*.js
.claude/settings.local.json
node_modules/
.vinxi/
.output/
Expand Down
25 changes: 6 additions & 19 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,26 +3,13 @@
Trauma is a TypeScript bookmark management app. The project domain term is
`memory` for one bookmark and `memories` for the collection.

## Documentation Map
Start with [docs/INDEX.md](docs/INDEX.md). It is the authoritative map for
current architecture, contracts, operations, and verification. Historical
records are context only and must not override current semantic docs, code, or
tests.

Start with [docs/INDEX.md](docs/INDEX.md).

Key project decisions are split by purpose:

- Architecture: [docs/architecture/overview.md](docs/architecture/overview.md)
- Data and storage: [docs/architecture/data-and-storage.md](docs/architecture/data-and-storage.md)
- Runtime flows: [docs/architecture/flows.md](docs/architecture/flows.md)
- UI and routing: [docs/architecture/ui-and-routing.md](docs/architecture/ui-and-routing.md)
- Technology stack: [docs/references/technology-stack.md](docs/references/technology-stack.md)
- Configuration: [docs/references/configuration.md](docs/references/configuration.md)
- Coding standards: [docs/references/coding-standards/INDEX.md](docs/references/coding-standards/INDEX.md)
- Glossary: [docs/references/glossary.md](docs/references/glossary.md)
- Operations: [docs/operations/local-self-hosting.md](docs/operations/local-self-hosting.md)
- Verification: [docs/quality/verification.md](docs/quality/verification.md)
- Execution workflows: [docs/workflows/README.md](docs/workflows/README.md)

The approved foundation design record is
[docs/superpowers/specs/2026-05-09-trauma-foundation-design.md](docs/superpowers/specs/2026-05-09-trauma-foundation-design.md).
Open durable work belongs in [Backlog.md](Backlog.md). Keep task-specific plans
temporary and move lasting requirements into the owning semantic document.

Commit finalization exclusions for Sawyer live in
[.sawyer/exclude-whitelist.txt](.sawyer/exclude-whitelist.txt).
7 changes: 7 additions & 0 deletions Backlog.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
# Backlog

This file contains durable open outcomes only. Keep it under 20 items, remove
completed items, and put current behavior in semantic docs rather than expanding
this file into implementation plans.

No durable open outcomes are currently recorded.
Loading
Loading