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.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.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.1" ?? "dev";
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.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.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.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.1" ?? "dev";
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,6 +1,6 @@
1
1
  {
2
2
  "name": "canon-ai",
3
- "version": "3.1.1",
3
+ "version": "3.1.2",
4
4
  "type": "module",
5
5
  "description": "A spec-first, multi-agent coding pipeline you drop into any repo. The law your agents work under.",
6
6
  "engines": {
@@ -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>"` to steer an uncommitted review (prompt-only; do not add `--uncommitted`)
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
- Summarize the review output concisely. Group findings by severity, then stop. Do not dump raw output into the session.
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
- - Stdout 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.
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