microphone-cli 0.8.0__tar.gz → 0.8.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (88) hide show
  1. {microphone_cli-0.8.0 → microphone_cli-0.8.2}/CHANGELOG.md +18 -0
  2. microphone_cli-0.8.2/CLAUDE.md +169 -0
  3. {microphone_cli-0.8.0 → microphone_cli-0.8.2}/PKG-INFO +41 -19
  4. microphone_cli-0.8.2/README.md +81 -0
  5. {microphone_cli-0.8.0 → microphone_cli-0.8.2}/pyproject.toml +1 -1
  6. {microphone_cli-0.8.0 → microphone_cli-0.8.2}/uv.lock +31 -31
  7. microphone_cli-0.8.0/CLAUDE.md +0 -28
  8. microphone_cli-0.8.0/README.md +0 -59
  9. {microphone_cli-0.8.0 → microphone_cli-0.8.2}/.claude/skills/agent-config/SKILL.md +0 -0
  10. {microphone_cli-0.8.0 → microphone_cli-0.8.2}/.claude/skills/agent-config/data/backend-fingerprints.yaml +0 -0
  11. {microphone_cli-0.8.0 → microphone_cli-0.8.2}/.claude/skills/agent-config/scripts/show.sh +0 -0
  12. {microphone_cli-0.8.0 → microphone_cli-0.8.2}/.claude/skills/ask-colleague/SKILL.md +0 -0
  13. {microphone_cli-0.8.0 → microphone_cli-0.8.2}/.claude/skills/ask-colleague/prompts/explore.md +0 -0
  14. {microphone_cli-0.8.0 → microphone_cli-0.8.2}/.claude/skills/ask-colleague/prompts/review.md +0 -0
  15. {microphone_cli-0.8.0 → microphone_cli-0.8.2}/.claude/skills/ask-colleague/prompts/write.md +0 -0
  16. {microphone_cli-0.8.0 → microphone_cli-0.8.2}/.claude/skills/ask-colleague/scripts/ask-colleague.sh +0 -0
  17. {microphone_cli-0.8.0 → microphone_cli-0.8.2}/.claude/skills/assign-to-workforce/SKILL.md +0 -0
  18. {microphone_cli-0.8.0 → microphone_cli-0.8.2}/.claude/skills/assign-to-workforce/scripts/assign-to-workforce.sh +0 -0
  19. {microphone_cli-0.8.0 → microphone_cli-0.8.2}/.claude/skills/challenge/SKILL.md +0 -0
  20. {microphone_cli-0.8.0 → microphone_cli-0.8.2}/.claude/skills/challenge/scripts/challenge.sh +0 -0
  21. {microphone_cli-0.8.0 → microphone_cli-0.8.2}/.claude/skills/cicd/SKILL.md +0 -0
  22. {microphone_cli-0.8.0 → microphone_cli-0.8.2}/.claude/skills/cicd/scripts/_resolve-nick.sh +0 -0
  23. {microphone_cli-0.8.0 → microphone_cli-0.8.2}/.claude/skills/cicd/scripts/portability-lint.sh +0 -0
  24. {microphone_cli-0.8.0 → microphone_cli-0.8.2}/.claude/skills/cicd/scripts/pr-reply.sh +0 -0
  25. {microphone_cli-0.8.0 → microphone_cli-0.8.2}/.claude/skills/cicd/scripts/pr-status.sh +0 -0
  26. {microphone_cli-0.8.0 → microphone_cli-0.8.2}/.claude/skills/cicd/scripts/workflow.sh +0 -0
  27. {microphone_cli-0.8.0 → microphone_cli-0.8.2}/.claude/skills/communicate/SKILL.md +0 -0
  28. {microphone_cli-0.8.0 → microphone_cli-0.8.2}/.claude/skills/communicate/scripts/fetch-issues.sh +0 -0
  29. {microphone_cli-0.8.0 → microphone_cli-0.8.2}/.claude/skills/communicate/scripts/mesh-message.sh +0 -0
  30. {microphone_cli-0.8.0 → microphone_cli-0.8.2}/.claude/skills/communicate/scripts/post-comment.sh +0 -0
  31. {microphone_cli-0.8.0 → microphone_cli-0.8.2}/.claude/skills/communicate/scripts/post-issue.sh +0 -0
  32. {microphone_cli-0.8.0 → microphone_cli-0.8.2}/.claude/skills/communicate/scripts/templates/skill-new-brief.md +0 -0
  33. {microphone_cli-0.8.0 → microphone_cli-0.8.2}/.claude/skills/communicate/scripts/templates/skill-update-brief.md +0 -0
  34. {microphone_cli-0.8.0 → microphone_cli-0.8.2}/.claude/skills/deviate/SKILL.md +0 -0
  35. {microphone_cli-0.8.0 → microphone_cli-0.8.2}/.claude/skills/deviate/scripts/deviate.sh +0 -0
  36. {microphone_cli-0.8.0 → microphone_cli-0.8.2}/.claude/skills/doc-test-alignment/SKILL.md +0 -0
  37. {microphone_cli-0.8.0 → microphone_cli-0.8.2}/.claude/skills/doc-test-alignment/scripts/check.sh +0 -0
  38. {microphone_cli-0.8.0 → microphone_cli-0.8.2}/.claude/skills/pypi-maintainer/SKILL.md +0 -0
  39. {microphone_cli-0.8.0 → microphone_cli-0.8.2}/.claude/skills/pypi-maintainer/scripts/switch-source.sh +0 -0
  40. {microphone_cli-0.8.0 → microphone_cli-0.8.2}/.claude/skills/recall/SKILL.md +0 -0
  41. {microphone_cli-0.8.0 → microphone_cli-0.8.2}/.claude/skills/recall/scripts/recall.sh +0 -0
  42. {microphone_cli-0.8.0 → microphone_cli-0.8.2}/.claude/skills/remember/SKILL.md +0 -0
  43. {microphone_cli-0.8.0 → microphone_cli-0.8.2}/.claude/skills/remember/scripts/remember.sh +0 -0
  44. {microphone_cli-0.8.0 → microphone_cli-0.8.2}/.claude/skills/run-tests/SKILL.md +0 -0
  45. {microphone_cli-0.8.0 → microphone_cli-0.8.2}/.claude/skills/run-tests/scripts/test.sh +0 -0
  46. {microphone_cli-0.8.0 → microphone_cli-0.8.2}/.claude/skills/scope/SKILL.md +0 -0
  47. {microphone_cli-0.8.0 → microphone_cli-0.8.2}/.claude/skills/scope/scripts/scope.sh +0 -0
  48. {microphone_cli-0.8.0 → microphone_cli-0.8.2}/.claude/skills/sonarclaude/SKILL.md +0 -0
  49. {microphone_cli-0.8.0 → microphone_cli-0.8.2}/.claude/skills/sonarclaude/scripts/sonar.sh +0 -0
  50. {microphone_cli-0.8.0 → microphone_cli-0.8.2}/.claude/skills/spec-to-plan/SKILL.md +0 -0
  51. {microphone_cli-0.8.0 → microphone_cli-0.8.2}/.claude/skills/spec-to-plan/scripts/spec-to-plan.sh +0 -0
  52. {microphone_cli-0.8.0 → microphone_cli-0.8.2}/.claude/skills/summarize-delivery/SKILL.md +0 -0
  53. {microphone_cli-0.8.0 → microphone_cli-0.8.2}/.claude/skills/summarize-delivery/scripts/summarize-delivery.sh +0 -0
  54. {microphone_cli-0.8.0 → microphone_cli-0.8.2}/.claude/skills/think/SKILL.md +0 -0
  55. {microphone_cli-0.8.0 → microphone_cli-0.8.2}/.claude/skills/think/scripts/think.sh +0 -0
  56. {microphone_cli-0.8.0 → microphone_cli-0.8.2}/.claude/skills/validate-delivery/SKILL.md +0 -0
  57. {microphone_cli-0.8.0 → microphone_cli-0.8.2}/.claude/skills/validate-delivery/scripts/validate-delivery.sh +0 -0
  58. {microphone_cli-0.8.0 → microphone_cli-0.8.2}/.claude/skills/version-bump/SKILL.md +0 -0
  59. {microphone_cli-0.8.0 → microphone_cli-0.8.2}/.claude/skills/version-bump/scripts/bump.py +0 -0
  60. {microphone_cli-0.8.0 → microphone_cli-0.8.2}/.claude/skills.local.yaml.example +0 -0
  61. {microphone_cli-0.8.0 → microphone_cli-0.8.2}/.flake8 +0 -0
  62. {microphone_cli-0.8.0 → microphone_cli-0.8.2}/.github/workflows/publish.yml +0 -0
  63. {microphone_cli-0.8.0 → microphone_cli-0.8.2}/.github/workflows/tests.yml +0 -0
  64. {microphone_cli-0.8.0 → microphone_cli-0.8.2}/.gitignore +0 -0
  65. {microphone_cli-0.8.0 → microphone_cli-0.8.2}/.markdownlint-cli2.yaml +0 -0
  66. {microphone_cli-0.8.0 → microphone_cli-0.8.2}/AGENTS.colleague.md +0 -0
  67. {microphone_cli-0.8.0 → microphone_cli-0.8.2}/LICENSE +0 -0
  68. {microphone_cli-0.8.0 → microphone_cli-0.8.2}/culture.yaml +0 -0
  69. {microphone_cli-0.8.0 → microphone_cli-0.8.2}/docs/skill-sources.md +0 -0
  70. {microphone_cli-0.8.0 → microphone_cli-0.8.2}/docs/steward/steward-suggestions.md +0 -0
  71. {microphone_cli-0.8.0 → microphone_cli-0.8.2}/microphone_cli/__init__.py +0 -0
  72. {microphone_cli-0.8.0 → microphone_cli-0.8.2}/microphone_cli/__main__.py +0 -0
  73. {microphone_cli-0.8.0 → microphone_cli-0.8.2}/microphone_cli/cli/__init__.py +0 -0
  74. {microphone_cli-0.8.0 → microphone_cli-0.8.2}/microphone_cli/cli/_commands/__init__.py +0 -0
  75. {microphone_cli-0.8.0 → microphone_cli-0.8.2}/microphone_cli/cli/_commands/cli.py +0 -0
  76. {microphone_cli-0.8.0 → microphone_cli-0.8.2}/microphone_cli/cli/_commands/doctor.py +0 -0
  77. {microphone_cli-0.8.0 → microphone_cli-0.8.2}/microphone_cli/cli/_commands/explain.py +0 -0
  78. {microphone_cli-0.8.0 → microphone_cli-0.8.2}/microphone_cli/cli/_commands/learn.py +0 -0
  79. {microphone_cli-0.8.0 → microphone_cli-0.8.2}/microphone_cli/cli/_commands/overview.py +0 -0
  80. {microphone_cli-0.8.0 → microphone_cli-0.8.2}/microphone_cli/cli/_commands/whoami.py +0 -0
  81. {microphone_cli-0.8.0 → microphone_cli-0.8.2}/microphone_cli/cli/_errors.py +0 -0
  82. {microphone_cli-0.8.0 → microphone_cli-0.8.2}/microphone_cli/cli/_output.py +0 -0
  83. {microphone_cli-0.8.0 → microphone_cli-0.8.2}/microphone_cli/explain/__init__.py +0 -0
  84. {microphone_cli-0.8.0 → microphone_cli-0.8.2}/microphone_cli/explain/catalog.py +0 -0
  85. {microphone_cli-0.8.0 → microphone_cli-0.8.2}/sonar-project.properties +0 -0
  86. {microphone_cli-0.8.0 → microphone_cli-0.8.2}/tests/__init__.py +0 -0
  87. {microphone_cli-0.8.0 → microphone_cli-0.8.2}/tests/test_cli.py +0 -0
  88. {microphone_cli-0.8.0 → microphone_cli-0.8.2}/tests/test_cli_introspection.py +0 -0
@@ -5,6 +5,24 @@ All notable changes to this project will be documented in this file.
5
5
  Format follows [Keep a Changelog](https://keepachangelog.com/). This project
6
6
  adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [0.8.2] - 2026-09-06
9
+
10
+ ### Fixed
11
+
12
+ - **Documented `markdownlint-cli2` as though `uv sync` installed it** (Qodo review, PR #2) — it is an npm tool absent from the dev dependency group, so a fresh checkout following `CLAUDE.md` hit command-not-found. Both `CLAUDE.md` and `README.md` now show the `npm install -g markdownlint-cli2@0.21.0` step, pinned to the version CI installs.
13
+ - **Overstated what CI's `version-check` job enforces** (Qodo review, PR #2) — the workflow compares the PR version against `main` as strings and fails only on equality, so a downgrade passes. The docs now describe it as a forgotten-bump tripwire rather than a guarantee the version moved forward.
14
+
15
+ ## [0.8.1] - 2026-09-06
16
+
17
+ ### Changed
18
+
19
+ - **`CLAUDE.md` re-initialized from the seed placeholder into a full runtime prompt** — records the repo's actual state (renamed template scaffold, no microphone domain code yet, and the specific files still carrying template prose), the build/test/lint/rubric-gate command set, the CLI architecture (the `register(sub)` dispatch pattern, the `CliError` / stream-split / `--json` contracts the rubric enforces, and the `parser_class` propagation nested nouns need), the checklist for adding a verb or noun, and the CI/release and vendored-skill conventions.
20
+ - **`README.md` corrected and refreshed** — the quickstart told readers to run `microphone-cli`, which does not exist: `pyproject.toml` declares the console script as `microphone`, so `uv run microphone-cli whoami` failed with `Failed to spawn`. Commands now use `microphone`, with a note that argparse still prints `microphone-cli` as the program name. Also adds a scaffold-status banner, drops the stale skill count (said 11; there are 19 vendored directories), fixes the backend description to name this agent rather than the template, and replaces the template-only rename section with a Development section.
21
+
22
+ ### Fixed
23
+
24
+ - **`CLAUDE.md` claimed `culture.yaml` declares `backend: claude`** — it declares `colleague`, which is why `AGENTS.colleague.md` is the resident prompt file `doctor` checks for. The new file records the correct backend-to-prompt-file mapping.
25
+
8
26
  ## [0.8.0] - 2026-09-05
9
27
 
10
28
  ### Added
@@ -0,0 +1,169 @@
1
+ # CLAUDE.md
2
+
3
+ This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
4
+
5
+ ## What this repo is
6
+
7
+ **microphone-cli** — an agent-first CLI for USB microphones and microphone
8
+ arrays: enumerate devices, select and inspect channels, control gain and sample
9
+ format, and read direction-of-arrival from array firmware.
10
+
11
+ **Current state: scaffold only.** The repo was cloned from the AgentCulture
12
+ agent template (`5f9b1bd scaffold microphone-cli from culture-agent-template`).
13
+ The package is renamed and the CI/identity/skills baseline is live, but **no
14
+ microphone domain code exists yet** — the only verbs are the template's
15
+ agent-first introspection surface (`whoami`, `learn`, `explain`, `overview`,
16
+ `doctor`, `cli overview`). Several strings still describe the template
17
+ ("a clonable template for AgentCulture mesh agents") rather than the microphone
18
+ domain: `microphone_cli/cli/_commands/learn.py`, `overview.py` (`_ARTIFACTS`),
19
+ `microphone_cli/explain/catalog.py`, and `README.md`. Rewrite those as the
20
+ domain lands.
21
+
22
+ ## Commands
23
+
24
+ ```bash
25
+ uv sync # install (dev group included)
26
+
27
+ uv run pytest -n auto # full suite, parallel
28
+ uv run pytest tests/test_cli.py # one file
29
+ uv run pytest -k whoami # one test / pattern
30
+ uv run pytest --cov=microphone_cli --cov-report=term # coverage (fail_under=60)
31
+
32
+ uv run black --check microphone_cli tests # CI lint set — all four must pass
33
+ uv run isort --check-only microphone_cli tests
34
+ uv run flake8 microphone_cli tests
35
+ uv run bandit -c pyproject.toml -r microphone_cli
36
+
37
+ uv run teken cli doctor . --strict # the agent-first rubric gate CI runs
38
+
39
+ uv run microphone whoami # the installed console script
40
+ uv run microphone doctor --json
41
+ python -m microphone_cli learn
42
+ ```
43
+
44
+ **Markdown lint is not a `uv` tool** — `uv sync` does not install it, so it is
45
+ not available on a fresh checkout. CI installs it from npm; do the same locally,
46
+ pinning the version CI uses so results match:
47
+
48
+ ```bash
49
+ npm install -g markdownlint-cli2@0.21.0
50
+ markdownlint-cli2 "**/*.md" "#node_modules" "#.local" "#.claude/skills"
51
+ ```
52
+
53
+ Config lives in `.markdownlint-cli2.yaml` (MD013 and MD060 off, MD024
54
+ siblings-only for the changelog; `.claude/skills/**` ignored).
55
+
56
+ ### Console-script name
57
+
58
+ `pyproject.toml` declares `microphone = "microphone_cli.cli:main"` — the binary
59
+ is **`microphone`**, not `microphone-cli`. The argparse `prog` is
60
+ `"microphone-cli"`, so `--help` and every doc string say `microphone-cli …`
61
+ while the actual command is `microphone …`. Either rename the script or the
62
+ `prog` before this ships; until then, prefer `microphone` in anything runnable.
63
+
64
+ ## Architecture
65
+
66
+ Zero runtime dependencies (`dependencies = []` in `pyproject.toml`) — that is a
67
+ deliberate constraint of the agent-first template, and `culture.yaml` is parsed
68
+ by hand in `whoami.py` rather than pulling in PyYAML. Keep new runtime deps out
69
+ unless the microphone backend genuinely requires one.
70
+
71
+ ### CLI dispatch
72
+
73
+ `microphone_cli/cli/__init__.py` is the only place that knows the verb set.
74
+ `_build_parser()` imports each command module and calls its `register(sub)`;
75
+ `main()` parses and hands off to `_dispatch()`, which invokes `args.func(args)`.
76
+
77
+ Three contracts hold across the whole surface, and the rubric gate checks them:
78
+
79
+ - **Errors** — `microphone_cli/cli/_errors.py`. Every failure raises `CliError`
80
+ (`{code, message, remediation}`). `_dispatch` wraps any stray exception into
81
+ one, so **no traceback ever reaches stderr**. Exit codes: `0` success,
82
+ `1` user error, `2` environment error, `3+` reserved.
83
+ - **Streams** — `microphone_cli/cli/_output.py`. Results to stdout
84
+ (`emit_result`), errors and diagnostics to stderr (`emit_error`,
85
+ `emit_diagnostic`); they never mix. Text errors render `error:` + `hint:`.
86
+ - **`--json` everywhere** — every parser adds `--json`; handlers read it via
87
+ `getattr(args, "json", False)`.
88
+
89
+ Argparse's own errors also honour these contracts: `_CliArgumentParser`
90
+ overrides `.error()` to emit a `CliError`, and subparsers are built with
91
+ `parser_class=_CliArgumentParser` so nested nouns inherit it. Because
92
+ parse-time errors happen before `args.json` exists, `main()` pre-scans raw argv
93
+ for `--json` into the class-level `_json_hint`. **When you add a nested
94
+ subparser group, pass `parser_class=type(p)` through** (see
95
+ `_commands/cli.py`) — forgetting it silently drops that group back to
96
+ argparse's default `exit(2)` behaviour.
97
+
98
+ ### Identity
99
+
100
+ `_commands/whoami.py` walks up from `__file__` (not the CWD) to find the repo's
101
+ own `culture.yaml`, so identity is the agent's, not the caller's. In a wheel
102
+ install no `culture.yaml` ships and the literal fallbacks apply. `doctor` and
103
+ `overview` both build on `whoami`'s `report()` / `read_agent_fields()`.
104
+
105
+ `doctor` mirrors the two `steward doctor` invariants — **prompt-file-present**
106
+ and **backend-consistency** — via the `_PROMPT_FILE` map (`claude` →
107
+ `CLAUDE.md`, `colleague` → `AGENTS.colleague.md`, `acp` → `AGENTS.md`,
108
+ `gemini` → `GEMINI.md`), plus a skills-present check. It returns
109
+ `{healthy, checks: [{id, passed, severity, message, remediation}]}` — the
110
+ rubric depends on that exact shape.
111
+
112
+ **This agent runs `backend: colleague`** (`culture.yaml`), so its resident
113
+ prompt file is `AGENTS.colleague.md`; this `CLAUDE.md` is the Claude Code
114
+ guidance file. Changing `backend` means adding the matching prompt file or
115
+ `doctor` (and CI's rubric gate) goes red.
116
+
117
+ ### Adding a verb or noun
118
+
119
+ 1. New module in `microphone_cli/cli/_commands/` exposing `register(sub)`, with
120
+ `--json` and a `func` default.
121
+ 2. Register it in `_build_parser()` (there is a marked spot).
122
+ 3. **Add a catalog entry** in `microphone_cli/explain/catalog.py` keyed by the
123
+ command-path tuple — `tests/test_cli.py::test_every_catalog_path_resolves`
124
+ walks every key, and the rubric requires an `explain` entry per path.
125
+ 4. Update the command map in `_commands/learn.py` (both `_TEXT` and
126
+ `_as_json_payload()`) and the `_VERBS` list in `_commands/overview.py`.
127
+ 5. A noun group that gets action-verbs **must** also expose `<noun> overview` —
128
+ the rubric's `overview_cli_noun_exists` check. `_commands/cli.py` is the
129
+ worked example (its bare form prints its own overview).
130
+ 6. Descriptive verbs must not hard-fail on a bad target path — `overview`
131
+ accepts and ignores a positional `target` for exactly this reason.
132
+
133
+ ## CI and release
134
+
135
+ Three jobs in `.github/workflows/tests.yml`: `test` (pytest + coverage →
136
+ SonarCloud, scan skipped when `SONAR_TOKEN` is empty, so fork PRs stay green),
137
+ `lint` (black, isort, flake8, bandit, markdownlint, `teken cli doctor --strict`),
138
+ and `version-check`.
139
+
140
+ **Every PR bumps the version — including docs-, config-, and CI-only PRs.**
141
+ Use the `version-bump` skill (or edit `pyproject.toml` + `CHANGELOG.md` by hand,
142
+ Keep-a-Changelog format). `__version__` is read from package metadata, so there
143
+ is no second version literal to update.
144
+
145
+ `version-check` only partly enforces that rule: it compares the PR's
146
+ `pyproject.toml` version against `origin/main` as **strings** and fails on
147
+ equality alone. Any different value passes, a downgrade included — `0.8.1` →
148
+ `0.8.0` is green today. Treat the check as a "did you forget entirely?" tripwire,
149
+ not a guarantee the version moved forward; the publish job is what actually
150
+ breaks later. (The comparison is string-equality in every AgentCulture sibling,
151
+ so tightening it belongs upstream, not in this repo alone.)
152
+
153
+ `publish.yml` publishes to TestPyPI on same-repo PRs (`<version>.devN`) and to
154
+ PyPI on push to main, both via Trusted Publishing.
155
+
156
+ Line length is **100** (black, isort profile=black, flake8 with `E203,W503`
157
+ ignored). SonarCloud project key: `agentculture_microphone-cli`; the quality
158
+ gate blocks CI when the token is configured.
159
+
160
+ ## Vendored skills
161
+
162
+ `.claude/skills/` is vendored **cite-don't-import** from `guildmaster` (several
163
+ originate in `devague`, one in `colleague`). Do not hand-edit them — they are
164
+ excluded from markdownlint and Sonar for that reason. Provenance and the
165
+ re-sync procedure live in `docs/skill-sources.md`; per-machine paths go in a
166
+ git-ignored `.claude/skills.local.yaml` (copy the `.example`).
167
+
168
+ Use the `cicd` skill for PR creation and review-comment handling. Online posts
169
+ made outside those scripts sign as `- microphone-cli (Claude)`.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: microphone-cli
3
- Version: 0.8.0
3
+ Version: 0.8.2
4
4
  Summary: Agent-first CLI for USB microphones and microphone arrays: enumerate devices, select and inspect channels, control gain and sample format, and read direction-of-arrival from array firmware.
5
5
  Project-URL: Homepage, https://github.com/agentculture/microphone-cli
6
6
  Project-URL: Issues, https://github.com/agentculture/microphone-cli/issues
@@ -17,17 +17,23 @@ Description-Content-Type: text/markdown
17
17
 
18
18
  # microphone-cli
19
19
 
20
- Agent-first CLI for USB microphones and microphone arrays: enumerate devices, select and inspect channels, control gain and sample format, and read direction-of-arrival from array firmware.
20
+ Agent-first CLI for USB microphones and microphone arrays: enumerate devices,
21
+ select and inspect channels, control gain and sample format, and read
22
+ direction-of-arrival from array firmware.
23
+
24
+ > **Status: scaffold.** The identity, CI, and agent-first CLI baseline are in
25
+ > place; the microphone domain verbs are not implemented yet. What ships today
26
+ > is the introspection surface below.
21
27
 
22
28
  ## What you get
23
29
 
24
30
  - **An agent-first CLI** cited from [teken](https://github.com/agentculture/teken)
25
31
  (`afi-cli`) — the runtime package has no third-party dependencies.
26
32
  - **A mesh identity** — `culture.yaml` (`suffix` + `backend`) and the matching
27
- resident prompt file (`AGENTS.colleague.md`, since this template runs
33
+ resident prompt file (`AGENTS.colleague.md`, since this agent runs
28
34
  `backend: colleague`).
29
- - **The canonical guildmaster skill kit** (11 skills) under `.claude/skills/`,
30
- vendored cite-don't-import. See [`docs/skill-sources.md`](docs/skill-sources.md).
35
+ - **The canonical guildmaster skill kit** under `.claude/skills/`, vendored
36
+ cite-don't-import. See [`docs/skill-sources.md`](docs/skill-sources.md).
31
37
  - **A build + deploy baseline** — pytest, lint, the agent-first rubric gate, and
32
38
  PyPI Trusted Publishing wired into GitHub Actions.
33
39
 
@@ -36,11 +42,15 @@ Agent-first CLI for USB microphones and microphone arrays: enumerate devices, se
36
42
  ```bash
37
43
  uv sync
38
44
  uv run pytest -n auto # run the test suite
39
- uv run microphone-cli whoami # identity from culture.yaml
40
- uv run microphone-cli learn # self-teaching prompt (add --json)
45
+ uv run microphone whoami # identity from culture.yaml
46
+ uv run microphone learn # self-teaching prompt (add --json)
41
47
  uv run teken cli doctor . --strict # the agent-first rubric gate CI runs
42
48
  ```
43
49
 
50
+ The installed console script is **`microphone`**. Argparse still prints
51
+ `microphone-cli` as the program name in `--help` output; the runnable command is
52
+ `microphone`.
53
+
44
54
  ## CLI
45
55
 
46
56
  | Verb | What it does |
@@ -56,20 +66,32 @@ Every command supports `--json`. Results go to stdout, errors/diagnostics to
56
66
  stderr (never mixed). Exit codes: `0` success, `1` user error, `2` environment
57
67
  error, `3+` reserved.
58
68
 
59
- ## Make it your own
69
+ ## Development
70
+
71
+ ```bash
72
+ uv run pytest tests/test_cli.py # a single file
73
+ uv run pytest -k whoami # a single test
74
+ uv run black --check microphone_cli tests
75
+ uv run isort --check-only microphone_cli tests
76
+ uv run flake8 microphone_cli tests
77
+ uv run bandit -c pyproject.toml -r microphone_cli
78
+ ```
60
79
 
61
- 1. Rename the package `microphone_cli/` and the `microphone-cli`
62
- CLI/dist name throughout `pyproject.toml`, the package, `tests/`,
63
- `sonar-project.properties`, and this `README.md`. The name is hard-coded in
64
- ~100 places, so list every occurrence first — see the `git grep` discovery
65
- command in [`CLAUDE.md`](CLAUDE.md), the authoritative rename procedure.
66
- 2. Edit `culture.yaml` with your `suffix` and `backend`.
67
- 3. Rewrite `CLAUDE.md` for your agent and run `/init`.
68
- 4. Re-vendor only the skills you need from guildmaster (see
69
- [`docs/skill-sources.md`](docs/skill-sources.md)).
80
+ Every PR bumps the version in `pyproject.toml` and adds a `CHANGELOG.md` entry,
81
+ even for docs- and CI-only changes. CI's `version-check` job catches a forgotten
82
+ bump by failing when the version still matches `main`; it does not verify the
83
+ version moved *forward*.
84
+
85
+ Markdown lint is an npm tool, not a `uv` one — install it separately, pinned to
86
+ the version CI uses:
87
+
88
+ ```bash
89
+ npm install -g markdownlint-cli2@0.21.0
90
+ markdownlint-cli2 "**/*.md" "#node_modules" "#.local" "#.claude/skills"
91
+ ```
70
92
 
71
- See [`CLAUDE.md`](CLAUDE.md) for the full conventions (version-bump-every-PR,
72
- the `cicd` PR lane, deploy setup).
93
+ See [`CLAUDE.md`](CLAUDE.md) for the architecture, the CLI contracts (errors,
94
+ stream split, `--json`), and how to add a verb or noun group.
73
95
 
74
96
  ## License
75
97
 
@@ -0,0 +1,81 @@
1
+ # microphone-cli
2
+
3
+ Agent-first CLI for USB microphones and microphone arrays: enumerate devices,
4
+ select and inspect channels, control gain and sample format, and read
5
+ direction-of-arrival from array firmware.
6
+
7
+ > **Status: scaffold.** The identity, CI, and agent-first CLI baseline are in
8
+ > place; the microphone domain verbs are not implemented yet. What ships today
9
+ > is the introspection surface below.
10
+
11
+ ## What you get
12
+
13
+ - **An agent-first CLI** cited from [teken](https://github.com/agentculture/teken)
14
+ (`afi-cli`) — the runtime package has no third-party dependencies.
15
+ - **A mesh identity** — `culture.yaml` (`suffix` + `backend`) and the matching
16
+ resident prompt file (`AGENTS.colleague.md`, since this agent runs
17
+ `backend: colleague`).
18
+ - **The canonical guildmaster skill kit** under `.claude/skills/`, vendored
19
+ cite-don't-import. See [`docs/skill-sources.md`](docs/skill-sources.md).
20
+ - **A build + deploy baseline** — pytest, lint, the agent-first rubric gate, and
21
+ PyPI Trusted Publishing wired into GitHub Actions.
22
+
23
+ ## Quickstart
24
+
25
+ ```bash
26
+ uv sync
27
+ uv run pytest -n auto # run the test suite
28
+ uv run microphone whoami # identity from culture.yaml
29
+ uv run microphone learn # self-teaching prompt (add --json)
30
+ uv run teken cli doctor . --strict # the agent-first rubric gate CI runs
31
+ ```
32
+
33
+ The installed console script is **`microphone`**. Argparse still prints
34
+ `microphone-cli` as the program name in `--help` output; the runnable command is
35
+ `microphone`.
36
+
37
+ ## CLI
38
+
39
+ | Verb | What it does |
40
+ |------|--------------|
41
+ | `whoami` | Report this agent's nick, version, backend, and model from `culture.yaml`. |
42
+ | `learn` | Print a structured self-teaching prompt. |
43
+ | `explain <path>` | Markdown docs for any noun/verb path. |
44
+ | `overview` | Read-only descriptive snapshot of the agent. |
45
+ | `doctor` | Check the agent-identity invariants (prompt-file-present, backend-consistency). |
46
+ | `cli overview` | Describe the CLI surface itself. |
47
+
48
+ Every command supports `--json`. Results go to stdout, errors/diagnostics to
49
+ stderr (never mixed). Exit codes: `0` success, `1` user error, `2` environment
50
+ error, `3+` reserved.
51
+
52
+ ## Development
53
+
54
+ ```bash
55
+ uv run pytest tests/test_cli.py # a single file
56
+ uv run pytest -k whoami # a single test
57
+ uv run black --check microphone_cli tests
58
+ uv run isort --check-only microphone_cli tests
59
+ uv run flake8 microphone_cli tests
60
+ uv run bandit -c pyproject.toml -r microphone_cli
61
+ ```
62
+
63
+ Every PR bumps the version in `pyproject.toml` and adds a `CHANGELOG.md` entry,
64
+ even for docs- and CI-only changes. CI's `version-check` job catches a forgotten
65
+ bump by failing when the version still matches `main`; it does not verify the
66
+ version moved *forward*.
67
+
68
+ Markdown lint is an npm tool, not a `uv` one — install it separately, pinned to
69
+ the version CI uses:
70
+
71
+ ```bash
72
+ npm install -g markdownlint-cli2@0.21.0
73
+ markdownlint-cli2 "**/*.md" "#node_modules" "#.local" "#.claude/skills"
74
+ ```
75
+
76
+ See [`CLAUDE.md`](CLAUDE.md) for the architecture, the CLI contracts (errors,
77
+ stream split, `--json`), and how to add a verb or noun group.
78
+
79
+ ## License
80
+
81
+ Apache 2.0 — see [`LICENSE`](LICENSE).
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "microphone-cli"
3
- version = "0.8.0"
3
+ version = "0.8.2"
4
4
  description = "Agent-first CLI for USB microphones and microphone arrays: enumerate devices, select and inspect channels, control gain and sample format, and read direction-of-arrival from array firmware."
5
5
  readme = "README.md"
6
6
  license = "Apache-2.0"
@@ -154,37 +154,6 @@ wheels = [
154
154
  { url = "https://files.pythonhosted.org/packages/61/e8/cb8e80d6f9f55b99588625062822bf946cf03ed06315df4bd8397f5632a1/coverage-7.14.0-py3-none-any.whl", hash = "sha256:8de5b61163aee3d05c8a2beab6f47913df7981dad1baf82c414d99158c286ab1", size = 211764, upload-time = "2026-05-10T18:02:29.538Z" },
155
155
  ]
156
156
 
157
- [[package]]
158
- name = "microphone-cli"
159
- version = "0.8.0"
160
- source = { editable = "." }
161
-
162
- [package.dev-dependencies]
163
- dev = [
164
- { name = "bandit" },
165
- { name = "black" },
166
- { name = "flake8" },
167
- { name = "isort" },
168
- { name = "pytest" },
169
- { name = "pytest-cov" },
170
- { name = "pytest-xdist" },
171
- { name = "teken" },
172
- ]
173
-
174
- [package.metadata]
175
-
176
- [package.metadata.requires-dev]
177
- dev = [
178
- { name = "bandit", specifier = ">=1.7.5" },
179
- { name = "black", specifier = ">=23.7.0" },
180
- { name = "flake8", specifier = ">=6.1" },
181
- { name = "isort", specifier = ">=5.12.0" },
182
- { name = "pytest", specifier = ">=8.0" },
183
- { name = "pytest-cov", specifier = ">=4.1" },
184
- { name = "pytest-xdist", specifier = ">=3.0" },
185
- { name = "teken", specifier = ">=0.8" },
186
- ]
187
-
188
157
  [[package]]
189
158
  name = "execnet"
190
159
  version = "2.1.2"
@@ -256,6 +225,37 @@ wheels = [
256
225
  { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" },
257
226
  ]
258
227
 
228
+ [[package]]
229
+ name = "microphone-cli"
230
+ version = "0.8.2"
231
+ source = { editable = "." }
232
+
233
+ [package.dev-dependencies]
234
+ dev = [
235
+ { name = "bandit" },
236
+ { name = "black" },
237
+ { name = "flake8" },
238
+ { name = "isort" },
239
+ { name = "pytest" },
240
+ { name = "pytest-cov" },
241
+ { name = "pytest-xdist" },
242
+ { name = "teken" },
243
+ ]
244
+
245
+ [package.metadata]
246
+
247
+ [package.metadata.requires-dev]
248
+ dev = [
249
+ { name = "bandit", specifier = ">=1.7.5" },
250
+ { name = "black", specifier = ">=23.7.0" },
251
+ { name = "flake8", specifier = ">=6.1" },
252
+ { name = "isort", specifier = ">=5.12.0" },
253
+ { name = "pytest", specifier = ">=8.0" },
254
+ { name = "pytest-cov", specifier = ">=4.1" },
255
+ { name = "pytest-xdist", specifier = ">=3.0" },
256
+ { name = "teken", specifier = ">=0.8" },
257
+ ]
258
+
259
259
  [[package]]
260
260
  name = "mypy-extensions"
261
261
  version = "1.1.0"
@@ -1,28 +0,0 @@
1
- # CLAUDE.md — seed / bootstrap placeholder
2
-
3
- > **This is a self-initializing seed, not a finished runtime prompt.**
4
- > Run `/init` (or describe the agent's domain to your AI assistant) to
5
- > re-initialize this file into a full runtime prompt, using the description
6
- > below and the scaffolded repo as context.
7
-
8
- ## Agent
9
-
10
- This repository hosts the **microphone-cli** agent.
11
-
12
- ## Description
13
-
14
- Agent-first CLI for USB microphones and microphone arrays: enumerate devices, select and inspect channels, control gain and sample format, and read direction-of-arrival from array firmware.
15
-
16
- ## Re-init instruction
17
-
18
- This file is a seed. To expand it into your full runtime prompt:
19
-
20
- 1. Open this repo in Claude Code (or your preferred AI assistant).
21
- 2. Run `/init` — the assistant will read the repo, incorporate the description
22
- above, and replace this seed with a complete `CLAUDE.md`.
23
- 3. Commit the result.
24
-
25
- Until you run `/init`, `microphone-cli` satisfies the `steward doctor`
26
- `prompt-file-present` and `backend-consistency` invariants (a `CLAUDE.md`
27
- exists and `culture.yaml` declares `backend: claude`) but the prompt is not
28
- yet tailored to this agent's domain.
@@ -1,59 +0,0 @@
1
- # microphone-cli
2
-
3
- Agent-first CLI for USB microphones and microphone arrays: enumerate devices, select and inspect channels, control gain and sample format, and read direction-of-arrival from array firmware.
4
-
5
- ## What you get
6
-
7
- - **An agent-first CLI** cited from [teken](https://github.com/agentculture/teken)
8
- (`afi-cli`) — the runtime package has no third-party dependencies.
9
- - **A mesh identity** — `culture.yaml` (`suffix` + `backend`) and the matching
10
- resident prompt file (`AGENTS.colleague.md`, since this template runs
11
- `backend: colleague`).
12
- - **The canonical guildmaster skill kit** (11 skills) under `.claude/skills/`,
13
- vendored cite-don't-import. See [`docs/skill-sources.md`](docs/skill-sources.md).
14
- - **A build + deploy baseline** — pytest, lint, the agent-first rubric gate, and
15
- PyPI Trusted Publishing wired into GitHub Actions.
16
-
17
- ## Quickstart
18
-
19
- ```bash
20
- uv sync
21
- uv run pytest -n auto # run the test suite
22
- uv run microphone-cli whoami # identity from culture.yaml
23
- uv run microphone-cli learn # self-teaching prompt (add --json)
24
- uv run teken cli doctor . --strict # the agent-first rubric gate CI runs
25
- ```
26
-
27
- ## CLI
28
-
29
- | Verb | What it does |
30
- |------|--------------|
31
- | `whoami` | Report this agent's nick, version, backend, and model from `culture.yaml`. |
32
- | `learn` | Print a structured self-teaching prompt. |
33
- | `explain <path>` | Markdown docs for any noun/verb path. |
34
- | `overview` | Read-only descriptive snapshot of the agent. |
35
- | `doctor` | Check the agent-identity invariants (prompt-file-present, backend-consistency). |
36
- | `cli overview` | Describe the CLI surface itself. |
37
-
38
- Every command supports `--json`. Results go to stdout, errors/diagnostics to
39
- stderr (never mixed). Exit codes: `0` success, `1` user error, `2` environment
40
- error, `3+` reserved.
41
-
42
- ## Make it your own
43
-
44
- 1. Rename the package `microphone_cli/` and the `microphone-cli`
45
- CLI/dist name throughout `pyproject.toml`, the package, `tests/`,
46
- `sonar-project.properties`, and this `README.md`. The name is hard-coded in
47
- ~100 places, so list every occurrence first — see the `git grep` discovery
48
- command in [`CLAUDE.md`](CLAUDE.md), the authoritative rename procedure.
49
- 2. Edit `culture.yaml` with your `suffix` and `backend`.
50
- 3. Rewrite `CLAUDE.md` for your agent and run `/init`.
51
- 4. Re-vendor only the skills you need from guildmaster (see
52
- [`docs/skill-sources.md`](docs/skill-sources.md)).
53
-
54
- See [`CLAUDE.md`](CLAUDE.md) for the full conventions (version-bump-every-PR,
55
- the `cicd` PR lane, deploy setup).
56
-
57
- ## License
58
-
59
- Apache 2.0 — see [`LICENSE`](LICENSE).
File without changes
File without changes