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.
- {learn_cli-0.4.0 → learn_cli-0.4.1}/CHANGELOG.md +11 -0
- learn_cli-0.4.1/CLAUDE.md +253 -0
- {learn_cli-0.4.0 → learn_cli-0.4.1}/PKG-INFO +6 -5
- {learn_cli-0.4.0 → learn_cli-0.4.1}/README.md +5 -4
- {learn_cli-0.4.0 → learn_cli-0.4.1}/docs/skill-sources.md +13 -0
- {learn_cli-0.4.0 → learn_cli-0.4.1}/pyproject.toml +1 -1
- {learn_cli-0.4.0 → learn_cli-0.4.1}/uv.lock +1 -1
- learn_cli-0.4.0/CLAUDE.md +0 -28
- {learn_cli-0.4.0 → learn_cli-0.4.1}/.claude/skills/agent-config/SKILL.md +0 -0
- {learn_cli-0.4.0 → learn_cli-0.4.1}/.claude/skills/agent-config/data/backend-fingerprints.yaml +0 -0
- {learn_cli-0.4.0 → learn_cli-0.4.1}/.claude/skills/agent-config/scripts/show.sh +0 -0
- {learn_cli-0.4.0 → learn_cli-0.4.1}/.claude/skills/ask-colleague/SKILL.md +0 -0
- {learn_cli-0.4.0 → learn_cli-0.4.1}/.claude/skills/ask-colleague/prompts/explore.md +0 -0
- {learn_cli-0.4.0 → learn_cli-0.4.1}/.claude/skills/ask-colleague/prompts/review.md +0 -0
- {learn_cli-0.4.0 → learn_cli-0.4.1}/.claude/skills/ask-colleague/prompts/write.md +0 -0
- {learn_cli-0.4.0 → learn_cli-0.4.1}/.claude/skills/ask-colleague/scripts/ask-colleague.sh +0 -0
- {learn_cli-0.4.0 → learn_cli-0.4.1}/.claude/skills/assign-to-workforce/SKILL.md +0 -0
- {learn_cli-0.4.0 → learn_cli-0.4.1}/.claude/skills/assign-to-workforce/scripts/assign-to-workforce.sh +0 -0
- {learn_cli-0.4.0 → learn_cli-0.4.1}/.claude/skills/cicd/SKILL.md +0 -0
- {learn_cli-0.4.0 → learn_cli-0.4.1}/.claude/skills/cicd/scripts/_resolve-nick.sh +0 -0
- {learn_cli-0.4.0 → learn_cli-0.4.1}/.claude/skills/cicd/scripts/portability-lint.sh +0 -0
- {learn_cli-0.4.0 → learn_cli-0.4.1}/.claude/skills/cicd/scripts/pr-reply.sh +0 -0
- {learn_cli-0.4.0 → learn_cli-0.4.1}/.claude/skills/cicd/scripts/pr-status.sh +0 -0
- {learn_cli-0.4.0 → learn_cli-0.4.1}/.claude/skills/cicd/scripts/workflow.sh +0 -0
- {learn_cli-0.4.0 → learn_cli-0.4.1}/.claude/skills/communicate/SKILL.md +0 -0
- {learn_cli-0.4.0 → learn_cli-0.4.1}/.claude/skills/communicate/scripts/fetch-issues.sh +0 -0
- {learn_cli-0.4.0 → learn_cli-0.4.1}/.claude/skills/communicate/scripts/mesh-message.sh +0 -0
- {learn_cli-0.4.0 → learn_cli-0.4.1}/.claude/skills/communicate/scripts/post-comment.sh +0 -0
- {learn_cli-0.4.0 → learn_cli-0.4.1}/.claude/skills/communicate/scripts/post-issue.sh +0 -0
- {learn_cli-0.4.0 → learn_cli-0.4.1}/.claude/skills/communicate/scripts/templates/skill-new-brief.md +0 -0
- {learn_cli-0.4.0 → learn_cli-0.4.1}/.claude/skills/communicate/scripts/templates/skill-update-brief.md +0 -0
- {learn_cli-0.4.0 → learn_cli-0.4.1}/.claude/skills/doc-test-alignment/SKILL.md +0 -0
- {learn_cli-0.4.0 → learn_cli-0.4.1}/.claude/skills/doc-test-alignment/scripts/check.sh +0 -0
- {learn_cli-0.4.0 → learn_cli-0.4.1}/.claude/skills/pypi-maintainer/SKILL.md +0 -0
- {learn_cli-0.4.0 → learn_cli-0.4.1}/.claude/skills/pypi-maintainer/scripts/switch-source.sh +0 -0
- {learn_cli-0.4.0 → learn_cli-0.4.1}/.claude/skills/recall/SKILL.md +0 -0
- {learn_cli-0.4.0 → learn_cli-0.4.1}/.claude/skills/recall/scripts/recall.sh +0 -0
- {learn_cli-0.4.0 → learn_cli-0.4.1}/.claude/skills/remember/SKILL.md +0 -0
- {learn_cli-0.4.0 → learn_cli-0.4.1}/.claude/skills/remember/scripts/remember.sh +0 -0
- {learn_cli-0.4.0 → learn_cli-0.4.1}/.claude/skills/run-tests/SKILL.md +0 -0
- {learn_cli-0.4.0 → learn_cli-0.4.1}/.claude/skills/run-tests/scripts/test.sh +0 -0
- {learn_cli-0.4.0 → learn_cli-0.4.1}/.claude/skills/sonarclaude/SKILL.md +0 -0
- {learn_cli-0.4.0 → learn_cli-0.4.1}/.claude/skills/sonarclaude/scripts/sonar.sh +0 -0
- {learn_cli-0.4.0 → learn_cli-0.4.1}/.claude/skills/spec-to-plan/SKILL.md +0 -0
- {learn_cli-0.4.0 → learn_cli-0.4.1}/.claude/skills/spec-to-plan/scripts/spec-to-plan.sh +0 -0
- {learn_cli-0.4.0 → learn_cli-0.4.1}/.claude/skills/think/SKILL.md +0 -0
- {learn_cli-0.4.0 → learn_cli-0.4.1}/.claude/skills/think/scripts/think.sh +0 -0
- {learn_cli-0.4.0 → learn_cli-0.4.1}/.claude/skills/version-bump/SKILL.md +0 -0
- {learn_cli-0.4.0 → learn_cli-0.4.1}/.claude/skills/version-bump/scripts/bump.py +0 -0
- {learn_cli-0.4.0 → learn_cli-0.4.1}/.claude/skills.local.yaml.example +0 -0
- {learn_cli-0.4.0 → learn_cli-0.4.1}/.flake8 +0 -0
- {learn_cli-0.4.0 → learn_cli-0.4.1}/.github/workflows/publish.yml +0 -0
- {learn_cli-0.4.0 → learn_cli-0.4.1}/.github/workflows/tests.yml +0 -0
- {learn_cli-0.4.0 → learn_cli-0.4.1}/.gitignore +0 -0
- {learn_cli-0.4.0 → learn_cli-0.4.1}/.markdownlint-cli2.yaml +0 -0
- {learn_cli-0.4.0 → learn_cli-0.4.1}/AGENTS.colleague.md +0 -0
- {learn_cli-0.4.0 → learn_cli-0.4.1}/LICENSE +0 -0
- {learn_cli-0.4.0 → learn_cli-0.4.1}/culture.yaml +0 -0
- {learn_cli-0.4.0 → learn_cli-0.4.1}/learn/__init__.py +0 -0
- {learn_cli-0.4.0 → learn_cli-0.4.1}/learn/__main__.py +0 -0
- {learn_cli-0.4.0 → learn_cli-0.4.1}/learn/cli/__init__.py +0 -0
- {learn_cli-0.4.0 → learn_cli-0.4.1}/learn/cli/_commands/__init__.py +0 -0
- {learn_cli-0.4.0 → learn_cli-0.4.1}/learn/cli/_commands/cli.py +0 -0
- {learn_cli-0.4.0 → learn_cli-0.4.1}/learn/cli/_commands/doctor.py +0 -0
- {learn_cli-0.4.0 → learn_cli-0.4.1}/learn/cli/_commands/explain.py +0 -0
- {learn_cli-0.4.0 → learn_cli-0.4.1}/learn/cli/_commands/learn.py +0 -0
- {learn_cli-0.4.0 → learn_cli-0.4.1}/learn/cli/_commands/overview.py +0 -0
- {learn_cli-0.4.0 → learn_cli-0.4.1}/learn/cli/_commands/whoami.py +0 -0
- {learn_cli-0.4.0 → learn_cli-0.4.1}/learn/cli/_errors.py +0 -0
- {learn_cli-0.4.0 → learn_cli-0.4.1}/learn/cli/_output.py +0 -0
- {learn_cli-0.4.0 → learn_cli-0.4.1}/learn/explain/__init__.py +0 -0
- {learn_cli-0.4.0 → learn_cli-0.4.1}/learn/explain/catalog.py +0 -0
- {learn_cli-0.4.0 → learn_cli-0.4.1}/sonar-project.properties +0 -0
- {learn_cli-0.4.0 → learn_cli-0.4.1}/tests/__init__.py +0 -0
- {learn_cli-0.4.0 → learn_cli-0.4.1}/tests/test_cli.py +0 -0
- {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.
|
|
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
|
|
30
|
-
|
|
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
|
|
40
|
-
uv run learn
|
|
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
|
|
13
|
-
|
|
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
|
|
23
|
-
uv run learn
|
|
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.
|
|
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"
|
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
|
{learn_cli-0.4.0 → learn_cli-0.4.1}/.claude/skills/agent-config/data/backend-fingerprints.yaml
RENAMED
|
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
|
|
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
|
|
File without changes
|
|
File without changes
|
{learn_cli-0.4.0 → learn_cli-0.4.1}/.claude/skills/communicate/scripts/templates/skill-new-brief.md
RENAMED
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
File without changes
|
|
File without changes
|