Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
117 commits
Select commit Hold shift + click to select a range
e31eda2
chore(desktop): update fork app identity (#3)
incognitojam Aug 5, 2026
1f3ca80
feat(web): add completion chime (#5)
incognitojam Aug 5, 2026
59de34e
ci: publish signed fork nightlies (#2)
incognitojam Aug 5, 2026
fb0a396
ci: stabilize fork nightly tests (#6)
incognitojam Aug 5, 2026
b0ebcd0
feat(web): test completion sounds from settings (#7)
incognitojam Aug 5, 2026
f1c5de5
ci: verify fork nightlies in pull requests (#9)
incognitojam Aug 5, 2026
515e89b
fix(ci): authorize nightly branch promotion (#8)
incognitojam Aug 5, 2026
c0a821f
fix(ci): allow Apple notarization to finish (#10)
incognitojam Aug 6, 2026
c7c6f71
fix(ci): notify when nightly jobs time out (#12)
incognitojam Aug 6, 2026
65e4275
ci: separate fork merge and upstream checks (#13)
incognitojam Aug 7, 2026
48dd38c
fix(ci): publish the populated nightly draft (#15)
incognitojam Aug 7, 2026
95022ad
fix(ci): include changes in fork nightly notes (#16)
incognitojam Aug 7, 2026
b8d9d8f
ci: skip mobile native checks in fork CI (#21)
incognitojam Aug 7, 2026
47ceecd
fix(ci): publish fork nightly blockmaps (#20)
incognitojam Aug 7, 2026
2188a72
ci: add unsigned Windows x64 build to Fork Nightly (#17)
incognitojam Aug 7, 2026
f2c65a5
ci: update fork repository guards (#25)
incognitojam Aug 7, 2026
7665771
fix(identity): use yngatech distribution name (#27)
incognitojam Aug 7, 2026
1609f69
ci: move compute-heavy Ubuntu jobs to Blacksmith (#26)
incognitojam Aug 7, 2026
3d2202a
fix(ci): fully clone before upstream rebase (#28)
incognitojam Aug 7, 2026
a1f824e
feat(branding): identify yngatech distribution builds (#29)
incognitojam Aug 7, 2026
6cf7854
feat(web): show GitHub service outages (#14)
incognitojam Aug 7, 2026
c5b2221
fix(web): show command exit codes (#11)
incognitojam Aug 7, 2026
0c534c8
fix(web): middle-click terminal entries to close (#22)
incognitojam Aug 7, 2026
80bcae7
feat(web): show unsent drafts in the sidebar (#23)
incognitojam Aug 7, 2026
9b79a05
feat(web): add Avanti completion sound (#19)
incognitojam Aug 7, 2026
f15a2b6
fix(web): load command output on demand (#4)
incognitojam Aug 7, 2026
864d8f3
assets: apply yngatech brand colorway (#30)
incognitojam Aug 7, 2026
330597b
fix(ci): exclude builder debug release assets (#32)
incognitojam Aug 7, 2026
111b0a7
ci: move nightly builds to Blacksmith (#34)
incognitojam Aug 7, 2026
ea545c9
fix(release): omit CI commits from nightly changelogs
incognitojam Aug 8, 2026
4508387
feat(ci): add Linux x64 AppImage to Fork Nightly (#33)
incognitojam Aug 8, 2026
7000039
feat(web): start a thread from a GitHub issue (#31)
incognitojam Aug 8, 2026
ce52fb2
fix(web): show full command in expanded shell command view (#36)
incognitojam Aug 8, 2026
83409f1
fix(release): attribute upstream changelog entries (#37)
incognitojam Aug 8, 2026
46afeb5
fix(release): include all commits in nightly changelogs (#38)
incognitojam Aug 8, 2026
e873c6e
fix(client): promote rounded snooze time units (#45)
incognitojam Aug 8, 2026
a9a5cb9
feat(ci): publish rolling fork feature summaries (#47)
incognitojam Aug 8, 2026
9446003
feat(web): add view pull request command (#46)
incognitojam Aug 8, 2026
d2dffab
feat(server): report setup script outcomes (#40)
incognitojam Aug 8, 2026
c5ba6ba
feat(composer): sync drafts across web and desktop (#39)
incognitojam Aug 8, 2026
e000981
feat(mobile): sync composer drafts across devices (#44)
incognitojam Aug 8, 2026
e843e76
ci: right-size fork nightly runners (#50)
incognitojam Aug 8, 2026
ee692cf
docs: add stacked pull request guidance to AGENTS.md (#52)
incognitojam Aug 8, 2026
7cb1f9e
ci: skip expensive checks for docs changes (#54)
incognitojam Aug 8, 2026
4b78709
docs: clarify fork pull request policy (#53)
incognitojam Aug 8, 2026
90cc2b4
fix(desktop): separate fork Windows installation (#49)
incognitojam Aug 8, 2026
9261432
ci: extract Fork Nightly desktop builds (#55)
incognitojam Aug 8, 2026
a712e6a
fix(desktop): brand Windows process name (#56)
incognitojam Aug 8, 2026
0c84afb
refactor(web): rename completion sound component (#57)
incognitojam Aug 8, 2026
c5d8f4d
fix(release): generate clearer nightly changelogs (#59)
incognitojam Aug 8, 2026
dbf95d1
fix(server): separate fork migration history
incognitojam Aug 9, 2026
c07f76d
docs(agents): document rebase flow after main force-push (#64)
incognitojam Aug 9, 2026
7da9774
fix(chat): render Claude file edits as structured previews (#60)
incognitojam Aug 9, 2026
622b0ed
fix(release): make nightly changelog tooltip-safe and attributed (#61)
incognitojam Aug 9, 2026
c0b3355
fix(server): keep queued turns active during handoff (#65)
incognitojam Aug 9, 2026
304a0a5
feat(codex): show interactions with running commands (#58)
incognitojam Aug 9, 2026
e3bb457
fix(chat): show Codex file edit stats (#66)
incognitojam Aug 9, 2026
6607871
fix(web): align thread-row draft icon with upstream draft glyph (#69)
incognitojam Aug 10, 2026
54e2170
fix(release): write nightly changelog fixes as symptoms, not invarian…
incognitojam Aug 10, 2026
22e0b34
ci: move upstream rebase check from Fork Nightly to Fork CI (#68)
incognitojam Aug 10, 2026
29bd473
test(release): drop prompt-phrase assertions from changelog generator…
incognitojam Aug 10, 2026
9c3a720
feat(web): sound when agents await input (#72)
incognitojam Aug 10, 2026
a8e7cba
feat(chat): show sed range reads as file reads (#73)
incognitojam Aug 10, 2026
81b5ff4
Revert "feat(chat): show sed range reads as file reads (#73)"
incognitojam Aug 10, 2026
83174fa
ci(nightly): move schedule to waking hours (#67)
incognitojam Aug 10, 2026
ceceb25
ci(nightly): drop Windows build runner to 8 vCPU (#75)
incognitojam Aug 10, 2026
0731dc2
feat(chat): show sed range reads as file reads (#74)
incognitojam Aug 10, 2026
40f3e81
revert(chat): stop classifying sed commands as file reads (#77)
incognitojam Aug 11, 2026
c7d1c42
ci(fork): fail rebase when patch stack touches upstream migrations (#81)
incognitojam Aug 11, 2026
30dbb47
ci(nightly): promote verified rebased stack to main daily (#80)
incognitojam Aug 11, 2026
9d1181c
fix(web): keep merge confirmation copy stable (#82)
incognitojam Aug 11, 2026
b0be520
fix(web): preserve sidebar project filter (#83)
incognitojam Aug 11, 2026
3b1d9a7
feat(web): retarget Cmd+Shift+G to focus the pull request tab (#78)
incognitojam Aug 11, 2026
f68ae66
fix(server): follow selected pull request remote (#79)
incognitojam Aug 11, 2026
687cd2c
ci: restore workflow changes dropped by stale stack promotion (#93)
incognitojam Aug 11, 2026
fd941f9
feat(web): add copy path to open menu (#89)
incognitojam Aug 11, 2026
ce8d85f
feat(web): edit diff panel comments (#88)
incognitojam Aug 11, 2026
f54aa30
fix(web): show first thread completions as unread (#76)
incognitojam Aug 11, 2026
f19a041
feat(web): derive nightly artwork from theme pigments (#96)
incognitojam Aug 12, 2026
b43933c
feat(web): run shell code blocks in terminal (#97)
incognitojam Aug 12, 2026
9bf203e
fix(server): clear same-turn follow-up state (#106)
incognitojam Aug 12, 2026
c93068c
fix(web): keep pull request details up to date (#101)
incognitojam Aug 12, 2026
6590b1a
fix(web): remove sidebar distribution chip (#104)
incognitojam Aug 12, 2026
9009941
fix(web): expand pull request changes by default (#105)
incognitojam Aug 12, 2026
d89c975
ci(nightly): reject stale source stacks (#95)
incognitojam Aug 12, 2026
8af5245
fix(web): render repository images in pull requests (#103)
incognitojam Aug 12, 2026
a9d729b
feat(server): assign stable workspace ports (#100)
incognitojam Aug 12, 2026
6b7df70
docs: clarify verification and pull request guidance (#108)
incognitojam Aug 12, 2026
3ad1520
feat(desktop): open terminal browser intents in preview (#107)
incognitojam Aug 12, 2026
da40a03
ci(nightly): hide mobile-only desktop highlights (#109)
incognitojam Aug 12, 2026
ec3512f
feat(desktop): download updates in background (#110)
incognitojam Aug 12, 2026
ed6d6b4
feat(web): default clone path to the repository name (#111)
incognitojam Aug 13, 2026
9fdd241
fix(web): preserve chat text selection (#114)
incognitojam Aug 13, 2026
c9427f0
feat(chat): name tool calls by what they did (#117)
incognitojam Aug 13, 2026
9ed6f5e
ci: move Fork CI test and nightly Windows to free runners (#112)
incognitojam Aug 13, 2026
905a3d1
fix(web): restore fork artwork on the default theme (#113)
incognitojam Aug 13, 2026
4f251c2
ci: drop the unused merge queue trigger from Fork CI (#119)
incognitojam Aug 13, 2026
022d0d9
test(web): stop MessagesTimeline tests silently skipping under load (…
incognitojam Aug 13, 2026
67c4ead
ci: move scheduled builds to GitHub runners (#121)
incognitojam Aug 13, 2026
bf538d2
ci(nightly): cache changelog extraction per pull request (#120)
incognitojam Aug 13, 2026
ca89ee3
feat(source-control): wire up fork remotes on clone (#123)
incognitojam Aug 13, 2026
85903b1
fix(mobile): name the add-project sheet screens (#124)
incognitojam Aug 13, 2026
aabfff1
fix(server): preserve PR association after branch pruning (#125)
incognitojam Aug 14, 2026
c899505
ci(nightly): waive missing main patches per commit (#126)
incognitojam Aug 14, 2026
34feb59
ci(nightly): fail source_ref runs when main moves mid-run (#127)
incognitojam Aug 14, 2026
87a2ef4
fix(chat): hide worktree names from file paths (#129)
incognitojam Aug 14, 2026
9d5b8ce
fix(web): redesign app update button (#128)
incognitojam Aug 14, 2026
5d83f08
ci(fork): split server tests from workspace tests (#130)
incognitojam Aug 14, 2026
b273819
fix(server): bound GitHub PR query cost (#131)
incognitojam Aug 14, 2026
5846572
fix(web): fully highlight TSX diffs (#132)
incognitojam Aug 14, 2026
b5386c8
ci(fork): use free runner for checks (#133)
incognitojam Aug 14, 2026
12180d1
feat(web): enable GitHub outage alerts by default (#136)
incognitojam Aug 14, 2026
1038bdd
feat(web): open GitHub references from pull request bodies (#134)
incognitojam Aug 14, 2026
1e1a61c
feat(web): toggle all folders in Files tab (#137)
incognitojam Aug 14, 2026
4a12f3b
feat(web): move pull request checks to a tab (#138)
incognitojam Aug 14, 2026
ea53c11
chore(web): format settings restore dependencies
incognitojam Aug 15, 2026
ae407c4
feat(web): open the preview when an action with previewUrl runs
alex-woodhouse Aug 15, 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
  •  
  •  
  •  
118 changes: 118 additions & 0 deletions .github/scripts/check-source-stack.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
#!/usr/bin/env bash
# Verify that a manually supplied nightly source contains every fork patch
# present on main. This catches accidentally stale stacks; it is not a
# security boundary or a net-tree comparison (a later revert can still retain
# an earlier commit's patch-id). The refs must already exist locally, and the
# fork's squash-merged patch stack is expected to have linear history.
set -euo pipefail

main_ref="${1:?main ref is required}"
candidate_ref="${2:?candidate ref is required}"
upstream_ref="${3:?upstream ref is required}"
waived_input="${4:-}"

for ref in "$main_ref" "$candidate_ref" "$upstream_ref"; do
git rev-parse --verify "${ref}^{commit}" >/dev/null
done

# Waivers are the reviewed commits themselves, not a blanket override: a
# patch that merges to main after the review is not on the list and still
# fails the dispatch. The former allow_missing_main_patches boolean waived
# every missing patch at once, so it could not make that distinction.
if [[ "$waived_input" == "true" ]]; then
echo "The allow_missing_main_patches boolean was replaced by waived_main_patches; list each reviewed commit instead." >&2
exit 1
fi
if [[ "$waived_input" == "false" ]]; then
waived_input=""
fi

waived_entries=()
normalized_waivers="${waived_input//[$'\n',]/ }"
read -r -a waived_entries <<< "$normalized_waivers" || true

waived_commits=()
if (( ${#waived_entries[@]} > 0 )); then
for entry in "${waived_entries[@]}"; do
if ! commit=$(git rev-parse --verify --quiet "${entry}^{commit}"); then
echo "waived_main_patches entry '${entry}' does not resolve to a commit." >&2
exit 1
fi
waived_commits+=("$commit")
done
fi

is_waived() {
local wanted="$1" waived
(( ${#waived_commits[@]} > 0 )) || return 1
for waived in "${waived_commits[@]}"; do
if [[ "$waived" == "$wanted" ]]; then
return 0
fi
done
return 1
}

describe_commit() {
printf ' %s %s\n' \
"$(git rev-parse --short=12 "$1")" \
"$(git show -s --format=%s "$1")"
}

cherry_output=$(git cherry "$candidate_ref" "$main_ref" "$upstream_ref")

missing_commits=()
while read -r status commit; do
if [[ "$status" == "+" ]]; then
missing_commits+=("$commit")
fi
done <<< "$cherry_output"

if (( ${#missing_commits[@]} == 0 )); then
echo "source_ref contains every patch currently carried by main."
if (( ${#waived_commits[@]} > 0 )); then
echo "Every waived_main_patches entry is present after all; the waivers were not needed." >&2
fi
exit 0
fi

waived_missing=()
unwaived_commits=()
for commit in "${missing_commits[@]}"; do
if is_waived "$commit"; then
waived_missing+=("$commit")
else
unwaived_commits+=("$commit")
fi
done

if (( ${#waived_missing[@]} > 0 )); then
{
echo "Waived main patches missing from source_ref (reviewed as intentionally reshaped):"
echo
for commit in "${waived_missing[@]}"; do
describe_commit "$commit"
done
echo
} >&2
echo "::warning title=Waived missing main patches::Continuing past ${#waived_missing[@]} reviewed patch-id difference(s) listed in the log." >&2
fi

if (( ${#unwaived_commits[@]} == 0 )); then
exit 0
fi

{
echo "source_ref is missing patch-id-equivalent commits currently carried by main:"
echo
for commit in "${unwaived_commits[@]}"; do
describe_commit "$commit"
done
echo
} >&2

echo "Refresh the resolution from current main before dispatching it." >&2
echo "If conflict resolution intentionally reshaped these patches, re-dispatch" >&2
echo "listing each reviewed commit in waived_main_patches." >&2
echo "::error title=source_ref is missing patches from main::Refresh the stack or waive each reviewed patch-id difference explicitly." >&2
exit 1
32 changes: 32 additions & 0 deletions .github/scripts/rebase-onto-upstream.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
#!/usr/bin/env bash
# Rebase the checked-out patch stack onto the tip of upstream main. Sourced by
# Fork CI's upstream-rebase job and Fork Nightly's prepare step so both use
# the same upstream remote and rebase mechanics.
set -euo pipefail

git config user.name "github-actions[bot]"
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
git remote add upstream https://github.com/pingdotgg/t3code.git
git fetch --no-tags upstream main
# shellcheck disable=SC2034 # Consumed by scripts that source this file.
UPSTREAM_REF=$(git rev-parse FETCH_HEAD)
git rebase "$UPSTREAM_REF"

# The patch stack must never touch upstream's migration manifest or migration
# files. A fork commit in upstream's numbered sequence collides silently on a
# later rebase: the SQL migrator treats the highest recorded ID as a watermark,
# so existing installs skip the upstream migration that lands on the same slot.
offending_migration_files=$(git diff --name-only "$UPSTREAM_REF" HEAD -- \
'apps/server/src/persistence/Migrations.ts' \
'apps/server/src/persistence/Migrations/')
if [[ -n "$offending_migration_files" ]]; then
{
echo "Error: the fork patch stack modifies upstream migration files:"
echo
echo "$offending_migration_files"
echo
echo "Fork migrations belong in apps/server/src/persistence/ForkMigrations/"
echo "with their own append-only history. See docs/internals/fork-migrations.md."
} >&2
exit 1
fi
18 changes: 18 additions & 0 deletions .github/scripts/release-changelog.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
#!/usr/bin/env bash

list_fork_release_commits() {
local previous_release_ref="$1"
local fork_source_ref="$2"
local upstream_ref="$3"

if [[ -n "$previous_release_ref" ]]; then
git rev-list --reverse --cherry-pick --right-only \
"${previous_release_ref}...${fork_source_ref}" \
--not "$upstream_ref"
return
fi

local fork_base
fork_base=$(git merge-base "$fork_source_ref" "$upstream_ref")
git rev-list --reverse "${fork_base}..${fork_source_ref}" --not "$upstream_ref"
}
Loading
Loading