+ Skillgen opens a draft pull request after each release tag. It runs only on the repositories you turn on here.
+
+ Then install the App on the same repositories. + Install Skillgen +
+ ++ {{ signInAgain ? 'Your GitHub access ended. Sign in with GitHub again.' : 'Could not load your repositories from GitHub. Try again.' }} +
++ Loading your repositories from GitHub +
++ {{ refusedMessage(item) }} +
++ None of the public repositories you maintain has a Skill on skilld yet. +
+
{{ watchedRepositoryCount }} {{ watchedRepositoryCount === 1 ? 'repository supports' : 'repositories support' }} your skill updates.
diff --git a/layers/identity/server/api/internal/skillgen/opt-ins.post.ts b/layers/identity/server/api/internal/skillgen/opt-ins.post.ts
new file mode 100644
index 00000000..dcb0652b
--- /dev/null
+++ b/layers/identity/server/api/internal/skillgen/opt-ins.post.ts
@@ -0,0 +1,16 @@
+import { defineApiHandler } from '#shared/server/handler'
+import { skillgenService } from '../../../policies/skillgen-service'
+import { skillgenOptInsPresenter } from '../../../presenters/skillgen'
+import { SkillgenOptInsBody } from '../../../schemas/skillgen'
+import { optedInSkillgenRepositories } from '../../../utils/skillgen'
+
+/** The skill-harness Worker asks which repositories in one GitHub event opted in to Skillgen. */
+export default defineApiHandler({
+ schema: SkillgenOptInsBody,
+ policy: [skillgenService],
+ handler: async ({ event, body, platform }) => {
+ setHeader(event, 'cache-control', 'no-store')
+ return optedInSkillgenRepositories(platform.db, body.repositories)
+ },
+ presenter: skillgenOptInsPresenter,
+})
diff --git a/layers/identity/server/api/me/skillgen/index.get.ts b/layers/identity/server/api/me/skillgen/index.get.ts
new file mode 100644
index 00000000..27125951
--- /dev/null
+++ b/layers/identity/server/api/me/skillgen/index.get.ts
@@ -0,0 +1,22 @@
+import { defineApiHandler } from '#shared/server/handler'
+import { authenticated } from '../../../policies/authenticated'
+import { skillgenRepositoriesPresenter } from '../../../presenters/skillgen'
+import { githubUserGet, listMaintainedRepositories, skillgenCandidates, skillgenRefusal } from '../../../utils/skillgen'
+import { requireGithubUserToken, requireUserRow } from '../../../utils/users'
+
+/**
+ * Lists the public repositories the account maintains that hold a Skill in
+ * the registry, each with its Skillgen opt-in.
+ */
+export default defineApiHandler({
+ policy: [authenticated],
+ handler: async ({ event, platform }) => {
+ const u = await requireUserRow(event)
+ const token = await requireGithubUserToken(platform.db, u.id, useRuntimeConfig(event).tokenKey as string)
+ const listed = await listMaintainedRepositories(githubUserGet(token))
+ if (listed._tag === 'GithubUnavailable')
+ throw createError(skillgenRefusal(listed))
+ return skillgenCandidates(platform.db, listed.repositories)
+ },
+ presenter: skillgenRepositoriesPresenter,
+})
diff --git a/layers/identity/server/api/me/skillgen/index.put.ts b/layers/identity/server/api/me/skillgen/index.put.ts
new file mode 100644
index 00000000..129cbe7b
--- /dev/null
+++ b/layers/identity/server/api/me/skillgen/index.put.ts
@@ -0,0 +1,47 @@
+import type { SkillgenOptInResult } from '../../../../shared/contracts/skillgen'
+import { defineApiHandler } from '#shared/server/handler'
+import { authenticated } from '../../../policies/authenticated'
+import { browserSession } from '../../../policies/browser-session'
+import { skillgenOptInPresenter } from '../../../presenters/skillgen'
+import { SkillgenRepositoryPutBody } from '../../../schemas/skillgen'
+import {
+ checkSkillgenEligibility,
+ githubUserGet,
+ optInSkillgenRepository,
+ optOutSkillgenRepository,
+ skillgenOptInUser,
+ skillgenRefusal,
+} from '../../../utils/skillgen'
+import { requireGithubUserToken, requireUserRow } from '../../../utils/users'
+
+/**
+ * Turns Skillgen on or off for one repository.
+ *
+ * On needs admin or maintain access and a repository the Worker can run on.
+ * Off needs the account that turned it on, or current admin or maintain access.
+ */
+export default defineApiHandler({
+ schema: SkillgenRepositoryPutBody,
+ policy: [authenticated, browserSession],
+ handler: async ({ event, body, platform }): Promise
+ Keep your package skill current. After each release tag, Skillgen opens a draft pull request that updates the Skill in your repository. You review it and decide what merges.
+
+ Sign in to skilld with GitHub. Your account lists the public repositories you maintain that have a Skill. Turn Skillgen on for each one it should update. Skillgen never runs on a repository you did not turn on.
+
+ On GitHub, choose Only select repositories, then pick the repositories you turned on.
+
+ Skillgen starts with your latest tag when you install the App. If you turned the repository on after the install, it starts at your next tag. Each new tag starts another run. If npm has not published the version yet, the run waits. Each run must finish within 30 minutes.
+
+ A model drafts the update from the tagged source with the skilld Harness. A separate review must accept it before anything reaches your repository. If the Skill needs no change, Skillgen opens nothing.
+
+ Look for a draft pull request titled This App reads package source and proposes draft Skill pull requests. Other accounts can install it. The pilot processes only its configured repositories. It requests Contents write and Pull requests write. Select one repository during installation. This App reads package source and proposes draft Skill pull requests. Other accounts can install it on their public package repositories. It requests Contents write and Pull requests write. Select one repository during installation.
+ Skillgen
+
+
+ Set up Skillgen
+
+
+
+
+ Check your repository
+
+
+
+ package.json at its root. Skillgen supports npm packages only.skills/<package>/SKILL.md, or a SKILL.md at the root. Leave the scope out of the package name.
+ SKILL.md and Markdown files under references/.
+ 1.4.0 or v1.4.0.
+ gitHead.
+
+ Turn it on for each repository
+
+
+ Install the App
+
+
+
+
+ Review the draft
+
+ docs(skills): update for v1.4.0. It changes only your Skill's folder. Skillgen never overwrites a branch that already exists. You decide what merges.
+ Register skilld under skilld-dev
Register skilld under skilld-dev