microduck-cli 0.7.0__tar.gz → 0.8.0__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 (82) hide show
  1. {microduck_cli-0.7.0 → microduck_cli-0.8.0}/.claude/skills/cicd/SKILL.md +30 -14
  2. {microduck_cli-0.7.0 → microduck_cli-0.8.0}/.claude/skills.local.yaml.example +5 -0
  3. {microduck_cli-0.7.0 → microduck_cli-0.8.0}/CHANGELOG.md +33 -0
  4. microduck_cli-0.8.0/CLAUDE.md +273 -0
  5. microduck_cli-0.8.0/PKG-INFO +94 -0
  6. microduck_cli-0.8.0/README.md +77 -0
  7. {microduck_cli-0.7.0 → microduck_cli-0.8.0}/docs/skill-sources.md +28 -1
  8. {microduck_cli-0.7.0 → microduck_cli-0.8.0}/pyproject.toml +1 -1
  9. {microduck_cli-0.7.0 → microduck_cli-0.8.0}/uv.lock +31 -31
  10. microduck_cli-0.7.0/CLAUDE.md +0 -28
  11. microduck_cli-0.7.0/PKG-INFO +0 -76
  12. microduck_cli-0.7.0/README.md +0 -59
  13. {microduck_cli-0.7.0 → microduck_cli-0.8.0}/.claude/skills/agent-config/SKILL.md +0 -0
  14. {microduck_cli-0.7.0 → microduck_cli-0.8.0}/.claude/skills/agent-config/data/backend-fingerprints.yaml +0 -0
  15. {microduck_cli-0.7.0 → microduck_cli-0.8.0}/.claude/skills/agent-config/scripts/show.sh +0 -0
  16. {microduck_cli-0.7.0 → microduck_cli-0.8.0}/.claude/skills/ask-colleague/SKILL.md +0 -0
  17. {microduck_cli-0.7.0 → microduck_cli-0.8.0}/.claude/skills/ask-colleague/prompts/explore.md +0 -0
  18. {microduck_cli-0.7.0 → microduck_cli-0.8.0}/.claude/skills/ask-colleague/prompts/review.md +0 -0
  19. {microduck_cli-0.7.0 → microduck_cli-0.8.0}/.claude/skills/ask-colleague/prompts/write.md +0 -0
  20. {microduck_cli-0.7.0 → microduck_cli-0.8.0}/.claude/skills/ask-colleague/scripts/ask-colleague.sh +0 -0
  21. {microduck_cli-0.7.0 → microduck_cli-0.8.0}/.claude/skills/assign-to-workforce/SKILL.md +0 -0
  22. {microduck_cli-0.7.0 → microduck_cli-0.8.0}/.claude/skills/assign-to-workforce/scripts/assign-to-workforce.sh +0 -0
  23. {microduck_cli-0.7.0 → microduck_cli-0.8.0}/.claude/skills/challenge/SKILL.md +0 -0
  24. {microduck_cli-0.7.0 → microduck_cli-0.8.0}/.claude/skills/cicd/scripts/_resolve-nick.sh +0 -0
  25. {microduck_cli-0.7.0 → microduck_cli-0.8.0}/.claude/skills/cicd/scripts/portability-lint.sh +0 -0
  26. {microduck_cli-0.7.0 → microduck_cli-0.8.0}/.claude/skills/cicd/scripts/pr-reply.sh +0 -0
  27. {microduck_cli-0.7.0 → microduck_cli-0.8.0}/.claude/skills/cicd/scripts/pr-status.sh +0 -0
  28. {microduck_cli-0.7.0 → microduck_cli-0.8.0}/.claude/skills/cicd/scripts/workflow.sh +0 -0
  29. {microduck_cli-0.7.0 → microduck_cli-0.8.0}/.claude/skills/communicate/SKILL.md +0 -0
  30. {microduck_cli-0.7.0 → microduck_cli-0.8.0}/.claude/skills/communicate/scripts/fetch-issues.sh +0 -0
  31. {microduck_cli-0.7.0 → microduck_cli-0.8.0}/.claude/skills/communicate/scripts/mesh-message.sh +0 -0
  32. {microduck_cli-0.7.0 → microduck_cli-0.8.0}/.claude/skills/communicate/scripts/post-comment.sh +0 -0
  33. {microduck_cli-0.7.0 → microduck_cli-0.8.0}/.claude/skills/communicate/scripts/post-issue.sh +0 -0
  34. {microduck_cli-0.7.0 → microduck_cli-0.8.0}/.claude/skills/communicate/scripts/templates/skill-new-brief.md +0 -0
  35. {microduck_cli-0.7.0 → microduck_cli-0.8.0}/.claude/skills/communicate/scripts/templates/skill-update-brief.md +0 -0
  36. {microduck_cli-0.7.0 → microduck_cli-0.8.0}/.claude/skills/deviate/SKILL.md +0 -0
  37. {microduck_cli-0.7.0 → microduck_cli-0.8.0}/.claude/skills/doc-test-alignment/SKILL.md +0 -0
  38. {microduck_cli-0.7.0 → microduck_cli-0.8.0}/.claude/skills/doc-test-alignment/scripts/check.sh +0 -0
  39. {microduck_cli-0.7.0 → microduck_cli-0.8.0}/.claude/skills/pypi-maintainer/SKILL.md +0 -0
  40. {microduck_cli-0.7.0 → microduck_cli-0.8.0}/.claude/skills/pypi-maintainer/scripts/switch-source.sh +0 -0
  41. {microduck_cli-0.7.0 → microduck_cli-0.8.0}/.claude/skills/recall/SKILL.md +0 -0
  42. {microduck_cli-0.7.0 → microduck_cli-0.8.0}/.claude/skills/recall/scripts/recall.sh +0 -0
  43. {microduck_cli-0.7.0 → microduck_cli-0.8.0}/.claude/skills/remember/SKILL.md +0 -0
  44. {microduck_cli-0.7.0 → microduck_cli-0.8.0}/.claude/skills/remember/scripts/remember.sh +0 -0
  45. {microduck_cli-0.7.0 → microduck_cli-0.8.0}/.claude/skills/run-tests/SKILL.md +0 -0
  46. {microduck_cli-0.7.0 → microduck_cli-0.8.0}/.claude/skills/run-tests/scripts/test.sh +0 -0
  47. {microduck_cli-0.7.0 → microduck_cli-0.8.0}/.claude/skills/scope/SKILL.md +0 -0
  48. {microduck_cli-0.7.0 → microduck_cli-0.8.0}/.claude/skills/sonarclaude/SKILL.md +0 -0
  49. {microduck_cli-0.7.0 → microduck_cli-0.8.0}/.claude/skills/sonarclaude/scripts/sonar.sh +0 -0
  50. {microduck_cli-0.7.0 → microduck_cli-0.8.0}/.claude/skills/spec-to-plan/SKILL.md +0 -0
  51. {microduck_cli-0.7.0 → microduck_cli-0.8.0}/.claude/skills/spec-to-plan/scripts/spec-to-plan.sh +0 -0
  52. {microduck_cli-0.7.0 → microduck_cli-0.8.0}/.claude/skills/summarize-delivery/SKILL.md +0 -0
  53. {microduck_cli-0.7.0 → microduck_cli-0.8.0}/.claude/skills/think/SKILL.md +0 -0
  54. {microduck_cli-0.7.0 → microduck_cli-0.8.0}/.claude/skills/think/scripts/think.sh +0 -0
  55. {microduck_cli-0.7.0 → microduck_cli-0.8.0}/.claude/skills/version-bump/SKILL.md +0 -0
  56. {microduck_cli-0.7.0 → microduck_cli-0.8.0}/.claude/skills/version-bump/scripts/bump.py +0 -0
  57. {microduck_cli-0.7.0 → microduck_cli-0.8.0}/.flake8 +0 -0
  58. {microduck_cli-0.7.0 → microduck_cli-0.8.0}/.github/workflows/publish.yml +0 -0
  59. {microduck_cli-0.7.0 → microduck_cli-0.8.0}/.github/workflows/tests.yml +0 -0
  60. {microduck_cli-0.7.0 → microduck_cli-0.8.0}/.gitignore +0 -0
  61. {microduck_cli-0.7.0 → microduck_cli-0.8.0}/.markdownlint-cli2.yaml +0 -0
  62. {microduck_cli-0.7.0 → microduck_cli-0.8.0}/AGENTS.colleague.md +0 -0
  63. {microduck_cli-0.7.0 → microduck_cli-0.8.0}/LICENSE +0 -0
  64. {microduck_cli-0.7.0 → microduck_cli-0.8.0}/culture.yaml +0 -0
  65. {microduck_cli-0.7.0 → microduck_cli-0.8.0}/microduck_cli/__init__.py +0 -0
  66. {microduck_cli-0.7.0 → microduck_cli-0.8.0}/microduck_cli/__main__.py +0 -0
  67. {microduck_cli-0.7.0 → microduck_cli-0.8.0}/microduck_cli/cli/__init__.py +0 -0
  68. {microduck_cli-0.7.0 → microduck_cli-0.8.0}/microduck_cli/cli/_commands/__init__.py +0 -0
  69. {microduck_cli-0.7.0 → microduck_cli-0.8.0}/microduck_cli/cli/_commands/cli.py +0 -0
  70. {microduck_cli-0.7.0 → microduck_cli-0.8.0}/microduck_cli/cli/_commands/doctor.py +0 -0
  71. {microduck_cli-0.7.0 → microduck_cli-0.8.0}/microduck_cli/cli/_commands/explain.py +0 -0
  72. {microduck_cli-0.7.0 → microduck_cli-0.8.0}/microduck_cli/cli/_commands/learn.py +0 -0
  73. {microduck_cli-0.7.0 → microduck_cli-0.8.0}/microduck_cli/cli/_commands/overview.py +0 -0
  74. {microduck_cli-0.7.0 → microduck_cli-0.8.0}/microduck_cli/cli/_commands/whoami.py +0 -0
  75. {microduck_cli-0.7.0 → microduck_cli-0.8.0}/microduck_cli/cli/_errors.py +0 -0
  76. {microduck_cli-0.7.0 → microduck_cli-0.8.0}/microduck_cli/cli/_output.py +0 -0
  77. {microduck_cli-0.7.0 → microduck_cli-0.8.0}/microduck_cli/explain/__init__.py +0 -0
  78. {microduck_cli-0.7.0 → microduck_cli-0.8.0}/microduck_cli/explain/catalog.py +0 -0
  79. {microduck_cli-0.7.0 → microduck_cli-0.8.0}/sonar-project.properties +0 -0
  80. {microduck_cli-0.7.0 → microduck_cli-0.8.0}/tests/__init__.py +0 -0
  81. {microduck_cli-0.7.0 → microduck_cli-0.8.0}/tests/test_cli.py +0 -0
  82. {microduck_cli-0.7.0 → microduck_cli-0.8.0}/tests/test_cli_introspection.py +0 -0
@@ -163,14 +163,16 @@ only when the user explicitly asks for one of them.
163
163
 
164
164
  For every comment, decide **FIX** or **PUSHBACK** with reasoning.
165
165
 
166
- Default to **FIX** for: portability complaints (always valid for
167
- Steward — recurring bug class), test or doc requests, style nits
166
+ Default to **FIX** for: portability complaints (a recurring bug
167
+ class across AgentCulture repos), test or doc requests, style nits
168
168
  aligned with workspace conventions.
169
169
 
170
170
  Default to **PUSHBACK** for: architecture opinions that conflict with
171
- workspace `CLAUDE.md` or the all-backends rule; greenfield
172
- false-positives (e.g. "add tests" before there's any source — defer
173
- to a later PR, don't refuse).
171
+ `CLAUDE.md` or the all-backends rule; scaffold false-positives — this
172
+ repo has no MicroDuck control code yet, so "this CLI doesn't do
173
+ anything with the robot" is a roadmap item, not a PR defect. Anything
174
+ proposing a second runtime loop in `microduck_cli/` is a PUSHBACK too:
175
+ that code belongs upstream in `neurosymbolic-system` (see `CLAUDE.md`).
174
176
 
175
177
  ### Alignment-delta rule
176
178
 
@@ -179,18 +181,29 @@ If the PR touches `CLAUDE.md`, `culture.yaml`, or anything under
179
181
  PUSHBACK on each comment. Note any sibling that needs a follow-up PR
180
182
  and mention it in your reply.
181
183
 
182
- ## Greenfield-aware steps
184
+ ## Pre-PR steps (microduck-cli)
183
185
 
184
- The lint and the workflow script are always-on. Stack-specific steps
185
- are conditional and currently no-op (greenfield repo):
186
+ **Consumer adaptation** — upstream ships this section as conditional
187
+ "greenfield-aware" no-ops. microduck-cli's stack has landed, so the steps
188
+ below are unconditional here; run all of them before `workflow.sh open`.
189
+ Recorded as a tracked divergence in `docs/skill-sources.md`.
186
190
 
187
191
  ```bash
188
- [ -d tests ] && [ -f pyproject.toml ] && uv run pytest tests/ -x -q
189
- [ -f pyproject.toml ] && bump_version_per_project_convention # see project README
190
- [ -f .markdownlint-cli2.yaml ] && markdownlint-cli2 "$(git diff --name-only --cached '*.md')"
192
+ uv run pytest -n auto # full suite must be green
193
+ uv run black --check microduck_cli tests # the CI lint job, locally
194
+ uv run isort --check-only microduck_cli tests
195
+ uv run flake8 microduck_cli tests
196
+ uv run bandit -c pyproject.toml -r microduck_cli
197
+ uv run teken cli doctor . --strict # the agent-first rubric gate
198
+ markdownlint-cli2 "**/*.md" "#node_modules" "#.local" "#.claude/skills" "#.teken"
199
+ /version-bump patch|minor|major # REQUIRED on every PR
191
200
  ```
192
201
 
193
- Revisit each line as the corresponding stack element actually lands.
202
+ The version bump is not optional: the `version-check` job compares
203
+ `pyproject.toml` against `origin/main` and fails the PR when they match — even
204
+ for docs/config/CI-only changes. Use the `version-bump` skill so `CHANGELOG.md`
205
+ gets its Keep-a-Changelog entry in the same pass.
206
+
194
207
  A `pr lint --extra=tests,version,markdown` ask is filed upstream
195
208
  ([devex#41](https://github.com/agentculture/devex/issues/41)).
196
209
 
@@ -203,6 +216,9 @@ in the fix-up commit message.
203
216
  The `status` extension queries SonarCloud directly (it predates the
204
217
  upstream Sonar integration in `devex pr read`). Both surfaces are
205
218
  trustworthy — `devex pr read` for display in the briefing, `status` for
206
- the gate. Steward isn't yet a registered mesh agent, so the
219
+ the gate. microduck-cli isn't yet a registered mesh agent, so the
207
220
  post-merge IRC ping that Culture's `pr-review` includes is still
208
- skipped — that returns when Steward joins the mesh.
221
+ skipped — that returns when microduck-cli joins the mesh. (Until then,
222
+ a cross-repo follow-up — e.g. a runtime gap that belongs to
223
+ `neurosymbolic-system` — goes out as a tracked issue via the
224
+ `communicate` skill.)
@@ -14,3 +14,8 @@ sibling_projects:
14
14
  - ../guildmaster
15
15
  - ../steward
16
16
  - ../teken
17
+ # Robot-family siblings — the architecture microduck-cli composes.
18
+ # See CLAUDE.md "The three sibling repos, and what to take from each".
19
+ - ../neurosymbolic-system
20
+ - ../reachy-mini-cli
21
+ - ../arm101-cli
@@ -5,6 +5,39 @@ 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.0] - 2026-08-29
9
+
10
+ ### Changed
11
+
12
+ - **`CLAUDE.md` re-initialized from the seed into a real runtime prompt** (`/init`).
13
+ Replaces the self-initializing placeholder with: what the repo actually is today
14
+ (the mesh-agent scaffold — **no MicroDuck control code exists yet**), the
15
+ `microduck` vs `microduck-cli` console-script gotcha, the common command + lint
16
+ stack, the agent-first CLI contracts (registration, error, output, explain
17
+ catalog, identity/`doctor`) and the rubric shapes that must not be "simplified"
18
+ away, hard constraints, CI/release, the vendored-skill rule, and the workflow
19
+ conventions (worktrees in `../.worktrees.microduck-cli/`, in-repo public eidetic
20
+ memory, PR flow).
21
+ - **A "three sibling repos" section** naming what to take from each and what not
22
+ to: `neurosymbolic-system` is the runtime to **import** — but it is itself still
23
+ a bare scaffold, so it is not a dependency yet and a tick loop must never be
24
+ re-implemented here; `reachy-mini-cli` is the architecture (noun groups, one tick
25
+ seam, single-SDK-owner model); `arm101-cli` is the hardware-safety baseline
26
+ (gated motion, release-on-abnormal-exit, hardware deps behind an extra).
27
+ - **README rewritten** — a `Status: scaffold` section stating plainly that no duck
28
+ control code ships yet, a corrected quickstart (`uv run microduck …`; the old
29
+ `uv run microduck-cli …` line failed with "Failed to spawn"), a sibling-projects
30
+ table, and the removal of the template's "Make it your own" rename instructions.
31
+ - **`cicd` skill adapted to this repo's landed stack** — the upstream
32
+ "Greenfield-aware steps" no-ops become unconditional "Pre-PR steps
33
+ (microduck-cli)", the triage defaults name this repo's real false-positive class
34
+ (scaffold complaints; a second runtime loop that belongs in
35
+ `neurosymbolic-system`), and the mesh-ping paragraph names microduck-cli.
36
+ `SKILL.md` prose only — no script bodies touched — and recorded as a tracked
37
+ divergence in `docs/skill-sources.md`.
38
+ - **`.claude/skills.local.yaml.example`** lists the three robot-family siblings
39
+ under `sibling_projects`, so `cicd`'s alignment-delta step sees them.
40
+
8
41
  ## [0.7.0] - 2026-08-24
9
42
 
10
43
  ### Added
@@ -0,0 +1,273 @@
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 actually is right now
6
+
7
+ `microduck-cli` is an **AgentCulture mesh agent** whose destination is
8
+ *controlling the MicroDuck robot — one CLI that any agent or human drives*
9
+ (`culture.yaml`, [README](README.md)).
10
+
11
+ **No MicroDuck control code exists yet.** What is on disk is the mesh-agent
12
+ scaffold cloned from `culture-agent-template` (`git log` is two commits: the
13
+ initial commit and the scaffold): an agent-first introspection CLI (`whoami`,
14
+ `learn`, `explain`, `overview`, `doctor`, `cli`), a mesh identity, the vendored
15
+ guildmaster skill kit, and a build/CI/deploy baseline. Treat that CLI as the
16
+ chassis you extend, and the three sibling repos below as the architecture you
17
+ extend it *toward*.
18
+
19
+ Two things to internalize before touching anything:
20
+
21
+ - **The runtime agent prompt is `AGENTS.colleague.md`, not this file.**
22
+ `culture.yaml` declares `backend: colleague`, and the backend→prompt-file map
23
+ (see `doctor`) resolves `colleague` → `AGENTS.colleague.md`. This `CLAUDE.md`
24
+ is guidance for *Claude Code working in the repo*; editing it does not change
25
+ the mesh agent's runtime behavior.
26
+ - **The installed console script is `microduck`, not `microduck-cli`.**
27
+ `[project.scripts]` defines `microduck = "microduck_cli.cli:main"`, so
28
+ `uv run microduck-cli whoami` fails with "Failed to spawn." Use `uv run
29
+ microduck …` or `python -m microduck_cli …`. The *internal* prog name is
30
+ `microduck-cli`, so `--help` text, error messages, `learn`/`explain` bodies and
31
+ JSON payloads all say `microduck-cli` — that string is intentional in output,
32
+ just not as the binary. (Same half-rename `arm101-cli` carries; `reachy-mini-cli`
33
+ resolved its by shipping *both* console scripts. Either fix is fine — do it as
34
+ one deliberate pass across `pyproject.toml`, `prog=`, `_commands/`,
35
+ `explain/catalog.py`, the README and the test assertions, never piecemeal.)
36
+
37
+ ## Common commands
38
+
39
+ ```bash
40
+ uv sync # create .venv, install runtime + dev deps
41
+ uv run microduck whoami # run the CLI (note: 'microduck')
42
+ uv run pytest -n auto # full suite (xdist parallel)
43
+ uv run pytest tests/test_cli.py::test_whoami_text # a single test
44
+ uv run pytest -n auto --cov=microduck_cli --cov-report=term # coverage (CI gate: fail_under=60)
45
+ uv run teken cli doctor . --strict # the agent-first rubric gate CI enforces
46
+ ```
47
+
48
+ Lint stack (the CI `lint` job runs all of these; line length is 100 everywhere):
49
+
50
+ ```bash
51
+ uv run black --check microduck_cli tests
52
+ uv run isort --check-only microduck_cli tests
53
+ uv run flake8 microduck_cli tests
54
+ uv run bandit -c pyproject.toml -r microduck_cli # B101/B404/B603 skipped in pyproject
55
+ markdownlint-cli2 "**/*.md" "#node_modules" "#.local" "#.claude/skills" "#.teken"
56
+ ```
57
+
58
+ ## Architecture: the agent-first CLI
59
+
60
+ Everything routes through `microduck_cli/cli/__init__.py:main()` → `_build_parser()`.
61
+ Three cross-cutting contracts are enforced by tests and by the rubric gate.
62
+
63
+ - **Adding a verb.** Write `cli/_commands/<verb>.py` exposing `register(sub)`
64
+ (add `--json`, `set_defaults(func=…)`), then add one import + call inside
65
+ `_build_parser()`. That is the only wiring step; `whoami.py` is the canonical
66
+ example. For a **noun group** (a subcommand with its own verbs — how duck
67
+ control will land, e.g. `microduck duck walk`), mirror `_commands/cli.py`:
68
+ build the child subparsers with `parser_class=type(p)` so nested parse errors
69
+ keep the structured error contract instead of argparse's default exit-2. A noun
70
+ with action-verbs must also expose its own `overview` (rubric requirement).
71
+ - **Error contract** (`cli/_errors.py` + `_dispatch`/`_CliArgumentParser`).
72
+ Every failure raises `CliError(code, message, remediation)`; `_dispatch` catches
73
+ it and wraps *any* other exception, so no Python traceback ever leaks. Argparse
74
+ errors route through `_CliArgumentParser.error()` too — and because parse errors
75
+ fire before `args.json` exists, `main()` pre-scans raw argv for `--json` into the
76
+ class-level `_json_hint`. **Handlers raise `CliError` — never `sys.exit`, never
77
+ print-and-return.** Text errors are always two lines: `error: …` then `hint: …`
78
+ (the `hint:` prefix is rubric-required).
79
+ - **Output contract** (`cli/_output.py`). Results → stdout, errors and diagnostics
80
+ → stderr, **never mixed**, in text and JSON mode alike. Use `emit_result` /
81
+ `emit_error` / `emit_diagnostic`, not `print`. Exit codes: `0` success, `1`
82
+ user-input error, `2` environment error, `3+` reserved (constants in `_errors.py`).
83
+ - **The explain catalog** (`microduck_cli/explain/catalog.py`). `ENTRIES` is keyed
84
+ by command-path tuples (`("whoami",)`, `("cli","overview")`; `()`,
85
+ `("microduck-cli",)` and `("microduck",)` all resolve to root).
86
+ `test_every_catalog_path_resolves` asserts each *existing* entry renders, but
87
+ nothing forces a *new* verb to have one — so adding a verb means updating
88
+ **three places in lockstep** or the docs silently drift: the catalog entry, the
89
+ `_VERBS` list in `overview.py`, and the `_TEXT` + `_as_json_payload` blocks in
90
+ `learn.py`.
91
+ - **Identity** (`_commands/whoami.py`). `culture.yaml` is hand-parsed line by line
92
+ (no YAML dependency, to keep runtime deps empty) — only the documented flat
93
+ `suffix`/`backend`/`model` shape is understood. `find_culture_yaml()` walks up
94
+ from `__file__`, so identity is the agent's own even when invoked elsewhere; a
95
+ wheel install (no `culture.yaml` beside the package) falls back to literal
96
+ defaults and `doctor` reports a single info check.
97
+
98
+ ### The agent-first rubric (why some code looks odd)
99
+
100
+ `teken cli doctor . --strict` gates CI on a seven-bundle rubric. Several shapes
101
+ exist only to satisfy it — don't "simplify" them away:
102
+
103
+ - `learn` must be ≥200 chars and mention purpose, command map, exit codes,
104
+ `--json`, and `explain`.
105
+ - Any noun with action-verbs must also expose `overview` — the entire reason the
106
+ `cli` noun group exists (`cli overview` describes the CLI; the global `overview`
107
+ describes the *agent*).
108
+ - Descriptive verbs must never hard-fail on a bad path — hence `overview` takes an
109
+ ignored positional `target` and still exits 0.
110
+
111
+ Separate from the in-package `microduck doctor`, which checks **agent-identity
112
+ invariants**: `prompt-file-present`, `backend-consistency` (`claude`→`CLAUDE.md`,
113
+ `colleague`→`AGENTS.colleague.md`, `acp`→`AGENTS.md`, `gemini`→`GEMINI.md`), and
114
+ `skills-present`. Change the backend in `culture.yaml` and you must teach `doctor`
115
+ the matching prompt file.
116
+
117
+ ## The three sibling repos, and what to take from each
118
+
119
+ The duck domain is meant to be built by *composing* these, not by inventing a
120
+ fourth architecture. Read the named file before you start the corresponding work.
121
+
122
+ ### `../neurosymbolic-system` — the intended runtime (not usable yet)
123
+
124
+ The description says microduck-cli is "built on the neurosymbolic-system runtime":
125
+ senses, rules, arbitration and motion composed onto one 50 Hz tick, extracted from
126
+ reachy-mini-cli and imported as a library by robot CLIs. **That library does not
127
+ exist yet.** `neurosymbolic-system` 0.7.0 is the *same* bare template scaffold this
128
+ repo is — `neurosymbolic_system/` contains only `cli/` and `explain/`, no runtime
129
+ modules, and its `CLAUDE.md` is still the un-`/init`'ed seed.
130
+
131
+ Consequences: it is **not** a dependency of this repo and must not be added as one
132
+ until it actually ships runtime modules. When it does, **import it — do not
133
+ re-implement the tick here.** If you find yourself writing an engine loop,
134
+ arbitration, or a sense driver in `microduck_cli/`, that code belongs upstream in
135
+ `neurosymbolic-system`; file it there (the `communicate` skill posts cross-repo
136
+ issues) rather than forking a second runtime. Until then, duck work that needs a
137
+ runtime is blocked on that repo, and a CLI-only surface (config, discovery,
138
+ inventory, dry-run planning) is what can land here.
139
+
140
+ ### `../reachy-mini-cli` — the architecture to follow
141
+
142
+ The mature robot CLI in the family (`reachy/`, ~2000-line `CLAUDE.md`). Its
143
+ `CLAUDE.md` "Architecture: the agent-first CLI" and "Noun internals" sections are
144
+ the reference. The load-bearing lessons:
145
+
146
+ - **One noun per capability, each with `overview`**, engine logic in a sibling
147
+ package (`reachy/behavior/`, `reachy/motion/`…) and only argparse wiring in
148
+ `_commands/`. Keep that split here: `microduck_cli/cli/_commands/` stays thin.
149
+ - **The single-SDK-owner model.** The hardware exposes one client and one head;
150
+ every sense process contends for them, and the loser throttles. So **compose
151
+ senses onto ONE tick seam, never as two processes** (`_compose_run_seam`). Two
152
+ standalone sense nouns were deleted for exactly this reason — don't recreate the
153
+ mistake in duck form.
154
+ - **Don't arbitrate across processes on a flag file.** A flag cannot expire; a
155
+ heartbeat in `state.json` can. Refuse early (`refuse_if_engine_live()`) instead
156
+ of running a silently useless second process.
157
+ - **Sense-stage logging.** A named drop reason (`self-mute`, `cooldown`,
158
+ `audio-muted`…) on a dedicated logger, stderr-only, so JSONL export on stdout
159
+ stays pure. A layer whose drops are invisible is indistinguishable from one that
160
+ silently no-ops.
161
+
162
+ ### `../arm101-cli` — the hardware-safety patterns at this maturity
163
+
164
+ The closest peer: same template, same half-rename gotcha, a real hardware layer
165
+ grown on top (`arm101/hardware/`, `arm101/explore/`). Copy its two shipped
166
+ disciplines when duck motion lands:
167
+
168
+ - **Gated motion.** Every verb that moves hardware confirms on a TTY, prints a
169
+ zero-side-effect dry-run plan on a non-TTY without `--apply`, and proceeds on a
170
+ non-TTY *with* `--apply` (agent mode).
171
+ - **Own what you energize.** Release on any abnormal exit (exception, bus fault,
172
+ Ctrl-C), each actuator released independently so one failure doesn't abort the
173
+ rest; leave torque untouched on a *clean* exit so a deliberate hold survives.
174
+ State the limits you cannot cover (a bus that is physically gone) rather than
175
+ implying safety you don't have.
176
+ - **Hardware deps go in an extra, lazy-imported** (`[seeed]` there), so the base
177
+ install stays zero-dep and introspection works on a box with no robot attached.
178
+
179
+ ## Hard constraints
180
+
181
+ - **Zero third-party runtime dependencies** (`dependencies = []`) — on purpose.
182
+ `teken`, pytest and the lint stack are dev-only. Keep it that way unless the duck
183
+ layer genuinely needs a hardware library, and if it does, put it behind an extra
184
+ with a lazy import so the introspection CLI still imports clean on a bare box.
185
+ Adding a *base* dep (including `neurosymbolic-system`, once it exists) is an
186
+ explicit decision, not a drive-by.
187
+ - **Python ≥ 3.12** (`X | None`, `tomllib`).
188
+ - **Every PR bumps the version — even docs/config/CI-only changes.** The
189
+ `version-check` job in `.github/workflows/tests.yml` compares `pyproject.toml`
190
+ against `origin/main` and fails the PR when they match (a duplicate version would
191
+ fail the PyPI publish on merge). Use the `version-bump` skill; it also prepends
192
+ the Keep-a-Changelog entry.
193
+
194
+ ## CI / release
195
+
196
+ - `.github/workflows/tests.yml`: `test` (pytest + coverage + SonarCloud), `lint`
197
+ (the stack above + the rubric gate), `version-check` (PR-only).
198
+ - SonarCloud gates the `test` job (`sonar-project.properties`,
199
+ `sonar.qualitygate.wait=true`) — but only when `SONAR_TOKEN` is set; token-less
200
+ repos and fork PRs skip the scan and stay green. `coverage.run.relative_files =
201
+ true` is load-bearing: without it `coverage.xml` paths don't map to
202
+ `sonar.sources=microduck_cli` and coverage reports 0%.
203
+ - `publish.yml`: PyPI Trusted Publishing over OIDC — push to `main` → PyPI,
204
+ same-repo PR → a `.devN` build to TestPyPI. No stored credentials.
205
+
206
+ ## Skills (`.claude/skills/`) — cite-don't-import
207
+
208
+ The kit is **vendored** from `guildmaster` (a few from `colleague`/`devague`);
209
+ `docs/skill-sources.md` is the authoritative provenance ledger and holds the
210
+ per-skill re-sync procedure. **Do not hand-edit skill script bodies** — lift real
211
+ changes upstream and re-vendor; a copy that diverges silently is the failure mode
212
+ that rule exists to prevent. The sanctioned local edits are (a) consumer-identifying
213
+ prose in `SKILL.md` and (b) adding `type: command` to the frontmatter (load-bearing:
214
+ the culture backend's `core.skill_loader` silently skips any `SKILL.md` without it).
215
+ Every divergence beyond that gets a row in the ledger — `cicd`'s repo-specific
216
+ pre-PR steps and `ask-colleague`'s direct-from-colleague vendoring are the tracked
217
+ ones today. There are **no first-party skills here yet**; when you add one (a duck
218
+ wrapper would be the natural first, as `find-reachy` is in reachy-mini-cli), say so
219
+ in this section — otherwise a reviewer can't tell "ours" from "vendored".
220
+
221
+ Day to day: **`cicd`** (the PR lane; needs `devex` ≥0.21 on PATH),
222
+ **`communicate`** (cross-repo issues + mesh messages; needs `agtag`; posts auto-sign
223
+ `- microduck-cli (Claude)`), **`version-bump`**, **`run-tests`**, **`sonarclaude`**,
224
+ **`ask-colleague`**, and the devague chain (`scope` → `think` → `challenge` →
225
+ `spec-to-plan` → `assign-to-workforce` → `summarize-delivery`, with `deviate` as the
226
+ mid-run escape hatch).
227
+
228
+ Reach for **`ask-colleague`** reflexively for a diverse second opinion —
229
+ `review`/`explore` are read-only and always safe; side-effecting `write --apply` /
230
+ `--pr` needs the user's go-ahead.
231
+
232
+ ## Conventions and workflow
233
+
234
+ **Git worktrees live in `../.worktrees.microduck-cli/<name>/`.** ALL worktrees of
235
+ this repo, without exception — workforce fan-out lanes, `ask-colleague` throwaways,
236
+ scratch checkouts:
237
+
238
+ ```bash
239
+ git worktree add ../.worktrees.microduck-cli/<name> -b <branch>
240
+ ```
241
+
242
+ Never `/tmp`, never a shared `../worktrees/`. This workspace holds many sibling
243
+ projects, and a generic shared folder accumulates orphaned trees from several repos
244
+ with nothing indicating ownership — a stale-tree sweep can't tell a live lane from
245
+ junk. Use a branch prefix scoped to the work (`duck/t2`, not plain `agent/t2`, which
246
+ collides with leftovers from earlier fan-outs and makes `git worktree add -b` fail).
247
+ Remove with `git worktree remove <path>`; `git worktree prune` only clears metadata.
248
+ The vendored `assign-to-workforce` skill's fan-out example uses the shared path *and*
249
+ `agent/<task-id>` branches — it is cited verbatim and must not be edited, so override
250
+ both when following it.
251
+
252
+ **Memory discipline — recall before, remember after.** This repo's eidetic memory is
253
+ **in-repo and public**: records resolve to `<repo-root>/.eidetic/memory` (committed,
254
+ shared with the team and mesh peers — the `claude` and `colleague` backends read the
255
+ same `microduck-cli` scope). Note the `/remember` and `/recall` skill *descriptions*
256
+ still claim a private `~/.eidetic` default; the vendored wrappers here default to
257
+ `--visibility public`, and the script is what runs.
258
+
259
+ - **`/recall` before you start** a non-trivial task — prior decisions, gotchas,
260
+ "have we done this before?" — so you build on what's known instead of re-deriving it.
261
+ - **`/remember` when something worth keeping surfaces** — a decision and its
262
+ rationale, a constraint, a fix and *why*, a gotcha that cost time. Capture it as it
263
+ happens.
264
+
265
+ Pass `--visibility private` to keep a record in `$HOME` (uncommitted); `/recall` reads
266
+ both stores and merges. In-repo routing needs `eidetic >= 0.10.0`. Don't store what the
267
+ repo already records (code structure, git history, this file, `CHANGELOG.md`) — store
268
+ what you'd have to re-derive.
269
+
270
+ **PR flow.** Branch (`fix/…`, `feat/…`, `docs/…`, `skill/…`), implement, bump the
271
+ version, then go straight to `workflow.sh open` — in AgentCulture the standing default
272
+ is always "push and create a Pull Request", no interactive merge/keep/discard menu.
273
+ Signatures resolve from `culture.yaml` via `devex`; don't hand-sign inside `cicd`.
@@ -0,0 +1,94 @@
1
+ Metadata-Version: 2.5
2
+ Name: microduck-cli
3
+ Version: 0.8.0
4
+ Summary: Agent-agnostic CLI for controlling the MicroDuck robot. Any agent, any human, one CLI. Built on the neurosymbolic-system runtime and following the reachy-mini-cli architecture.
5
+ Project-URL: Homepage, https://github.com/agentculture/microduck-cli
6
+ Project-URL: Issues, https://github.com/agentculture/microduck-cli/issues
7
+ Author: AgentCulture
8
+ License-Expression: Apache-2.0
9
+ License-File: LICENSE
10
+ Classifier: Development Status :: 3 - Alpha
11
+ Classifier: Intended Audience :: Developers
12
+ Classifier: License :: OSI Approved :: Apache Software License
13
+ Classifier: Programming Language :: Python :: 3.12
14
+ Classifier: Topic :: Software Development
15
+ Requires-Python: >=3.12
16
+ Description-Content-Type: text/markdown
17
+
18
+ # microduck-cli
19
+
20
+ Agent-agnostic CLI for controlling the MicroDuck robot. Any agent, any human,
21
+ one CLI. Built on the [neurosymbolic-system](https://github.com/agentculture/neurosymbolic-system)
22
+ runtime and following the
23
+ [reachy-mini-cli](https://github.com/agentculture/reachy-mini-cli) architecture.
24
+
25
+ ## Status: scaffold
26
+
27
+ **There is no MicroDuck control code yet.** What ships today is the
28
+ AgentCulture mesh-agent baseline — an agent-first introspection CLI, a mesh
29
+ identity, the vendored guildmaster skill kit, and a build/CI/deploy pipeline.
30
+ The duck domain is the destination; the CLI below is the chassis it grows on.
31
+
32
+ The `neurosymbolic-system` runtime it is meant to import (senses, rules,
33
+ arbitration and motion on one 50 Hz tick) is itself still a scaffold, so it is
34
+ **not** a dependency of this package yet.
35
+
36
+ ## What you get
37
+
38
+ - **An agent-first CLI** cited from [teken](https://github.com/agentculture/teken)
39
+ (`afi-cli`) — the runtime package has no third-party dependencies.
40
+ - **A mesh identity** — `culture.yaml` (`suffix` + `backend`) and the matching
41
+ prompt file (`AGENTS.colleague.md` for this agent's `backend: colleague`).
42
+ - **The vendored guildmaster skill kit** under `.claude/skills/`, cite-don't-import.
43
+ See [`docs/skill-sources.md`](docs/skill-sources.md).
44
+ - **A build + deploy baseline** — pytest, lint, the agent-first rubric gate, and
45
+ PyPI Trusted Publishing wired into GitHub Actions.
46
+
47
+ ## Quickstart
48
+
49
+ The installed console script is **`microduck`** (not `microduck-cli` — that is
50
+ the distribution name and the name the CLI prints in its own output):
51
+
52
+ ```bash
53
+ uv sync
54
+ uv run pytest -n auto # run the test suite
55
+ uv run microduck whoami # identity from culture.yaml
56
+ uv run microduck learn # self-teaching prompt (add --json)
57
+ uv run teken cli doctor . --strict # the agent-first rubric gate CI runs
58
+ ```
59
+
60
+ ## CLI
61
+
62
+ | Verb | What it does |
63
+ |------|--------------|
64
+ | `whoami` | Report this agent's nick, version, backend, and model from `culture.yaml`. |
65
+ | `learn` | Print a structured self-teaching prompt. |
66
+ | `explain <path>` | Markdown docs for any noun/verb path. |
67
+ | `overview` | Read-only descriptive snapshot of the agent. |
68
+ | `doctor` | Check the agent-identity invariants (prompt-file-present, backend-consistency). |
69
+ | `cli overview` | Describe the CLI surface itself. |
70
+
71
+ Every command supports `--json`. Results go to stdout, errors/diagnostics to
72
+ stderr (never mixed). Exit codes: `0` success, `1` user error, `2` environment
73
+ error, `3+` reserved.
74
+
75
+ ## Sibling projects
76
+
77
+ microduck-cli is built by composing three siblings rather than inventing a
78
+ fourth architecture:
79
+
80
+ | Repo | Role here |
81
+ |------|-----------|
82
+ | [`neurosymbolic-system`](https://github.com/agentculture/neurosymbolic-system) | The robot runtime to **import** once it ships — never re-implement the tick loop in this repo. |
83
+ | [`reachy-mini-cli`](https://github.com/agentculture/reachy-mini-cli) | The architecture to follow: noun groups, one tick seam for all senses, the single-SDK-owner model. |
84
+ | [`arm101-cli`](https://github.com/agentculture/arm101-cli) | The hardware-safety patterns: gated motion (`--apply` / dry-run / TTY confirm), release-on-abnormal-exit, hardware deps behind an extra. |
85
+
86
+ ## Contributing
87
+
88
+ See [`CLAUDE.md`](CLAUDE.md) for the full conventions: the CLI contracts, what
89
+ to take from each sibling, version-bump-every-PR, the `cicd` PR lane, worktree
90
+ layout, and memory discipline.
91
+
92
+ ## License
93
+
94
+ Apache 2.0 — see [`LICENSE`](LICENSE).
@@ -0,0 +1,77 @@
1
+ # microduck-cli
2
+
3
+ Agent-agnostic CLI for controlling the MicroDuck robot. Any agent, any human,
4
+ one CLI. Built on the [neurosymbolic-system](https://github.com/agentculture/neurosymbolic-system)
5
+ runtime and following the
6
+ [reachy-mini-cli](https://github.com/agentculture/reachy-mini-cli) architecture.
7
+
8
+ ## Status: scaffold
9
+
10
+ **There is no MicroDuck control code yet.** What ships today is the
11
+ AgentCulture mesh-agent baseline — an agent-first introspection CLI, a mesh
12
+ identity, the vendored guildmaster skill kit, and a build/CI/deploy pipeline.
13
+ The duck domain is the destination; the CLI below is the chassis it grows on.
14
+
15
+ The `neurosymbolic-system` runtime it is meant to import (senses, rules,
16
+ arbitration and motion on one 50 Hz tick) is itself still a scaffold, so it is
17
+ **not** a dependency of this package yet.
18
+
19
+ ## What you get
20
+
21
+ - **An agent-first CLI** cited from [teken](https://github.com/agentculture/teken)
22
+ (`afi-cli`) — the runtime package has no third-party dependencies.
23
+ - **A mesh identity** — `culture.yaml` (`suffix` + `backend`) and the matching
24
+ prompt file (`AGENTS.colleague.md` for this agent's `backend: colleague`).
25
+ - **The vendored guildmaster skill kit** under `.claude/skills/`, cite-don't-import.
26
+ See [`docs/skill-sources.md`](docs/skill-sources.md).
27
+ - **A build + deploy baseline** — pytest, lint, the agent-first rubric gate, and
28
+ PyPI Trusted Publishing wired into GitHub Actions.
29
+
30
+ ## Quickstart
31
+
32
+ The installed console script is **`microduck`** (not `microduck-cli` — that is
33
+ the distribution name and the name the CLI prints in its own output):
34
+
35
+ ```bash
36
+ uv sync
37
+ uv run pytest -n auto # run the test suite
38
+ uv run microduck whoami # identity from culture.yaml
39
+ uv run microduck learn # self-teaching prompt (add --json)
40
+ uv run teken cli doctor . --strict # the agent-first rubric gate CI runs
41
+ ```
42
+
43
+ ## CLI
44
+
45
+ | Verb | What it does |
46
+ |------|--------------|
47
+ | `whoami` | Report this agent's nick, version, backend, and model from `culture.yaml`. |
48
+ | `learn` | Print a structured self-teaching prompt. |
49
+ | `explain <path>` | Markdown docs for any noun/verb path. |
50
+ | `overview` | Read-only descriptive snapshot of the agent. |
51
+ | `doctor` | Check the agent-identity invariants (prompt-file-present, backend-consistency). |
52
+ | `cli overview` | Describe the CLI surface itself. |
53
+
54
+ Every command supports `--json`. Results go to stdout, errors/diagnostics to
55
+ stderr (never mixed). Exit codes: `0` success, `1` user error, `2` environment
56
+ error, `3+` reserved.
57
+
58
+ ## Sibling projects
59
+
60
+ microduck-cli is built by composing three siblings rather than inventing a
61
+ fourth architecture:
62
+
63
+ | Repo | Role here |
64
+ |------|-----------|
65
+ | [`neurosymbolic-system`](https://github.com/agentculture/neurosymbolic-system) | The robot runtime to **import** once it ships — never re-implement the tick loop in this repo. |
66
+ | [`reachy-mini-cli`](https://github.com/agentculture/reachy-mini-cli) | The architecture to follow: noun groups, one tick seam for all senses, the single-SDK-owner model. |
67
+ | [`arm101-cli`](https://github.com/agentculture/arm101-cli) | The hardware-safety patterns: gated motion (`--apply` / dry-run / TTY confirm), release-on-abnormal-exit, hardware deps behind an extra. |
68
+
69
+ ## Contributing
70
+
71
+ See [`CLAUDE.md`](CLAUDE.md) for the full conventions: the CLI contracts, what
72
+ to take from each sibling, version-bump-every-PR, the `cicd` PR lane, worktree
73
+ layout, and memory discipline.
74
+
75
+ ## License
76
+
77
+ Apache 2.0 — see [`LICENSE`](LICENSE).
@@ -31,7 +31,7 @@ is load-bearing, even where guildmaster's upstream copy omits it.
31
31
 
32
32
  | Skill | Upstream | Origin | Notes | Last synced |
33
33
  |-------|----------|--------|-------|-------------|
34
- | `cicd` | `../guildmaster/.claude/skills/cicd/` | guildmaster | CI/CD lane layered on `devex pr`: the 5 thin scripts (`workflow.sh`, `pr-status.sh`, `pr-reply.sh`, `_resolve-nick.sh`, `portability-lint.sh`) delegate lint/open/read/reply/delta to `devex` and add the `status` / `await` SonarCloud-gating extensions. Consumer-identifying prose (`guildmaster` → `microduck-cli`) adapted in the description + heading; upstream history (`Renamed from pr-review in steward 0.7.0; rebased on devex in 0.12.0`) and env-var literals (`STEWARD_*`) kept verbatim. The PR signature resolves at runtime from `culture.yaml` via `_resolve-nick.sh` (→ `microduck-cli`). Requires `devex` on PATH. | 2026-05-26 (guildmaster 0.6.0) |
34
+ | `cicd` | `../guildmaster/.claude/skills/cicd/` | guildmaster | CI/CD lane layered on `devex pr`: the 5 thin scripts (`workflow.sh`, `pr-status.sh`, `pr-reply.sh`, `_resolve-nick.sh`, `portability-lint.sh`) delegate lint/open/read/reply/delta to `devex` and add the `status` / `await` SonarCloud-gating extensions. Consumer-identifying prose (`guildmaster` → `microduck-cli`) adapted in the description + heading; upstream history (`Renamed from pr-review in steward 0.7.0; rebased on devex in 0.12.0`) and env-var literals (`STEWARD_*`) kept verbatim. The PR signature resolves at runtime from `culture.yaml` via `_resolve-nick.sh` (→ `microduck-cli`). Requires `devex` on PATH. **Prose divergence (2026-08-29):** the "Greenfield-aware steps", triage-defaults and mesh-ping paragraphs were adapted to this repo's actual stack — see [local divergence](#local-divergence--cicd-pre-pr-steps-adapted-to-this-repos-stack-2026-08-29). | 2026-05-26 (guildmaster 0.6.0) |
35
35
  | `communicate` | `../guildmaster/.claude/skills/communicate/` | guildmaster | Cross-repo + mesh communication. Consumer-identifying prose adapted in the description (incl. the `- microduck-cli (Claude)` signature line). **No hard-coded signature literal in the scripts** — `post-issue.sh` is `agtag`-backed and resolves the signing nick from `culture.yaml`; requires `agtag` (>=0.1) on PATH. The supplier `scripts/templates/` (`skill-update-brief.md`, `skill-new-brief.md`) are kept verbatim — inert for a consumer (they cite guildmaster as upstream). Renamed from `coordinate` in steward 0.8.0; absorbed `gh-issues` in 0.9.1. | 2026-05-26 (guildmaster 0.6.0) |
36
36
  | `version-bump` | `../guildmaster/.claude/skills/version-bump/` | guildmaster | Pure-Python, CWD-aware (`scripts/bump.py`). Verbatim except added `type: command`. | 2026-05-26 (guildmaster 0.6.0) |
37
37
  | `agent-config` | `../guildmaster/.claude/skills/agent-config/` | guildmaster (origin steward) | Shows a Culture agent's full config; run `scripts/show.sh` directly (no `guild` binary required). `scripts/show.sh` + `data/backend-fingerprints.yaml` verbatim. Verbatim except added `type: command`. | 2026-05-26 (guildmaster 0.6.0) |
@@ -174,6 +174,33 @@ wrapper (i.e. its copy goes back to matching devague byte-for-byte), switch
174
174
  the upstream column back to `../guildmaster/.claude/skills/<skill>/` and
175
175
  re-sync from there per the normal procedure.
176
176
 
177
+ ### Local divergence — `cicd` pre-PR steps adapted to this repo's stack (2026-08-29)
178
+
179
+ Guildmaster ships `cicd`'s `SKILL.md` with a **"Greenfield-aware steps"** section
180
+ whose pre-PR commands are conditional no-ops (`[ -d tests ] && …`), plus triage
181
+ defaults phrased for a greenfield supplier repo. microduck-cli's stack has
182
+ landed — tests, the lint stack, the rubric gate and the `version-check` job all
183
+ run — so those steps are unconditional here and the section is rewritten as
184
+ **"Pre-PR steps (microduck-cli)"**, listing the commands this repo's CI actually
185
+ enforces. Two smaller prose adaptations ride along: the triage defaults name this
186
+ repo's real false-positive class (scaffold complaints, and any proposal to grow a
187
+ second runtime loop in `microduck_cli/` instead of upstream in
188
+ `neurosymbolic-system`), and the closing mesh-ping paragraph names microduck-cli
189
+ rather than steward.
190
+
191
+ **No script bodies are edited** — the divergence is confined to `SKILL.md` prose,
192
+ which is the sanctioned adaptation surface. On a re-sync, pull guildmaster's copy
193
+ fresh and re-apply the three edits:
194
+
195
+ ```bash
196
+ diff -u ../guildmaster/.claude/skills/cicd/SKILL.md .claude/skills/cicd/SKILL.md
197
+ ```
198
+
199
+ If guildmaster's upstream ever grows a per-consumer pre-PR mechanism (the
200
+ `pr lint --extra=tests,version,markdown` ask filed at
201
+ [devex#41](https://github.com/agentculture/devex/issues/41)), drop this
202
+ divergence and delegate to it instead.
203
+
177
204
  ## Tooling prerequisites
178
205
 
179
206
  - **`devex`** (>=0.21) on PATH — `cicd` delegates the PR lifecycle to `devex pr`.
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "microduck-cli"
3
- version = "0.7.0"
3
+ version = "0.8.0"
4
4
  description = "Agent-agnostic CLI for controlling the MicroDuck robot. Any agent, any human, one CLI. Built on the neurosymbolic-system runtime and following the reachy-mini-cli architecture."
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 = "microduck-cli"
159
- version = "0.7.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 = "microduck-cli"
230
+ version = "0.8.0"
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 **microduck-cli** agent.
11
-
12
- ## Description
13
-
14
- Agent-agnostic CLI for controlling the MicroDuck robot. Any agent, any human, one CLI. Built on the neurosymbolic-system runtime and following the reachy-mini-cli architecture.
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`, `microduck-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,76 +0,0 @@
1
- Metadata-Version: 2.5
2
- Name: microduck-cli
3
- Version: 0.7.0
4
- Summary: Agent-agnostic CLI for controlling the MicroDuck robot. Any agent, any human, one CLI. Built on the neurosymbolic-system runtime and following the reachy-mini-cli architecture.
5
- Project-URL: Homepage, https://github.com/agentculture/microduck-cli
6
- Project-URL: Issues, https://github.com/agentculture/microduck-cli/issues
7
- Author: AgentCulture
8
- License-Expression: Apache-2.0
9
- License-File: LICENSE
10
- Classifier: Development Status :: 3 - Alpha
11
- Classifier: Intended Audience :: Developers
12
- Classifier: License :: OSI Approved :: Apache Software License
13
- Classifier: Programming Language :: Python :: 3.12
14
- Classifier: Topic :: Software Development
15
- Requires-Python: >=3.12
16
- Description-Content-Type: text/markdown
17
-
18
- # microduck-cli
19
-
20
- Agent-agnostic CLI for controlling the MicroDuck robot. Any agent, any human, one CLI. Built on the neurosymbolic-system runtime and following the reachy-mini-cli architecture.
21
-
22
- ## What you get
23
-
24
- - **An agent-first CLI** cited from [teken](https://github.com/agentculture/teken)
25
- (`afi-cli`) — the runtime package has no third-party dependencies.
26
- - **A mesh identity** — `culture.yaml` (`suffix` + `backend`) and the matching
27
- resident prompt file (`AGENTS.colleague.md`, since this template runs
28
- `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).
31
- - **A build + deploy baseline** — pytest, lint, the agent-first rubric gate, and
32
- PyPI Trusted Publishing wired into GitHub Actions.
33
-
34
- ## Quickstart
35
-
36
- ```bash
37
- uv sync
38
- uv run pytest -n auto # run the test suite
39
- uv run microduck-cli whoami # identity from culture.yaml
40
- uv run microduck-cli learn # self-teaching prompt (add --json)
41
- uv run teken cli doctor . --strict # the agent-first rubric gate CI runs
42
- ```
43
-
44
- ## CLI
45
-
46
- | Verb | What it does |
47
- |------|--------------|
48
- | `whoami` | Report this agent's nick, version, backend, and model from `culture.yaml`. |
49
- | `learn` | Print a structured self-teaching prompt. |
50
- | `explain <path>` | Markdown docs for any noun/verb path. |
51
- | `overview` | Read-only descriptive snapshot of the agent. |
52
- | `doctor` | Check the agent-identity invariants (prompt-file-present, backend-consistency). |
53
- | `cli overview` | Describe the CLI surface itself. |
54
-
55
- Every command supports `--json`. Results go to stdout, errors/diagnostics to
56
- stderr (never mixed). Exit codes: `0` success, `1` user error, `2` environment
57
- error, `3+` reserved.
58
-
59
- ## Make it your own
60
-
61
- 1. Rename the package `microduck_cli/` and the `microduck-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)).
70
-
71
- See [`CLAUDE.md`](CLAUDE.md) for the full conventions (version-bump-every-PR,
72
- the `cicd` PR lane, deploy setup).
73
-
74
- ## License
75
-
76
- Apache 2.0 — see [`LICENSE`](LICENSE).
@@ -1,59 +0,0 @@
1
- # microduck-cli
2
-
3
- Agent-agnostic CLI for controlling the MicroDuck robot. Any agent, any human, one CLI. Built on the neurosymbolic-system runtime and following the reachy-mini-cli architecture.
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 microduck-cli whoami # identity from culture.yaml
23
- uv run microduck-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 `microduck_cli/` and the `microduck-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
File without changes