Hacktoberfest 2026: the issues maintainers tagged for October, open and beginner-friendly. Browse Hacktoberfest issues

artifacts fork: no way to name the target repo; derived name fails the repo-name regex

Open
#180 2 comments 0 reactions 0 assignees View on GitHub

Maintainers usually reply within 1 day

Nobody has claimed this yet.

Assessment

Difficulty
4/5
Estimated time
3-5 days
Newbie friendliness
48/100
Issue type
Bug
Clarity
Mostly clear
Activity status
Active
Tech stack
typescript

Research direction

Start with the cf artifacts namespaces repos fork command and cf schema artifacts namespaces repos fork output, then compare its request shape with the Workers binding's repo.fork(name, opts). Determine whether a target name can be supported or whether the unnamed behavior and derived value need clearer handling; done means the fork succeeds predictably or the limitation and offending name are reported clearly.

Written by the indexing model from the issue text.

Description

upstream

cf artifacts namespaces repos fork cannot be given a target repository name. The REST operation derives one that violates the Artifacts repo-name rule, so every fork attempt fails with a 400.

Version: cf v1.0.0-beta.10

Actual

$ cf artifacts namespaces repos fork ingress-probe --namespace spike --description "..." --default-branch-only true
┌ APIError
│ [10101] Invalid repo name: must match /^[a-zA-Z0-9][a-zA-Z0-9._-]*$/
│ 400 Bad Request · HTTP /accounts/<acct>/artifacts/namespaces/spike/repos/ingress-probe/fork

cf schema confirms there is no field to supply a target name:

$ cf schema artifacts namespaces repos fork
{
  "operationId": "artifacts_repos_fork",
  "httpMethod": "POST",
  "path": "/accounts/{account_id}/artifacts/namespaces/{namespace}/repos/{name}/fork",
  "pathParams": [ account_id, namespace, name ],
  "queryParams": [],
  "requestBodyFields": [
    { "name": "default-branch-only", "type": "boolean", "required": false },
    { "name": "description",        "type": "string",  "required": false },
    { "name": "read-only",          "type": "boolean", "required": false }
  ]
}

There is no name or target field. Passing one anyway is silently ignored rather than rejected, which makes the failure look like a server-side naming bug:

$ cf artifacts namespaces repos fork ingress-probe --namespace spike --body '{"name":"ingress-probe-fork", ...}'
┌ APIError
│ [10101] Invalid repo name: must match /^[a-zA-Z0-9][a-zA-Z0-9._-]*$/

The derived name appears to contain a / (consistent with a namespace/name-style default), which the repo-name regex forbids.

Expected

Either the REST operation accepts a target name — the Workers binding's repo.fork(name, opts) does exactly this, so the capability exists on the platform — or the CLI documents that forks are unnamed and the API error names the offending derived value instead of only restating the regex.

Impact

Fork is unusable from the CLI and REST API today, so the only working path is a deployed Worker using the binding. That is a meaningful gap: for one-repo-per-agent or one-fork-per-task patterns there is no way to predict or control the resulting repo name, and no way to look the fork up by name afterwards.

Dominant language
TypeScript
Stars
853
Forks
42
Avg merge
17h 57m
Merged PRs (30d)
146

Getting set up

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from cloudflare/cf

All issues in cloudflare/cf

Similar issues

More TypeScript issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.