Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
1999 commits
Select commit Hold shift + click to select a range
a3f583b
build(deps-dev): bump @tailwindcss/vite from 4.3.0 to 4.3.3 (#9892)
dependabot[bot] Jul 21, 2026
68ba7cc
Fail loudly on invalid config files (#9041)
lesbass Jul 21, 2026
c1f6698
fix(ui/invite): make pending-approval admin guidance non-clickable (#…
le-czs Jul 21, 2026
31c59f8
build(deps-dev): bump @playwright/test from 1.58.2 to 1.61.1 (#9887)
dependabot[bot] Jul 21, 2026
3e1dc90
fix(execution-policy): final-stage approval terminates the policy ins…
HKTITAN Jul 21, 2026
b565603
fix(server): accept Office issue attachments (#8562)
samrusani Jul 21, 2026
6439572
fix(ui): sync cron validity + settle branch test for radix-ui 1.6.4 (…
nickyleach Jul 21, 2026
0d2bfee
build(deps): bump radix-ui from 1.6.0 to 1.6.4 (#9895)
dependabot[bot] Jul 21, 2026
f4b65c1
fix(cli): preserve extension file when import selections are cleared …
kevinmanase Jul 21, 2026
98608dd
fix(cli): add missing company manifest fields to import selection tes…
aaymeloglu Jul 21, 2026
7e00f67
feat(connections): add v3 schema core (#9958)
cryppadotta Jul 21, 2026
d23fbf8
feat(connections): add AppDefinition Wave 1 catalog (#9981)
cryppadotta Jul 21, 2026
cac3c0f
feat(connections): add runtime subjects and grants (#9982)
cryppadotta Jul 21, 2026
7985c1e
refactor(codex-local): stage an allowlist for sandbox CODEX_HOME sync…
nickyleach Jul 22, 2026
5ed0b74
fix(runtime): scope PAPERCLIP_ env-binding strip to reserved keys (#9…
cryppadotta Jul 22, 2026
0b496c9
feat(secrets): add run-bound agent secret access (#9921)
cryppadotta Jul 22, 2026
d31a288
fix(acpx): support Windows agent spawning (#9980)
cryppadotta Jul 22, 2026
486ecac
chore(lockfile): refresh pnpm-lock.yaml (#9964)
github-actions[bot] Jul 22, 2026
2aef464
docs(release): add v2026.722.0 changelog (#10008)
cryppadotta Jul 22, 2026
d54ff52
test(heartbeat): await execution drain before cleanup (#10023)
cryppadotta Jul 22, 2026
b247bf7
feat(runtime): opt-in sandbox file-sync lifecycle hooks (API + provid…
nickyleach Jul 22, 2026
e1e3588
feat(cost-events): propagate issue.billing_code at heartbeat record t…
legacykeeperops Jul 22, 2026
47c3877
fix(release): use trusted publishing npm for bundled packages (#10030)
cryppadotta Jul 22, 2026
b57aa99
fix(test): stop flaky server-suite afterAll hook timeouts (#10024)
nickyleach Jul 22, 2026
8af70b9
fix(test): drain in-flight heartbeat runs before liveness teardown (#…
nickyleach Jul 22, 2026
4e8cd75
fix(release): add npm publish crash diagnostics (#10041)
cryppadotta Jul 22, 2026
39b94d0
fix(test): gate interaction-continuation retry barrier on terminal wr…
nickyleach Jul 22, 2026
f215444
feat(daytona): native file-sync lifecycle hooks over batch transfer (…
nickyleach Jul 22, 2026
8f7509c
fix(a11y): add aria-label to mobile tab selector in PageTabBar (#1871)
bluzername Jul 22, 2026
204c416
fix(release): publish bundled packages with trusted npm staging (#10047)
cryppadotta Jul 22, 2026
b431d4e
fix(a11y): add ARIA progressbar to QuotaBar component (#1878)
bluzername Jul 22, 2026
1b8738d
feat(cli): add --force to company export for non-interactive runs (#1…
nguyenm7 Jul 22, 2026
e55d702
feat(plugin-sdk): human-attributed issue comments for chat gateway pl…
nguyenm7 Jul 22, 2026
ad74fb5
Add a feature catalog build artifact derived from the experimental se…
devinfoley Jul 23, 2026
9edde68
feat(kubernetes): native file-sync lifecycle hooks over pod exec (#10…
nickyleach Jul 23, 2026
216d3d2
Managed-instance config: fail-closed PAPERCLIP_MANAGED_CONFIG parsing…
devinfoley Jul 23, 2026
c4cdcc4
Generalize bundled plugin provisioning: `ensureBundledKubernetesPlugi…
devinfoley Jul 23, 2026
0f898f9
Render managed experimental settings as locked, with a 'Managed by Pa…
devinfoley Jul 23, 2026
62e367c
fix(ui): rewrite recovery and blocked-notice copy in plain language (…
devinfoley Jul 23, 2026
04e070b
docs(skill): require agents to claim only monitors they actually sche…
devinfoley Jul 23, 2026
0ef3b32
Harden `POST /plugins/install`: canonicalize `localPath` for all inst…
devinfoley Jul 23, 2026
5a00040
feat(plugin-sdk): interactions/approvals respond + attachment read ca…
nguyenm7 Jul 23, 2026
8a3cc86
feat(acpx): stage workspace + route in-sandbox cwd for remote ACP lan…
nickyleach Jul 23, 2026
e1cc633
feat(acpx): per-adapter managed-home seed (x3) + Codex auth copy-back…
nickyleach Jul 23, 2026
1ebf525
fix(plugin-loader): deliver stored config to freshly-started plugin w…
nguyenm7 Jul 23, 2026
a7186dc
fix(plugin-sdk): thread companyId through configChanged + fail-closed…
nguyenm7 Jul 23, 2026
d36ea13
feat(acpx): stage once per remote ACP session - compatible resume reu…
nickyleach Jul 23, 2026
429792f
fix(interactions): stop wedging confirmation accept on a terminal wor…
devinfoley Jul 23, 2026
a17bee9
Allow trust-gated direct-parent issue reports (#10098)
cryppadotta Jul 23, 2026
3093c5e
fix(plugin-worker): resolve a company scope for proactive worker→host…
nguyenm7 Jul 23, 2026
f2f168f
fix(plugins): seed proactive company scopes before worker setup() + e…
nguyenm7 Jul 23, 2026
81f47e7
feat(secrets): thread the acting user into user-scoped secret resolut…
nickyleach Jul 23, 2026
148a5b1
Route blocked transitions to explicit unblock owners (#10112)
cryppadotta Jul 23, 2026
e3f8380
feat(skills): make summarize-status actions-first (#10117)
cryppadotta Jul 23, 2026
e206831
fix(interactions): tolerate legacy stored result outcomes so listInte…
nguyenm7 Jul 23, 2026
176a9e8
fix(built-in-agents): allow first-time setup of a needs_setup built-i…
devinfoley Jul 23, 2026
58ae799
fix(ci): regenerate lockfile for patch changes (#10132)
nickyleach Jul 23, 2026
e41ba30
feat(secrets): thread audit actor into skip-user-secret skills routes…
nickyleach Jul 23, 2026
b517b88
fix(acpx): decouple host proxy spawn cwd from in-sandbox remoteCwd (#…
nickyleach Jul 23, 2026
0650ae9
chore(lockfile): refresh pnpm-lock.yaml (#10136)
github-actions[bot] Jul 24, 2026
caae277
fix: deliver plugin agent session turns and replies (#10137)
nguyenm7 Jul 24, 2026
14f20be
ci: harden Docker image build workflow against lockfile drift and run…
devinfoley Jul 24, 2026
5648700
Exclude archived projects from the default project list route (#10146)
nickyleach Jul 24, 2026
7f76652
feat(sandbox): add task-scoped egress grants (#10155)
cryppadotta Jul 24, 2026
ee3ed01
fix(opencode): register configured model in runtime config (#10178)
cryppadotta Jul 24, 2026
965a827
feat(docker): publish a cloud image variant with built bundled plugin…
devinfoley Jul 24, 2026
2002c4f
refactor: remove redundant archived project filters (#10177)
nickyleach Jul 24, 2026
7e40ed8
feat(status-cards): add experimental status card update view (#10101)
cryppadotta Jul 24, 2026
b083b17
fix(db): use calendar month retention for backups (#3718)
LeonSGP43 Jul 24, 2026
3a16b91
feat(status-cards): single-message setup drives query and update prom…
cryppadotta Jul 24, 2026
c988122
fix(routines): show routines grouped by folder name (#10201)
nickyleach Jul 24, 2026
7014e46
fix(recovery): wake ambiguous successful runs on normal model (#10184)
cryppadotta Jul 24, 2026
762ce5b
feat(acpx): per-step timing observability for sandbox run-startup (#1…
nickyleach Jul 24, 2026
e4662b1
fix: preserve control plane access in Codex sandbox (#10152)
cryppadotta Jul 24, 2026
b3b07ae
fix(codex): preserve silent active builds (#10153)
cryppadotta Jul 24, 2026
d3c004d
Fix issue descriptions in structured wake payloads (#10151)
cryppadotta Jul 24, 2026
b996b71
Deduplicate wake-payload issue descriptions and compact resume deltas…
cryppadotta Jul 24, 2026
665408c
fix(codex): classify mid-turn harness crashes structurally as retriab…
cryppadotta Jul 24, 2026
8f08ec5
feat(status-cards): join summary-mentioned issues to watched set (#10…
cryppadotta Jul 24, 2026
30ff3d7
feat(routines): expose activity gate API (#9438)
cryppadotta Jul 24, 2026
cca2806
test(tool-gateway): make idle-down slot test deterministic via inject…
nickyleach Jul 24, 2026
4e00818
fix(runtime): support in-place workspace realization (#10230)
cryppadotta Jul 25, 2026
c481be4
fix(task-watchdogs): deduplicate unchanged stopped-state wakes (#10207)
cryppadotta Jul 25, 2026
4c55f0d
fix(inbox): hide external object summaries (#10020)
cryppadotta Jul 25, 2026
d1b9448
fix(server): stamp the real build version into images instead of the …
devinfoley Jul 25, 2026
2568bde
fix(adapter-utils): keep sandbox proxy sockets within Linux path limi…
cryppadotta Jul 26, 2026
aed4478
fix(pr-gardening): scope runs to instance-authored PRs (#10323)
cryppadotta Jul 27, 2026
197718b
feat(acpx): per-step round-trip + provider-latency attribution for sa…
nickyleach Jul 27, 2026
273315a
feat(server): provision managed sandbox environments from the managed…
devinfoley Jul 27, 2026
a3b293e
perf(adapter-utils): parallelize the two Daytona sandbox bridge setup…
nickyleach Jul 27, 2026
f6ab82d
feat(interactions): add interaction withdrawal and terminal-issue exp…
cryppadotta Jul 28, 2026
ab2bdfe
feat(routines): activity-gated advanced run policy (editor + run rows…
cryppadotta Jul 28, 2026
0cf64d3
feat(secrets): write through external values and deep-link details (#…
cryppadotta Jul 28, 2026
8339bcc
fix(ui): keep decision training under decisions (#10181)
cryppadotta Jul 28, 2026
71a6535
docs(execution-semantics): define routable blocking and watchdog rest…
cryppadotta Jul 28, 2026
1426494
fix(agents): disable cheap model profiles by default (#10019)
cryppadotta Jul 28, 2026
3b01562
docs(connections): cross-reference the identity model (identity vs. c…
cryppadotta Jul 28, 2026
c111ee4
feat(server): add per-user document stars (#9952)
cryppadotta Jul 28, 2026
030dd9d
feat(adapter-utils): provider-delegable syncIn seam with ordered post…
nickyleach Jul 28, 2026
c3bd0c5
feat(skills): add beta releases for the core Paperclip skill (#10228)
cryppadotta Jul 28, 2026
c274f10
feat(server): computed owner instance-admin elevation for cloud-manag…
devinfoley Jul 28, 2026
3d23c3b
perf(plugin-daytona): cache the started sandbox handle per lease (#10…
nickyleach Jul 28, 2026
1cd09ed
perf(heartbeat): reuse task sessions for issue-scoped timer wakes and…
cryppadotta Jul 28, 2026
0ccba45
feat(sandbox-providers): native providers honor postUploadCommands (D…
nickyleach Jul 28, 2026
7797995
perf(plugin-daytona): opt-in no-profile fast path for default-PATH ex…
nickyleach Jul 28, 2026
341993e
feat(sandbox-runtime): route all inbound staging through client.syncI…
nickyleach Jul 28, 2026
9ff7e1c
perf(adapter-utils): content-hash-skip process-session remote script …
nickyleach Jul 28, 2026
4881f54
build(deps): bump @cursor/sdk from 1.0.19 to 1.0.24 (#10298)
dependabot[bot] Jul 28, 2026
0a65321
build(deps): bump react-resizable-panels from 4.12.1 to 4.12.2 (#10301)
dependabot[bot] Jul 28, 2026
e950459
build(deps): bump better-auth from 1.6.23 to 1.6.25 (#10306)
dependabot[bot] Jul 28, 2026
00b43a7
build(deps): bump @tanstack/react-query from 5.101.2 to 5.101.4 (#10307)
dependabot[bot] Jul 28, 2026
fb680df
build(deps-dev): bump @storybook/addon-a11y from 10.4.2 to 10.5.4 (#1…
dependabot[bot] Jul 28, 2026
91e1eb4
build(deps): bump i18next from 26.3.1 to 26.3.6 (#10300)
dependabot[bot] Jul 28, 2026
dac7e66
build(deps-dev): bump storybook from 10.4.6 to 10.5.5 (#10303)
dependabot[bot] Jul 28, 2026
f9034ab
build(deps-dev): bump @types/node from 22.19.21 to 22.20.1 (#10304)
dependabot[bot] Jul 28, 2026
9f5af4e
fix(server): accept secret_ref binding objects in sandbox provider en…
devinfoley Jul 28, 2026
c8c2ae8
test(e2e): wait for connections fetch before asserting applications s…
nickyleach Jul 28, 2026
dc12197
fix: prevent duplicate built-in agents and self-heal reconciliation (…
devinfoley Jul 28, 2026
91c79d2
test(e2e): retry run-lock 409 in signoff-policy agentPatch (#10386)
nickyleach Jul 28, 2026
a90f816
build(deps): bump lexical from 0.46.0 to 0.48.0 (#10299)
dependabot[bot] Jul 28, 2026
487e33b
fix(codex-local): resolve GPT-5.6 model metadata at source (#9780)
cryppadotta Jul 28, 2026
b8ceddb
chore(lockfile): refresh pnpm-lock.yaml (#10391)
github-actions[bot] Jul 28, 2026
4eace88
feat(adapter-claude): add Claude Opus 5 to the static model fallback …
nguyenm7 Jul 28, 2026
db02ca7
ci: keep in-flight docker builds from being cancelled (#10403)
nickyleach Jul 28, 2026
ca92f72
ci: publish the cloud image in its own parallel job (#10408)
nickyleach Jul 28, 2026
5b34d26
build(deps): bump @agentclientprotocol/claude-agent-acp from 0.59.0 t…
dependabot[bot] Jul 29, 2026
11273c1
feat(server): resolve per-project-authorized referenced-project set f…
nickyleach Jul 29, 2026
0edb742
test(server): relocate referenced-project run-prep tests to a dedicat…
nickyleach Jul 29, 2026
170c1e5
fix(claude-local): trust Paperclip URLs in allowlist sandbox (#10438)
cryppadotta Jul 29, 2026
1452d5f
perf(ui): warm issue detail navigation (#10416)
cryppadotta Jul 29, 2026
2dca2df
docs: require Simplified Technical English for PR text (#10447)
cryppadotta Jul 29, 2026
9574cad
test(server): drain heartbeat runs to quiescence before low-trust tea…
nickyleach Jul 29, 2026
4c8d92f
fix(ui): leave agent detail after termination (#10451)
devinfoley Jul 29, 2026
d6e235c
perf(sandbox-providers): drop nvm sourcing from exec wrappers (#10443)
nickyleach Jul 29, 2026
78f8c6c
Recover managed bundled plugin workers on demand (#10429)
devinfoley Jul 29, 2026
7a5a217
fix(server): gate sandbox/ssh execution targets by shared remote-mana…
devinfoley Jul 29, 2026
7083c27
refactor(sandbox): retire the dead noProfile flag from the exec path …
nickyleach Jul 29, 2026
d51f42e
test(server): drain heartbeat runs to quiescence in sibling suite tea…
nickyleach Jul 29, 2026
15ce70d
feat(server): thread plural referenced-project workspaces through run…
nickyleach Jul 29, 2026
5c5366d
fix(server): honor explicit plugin RPC timeouts (#10460)
devinfoley Jul 29, 2026
6a267e0
feat(sandbox): stage referenced projects into the run sandbox (#10469)
nickyleach Jul 29, 2026
a93a74f
feat(server): surface referenced-project sync warnings and enable mul…
nickyleach Jul 30, 2026
24aa2f5
feat(ui): add animated paperclip page loaders (#10456)
cryppadotta Jul 30, 2026
a643612
feat(ui): add recency separators to task lists (#10454)
cryppadotta Jul 30, 2026
674d715
perf(sandbox): fold dead sandbox start round trips (bridge dirs + han…
nickyleach Jul 30, 2026
d5b9f6c
perf(sandbox): coalesce git-workspace stage-sync into one confined sy…
nickyleach Jul 30, 2026
c62fa8d
docs(agents): add create-paperclip-bundled-skill agent skill (#10477)
cryppadotta Jul 30, 2026
916c135
Replace host-to-host Cloud Sync with full-fidelity company Import/Exp…
devinfoley Jul 30, 2026
187a90b
Add opt-in in-flight run-log mirroring with graceful-shutdown flush (…
devinfoley Jul 30, 2026
efe8b3b
feat(skills-catalog): add optional /simplified-english skill (#10410)
cryppadotta Jul 30, 2026
fcf66f3
feat(skills): add managed skill rename API (#9688)
cryppadotta Jul 30, 2026
39666aa
fix(server): clarify execution policy decision comments (#9105)
samrusani Jul 30, 2026
a5d252d
feat(skills): add confirmed inbox gardening workflow (#10462)
cryppadotta Jul 30, 2026
1c52f02
Let cloud tenant sessions reach companies they hold memberships in (#…
devinfoley Jul 30, 2026
276ae3a
Harden company import: durable UI, async jobs, integrity guard, batch…
devinfoley Jul 30, 2026
7cfb655
fix(worktree): disable automatic database backups (#10520)
cryppadotta Jul 31, 2026
740554a
feat: add a no-op OpenTelemetry span seam for the sandbox startup pat…
nickyleach Jul 31, 2026
5ec7ce7
Upload company import packages as compressed zip uploads (fix large-c…
devinfoley Jul 31, 2026
5cffd5c
feat(sandbox): declare and collect the advisory read-write intent (#1…
nickyleach Jul 31, 2026
9f7565f
feat: activate OpenTelemetry spans on the sandbox start path (#10536)
nickyleach Jul 31, 2026
075951f
Fix import completion UX: inbox flood, false-failure message, stale c…
devinfoley Jul 31, 2026
dd1a7f5
Ensure app-home ownership before the privilege drop, not only on rema…
devinfoley Jul 31, 2026
6a3cbe1
fix(ui): load the full selected timeline window (#9576)
cryppadotta Jul 31, 2026
4813ed3
fix(db): harden embedded Postgres test start with bounded retry (#10540)
nickyleach Jul 31, 2026
70816c1
feat(daytona): add advisory bwrap command builder and capability prob…
nickyleach Jul 31, 2026
8c910b9
feat(daytona): activate the advisory bwrap wrapper at the execute sea…
nickyleach Jul 31, 2026
131d476
fix(ci): make PR-template inline-description contract explicit (#10558)
nickyleach Jul 31, 2026
b4a7a12
feat: make recovery updates quieter (#10542)
cryppadotta Jul 31, 2026
bec04da
fix(ui): make task header status and priority controls interactive (#…
cryppadotta Jul 31, 2026
bd53b99
feat(gemini-local): export detectGeminiQuotaExhausted for plugin adap…
but-noah Jul 31, 2026
cd7f849
fix(recovery): preserve hand-back wake liveness (#10562)
cryppadotta Jul 31, 2026
d295251
feat(adapter-claude): add Claude Sonnet 5 to the static model fallbac…
nguyenm7 Jul 31, 2026
51bb41c
Expose the running build commit on the unauthenticated health respons…
devinfoley Jul 31, 2026
c4f6264
docs(daytona): document operator enablement for the advisory bwrap wr…
nickyleach Jul 31, 2026
277857a
chore(repo): ignore macOS AppleDouble metadata files (#4720)
myaji35 Jul 31, 2026
b01f423
fix(server): export manual OpenTelemetry spans (#10565)
nickyleach Jul 31, 2026
521271e
build: bake the build commit into published images (#10566)
devinfoley Jul 31, 2026
c062600
chore(lockfile): refresh pnpm-lock.yaml (#10567)
github-actions[bot] Jul 31, 2026
53bcf38
feat: sync @-mentioned projects into remote sandboxes (confined sandb…
nickyleach Jul 31, 2026
ce40343
build: publish the cloud image variant for amd64 only (#10570)
devinfoley Jul 31, 2026
2137f85
fix(ui): correct Last checked timestamp in workspace close dialog (#2…
bluzername Jul 31, 2026
54e2031
fix(ui): accessibility and cleanup for IssueWorkspaceCard copy button…
bluzername Jul 31, 2026
1ee1275
fix(adapters): persist ACPX process identity for hot restart (#9838)
cryppadotta Jul 31, 2026
ea0dd39
build: make image layer caching actually hit (#10571)
devinfoley Jul 31, 2026
2cbbad1
docs: add External Task Protocol specification (#10568)
cryppadotta Jul 31, 2026
3176e1f
chore(lockfile): refresh pnpm-lock.yaml (#10573)
github-actions[bot] Jul 31, 2026
79eff0a
fix(scripts): self-heal isolated workspace provisioning when the base…
cryppadotta Jul 31, 2026
32c1a85
fix(server): self-heal execution workspaces whose recorded branch no …
cryppadotta Jul 31, 2026
f51cba3
fix(server): keep environment secret bindings consistent when re-poin…
devinfoley Jul 31, 2026
90ead23
feat(ui/server): name cross-company environment secret refs instead o…
devinfoley Jul 31, 2026
7301fae
fix(heartbeat): atomically claim due timer intervals (#10584)
cryppadotta Aug 1, 2026
c0b875c
fix(codex): let sandbox runs use the sandbox image's own Codex login …
devinfoley Aug 1, 2026
492555a
design(decisions): flatten decision cards to two task-borrowed types …
tonio-alucema Aug 1, 2026
fc5a308
feat(cli): add managed install, update, and service lifecycle (#10045)
cryppadotta Aug 1, 2026
b1ac92f
fix(ui): recover blockquotes the markdown editor escaped as backslash…
cryppadotta Aug 1, 2026
627728b
feat: add authoritative issue PATCH receipts (#10478)
cryppadotta Aug 1, 2026
70175d5
fix(garden-inbox): preserve declined candidates on reruns (#10586)
cryppadotta Aug 1, 2026
c911668
test(installer): cover cross-version update migrations (#10587)
cryppadotta Aug 1, 2026
2e4774a
fix(adapter-utils): correct confirmation wake semantics (#10588)
cryppadotta Aug 1, 2026
a29b105
fix(server): bound inherited workspace runtime services (#10589)
cryppadotta Aug 1, 2026
86b265b
test(ui): isolate Cases routing regression (#10591)
cryppadotta Aug 1, 2026
71231df
feat(audit): agent audit UI — company page + per-agent tab (#9744)
cryppadotta Aug 1, 2026
9c1f8e7
feat(decisions): add first-class propose mode (#10010)
cryppadotta Aug 1, 2026
ee9d907
fix(codex): do not inject a duplicate --skip-git-repo-check for sandb…
devinfoley Aug 1, 2026
b163c6c
fix(server): preserve hot restart intent across path upgrade (#10593)
cryppadotta Aug 1, 2026
92c3d9f
fix(server): stop requiring PAPERCLIP_DECISION_SIGNING_SECRET at star…
cryppadotta Aug 1, 2026
6401f4f
fix(sandbox): bundle git copy-back against the merge-base so diverged…
devinfoley Aug 1, 2026
c185e64
feat(ui): chat-style task view behind an experimental flag (#10606)
scotttong Aug 1, 2026
ee851fc
feat(heartbeat): expose cache-adjusted run cost (#10349)
cryppadotta Aug 1, 2026
8676795
ci: split e2e PR lane into three shards (#10629)
devinfoley Aug 1, 2026
a388ea1
Render workspace-ready comments as compact system notices (#10636)
cryppadotta Aug 1, 2026
8444e57
ci: pass e2e shard specs without separator (#10640)
devinfoley Aug 1, 2026
27f8c8d
feat(server): cap agent review rounds and escalate exhausted reviews …
devinfoley Aug 1, 2026
ada47be
fix(server): refuse agent-initiated issue assignment to paused agents…
devinfoley Aug 1, 2026
0f12721
fix(server): let board users cancel issues with an active review stag…
devinfoley Aug 1, 2026
a0dbe21
fix(server): stand down recovery while an operator-cancelled run is t…
devinfoley Aug 1, 2026
3dec88c
feat(agents): warn when an agent's escalation path routes to a paused…
devinfoley Aug 2, 2026
ddbcf53
fix(server): refuse agent delegation cycles back to an open ancestor'…
devinfoley Aug 2, 2026
592cade
feat(server): trigger the push-capability preflight from the issue's …
devinfoley Aug 2, 2026
e4b0152
fix(server): keep the agent invokable when a run fails on a workspace…
devinfoley Aug 2, 2026
14d4db6
fix(inbox): keep passive issue views out of Mine (#10581)
cryppadotta Aug 2, 2026
30c49c8
feat(decisions): add queues and prioritized attention feed (#10651)
cryppadotta Aug 2, 2026
173d6d2
Reclaim isolated worktree instances during teardown (#10649)
cryppadotta Aug 2, 2026
ec84eb7
fix(ui): defer Inbox re-sort to attention boundaries (#10623)
cryppadotta Aug 2, 2026
8540ce2
ci: shard general-server tests 4 ways (#10663)
devinfoley Aug 2, 2026
dcac49a
feat(workspaces): defer isolated setup until runtime start (#10653)
cryppadotta Aug 2, 2026
95d33e1
fix(inbox): archive tasks completed by human users (#10668)
cryppadotta Aug 2, 2026
0a09e4d
feat(decisions): add desk workflow and retention (#10672)
cryppadotta Aug 2, 2026
717684a
Add project folder browsing to skill imports (#9930)
cryppadotta Aug 2, 2026
2ffebd4
Test adapters in the environment a run would actually use (#10698)
devinfoley Aug 2, 2026
6008482
fix(decisions): remove clock race from sweep-expiry tests (#10701)
devinfoley Aug 2, 2026
8b83d69
feat(heartbeat): serialize shared-workspace issue runs with bounded b…
devinfoley Aug 2, 2026
772fa98
fix(ui): move IssueRow divider and hover wash to the row root (#10702)
scotttong Aug 2, 2026
bd86dbe
fix(codex-local): detect server-visible Codex credentials in ACP envi…
devinfoley Aug 2, 2026
799973f
fix(ui): hide empty inbox search sections (#10700)
devinfoley Aug 3, 2026
7a3815e
fix(heartbeat): surface the real cause when a git_worktree base canno…
devinfoley Aug 3, 2026
185515c
fix(external-objects): refresh PR status labels (#10704)
devinfoley Aug 3, 2026
97590ff
feat(dev): add pnpm dev:mobile and dev:both for prebuilt UI preview (…
devinfoley Aug 3, 2026
e0c2448
feat(server): authenticate server-side git clone and fetch with a com…
devinfoley Aug 3, 2026
75f6256
fix(server): resolve duplicate scrubGitCredentialText declaration on …
devinfoley Aug 3, 2026
2c90cf0
fix(server): serialize managed-checkout materialization and stop misa…
devinfoley Aug 3, 2026
d5045d6
fix(ui): keep mobile unread dots from indenting task rows (#10691)
cryppadotta Aug 3, 2026
bc5c392
fix(server): stop inferring PR credential preflight from issue text (…
cryppadotta Aug 3, 2026
c09ea71
feat(observability): add granular OpenTelemetry spans for sandbox sta…
nickyleach Aug 3, 2026
42d0ddc
test(e2e): deflake applications Connections list against the health s…
nickyleach Aug 3, 2026
ba396c6
feat(server): configure shared workspace concurrency (#10759)
cryppadotta Aug 3, 2026
af6b32d
feat(observability): add provider OTel spans - cache-hit flag, plugin…
nickyleach Aug 3, 2026
18f391e
feat(ui): add shared workspace concurrency select to workspace policy…
cryppadotta Aug 3, 2026
6a69a3d
refactor(observability): stop writing detailed per-step timing to the…
nickyleach Aug 3, 2026
9b9631b
feat(ui): chat-style tasks polish — rich-text composer, attachment ch…
scotttong Aug 3, 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
  •  
  •  
  •  
The diff you're trying to view is too large. We only load the first 3000 changed files.
377 changes: 377 additions & 0 deletions .agents/skills/check-pr/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,377 @@
---
name: check-pr
description: >
Check a GitHub, GitLab, or Perforce PR/MR/CL for review comments, failing
checks, and PR-body gaps. Use when asked to inspect, fix, or prepare a change
for submission.
license: MIT
compatibility: Requires git and gh (GitHub CLI), glab (GitLab CLI), or p4 (Perforce CLI) installed and authenticated.
metadata:
author: greptileai
version: "1.3"
allowed-tools: Bash(gh:*) Bash(glab:*) Bash(git:*) Bash(p4:*)
---

# Check PR

Analyze a pull request (GitHub), merge request (GitLab), or shelved changelist (Perforce) for review comments, status checks, and description completeness, then help address any issues found.

## Inputs

- **PR/MR/CL number** (optional): If not provided, detect the PR/MR for the current branch, or the default pending changelist for p4.

## Instructions

### 0. Detect platform

First check if the user is working in a Perforce depot by looking for a `.p4config` file or `P4CLIENT`/`P4PORT` environment variables:

```bash
# Check for Perforce environment
if p4 info >/dev/null 2>&1; then
VCS="perforce"
else
# Fall back to git remote detection
REMOTE_URL=$(git remote get-url origin)
if echo "$REMOTE_URL" | grep -qi "gitlab"; then
VCS="gitlab"
else
VCS="github"
fi
fi
```

For self-hosted GitLab instances whose hostname doesn't contain "gitlab", the user can override by passing `--vcs gitlab` as an input. For Perforce, the user can override by passing `--vcs perforce`.

### 1. Identify the PR/MR/CL

If a number was provided, use it. Otherwise, detect it:

**GitHub:**
```bash
gh pr view --json number,headRefName,headRefOid -q '{number: .number, branch: .headRefName, head: .headRefOid}'
```

**GitLab:**
```bash
glab mr view --output json | jq '.iid'
```

**Perforce:**
```bash
# List pending changelists for the current user/client
p4 changes -s pending -u $P4USER -c $P4CLIENT
```

Key field differences between platforms:
- GitHub: `number`, `headRefName`, `headRefOid`
- GitLab: `iid`, `source_branch`, `sha`
- Perforce: changelist number (CL), `shelved` files for in-review CLs

### 2. Fetch PR/MR/CL details

**GitHub:**
```bash
gh pr view <PR_NUMBER> --json title,body,state,reviews,comments,headRefName,headRefOid,statusCheckRollup
OWNER_REPO=$(gh repo view --json nameWithOwner -q .nameWithOwner)
gh api "repos/$OWNER_REPO/pulls/<PR_NUMBER>/comments"
gh api --paginate "repos/$OWNER_REPO/issues/<PR_NUMBER>/comments?per_page=100"
```

GitHub PRs are also issues, so general PR comments live on the issue comments endpoint. Greptile may edit a single general PR comment on each review cycle instead of creating a new review or comment. Always inspect the latest Greptile-authored general comment by `updated_at`, including any "Prompt to fix all with AI" section, before concluding that the PR is clear.

**GitLab:**
```bash
glab mr view <MR_IID> --output json
# Fetch discussions (inline diff comments are type "DiffNote"; general comments have null type)
glab api "projects/:fullpath/merge_requests/<MR_IID>/discussions"
```

For GitLab, paginate discussions if needed (add `?per_page=100&page=N`).

**Perforce:**
```bash
# Get changelist description, files, and status
p4 describe -s <CL_NUMBER>

# Get shelved files (for in-review CLs)
p4 describe -S <CL_NUMBER>

# Get the diff of the shelved changelist
p4 diff2 //...@=<CL_NUMBER> //...@=<CL_NUMBER>

# List review comments (if using p4 review workflow)
p4 review -c <CL_NUMBER>
```

Key Perforce CL fields:
- `Change`: changelist number
- `Status`: `pending`, `submitted`, `shelved`
- `Description`: the CL description / commit message
- `Files`: list of files in the CL

### 3. Wait for pending checks

Before analyzing, ensure all status checks have completed. If any checks are `PENDING` or `IN_PROGRESS` (GitHub) / `running` or `pending` (GitLab), poll every 30 seconds until all checks reach a terminal state.

**GitHub:** poll `statusCheckRollup` from `gh pr view`.

**GitLab:**
```bash
glab api "projects/:fullpath/merge_requests/<MR_IID>/pipelines"
```
Pipeline statuses: `running`, `pending`, `success`, `failed`, `canceled`, `skipped`. Poll until no pipeline has `running` or `pending` status.

**Perforce:** Perforce doesn't have built-in CI checks natively. If the team uses a review tool (Swarm, etc.) or an external CI triggered by shelve events, check the relevant system. Otherwise, proceed to analysis immediately.

### 4. Require a fresh Greptile review for the current head

For GitHub PRs, do not treat an existing Greptile review, comment, or summary as current unless it is tied to the PR's exact current `headRefOid`. This is especially important after pushing a new commit to an existing PR: a Greptile review on an older commit is stale, even if the PR still has a Greptile comment or prior review.

Fetch the current head SHA immediately before the Greptile gate:

```bash
HEAD_SHA=$(gh pr view <PR_NUMBER> --json headRefOid -q .headRefOid)
```

Then inspect check-runs for that commit and require a completed Greptile run:

```bash
OWNER_REPO=$(gh repo view --json nameWithOwner -q .nameWithOwner)
GREPTILE_CHECKS=$(gh api "repos/$OWNER_REPO/commits/$HEAD_SHA/check-runs?per_page=100" \
--jq '[.check_runs[] | select(.name | test("greptile"; "i"))]')

# A run only counts as a valid fresh pass when it has completed AND concluded cleanly.
# GitHub check-run conclusions: success, neutral, skipped, failure, timed_out,
# cancelled, action_required, stale. Treat success/neutral as clean;
# everything else (especially failure and action_required) must block.
FRESH_GREPTILE_COMPLETED=$(echo "$GREPTILE_CHECKS" \
| jq '[.[] | select(.status == "completed")] | length')
FRESH_GREPTILE_CLEAN=$(echo "$GREPTILE_CHECKS" \
| jq '[.[] | select(.status == "completed" and (.conclusion | IN("success","neutral")))] | length')
FRESH_GREPTILE_BLOCKING=$(echo "$GREPTILE_CHECKS" \
| jq '[.[] | select(.status == "completed" and ((.conclusion | IN("success","neutral")) | not))] | length')

if [ "$FRESH_GREPTILE_COMPLETED" = "0" ]; then
echo "Blocked: no completed Greptile review/check is tied to current PR head $HEAD_SHA."
echo "Request a fresh Greptile review against this head before marking the PR check done."
echo "Suggested trigger: gh pr comment <PR_NUMBER> --body \"@greptile review\""
exit 1
fi

if [ "$FRESH_GREPTILE_BLOCKING" != "0" ] || [ "$FRESH_GREPTILE_CLEAN" = "0" ]; then
echo "Blocked: Greptile completed on head $HEAD_SHA but did not conclude clean"
echo "(conclusion was failure/action_required/timed_out/cancelled/stale, or no clean run exists)."
echo "Address the findings, push, and re-run Greptile until it concludes success/clean on the new head."
exit 1
fi
```

If a Greptile check exists for the current head but is still pending or in progress, wait for it with the same polling pattern used by `greploop` rather than proceeding from older review material. If no Greptile check appears for the current head after a reasonable wait, report the PR as blocked on a fresh Greptile review for `HEAD_SHA` and stop. Do not mark the check complete from PR comments, PR reviews, or Greptile summaries that cannot be associated with the current head SHA.

For GitLab installations with Greptile integration, apply the same freshness rule against the MR's current head SHA:

```bash
# 1. Get the MR's current head SHA
MR_SHA=$(glab mr view <MR_IID> --output json | jq -r '.sha // .diff_refs.head_sha')

# 2. Find the latest pipeline for that EXACT sha, then the Greptile job within it.
LATEST_PIPELINE_ID=$(glab api "projects/:fullpath/merge_requests/<MR_IID>/pipelines" \
| jq -r --arg sha "$MR_SHA" '[.[] | select(.sha == $sha)] | sort_by(.id) | last | .id // empty')

if [ -n "$LATEST_PIPELINE_ID" ]; then
GREPTILE_JOBS=$(glab api "projects/:fullpath/pipelines/$LATEST_PIPELINE_ID/jobs" \
| jq --arg sha "$MR_SHA" '[.[] | select(.name | test("greptile"; "i"))
| {name, status, pipeline_sha: $sha}]')
else
GREPTILE_JOBS='[]'
fi

GREPTILE_JOB_SUCCESS=$(echo "$GREPTILE_JOBS" \
| jq '[.[] | select(.status == "success")] | length')
GREPTILE_JOB_BLOCKING=$(echo "$GREPTILE_JOBS" \
| jq '[.[] | select(.status != "success")] | length')

# 3. If Greptile integrates via MR notes instead of a CI job, require the newest
# Greptile note to reference the current head sha and report a clean review.
GREPTILE_NOTES=$(glab api "projects/:fullpath/merge_requests/<MR_IID>/discussions?per_page=100" \
| jq --arg sha "$MR_SHA" '[.[].notes[]
| select(.author.username | test("greptile"; "i"))]
| sort_by(.updated_at // .created_at)')
GREPTILE_NOTE_CLEAN=$(echo "$GREPTILE_NOTES" \
| jq --arg sha "$MR_SHA" 'if length == 0 then 0
elif ((last.body // "") | contains($sha) and test("Confidence Score:[[:space:]]*5/5|Confidence:[[:space:]]*5/5|\\b5/5\\b"; "i") and (test("Prompt To Fix|blocking issue|failed|action required"; "i") | not)) then 1
else 0 end')

if [ "$GREPTILE_JOB_SUCCESS" = "0" ] && [ "$GREPTILE_NOTE_CLEAN" = "0" ]; then
echo "Blocked: no successful Greptile job or completed-clean current-head Greptile note is tied to MR head $MR_SHA."
exit 1
fi

if [ "$GREPTILE_JOB_BLOCKING" != "0" ]; then
echo "Blocked: at least one Greptile job for MR head $MR_SHA did not succeed."
exit 1
fi
```

Block completion if, for `MR_SHA`, there is (a) no Greptile job or note at all (missing), (b) the newest Greptile job/note is tied to a different sha (stale), or (c) the Greptile job status is not `success`. A completed Greptile result for a different SHA is stale and must block completion.

For Perforce installations with Greptile integration, apply the same rule using the CL's current shelved-revision identity and the Greptile webhook/review artifact tied to it; a Greptile result for an earlier shelf is stale and must block completion.

### 5. Analyze the PR/MR

Once all checks are complete, evaluate these areas:

#### A. Status Checks

- Are all CI checks passing?
- If any are failing, identify which ones and the failure reason.

#### B. PR/MR Description

- Is the description complete and follows team conventions?
- Are all required sections filled in?
- Are there TODOs or placeholders that need updating?

#### C. Review Comments

- Inline code review comments that need addressing
- Look for bot review comments (e.g. from `greptile-apps[bot]` on GitHub, or the Greptile bot user on GitLab, linters, etc.)
- Human reviewer comments
- **Perforce:** review comments from `p4 review` or external review tools

#### D. General Comments

- Discussion comments on the PR/MR
- For GitHub, check the issue comments endpoint and use `updated_at` to catch bot comments edited in place. Greptile's latest edited summary can contain actionable items even when there are no new inline comments.
- Bot comments (deploy previews, etc.) - usually informational
- **Perforce:** CL description should include a clear summary, affected files rationale, and testing notes

### 6. Categorize issues

For each issue found, categorize as:

| Category | Meaning |
|---|---|
| **Actionable** | Code changes, test improvements, or fixes needed |
| **Informational** | Verification notes, questions, or FYIs that don't require changes |
| **Already addressed** | Issues that appear to be resolved by subsequent commits |

### 7. Report findings

Present a summary table:

| Area | Issue | Status | Action Needed |
|------|-------|--------|---------------|
| Status Checks | CI build failing | Failing | Fix type error in `src/api.ts` |
| Review | "Add null check" - @reviewer | Actionable | Add guard clause |
| Description | TODO placeholder in test plan | Actionable | Fill in test plan |
| Review | "Looks good" - @teammate | Informational | None |

### 8. Fix issues (if requested)

If there are actionable items:

1. Switch to the PR/MR's branch (git) or ensure files are open in the correct CL (Perforce) if not already.
2. Ask the user if they want to fix the issues.
3. If yes, make the fixes, then:

**GitHub/GitLab:** commit and push:
```bash
git add <files>
git commit -m "address review feedback"
git push
```

**Perforce:** open files for edit, make changes, and re-shelve:
```bash
p4 edit <file>
# make changes
p4 shelve -f -c <CL_NUMBER>
```

### 9. Resolve review threads

After addressing comments, resolve the corresponding review threads.

**Perforce** - Perforce does not have a native "resolve thread" concept. Instead, mark comments as addressed by updating the CL description or by responding in the review tool being used (Swarm, etc.). If using `p4 review`:

```bash
# Mark files as reviewed after addressing feedback
p4 review -c <CL_NUMBER>
```

**GitHub** - fetch unresolved thread IDs (paginate if needed - see [the GraphQL reference](references/graphql-queries.md)):

```bash
gh api graphql -f query='
query($cursor: String) {
repository(owner: "OWNER", name: "REPO") {
pullRequest(number: PR_NUMBER) {
reviewThreads(first: 100, after: $cursor) {
pageInfo { hasNextPage endCursor }
nodes {
id
isResolved
comments(first: 1) {
nodes { body path }
}
}
}
}
}
}'
```

If `hasNextPage` is true, repeat with `-f cursor=ENDCURSOR` to get remaining threads.

Then resolve threads that have been addressed or are informational:

```bash
gh api graphql -f query='
mutation {
resolveReviewThread(input: {threadId: "THREAD_ID"}) {
thread { isResolved }
}
}'
```

Batch multiple resolutions into a single mutation using aliases (`t1`, `t2`, etc.).

**GitLab** - fetch unresolved discussions (see [the GitLab API reference](references/gitlab-api.md)):

```bash
glab api "projects/:fullpath/merge_requests/<MR_IID>/discussions?per_page=100"
```

Filter for discussions where `"resolved": false`. Collect each discussion's `id`.

Resolve each discussion individually (GitLab has no batch resolution):

```bash
glab api --method PUT \
"projects/:fullpath/merge_requests/<MR_IID>/discussions/<DISCUSSION_ID>" \
--field resolved=true
```

Repeat for each unresolved discussion ID.

### 10. Multiple PRs/MRs/CLs

If checking a chain of PRs/MRs/CLs, process them sequentially.

**Perforce** - to check multiple changelists at once:
```bash
p4 changes -s pending -u $P4USER -c $P4CLIENT -l
```

## Output format

Summarize:
- PR/MR/CL title or description and current state
- Platform detected (GitHub / GitLab / Perforce)
- Status checks summary (passing/failing/pending) - or N/A for Perforce
- Total issues found
- Actionable items with descriptions
- Items that can be ignored with reasons
- Recommended next steps
Loading