canon-ai 3.7.0 → 3.9.0
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.
- package/CHANGELOG.md +22 -0
- package/README.md +39 -0
- package/dist/cli/index.js +878 -681
- package/dist/orchestrator/run-task.js +1058 -840
- package/package.json +1 -1
- package/templates/.canon/README.md +19 -2
- package/templates/.canon/templates/spec.md +2 -2
- package/templates/.claude/agents/spec-review-lens.md +1 -1
- package/templates/.claude/skills/canon-spec/SKILL.md +1 -0
- package/templates/.claude/skills/canon-spec-review/SKILL.md +1 -1
- package/templates/docs/pipeline-orchestrator.md +10 -10
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,28 @@
|
|
|
4
4
|
|
|
5
5
|
## [Unreleased]
|
|
6
6
|
|
|
7
|
+
## [3.9.0] — 2026-10-16
|
|
8
|
+
|
|
9
|
+
### Added
|
|
10
|
+
|
|
11
|
+
- **`.canon/config.json` sets which docs QA keeps fresh.** Under `docs_freshness`, map source-path globs to the docs QA must check when a task touches matching files (`paths`), list docs QA should report under "Docs drift" in `done.md` instead of editing (`flag_only`), or replace the default protected set (`protected`). The file is yours: `canon init` doesn't create it and `canon upgrade` never changes it. A malformed file stops every `canon run` form before it changes any state, and `canon doctor` reports the file's status. See "Configuring docs freshness" in the canon-ai README.
|
|
12
|
+
|
|
13
|
+
### Changed
|
|
14
|
+
|
|
15
|
+
- **QA's doc list and the QA commit allowlist now come from the same set.** QA's prompt names the protected docs plus any mapped docs whose globs match the task's changes. Previously the prompt named five docs while the allowlist admitted six.
|
|
16
|
+
- **`docs/pipeline-orchestrator.md` is no longer a default protected doc.** It is a canon-managed file in your repo, and `canon upgrade` overwrites it, so QA edits there didn't last.
|
|
17
|
+
|
|
18
|
+
### Fixed
|
|
19
|
+
|
|
20
|
+
- **`--ship` and the QA and human-review commits no longer split file names that contain ` -> `.** Only renamed or copied entries in git status are read as an `old -> new` pair.
|
|
21
|
+
- **File names with non-ASCII or special characters now match their real paths.** Git quotes such names in its status and diff output (for example `docs/😀.md`), and canon compared the quoted form. The QA-end and human-review commits could reject the file, implement's auto-commit checks could miss it, and `--ship` could overlook it as dirty. Canon now decodes the quoting first.
|
|
22
|
+
|
|
23
|
+
## [3.8.0] — 2026-10-07
|
|
24
|
+
|
|
25
|
+
### Changed
|
|
26
|
+
|
|
27
|
+
- **`/canon-spec-review`'s factual reviewer now runs on Haiku.** The reviewer that checks a spec's paths, symbols, and signatures against the code now runs on `haiku`. Its work is lookups, so the smaller model is enough and costs less. The shape and spec-quality reviewers still use your session's model. Run `canon upgrade`, then start a new Claude Code session to pick it up.
|
|
28
|
+
|
|
7
29
|
## [3.7.0] — 2026-10-06
|
|
8
30
|
|
|
9
31
|
### Added
|
package/README.md
CHANGED
|
@@ -304,6 +304,45 @@ diff .canon/templates/spec.md tasks/_templates/spec.md
|
|
|
304
304
|
|
|
305
305
|
See `.canon/README.md` for a quick reference.
|
|
306
306
|
|
|
307
|
+
### Configuring docs freshness
|
|
308
|
+
|
|
309
|
+
Create an adopter-owned `.canon/config.json` to tell QA which docs to keep current:
|
|
310
|
+
|
|
311
|
+
```json
|
|
312
|
+
{
|
|
313
|
+
"docs_freshness": {
|
|
314
|
+
"protected": ["docs/architecture.md", "docs/codebase-map.md"],
|
|
315
|
+
"paths": {
|
|
316
|
+
"api/**": ["docs/api-contract.md", "docs/environment-variables.md"],
|
|
317
|
+
"**": ["docs/ROADMAP.md", "AGENTS.md"]
|
|
318
|
+
},
|
|
319
|
+
"flag_only": ["AGENTS.md"]
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
```
|
|
323
|
+
|
|
324
|
+
`protected` **replaces** the defaults: architecture, codebase-map, patterns,
|
|
325
|
+
product-context, and decisions. Omit it to keep those defaults; use `[]` to clear
|
|
326
|
+
them. Add docs through `paths`, using `"**"` to check one on every task.
|
|
327
|
+
Globs support `**`, `*`, `?`, and `{a,b}`; wildcards match dotfiles and hidden
|
|
328
|
+
directories too. Brace alternatives must be one level and stay within a single
|
|
329
|
+
path segment; nested braces and alternatives containing slashes are unsupported.
|
|
330
|
+
Keys match file paths: use a glob such as `api/**` rather than a directory-only
|
|
331
|
+
key ending in a slash. QA scans mapped docs when the task's committed diff matches,
|
|
332
|
+
while every mapped doc stays eligible for QA commits across later review rounds.
|
|
333
|
+
|
|
334
|
+
`flag_only` removes docs from QA's edit permission. When selected by the protected
|
|
335
|
+
set or a matching mapping, QA reports stale statements in a **Docs drift** section
|
|
336
|
+
of the QA summary instead. An implementer may still edit a flag-only doc explicitly
|
|
337
|
+
listed in the spec's Affected Files.
|
|
338
|
+
|
|
339
|
+
`canon init` does not create this file and `canon upgrade` leaves it alone.
|
|
340
|
+
Commit the config before starting worktree-isolated tasks: each worktree reads its
|
|
341
|
+
branch's copy, so uncommitted main-checkout changes are not available there.
|
|
342
|
+
Malformed config stops runs, including reroute and ship, and fails the docs-freshness
|
|
343
|
+
check in `canon doctor`; unknown keys warn. Telemetry files and task-artifact paths
|
|
344
|
+
cannot be configured. Without a config, the default protected set applies.
|
|
345
|
+
|
|
307
346
|
## Architecture: two layers
|
|
308
347
|
|
|
309
348
|
Canon is two products:
|