diff --git a/CHANGELOG.md b/CHANGELOG.md index 149739f..d083621 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Changelog -## Unreleased +## 2.2.0, 2026-10-03 - Misconception diagnosis for arithmetic practice. A wrong answer to a whole-number or fraction-addition prompt walks a fixed tree of yes-or-no questions and gets a cause, such as `misrecruited.no_carry` or `slip.one_digit`. `tutor misconceptions` and `learn_tutor_misconceptions` now count causes per objective in a `diagnoses` field. The diagnosis never shows the correct answer. On 50 held-out teacher-labelled answers it agreed with the teacher on 96%; details in `docs/MISCONCEPTION-DIAGNOSIS.md`. diff --git a/README.md b/README.md index fb79806..b6809ac 100644 --- a/README.md +++ b/README.md @@ -71,11 +71,11 @@ yours. Zero external dependencies, Node 20 or newer. ## Install ```bash -npm install -g @harperz9/learn@2.0.0 +npm install -g @harperz9/learn@2.2.0 learn status ``` -Or run it without installing: `npx -y @harperz9/learn@2.0.0 status`. From a clone: +Or run it without installing: `npx -y @harperz9/learn@2.2.0 status`. From a clone: ```bash git clone https://github.com/HarperZ9/learn.git @@ -199,7 +199,7 @@ just that something was. ## MCP server ```bash -npx -y @harperz9/learn@2.0.0 mcp # or `learn mcp`, or the `learn-mcp` bin +npx -y @harperz9/learn@2.2.0 mcp # or `learn mcp`, or the `learn-mcp` bin ``` Serves fifteen tools over stdio JSON-RPC: `learn_doctor`, `learn_status`, `learn_verify`, @@ -215,7 +215,7 @@ file. The MCP surface never performs a real course action or answers a graded st ## Status -- **Release:** `2.1.0` candidate (unpublished); published baseline `2.0.0`; commands `learn` and `learn-mcp`; Node >= 20; zero external dependencies +- **Release:** `2.2.0` on npm as `@harperz9/learn`; commands `learn` and `learn-mcp`; Node >= 20; zero external dependencies (ES modules, `node:test`). - **CLI surface:** `learn status`, `learn doctor`, `learn mcp`, `learn run/resume/verify/receipt`, `learn assist`, `learn visualize`, and `learn tutor readFileSync(join(ROOT, rel), "utf8"); function changelogSection(text, version) { const lines = text.split(/\r?\n/); - const start = lines.findIndex((l) => l.trim() === `## ${version}`); + // A heading may carry a date after the version: "## 2.2.0" or "## 2.2.0, 2026-10-03". + const heading = new RegExp(`^## ${version.replace(/\./g, "\\.")}(?:[ ,(]|$)`); + const start = lines.findIndex((l) => heading.test(l.trim())); if (start < 0) return null; let end = lines.findIndex((l, i) => i > start && l.startsWith("## ")); if (end < 0) end = lines.length; diff --git a/src/index.mjs b/src/index.mjs index 042a31b..6d02069 100644 --- a/src/index.mjs +++ b/src/index.mjs @@ -1 +1 @@ -export const version = "2.1.0"; +export const version = "2.2.0"; diff --git a/tests/aid-status-doctor.test.mjs b/tests/aid-status-doctor.test.mjs index 8e8675d..28bb70f 100644 --- a/tests/aid-status-doctor.test.mjs +++ b/tests/aid-status-doctor.test.mjs @@ -4,8 +4,8 @@ import { doctor } from "../src/doctor.mjs"; import { status } from "../src/status.mjs"; import { version } from "../src/index.mjs"; -test("version is bumped to 2.1.0", () => { - assert.equal(version, "2.1.0"); +test("version is bumped to 2.2.0", () => { + assert.equal(version, "2.2.0"); }); test("status advertises the telos render bridge and the aid invariant", () => { diff --git a/tests/learn-study-status-doctor.test.mjs b/tests/learn-study-status-doctor.test.mjs index c476844..a3472bd 100644 --- a/tests/learn-study-status-doctor.test.mjs +++ b/tests/learn-study-status-doctor.test.mjs @@ -4,8 +4,8 @@ import { doctor } from "../src/doctor.mjs"; import { status } from "../src/status.mjs"; import { version } from "../src/index.mjs"; -test("version is bumped to 2.1.0", () => { - assert.equal(version, "2.1.0"); +test("version is bumped to 2.2.0", () => { + assert.equal(version, "2.2.0"); }); test("status describes the learning loop (schedule/misconception/retrieval/explain/predict/map/study) under a dedicated field", () => {