Skip to main content

Project: noclickops

noclickops is a portable script suite for developers who'd rather type a command than click through a web UI. It wraps the operations a developer does every day on their projects — open a PR, merge a PR, deploy a service, scaffold a new service, tail logs, open a shell, see what's deployed — without re-implementing the underlying systems (the pipelines, the git providers, the cloud APIs).

Installed once per developer machine; operates on whichever git repo the developer is currently in (pwd). One installer; one update command; works across every project.

The brand says it plainly: no clickops.

For the user-facing description, install instructions, and quickstart, read the repo-root README.md first.


What this repo contains

noclickops/
├── README.md — product overview (read this first)
├── LICENSE
├── install.sh — one-time installer (Bash; mac/Linux/WSL/Git Bash)
├── install.ps1 — same for Windows PowerShell

├── bin/ — the user-facing scripts (one per command)
│ ├── noclickops.sh — the discovery / dispatcher target
│ ├── create-pr.sh
│ ├── merge-pr.sh
│ ├── deploy.sh
│ ├── add-service.sh
│ ├── clean-sample.sh
│ ├── sync-lovable.sh
│ ├── info.sh
│ ├── logs.sh
│ ├── shell.sh
│ └── *.ps1 — PowerShell sibling for each

├── lib/ — shared helpers
│ ├── _common.sh
│ └── _common.ps1

├── templates/ — per-stack templates copied into target repos
│ └── lovable/ — Vite/React/PWA → nginx (Dockerfile + nginx.conf)

└── website/docs/ai-developer/ — this folder
├── README.md, WORKFLOW.md, PLANS.md, GIT.md,
├── AZURE-DEVOPS.md, TALK.md, WORKTREE.md, DEVCONTAINER.md
├── project-noclickops.md — this file
└── plans/ — INVESTIGATE-*.md + PLAN-*.md
├── backlog/
├── active/
└── completed/

This layout is the proposed v1 design — see plans/backlog/INVESTIGATE-noclickops.md. The repo currently has only LICENSE + this AI-developer scaffold; everything under bin/, lib/, templates/, and the installers is what the investigation's child PLANs deliver.


How it's used

# One-time, per developer machine:
curl -fsSL https://raw.githubusercontent.com/terchris/noclickops/main/install.sh | bash

# After install, in any git repo on the machine:
noclickops # show the inventory
noclickops deploy <service> test --watch # run the service's CD pipeline
noclickops create-pr "feat: …" # open a PR from the current branch
noclickops update # pull the latest noclickops

The shell function from [Q60] in the investigation routes by pwd's git root — same command works in every No-ClickOps-enabled repo, no per-repo config required.


Devcontainer

No devcontainer. Ignore DEVCONTAINER.md. Developers (and contributors to this repo) work directly on the host shell — exactly the audience this tool serves.


Working on the docs site

The site under website/ is a Docusaurus app. Local dev:

bash scripts/generate-docs.sh # regenerate docs/commands.mdx, docs/index.md, src/data/*.json
cd website
npm install # first time only
npm start # http://localhost:3000 with hot reload
npm run build # production build (catches broken links)

Requires Node 20+. The build runs with onBrokenLinks: 'throw', so any broken intra-docs link fails CI. Mermaid + local search are enabled.

A dev-mode warning from the search plugin (⚠ Local search will not work in dev mode) is normal — the search index is built at npm run build time. To test search locally, run npm run build then npm run serve.

scripts/generate-docs.sh

Bash generator (~250 lines). Sources lib/metadata.sh, walks bin/*.sh, and emits four files (all gitignored — never commit the outputs):

FilePurpose
website/docs/commands.mdxPer-command reference page (/docs/commands) — H2 per category, H3 per command, collapsible --help.
website/docs/index.mdDocs root (/docs/) — README.md with frontmatter prepended and repo-root links rewritten to GitHub URLs.
website/src/data/commands.jsonConsumed by React components. One row per command.
website/src/data/categories.jsonConsumed by <CommandCategoryGrid>. One row per category.

CI runs the generator before npm run build (see .github/workflows/deploy-docs.yml). Locally: re-run the script whenever you edit README.md, add a script to bin/, or change a script's SCRIPT_* metadata block. If you forget, Docusaurus errors with "Module not found: src/data/commands.json" — recover by running the generator.

The generator is Bash-only (no .ps1 sibling) — it's internal repo tooling, not target-repo-facing. The portability guard (tests/test-portability.sh) only scans bin|lib|templates|shell, so scripts/ is intentionally outside that surface.


Platform: GitHub

This repo is on GitHub (https://github.com/terchris/noclickops), not Azure DevOps. Ignore the Azure DevOps half of AZURE-DEVOPS.md; use the GitHub Operations (gh) section of GIT.md for PR mechanics here.

(Distinct from the target platform: in v1 the scripts here target Azure DevOps repos only — matching the Red Cross stack noclickops exists to serve. The fact that noclickops's own repo lives on GitHub is just where the tool is hosted; its operational reach is the ADO az repos / az pipelines / az containerapp surface. GitHub-target support is a future extension.)


Key rules and contracts

Portability — non-negotiable

No script in this repo may hard-code any target repo's identity. Not org names, not repo names, not project names, not platform APP_NAME values. All such values come from the target repo's git remote, its variables files, or environment-variable overrides. This is what makes noclickops work against any project a dev cd's into.

Wrap existing automation, never replicate it

noclickops triggers and observes existing pipelines and APIs — it never re-implements them locally. When a target repo's pipeline owner ships a new step (Copier upgrade, Bicep change, secrets handling), every noclickops user gets it for free because they're calling the same pipeline. This rule is why add-service is an az pipelines run wrapper rather than a local Copier invocation, and why deploy triggers a CD pipeline rather than az containerapp update-ing directly.

Multi-repo, multi-OS

Designed-for by construction:

  • Many repos: the shell-function dispatcher calls git rev-parse --show-toplevel at call time, so the same command resolves to the right repo's context based on pwd.
  • macOS / Linux / Windows: Bash function covers macOS (zsh), Linux (bash), Windows via Git Bash and WSL. A PowerShell function in $PROFILE covers native Windows PowerShell. Every command ships .sh and .ps1 siblings.

Always work on a branch — never commit directly to main

Required flow for changes to noclickops itself: branch → commit → push → PR → merge. This repo lives on GitHub; the PR mechanics are gh pr create / gh pr merge (see GIT.md).

Commit per plan; PR per investigation

For work that follows an INVESTIGATE-*.mdPLAN-*.md chain (see PLANS.md):

  • Commit when each child PLAN is complete.
  • Open the PR only when the parent investigation is finished (all spawned PLANs shipped). The PR carries the full investigation's deliverables as one cohesive review unit.
  • Standalone PLANs / fixes outside an investigation chain: simple commit + PR per plan.

noclickops v1 is the work; the AI-developer framework is the scaffolding

Everything substantive about what noclickops does lives in plans/backlog/INVESTIGATE-noclickops.md and the PLANs it spawns. The WORKFLOW.md / PLANS.md framework rules apply unchanged. The bin/, lib/, templates/, and installer files are all produced by those PLANs.


Always-loaded rules

The repo root contains a CLAUDE.md that Claude Code auto-loads at session start. It points here as the authoritative project doc and surfaces the most critical rules.