public
nobgit
read
Codex
NobGit for Codex
Languages
Repository composition by tracked source files.
PowerShell
57%
Shell
43%
Commit
Add marketplace install support
5130521
.agents/plugins/marketplace.json | 20 +++++
install.ps1 | 58 ++++++++++++
install.sh | 55 ++++++++++++
plugins/nobgit/.codex-plugin/plugin.json | 42 +++++++++
plugins/nobgit/.mcp.json | 9 ++
plugins/nobgit/assets/logo.png | Bin 0 -> 1655 bytes
plugins/nobgit/readme.md | 51 +++++++++++
plugins/nobgit/skills/nobgit/SKILL.md | 149 +++++++++++++++++++++++++++++++
readme.md | 92 +++++--------------
9 files changed, 404 insertions(+), 72 deletions(-)
create mode 100644 .agents/plugins/marketplace.json
create mode 100644 install.ps1
create mode 100644 install.sh
create mode 100644 plugins/nobgit/.codex-plugin/plugin.json
create mode 100644 plugins/nobgit/.mcp.json
create mode 100644 plugins/nobgit/assets/logo.png
create mode 100644 plugins/nobgit/readme.md
create mode 100644 plugins/nobgit/skills/nobgit/SKILL.md
Diff
diff --git a/.agents/plugins/marketplace.json b/.agents/plugins/marketplace.json
new file mode 100644
index 0000000..ef26a05
--- /dev/null
+++ b/.agents/plugins/marketplace.json
@@ -0,0 +1,20 @@
+{
+ "name": "nobgit",
+ "interface": {
+ "displayName": "NobGit"
+ },
+ "plugins": [
+ {
+ "name": "nobgit",
+ "source": {
+ "source": "local",
+ "path": "./plugins/nobgit"
+ },
+ "policy": {
+ "installation": "AVAILABLE",
+ "authentication": "ON_INSTALL"
+ },
+ "category": "Developer Tools"
+ }
+ ]
+}
diff --git a/install.ps1 b/install.ps1
new file mode 100644
index 0000000..6efa39c
--- /dev/null
+++ b/install.ps1
@@ -0,0 +1,58 @@
+$ErrorActionPreference = "Stop"
+
+$repoRoot = Split-Path -Parent $MyInvocation.MyCommand.Path
+$pluginPath = Join-Path $env:USERPROFILE "plugins\nobgit"
+$marketplacePath = Join-Path $env:USERPROFILE ".agents\plugins\marketplace.json"
+$marketplaceDir = Split-Path $marketplacePath
+
+New-Item -ItemType Directory -Force $pluginPath | Out-Null
+New-Item -ItemType Directory -Force $marketplaceDir | Out-Null
+
+Copy-Item -Recurse -Force (Join-Path $repoRoot ".codex-plugin") $pluginPath
+Copy-Item -Recurse -Force (Join-Path $repoRoot "assets") $pluginPath
+Copy-Item -Recurse -Force (Join-Path $repoRoot "skills") $pluginPath
+Copy-Item -Force (Join-Path $repoRoot ".mcp.json") (Join-Path $pluginPath ".mcp.json")
+Copy-Item -Force (Join-Path $repoRoot "readme.md") (Join-Path $pluginPath "readme.md")
+
+if (Test-Path $marketplacePath) {
+ $marketplace = Get-Content -Raw $marketplacePath | ConvertFrom-Json
+} else {
+ $marketplace = [ordered]@{
+ name = "personal"
+ interface = [ordered]@{ displayName = "Personal" }
+ plugins = @()
+ }
+}
+
+if (-not ($marketplace.PSObject.Properties.Name -contains "plugins")) {
+ $marketplace | Add-Member -MemberType NoteProperty -Name plugins -Value @()
+}
+
+$entry = [ordered]@{
+ name = "nobgit"
+ source = [ordered]@{
+ source = "local"
+ path = "./plugins/nobgit"
+ }
+ policy = [ordered]@{
+ installation = "AVAILABLE"
+ authentication = "ON_INSTALL"
+ }
+ category = "Developer Tools"
+}
+
+$plugins = @($marketplace.plugins | Where-Object { $_.name -ne "nobgit" })
+$marketplace.plugins = @($plugins + $entry)
+$marketplace | ConvertTo-Json -Depth 10 | Set-Content -Encoding UTF8 $marketplacePath
+
+if (Get-Command codex -ErrorAction SilentlyContinue) {
+ try {
+ codex plugin add nobgit@personal
+ } catch {
+ Write-Warning "NobGit was added to the personal marketplace, but 'codex plugin add nobgit@personal' failed. Open Codex Plugins and install NobGit from Personal."
+ }
+} else {
+ Write-Host "NobGit was added to the personal marketplace. Open Codex Plugins and install NobGit from Personal."
+}
+
+Write-Host "Done. Start a new Codex thread after installing NobGit."
diff --git a/install.sh b/install.sh
new file mode 100644
index 0000000..9066b83
--- /dev/null
+++ b/install.sh
@@ -0,0 +1,55 @@
+#!/usr/bin/env bash
+set -euo pipefail
+
+repo_root="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+plugin_path="$HOME/plugins/nobgit"
+marketplace_path="$HOME/.agents/plugins/marketplace.json"
+
+mkdir -p "$plugin_path" "$(dirname "$marketplace_path")"
+cp -R "$repo_root/.codex-plugin" "$plugin_path/"
+cp -R "$repo_root/assets" "$plugin_path/"
+cp -R "$repo_root/skills" "$plugin_path/"
+cp "$repo_root/.mcp.json" "$plugin_path/.mcp.json"
+cp "$repo_root/readme.md" "$plugin_path/readme.md"
+
+python3 - <<'PY'
+import json
+from pathlib import Path
+
+marketplace_path = Path.home() / ".agents" / "plugins" / "marketplace.json"
+if marketplace_path.exists():
+ marketplace = json.loads(marketplace_path.read_text())
+else:
+ marketplace = {
+ "name": "personal",
+ "interface": {"displayName": "Personal"},
+ "plugins": [],
+ }
+
+entry = {
+ "name": "nobgit",
+ "source": {
+ "source": "local",
+ "path": "./plugins/nobgit",
+ },
+ "policy": {
+ "installation": "AVAILABLE",
+ "authentication": "ON_INSTALL",
+ },
+ "category": "Developer Tools",
+}
+
+marketplace["plugins"] = [
+ plugin for plugin in marketplace.get("plugins", [])
+ if plugin.get("name") != "nobgit"
+] + [entry]
+marketplace_path.write_text(json.dumps(marketplace, indent=2) + "\n")
+PY
+
+if command -v codex >/dev/null 2>&1; then
+ codex plugin add nobgit@personal || true
+else
+ echo "NobGit was added to the personal marketplace. Open Codex Plugins and install NobGit from Personal."
+fi
+
+echo "Done. Start a new Codex thread after installing NobGit."
diff --git a/plugins/nobgit/.codex-plugin/plugin.json b/plugins/nobgit/.codex-plugin/plugin.json
new file mode 100644
index 0000000..e29aec5
--- /dev/null
+++ b/plugins/nobgit/.codex-plugin/plugin.json
@@ -0,0 +1,42 @@
+{
+ "name": "nobgit",
+ "version": "0.3.0",
+ "description": "Codex integration for publishing repositories to NobGit.",
+ "author": {
+ "name": "NobGit",
+ "url": "https://www.nobgit.com"
+ },
+ "homepage": "https://www.nobgit.com/nobgit/codex",
+ "repository": "https://www.nobgit.com/nobgit/codex",
+ "license": "UNLICENSED",
+ "keywords": [
+ "nobgit",
+ "source-control",
+ "git",
+ "publish",
+ "repository"
+ ],
+ "skills": "./skills/",
+ "mcpServers": "./.mcp.json",
+ "interface": {
+ "displayName": "NobGit",
+ "shortDescription": "Push Codex worktrees and local Git repositories to NobGit.",
+ "longDescription": "NobGit helps Codex publish local work by checking repository state, adding or updating a NobGit remote, committing intended changes, and pushing branches to NobGit over HTTPS with the user's NobGit credentials or access token.",
+ "developerName": "NobGit",
+ "category": "Developer Tools",
+ "websiteURL": "https://www.nobgit.com/nobgit/codex",
+ "capabilities": [
+ "Source Control",
+ "Git",
+ "Write"
+ ],
+ "defaultPrompt": [
+ "Push this repository to NobGit.",
+ "Add NobGit as a Git remote.",
+ "Publish my current branch to NobGit."
+ ],
+ "brandColor": "#2563EB",
+ "composerIcon": "./assets/logo.png",
+ "logo": "./assets/logo.png"
+ }
+}
diff --git a/plugins/nobgit/.mcp.json b/plugins/nobgit/.mcp.json
new file mode 100644
index 0000000..3ecfc1b
--- /dev/null
+++ b/plugins/nobgit/.mcp.json
@@ -0,0 +1,9 @@
+{
+ "mcpServers": {
+ "nobgit": {
+ "type": "http",
+ "url": "https://nobgit.com/mcp",
+ "note": "NobGit MCP server for repository discovery, repository metadata, repository tree/file reads, and issue operations. Use Git over HTTPS for actual pushes."
+ }
+ }
+}
diff --git a/plugins/nobgit/assets/logo.png b/plugins/nobgit/assets/logo.png
new file mode 100644
index 0000000..08ebc98
Binary files /dev/null and b/plugins/nobgit/assets/logo.png differ
diff --git a/plugins/nobgit/readme.md b/plugins/nobgit/readme.md
new file mode 100644
index 0000000..ee2d06e
--- /dev/null
+++ b/plugins/nobgit/readme.md
@@ -0,0 +1,51 @@
+# NobGit for Codex
+
+Codex plugin for working with NobGit repositories. It adds a NobGit skill and
+connects Codex to the NobGit MCP server for repository discovery, repository
+metadata, repository trees/files, and issue operations.
+
+## Install
+
+If you already cloned or pulled this repository from NobGit, run the installer
+from the repository folder. This copies the plugin to the Codex personal plugin
+source folder, creates or updates the personal marketplace entry, and tries to
+install `nobgit@personal`.
+
+### Windows PowerShell
+
+```powershell
+git clone https://www.nobgit.com/nobgit/codex.git "$env:USERPROFILE\Downloads\nobgit-codex"
+Set-Location "$env:USERPROFILE\Downloads\nobgit-codex"
+.\install.ps1
+```
+
+### macOS or Linux
+
+```bash
+git clone https://www.nobgit.com/nobgit/codex.git "$HOME/Downloads/nobgit-codex"
+cd "$HOME/Downloads/nobgit-codex"
+./install.sh
+```
+
+If the Codex CLI is not available to the installer, open Codex, go to Plugins,
+search for `nobgit`, and install it from the Personal marketplace.
+
+Start a new Codex thread after installing so the NobGit skill and MCP tools are
+loaded into the conversation.
+
+## Marketplace install
+
+This repository is also a local marketplace root. If you want to install it that
+way instead of using the personal installer:
+
+```bash
+codex plugin marketplace add <path-to-this-repository>
+codex plugin add nobgit@nobgit
+```
+
+## Why the marketplace step matters
+
+Cloning this repository into a plugin folder can make the skill load locally, but
+Codex uses the marketplace entry to render the plugin in the Plugins UI. The
+entry above marks NobGit as available, names its local source path, and gives it
+the Developer Tools category.
diff --git a/plugins/nobgit/skills/nobgit/SKILL.md b/plugins/nobgit/skills/nobgit/SKILL.md
new file mode 100644
index 0000000..0ccb23b
--- /dev/null
+++ b/plugins/nobgit/skills/nobgit/SKILL.md
@@ -0,0 +1,149 @@
+---
+name: nobgit
+description: Publish local repositories from Codex to NobGit, including repository discovery, remote setup, authentication guidance, commits, and Git pushes over HTTPS.
+---
+
+# NobGit
+
+Use this skill when the user asks Codex to publish, push, mirror, upload, or connect a local Git repository to NobGit.
+
+This is a Codex workflow. Use Git commands from the current repository and NobGit repository metadata when available.
+
+## Capabilities
+
+- Search and inspect NobGit repositories through the NobGit connector/MCP tools when available.
+- Prepare a local repository for publishing.
+- Add or update a NobGit Git remote.
+- Commit intended local changes after reviewing status.
+- Push a selected branch to NobGit over HTTPS.
+- Help the user create or choose a NobGit repository when the target does not already exist.
+
+## NobGit URLs
+
+Default host:
+
+```text
+https://www.nobgit.com
+```
+
+Repository web URL:
+
+```text
+https://www.nobgit.com/<owner>/<repo>
+```
+
+Git-over-HTTPS remote URL:
+
+```text
+https://www.nobgit.com/<owner>/<repo>.git
+```
+
+Legacy Git remotes may use:
+
+```text
+https://www.nobgit.com/git/<repo>.git
+```
+
+Prefer the owner/repo `.git` route for new remotes.
+
+## Authentication
+
+NobGit Git-over-HTTPS uses HTTP Basic authentication. Use the NobGit username or email as the username and either a NobGit password or an expiring NobGit access token as the password.
+
+Tokens are created in NobGit under:
+
+```text
+Settings -> Git -> Expiring access token
+```
+
+Do not put tokens into committed files, scripts, or remote URLs. Keep remotes clean, for example:
+
+```text
+https://www.nobgit.com/alex/my-repo.git
+```
+
+When a push needs credentials, let Git prompt through the user's configured credential manager, or ask the user for the safest available credential flow for that environment. Avoid echoing secrets in shell commands.
+
+## Publish Workflow
+
+1. Confirm the working directory is a Git repository:
+
+```powershell
+git rev-parse --show-toplevel
+git status --short --branch
+```
+
+2. Determine the target NobGit repository as `<owner>/<repo>`.
+
+Use NobGit connector tools such as repository search/get when available. If the repository does not exist and there is no create-repository tool available, tell the user to create it at:
+
+```text
+https://www.nobgit.com/new
+```
+
+3. Inspect remotes:
+
+```powershell
+git remote -v
+```
+
+4. Add or update a remote named `nobgit` unless the user requests another name:
+
+```powershell
+git remote add nobgit https://www.nobgit.com/<owner>/<repo>.git
+```
+
+If `nobgit` already exists but points elsewhere:
+
+```powershell
+git remote set-url nobgit https://www.nobgit.com/<owner>/<repo>.git
+```
+
+5. Commit only intended changes. Review `git status --short`, inspect relevant diffs, and avoid committing unrelated user changes. If the user explicitly asked to publish everything, still summarize what will be included before committing.
+
+Useful commands:
+
+```powershell
+git diff --stat
+git diff
+git add <paths>
+git commit -m "<message>"
+```
+
+6. Push the branch:
+
+```powershell
+git branch --show-current
+git push -u nobgit <branch>
+```
+
+If the branch is empty or unset, use `main` only after confirming that matches the repository intent.
+
+## Safety Rules
+
+- Never run destructive Git commands such as `git reset --hard`, `git clean`, or force-push unless the user explicitly requests them.
+- Never rewrite existing remotes other than the NobGit remote unless asked.
+- Do not embed credentials in remote URLs.
+- Do not expose tokens in logs, command output, final messages, or files.
+- Preserve unrelated local changes.
+- If the push fails with authentication required, explain that NobGit expects username/email plus password or expiring access token for Git-over-HTTPS.
+
+## Common Fixes
+
+Authentication required:
+
+```text
+Create or use a NobGit expiring access token, then retry the push and enter username/email plus token when Git prompts.
+```
+
+Repository not found:
+
+```text
+Check the owner/repo path, make sure the repository exists on NobGit, and verify the user has write access.
+```
+
+Permission denied:
+
+```text
+The NobGit account used for Git authentication needs write access to the target repository.
+```
diff --git a/readme.md b/readme.md
index 699c1e5..ee2d06e 100644
--- a/readme.md
+++ b/readme.md
@@ -6,95 +6,43 @@ metadata, repository trees/files, and issue operations.
## Install
-Clone the plugin into your personal Codex plugin source folder:
+If you already cloned or pulled this repository from NobGit, run the installer
+from the repository folder. This copies the plugin to the Codex personal plugin
+source folder, creates or updates the personal marketplace entry, and tries to
+install `nobgit@personal`.
### Windows PowerShell
```powershell
-git clone https://www.nobgit.com/nobgit/codex.git "$env:USERPROFILE\plugins\nobgit"
-
-$marketplacePath = "$env:USERPROFILE\.agents\plugins\marketplace.json"
-$marketplaceDir = Split-Path $marketplacePath
-New-Item -ItemType Directory -Force $marketplaceDir | Out-Null
-
-if (Test-Path $marketplacePath) {
- $marketplace = Get-Content -Raw $marketplacePath | ConvertFrom-Json
-} else {
- $marketplace = [ordered]@{
- name = "personal"
- interface = [ordered]@{ displayName = "Personal" }
- plugins = @()
- }
-}
-
-$entry = [ordered]@{
- name = "nobgit"
- source = [ordered]@{
- source = "local"
- path = "./plugins/nobgit"
- }
- policy = [ordered]@{
- installation = "AVAILABLE"
- authentication = "ON_INSTALL"
- }
- category = "Developer Tools"
-}
-
-$plugins = @($marketplace.plugins | Where-Object { $_.name -ne "nobgit" })
-$marketplace.plugins = @($plugins + $entry)
-$marketplace | ConvertTo-Json -Depth 10 | Set-Content -Encoding UTF8 $marketplacePath
+git clone https://www.nobgit.com/nobgit/codex.git "$env:USERPROFILE\Downloads\nobgit-codex"
+Set-Location "$env:USERPROFILE\Downloads\nobgit-codex"
+.\install.ps1
```
### macOS or Linux
```bash
-git clone https://www.nobgit.com/nobgit/codex.git "$HOME/plugins/nobgit"
-
-mkdir -p "$HOME/.agents/plugins"
-python3 - <<'PY'
-import json
-from pathlib import Path
+git clone https://www.nobgit.com/nobgit/codex.git "$HOME/Downloads/nobgit-codex"
+cd "$HOME/Downloads/nobgit-codex"
+./install.sh
+```
-marketplace_path = Path.home() / ".agents" / "plugins" / "marketplace.json"
-if marketplace_path.exists():
- marketplace = json.loads(marketplace_path.read_text())
-else:
- marketplace = {
- "name": "personal",
- "interface": {"displayName": "Personal"},
- "plugins": [],
- }
+If the Codex CLI is not available to the installer, open Codex, go to Plugins,
+search for `nobgit`, and install it from the Personal marketplace.
-entry = {
- "name": "nobgit",
- "source": {
- "source": "local",
- "path": "./plugins/nobgit",
- },
- "policy": {
- "installation": "AVAILABLE",
- "authentication": "ON_INSTALL",
- },
- "category": "Developer Tools",
-}
+Start a new Codex thread after installing so the NobGit skill and MCP tools are
+loaded into the conversation.
-marketplace["plugins"] = [
- plugin for plugin in marketplace.get("plugins", [])
- if plugin.get("name") != "nobgit"
-] + [entry]
-marketplace_path.write_text(json.dumps(marketplace, indent=2) + "\n")
-PY
-```
+## Marketplace install
-Then install it from the personal marketplace:
+This repository is also a local marketplace root. If you want to install it that
+way instead of using the personal installer:
```bash
-codex plugin add nobgit@personal
+codex plugin marketplace add <path-to-this-repository>
+codex plugin add nobgit@nobgit
```
-Start a new Codex thread after installing so the NobGit skill and MCP tools are
-loaded into the conversation.
-
## Why the marketplace step matters
Cloning this repository into a plugin folder can make the skill load locally, but