GV

GeezerVison

The World Wide Web, restored to 800 pixels of glory.

Home|About|Gaming cabinet|Archives|How it works|Starter sites

On this site

  • Sign in
  • ActionsCI/CD and automation
  • CodespacesCloud development environments
  • All Features
  • Documentation
  • Training
  • Certifications
  • Build with Copilot
  • Customize Copilot
  • Integrations
  • Trending repos
  • GitHub Sponsors
  • Developer articles
  • Enterprises

This view

  • Original page
  • New address

GeezerVison is showing github.com — refactor(site/src/pages/AgentsPage): extract SkillEditorForm and shared skill helpers by jaaydenh · Pull Request #30854 · coder/coder

Conversation

@jaaydenh

@jaaydenh jaaydenh commented Oct 15, 2026 •
edited
Loading

Uh oh!

There was an error while loading. Please reload this page.

Copy link
Copy Markdown
Contributor

Pulls the skill form body out of SkillEditor into a SkillEditorForm with no dialog wrapper, and moves the row helpers (download, delete confirmation, form values from a skill) out of SkillsTable/SkillsTableView so the project skills dialog in the next PR can reuse them. SkillEnabledSwitch gains a readOnly prop.

The personal and organization skill pages behave the same, with two small fixes that came along: Save is locked while a submit is in flight, so a double click no longer sends two create requests, and the Body placeholder renders its line breaks.

Stack (merge top to bottom):

  • feat: add project skill queries and authorization #30826
  • feat: add project skill API routes #30827
  • feat: load project skills in chats #30838
  • fix(site/src/pages/AgentsPage): use the root chat's project for subagent chat skills #30840
  • refactor(site/src/pages/AgentsPage): extract SkillEditorForm and shared skill helpers #30854 👈
  • feat(site): add the project skills dialog #30855
  • feat: manage project skills from the project page #30856
  • feat: send skill invocations as structured message parts #30861
  • feat(site/src): insert skills as chips in the composer #30880
  • feat: render skill invocations in the transcript and edit flow #30881
  • feat: add skill action and automatic-use settings #30882
  • feat: show project skill actions above project chat composers #30884
  • refactor(site/src/pages/AgentsPage/components): split the skill editor into compound components #31122

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

chatgpt-codex-connector[bot] reacted with thumbs up emoji
All reactions
  • 👍 1 reaction
jaaydenh added 17 commits October 15, 2026 07:09
@jaaydenh
feat: add project skill queries and authorization
2ac1248
Add sqlc queries for skills owned by a chat project and authorize them
through the parent project in dbauthz: reading needs chat_project:read
and writing needs chat_project:update. Skill.RBACObject keeps denying
project rows so any unwrapped path fails closed.

Add the chat_project_skill audit resource type and
AuditableChatProjectSkill so the upcoming project skill API can record
audit entries.
@jaaydenh
refactor(coderd/database): share chat project config authorization he…
836c956
…lper
@jaaydenh
test(coderd/database): assert project skill reads stay scoped to thei…
7bc17ba
…r project
@jaaydenh
feat: add project skill API routes
1c9e8f1
Add experimental routes to list, create, read, update and delete skills
on a chat project. Reading needs read on the project and writes need
update; callers who lack the permission get a 404 like the project
instructions routes. The handlers reuse the shared skill create and
update path, map the per-project cap and name index to 409, and audit
every write as a chat_project_skill.

Add matching ExperimentalClient methods.
@jaaydenh
chore(coderd): clarify chat project skill limit comment
d623418
@jaaydenh
feat(coderd/x): load project skills in chats
dda45bc
Chats in a project now get the project's enabled skills as a new
"project" skill source, read as the chat owner each turn. Subagents use
the root chat's project. read_skill loads project skill bodies, and
MergeSkills takes sources in merge order so new sources do not change
its signature.
@jaaydenh
feat(site): list project skills in the chat slash menu
27c808d
The "/" menu offers the skills of the chat's project, next to personal,
organization and workspace skills, and /clear and /compact defer to a
project skill with the same name. Documents project skills.
@jaaydenh
refactor(site/src/pages/AgentsPage): share stored skill source loadin…
009432c
…g in the slash menu

Organization and project skills load through one hook, and the menu
renders its skill groups from one ordered list. Adds project loading and
error stories.
@jaaydenh
refactor(site/src/pages/AgentsPage/components/ChatMessageInput): simp…
a3a2f5d
…lify skill group offsets
@jaaydenh
refactor(site/src/pages/AgentsPage): name stored skill source flags a…
23a5168
…nd resolve emptiness in the hook
@jaaydenh
refactor(site/src/pages/AgentsPage/components): clarify skill source …
5533023
…naming in the composer
@jaaydenh
test: cover project skill loader and gating gaps
681b374
Cover the project-only skill tool check in the integration test, the
project skill body loader's not-found mapping, and the chat-projects
experiment gate in the composer.
@jaaydenh
test(site/src/pages/AgentsPage/components): assert the project skills…
2a72a92
… request instead of menu markup
@jaaydenh
fix(site/src/pages/AgentsPage): use the root chat's project for subag…
26deda5
…ent chat skills
@jaaydenh
fix(site/src/pages/AgentsPage): keep inherited project skills pending…
549a030
… in the composer
@jaaydenh
test(site/src/pages/AgentsPage/components): restore Range geometry st…
7b6c3e3
…ub after each test
@jaaydenh
refactor(site/src/pages/AgentsPage): extract SkillEditorForm and shar…
a14b495
…ed skill helpers

Split the form body of SkillEditor into SkillEditorForm, settle saves
through a mutate callback so the editor stays locked until the request
finishes, move the read-only enabled indicator into SkillEnabledSwitch,
and share the empty and loaded form value helpers in utils/skills.ts.
@github-actions github-actions Bot assigned jaaydenh Oct 15, 2026
This was referenced Oct 15, 2026
feat(site): add the project skills dialog #30855
Merged
feat: manage project skills from the project page #30856
Merged
feat: add project skill queries and authorization #30826
Merged
feat: add project skill API routes #30827
Merged
feat: load project skills in chats #30838
Merged
fix(site/src/pages/AgentsPage): use the root chat's project for subagent chat skills #30840
Closed
@jaaydenh

jaaydenh commented Oct 15, 2026

Copy link
Copy Markdown
Contributor Author

@codex review

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 15, 2026 •
edited
Loading

Uh oh!

There was an error while loading. Please reload this page.

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-15T18:32:10.746903Z 553df7e Manual request
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

chatgpt-codex-connector[bot]
chatgpt-codex-connector Bot reviewed Oct 15, 2026
View reviewed changes

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

There was a problem hiding this comment.

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: a14b4950d4

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
Comment thread site/src/pages/AgentsPage/components/SkillEditor.tsx Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread site/src/pages/AgentsPage/components/SkillEditor.test.tsx Resolved

Uh oh!

There was an error while loading. Please reload this page.

@jaaydenh
fix(site/src/pages/AgentsPage/components): keep the edited skill name…
e1a4429
… focusable and cover submit settlement
@jaaydenh

jaaydenh commented Oct 15, 2026

Copy link
Copy Markdown
Contributor Author

@codex review

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@jaaydenh jaaydenh mentioned this pull request Oct 15, 2026
feat: send skill invocations as structured message parts #30861
Merged
jaaydenh added 6 commits October 20, 2026 05:07
@jaaydenh
docs(site/src/pages/AgentsPage/components/ChatMessageInput): clarify …
8288725
…the project skills failure comment
@jaaydenh
fix(site/src): count only lost project access as no project skills
894beaf
A transient project skills failure leaves the list unknown again, so a
project skill named clear or compact keeps precedence over the built-in
command. The page query retries those failures.
@jaaydenh
fix(site/src): let lost project access override cached project skills
019f52f
Every observer of the project skills query now shares its retry policy,
and a 403 or 404 after an earlier load also counts as no project skills.
@jaaydenh
test(site/src/pages/AgentsPage/components/ChatMessageInput): cover lo…
2964653
…st access after project skills loaded
@jaaydenh
revert(site/src/pages/AgentsPage): drop the root-chat project fallbac…
b0a3bbc
…k for subagent chats

The subagent chat fallback from #30840 is dropped; #30683 gives subagent
chats their root chat's project_id, so chat.project_id covers them.
@jaaydenh
Merge remote-tracking branch 'origin/chat-project-skills/chatd' into …
b1e7cf2
…skill-editor-form-retarget
@jaaydenh
jaaydenh requested review from jdomeracki-coder and nickvigilante as code owners October 20, 2026 09:41
jaaydenh added 2 commits October 20, 2026 09:57
@jaaydenh
fix(site/src): hide project skills the caller's chats cannot use
89a2e9a
chatd loads project skills only when the chat owner owns the project or it
is shared with them, while the skills list endpoint also honors role
grants. The page and the composer now also consult the caller's project
list, which holds only owned and shared projects, and keep project skills
unknown while that list is unsettled.

The composer tests mock the project list, seed caches with the exported
chatProjectSkillsKey, and wait on query state instead of DOM absence.
@jaaydenh
fix(site/src/api/queries): treat a cached project list as unknown unt…
9231e4e
…il refetched

A cached list can predate a share's revocation as well as its creation, so
a project it contains is no more current than one it lacks.
@jaaydenh
jaaydenh removed this pull request from stack #30842 October 20, 2026 10:53
@jaaydenh
jaaydenh changed the base branch from chat-project-skills/subagent-project to chat-project-skills/chatd October 20, 2026 10:54
@jaaydenh
jaaydenh added this pull request to stack #31044 October 20, 2026 10:54
jaaydenh added 2 commits October 20, 2026 13:32
@jaaydenh
Merge remote-tracking branch 'origin/main' into wyav/sk-chatd
17ba94d
@jaaydenh
Merge branch 'wyav/sk-chatd' into wyav/sk-skill-editor-form
b79ed20
jakehwll
jakehwll reviewed Oct 20, 2026
View reviewed changes
Comment thread site/src/pages/AgentsPage/components/SkillEditor.tsx
Comment on lines +100 to +103
nameHint = "Use lowercase letters, numbers, and hyphens. Names cannot be changed after creation.",
bodyPlaceholder = "Describe when and how agents should use this skill.",
header,
footer,

@jakehwll jakehwll Oct 20, 2026

Copy link
Copy Markdown
Contributor

There was a problem hiding this comment.

Choose a reason for hiding this comment

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

The prop slop is hurting my brain here 🥲

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions

@jaaydenh jaaydenh Oct 21, 2026

Copy link
Copy Markdown
Contributor Author

There was a problem hiding this comment.

Choose a reason for hiding this comment

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

Split into compound components in #31122, at the end of the stack. #30855 and #30884 reshape this API (the project dialog's Back header, the project settings switches), so I did it once there instead of reworking each layer. SkillEditorForm is now a root plus named parts (SkillEditorNameField, SkillEditorImport, SkillEditorSubmitButton, ...) and a useSkillEditorFormState() hook; the render-prop slots, copy overrides, and Omit<> are gone.

Does landing it right after #30884 work for you, or would you rather have it before this PR merges? If so, I'll move the refactor down to this PR and merge it up the stack.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
jakehwll
jakehwll approved these changes Oct 20, 2026
View reviewed changes

@jakehwll jakehwll left a comment

Copy link
Copy Markdown
Contributor

There was a problem hiding this comment.

Choose a reason for hiding this comment

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

Preapproving assuming we turn this into compound components. Code is fine otherwise 🙂

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
jaaydenh added 4 commits October 21, 2026 10:09
@jaaydenh
refactor(coderd/x/chatd): remove the unused resolveProjectInstructions
90de6c8
Turns check project access once with resolveUsableChatProjectID and then
load instructions and skills, so resolveProjectInstructions had no
production callers. Its tests now cover resolveUsableChatProjectID and
loadProjectInstructions directly.
@jaaydenh
chore: update architecture.md
e9117ba
@jaaydenh
Merge branch 'chat-project-skills/chatd' of https://github.com/coder/…
f83fb91
…coder into chat-project-skills/chatd
@jaaydenh
fix(site/src/pages/AgentsPage/components/ChatMessageInput): drop the …
e9a4adf
…retry prompt for unusable projects

A 403 or 404 from the project skills request means the caller lost access
to the project, which the composer already treats as no project skills.
The slash menu still showed "Could not load project skills" with a retry
hint that could never succeed, so a project the caller cannot use no longer
shows a loading or error status. A story covers the menu in that state.
@jaaydenh jaaydenh mentioned this pull request Oct 21, 2026
refactor(site/src/pages/AgentsPage/components): split the skill editor into compound components #31122
Merged
Base automatically changed from chat-project-skills/chatd to main October 21, 2026 12:47
jaaydenh added a commit that referenced this pull request Oct 21, 2026
@jaaydenh
feat: load project skills in chats (#30838)
3216580
Chats that belong to a chat project now get the project's skills, next
to personal, organization and workspace skills. They show up in the
model's skill list, load through `read_skill`, and appear in a "Project
skills" group in the `/` menu.

- `coderd/x/skills` adds the `project` source. `MergeSkills` now takes a
list of sources in merge order (personal, organization, project,
workspace). Bare names stay bare unless two sources share a name, in
which case they get `project/<name>` style aliases.
- chatd loads project skills only when the chat owner owns the project
or the project is shared with them. Role grants don't count. This is the
same `usableChatProject` check that project instructions and memory use,
and one check per turn covers both instructions and skills. Disabled
skills are skipped. A failed load logs a warning and the turn continues
without them. Subagents use their root chat's project; that lookup is
now a helper shared with project instructions.
- The site loads project skills for the composer on the project page and
in project chats, behind the `chat-projects` experiment. `/clear` and
`/compact` defer to a project skill with the same name, as they already
do for other sources. When the user can't use the project, the site
treats it as no project skills, like chatd, so those commands keep
working and the `/` menu shows no retry prompt for project skills. That
covers a 403 or 404 from the project skills request and a project
missing from the user's project list, which holds only owned and shared
projects, so an administrator role that can read the project doesn't
count. Other failures are retried and leave the list unknown. A cached
project list is also unknown while it refetches or after a failed
refetch, so a share revoked since it was cached keeps those commands
pending instead of deferring to stale project skills.
- Docs gain a "Project skills" section in the extending agents page.
`coderd/x/chatd/ARCHITECTURE.md` gains a paragraph on project skills.

Dogfood UAT on this branch passed: project skills appear in the project
page `/` menu and in project chats, `read_skill` loads them, disabled
and deleted skills report not found, chats outside the project don't see
them, and a subagent gets them through its root chat. The site reads
project skills from the chat's own `project_id`, so subagent chats show
them in the composer once sub-chats carry their root's project (#30683).

| Project page `/` menu | `read_skill` in a project chat |
| --- | --- |
| <img alt="Project skills group in the project page slash menu"
src="https://raw.githubusercontent.com/coder/coder/assets/pr-30838-project-skills/pr/project-page-slash-menu.png"
width="600" /> | <img alt="read_skill loading a project skill in a
project chat"
src="https://raw.githubusercontent.com/coder/coder/assets/pr-30838-project-skills/pr/project-chat-read-skill.png"
width="600" /> |

Stack (merge top to bottom):
- #30838 👈
- #30854
- #30855
- #30856
- #30861
- #30880
- #30881
- #30882
- #30884
- #31122
jaaydenh added 3 commits October 21, 2026 13:11
@jaaydenh
Merge commit 'e9a4adf7c68e6bf80c9633591e8a99345b3f1dbf' into resync-s…
fe2c0b3
…kill-editor-form
@jaaydenh
Merge commit '3216580614^' into resync-skill-editor-form
9d80261
@jaaydenh
Merge commit '3216580614' into resync-skill-editor-form
793e989
@jaaydenh
jaaydenh merged commit c1d4907 into main Oct 21, 2026
27 checks passed

Uh oh!

There was an error while loading. Please reload this page.

@jaaydenh
jaaydenh deleted the chat-project-skills/skill-editor-form branch October 21, 2026 13:48
@github-actions github-actions Bot locked and limited conversation to collaborators Oct 21, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Reviewers

@chatgpt-codex-connector chatgpt-codex-connector[bot] chatgpt-codex-connector[bot] left review comments
@ethanndickson ethanndickson ethanndickson approved these changes
@jakehwll jakehwll jakehwll approved these changes
@nickvigilante nickvigilante Awaiting requested review from nickvigilante
@jdomeracki-coder jdomeracki-coder Awaiting requested review from jdomeracki-coder

Uh oh!

There was an error while loading. Please reload this page.

Assignees

@jaaydenh jaaydenh

Labels

None yet

Projects

None yet

Milestone

No milestone

Development

Successfully merging this pull request may close these issues.

Uh oh!

There was an error while loading. Please reload this page.

3 participants

@jaaydenh @ethanndickson @jakehwll
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
You are visitor 01402503 — GeezerVison does not store the pages you look up.
Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required.