learn-cli 0.4.0__tar.gz → 0.4.1__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 (76) hide show
  1. {learn_cli-0.4.0 → learn_cli-0.4.1}/CHANGELOG.md +11 -0
  2. learn_cli-0.4.1/CLAUDE.md +253 -0
  3. {learn_cli-0.4.0 → learn_cli-0.4.1}/PKG-INFO +6 -5
  4. {learn_cli-0.4.0 → learn_cli-0.4.1}/README.md +5 -4
  5. {learn_cli-0.4.0 → learn_cli-0.4.1}/docs/skill-sources.md +13 -0
  6. {learn_cli-0.4.0 → learn_cli-0.4.1}/pyproject.toml +1 -1
  7. {learn_cli-0.4.0 → learn_cli-0.4.1}/uv.lock +1 -1
  8. learn_cli-0.4.0/CLAUDE.md +0 -28
  9. {learn_cli-0.4.0 → learn_cli-0.4.1}/.claude/skills/agent-config/SKILL.md +0 -0
  10. {learn_cli-0.4.0 → learn_cli-0.4.1}/.claude/skills/agent-config/data/backend-fingerprints.yaml +0 -0
  11. {learn_cli-0.4.0 → learn_cli-0.4.1}/.claude/skills/agent-config/scripts/show.sh +0 -0
  12. {learn_cli-0.4.0 → learn_cli-0.4.1}/.claude/skills/ask-colleague/SKILL.md +0 -0
  13. {learn_cli-0.4.0 → learn_cli-0.4.1}/.claude/skills/ask-colleague/prompts/explore.md +0 -0
  14. {learn_cli-0.4.0 → learn_cli-0.4.1}/.claude/skills/ask-colleague/prompts/review.md +0 -0
  15. {learn_cli-0.4.0 → learn_cli-0.4.1}/.claude/skills/ask-colleague/prompts/write.md +0 -0
  16. {learn_cli-0.4.0 → learn_cli-0.4.1}/.claude/skills/ask-colleague/scripts/ask-colleague.sh +0 -0
  17. {learn_cli-0.4.0 → learn_cli-0.4.1}/.claude/skills/assign-to-workforce/SKILL.md +0 -0
  18. {learn_cli-0.4.0 → learn_cli-0.4.1}/.claude/skills/assign-to-workforce/scripts/assign-to-workforce.sh +0 -0
  19. {learn_cli-0.4.0 → learn_cli-0.4.1}/.claude/skills/cicd/SKILL.md +0 -0
  20. {learn_cli-0.4.0 → learn_cli-0.4.1}/.claude/skills/cicd/scripts/_resolve-nick.sh +0 -0
  21. {learn_cli-0.4.0 → learn_cli-0.4.1}/.claude/skills/cicd/scripts/portability-lint.sh +0 -0
  22. {learn_cli-0.4.0 → learn_cli-0.4.1}/.claude/skills/cicd/scripts/pr-reply.sh +0 -0
  23. {learn_cli-0.4.0 → learn_cli-0.4.1}/.claude/skills/cicd/scripts/pr-status.sh +0 -0
  24. {learn_cli-0.4.0 → learn_cli-0.4.1}/.claude/skills/cicd/scripts/workflow.sh +0 -0
  25. {learn_cli-0.4.0 → learn_cli-0.4.1}/.claude/skills/communicate/SKILL.md +0 -0
  26. {learn_cli-0.4.0 → learn_cli-0.4.1}/.claude/skills/communicate/scripts/fetch-issues.sh +0 -0
  27. {learn_cli-0.4.0 → learn_cli-0.4.1}/.claude/skills/communicate/scripts/mesh-message.sh +0 -0
  28. {learn_cli-0.4.0 → learn_cli-0.4.1}/.claude/skills/communicate/scripts/post-comment.sh +0 -0
  29. {learn_cli-0.4.0 → learn_cli-0.4.1}/.claude/skills/communicate/scripts/post-issue.sh +0 -0
  30. {learn_cli-0.4.0 → learn_cli-0.4.1}/.claude/skills/communicate/scripts/templates/skill-new-brief.md +0 -0
  31. {learn_cli-0.4.0 → learn_cli-0.4.1}/.claude/skills/communicate/scripts/templates/skill-update-brief.md +0 -0
  32. {learn_cli-0.4.0 → learn_cli-0.4.1}/.claude/skills/doc-test-alignment/SKILL.md +0 -0
  33. {learn_cli-0.4.0 → learn_cli-0.4.1}/.claude/skills/doc-test-alignment/scripts/check.sh +0 -0
  34. {learn_cli-0.4.0 → learn_cli-0.4.1}/.claude/skills/pypi-maintainer/SKILL.md +0 -0
  35. {learn_cli-0.4.0 → learn_cli-0.4.1}/.claude/skills/pypi-maintainer/scripts/switch-source.sh +0 -0
  36. {learn_cli-0.4.0 → learn_cli-0.4.1}/.claude/skills/recall/SKILL.md +0 -0
  37. {learn_cli-0.4.0 → learn_cli-0.4.1}/.claude/skills/recall/scripts/recall.sh +0 -0
  38. {learn_cli-0.4.0 → learn_cli-0.4.1}/.claude/skills/remember/SKILL.md +0 -0
  39. {learn_cli-0.4.0 → learn_cli-0.4.1}/.claude/skills/remember/scripts/remember.sh +0 -0
  40. {learn_cli-0.4.0 → learn_cli-0.4.1}/.claude/skills/run-tests/SKILL.md +0 -0
  41. {learn_cli-0.4.0 → learn_cli-0.4.1}/.claude/skills/run-tests/scripts/test.sh +0 -0
  42. {learn_cli-0.4.0 → learn_cli-0.4.1}/.claude/skills/sonarclaude/SKILL.md +0 -0
  43. {learn_cli-0.4.0 → learn_cli-0.4.1}/.claude/skills/sonarclaude/scripts/sonar.sh +0 -0
  44. {learn_cli-0.4.0 → learn_cli-0.4.1}/.claude/skills/spec-to-plan/SKILL.md +0 -0
  45. {learn_cli-0.4.0 → learn_cli-0.4.1}/.claude/skills/spec-to-plan/scripts/spec-to-plan.sh +0 -0
  46. {learn_cli-0.4.0 → learn_cli-0.4.1}/.claude/skills/think/SKILL.md +0 -0
  47. {learn_cli-0.4.0 → learn_cli-0.4.1}/.claude/skills/think/scripts/think.sh +0 -0
  48. {learn_cli-0.4.0 → learn_cli-0.4.1}/.claude/skills/version-bump/SKILL.md +0 -0
  49. {learn_cli-0.4.0 → learn_cli-0.4.1}/.claude/skills/version-bump/scripts/bump.py +0 -0
  50. {learn_cli-0.4.0 → learn_cli-0.4.1}/.claude/skills.local.yaml.example +0 -0
  51. {learn_cli-0.4.0 → learn_cli-0.4.1}/.flake8 +0 -0
  52. {learn_cli-0.4.0 → learn_cli-0.4.1}/.github/workflows/publish.yml +0 -0
  53. {learn_cli-0.4.0 → learn_cli-0.4.1}/.github/workflows/tests.yml +0 -0
  54. {learn_cli-0.4.0 → learn_cli-0.4.1}/.gitignore +0 -0
  55. {learn_cli-0.4.0 → learn_cli-0.4.1}/.markdownlint-cli2.yaml +0 -0
  56. {learn_cli-0.4.0 → learn_cli-0.4.1}/AGENTS.colleague.md +0 -0
  57. {learn_cli-0.4.0 → learn_cli-0.4.1}/LICENSE +0 -0
  58. {learn_cli-0.4.0 → learn_cli-0.4.1}/culture.yaml +0 -0
  59. {learn_cli-0.4.0 → learn_cli-0.4.1}/learn/__init__.py +0 -0
  60. {learn_cli-0.4.0 → learn_cli-0.4.1}/learn/__main__.py +0 -0
  61. {learn_cli-0.4.0 → learn_cli-0.4.1}/learn/cli/__init__.py +0 -0
  62. {learn_cli-0.4.0 → learn_cli-0.4.1}/learn/cli/_commands/__init__.py +0 -0
  63. {learn_cli-0.4.0 → learn_cli-0.4.1}/learn/cli/_commands/cli.py +0 -0
  64. {learn_cli-0.4.0 → learn_cli-0.4.1}/learn/cli/_commands/doctor.py +0 -0
  65. {learn_cli-0.4.0 → learn_cli-0.4.1}/learn/cli/_commands/explain.py +0 -0
  66. {learn_cli-0.4.0 → learn_cli-0.4.1}/learn/cli/_commands/learn.py +0 -0
  67. {learn_cli-0.4.0 → learn_cli-0.4.1}/learn/cli/_commands/overview.py +0 -0
  68. {learn_cli-0.4.0 → learn_cli-0.4.1}/learn/cli/_commands/whoami.py +0 -0
  69. {learn_cli-0.4.0 → learn_cli-0.4.1}/learn/cli/_errors.py +0 -0
  70. {learn_cli-0.4.0 → learn_cli-0.4.1}/learn/cli/_output.py +0 -0
  71. {learn_cli-0.4.0 → learn_cli-0.4.1}/learn/explain/__init__.py +0 -0
  72. {learn_cli-0.4.0 → learn_cli-0.4.1}/learn/explain/catalog.py +0 -0
  73. {learn_cli-0.4.0 → learn_cli-0.4.1}/sonar-project.properties +0 -0
  74. {learn_cli-0.4.0 → learn_cli-0.4.1}/tests/__init__.py +0 -0
  75. {learn_cli-0.4.0 → learn_cli-0.4.1}/tests/test_cli.py +0 -0
  76. {learn_cli-0.4.0 → learn_cli-0.4.1}/tests/test_cli_introspection.py +0 -0
@@ -5,6 +5,17 @@ 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.4.1] - 2026-07-10
9
+
10
+ ### Changed
11
+
12
+ - Expanded the `CLAUDE.md` bootstrap seed into a full runtime prompt (`/init`) tailored to learn-cli's role as the mesh **learning front** — the CLI/MCP/web portal that fronts french-cli, spanish-cli, and culture-guide. Captures the issue #1 build brief, the scaffold-vs-product distinction, the agent-first CLI architecture, and the web face target (`agentculture.org/learn/`, one sub-page per module — learn-cli owns the surface; the `agentculture.org` domain is managed by the sibling `org` repo, with the serving mechanism left as an open hosting decision).
13
+ - README: corrected the Quickstart invocations from `learn-cli` to the actual `learn` console script (`uv run learn-cli …` fails to spawn), and corrected the vendored-skill count from 11 to the 14 on disk, sourced across guildmaster, devague, colleague, and eidetic-cli.
14
+
15
+ ### Fixed
16
+
17
+ - docs/skill-sources.md: added the missing `remember` and `recall` ledger rows (first-party to eidetic-cli, vendored directly in 0.4.0) and the optional `eidetic`-on-PATH runtime prerequisite, so the ledger matches the on-disk kit.
18
+
8
19
  ## [0.4.0] - 2026-06-23
9
20
 
10
21
  ### Added
@@ -0,0 +1,253 @@
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 learn-cli is
6
+
7
+ learn-cli is the **learning front** for the AgentCulture mesh: one product with
8
+ three faces — a **CLI** (command `learn`), an **MCP server**, and a **web site**
9
+ (target: <https://agentculture.org/learn/>, one sub-page per module) — over a
10
+ single idea: *humans and agents learn a subject, step by step*.
11
+
12
+ It is **not a tutor itself**. It is the **portal that fronts per-subject tutor
13
+ CLIs** — each tutor stays its own sibling repo with its own progression logic,
14
+ and `learn` drives them as external runtimes behind one door, one profile, one
15
+ site. The relationship is "learn-cli is to its subject CLIs what
16
+ `league-of-agents-platform` is to the arena runtime — it hosts and unifies, it
17
+ does not reimplement." The first subjects:
18
+
19
+ - [`french-cli`](https://github.com/agentculture/french-cli) (command `french`)
20
+ and [`spanish-cli`](https://github.com/agentculture/spanish-cli) (`spanish`) —
21
+ language tutors. **Their verbs define the tutor UX learn-cli inherits; read
22
+ them before designing anything.** Both run `backend: colleague`.
23
+ - [`culture-guide`](https://github.com/agentculture/culture-guide) — the
24
+ non-language subject (learning to build and lead agent teams), the proof the
25
+ subject interface generalizes beyond languages.
26
+
27
+ The authoritative brief is [issue #1](https://github.com/agentculture/learn-cli/issues/1)
28
+ ("Build brief: learn"). Read it before doing product work.
29
+
30
+ ## Current state: scaffold, not product
31
+
32
+ **Almost none of the product above is built yet.** This repo was cloned from
33
+ [`culture-agent-template`](https://github.com/agentculture/culture-agent-template)
34
+ and today contains only the template's **agent-first CLI skeleton** (identity +
35
+ introspection verbs) plus the mesh baseline (CI, skills, deploy). The subject
36
+ registry, the MCP server, the web site, cross-subject learner profiles, and any
37
+ actual tutoring **do not exist**. When you read the code and its self-describing
38
+ strings still say *"a clonable template for AgentCulture mesh agents,"* that is
39
+ leftover template identity, not a description of the finished product — replacing
40
+ it with learn-cli's real identity is part of the build.
41
+
42
+ Suggested build order from the brief: read french/spanish end-to-end → `/think`
43
+ a spec for the **subject-plugin contract** (the central design; everything
44
+ composes on it) → build the three faces as **agentfront** surfaces, proven
45
+ consistent → cross-subject learner state → hosting + model-access wiring.
46
+
47
+ ## Commands
48
+
49
+ Python ≥3.12, managed with **uv**. The runtime package has **zero third-party
50
+ dependencies** (`dependencies = []`); all tooling lives in the `dev` group.
51
+
52
+ ```bash
53
+ uv sync # install deps + dev tools into .venv
54
+ uv run pytest -n auto # full suite (xdist parallel)
55
+ uv run pytest tests/test_cli.py::test_whoami_text # a single test
56
+ uv run pytest -n auto --cov=learn --cov-report=term # with coverage (CI fails <60%)
57
+ uv run learn whoami # run the CLI (see naming note below)
58
+ uv run teken cli doctor . --strict # the agent-first rubric gate CI enforces
59
+ ```
60
+
61
+ **CLI command-name split (important):** the installed console script is
62
+ `learn` (see `[project.scripts]` in `pyproject.toml`), but the argparse `prog`,
63
+ the PyPI dist name, and ~100 hard-coded strings all say `learn-cli`. So it is
64
+ `uv run learn whoami`, **not** `uv run learn-cli whoami` (the latter fails to
65
+ spawn — there is no `learn-cli` executable). The internal help still prints
66
+ `usage: learn-cli`; that cosmetic split is noted under scaffold drift below.
67
+
68
+ Lint/format (each must pass in CI; all are line-length 100):
69
+
70
+ ```bash
71
+ uv run black --check learn tests
72
+ uv run isort --check-only learn tests
73
+ uv run flake8 learn tests
74
+ uv run bandit -c pyproject.toml -r learn
75
+ markdownlint-cli2 "**/*.md" "#node_modules" "#.claude/skills"
76
+ ```
77
+
78
+ ## Architecture
79
+
80
+ ### The agent-first CLI (what exists today)
81
+
82
+ Everything lives under `learn/`. The CLI is a hand-rolled argparse tree built to
83
+ pass the **agent-first rubric** (`teken cli doctor --strict`, 7 bundles) — every
84
+ surface is machine-consumable.
85
+
86
+ - **`learn/cli/__init__.py`** — `main()` is the single entry point. `_build_parser()`
87
+ wires up global verbs and noun groups; `_dispatch()` invokes the selected
88
+ handler and translates exceptions to exit codes. `_CliArgumentParser` overrides
89
+ argparse's `.error()` so even parse-level failures (unknown verb, bad flag)
90
+ route through the structured error contract instead of argparse's default
91
+ `stderr`/exit-2. `--json` is peeked out of raw argv *before* parsing so those
92
+ early errors can still honour it.
93
+ - **`learn/cli/_commands/`** — one module per verb, each exposing a
94
+ **`register(sub)`** function that adds its subparser and sets `func=` +
95
+ `json=`. **To add a command: write the module, call its `register()` from
96
+ `_build_parser()`, and add an `explain` catalog entry (below).** Global verbs:
97
+ `whoami`, `learn`, `explain`, `overview`, `doctor`. Noun group: `cli` (with
98
+ `cli overview`).
99
+ - **`learn/cli/_errors.py`** — `CliError(code, message, remediation)` and the
100
+ exit-code constants. **Every failure raises `CliError`;** `_dispatch` wraps any
101
+ other exception into one, so no Python traceback ever reaches stderr.
102
+ - **`learn/cli/_output.py`** — the strict stream split: `emit_result` → stdout,
103
+ `emit_error`/`emit_diagnostic` → stderr, **never mixed**. JSON mode routes
104
+ structured payloads to the same streams. Text-mode errors render as
105
+ `error: …` + `hint: …` (the `hint:` prefix is required by the rubric).
106
+ - **`learn/explain/`** — `catalog.py` holds `ENTRIES`, a dict keyed by
107
+ command-path **tuple** → verbatim markdown; `resolve()` looks a path up or
108
+ raises `CliError`. `test_every_catalog_path_resolves` enforces that **every
109
+ registered path has an entry**, so new commands need a catalog entry or the
110
+ suite breaks.
111
+
112
+ **Output/exit-code contract** (documented in `learn learn`, echoed everywhere):
113
+ `--json` on every command; exit `0` success, `1` user error, `2` environment
114
+ error, `3+` reserved.
115
+
116
+ **Rubric constraints to preserve when editing** (these will fail `teken cli
117
+ doctor --strict` if broken): the `learn` verb's text must be ≥200 chars and
118
+ mention purpose, command map, exit codes, `--json`, and `explain`; any noun with
119
+ action-verbs must also expose `overview` (this is the sole reason the `cli` noun
120
+ and its `cli overview` exist); descriptive verbs like `overview` must never hard-fail
121
+ on a bogus target path (they accept-and-ignore it and exit 0); `doctor` must emit
122
+ `{healthy, checks:[{id, passed, severity, message, remediation}]}`.
123
+
124
+ ### `doctor` and the mesh identity invariants
125
+
126
+ `learn doctor` mirrors what `steward doctor` checks for a mesh agent, reading
127
+ `culture.yaml` with a dependency-free parser:
128
+
129
+ - **prompt-file-present / backend-consistency** — the declared `backend` must
130
+ have its matching prompt file on disk: `claude`→`CLAUDE.md`,
131
+ **`colleague`→`AGENTS.colleague.md`**, `acp`→`AGENTS.md`, `gemini`→`GEMINI.md`.
132
+ - **skills-present** — the vendored `.claude/skills/` kit exists.
133
+
134
+ This repo runs **`backend: colleague`** (a served Qwen model — see
135
+ `culture.yaml`), so the mesh-resident prompt is **`AGENTS.colleague.md`**, and
136
+ `CLAUDE.md` (this file) is what Claude Code reads when you work here. Keep
137
+ `culture.yaml`, the prompt files, and `doctor`'s backend map in agreement — a
138
+ mismatch fails the invariant. `test_doctor_recognizes_declared_backend` guards
139
+ against changing the backend without teaching `doctor` the new prompt file.
140
+
141
+ ### The intended architecture (issue #1) — three faces from one registry
142
+
143
+ When you build the real product, the load-bearing decisions are already made in
144
+ the brief — follow them rather than re-deciding:
145
+
146
+ - **Derive all three faces from one registry via
147
+ [`agentfront`](https://github.com/agentculture/agentfront)** (formerly
148
+ `teken`/`afi-cli`; `teken` is still the dev-dep/CLI name today). Declare docs
149
+ and tools once; agentfront emits the CLI, the MCP server, and the HTTP site
150
+ (markdown pages + sitemap) so the human page, the agent's MCP tool, and the
151
+ `--json` answer can't drift. Build *through* agentfront, don't hand-roll three
152
+ renderers.
153
+ - **The subject-plugin contract is the central design.** Define what a subject
154
+ CLI must satisfy (progress, overview, advice, lesson/story content, practice)
155
+ so adding a third subject is a registration, not a fork. french/spanish are the
156
+ first entries; culture-guide proves it isn't language-specific.
157
+ - **One learner, many subjects** — a single profile/login spanning subjects, with
158
+ cross-subject progress and "what next" that the per-subject tutors track only
159
+ within themselves.
160
+ - **The web face** — learn-cli **owns** this surface: its lesson/story/exercise
161
+ content and the subject CLIs as the engines behind it, served at
162
+ `agentculture.org/learn/` with **a sub-page per module** (a learner reads a
163
+ story, does an exercise, sees their streak). The *domain* `agentculture.org` is
164
+ managed by the sibling [`org`](https://github.com/agentculture/org) repo
165
+ (`../org` — a CLI + Astro `site-astro/` in one repo), so the `/learn/` route and
166
+ pages must be **coordinated with org**, and org is the repo shape to match (a
167
+ CLI plus site in one repo). *How* learn-cli's surface is served behind that
168
+ route — static pages published through org's Astro build vs. a service
169
+ learn-cli runs — is part of the **still-open hosting decision** below; per the
170
+ brief, whichever target is chosen must be recorded with a *cost-when-busy* note.
171
+ - **Don't hand-roll infra a sibling already owns** (all flagged as open decisions
172
+ in the brief): model calls go through
173
+ [`cloudai-cli`](https://github.com/agentculture/cloudai-cli) or
174
+ [`ec2bedrock-cli`](https://github.com/agentculture/ec2bedrock-cli); learner
175
+ state that outgrows flat files goes to
176
+ [`eidetic-cli`](https://github.com/agentculture/eidetic-cli) or
177
+ [`data-refinery-cli`](https://github.com/agentculture/data-refinery-cli);
178
+ hosting precedents (CLI + site in one repo) are `league-of-agents-platform`,
179
+ [`org`](https://github.com/agentculture/org), and
180
+ [`culture-tools`](https://github.com/agentculture/culture-tools).
181
+
182
+ ## Conventions CI enforces
183
+
184
+ Three workflows gate `main` (`.github/workflows/tests.yml`, `publish.yml`):
185
+
186
+ - **Bump the version on every PR.** `publish.yml` publishes to PyPI on *every*
187
+ push to `main` (Trusted Publishing is already registered — `learn-cli 0.4.0`
188
+ is live), so a stale version means a failed publish. The `version-check` job
189
+ fails the PR if `pyproject.toml`'s version equals `main`'s. Use the
190
+ **`version-bump`** skill (`major|minor|patch`) — it updates `pyproject.toml`
191
+ and prepends a Keep-a-Changelog entry to `CHANGELOG.md`. This applies even to
192
+ docs/config/CI-only PRs. (`__version__` is read from installed package
193
+ metadata via `importlib.metadata`, so there is no separate `__init__.py`
194
+ version to keep in sync.)
195
+ - **The lint job** runs black, isort, flake8, bandit, markdownlint-cli2, **and
196
+ the rubric gate** (`teken cli doctor . --strict`) — the last will block any
197
+ change that breaks the agent-first contract.
198
+ - **SonarCloud quality gate** (`sonar.qualitygate.wait=true`, project key
199
+ `agentculture_learn-cli`) fails the `test` job on a red gate when `SONAR_TOKEN`
200
+ is set; token-less/fork PRs skip it and stay green. Coverage floor is 60%
201
+ (`tool.coverage.report.fail_under`).
202
+
203
+ **PR lifecycle:** use the **`cicd`** skill (layered on `devex pr`) to open PRs,
204
+ poll CI, and address review threads; it adds `status` (Sonar gate + hotspots +
205
+ unresolved-thread tally) and `await` (blocks until CI settles, non-zero on a
206
+ Sonar ERROR or unresolved threads). See the `sonarclaude` skill for direct
207
+ quality queries.
208
+
209
+ ## Vendored skills (cite-don't-import)
210
+
211
+ `.claude/skills/` holds the guildmaster skill kit, **vendored verbatim, not
212
+ installed as a dependency** — each consumer owns its copy.
213
+ [`docs/skill-sources.md`](docs/skill-sources.md) is the provenance ledger and
214
+ the re-sync procedure; consult it before editing a vendored skill. Notes:
215
+
216
+ - Every `SKILL.md` must carry `type: command` in its frontmatter — it's
217
+ load-bearing (the culture backend's `core.skill_loader` silently skips skills
218
+ without it), even where guildmaster's upstream copy omits it.
219
+ - Most skills come from guildmaster; `think`/`spec-to-plan`/`assign-to-workforce`
220
+ originate in `devague` (re-broadcast via guildmaster); `ask-colleague` is
221
+ vendored **directly from `colleague`** (a tracked divergence until guildmaster
222
+ re-broadcasts the rename). The `agex`→`devex` rename is another tracked
223
+ in-place patch. Both divergences are documented in the ledger.
224
+ - **Don't reformat vendored skills** — markdownlint and Sonar both exclude
225
+ `.claude/skills/**` for this reason.
226
+
227
+ ## Known scaffold drift (fair game to fix)
228
+
229
+ These are leftovers from the template clone, worth correcting as you build:
230
+
231
+ - **Self-description strings** in `learn/cli/_commands/learn.py`,
232
+ `learn/explain/catalog.py`, `README.md` ("Make it your own"), and
233
+ `overview.py` still call this "a clonable template" and reference a rename
234
+ procedure — that identity is the template's, not learn-cli's. Replacing it with
235
+ learn-cli's real product identity is part of the build.
236
+ - **The `prog` name still prints `learn-cli`** — the argparse `prog` and ~100
237
+ internal strings use the PyPI dist name even though the invoked command is
238
+ `learn`. Cosmetic; fold into the product-identity pass rather than churning
239
+ ~100 strings (and the tests that assert `usage: learn-cli`) piecemeal. The
240
+ product/mesh name `learn-cli` (culture.yaml `suffix`, the `# learn-cli` doc
241
+ headings) is correct and stays.
242
+
243
+ Already reconciled (was drift, now fixed): the README invocations use `learn`,
244
+ and the skill count (README + `docs/skill-sources.md`) matches the 14 skills on
245
+ disk.
246
+
247
+ ## Signing posts
248
+
249
+ When posting on GitHub/Slack on the user's behalf: the `cicd`/`communicate`
250
+ scripts auto-append the signature (`- learn-cli (Claude)`, resolved from
251
+ `culture.yaml`) — don't sign the body manually. For a manual `gh` post the
252
+ scripts don't author, sign explicitly as `- learn-cli (Claude)`. Mesh messages
253
+ are unsigned (the IRC nick is the speaker).
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: learn-cli
3
- Version: 0.4.0
3
+ Version: 0.4.1
4
4
  Summary: A CLI, MCP server, and web front for learning — a hosted site where humans and agents learn a subject step by step. Fronts the french-cli and spanish-cli language tutors, and generalizes to other learnable domains such as leading teams of agents. The learn command is the local operator surface and how agents drive it.
5
5
  Project-URL: Homepage, https://github.com/agentculture/learn-cli
6
6
  Project-URL: Issues, https://github.com/agentculture/learn-cli/issues
@@ -26,8 +26,9 @@ A CLI, MCP server, and web front for learning — a hosted site where humans and
26
26
  - **A mesh identity** — `culture.yaml` (`suffix` + `backend`) and the matching
27
27
  resident prompt file (`AGENTS.colleague.md`, since this template runs
28
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).
29
+ - **The vendored skill kit** (14 skills) under `.claude/skills/`, cited
30
+ cite-don't-import from guildmaster, devague, colleague, and eidetic-cli. See
31
+ [`docs/skill-sources.md`](docs/skill-sources.md) for per-skill provenance.
31
32
  - **A build + deploy baseline** — pytest, lint, the agent-first rubric gate, and
32
33
  PyPI Trusted Publishing wired into GitHub Actions.
33
34
 
@@ -36,8 +37,8 @@ A CLI, MCP server, and web front for learning — a hosted site where humans and
36
37
  ```bash
37
38
  uv sync
38
39
  uv run pytest -n auto # run the test suite
39
- uv run learn-cli whoami # identity from culture.yaml
40
- uv run learn-cli learn # self-teaching prompt (add --json)
40
+ uv run learn whoami # identity from culture.yaml (command is `learn`)
41
+ uv run learn learn # self-teaching prompt (add --json)
41
42
  uv run teken cli doctor . --strict # the agent-first rubric gate CI runs
42
43
  ```
43
44
 
@@ -9,8 +9,9 @@ A CLI, MCP server, and web front for learning — a hosted site where humans and
9
9
  - **A mesh identity** — `culture.yaml` (`suffix` + `backend`) and the matching
10
10
  resident prompt file (`AGENTS.colleague.md`, since this template runs
11
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).
12
+ - **The vendored skill kit** (14 skills) under `.claude/skills/`, cited
13
+ cite-don't-import from guildmaster, devague, colleague, and eidetic-cli. See
14
+ [`docs/skill-sources.md`](docs/skill-sources.md) for per-skill provenance.
14
15
  - **A build + deploy baseline** — pytest, lint, the agent-first rubric gate, and
15
16
  PyPI Trusted Publishing wired into GitHub Actions.
16
17
 
@@ -19,8 +20,8 @@ A CLI, MCP server, and web front for learning — a hosted site where humans and
19
20
  ```bash
20
21
  uv sync
21
22
  uv run pytest -n auto # run the test suite
22
- uv run learn-cli whoami # identity from culture.yaml
23
- uv run learn-cli learn # self-teaching prompt (add --json)
23
+ uv run learn whoami # identity from culture.yaml (command is `learn`)
24
+ uv run learn learn # self-teaching prompt (add --json)
24
25
  uv run teken cli doctor . --strict # the agent-first rubric gate CI runs
25
26
  ```
26
27
 
@@ -15,6 +15,12 @@ renamed `convertible`. guildmaster's re-broadcast still carries the old
15
15
  `outsource` name, so `ask-colleague` is vendored **directly from colleague** as a
16
16
  tracked local divergence (see [below](#local-divergence--outsource--ask-colleague-2026-06-06)).
17
17
 
18
+ Two skills, `remember` and `recall`, are **first-party to
19
+ [`agentculture/eidetic-cli`](https://github.com/agentculture/eidetic-cli)** — the
20
+ write and read halves of eidetic's shared `~/.eidetic/memory` surface — and are
21
+ vendored **directly from eidetic-cli** (added in learn-cli 0.4.0), not through
22
+ guildmaster.
23
+
18
24
  Every vendored `SKILL.md` carries `type: command`. learn-cli
19
25
  declares a culture agent (`culture.yaml`, `backend: colleague`), and
20
26
  `core.skill_loader` silently skips any `SKILL.md` lacking `type:` — so the field
@@ -34,6 +40,8 @@ is load-bearing, even where guildmaster's upstream copy omits it.
34
40
  | `spec-to-plan` | `../guildmaster/.claude/skills/spec-to-plan/` | **devague** (re-broadcast via guildmaster) | spec→plan leg of the devague workflow chain. Verbatim (already carried `type: command`). | 2026-05-26 (guildmaster 0.6.0) |
35
41
  | `assign-to-workforce` | `../guildmaster/.claude/skills/assign-to-workforce/` | **devague** (re-broadcast via guildmaster) | plan→parallel-implementation leg of the devague workflow chain. Verbatim (already carried `type: command`). | 2026-05-26 (guildmaster 0.6.0) |
36
42
  | `ask-colleague` | `../colleague/.claude/skills/ask-colleague/` | **colleague** (renamed from convertible; vendored directly — guildmaster re-broadcast pending) | The first-party front door to the `colleague` CLI: hand a scoped task to a *different* engine/mind via `explore` / `review` / `write`, grade a finished work item via `feedback` (the ROI loop), and reap stale/corrupt `colleague/*` branches a crashed run left behind via `clean`. Every verb takes `--json` (result JSON on stdout, diagnostics on stderr). `explore`/`review` run isolated in a throwaway `git worktree`; `write` **previews by default** (throwaway worktree, no side effects) and refuses a dirty tree only when applying (`--apply` / `--pr`). Verbatim except one consumer-identifying clause in the Provenance paragraph (`colleague vendors from guildmaster` → `learn-cli vendors from guildmaster`); already carried `type: command`. Optional runtime dep: **`colleague`** on PATH. | 2026-06-12 (colleague 1.7.0, direct) |
43
+ | `remember` | `../eidetic-cli/.claude/skills/remember/` | **eidetic-cli** (first-party; vendored directly) | Write half of the shared `~/.eidetic/memory` surface. Drives `eidetic remember` — idempotent upsert of one JSON record (or an NDJSON batch on stdin), dedup by id + content hash. The `.sh` wrapper is byte-verbatim from eidetic-cli; `SKILL.md` localized only in the illustrative `--scope <nick>` examples (Provenance keeps "First-party to eidetic-cli"). Defaults to this agent's PRIVATE scope, suffix read from `culture.yaml`. Runtime dep: the `eidetic` CLI on PATH. Propagated by rollout-cli's `eidetic-memory` recipe. | 2026-06-23 (eidetic-cli, direct) |
44
+ | `recall` | `../eidetic-cli/.claude/skills/recall/` | **eidetic-cli** (first-party; vendored directly) | Read half of the same surface. Drives `eidetic recall` with four search modes — exact / approximate / keyword / hybrid — each hit carrying text, full provenance metadata, a relevance score, and a freshness signal. Same vendoring, PRIVATE-scope default, and `eidetic`-on-PATH runtime dep as `remember`. | 2026-06-23 (eidetic-cli, direct) |
37
45
 
38
46
  ## Re-sync procedure
39
47
 
@@ -120,3 +128,8 @@ devex / agtag READMEs).
120
128
  reachable backend — a local vLLM by default, overridable via `--engine` /
121
129
  `--model` / `--base-url` or `COLLEAGUE_*` env (the legacy `CONVERTIBLE_*` names
122
130
  still work as a deprecated fallback).
131
+
132
+ - **`eidetic`** on PATH — *optional*; only the `remember` / `recall` skills need
133
+ it, and only when invoked (`uv tool install eidetic-cli`, or a local
134
+ eidetic-cli checkout run via `uv`). Both wrappers exit with a clear install
135
+ hint if it is absent, so a clone that never uses memory is unaffected.
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "learn-cli"
3
- version = "0.4.0"
3
+ version = "0.4.1"
4
4
  description = "A CLI, MCP server, and web front for learning — a hosted site where humans and agents learn a subject step by step. Fronts the french-cli and spanish-cli language tutors, and generalizes to other learnable domains such as leading teams of agents. The learn command is the local operator surface and how agents drive it."
5
5
  readme = "README.md"
6
6
  license = "Apache-2.0"
@@ -197,7 +197,7 @@ wheels = [
197
197
 
198
198
  [[package]]
199
199
  name = "learn-cli"
200
- version = "0.4.0"
200
+ version = "0.4.1"
201
201
  source = { editable = "." }
202
202
 
203
203
  [package.dev-dependencies]
learn_cli-0.4.0/CLAUDE.md DELETED
@@ -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 **learn-cli** agent.
11
-
12
- ## Description
13
-
14
- A CLI, MCP server, and web front for learning — a hosted site where humans and agents learn a subject step by step. Fronts the french-cli and spanish-cli language tutors, and generalizes to other learnable domains such as leading teams of agents. The learn command is the local operator surface and how agents drive it.
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`, `learn-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.
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes