euthyna 0.9.0 → 0.9.1

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.
@@ -99,7 +99,7 @@ node <euthyna 仓库>/bin/euthyna.js history --base <改前版本> --no-origins
99
99
  ### 输出长什么样(真实捕获)
100
100
 
101
101
  ```
102
- euthyna euthyna-history — 被删除代码的来源归属与安全分类
102
+ euthyna-history — 被删除代码的来源归属与安全分类
103
103
  目标: D:/axe-core/axe-core
104
104
  范围: 8390a5a9…..397f5fce…
105
105
 
@@ -243,7 +243,7 @@ node <euthyna 仓库>/bin/euthyna.js coverage `
243
243
  ### 输出长什么样(真实捕获,一次查询命中两种结果)
244
244
 
245
245
  ```
246
- euthyna euthyna-coverage — 符号调用计数(只能证伪)
246
+ euthyna-coverage — 符号调用计数(只能证伪)
247
247
 
248
248
  已确证 (1)
249
249
  • 符号 cleanup 在本次测试运行中一次都没有被调用(调用计数为 0)
@@ -89,7 +89,7 @@ When the fork point is uncertain, use the result of `git merge-base <target bran
89
89
  ### What the output looks like (real capture)
90
90
 
91
91
  ```
92
- euthyna euthyna-history — attribution and security classification of deleted code
92
+ euthyna-history — attribution and security classification of deleted code
93
93
  Target: D:/axe-core/axe-core
94
94
  Range: 8390a5a9…..397f5fce…
95
95
 
@@ -217,7 +217,7 @@ node <euthyna repo>/bin/euthyna.js coverage `
217
217
  ### What the output looks like (real capture; one query hitting both result kinds)
218
218
 
219
219
  ```
220
- euthyna euthyna-coverage — symbol invocation counts (can only falsify)
220
+ euthyna-coverage — symbol invocation counts (can only falsify)
221
221
 
222
222
  Established (1)
223
223
  • Symbol cleanup was never invoked in this test run (invocation count 0) — any behavior depending on it was never exercised
package/__init__.py CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  The CLI (``bin/euthyna.js``, installed by ``npm install -g euthyna``) produces
4
4
  the deterministic facts; this plugin registers ``/euthyna`` so a user can invoke
5
- the four CLI subcommands from inside a Hermes session without leaving chat. The
5
+ the CLI's subcommands from inside a Hermes session without leaving chat. The
6
6
  handler shells out to the real CLI and returns its output verbatim — it does not
7
7
  reimplement any measurement, and it injects nothing into the conversation.
8
8
 
@@ -15,19 +15,27 @@ CLI prints comes back as the command result.
15
15
  import shutil
16
16
  import subprocess
17
17
 
18
- # Ponytail: one flat dict, not a command framework — there are exactly four
19
- # subcommands and the CLI already owns usage/exit codes.
18
+ # The subcommands /euthyna reaches. This is the single source the guard in
19
+ # test/hermes-plugin.test.js compares against the CLI's own dispatch, so a new
20
+ # command there is red here until it is wired — which is how `audit` (the
21
+ # entry point since 0.4.0) went seven releases unnoticed behind a hand-written
22
+ # list of four.
23
+ _FORWARDS = ("audit", "coverage", "deps", "gate", "help", "history")
24
+
20
25
  _USAGE = """euthyna slash command — usage:
21
26
 
27
+ /euthyna audit <path> [<path>...] history + dependency surface in one run
22
28
  /euthyna history <path> [<path> <rev>...] deleted-code provenance & security classification
23
29
  /euthyna coverage <path> symbol invocation counts from a coverage run
24
30
  /euthyna deps <path> dependency pinned versions from lockfiles
25
31
  /euthyna gate <report> [--verify] validate an audit report against the six gates
32
+ /euthyna help the CLI's own usage, with every flag
26
33
 
27
34
  Args after the subcommand are passed to the CLI unchanged. Requires the CLI:
28
35
  npm install -g euthyna (Node >= 20)."""
29
36
 
30
37
 
38
+
31
39
  def _find_cli():
32
40
  """Return the absolute path of the euthyna CLI, or None if not installed."""
33
41
  for name in ("euthyna", "euthyna.cmd", "euthyna.exe"):
@@ -40,10 +48,13 @@ def _find_cli():
40
48
  def _run(raw_args: str):
41
49
  """Handle /euthyna: forward <subcommand> <args...> to the CLI, return its output."""
42
50
  argv = raw_args.split()
43
- if not argv or argv[0] in ("help", "-h", "--help"):
51
+ # `-h`/`--help` print this command's own quick usage; bare `help` is forwarded
52
+ # so the flag list has exactly one owner — the CLI's help, which the skill and
53
+ # the docs both quote.
54
+ if not argv or argv[0] in ("-h", "--help"):
44
55
  return _USAGE
45
56
  sub, rest = argv[0], argv[1:]
46
- if sub not in ("history", "coverage", "deps", "gate"):
57
+ if sub not in _FORWARDS:
47
58
  return f"unknown subcommand: {sub}\n\n{_USAGE}"
48
59
 
49
60
  cli = _find_cli()
@@ -73,8 +84,8 @@ def register(ctx):
73
84
  ctx.register_command(
74
85
  "euthyna",
75
86
  handler=_run,
76
- description="euthyna security audit: run history/coverage/deps/gate fact producers",
77
- args_hint="<history|coverage|deps|gate> <args…>",
87
+ description="euthyna security audit: drive the fact-producing CLI (audit is the single entry point)",
88
+ args_hint="<audit|history|coverage|deps|gate|help> <args…>",
78
89
  )
79
90
 
80
91
 
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "euthyna",
3
- "version": "0.9.0",
4
- "description": "Deterministic fact producers for security auditing: which deleted code came from a security fix, and which changed symbols no test ever executed.",
3
+ "version": "0.9.1",
4
+ "description": "Audit framework for AI coding agents: produces the deterministic facts a model cannot compute — deleted-code provenance, symbol invocations, dependency pins — and adjudicates every claim against six gates, downgrading what cannot produce evidence to an observation. Not a scanner.",
5
5
  "type": "module",
6
6
  "main": "./plugin/index.js",
7
7
  "bin": {
package/plugin.yaml CHANGED
@@ -1,6 +1,6 @@
1
1
  name: euthyna
2
- version: 0.9.0
3
- description: euthyna audit discipline — slash commands that drive the euthyna fact-producing CLI (history / coverage / deps / gate)
2
+ version: 0.9.1
3
+ description: euthyna audit discipline — the /euthyna slash command driving the euthyna CLI, whose single entry point is `euthyna audit`
4
4
  license: Apache-2.0
5
5
  homepage: https://github.com/slow-stack/euthyna
6
6
  tags:
package/src/contract.js CHANGED
@@ -203,7 +203,10 @@ export function renderReport(report, { write: rawWrite = console.log, lang = DEF
203
203
  const unknown = facts.filter(f => f.status === STATUS.UNKNOWN);
204
204
 
205
205
  write('');
206
- write(`euthyna ${producer.name} — ${producer.purpose || ''}`.trim());
206
+ // The producer name is `euthyna-history`, `euthyna-audit`, …: it already names
207
+ // the tool, so the header prints it as the contract emits it — the same string
208
+ // the `--json` `producer` field carries.
209
+ write(`${producer.name} — ${producer.purpose || ''}`.trim());
207
210
  write(`${t('目标: ', 'Target: ')}${subject.repo ?? subject.coverageFile ?? t('(未指定)', '(unspecified)')}`);
208
211
  if (subject.base || subject.head) {
209
212
  write(