naudachu 9480e48312 feat: add the kettle CLI, replacing the plugin's Python scripts
The plugin resolved its issue store from `__file__`, which put it inside a
versioned plugin cache: issues written from one project were invisible from the
next, and `origin: local` files — the only copy of that work by definition —
were stranded a version bump at a time. The walk that answers "which directory
is the project" was written three times over, and in a linked worktree the three
disagreed. Both are runtime failures rather than logic ones, so the fix is a
compiled binary: one walk, imported rather than re-derived, and a layering rule
the build graph enforces instead of a grep.

Seven packages, knowledge flowing one way. `project` answers which directory is
the project and depends on nothing. `issue` is the domain — format, taxonomy,
validation, checkboxes, dependency graph, the store, eviction — offline, with no
tracker in it. `wire` holds the protocol shapes. `gitea` is the transport,
`mapping` the bridge, `config` the credentials, `cmd` the command tree. Four
tests hold the boundaries, each failing on a real mistake rather than a naming
convention.

The marker moves to `.kettle/` and the login pin moves out of the harness's
settings file into `.kettle/config.yaml`, which pins a login by NAME; the tokens
live in one file per machine, mode 0600, outside every working tree. That
retires the PreToolUse guard hook entirely — the binary holds its own
credentials, so a command running under a login nobody chose is not expressible
rather than caught.

`kettle init` migrates an older `tmp/issues` or `.tea/issues` store in, as a
move: a store left behind at an old path is one somebody edits by accident
months later.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-11 19:05:39 +05:00

claude-skills — a Claude Code plugin marketplace

One repository, one marketplace, several plugins. Register it once and install whichever pieces you want; each plugin is independent and carries its own manifest, docs, and tests.

Installation

/plugin marketplace add https://git.noodles.cam/claude-skills/marketplace.git

Working from a local clone? Point at the directory instead:

/plugin marketplace add /path/to/marketplace

Then install what you need:

/plugin install tea@claude-skills
/plugin install tdl@claude-skills

Use /plugin to enable, disable, or update them later.

What ships here

Plugin Commands What it does
tea /tea:auth /tea:issue /tea:sync /tea:use Gitea issues as local markdown, cleanly layered. Issues are units of work offline first and tracker rows second; a PreToolUse hook blocks any tea command that would run under a login Claude picked instead of the operator
tdl /tdl:audit Three Dots Labs Go conventions as an enforceable rule set — audits a Go project against 63 CQRS/DDD/Clean-Architecture rules by severity, or scaffolds services, handlers, entities, repositories and Watermill adapters from templates that already follow them

Layout

.claude-plugin/
  marketplace.json           the catalog — one entry per plugin, source is a
                             path into plugins/
plugins/
  tea/
    .claude-plugin/plugin.json
    agents/ hooks/ skills/ tests/
    README.md  AGENTS.md
  tdl/
    .claude-plugin/plugin.json
    skills/

A plugin's root is its directory under plugins/, so ${CLAUDE_PLUGIN_ROOT} resolves inside it and every path a plugin uses stays relative to itself. Adding a plugin means adding a directory here plus one entry in marketplace.json — nothing else in the repo needs to know about it.

Development

tea has a test suite; run it from its own directory so the tests resolve their root correctly:

cd plugins/tea && python3 -m unittest discover -s tests
S
Description
Development lifecycle with the usage tea (gitea cli tool) as a issue storage.
Readme 3.8 MiB
2026-08-12 11:17:59 +00:00
Languages
Go 98.6%
Makefile 1.4%