Add forgejo_label_create tool #18
Closed
opened 2026-08-18 02:29:24 +00:00 by david
·
1 comment
No Branch/Tag specified
main
feature/issue-264/verify-the-vision-tool-live-against-the-deepseek-a
feature/issue-263/list-the-vision-extension-in-the-repo-root-readme
feature/issue-262/write-extensions-vision-readme-md-the-10-section-p
feature/issue-261/wire-the-vision-extension-into-package-json-manife
feature/issue-260/implement-extensions-vision-index-ts-factory-regis
feature/issue-258/implement-extensions-vision-src-tool-ts-the-vision
feature/issue-257/implement-extensions-vision-src-client-ts-request
feature/issue-256/implement-extensions-vision-src-usage-ts-usage-map
feature/issue-255/implement-extensions-vision-src-images-ts-read-val
feature/issue-254/implement-extensions-vision-src-config-ts-env-reso
feature/issue-253/implement-extensions-vision-src-errors-ts-toolerro
feature/issue-252/penpot-add-text-stages-zero-area-auto-width-text-p
feature/issue-216/add-the-penpot-skill-and-extension-to-the-repo-roo
feature/issue-217/register-the-penpot-tests-in-npm-test-complete-the
feature/issue-215/write-the-penpot-skill-md-core-workflow-token-conv
feature/issue-214/implement-and-run-fetch-penpot-docs-mjs-and-commit
feature/issue-213/validate-screenshot-reconstruction-against-the-liv
feature/issue-212/add-the-image-to-design-workflow-to-skills-penpot
feature/issue-211/validate-svg-import-icon-and-illustration-against
feature/issue-210/implement-the-penpot-add-svg-tool-with-svg-raw-fal
feature/issue-209/implement-the-svg-to-shapes-converter-in-src-svg-t
feature/issue-208/validate-component-instancing-against-the-live-ins
feature/issue-207/implement-penpot-instance-component-with-id-remapp
feature/issue-206/author-and-commit-the-component-library-artifact-u
feature/issue-205/implement-file-library-linking-and-validate-the-ex
feature/issue-204/implement-penpot-export-library-sse-uri-plus-artif
feature/issue-203/implement-penpot-import-library-multipart-upload-p
feature/issue-202/implement-the-transit-decoder-and-sse-stream-parse
feature/issue-201/validate-a-full-composed-screen-one-commit-one-rev
feature/issue-200/implement-penpot-add-image-with-media-upload
feature/issue-199/implement-asset-reference-resolution-plus-penpot-a
feature/issue-198/implement-penpot-add-frame-with-auto-layout-props
feature/issue-197/validate-asset-creation-atomicity-and-write-safety
feature/issue-196/implement-the-designated-target-write-guard-with-a
feature/issue-195/implement-penpot-commit-with-revn-tracking-conflic
feature/issue-194/implement-the-staged-changeset-store-and-the-colou
feature/issue-193/validate-read-primitives-against-the-live-penpot-i
feature/issue-192/implement-the-penpot-list-library-tool-with-name-t
feature/issue-191/implement-the-penpot-get-file-tool-pages-objects-a
feature/issue-190/implement-the-penpot-list-projects-tool-teams-and
feature/issue-189/implement-the-penpot-whoami-tool-and-wire-the-exte
feature/issue-188/implement-the-rpc-client-and-error-decoding-in-src
feature/issue-187/implement-penpot-url-penpot-token-resolution-in-sr
feature/issue-186/scaffold-the-penpot-extension-directory-and-regist
feature/issue-172/add-end-to-end-main-tests-for-the-fj-rg-tool-state
feature/issue-171/make-reminder-report-dynamic-install-skip-counts-r
feature/issue-170/wire-settings-json-filter-rewrite-into-dedupeandre
feature/issue-169/implement-buildpackagefilters-with-exhaustive-unit
feature/issue-168/refactor-preflight-to-skip-warn-for-missing-fj-rg
feature/issue-167/add-fj-rg-tool-detection-helpers-rgavailable-detec
feature/issue-148/reconcile-design-md-and-implementation-plan-with-t
feature/issue-146/verify-extension-load-behavior-with-and-without-mo
feature/issue-145/write-extensions-mongodb-readme-md
feature/issue-144/write-tool-description-promptsnippet-guidance-for
feature/issue-143/implement-index-ts-async-factory-lifecycle-with-te
feature/issue-142/implement-the-mongo-list-collections-tool-with-uni
feature/issue-141/implement-the-mongo-count-tool-with-unit-tests
feature/issue-140/implement-the-mongo-find-tool-with-unit-tests
feature/issue-139/implement-src-errors-ts-with-unit-tests-toolerror
feature/issue-138/implement-src-serialize-ts-with-unit-tests-ejson-t
feature/issue-136/implement-src-env-ts-with-unit-tests-mongodb-uri-r
feature/issue-135/register-the-mongodb-extension-in-the-repo-root-pa
feature/issue-133/initialize-the-extensions-mongodb-package-package
feature/issue-116/src-actions-ts-downloadrunlogs-zip-guarded-unzip-c
feature/issue-115/src-actions-ts-downloadjoblog-cache-first-attempt
feature/issue-114/src-actions-ts-metadata-queries-listactionruns-get
feature/issue-113/src-actionscache-ts-cache-paths-cache-first-read-w
feature/issue-112/add-zip-extraction-dependency-adm-zip-vs-yauzl
feature/issue-111/tracking-forgejo-actions-tooling-read-only-runs-jo
feature/issue-93/add-unit-tests-for-scripts-local-install-mjs-node
feature/issue-92/validate-install-local-end-to-end-on-the-dev-machi
feature/issue-90/implement-pi-registration-with-url-dedupe-and-relo
feature/issue-89/validate-install-local-from-a-scratch-clone-fresh
feature/issue-88/implement-git-pull-and-npm-install-steps-in-script
feature/issue-74/write-victorialogs-readme-md-and-reconcile-design
feature/issue-73/wire-up-index-ts-extension-factory-and-register-al
feature/issue-72/implement-logs-facets-tool-src-tools-facets-ts
feature/issue-71/implement-logs-hits-tool-src-tools-hits-ts
feature/issue-70/implement-logs-search-tool-src-tools-search-ts
feature/issue-69/implement-parsejsonlines-helper-in-src-client-ts
feature/issue-68/implement-victorialogsrequest-in-src-client-ts
feature/issue-67/implement-resolvebaseurl-in-src-env-ts
feature/issue-66/implement-totoolerror-in-src-errors-ts
feature/issue-65/implement-src-defaults-ts-shared-constants-and-app
feature/issue-64/scaffold-the-victorialogs-pi-extension-project
feature/issue-53/skip-issue-creation-for-chore-documentation-commit
feature/issue-45/fix-local-install-preflight-env-var-requirements-s
feature/issue-41/add-npm-run-local-install-script-to-update-and-ins
feature/issue-26/cross-reference-forgejo-list-milestones-from-issue
feature/issue-25/add-forgejo-milestone-delete-tool
feature/issue-24/add-forgejo-milestone-close-and-forgejo-milestone
feature/issue-23/add-forgejo-milestone-edit-tool
feature/issue-22/add-forgejo-milestone-view-tool
feature/issue-21/add-forgejo-list-milestones-tool
feature/issue-20/add-forgejo-milestone-create-tool
feature/issue-18/add-forgejo-label-create-tool
feature/issue-29/bug-forgejo-issue-create-view-edit-close-etc-crash
No results found.
Labels
No labels
bug
chore
documentation
enhancement
feature
ready
Milestone
Clear milestone
No items
No milestone
Projects
Clear projects
No items
No project
Assignees
Clear assignees
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".
No due date set.
Dependencies
No dependencies set
Reference
david/pi-extensions-and-skills#18
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
Add a
createLabel()function and aforgejo_label_createtool to theforgejopi extension, so repository labels can be created directly (today the extension can only list/add/remove labels by id, not create new ones).Background
The
forgejoextension (extensions/forgejo/in this repo) is a TypeScript pi extension that wraps the Forgejo REST API (/api/v1) for issue/PR/label operations. It follows a layered architecture:src/api.ts—forgejoApiCall(), a generic authenticated HTTP wrapper returningResult<T, ApiError>(seesrc/errors.tsfor theResult/success/failurepattern).src/issues.ts— one function per issue/label operation (e.g.listLabels(),addLabels(),removeLabels()), each callingforgejoApiCall().src/index.ts— registers one pi tool per operation using TypeBox schemas (Type.Object({...})), withpromptSnippet+promptGuidelinesmetadata, and a sharedtargetOverridesobject (host?/owner?/repo?) merged into every tool's params.Labels currently support list (
forgejo_list_labels), add-to-issue (forgejo_issue_add_labels), and remove-from-issue (forgejo_issue_remove_labels) — but not repository-level label creation. This issue adds that missing piece.This is the first of a related batch of issues also adding full milestone CRUD tools; it has no dependency on the others and can be implemented first.
Implementation Details
Confirmed Forgejo/Gitea API v1 contract (from the live Codeberg swagger spec,
v16.0.0-dev):POST /repos/{owner}/{repo}/labels(operationIdissueCreateLabel)Request body (
CreateLabelOption):Response (
201,Label):Errors:
404(repo not found),422(validation failure, e.g. bad color format).Files to change:
src/issues.ts:ForgejoLabelinterface withexclusive?: boolean,is_archived?: boolean,url?: string.CreateLabelOptionsinterface:{ name: string; color: string; description?: string; exclusive?: boolean; is_archived?: boolean }.createLabel(target: ForgejoTarget, options: CreateLabelOptions): Promise<Result<ForgejoLabel, ApiError>>—POSTto/repos/{owner}/{repo}/labelsviaforgejoApiCall, body built withomitUndefined(options)(same pattern ascreateIssue).src/index.ts:createLabelfrom./issues.forgejo_label_create:label: "Create Label"description: "Create a Forgejo repository label."promptSnippet: "Create a Forgejo label"promptGuidelines: something like["Use forgejo_list_labels afterwards to confirm the new label's id."]parameters:Type.Object({ ...targetOverrides, name: Type.String(...), color: Type.String({ description: "Hex color, e.g. #00aabb" }), description: Type.Optional(Type.String(...)), exclusive: Type.Optional(Type.Boolean(...)), is_archived: Type.Optional(Type.Boolean(...)) })execute: resolve target viaresolveTarget(params), callcreateLabel, return atoolSuccesswith the label'sid/name/colorin both text anddetails(mirroring how other create tools format output), ortoolErroron failure.tests/issues.test.ts: add unit tests forcreateLabel()mockingforgejoApiCall— verify URL, method (POST), body payload (including thatundefinedoptional fields are omitted), and success/errorResultpropagation.tests/index.test.ts(ortests/tools.test.ts, whichever currently covers tool registration/execution): add tests for theforgejo_label_createtool — schema shape, and thatexecute()callscreateLabelwith the resolved target and returns success/error tool results correctly.Acceptance Criteria
createLabel()exists insrc/issues.ts, callsPOST /repos/{owner}/{repo}/labelswith the correct body, and returnsResult<ForgejoLabel, ApiError>.forgejo_label_createtool is registered insrc/index.tswithname/colorrequired anddescription/exclusive/is_archivedoptional, plustargetOverrides.id,name, andcolorin the tool result text anddetails.toolError/describeErrormachinery, matching the style of other create tools.createLabel()(URL, method, body, success, error) and the tool registration/execution path.npm testandnpm run checkpass with no regressions.Test Plan
npm test— new tests forcreateLabel()andforgejo_label_createpass; full suite remains green.npm run check— lint/typecheck passes.FORGEJO_TOKENand a real repo): callforgejo_label_createwithname: "triage",color: "#ff0000", then runforgejo_list_labelsand confirm the new label appears with a realid.pi-loop opened and merged a pull request for this issue: #33