Metadata-Version: 2.5
Name: cogrind-workshop
Version: 0.1.2
Summary: Human-facing MCP client (CLI) for a running cobalt-grinding MCP server. Equivalent in role to Claude Desktop / Claude Code — one MCP client among many.
Author-email: Gary Frattarola <garyf@parkviewlab.ai>
License-Expression: AGPL-3.0-or-later
License-File: LICENSE
Requires-Python: >=3.13
Requires-Dist: click>=8.1
Requires-Dist: httpx
Requires-Dist: mcp[cli]>=1.27.0
Requires-Dist: prompt-toolkit>=3.0
Requires-Dist: rich>=13.7
Description-Content-Type: text/markdown

# cogrind-workshop

Human-facing MCP client for a running [`cobalt-grinding`](https://github.com/ParkviewLab/cobalt-grinding) daemon. One-shot action flags (`--ingest`, `--ask`, `--query`, `--status`, …) and an interactive REPL (`--chat`). Equivalent in role to Claude Desktop or Claude Code — just one MCP client among many; no privileged side-door into the cognitive system.

## Status

**Implemented.** One-shot flags (`--ingest`, `--ask`, `--query`, `--status`, …) and an interactive REPL (`--chat`, with slash commands) drive a running `cobalt-grinding` daemon over MCP.

## Releasing

Tag-driven via the release workflow on push of a `v*` tag. Use the [`ParkviewLab/dev-tools`](https://github.com/ParkviewLab/dev-tools) helpers — they enforce the SSOT-tag-CI loop (`pyproject.toml` is the only place the version lives; CI verifies the pushed tag matches before publishing). See the ParkviewLab handbook's [`releases.md`, "Cutting a release"](https://github.com/ParkviewLab/handbook/blob/main/docs/releases.md#cutting-a-release) for the procedure.

Don't have the helpers? Install once: `git clone https://github.com/ParkviewLab/dev-tools.git ~/dev-tools && cd ~/dev-tools && ./install.sh`.

The workflow runs three jobs: a **gate** (the tag equals the `pyproject.toml` version, which carries no dev marker; the tagged commit is reachable from `origin/main`; the version is greater than the previous tag) gates the **pypi** publish (wheel + sdist via trusted publishing — no Docker image, since this is a CLI client, not a server). After the publish, a **changelog** job generates the new `CHANGELOG.md` section (LLM-written "Highlights" paragraph + a categorized list written by dev-tools' `generate-changelog`), commits it back to `main`, and creates the GitHub Release with the same content as its body.

### Commit message convention

The changelog job groups each merged pull request by the [Conventional Commits](https://www.conventionalcommits.org/) type of its title (the full list is in the ParkviewLab handbook's `commits-and-changelogs.md`) and lists any commit that reached the release without one under Direct commits:

| Title | Group in the notes | Notes |
|---|---|---|
| any type with `!` after it (`feat!:`), or a breaking-change footer | Breaking changes | listed there once, whatever its type |
| `feat:` | Features | user-visible |
| `fix:` | Bug fixes | user-visible |
| `perf:` | Performance | user-visible |
| `refactor:` | Refactor | |
| `docs:` | Docs | |
| `test:` | Tests | |
| `revert:` | Reverts | GitHub's Revert button titles a PR `Revert "…"`, which has no type |
| `build:` / `chore:` / `ci:` / `style:` | Maintenance | |
| any other title | Other changes | the whole title |
| a commit with no pull request | Direct commits | its subject and short hash |

A title without a recognised type is not dropped: it is listed whole under Other changes. So prefix your PR titles, and correct a title before the merge, since retitling afterwards does not change the commit. The groups appear in the order above, and an empty group is left out.

## License

cogrind-workshop is **dual-licensed**. By default it is free software under the **GNU Affero General Public License v3.0 or later** (`AGPL-3.0-or-later`); see [`LICENSE`](LICENSE) for the full text. A separate **commercial license** is available from the copyright holder for use that cannot comply with the AGPL (e.g. embedding in a closed-source product). See [`LICENSING.md`](LICENSING.md) for details.

Copyright © 2026 Gary Frattarola.
