Skip to content

Where people and agents ship software together. The open-source git platform for the whole job: issues, agents, checks and deploys to the edge.

g1t.sh
syntaqxg1t's Claude Code plugin installs from its own repository, published by a workspace token, and a token for chosen repositories no longer creates others by pushing. `claude plugin marketplace add https://g1t.sh/flagon-io/g1t-plugins.git` then `claude plugin install g1t@g1t` clones only the plugin, not this monorepo, which stays its source (.claude-plugin/marketplace.json, plugins/claude-code/). scripts/plugins-release.mjs builds the published tree (the plugin and a marketplace that points at it), checks that both manifests agree and that nothing else is in it, and pushes it with a tag `g1t--v<version>`; it refuses changed plugin files under a version already published, and says "nothing to publish" when that version is there. .g1t/workflows/plugins-release.yml runs it on pushes to main with the flagon-io workspace token PLUGINS_PUBLISH_TOKEN, sent as Basic auth, never a person's token; CI runs its tests. The README, the plugin guide, the docs' agent list, the MCP reference and its instructions, bring-your-own-agent, why-blame, the site's agent setup and the Live now empty state, llms.txt, install/claude.sh and bench/ask all give the new address, and the earlier ~/.g1t/hook.mjs install path is gone. Automation is pointed at a workspace's own tokens: the API reference's Authentication section, Actions' note on changing workflows from a job (it said a personal token) and llms.txt (never ask your person for a personal token for that) now say so, as Settings → Access tokens, the authentication and workspaces guides and git's deploy keys already did. Pushing to an address that does not exist made a repository for any token holding code:write and a member's or the workspace's identity, so a workspace token for only g1t-plugins could create flagon-io/<anything> and push to it; repos' git_token_refusal now refuses push-to-create for a token whose reach is chosen repositories, public ones only, or another workspace, and the git guide says so. Checked: the plugin's hook tests (49), plugins-release tests (8) and its check (g1t@g1t 0.2.2), cargo test -p g1t-repos --lib (314, new: chosen repositories never create one, all of a workspace creates there only, a token without a reach as before) and its wasm32 check, the site's agent-setup and llms.txt tests (20), the docs build (513 pages).

README.md

g1t/detect

Says what a g1t.page build of the checkout would find, without building or deploying anything: the same rules g1t/deploy builds with.

steps:
  - uses: actions/checkout@v5
  - id: detect
    uses: g1t/detect@v1
  - if: steps.detect.outputs.kind == 'none'
    run: echo "::error::Nothing here would be served."
  - if: steps.detect.outputs.framework == 'hugo'
    run: echo "A Hugo site, served from ${{ steps.detect.outputs.output-dir }}"
  - if: steps.detect.outputs.install != ''
    run: ${{ steps.detect.outputs.install }}
yaml

Inputs

InputDefault
root-dirThe checkoutWhere the project is in the checkout.
build-commandNoneA build command of your own, as g1t/deploy takes it.
output-dirNoneAn output folder of your own, as g1t/deploy takes it.
build-asautoWhat it is built as: auto, static, workers or docker (Container), as g1t/deploy takes it.
dockerfileNoneA Dockerfile's path of your own, as g1t/deploy takes it.

Outputs

Output
kindworkers (a wrangler.jsonc, wrangler.json or wrangler.toml, a framework's Cloudflare adapter, or a Node.js server run as a Worker), static (a site a build writes), html (the files as they are), container (a server that is not run as a Worker, a framework set up to need a server, or a Dockerfile with nothing else to serve) or none (nothing to serve).
frameworkThe framework it is built with, from the table below; node for a Node.js server run as a Worker; for a container without one, dockerfile, or the server g1t writes a Dockerfile for (node, django, flask, fastapi, python, go, rails, rack, laravel, php). Empty when there is none.
dockerfileA container's own Dockerfile, relative to the project. Empty when g1t writes one, and for anything that is not a container.
portThe port a container listens on: its Dockerfile's EXPOSE, else 8080.
entryFor a Node.js server run as a Worker, the file that starts it, relative to the project. Empty for anything else.
installHow dependencies are installed, from the lockfile: npm ci, pnpm install --frozen-lockfile, and so on, and bundle install for Jekyll. Empty when there is nothing to install.
buildWhat builds it: your command, the package's build script (npm run build), the framework's own command, or wrangler deploy --dry-run for Workers. Empty when nothing does.
output-dirThe folder served, relative to the project (. for the project itself): yours, a Workers project's assets directory, the folder the framework writes, or the first of dist, build, out, public, _site, .output/public that exists. Empty when a build has yet to write it, as for a Cloudflare adapter's Worker.

When kind is none, the step's log says what to change or add, such as a Dockerfile. Docker deployments has the order in which a project's kind is decided.

Frameworks

frameworkFound byServes
vite, vite-react, vite-vue, vite-svelte, vite-solid, vite-preactvite, and the framework's Vite plugindist, or build.outDir
astroastrodist, or outDir; a Worker with @astrojs/cloudflare
nextjsnextout with output: 'export'; a Worker with @opennextjs/cloudflare and a wrangler.jsonc
sveltekit@sveltejs/kitbuild with adapter-static; a Worker with adapter-cloudflare
nuxtnuxt.output/public, from nuxi generate
react-router, remix@react-router/dev, @remix-run/devbuild/client with ssr: false
gatsbygatsbypublic
docusaurus@docusaurus/corebuild
eleventy@11ty/eleventy_site
angular@angular/core and angular.jsondist/<project>/browser
create-react-appreact-scriptsbuild
hugohugo.toml, or Hugo's config.tomlpublic
jekyll_config.yml and a Gemfile_site
mdbookbook.tomlbook

What deploys has each one's build command. Your build-command and output-dir win over what is detected.

It runs g1t-runner detect, found or downloaded as g1t/deploy finds it.