OverviewFilesCommitsIssuesDocsReleasesPeers

pear-git commits / 02b47b1

Add pgh repo set command for visibility/category updates
PATCH /api/admin/repos/:name endpoint updates repo settings in the registry. CLI: pgh repo set <name> --visibility private Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
02b47b1ad82eab382b650cdc99bfa2b02da51c8c
by plankatron <fleeky@gmail.com> · 2026-04-07T04:24:59.000Z

Changed files (2) +52 -0

lib/cli/commands/repo.js +21 -0
……@@ -48,6 +48,8 @@ export async function repoCommand (client, sub, args, flags) {
4848 return repoCollabPeers(client, args[0], flags)
4949 case 'unlink':
5050 return repoCollabUnlink(client, args[0], flags)
51 case 'set':
52 return repoSet(client, args[0], flags)
5153 default:
5254 repoHelp()
5355 }
……@@ -99,6 +101,25 @@ async function repoInfo (client, name, flags) {
99101 }
100102}
101103
104async function repoSet (client, name, flags) {
105 if (!name) return error('Usage: pgh repo set <name> --visibility <public|private|internal> [--category <cat>]')
106
107 const updates = {}
108 if (flags.visibility) updates.visibility = flags.visibility
109 if (flags.category) updates.category = flags.category
110
111 if (Object.keys(updates).length === 0) {
112 return error('Specify at least one flag: --visibility or --category')
113 }
114
115 const data = await client.patch(`/api/admin/repos/${encodeURIComponent(name)}`, updates)
116 if (data.error) return error(data.error)
117
118 log(`Updated ${name}:`)
119 if (data.repo.visibility) log(` visibility: ${data.repo.visibility}`)
120 if (data.repo.category) log(` category: ${data.repo.category}`)
121}
122
102123async function repoSearch (client, query, flags) {
103124 if (!query) error('Usage: pgh repo search <query>')
104125
lib/routes/admin-api.js +31 -0
……@@ -69,6 +69,7 @@ export function registerAdminApiRoutes(router) {
6969 // Repository import/delete endpoints
7070 router.post('/api/admin/repos/scan', requireAdmin, handleScanRepos)
7171 router.post('/api/admin/repos/import', requireAdmin, handleImportRepo)
72 router.patch('/api/admin/repos/:name', requireAdmin, handleUpdateRepo)
7273 router.delete('/api/admin/repos/:repoName', requireAdmin, handleDeleteRepo)
7374
7475 // P2P identity replication
……@@ -886,6 +887,36 @@ async function handleImportRepo(req, res, server) {
886887 }
887888}
888889
890/**
891 * Update a repository's settings (visibility, category, etc.)
892 */
893async function handleUpdateRepo(req, res, server) {
894 const { repoRegistry } = server.repoData
895 try {
896 const name = req.params.name
897 const updates = await readJson(req)
898
899 const existing = await repoRegistry.getRepo(name)
900 if (!existing) {
901 notFound(res, 'Repository not found: ' + name)
902 return
903 }
904
905 // Apply allowed updates
906 if (updates.visibility) existing.visibility = updates.visibility
907 if (updates.category !== undefined) existing.category = updates.category
908
909 // Write back to registry
910 await repoRegistry.registry.put(`repo:${name}`, existing)
911
912 console.log('[Admin API] Updated repo:', name, updates)
913 json(res, { ok: true, repo: { name, visibility: existing.visibility, category: existing.category } })
914 } catch (err) {
915 console.error('[Admin API] Update repo error:', err)
916 json(res, { error: err.message }, 500)
917 }
918}
919
889920/**
890921 * Delete a repository from the registry (and optionally the bare repo on disk)
891922 */