@chrisdudek/yg 5.2.3 → 5.2.4

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.
Files changed (3) hide show
  1. package/README.md +2 -2
  2. package/dist/bin.js +10 -10
  3. package/package.json +2 -2
package/README.md CHANGED
@@ -1,8 +1,8 @@
1
1
  # @chrisdudek/yg
2
2
 
3
- **Your agent will ignore CLAUDE.md. Yggdrasil makes sure it doesn't.**
3
+ **Stop babysitting your agent.**
4
4
 
5
- Architecture rules your agent can't ignore. Before it edits a file, your agent gets the few rules that apply — and writes to them. After, every change is checked before it moves on: by a script that runs locally for free, or by an LLM reviewer. A rule written as a script *runs* — your agent can't quietly optimize it away the way it drops a line in CLAUDE.md. Works with Claude Code, Cursor, Copilot, Codex, Cline, and more. Checks run against your code, not your diffs; the feedback is specific; the agent has to fix before it can move on.
5
+ Your architecture rules become checks it can't skip, run on every change before it moves on. A script runs them locally for free, or an LLM reviews the call a script can't make. Checks run against your code, not your diffs. The feedback is specific, and the agent has to fix before it can move on. Works with Claude Code, Cursor, Copilot, Codex, Cline, and more.
6
6
 
7
7
  See the [main README](https://github.com/krzysztofdudek/Yggdrasil#readme) for documentation, or visit
8
8
  [krzysztofdudek.github.io/Yggdrasil](https://krzysztofdudek.github.io/Yggdrasil/).
package/dist/bin.js CHANGED
@@ -15821,20 +15821,20 @@ function registerCheckCommand(program2) {
15821
15821
  const gitFiles = collectGitFiles(projectRoot);
15822
15822
  const wantsTop = opts.top !== void 0;
15823
15823
  if (wantsTop && opts.summary) {
15824
- process.stdout.write(buildIssueMessage({
15824
+ process.stderr.write(chalk8.red(buildIssueMessage({
15825
15825
  what: "--top and --summary cannot be combined.",
15826
15826
  why: "Both are read-only triage VIEWS of the same `yg check` result \u2014 --top renders the N highest-priority blocks, --summary renders per-node counts only. Asking for both at once is ambiguous; pick one lens.",
15827
15827
  next: "Run: yg check --top <n> (priority blocks), or yg check --summary (per-node counts)."
15828
- }) + "\n");
15828
+ }) + "\n"));
15829
15829
  await exitAfterFlush(1);
15830
15830
  return;
15831
15831
  }
15832
15832
  if ((wantsTop || opts.summary) && opts.approve) {
15833
- process.stdout.write(buildIssueMessage({
15833
+ process.stderr.write(chalk8.red(buildIssueMessage({
15834
15834
  what: `${wantsTop ? "--top" : "--summary"} cannot be combined with --approve.`,
15835
15835
  why: "--top and --summary triage the READ-ONLY check wall (they narrow the output of plain `yg check`, which writes nothing). --approve is the writer path; its own free cost preview is --dry-run. Mixing a read-only triage view with the writer is contradictory.",
15836
15836
  next: `Run: yg check ${wantsTop ? "--top <n>" : "--summary"} (read-only triage), or yg check --approve --dry-run (preview the writer's cost).`
15837
- }) + "\n");
15837
+ }) + "\n"));
15838
15838
  await exitAfterFlush(1);
15839
15839
  return;
15840
15840
  }
@@ -15844,22 +15844,22 @@ function registerCheckCommand(program2) {
15844
15844
  } else if (wantsTop) {
15845
15845
  const n = resolveTopValue(opts.top);
15846
15846
  if (n === null) {
15847
- process.stdout.write(buildIssueMessage({
15847
+ process.stderr.write(chalk8.red(buildIssueMessage({
15848
15848
  what: `--top expects a non-negative whole number; got "${String(opts.top)}".`,
15849
15849
  why: "--top N prints the N highest-priority issue blocks. A negative, fractional, or non-numeric value is meaningless, and printing the full wall instead would silently hide that the flag was ignored \u2014 masking the very output you tried to narrow.",
15850
15850
  next: "Run: yg check --top 5 (top 5 blocks), yg check --top (just the suggestedNext block), or yg check (full output)."
15851
- }) + "\n");
15851
+ }) + "\n"));
15852
15852
  await exitAfterFlush(1);
15853
15853
  return;
15854
15854
  }
15855
15855
  view = { kind: "top", n };
15856
15856
  }
15857
15857
  if (opts.dryRun && !opts.approve) {
15858
- process.stdout.write(buildIssueMessage({
15858
+ process.stderr.write(chalk8.red(buildIssueMessage({
15859
15859
  what: "--dry-run requires --approve.",
15860
15860
  why: "--dry-run previews what `yg check --approve` would fill (the reviewer-call budget and per-node breakdown) without writing or calling the reviewer; it is a mode of --approve, not a variant of the plain read. Plain `yg check` is already a free, no-write read.",
15861
15861
  next: "Run: yg check --approve --dry-run (cost preview), or yg check (plain read)."
15862
- }) + "\n");
15862
+ }) + "\n"));
15863
15863
  await exitAfterFlush(1);
15864
15864
  return;
15865
15865
  }
@@ -15879,7 +15879,7 @@ function registerCheckCommand(program2) {
15879
15879
  return;
15880
15880
  }
15881
15881
  const hasErrors2 = fill.checkResult.issues.some((i) => i.severity === "error");
15882
- if (hasErrors2) await exitAfterFlush(1);
15882
+ await exitAfterFlush(hasErrors2 ? 1 : 0);
15883
15883
  return;
15884
15884
  } catch (err) {
15885
15885
  if (err instanceof FillGatingError) {
@@ -15892,7 +15892,7 @@ function registerCheckCommand(program2) {
15892
15892
  const result = await runCheck(graph, gitFiles);
15893
15893
  process.stdout.write(formatOutput(result, view));
15894
15894
  const hasErrors = result.issues.some((i) => i.severity === "error");
15895
- if (hasErrors) await exitAfterFlush(1);
15895
+ await exitAfterFlush(hasErrors ? 1 : 0);
15896
15896
  } catch (error) {
15897
15897
  debugWrite(`[check] error: ${error.message}`);
15898
15898
  abortOnUnexpectedError(error, "running check");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@chrisdudek/yg",
3
- "version": "5.2.3",
3
+ "version": "5.2.4",
4
4
  "description": "Architecture rules your AI coding agent can't ignore. It gets the rules for a file before it edits, and every change is checked — by a free local script or an LLM reviewer — before it moves on. Works with Claude Code, Cursor, Copilot, Codex, Cline.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -85,7 +85,7 @@
85
85
  "@tree-sitter-grammars/tree-sitter-kotlin": "^1.1.0",
86
86
  "@tree-sitter-grammars/tree-sitter-toml": "^0.7.0",
87
87
  "@tree-sitter-grammars/tree-sitter-yaml": "^0.7.1",
88
- "@types/node": "^25.9.1",
88
+ "@types/node": "^26.0.0",
89
89
  "@types/semver": "^7.7.1",
90
90
  "@vitest/coverage-v8": "^4.1.8",
91
91
  "eslint": "^10.4.1",