canon-ai 3.1.1 → 3.1.2
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
CHANGED
|
@@ -4,6 +4,12 @@
|
|
|
4
4
|
|
|
5
5
|
## [Unreleased]
|
|
6
6
|
|
|
7
|
+
## [3.1.2] — 2026-09-08
|
|
8
|
+
|
|
9
|
+
### Fixed
|
|
10
|
+
|
|
11
|
+
- **`canon-inline-review` no longer misreads Codex's review output.** The skill now captures Codex's final response directly instead of scanning its full execution transcript, and treats a missing or empty result as a failed review rather than silently reporting "no issues found."
|
|
12
|
+
|
|
7
13
|
## [3.1.1] — 2026-09-07
|
|
8
14
|
|
|
9
15
|
### Fixed
|
package/dist/cli/index.js
CHANGED
|
@@ -1245,7 +1245,7 @@ function checkTemplates(cwd) {
|
|
|
1245
1245
|
}
|
|
1246
1246
|
function checkCanonVersion(cwd) {
|
|
1247
1247
|
const versionPath = join(cwd, ".canon", "version");
|
|
1248
|
-
const installedVersion = "3.1.
|
|
1248
|
+
const installedVersion = "3.1.2";
|
|
1249
1249
|
if (!existsSync(versionPath)) {
|
|
1250
1250
|
return { label: ".canon/version", status: "warn", detail: "missing \u2014 run `canon upgrade`" };
|
|
1251
1251
|
}
|
|
@@ -1742,7 +1742,7 @@ function initCmd(_args) {
|
|
|
1742
1742
|
}
|
|
1743
1743
|
function writeCanonVersion(cwd) {
|
|
1744
1744
|
const versionPath = join2(cwd, ".canon", "version");
|
|
1745
|
-
const version = "3.1.
|
|
1745
|
+
const version = "3.1.2";
|
|
1746
1746
|
mkdirSync(dirname2(versionPath), { recursive: true });
|
|
1747
1747
|
writeFileSync(versionPath, version + "\n");
|
|
1748
1748
|
}
|
|
@@ -2751,7 +2751,7 @@ function isInstalledSourcePath(sourcePath) {
|
|
|
2751
2751
|
return sourcePath.includes("/node_modules/") || sourcePath.includes("\\node_modules\\") || sourcePath.includes("/_npx/") || sourcePath.includes("\\_npx\\");
|
|
2752
2752
|
}
|
|
2753
2753
|
function resolveCanonVersion(explicit) {
|
|
2754
|
-
return explicit ?? "3.1.
|
|
2754
|
+
return explicit ?? "3.1.2" ?? "dev";
|
|
2755
2755
|
}
|
|
2756
2756
|
function resolveOrchestratorCommit(repoRoot, upstreamCommit, runGitAt) {
|
|
2757
2757
|
const ownToplevel = captureGitOutput(repoRoot, ["rev-parse", "--show-toplevel"], runGitAt);
|
|
@@ -4877,7 +4877,7 @@ function currentPinFromManifest(manifest) {
|
|
|
4877
4877
|
return "unknown";
|
|
4878
4878
|
}
|
|
4879
4879
|
function bakedVersion() {
|
|
4880
|
-
return "3.1.
|
|
4880
|
+
return "3.1.2";
|
|
4881
4881
|
}
|
|
4882
4882
|
function ownPackageName(pkgDir) {
|
|
4883
4883
|
try {
|
|
@@ -5351,7 +5351,7 @@ function runUpgrade(cwd, pkgDir, options = {}) {
|
|
|
5351
5351
|
cutoverWarnings.push(docsRefsCheckRel);
|
|
5352
5352
|
}
|
|
5353
5353
|
const versionPath = join5(cwd, ".canon", "version");
|
|
5354
|
-
const newVersion = "3.1.
|
|
5354
|
+
const newVersion = "3.1.2";
|
|
5355
5355
|
const currentVersion = existsSync5(versionPath) ? readFileSync4(versionPath, "utf8").trim() : null;
|
|
5356
5356
|
if (currentVersion !== newVersion) {
|
|
5357
5357
|
pending.push({ rel: ".canon/version", projectPath: versionPath, content: newVersion + "\n" });
|
|
@@ -5659,7 +5659,7 @@ Global:
|
|
|
5659
5659
|
`);
|
|
5660
5660
|
}
|
|
5661
5661
|
function printVersion() {
|
|
5662
|
-
console.log("3.1.
|
|
5662
|
+
console.log("3.1.2");
|
|
5663
5663
|
}
|
|
5664
5664
|
switch (command) {
|
|
5665
5665
|
case "doctor":
|
|
@@ -4961,7 +4961,7 @@ function isInstalledSourcePath(sourcePath) {
|
|
|
4961
4961
|
return sourcePath.includes("/node_modules/") || sourcePath.includes("\\node_modules\\") || sourcePath.includes("/_npx/") || sourcePath.includes("\\_npx\\");
|
|
4962
4962
|
}
|
|
4963
4963
|
function resolveCanonVersion(explicit) {
|
|
4964
|
-
return explicit ?? "3.1.
|
|
4964
|
+
return explicit ?? "3.1.2" ?? "dev";
|
|
4965
4965
|
}
|
|
4966
4966
|
function resolveOrchestratorCommit(repoRoot, upstreamCommit, runGitAt) {
|
|
4967
4967
|
const ownToplevel = captureGitOutput(repoRoot, ["rev-parse", "--show-toplevel"], runGitAt);
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: canon-inline-review
|
|
3
3
|
description: Use when the human wants an independent cross-review of below-pipeline work - uncommitted changes, one commit, or a whole branch before a PR. Triggers on "/canon-inline-review", "review my uncommitted changes", "codex review this", "cross-review before I commit", "review the last commit", and "review my branch". Not for spec compliance (use canon run / --reroute) or the pipeline's own code_review phase.
|
|
4
|
-
allowed-tools: Bash(git status *) Bash(git log *) Bash(git rev-parse *) Bash(git symbolic-ref *) Bash(codex review *) Bash(codex exec review *)
|
|
4
|
+
allowed-tools: Read Bash(git status *) Bash(git log *) Bash(git rev-parse *) Bash(git symbolic-ref *) Bash(mktemp) Bash(mktemp *) Bash(codex review *) Bash(codex exec review *)
|
|
5
5
|
effort: medium
|
|
6
6
|
---
|
|
7
7
|
|
|
@@ -49,20 +49,20 @@ The practical consequence: **the only target you can steer is the uncommitted tr
|
|
|
49
49
|
|
|
50
50
|
`codex review` is the shorthand for `codex exec review`. Use the shorthand when you want the concise form; treat `codex exec review` as the documented form.
|
|
51
51
|
|
|
52
|
-
Run non-interactively with the chosen selector:
|
|
52
|
+
Run non-interactively with the chosen selector, and always add `-o <path>` (a fresh path from `mktemp`) to capture the agent's final response in isolation. Raw stdout is the full exec transcript — a session banner, config block, and every shell command the review itself runs, with the actual review text buried somewhere inside — not just the final message. `-o` writes only that final message, cleanly:
|
|
53
53
|
|
|
54
|
-
- `codex exec review --uncommitted
|
|
55
|
-
- `codex exec review --commit <SHA>`
|
|
56
|
-
- `codex exec review --base <branch>`
|
|
57
|
-
- `codex exec review "<PROMPT>"
|
|
54
|
+
- `codex exec review --uncommitted -o <path>`
|
|
55
|
+
- `codex exec review --commit <SHA> -o <path>`
|
|
56
|
+
- `codex exec review --base <branch> -o <path>`
|
|
57
|
+
- `codex exec review "<PROMPT>" -o <path>` to steer an uncommitted review (prompt-only; do not add `--uncommitted`)
|
|
58
58
|
|
|
59
|
-
Do not pipe stdin into the command. The `review` subcommand already runs non-interactively.
|
|
59
|
+
Do not pipe stdin into the command. The `review` subcommand already runs non-interactively. A successful review always produces text in the `-o` file — even a clean result is a summary sentence, never nothing. Treat an empty or missing `-o` file as a failed invocation, regardless of exit code: check exit status and stderr for the cause, surface the failure, and stop. Never read empty output as "no findings."
|
|
60
60
|
|
|
61
61
|
## Reporting findings
|
|
62
62
|
|
|
63
|
-
|
|
63
|
+
Only proceed here if `<path>` (the `-o` file) is non-empty. Read it for the review content. Do not grep, parse, or otherwise inspect raw stdout — it's the full transcript, not the result, and findings can be anywhere inside it. Summarize the file's content concisely. Group findings by severity, then stop. Do not dump raw output into the session.
|
|
64
64
|
|
|
65
|
-
-
|
|
65
|
+
- The `-o` file is already formatted prose, not JSON: a summary line, then each finding as `Review comment: - [P0]`-`[P3] <title> — <file>:<line>` with its body below. Relay the existing `[P0]`-`[P3]` tags and summary line as-is — don't re-derive severity from wording.
|
|
66
66
|
- If there are findings, report the important ones first and keep the summary short.
|
|
67
67
|
- If there are no findings, say so in one line.
|
|
68
68
|
|