Skip to content

feat(tasks): select repositories per space task - #76581

Merged
trunk-io[bot] merged 5 commits into
masterfrom
posthog-code/task-specific-space-repositories
Aug 6, 2026
Merged

feat(tasks): select repositories per space task#76581
trunk-io[bot] merged 5 commits into
masterfrom
posthog-code/task-specific-space-repositories

Conversation

@k11kirky

@k11kirky k11kirky commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

Problem

Space-level repositories are useful defaults, but individual tasks sometimes need a different repository set. Local tasks need the equivalent folder selection.

Changes

  • Add a repository/folder chip to the composer's selector row, beside the local/cloud chip, in the space composer and the space new-task screen.
  • The chip opens a dialog: cloud tasks pick multiple repositories, local tasks pick a folder.
  • A checkbox in the dialog saves the repository selection back to the whole space.
  • Task creation sends the explicit repositories selection; without one it falls back to the space defaults.

Rebased onto the composer chrome redesign (#77565). The space repository mutation and TaskChannel fields now come from #77252; this PR only consumes them.

How did you test this code?

  • pnpm --filter @posthog/core exec vitest run src/task-detail/taskInput.test.ts src/task-detail/taskCreationSaga.test.ts
  • pnpm --filter @posthog/ui exec vitest run src/features/canvas/components/WebsiteNewTask.test.tsx src/features/canvas/hooks/useTaskChannels.test.tsx
  • pnpm --filter @posthog/core typecheck, pnpm --filter @posthog/ui typecheck
  • Biome checks on all changed desktop files

The taskInput tests cover preserving task-specific cloud repositories and retaining an explicit local folder on repo-optional tasks. I did not manually drive the Electron UI.

Automatic notifications

  • Publish to changelog?

Docs update

No docs change. This extends an in-product task creation control.

🤖 Agent context

Autonomy: Human-driven (agent-assisted)

Codex implemented the original change; Claude (PostHog Code) rebased it onto current master and aligned it with the composer redesign. Decisions during the rebase: dropped the PR's duplicate updateTaskChannel client method, useUpdateTaskChannelRepositories hook, and TaskChannel fields in favor of the identical implementations #77252 landed on master; moved the repository trigger from the removed attachmentsPrefix slot into the selector row as a chip button styled like WorkspaceModeSelect, renaming TaskRepositoryAttachment to TaskRepositoryChip. Skills invoked: /writing-pr-descriptions.


Created with PostHog Code

@github-actions

github-actions Bot commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

Hey @k11kirky! 👋

It looks like your git author email on this PR isn't your @posthog.com address (k11kirky@gmail.com). Since you're on the PostHog team, it's worth pointing your local git author email at your @posthog.com address. Why it matters:

  • Consistent work identity in git history — internal tooling that attributes commits to team members keys off your @posthog.com address.
  • Keeps team contributions easy to tell apart from external community ones when scanning history.

You can fix it for this repo with:

git config user.email "you@posthog.com"

Or set it globally with git config --global user.email "you@posthog.com". No need to redo this PR — just a nudge for next time. 🙂

@github-actions github-actions Bot added the feature/desktop Feature Tag: Desktop label Aug 3, 2026
@trunk-io

trunk-io Bot commented Aug 3, 2026

Copy link
Copy Markdown

Static BadgeStatic BadgeStatic Badge

View Full Report ↗︎Docs

Base automatically changed from posthog-code/spaces-linked-repo-desktop to master August 3, 2026 11:57
@trunk-io

trunk-io Bot commented Aug 3, 2026

Copy link
Copy Markdown

😎 Merged successfully - details.

@github-actions

github-actions Bot commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

🤖 CI report

⚠️ Bundle size — 🔺 +345 B (+0.0%)

Uncompressed size of every built .js bundle, compared against the base branch.

Total: 65.51 MiB · 🔺 +345 B (+0.0%)

No file changed by more than 1000 B.

Posted automatically by build-bundle-size-report · uncompressed bytes from dist-report

Eager graph — within budget

How much code each root ships on the eager path — downloaded and parsed before the surface is interactive. Measured from the esbuild output chunks (post-tree-shake, static imports only); lazy import() / React.lazy chunks are not counted.

Root Eager (shipped) Δ vs base Budget
entry (logged-out pages, app bootstrap)
src/index.tsx
1.25 MiB · 22 files no change ███░░░░░░░ 27.7% of 4.51 MiB
authenticated shell (every logged-in page)
src/scenes/AuthenticatedShell.tsx
8.14 MiB · 3,035 files 🟢 -14 B (-0.0%) ████████░░ 83.8% of 9.71 MiB

🟢 node_modules/monaco-editor/ stays out of src/index.tsx
🟢 src/lib/components/ActivityLog/describers stays out of src/index.tsx
🟢 [object Object] stays out of src/index.tsx
🟢 [object Object] stays out of src/index.tsx
🟢 node_modules/monaco-editor/ stays out of src/scenes/AuthenticatedShell.tsx
🟢 src/lib/components/ActivityLog/describers stays out of src/scenes/AuthenticatedShell.tsx
🟢 [object Object] stays out of src/scenes/AuthenticatedShell.tsx
🟢 [object Object] stays out of src/scenes/AuthenticatedShell.tsx

Largest files eagerly shipped from src/index.tsx
Size File
126.8 KiB ../node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.production.min.js
24.6 KiB ../node_modules/.pnpm/buffer@6.0.3/node_modules/buffer/index.js
6.3 KiB ../node_modules/.pnpm/react@18.3.1/node_modules/react/cjs/react.production.min.js
4.5 KiB ../node_modules/.pnpm/@jspm+core@2.1.0/node_modules/@jspm/core/nodelibs/browser/process.js
3.9 KiB ../node_modules/.pnpm/scheduler@0.23.2/node_modules/scheduler/cjs/scheduler.production.min.js
1.4 KiB ../node_modules/.pnpm/base64-js@1.5.1/node_modules/base64-js/index.js
1.3 KiB src/RootErrorBoundary.tsx
912 B ../node_modules/.pnpm/ieee754@1.2.1/node_modules/ieee754/index.js
789 B src/scenes/ChunkLoadErrorBoundary.tsx
762 B src/index.tsx
Largest files eagerly shipped from src/scenes/AuthenticatedShell.tsx
Size File
285.5 KiB ../node_modules/.pnpm/posthog-js@1.410.1/node_modules/posthog-js/dist/rrweb.js
267.7 KiB ../node_modules/.pnpm/@posthog+icons@0.38.0_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/@posthog/icons/dist/posthog-icons.es.js
235.5 KiB src/taxonomy/core-filter-definitions-by-group.json
231.5 KiB ../node_modules/.pnpm/posthog-js@1.410.1/node_modules/posthog-js/dist/module.js
154.3 KiB ../node_modules/.pnpm/re2js@0.4.1/node_modules/re2js/build/index.esm.js
126.8 KiB ../node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.production.min.js
105.3 KiB src/lib/api.ts
94.7 KiB ../packages/quill/packages/quill/dist/index.js
93.3 KiB ../node_modules/.pnpm/prosemirror-view@1.40.1/node_modules/prosemirror-view/dist/index.js
90.6 KiB ../node_modules/.pnpm/@tiptap+core@3.20.6_@tiptap+pm@3.20.6/node_modules/@tiptap/core/dist/index.js

Posted automatically by check-eager-graph · sizes are eager output bytes (shipped, post-tree-shake) from the esbuild metafile · part of #32479

Toolbar bundle — eager 2.19 MiB within budget

What the toolbar ships to customer pages, measured from the esbuild output (minified, post-tree-shake). The eager set is the entry plus everything statically imported from it — fetched before any feature runs; deferred chunks load lazily. The eager guardrail is 5.72 MiB. Each output file must also stay below 10 MB, where CloudFront stops compressing it. The module boundary is enforced separately by check-toolbar-graph.

Metric Size Δ vs base Budget
Eager (shipped)
entry + static imports
2.19 MiB · 17 files no change ████░░░░░░ 38.3% of 5.72 MiB
Deferred (lazy) 2.08 MiB · 33 files no change n/a — loads on demand
Loader dist/toolbar.js 1.1 KiB no change █░░░░░░░░░ 5.8% of 19.5 KiB
Largest eagerly-shipped chunks
Size File
718.3 KiB dist/toolbar/toolbar-app-FT4UJ3IP.css
551.4 KiB dist/toolbar/chunk-chunk-TKZ3SULZ.js
484.6 KiB dist/toolbar/chunk-chunk-T44C2V5C.js
133.6 KiB dist/toolbar/chunk-chunk-PETGQ2AR.js
131.8 KiB dist/toolbar/chunk-chunk-T5KY5WYR.js
71.0 KiB dist/toolbar/toolbar-app-HOL6RSL7.js
69.0 KiB dist/toolbar/chunk-chunk-27JL52RE.js
35.6 KiB dist/toolbar/chunk-chunk-T3UPWJAA.js
20.9 KiB dist/toolbar/chunk-chunk-YJS276P3.js
12.2 KiB dist/toolbar/chunk-chunk-PIK3PADE.js

Posted automatically by check-toolbar-size · sizes are toolbar output bytes (shipped, post-tree-shake) from the esbuild metafile

Dist folder size — 🟢 -158 B (-0.0%)

Total size of the built frontend/dist folder (all assets), compared against the base branch.

Total: 1383.89 MiB · 🟢 -158 B (-0.0%)

@github-actions

github-actions Bot commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

🦔 Hogbox preview · ✅ ready

▶ Open the preview

🔑 Login test@posthog.com / 12345678 (demo data)
🧩 Running this PR's backend and frontend, on the PostHog :master base
🔗 Link stable across rebuilds — a re-push swaps the box underneath, the URL stays
🔒 Access tailnet only (PostHog VPN)
🛠️ Admin inspect & debug state in hogland
💤 Idle sleeps after ~30 min idle (snapshot to S3, zero node cost) and wakes on your next visit in ~30s, behind a brief "waking up" screen

commit afa6334 · box box-7ae3325ec33c · ready in 931s (push → usable) · build log · rebuilds on every push, torn down on close

@pr-assigner-resolver-posthog

Copy link
Copy Markdown

👀 Auto-assigned reviewers

These soft owners were skipped because they only have minor changes here. Nothing blocks merge, so self-assign if you'd like a look:

  • @PostHog/team-self-driving (ee/owners.yaml)
  • @PostHog/team-devex (posthog/owners.yaml)

Soft owners come from each directory's owners.yaml and each product's product.yaml (resolved nearest-file-wins). The locator after each owner is the file that decided it. Generated files and lockfiles are ignored when deciding ownership.

@k11kirky
k11kirky force-pushed the posthog-code/task-specific-space-repositories branch from afa6334 to f56420c Compare August 3, 2026 12:38
@greptile-apps

greptile-apps Bot commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

Reviews (1): Last reviewed commit: afa6334 | Re-trigger Greptile

@k11kirky
k11kirky force-pushed the posthog-code/task-specific-space-repositories branch 2 times, most recently from 2046075 to f8db05e Compare August 4, 2026 10:34
@github-actions

github-actions Bot commented Aug 4, 2026

Copy link
Copy Markdown
Contributor

React Doctor found 12 issues in 3 files · 12 warnings.

12 warnings

apps/code/src/main/platform-adapters/desktop-pi-rpc-client-factory.ts

packages/ui/src/features/canvas/components/ChannelHomeComposer.tsx

packages/ui/src/features/task-detail/components/TaskInput.tsx

Reviewed by React Doctor for commit 7c2e681.

Comment on lines +162 to +167
useEffect(() => {
setTaskRepositories(
channelRepositoriesKey ? channelRepositoriesKey.split("\n") : [],
);
setTaskGithubIntegration(channelGithubIntegration);
}, [channelRepositoriesKey, channelGithubIntegration]);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Data transformation bug: The split logic incorrectly handles edge cases. When channelRepositories is [""] (array with empty string), join("\n") produces "", which is falsy, causing the ternary to return [] instead of [""]. This loses data.

// Fix: Check array length instead of string truthiness
const channelRepositoriesKey = channelRepositories.join("\n");
useEffect(() => {
  setTaskRepositories(channelRepositories);
  setTaskGithubIntegration(channelGithubIntegration);
}, [channelRepositoriesKey, channelGithubIntegration]);

The join/split pattern is unnecessary since arrays can be dependencies directly when used with a stable key for comparison.

Suggested change
useEffect(() => {
setTaskRepositories(
channelRepositoriesKey ? channelRepositoriesKey.split("\n") : [],
);
setTaskGithubIntegration(channelGithubIntegration);
}, [channelRepositoriesKey, channelGithubIntegration]);
const channelRepositoriesKey = channelRepositories.join("\n");
useEffect(() => {
setTaskRepositories(channelRepositories);
setTaskGithubIntegration(channelGithubIntegration);
}, [channelRepositoriesKey, channelGithubIntegration]);

Spotted by Graphite

Fix in Graphite


Is this helpful? React 👍 or 👎 to let us know.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The [""] case isn't producible here — repositories are non-empty org/repo strings coming from the repository picker or the backend channel row, so join/split round-trips losslessly for all real inputs (the ternary exists to map [] correctly). The suggested version also reads channelRepositories inside the effect while depending only on the joined key, which Biome's useExhaustiveDependencies rejects — that lint constraint is why the string-key pattern is used. Leaving as is.

Generated-By: PostHog Code
Task-Id: 7d648577-8338-47ee-a9c4-5a168289074d
Generated-By: PostHog Code
Task-Id: 7d648577-8338-47ee-a9c4-5a168289074d
Generated-By: PostHog Code
Task-Id: e301f85c-0c79-4e9a-a42c-9d2c32da40d8
@k11kirky
k11kirky force-pushed the posthog-code/task-specific-space-repositories branch from 10fca90 to c7eff25 Compare August 5, 2026 10:06

@adamleithp adamleithp left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

gives users confidence in where they're working, lovely QOL update

Each composer held the repository/folder pick in local component state, so a selection made on the new-task screen vanished when navigating to the space home. The draft now lives in a per-space zustand store shared by both surfaces, and a failed save-to-space surfaces a toast instead of rolling back silently.

Generated-By: PostHog Code
Task-Id: 11cdce8b-166b-4996-8b91-674ab1e9d675
The shared draft outlived the task it was picked for, silently overriding the space defaults for every later task. Clear it on successful creation, mirroring the prompt draft's lifecycle; the dialog's "save to space" checkbox remains the durable path.

Generated-By: PostHog Code
Task-Id: 11cdce8b-166b-4996-8b91-674ab1e9d675
@k11kirky

k11kirky commented Aug 6, 2026

Copy link
Copy Markdown
Contributor Author

/trunk merge

@trunk-io
trunk-io Bot merged commit 591f68d into master Aug 6, 2026
195 checks passed
@trunk-io
trunk-io Bot deleted the posthog-code/task-specific-space-repositories branch August 6, 2026 13:40
@deployment-status-posthog

Copy link
Copy Markdown

Deploy status

Environment Status Deployed At Workflow
dev ✅ Deployed 2026-08-06 14:18 UTC Run
prod-us ⏳ Pending
prod-eu ⏳ Pending

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

feature/desktop Feature Tag: Desktop

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants