Pin imported GitHub skills and add update checks

This commit is contained in:
Dotta
2026-03-14 13:52:20 -05:00
parent cfa4925075
commit 7e43020a28
14 changed files with 1646 additions and 350 deletions

View File

@@ -112,8 +112,7 @@ function boardRoutes() {
<Route path="onboarding" element={<OnboardingRoutePage />} />
<Route path="companies" element={<Companies />} />
<Route path="company/settings" element={<CompanySettings />} />
<Route path="skills" element={<CompanySkills />} />
<Route path="skills/:skillId" element={<CompanySkills />} />
<Route path="skills/*" element={<CompanySkills />} />
<Route path="settings" element={<LegacySettingsRedirect />} />
<Route path="settings/*" element={<LegacySettingsRedirect />} />
<Route path="org" element={<OrgChart />} />
@@ -305,8 +304,7 @@ export function App() {
<Route path="companies" element={<UnprefixedBoardRedirect />} />
<Route path="issues" element={<UnprefixedBoardRedirect />} />
<Route path="issues/:issueId" element={<UnprefixedBoardRedirect />} />
<Route path="skills" element={<UnprefixedBoardRedirect />} />
<Route path="skills/:skillId" element={<UnprefixedBoardRedirect />} />
<Route path="skills/*" element={<UnprefixedBoardRedirect />} />
<Route path="settings" element={<LegacySettingsRedirect />} />
<Route path="settings/*" element={<LegacySettingsRedirect />} />
<Route path="agents" element={<UnprefixedBoardRedirect />} />

View File

@@ -1,7 +1,11 @@
import type {
CompanySkill,
CompanySkillCreateRequest,
CompanySkillDetail,
CompanySkillFileDetail,
CompanySkillImportResult,
CompanySkillListItem,
CompanySkillUpdateStatus,
} from "@paperclipai/shared";
import { api } from "./client";
@@ -12,9 +16,32 @@ export const companySkillsApi = {
api.get<CompanySkillDetail>(
`/companies/${encodeURIComponent(companyId)}/skills/${encodeURIComponent(skillId)}`,
),
updateStatus: (companyId: string, skillId: string) =>
api.get<CompanySkillUpdateStatus>(
`/companies/${encodeURIComponent(companyId)}/skills/${encodeURIComponent(skillId)}/update-status`,
),
file: (companyId: string, skillId: string, relativePath: string) =>
api.get<CompanySkillFileDetail>(
`/companies/${encodeURIComponent(companyId)}/skills/${encodeURIComponent(skillId)}/files?path=${encodeURIComponent(relativePath)}`,
),
updateFile: (companyId: string, skillId: string, path: string, content: string) =>
api.patch<CompanySkillFileDetail>(
`/companies/${encodeURIComponent(companyId)}/skills/${encodeURIComponent(skillId)}/files`,
{ path, content },
),
create: (companyId: string, payload: CompanySkillCreateRequest) =>
api.post<CompanySkill>(
`/companies/${encodeURIComponent(companyId)}/skills`,
payload,
),
importFromSource: (companyId: string, source: string) =>
api.post<CompanySkillImportResult>(
`/companies/${encodeURIComponent(companyId)}/skills/import`,
{ source },
),
installUpdate: (companyId: string, skillId: string) =>
api.post<CompanySkill>(
`/companies/${encodeURIComponent(companyId)}/skills/${encodeURIComponent(skillId)}/install-update`,
{},
),
};

View File

@@ -39,6 +39,16 @@ describe("getRememberedPathOwnerCompanyId", () => {
}),
).toBe("pap");
});
it("treats unprefixed skills routes as board routes instead of company prefixes", () => {
expect(
getRememberedPathOwnerCompanyId({
companies,
pathname: "/skills/skill-123/files/SKILL.md",
fallbackCompanyId: "pap",
}),
).toBe("pap");
});
});
describe("sanitizeRememberedPathForCompany", () => {
@@ -68,4 +78,13 @@ describe("sanitizeRememberedPathForCompany", () => {
}),
).toBe("/dashboard");
});
it("keeps remembered skills paths intact for the target company", () => {
expect(
sanitizeRememberedPathForCompany({
path: "/skills/skill-123/files/SKILL.md",
companyPrefix: "PAP",
}),
).toBe("/skills/skill-123/files/SKILL.md");
});
});

View File

@@ -2,6 +2,7 @@ const BOARD_ROUTE_ROOTS = new Set([
"dashboard",
"companies",
"company",
"skills",
"org",
"agents",
"projects",

View File

@@ -7,6 +7,10 @@ export const queryKeys = {
companySkills: {
list: (companyId: string) => ["company-skills", companyId] as const,
detail: (companyId: string, skillId: string) => ["company-skills", companyId, skillId] as const,
updateStatus: (companyId: string, skillId: string) =>
["company-skills", companyId, skillId, "update-status"] as const,
file: (companyId: string, skillId: string, relativePath: string) =>
["company-skills", companyId, skillId, "file", relativePath] as const,
},
agents: {
list: (companyId: string) => ["agents", companyId] as const,

File diff suppressed because it is too large Load Diff