A shared development workflow that takes a draft note from "raw idea" to "tagged release" without skipping the requirement, design, plan, and acceptance-test phases. The repository ships the prompts, skills, instructions, templates, and helper scripts that drive that workflow.
The skills are tested with GitHub Copilot in VS Code and with Claude Code
in both the VS Code extension and the CLI. They are designed to work with
any LLM that can read files in the workspace and write files back: every
slash command resolves to a plain markdown body in instructions/
that another model can be handed directly as context.
Work in progress. These are drafts. Content is being extracted from project-specific repositories and generalized for reuse across projects. Expect rough edges, missing pieces, and instructions that still reference their origin project.
The point of this workflow is to keep the creative expression of an idea while refusing to short-circuit it into code. Vibe-coding -- "I got an idea, here it is, now generate me some code for it, I will figure out the details later" -- is what these skills are built to prevent.
Each skill draws a clear line between phases:
- Define and refine what is actually needed, in plain text first
(
/split-and-define,/write-requirement,/review-ask-questions,/consolidate-then-review-ask-questions). - Design a solution with explicit acceptance scenarios
(
/write-designand the same review loop). - Plan the implementation as a numbered list of steps, then run the
same review loop on the plan itself (not on the validation plan). The
first step adds gate tests that fail on purpose; the following steps make
those tests pass one by one. The last step adds the acceptance tests
that close the loop on the original requirement
(
/write-plans, the plan review loop,/implement-step,/implementation-check).
See DEVELOPMENT.md -- Goal: avoid vibe-coding for the full rationale, what each phase costs up front, and the short path when the draft is genuinely one self-contained requirement.
A side benefit: the workflow leaves a written trail. Each phase produces artifacts -- the draft, the requirement, the design with its acceptance scenarios, the plan and validation plan, the per-step grouped commits -- and each merge keeps a conventional commit message that ties them together. That trail is read later by humans returning to old code, and it is also the context an LLM needs when asked to extend, debug, or explain that code in a future session. The history carries not just the code, but the reasoning that produced it.
- review to ask questions about your requirement or design;
- review to confirm (or infirm) the code generated does indeed match what was planned.
If your blindly trust what the LLM generates as a first pass (even in terms of documentation), you are missing out.
The review loop is where the LLM gets to challenge the inputs it was given and the outputs it produced, and to ask for clarifications or point out contradictions. It is also where you get to see if the LLM actually understands the requirement and design, or if it just generated something that superficially looks like it.
The "implementation check" phase is where the LLM gets to confirm that the code it just generated actually implements the plan and meets the acceptance criteria. If it does not, you get to iterate on the implementation until it does.
One row per phase, in execution order. The "Trigger" column is what the author types or runs; the "Output artifact" column is what lands on disk after the trigger completes.
| Phase | Trigger | Output artifact |
|---|---|---|
| Draft capture | Author writes free-form notes | a raw draft note |
| Process draft | /process-draft |
the draft classified (feature-request / issue), renamed docs\draft.vX.Y.Z.<slug>.md, on a new effort branch |
| Split (optional) | /split-and-define |
List of feature-requests and issues to create section appended to the draft |
| Define each item | /write-requirement <type> vX.Y.Z <topic> |
docs\feature-request.vX.Y.Z.<topic>.md or docs\issue.vX.Y.Z.<topic>.md |
| Review loop | /review-ask-questions then /consolidate-then-review-ask-questions |
Open questions folded into a decision table; document approved |
| Design | /write-design |
docs\design.vX.Y.Z.<topic>.md with acceptance scenarios |
| Plan | /write-plans |
docs\plan.vX.Y.Z.<topic>.md + docs\plan.vX.Y.Z.<topic>.validation.md |
| Plan review loop | /review-ask-questions then /consolidate-then-review-ask-questions on the plan |
Plan open questions folded into a decision table; plan approved (the validation plan is left untouched) |
| Implement and check | /implement-step N, then pw handoff chains /implementation-check N |
Code, tests, and updates to the validation document |
| Group commits | pw handoff after-check routes a Yes step to /group-commits-msg; gcba replays |
a.commit with one conventional commit per group, replayed by gcba |
| Merge and reword | git merge --no-ff then /update-merge-commit-msg then grmc |
Merge commit with a conventional message tied to the merged docs |
| Prepare release notes | /prepare_release_notes |
a.md, a release-notes summary in version.txt, an updated CHANGELOG.md |
| Prepare release (automated) | /prepare-release |
Rebases the branch onto the latest main when behind (with a ghog day gate), does the merge and reword, the version.txt snapshot, /prepare_release_notes, and the pyproject and uv steps, then one chore(release): prepare for vX.Y.Z release commit; stops before brel |
| Release | brel |
Version tag vX.Y.Z on main, marked [valid] after a green build |
From /implement-step N down to the a.commit group-commit-message step,
the rows no longer need a separate trigger each. One pw handoff call at
the end of each step writes the next prompt and the chain runs itself --
see Automated implement cycle with pw handoff.
The document rows above (define -- review -- consolidate -- design --
plan) chain the same way through pw skill: each writing and consolidate skill
ends by running pw skill and following the command it prints, so the only
trigger the author types is the first one, and the only human-in-the-loop stop
is /review-ask-questions -- see
Automated document phase with pw skill.
Every commit in this workflow follows the
Conventional Commits v1.0.0
spec for the title line (type(scope): subject, 52 characters max).
That title is what tools read to generate changelogs and release
notes.
The spec stops at the title. The body is freeform. This repository
extends the spec with a fixed body template,
templates/group-commits-msg.template.md,
that adds two structured sections under the title:
Why:-- two short paragraphs separated by an empty line. The first paragraph states why the commit is needed (what was broken, missing, or unclear). The second paragraph states how the code is better after the commit lands.What:-- a dash-prefixed list of the actual modifications, one line per change.
The reason for the extension: the title alone feeds a changelog generator, but it does not help the next reader -- human or LLM -- understand why the code looks the way it does. The body template fills that gap.
The matching skill, /group-commits-msg, automates the harder half.
By the time a developer is ready to commit, they often no longer
remember every change they made in the working tree, nor which
changes depend on which others. The skill reads the staged diff,
groups files from the least dependent group to the most dependent
one, and writes one commit message per group into a.commit for the
author to review and edit. gcba then replays a.commit as a
sequence of real commits.
See DEVELOPMENT.md -- Conventional commit message template for the template fields in detail, the 52/80 character rules, and the rationale behind the least-to-most-dependent grouping pass.
The skills in this repository fit a single end-to-end workflow that takes a raw idea from a draft note all the way to a tagged release. The diagram below shows the main phases and which skill triggers each transition. See DEVELOPMENT.md for per-phase details and helper diagrams.
Legend for the transitions:
-- /skill --> the model runs that skill and writes the artifact
== pw skill ==> an automated handoff: the writing or consolidate skill
ends by running pw skill, reads the bare next-step command
it prints (a "/" prefix for Claude, "$" for Codex), and
runs it with no "go ahead"
[STOP ...] the only human-in-the-loop pauses in the whole flow
+-----------------+
| raw draft note |
+--------+--------+
|
| /process-draft (classify feature/issue,
| pick vX.Y.Z, rename draft.vX.Y.Z.<slug>.md,
| create the effort branch)
v
+-----------------+
| named, branched | process-draft ends on a multi-choice
| draft (EdB) | (pw skill names the produced draft):
+--------+--------+
|
+------------+------------+
| |
single requirement? multiple items?
/write-requirement /split-and-define
(skip the split) (one /write-requirement per slug)
| v
| +-----------------+
| | requirement |
| | items list |
| +--------+--------+
| |
| /write-requirement
| (one per item)
| |
+------------+--------------+
v
+-----------------+
| |----+ == pw skill ==> /review-ask-questions
| requirement doc | | [STOP] a human answers the Q0x | Title |
| |<---+ Recommended table; /consolidate folds them
+--------+--------+ and loops here, or settles
|
| settled == pw skill ==> /write-design
v
+-----------------+
| |----+ == pw skill ==> /review-ask-questions
| design doc | | [STOP] a human answers the Q0x table;
| |<---+ /consolidate loops here, or settles
+--------+--------+
|
| settled == pw skill ==> /write-plans
v
+-----------------+
| plan + |----+ == pw skill ==> /review-ask-questions
| validation plan | | [STOP] a human answers the Q0x table
| |<---+ (plan only); /consolidate loops or settles
+--------+--------+
|
| settled == pw skill ==> /implement-step N (enters chain)
v
+=================================================================+
| Automated implement chain -- pw handoff wires each box |
| to the next: no menu, and no "go ahead" between the steps |
| inside this box. |
| |
| +-----------------+ |
| | implement step | |
| +--------+--------+ |
| | pw handoff check <x> |
| v |
| +-----------------+ |
| | implementation |----+ No: implement- |
| | check (Yes/No) | | missing step, then |
| +--------+--------+<---+ pw handoff check <x> |
| | pw handoff after-check <x> |
| | (Yes branch) |
| v |
| +-----------------+ |
| | group-commits- | |
| | msg writes | |
| | a.commit | |
| +--------+--------+ |
+======================= =========================================+
| chain ends at the [STOP: commit gate]: a.commit
| is presented with a multi-choice supplied by
| pw skill --after-commit <x> -- "go ahead" |
| "go ahead, implement step <next>" | "prepare-release"
v
+-----------------+
| step N |----+ "go ahead" -> gcba replays
| committed | | the grouped commits, gp
| |<---+ (loop for next step)
+--------+--------+
|
| last step done: effort branch ready
v
+-----------------+ one command, any branch: switch to
| prepare-release | main + merge --no-ff, reword, set
| stops before | version.txt -SNAPSHOT, run
| the tag | /prepare_release_notes (notes +
+--------+--------+ CHANGELOG), pyproject + uv, then one
| chore(release): prepare commit
| review everything, then
| brel (build + tag)
v
+-----------------+
| release |
+-----------------+Each looping box in the diagram above has its own zoomed-in diagram in DEVELOPMENT.md, under the section named after the phase (draft capture, requirement breakdown, review loop, design and planning, grouped commit loop, step execution, and merge). Read the top-level diagram for the route, then jump to the per-phase diagram for the detail.
The giant box around the implement, check, and group-commit steps marks
the part that now runs by itself: pw handoff chains those steps with no
menu and no go-ahead until a.commit is written. See
Automated implement cycle with pw handoff
for how each transition fires.
The document phase before that box now chains the same way, driven by
pw skill rather than pw handoff. Each writing skill (/write-requirement,
/write-design, /write-plans) ends by running pw skill, which reads the
documents on disk and prints the next command -- the matching
/review-ask-questions -- which the model then runs with no go-ahead. The
review is the one stop: a human answers the Q0x | Title | Recommended Answer
table, then /consolidate-then-review-ask-questions folds the answers and,
once the document is settled, runs pw skill again to hand off to the next
phase (design, plan, or the implement chain). See
Automated document phase with pw skill
for how each handoff fires and where the chain stops.
The flow opens and closes with one skill each. /process-draft turns a
loose draft note into a named, classified, branched effort ready to spec
(see DEVELOPMENT.md -- Draft capture for a feature or fix).
/prepare-release is the box at the bottom: one command, from any branch,
that does the merge and reword, the version.txt snapshot,
/prepare_release_notes, and the pyproject and uv steps, then a single
chore(release): prepare commit, and stops before brel tags (see
DEVELOPMENT.md -- Automate the prep with /prepare-release).
The /split-and-define phase is optional. When the draft already
describes a single, self-contained requirement, the author can call
/write-requirement directly and pass the type (feature-request or
issue), version, and topic -- no split step is needed. Reach for
/split-and-define when the draft mixes several distinct items, when
the items differ in dependency order, or when the author wants the skill
to suggest a slug per item.
pw is a single launcher (bin\prompt_workflow.bat, wrapping
tools\prompt_workflow.py) with three ways to answer "what is the next step?".
All three resolve the topic from the branch and the docs\ tree and read the
same workflow state; they differ in who picks the step, what they emit, and who
calls them.
| Mode | Step chosen by | Emits | Used by |
|---|---|---|---|
pw |
a human, from a menu | a full next-step prompt in a.prompt.txt |
a person driving the workflow by hand |
pw handoff <task> <x> |
the caller (the step is given) | a full, assembled cycle prompt in a.prompt.txt |
the implement-cycle handoffs |
pw skill |
pw, derived from the docs on disk |
one bare command line on stdout | the document-phase handoffs and the commit gate |
pw handoff is the verbose one: it assembles a complete prompt -- the plan
step number, the step title read from the plan, the staged set, the Yes/No
branch -- because the next cycle instruction needs that context built for it.
pw skill is the terse one: it prints only the bare command (for example
/review-ask-questions on docs\design.vX.Y.Z.<slug>.md), because that command is
a standard slash skill that loads its own full instructions when it runs. So the
verbosity is not lost with pw skill, only deferred to the skill it names.
See DEVELOPMENT.md -- How pw, pw handoff, and pw skill differ for the shared core, the per-mode detail, and when to reach for each.
The giant box in the diagram above is the part of the workflow that now
runs on its own. Each step ends by calling pw handoff, which writes the
prompt for the next step; the model reads that prompt and keeps going,
with no menu in between and no pause to ask "should I proceed?". pw is
the prompt-workflow launcher (bin\prompt_workflow.bat, the pw alias);
pw handoff <task> <x> builds the next cycle prompt for plan step <x>
without showing the interactive menu.
The chain covers the forward moves of the implement cycle. Each move is
one pw handoff call, run from the project root once the current step is
done:
- after
/implement-step <x>(once itsghog daywalk is green):pw handoff check <x>writes theimplementation-check.mdprompt. - after
/implementation-check <x>(once it records its Yes/No verdict):pw handoff after-check <x>letspwpick the next step itself. - after
/implement-missing-step <x>(once its walk is green):pw handoff check <x>again, so the filled gap is re-checked.
after-check is neutral on purpose. pw reads the Analysis of Step x
status line the check just wrote and routes the branch, so the caller
cannot pick the wrong next step:
- a
Nostatus -- theimplement-missing-step.mdprompt, to fill the gap the check listed, then back to the check. - a
Yesstatus -- thegroup-commits-msg.mdprompt (itsgit add -Aform), which stages every change and writes one grouped commit message per group intoa.commit.
The chain stops at a.commit. Writing the grouped commit messages is the
last automatic step; making the real commits is not. gcba replays
a.commit only after the author reviews it and says "go ahead", the
review gate that group-commits-msg.md keeps. So the model writes the
messages on its own, then waits for the go-ahead before any commit lands.
Every pw handoff call writes the next prompt to a.prompt.txt at the
project root, copies it to the clipboard, and records the step in
a.prompt_memory. The model confirms the first line of a.prompt.txt
names the expected instruction, then follows that prompt. The calls are
wired into the workflow by the ## Handoff section of each cycle
instruction (implement-step.md, implement-missing-step.md, and
implementation-check.md); the same chain is drawn step by step in
DEVELOPMENT.md -- Step execution loop from the plan.
Before the implement chain, the document phase -- requirement, design, and
plan -- chains the same way, driven by pw skill instead of pw handoff.
pw skill is the prompt-workflow launcher's read-only router: it reads the
effort's documents on disk, works out which phase is done and which comes next,
and prints one bare next-step command. The writing and consolidation skills end
by running it and following that command, so the document phase advances with no
menu and no "go ahead".
pw skill resolves the topic from the branch and the docs\ tree, then derives
the next command from what is on disk:
- a fresh draft --
/process-draft on docs\draft.vX.Y.Z.<slug>.md. - a requirement, design, or plan that still has open questions --
/consolidate-then-review-ask-questions on ...(answers are waiting to fold). - a settled requirement (its decision table is in place) --
/write-design. - a settled design --
/write-plans; a settled plan --/implement-step.
The command carries the host prefix: / in a Claude session (CLAUDECODE), $
in a Codex one (CODEX_THREAD_ID), overridable with pw skill --host. The
forced form pw skill <skill-name> prints a specific earlier skill's command
when its document exists, to re-run a phase by hand.
The ## Handoff section of each document skill wires the chain:
/write-requirement,/write-design, and/write-planseach end by runningpw skill, which prints the matching/review-ask-questions; the model runs it straight away. Passingstop hereto the writing skill holds the chain so the author can read the document before the review./consolidate-then-review-ask-questions, once it has folded every answer and the document reads as settled, runspw skillto hand off to the next phase (/write-design,/write-plans, or/implement-step).
/review-ask-questions is the one stop in the document phase: it is a review, so
a human answers before anything else runs. The skill posts its open questions as
a Q0x | Title | Recommended Answer table and leaves the next-step command both
as plain text and, where the host renders it, as a Tab-completable hint -- but
it does not run the next skill itself. When a review round raises no question at
all, the skill writes a one-row decision table instead, so the document reads as
settled and pw skill advances straight to the next phase, skipping a
consolidate round.
At the end of the implement chain, the commit gate uses the same engine. The
group-commits-msg skill runs pw skill --after-commit <x>, which -- told the
plan step <x> the commit completes -- derives the contextual next action: the
next plan step's /implement-step while steps remain, /prepare-release once
the last step is committed, or nothing for a standalone commit with no plan. The
gate presents that as a multi-choice -- a constant go ahead, the contextual
option, and a free-text entry -- so a plain go ahead commits and stops, while
the contextual option commits and chains on only after the commit succeeds.
The launcher itself is documented for any shell in
instructions/run-pw.md: the bare pw Doskey alias
only resolves in an interactive cmd, so a tool shell calls
bin\prompt_workflow.bat directly -- it self-locates its venv, with no
senv.bat needed.
A release is more than a git tag. Before main is tagged, the
/prepare_release_notes skill turns the commit history since the last
tag into release notes a reader can use.
The skill runs
scripts/prepare_release_notes.sh:
it reads the X.Y.Z-SNAPSHOT version from version.txt, collects every
conventional-commit title since the last tag, and writes a.md with
those titles grouped by type. From a.md, the skill writes a
release-notes summary back into version.txt -- a main theme, a short
list of key changes, and three witty title / subtitle pairs for the
author to pick from. Once a title is picked, the skill calls
update-changelog.bat to fold the summary into CHANGELOG.md.
This skill stops before the tag. Creating the release is a separate
step: the author runs brel, which drives the project build with the
rel parameter. See
DEVELOPMENT.md -- Prepare release notes and create the release
for the six-step workflow and the dependency on the senv_dev_workflow
build tooling.
A release is more than the tag: the effort branch is merged into main,
version.txt is set to X.Y.Z-SNAPSHOT with its release notes,
CHANGELOG.md is updated, and only then is main tagged vX.Y.Z by
brel. The /prepare-release skill drives every step except the tag, from
any branch, and stops at one chore(release): prepare for vX.Y.Z release
commit for the author to review.
It calls the smaller skills rather than repeating them, signalling each
through a git-ignored a.prepare-release.active flag file so the callee
hands control back:
group-commits-msg-- commit a dirty tree, or commit fixes a test gate needed.update-merge-commit-msg-- give the merge commit theWhy:/What:message (a free-form one is refused).prepare_release_notes-- theversion.txtsummary andCHANGELOG.md.- the
ghog daygroundhog loop -- the green gate after a rebase or a stale-base merge.
The skill pauses whenever the author must decide or act, and several pauses
resume only on an explicit "go ahead": choosing rebase / merge-anyway /
abort when the branch is behind main, resolving a rebase conflict, picking
a release title, and the notes-review pause where the author edits the
version.txt summary or asks for .changelog.fixes rules before the
changelog is regenerated. It never tags and never pushes; the author runs
brel at the end. The full pause-by-pause table is in
DEVELOPMENT.md -- Automate the prep with /prepare-release.
The test side of the workflow is driven by groundhog (ghog), one tool replacing the old ptr/pta/pts aliases: ghog day walks compile check, affected tests, then the full suite with a fresh coverage measure, stopping at the first non-green step with the exact fix to apply; ghog init registers the fixing loop in a project for both Claude Code (/groundhog) and ChatGPT Codex (AGENTS.md section plus a /groundhog custom prompt). LLM-driven runs go through a project-root a.ghog.log (overwritten per run, never deleted): the model branches on exit codes and reads only the log tail, while the user follows the run live from a second console; direct console runs keep the usual stdout. The full manual is GROUNDHOG.md.
Two folders, one per agent -- same skills, same instruction bodies, two discovery mechanisms. Pick the one your agent reads.
.github/ GitHub Copilot picks up prompts, skills, and agents from here
├─ agents/
│ └─ split-large-file.agent.md split a large file or class
├─ copilot-instructions.md shared chat and code-writing rules (Copilot)
├─ prompts/
│ ├─ analyse.prompt.md guide read-only analysis
│ ├─ check-api*.prompt.md review API dumps for architecture smells
│ ├─ continue-analyse.prompt.md continue a prior analysis thread
│ ├─ discuss.prompt.md answer and challenge without code
│ ├─ extend-test-coverage.prompt.md extend tests around selected code
│ ├─ fix-issue.prompt.md fix a selected issue in context
│ ├─ lower-cyclomatic-complexity.prompt.md refactor complex code
│ ├─ rewrite-docstring.prompt.md shorten docstrings without losing meaning
│ ├─ write-commit-message.prompt.md write a conventional commit from a diff
│ ├─ write-doc-commit-message.prompt.md write a docs: commit from a markdown document
│ ├─ write-release-notes-summary.prompt.md summarize a release from commit subjects
│ └─ write-plan.prompt.md write a numbered implementation plan
└─ skills/
├─ <skill>/SKILL.md frontmatter + reference to instructions/<skill>.md
└─ ... same per-skill SKILL.md layout for every skill
.claude/ Claude Code picks up project rules and skills from here
├─ CLAUDE.md shared chat and code-writing rules (Claude Code)
└─ skills/
├─ <skill>/SKILL.md frontmatter + reference to instructions/<skill>.md
└─ ... mirrors .github/skills/ with one extra: write-release-notes-summaryBoth .github/skills/<skill>/SKILL.md and .claude/skills/<skill>/SKILL.md
delegate to the same markdown body under instructions/. A third LLM
that does not read either folder can still run the same skill by being
handed the matching instructions/<skill>.md file as part of its
context.
instructions/ shared skill bodies (one file per skill)
├─ consolidate-then-review-ask-questions.md
├─ groundhog.md the groundhog fixing loop (see GROUNDHOG.md)
├─ group-commits-msg.md
├─ implement-step.md
├─ implement-missing-step.md
├─ implementation-check.md
├─ prepare-release-notes.md
├─ review-and-update-project-docs.md
├─ review-ask-questions.md
├─ split-and-define.md
├─ split-large-file.md
├─ update-merge-commit-msg.md
├─ write-design.md
├─ write-plans.md
├─ write-release-notes-summary.md
└─ write-requirement.md
rules/ shared writing and code-style rules
├─ blacklist.md words to avoid in all responses
├─ markdown.md markdown formatting rules (lists, tables, titles)
└─ preserve_code.md never truncate code when rewriting
templates/ shared markdown templates referenced by instructions/
├─ group-commits-msg.template.md a.commit file format for grouped commits
├─ open-question.template.md Qxx/BBQ/Options block for review skills
├─ prepare-release-notes.version-txt.template.txt version.txt release-notes summary skeleton
├─ write-design.template.md design document skeleton
├─ write-plans.template.md implementation plan skeleton
├─ write-plans.validation.template.md validation plan skeleton
└─ write-requirement.template.md feature-request and issue document skeletons
scripts/ shared helper scripts grouped by skill
├─ prepare_release_notes.sh build a.md from the git history since the last tag
└─ update-merge-commit-msg/
├─ git-extract-merge-docs.sh dump the merged branch docs to a.docs
└─ git-reword-merge.sh rewrite the current merge commit from a.commit
tools/
├─ git_batch_commit.py validate and replay grouped commits
├─ git_command.py local cross-platform Git helper
├─ groundhog/ pytest reset tool behind ghog/ptr/pta/ptanc/pts (see GROUNDHOG.md)
├─ prompt_workflow.py build the next cycle prompt; pw handoff chains the implement cycle
└─ uv_run.py cert-aware uv launcher (personal/corporate networks)
senv.bat local shell aliases for the toolingUsing the shared skills needs no Python environment — they are plain
markdown. A Python environment is only needed to work on llm-shared
itself: to run the helper scripts under tools/ and the test suite
under tests/.
Dependencies are declared in pyproject.toml (the
[dependency-groups] dev group) and pinned in uv.lock. The
repository is managed with uv; there are
no longer any requirements*.txt files.
# Create and activate a virtual environment
python -m venv venv
source venv/bin/activate # Linux
venv\Scripts\activate # Windowsuv is the installer. On a fresh checkout it is not yet present, but it
ships on PyPI as a wheel with the binary bundled in, so the pip that
comes with every venv can bootstrap it:
# Inside the activated virtual environment, when `uv` is not installed
python -m pip install uv
# Then install the development tooling from the lockfile
uv syncThat two-step replaces the former pip install -r requirements.dev.txt.
If uv is already installed system-wide, the first command can be
skipped and uv sync run directly.
uv lock # refresh uv.lock after editing pyproject.toml
uv lock --upgrade # bump every dependency to its newest allowed version
uv sync # apply the lockfile to the venv
uv add --dev <package> # add a development dependencyuv is not aliased — it runs the venv's uv.exe directly. That means a
plain uv lock, uv lock --upgrade, or uv sync uses only the
environment prepared by senv.bat: if a corporate PEM is found,
SSL_CERT_FILE, CURL_CA_BUNDLE, and UV_CERT point at it; if no PEM
is found, those variables stay unset.
The pcomp / pupg / psync aliases are shortcuts for the first three
commands, but they do not call uv.exe directly: they route through
tools/uv_run.py, a cert-aware launcher. On a
corporate machine, senv.bat looks for the newest bundle-like *.pem
first in a local ignored certs/ folder under the repo, then in the
parent folder of the repository, and only falls back to a generic
*.pem when no bundle-like PEM exists. uv_run.py then tries uv
with that explicit PEM first; if the command still fails with a
certificate error, it retries with --system-certs, and only after
that falls back to uv's default trust roots.
The public nature of this repository is a separate concern. It does not
change how local uv commands trust a corporate proxy. Instead,
senv.bat installs a local git clean filter for uv.lock. That filter
rewrites any staged registry URL to https://pypi.org/simple/ and any
staged package URL to https://files.pythonhosted.org/packages/, so
committed uv.lock content stays free of corporate mirror references
even when local uv commands use a corporate index. After clearing any
stale inherited value from an older activation, senv.bat derives
UV_INDEX_URL from PYPI_HOST when that variable is present in the
shell.
So when plain uv already works on a corporate machine, the usual reason
is that senv.bat has already populated SSL_CERT_FILE with the
corporate PEM and uv.exe can use that bundle directly, without needing
the wrapper retry path.
If you want the automatic TLS fallback path, use pcomp, pupg,
psync, or call python tools/uv_run.py ... yourself. It is
project-agnostic; any repository that loads this senv.bat gets the
same shortcuts.
Three read-only commands answer "is everything in order?" without changing anything:
uv sync --locked --check # venv matches uv.lock, and uv.lock matches pyproject.toml
uv lock --upgrade --dry-run # whether any locked version could move to a newer release
uv pip list --outdated # installed packages with a newer release on PyPI| Command | Network | Reports |
|---|---|---|
uv sync --locked --check |
no | venv ↔ uv.lock ↔ pyproject.toml consistency; exits non-zero on any drift |
uv lock --upgrade --dry-run |
yes | which locked versions a uv lock --upgrade would move, writing nothing |
uv pip list --outdated |
yes | installed packages with a newer PyPI release |
uv lock --upgrade --dry-run honours the constraints of the whole
dependency graph; uv pip list --outdated does not. A package can
appear "outdated" there yet be unmovable — for example mando is held
below 0.8 by radon (Requires-Dist: mando (<0.8,>=0.6)), and pip
is the virtual environment's own seed package, not a tracked
dependency. Only what uv lock --upgrade --dry-run reports can be
upgraded by pupg.
pip is unmanaged by uv, so pupg never moves it. Upgrade the venv's
seed pip directly when uv pip list --outdated flags it — this
touches neither pyproject.toml nor uv.lock:
uv pip install --upgrade pipThe intended setup is to reference this repository from an existing
project's workspace or ~/.claude/ directory. The three subsections
below cover the three common entry points: VS Code (Copilot Chat or
Claude Code extension), Claude Code CLI, and any other LLM that reads
files in a workspace.
Keep the real project as the first folder in the workspace and add
llm-shared as the second folder. Do not make llm-shared the main
workspace folder when the goal is to use its prompts inside another
codebase.
In the existing project's .code-workspace file, the folders section
should look like this:
{
"folders": [
{
"path": ".."
},
{
"path": "../../llm-shared"
}
]
}With this layout, .. points to the existing project and
../../llm-shared points to the shared repository. Copilot Chat
discovers the prompts under .github/prompts/, the skills under
.github/skills/, and the agent definitions under .github/agents/
from both workspace folders. The Claude Code VS Code extension, opened
on the same multi-root workspace, picks up .claude/skills/ from the
shared folder.
The checked-in
.vscode/llm-shared.code-workspace
file in this repository is only for working on llm-shared itself.
When you want to use the shared prompts in another codebase, the other
project's workspace file should own the multi-root setup.
Claude Code reads .claude/ from the current working directory. To run
the shared skills inside a project that does not have its own
.claude/ folder, point Claude at the shared one with --add-dir:
claude --add-dir=../llm-sharedAdjust the path so it points to where the repository sits on disk
(..\llm-shared from Windows cmd.exe, ../../llm-shared from a
deeper subfolder, etc.).
To make the shared skills available in every project on the machine
without --add-dir, copy or symlink .claude/skills/ into
~/.claude/skills/:
ln -s "$(pwd)/.claude/skills" ~/.claude/skillsAfter that, the same slash commands resolve in any directory.
Every slash command resolves to a plain markdown body under
instructions/ (for example,
instructions/write-design.md). When an agent that does not understand
.github/skills/ or .claude/skills/ is used, hand it the matching
file in instructions/ as context together with the inputs the body
expects (a draft, a requirement document, a plan, etc.). The slash
command name and the instruction file name are always the same.
| Area | Status | Tested with | Notes |
|---|---|---|---|
| Shared writing rules | draft | Copilot (VS Code), Claude Code (VS Code + CLI) | Includes blacklist, markdown rules, and full-file rewrite rules. |
| Commit message workflow | draft | Copilot (VS Code), Claude Code (VS Code + CLI) | Main focus, with a.commit planning and replay support. |
| Analysis and review prompts | draft | Copilot (VS Code), Claude Code (VS Code + CLI) | Covers API review, plan checks, discussions, and issue work. |
| Step-based skills and agent | draft | Copilot (VS Code), Claude Code (VS Code + CLI) | Includes step implementation, implementation checks, and file splitting. |
| Local helper scripts | draft | Windows (cmd.exe with Doskey) |
Includes senv.bat, git_batch_commit.py, and git_command.py. |
| Groundhog pytest loop | draft | Claude Code (VS Code + CLI), ChatGPT Codex | ghog day walk, ghog init registration, LLM fixing loop; see GROUNDHOG.md. |
| Prompt-workflow handoff | draft | Claude Code (VS Code + CLI) | pw handoff chains implement-step, check, implement-missing, and the a.commit group-commit step with no menu. |
| Prompt-workflow skill | draft | Claude Code (VS Code + CLI), ChatGPT Codex | pw skill chains the document phase (write -> review -> consolidate -> next phase) and feeds the commit-gate multi-choice via --after-commit. |
Shorthand used across this README, DEVELOPMENT.md, and the shared skill bodies. The Doskey aliases are documented in detail in DEVELOPMENT.md -- Local command reference for this workflow.
| Term | Stands for |
|---|---|
a.commit |
Grouped-commit plan file, one block per logical group, replayed by gcba. |
a.diff |
Snapshot of the staged diff written by gcmp so the agent can justify the grouping. |
a.docs |
Dump of the merged branch documents, written by the merge-doc extraction script. |
a.prompt.txt |
Next-step prompt written by pw / pw handoff; the model reads it to continue the cycle. |
a.prompt_memory |
Per-branch workflow state pw records: branch, locked topic, current step. |
c |
Doskey alias to bin\python_check.bat. |
covg |
Doskey alias that maps uncovered lines to functions and builds a clipboard prompt. |
gate test |
A failing test added before the implementation step that makes it pass. |
gcba |
Doskey alias to git_batch_commit.py --root-a-commit; validates and replays a.commit. |
gcmp |
Doskey alias to group_commit_message_prompt.py; writes a.diff and the clipboard prompt. |
ghog |
Doskey alias to bin\ghog.bat, the groundhog pytest reset tool; ghog day walks check + affected + full, ghog init registers the LLM fixing loop (see GROUNDHOG.md). |
gp |
Local Doskey alias to git push. |
grmc |
Local Doskey alias to git-reword-merge.sh; rewrites the current merge commit. |
pta |
Doskey alias to ghog affected: testmon-selected tests with appended coverage, key=value report, exit-code contract. |
ptanc |
Doskey alias to ghog affected --no-cov: the fast focused pass with coverage off. |
pts |
Doskey alias to ghog single <test files>: named test files in focus, coverage off, compared with the last full-run baseline. |
ptr |
Doskey alias to ghog full: resets .testmondata, reruns the suite with coverage against the gate; the objective verdict. |
pw |
Doskey alias to bin\prompt_workflow.bat (tools\prompt_workflow.py); builds the next cycle prompt, interactively or via pw handoff <task> <x> and pw skill. |
pw handoff |
The non-interactive pw handoff <task> <x> subcommand; writes the next step prompt with no menu, the engine of the automated implement chain. |
pw skill |
The read-only pw skill subcommand; reads the docs on disk and prints the bare next-step command (host-prefixed / for Claude or $ for Codex), the engine of the automated document phase. |
pw skill --after-commit |
The commit-gate form; told the just-committed plan step, prints the contextual next action (the next /implement-step, /prepare-release, or nothing). |
Qxx block |
An open-question block appended by the review skills (options + recommended choice). |
ruffc |
Doskey alias to ruff check. |
vX.Y.Z |
Working version slug used in every artifact filename (draft, requirement, design, plan). |
This repository is released under the MIT License. The full text is in LICENSE.md: use, copy, modify, and redistribute the prompts, skills, instructions, templates, and helper scripts, in your own projects or forks, as long as the copyright notice stays in place.
See DEVELOPMENT.md -- License rationale: why MIT fits llm-shared for why MIT was picked over a copyleft license.